Advertisement
Kiosani

ToolTip.cpp File Part of Source of: 1.03.08 CHS

Mar 30th, 2022
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.92 KB | None | 0 0
  1. #include "StdAfx.h"
  2.  
  3. cToolTip gToolTip;
  4.  
  5. static DWORD dwGetItemLevel_Target = (0x00590D12+3);
  6.  
  7. void cToolTip::Init()
  8. {
  9. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  10. {
  11. this->m_ToolTip[i].Type=NULL;
  12. this->m_ToolTip[i].Index=NULL;
  13. this->m_ToolTip[i].TitleColor=NULL;
  14. }
  15. }
  16.  
  17. #pragma optimize("t",on)
  18. void MASM cToolTip::AddColor()
  19. {
  20. static DWORD dwColorPointer;
  21. static DWORD dwColorCall=0x00587AF6;
  22. static DWORD dwReturnLoad=0x00587A4F;
  23. // ----
  24. _asm
  25. {
  26. MOV EAX,DWORD PTR DS:[EBP*0x04+0x7B7EFDC]
  27. MOV dwColorPointer,EAX
  28. }
  29. // ----
  30. if(dwColorPointer >= White && dwColorPointer <= DarkViolet)
  31. {
  32. _asm
  33. {
  34. JMP dwReturnLoad
  35. }
  36. }
  37. else if(dwColorPointer==Orange)
  38. {
  39. _asm
  40. {
  41. PUSH 0x00000000 // B
  42. PUSH 0x3F044674 // G
  43. PUSH 0x3F800000 // R
  44. JMP dwColorCall
  45. }
  46. }
  47. else if(dwColorPointer==LightBlue)
  48. {
  49. _asm
  50. {
  51. PUSH 0x3F70A3D7 // B
  52. PUSH 0x3F800000 // G
  53. PUSH 0x3ECCCCCD // R
  54. JMP dwColorCall
  55. }
  56. }
  57. else if(dwColorPointer==LightPink)
  58. {
  59. _asm
  60. {
  61. PUSH 0x3F5FBE77 // B
  62. PUSH 0x3F35460B // G
  63. PUSH 0x3F7851EC // R
  64. JMP dwColorCall
  65. }
  66. }
  67. else if(dwColorPointer==Pink)
  68. {
  69. _asm
  70. {
  71. PUSH 0x3F478034 // B
  72. PUSH 0x3EF81062 // G
  73. PUSH 0x3F733333 // R
  74. JMP dwColorCall
  75. }
  76. }
  77. else if(dwColorPointer==DarkBlue)
  78. {
  79. _asm
  80. {
  81. PUSH 0x3F451EB8 // B
  82. PUSH 0x3D6ECBFB // G
  83. PUSH 0x3D3D3C36 // R
  84. JMP dwColorCall
  85. }
  86. }
  87. else if(dwColorPointer==Lime)
  88. {
  89. _asm
  90. {
  91. PUSH 0x3DCCCCCD // B
  92. PUSH 0x3F800000 // G
  93. PUSH 0x3F333333 // R
  94. JMP dwColorCall
  95. }
  96. }
  97. else if(dwColorPointer==Magenta)
  98. {
  99. _asm
  100. {
  101. PUSH 0x3E9EB852 // B
  102. PUSH 0x3DCCCCCD // G
  103. PUSH 0x3F800000 // R
  104. JMP dwColorCall
  105. }
  106. }
  107. }
  108. #pragma optimize("t",off)
  109.  
  110. static DWORD dwNameItemColorSet;
  111. static DWORD dwNameColorNext=0x0058B617;
  112. static DWORD dwNameItemColorStack=0x0058B750;
  113.  
  114. static BOOL bNameItemSwitcher;
  115.  
  116. int cToolTip::GetItemNameColor(DWORD ItemID,BOOL Preview)
  117. {
  118. if(Preview)
  119. {
  120. ItemID -= ITEM_OFFSET_IN_ARRAY;
  121. }
  122. // ----
  123. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  124. {
  125. if(ItemID == GET_ITEM_INDEX(this->m_ToolTip[i].Type,this->m_ToolTip[i].Index))
  126. {
  127. if(this->m_ToolTip[i].TitleColor!=NONE)
  128. {
  129. return this->m_ToolTip[i].TitleColor;
  130. }
  131. }
  132. }
  133. // ----
  134. return NONE;
  135. }
  136.  
  137. int cToolTip::GetItemTextDescs(DWORD ItemID)
  138. {
  139. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  140. {
  141. if(gToolTip.m_Text[i].ItemId >= GET_ITEM_INDEX(12,7)
  142. && gToolTip.m_Text[i].ItemId < GET_ITEM_INDEX(15,MAX_CUSTOM_ITEMS)
  143. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,36)
  144. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,37)
  145. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,38)
  146. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,39)
  147. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,40)
  148. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,41)
  149. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,42)
  150. && gToolTip.m_Text[i].ItemId != GET_ITEM_INDEX(12,43)
  151. && gToolTip.m_Text[i].ItemId != CUSTOM_WINGS_INX(gToolTip.m_Text[i].ItemId))
  152. {
  153. return MISCEL_ITEM;
  154. }
  155. }
  156. // ----
  157. return NULL;
  158. }
  159.  
  160. void cToolTip::SetText(DWORD ItemID,INT iLevel)
  161. {
  162. for(int i=0;i<=gToolTip.Count;i++)
  163. {
  164. if(gToolTip.m_Text[i].ItemId == ItemID
  165. && gToolTip.m_Text[i].ItemLvl == iLevel)
  166. {
  167. if(gToolTip.m_Text[i].Text[0])
  168. {
  169. for(int j=0;j<MAX_TEXT_LINES;j++)
  170. {
  171. if(gToolTip.m_Text[i].Line == j)
  172. {
  173. gItem.AddText(gToolTip.m_Text[i].Text,gToolTip.m_Text[i].Color,gToolTip.m_Text[i].Weight);
  174. }
  175. }
  176. }
  177. }
  178. else if(gToolTip.m_Text[i].ItemId == ItemID
  179. && gToolTip.m_Text[i].ItemLvl == NONE)
  180. {
  181. gToolTip.m_Text[i].ItemLvl = (INT)(dwGetItemLevel_Target);
  182. // ----
  183. if(gToolTip.m_Text[i].Text[0])
  184. {
  185. for(int j=0;j<MAX_TEXT_LINES;j++)
  186. {
  187. if(gToolTip.m_Text[i].Line == j)
  188. {
  189. gItem.AddText(gToolTip.m_Text[i].Text,gToolTip.m_Text[i].Color,gToolTip.m_Text[i].Weight);
  190. }
  191. }
  192. }
  193. }
  194. }
  195. }
  196.  
  197. void cToolTip::SetDesc(DWORD ItemID,INT iLevel)
  198. {
  199. for(int i=0;i<=gToolTip.Count;i++)
  200. {
  201. if(gToolTip.GetItemTextDescs(ItemID)==MISCEL_ITEM)
  202. {
  203. if(gToolTip.m_Text[i].ItemId == ItemID
  204. && gToolTip.m_Text[i].ItemLvl == iLevel)
  205. {
  206. if(gToolTip.m_Text[i].Text[0])
  207. {
  208. for(int j=0;j<MAX_TEXT_LINES;j++)
  209. {
  210. if(gToolTip.m_Text[i].Line == j)
  211. {
  212. gItem.AddText(gToolTip.m_Text[i].Text,gToolTip.m_Text[i].Color,gToolTip.m_Text[i].Weight);
  213. }
  214. }
  215. }
  216. }
  217. else if(gToolTip.m_Text[i].ItemId == ItemID
  218. && gToolTip.m_Text[i].ItemLvl == NONE)
  219. {
  220. gToolTip.m_Text[i].ItemLvl = (INT)(dwGetItemLevel_Target);
  221. // ----
  222. if(gToolTip.m_Text[i].Text[0])
  223. {
  224. for(int j=0;j<MAX_TEXT_LINES;j++)
  225. {
  226. if(gToolTip.m_Text[i].Line == j)
  227. {
  228. gItem.AddText(gToolTip.m_Text[i].Text,gToolTip.m_Text[i].Color,gToolTip.m_Text[i].Weight);
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }
  235. }
  236.  
  237. #pragma optimize("t",on)
  238. void MASM cToolTip::Name()
  239. {
  240. static WORD wIsNameItem;
  241. static DWORD dwNameItemBuff;
  242. // ----
  243. bNameItemSwitcher=FALSE;
  244. dwNameItemColorSet=White;
  245. // ----
  246. _asm
  247. {
  248. MOV wIsNameItem,AX
  249. }
  250. // ----
  251. if(wIsNameItem == GET_ITEM_INDEX(12,15))
  252. {
  253. bNameItemSwitcher=TRUE;
  254. dwNameItemColorSet=Yellow;
  255. }
  256. // ----
  257. if(bNameItemSwitcher==FALSE)
  258. {
  259. dwNameItemColorSet=gToolTip.GetItemNameColor(wIsNameItem,FALSE);
  260. // ----
  261. if(dwNameItemColorSet!=NONE)
  262. {
  263. bNameItemSwitcher=TRUE;
  264. }
  265. }
  266. // ----
  267. if(bNameItemSwitcher==TRUE)
  268. {
  269. _asm
  270. {
  271. JE ColorSet
  272. JMP dwNameColorNext
  273. // ----
  274. ColorSet:
  275. // ----
  276. MOV EDI,dwNameItemColorSet
  277. MOV DWORD PTR SS:[ESP+0x18],EDI
  278. // ----
  279. JMP dwNameItemColorStack
  280. }
  281. }
  282. else if(bNameItemSwitcher==FALSE)
  283. {
  284. _asm
  285. {
  286. JMP dwNameColorNext
  287. }
  288. }
  289. }
  290. #pragma optimize("t",off)
  291.  
  292. int cToolTip::ItemCanHaveOptions(DWORD ItemID)
  293. {
  294. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  295. {
  296. if(ItemID == gToolTip.m_Text[i].ItemId)
  297. {
  298. if(ItemID >= GET_ITEM_INDEX(0,0) && ItemID < GET_ITEM_INDEX(6,MAX_CUSTOM_ITEMS))
  299. {
  300. return WEAPON_ITEM;
  301. }
  302. else if(ItemID >= GET_ITEM_INDEX(7,0) && ItemID < GET_ITEM_INDEX(11,MAX_CUSTOM_ITEMS)
  303. || ItemID == GET_ITEM_INDEX(13,37)) // -> Fix Fenrir
  304. {
  305. return ARMORS_ITEM;
  306. }
  307. else if(ItemID >= GET_ITEM_INDEX(12,7) && ItemID < GET_ITEM_INDEX(15,MAX_CUSTOM_ITEMS)
  308. && ItemID != GET_ITEM_INDEX(12,36) && ItemID != GET_ITEM_INDEX(12,37)
  309. && ItemID != GET_ITEM_INDEX(12,38) && ItemID != GET_ITEM_INDEX(12,39)
  310. && ItemID != GET_ITEM_INDEX(12,40) && ItemID != GET_ITEM_INDEX(12,41)
  311. && ItemID != GET_ITEM_INDEX(12,42) && ItemID != GET_ITEM_INDEX(12,43)
  312. && ItemID != CUSTOM_WINGS_INX(ItemID) // -> Fix Custom Wings ?
  313. && ItemID != GET_ITEM_INDEX(13,37)) // -> Fix Fenrir
  314. {
  315. return MISCEL_ITEM;
  316. }
  317. else if(ItemID >= GET_ITEM_INDEX(12,0) && ItemID <= GET_ITEM_INDEX(12,6)
  318. && ItemID >= GET_ITEM_INDEX(12,36) && ItemID <= GET_ITEM_INDEX(12,43)
  319. || ItemID == CUSTOM_WINGS_INX(ItemID)) // -> Fix Custom Wings ?
  320. {
  321. return WINGS_ITEM;
  322. }
  323. // ----
  324. return NORMAL_ITEM;
  325. }
  326. }
  327. // ----
  328. return NORMAL_ITEM;
  329. }
  330.  
  331. #pragma optimize("t",on)
  332. void MASM cToolTip::Option()
  333. {
  334. static WORD wIsOptionItem;
  335. static DWORD dwBuffer;
  336. // ----
  337. _asm
  338. {
  339. MOV wIsOptionItem,CX
  340. MOV dwGetItemLevel_Target,EBP
  341. }
  342. // ----
  343. if(wIsOptionItem >= GET_ITEM_INDEX(0,0) && wIsOptionItem <= GET_ITEM_INDEX(15,511))
  344. {
  345. if(wIsOptionItem == GET_ITEM_INDEX(13,36) && dwGetItemLevel_Target >= 0) // -> Static Fix
  346. {
  347. gItem.AddText("Fenrir's horn can be made through item combination.",TextListColor::Yellow,TextBold::Normal);
  348. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  349. }
  350. else if(wIsOptionItem == GET_ITEM_INDEX(13,37) && gItem.bIsRedFenrir == TRUE)
  351. {
  352. gItem.AddText("Plasma Storm Skill (Mana:50)",TextListColor::Blue,TextBold::Normal);
  353. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  354. gItem.AddText("Can be used to Summon Fenrir",TextListColor::Yellow,TextBold::Normal);
  355. }
  356. else if(wIsOptionItem == GET_ITEM_INDEX(13,37) && gItem.bIsBlackFenrir == TRUE)
  357. {
  358. gItem.AddText("Plasma Storm Skill (Mana:50)",TextListColor::Blue,TextBold::Normal);
  359. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  360. gItem.AddText("Increase +10%% of Final Damage",TextListColor::Blue,TextBold::Normal);
  361. gItem.AddText("Increase Moving Speed",TextListColor::Blue,TextBold::Normal);
  362. gItem.AddText("Can be used to Summon Fenrir",TextListColor::Yellow,TextBold::Normal);
  363. }
  364. else if(wIsOptionItem == GET_ITEM_INDEX(13,37) && gItem.bIsBlueFenrir == TRUE)
  365. {
  366. gItem.AddText("Plasma Storm Skill (Mana:50)",TextListColor::Blue,TextBold::Normal);
  367. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  368. gItem.AddText("Absorbs +10%% of Final Damage",TextListColor::Blue,TextBold::Normal);
  369. gItem.AddText("Increase Moving Speed",TextListColor::Blue,TextBold::Normal);
  370. gItem.AddText("Can be used to Summon Fenrir",TextListColor::Yellow,TextBold::Normal);
  371. }
  372. else if(wIsOptionItem == GET_ITEM_INDEX(13,37) && gItem.bIsGoldenFenrir == TRUE)
  373. {
  374. gItem.AddText("Plasma Storm Skill (Mana:50)",TextListColor::Blue,TextBold::Normal);
  375. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  376. gItem.AddText("200 HP Increased",TextListColor::Blue,TextBold::Normal);
  377. gItem.AddText("200 Mana Increased",TextListColor::Blue,TextBold::Normal);
  378. gItem.AddText("33 Attack Power Increased",TextListColor::Blue,TextBold::Normal);
  379. gItem.AddText("16 Wizardry Increased",TextListColor::Blue,TextBold::Normal);
  380. gItem.AddText("This is specially designed for the Heroes of MU",TextListColor::Green,TextBold::Normal);
  381. gItem.AddText("who have Success on the Illusion Temple Event",TextListColor::Green,TextBold::Normal);
  382. gItem.AddText("Can be used to Summon Fenrir",TextListColor::Yellow,TextBold::Normal);
  383. }
  384. else if(wIsOptionItem == GET_ITEM_INDEX(13,37) && gItem.bIsOrangeFenrir == TRUE)
  385. {
  386. gItem.AddText("Plasma Storm Skill (Mana:50)",TextListColor::Blue,TextBold::Normal);
  387. gItem.AddText("\n",TextListColor::White,TextBold::Normal);
  388. gItem.AddText("300 HP Increased",TextListColor::Blue,TextBold::Normal);
  389. gItem.AddText("300 Mana Increased",TextListColor::Blue,TextBold::Normal);
  390. gItem.AddText("66 Attack Power Increased",TextListColor::Blue,TextBold::Normal);
  391. gItem.AddText("32 Wizardry Increased",TextListColor::Blue,TextBold::Normal);
  392. gItem.AddText("This is a Special Edition maded for VIP's",TextListColor::Orange,TextBold::Normal);
  393. gItem.AddText("Legendary Fenrir of the Destiny Protector of Cities.",TextListColor::Orange,TextBold::Normal);
  394. gItem.AddText("Can be used to Summon Fenrir",TextListColor::Yellow,TextBold::Normal);
  395. }
  396. else
  397. {
  398. if((gToolTip.ItemCanHaveOptions(wIsOptionItem)==WEAPON_ITEM)
  399. || (gToolTip.ItemCanHaveOptions(wIsOptionItem)==ARMORS_ITEM)
  400. || (gToolTip.ItemCanHaveOptions(wIsOptionItem)==WINGS_ITEM))
  401. {
  402. gToolTip.SetText(wIsOptionItem,dwGetItemLevel_Target);
  403. }
  404. }
  405. // ----
  406. _asm
  407. {
  408. MOV dwBuffer,0x00592250
  409. JMP dwBuffer
  410. }
  411. }
  412. }
  413. #pragma optimize("t",off)
  414.  
  415. #pragma optimize("t",on)
  416. void MASM cToolTip::AddDesc()
  417. {
  418. static WORD wItemAddDescPointer;
  419. static DWORD dwItemAddDescBuffer=0x00590D51;
  420. // ----
  421. _asm
  422. {
  423. MOV wItemAddDescPointer,CX
  424. MOV dwGetItemLevel_Target,EBP
  425. }
  426. // ----
  427. if(wItemAddDescPointer == GET_ITEM_INDEX(14,21) && dwGetItemLevel_Target == 0)
  428. {
  429. gItem.AddText("It is used to exchange with Golden Archer",TextListColor::White,TextBold::Normal);
  430. }
  431. else if(wItemAddDescPointer == GET_ITEM_INDEX(14,21) && dwGetItemLevel_Target == 1)
  432. {
  433. gItem.AddText("Event stone",TextListColor::White,TextBold::Normal);
  434. }
  435. else if(wItemAddDescPointer == GET_ITEM_INDEX(14,21) && dwGetItemLevel_Target == 2)
  436. {
  437. gItem.AddText("Event item",TextListColor::White,TextBold::Normal);
  438. }
  439. else if(wItemAddDescPointer == GET_ITEM_INDEX(14,21) && dwGetItemLevel_Target >= 3)
  440. {
  441. gItem.AddText("Use in siege registration",TextListColor::White,TextBold::Normal);
  442. }
  443. else if(wItemAddDescPointer == GET_ITEM_INDEX(14,29) && dwGetItemLevel_Target >=0)
  444. {
  445. gItem.AddText("Merged according to the Count:",TextListColor::Yellow,TextBold::Normal);
  446. }
  447. else
  448. {
  449. if((gToolTip.ItemCanHaveOptions(wItemAddDescPointer)==MISCEL_ITEM)
  450. || (gToolTip.ItemCanHaveOptions(wItemAddDescPointer)==EVENTS_ITEM))
  451. {
  452. gToolTip.SetDesc(wItemAddDescPointer,dwGetItemLevel_Target);
  453. }
  454. }
  455. // ----
  456. _asm
  457. {
  458. JMP dwItemAddDescBuffer
  459. }
  460. }
  461. #pragma optimize("t",off)
  462.  
  463. int cToolTip::GetItemNameColorFloor(DWORD ItemID)
  464. {
  465. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  466. {
  467. if(ItemID == GET_OBJECT_INDEX(this->m_ToolTip[i].Type,this->m_ToolTip[i].Index))
  468. {
  469. if(this->m_ToolTip[i].TitleFloorColor!=NONE)
  470. {
  471. return this->m_ToolTip[i].TitleFloorColor;
  472. }
  473. }
  474. }
  475. // ----
  476. return NONE;
  477. }
  478.  
  479. void cToolTip::ItemNameColorDrop(INT ColorID)
  480. {
  481. if(ColorID == eFloorWhite)
  482. {
  483. // Red
  484. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  485. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  486. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  487. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  488. // Green
  489. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  490. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x80);
  491. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  492. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  493. // Blue
  494. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  495. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x80);
  496. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  497. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  498. }
  499. if(ColorID == eFloorBlue) // -> Blue Item Name
  500. {
  501. // Red
  502. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  503. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x00);
  504. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  505. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  506. // Green
  507. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  508. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x33);
  509. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x33);
  510. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x33);
  511. // Blue
  512. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  513. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x80);
  514. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  515. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  516. }
  517. if(ColorID == eFloorRed) // -> Red Item Name
  518. {
  519. // Red
  520. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  521. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  522. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  523. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  524. // Green
  525. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3E);
  526. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x4C);
  527. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  528. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  529. // Blue
  530. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3D);
  531. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0xCC);
  532. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  533. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  534. }
  535. if(ColorID == eFloorYellow) // -> Yellow Item Name
  536. {
  537. // Red
  538. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  539. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  540. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  541. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  542. // Green
  543. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  544. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x4C);
  545. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  546. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  547. // Blue
  548. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3D);
  549. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0xCC);
  550. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  551. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  552. }
  553. if(ColorID == eFloorGreen) // -> Green Item Name
  554. {
  555. // Red
  556. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3D);
  557. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0xCC);
  558. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0xCC);
  559. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xCD);
  560. // Green
  561. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  562. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x80);
  563. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  564. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  565. // Blue
  566. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  567. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x00);
  568. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  569. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  570. }
  571. if(ColorID == eFloorPurple) // -> Purple Item Name
  572. {
  573. // Red
  574. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  575. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  576. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  577. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  578. // Green
  579. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3D);
  580. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xCC);
  581. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  582. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  583. // Blue
  584. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  585. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x80);
  586. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  587. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  588. }
  589. if(ColorID == eFloorGray) // -> Gray Item Name
  590. {
  591. // Red
  592. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3E);
  593. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0xCC);
  594. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0xCC);
  595. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xCD);
  596. // Green
  597. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3E);
  598. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xCC);
  599. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  600. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  601. // Blue
  602. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3E);
  603. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0xCC);
  604. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  605. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  606. }
  607. if(ColorID == eFloorGray) // -> Gray Item Name
  608. {
  609. // Red
  610. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3E);
  611. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0xCC);
  612. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0xCC);
  613. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xCD);
  614. // Green
  615. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3E);
  616. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xCC);
  617. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  618. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  619. // Blue
  620. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3E);
  621. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0xCC);
  622. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  623. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  624. }
  625. if(ColorID == eFloorViolet) // -> Violet Item Name
  626. {
  627. // Red
  628. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  629. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x4C);
  630. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0xCC);
  631. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xCD);
  632. // Green
  633. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  634. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x00);
  635. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  636. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  637. // Blue
  638. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  639. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x4C);
  640. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  641. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  642. }
  643. if(ColorID == eFloorDarkViolet) // -> Dark Violet Item Name
  644. {
  645. // Red
  646. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  647. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x33);
  648. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x33);
  649. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x33);
  650. // Green
  651. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3E);
  652. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xCC);
  653. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  654. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  655. // Blue
  656. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  657. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x80);
  658. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  659. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  660. }
  661. if(ColorID == eFloorOrange) // -> Orange Item Name
  662. {
  663. // Red
  664. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  665. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  666. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  667. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  668. // Green
  669. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  670. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x04);
  671. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x46);
  672. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x74);
  673. // Blue
  674. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x00);
  675. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x00);
  676. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  677. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  678. }
  679. if(ColorID == eFloorLightBlue) // -> Light Blue Item Name
  680. {
  681. // Red
  682. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3E);
  683. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0xCC);
  684. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0xCC);
  685. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xCD);
  686. // Green
  687. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  688. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x80);
  689. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  690. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  691. // Blue
  692. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  693. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x70);
  694. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xA3);
  695. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xD7);
  696. }
  697. if(ColorID == eFloorLightPink) // -> Light Pink Item Name
  698. {
  699. // Red
  700. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  701. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x58);
  702. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x71);
  703. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0xEC);
  704. // Green
  705. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  706. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x35);
  707. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x46);
  708. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x0B);
  709. // Blue
  710. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  711. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x5F);
  712. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xBE);
  713. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x77);
  714. }
  715. if(ColorID == eFloorPink) // -> Pink Item Name
  716. {
  717. // Red
  718. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  719. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x73);
  720. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x33);
  721. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x33);
  722. // Green
  723. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3E);
  724. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xF8);
  725. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x10);
  726. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x62);
  727. // Blue
  728. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  729. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x47);
  730. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x80);
  731. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x34);
  732. }
  733. if(ColorID == eFloorDarkBlue) // -> Dark Blue Item Name
  734. {
  735. // Red
  736. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3D);
  737. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x3D);
  738. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x3C);
  739. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x36);
  740. // Green
  741. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3D);
  742. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x6E);
  743. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCB);
  744. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xFB);
  745. // Blue
  746. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  747. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x45);
  748. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x1E);
  749. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xB8);
  750. }
  751. if(ColorID == eFloorLime) // -> Lime Item Name
  752. {
  753. // Red
  754. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  755. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x33);
  756. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x33);
  757. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x33);
  758. // Green
  759. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  760. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x80);
  761. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  762. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  763. // Blue
  764. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3D);
  765. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0xCC);
  766. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xCC);
  767. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0xCD);
  768. }
  769. if(ColorID == eFloorMagenta) // -> Magenta Item Name
  770. {
  771. // Red
  772. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  773. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  774. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  775. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  776. // Green
  777. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3D);
  778. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0xCC);
  779. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0xCC);
  780. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0xCD);
  781. // Blue
  782. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3E);
  783. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x9E);
  784. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0xB8);
  785. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x52);
  786. }
  787. // ----
  788. if(ColorID == eFloorWhiteRed||ColorID == eFloorWhiteBlue
  789. ||ColorID == eFloorWhiteBeige||ColorID == eFloorGreenBlue
  790. ||ColorID == eFloorLastColor)
  791. {
  792. // Red
  793. gToolKit.SetByte((PVOID)(oItemNameColorR+4),0x3F);
  794. gToolKit.SetByte((PVOID)(oItemNameColorR+3),0x80);
  795. gToolKit.SetByte((PVOID)(oItemNameColorR+2),0x00);
  796. gToolKit.SetByte((PVOID)(oItemNameColorR+1),0x00);
  797. // Green
  798. gToolKit.SetByte((PVOID)(oItemNameColorG+4),0x3F);
  799. gToolKit.SetByte((PVOID)(oItemNameColorG+3),0x80);
  800. gToolKit.SetByte((PVOID)(oItemNameColorG+2),0x00);
  801. gToolKit.SetByte((PVOID)(oItemNameColorG+1),0x00);
  802. // Blue
  803. gToolKit.SetByte((PVOID)(oItemNameColorB+4),0x3F);
  804. gToolKit.SetByte((PVOID)(oItemNameColorB+3),0x80);
  805. gToolKit.SetByte((PVOID)(oItemNameColorB+2),0x00);
  806. gToolKit.SetByte((PVOID)(oItemNameColorB+1),0x00);
  807. }
  808. }
  809.  
  810. INT iNameFloorSelected;
  811. BOOL bNameFloorSwitcher;
  812.  
  813. #pragma optimize("t",on)
  814. void MASM cToolTip::NameFloor()
  815. {
  816. static DWORD dwItemNameFloorPointer;
  817. static DWORD dwItemNameFloorBuffer;
  818. // ----
  819. iNameFloorSelected=NONE;
  820. bNameFloorSwitcher=FALSE;
  821. // ----
  822. _asm
  823. {
  824. MOV dwItemNameFloorPointer,EAX
  825. }
  826. // ----
  827. if(dwItemNameFloorPointer == ObjectDivineArchangelSword)
  828. {
  829. iNameFloorSelected=eFloorPurple;
  830. bNameFloorSwitcher=TRUE;
  831. }
  832. else if(gToolTip.GetItemNameColorFloor(dwItemNameFloorPointer))
  833. {
  834. iNameFloorSelected=gToolTip.GetItemNameColorFloor(dwItemNameFloorPointer);
  835. bNameFloorSwitcher=TRUE;
  836. }
  837. // ----
  838. if(iNameFloorSelected == NONE)
  839. {
  840. bNameFloorSwitcher=FALSE;
  841. }
  842. // ----
  843. if(bNameFloorSwitcher==TRUE)
  844. {
  845. gToolTip.ItemNameColorDrop(iNameFloorSelected);
  846. // ----
  847. _asm
  848. {
  849. MOV dwItemNameFloorBuffer,oItemDivineNameOnFloor_Allowed
  850. JMP dwItemNameFloorBuffer
  851. }
  852. }
  853. else
  854. {
  855. _asm
  856. {
  857. MOV dwItemNameFloorBuffer,oItemDivineNameOnFloor_Return
  858. JMP dwItemNameFloorBuffer
  859. }
  860. }
  861. }
  862. #pragma optimize("t",off)
  863.  
  864. void cToolTip::InitOption()
  865. {
  866. gToolKit.SetRange((LPVOID)0x00590D0B,70,ASM::NOP);
  867. gToolKit.SetJmp((LPVOID)0x00590D0B,this->AddDesc);
  868. // ----
  869. gToolKit.SetRange((LPVOID)0x00592249,7,ASM::NOP);
  870. gToolKit.SetJmp((LPVOID)0x00592249,this->Option);
  871. // ----
  872. gToolKit.SetRange((LPVOID)0x0058B60D,10,ASM::NOP);
  873. gToolKit.SetJmp((LPVOID)0x0058B60D,this->Name);
  874. // ----
  875. gToolKit.SetRange((LPVOID)0x00587A45,10,ASM::NOP);
  876. gToolKit.SetJmp((LPVOID)0x00587A45,this->AddColor);
  877. // ----
  878. gToolKit.SetRange((LPVOID)oItemDivineNameOnFloor_Hook,11,ASM::NOP);
  879. gToolKit.SetJmp((LPVOID)oItemDivineNameOnFloor_Hook,this->NameFloor);
  880. }
  881.  
  882. void cToolTip::Load()
  883. {
  884. if(gEncode.Load(XVT_TOOLTIP_FILE))
  885. {
  886. WZSMDToken Token = gEncode.GetToken();
  887. // ----
  888. if((Token==END)||(gEncode.GetInt()!=NULL))
  889. {
  890. MessageBox(NULL,XVT_MSG_ITEM_TOOLTIP_BAD,MSG_HEAD_ERROR,MB_OK);
  891. ExitProcess(NULL);
  892. }
  893. // ----
  894. this->Init();
  895. // ----
  896. for(int i=0;i<MAX_CUSTOM_ITEMS;i++)
  897. {
  898. Token = gEncode.GetToken();
  899. // ----
  900. if(Token==END||lstrcmpi(gEncode.GetString(),"end")==NULL)
  901. {
  902. break;
  903. }
  904. // ----
  905. this->m_ToolTip[i].Type = gEncode.GetInt();
  906. // ----
  907. Token = gEncode.GetToken();
  908. this->m_ToolTip[i].Index = gEncode.GetInt();
  909. // ----
  910. Token = gEncode.GetToken();
  911. this->m_ToolTip[i].TitleColor = gEncode.GetInt();
  912. // ----
  913. Token = gEncode.GetToken();
  914. this->m_ToolTip[i].TitleFloorColor = gEncode.GetInt();
  915. }
  916. // ----
  917. Token = gEncode.GetToken();
  918. // ----
  919. if((Token==END)||(gEncode.GetInt()!=1))
  920. {
  921. MessageBox(NULL,XVT_MSG_ITEM_TOOLTIP_BAD2,MSG_HEAD_ERROR,MB_OK);
  922. ExitProcess(NULL);
  923. }
  924. // ----
  925. this->Count = NULL;
  926. memset(this->m_Text,0,sizeof(this->m_Text));
  927. // ----
  928. int Type = NULL;
  929. int Index = NULL;
  930. // ----
  931. while(TRUE)
  932. {
  933. Token = gEncode.GetToken();
  934. // ----
  935. if((Token == END)) break;
  936. // ----
  937. Type = gEncode.GetInt();
  938. // ----
  939. Token = gEncode.GetToken();
  940. Index = gEncode.GetInt();
  941. // ----
  942. this->m_Text[this->Count].ItemId = GET_ITEM_INDEX(Type,Index);
  943. // ----
  944. Token = gEncode.GetToken();
  945. this->m_Text[this->Count].ItemLvl = gEncode.GetInt();
  946. // ----
  947. Token = gEncode.GetToken();
  948. this->m_Text[this->Count].Line = gEncode.GetInt();
  949. // ----
  950. Token = gEncode.GetToken();
  951. memcpy(this->m_Text[this->Count].Text,gEncode.GetString(),sizeof(this->m_Text[this->Count].Text));
  952. // ----
  953. Token = gEncode.GetToken();
  954. this->m_Text[this->Count].Weight = gEncode.GetInt();
  955. // ----
  956. Token = gEncode.GetToken();
  957. this->m_Text[this->Count].Color = gEncode.GetInt();
  958. // ----
  959. this->Count++;
  960. }
  961. // ----
  962. gEncode.Close();
  963. // ----
  964. if(this->Count>NULL)
  965. {
  966. this->InitOption();
  967. }
  968. }
  969. else
  970. {
  971. MessageBox(NULL,XVT_MSG_ITEM_TOOLTIP_NOT_FOUND,MSG_HEAD_ERROR,MB_OK);
  972. ExitProcess(NULL);
  973. }
  974. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement