Skip to content

Commit dacb185

Browse files
committed
minor refactore, change current map in runtime
1 parent 7855d09 commit dacb185

21 files changed

Lines changed: 301 additions & 219 deletions

src/Carnage3D.vcxproj.filters

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@
4747
<Filter Include="Third_Party\stb">
4848
<UniqueIdentifier>{4cca613e-8979-4fd2-8976-bef3ea433c70}</UniqueIdentifier>
4949
</Filter>
50-
<Filter Include="Game\GUI\DebugWindows">
51-
<UniqueIdentifier>{e0f94144-2eda-4062-a81c-663d85aba012}</UniqueIdentifier>
52-
</Filter>
5350
<Filter Include="Game\Camera">
5451
<UniqueIdentifier>{444d99fb-9da8-4789-b558-8ba75631c583}</UniqueIdentifier>
5552
</Filter>
@@ -62,6 +59,9 @@
6259
<Filter Include="Game\CharacterControllers">
6360
<UniqueIdentifier>{73f4101e-aaab-49ec-b0d3-a05f5ee7c929}</UniqueIdentifier>
6461
</Filter>
62+
<Filter Include="Game\DebugWindows">
63+
<UniqueIdentifier>{e0f94144-2eda-4062-a81c-663d85aba012}</UniqueIdentifier>
64+
</Filter>
6565
</ItemGroup>
6666
<ItemGroup>
6767
<ClInclude Include="stdafx.h">
@@ -173,16 +173,16 @@
173173
<Filter>Game\GUI</Filter>
174174
</ClInclude>
175175
<ClInclude Include="DebugWindow.h">
176-
<Filter>Game\GUI\DebugWindows</Filter>
176+
<Filter>Game\DebugWindows</Filter>
177177
</ClInclude>
178178
<ClInclude Include="ConsoleWindow.h">
179-
<Filter>Game\GUI\DebugWindows</Filter>
179+
<Filter>Game\DebugWindows</Filter>
180180
</ClInclude>
181181
<ClInclude Include="SpriteAnimation.h">
182182
<Filter>Game</Filter>
183183
</ClInclude>
184184
<ClInclude Include="GameCheatsWindow.h">
185-
<Filter>Game\GUI\DebugWindows</Filter>
185+
<Filter>Game\DebugWindows</Filter>
186186
</ClInclude>
187187
<ClInclude Include="DebugRenderer.h">
188188
<Filter>Game\Rendering</Filter>
@@ -387,10 +387,10 @@
387387
<Filter>Game\GUI</Filter>
388388
</ClCompile>
389389
<ClCompile Include="DebugWindow.cpp">
390-
<Filter>Game\GUI\DebugWindows</Filter>
390+
<Filter>Game\DebugWindows</Filter>
391391
</ClCompile>
392392
<ClCompile Include="ConsoleWindow.cpp">
393-
<Filter>Game\GUI\DebugWindows</Filter>
393+
<Filter>Game\DebugWindows</Filter>
394394
</ClCompile>
395395
<ClCompile Include="stb_rect_pack.cpp">
396396
<Filter>Third_Party\stb</Filter>
@@ -399,7 +399,7 @@
399399
<Filter>Game</Filter>
400400
</ClCompile>
401401
<ClCompile Include="GameCheatsWindow.cpp">
402-
<Filter>Game\GUI\DebugWindows</Filter>
402+
<Filter>Game\DebugWindows</Filter>
403403
</ClCompile>
404404
<ClCompile Include="DebugRenderer.cpp">
405405
<Filter>Game\Rendering</Filter>

src/CarnageGame.cpp

Lines changed: 114 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include "TimeManager.h"
1111

1212
static const char* InputsConfigPath = "config/inputs.json";
13-
static const char* GTA1MapFileExtension = ".CMP";
1413

1514
//////////////////////////////////////////////////////////////////////////
1615

@@ -26,115 +25,29 @@ bool CarnageGame::Initialize()
2625

2726
gGameParams.LoadDefaults();
2827

