00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __DATA_H__
00011 #define __DATA_H__
00012
00019 extern UI16 map_width;
00020 extern UI16 map_height;
00021 extern LOGICAL statics_cache;
00022 extern LOGICAL map_cache;
00023
00027 enum {
00028 MAP_HEADER_SIZE = 4, MAP_BLOCK_SIZE = 196,
00029 TILE_HEADER_SIZE = 4, TILEDATA_LAND_SIZE = 0x68800,
00030 VERDATA_HEADER_SIZE = 4
00031 };
00032
00036 enum VerFile {
00037 VerMap = 0x00,
00038 VerStaIdx,
00039 VerStatics,
00040 VerArtIdx,
00041 VerArt,
00042 VerAnimIdx,
00043 VerAnim,
00044 VerSoundIdx,
00045 VerSound,
00046 VerTexIdx,
00047 VerTexMaps,
00048 VerGumpIdx,
00049 VerGumpArt,
00050 VerMultiIdx,
00051 VerMulti,
00052 VerSkillsIdx,
00053 VerSkills,
00054 VerTileData = 0x1E,
00055 VerAnimData
00056 };
00057
00061 enum MulFileId {
00062 Map_File = 0, StaIdx_File, Statics_File, Multi_File, MultiIdx_File, TileData_File, VerData_File
00063 };
00064
00065
00066 struct map_st {
00067 UI16 id;
00068 SI08 z;
00069 } PACK_NEEDED;
00070
00071 struct staticIdx_st {
00072 SI32 start;
00073 SI32 length;
00074 SI32 unknown;
00075 } PACK_NEEDED;
00076
00077 struct static_st {
00078 UI16 id;
00079 UI08 xoff;
00080 UI08 yoff;
00081 SI08 z;
00082 UI16 unknown;
00083 } PACK_NEEDED;
00084
00085 typedef std::vector< static_st > staticVector;
00086
00087 struct land_st
00088 {
00089 UI32 flags;
00090 UI16 id;
00091 TEXT name[20];
00092 } PACK_NEEDED;
00093
00094 struct tile_st
00095 {
00096 UI32 flags;
00097 UI08 weight;
00098 UI08 quality;
00099 UI16 unknown;
00100 UI08 unknown1;
00101 UI08 quantity;
00102 UI16 animid;
00103 UI08 unknown2;
00104 UI08 hue;
00105 UI16 unknown3;
00106 SI08 height;
00107 TEXT name[20];
00108 } PACK_NEEDED;
00109
00110 struct multiIdx_st {
00111 SI32 start;
00112 SI32 length;
00113 SI32 unknown;
00114 } PACK_NEEDED;
00115
00116 struct multi_st {
00117 SI16 block;
00118 SI16 x;
00119 SI16 y;
00120 SI16 height;
00121 UI32 flags;
00122 } PACK_NEEDED;
00123
00124 typedef std::vector< multi_st > multiVector;
00125
00129 struct verdata_st
00130 {
00131 SI32 fileid;
00132 SI32 block;
00133 SI32 pos;
00134 SI32 size;
00135 SI32 various;
00136 } PACK_NEEDED;
00137
00141 enum {
00142 TILEFLAG_BACKGROUND = 0x00000001,
00143 TILEFLAG_WEAPON = 0x00000002,
00144 TILEFLAG_TRANSPARENT = 0x00000004,
00145 TILEFLAG_TRANSLUCENT = 0x00000008,
00146 TILEFLAG_WALL = 0x00000010,
00147 TILEFLAG_DAMAGING = 0x00000020,
00148 TILEFLAG_IMPASSABLE = 0x00000040,
00149 TILEFLAG_WET = 0x00000080,
00150 TILEFLAG_SURFACE = 0x00000200,
00151 TILEFLAG_BRIDGE = 0x00000400,
00152 TILEFLAG_STACKABLE = 0x00000800,
00153 TILEFLAG_WINDOW = 0x00001000,
00154 TILEFLAG_NOSHOOT = 0x00002000,
00155 TILEFLAG_PREFIX_A = 0x00004000,
00156 TILEFLAG_PREFIX_AN = 0x00008000,
00157 TILEFLAG_INTERNAL = 0x00010000,
00158 TILEFLAG_FOLIAGE = 0x00020000,
00159 TILEFLAG_PARTIAL_HUE = 0x00040000,
00160 TILEFLAG_MAP = 0x00100000,
00161 TILEFLAG_CONTAINER = 0x00200000,
00162 TILEFLAG_WEARABLE = 0x00400000,
00163 TILEFLAG_LIGHTSOURCE = 0x00800000,
00164 TILEFLAG_ANIMATED = 0x01000000,
00165 TILEFLAG_NODIAGONAL = 0x02000000,
00166 TILEFLAG_ARMOR = 0x08000000,
00167 TILEFLAG_ROOF = 0x10000000,
00168 TILEFLAG_DOOR = 0x20000000,
00169 TILEFLAG_STAIR_BACK = 0x40000000,
00170 TILEFLAG_STAIR_RIGHT = 0x80000000
00171 };
00172
00173
00174 const UI08 verdata_st_size = sizeof( verdata_st );
00175 const UI08 multi_st_size = sizeof( multi_st );
00176 const UI08 multiIdx_st_size = sizeof( multiIdx_st );
00177 const UI08 tile_st_size = sizeof( tile_st );
00178 const UI08 land_st_size = sizeof( land_st );
00179 const UI08 static_st_size = sizeof( static_st );
00180 const UI08 staticIdx_st_size = sizeof( staticIdx_st );
00181 const UI08 map_st_size = sizeof( map_st );
00182
00183
00187 namespace data {
00188
00189 void init();
00190 void shutdown();
00191 void setPath( MulFileId id, std::string path );
00192 std::string getPath( MulFileId id );
00193
00194 LOGICAL seekMap( UI32 x, UI32 y, map_st& m, UI08 nMap = 0 );
00195 LOGICAL collectStatics( UI32 x, UI32 y, staticVector& s_vec );
00196 LOGICAL seekLand( UI16 id, land_st& land );
00197 LOGICAL seekTile( UI16 id, tile_st& tile );
00198 LOGICAL seekMulti( UI16 id, multiVector& m_vec );
00199 LOGICAL seekVerTile( UI16 id, tile_st& tile );
00200 LOGICAL seekVerLand( UI16 id, land_st& land );
00201
00205 template <typename T> class cMULFile {
00206 public:
00207 cMULFile( std::string path, std::string mode );
00208 ~cMULFile() {
00209 if ( m_file != NULL )
00210 fclose( m_file );
00211 if ( m_cache != NULL )
00212 safedelete( m_cache );
00213 }
00214 LOGICAL getData( UI32 index, T& data );
00215 LOGICAL getData( UI32 index, BYTE* ptr, UI32 size );
00216 void setCache( std::map< UI32, T > *cache );
00217 LOGICAL eof();
00218 inline LOGICAL isReady() { return ( m_file != NULL ); }
00219 inline LOGICAL isCached() { return ( m_cache != NULL ); }
00220 private:
00221 FILE *m_file;
00222 std::map< UI32, T > *m_cache;
00223 };
00224
00225 }
00226
00227 #endif // __DATA_H__
00228