diff --git a/libopenage/gamestate/map.cpp b/libopenage/gamestate/map.cpp index beb02b5e8a..3d9af584cb 100644 --- a/libopenage/gamestate/map.cpp +++ b/libopenage/gamestate/map.cpp @@ -27,17 +27,15 @@ Map::Map(const std::shared_ptr &terrain) : util::Vector2s grid_size{this->terrain->get_row_size(), this->terrain->get_column_size()}; for (const auto &chunk : this->terrain->get_chunks()) { for (const auto &tile : chunk->get_tiles()) { - if (tile.terrain != std::nullopt) { - auto path_costs = api::APITerrain::get_path_costs(*tile.terrain); + auto path_costs = api::APITerrain::get_path_costs(tile.terrain); - for (const auto &path_cost : path_costs) { - if (not this->grid_lookup.contains(path_cost.first)) { - auto grid = std::make_shared(grid_idx, grid_size, side_length); - this->pathfinder->add_grid(grid); + for (const auto &path_cost : path_costs) { + if (not this->grid_lookup.contains(path_cost.first)) { + auto grid = std::make_shared(grid_idx, grid_size, side_length); + this->pathfinder->add_grid(grid); - this->grid_lookup.emplace(path_cost.first, grid_idx); - grid_idx += 1; - } + this->grid_lookup.emplace(path_cost.first, grid_idx); + grid_idx += 1; } } } @@ -48,17 +46,15 @@ Map::Map(const std::shared_ptr &terrain) : auto chunk_terrain = this->terrain->get_chunk(chunk_idx); for (size_t tile_idx = 0; tile_idx < chunk_terrain->get_tiles().size(); ++tile_idx) { auto tile = chunk_terrain->get_tile(tile_idx); - if (tile.terrain != std::nullopt) { - auto path_costs = api::APITerrain::get_path_costs(*tile.terrain); + auto path_costs = api::APITerrain::get_path_costs(tile.terrain); - for (const auto &path_cost : path_costs) { - auto grid_id = this->grid_lookup.at(path_cost.first); - auto grid = this->pathfinder->get_grid(grid_id); + for (const auto &path_cost : path_costs) { + auto grid_id = this->grid_lookup.at(path_cost.first); + auto grid = this->pathfinder->get_grid(grid_id); - auto sector = grid->get_sector(chunk_idx); - auto cost_field = sector->get_cost_field(); - cost_field->set_cost(tile_idx, path_cost.second); - } + auto sector = grid->get_sector(chunk_idx); + auto cost_field = sector->get_cost_field(); + cost_field->set_cost(tile_idx, path_cost.second); } } } diff --git a/libopenage/gamestate/terrain_factory.cpp b/libopenage/gamestate/terrain_factory.cpp index 55c70b34cf..3f16a6acf1 100644 --- a/libopenage/gamestate/terrain_factory.cpp +++ b/libopenage/gamestate/terrain_factory.cpp @@ -26,15 +26,30 @@ static const std::vector test_terrain_paths = { "../test/textures/test_terrain2.terrain", }; -static const std::vector aoe1_test_terrain = {}; -static const std::vector de1_test_terrain = {}; +static const std::vector aoe1_test_terrain = { + "aoe1_base.data.terrain.forest.forest.Forest", + "aoe1_base.data.terrain.grass.grass.Grass", + "aoe1_base.data.terrain.dirt.dirt.Dirt", + "aoe1_base.data.terrain.water.water.Water", +}; +static const std::vector de1_test_terrain = { + "aoe1_base.data.terrain.desert.desert.Desert", + "aoe1_base.data.terrain.grass.grass.Grass", + "aoe1_base.data.terrain.dirt.dirt.Dirt", + "aoe1_base.data.terrain.water.water.Water", +}; static const std::vector aoe2_test_terrain = { "aoe2_base.data.terrain.foundation.foundation.Foundation", "aoe2_base.data.terrain.grass.grass.Grass", "aoe2_base.data.terrain.dirt.dirt.Dirt", "aoe2_base.data.terrain.water.water.Water", }; -static const std::vector de2_test_terrain = {}; +static const std::vector de2_test_terrain = { + "de2_base.data.terrain.foundation.foundation.Foundation", + "de2_base.data.terrain.grass.grass.Grass", + "de2_base.data.terrain.dirt.dirt.Dirt", + "de2_base.data.terrain.water.water.Water", +}; static const std::vector hd_test_terrain = { "hd_base.data.terrain.foundation.foundation.Foundation", "hd_base.data.terrain.grass.grass.Grass", @@ -47,10 +62,16 @@ static const std::vector swgb_test_terrain = { "swgb_base.data.terrain.desert0.desert0.Desert0", "swgb_base.data.terrain.water1.water1.Water1", }; -static const std::vector trial_test_terrain = {}; +static const std::vector trial_test_terrain = { + "trial_base.data.terrain.foundation.foundation.Foundation", + "trial_base.data.terrain.grass.grass.Grass", + "trial_base.data.terrain.dirt.dirt.Dirt", + "trial_base.data.terrain.water.water.Water", +}; // TODO: Remove hardcoded test texture references static std::vector test_terrains; // declare static so we only have to do this once +static bool has_graphics = false; void build_test_terrains(const std::shared_ptr &gstate) { auto modpack_ids = gstate->get_mod_manager()->get_load_order(); @@ -59,36 +80,43 @@ void build_test_terrains(const std::shared_ptr &gstate) { test_terrains.insert(test_terrains.end(), aoe1_test_terrain.begin(), aoe1_test_terrain.end()); + has_graphics = false; } else if (modpack_id == "de1_base") { test_terrains.insert(test_terrains.end(), de1_test_terrain.begin(), de1_test_terrain.end()); + has_graphics = false; } else if (modpack_id == "aoe2_base") { test_terrains.insert(test_terrains.end(), aoe2_test_terrain.begin(), aoe2_test_terrain.end()); + has_graphics = true; } else if (modpack_id == "de2_base") { test_terrains.insert(test_terrains.end(), de2_test_terrain.begin(), de2_test_terrain.end()); + has_graphics = false; } else if (modpack_id == "hd_base") { test_terrains.insert(test_terrains.end(), hd_test_terrain.begin(), hd_test_terrain.end()); + has_graphics = true; } else if (modpack_id == "swgb_base") { test_terrains.insert(test_terrains.end(), swgb_test_terrain.begin(), swgb_test_terrain.end()); + has_graphics = true; } else if (modpack_id == "trial_base") { test_terrains.insert(test_terrains.end(), trial_test_terrain.begin(), trial_test_terrain.end()); + has_graphics = true; } } } @@ -185,7 +213,7 @@ std::shared_ptr TerrainFactory::add_chunk(const std::shared_ptr terrain_obj; + nyan::Object terrain_obj; if (test_terrains.empty()) { build_test_terrains(gstate); } @@ -204,20 +232,14 @@ std::shared_ptr TerrainFactory::add_chunk(const std::shared_ptrget_db_view()->get_object(test_terrains.at(terrain_index)); - terrain_info_path = api::APITerrain::get_terrain_path(terrain_obj.value()); - tiles.push_back({terrain_obj, terrain_info_path, terrain_elevation_t::zero()}); - } - test_chunk_index += 1; - } - else { - // use a test texture - if (test_chunk_index >= test_terrain_paths.size()) { - test_chunk_index = 0; - } - terrain_info_path = test_terrain_paths.at(test_chunk_index); + if (has_graphics) { + terrain_info_path = api::APITerrain::get_terrain_path(terrain_obj); + } + else { + terrain_info_path = test_terrain_paths.at(test_chunk_index % test_terrain_paths.size()); + } - for (size_t i = 0; i < size[0] * size[1]; ++i) { tiles.push_back({terrain_obj, terrain_info_path, terrain_elevation_t::zero()}); } diff --git a/libopenage/gamestate/terrain_tile.h b/libopenage/gamestate/terrain_tile.h index 36ae11ddf3..6d6dd99b55 100644 --- a/libopenage/gamestate/terrain_tile.h +++ b/libopenage/gamestate/terrain_tile.h @@ -20,10 +20,8 @@ using terrain_elevation_t = util::FixedPoint; struct TerrainTile { /** * Terrain definition used by this tile. - * - * TODO: Make this non-optional once all modpacks support terrain graphics. */ - std::optional terrain; + nyan::Object terrain; /** * Path to the terrain asset used by this tile.