Skip to content

Commit d37d3f7

Browse files
author
rt
committed
cleanup AIScriptHandler
dedup SkirmishAIHandler data
1 parent 54ac2ec commit d37d3f7

13 files changed

Lines changed: 77 additions & 110 deletions

rts/ExternalAI/SkirmishAIBase.h

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include "System/creg/creg_cond.h"
88

99
#include <string>
10-
#include <map>
1110

1211

1312
/**
@@ -33,19 +32,9 @@ class SkirmishAIBase : public TeamController {
3332

3433
public:
3534
virtual ~SkirmishAIBase() {}
36-
typedef std::map<std::string, std::string> customOpts;
3735

38-
/**
39-
* @brief Constructor assigning default values.
40-
*/
41-
SkirmishAIBase()
42-
: TeamController()
43-
, hostPlayer(-1)
44-
, status(SKIRMAISTATE_CONSTRUCTED)
45-
{}
46-
47-
int hostPlayer;
48-
ESkirmishAIStatus status;
36+
int hostPlayer = -1;
37+
ESkirmishAIStatus status = SKIRMAISTATE_CONSTRUCTED;
4938
};
5039

5140
/**
@@ -56,16 +45,8 @@ class SkirmishAIStatistics : public TeamControllerStatistics
5645
CR_DECLARE_STRUCT(SkirmishAIStatistics)
5746

5847
public:
59-
/**
60-
* @brief Constructor assigning default values.
61-
*/
62-
SkirmishAIStatistics()
63-
: TeamControllerStatistics()
64-
, cpuTime(0)
65-
{}
66-
6748
/// How much CPU time has been used by the AI (in ms?)
68-
int cpuTime;
49+
int cpuTime = 0;
6950

7051
/// Change structure from host endian to little endian or vice versa.
7152
void swab();

