/** ** Define a world map terrain type. ** ** @param l Lua state. */ static int CclDefineWorldMapTerrainType(lua_State *l) { LuaCheckArgs(l, 2); if (!lua_istable(l, 2)) { LuaError(l, "incorrect argument (expected table)"); } std::string terrain_name = LuaToString(l, 1); int terrain_id = GetWorldMapTerrainTypeId(terrain_name); CWorldMapTerrainType *terrain_type = nullptr; if (terrain_id == -1) { terrain_type = new CWorldMapTerrainType; terrain_type->Name = terrain_name; terrain_type->ID = WorldMapTerrainTypes.size(); WorldMapTerrainTypes.push_back(terrain_type); WorldMapTerrainTypeStringToIndex[terrain_name] = terrain_type->ID; } else { terrain_type = WorldMapTerrainTypes[terrain_id]; } // Parse the list: for (lua_pushnil(l); lua_next(l, 2); lua_pop(l, 1)) { const char *value = LuaToString(l, -2); if (!strcmp(value, "Tag")) { terrain_type->Tag = LuaToString(l, -1); } else if (!strcmp(value, "HasTransitions")) { terrain_type->HasTransitions = LuaToBoolean(l, -1); } else if (!strcmp(value, "Water")) { terrain_type->Water = LuaToBoolean(l, -1); } else if (!strcmp(value, "BaseTile")) { terrain_type->BaseTile = GetWorldMapTerrainTypeId(LuaToString(l, -1)); } else if (!strcmp(value, "Variations")) { terrain_type->Variations = LuaToNumber(l, -1); } else { LuaError(l, "Unsupported tag: %s" _C_ value); } } return 0; }
/** ** Define a world. ** ** @param l Lua state. */ static int CclDefineWorld(lua_State *l) { LuaCheckArgs(l, 2); if (!lua_istable(l, 2)) { LuaError(l, "incorrect argument (expected table)"); } std::string world_name = LuaToString(l, 1); CWorld *world = GetWorld(world_name); if (!world) { world = new CWorld; world->Name = world_name; world->ID = Worlds.size(); Worlds.push_back(world); } // Parse the list: for (lua_pushnil(l); lua_next(l, 2); lua_pop(l, 1)) { const char *value = LuaToString(l, -2); if (!strcmp(value, "Description")) { world->Description = LuaToString(l, -1); } else if (!strcmp(value, "Background")) { world->Background = LuaToString(l, -1); } else if (!strcmp(value, "Quote")) { world->Quote = LuaToString(l, -1); } else if (!strcmp(value, "BaseTerrain")) { int base_terrain_id = GetWorldMapTerrainTypeId(LuaToString(l, -1)); if (base_terrain_id == -1) { LuaError(l, "Terrain doesn't exist."); } world->BaseTerrain = WorldMapTerrainTypes[base_terrain_id]; } else if (!strcmp(value, "Plane")) { CPlane *plane = GetPlane(LuaToString(l, -1)); if (!plane) { LuaError(l, "Plane doesn't exist."); } world->Plane = plane; } else { LuaError(l, "Unsupported tag: %s" _C_ value); } } return 0; }
/** ** Define a world map tile. ** ** @param l Lua state. */ static int CclDefineWorldMapTile(lua_State *l) { LuaCheckArgs(l, 2); if (!lua_istable(l, 2)) { LuaError(l, "incorrect argument (expected table)"); } std::pair<int,int> tile_position; CclGetPos(l, &tile_position.first, &tile_position.second, 1); WorldMapTile *tile = new WorldMapTile; tile->Position.x = tile_position.first; tile->Position.y = tile_position.second; // Parse the list: for (lua_pushnil(l); lua_next(l, 2); lua_pop(l, 1)) { const char *value = LuaToString(l, -2); if (!strcmp(value, "World")) { CWorld *world = CWorld::GetWorld(LuaToString(l, -1)); if (world != nullptr) { tile->World = world; } else { LuaError(l, "World doesn't exist."); } } else if (!strcmp(value, "Terrain")) { int terrain = GetWorldMapTerrainTypeId(LuaToString(l, -1)); if (terrain != -1) { tile->Terrain = terrain; } else { LuaError(l, "Terrain doesn't exist."); } } else if (!strcmp(value, "Resource")) { int resource = GetResourceIdByName(LuaToString(l, -1)); if (resource != -1) { tile->Resource = resource; } else { LuaError(l, "Resource doesn't exist."); } } else if (!strcmp(value, "Capital")) { tile->Capital = LuaToBoolean(l, -1); } else if (!strcmp(value, "CulturalTerrainNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int terrain = GetWorldMapTerrainTypeId(LuaToString(l, -1, j + 1)); if (terrain == -1) { LuaError(l, "Terrain doesn't exist."); } ++j; std::string name_type = "terrain-" + NameToIdent(WorldMapTerrainTypes[terrain]->Name); CCivilization *civilization = CCivilization::GetCivilization(LuaToString(l, -1, j + 1)); ++j; if (!civilization) { continue; } std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalTerrainNames[std::pair<int,int>(terrain, civilization->ID)].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "FactionCulturalTerrainNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int terrain = GetWorldMapTerrainTypeId(LuaToString(l, -1, j + 1)); if (terrain == -1) { LuaError(l, "Terrain doesn't exist."); } ++j; std::string name_type = "terrain-" + NameToIdent(WorldMapTerrainTypes[terrain]->Name); ++j; int faction = PlayerRaces.GetFactionIndexByName(LuaToString(l, -1, j + 1)); if (faction == -1) { LuaError(l, "Faction doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->FactionCulturalTerrainNames[std::pair<int,CFaction *>(terrain, PlayerRaces.Factions[faction])].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "CulturalResourceNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int resource = GetResourceIdByName(LuaToString(l, -1, j + 1)); if (resource == -1) { LuaError(l, "Resource doesn't exist."); } ++j; std::string name_type = "resource-tile-" + DefaultResourceNames[resource]; CCivilization *civilization = CCivilization::GetCivilization(LuaToString(l, -1, j + 1)); ++j; if (!civilization) { continue; } std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalResourceNames[std::pair<int,int>(resource, civilization->ID)].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "FactionCulturalResourceNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int resource = GetResourceIdByName(LuaToString(l, -1, j + 1)); if (resource == -1) { LuaError(l, "Resource doesn't exist."); } ++j; std::string name_type = "resource-tile-" + DefaultResourceNames[resource]; ++j; int faction = PlayerRaces.GetFactionIndexByName(LuaToString(l, -1, j + 1)); if (faction == -1) { LuaError(l, "Faction doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->FactionCulturalResourceNames[std::pair<int,CFaction *>(resource, PlayerRaces.Factions[faction])].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "CulturalSettlementNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { CCivilization *civilization = CCivilization::GetCivilization(LuaToString(l, -1, j + 1)); ++j; if (!civilization) { continue; } std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalSettlementNames[civilization->ID].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "FactionCulturalSettlementNames")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { ++j; int faction = PlayerRaces.GetFactionIndexByName(LuaToString(l, -1, j + 1)); if (faction == -1) { LuaError(l, "Faction doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->FactionCulturalSettlementNames[PlayerRaces.Factions[faction]].push_back(TransliterateText(cultural_name)); } } else if (!strcmp(value, "Claims")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument (expected table)"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { ++j; int faction = PlayerRaces.GetFactionIndexByName(LuaToString(l, -1, j + 1)); if (faction == -1) { LuaError(l, "Faction doesn't exist."); } tile->FactionClaims.push_back(PlayerRaces.Factions[faction]); } } else if (!strcmp(value, "HistoricalOwners")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int year = LuaToNumber(l, -1, j + 1); ++j; ++j; std::string owner_faction_name = LuaToString(l, -1, j + 1); if (!owner_faction_name.empty()) { int owner_faction = PlayerRaces.GetFactionIndexByName(owner_faction_name); if (owner_faction == -1) { LuaError(l, "Faction \"%s\" doesn't exist." _C_ owner_faction_name.c_str()); } tile->HistoricalOwners[year] = PlayerRaces.Factions[owner_faction]; } else { tile->HistoricalOwners[year] = nullptr; } } } else if (!strcmp(value, "HistoricalClaims")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { int year = LuaToNumber(l, -1, j + 1); ++j; ++j; std::string claimant_faction_name = LuaToString(l, -1, j + 1); int claimant_faction = PlayerRaces.GetFactionIndexByName(claimant_faction_name); if (claimant_faction == -1) { LuaError(l, "Faction \"%s\" doesn't exist." _C_ claimant_faction_name.c_str()); } tile->HistoricalClaims[year] = PlayerRaces.Factions[claimant_faction]; } } else { LuaError(l, "Unsupported tag: %s" _C_ value); } } if (tile->World == nullptr) { LuaError(l, "Tile (%d, %d) is not assigned to any world." _C_ tile->Position.x _C_ tile->Position.y); } return 0; }