-
Notifications
You must be signed in to change notification settings - Fork 1
/
mapstuff.h
181 lines (151 loc) · 4.96 KB
/
mapstuff.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#ifndef __MAPSTUFF_H__
#define __MAPSTUFF_H__
#include "mapclasses.h"
namespace UOX
{
const UI08 MAX_Z_STEP = 9;
const UI08 MAX_Z_FALL = 20;
/*
enum UOMapType
{
UOMT_BRITANNIA = 0,
UOMT_UNKNOWN1 = 1,
UOMT_ILSHENAR = 2,
UOMT_MALAS = 3,
UOMT_COUNT = 4,
UOMT_UNKNOWN = 0xFF
};
*/
struct StaticsIndex_st
{
UI32 offset;
UI32 length;
UI32 unknown;
StaticsIndex_st() : offset( 0 ), length( 0 ), unknown( 0 )
{
}
};
struct MapData_st
{
std::string mapFile;
std::string staticsFile;
std::string staidxFile;
std::string mapDiffFile;
std::string mapDiffListFile;
std::string staticsDiffFile;
std::string staticsDiffListFile;
std::string staticsDiffIndexFile;
UI16 xBlock;
UI16 yBlock;
UOXFile * mapObj;
UOXFile * staticsObj;
UOXFile * staidxObj;
UOXFile * mapDiffObj;
UOXFile * staticsDiffObj;
std::map< UI32, UI32 > mapDiffList;
std::map< UI32, StaticsIndex_st > staticsDiffIndex;
MapData_st() : mapFile( "" ), staticsFile( "" ), staidxFile( "" ), mapDiffFile( "" ), mapDiffListFile( "" ), staticsDiffFile( "" ),
staticsDiffListFile( "" ), staticsDiffIndexFile( "" ), xBlock( 0 ), yBlock( 0 ), mapObj( NULL ), staticsObj( NULL ),
staidxObj( NULL ), mapDiffObj( NULL ), staticsDiffObj( NULL )
{
mapDiffList.clear();
staticsDiffIndex.clear();
}
~MapData_st();
};
// full comments on this class are available in mapstuff.cpp
class CStaticIterator
{
private:
Static_st staticArray;
SI16 baseX, baseY;
UI32 pos;
UI08 remainX, remainY;
UI32 index, length;
bool exactCoords;
UI08 worldNumber;
bool useDiffs;
public:
CStaticIterator( SI16 x, SI16 y, UI08 world, bool exact = true );
~CStaticIterator()
{
};
Static_st * First( void );
Static_st * Next( void );
SI32 GetPos() const { return pos; }
UI32 GetLength() const { return length; }
};
class CMulHandler
{
private:
struct MultiItemsIndex_st
{
Multi_st * items; // point into where the items begin.
SI32 size; // # of items.
SI16 lx, ly, hx, hy;
SI08 lz, hz;
MultiItemsIndex_st() : items( NULL ), size( -1 ),
lx( SHRT_MAX ), ly( SHRT_MAX ), hx( SHRT_MIN ), hy( SHRT_MIN ),
lz( SCHAR_MAX ), hz( SCHAR_MIN )
{}
void Include( SI16 x, SI16 y, SI08 z );
};
typedef std::vector< MapData_st > MAPLIST;
typedef std::vector< MapData_st >::iterator MAPLIST_ITERATOR;
//Variables
// all the world's map and static Items.
// multiItem, tileSet, and verdata(patches really)
CLand * landTile; // the 512*32 pieces of land tile
CTile * staticTile; // the 512*32 pieces of static tile set
Multi_st * multiItems; // the multis cache(shadow) from files
MultiItemsIndex_st *multiIndex; // here's our index to multiItems
size_t multiIndexSize; // the length of index
size_t multiSize;
size_t tileDataSize;
MAPLIST MapList;
// Functions
SI08 MultiHeight( CItem *i, SI16 x, SI16 y, SI08 oldz, SI08 maxZ );
UI16 MultiTile( CItem *i, SI16 x, SI16 y, SI08 oldz );
UI16 DynTile( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber );
bool DoesStaticBlock( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber, bool checkWater = false );
bool DoesDynamicBlock( SI16 x, SI16 y, SI08 z, UI08 worldNumber, bool checkWater, bool waterWalk );
bool DoesMapBlock( SI16 x, SI16 y, SI08 z, UI08 worldNumber, bool checkWater, bool waterWalk );
bool CheckStaticFlag( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber, TileFlags toCheck );
// caching functions
void LoadMapsDFN( void );
void LoadMultis( const std::string basePath );
void LoadDFNOverrides( void );
void LoadMapAndStatics( MapData_st& mMap, const std::string basePath, UI08 &totalMaps );
void LoadTileData( const std::string basePath );
public:
CMulHandler();
~CMulHandler();
void Load( void );
// height functions
SI08 StaticTop( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber, SI08 maxZ );
SI08 DynamicElevation( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber, SI08 maxZ );
SI08 MapElevation( SI16 x, SI16 y, UI08 worldNumber );
SI08 TileHeight( UI16 tilenum );
SI08 Height( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber );
bool inBuilding( SI16 x, SI16 y, SI08 z, UI08 worldNumber );
// look at tile functions
void MultiArea( CMultiObj *i, SI16 &x1, SI16 &y1, SI16 &x2, SI16 &y2 );
SI32 SeekMulti( UI16 multinum );
Multi_st & SeekIntoMulti( UI16 multinum, SI32 number );
bool IsValidTile( UI16 tileNum );
CTile & SeekTile( UI16 tileNum );
CLand & SeekLand( UI16 landNum );
map_st SeekMap( SI16 x, SI16 y, UI08 worldNumber );
// misc functions
bool ValidSpawnLocation( SI16 x, SI16 y, SI08 z, UI08 worldNumber, bool checkWater = true );
bool ValidMultiLocation( SI16 x, SI16 y, SI08 oldz, UI08 worldNumber, bool checkWater );
bool MapExists( UI08 worldNumber );
bool InsideValidWorld( SI16 x, SI16 y, UI08 worldNumber = 0xFF );
MapData_st& GetMapData( UI08 mapNum );
UI08 MapCount( void ) const;
size_t GetTileMem( void ) const;
size_t GetMultisMem( void ) const;
};
extern CMulHandler *Map;
}
#endif