rts/ExternalAI/SkirmishAIData.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,29 @@
1919
class SkirmishAIData : public SkirmishAIBase {
2020
CR_DECLARE_DERIVED(SkirmishAIData)
2121

22+
public:
23+
SkirmishAIData() = default;
24+
SkirmishAIData(const SkirmishAIData& d) = default;
25+
SkirmishAIData(SkirmishAIData&& d) { *this = std::move(d); }
26+
27+
SkirmishAIData& operator = (const SkirmishAIData& d) = default;
28+
SkirmishAIData& operator = (SkirmishAIData&& d) {
29+
team = d.team;
30+
hostPlayer = d.hostPlayer;
31+
status = d.status;
32+
33+
name = std::move(d.name);
34+
shortName = std::move(d.shortName);
35+
version = std::move(d.version);
36+
optionKeys = std::move(d.optionKeys);
37+
options = std::move(d.options);
38+
39+
isLuaAI = d.isLuaAI;
40+
41+
currentStats = d.currentStats;
42+
return *this;
43+
}
44+
2245
public:
2346
std::string shortName;
2447
std::string version;

rts/ExternalAI/SkirmishAIHandler.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ std::vector<uint8_t> CSkirmishAIHandler::GetSkirmishAIsInTeam(const int teamId,
114114
std::vector<uint8_t> skirmishAIs;
115115

116116
for (const auto& p: skirmishAIDataMap) {
117-
const SkirmishAIData& aiData = p.second;
117+
const SkirmishAIData& aiData = *(p.second);
118118

119119
if (aiData.team != teamId)
120120
continue;
@@ -132,7 +132,7 @@ std::vector<uint8_t> CSkirmishAIHandler::GetSkirmishAIsByPlayer(const int hostPl
132132
std::vector<uint8_t> skirmishAIs;
133133

134134
for (const auto& p: skirmishAIDataMap) {
135-
const SkirmishAIData& aiData = p.second;
135+
const SkirmishAIData& aiData = *(p.second);
136136

137137
if (aiData.hostPlayer != hostPlayerId)
138138
continue;
@@ -154,7 +154,7 @@ bool CSkirmishAIHandler::AddSkirmishAI(const SkirmishAIData& data, const size_t
154154
aiInstanceData[skirmishAIId] = data;
155155
localTeamAIs[data.team] = {};
156156

157-
skirmishAIDataMap.emplace(skirmishAIId, data);
157+
skirmishAIDataMap.emplace(skirmishAIId, &aiInstanceData[skirmishAIId]);
158158
CompleteSkirmishAI(skirmishAIId);
159159

160160
numSkirmishAIs += 1;
@@ -187,8 +187,7 @@ void CSkirmishAIHandler::CreateLocalSkirmishAI(const size_t skirmishAIId) {
187187
assert(IsLocalSkirmishAI(*aiData));
188188

189189
localTeamAIs[aiData->team] = *aiData;
190-
aiData->isLuaAI = IsLuaAI(*aiData);
191-
localTeamAIs[aiData->team].isLuaAI = aiData->isLuaAI;
190+
localTeamAIs[aiData->team].isLuaAI = (aiData->isLuaAI = IsLuaAI(*aiData));
192191

193192
// create instantly
194193
eoh->CreateSkirmishAI(skirmishAIId);

rts/ExternalAI/SkirmishAIHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class CSkirmishAIHandler
7979
*
8080
* Will change during runtime (Connection lost, died, killed, created, ...).
8181
*/
82-
const spring::unordered_map<uint8_t, SkirmishAIData>& GetAllSkirmishAIs() const { return skirmishAIDataMap; }
82+
const spring::unordered_map<uint8_t, const SkirmishAIData*>& GetAllSkirmishAIs() const { return skirmishAIDataMap; }
8383

8484

8585
/**
@@ -192,7 +192,7 @@ class CSkirmishAIHandler
192192
/// temporarily stores reason for killing a Skirmish AI
193193
std::array<int, MAX_AIS> aiKillFlags;
194194

195-
spring::unordered_map<uint8_t, SkirmishAIData> skirmishAIDataMap;
195+
spring::unordered_map<uint8_t, const SkirmishAIData*> skirmishAIDataMap;
196196
spring::unordered_set<std::string> luaAIShortNames;
197197

198198
// the current local AI ID that is executing, MAX_AIS if none (e.g. LuaUI)

rts/ExternalAI/SkirmishAIWrapper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ void CSkirmishAIWrapper::PreInit(int aiID)
8282
timerName += (" " + key.GetVersion());
8383
}
8484

85+
LOG_L(L_INFO, "[AIWrapper::%s] creating callbacks for AI %d on team %d", __func__, skirmishAIId, teamId);
8586
CreateCallback();
8687
}
8788

@@ -175,7 +176,7 @@ void CSkirmishAIWrapper::Init() {
175176
}
176177

177178
// init failed
178-
LOG_L(L_ERROR, "Failed to handle init event: AI for team %d, error %d", teamId, error);
179+
LOG_L(L_ERROR, "[AIWrapper::%s] handling EVENT_INIT for AI %d on team %d failed with error %d", __func__, skirmishAIId, teamId, error);
179180
skirmishAIHandler.SetLocalKillFlag(skirmishAIId, 5 /* = AI failed to init */);
180181
}
181182

rts/Game/Game.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ void CGame::LoadInterface()
655655

656656
// add the Skirmish AIs instance names to word completion (eg for chatting)
657657
for (const auto& ai: skirmishAIHandler.GetAllSkirmishAIs()) {
658-
wordCompletion.AddWordRaw(ai.second.name + " ", false, false, false);
658+
wordCompletion.AddWordRaw(ai.second->name + " ", false, false, false);
659659
}
660660
// add the available Skirmish AI libraries to word completion, for /aicontrol
661661
for (const auto& aiLib: aiLibManager->GetSkirmishAIKeys()) {

rts/Game/GameSetup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void CGameSetup::LoadSkirmishAIs(const TdfParser& file, spring::unordered_set<st
372372
data.name = uniqueName;
373373
nameList.insert(data.name);
374374

375-
skirmishAIStartingData.push_back(data);
375+
skirmishAIStartingData.emplace_back(std::move(data));
376376
}
377377
}
378378

rts/Game/Players/Player.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void CPlayer::SetControlledTeams()
6868

6969
// AI teams
7070
for (const auto& p: skirmishAIHandler.GetAllSkirmishAIs()) {
71-
const SkirmishAIData& sad = p.second;
71+
const SkirmishAIData& sad = *(p.second);
7272

7373
if (sad.hostPlayer != playerNum)
7474
continue;

rts/Game/UnsyncedGameCommands.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ class AIListActionExecutor : public IUnsyncedActionExecutor {
846846
}
847847

848848
bool Execute(const UnsyncedAction& action) const {
849-
const spring::unordered_map<uint8_t, SkirmishAIData>& ais = skirmishAIHandler.GetAllSkirmishAIs();
849+
const auto& ais = skirmishAIHandler.GetAllSkirmishAIs();
850850

851851
if (ais.empty()) {
852852
LOG("<There are no active Skirmish AIs in this game>");
@@ -862,21 +862,22 @@ class AIListActionExecutor : public IUnsyncedActionExecutor {
862862
"(Hosting player name) or (Short name & Version)");
863863

864864
for (const auto& p: ais) {
865-
const bool isLocal = (p.second.hostPlayer == gu->myPlayerNum);
865+
const SkirmishAIData& aiData = *(p.second);
866+
const bool isLocal = (aiData.hostPlayer == gu->myPlayerNum);
866867
std::string lastPart;
867868

868869
if (isLocal) {
869-
lastPart = "(Key:) " + p.second.shortName + " " + p.second.version;
870+
lastPart = "(Key:) " + aiData.shortName + " " + aiData.version;
870871
} else {
871872
lastPart = "(Host:) " + playerHandler.Player(gu->myPlayerNum)->name;
872873
}
873874

874875
LOG("%i | %i | %s | %s | %s | %s",
875876
p.first,
876-
p.second.team,
877+
aiData.team,
877878
(isLocal ? "yes" : "no "),
878-
(p.second.isLuaAI ? "yes" : "no "),
879-
p.second.name.c_str(),
879+
(aiData.isLuaAI ? "yes" : "no "),
880+
aiData.name.c_str(),
880881
lastPart.c_str());
881882
}
882883

rts/Menu/SelectionWidget.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ void SelectionWidget::UpdateAvailableScripts()
176176
// maybe also merge it with StartScriptGen.cpp
177177

178178
availableScripts.clear();
179+
availableScripts.reserve(16);
179180
// load selected archives to get lua ais
180181

181182
AddAIScriptsFromArchive();
@@ -184,16 +185,13 @@ void SelectionWidget::UpdateAvailableScripts()
184185
availableScripts.push_back(SandboxAI);
185186

186187
// add native ai's to the list, too (but second, lua ai's are prefered)
187-
CAIScriptHandler::ScriptList scriptList = CAIScriptHandler::Instance().GetScriptList();
188-
for (auto it = scriptList.cbegin(); it != scriptList.cend(); ++it) {
189-
availableScripts.push_back(*it);
188+
for (const auto& pair: CAIScriptHandler::Instance().GetScriptMap()) {
189+
availableScripts.push_back(pair.first);
190190
}
191191

192-
for (std::string &scriptName: availableScripts) {
193-
if (scriptName == userScript) {
194-
return;
195-
}
196-
}
192+
if (std::find(availableScripts.begin(), availableScripts.end(), userScript) != availableScripts.end())
193+
return;
194+
197195
SelectScript(SelectionWidget::NoScriptSelect);
198196
}
199197

@@ -206,7 +204,7 @@ void SelectionWidget::ShowScriptList()
206204
curSelect->Selected.connect(std::bind(&SelectionWidget::SelectScript, this, std::placeholders::_1));
207205
curSelect->WantClose.connect(std::bind(&SelectionWidget::CleanWindow, this));
208206

209-
for (std::string& scriptName: availableScripts) {
207+
for (const std::string& scriptName: availableScripts) {
210208
curSelect->list->AddItem(scriptName, "");
211209
}
212210

0 commit comments

Comments
 (0)