diff --git a/assets/tiles.json b/assets/tiles.json index 29aa5cd..d710353 100644 --- a/assets/tiles.json +++ b/assets/tiles.json @@ -1,34 +1,38 @@ { - "FLOOR_TILE": { + "floor_tile": { "texture": "assets/floor_tile_test-256.png", - "foreground": [40, 15, 125], - "background": [200, 15, 75], "collision": false, "display": 10398, "id": 0 }, - "WALL_PLAIN": { + "wall_plain": { "texture": "assets/wall_texture_test-256.png", - "foreground": [230, 20, 30], - "background": [230, 20, 120], "collision": true, "display": 9608, "id": 1 }, - "WALL_MOSS": { + "wall_moss": { "texture": "assets/glowing_moss_wall-256.png", - "foreground": [230, 20, 30], - "background": [230, 20, 120], "collision": true, "display": 8820, "id": 2 }, - "WALL_VINES": { + "wall_vines": { "texture": "assets/wall_with_vines-256.png", - "foreground": [230, 20, 30], - "background": [230, 20, 120], - "collision": false, + "collision": true, "display": 35, "id": 3 + }, + "plain_ceiling": { + "texture": "assets/ceiling_test-256.png", + "collision": false, + "display": 35, + "id": 4 + }, + "lava_floor": { + "texture": "assets/lava_floor-256.png", + "collision": false, + "display": 35, + "id": 5 } } diff --git a/raycaster.cpp b/raycaster.cpp index 4fe1898..fd20488 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -57,7 +57,6 @@ inline uint32_t lighting_calc(uint32_t pixel, float dist, int level) { return conv.as_int; } - Raycaster::Raycaster(int width, int height) : $view_texture(sf::Vector2u{(unsigned int)width, (unsigned int)height}), $view_sprite($view_texture), @@ -272,7 +271,7 @@ void Raycaster::cast_rays() { side = 1; } - if($map[map_y][map_x] > 0) hit = 1; + if($walls[map_y][map_x] == 1) hit = 1; } if(side == 0) { @@ -289,7 +288,7 @@ void Raycaster::cast_rays() { int draw_end = line_height / 2 + $height / 2 + $pitch; if(draw_end >= $height) draw_end = $height - 1; - auto texture = textures::get_surface($map[map_y][map_x]); + auto texture = textures::get_surface($tiles[map_y][map_x]); // calculate value of wall_x double wall_x; // where exactly the wall was hit @@ -329,6 +328,7 @@ void Raycaster::draw_ceiling_floor() { constexpr static const int texture_width = TEXTURE_WIDTH; constexpr static const int texture_height = TEXTURE_HEIGHT; auto &lights = $level.lights->lighting(); + size_t surface_i = 0; for(int y = $height / 2 + 1; y < $height; ++y) { // rayDir for leftmost ray (x=0) and rightmost (x = w) @@ -361,7 +361,6 @@ void Raycaster::draw_ceiling_floor() { float floor_x = $pos_x + row_distance * ray_dir_x0; float floor_y = $pos_y + row_distance * ray_dir_y0; - for(int x = 0; x < $width; ++x) { // the cell coord is simply taken from the int parts of // floor_x and floor_y. @@ -381,7 +380,17 @@ void Raycaster::draw_ceiling_floor() { // floor_x cell_x to find the texture x/y. How? int map_x = int(floor_x); int map_y = int(floor_y); - int light_level = matrix::inbounds(lights, map_x, map_y) ? lights[map_y][map_x] : 30; + + if(!matrix::inbounds(lights, map_x, map_y)) continue; + + int light_level = lights[map_y][map_x]; + size_t new_surface_i = $tiles[map_y][map_x]; + + if(new_surface_i != surface_i) { + surface_i = new_surface_i; + $floor_texture = textures::get_surface(surface_i); + $ceiling_texture = textures::get_surface(surface_i); + } // NOTE: use map_x/y to get the floor, ceiling texture. @@ -418,7 +427,8 @@ void Raycaster::update_level(GameLevel level) { $level = level; - $map = $level.map->tiles(); + $tiles = $level.map->tiles(); + $walls = $level.map->walls(); $level.world->query([&](const auto ent, auto& sprite) { // player doesn't need a sprite diff --git a/raycaster.hpp b/raycaster.hpp index 4d562a4..ca990b5 100644 --- a/raycaster.hpp +++ b/raycaster.hpp @@ -38,7 +38,8 @@ struct Raycaster { std::unordered_map $sprites; GameLevel $level; - Matrix $map; + Matrix $tiles; + Matrix $walls; std::vector $zbuffer; // width Raycaster(int width, int height); diff --git a/systems.cpp b/systems.cpp index 7d48519..79b1a3a 100644 --- a/systems.cpp +++ b/systems.cpp @@ -408,7 +408,6 @@ std::wstring System::draw_map(GameLevel level, size_t view_x, size_t view_y, int } } - // then get the enemy/item/device tiles and fill those in world.query([&](auto ent, auto &pos, auto &entity_glyph) { if(pos.location.x >= cam_orig.x && pos.location.x <= cam_orig.x + view_x diff --git a/worldbuilder.cpp b/worldbuilder.cpp index 4feaa11..bca2b66 100644 --- a/worldbuilder.cpp +++ b/worldbuilder.cpp @@ -15,7 +15,11 @@ void WorldBuilder::stylize_rooms() { for(auto& room : $map.rooms()) { for(matrix::box it{tiles, room.x, room.y, room.width+1, room.height+1}; it.next();) { - if(tiles[it.y][it.x] == 1) tiles[it.y][it.x] = 2; + if(tiles[it.y][it.x] == 1) { + tiles[it.y][it.x] = 2; + } else if(tiles[it.y][it.x] == 0) { + tiles[it.y][it.x] = 5; + } } } }