mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
************************************************************
* Merged Source Code from Development Trunk: Revision 4063 * ************************************************************ - Source Code is merged from: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP - This will be the Source for the Beta 2011 Test git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4064 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -0,0 +1,640 @@
|
||||
#ifndef _XML_STRUCTUREDATA_HPP_
|
||||
#define _XML_STRUCTUREDATA_HPP_
|
||||
|
||||
#include "XML_auto_parse.h"
|
||||
|
||||
#include <vfs/Tools/vfs_parser_tools.h>
|
||||
#include <vfs/Tools/vfs_tools.h>
|
||||
|
||||
class CStructureDataStates
|
||||
{
|
||||
public:
|
||||
enum States
|
||||
{
|
||||
STATE_NONE,
|
||||
STATE_STRUCTURE_FILE,
|
||||
// ***********
|
||||
STATE_HEADER,
|
||||
STATE_HEADER_id,
|
||||
STATE_HEADER_num_structures,
|
||||
STATE_HEADER_num_images,
|
||||
STATE_HEADER_struct_stored,
|
||||
STATE_HEADER_tile_locs_stores,
|
||||
STATE_HEADER_data_size,
|
||||
STATE_HEADER_flags,
|
||||
STATE_HEADER_flags_any,
|
||||
// ***********
|
||||
STATE_AUXIMAGE_DATA,
|
||||
STATE_AUX_image,
|
||||
STATE_AUX_image_tile_index,
|
||||
STATE_AUX_image_wall_orient,
|
||||
STATE_AUX_image_num_tiles,
|
||||
STATE_AUX_image_num_frames,
|
||||
STATE_AUX_image_cur_frame,
|
||||
STATE_AUX_image_FLAGS,
|
||||
STATE_AUX_image_FLAGS_any,
|
||||
// ***********
|
||||
STATE_TILE_OFFSETS,
|
||||
STATE_TOFF_offset,
|
||||
// ***********
|
||||
STATE_STRUCTURE_DATA,
|
||||
// --
|
||||
STATE_SD_structure,
|
||||
STATE_SD_structure_number,
|
||||
STATE_SD_structure_armour,
|
||||
STATE_SD_structure_hitpoits,
|
||||
STATE_SD_structure_density,
|
||||
STATE_SD_structure_wallrientation,
|
||||
STATE_SD_structure_destr_partner,
|
||||
STATE_SD_structure_desct_delta,
|
||||
STATE_SD_structure_ZoffsetX,
|
||||
STATE_SD_structure_ZoffsetY,
|
||||
STATE_SD_structure_flags,
|
||||
STATE_SD_structure_flags_any,
|
||||
STATE_SD_structure_numtiles,
|
||||
// --
|
||||
STATE_SD_TILES,
|
||||
STATE_SD_TILES_tile,
|
||||
STATE_SD_TILES_tile_OffsetX,
|
||||
STATE_SD_TILES_tile_OffsetY,
|
||||
STATE_SD_TILES_tile_OffsetBase,
|
||||
STATE_SD_TILES_tile_vehitLoc,
|
||||
STATE_SD_TILES_tile_flags,
|
||||
STATE_SD_TILES_tile_flags_any,
|
||||
STATE_SD_TILES_tile_profile,
|
||||
STATE_SD_TILES_tile_profile_any,
|
||||
};
|
||||
};
|
||||
|
||||
PARSER_CLASS_MACRO(CStructureDataReader, CStructureDataStates)
|
||||
{
|
||||
typedef CStructureDataReader _myt;
|
||||
|
||||
struct StructureData
|
||||
{
|
||||
DB_STRUCTURE structure;
|
||||
std::vector<DB_STRUCTURE_TILE> tiles;
|
||||
};
|
||||
std::vector<StructureData> _structures;
|
||||
public:
|
||||
PURE_TRANSITION(NOOP, _myt);
|
||||
|
||||
/**********************************************************************/
|
||||
/* HEADER */
|
||||
/**********************************************************************/
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header,_myt,false);
|
||||
TRANSITION_ENTER{
|
||||
memset(&(P_DATA->oHeader), 0, sizeof(STRUCTURE_FILE_HEADER));
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header_NumStructures,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->oHeader.usNumberOfStructures = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header_NumImages,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->oHeader.usNumberOfImages = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header_StructStored,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->oHeader.usNumberOfStructuresStored = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header_TileLocsStored,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->oHeader.usNumberOfImageTileLocsStored = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Header_DataSize,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->oHeader.usStructureDataSize = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
DEFINE_TRANSITION(TR_Header_Flags,_myt,true);
|
||||
TRANSITION_LEAVE{
|
||||
if(std::string(tag_name) == "STRUCTURE_FILE_CONTAINS_STRUCTUREDATA") P_DATA->oHeader.fFlags |= STRUCTURE_FILE_CONTAINS_STRUCTUREDATA;
|
||||
if(std::string(tag_name) == "STRUCTURE_FILE_CONTAINS_AUXIMAGEDATA") P_DATA->oHeader.fFlags |= STRUCTURE_FILE_CONTAINS_AUXIMAGEDATA;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
/* AUXIMAGE_DATA */
|
||||
/**********************************************************************/
|
||||
int count_aux_tiles;
|
||||
DEFINE_TRANSITION(TR_AUXIMAGE_DATA, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long num = 0;
|
||||
SGP_THROW_IFFALSE(atts.getLong("number_of",num), L"no attribute 'number_of'");
|
||||
if(num > 0)
|
||||
{
|
||||
SGP_THROW_IFFALSE(num == P_DATA->oHeader.usNumberOfImages , L"inconsistent data");
|
||||
P_DATA->pStructureFileRef->usNumberOfStructures = (UINT16)num;
|
||||
int size = sizeof(AuxObjectData) * num;
|
||||
P_DATA->pStructureFileRef->pAuxData = (AuxObjectData*)MemAlloc(size);
|
||||
memset(P_DATA->pStructureFileRef->pAuxData, 0, size);
|
||||
P_DATA->count_aux_tiles = 0;
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
AuxObjectData* current_aux;
|
||||
DEFINE_TRANSITION(TR_AUX_image, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long index = -1;
|
||||
SGP_THROW_IFFALSE(atts.getLong("index", index), L"no attribute 'index'");
|
||||
SGP_THROW_IFFALSE(index >= 0 && index < P_DATA->oHeader.usNumberOfImages, L"index out of range");
|
||||
P_DATA->current_aux = &P_DATA->pStructureFileRef->pAuxData[index];
|
||||
}
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->current_aux = NULL;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_tile_index, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
P_DATA->current_aux->usTileLocIndex = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_wall_orient, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
P_DATA->current_aux->ubWallOrientation = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_num_tiles, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
int num_tiles = atoi(char_data.c_str());
|
||||
P_DATA->current_aux->ubNumberOfTiles = num_tiles;
|
||||
P_DATA->count_aux_tiles += num_tiles;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_num_frames, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
P_DATA->current_aux->ubNumberOfFrames = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_cur_frame, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
P_DATA->current_aux->ubCurrentFrame = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_image_FLAGS, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_aux, L"aux is null");
|
||||
if(std::string(tag_name) == "AUX_FULL_TILE") P_DATA->current_aux->fFlags |= AUX_FULL_TILE;
|
||||
if(std::string(tag_name) == "AUX_ANIMATED_TILE") P_DATA->current_aux->fFlags |= AUX_ANIMATED_TILE;
|
||||
if(std::string(tag_name) == "AUX_DYNAMIC_TILE") P_DATA->current_aux->fFlags |= AUX_DYNAMIC_TILE;
|
||||
if(std::string(tag_name) == "AUX_INTERACTIVE_TILE") P_DATA->current_aux->fFlags |= AUX_INTERACTIVE_TILE;
|
||||
if(std::string(tag_name) == "AUX_IGNORES_HEIGHT") P_DATA->current_aux->fFlags |= AUX_IGNORES_HEIGHT;
|
||||
if(std::string(tag_name) == "AUX_USES_LAND_Z") P_DATA->current_aux->fFlags |= AUX_USES_LAND_Z;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
/* AUXTILE_DATA */
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_AUX_TILES, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long num = 0;
|
||||
SGP_THROW_IFFALSE(atts.getLong("number_of",num), L"no attribute 'number_of'");
|
||||
if(num > 0)
|
||||
{
|
||||
SGP_THROW_IFFALSE(num == P_DATA->count_aux_tiles && num == P_DATA->oHeader.usNumberOfImageTileLocsStored,
|
||||
L"counted number and given number of tiles aux images are not equal");
|
||||
|
||||
int size = num * sizeof(RelTileLoc);
|
||||
P_DATA->pStructureFileRef->pTileLocData = (RelTileLoc*)MemAlloc(size);
|
||||
memset(P_DATA->pStructureFileRef->pTileLocData, 0, size);
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
DEFINE_TRANSITION(TR_AUX_Tile_offset, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long index = 0, x = 0 , y = 0;
|
||||
SGP_THROW_IFFALSE(atts.getLong("index", index), L"nu attribute 'index'");
|
||||
SGP_THROW_IFFALSE(index >= 0 && index < P_DATA->oHeader.usNumberOfImageTileLocsStored, L"index out of range");
|
||||
SGP_THROW_IFFALSE(atts.getLong("x", x), L"no attribute 'x'");
|
||||
SGP_THROW_IFFALSE(atts.getLong("y", y), L"no attribute 'y'");
|
||||
P_DATA->pStructureFileRef->pTileLocData[index].bTileOffsetX = (INT8)x;
|
||||
P_DATA->pStructureFileRef->pTileLocData[index].bTileOffsetY = (INT8)y;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
/* STRUCTURE_DATA */
|
||||
/**********************************************************************/
|
||||
StructureData* current_structure;
|
||||
int structure_index, structure_count;
|
||||
DEFINE_TRANSITION(TR_Structure_data,_myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long num = 0, stored = 0;
|
||||
SGP_THROW_IFFALSE(atts.getLong("number_of",num), L"structure data : no attribute 'number_of'");
|
||||
if(!atts.getLong("stored",stored))
|
||||
{
|
||||
stored = num;
|
||||
}
|
||||
if(num > 0)
|
||||
{
|
||||
// header consistency check (to be removed later ?)
|
||||
SGP_THROW_IFFALSE(num == P_DATA->oHeader.usNumberOfStructures, L"inconsistent data : number of structures");
|
||||
SGP_THROW_IFFALSE(stored == P_DATA->oHeader.usNumberOfStructuresStored, L"inconsistent data : number of stored structures");
|
||||
P_DATA->_structures.resize(stored);
|
||||
for(int i=0; i < stored; ++i)
|
||||
{
|
||||
memset(&P_DATA->_structures[i].structure, 0, sizeof(DB_STRUCTURE));
|
||||
}
|
||||
// save data
|
||||
P_DATA->pStructureFileRef->usNumberOfStructures = (UINT16)num;
|
||||
P_DATA->pStructureFileRef->usNumberOfStructuresStored = (UINT16)stored;
|
||||
}
|
||||
P_DATA->structure_count = 0;
|
||||
P_DATA->structure_index = -1;
|
||||
}
|
||||
TRANSITION_LEAVE{
|
||||
// copy gathered data into game object
|
||||
if(!P_DATA->_structures.empty())
|
||||
{
|
||||
SGP_THROW_IFFALSE(P_DATA->pStructureFileRef->usNumberOfStructuresStored == P_DATA->structure_count, L"wrong number of structures");
|
||||
|
||||
int size = 0;
|
||||
for(::size_t i = 0; i < P_DATA->_structures.size(); ++i)
|
||||
{
|
||||
size += sizeof(DB_STRUCTURE);
|
||||
for(::size_t j = 0; j < P_DATA->_structures[i].tiles.size(); ++j)
|
||||
{
|
||||
size += sizeof(DB_STRUCTURE_TILE);
|
||||
}
|
||||
}
|
||||
|
||||
SGP_THROW_IFFALSE(size == P_DATA->oHeader.usStructureDataSize,
|
||||
_BS(L"data size is supposed to be '") << P_DATA->oHeader.usStructureDataSize << L"' but is '" << size << L"'" << _BS::wget);
|
||||
|
||||
P_DATA->structure_data_size = size;
|
||||
|
||||
P_DATA->pStructureFileRef->pubStructureData = (UINT8*)MemAlloc(size);
|
||||
UINT8 *tmp = P_DATA->pStructureFileRef->pubStructureData;
|
||||
for(::size_t i = 0; i < P_DATA->_structures.size(); ++i)
|
||||
{
|
||||
memcpy(tmp, &P_DATA->_structures[i].structure, sizeof(DB_STRUCTURE));
|
||||
tmp += sizeof(DB_STRUCTURE);
|
||||
for(::size_t j = 0; j < P_DATA->_structures[i].tiles.size(); ++j)
|
||||
{
|
||||
memcpy(tmp, &P_DATA->_structures[i].tiles[j], sizeof(DB_STRUCTURE_TILE));
|
||||
tmp += sizeof(DB_STRUCTURE_TILE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long index;
|
||||
SGP_THROW_IFFALSE( atts.getLong("index", index), L"no attribute 'index'" );
|
||||
SGP_THROW_IFFALSE( (index >= 0) && (index < P_DATA->pStructureFileRef->usNumberOfStructures), L"structure index out of range");
|
||||
SGP_THROW_IFFALSE( (P_DATA->structure_count >= 0) && (P_DATA->structure_count < P_DATA->pStructureFileRef->usNumberOfStructuresStored), L"structure count larger than announced");
|
||||
P_DATA->current_structure = &P_DATA->_structures[P_DATA->structure_count];
|
||||
P_DATA->current_structure->structure.usStructureNumber = (UINT16)index;
|
||||
P_DATA->structure_index = index;
|
||||
}
|
||||
TRANSITION_LEAVE{
|
||||
// finished this structure, increase index for next run
|
||||
P_DATA->structure_index = -1;
|
||||
P_DATA->structure_count += 1;
|
||||
P_DATA->current_structure = NULL;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
//DEFINE_TRANSITION(TR_Structure_number, _myt, true);
|
||||
//TRANSITION_LEAVE{
|
||||
// SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
// P_DATA->current_structure->structure.usStructureNumber = atoi(char_data.c_str());
|
||||
// SGP_THROW_IFFALSE( P_DATA->current_structure->structure.usStructureNumber == P_DATA->structure_index, L"inconsistent data");
|
||||
//}
|
||||
//FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_armour, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.ubArmour = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_hitpoints, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.ubHitPoints = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_density, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.ubDensity = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_wall_orient, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.ubWallOrientation = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_destr_partner, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.bDestructionPartner = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_partner_delta, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.bPartnerDelta = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_offX, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.bZTileOffsetX = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_offY, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
P_DATA->current_structure->structure.bZTileOffsetY = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_num_tiles, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
int num_tiles = atoi(char_data.c_str());
|
||||
SGP_THROW_IFFALSE(num_tiles >= 0, L"invalid number");
|
||||
P_DATA->current_structure->structure.ubNumberOfTiles = num_tiles;
|
||||
P_DATA->current_structure->tiles.resize(num_tiles);
|
||||
for(int i = 0 ;i < num_tiles; ++i)
|
||||
{
|
||||
memset(&P_DATA->current_structure->tiles[i], 0, sizeof(DB_STRUCTURE_TILE));
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_Structure_FLAGS, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE( P_DATA->current_structure, L"null structure" );
|
||||
if(std::string(tag_name) == "STRUCTURE_BASE_TILE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_BASE_TILE;
|
||||
if(std::string(tag_name) == "STRUCTURE_OPEN") P_DATA->current_structure->structure.fFlags |= STRUCTURE_OPEN;
|
||||
if(std::string(tag_name) == "STRUCTURE_OPENABLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_OPENABLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_CLOSEABLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_CLOSEABLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_SEARCHABLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_SEARCHABLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_HIDDEN") P_DATA->current_structure->structure.fFlags |= STRUCTURE_HIDDEN;
|
||||
if(std::string(tag_name) == "STRUCTURE_MOBILE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_MOBILE;
|
||||
if(std::string(tag_name) == "STRUCTURE_PASSABLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_PASSABLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_EXPLOSIVE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_EXPLOSIVE;
|
||||
if(std::string(tag_name) == "STRUCTURE_TRANSPARENT") P_DATA->current_structure->structure.fFlags |= STRUCTURE_TRANSPARENT;
|
||||
if(std::string(tag_name) == "STRUCTURE_GENERIC") P_DATA->current_structure->structure.fFlags |= STRUCTURE_GENERIC;
|
||||
if(std::string(tag_name) == "STRUCTURE_TREE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_TREE;
|
||||
if(std::string(tag_name) == "STRUCTURE_FENCE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_FENCE;
|
||||
if(std::string(tag_name) == "STRUCTURE_WIREFENCE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_WIREFENCE;
|
||||
if(std::string(tag_name) == "STRUCTURE_HASITEMONTOP") P_DATA->current_structure->structure.fFlags |= STRUCTURE_HASITEMONTOP;
|
||||
if(std::string(tag_name) == "STRUCTURE_SPECIAL") P_DATA->current_structure->structure.fFlags |= STRUCTURE_SPECIAL;
|
||||
if(std::string(tag_name) == "STRUCTURE_LIGHTSOURCE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_LIGHTSOURCE;
|
||||
if(std::string(tag_name) == "STRUCTURE_VEHICLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_VEHICLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_WALL") P_DATA->current_structure->structure.fFlags |= STRUCTURE_WALL;
|
||||
if(std::string(tag_name) == "STRUCTURE_WALLNWINDOW") P_DATA->current_structure->structure.fFlags |= STRUCTURE_WALLNWINDOW;
|
||||
if(std::string(tag_name) == "STRUCTURE_SLIDINGDOOR") P_DATA->current_structure->structure.fFlags |= STRUCTURE_SLIDINGDOOR;
|
||||
if(std::string(tag_name) == "STRUCTURE_DOOR") P_DATA->current_structure->structure.fFlags |= STRUCTURE_DOOR;
|
||||
if(std::string(tag_name) == "STRUCTURE_MULTI") P_DATA->current_structure->structure.fFlags |= STRUCTURE_MULTI;
|
||||
if(std::string(tag_name) == "STRUCTURE_CAVEWALL") P_DATA->current_structure->structure.fFlags |= STRUCTURE_CAVEWALL;
|
||||
if(std::string(tag_name) == "STRUCTURE_DDOOR_LEFT") P_DATA->current_structure->structure.fFlags |= STRUCTURE_DDOOR_LEFT;
|
||||
if(std::string(tag_name) == "STRUCTURE_DDOOR_RIGHT") P_DATA->current_structure->structure.fFlags |= STRUCTURE_DDOOR_RIGHT;
|
||||
if(std::string(tag_name) == "STRUCTURE_NORMAL_ROOF") P_DATA->current_structure->structure.fFlags |= STRUCTURE_NORMAL_ROOF;
|
||||
if(std::string(tag_name) == "STRUCTURE_SLANTED_ROOF") P_DATA->current_structure->structure.fFlags |= STRUCTURE_SLANTED_ROOF;
|
||||
if(std::string(tag_name) == "STRUCTURE_TALL_ROOF") P_DATA->current_structure->structure.fFlags |= STRUCTURE_TALL_ROOF;
|
||||
if(std::string(tag_name) == "STRUCTURE_SWITCH") P_DATA->current_structure->structure.fFlags |= STRUCTURE_SWITCH;
|
||||
if(std::string(tag_name) == "STRUCTURE_ON_LEFT_WALL") P_DATA->current_structure->structure.fFlags |= STRUCTURE_ON_LEFT_WALL;
|
||||
if(std::string(tag_name) == "STRUCTURE_ON_RIGHT_WALL") P_DATA->current_structure->structure.fFlags |= STRUCTURE_ON_RIGHT_WALL;
|
||||
if(std::string(tag_name) == "STRUCTURE_CORPSE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_CORPSE;
|
||||
if(std::string(tag_name) == "STRUCTURE_PERSON") P_DATA->current_structure->structure.fFlags |= STRUCTURE_PERSON;
|
||||
if(std::string(tag_name) == "STRUCTURE_ANYFENCE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_ANYFENCE;
|
||||
if(std::string(tag_name) == "STRUCTURE_ANYDOOR") P_DATA->current_structure->structure.fFlags |= STRUCTURE_ANYDOOR;
|
||||
if(std::string(tag_name) == "STRUCTURE_OBSTACLE") P_DATA->current_structure->structure.fFlags |= STRUCTURE_OBSTACLE;
|
||||
if(std::string(tag_name) == "STRUCTURE_WALLSTUFF") P_DATA->current_structure->structure.fFlags |= STRUCTURE_WALLSTUFF;
|
||||
if(std::string(tag_name) == "STRUCTURE_BLOCKSMOVES") P_DATA->current_structure->structure.fFlags |= STRUCTURE_BLOCKSMOVES;
|
||||
if(std::string(tag_name) == "STRUCTURE_TYPE_DEFINED") P_DATA->current_structure->structure.fFlags |= STRUCTURE_TYPE_DEFINED;
|
||||
if(std::string(tag_name) == "STRUCTURE_ROOF") P_DATA->current_structure->structure.fFlags |= STRUCTURE_ROOF;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
/* STRUCTURE_TILES */
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_TILES, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long num = 0;
|
||||
if(atts.getLong("number_of",num))
|
||||
{
|
||||
SGP_THROW_IFFALSE(num == P_DATA->current_structure->structure.ubNumberOfTiles, L"inconsistent data");
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DB_STRUCTURE_TILE* current_str_tile;
|
||||
DEFINE_TRANSITION(TR_SD_Tile, _myt, false);
|
||||
TRANSITION_ENTER{
|
||||
long index = 0;
|
||||
SGP_THROW_IFFALSE( atts.getLong("index",index), L"no attribute 'index'" );
|
||||
SGP_THROW_IFFALSE( index >= 0 && index < (long)P_DATA->current_structure->tiles.size(), L"structure index out of range");
|
||||
P_DATA->current_str_tile = &P_DATA->current_structure->tiles[index];
|
||||
}
|
||||
TRANSITION_LEAVE{
|
||||
P_DATA->current_str_tile = NULL;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_offX, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
P_DATA->current_str_tile->bXPosRelToBase = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_offY, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
P_DATA->current_str_tile->bYPosRelToBase = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_offBase, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
P_DATA->current_str_tile->sPosRelToBase = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_VehHitLoc, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
P_DATA->current_str_tile->ubVehicleHitLocation = atoi(char_data.c_str());
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_FLAGS, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
if(std::string(tag_name) == "TILE_ON_ROOF") P_DATA->current_str_tile->fFlags |= TILE_ON_ROOF;
|
||||
if(std::string(tag_name) == "TILE_PASSABLE") P_DATA->current_str_tile->fFlags |= TILE_PASSABLE;
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
DEFINE_TRANSITION(TR_SD_Tile_profile, _myt, true);
|
||||
TRANSITION_LEAVE{
|
||||
SGP_THROW_IFFALSE(P_DATA->current_str_tile, L"null structure tile");
|
||||
int y = -1;
|
||||
if (std::string(tag_name) == "y0") y = 0;
|
||||
else if(std::string(tag_name) == "y1") y = 1;
|
||||
else if(std::string(tag_name) == "y2") y = 2;
|
||||
else if(std::string(tag_name) == "y3") y = 3;
|
||||
else if(std::string(tag_name) == "y4") y = 4;
|
||||
|
||||
if(y != -1)
|
||||
{
|
||||
int x = 0;
|
||||
vfs::String token;
|
||||
vfs::CTokenizer tok(char_data);
|
||||
while(tok.next(token, L','))
|
||||
{
|
||||
if(x >= 0 && x < 5)
|
||||
{
|
||||
int z;
|
||||
SGP_THROW_IFFALSE( vfs::convertTo<int>(token,z), L"" );
|
||||
if(z >= 0 && z < 16)
|
||||
{
|
||||
P_DATA->current_str_tile->Shape[y][x] = z;
|
||||
}
|
||||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
}
|
||||
FINISH_TRANSITION;
|
||||
|
||||
/**********************************************************************/
|
||||
UINT32 structure_data_size;
|
||||
|
||||
STRUCTURE_FILE_REF* pStructureFileRef;
|
||||
STRUCTURE_FILE_HEADER oHeader;
|
||||
CStructureDataReader(STRUCTURE_FILE_REF* sfr)
|
||||
: pStructureFileRef(sfr), current_structure(NULL), current_str_tile(NULL), current_aux(NULL)
|
||||
{
|
||||
SGP_THROW_IFFALSE(sfr, L"");
|
||||
|
||||
TR_PASS (STATE_NONE, "STRUCTURE_FILE", STATE_STRUCTURE_FILE);
|
||||
// HEADER
|
||||
TR_HANDLE( STATE_STRUCTURE_FILE, "HEADER", STATE_HEADER, TR_Header );
|
||||
TR_HANDLE( STATE_HEADER, "usNumberOfStructures", STATE_HEADER_num_structures, TR_Header_NumStructures );
|
||||
TR_HANDLE( STATE_HEADER, "usNumberOfImages", STATE_HEADER_num_images, TR_Header_NumImages );
|
||||
TR_HANDLE( STATE_HEADER, "usNumberOfStructuresStored", STATE_HEADER_struct_stored, TR_Header_StructStored );
|
||||
TR_HANDLE( STATE_HEADER, "usNumberOfImageTileLocsStored", STATE_HEADER_tile_locs_stores, TR_Header_TileLocsStored );
|
||||
TR_HANDLE( STATE_HEADER, "usStructureDataSize", STATE_HEADER_data_size, TR_Header_DataSize );
|
||||
TR_PASS ( STATE_HEADER, "flags", STATE_HEADER_flags );
|
||||
TR_HANDLE( STATE_HEADER_flags, "", STATE_HEADER_flags_any, TR_Header_Flags );
|
||||
// AUX IMAGE
|
||||
TR_HANDLE( STATE_STRUCTURE_FILE, "AUXIMAGE_DATA", STATE_AUXIMAGE_DATA, TR_AUXIMAGE_DATA);
|
||||
TR_HANDLE( STATE_AUXIMAGE_DATA, "auximage", STATE_AUX_image, TR_AUX_image);
|
||||
TR_HANDLE( STATE_AUX_image, "tile_loc_index", STATE_AUX_image_tile_index, TR_AUX_image_tile_index);
|
||||
TR_HANDLE( STATE_AUX_image, "wall_orientation", STATE_AUX_image_wall_orient, TR_AUX_image_wall_orient);
|
||||
TR_HANDLE( STATE_AUX_image, "number_of_tiles", STATE_AUX_image_num_tiles, TR_AUX_image_num_tiles);
|
||||
TR_HANDLE( STATE_AUX_image, "number_of_frames", STATE_AUX_image_num_frames, TR_AUX_image_num_frames);
|
||||
TR_HANDLE( STATE_AUX_image, "current_frame", STATE_AUX_image_cur_frame, TR_AUX_image_cur_frame);
|
||||
TR_PASS ( STATE_AUX_image, "flags", STATE_AUX_image_FLAGS);
|
||||
TR_HANDLE( STATE_AUX_image_FLAGS, "", STATE_AUX_image_FLAGS_any, TR_AUX_image_FLAGS);
|
||||
// AUX TILES
|
||||
TR_HANDLE( STATE_STRUCTURE_FILE, "TILE_OFFSETS", STATE_TILE_OFFSETS, TR_AUX_TILES);
|
||||
TR_HANDLE( STATE_TILE_OFFSETS, "offset", STATE_TOFF_offset, TR_AUX_Tile_offset);
|
||||
// STRUCTURE
|
||||
TR_HANDLE( STATE_STRUCTURE_FILE, "STRUCTURE_DATA", STATE_STRUCTURE_DATA, TR_Structure_data );
|
||||
TR_HANDLE( STATE_STRUCTURE_DATA, "STRUCTURE", STATE_SD_structure, TR_Structure );
|
||||
// TR_HANDLE( STATE_SD_structure, "usStructureNumber", STATE_SD_structure_number, TR_Structure_number );
|
||||
TR_HANDLE( STATE_SD_structure, "ubArmour", STATE_SD_structure_armour, TR_Structure_armour );
|
||||
TR_HANDLE( STATE_SD_structure, "ubHitPoints", STATE_SD_structure_hitpoits, TR_Structure_hitpoints );
|
||||
TR_HANDLE( STATE_SD_structure, "ubDensity", STATE_SD_structure_density, TR_Structure_density );
|
||||
TR_HANDLE( STATE_SD_structure, "ubWallOrientation", STATE_SD_structure_wallrientation, TR_Structure_wall_orient );
|
||||
TR_HANDLE( STATE_SD_structure, "bDestructionPartner", STATE_SD_structure_destr_partner, TR_Structure_destr_partner );
|
||||
TR_HANDLE( STATE_SD_structure, "bPartnerDelta", STATE_SD_structure_desct_delta, TR_Structure_partner_delta );
|
||||
TR_HANDLE( STATE_SD_structure, "bZTileOffsetX", STATE_SD_structure_ZoffsetX, TR_Structure_offX );
|
||||
TR_HANDLE( STATE_SD_structure, "bZTileOffsetY", STATE_SD_structure_ZoffsetY, TR_Structure_offY );
|
||||
TR_PASS ( STATE_SD_structure, "flags", STATE_SD_structure_flags );
|
||||
TR_HANDLE( STATE_SD_structure_flags, "", STATE_SD_structure_flags_any, TR_Structure_FLAGS );
|
||||
TR_HANDLE( STATE_SD_structure, "ubNumberOfTiles", STATE_SD_structure_numtiles, TR_Structure_num_tiles );
|
||||
// STRUCTURE TILES
|
||||
TR_HANDLE( STATE_SD_structure, "TILES", STATE_SD_TILES, TR_SD_TILES);
|
||||
TR_HANDLE( STATE_SD_TILES, "STRUCTURE_TILE", STATE_SD_TILES_tile, TR_SD_Tile);
|
||||
TR_HANDLE( STATE_SD_TILES_tile, "bXPosRelToBase", STATE_SD_TILES_tile_OffsetX, TR_SD_Tile_offX);
|
||||
TR_HANDLE( STATE_SD_TILES_tile, "bYPosRelToBase", STATE_SD_TILES_tile_OffsetY, TR_SD_Tile_offY);
|
||||
TR_HANDLE( STATE_SD_TILES_tile, "sPosRelToBase", STATE_SD_TILES_tile_OffsetBase, TR_SD_Tile_offBase);
|
||||
TR_HANDLE( STATE_SD_TILES_tile, "ubVehicleHitLocation", STATE_SD_TILES_tile_vehitLoc, TR_SD_Tile_VehHitLoc);
|
||||
TR_PASS ( STATE_SD_TILES_tile, "flags", STATE_SD_TILES_tile_flags );
|
||||
TR_HANDLE( STATE_SD_TILES_tile_flags, "", STATE_SD_TILES_tile_flags_any, TR_SD_Tile_FLAGS );
|
||||
TR_PASS ( STATE_SD_TILES_tile, "profile", STATE_SD_TILES_tile_profile );
|
||||
TR_HANDLE( STATE_SD_TILES_tile_profile, "", STATE_SD_TILES_tile_profile_any, TR_SD_Tile_profile );
|
||||
}
|
||||
};
|
||||
|
||||
#endif // _XML_STRUCTUREDATA_HPP_
|
||||
Reference in New Issue
Block a user