1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#include "StdAfx.h"
#include <algorithm>
#include <cctype>
#include <map>
#include "mmgr.h"
#include "CommanderScript.h"
#include "ExternalAI/EngineOutHandler.h"
#include "ExternalAI/SkirmishAIHandler.h"
#include "Game/Game.h"
#include "Game/GameSetup.h"
#include "Game/UI/MiniMap.h"
#include "Game/UI/InfoConsole.h"
#include "Lua/LuaParser.h"
#include "Map/MapParser.h"
#include "Map/ReadMap.h"
#include "Sim/Misc/SideParser.h"
#include "Sim/Misc/TeamHandler.h"
#include "Sim/Units/Unit.h"
#include "Sim/Units/UnitDefHandler.h"
#include "Sim/Units/UnitLoader.h"
#include "NetProtocol.h"
#include "LogOutput.h"
#include "Exceptions.h"
CCommanderScript::CCommanderScript(): CScript(std::string("Commanders"))
{
}
CCommanderScript::~CCommanderScript(void)
{
}
void CCommanderScript::GameStart()
{
// setup the teams
for (int a = 0; a < teamHandler->ActiveTeams(); ++a) {
// don't spawn a commander for the Gaia team
if (gs->useLuaGaia && (a == teamHandler->GaiaTeamID())) {
continue;
}
CTeam* team = teamHandler->Team(a);
if (team->gaia) {
continue;
}
// remove the pre-existing storage except for a small amount
team->metalStorage = 20;
team->energyStorage = 20;
// create a Skirmish AI if required
// TODO: is this needed?
if (!gameSetup->hostDemo) {
const CSkirmishAIHandler::ids_t localSkirmAIs = skirmishAIHandler.GetSkirmishAIsInTeam(a, gu->myPlayerNum);
for (CSkirmishAIHandler::ids_t::const_iterator ai = localSkirmAIs.begin(); ai != localSkirmAIs.end(); ++ai) {
skirmishAIHandler.CreateLocalSkirmishAI(*ai);
}
}
if (team->side.empty()) {
// startscript didn't specify a side for this team
team->side = sideParser.GetSideName(a % sideParser.GetCount());
}
// get the team startup info
const std::string& startUnit = sideParser.GetStartUnit(team->side);
if (startUnit.empty()) {
throw content_error("[CommanderScript::GameStart] unable to load a start-unit for side \"" + team->side + "\"");
}
if (gameSetup->startPosType == CGameSetup::StartPos_ChooseInGame
&& (team->startPos.x < 0 || team->startPos.z < 0
|| (team->startPos.x <= 0 && team->startPos.z <= 0))) {
// if the player didn't choose a start position, choose one for him
// it should be near the center of his startbox
const int allyTeam = teamHandler->AllyTeam(a);
const float xmin = (gs->mapx * SQUARE_SIZE) * gameSetup->allyStartingData[allyTeam].startRectLeft;
const float zmin = (gs->mapy * SQUARE_SIZE) * gameSetup->allyStartingData[allyTeam].startRectTop;
const float xmax = (gs->mapx * SQUARE_SIZE) * gameSetup->allyStartingData[allyTeam].startRectRight;
const float zmax = (gs->mapy * SQUARE_SIZE) * gameSetup->allyStartingData[allyTeam].startRectBottom;
const float xcenter = (xmin + xmax) / 2;
const float zcenter = (zmin + zmax) / 2;
assert(xcenter >= 0 && xcenter < gs->mapx*SQUARE_SIZE);
assert(zcenter >= 0 && zcenter < gs->mapy*SQUARE_SIZE);
team->startPos.x = (a - teamHandler->ActiveTeams()) * 4 * SQUARE_SIZE + xcenter;
team->startPos.z = (a - teamHandler->ActiveTeams()) * 4 * SQUARE_SIZE + zcenter;
}
CUnit* unit =
unitLoader.LoadUnit(startUnit, team->startPos, a, false, 0, NULL);
team->lineageRoot = unit->id;
// FIXME this shouldn't be here, but no better place exists currently
if (a == gu->myTeam) {
minimap->AddNotification(team->startPos, float3(1.0f, 1.0f, 1.0f), 1.0f);
game->infoConsole->SetLastMsgPos(team->startPos);
}
}
}
|