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 + -
显示快捷键?