29-
// scan all gta1 maps
30-
std::vector<std::string> gtaMapNames;
31-
for (const std::string& currSearchPlace: gFiles.mSearchPlaces)
32-
{
33-
cxx::enum_files(currSearchPlace, [&gtaMapNames](const std::string& curr)
34-
{
35-
if (cxx::get_file_extension(curr) == GTA1MapFileExtension)
36-
{
37-
gtaMapNames.push_back(curr);
38-
}
39-
});
40-
}
41-
42-
if (gtaMapNames.size())
43-
{
44-
gConsole.LogMessage(eLogMessage_Info, "Found GTA1 maps:");
45-
for (const std::string& currMapname: gtaMapNames)
46-
{
47-
gConsole.LogMessage(eLogMessage_Info, " - %s", currMapname.c_str());
48-
}
49-
}
50-
else
51-
{
52-
gConsole.LogMessage(eLogMessage_Warning, "No GTA1 maps found within search places");
53-
}
54-
5528
if (gSystem.mStartupParams.mDebugMapName.empty())
5629
{
5730
// try load first found map
58-
if (gtaMapNames.size())
59-
{
60-
gSystem.mStartupParams.mDebugMapName = gtaMapNames[0].c_str();
61-
}
31+
debug_assert(!gFiles.mGameMapsList.empty());
32+
gSystem.mStartupParams.mDebugMapName = gFiles.mGameMapsList[0];
6233
}
6334

6435
if (gSystem.mStartupParams.mDebugMapName.empty())
6536
return false;
6637

67-
gGameMap.LoadFromFile(gSystem.mStartupParams.mDebugMapName.c_str());
68-
gSpriteManager.Cleanup();
69-
gRenderManager.mMapRenderer.BuildMapMesh();
70-
if (!gSpriteManager.InitLevelSprites())
38+
if (!StartScenario(gSystem.mStartupParams.mDebugMapName))
7139
{
72-
debug_assert(false);
73-
}
74-
//gSpriteManager.DumpSpriteDeltas("D:/Temp/gta1_deltas");
75-
//gSpriteCache.DumpBlocksTexture("D:/Temp/gta1_blocks");
76-
//gSpriteManager.DumpSpriteTextures("D:/Temp/gta1_sprites");
77-
//gSpriteManager.DumpCarsTextures("D:/Temp/gta_cars");
78-
gPhysics.Initialize();
79-
80-
gGameObjectsManager.Initialize();
81-
82-
// temporary
83-
//glm::vec3 pos { 108.0f, 2.0f, 25.0f };
84-
//glm::vec3 pos { 14.0, 2.0f, 38.0f };
85-
//glm::vec3 pos { 91.0f, 2.0f, 236.0f };
86-
//glm::vec3 pos { 121.0f, 2.0f, 200.0f };
87-
//glm::vec3 pos { 174.0f, 2.0f, 230.0f };
88-
89-
mNumPlayers = glm::clamp(gSystem.mStartupParams.mPlayersCount, 1, GAME_MAX_PLAYERS);
90-
gConsole.LogMessage(eLogMessage_Info, "Num players: %d", mNumPlayers);
91-
92-
glm::vec3 pos[GAME_MAX_PLAYERS];
40+
ShutdownCurrentScenario();
9341

