void CGameSetup::LoadSkirmishAIs(const TdfParser& file, std::set<std::string>& nameList) { // i = AI index in game (no gaps), a = AI index in script for (int a = 0; a < MAX_PLAYERS; ++a) { char section[50]; sprintf(section, "GAME\\AI%i\\", a); string s(section); if (!file.SectionExist(s.substr(0, s.length() - 1))) { continue; } SkirmishAIData data; data.team = atoi(file.SGetValueDef("-1", s + "Team").c_str()); if (data.team == -1) { throw content_error("missing AI.Team in GameSetup script"); } data.hostPlayer = atoi(file.SGetValueDef("-1", s + "Host").c_str()); if (data.hostPlayer == -1) { throw content_error("missing AI.Host in GameSetup script"); } data.shortName = file.SGetValueDef("", s + "ShortName"); if (data.shortName == "") { throw content_error("missing AI.ShortName in GameSetup script"); } data.version = file.SGetValueDef("", s + "Version"); if (file.SectionExist(s + "Options")) { data.options = file.GetAllValues(s + "Options"); std::map<std::string, std::string>::const_iterator kv; for (kv = data.options.begin(); kv != data.options.end(); ++kv) { data.optionKeys.push_back(kv->first); } } // get the visible name (comparable to player-name) std::string name = file.SGetValueDef(data.shortName, s + "Name"); int instanceIndex = 0; std::string name_unique = name; while (nameList.find(name_unique) != nameList.end()) { name_unique = name + "_" + IntToString(instanceIndex++); // so we possibly end up with something like myBot_0, or RAI_2 } data.name = name_unique; nameList.insert(data.name); skirmishAIStartingData.push_back(data); } }
void CGameSetup::LoadAllyTeams(const TdfParser& file) { // i = allyteam index in game (no gaps), a = allyteam index in script int i = 0; for (int a = 0; a < MAX_TEAMS; ++a) { char section[50]; sprintf(section,"GAME\\ALLYTEAM%i",a); string s(section); if (!file.SectionExist(s)) continue; AllyTeam data; std::map<std::string, std::string> setup = file.GetAllValues(s); for (std::map<std::string, std::string>::const_iterator it = setup.begin(); it != setup.end(); ++it) data.SetValue(it->first, it->second); allyStartingData.push_back(data); allyteamRemap[a] = i; ++i; } { const size_t numAllyTeams = allyStartingData.size(); for (size_t a = 0; a < numAllyTeams; ++a) { allyStartingData[a].allies.resize(numAllyTeams, false); allyStartingData[a].allies[a] = true; // each team is allied with itself std::ostringstream section; section << "GAME\\ALLYTEAM" << a << "\\"; const size_t numAllies = atoi(file.SGetValueDef("0", section.str() + "NumAllies").c_str()); for (size_t b = 0; b < numAllies; ++b) { std::ostringstream key; key << "GAME\\ALLYTEAM" << a << "\\Ally" << b; const int other = atoi(file.SGetValueDef("0",key.str()).c_str()); allyStartingData[a].allies[allyteamRemap[other]] = true; } } } unsigned allyCount = 0; if (file.GetValue(allyCount, "GAME\\NumAllyTeams") && (allyStartingData.size() != allyCount)) { LOG_L(L_WARNING, "Incorrect number of ally teams in GameSetup script"); } }
void CGameSetup::LoadPlayers(const TdfParser& file, std::set<std::string>& nameList) { numDemoPlayers = 0; // i = player index in game (no gaps), a = player index in script int i = 0; for (int a = 0; a < MAX_PLAYERS; ++a) { char section[50]; sprintf(section, "GAME\\PLAYER%i", a); string s(section); if (!file.SectionExist(s)) { continue; } PlayerBase data; // expects lines of form team=x rather than team=TEAMx // team field is relocated in RemapTeams std::map<std::string, std::string> setup = file.GetAllValues(s); for (std::map<std::string, std::string>::const_iterator it = setup.begin(); it != setup.end(); ++it) data.SetValue(it->first, it->second); // do checks for sanity if (data.name.empty()) throw content_error(str( boost::format("GameSetup: No name given for Player %i") %a )); if (nameList.find(data.name) != nameList.end()) throw content_error(str(boost::format("GameSetup: Player %i has name %s which is already taken") %a %data.name.c_str() )); nameList.insert(data.name); if (data.isFromDemo) numDemoPlayers++; playerStartingData.push_back(data); playerRemap[a] = i; ++i; } unsigned playerCount = 0; if (file.GetValue(playerCount, "GAME\\NumPlayers") && playerStartingData.size() != playerCount) { LOG_L(L_WARNING, _STPF_ " players in GameSetup script (NumPlayers says %i)", playerStartingData.size(), playerCount); } }
void CGameSetup::LoadTeams(const TdfParser& file) { // i = team index in game (no gaps), a = team index in script int i = 0; for (int a = 0; a < MAX_TEAMS; ++a) { char section[50]; sprintf(section, "GAME\\TEAM%i", a); string s(section); if (!file.SectionExist(s.substr(0, s.length()))) { continue; } TeamBase data; data.startMetal = startMetal; data.startEnergy = startEnergy; // Get default color from palette (based on "color" tag) for (size_t num = 0; num < 3; ++num) { data.color[num] = palette.teamColor[a][num]; } data.color[3] = 255; std::map<std::string, std::string> setup = file.GetAllValues(s); for (std::map<std::string, std::string>::const_iterator it = setup.begin(); it != setup.end(); ++it) data.SetValue(it->first, it->second); if (data.startMetal == -1.0) data.startMetal = startMetal; if (data.startEnergy == -1.0) data.startEnergy = startEnergy; teamStartingData.push_back(data); teamRemap[a] = i; ++i; } unsigned teamCount = 0; if (file.GetValue(teamCount, "Game\\NumTeams") && teamStartingData.size() != teamCount) logOutput.Print("Warning: %i teams in GameSetup script (NumTeams: %i)", teamStartingData.size(), teamCount); }