Files
source/TileEngine/XML_TileSet.hpp
T
Wanne 91087ca8c0 ************************************************************
* 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
2011-01-18 09:11:09 +00:00

126 lines
3.6 KiB
C++

#ifndef _XML_TILESET_HPP_
#define _XML_TILESET_HPP_
#include "XML_auto_parse.h"
#include "WorldDat.h"
#include <vfs/Tools/vfs_tools.h>
class CTilesetStates
{
public:
enum States
{
STATE_NONE,
STATE_JA2SET,
STATE_tilesets,
STATE_ts_tileset,
STATE_ts_tileset_name,
STATE_ts_tileset_ambientid,
STATE_ts_tileset_files,
STATE_ts_tileset_files_file,
};
};
PARSER_CLASS_MACRO(CTilesetReader, CTilesetStates)
{
typedef CTilesetReader _myt;
public:
/**
* NOOP
*/
PURE_TRANSITION(NOOP, _myt);
/**
* Tilesets
*/
DEFINE_TRANSITION_WDATA(TilesetsAttrib, _myt, false, struct TilesetInfo{int numTilesets; int numFiles;});
TRANSITION_ENTER{
long T_num, F_num;
if(atts.getLong("numTilesets", T_num)) T_DATA.numTilesets = (int)T_num;
else SGP_THROW(L"Attribute 'numTileset' not found");
if(atts.getLong("numFiles",F_num)) T_DATA.numFiles = (int)F_num ;
else SGP_THROW(L"Attribute 'numFiles' not found");
}
FINISH_TRANSITION;
/**
* Tileset
*/
TILESET* _current_tileset;
DEFINE_TRANSITION(Tileset, _myt, false);
TRANSITION_ENTER{
long lindex;
if(atts.getLong("index", lindex)){
SGP_THROW_IFFALSE(lindex < MAX_TILESETS, _BS(L"tileset index is too large : ") << lindex << _BS::wget );
P_DATA->_current_tileset = &(P_DATA->_tilesets[ lindex ]);
}
else SGP_THROW(L"Attribute 'index' not found");
}
TRANSITION_LEAVE{
P_DATA->_current_tileset = NULL;
}
FINISH_TRANSITION;
/**
* Tileset Name
*/
DEFINE_TRANSITION(TilesetName, _myt, true);
TRANSITION_LEAVE{
SGP_THROW_IFFALSE( P_DATA->_current_tileset != NULL, L"No tileset selected" );
std::string tmpString = vfs::trimString(char_data, 0, char_data.length());
wcsncpy( P_DATA->_current_tileset->zName, vfs::String( tmpString ).c_str(), 32 );
}
FINISH_TRANSITION;
/**
* Tileset ID
*/
DEFINE_TRANSITION(TilesetAmbientID, _myt, true);
TRANSITION_LEAVE{
SGP_THROW_IFFALSE( P_DATA->_current_tileset != NULL, L"No tileset selected" );
int tmp;
SGP_THROW_IFFALSE( vfs::convertTo<int>(char_data, tmp),
_BS(L"Could not convert to int : ") << char_data << _BS::wget );
P_DATA->_current_tileset->ubAmbientID = tmp;
}
FINISH_TRANSITION;
/**
* Tileset File
*/
DEFINE_TRANSITION_WDATA(TilesetFile, _myt, true, struct Index{int index;});
TRANSITION_ENTER{
long lindex;
if(atts.getLong("index", lindex)){
SGP_THROW_IFFALSE(lindex < NUMBEROFTILETYPES,
_BS(L"tileset file index is too large : ") << lindex << _BS::wget );
T_DATA.index = lindex;
}
else SGP_THROW(L"Attribute 'index' not found");
}
TRANSITION_LEAVE{
SGP_THROW_IFFALSE( P_DATA->_current_tileset != NULL, L"No tileset selected" );
std::string tmpString = vfs::trimString(char_data, 0, char_data.length());
strncpy( P_DATA->_current_tileset->TileSurfaceFilenames[T_DATA.index], tmpString.c_str(), 32);
}
FINISH_TRANSITION;
TILESET* _tilesets;
CTilesetReader(TILESET tilesets[ MAX_TILESETS ]) : _tilesets(tilesets), _current_tileset(NULL)
{
TR_PASS ( STATE_NONE, "JA2SET", STATE_JA2SET);
TR_HANDLE( STATE_JA2SET, "tilesets", STATE_tilesets, TilesetsAttrib );
TR_HANDLE( STATE_tilesets, "Tileset", STATE_ts_tileset, Tileset );
TR_HANDLE( STATE_ts_tileset, "Name", STATE_ts_tileset_name, TilesetName );
TR_HANDLE( STATE_ts_tileset, "AmbientID", STATE_ts_tileset_ambientid, TilesetAmbientID );
TR_PASS ( STATE_ts_tileset, "Files", STATE_ts_tileset_files );
TR_HANDLE( STATE_ts_tileset_files, "file", STATE_ts_tileset_files_file, TilesetFile );
}
};
#endif // _XML_TILESET_HPP_