94-
// choose spawn point
95-
// it is temporary!
96-
int currFindPosIter = 0;
97-
for (int yBlock = 10; yBlock < 20 && currFindPosIter < mNumPlayers; ++yBlock)
98-
{
99-
for (int xBlock = 10; xBlock < 20 && currFindPosIter < mNumPlayers; ++xBlock)
100-
{
101-
pos[currFindPosIter] = glm::ivec3(xBlock, MAP_LAYERS_COUNT - 1, yBlock);
102-
103-
float currHeight = gGameMap.GetHeightAtPosition(pos[currFindPosIter]);
104-
int zBlock = static_cast<int>(currHeight);
105-
if (zBlock > MAP_LAYERS_COUNT - 1)
106-
continue;
107-
108-
BlockStyle* currBlock = gGameMap.GetBlock(xBlock, yBlock, zBlock);
109-
if (currBlock->mGroundType == eGroundType_Field ||
110-
currBlock->mGroundType == eGroundType_Pawement ||
111-
currBlock->mGroundType == eGroundType_Road)
112-
{
113-
pos[currFindPosIter].x += MAP_BLOCK_LENGTH * 0.5f;
114-
pos[currFindPosIter].z += MAP_BLOCK_LENGTH * 0.5f;
115-
pos[currFindPosIter].y = currHeight;
116-
++currFindPosIter;
117-
}
118-
}
119-
}
120-
121-
for (int icurr = 0; icurr < mNumPlayers; ++icurr)
122-
{
123-
float randomAngle = 360.0f * gCarnageGame.mGameRand.generate_float();
124-
125-
Pedestrian* pedestrian = gGameObjectsManager.CreatePedestrian(pos[icurr], cxx::angle_t::from_degrees(randomAngle));
126-
SetupHumanCharacter(icurr, pedestrian);
42+
gConsole.LogMessage(eLogMessage_Warning, "Fail to start game");
43+
return false;
12744
}
128-
129-
SetupScreenLayout(mNumPlayers);
13045
return true;
13146
}
13247

13348
void CarnageGame::Deinit()
13449
{
135-
gGameObjectsManager.Deinit();
136-
gPhysics.Deinit();
137-
gGameMap.Cleanup();
50+
ShutdownCurrentScenario();
13851
}
13952

14053
void CarnageGame::UpdateFrame()
@@ -278,7 +191,7 @@ bool CarnageGame::SetInputActionsFromConfig()
278191
}
279192

