mapconverter.cpp
来自「一个symbian 冒险游戏代码」· C++ 代码 · 共 158 行
CPP
158 行
#include "MapConverter.h"
#ifdef WIN32_CONVERT
#include "MapConverter.h"
#include "dprintf.h"
#include "App.h"
#include <io/IOException.h>
#include <io/FileInputStream.h>
#include <io/FileOutputStream.h>
#include <lua/LuaState.h>
#include <lua/LuaStackRestore.h>
#include <string.h>
#include <config.h>
using namespace io;
using namespace lua;
using namespace lang;
MapConverter::MapConverter( LuaState* lua ) :
Map( lua )
{
registerMethod( "loadMappy", (MapConverter*)this, &MapConverter::loadMappy );
registerMethod( "setStartBlock", (Map*)this, &Map::setStartBlock );
registerMethod( "setAmbientSound", (Map*)this, &Map::setAmbientSound );
registerMethod( "addLevelTrigger", (Map*)this, &Map::addLevelTrigger );
registerMethod( "addTextTrigger", (Map*)this, &Map::addTextTrigger );
registerMethod( "addEnableTrigger", (Map*)this, &Map::addEnableTrigger );
registerMethod( "setTriggerByItem", (Map*)this, &Map::setTriggerByItem );
registerMethod( "setTriggerByItems", (Map*)this, &Map::setTriggerByItems );
registerMethod( "setTriggerReverseByItem", (Map*)this, &Map::setTriggerReverseByItem );
registerMethod( "setTriggerByObjectState", (Map*)this, &Map::setTriggerByObjectState );
registerMethod( "setTriggerReverseByObjectState", (Map*)this, &Map::setTriggerReverseByObjectState );
registerMethod( "addSpriteTrigger", (Map*)this, &Map::addSpriteTrigger );
registerMethod( "addScreenTrigger", (Map*)this, &Map::addScreenTrigger );
registerMethod( "addItemTrigger", (Map*)this, &Map::addItemTrigger );
registerMethod( "removeItemTrigger", (Map*)this, &Map::removeItemTrigger );
registerMethod( "addCharStateTrigger", (Map*)this, &Map::addCharStateTrigger );
registerMethod( "addSpecialTrigger", (Map*)this, &Map::addSpecialTrigger ),
registerMethod( "addEnemy", (Map*)this, &Map::addEnemy );
registerMethod( "disableTrigger", (Map*)this, &Map::disableTrigger );
}
MapConverter::~MapConverter()
{
}
void MapConverter::load( String filename )
{
App& app = *App::get();
FileInputStream fin( app.expandPath( ("data/maps/" + filename + ".lua").c_str() ) );
luaState()->compile( &fin, fin.available(), filename, this );
save( app.expandPath( ("data/maps/" + filename + ".bin").c_str() ) );
Map::load( filename );
int counter = 0; while ( !Map::load() ) counter++;
}
void MapConverter::loadMappy( String filename, String bitmapfilename )
{
App& app = *App::get();
FileInputStream fin( app.expandPath( ("data/maps/exported/" + filename).c_str() ) );
luaState()->compile( &fin, fin.available(), filename, this );
// map properties
m_props = MapProps();
m_props.version = (int)getNumber("VERSION");
m_props.mapWidth = (int)getNumber("MAPWIDTH");
m_props.mapHeight = (int)getNumber("MAPHEIGHT");
m_props.blockWidth = (int)getNumber("BLOCKWIDTH");
m_props.blockHeight = (int)getNumber("BLOCKHEIGHT");
m_props.numBlockStr = (int)getNumber("NUMBLOCKSTR");
m_props.numBlockGfx = (int)getNumber("NUMBLOCKGFX");
m_props.blockGapX = (int)getNumber("BLOCKGAPX");
m_props.blockGapY = (int)getNumber("BLOCKGAPY");
m_props.blockStaggerX = (int)getNumber("BLOCKSTAGGERX");
m_props.blockStaggerY = (int)getNumber("BLOCKSTAGGERY");
String::cpy( m_props.bitmapFilename, sizeof(m_props.bitmapFilename), bitmapfilename );
if ( m_props.blockStaggerY == 0 || m_props.blockStaggerX == 0 )
throwError( IOException(Format("Map {0} block stagger values cannot be 0", filename)) );
if ( m_props.mapWidth > 250 || m_props.mapHeight > 250 )
throwError( IOException(Format("Too large map ({0}x{1}), max is 250x250", m_props.mapWidth, m_props.mapHeight)) );
// check props
int mapw = m_props.mapWidth;
int maph = m_props.mapHeight;
int blockw = m_props.blockWidth;
int blockh = m_props.blockHeight;
int blockstr = m_props.numBlockStr;
int blockgfx = m_props.numBlockGfx;
if ( mapw < 4 || maph < 4 || blockw < 4 || blockh < 4 || blockstr < 1 || blockgfx < 1 )
throwError( IOException(Format("Map file corrupted")) );
// blockinfos
m_blocks.clear();
LuaTable blockinfotab = getTable("BLOCKINFO");
for ( int i = 0 ; i < blockstr ; ++i )
{
m_blocks.resize( m_blocks.size()+1 );
BlockInfo& blockinfo = m_blocks.last();
int offset = i*20+1;
int ix = (int)blockinfotab.getNumber(offset);
if ( ix != i )
throwError( IOException(Format("index {0} does not match BLOCKINFO[{1}]=={2}\n", i, offset, ix)) );
getBlockInfo( ++offset, &blockinfo );
}
// map
LuaTable maptab = getTable("MAP");
m_map.clear();
m_map.resize( mapw*maph );
for ( int y = 0 ; y < maph ; ++y )
{
for ( int x = 0 ; x < mapw ; ++x )
{
int ix = y*mapw+x;
int offset = 1 + ix;
int block = (int)maptab.getNumber(offset);
m_map[ix] = (uint16_t)block;
}
}
}
void MapConverter::getBlockInfo( int offset, BlockInfo* blockinfo )
{
LuaTable blockinfotab = getTable( "BLOCKINFO" );
*blockinfo = BlockInfo();
blockinfo->bg[0] = (int)blockinfotab.getNumber(offset++);
blockinfo->bg[1] = (int)blockinfotab.getNumber(offset++);
blockinfo->bg[2] = (int)blockinfotab.getNumber(offset++);
blockinfo->bg[3] = (int)blockinfotab.getNumber(offset++);
for ( int i = 0 ; i < 7 ; ++i )
blockinfo->user[i] = (int)blockinfotab.getNumber(offset++);
blockinfo->coll = 0;
for ( int i = 0 ; i < 4 ; ++i )
blockinfo->coll += (int)blockinfotab.getNumber(offset++) << i;
blockinfo->flags = 0;
for ( int i = 0 ; i < 4 ; ++i )
blockinfo->flags += (int)blockinfotab.getNumber(offset++) << i;
}
#endif // WIN32_CONVERT
// End of file
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?