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

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. File        : UiTongManager.cpp
  3. Creator     : Fyt(Fan Zhanpeng)
  4. create data : 08-29-2003(mm-dd-yyyy)
  5. Description : 管理帮会的界面
  6. *********************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "CoreShell.h"
  10. #include "KPlayerDef.h"
  11. #include "../elem/wnds.h"
  12. #include "../elem/wndmessage.h"
  13. #include "../UiBase.h"
  14. #include "../UiSoundSetting.h"
  15. #include "../../../Engine/src/KFilePath.h"
  16. #include "UiPopupPasswordQuery.h"
  17. #include "UiTongAssignBox.h"
  18. #include "UiTongManager.h"
  19. #include "UiInformation.h"
  20. #include "UiTongGetString.h"
  21. KUiTongManager* KUiTongManager::ms_pSelf = NULL;
  22. KTongInfo       KUiTongManager::m_TongData;
  23. int             KUiTongManager::m_nElderDataIndex = 0;
  24. int             KUiTongManager::m_nMemberDataIndex = 0;
  25. int             KUiTongManager::m_nCaptainDataIndex = 0;
  26. #define TONG_MANAGER_INI "帮会管理界面.ini"
  27. #define TONG_DATA_TEMP_FILE "帮会临时文件.ini"
  28. #define TONG_REQUEST_INTERVAL 100000
  29. extern iCoreShell* g_pCoreShell;
  30. extern KUiInformation g_UiInformation;
  31. //////////////////////////////////////////////////////////////////////
  32. // Construction/Destruction
  33. //////////////////////////////////////////////////////////////////////
  34. KUiTongManager::KUiTongManager()
  35. {
  36. m_szPassword[0] = 0;
  37. m_nSelectIndex = -1;
  38. m_nCurrentCheckBox = -1;
  39. m_TongData.szName[0] = 0;
  40. m_szTargetPlayerName[0] = 0;
  41. m_uLastRequestTongDataTime = 0;
  42. m_uLastRequestElderListTime = 0;
  43. m_uLastRequestMemberListTime = 0;
  44. m_uLastRequestCaptainListTime = 0;
  45. }
  46. KUiTongManager::~KUiTongManager()
  47. {
  48. }
  49. /*********************************************************************
  50. * 功能:打开窗口
  51. **********************************************************************/
  52. KUiTongManager* KUiTongManager::OpenWindow()
  53. {
  54. if(g_pCoreShell)
  55. {
  56.      if (ms_pSelf == NULL)
  57.      {
  58.     ms_pSelf = new KUiTongManager;
  59.     if (ms_pSelf)
  60.      ms_pSelf->Initialize();
  61.      }
  62.      if (ms_pSelf)
  63.      {
  64.     UiSoundPlay(UI_SI_WND_OPENCLOSE);
  65. ms_pSelf->BringToTop();
  66. ms_pSelf->Show();
  67.     }
  68. }
  69. return ms_pSelf;
  70. }
  71. /*********************************************************************
  72. * 功能:打开窗口,同时安排界面布局
  73. **********************************************************************/
  74. KUiTongManager* KUiTongManager::OpenWindow(char* pszPlayerName)
  75. {
  76. OpenWindow();
  77. if(ms_pSelf)
  78. {
  79. ms_pSelf->ArrangeComposition(pszPlayerName);
  80. }
  81. return ms_pSelf;
  82. }
  83. /*********************************************************************
  84. * 功能:根据传入的玩家名字,安排界面布局
  85. **********************************************************************/
  86. void KUiTongManager::ArrangeComposition(char* pszPlayerName)
  87. {
  88. if(g_pCoreShell)
  89. {
  90.      KUiPlayerItem Player;
  91. int nKind;
  92.      ClearTongData();
  93.      memset(&Player, 0, sizeof(KUiPlayerItem));
  94.      if(pszPlayerName && pszPlayerName[0])
  95.      {
  96. if(g_pCoreShell->FindSpecialNPC(pszPlayerName, &Player, nKind))
  97. m_nIndex = Player.nIndex;
  98.     }
  99.     else
  100.     {
  101.      KUiPlayerBaseInfo Me;
  102.     g_pCoreShell->GetGameData(GDI_PLAYER_BASE_INFO, (unsigned int)&Me, 0);
  103. if(g_pCoreShell->FindSpecialNPC(Me.Name, &Player, nKind))
  104. m_nIndex = Player.nIndex;
  105.     }
  106. if(m_nIndex >= 0)
  107. {
  108. strcpy(m_szPlayerName, Player.Name);
  109.         ms_pSelf->UpdateBtnTheme(0, TRUE);
  110.         g_pCoreShell->TongOperation(GTOI_REQUEST_PLAYER_TONG, (unsigned int)&Player, (int)TRUE);
  111. }
  112. else
  113. {
  114. CloseWindow();
  115. }
  116. }
  117. }
  118. /*********************************************************************
  119. * 功能:如果窗口正被显示,则返回实例指针
  120. **********************************************************************/
  121. KUiTongManager* KUiTongManager::GetIfVisible()
  122. {
  123. if (ms_pSelf && ms_pSelf->IsVisible())
  124. return ms_pSelf;
  125. return NULL;
  126. }
  127. /*********************************************************************
  128. * 功能:关闭窗口,同时可以选则是否删除对象实例
  129. **********************************************************************/
  130. void KUiTongManager::CloseWindow(bool bDestory)
  131. {
  132. if (ms_pSelf)
  133. {
  134. ms_pSelf->Hide();
  135. if (bDestory)
  136. {
  137. ms_pSelf->Destroy();
  138. ms_pSelf = NULL;
  139. }
  140. }
  141. }
  142. /*********************************************************************
  143. * 功能:初始化
  144. **********************************************************************/
  145. void KUiTongManager::Initialize()
  146. {
  147. AddChild(&m_MemberCount);
  148. AddChild(&m_MasterName);
  149. AddChild(&m_Alignment);
  150. AddChild(&m_TongName);
  151. AddChild(&m_Money);
  152. AddChild(&m_BtnDismiss);
  153. AddChild(&m_BtnRecruit);
  154. AddChild(&m_BtnAssign);
  155. AddChild(&m_BtnDemise);
  156. AddChild(&m_BtnLeave);
  157. AddChild(&m_BtnCaptainList);
  158. AddChild(&m_BtnMemberList);
  159. AddChild(&m_BtnElderList);
  160. AddChild(&m_BtnCancel);
  161. AddChild(&m_BtnApply);
  162. AddChild(&m_List);
  163. AddChild(&m_ListScroll);
  164. m_List.SetScrollbar(&m_ListScroll);
  165. AddChild(&m_BtnRefresh);
  166. AddChild(&m_BtnClose);
  167. char Scheme[256];
  168. g_UiBase.GetCurSchemePath(Scheme, 256);
  169. LoadScheme(Scheme);
  170. Wnd_AddWindow(this);
  171. }
  172. /*********************************************************************
  173. * 功能:载入界面方案
  174. **********************************************************************/
  175. void KUiTongManager::LoadScheme(const char* pScheme)
  176. {
  177. if(ms_pSelf)
  178. {
  179. char Buff[128];
  180. KIniFile Ini;
  181. sprintf(Buff, "%s\%s", pScheme, TONG_MANAGER_INI);
  182. if(Ini.Load(Buff))
  183. {
  184. ms_pSelf->Init(&Ini, "Main");
  185. ms_pSelf->m_TongName.Init(&Ini, "TextTongName");
  186.         ms_pSelf->m_MasterName.Init(&Ini, "TextMasterName");
  187.         ms_pSelf->m_Alignment.Init(&Ini, "Faction");
  188.         ms_pSelf->m_MemberCount.Init(&Ini, "MemberCount");
  189.         ms_pSelf->m_Money.Init(&Ini, "Money");
  190.         ms_pSelf->m_BtnDismiss.Init(&Ini, "BtnDismiss");
  191.         ms_pSelf->m_BtnAssign.Init(&Ini, "BtnAssign");
  192.         ms_pSelf->m_BtnDemise.Init(&Ini, "BtnDemise");
  193.         ms_pSelf->m_BtnLeave.Init(&Ini, "BtnLeave");
  194.         ms_pSelf->m_BtnRecruit.Init(&Ini, "BtnRecruit");
  195.         ms_pSelf->m_BtnApply.Init(&Ini, "BtnApply");
  196.         ms_pSelf->m_BtnCancel.Init(&Ini, "BtnCancel");
  197. ms_pSelf->m_BtnElderList.Init(&Ini, "BtnDirectorList");
  198.         ms_pSelf->m_BtnCaptainList.Init(&Ini, "BtnManagerList");
  199.         ms_pSelf->m_BtnMemberList.Init(&Ini, "BtnMemberList");
  200. ms_pSelf->m_List.Init(&Ini, "List");
  201. ms_pSelf->m_ListScroll.Init(&Ini, "ListScrollbar");
  202. ms_pSelf->m_BtnRefresh.Init(&Ini, "BtnRefresh");
  203. ms_pSelf->m_BtnClose.Init(&Ini, "BtnClose");
  204. Ini.GetString("Main", "StringDismiss", "", ms_pSelf->m_szDismiss, sizeof(ms_pSelf->m_szDismiss));
  205. Ini.GetString("Main", "StringAssign", "", ms_pSelf->m_szAssign, sizeof(ms_pSelf->m_szAssign));
  206. Ini.GetString("Main", "StringDemise", "", ms_pSelf->m_szDemise, sizeof(ms_pSelf->m_szDemise));
  207. Ini.GetString("Main", "StringLeave", "", ms_pSelf->m_szLeave, sizeof(ms_pSelf->m_szLeave));
  208. Ini.GetString("Main", "StringJustice", "", ms_pSelf->m_szJustice, sizeof(ms_pSelf->m_szJustice));
  209. Ini.GetString("Main", "StringBalance", "", ms_pSelf->m_szBalance, sizeof(ms_pSelf->m_szBalance));
  210. Ini.GetString("Main", "StringEvil", "", ms_pSelf->m_szEvil, sizeof(ms_pSelf->m_szEvil));
  211. Ini.GetString("Main", "StringConfirm", "", ms_pSelf->m_szConfirm, sizeof(ms_pSelf->m_szConfirm));
  212. Ini.GetString("Main", "StringCancel", "", ms_pSelf->m_szCancel, sizeof(ms_pSelf->m_szCancel));
  213. }
  214. }
  215. }
  216. /*********************************************************************
  217. * 功能:窗口函数
  218. **********************************************************************/
  219. int KUiTongManager::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  220. {
  221. switch(uMsg)
  222. {
  223. case WND_N_LIST_ITEM_SEL:
  224. if(uParam == (unsigned int)&m_List)
  225. {
  226. if(nParam == -1)
  227. {
  228. m_BtnDismiss.Enable(FALSE);
  229. m_BtnAssign.Enable(FALSE);
  230. m_BtnDemise.Enable(FALSE);
  231. }
  232. else
  233. {
  234. m_BtnDismiss.Enable(TRUE);
  235. m_BtnAssign.Enable(TRUE);
  236. m_BtnDemise.Enable(TRUE);
  237. }
  238. m_nSelectIndex = nParam;
  239. }
  240. break;
  241. case WND_N_BUTTON_CLICK:
  242. if(uParam == (unsigned int)&m_BtnDismiss)
  243. {
  244. PopupConfirmWindow(m_szDismiss, RESULT_T_DISMISS);
  245. }
  246. else if(uParam == (unsigned int)&m_BtnAssign)
  247. {
  248. KPilgarlicItem *pNode = GetSelectedPlayer();
  249. KUiTongAssignBox::OpenWindow();
  250. KUiTongAssignBox::LinkToMainWindow(this);
  251. KUiTongAssignBox::ArrangeData(m_nRelation, pNode->Name, pNode->szAgname, m_nCurrentCheckBox, m_nIndex);
  252. }
  253. else if(uParam == (unsigned int)&m_BtnDemise)
  254. {
  255. PopupConfirmWindow(m_szDemise, RESULT_T_DEMISE);
  256. }
  257. else if(uParam == (unsigned int)&m_BtnLeave)
  258. {
  259. PopupConfirmWindow(m_szLeave, RESULT_T_LEAVE);
  260. }
  261. else if(uParam == (unsigned int)&m_BtnRecruit)
  262. {
  263. g_pCoreShell->TongOperation(GTOI_TONG_RECRUIT,
  264.                         m_BtnRecruit.IsButtonChecked(), 0);
  265. }
  266. else if(uParam == (unsigned int)&m_BtnApply)
  267. {
  268. OnAction(TONG_ACTION_APPLY);
  269. }
  270. else if(uParam == (unsigned int)&m_BtnCancel || uParam == (unsigned int)&m_BtnClose)
  271. {
  272. CloseWindow();
  273. }
  274. else if(uParam == (unsigned int)&m_BtnRefresh)
  275. {
  276. OnRefresh();
  277. }
  278. else if(uParam == (unsigned int)&m_BtnElderList)
  279. {
  280. UpdateListCheckButton(enumTONG_FIGURE_DIRECTOR);
  281. if(m_ElderData.GetCount() == 0)
  282.     LoadData(enumTONG_FIGURE_DIRECTOR);
  283. }
  284. else if(uParam == (unsigned int)&m_BtnCaptainList)
  285. {
  286. UpdateListCheckButton(enumTONG_FIGURE_MANAGER);
  287. if(m_CaptainData.GetCount() == 0)
  288.     LoadData(enumTONG_FIGURE_MANAGER);
  289. }
  290. else if(uParam == (unsigned int)&m_BtnMemberList)
  291. {
  292. UpdateListCheckButton(enumTONG_FIGURE_MEMBER);
  293. if(m_MemberData.GetCount() == 0)
  294.     LoadData(enumTONG_FIGURE_MEMBER);
  295. }
  296. break;
  297. case WND_M_OTHER_WORK_RESULT:
  298. Show();
  299. if(nParam)
  300. {
  301. strcpy(m_szTargetPlayerName, (char *)nParam);
  302. }
  303. if(uParam == RESULT_T_DISMISS && nParam)
  304. {
  305. OnAction(TONG_ACTION_DISMISS);
  306. }
  307. else if(uParam == RESULT_T_ASSIGN && nParam)
  308. {
  309. OnAction(TONG_ACTION_ASSIGN);
  310. }
  311. else if(uParam == RESULT_T_PASSWORD_TO_DEMISE)
  312. {
  313. strcpy(m_szPassword, (const char *)nParam);
  314. PopupConfirmWindow(m_szDemise, RESULT_T_DEMISE);
  315. }
  316. else if(uParam == RESULT_T_DEMISE)
  317. {
  318. if(nParam)
  319. {
  320.     OnAction(TONG_ACTION_DEMISE);
  321. }
  322. else
  323. {
  324. memset(m_szPassword, 0, sizeof(m_szPassword));
  325. }
  326. }
  327. else if(uParam == RESULT_T_LEAVE && nParam)
  328. {
  329. OnAction(TONG_ACTION_LEAVE);
  330. }
  331. m_szTargetPlayerName[0] = 0;
  332. break;
  333. case WND_N_SCORLLBAR_POS_CHANGED:
  334. if(uParam == (unsigned int)&m_ListScroll)
  335. {
  336.      m_List.SetTopItemIndex(nParam);
  337. }
  338. break;
  339. default:
  340. return KWndImage::WndProc(uMsg, uParam, nParam);
  341. }
  342. return 1;
  343. }
  344. /*********************************************************************
  345. * 功能:更新按钮配置方案
  346. **********************************************************************/
  347. void KUiTongManager::UpdateBtnTheme(int nType, BOOL IsDissable)
  348. {
  349. m_BtnDismiss.Hide();
  350. m_BtnRecruit.Hide();
  351. m_BtnAssign.Hide();
  352. m_BtnDemise.Hide();
  353. m_BtnLeave.Hide();
  354. m_BtnCaptainList.Hide();
  355. m_BtnMemberList.Hide();
  356. m_BtnElderList.Hide();
  357. m_BtnCancel.Hide();
  358. m_BtnApply.Hide();
  359. m_BtnRefresh.Hide();
  360. if(IsDissable)
  361. {
  362. return;
  363. }
  364. switch(nType)
  365. {
  366. case enumTONG_FIGURE_MASTER:
  367. m_BtnDismiss.Show();
  368. m_BtnRecruit.Show();
  369. m_BtnAssign.Show();
  370. m_BtnDemise.Show();
  371. m_BtnCaptainList.Show();
  372.     m_BtnMemberList.Show();
  373.     m_BtnElderList.Show();
  374. break;
  375. case enumTONG_FIGURE_DIRECTOR:
  376. m_BtnDismiss.Show();
  377. m_BtnRecruit.Show();
  378. m_BtnAssign.Show();
  379. m_BtnLeave.Show();
  380. m_BtnCaptainList.Show();
  381.     m_BtnMemberList.Show();
  382.     m_BtnElderList.Show();
  383. break;
  384. case enumTONG_FIGURE_MANAGER:
  385. m_BtnRecruit.Show();
  386. m_BtnLeave.Show();
  387. m_BtnElderList.Show();
  388. break;
  389. case enumTONG_FIGURE_MEMBER:
  390. m_BtnLeave.Show();
  391. m_BtnElderList.Show();
  392. break;
  393. default:
  394. m_BtnElderList.Show();
  395. m_BtnApply.Show();
  396. m_BtnCancel.Show();
  397. break;
  398. }
  399. m_BtnRefresh.Show();
  400. if(g_pCoreShell && nType >= enumTONG_FIGURE_MANAGER && nType <= enumTONG_FIGURE_MASTER)
  401. {
  402. KUiPlayerItem Player;
  403. memset(&Player, 0, sizeof(KUiPlayerItem));
  404. strcpy(Player.Name, m_szPlayerName);
  405. m_BtnRecruit.CheckButton(g_pCoreShell->TongOperation(GTOI_TONG_IS_RECRUIT, (unsigned int)&Player, 0));
  406. }
  407. }
  408. /*********************************************************************
  409. * 功能:更新帮会讯息的显示
  410. **********************************************************************/
  411. void KUiTongManager::UpdateTongInfoView()
  412. {
  413. char Buff[16];
  414. m_TongName.SetText(m_TongData.szName);
  415. m_MasterName.SetText(m_TongData.szMasterName);
  416. switch(m_TongData.nFaction)
  417. {
  418. case camp_justice:
  419. m_Alignment.SetText(m_szJustice);
  420. break;
  421. case camp_balance:
  422. m_Alignment.SetText(m_szBalance);
  423. break;
  424. case camp_evil:
  425. m_Alignment.SetText(m_szEvil);
  426. break;
  427. }
  428. m_MemberCount.SetText(itoa(m_TongData.nMemberCount + m_TongData.nManagerCount + m_TongData.nDirectorCount, Buff, 10));
  429. m_Money.SetText(itoa(m_TongData.nMoney, Buff, 10));
  430. }
  431. /*********************************************************************
  432. * 功能:更新列表栏的显示
  433. **********************************************************************/
  434. void KUiTongManager::UpdateTongListView()
  435. {
  436. KLinkStruct<KPilgarlicItem> *pData = GetCurrentSelectedData();
  437. if(pData)
  438. {
  439.      int nViewCount = m_List.GetCount();
  440.      int nDataCount = pData->GetCount();
  441. if(nDataCount > nViewCount)
  442. {
  443. KPilgarlicItem *pNode = pData->GetItem(nViewCount);
  444. if(pNode)
  445. {
  446. char Buff[64];
  447. for(int i = nViewCount;i < nDataCount;i++)
  448. {
  449. // if(IsPlayerExist(pNode, pData))
  450. // {
  451. // continue;
  452. // }
  453. sprintf(Buff, "%s %s", pNode->szAgname, pNode->Name);
  454. m_List.AddString(i, Buff);
  455. pNode = pData->NextItem();
  456. }
  457. }
  458. }
  459. }
  460. }
  461. /*********************************************************************
  462. * 功能:返回当前所选择的列表类型所对应的数据集
  463. **********************************************************************/
  464. KLinkStruct<KPilgarlicItem>* KUiTongManager::GetCurrentSelectedData()
  465. {
  466. switch(m_nCurrentCheckBox)
  467. {
  468. case enumTONG_FIGURE_DIRECTOR:
  469. return &m_ElderData;
  470. break;
  471. case enumTONG_FIGURE_MANAGER:
  472. return &m_CaptainData;
  473. break;
  474. case enumTONG_FIGURE_MEMBER:
  475. return &m_MemberData;
  476. break;
  477. default:
  478. return NULL;
  479. break;
  480. }
  481. }
  482. /*********************************************************************
  483. * 功能:返回所选择的会员
  484. **********************************************************************/
  485. KPilgarlicItem* KUiTongManager::GetSelectedPlayer()
  486. {
  487. KLinkStruct<KPilgarlicItem>* pData = NULL;
  488. KPilgarlicItem* pNode = NULL;
  489. pData = GetCurrentSelectedData();
  490. if(pData)
  491. {
  492.      pNode = pData->GetItem(m_nSelectIndex);
  493. }
  494. return pNode;
  495. }
  496. /*********************************************************************
  497. * 功能:三个列表CheckBox的管理
  498. **********************************************************************/
  499. void KUiTongManager::UpdateListCheckButton(int nType)
  500. {
  501.     m_BtnElderList.CheckButton(FALSE);
  502.     m_BtnMemberList.CheckButton(FALSE);
  503.     m_BtnCaptainList.CheckButton(FALSE);
  504.     switch(nType)
  505.     {
  506.     case enumTONG_FIGURE_DIRECTOR:
  507.     m_BtnElderList.CheckButton(TRUE);
  508.     break;
  509.     case enumTONG_FIGURE_MANAGER:
  510.     m_BtnCaptainList.CheckButton(TRUE);
  511.     break;
  512.     case enumTONG_FIGURE_MEMBER:
  513.     m_BtnMemberList.CheckButton(TRUE);
  514.     break;
  515. default:
  516. return;
  517.     }
  518. if(nType != m_nCurrentCheckBox)
  519. {
  520. m_nCurrentCheckBox = nType;
  521. m_nSelectIndex = -1;
  522. m_List.ResetContent();
  523. UpdateTongListView();
  524. }
  525. }
  526. /*********************************************************************
  527. * 功能:把帮会信息栏清空
  528. **********************************************************************/
  529. void KUiTongManager::ClearTongData()
  530. {
  531. m_MemberCount.SetText("");
  532. m_MasterName.SetText("");
  533. m_Alignment.SetText("");
  534. m_TongName.SetText("");
  535. m_Money.SetText("");
  536. m_List.ResetContent();
  537. m_CaptainData.Clear();
  538. m_MemberData.Clear();
  539. m_ElderData.Clear();
  540. m_nElderDataIndex = 0;
  541. m_nMemberDataIndex = 0;
  542. m_nCaptainDataIndex = 0;
  543. }
  544. /*********************************************************************
  545. * 功能:弹出确认窗口
  546. **********************************************************************/
  547. void KUiTongManager::PopupConfirmWindow(const char* pszInfo, unsigned int uHandleID)
  548. {
  549. //UIMessageBox(pszInfo, this, m_szConfirm, m_szCancel, uHandleID);
  550. KPilgarlicItem *pPlayer = GetSelectedPlayer();
  551. if(pPlayer)
  552.     KUiTongGetString::OpenWindow(pszInfo, pPlayer->Name, this, uHandleID, 1, 31);
  553. else
  554. KUiTongGetString::OpenWindow(pszInfo, m_szPlayerName, this, uHandleID, 1, 31);
  555. Hide();
  556. }
  557. /*********************************************************************
  558. * 功能:接受新的数据的数据接口
  559. **********************************************************************/
  560. void KUiTongManager::NewDataArrive(KUiGameObjectWithName *ParamInfo, KTongMemberItem *pIncome)
  561. {
  562. KLinkStruct<KPilgarlicItem> *pData;
  563. int *pNum, nCount;
  564. if(ParamInfo->nData == enumTONG_FIGURE_DIRECTOR)
  565. {
  566. if(ms_pSelf)
  567. {
  568.     pData = &ms_pSelf->m_ElderData;
  569. }
  570. pNum = &m_nElderDataIndex;
  571. nCount = m_TongData.nDirectorCount;
  572. }
  573. else if(ParamInfo->nData == enumTONG_FIGURE_MANAGER)
  574. {
  575. if(ms_pSelf)
  576. {
  577.     pData = &ms_pSelf->m_CaptainData;
  578. }
  579. pNum = &m_nCaptainDataIndex;
  580. nCount = m_TongData.nManagerCount;
  581. }
  582. else if(ParamInfo->nData == enumTONG_FIGURE_MEMBER)
  583. {
  584. if(ms_pSelf)
  585. {
  586.     pData = &ms_pSelf->m_MemberData;
  587. }
  588. pNum = &m_nMemberDataIndex;
  589. nCount = m_TongData.nMemberCount;
  590. }
  591. else
  592. {
  593. return;
  594. }
  595. if(*pNum != ParamInfo->nParam)
  596. {
  597. return;
  598. }
  599. if(ParamInfo->uParam)
  600. {
  601. *pNum += ParamInfo->uParam;
  602. if(!strcmp(m_TongData.szName, ParamInfo->szName) && ms_pSelf)
  603. {
  604. KPilgarlicItem Add;
  605. for(int i = 0;i < ParamInfo->uParam;i++)
  606. {
  607. if(!pIncome[i].Name[0])
  608. {
  609. continue;
  610. }
  611. memcpy(&Add, pIncome + i, sizeof(KTongMemberItem));
  612. Add.nHashID = StringToHash(Add.Name);
  613. pData->AddItem(Add);
  614. }
  615. ms_pSelf->UpdateTongListView();
  616. }
  617. SaveNewData(ParamInfo, pIncome);
  618. if(*pNum < nCount)
  619. {
  620. RequestData(ParamInfo->nData, *pNum);
  621. }
  622. }
  623. }
  624. /*********************************************************************
  625. * 功能:查询特定位置的前面,某个名字是否已经存在
  626. **********************************************************************/
  627. int KUiTongManager::IsPlayerExist(KPilgarlicItem *MeToCmp, KLinkStruct<KPilgarlicItem> *pData)
  628. {
  629. unsigned int nID;
  630. KPilgarlicItem *pNode;
  631. nID = MeToCmp->nHashID;
  632. pNode = pData->Begin();
  633. while(pNode || pNode != MeToCmp)
  634. {
  635. if(pNode->nHashID == nID)
  636. {
  637. if(!strcmp(MeToCmp->Name, pNode->Name))
  638. {
  639. return 1;
  640. }
  641. }
  642. pNode = pData->NextItem();
  643. }
  644. return 0;
  645. }
  646. /*********************************************************************
  647. * 功能:接受帮会信息
  648. **********************************************************************/
  649. void KUiTongManager::TongInfoArrive(KUiPlayerRelationWithOther* Relation, KTongInfo *pTongInfo)
  650. {
  651. if(ms_pSelf && !strcmp(Relation->Name, ms_pSelf->m_szPlayerName))
  652. {
  653. memcpy(&ms_pSelf->m_TongData, pTongInfo, sizeof(KTongInfo));
  654. ms_pSelf->m_nRelation = Relation->nRelation;
  655. ms_pSelf->UpdateTongInfoView();
  656. ms_pSelf->UpdateBtnTheme(Relation->nRelation);
  657. if(Relation->nRelation <= enumTONG_FIGURE_MASTER && Relation->nRelation >= enumTONG_FIGURE_MEMBER)
  658. {
  659. ms_pSelf->m_Relation = (TONG_MEMBER_FIGURE)Relation->nRelation;
  660.      ms_pSelf->UpdateListCheckButton(enumTONG_FIGURE_DIRECTOR);
  661. }
  662. }
  663. }
  664. /*********************************************************************
  665. * 功能:把新到的列表信息存到临时文件
  666. **********************************************************************/
  667. void KUiTongManager::SaveNewData(KUiGameObjectWithName *ParamInfo, KTongMemberItem *pIncome)
  668. {
  669. char szSection[32];
  670. KIniFile Ini;
  671. if(ParamInfo->nData == enumTONG_FIGURE_DIRECTOR)
  672. {
  673. sprintf(szSection, "%s_Director", ParamInfo->szName);
  674. }
  675. else if(ParamInfo->nData == enumTONG_FIGURE_MANAGER)
  676. {
  677. sprintf(szSection, "%s_Manager", ParamInfo->szName);
  678. }
  679. else if(ParamInfo->nData == enumTONG_FIGURE_MEMBER)
  680. {
  681. sprintf(szSection, "%s_Member", ParamInfo->szName);
  682. }
  683. if(Ini.Load(TONG_DATA_TEMP_FILE))
  684. {
  685. int nCount, nDataCount;
  686. char szKey[32];
  687. Ini.GetInteger(szSection, "Count", 0, &nCount);
  688. nDataCount = nCount + ParamInfo->nParam;
  689. for(int i = nCount;i < nDataCount;i++)
  690. {
  691. sprintf(szKey, "%d_Name", i);
  692. Ini.WriteString(szSection, szKey, pIncome[i - nCount].Name);
  693. sprintf(szKey, "%d_AgName", i);
  694. Ini.WriteString(szSection, szKey, pIncome[i - nCount].szAgname);
  695. sprintf(szKey, "%d_Hash", i);
  696. Ini.WriteInteger(szSection, szKey, StringToHash(pIncome[i - nCount].Name));
  697. }
  698. Ini.Save(TONG_DATA_TEMP_FILE);
  699. }
  700. }
  701. /*********************************************************************
  702. * 功能:把指定类型的列表数据整个存储起来
  703. **********************************************************************/
  704. void KUiTongManager::SaveWholeData(int nType)
  705. {
  706. if(ms_pSelf && ms_pSelf->m_TongData.szName[0])
  707. {
  708.      KLinkStruct<KPilgarlicItem> *pData = NULL;
  709. char szSection[32];
  710. switch(nType)
  711. {
  712. case enumTONG_FIGURE_DIRECTOR:
  713. pData = &ms_pSelf->m_ElderData;
  714. sprintf(szSection, "%s_Director", ms_pSelf->m_TongData.szName);
  715. break;
  716. case enumTONG_FIGURE_MANAGER:
  717. pData = &ms_pSelf->m_CaptainData;
  718. sprintf(szSection, "%s_Manager", ms_pSelf->m_TongData.szName);
  719. break;
  720. case enumTONG_FIGURE_MEMBER:
  721. pData = &ms_pSelf->m_MemberData;
  722. sprintf(szSection, "%s_Member", ms_pSelf->m_TongData.szName);
  723. break;
  724. }
  725. if(pData)
  726. {
  727. KPilgarlicItem *pNode = pData->Reset();
  728. int nCount = pData->GetCount();
  729. char szKey[32];
  730. KIniFile Ini;
  731. /*----------------------------------*/
  732. Ini.Load(TONG_DATA_TEMP_FILE);
  733. Ini.EraseSection(szSection);
  734. for(int i = 0;i < nCount;i++)
  735. {
  736. sprintf(szKey, "%d_Name", i);
  737.     Ini.WriteString(szSection, szKey, pNode->Name);
  738.     sprintf(szKey, "%d_AgName", i);
  739.     Ini.WriteString(szSection, szKey, pNode->szAgname);
  740.     sprintf(szKey, "%d_Hash", i);
  741.     Ini.WriteInteger(szSection, szKey, pNode->nHashID);
  742. pNode = pData->NextItem();
  743. }
  744. }
  745. }
  746. }
  747. /*********************************************************************
  748. * 功能:载入资料
  749. **********************************************************************/
  750. void KUiTongManager::LoadData(int nType)
  751. {
  752. if(m_TongData.szName[0])
  753. {
  754.      char szSection[32];
  755.     switch(nType)
  756.     {
  757.     case enumTONG_FIGURE_DIRECTOR:
  758.      sprintf(szSection, "%s_Director", m_TongData.szName);
  759.     if(!(m_nElderDataIndex = LoadDataHandler(&m_ElderData, szSection)) &&
  760. m_nElderDataIndex < m_TongData.nDirectorCount)
  761. {
  762. m_nElderDataIndex = 0;
  763.      RequestData(enumTONG_FIGURE_DIRECTOR, m_nElderDataIndex);
  764. }
  765.     break;
  766.     case enumTONG_FIGURE_MANAGER:
  767.      sprintf(szSection, "%s_Manager", m_TongData.szName);
  768.     if(!(m_nCaptainDataIndex = LoadDataHandler(&m_CaptainData, szSection)))
  769. {
  770. m_nCaptainDataIndex = 0;
  771.      RequestData(enumTONG_FIGURE_MANAGER, m_nCaptainDataIndex);
  772. }
  773.     break;
  774.     case enumTONG_FIGURE_MEMBER:
  775.      sprintf(szSection, "%s_Member", m_TongData.szName);
  776.     if(!(m_nMemberDataIndex = LoadDataHandler(&m_MemberData, szSection)))
  777. {
  778. m_nMemberDataIndex = 0;
  779.      RequestData(enumTONG_FIGURE_MEMBER, m_nMemberDataIndex);
  780. }
  781.     break;
  782. default:
  783. break;
  784.     }
  785. }
  786. }
  787. /*********************************************************************
  788. * 功能:载入资料的处理函数
  789. **********************************************************************/
  790. int KUiTongManager::LoadDataHandler(KLinkStruct<KPilgarlicItem> *pData,
  791. const char* szSection)
  792. {
  793. char szFileName[256];
  794. KIniFile Ini;
  795. sprintf(szFileName, "%s\%s", g_UiBase.GetUserTempDataFolder(), TONG_DATA_TEMP_FILE);
  796. if(Ini.Load(szFileName) && m_TongData.szName[0] && Ini.IsSectionExist(szSection))
  797. {
  798. int nCount, i;
  799. char szKey[32];
  800. KPilgarlicItem AddItem;
  801. pData->Clear();
  802. Ini.GetInteger(szSection, "Count", 0, &nCount);
  803. for(i = 0;i < nCount;i++)
  804. {
  805. sprintf(szKey, "%d_Name", i);
  806. Ini.GetString(szSection, szKey, "", AddItem.Name, sizeof(AddItem.Name));
  807. sprintf(szKey, "%d_AgName", i);
  808. Ini.GetString(szSection, szKey, "", AddItem.szAgname, sizeof(AddItem.szAgname));
  809. sprintf(szKey, "%d_Hash", i);
  810. Ini.GetInteger(szSection, szKey, 0, &AddItem.nHashID);
  811. pData->AddItem(AddItem);
  812. }
  813. UpdateTongListView();
  814. return nCount;
  815. }
  816. return 0;
  817. }
  818. /*********************************************************************
  819. * 功能:向Core发出数据请求
  820. **********************************************************************/
  821. void KUiTongManager::RequestData(int nType, int nIndex)
  822. {
  823. if(g_pCoreShell)
  824. {
  825.      KUiGameObjectWithName ParamInfo;
  826.      strcpy(ParamInfo.szName, m_TongData.szName);
  827.      ParamInfo.nData = nType;
  828.      ParamInfo.nParam = nIndex;
  829.      g_pCoreShell->TongOperation(GTOI_REQUEST_TONG_DATA, (unsigned int)&ParamInfo, 0);
  830. }
  831. }
  832. /*********************************************************************
  833. * 功能:删除临时文件
  834. **********************************************************************/
  835. int KUiTongManager::RemoveTempFile()
  836. {
  837. char szPath[256], szFile[128];
  838. sprintf(szFile, "%s\%s", g_UiBase.GetUserTempDataFolder(), TONG_DATA_TEMP_FILE);
  839. g_GetFullPath(szPath, szFile);
  840. return remove(szPath);
  841. }
  842. /*********************************************************************
  843. * 功能:各种帮会操作的处理函数
  844. **********************************************************************/
  845. void KUiTongManager::OnAction(int nType)
  846. {
  847. if(g_pCoreShell)
  848. {
  849. KPilgarlicItem *pNode = GetSelectedPlayer();
  850. KTongOperationParam Param;
  851. KTongMemberItem Player;
  852. memset(&Player, 0, sizeof(KTongMemberItem));
  853. Param.eOper = (TONG_ACTION_TYPE)nType;
  854. if(nType == TONG_ACTION_LEAVE)
  855. {
  856. Param.nData[0] = m_nRelation;
  857. Param.nData[1] = -1;
  858. }
  859. else
  860. {
  861. Param.nData[0] = m_nCurrentCheckBox;
  862. Param.nData[1] = m_nIndex;
  863. }
  864. strcpy(Param.szPassword, m_szPassword);
  865. if(m_szTargetPlayerName[0])
  866. {
  867. strcpy(Player.Name, m_szTargetPlayerName);
  868. }
  869.     else if(pNode)
  870.     {
  871.     strcpy(Player.Name, pNode->Name);
  872.     }
  873. else
  874. {
  875. strcpy(Player.Name, m_szPlayerName);
  876. }
  877. g_pCoreShell->TongOperation(GTOI_TONG_ACTION, (unsigned int)&Param, (int)&Player);
  878. memset(m_szPassword, 0, sizeof(m_szPassword));
  879. }
  880. }
  881. /*********************************************************************
  882. * 功能:响应刷新按钮的操作函数
  883. **********************************************************************/
  884. void KUiTongManager::OnRefresh()
  885. {
  886. if(m_TongData.szName[0])
  887. {
  888. int nType;
  889. KIniFile Ini;
  890. char szSection[32];
  891. if(m_nCurrentCheckBox == enumTONG_FIGURE_DIRECTOR)
  892. {
  893. sprintf(szSection, "%s_Director", m_TongData.szName);
  894. m_ElderData.Clear();
  895. m_nElderDataIndex = 0;
  896. }
  897. else if(m_nCurrentCheckBox == enumTONG_FIGURE_MANAGER)
  898. {
  899. sprintf(szSection, "%s_Manager", m_TongData.szName);
  900. m_CaptainData.Clear();
  901. m_nCaptainDataIndex = 0;
  902. }
  903. else if(m_nCurrentCheckBox == enumTONG_FIGURE_MEMBER)
  904. {
  905. sprintf(szSection, "%s_Member", m_TongData.szName);
  906. m_MemberData.Clear();
  907. m_nMemberDataIndex = 0;
  908. }
  909. else
  910. {
  911. return;
  912. }
  913. nType = m_nCurrentCheckBox;
  914.     if(Ini.Load(TONG_DATA_TEMP_FILE))
  915.     {
  916.      Ini.EraseSection(szSection);
  917. Ini.Save(TONG_DATA_TEMP_FILE);
  918.     }
  919. m_List.ResetContent();
  920. LoadData(nType);
  921. }
  922. }
  923. /*********************************************************************
  924. * 功能:对结果的响应入口
  925. **********************************************************************/
  926. void KUiTongManager::ResponseResult(KUiGameObjectWithName *pResult, int nbIsSucceed)
  927. {
  928. if(ms_pSelf)
  929. {
  930.      switch(pResult->nData)
  931.      {
  932.      case TONG_ACTION_DISMISS:
  933. ms_pSelf->ResponseDismiss(pResult, nbIsSucceed);
  934.     break;
  935.     case TONG_ACTION_DEMISE:
  936. ms_pSelf->ResponseDemise(pResult, nbIsSucceed);
  937.      break;
  938.      case TONG_ACTION_LEAVE:
  939. ms_pSelf->ResponseLeave(pResult, nbIsSucceed);
  940.     break;
  941. case TONG_ACTION_ASSIGN:
  942. ms_pSelf->ResponseAssign(pResult, nbIsSucceed);
  943.     break;
  944. case TONG_ACTION_APPLY:
  945. ms_pSelf->ResponseApply(pResult, nbIsSucceed);
  946. break;
  947.     }
  948. }
  949. else
  950. {
  951. RemoveTempFile();
  952. }
  953. }
  954. /*********************************************************************
  955. * 功能:响应离帮后的操作
  956. **********************************************************************/
  957. void KUiTongManager::ResponseLeave(KUiGameObjectWithName *pResult, int nbIsSucceed)
  958. {
  959. if(nbIsSucceed)
  960. {
  961.      RemoveTempFile();
  962.      CloseWindow();
  963. }
  964. }
  965. /*********************************************************************
  966. * 功能:响应踢人后的操作
  967. **********************************************************************/
  968. void KUiTongManager::ResponseDismiss(KUiGameObjectWithName *pResult, int nbIsSucceed)
  969. {
  970. if(nbIsSucceed)
  971. {
  972. if(strcmp(pResult->szName, m_szPlayerName) == 0)
  973. {
  974. RemoveTempFile();
  975. CloseWindow();
  976. }
  977. else
  978. {
  979. KLinkStruct<KPilgarlicItem> *pForDelete;
  980. pForDelete = FindPlayer(pResult->szName);
  981. if(pForDelete)
  982. {
  983. pForDelete->RemoveItem();
  984. SaveWholeData(pResult->nParam);
  985. m_List.ResetContent();
  986. UpdateTongListView();
  987. }
  988. }
  989. }
  990. }
  991. /*********************************************************************
  992. * 功能:响应传位后的操作
  993. **********************************************************************/
  994. void KUiTongManager::ResponseDemise(KUiGameObjectWithName *pResult, int nbIsSucceed)
  995. {
  996. if(nbIsSucceed)
  997. {
  998. RemoveTempFile();
  999. ArrangeComposition(NULL);
  1000. }
  1001. }
  1002. /*********************************************************************
  1003. * 功能:响应传位后的操作
  1004. **********************************************************************/
  1005. void KUiTongManager::ResponseAssign(KUiGameObjectWithName *pResult, int nbIsSucceed)
  1006. {
  1007. if(nbIsSucceed)
  1008. {
  1009. if(!strcmp(pResult->szName, m_szPlayerName))
  1010. {
  1011. RemoveTempFile();
  1012.     ArrangeComposition(NULL);
  1013. }
  1014. else
  1015. {
  1016. KLinkStruct<KPilgarlicItem> *pPlayer = FindPlayer(pResult->szName);
  1017. if(pPlayer)
  1018. {
  1019. KPilgarlicItem Add, *pNode = pPlayer->Current();
  1020. memcpy(&Add, pNode, sizeof(KPilgarlicItem));
  1021. pPlayer->RemoveItem();
  1022. switch(pResult->nParam)
  1023. {
  1024. case enumTONG_FIGURE_DIRECTOR:
  1025. m_ElderData.AddItem(Add);
  1026. break;
  1027. case enumTONG_FIGURE_MANAGER:
  1028. m_CaptainData.AddItem(Add);
  1029. break;
  1030. case enumTONG_FIGURE_MEMBER:
  1031. m_MemberData.AddItem(Add);
  1032. break;
  1033. default:
  1034. return;
  1035. }
  1036. SaveWholeData(pResult->nParam);
  1037. SaveWholeData(pResult->uParam);
  1038. m_List.ResetContent();
  1039. UpdateTongListView();
  1040. }
  1041. //////////
  1042. }
  1043. /////////
  1044. }
  1045. ////////
  1046. }
  1047. /*********************************************************************
  1048. * 功能:响应申请后的操作
  1049. **********************************************************************/
  1050. void KUiTongManager::ResponseApply(KUiGameObjectWithName *pResult, int nbIsSucceed)
  1051. {
  1052. if(nbIsSucceed)
  1053. {
  1054. if(!strcmp(m_szPlayerName, pResult->szName))
  1055. {
  1056. RemoveTempFile();
  1057. ArrangeComposition(NULL);
  1058. }
  1059. else
  1060. {
  1061. KPilgarlicItem Add;
  1062. strcpy(Add.Name, pResult->szName);
  1063. strcpy(Add.szAgname, pResult->szString);
  1064. Add.nHashID = StringToHash(Add.Name);
  1065. m_MemberData.AddItem(Add);
  1066. SaveWholeData(enumTONG_FIGURE_MEMBER);
  1067. m_List.ResetContent();
  1068. UpdateTongListView();
  1069. }
  1070. }
  1071. }
  1072. /*********************************************************************
  1073. * 功能:查询特定名字的玩家的数据位置
  1074. **********************************************************************/
  1075. KLinkStruct<KPilgarlicItem>* KUiTongManager::FindPlayer(char *pszName)
  1076. {
  1077. KLinkStruct<KPilgarlicItem> *pData = NULL;
  1078. if(pszName && pszName[0])
  1079. {
  1080.      pData = HandleFind(&m_MemberData, pszName);
  1081.      if(!pData)
  1082.      {
  1083.     pData = HandleFind(&m_CaptainData, pszName);
  1084.     if(!pData)
  1085.     {
  1086.      pData = HandleFind(&m_ElderData, pszName);
  1087.     }
  1088.     }
  1089. }
  1090. return pData;
  1091. }
  1092. /*********************************************************************
  1093. * 功能:查找玩家处理函数
  1094. **********************************************************************/
  1095. KLinkStruct<KPilgarlicItem>* KUiTongManager::HandleFind(KLinkStruct<KPilgarlicItem> *pData, char *pszName)
  1096. {
  1097. KLinkStruct<KPilgarlicItem> *pReturn = NULL;
  1098. KPilgarlicItem *pNode = pData->Reset();
  1099. int nID = StringToHash(pszName);
  1100. int nCount = pData->GetCount();
  1101. for(int i = 0;i < nCount;i++)
  1102. {
  1103. if(nID == pNode->nHashID)
  1104. {
  1105. if(strcmp(pszName, pNode->Name) == 0)
  1106. {
  1107. pReturn = pData;
  1108. break;
  1109. }
  1110. }
  1111. pNode = pData->NextItem();
  1112. }
  1113. return pReturn;
  1114. }
  1115. unsigned long StringToHash(const char *pString, BOOL bIsCaseSensitive)
  1116. {
  1117. if(pString && pString[0])
  1118. {
  1119. unsigned long id = 0;
  1120. const char *ptr;
  1121. int index = 0;
  1122. if(bIsCaseSensitive)
  1123. {
  1124. ptr = pString;
  1125. while(*ptr)
  1126. {
  1127.      id = (id + (++index) * (*ptr)) % 0x8000000b * 0xffffffef;
  1128.         ptr++;
  1129.         }
  1130. }
  1131. else
  1132. {
  1133. char Buff[256];
  1134. strcpy(Buff, pString);
  1135. strlwr(Buff);
  1136. ptr = Buff;
  1137.          while(*ptr)
  1138.     {
  1139.      id = (id + (++index) * (*ptr)) % 0x8000000b * 0xffffffef;
  1140.         ptr++;
  1141.         }
  1142. }
  1143. return (id ^ 0x12345678);
  1144. }
  1145. return 0;
  1146. }