280193
cxx::json_document configDocument;
281-
if (!configDocument.parse_document(jsonContent.c_str()))
194+
if (!configDocument.parse_document(jsonContent))
282195
{
283196
gConsole.LogMessage(eLogMessage_Warning, "Cannot parse input config document");
284197
return false;
@@ -360,3 +273,109 @@ int CarnageGame::GetPlayerIndex(const HumanCharacterController* controller) cons
360273
}
361274
return -1;
362275
}
276+
277+
void CarnageGame::DebugChangeMap(const std::string& mapName)
278+
{
279+
gConsole.LogMessage(eLogMessage_Debug, "Changing to next map '%s'", mapName.c_str());
280+
281+
if (!StartScenario(mapName))
282+
{
283+
gConsole.LogMessage(eLogMessage_Warning, "Fail to change map");
284+
return;
285+
}
286+
}
287+
288+
bool CarnageGame::StartScenario(const std::string& mapName)
289+
{
290+
ShutdownCurrentScenario();
291+
292+
if (!gGameMap.LoadFromFile(mapName))
293+
{
294+
gConsole.LogMessage(eLogMessage_Warning, "Cannot load map '%s'", mapName.c_str());
295+
return false;
296+
}
297+
gSpriteManager.Cleanup();
298+
gRenderManager.mMapRenderer.BuildMapMesh();
299+
if (!gSpriteManager.InitLevelSprites())
300+
{
301+
debug_assert(false);
302+
}
303+
//gSpriteManager.DumpSpriteDeltas("D:/Temp/gta1_deltas");
304+
//gSpriteCache.DumpBlocksTexture("D:/Temp/gta1_blocks");
305+
//gSpriteManager.DumpSpriteTextures("D:/Temp/gta1_sprites");
306+
//gSpriteManager.DumpCarsTextures("D:/Temp/gta_cars");
307+
if (!gPhysics.InitPhysicsWorld())
308+
{
309+
debug_assert(false);
310+
}
311+
312+
gGameObjectsManager.InitGameObjects();
313+
314+
// temporary
315+
//glm::vec3 pos { 108.0f, 2.0f, 25.0f };
316+
//glm::vec3 pos { 14.0, 2.0f, 38.0f };
317+
//glm::vec3 pos { 91.0f, 2.0f, 236.0f };
318+
//glm::vec3 pos { 121.0f, 2.0f, 200.0f };
319+
//glm::vec3 pos { 174.0f, 2.0f, 230.0f };
320+
321+
mNumPlayers = glm::clamp(gSystem.mStartupParams.mPlayersCount, 1, GAME_MAX_PLAYERS);
322+
gConsole.LogMessage(eLogMessage_Info, "Num players: %d", mNumPlayers);
323+
324+
glm::vec3 pos[GAME_MAX_PLAYERS];
325+
326+
// choose spawn point
327+
// it is temporary!
328+
int currFindPosIter = 0;
329+
for (int yBlock = 10; yBlock < 20 && currFindPosIter < mNumPlayers; ++yBlock)
330+
{
331+
for (int xBlock = 10; xBlock < 20 && currFindPosIter < mNumPlayers; ++xBlock)
332+
{
333+
pos[currFindPosIter] = glm::ivec3(xBlock, MAP_LAYERS_COUNT - 1, yBlock);
334+
335+
float currHeight = gGameMap.GetHeightAtPosition(pos[currFindPosIter]);
336+
int zBlock = static_cast<int>(currHeight);
337+
if (zBlock > MAP_LAYERS_COUNT - 1)
338+
continue;
339+
340+
BlockStyle* currBlock = gGameMap.GetBlock(xBlock, yBlock, zBlock);
341+
if (currBlock->mGroundType == eGroundType_Field ||
342+
currBlock->mGroundType == eGroundType_Pawement ||
343+
currBlock->mGroundType == eGroundType_Road)
344+
{
345+
pos[currFindPosIter].x += MAP_BLOCK_LENGTH * 0.5f;
346+
pos[currFindPosIter].z += MAP_BLOCK_LENGTH * 0.5f;
347+
pos[currFindPosIter].y = currHeight;
348+
++currFindPosIter;
349+
}
350+
}
351+
}
352+
353+
for (int icurr = 0; icurr < mNumPlayers; ++icurr)
354+
{
355+
float randomAngle = 360.0f * gCarnageGame.mGameRand.generate_float();
356+
357+
Pedestrian* pedestrian = gGameObjectsManager.CreatePedestrian(pos[icurr], cxx::angle_t::from_degrees(randomAngle));
358+
SetupHumanCharacter(icurr, pedestrian);
359+
}
360+
361+
SetupScreenLayout(mNumPlayers);
362+
return true;
363+
}
364+
365+
void CarnageGame::ShutdownCurrentScenario()
366+
{
367+
// todo: cleanup
368+
for (int ihuman = 0; ihuman < GAME_MAX_PLAYERS; ++ihuman)
369+
{
370+
if (mHumanSlot[ihuman].mCharPedestrian == nullptr)
371+
continue;
372+
373+
gRenderManager.DetachRenderView(&mHumanSlot[ihuman].mCharView);
374+
mHumanSlot[ihuman].mCharController.SetCharacter(nullptr);
375+
mHumanSlot[ihuman].mCharView.SetCameraController(nullptr);
376+
mHumanSlot[ihuman].mCharPedestrian = nullptr;
377+
}
378+
gGameObjectsManager.FreeGameObjects();
379+
gPhysics.FreePhysicsWorld();
380+
gGameMap.Cleanup();
381+
}

src/CarnageGame.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,22 @@ class CarnageGame final: public cxx::noncopyable
4242
void InputEvent(KeyCharEvent& inputEvent);
4343
void InputEvent(GamepadInputEvent& inputEvent);
4444

45-
// initialize player data
45+
// Initialize player data
4646
void SetupHumanCharacter(int playerIndex, Pedestrian* pedestrian);
4747
void SetupScreenLayout(int playersCount);
4848

49-
// get player index from human char controller
49+
// Get player index from human char controller
5050
// @returns -1 on error
5151
int GetPlayerIndex(const HumanCharacterController* controller) const;
5252

53+
// Debug stuff
54+
void DebugChangeMap(const std::string& mapName);
55+
5356
private:
5457
bool SetInputActionsFromConfig();
58+
59+
bool StartScenario(const std::string& mapName);
60+
void ShutdownCurrentScenario();
5561
};
5662

5763
extern CarnageGame gCarnageGame;

0 commit comments

Comments
 (0)