Skip to content

Commit

Permalink
Change team units set to a vector
Browse files Browse the repository at this point in the history
  • Loading branch information
ashdnazg committed Jan 7, 2016
1 parent 6356903 commit 5866c1b
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 86 deletions.
9 changes: 3 additions & 6 deletions rts/ExternalAI/EngineOutHandler.cpp
Expand Up @@ -602,14 +602,11 @@ void CEngineOutHandler::CreateSkirmishAI(const size_t skirmishAIId) {
// Send a UnitCreated event for each unit of the team.
// This will only do something if the AI is created mid-game.
const CTeam* team = teamHandler->Team(aiWrapper->GetTeamId());
CUnitSet::const_iterator u, uNext;
for (u = team->units.begin(); u != team->units.end(); ) {
uNext = u; ++uNext;
for (CUnit* u: team->units) {
try {
aiWrapper->UnitCreated((*u)->id, -1);
aiWrapper->UnitFinished((*u)->id);
aiWrapper->UnitCreated(u->id, -1);
aiWrapper->UnitFinished(u->id);
} CATCH_AI_EXCEPTION;
u = uNext;
}

clientNet->Send(CBaseNetProtocol::Get().SendAIStateChanged(gu->myPlayerNum, skirmishAIId, SKIRMAISTATE_ALIVE));
Expand Down
48 changes: 20 additions & 28 deletions rts/Game/SelectedUnitsHandler.cpp
Expand Up @@ -265,16 +265,15 @@ void CSelectedUnitsHandler::HandleUnitBoxSelection(const float4& planeRight, con
lastTeam = gu->myTeam;
}
for (; team <= lastTeam; team++) {
CUnitSet& teamUnits = teamHandler->Team(team)->units;
for (CUnitSet::iterator ui = teamUnits.begin(); ui != teamUnits.end(); ++ui) {
const float4 vec((*ui)->midPos, 1.0f);
for (CUnit* u: teamHandler->Team(team)->units) {
const float4 vec(u->midPos, 1.0f);

if (vec.dot4(planeRight) < 0.0f && vec.dot4(planeLeft) < 0.0f && vec.dot4(planeTop) < 0.0f && vec.dot4(planeBottom) < 0.0f) {
if (KeyInput::GetKeyModState(KMOD_CTRL) && (selectedUnits.find(*ui) != selectedUnits.end())) {
RemoveUnit(*ui);
if (KeyInput::GetKeyModState(KMOD_CTRL) && (selectedUnits.find(u) != selectedUnits.end())) {
RemoveUnit(u);
} else {
AddUnit(*ui);
unit = *ui;
AddUnit(u);
unit = u;
addedunits++;
}
}
Expand Down Expand Up @@ -317,12 +316,10 @@ void CSelectedUnitsHandler::HandleSingleUnitClickSelection(CUnit* unit, bool doI
lastTeam = gu->myTeam;
}
for (; team <= lastTeam; team++) {
CUnitSet::iterator ui;
CUnitSet& teamUnits = teamHandler->Team(team)->units;
for (ui = teamUnits.begin(); ui != teamUnits.end(); ++ui) {
if ((*ui)->unitDef->id == unit->unitDef->id) {
if (!doInViewTest || KeyInput::GetKeyModState(KMOD_CTRL) || camera->InView((*ui)->midPos)) {
AddUnit(*ui);
for (CUnit* u: teamHandler->Team(team)->units) {
if (u->unitDef->id == unit->unitDef->id) {
if (!doInViewTest || KeyInput::GetKeyModState(KMOD_CTRL) || camera->InView((u)->midPos)) {
AddUnit(u);
}
}
}
Expand Down Expand Up @@ -411,27 +408,22 @@ void CSelectedUnitsHandler::SelectUnits(const std::string& line)
const std::string& arg = args[i];
if (arg == "clear") {
selectedUnitsHandler.ClearSelected();
}
else if ((arg[0] == '+') || (arg[0] == '-')) {
} else if ((arg[0] == '+') || (arg[0] == '-')) {
char* endPtr;
const char* startPtr = arg.c_str() + 1;
const int unitIndex = strtol(startPtr, &endPtr, 10);
if (endPtr == startPtr) {
if (endPtr == startPtr)
continue; // bad number
}
if ((unitIndex < 0) || (static_cast<unsigned int>(unitIndex) >= unitHandler->MaxUnits())) {

if ((unitIndex < 0) || (static_cast<unsigned int>(unitIndex) >= unitHandler->MaxUnits()))
continue; // bad index
}

CUnit* unit = unitHandler->units[unitIndex];
if (unit == NULL) {
continue; // bad pointer
}
if (!gu->spectatingFullSelect) {
const CUnitSet& teamUnits = teamHandler->Team(gu->myTeam)->units;
if (teamUnits.find(unit) == teamUnits.end()) {
continue; // not mine to select
}
}
if (unit == nullptr)
continue;

if (!gu->spectatingFullSelect && (unit->team != gu->myTeam))
continue; // not mine to select

// perform the selection
if (arg[0] == '+') {
Expand Down
19 changes: 8 additions & 11 deletions rts/Game/UI/SelectionKeyHandler.cpp
Expand Up @@ -219,9 +219,8 @@ void CSelectionKeyHandler::DoSelection(std::string selectString)
if(s=="AllMap"){
if (!gu->spectatingFullSelect) {
// team units
CUnitSet* tu=&teamHandler->Team(gu->myTeam)->units;
for(CUnitSet::iterator ui=tu->begin();ui!=tu->end();++ui){
selection.push_back(*ui);
for(CUnit* unit: teamHandler->Team(gu->myTeam)->units){
selection.push_back(unit);
}
} else {
// all units
Expand All @@ -232,10 +231,9 @@ void CSelectionKeyHandler::DoSelection(std::string selectString)
} else if(s=="Visible"){
if (!gu->spectatingFullSelect) {
// team units in viewport
CUnitSet* tu=&teamHandler->Team(gu->myTeam)->units;
for (CUnitSet::iterator ui=tu->begin();ui!=tu->end();++ui){
if (camera->InView((*ui)->midPos,(*ui)->radius)){
selection.push_back(*ui);
for(CUnit* unit: teamHandler->Team(gu->myTeam)->units){
if (camera->InView(unit->midPos,unit->radius)){
selection.push_back(unit);
}
}
} else {
Expand Down Expand Up @@ -263,14 +261,13 @@ void CSelectionKeyHandler::DoSelection(std::string selectString)

if (!gu->spectatingFullSelect) {
// team units in mouse range
CUnitSet* tu=&teamHandler->Team(gu->myTeam)->units;
for(CUnitSet::iterator ui=tu->begin();ui!=tu->end();++ui){
float3 up = (*ui)->pos;
for(CUnit* unit: teamHandler->Team(gu->myTeam)->units){
float3 up = unit->pos;
if (cylindrical) {
up.y = 0;
}
if(mp.SqDistance(up) < Square(maxDist)){
selection.push_back(*ui);
selection.push_back(unit);
}
}
} else {
Expand Down
44 changes: 15 additions & 29 deletions rts/Lua/LuaSyncedRead.cpp
Expand Up @@ -1637,26 +1637,23 @@ int LuaSyncedRead::GetAllUnits(lua_State* L)

int LuaSyncedRead::GetTeamUnits(lua_State* L)
{
if (CLuaHandle::GetHandleReadAllyTeam(L) == CEventClient::NoAccessTeam) {
if (CLuaHandle::GetHandleReadAllyTeam(L) == CEventClient::NoAccessTeam)
return 0;
}

// parse the team
const CTeam* team = ParseTeam(L, __FUNCTION__, 1);
if (team == NULL) {
if (team == nullptr)
return 0;
}

const int teamID = team->teamNum;

const CUnitSet& units = team->units;
CUnitSet::const_iterator uit;

// raw push for allies
if (IsAlliedTeam(L, teamID)) {
lua_newtable(L);
int count = 1;
for (uit = units.begin(); uit != units.end(); ++uit) {
lua_pushnumber(L, (*uit)->id);
for (const CUnit* unit: team->units) {
lua_pushnumber(L, unit->id);
lua_rawseti(L, -2, count++);
}

Expand All @@ -1666,8 +1663,7 @@ int LuaSyncedRead::GetTeamUnits(lua_State* L)
// check visibility for enemies
lua_newtable(L);
int count = 1;
for (uit = units.begin(); uit != units.end(); ++uit) {
const CUnit* unit = *uit;
for (const CUnit* unit: team->units) {
if (IsUnitVisible(L, unit)) {
lua_pushnumber(L, unit->id);
lua_rawseti(L, -2, count++);
Expand All @@ -1692,21 +1688,17 @@ int LuaSyncedRead::GetTeamUnitsSorted(lua_State* L)
const int teamID = team->teamNum;

map<int, vector<CUnit*> > unitDefMap;
const CUnitSet& units = team->units;
CUnitSet::const_iterator uit;

// tally for allies
if (IsAlliedTeam(L, teamID)) {
for (uit = units.begin(); uit != units.end(); ++uit) {
CUnit* unit = *uit;
for (CUnit* unit: team->units) {
unitDefMap[unit->unitDef->id].push_back(unit);
}
}
// tally for enemies
else {
// NOTE: (using unitsByDefs[] might be faster late-game)
for (uit = units.begin(); uit != units.end(); ++uit) {
CUnit* unit = *uit;
for(CUnit* unit: team->units){
if (IsUnitVisible(L, unit)) {
const UnitDef* ud = EffectiveUnitDef(L, unit);
if (IsUnitTyped(L, unit)) {
Expand All @@ -1715,7 +1707,6 @@ int LuaSyncedRead::GetTeamUnitsSorted(lua_State* L)
unitDefMap[-1].push_back(unit); // unknown
}
}
unitDefMap[unit->unitDef->id].push_back(unit);
}
}

Expand Down Expand Up @@ -1782,16 +1773,12 @@ int LuaSyncedRead::GetTeamUnitsCounts(lua_State* L)
map<int, int> unitDefCounts;
map<int, int>::const_iterator mit;

const CUnitSet& unitSet = team->units;
CUnitSet::const_iterator uit;

int unknownCount = 0;
for (uit = unitSet.begin(); uit != unitSet.end(); ++uit) {
const CUnit* unit = *uit;
for(CUnit* unit: team->units) {

if (!IsUnitVisible(L, unit)) {
if (!IsUnitVisible(L, unit))
continue;
}

if (!IsUnitTyped(L, unit)) {
unknownCount++;
} else {
Expand Down Expand Up @@ -1991,10 +1978,9 @@ int LuaSyncedRead::GetTeamUnitCount(lua_State* L)

// loop through the units for enemies
int count = 0;
const CUnitSet& units = team->units;

for (auto uit = units.begin(); uit != units.end(); ++uit) {
count += int(IsUnitVisible(L, *uit));
for(CUnit* unit: team->units) {
count += int(IsUnitVisible(L, unit));
}

lua_pushnumber(L, count);
Expand All @@ -2019,7 +2005,7 @@ int LuaSyncedRead::GetTeamUnitCount(lua_State* L)
lua_createtable(L, units.size(), 0); \
} \
\
for (auto it = units.begin(); it != units.end(); ++it) { \
for (auto it = units.cbegin(); it != units.cend(); ++it) { \
const CUnit* unit = *it; \
\
ALLEGIANCE_TEST; \
Expand Down Expand Up @@ -2331,7 +2317,7 @@ int LuaSyncedRead::GetUnitsInPlanes(lua_State* L)
lua_newtable(L);

for (int team = startTeam; team <= endTeam; team++) {
const CUnitSet& units = teamHandler->Team(team)->units;
const std::vector<CUnit*>& units = teamHandler->Team(team)->units;

if (allegiance >= 0) {
if (allegiance == team) {
Expand Down
22 changes: 13 additions & 9 deletions rts/Sim/Misc/Team.cpp
Expand Up @@ -10,13 +10,14 @@
#include "Game/GameSetup.h"
#include "Game/GlobalUnsynced.h"
#include "Map/ReadMap.h"
#include "Net/Protocol/NetProtocol.h"
#include "Sim/Units/Unit.h"
#include "Sim/Units/UnitDef.h"
#include "System/EventHandler.h"
#include "System/Log/ILog.h"
#include "Net/Protocol/NetProtocol.h"
#include "System/MsgStrings.h"
#include "System/Rectangle.h"
#include "System/Util.h"
#include "System/creg/STL_Set.h"
#include "System/creg/STL_List.h"
#include "System/creg/STL_Map.h"
#include "System/creg/STL_Set.h"
Expand Down Expand Up @@ -62,6 +63,7 @@ CTeam::CTeam():
maxUnits(0),
isDead(false),
gaia(false),
dontRemove(false),
resStorage(1000000, 1000000),
resShare(0.99f, 0.95f),
nextHistoryEntry(0),
Expand Down Expand Up @@ -208,12 +210,12 @@ void CTeam::GiveEverythingTo(const unsigned toTeam)
res.energy = 0;
}

for (CUnitSet::iterator ui = units.begin(); ui != units.end(); ) {
// must pass the normal checks, isDead, unit count restrictions, luaRules, etc...
CUnitSet::iterator next = ui; ++next;
(*ui)->ChangeTeam(toTeam, CUnit::ChangeGiven);
ui = next;
dontRemove = true;
for (CUnit* u: units) {
u->ChangeTeam(toTeam, CUnit::ChangeGiven);
}
dontRemove = false;
units.clear();
}


Expand Down Expand Up @@ -378,7 +380,7 @@ void CTeam::SlowUpdate()

void CTeam::AddUnit(CUnit* unit, AddType type)
{
units.insert(unit);
VectorInsertUnique(units, unit, false);
switch (type) {
case AddBuilt: {
GetCurrentStats().unitsProduced++;
Expand All @@ -398,7 +400,9 @@ void CTeam::AddUnit(CUnit* unit, AddType type)

void CTeam::RemoveUnit(CUnit* unit, RemoveType type)
{
units.erase(unit);
if (!dontRemove)
VectorErase(units, unit);

switch (type) {
case RemoveDied: {
GetCurrentStats().unitsDied++;
Expand Down
6 changes: 3 additions & 3 deletions rts/Sim/Misc/Team.h
Expand Up @@ -5,17 +5,16 @@

#include <string>
#include <vector>
#include <map>
#include <list>

#include "TeamBase.h"
#include "TeamStatistics.h"
#include "Sim/Misc/Resource.h"
#include "Sim/Units/UnitSet.h"
#include "System/Color.h"
#include "ExternalAI/SkirmishAIKey.h"
#include "Lua/LuaRulesParams.h"

class CUnit;

class CTeam : public TeamBase
{
Expand Down Expand Up @@ -79,8 +78,9 @@ class CTeam : public TeamBase

bool isDead;
bool gaia;
bool dontRemove;

CUnitSet units;
std::vector<CUnit*> units;

SResourcePack res;
SResourcePack resStorage;
Expand Down

0 comments on commit 5866c1b

Please sign in to comment.