void CGlobalAITestScript::GameStart(void) { globalAI->CreateGlobalAI(1, dllName.c_str()); gs->Team(0)->energy = 1000; gs->Team(0)->energyStorage = 1000; gs->Team(0)->metal = 1000; gs->Team(0)->metalStorage = 1000; gs->Team(1)->energy = 1000; gs->Team(1)->energyStorage = 1000; gs->Team(1)->metal = 1000; gs->Team(1)->metalStorage = 1000; const std::string startUnit0 = sideParser.GetStartUnit(0, ""); const std::string startUnit1 = sideParser.GetStartUnit(1, startUnit0); // default to side 1, in case mod has only 1 side if (startUnit0.length() == 0) { throw content_error ("Unable to load a commander for the first side"); } MapParser mapParser(stupidGlobalMapname); if (!mapParser.IsValid()) { throw content_error("MapParser: " + mapParser.GetErrorLog()); } float3 startPos0(1000.0f, 80.0f, 1000.0f); float3 startPos1(1200.0f, 80.0f, 1200.0f); mapParser.GetStartPos(0, startPos0); mapParser.GetStartPos(1, startPos1); unitLoader.LoadUnit(startUnit0, startPos0, 0, false, 0, NULL); unitLoader.LoadUnit(startUnit1, startPos1, 1, false, 0, NULL); }
void Game::init() { // Create the Arena instance m_arena = new Arena(); m_remainingTime = Settings::roundTime(); m_bombCount = 0; // Create the parser that will parse the XML file in order to initialize the Arena instance // This also creates all the characters MapParser mapParser(m_arena); // Set the XML file as input source for the parser QString filePath; if(Settings::self()->randomArenaMode()) { if(m_randomArenaModeArenaList.isEmpty()) { m_randomArenaModeArenaList = Settings::self()->randomArenaModeArenaList(); QStringList arenasAvailable; const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::AppDataLocation, QStringLiteral("arenas"), QStandardPaths::LocateDirectory); Q_FOREACH (const QString& dir, dirs) { const QStringList fileNames = QDir(dir).entryList(QStringList() << QStringLiteral("*.desktop")); Q_FOREACH (const QString& file, fileNames) { arenasAvailable.append(dir + QLatin1Char('/') + file); } } QStringList::Iterator i = m_randomArenaModeArenaList.begin(); while(i != m_randomArenaModeArenaList.end()) { if(arenasAvailable.contains(*i)) { i++; } else { i = m_randomArenaModeArenaList.erase(i); } } if(m_randomArenaModeArenaList.isEmpty()) { m_randomArenaModeArenaList = arenasAvailable; } }
void CSkirmishAITestScript::GameStart(void) { // make sure CSelectedUnits::AiOrder() // still works without a setup script teamHandler->Team(skirmishAI_teamId)->isAI = true; teamHandler->Team(skirmishAI_teamId)->skirmishAIKey = key; teamHandler->Team(skirmishAI_teamId)->skirmishAIOptions = options; teamHandler->Team(skirmishAI_teamId)->leader = player_teamId; playerHandler->Player(player_teamId)->SetControlledTeams(); teamHandler->Team(player_teamId)->energy = 1000; teamHandler->Team(player_teamId)->energyStorage = 1000; teamHandler->Team(player_teamId)->metal = 1000; teamHandler->Team(player_teamId)->metalStorage = 1000; teamHandler->Team(skirmishAI_teamId)->energy = 1000; teamHandler->Team(skirmishAI_teamId)->energyStorage = 1000; teamHandler->Team(skirmishAI_teamId)->metal = 1000; teamHandler->Team(skirmishAI_teamId)->metalStorage = 1000; eoh->CreateSkirmishAI(skirmishAI_teamId, key); const std::string startUnit0 = sideParser.GetStartUnit(0, ""); const std::string startUnit1 = sideParser.GetStartUnit(1, startUnit0); // default to side 1, in case mod has only 1 side if (startUnit0.length() == 0) { throw content_error ("Unable to load a commander for the first side"); } MapParser mapParser(stupidGlobalMapname); if (!mapParser.IsValid()) { throw content_error("MapParser: " + mapParser.GetErrorLog()); } float3 startPos0(1000.0f, 80.0f, 1000.0f); float3 startPos1(1200.0f, 80.0f, 1200.0f); mapParser.GetStartPos(0, startPos0); mapParser.GetStartPos(1, startPos1); unitLoader.LoadUnit(startUnit0, startPos0, 0, false, 0, NULL); unitLoader.LoadUnit(startUnit1, startPos1, 1, false, 0, NULL); }
void CGameSetup::LoadStartPositionsFromMap() { MapParser mapParser(MapFile()); if (!mapParser.IsValid()) { throw content_error("MapInfo: " + mapParser.GetErrorLog()); } for (size_t a = 0; a < teamStartingData.size(); ++a) { float3 pos; // don't fail when playing with more players than // start positions and we didn't use them anyway if (!mapParser.GetStartPos(teamStartingData[a].teamStartNum, pos)) throw content_error(mapParser.GetErrorLog()); // map should ensure positions are valid // (but clients will always do clamping) teamStartingData[a].SetStartPos(pos); } }
void CSpawnScript::Update() { switch(gs->frameNum){ case 0: LoadSpawns(); const std::string startUnit0 = sideParser.GetStartUnit(0); if (startUnit0.length() == 0) { throw content_error ("Unable to load a startUnit for the first side"); } MapParser mapParser(stupidGlobalMapname); if (!mapParser.IsValid()) { throw content_error("MapParser: " + mapParser.GetErrorLog()); } float3 startPos0(1000.0f, 80.0f, 1000.0f); mapParser.GetStartPos(0, startPos0); // Set the TEAM0 startpos as spawnpos if we're supposed to be // autonomous, load the commander for the player if not. if (autonomous) { spawnPos.push_back(startPos0); } else { unitLoader.LoadUnit(startUnit0, startPos0, 0, false, 0, NULL); } // load the start positions for teams 1 - 3 for (int teamID = 1; teamID <= 3; teamID++) { float3 sp(1000.0f, 80.0f, 1000.0f); mapParser.GetStartPos(teamID, sp); spawnPos.push_back(sp); } } if(!spawns.empty()){ while(curSpawn->frame+frameOffset<gs->frameNum){ int num = gs->randInt() % spawnPos.size(); int team = autonomous ? (num & 1) : 1; float3 pos; float dist=200; CFeature* feature; do { pos=spawnPos[num]+gs->randVector()*dist; dist*=1.05f; } while (dist < 500 && uh->TestUnitBuildSquare(BuildInfo(curSpawn->name,pos,0),feature,team) != 2); // Ignore unit if it really doesn't fit. // (within 18 tries, 200*1.05f^18 < 500 < 200*1.05f^19) if (dist < 500) { CUnit* u = unitLoader.LoadUnit(curSpawn->name, pos, team, false, 0, NULL); Unit unit; unit.id=u->id; unit.target=-1; unit.team=team; myUnits.push_back(unit); if(myUnits.size()==1) curUnit=myUnits.begin(); } ++curSpawn; if(curSpawn==spawns.end()){ curSpawn=spawns.begin(); frameOffset+=spawns.back().frame; } } } if(!myUnits.empty() && !gs->Team(1 - curUnit->team)->units.empty()) { if(uh->units[curUnit->id]){ if(curUnit->target<0 || uh->units[curUnit->target]==0){ // We can't rely on the ordering of units in a std::set<CUnit*>, // because they're sorted on memory address. Hence we must first // build a set of IDs and then pick an unit from that. // This guarantees the script doesn't desync in multiplayer games. int num = gs->randInt() % gs->Team(1 - curUnit->team)->units.size(); std::set<int> unitids; CUnitSet* tu = &gs->Team(1 - curUnit->team)->units; for (CUnitSet::iterator u = tu->begin(); u != tu->end(); ++u) unitids.insert((*u)->id); std::set<int>::iterator ui = unitids.begin(); for(int a=0;a<num;++a) ++ui; curUnit->target=(*ui); curUnit->lastTargetPos.x=-500; } float3 pos=uh->units[curUnit->target]->pos; if(pos.distance2D(curUnit->lastTargetPos)>100){ curUnit->lastTargetPos=pos; Command c; c.id=CMD_PATROL; c.options=0; c.params.push_back(pos.x); c.params.push_back(pos.y); c.params.push_back(pos.z); uh->units[curUnit->id]->commandAI->GiveCommand(c); } curUnit++; } else { curUnit=myUnits.erase(curUnit); } if(curUnit==myUnits.end()) curUnit=myUnits.begin(); } }