www.pudn.com > GameEngine_src.rar > CES_Executor.cpp


// CES_Executor.cpp: implementation of the CES_Executor class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "CES_Executor.h" 
#include "normal.h" 
#include "CNpcDlg.h" 
#include "CMap.h" 
#include "CGameManager.h" 
#include "CMessageManager.h" 
#include "CHero.h" 
#include "CItem.h" 
#include "CItemFactory.h" 
#include "CMagicFactory.h" 
#include "CEasyDraw.h" 
#include  
#include  
 
 
extern CMap				theMap; 
extern CNpcDlgMgr		theNpcDlgMgr; 
extern CGameManager		theGameManager; 
extern CMessageManager	theMsgMgr; 
extern CHero			theHero; 
extern CItemBox			theItemBag; 
extern CItemBox			theItemStorage; 
extern CItemBox			theItemTrough; 
extern CItemFactory		theItemFactory; 
extern CMagicFactory	theMagicFactory; 
extern PEASYDRAW		g_pEasyDraw; 
 
 
int *CES_Executor::m_pRegister; 
PFUNC *CES_Executor::m_FuncArray;  
int CES_Executor::m_CmdIndex; 
int CES_Executor::m_CmdOffset; 
int CES_Executor::m_CmdNum; 
ES_CMD *CES_Executor::m_CmdBuf; 
char *CES_Executor::m_szBuf; 
void *CES_Executor::m_pCurObj; 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
CES_Executor::CES_Executor() 
{ 
 
} 
 
