Skip to content

Commit 137ae1a

Browse files
committed
Do the same thing but for managers. Watch for memory leaks! I didn't see any.
1 parent 9d00ae7 commit 137ae1a

File tree

6 files changed

+262
-253
lines changed

6 files changed

+262
-253
lines changed

Source/Lua/LuaBindingsManagers.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ LuaBindingRegisterFunctionDefinitionForType(ManagerLuaBindings, MetaMan) {
102102
.property("PlayerTurn", &MetaMan::GetPlayerTurn)
103103
.property("PlayerCount", &MetaMan::GetPlayerCount)
104104

105-
.def_readwrite("Players", &MetaMan::m_Players, luabind::return_stl_iterator)
105+
.def_readonly("Players", &MetaMan::m_Players, luabind::return_stl_iterator)
106106

107107
.def("GetTeamOfPlayer", &MetaMan::GetTeamOfPlayer)
108108
.def("GetPlayer", &MetaMan::GetPlayer)
@@ -114,14 +114,14 @@ LuaBindingRegisterFunctionDefinitionForType(ManagerLuaBindings, MovableMan) {
114114

115115
.property("MaxDroppedItems", &MovableMan::GetMaxDroppedItems, &MovableMan::SetMaxDroppedItems)
116116

117-
.def_readwrite("Actors", &MovableMan::m_Actors, luabind::return_stl_iterator)
118-
.def_readwrite("Items", &MovableMan::m_Items, luabind::return_stl_iterator)
119-
.def_readwrite("Particles", &MovableMan::m_Particles, luabind::return_stl_iterator)
120-
.def_readwrite("AddedActors", &MovableMan::m_AddedActors, luabind::return_stl_iterator)
121-
.def_readwrite("AddedItems", &MovableMan::m_AddedItems, luabind::return_stl_iterator)
122-
.def_readwrite("AddedParticles", &MovableMan::m_AddedParticles, luabind::return_stl_iterator)
123-
.def_readwrite("AlarmEvents", &MovableMan::m_AlarmEvents, luabind::return_stl_iterator)
124-
.def_readwrite("AddedAlarmEvents", &MovableMan::m_AddedAlarmEvents, luabind::return_stl_iterator)
117+
.def_readonly("Actors", &MovableMan::m_Actors, luabind::return_stl_iterator)
118+
.def_readonly("Items", &MovableMan::m_Items, luabind::return_stl_iterator)
119+
.def_readonly("Particles", &MovableMan::m_Particles, luabind::return_stl_iterator)
120+
.def_readonly("AddedActors", &MovableMan::m_AddedActors, luabind::return_stl_iterator)
121+
.def_readonly("AddedItems", &MovableMan::m_AddedItems, luabind::return_stl_iterator)
122+
.def_readonly("AddedParticles", &MovableMan::m_AddedParticles, luabind::return_stl_iterator)
123+
.def_readonly("AlarmEvents", &MovableMan::m_AlarmEvents, luabind::return_stl_iterator)
124+
.def_readonly("AddedAlarmEvents", &MovableMan::m_AddedAlarmEvents, luabind::return_stl_iterator)
125125

126126
.def("GetMOFromID", &MovableMan::GetMOFromID)
127127
.def("FindObjectByUniqueID", &MovableMan::FindObjectByUniqueID)
@@ -192,7 +192,7 @@ LuaBindingRegisterFunctionDefinitionForType(ManagerLuaBindings, PostProcessMan)
192192
LuaBindingRegisterFunctionDefinitionForType(ManagerLuaBindings, PresetMan) {
193193
return luabind::class_<PresetMan>("PresetManager")
194194

195-
.def_readwrite("Modules", &PresetMan::m_pDataModules, luabind::return_stl_iterator)
195+
.def_readonly("Modules", &PresetMan::m_pDataModules, luabind::return_stl_iterator)
196196

197197
.def("LoadDataModule", (bool(PresetMan::*)(const std::string&)) & PresetMan::LoadDataModule)
198198
.def("GetDataModule", &PresetMan::GetDataModule)

Source/Managers/MetaMan.cpp

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ int MetaMan::ReadProperty(const std::string_view& propName, Reader& reader) {
210210
MatchProperty("GameName", { reader >> m_GameName; });
211211
MatchProperty("AddPlayer",
212212
{
213-
MetaPlayer player;
214-
reader >> player;
213+
MetaPlayer* player = new MetaPlayer();
214+
reader >> *player;
215215
m_Players.push_back(player);
216216
});
217217
MatchProperty("TeamCount", { reader >> m_TeamCount; });
@@ -255,8 +255,8 @@ int MetaMan::Save(Writer& writer) const {
255255
writer.NewPropertyWithValue("Team3AISkill", m_TeamAISkill[Activity::TeamThree]);
256256
writer.NewPropertyWithValue("Team4AISkill", m_TeamAISkill[Activity::TeamFour]);
257257

258-
for (const MetaPlayer& metaPlayer: m_Players) {
259-
writer.NewPropertyWithValue("AddPlayer", metaPlayer);
258+
for (const MetaPlayer* metaPlayer: m_Players) {
259+
writer.NewPropertyWithValue("AddPlayer", *metaPlayer);
260260
}
261261

262262
writer.NewPropertyWithValue("TeamCount", m_TeamCount);
@@ -301,6 +301,19 @@ int MetaMan::Save(Writer& writer) const {
301301
return 0;
302302
}
303303

304+
void MetaMan::Destroy() {
305+
delete m_pMetaGUI;
306+
307+
for (std::vector<Scene*>::iterator sItr = m_Scenes.begin(); sItr != m_Scenes.end(); ++sItr)
308+
delete (*sItr);
309+
for (std::vector<GAScripted*>::iterator aItr = m_RoundOffensives.begin(); aItr != m_RoundOffensives.end(); ++aItr)
310+
delete (*aItr);
311+
for (std::vector<MetaPlayer*>::iterator pItr = m_Players.begin(); pItr != m_Players.end(); ++pItr)
312+
delete (*pItr);
313+
314+
Clear();
315+
}
316+
304317
int MetaMan::SaveSceneData(std::string pathBase) {
305318
for (std::vector<Scene*>::const_iterator sItr = m_Scenes.begin(); sItr != m_Scenes.end(); ++sItr) {
306319
// Only save the data of revealed scenes that have already had their layers built and saved into files
@@ -333,17 +346,6 @@ int MetaMan::ClearSceneData() {
333346
return 0;
334347
}
335348

336-
void MetaMan::Destroy() {
337-
delete m_pMetaGUI;
338-
339-
for (std::vector<Scene*>::iterator sItr = m_Scenes.begin(); sItr != m_Scenes.end(); ++sItr)
340-
delete (*sItr);
341-
for (std::vector<GAScripted*>::iterator aItr = m_RoundOffensives.begin(); aItr != m_RoundOffensives.end(); ++aItr)
342-
delete (*aItr);
343-
344-
Clear();
345-
}
346-
347349
int MetaMan::GetPlayerTurn() const {
348350
// Player 1's turn is coming up on this round
349351
if (g_MetaMan.m_GameState <= PLAYER1TURN)
@@ -357,9 +359,9 @@ int MetaMan::GetPlayerTurn() const {
357359
}
358360

359361
MetaPlayer* MetaMan::GetMetaPlayerOfInGamePlayer(int inGamePlayer) {
360-
for (std::vector<MetaPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) {
361-
if ((*itr).GetInGamePlayer() == inGamePlayer)
362-
return &(*itr);
362+
for (std::vector<MetaPlayer*>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) {
363+
if ((*itr)->GetInGamePlayer() == inGamePlayer)
364+
return &(**itr);
363365
}
364366

365367
// Didn't find any metaplayer that is using that in-game player
@@ -404,14 +406,14 @@ int MetaMan::GetTotalBrainCountOfPlayer(int metaPlayer, bool countPoolsOnly) con
404406
return 0;
405407

406408
// Count the pool first
407-
int brainCount = m_Players[metaPlayer].GetBrainPoolCount();
409+
int brainCount = m_Players[metaPlayer]->GetBrainPoolCount();
408410
// Plus any that are out travelling between sites
409-
brainCount += m_Players[metaPlayer].GetBrainsInTransit();
411+
brainCount += m_Players[metaPlayer]->GetBrainsInTransit();
410412

411413
if (!countPoolsOnly) {
412414
for (std::vector<Scene*>::const_iterator sItr = m_Scenes.begin(); sItr != m_Scenes.end(); ++sItr) {
413415
// Add up any brains installed as resident on any sites
414-
if ((*sItr)->IsRevealed() && (*sItr)->GetTeamOwnership() == GetTeamOfPlayer(metaPlayer) && (*sItr)->GetResidentBrain(m_Players[metaPlayer].GetInGamePlayer()))
416+
if ((*sItr)->IsRevealed() && (*sItr)->GetTeamOwnership() == GetTeamOfPlayer(metaPlayer) && (*sItr)->GetResidentBrain(m_Players[metaPlayer]->GetInGamePlayer()))
415417
brainCount += 1;
416418
}
417419
}
@@ -426,8 +428,8 @@ int MetaMan::GetGoldCountOfTeam(int team) const {
426428
float goldTotal = 0;
427429
// Go through all players and add up the funds of all who belong to this team
428430
for (int metaPlayer = Players::PlayerOne; metaPlayer < m_Players.size(); ++metaPlayer) {
429-
if (m_Players[metaPlayer].GetTeam() == team)
430-
goldTotal += m_Players[metaPlayer].GetFunds();
431+
if (m_Players[metaPlayer]->GetTeam() == team)
432+
goldTotal += m_Players[metaPlayer]->GetFunds();
431433
}
432434

433435
return goldTotal;
@@ -456,7 +458,7 @@ int MetaMan::GetTotalBrainCountOfTeam(int team, bool countPoolsOnly) const {
456458
int brainCount = 0;
457459

458460
for (int metaPlayer = Players::PlayerOne; metaPlayer < m_Players.size(); ++metaPlayer) {
459-
if (m_Players[metaPlayer].GetTeam() == team)
461+
if (m_Players[metaPlayer]->GetTeam() == team)
460462
brainCount += GetTotalBrainCountOfPlayer(metaPlayer, countPoolsOnly);
461463
}
462464

@@ -535,8 +537,8 @@ int MetaMan::WhichTeamLeft()
535537

536538
bool MetaMan::NoBrainsLeftInAnyPool() {
537539
// Go through all players and check each for any brains in any pool
538-
for (std::vector<MetaPlayer>::iterator mpItr = m_Players.begin(); mpItr != m_Players.end(); ++mpItr) {
539-
if ((*mpItr).GetBrainPoolCount() > 0)
540+
for (std::vector<MetaPlayer*>::iterator mpItr = m_Players.begin(); mpItr != m_Players.end(); ++mpItr) {
541+
if ((*mpItr)->GetBrainPoolCount() > 0)
540542
return false;
541543
}
542544
return true;
@@ -616,15 +618,15 @@ float MetaMan::GetBudgetedRatioOfPlayer(int metaPlayer, const Scene* pException,
616618
for (std::vector<Scene*>::const_iterator sItr = g_MetaMan.m_Scenes.begin(); sItr != g_MetaMan.m_Scenes.end(); ++sItr) {
617619
// Add up all the allocated funds so far this round, first of bases we're building
618620
if ((*sItr)->GetTeamOwnership() == g_MetaMan.GetTeamOfPlayer(metaPlayer) && *sItr != pException)
619-
totalAllocated += (*sItr)->GetBuildBudget(m_Players[metaPlayer].GetInGamePlayer());
621+
totalAllocated += (*sItr)->GetBuildBudget(m_Players[metaPlayer]->GetInGamePlayer());
620622
}
621623
}
622624

623625
// Also the money allocated for offensive action
624-
if (includeOffensive && !m_Players[metaPlayer].GetOffensiveTargetName().empty() && (!pException || (pException && pException->GetPresetName() != m_Players[metaPlayer].GetOffensiveTargetName())))
625-
totalAllocated += m_Players[metaPlayer].GetOffensiveBudget();
626+
if (includeOffensive && !m_Players[metaPlayer]->GetOffensiveTargetName().empty() && (!pException || (pException && pException->GetPresetName() != m_Players[metaPlayer]->GetOffensiveTargetName())))
627+
totalAllocated += m_Players[metaPlayer]->GetOffensiveBudget();
626628

627-
return totalAllocated / m_Players[metaPlayer].GetFunds();
629+
return totalAllocated / m_Players[metaPlayer]->GetFunds();
628630
}
629631

630632
void MetaMan::SetSuspend(bool suspend) {
@@ -761,7 +763,7 @@ void MetaMan::AIPlayerTurn(int metaPlayer) {
761763
if (metaPlayer < 0 || metaPlayer >= m_Players.size())
762764
return;
763765

764-
MetaPlayer* pThisPlayer = &(m_Players[metaPlayer]);
766+
MetaPlayer* pThisPlayer = m_Players[metaPlayer];
765767

766768
// If this player has no brains at all left, then do nothing
767769
if (GetTotalBrainCountOfPlayer(metaPlayer) <= 0) {
@@ -1009,21 +1011,21 @@ void MetaMan::Update() {
10091011
int metaPlayer = m_GameState - PLAYER1TURN;
10101012

10111013
// If an AI player, do the AI player's logic now and go to next player immediately afterward
1012-
if (!m_Players[metaPlayer].IsHuman())
1014+
if (!m_Players[metaPlayer]->IsHuman())
10131015
AIPlayerTurn(metaPlayer);
10141016

10151017
// State end - skip A.I. metaplayer turns in the GUI; also skip human player who have been knocked out of the game in previous rounds
1016-
if (m_pMetaGUI->ContinuePhase() || !m_Players[metaPlayer].IsHuman() || m_Players[metaPlayer].IsGameOverByRound(m_CurrentRound)) {
1018+
if (m_pMetaGUI->ContinuePhase() || !m_Players[metaPlayer]->IsHuman() || m_Players[metaPlayer]->IsGameOverByRound(m_CurrentRound)) {
10171019
// If this player is now done for, mark him as such so he'll be completely skipped in future rounds
1018-
if (GetTotalBrainCountOfPlayer(metaPlayer) <= 0 && !m_Players[metaPlayer].IsGameOverByRound(m_CurrentRound))
1019-
m_Players[metaPlayer].SetGameOverRound(m_CurrentRound);
1020+
if (GetTotalBrainCountOfPlayer(metaPlayer) <= 0 && !m_Players[metaPlayer]->IsGameOverByRound(m_CurrentRound))
1021+
m_Players[metaPlayer]->SetGameOverRound(m_CurrentRound);
10201022

10211023
// Find the next player which is not out of the game yet
10221024
do {
10231025
// Next player, if any left
10241026
m_GameState++;
10251027
metaPlayer = m_GameState - PLAYER1TURN;
1026-
} while (m_GameState <= PLAYER4TURN && metaPlayer < m_Players.size() && m_Players[metaPlayer].IsGameOverByRound(m_CurrentRound));
1028+
} while (m_GameState <= PLAYER4TURN && metaPlayer < m_Players.size() && m_Players[metaPlayer]->IsGameOverByRound(m_CurrentRound));
10271029

10281030
// If not, jump to building bases
10291031
if (m_GameState > PLAYER4TURN || metaPlayer >= m_Players.size())

Source/Managers/MetaMan.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,12 @@ namespace RTE {
146146
/// Gets the designated team of a specific player
147147
/// @param metaPlayer Which player.
148148
/// @return The team of that player.
149-
int GetTeamOfPlayer(int metaPlayer) const { return metaPlayer >= Players::PlayerOne && metaPlayer < static_cast<int>(m_Players.size()) ? m_Players[metaPlayer].GetTeam() : Activity::NoTeam; }
149+
int GetTeamOfPlayer(int metaPlayer) const { return metaPlayer >= Players::PlayerOne && metaPlayer < static_cast<int>(m_Players.size()) ? m_Players[metaPlayer]->GetTeam() : Activity::NoTeam; }
150150

151151
/// Gets the specified MetaPlayer
152152
/// @param metaPlayer Which player.
153153
/// @return The requested MetaPlayer
154-
MetaPlayer* GetPlayer(int metaPlayer) { return (metaPlayer >= Players::PlayerOne && metaPlayer < static_cast<int>(m_Players.size())) ? &(m_Players[metaPlayer]) : nullptr; }
154+
MetaPlayer* GetPlayer(int metaPlayer) { return (metaPlayer >= Players::PlayerOne && metaPlayer < static_cast<int>(m_Players.size())) ? &*m_Players[metaPlayer] : nullptr; }
155155

156156
/// Gets the MetaPlayer playing a specific in-game player, if any.
157157
/// @param inGamePlayer Which in-game player to translate into a metaplayer.
@@ -231,7 +231,7 @@ namespace RTE {
231231
/// @param deductOffensive Whether to count the money allocated for offensive action as remaining. (default: false)
232232
/// @param deductDefensive Whether to count the money allocated for defensive action as remaining. (default: false) const { return m_Players[metaPlayer].GetFunds() - m_Players[metaPlayer].GetFunds() * GetBudgetedRatioOfPlayer(metaPlayer)
233233
/// @return The amount, in oz, that this player unallocated and unused this turn.
234-
float GetRemainingFundsOfPlayer(int metaPlayer, const Scene* pException = 0, bool deductOffensive = false, bool deductDefensive = false) const { return m_Players[metaPlayer].GetFunds() - m_Players[metaPlayer].GetFunds() * GetBudgetedRatioOfPlayer(metaPlayer, pException, !deductOffensive, !deductDefensive); }
234+
float GetRemainingFundsOfPlayer(int metaPlayer, const Scene* pException = 0, bool deductOffensive = false, bool deductDefensive = false) const { return m_Players[metaPlayer]->GetFunds() - m_Players[metaPlayer]->GetFunds() * GetBudgetedRatioOfPlayer(metaPlayer, pException, !deductOffensive, !deductDefensive); }
235235

236236
/// Shows whether a game is currently in progress
237237
/// @return Whether a game is going or not.
@@ -314,7 +314,7 @@ namespace RTE {
314314
// The save name of the currently played metagame
315315
std::string m_GameName;
316316
// The players of the metagame
317-
std::vector<MetaPlayer> m_Players;
317+
std::vector<MetaPlayer*> m_Players;
318318
// The number of Team:s in play this game
319319
int m_TeamCount;
320320
// The flag icons of all teams

Source/Managers/MovableMan.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ void MovableMan::Destroy() {
117117
delete (*it2);
118118
for (std::deque<MovableObject*>::iterator it3 = m_Particles.begin(); it3 != m_Particles.end(); ++it3)
119119
delete (*it3);
120+
for (std::vector<AlarmEvent*>::iterator it4 = m_AlarmEvents.begin(); it4 != m_AlarmEvents.end(); ++it4)
121+
delete (*it4);
122+
for (std::vector<AlarmEvent*>::iterator it5 = m_AddedAlarmEvents.begin(); it5 != m_AddedAlarmEvents.end(); ++it5)
123+
delete (*it5);
120124

121125
Clear();
122126
}
@@ -1157,7 +1161,7 @@ void MovableMan::OverrideMaterialDoors(bool eraseDoorMaterial, int team) const {
11571161

11581162
void MovableMan::RegisterAlarmEvent(const AlarmEvent& newEvent) {
11591163
std::lock_guard<std::mutex> lock(m_AddedAlarmEventsMutex);
1160-
m_AddedAlarmEvents.push_back(newEvent);
1164+
m_AddedAlarmEvents.push_back(new AlarmEvent(newEvent));
11611165
}
11621166

11631167
void callLuaFunctionOnMORecursive(MovableObject* mo, const std::string& functionName, const std::vector<const Entity*>& functionEntityArguments, const std::vector<std::string_view>& functionLiteralArguments, const std::vector<LuabindObjectWrapper*>& functionObjectArguments) {
@@ -1288,8 +1292,11 @@ void MovableMan::Update() {
12881292
m_SortTeamRoster[Activity::TeamFour] = false;
12891293

12901294
// Move all last frame's alarm events into the proper buffer, and clear out the new one to fill up with this frame's
1295+
for (AlarmEvent* alarmEvent: m_AlarmEvents) {
1296+
delete alarmEvent;
1297+
}
12911298
m_AlarmEvents.clear();
1292-
for (std::vector<AlarmEvent>::iterator aeItr = m_AddedAlarmEvents.begin(); aeItr != m_AddedAlarmEvents.end(); ++aeItr) {
1299+
for (std::vector<AlarmEvent*>::iterator aeItr = m_AddedAlarmEvents.begin(); aeItr != m_AddedAlarmEvents.end(); ++aeItr) {
12931300
m_AlarmEvents.push_back(*aeItr);
12941301
}
12951302
m_AddedAlarmEvents.clear();

Source/Managers/MovableMan.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ namespace RTE {
430430

431431
/// Gets the list of AlarmEvent:s from last frame's update.
432432
/// @return The const list of AlarmEvent:s.
433-
const std::vector<AlarmEvent>& GetAlarmEvents() const { return m_AlarmEvents; }
433+
const std::vector<AlarmEvent*>& GetAlarmEvents() const { return m_AlarmEvents; }
434434

435435
/// Shows whetehr particles are set to get copied to the terrain upon
436436
/// settling
@@ -597,10 +597,10 @@ namespace RTE {
597597

598598
// The alarm events on the scene where something alarming happened, for use with AI firings awareness os they react to shots fired etc.
599599
// This is the last frame's events, is the one for Actors to poll for events, should be cleaned out and refilled each frame.
600-
std::vector<AlarmEvent> m_AlarmEvents;
600+
std::vector<AlarmEvent*> m_AlarmEvents;
601601
// The alarm events on the scene where something alarming happened, for use with AI firings awareness os they react to shots fired etc.
602602
// This is the current frame's events, will be filled up during MovableMan Updates, should be transferred to Last Frame at end of update.
603-
std::vector<AlarmEvent> m_AddedAlarmEvents;
603+
std::vector<AlarmEvent*> m_AddedAlarmEvents;
604604

605605
// Mutexes to ensure alarm events aren't being added from separate threads at the same time
606606
std::mutex m_AddedAlarmEventsMutex;

0 commit comments

Comments
 (0)