UiEquip.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:13k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : UiEquip.cpp
  3. // Author : 吕桂华, Wooy(Wu yue)
  4. // 创建时间 : 2002-9-10 16:22:58
  5. // -------------------------------------------------------------------------
  6. #include "KWin32.h"
  7. #include "KIniFile.h"
  8. #include "../elem/wnds.h"
  9. #include "../elem/wndmessage.h"
  10. #include "uiequip.h"
  11. #include "../../../core/src/coreshell.h"
  12. #include "../../../Core/Src/GameDataDef.h"
  13. #include "../../../Engine/Src/Text.h"
  14. #include "../UiBase.h"
  15. #include <crtdbg.h>
  16. #include "../UiSoundSetting.h"
  17. extern iCoreShell* g_pCoreShell;
  18. #define SCHEME_INI_EQUIP "装备.ini"
  19. #define EQUIP_INI_PAGE "装备分页.ini"
  20. #define HORSE_INI_PAGE "装备马分页.ini"
  21. // -------------------------------------------------------------------------
  22. // ---> 建立控件与UIEP_*以及可接纳物品的类型的对应关系
  23. static struct UE_CTRL_MAP
  24. {
  25. int nPosition;
  26. const char* pIniSection;
  27. }CtrlItemMap[_ITEM_COUNT] =
  28. {
  29. { UIEP_HEAD, "Cap" }, //装备-帽子
  30. { UIEP_HAND, "Weapon" }, //装备-武器
  31. { UIEP_NECK, "Necklace" }, //装备-项链
  32. { UIEP_FINESSE, "Bangle" }, //装备-手镯
  33. { UIEP_BODY, "Cloth" }, //装备-衣服
  34. { UIEP_WAIST, "Sash" }, //装备-腰带
  35. { UIEP_FINGER1, "Ring1" }, //装备-戒指
  36. { UIEP_FINGER2, "Ring2" }, //装备-戒指
  37. { UIEP_WAIST_DECOR, "Pendant" }, //装备-腰缀
  38. { UIEP_FOOT, "Shoes" } //装备-鞋子
  39. };
  40. KUiEquip* KUiEquip::m_pSelf = NULL;
  41. void KUiHorsePage::Initialize()
  42. {
  43. AddChild(&m_HorseBox);
  44. AddChild(&m_UpDownHorseBtn);
  45. AddChild(&m_HorseDesc);
  46. }
  47. //载入界面方案
  48. // -------------------------------------------------------------------------
  49. // 功能 : 载入界面方案
  50. // -------------------------------------------------------------------------
  51. void KUiHorsePage::LoadScheme(const char* pScheme)
  52. {
  53. char Buff[128];
  54. KIniFile Ini;
  55. sprintf(Buff, "%s\%s", pScheme, HORSE_INI_PAGE);
  56. if (Ini.Load(Buff))
  57. {
  58. KWndPage::Init(&Ini, "Main");
  59. m_HorseBox.Init(&Ini, "Horse");
  60. m_UpDownHorseBtn.Init(&Ini, "UpDownHorse");
  61. m_HorseDesc.Init(&Ini, "HorseDesc");
  62. }
  63. }
  64. //--------------------------------------------------------------------------
  65. // 功能:装备变化更新
  66. //--------------------------------------------------------------------------
  67. void KUiHorsePage::UpdateEquip(KUiObjAtRegion* pEquip, int bAdd)
  68. {
  69. if (pEquip && pEquip->Region.v == UIEP_HORSE)
  70. {
  71. UiSoundPlay(UI_SI_PICKPUT_ITEM);
  72. if (bAdd && pEquip->Obj.uGenre != CGOG_NOTHING)
  73. {
  74. m_HorseBox.HoldObject(pEquip->Obj.uGenre, pEquip->Obj.uId,
  75. pEquip->Region.Width, pEquip->Region.Height);
  76. m_UpDownHorseBtn.Enable(true);
  77. char Desc[1024];
  78. int nLen = 0;
  79. g_pCoreShell->GetGameData(GDI_GAME_OBJ_DESC, (unsigned int)pEquip, (int)&Desc);
  80. if (Desc[0])
  81. nLen = TEncodeText(Desc, strlen(Desc));
  82. m_HorseDesc.SetText(Desc, nLen);
  83. }
  84. else
  85. {
  86. Clear();
  87. }
  88. }
  89. }
  90. //更新骑马状态
  91. void KUiHorsePage::UpdateRideStatus(int bRiding)
  92. {
  93. m_UpDownHorseBtn.CheckButton(bRiding);
  94. }
  95. void KUiHorsePage::Clear()
  96. {
  97. m_HorseBox.HoldObject(CGOG_NOTHING, 0, 0, 0);
  98. m_UpDownHorseBtn.CheckButton(false);
  99. m_HorseDesc.SetText("", 0);
  100. }
  101. // -------------------------------------------------------------------------
  102. // 功能 : 窗口函数
  103. // -------------------------------------------------------------------------
  104. int KUiHorsePage::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  105. {
  106. int nRet = 0;
  107. if (uMsg == WND_N_ITEM_PICKDROP)
  108. {
  109. if (g_UiBase.IsOperationEnable(UIS_O_MOVE_ITEM))
  110. OnEquiptChanged((ITEM_PICKDROP_PLACE*)uParam, (ITEM_PICKDROP_PLACE*)nParam);
  111. }
  112. else if (uMsg == WND_N_BUTTON_CLICK && (KWndWindow*)uParam == (KWndWindow*)&m_UpDownHorseBtn)
  113. {
  114. g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RIDE, 0);
  115. }
  116. else
  117. {
  118. nRet = KWndPage::WndProc(uMsg, uParam, nParam);
  119. }
  120. return nRet;
  121. }
  122. //--------------------------------------------------------------------------
  123. // 功能:响应界面操作引起装备的改变
  124. //--------------------------------------------------------------------------
  125. void KUiHorsePage::OnEquiptChanged(ITEM_PICKDROP_PLACE* pPickPos, ITEM_PICKDROP_PLACE* pDropPos)
  126. {
  127. KUiObjAtContRegion Drop, Pick;
  128. KUiDraggedObject Obj;
  129. UISYS_STATUS eStatus = g_UiBase.GetStatus();
  130. if (pPickPos)
  131. {
  132. _ASSERT(pPickPos->pWnd);
  133. m_HorseBox.GetObject(Obj);
  134. Pick.Obj.uGenre = Obj.uGenre;
  135. Pick.Obj.uId = Obj.uId;
  136. Pick.Region.Width = Obj.DataW;
  137. Pick.Region.Height = Obj.DataH;
  138. Pick.Region.h = 0;
  139. Pick.Region.v = UIEP_HORSE;
  140. Pick.eContainer = UOC_EQUIPTMENT;
  141. if (eStatus == UIS_S_TRADE_REPAIR)
  142. {
  143. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_REPAIR,
  144. (unsigned int)(&Pick), 0);
  145. return;
  146. }
  147. else if (eStatus == UIS_S_TRADE_SALE)
  148. {
  149. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_SELL,
  150. (unsigned int)(&Pick), 0);
  151. return;
  152. }
  153. else if (eStatus == UIS_S_TRADE_NPC || eStatus == UIS_S_TRADE_BUY)
  154. {
  155. return;
  156. }
  157. }
  158. else if (pDropPos == NULL)
  159. {
  160. return;
  161. }
  162. if (pDropPos)
  163. {
  164. Wnd_GetDragObj(&Obj);
  165. Drop.Obj.uGenre = Obj.uGenre;
  166. Drop.Obj.uId = Obj.uId;
  167. Drop.Region.Width = Obj.DataW;
  168. Drop.Region.Height = Obj.DataH;
  169. Drop.Region.h = 0;
  170. Drop.Region.v = UIEP_HORSE;
  171. Drop.eContainer = UOC_EQUIPTMENT;
  172. }
  173. g_pCoreShell->OperationRequest(GOI_SWITCH_OBJECT,
  174. pPickPos ? (unsigned int)&Pick : 0,
  175. pDropPos ? (int)&Drop : 0);
  176. }
  177. // -------------------------------------------------------------------------
  178. // 功能 : 初始化
  179. // -------------------------------------------------------------------------
  180. void KUiEquipPage::Initialize()
  181. {
  182. for (int i = 0; i < _ITEM_COUNT; i ++)
  183. {
  184. m_EquipBox[i].SetObjectGenre(CGOG_ITEM);
  185. AddChild(&m_EquipBox[i]);
  186. }
  187. }
  188. //--------------------------------------------------------------------------
  189. // 功能:构造函数
  190. //--------------------------------------------------------------------------
  191. void KUiEquipPage::Clear()
  192. {
  193. for (int i = 0; i < _ITEM_COUNT; i ++)
  194. m_EquipBox[i].Celar();
  195. }
  196. //--------------------------------------------------------------------------
  197. // 功能:装备变化更新
  198. //--------------------------------------------------------------------------
  199. void KUiEquipPage::UpdateEquip(KUiObjAtRegion* pEquip, int bAdd)
  200. {
  201. if (pEquip)
  202. {
  203. for (int i = 0; i < _ITEM_COUNT; i++)
  204. {
  205. if (CtrlItemMap[i].nPosition == pEquip->Region.v)
  206. {
  207. if (bAdd)
  208. m_EquipBox[i].HoldObject(pEquip->Obj.uGenre, pEquip->Obj.uId,
  209. pEquip->Region.Width, pEquip->Region.Height);
  210. else
  211. m_EquipBox[i].HoldObject(CGOG_NOTHING, 0, 0, 0);
  212. break;
  213. }
  214. }
  215. }
  216. }
  217. // -------------------------------------------------------------------------
  218. // 功能 : 载入界面方案
  219. // -------------------------------------------------------------------------
  220. void KUiEquipPage::LoadScheme(const char* pScheme)
  221. {
  222. char Buff[128];
  223. KIniFile Ini;
  224. sprintf(Buff, "%s\%s", pScheme, EQUIP_INI_PAGE);
  225. if (Ini.Load(Buff))
  226. {
  227. if (g_pCoreShell->GetGameData(GDI_PLAYER_IS_MALE, 0, 0))
  228. KWndPage::Init(&Ini, "Male");
  229. else
  230. KWndPage::Init(&Ini, "Female");
  231. for (int i = 0; i < _ITEM_COUNT; i ++)
  232. {
  233. m_EquipBox[i].Init(&Ini, CtrlItemMap[i].pIniSection);
  234. }
  235. }
  236. }
  237. // -------------------------------------------------------------------------
  238. // 功能 : 窗口函数
  239. // -------------------------------------------------------------------------
  240. int KUiEquipPage::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  241. {
  242. switch(uMsg)
  243. {
  244. case WND_N_ITEM_PICKDROP:
  245. if (g_UiBase.IsOperationEnable(UIS_O_MOVE_ITEM))
  246. OnEquiptChanged((ITEM_PICKDROP_PLACE*)uParam, (ITEM_PICKDROP_PLACE*)nParam);
  247. break;
  248. default:
  249. return KWndPage::WndProc(uMsg, uParam, nParam);
  250. }
  251. return 0;
  252. }
  253. //--------------------------------------------------------------------------
  254. // 功能:响应界面操作引起装备的改变
  255. //--------------------------------------------------------------------------
  256. void KUiEquipPage::OnEquiptChanged(ITEM_PICKDROP_PLACE* pPickPos, ITEM_PICKDROP_PLACE* pDropPos)
  257. {
  258. KUiObjAtContRegion Drop, Pick;
  259. KUiDraggedObject Obj;
  260. KWndWindow* pWnd = NULL;
  261. UISYS_STATUS eStatus = g_UiBase.GetStatus();
  262. if (pPickPos)
  263. {
  264. _ASSERT(pPickPos->pWnd);
  265. ((KWndObjectBox*)(pPickPos->pWnd))->GetObject(Obj);
  266. Pick.Obj.uGenre = Obj.uGenre;
  267. Pick.Obj.uId = Obj.uId;
  268. Pick.Region.Width = Obj.DataW;
  269. Pick.Region.Height = Obj.DataH;
  270. Pick.Region.h = 0;
  271. Pick.eContainer = UOC_EQUIPTMENT;
  272. pWnd = pPickPos->pWnd;
  273. if (eStatus == UIS_S_TRADE_REPAIR)
  274. {
  275. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_REPAIR,
  276. (unsigned int)(&Pick), 0);
  277. return;
  278. }
  279. else if (eStatus == UIS_S_TRADE_SALE)
  280. {
  281. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_SELL,
  282. (unsigned int)(&Pick), 0);
  283. return;
  284. }
  285. else if (eStatus == UIS_S_TRADE_NPC)
  286. {
  287. return;
  288. }
  289. else if (eStatus == UIS_S_TRADE_BUY)
  290. return;
  291. }
  292. else if (pDropPos)
  293. {
  294. pWnd = pDropPos->pWnd;
  295. }
  296. else
  297. return;
  298. if (pDropPos)
  299. {
  300. Wnd_GetDragObj(&Obj);
  301. Drop.Obj.uGenre = Obj.uGenre;
  302. Drop.Obj.uId = Obj.uId;
  303. Drop.Region.Width = Obj.DataW;
  304. Drop.Region.Height = Obj.DataH;
  305. Drop.Region.h = 0;
  306. Drop.eContainer = UOC_EQUIPTMENT;
  307. }
  308. for (int i = 0; i < _ITEM_COUNT; i++)
  309. {
  310. if (pWnd == (KWndWindow*)&m_EquipBox[i])
  311. {
  312. Drop.Region.v = Pick.Region.v = CtrlItemMap[i].nPosition;
  313. break;
  314. }
  315. }
  316. _ASSERT(i < _ITEM_COUNT);
  317. g_pCoreShell->OperationRequest(GOI_SWITCH_OBJECT,
  318. pPickPos ? (unsigned int)&Pick : 0,
  319. pDropPos ? (int)&Drop : 0);
  320. }
  321. // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  322. // ---> 装备窗口
  323. //--------------------------------------------------------------------------
  324. // 功能:打开窗口,返回唯一的一个类对象实例
  325. //--------------------------------------------------------------------------
  326. KUiEquip* KUiEquip::OpenWindow()
  327. {
  328. if (m_pSelf == NULL)
  329. {
  330. m_pSelf = new KUiEquip;
  331. if (m_pSelf)
  332. m_pSelf->Initialize();
  333. }
  334. if (m_pSelf)
  335. {
  336. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  337. m_pSelf->m_EquipPage.Clear();
  338. m_pSelf->m_HorsePage.Clear();
  339. KUiObjAtRegion Equips[_ITEM_COUNT + 1];
  340. int nCount = g_pCoreShell->GetGameData(GDI_EQUIPMENT, (unsigned int)&Equips, 0);
  341. for (int i = 0; i < nCount; i++)
  342. {
  343. if (Equips[i].Obj.uGenre != CGOG_NOTHING)
  344. {
  345. if (Equips[i].Region.v != UIEP_HORSE)
  346. m_pSelf->m_EquipPage.UpdateEquip(&Equips[i], true);
  347. else
  348. m_pSelf->m_HorsePage.UpdateEquip(&Equips[i], true);
  349. }
  350. }
  351. m_pSelf->Show();
  352. m_pSelf->BringToTop();
  353. }
  354. return m_pSelf;
  355. }
  356. //--------------------------------------------------------------------------
  357. // 功能:如果窗口正被显示,则返回实例指针
  358. //--------------------------------------------------------------------------
  359. KUiEquip* KUiEquip::GetIfVisible()
  360. {
  361. if (m_pSelf && m_pSelf->IsVisible())
  362. return m_pSelf;
  363. return NULL;
  364. }
  365. //--------------------------------------------------------------------------
  366. // 功能:关闭窗口,同时可以选则是否删除对象实例
  367. //--------------------------------------------------------------------------
  368. void KUiEquip::CloseWindow(bool bDestroy)
  369. {
  370. if (m_pSelf)
  371. {
  372. if (bDestroy == false)
  373. m_pSelf->Hide();
  374. else
  375. {
  376. m_pSelf->Destroy();
  377. m_pSelf = NULL;
  378. }
  379. }
  380. }
  381. // -------------------------------------------------------------------------
  382. // 功能 : 初始化
  383. // -------------------------------------------------------------------------
  384. void KUiEquip::Initialize()
  385. {
  386. m_EquipPage.Initialize();
  387. AddPage(&m_EquipPage, &m_Equip1Btn);
  388. m_HorsePage.Initialize();
  389. AddPage(&m_HorsePage, &m_Equip2Btn);
  390. AddChild(&m_Close);
  391. char Scheme[256];
  392. g_UiBase.GetCurSchemePath(Scheme, 256);
  393. LoadScheme(Scheme);
  394. Wnd_AddWindow(this);
  395. }
  396. // -------------------------------------------------------------------------
  397. // 功能 : 载入界面方案
  398. // -------------------------------------------------------------------------
  399. void KUiEquip::LoadScheme(const char* pScheme)
  400. {
  401. char Buff[128];
  402. KIniFile Ini;
  403. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_EQUIP);
  404. if (m_pSelf && Ini.Load(Buff))
  405. {
  406. m_pSelf->Init(&Ini, "Main"); // 窗口背景数据
  407. m_pSelf->m_Close.Init(&Ini, "Close");
  408. m_pSelf->m_Equip1Btn.Init(&Ini, "Equip1Btn");
  409. m_pSelf->m_Equip2Btn.Init(&Ini, "Equip2Btn");
  410. m_pSelf->m_EquipPage.LoadScheme(pScheme);
  411. m_pSelf->m_HorsePage.LoadScheme(pScheme);
  412. }
  413. }
  414. // -------------------------------------------------------------------------
  415. // 功能 : 窗口函数
  416. // -------------------------------------------------------------------------
  417. int KUiEquip::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  418. {
  419. if (uMsg == WND_N_BUTTON_CLICK && (KWndWindow*)uParam == (KWndWindow*)&m_Close)
  420. {
  421. Hide(); // 关闭装备框
  422. return 0;
  423. }
  424. return KWndPageSet::WndProc(uMsg, uParam, nParam);
  425. }
  426. // -------------------------------------------------------------------------
  427. // 功能 : 装备变化更新
  428. // -------------------------------------------------------------------------
  429. void KUiEquip::UpdateEquip(KUiObjAtRegion* pEquipt, int bAdd)
  430. {
  431. if (pEquipt)
  432. {
  433. if (pEquipt->Region.v != UIEP_HORSE)
  434. m_EquipPage.UpdateEquip(pEquipt, bAdd);
  435. else
  436. m_HorsePage.UpdateEquip(pEquipt, bAdd);
  437. }
  438. }
  439. //更新骑马状态
  440. void KUiEquip::UpdateRideStatus(int bRiding)
  441. {
  442. if (m_pSelf)
  443. m_pSelf->m_HorsePage.UpdateRideStatus(bRiding);
  444. }