CES_Executor::~CES_Executor() 
{ 
 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CES_Executor::Init() 
{ 
	m_pRegister = new int[8]; 
	m_FuncArray = new PFUNC[CMD_MAX_NUM]; 
	if ( m_FuncArray == NULL ) 
		return false; 
 
	m_FuncArray[0] = On_GOTO_CMD; 
	m_FuncArray[1] = On_END_CMD; 
	m_FuncArray[2] = On_ES_MOV; 
	m_FuncArray[3] = On_ES_ADD; 
	m_FuncArray[4] = On_ES_SUB; 
	m_FuncArray[5] = On_ES_MUL; 
	m_FuncArray[6] = On_ES_DIV; 
	m_FuncArray[7] = On_ES_SHL; 
	m_FuncArray[8] = On_ES_SAR; 
	m_FuncArray[9] = On_ES_CMP; 
	m_FuncArray[10] = On_SET_NEXT_PARAM; 
 
	m_FuncArray[11] = On_CMP_HERO_DISTANCE; 
	m_FuncArray[12] = On_OPEN_NPC_DLG; 
	m_FuncArray[13]	= On_CHECK_HERO_ITEM; 
	m_FuncArray[14]	= On_CHECK_HERO_QUEST; 
 
	m_FuncArray[15] = On_GOTO_PAGE; 
	m_FuncArray[16] = On_CLOSE_NPC_DLG; 
	m_FuncArray[17] = On_GOTO_MAP; 
	m_FuncArray[18] = On_CURE_HERO; 
	m_FuncArray[19] = On_OPEN_STORAGE; 
	m_FuncArray[20]	= On_OPEN_ITEM_SHOP; 
 
	m_FuncArray[21] = On_ADD_HERO_LIFE; 
	m_FuncArray[22] = On_ADD_HERO_MANA; 
	m_FuncArray[23] = On_ADD_HERO_INFO; 
	m_FuncArray[24] = On_ADD_HERO_ALL_INFO; 
	m_FuncArray[25] = On_SUB_USE_TIME; 
	m_FuncArray[26] = On_SET_CUR_MAGIC; 
	m_FuncArray[27] = On_UPGRADE_ITEM; 
	m_FuncArray[28] = On_ADD_ITEM_INFO; 
 
	m_FuncArray[29] = On_GET_MAGICIAN_INFO; 
	m_FuncArray[30] = On_GET_TARGET_INFO; 
	m_FuncArray[31] = On_MOVE_MAGICIAN; 
	m_FuncArray[32] = On_ADD_TARGET_INFO; 
	m_FuncArray[33] = On_ADD_TARGET_MS; 
	m_FuncArray[34] = On_ADD_TARGET_MSE; 
	m_FuncArray[35] = On_MAGIC_ATTACK; 
	m_FuncArray[36] = On_SET_MAGIC_INFO; 
	m_FuncArray[37] = On_CREATE_MAGIC_SPRITE; 
	m_FuncArray[38] = On_SET_REVIVAL; 
	m_FuncArray[39]	= On_GOTO_REVIVAL; 
	//m_FuncArray[] = On_; 
	return true; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::Free() 
{ 
	SafeDeleteArray( m_pRegister ); 
	SafeDeleteArray( m_FuncArray ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//执行一个命令 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::RunCommand( ES_CMD &cmd ) 
{ 
	debug_assert( cmd.cmd_id < CMD_MAX_NUM && cmd.cmd_id >= 0 ); 
 
	PFUNC func = m_FuncArray[(int)cmd.cmd_id]; 
	func( cmd.param_1, cmd.param_2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//执行一条命令 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::RunCommand( int cmd_id, int param_1, int param_2 ) 
{ 
	ES_CMD cmd = { (ES_CMD_ID)cmd_id, param_1, param_2 }; 
	RunCommand( cmd ); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::RunCommand( ES_CMD *cmd_buf, int offset, int num ) 
{ 
	m_CmdBuf = cmd_buf; 
	m_CmdOffset = offset; 
	m_CmdNum = num; 
	//m_pRegister[0] = ES_OK; 
	for ( m_CmdIndex = 0; m_CmdIndex < num; ++m_CmdIndex ) 
	{ 
		RunCommand( cmd_buf[offset+m_CmdIndex] ); 
	} 
} 
 
////////////////////////////////////////////////////////////////////// 
//如果满足P1的条件,当前指令移动p2单位 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GOTO_CMD( int p1, int p2 ) 
{ 
	if ( p1 == NO_CONDITION || m_pRegister[0] == p1 ) 
	{ 
		m_CmdIndex += p2 - 1; 
	} 
} 
 
////////////////////////////////////////////////////////////////////// 
//如果满足P1的条件,则结束脚本块的运行 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_END_CMD( int p1, int p2 ) 
{ 
	if ( p1 == NO_CONDITION || m_pRegister[0] == p1 ) 
	{ 
		m_CmdIndex = m_CmdNum; 
	}	 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_MOV( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] = p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_ADD( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] += p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_SUB( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] -= p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_MUL( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] *= p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_DIV( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] /= p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_SHL( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] <<= p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_SAR( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	m_pRegister[(-p1)+ES_REGISTER_BEGIN] >>= p2; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ES_CMP( int p1, int p2 ) 
{ 
	debug_assert( p1 <= ES_REGISTER_BEGIN && p1 >= ES_REGISTER_END ); 
 
	if ( p2 <= ES_REGISTER_BEGIN && p2 >= ES_REGISTER_END ) 
		p2 = m_pRegister[(-p2)+ES_REGISTER_BEGIN]; 
 
	p1 = m_pRegister[(-p1)+ES_REGISTER_BEGIN]; 
	if ( p1 == p2 ) 
		m_pRegister[0] = ES_EQ; 
	else if ( p1 > p2 ) 
		m_pRegister[0] = ES_GT; 
	else  
		m_pRegister[0] = ES_LS; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_SET_NEXT_PARAM( int p1, int p2 ) 
{ 
	debug_assert( p1 >= -10 && p1 <= -3 ); 
	debug_assert( p2 == 1 || p2 == 2 ); 
 
	m_CmdBuf[m_CmdOffset + m_CmdIndex + 1].param[p2-1] = m_pRegister[(-p1)-3]; 
} 
 
////////////////////////////////////////////////////////////////////// 
//计算英雄与精灵的距离是否小于p1值,p2为精灵的指针 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CMP_HERO_DISTANCE( int p1, int p2 ) 
{ 
	int i = CBaseSprite::CalcDistance( ((CBaseSprite *)m_pCurObj)->GetBasePoint(), theHero.GetBasePoint() ); 
	 
	if ( i == p2 ) 
		m_pRegister[0] = ES_EQ; 
	else if ( i > p2 ) 
	{ 
		theMsgMgr.AddMessage( "距离太远" ); 
		m_pRegister[0] = ES_GT; 
	} 
	else 
		m_pRegister[0] = ES_LS; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_OPEN_NPC_DLG( int p1, int p2 ) 
{ 
	char *char_ptr = m_szBuf; 
	char_ptr += p1; 
	if ( theNpcDlgMgr.OpenDlg( char_ptr ) == true ) 
	{ 
		theHero.SetHeroState( HS_TALKING ); 
		theItemBag.CloseBox(); 
	} 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CHECK_HERO_ITEM( int p1, int p2 ) 
{ 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CHECK_HERO_QUEST( int p1, int p2 ) 
{ 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GOTO_PAGE( int p1, int p2 ) 
{ 
	((CNpcDlg *)m_pCurObj)->GoToPage( p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CLOSE_NPC_DLG( int p1, int p2 ) 
{ 
	theNpcDlgMgr.CloseDlg(); 
	theHero.SetHeroState( HS_NORMAL ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GOTO_MAP( int p1, int p2 ) 
{ 
	char *char_ptr = m_szBuf; 
	char_ptr += p1; 
	theGameManager.GotoMap( char_ptr, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CURE_HERO( int p1, int p2 ) 
{ 
	theHero.Cure(); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_OPEN_STORAGE( int p1, int p2 ) 
{ 
	theItemStorage.OpenBox(); 
	theItemBag.OpenBox(); 
	int w = g_pEasyDraw->GetCharWidth(); 
	int x = w / 2 + ( w / 2 - theItemBag.GetBoxWidth() ) / 2; 
	int y = ( g_pEasyDraw->GetDeviceHeight()- theItemBag.GetBoxHeight()) / 2; 
 
	theItemBag.MoveBox( x, y ); 
	theNpcDlgMgr.CloseDlg(); 
	theHero.SetHeroState( HS_NORMAL ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_OPEN_ITEM_SHOP( int p1, int p2 ) 
{ 
	theItemFactory.OpenItemShop( p1 ); 
	theItemBag.OpenBox(); 
	int w = g_pEasyDraw->GetCharWidth(); 
	int x = w / 2 + ( w / 2 - theItemBag.GetBoxWidth() ) / 2; 
	int y = ( g_pEasyDraw->GetDeviceHeight()- theItemBag.GetBoxHeight()) / 2; 
 
	theItemBag.MoveBox( x, y ); 
	theNpcDlgMgr.CloseDlg(); 
	theHero.SetHeroState( HS_NORMAL ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_HERO_LIFE( int p1, int p2 ) 
{ 
	m_pRegister[0] = ES_OK; 
	if ( theHero.AddLife( p1 ) == false ) 
		m_pRegister[0] = ES_FAILED; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_HERO_MANA( int p1, int p2 ) 
{ 
	m_pRegister[0] = ES_OK; 
	if ( theHero.AddMana( p1 ) == false ) 
		m_pRegister[0] = ES_FAILED; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_HERO_INFO( int p1, int p2 ) 
{ 
	theHero.AddHeroInfo( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//提高所有能力值或所有抗性,用于物品 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_HERO_ALL_INFO( int p1, int p2 ) 
{ 
	if ( p1 == 0 ) 
	{ 
		theHero.AddHeroInfo( SI_STR, p2 ); 
		theHero.AddHeroInfo( SI_AGI, p2 ); 
		theHero.AddHeroInfo( SI_INT, p2 ); 
	} 
	else 
	{ 
		theHero.AddHeroInfo( SI_POISON, p2 ); 
		theHero.AddHeroInfo( SI_CURSE, p2 ); 
		theHero.AddHeroInfo( SI_FIRE, p2 ); 
		theHero.AddHeroInfo( SI_COLD, p2 ); 
		theHero.AddHeroInfo( SI_THUNDER, p2 ); 
	} 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_SUB_USE_TIME( int p1, int p2 ) 
{ 
	((CItem *)m_pCurObj)->SubUseTime(); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_SET_CUR_MAGIC( int p1, int p2 ) 
{ 
	theHero.SetCurMagic( p1 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_UPGRADE_ITEM( int p1, int p2 ) 
{ 
	if ( theItemBag.UpdateEquipment( p1 ) ) 
		m_pRegister[0] = ES_OK; 
	else 
		m_pRegister[0] = ES_FAILED; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_ITEM_INFO( int p1, int p2 ) 
{ 
	if ( theItemBag.AddItemAttribute( p1 ) ) 
		m_pRegister[0] = ES_OK; 
	else 
		m_pRegister[0] = ES_FAILED; 
} 
 
////////////////////////////////////////////////////////////////////// 
//获取施法者的一项属性 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GET_MAGICIAN_INFO( int p1, int p2 ) 
{ 
	m_pRegister[0] = theMagicFactory.GetMagician()->GetInfo( p1 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//获取受法者的一项属性 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GET_TARGET_INFO( int p1, int p2 ) 
{ 
	m_pRegister[0] = theMagicFactory.GetTarget()->GetInfo( p1 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//改变施法者的一项属性 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_MOVE_MAGICIAN( int p1, int p2 ) 
{ 
	theMagicFactory.MoveHero(); 
} 
 
////////////////////////////////////////////////////////////////////// 
//改变受法者的一项属性 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_TARGET_INFO( int p1, int p2 ) 
{ 
	theMagicFactory.GetTarget()->AddInfo( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//给受法者加入一个魔法状态 
//p1为作用项, p2为作用时间 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_TARGET_MS( int p1, int p2 ) 
{ 
	theMagicFactory.AddTargetMS( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//给受法者加入一个魔法状态动画 
//p1为魔法状态动画ID, p2为作用时间(如果作用时间为0,则动画只播放一次) 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_ADD_TARGET_MSE( int p1, int p2 ) 
{ 
	theMagicFactory.AddTargetMSE( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//魔法攻击 
//p1为魔法法系,p2为攻击力 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_MAGIC_ATTACK( int p1, int p2 ) 
{ 
	if ( p2 == 0 ) 
		p2 = theMagicFactory.GetMagicDamage(); 
	theMagicFactory.GetTarget()->MagicHurt( p1, p2, theMagicFactory.GetMagician() ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//设置魔法的一项属性 
//p1为属性项,p2为属性值 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_SET_MAGIC_INFO( int p1, int p2 ) 
{ 
	theMagicFactory.SetMagicInfo( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_CREATE_MAGIC_SPRITE( int p1, int p2 ) 
{ 
	theMagicFactory.CreateMagicSprite( p1, p2 ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_SET_REVIVAL( int p1, int p2 ) 
{ 
	char *ptr = m_szBuf; 
	ptr += p1; 
	theHero.SetRevival( ptr ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_Executor::On_GOTO_REVIVAL( int p1, int p2 ) 
{ 
	theHero.GotoRevival(); 
}