Skip to content

Commit 762913b

Browse files
committed
- separate D1, D2 and shared region code
1 parent d72aefc commit 762913b

File tree

11 files changed

+646
-487
lines changed

11 files changed

+646
-487
lines changed

DriverLevelTool/driver_level.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extern IVirtualStream* g_levStream;
2424

2525
extern CDriverLevelTextures g_levTextures;
2626
extern CDriverLevelModels g_levModels;
27-
extern CDriver2LevelMap g_levMap;
27+
extern CBaseLevelMap* g_levMap;
2828

2929
//----------------------------------------------------------
3030

DriverLevelTool/driver_routines/level.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "driver_level.h"
2+
#include "regions_d2.h"
23
#include "core/VirtualStream.h"
34
#include "util/DkList.h"
45

@@ -13,7 +14,7 @@ char* g_overlayMapData = nullptr;
1314

1415
CDriverLevelTextures g_levTextures;
1516
CDriverLevelModels g_levModels;
16-
CDriver2LevelMap g_levMap;
17+
CBaseLevelMap* g_levMap = nullptr;
1718

1819
//---------------------------------------------------------------------------------------------------------------------------------
1920

@@ -117,7 +118,16 @@ void ProcessLumps(IVirtualStream* pFile)
117118
// perform auto-detection if format is not specified
118119
if(g_format == LEV_FORMAT_AUTODETECT)
119120
DetectLevelFormat(pFile);
120-
121+
122+
if(!g_levMap)
123+
{
124+
// failed to detect Driver 1 level file - try Driver 2 loader
125+
if (g_format >= LEV_FORMAT_DRIVER2_ALPHA16 || g_format == LEV_FORMAT_AUTODETECT)
126+
g_levMap = new CDriver2LevelMap();
127+
//else
128+
// g_levMap = new CDriver1LevelMap();
129+
}
130+
121131
int lump_count = 255; // Driver 2 difference: you not need to read lump count
122132

123133
// Driver 1 has lump count
@@ -142,7 +152,7 @@ void ProcessLumps(IVirtualStream* pFile)
142152
break;
143153
case LUMP_MAP:
144154
MsgWarning("LUMP_MAP ofs=%d size=%d\n", pFile->Tell(), lump.size);
145-
g_levMap.LoadMapLump(pFile);
155+
g_levMap->LoadMapLump(pFile);
146156
break;
147157
case LUMP_TEXTURENAMES:
148158
MsgWarning("LUMP_TEXTURENAMES ofs=%d size=%d\n", pFile->Tell(), lump.size);
@@ -171,7 +181,7 @@ void ProcessLumps(IVirtualStream* pFile)
171181
break;
172182
case LUMP_SPOOLINFO:
173183
MsgWarning("LUMP_SPOOLINFO ofs=%d size=%d\n", pFile->Tell(), lump.size);
174-
g_levMap.LoadSpoolInfoLump(pFile);
184+
g_levMap->LoadSpoolInfoLump(pFile);
175185
break;
176186
case LUMP_STRAIGHTS2:
177187
MsgWarning("LUMP_STRAIGHTS2 ofs=%d size=%d\n", pFile->Tell(), lump.size);
@@ -322,7 +332,7 @@ void FreeLevelData()
322332
delete g_levStream;
323333
g_levStream = nullptr;
324334

325-
g_levMap.FreeAll();
335+
g_levMap->FreeAll();
326336
g_levTextures.FreeAll();
327337
g_levModels.FreeAll();
328338

DriverLevelTool/driver_routines/models.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct CarModelData_t
7878

7979
class CDriverLevelModels
8080
{
81-
friend class CDriver2LevelMap;
81+
friend class CBaseLevelMap;
8282
public:
8383
CDriverLevelModels();
8484
virtual ~CDriverLevelModels();
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#ifndef REGION_D1
2+
#define REGION_D1
3+
#include "regions.h"
4+
5+
6+
//----------------------------------------------------------------------------------
7+
// DRIVER 1
8+
//----------------------------------------------------------------------------------
9+
10+
// Driver 1 region
11+
class CDriver1LevelRegion : public CBaseLevelRegion
12+
{
13+
friend class CDriver1LevelMap;
14+
public:
15+
void FreeAll() override;
16+
void LoadRegionData(IVirtualStream* pFile, Spool* spool) override;
17+
18+
CELL_OBJECT* GetCellObject(int num) const;
19+
20+
protected:
21+
CELL_DATA* m_cells{ nullptr }; // cell data that holding information about cell pointers. 3D world seeks cells first here
22+
CELL_OBJECT* m_cellObjects{ nullptr }; // cell objects that represents objects placed in the world
23+
};
24+
25+
struct CELL_ITERATOR_D1
26+
{
27+
CDriver1LevelRegion* region;
28+
CELL_DATA_D1* pcd;
29+
CELL_OBJECT* pco;
30+
XZPAIR nearCell;
31+
};
32+
33+
// Driver 1 level map
34+
class CDriver1LevelMap : public CBaseLevelMap
35+
{
36+
friend class CDriver2LevelRegion;
37+
public:
38+
void FreeAll() override;
39+
40+
//----------------------------------------
41+
42+
void LoadMapLump(IVirtualStream* pFile) override;
43+
void LoadSpoolInfoLump(IVirtualStream* pFile) override;
44+
45+
void SpoolRegion(const XZPAIR& cell) override;
46+
void SpoolRegion(int regionIdx) override;
47+
48+
CBaseLevelRegion* GetRegion(const XZPAIR& cell) const override;
49+
CBaseLevelRegion* GetRegion(int regionIdx) const override;
50+
51+
//----------------------------------------
52+
// cell iterator
53+
PACKED_CELL_OBJECT* GetFirstPackedCop(CELL_ITERATOR_D1* iterator, int cellx, int cellz) const;
54+
PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR_D1* iterator) const;
55+
56+
protected:
57+
58+
// Driver 2 - specific
59+
CDriver1LevelRegion* m_regions{ nullptr }; // map of regions
60+
CELL_OBJECT* m_straddlers{ nullptr }; // cell objects between regions
61+
};
62+
63+
64+
#endif

0 commit comments

Comments
 (0)