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

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : UiItem.cpp
  3. // Author : 吕桂华, Wooy(Wu yue)
  4. // 创建时间 : 2002-9-16 11:26:43
  5. // 功能描述 :
  6. // -------------------------------------------------------------------------
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../elem/wnds.h"
  10. #include "uitrade.h"
  11. #include "uiitem.h"
  12. #include "UiGetMoney.h"
  13. #include "UiStoreBox.h"
  14. #include "UiTradeConfirmWnd.h"
  15. #include "UiShop.h"
  16. #include "../../../core/src/coreshell.h"
  17. #include "../../../core/src/GameDataDef.h"
  18. #include "../UiBase.h"
  19. #include "../ShortcutKey.h"
  20. #include <crtdbg.h>
  21. #include "../UiSoundSetting.h"
  22. extern iCoreShell* g_pCoreShell;
  23. #define SCHEME_INI_ITEM "随身物品.ini"
  24. KUiItem* KUiItem::m_pSelf = NULL;
  25. enum WAIT_OTHER_WND_OPER_PARAM
  26. {
  27. UIITEM_WAIT_GETMONEY,
  28. };
  29. //--------------------------------------------------------------------------
  30. // 功能:如果窗口正被显示,则返回实例指针
  31. //--------------------------------------------------------------------------
  32. KUiItem* KUiItem::GetIfVisible()
  33. {
  34. if (m_pSelf && m_pSelf->IsVisible())
  35. return m_pSelf;
  36. return NULL;
  37. }
  38. //--------------------------------------------------------------------------
  39. // 功能:打开窗口,返回唯一的一个类对象实例
  40. //--------------------------------------------------------------------------
  41. KUiItem* KUiItem::OpenWindow()
  42. {
  43. if (m_pSelf == NULL)
  44. {
  45. m_pSelf = new KUiItem;
  46. if (m_pSelf)
  47. m_pSelf->Initialize();
  48. }
  49. if (m_pSelf)
  50. {
  51. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  52. m_pSelf->UpdateData();
  53. m_pSelf->BringToTop();
  54. m_pSelf->Show();
  55. }
  56. return m_pSelf;
  57. }
  58. //--------------------------------------------------------------------------
  59. // 功能:关闭窗口,同时可以选则是否删除对象实例
  60. //--------------------------------------------------------------------------
  61. void KUiItem::CloseWindow(bool bDestroy)
  62. {
  63. if (m_pSelf)
  64. {
  65. KUiShop::CancelTrade();
  66. if (bDestroy == false)
  67. m_pSelf->Hide();
  68. else
  69. {
  70. m_pSelf->Destroy();
  71. m_pSelf = NULL;
  72. }
  73. }
  74. }
  75. // -------------------------------------------------------------------------
  76. // 功能 : 初始化
  77. // -------------------------------------------------------------------------
  78. void KUiItem::Initialize()
  79. {
  80. AddChild(&m_Money);
  81. AddChild(&m_GetMoneyBtn);
  82. AddChild(&m_CloseBtn);
  83. AddChild(&m_ItemBox);
  84. AddChild(&m_OpenStatusPadBtn);
  85. char Scheme[256];
  86. g_UiBase.GetCurSchemePath(Scheme, 256);
  87. LoadScheme(Scheme);
  88. m_ItemBox.SetContainerId((int)UOC_ITEM_TAKE_WITH);
  89. m_nMoney = 0;
  90. Wnd_AddWindow(this);
  91. }
  92. //活动函数
  93. void KUiItem::Breathe()
  94. {
  95. m_nMoney = g_pCoreShell->GetGameData(GDI_PLAYER_HOLD_MONEY, 0, 0);
  96. m_Money.SetIntText(m_nMoney);
  97. }
  98. void KUiItem::OnNpcTradeMode(bool bTrue)
  99. {
  100. if (m_pSelf)
  101. m_pSelf->m_ItemBox.EnablePickPut(!bTrue);
  102. }
  103. //--------------------------------------------------------------------------
  104. // 功能:构造函数
  105. //--------------------------------------------------------------------------
  106. void KUiItem::UpdateData()
  107. {
  108. m_ItemBox.Clear();
  109. m_nMoney = g_pCoreShell->GetGameData(GDI_PLAYER_HOLD_MONEY, 0, 0);
  110. m_Money.SetIntText(m_nMoney);
  111. KUiObjAtRegion* pObjs = NULL;
  112. int nCount = g_pCoreShell->GetGameData(GDI_ITEM_TAKEN_WITH, 0, 0);
  113. if (nCount == 0)
  114. return;
  115. if (pObjs = (KUiObjAtRegion*)malloc(sizeof(KUiObjAtRegion) * nCount))
  116. {
  117. g_pCoreShell->GetGameData(GDI_ITEM_TAKEN_WITH, (unsigned int)pObjs, nCount);//单线程执行,nCount值不变
  118. for (int i = 0; i < nCount; i++)
  119. {
  120. KUiDraggedObject no;
  121. no.uGenre = pObjs[i].Obj.uGenre;
  122. no.uId = pObjs[i].Obj.uId;
  123. no.DataX = pObjs[i].Region.h;
  124. no.DataY = pObjs[i].Region.v;
  125. no.DataW = pObjs[i].Region.Width;
  126. no.DataH = pObjs[i].Region.Height;
  127. m_ItemBox.AddObject(&no, 1);
  128. }
  129. free(pObjs);
  130. pObjs = NULL;
  131. }
  132. }
  133. // -------------------------------------------------------------------------
  134. // 功能 : 物品变化更新
  135. // -------------------------------------------------------------------------
  136. void KUiItem::UpdateItem(KUiObjAtRegion* pItem, int bAdd)
  137. {
  138. if (pItem)
  139. {
  140. KUiDraggedObject Obj;
  141. Obj.uGenre = pItem->Obj.uGenre;
  142. Obj.uId = pItem->Obj.uId;
  143. Obj.DataX = pItem->Region.h;
  144. Obj.DataY = pItem->Region.v;
  145. Obj.DataW = pItem->Region.Width;
  146. Obj.DataH = pItem->Region.Height;
  147. if (bAdd)
  148. m_ItemBox.AddObject(&Obj, 1);
  149. else
  150. m_ItemBox.RemoveObject(&Obj);
  151. UiSoundPlay(UI_SI_PICKPUT_ITEM);
  152. }
  153. else
  154. UpdateData();
  155. }
  156. // -------------------------------------------------------------------------
  157. // 功能 : 载入界面方案
  158. // -------------------------------------------------------------------------
  159. void KUiItem::LoadScheme(const char* pScheme)
  160. {
  161. char Buff[128];
  162. KIniFile Ini;
  163. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_ITEM);
  164. if (m_pSelf && Ini.Load(Buff))
  165. {
  166. m_pSelf->Init(&Ini, "Main");
  167. m_pSelf->m_Money.Init(&Ini, "Money");
  168. m_pSelf->m_GetMoneyBtn.Init(&Ini, "GetMoneyBtn");
  169. m_pSelf->m_CloseBtn.Init(&Ini, "CloseBtn");
  170. m_pSelf->m_ItemBox.Init(&Ini, "ItemBox");
  171. m_pSelf->m_OpenStatusPadBtn.Init(&Ini, "OpenStatus");
  172. m_pSelf->m_ItemBox.EnableTracePutPos(true);
  173. }
  174. }
  175. void KUiItem::OnClickItem(KUiDraggedObject* pItem, bool bDoImmed)
  176. {
  177. if (pItem == NULL || g_pCoreShell == NULL)
  178. return;
  179. KUiObjAtContRegion Obj;
  180. Obj.Obj.uGenre = pItem->uGenre;
  181. Obj.Obj.uId = pItem->uId;
  182. Obj.Region.h = pItem->DataX;
  183. Obj.Region.v = pItem->DataY;
  184. Obj.Region.Width  = pItem->DataW;
  185. Obj.Region.Height = pItem->DataH;
  186. Obj.eContainer = UOC_ITEM_TAKE_WITH;
  187. if (bDoImmed == false)
  188. {
  189. KUiItemBuySelInfo Price = { 0 };
  190. if (g_pCoreShell->GetGameData(GDI_TRADE_ITEM_PRICE,
  191. (unsigned int)(&Obj), (int)(&Price)))
  192. {
  193. KUiTradeConfirm::OpenWindow(&Obj, &Price, TCA_SALE);
  194. }
  195. }
  196. else
  197. {
  198. UISYS_STATUS eStatus = g_UiBase.GetStatus();
  199. if (eStatus == UIS_S_TRADE_SALE || eStatus == UIS_S_TRADE_NPC)
  200. {
  201. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_SELL,
  202. (unsigned int)(&Obj), 0);
  203. }
  204. else if (g_UiBase.IsOperationEnable(UIS_O_USE_ITEM))
  205. {
  206. g_pCoreShell->OperationRequest(GOI_USE_ITEM,
  207. (unsigned int)(&Obj), UOC_ITEM_TAKE_WITH);
  208. }
  209. }
  210. }
  211. void KUiItem::OnRepairItem(KUiDraggedObject* pItem)
  212. {
  213. if (pItem == NULL || g_pCoreShell == NULL)
  214. return;
  215. KUiObjAtContRegion Obj;
  216. Obj.Obj.uGenre = pItem->uGenre;
  217. Obj.Obj.uId = pItem->uId;
  218. Obj.Region.h = pItem->DataX;
  219. Obj.Region.v = pItem->DataY;
  220. Obj.Region.Width  = pItem->DataW;
  221. Obj.Region.Height = pItem->DataH;
  222. Obj.eContainer = UOC_ITEM_TAKE_WITH;
  223. KUiItemBuySelInfo Price = { 0 };
  224. if (g_pCoreShell->GetGameData(GDI_REPAIR_ITEM_PRICE,
  225. (unsigned int)(&Obj), (int)(&Price)))
  226. {
  227. KUiTradeConfirm::OpenWindow(&Obj, &Price, TCA_REPAIR);
  228. }
  229. }
  230. // -------------------------------------------------------------------------
  231. // 功能 : 窗口函数
  232. // -------------------------------------------------------------------------
  233. int KUiItem::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  234. {
  235. switch(uMsg)
  236. {
  237. case WND_N_LEFT_CLICK_ITEM:
  238. if (g_UiBase.GetStatus() == UIS_S_TRADE_SALE)
  239. OnClickItem((KUiDraggedObject*)uParam, true);
  240. else if (g_UiBase.GetStatus() == UIS_S_TRADE_NPC)
  241. OnClickItem((KUiDraggedObject*)uParam, false);
  242. else if (g_UiBase.GetStatus() == UIS_S_TRADE_REPAIR)
  243. OnRepairItem((KUiDraggedObject*)uParam);
  244. break;
  245. case WND_N_RIGHT_CLICK_ITEM:
  246. OnClickItem((KUiDraggedObject*)uParam, true);
  247. break;
  248. case WND_N_ITEM_PICKDROP:
  249. OnItemPickDrop((ITEM_PICKDROP_PLACE*)uParam, (ITEM_PICKDROP_PLACE*)nParam);
  250. break;
  251. case WND_N_BUTTON_CLICK:
  252. if (uParam == (unsigned int)(KWndWindow*)&m_CloseBtn)
  253. Hide();
  254. else if (uParam == (unsigned int)(KWndWindow*)&m_OpenStatusPadBtn)
  255. KShortcutKeyCentre::ExcuteScript(SCK_SHORTCUT_STATUS);
  256. else if (uParam == (unsigned int)(KWndWindow*)&m_GetMoneyBtn)
  257. {
  258. if (KUiStoreBox::GetIfVisible())
  259. KUiGetMoney::OpenWindow(0, m_nMoney, this, UIITEM_WAIT_GETMONEY, &m_Money);
  260. }
  261. break;
  262. case WND_M_OTHER_WORK_RESULT:
  263. if (uParam == UIITEM_WAIT_GETMONEY)
  264. OnGetMoney(nParam);
  265. break;
  266. default:
  267. return KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  268. }
  269. return 0;
  270. }
  271. void KUiItem::OnGetMoney(int nMoney)
  272. {
  273. if (nMoney > 0 && KUiStoreBox::GetIfVisible())
  274. {
  275. g_pCoreShell->OperationRequest(GOI_MONEY_INOUT_STORE_BOX,
  276. true, nMoney);
  277. }
  278. }
  279. void KUiItem::OnItemPickDrop(ITEM_PICKDROP_PLACE* pPickPos, ITEM_PICKDROP_PLACE* pDropPos)
  280. {
  281. if (!g_UiBase.IsOperationEnable(UIS_O_MOVE_ITEM) && 
  282. !g_UiBase.IsOperationEnable(UIS_O_TRADE_ITEM))
  283. return;
  284. KUiObjAtContRegion Pick, Drop;
  285. KUiDraggedObject Obj;
  286. UISYS_STATUS eStatus = g_UiBase.GetStatus();
  287. if (pPickPos)
  288. {
  289. _ASSERT(pPickPos->pWnd);
  290. ((KWndObjectMatrix*)(pPickPos->pWnd))->GetObject(
  291. Obj, pPickPos->h, pPickPos->v);
  292. Pick.Obj.uGenre = Obj.uGenre;
  293. Pick.Obj.uId = Obj.uId;
  294. Pick.Region.Width = Obj.DataW;
  295. Pick.Region.Height = Obj.DataH;
  296. Pick.Region.h = Obj.DataX;
  297. Pick.Region.v = Obj.DataY;
  298. Pick.eContainer = UOC_ITEM_TAKE_WITH;
  299. if (eStatus == UIS_S_TRADE_SALE)
  300. {
  301. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_SELL,
  302. (unsigned int)(&Pick), 0);
  303. return;
  304. }
  305. else if (eStatus == UIS_S_TRADE_REPAIR)
  306. {
  307. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_REPAIR,
  308. (unsigned int)(&Pick), 0);
  309. return;
  310. }
  311. else if (eStatus == UIS_S_TRADE_BUY)
  312. return;
  313. }
  314. if (pDropPos)
  315. {
  316. Wnd_GetDragObj(&Obj);
  317. Drop.Obj.uGenre = Obj.uGenre;
  318. Drop.Obj.uId = Obj.uId;
  319. Drop.Region.Width = Obj.DataW;
  320. Drop.Region.Height = Obj.DataH;
  321. Drop.Region.h = pDropPos->h;
  322. Drop.Region.v = pDropPos->v;
  323. Drop.eContainer = UOC_ITEM_TAKE_WITH;
  324. }
  325. g_pCoreShell->OperationRequest(GOI_SWITCH_OBJECT,
  326. pPickPos ? (unsigned int)&Pick : 0,
  327. pDropPos ? (int)&Drop : 0);
  328. }