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
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "TeamHandler.h"
#include <cstring>
#include "Game/GameSetup.h"
#include "System/mmgr.h"
#include "Sim/Misc/GlobalConstants.h"
#include "Sim/Misc/GlobalSynced.h"
#include "System/Util.h"
CR_BIND(CTeamHandler, );
CR_REG_METADATA(CTeamHandler, (
CR_MEMBER(gaiaTeamID),
CR_MEMBER(gaiaAllyTeamID),
CR_MEMBER(teams),
//CR_MEMBER(allyTeams),
CR_RESERVED(64)
));
CTeamHandler* teamHandler = NULL;
CTeamHandler::CTeamHandler():
gaiaTeamID(-1),
gaiaAllyTeamID(-1)
{
}
CTeamHandler::~CTeamHandler()
{
for (std::vector<CTeam*>::iterator it = teams.begin(); it != teams.end(); ++it)
delete *it;
}
void CTeamHandler::LoadFromSetup(const CGameSetup* setup)
{
assert(!setup->teamStartingData.empty());
assert(setup->teamStartingData.size() <= MAX_TEAMS);
assert(setup->allyStartingData.size() <= MAX_TEAMS);
teams.reserve(setup->teamStartingData.size() + 1); // +1 for Gaia
teams.resize(setup->teamStartingData.size());
allyTeams = setup->allyStartingData;
for (size_t i = 0; i < teams.size(); ++i) {
// TODO: this loop body could use some more refactoring
CTeam* team = new CTeam();
teams[i] = team;
*team = setup->teamStartingData[i];
team->teamNum = i;
team->maxUnits = std::min(setup->maxUnits, int(MAX_UNITS / teams.size()));
assert(team->teamAllyteam >= 0);
assert(team->teamAllyteam < allyTeams.size());
}
if (gs->useLuaGaia) {
// Gaia adjustments
gaiaTeamID = static_cast<int>(teams.size());
gaiaAllyTeamID = static_cast<int>(allyTeams.size());
// Setup the gaia team
CTeam* gaia = new CTeam();
gaia->color[0] = 255;
gaia->color[1] = 255;
gaia->color[2] = 255;
gaia->color[3] = 255;
gaia->gaia = true;
gaia->teamNum = gaiaTeamID;
gaia->maxUnits = MAX_UNITS - (teams.size() * teams[0]->maxUnits);
gaia->StartposMessage(ZeroVector);
gaia->teamAllyteam = gaiaAllyTeamID;
teams.push_back(gaia);
assert((((teams.size() - 1) * teams[0]->maxUnits) + gaia->maxUnits) == MAX_UNITS);
for (std::vector< ::AllyTeam >::iterator it = allyTeams.begin(); it != allyTeams.end(); ++it) {
it->allies.push_back(false); // enemy to everyone
}
::AllyTeam allyteam;
allyteam.allies.resize(allyTeams.size() + 1, false); // everyones enemy
allyteam.allies[gaiaAllyTeamID] = true; // peace with itself
allyTeams.push_back(allyteam);
}
}
void CTeamHandler::GameFrame(int frameNum)
{
if ((frameNum % TEAM_SLOWUPDATE_RATE) == 0) {
for (int a = 0; a < ActiveTeams(); ++a) {
teams[a]->ResetResourceState();
}
for (int a = 0; a < ActiveTeams(); ++a) {
teams[a]->SlowUpdate();
}
}
}
|