EXInterface.cpp
上传用户:lian_0917
上传日期:2013-03-24
资源大小:1151k
文件大小:6k
源码类别:

其他游戏

开发平台:

MultiPlatform

  1. #include "stdafx.h"
  2. #include "GameObj.h"
  3. #include "callback_functions.h"
  4. #include "gamelogic.h"
  5. CGameLogic* LogicEngine ;
  6. /*
  7.  * 游戏初始化
  8.  */
  9. extern "C" _declspec(dllexport) void StartGame(int func_count, void* funclist)
  10. {
  11. LoadActor = *((LoadActorFunc)(*(void**)funclist)) ;
  12. is_engine_busy = *( (EngineBusyFunc)(*(void**)( (char*)(funclist) + 4 ))) ;
  13. Speak = *( (PCharArguFunc)(*(void**)( (char*)(funclist) + 8 ))) ;
  14. LoadMusic  = *( (PCharArguFunc)(*(void**)( (char*)(funclist) + 12 ))) ;
  15. PlayMusic  = *( (BoolArguFunc)(*(void**)( (char*)(funclist) + 16 ))) ;
  16. StopMusic  = *( (NonArguFunc)(*(void**)( (char*)(funclist) + 20 ))) ;
  17. LoadBackGround = *( (LoadBGFunc)(*(void**)( (char*)(funclist) + 24 ))) ;
  18. LoadBGMask = *( (LoadBGFunc)(*(void**)( (char*)(funclist) + 28 ))) ;
  19. GetFrameCount = *( (UIntArguFunc)(*(void**)( (char*)(funclist) + 32 ))) ;
  20. GetMainFrame = *( (HandlFunc)(*(void**)( (char*)(funclist) + 36 ))) ;
  21. try
  22. {
  23. LogicEngine = new CGameLogic() ;
  24. }
  25. catch (std::exception& e) 
  26. {
  27. MessageBox(0, e.what(), "游戏初始化错误", MB_OK) ;
  28. }
  29. catch (...)
  30. {
  31. MessageBox(0, "Unknown error!", "游戏初始化错误", MB_OK) ;
  32. }
  33. }
  34. /*
  35.  * 游戏状态自更新
  36.  */
  37. extern "C" _declspec(dllexport) void Update()
  38. {
  39. int is_busy ;
  40. try
  41. {
  42. is_engine_busy( &is_busy ) ;
  43. if ( !is_busy )
  44. {
  45. LogicEngine->AutoUpdate() ;
  46. }
  47. }
  48. catch ( std::exception& e ) 
  49. {
  50. MessageBox(0,e.what(),"游戏运行期间错误",MB_OK) ;
  51. }
  52. }
  53. /*
  54.  * 处理用户输入
  55.  */
  56. extern "C" _declspec(dllexport) void UserInput( int KeyMask )
  57. {
  58. int is_busy ;
  59. is_engine_busy( &is_busy ) ;
  60. if ( !is_busy )
  61. {
  62. try
  63. {
  64. LogicEngine->UserInput( KeyMask ) ;
  65. }
  66. catch ( std::exception& e ) 
  67. {
  68. MessageBox(0,e.what(),"游戏运行期间错误",MB_OK) ;
  69. }
  70. }
  71. }
  72. extern "C" _declspec(dllexport) void enumObj(void* object)
  73. {
  74. LogicEngine->enumObj(object) ;
  75. }
  76. /*
  77.  * 查询说话
  78.  */
  79. extern "C" _declspec(dllexport) void QueryTalking(int* pID, void** pWords)
  80. {
  81. const STalking_Board* board = LogicEngine->QueryTalking() ;
  82. if ( board == NULL )
  83. {
  84. *pID = -1 ;
  85. *pWords = NULL ;
  86. }
  87. else
  88. {
  89. *pID = board->Talker_id ;
  90. *pWords = (void*)board->words.c_str() ;
  91. }
  92. }
  93. /*
  94.  * 返回当前背景和状态,比如淡入
  95.  */
  96. extern "C" _declspec(dllexport) void GetBackGround( int* pID, int* state )
  97. {
  98. int is_busy ;
  99. is_engine_busy( &is_busy ) ;
  100. if ( !is_busy )
  101. {
  102. if ( LogicEngine->m_EventManager->m_is_in_state )
  103. {
  104. LogicEngine->m_EventManager->m_is_in_state = false ;
  105. if ( LogicEngine->m_EventManager->GetState() == BackGround_Fadein )
  106. {
  107. LogicEngine->m_EventManager->SetState( BackGround_Normal ) ;
  108. }
  109. if ( LogicEngine->m_EventManager->GetState() == BackGround_Blank )
  110. {
  111. LogicEngine->m_EventManager->SetState( BackGround_Normal ) ;
  112. }
  113. if ( LogicEngine->m_EventManager->GetState() == BackGround_Fadeout )
  114. {
  115. LogicEngine->m_EventManager->SetState( BackGround_Blank ) ;
  116. }
  117. }
  118. if (!LogicEngine->m_EventManager->m_is_in_state && LogicEngine->m_EventManager->GetState() != BackGround_Normal)
  119. {
  120. LogicEngine->m_EventManager->m_is_in_state = true ;
  121. }
  122. }
  123. *pID = LogicEngine->m_EventManager->GetBackImg() ;
  124. *state = LogicEngine->m_EventManager->GetState() ;
  125. }
  126. /*
  127.  * 查询背景掩码
  128.  */
  129. extern "C" _declspec(dllexport) void GetMaskGround( int* pID )
  130. {
  131. *pID = LogicEngine->m_EventManager->GetMaskImg() ;
  132. }
  133. /*
  134.  * 查询发现物品框,返回物品id和描述
  135.  */
  136. extern "C" _declspec(dllexport) void QueryDiscovery(int* pID, void** pWords)
  137. {
  138. const SDiscovery_Board* board = LogicEngine->QueryDiscovery() ;
  139. if ( board == NULL )
  140. {
  141. *pID = -1 ;
  142. *pWords = NULL ;
  143. }
  144. else
  145. {
  146. *pID = board->item ;
  147. *pWords = (void*)board->description.c_str() ;
  148. }
  149. }
  150. /*
  151.  * 查询当前菜单接口:返回-1表示无菜单,1234分别代表4个菜单
  152.  */
  153. extern "C" _declspec(dllexport) void QueryMenu( int* pID, char** pTitle)
  154. {
  155. char* Title ;
  156. *pTitle = NULL ;
  157. *pID = LogicEngine->QueryCurrentMenu( &Title ) ;
  158. }
  159. /*
  160.  * 枚举菜单项
  161.  */
  162. extern "C" _declspec(dllexport) void enumMenuItem(void* pItem)
  163. {
  164. LogicEngine->enumMenuItem( pItem ) ;
  165. }
  166. /*
  167.  * 查询战斗状态:返回战斗地点的坐标和焦点半径
  168.  */
  169. extern "C" _declspec(dllexport) void QueryBattleState( int* x, int* y, int* radius )
  170. {
  171. LogicEngine->QueryBattleState(x, y, radius) ;
  172. }
  173. extern "C" _declspec(dllexport) void QueryEnd( int* pID )
  174. {
  175. if ( LogicEngine->is_dead() )
  176. {
  177. *pID = 1 ;
  178. return ;
  179. }
  180. if ( LogicEngine->is_success() )
  181. {
  182. *pID = 2 ;
  183. return ;
  184. }
  185. *pID = 0 ;
  186. }
  187. /*
  188.  * 结束当前游戏,释放逻辑引擎申请的所有的资源(不包括Unicough引擎管理的图片资源)
  189.  */
  190. extern "C" _declspec(dllexport) void EndGame()
  191. {
  192. if ( LogicEngine != NULL )
  193. {
  194. delete LogicEngine ;
  195. LogicEngine = NULL ;
  196. }
  197. }
  198. extern "C" _declspec(dllexport) void GetCurrentHealth(int* hero_blood, int* hero_magic, int* evil_blood, int* evil_magic)
  199. {
  200. *hero_blood = LogicEngine->m_ActorManager->GetActiveActor().Property("生命力")->val ;
  201. if ( *hero_blood < 0 )
  202. {
  203. *hero_blood = 0 ;
  204. }
  205. *hero_magic = LogicEngine->m_ActorManager->GetActiveActor().Property("魔法力")->val ;
  206. if ( *hero_magic < 0 )
  207. {
  208. *hero_magic = 0 ;
  209. }
  210. *evil_blood = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("生命力")->val ;
  211. *evil_magic = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("魔法力")->val ;
  212. if ( *evil_blood < 0 )
  213. {
  214. *evil_blood = 0 ;
  215. }
  216. if ( *evil_magic < 0 )
  217. {
  218. *evil_magic = 0 ;
  219. }
  220. }
  221. extern "C" _declspec(dllexport) void GetFullHealth( int* hero_blood, int* hero_magic, int* evil_blood, int* evil_magic )
  222. {
  223. *hero_blood = LogicEngine->m_ActorManager->GetActiveActor().Property("生命力上限")->val ;
  224. *hero_magic = LogicEngine->m_ActorManager->GetActiveActor().Property("魔法力上限")->val ;
  225. *evil_blood = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("生命力上限")->val ;
  226. *evil_magic = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("魔法力上限")->val ;
  227. }
  228. /*
  229.  * 以下定义Delphi提供得函数指针
  230.  */
  231. LoadActorFunc LoadActor ;
  232. EngineBusyFunc is_engine_busy ;
  233. PCharArguFunc Speak ;
  234. PCharArguFunc LoadMusic ;
  235. NonArguFunc PlayMusic ;
  236. NonArguFunc StopMusic ;
  237. LoadBGFunc LoadBackGround ;
  238. LoadBGFunc LoadBGMask ;
  239. UIntArguFunc GetFrameCount ;
  240. HandlFunc GetMainFrame ;