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(); }