/** ** Get province data. ** ** @param l Lua state. */ static int CclGetProvinceData(lua_State *l) { if (lua_gettop(l) < 2) { LuaError(l, "incorrect argument"); } std::string province_name = LuaToString(l, 1); CProvince *province = GetProvince(province_name); if (!province) { LuaError(l, "Province \"%s\" doesn't exist." _C_ province_name.c_str()); } const char *data = LuaToString(l, 2); if (!strcmp(data, "Name")) { lua_pushstring(l, province->Name.c_str()); return 1; } else if (!strcmp(data, "World")) { if (province->World != nullptr) { lua_pushstring(l, province->World->Ident.c_str()); } else { lua_pushstring(l, ""); } return 1; } else if (!strcmp(data, "Water")) { lua_pushboolean(l, province->Water); return 1; } else if (!strcmp(data, "Coastal")) { lua_pushboolean(l, province->Coastal); return 1; } else { LuaError(l, "Invalid field: %s" _C_ data); } return 0; }
/** ** Get province data. ** ** @param l Lua state. */ static int CclGetProvinceData(lua_State *l) { if (lua_gettop(l) < 2) { LuaError(l, "incorrect argument"); } std::string province_name = LuaToString(l, 1); CProvince *province = GetProvince(province_name); if (!province) { LuaError(l, "Province \"%s\" doesn't exist." _C_ province_name.c_str()); } const char *data = LuaToString(l, 2); if (!strcmp(data, "Name")) { lua_pushstring(l, province->Name.c_str()); return 1; } else if (!strcmp(data, "World")) { if (province->World != NULL) { lua_pushstring(l, province->World->Name.c_str()); } else { lua_pushstring(l, ""); } return 1; } else if (!strcmp(data, "Water")) { lua_pushboolean(l, province->Water); return 1; } else if (!strcmp(data, "Coastal")) { lua_pushboolean(l, province->Coastal); return 1; } else if (!strcmp(data, "Map")) { lua_pushstring(l, province->Map.c_str()); return 1; } else if (!strcmp(data, "SettlementTerrain")) { lua_pushstring(l, province->SettlementTerrain.c_str()); return 1; } else if (!strcmp(data, "SettlementLocationX")) { lua_pushnumber(l, province->SettlementLocation.x); return 1; } else if (!strcmp(data, "SettlementLocationY")) { lua_pushnumber(l, province->SettlementLocation.y); return 1; } else if (!strcmp(data, "Tiles")) { lua_createtable(l, province->Tiles.size() * 2, 0); for (size_t i = 1; i <= province->Tiles.size() * 2; ++i) { lua_pushnumber(l, province->Tiles[(i-1) / 2].x); lua_rawseti(l, -2, i); ++i; lua_pushnumber(l, province->Tiles[(i-1) / 2].y); lua_rawseti(l, -2, i); } return 1; } else { LuaError(l, "Invalid field: %s" _C_ data); } return 0; }
int PSGame::GetNumberOfSCs() { int nSCs = 0; for (int i = 0; i < m_Provinces.size(); i++) { if (GetProvince(i)->GetSC()) nSCs++; } return nSCs; }
/** ** Define a province. ** ** @param l Lua state. */ static int CclDefineProvince(lua_State *l) { LuaCheckArgs(l, 2); if (!lua_istable(l, 2)) { LuaError(l, "incorrect argument (expected table)"); } std::string province_name = LuaToString(l, 1); CProvince *province = GetProvince(province_name); if (!province) { province = new CProvince; province->Name = province_name; province->ID = Provinces.size(); Provinces.push_back(province); } std::string name_type = "province"; // 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) { province->World = world; world->Provinces.push_back(province); } else { LuaError(l, "World doesn't exist."); } } else if (!strcmp(value, "Water")) { province->Water = LuaToBoolean(l, -1); } else if (!strcmp(value, "Coastal")) { province->Coastal = LuaToBoolean(l, -1); } else if (!strcmp(value, "CulturalNames")) { 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); province->CulturalNames[civilization->ID] = TransliterateText(cultural_name); } } else if (!strcmp(value, "FactionCulturalNames")) { 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); province->FactionCulturalNames[PlayerRaces.Factions[faction]] = 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."); } province->FactionClaims.push_back(PlayerRaces.Factions[faction]); } } else if (!strcmp(value, "Regions")) { if (!lua_istable(l, -1)) { LuaError(l, "incorrect argument"); } const int subargs = lua_rawlen(l, -1); for (int j = 0; j < subargs; ++j) { CRegion *region = GetRegion(LuaToString(l, -1, j + 1)); if (region == nullptr) { LuaError(l, "Region doesn't exist."); } province->Regions.push_back(region); region->Provinces.push_back(province); } } 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()); } province->HistoricalOwners[year] = PlayerRaces.Factions[owner_faction]; } else { province->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()); } province->HistoricalClaims[year] = PlayerRaces.Factions[claimant_faction]; } } else if (!strcmp(value, "HistoricalCultures")) { 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; std::string historical_civilization_name = LuaToString(l, -1, j + 1); if (!historical_civilization_name.empty()) { CCivilization *historical_civilization = CCivilization::GetCivilization(historical_civilization_name); if (historical_civilization) { province->HistoricalCultures[year] = historical_civilization->ID; } } } } else if (!strcmp(value, "HistoricalPopulation")) { 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; int historical_population = LuaToNumber(l, -1, j + 1); province->HistoricalPopulation[year] = historical_population; } } else if (!strcmp(value, "HistoricalSettlementBuildings")) { 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; std::string building_type_ident = LuaToString(l, -1, j + 1); int building_type = UnitTypeIdByIdent(building_type_ident); if (building_type == -1) { LuaError(l, "Unit type \"%s\" doesn't exist." _C_ building_type_ident.c_str()); } ++j; province->HistoricalSettlementBuildings[building_type][year] = LuaToBoolean(l, -1, j + 1); } } else if (!strcmp(value, "HistoricalModifiers")) { 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; std::string upgrade_ident = LuaToString(l, -1, j + 1); CUpgrade *modifier = CUpgrade::Get(upgrade_ident); if (modifier == nullptr) { LuaError(l, "Upgrade \"%s\" doesn't exist." _C_ upgrade_ident.c_str()); } ++j; province->HistoricalModifiers[modifier][year] = LuaToBoolean(l, -1, j + 1); } } else { LuaError(l, "Unsupported tag: %s" _C_ value); } } if (province->World == nullptr) { LuaError(l, "Province \"%s\" is not assigned to any world." _C_ province->Name.c_str()); } 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 = GetWorld(LuaToString(l, -1)); if (world != NULL) { tile->World = world; world->Tiles.push_back(tile); } else { LuaError(l, "World doesn't exist."); } } else if (!strcmp(value, "Province")) { CProvince *province = GetProvince(LuaToString(l, -1)); if (province != NULL) { tile->Province = province; if (tile->Position.x != -1 && tile->Position.y != -1) { province->Tiles.push_back(tile->Position); } } else { LuaError(l, "Province 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); int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalTerrainNames[std::pair<int,int>(terrain, civilization)].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); int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; int faction = PlayerRaces.GetFactionIndexByName(civilization, 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[civilization][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]; int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalResourceNames[std::pair<int,int>(resource, civilization)].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]; int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; int faction = PlayerRaces.GetFactionIndexByName(civilization, 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[civilization][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) { int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; std::string cultural_name = LuaToString(l, -1, j + 1); tile->CulturalSettlementNames[civilization].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) { int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; int faction = PlayerRaces.GetFactionIndexByName(civilization, 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[civilization][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) { int civilization = PlayerRaces.GetRaceIndexByName(LuaToString(l, -1, j + 1)); if (civilization == -1) { LuaError(l, "Civilization doesn't exist."); } ++j; int faction = PlayerRaces.GetFactionIndexByName(civilization, LuaToString(l, -1, j + 1)); if (faction == -1) { LuaError(l, "Faction doesn't exist."); } tile->FactionClaims.push_back(PlayerRaces.Factions[civilization][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; std::string owner_civilization_name = LuaToString(l, -1, j + 1); ++j; std::string owner_faction_name = LuaToString(l, -1, j + 1); if (!owner_civilization_name.empty() && !owner_faction_name.empty()) { int owner_civilization = PlayerRaces.GetRaceIndexByName(owner_civilization_name.c_str()); int owner_faction = PlayerRaces.GetFactionIndexByName(owner_civilization, 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_civilization][owner_faction]; } else { tile->HistoricalOwners[year] = NULL; } } } 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; std::string claimant_civilization_name = LuaToString(l, -1, j + 1); int claimant_civilization = PlayerRaces.GetRaceIndexByName(claimant_civilization_name.c_str()); ++j; std::string claimant_faction_name = LuaToString(l, -1, j + 1); int claimant_faction = PlayerRaces.GetFactionIndexByName(claimant_civilization, 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_civilization][claimant_faction]; } } else { LuaError(l, "Unsupported tag: %s" _C_ value); } } if (tile->World == NULL) { LuaError(l, "Tile (%d, %d) is not assigned to any world." _C_ tile->Position.x _C_ tile->Position.y); } return 0; }