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

其他游戏

开发平台:

MultiPlatform

  1. /********************************************************************
  2. created: 2004/07/02
  3. created: 2:7:2004   22:40
  4. filename:  d:WorksGamelibGameLogic.cpp
  5. file path: d:WorksGamelib
  6. file base: GameLogic
  7. file ext: cpp
  8. author: lazybug
  9. purpose: 游戏逻辑的总管,对Delphi部分的接口函数全部由此提供,在这里创建ActorManager和
  10.             EventManager,并处理用户输入,管理菜单等等。
  11. *********************************************************************/
  12. #include "StdAfx.h"
  13. #include <mmsystem.h>
  14. #include <iostream>
  15. #include <cmath>
  16. #include "GameLogic.h"
  17. #pragma comment(lib,"Winmm.lib")
  18. using namespace std ;
  19. const double PI = 3.1415926 ;
  20. CGameLogic::CGameLogic(void)
  21. {
  22. this->LoadResInfo() ;
  23. this->LoadLogicalMap(".\Scenes\bedroom.map") ;
  24. this->LoadLogicalMap(".\Scenes\garden.map") ;
  25. this->LoadLogicalMap(".\Scenes\客厅.map") ;
  26. this->LoadLogicalMap(".\Scenes\厨房.map") ;
  27. this->LoadLogicalMap(".\Scenes\地道入口.map") ;
  28. this->LoadLogicalMap(".\Scenes\柴房.map") ;
  29. this->LoadLogicalMap(".\Scenes\地下室5.map") ;
  30. this->LoadLogicalMap(".\Scenes\地下室6.map") ;
  31. this->LoadLogicalMap(".\Scenes\地下室7.map") ;
  32. this->LoadLogicalMap(".\Scenes\地下室8.map") ;
  33. this->UseLogicalMap(0) ;
  34. m_bAccept_user_inputs = true ;
  35. m_talking_board.actived = false ;
  36. m_discovery_board.actived = false ;
  37. m_is_fighting = false ;
  38. m_current_menu = -1 ;
  39. m_walking_speed = FASTMODE ;
  40. m_is_dead = false ;
  41. m_is_success = false ;
  42. m_walking_angel_up = 22.0 ;
  43. m_walking_angel_left = 31.0 ;
  44. // 敏感距离和室内外相关
  45. m_sensitive_length = 25 ;
  46. //m_walking_state = STOP ;
  47. m_ActorManager = new CActorManager(this) ;
  48. m_ActorManager->CreateActors() ;
  49. m_EventManager = new CEventManager(this) ;
  50. m_EventManager->LoadScene("scene1.script") ;
  51. // 初始化随机种子
  52. srand( timeGetTime() ) ;
  53. }
  54. CGameLogic::~CGameLogic(void)
  55. {
  56. delete m_ActorManager ;
  57. delete m_EventManager ;
  58. }
  59. void CGameLogic::enumObj(void* object )
  60. {
  61. static CBaseStruct emptyObj ;
  62. emptyObj.ResID = 0 ;
  63. CPlayer* myPlayer ;
  64. if (( myPlayer = m_ActorManager->enumActor() ) != NULL )
  65. {
  66. memcpy(object, (CBaseStruct*)myPlayer, sizeof(CBaseStruct) ) ;
  67. }
  68. else
  69. {
  70. memcpy( object, &emptyObj, sizeof(CBaseStruct) ) ;
  71. }
  72. }
  73. void CGameLogic::AutoUpdate()
  74. {
  75. static DWORD last_time = 0 ;
  76. /*
  77.  * 执行脚本
  78.  */
  79. if ( m_EventManager->Has_something_todo() && !m_EventManager->is_wait_for_enter() && m_GameState != MENUING )
  80. {
  81. m_EventManager->Continue_Doing() ;
  82. }
  83. if ( timeGetTime() - last_time < 30 ) 
  84. return;
  85. last_time = timeGetTime() ;
  86. /*
  87.  * 间隔一段时间给npc状态自动更新
  88.  */
  89. CPlayer* myPlayer = m_ActorManager->enumActor() ;
  90. while ( myPlayer != NULL )
  91. {
  92. myPlayer->AutoUpdate() ;
  93. myPlayer = m_ActorManager->enumActor() ;
  94. }
  95. }
  96. void CGameLogic::UserInput(int keymap )
  97. {
  98. static DWORD last_time = 0 ;
  99. static int oldkey = 0 ;
  100. size_t elpsedtime ;
  101. int dx1 = (int)( m_walking_speed * cos(m_walking_angel_up / 180 * PI) ) ; /*22, 29.5 */
  102. int dy1 = (int)( m_walking_speed * sin(m_walking_angel_up / 180 * PI) ) ;
  103. int dx2 = (int)( m_walking_speed * cos(m_walking_angel_left / 180 * PI) ) ; /*31, 21.0*/
  104. int dy2 = (int)( m_walking_speed * sin(m_walking_angel_left / 180 * PI) ) ;
  105. CPlayer& Actor = m_ActorManager->GetActiveActor() ;
  106. if (m_GameState == MENUING)
  107. {
  108. elpsedtime = 0 ;
  109. }
  110. else
  111. {
  112. elpsedtime = 40 ;
  113. }
  114. if ( timeGetTime() - last_time < elpsedtime) 
  115. return ;
  116. last_time = timeGetTime() ;
  117. if ( oldkey != keymap && Actor.state != FIGHTING )
  118. {
  119. //m_walking_state = STOP ;
  120. Actor.state = STOP ;
  121. }
  122. if ( ( keymap & 1 ) && (m_bAccept_user_inputs) )  /* 上 */
  123. {
  124. if ( oldkey == keymap )
  125. {
  126. //m_walking_state = WALKING ;
  127. Actor.state = WALKING ;
  128. }
  129. this->ActiveMove(dx2,-dy2) ;
  130. /* 向上移动菜单焦点 */
  131. if ( m_GameState == MENUING )
  132. {
  133. if ( (oldkey ^ keymap) & 1 )
  134. {
  135. oldkey = keymap ;
  136. }
  137. else
  138. {
  139. return ;
  140. }
  141. if ( m_focused_menu_item == m_scroll_point )
  142. {
  143. if ( Scrolled( UPWARD ) )
  144. {
  145. m_focused_menu_item-- ;
  146. }
  147. }
  148. else
  149. {
  150. m_focused_menu_item-- ;
  151. }
  152. }
  153. // 返回,不接收同时输入
  154. oldkey = keymap ;
  155. return ;
  156. }
  157. if ( ( keymap & 2 ) && (m_bAccept_user_inputs) )  /* 下 */
  158. {
  159. if ( oldkey == keymap )
  160. {
  161. //m_walking_state = WALKING ;
  162. Actor.state = WALKING ;
  163. }
  164. ActiveMove(-dx2, dy2) ;
  165. /* 移动菜单焦点 */
  166. if ( m_GameState == MENUING )
  167. {
  168. if ( (oldkey ^ keymap) & 2 )
  169. {
  170. oldkey = keymap ;
  171. }
  172. else
  173. {
  174. return ;
  175. }
  176. if ( !is_enum_item_end( m_focused_menu_item ) )
  177. {
  178. m_focused_menu_item++ ;
  179. if ( is_enum_item_end(m_focused_menu_item) )
  180. {
  181. m_focused_menu_item-- ;
  182. }
  183. if ( m_focused_menu_item - m_scroll_point == MAXSCROLLITEM )
  184. {
  185. if (!Scrolled( DOWNWARD ))
  186. {
  187. m_focused_menu_item-- ;
  188. }
  189. }
  190. }
  191. }
  192. // 返回,不接收同时输入
  193. oldkey = keymap ;
  194. return ;
  195. }
  196. if ( ( keymap & 4 ) && (m_bAccept_user_inputs) )  /* 左 */
  197. {
  198. if ( oldkey == keymap )
  199. {
  200. //m_walking_state = WALKING ;
  201. Actor.state = WALKING ;
  202. }
  203. ActiveMove(-dx1, -dy1) ;
  204. // 返回,不接收同时输入
  205. oldkey = keymap ;
  206. return ;
  207. }
  208. if ( ( keymap & 8 ) && (m_bAccept_user_inputs) )  /* 右 */
  209. {
  210. if ( oldkey == keymap )
  211. {
  212. //m_walking_state = WALKING ;
  213. Actor.state = WALKING ;
  214. }
  215. ActiveMove(dx1, dy1) ;
  216. // 返回,不接收同时输入
  217. oldkey = keymap ;
  218. return ;
  219. }
  220. if ( keymap & 32 )
  221. {
  222. if ( (oldkey ^ keymap) & 32 )
  223. {
  224. oldkey = keymap ;
  225. }
  226. else
  227. {
  228. return ;
  229. }
  230. if ( m_EventManager->is_wait_for_enter() )
  231. {
  232. m_EventManager->UserPressedEnter() ;
  233. }
  234. else
  235. {
  236. if ( m_bAccept_user_inputs && !Actor.is_dead )
  237. {
  238. if ( m_GameState == MENUING ) 
  239. {
  240. SelectItem() ;
  241. }
  242. else
  243. {
  244. Research() ;
  245. }
  246. }
  247. }
  248. }
  249. /* 呼出菜单 */
  250. if ( keymap & 64 )
  251. {
  252. // todo: 激活菜单
  253. BringUpMenu( MENU1 ) ;
  254. }
  255. if ( keymap & 128 )
  256. {
  257. // todo: 二号菜单
  258.     BringUpMenu( MENU2 ) ;
  259. }
  260. if ( keymap & 256 )
  261. {
  262. // todo:三号菜单
  263. //BringUpMenu( MENU3 ) ;
  264. }
  265. if ( keymap & 512 )
  266. {
  267. // todo: 四号菜单
  268. //BringUpMenu( MENU4 ) ;
  269. }
  270. /* 关闭菜单 */
  271. if ( keymap & 1024 )
  272. {
  273. m_GameState = NORMAL ;
  274. m_current_menu = NOMENU ;
  275. }
  276. oldkey = keymap ;
  277. }
  278. const STalking_Board* CGameLogic::QueryTalking()
  279. {
  280. if ( m_talking_board.actived )
  281. {
  282. return &m_talking_board ;
  283. }
  284. else
  285. {
  286. return NULL ;
  287. }
  288. }
  289. const SDiscovery_Board* CGameLogic::QueryDiscovery()
  290. {
  291. if ( m_discovery_board.actived )
  292. {
  293. return &m_discovery_board ;
  294. }
  295. else
  296. {
  297. return NULL ;
  298. }
  299. }
  300. void CGameLogic::ActiveMove(int dx, int dy )
  301. {
  302. CPlayer& Actor = m_ActorManager->GetActiveActor() ;
  303. int ix = Actor.x + dx ;
  304. int iy = Actor.y + dy ;
  305. int event_id = this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] ;
  306. if ( event_id != 0 && this->m_current_menu == NOMENU )
  307. {
  308. if ( !Actor.DetectOtherActor(dx, dy) )
  309. {
  310. Actor.x = ix ;
  311. Actor.y = iy ;
  312. }
  313. if ( dx > 0 && dy > 0 )
  314. Actor.facing = 1 ;
  315. if ( dx < 0 && dy < 0 )
  316. Actor.facing = 3 ;
  317. if ( dy < 0 && dx > 0 )
  318. Actor.facing = 2 ;
  319. if ( dy > 0 && dx < 0 )
  320. Actor.facing = 0 ;
  321. if ( event_id != 1 && event_id != -1 && event_id < 256 )
  322. {
  323. m_EventManager->Do_Event(event_id) ;
  324. }
  325. }
  326. }
  327. /*
  328.  * 读取地图目标
  329.  */
  330. void CGameLogic::LoadLogicalMap(const std::string& name)
  331. {
  332. int i, j, map_no ;
  333. ifstream in ;
  334. in.open(name.c_str(), ios::in) ;
  335. if ( in.is_open() )
  336. {
  337. in >> map_no ;
  338. for (i = 0; i < 600 / granularity ; i++)
  339. {
  340. for ( j = 0; j < 800 / granularity ; j++)
  341. in >> m_LogicMap[map_no][j][i] ;
  342. }
  343. }
  344. else
  345. {
  346. throw exception("map file not found!") ;
  347. }
  348. }
  349. /*
  350.  * 读取资源信息
  351.  */
  352. void CGameLogic::LoadResInfo()
  353. {
  354. ifstream in ;
  355. GameRes info ;
  356. string index ;
  357. in.open( ".\Scenes\GameRes.res" ) ;
  358. if ( in.is_open() )
  359. {
  360. while ( !in.eof() )
  361. {
  362. in >> index >> info.filename >> info.h_frame >> info.v_frame >> info.color_key ;
  363. m_game_res.insert( make_pair(index, info) ) ;
  364. }
  365. }
  366. else
  367. {
  368. throw exception("GameResInfo file not found!") ;
  369. }
  370. }
  371. /*
  372.  * 从资源库根据名字得到资源描述结构体
  373.  */
  374. GameRes* CGameLogic::GetRes(const std::string& res_name)
  375. {
  376. map<string,GameRes>::iterator pos = m_game_res.find(res_name) ;
  377. if ( pos != m_game_res.end())
  378. {
  379. return &(pos->second) ;
  380. }
  381. else
  382. {
  383. throw exception("try to get an nonexsisted resource!") ;
  384. }
  385. }
  386. /*
  387.  * 枚举菜单项
  388.  */
  389. void CGameLogic::enumMenuItem(void* pItem )
  390. {
  391. static SMenuItem item ;
  392. static string temp ;
  393. stringstream stream ;
  394. CPlayer& player = m_ActorManager->GetActiveActor() ;
  395. if ( !( m_enumPointer == m_scroll_point + MAXSCROLLITEM ) && !is_enum_item_end( m_enumPointer ) )
  396. {
  397. item.pic_id = m_enumPointer->icon_id ;
  398. item.description = m_enumPointer->description.c_str() ;
  399. item.x = 38 ;
  400. item.height = 60 ;
  401. item.width = 210 ;
  402. item.y += 50 ;
  403. if ( m_enumPointer == m_focused_menu_item )
  404. {
  405. item.is_focus = true ;
  406. }
  407. else
  408. {
  409. item.is_focus = false ;
  410. }
  411. memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
  412. item.y += 28 ;
  413. m_enumPointer++ ;
  414. }
  415. else
  416. {
  417. item.pic_id = -1 ;
  418. item.description = NULL ;
  419. item.x = 0 ;
  420. item.y = 0 ;
  421. memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
  422. reset_enum_pointer(m_enumPointer) ;
  423. }
  424. }
  425. /*
  426.  * 菜单指针有没有到结尾
  427.  */
  428. bool CGameLogic::is_enum_item_end(const std::vector<SPropertyItem>::iterator& pos)
  429. {
  430. switch ( m_current_menu ) {
  431. case MENU1:
  432. return pos == m_gerneral_menu.end() ;
  433. break;
  434. case MENU2:
  435. return pos == m_ActorManager->GetActiveActor().m_tools.end() ;
  436. break;
  437. case MENU3:
  438.     return pos == m_ActorManager->GetActiveActor().m_skills.end() ;
  439. break ;
  440. case MENU4:
  441.     return pos == m_gerneral_menu.end() ;
  442. break ;
  443. default:
  444. break ;
  445. }
  446. return true ;
  447. }
  448. /*
  449.  * 菜单指针是不是到开头
  450.  */
  451. bool CGameLogic::is_enum_item_begin(const std::vector<SPropertyItem>::iterator& pos)
  452. {
  453. switch ( m_current_menu ) {
  454. case MENU1:
  455. return pos == m_gerneral_menu.begin() ;
  456. break;
  457. case MENU2:
  458. return pos == m_ActorManager->GetActiveActor().m_tools.begin() ;
  459. break;
  460. case MENU3:
  461. return pos == m_ActorManager->GetActiveActor().m_skills.begin() ;
  462. break ;
  463. case MENU4:
  464. return pos == m_gerneral_menu.begin() ;
  465. break ;
  466. default:
  467. break ;
  468. }
  469. return true ;
  470. }
  471. /*
  472.  * 重置枚举指针到开始
  473.  */
  474. void CGameLogic::reset_enum_pointer(std::vector<SPropertyItem>::iterator& pos)
  475. {
  476. pos = m_scroll_point ;
  477. }
  478. /*
  479.  * 当前人物调查地图
  480.  */
  481. void CGameLogic::Research()
  482. {
  483. CPlayer& Actor = m_ActorManager->GetActiveActor() ;
  484. int ix = Actor.x ;
  485. int iy = Actor.y ;
  486. int new_event ;
  487. /*
  488.  * 自身所在位置的调查
  489.  */
  490. int event_id = this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] ;
  491. /* 先根据地图处理地图事件 */
  492. if ( event_id > 256 )
  493. {
  494. /* 调用触发事件 */
  495. m_EventManager->Call_Event( event_id ) ;
  496. /* 如果触发事件有后续事件,则改动逻辑地图 */
  497. if ( (new_event = m_EventManager->Following_Event(event_id)) != -1)
  498. {
  499. this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] = new_event ;
  500. }
  501. return ;
  502. }
  503. /*
  504.  * 自身周边的位置调查
  505.  */
  506. for (int dx = -1; dx <= 1; dx ++ )
  507. {
  508. for ( int dy = -1; dy <= 1; dy++ )
  509. {
  510. event_id = this->m_LogicMap[m_current_map][ix/granularity + dx ][iy/granularity + dy ] ;
  511. if ( event_id >= 300 && event_id <= 310 )
  512. {
  513. /* 调用触发事件 */
  514. m_EventManager->Call_Event( event_id ) ;
  515. /* 修改地图 */
  516. this->m_LogicMap[m_current_map][ix/granularity + dx][iy/granularity + dy] = 1 ;
  517. return ;
  518. }
  519. }
  520. }
  521. /* 看看是否有用户关注的npc,如果有,引发菜单*/
  522. if ( m_ActorManager->GetUserAttention() != NULL )
  523. {
  524. BringUpMenu( MENU4 ) ;
  525. }
  526. }
  527. /*
  528.  * 对菜单选择的处理
  529.  */
  530. void CGameLogic::SelectItem()
  531. {
  532. CPlayer& Actor = m_ActorManager->GetActiveActor() ;
  533. CPlayer*    npc = NULL ;
  534. vector<string> Argu ;
  535. switch (m_current_menu) 
  536. {
  537. case MENU1 : /* 人物属性菜单:回车不作为 */
  538. break;
  539. case MENU2 : /* 物品菜单:回车就使用物品 */
  540. if ( !is_enum_item_end( m_focused_menu_item ) )
  541. {
  542. // 改变人物属性
  543. Actor.ChangeProperty( m_focused_menu_item->name, m_focused_menu_item->val ) ;
  544. // 从装备中删除节点
  545. Actor.m_tools.erase( m_focused_menu_item ) ;
  546. // 枚举指针恢复到第一条
  547. m_enumPointer = Actor.m_tools.begin() ;
  548. // 恢复焦点指针到第一位
  549. m_focused_menu_item = m_enumPointer ;
  550. /* 卷屏点也恢复到开始 */
  551. m_scroll_point = m_enumPointer ;
  552. }
  553. break;
  554. case MENU3 :
  555. /* 三号菜单:招数菜单,选择招数进行攻击 */
  556. if ( m_focused_menu_item->val != 999 )
  557. {
  558. /* actor状态变成攻击,播放攻击帧 */
  559. Actor.Attack( m_focused_menu_item->description, m_npcFighter ) ;
  560. }
  561. else
  562. {
  563. Actor.TryEscape( m_npcFighter ) ;
  564. }
  565. m_GameState = NORMAL ;
  566. m_current_menu = NOMENU ;
  567. break ;
  568. case MENU4 :
  569. /* 四号菜单:人物调查菜单:选择不同的行为 */
  570. switch ( m_focused_menu_item->val ) 
  571. {
  572. /* 和关注npc聊天 */
  573. case 0 :
  574. Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
  575. Argu.push_back(m_ActorManager->GetActiveActor().name) ;
  576. m_GameState = NORMAL ;
  577. m_current_menu = NOMENU ;
  578. m_EventManager->Call_Event(m_ActorManager->GetUserAttention()->TalkScript(), &Argu) ;
  579. break ;
  580. /* 和关注的npc战斗 */
  581. case 1 :
  582. Argu.push_back(m_ActorManager->GetActiveActor().name) ;
  583. Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
  584. m_GameState = NORMAL ;
  585. m_current_menu = NOMENU ;
  586. m_EventManager->Call_Event("fight", &Argu) ;
  587. break ;
  588. /* 啥也不作,关掉菜单 */
  589. case 2 :
  590. m_GameState = NORMAL ;
  591. m_current_menu = NOMENU ;
  592. break ;
  593. /* 出人物生平简介 */
  594. case 3 :
  595. Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
  596. Argu.push_back(m_ActorManager->GetActiveActor().name) ;
  597. m_GameState = NORMAL ;
  598. m_current_menu = NOMENU ;
  599. m_EventManager->Call_Event("show", &Argu) ;
  600. break ;
  601. default:
  602. break ;
  603. }
  604. break ;
  605. }
  606. }
  607. /*
  608.  * 卷动菜单:返回false如果卷动到底不作为
  609.  */
  610. bool CGameLogic::Scrolled( int waypoint )
  611. {
  612. if ( waypoint == DOWNWARD )
  613. {
  614. if ( !is_enum_item_end( m_scroll_point + MAXSCROLLITEM ) )
  615. {
  616. m_scroll_point++ ;
  617. reset_enum_pointer( m_enumPointer ) ;
  618. return true ;
  619. }
  620. }
  621. else
  622. {
  623. if ( !is_enum_item_begin( m_scroll_point ) )
  624. {
  625. m_scroll_point-- ;
  626. reset_enum_pointer( m_enumPointer ) ;
  627. return true ;
  628. }
  629. }
  630. return false ;
  631. }
  632. /*
  633.  * 查询战斗状态:不在战斗状态返回-1
  634.  */
  635. void CGameLogic::QueryBattleState(int* x, int* y, int* radius )
  636. {
  637. if ( !m_is_fighting )
  638. {
  639. *x = 0 ;
  640. *y = 0 ;
  641. *radius = -1 ;
  642. }
  643. else
  644. {
  645. *x = m_lightspot_x ;
  646. *y = m_lightspot_y ;
  647. *radius = m_lightspot_radius ;
  648. }
  649. }
  650. /*
  651.  * 设定对战的npcActor
  652.  */
  653. void CGameLogic::StartFight(const std::string& name, const string& npc_name)
  654. {
  655. CPlayer& actor = this->m_ActorManager->GetActor(name) ;
  656. CPlayer& npc = this->m_ActorManager->GetActor(npc_name) ;
  657. m_is_fighting = true ;
  658. this->m_npcFighter = npc_name ;
  659. if ( m_walking_speed <= SLOWMODE )
  660. {
  661. SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 90 ) ;
  662. }
  663. else 
  664. {
  665. SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 150 ) ;
  666. }
  667. }
  668. void CGameLogic::EndFight(const string& name)
  669. {
  670. m_is_fighting = false ;
  671. if ( name == "牛二" )
  672. {
  673. m_ActorManager->GetActiveActor().Die() ;
  674. m_EventManager->Do_Event("Die_event") ;
  675. return ;
  676. }
  677. // 从战斗脚本里退出
  678. m_EventManager->Return_from_Event() ;
  679. }
  680. void CGameLogic::BringUpMenu(int id )
  681. {
  682. SPropertyItem item ;
  683. switch (id) 
  684. {
  685. /* 人物属性菜单 */
  686. case MENU1 :
  687. /* 拷贝菜单项 */
  688. dump_property_menu() ;
  689. m_enumPointer = m_gerneral_menu.begin() ;
  690. m_focused_menu_item = m_gerneral_menu.begin() ;
  691. m_scroll_point = m_enumPointer ;
  692. Speak("菜单") ;
  693. break;
  694. /* 人物装备菜单 */
  695. case MENU2 :
  696. m_enumPointer = m_ActorManager->GetActiveActor().m_tools.begin() ;
  697. m_focused_menu_item = m_ActorManager->GetActiveActor().m_tools.begin() ;
  698. m_scroll_point = m_enumPointer ;
  699. Speak("菜单") ;
  700. break;
  701. /* 战斗时人物技能菜单 */
  702. case MENU3 :
  703. m_enumPointer = m_ActorManager->GetActiveActor().m_skills.begin() ;
  704. m_focused_menu_item = m_ActorManager->GetActiveActor().m_skills.begin() ;
  705. m_scroll_point = m_enumPointer ;
  706. break ;
  707. /* 利用通用菜单的人物调查菜单 */
  708. case MENU4 :
  709. memset(&item, 0, sizeof(item) ) ;
  710. m_gerneral_menu.clear() ;
  711. item.icon_id = -1 ;
  712. item.description = "<size=12> </p>    看看他到底是什么人" ;
  713. item.val = 3 ;
  714. m_gerneral_menu.push_back(item) ;
  715. /* 出现在菜单上的描述 */
  716. item.description = "<size=12> </p>       和他聊一聊吧" ;
  717. /* 菜单的id,用于按键时判断菜单的选择项 */
  718. item.val = 0 ;
  719. m_gerneral_menu.push_back(item) ;
  720. item.description = "<size=12> </p>     真不爽,打他丫的" ;
  721. item.val = 1 ;
  722. m_gerneral_menu.push_back(item) ;
  723. item.description = "<size=12> </p>       不理他,走人" ;
  724. item.val = 2 ;
  725. m_gerneral_menu.push_back(item) ;
  726. m_enumPointer = m_gerneral_menu.begin() ;
  727. m_focused_menu_item = m_gerneral_menu.begin() ;
  728. m_scroll_point = m_enumPointer ;
  729. break ;
  730. default:
  731. throw( exception("try to use invalide menu!") ) ;
  732. }
  733. m_GameState = MENUING ;
  734. m_current_menu = id ;
  735. }
  736. void CGameLogic::dump_property_menu()
  737. {
  738. CPlayer& actor = m_ActorManager->GetActiveActor() ;
  739. SPropertyItem* property ;
  740. SPropertyItem  item ;
  741. stringstream stream ;
  742. string empty ;
  743. memset(&item, 0, sizeof(item) ) ;
  744. m_gerneral_menu.clear() ;
  745. property = actor.Property("生命力") ;
  746. item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
  747. stream << "<size=13>生命力" << ": <color=255>" << property->val ;
  748. property = actor.Property("生命力上限") ;
  749. stream << "<color=16777215>/" << property->val << "</p>" << property->description ;
  750. item.description = stream.str() ;
  751. m_gerneral_menu.push_back(item) ;
  752. stream.rdbuf()->str( empty ) ;
  753. property = actor.Property("魔法力") ;
  754. item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
  755. stream << "<size=13>法术" << ": " << property->val ;
  756. property = actor.Property("魔法力上限") ;
  757. stream << "/" << property->val << "</p>" << property->description ;
  758. item.description = stream.str() ;
  759. m_gerneral_menu.push_back(item) ;
  760. stream.rdbuf()->str( empty ) ;
  761. property = actor.Property("攻击力") ;
  762. item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
  763. stream << "<size=13>攻击力" << ": " << property->val ;
  764. property = actor.Property("攻击力上限") ;
  765. stream << "/" << property->val << "</p>" << property->description ;
  766. item.description = stream.str() ;
  767. m_gerneral_menu.push_back(item) ;
  768. stream.rdbuf()->str( empty ) ;
  769. property = actor.Property("等级") ;
  770. item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
  771. stream << "<size=13>等级" << ":" << property->val << "</p>" << property->description ;
  772. item.description = stream.str() ;
  773. m_gerneral_menu.push_back(item) ;
  774. stream.rdbuf()->str( empty ) ;
  775. property = actor.Property("经验") ;
  776. item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
  777. stream << "<size=13>江湖经验" << ": " << property->val << "</p>" << property->description ;
  778. item.description = stream.str() ;
  779. m_gerneral_menu.push_back(item) ;
  780. stream.rdbuf()->str( empty ) ;
  781. }