MrP0wers

uiaffectshower.py

Dec 18th, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.07 KB | None | 0 0
  1. import ui
  2. import localeInfo
  3. import constInfo
  4. import chr
  5. import item
  6. import app
  7. import skill
  8. import player
  9. import uiToolTip
  10. import uiCommon
  11. import math
  12. import net
  13. import chat
  14. import grp
  15.  
  16. from _weakref import proxy
  17.  
  18. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  19. overInImage = None
  20. affectDict={}
  21.  
  22. def TypeToAffect(affect):
  23. _dict = {
  24. chr.AFFECT_JEONGWI : 3,
  25. chr.AFFECT_GEOMGYEONG : 4,
  26. chr.AFFECT_CHEONGEUN : 19,
  27. chr.AFFECT_FALLEN_CHEONGEUN : 19,
  28. chr.AFFECT_GYEONGGONG : 49,
  29. chr.AFFECT_EUNHYEONG : 34,
  30. chr.AFFECT_GWIGEOM : 63,
  31. chr.AFFECT_GONGPO : 64,
  32. chr.AFFECT_JUMAGAP : 65,
  33. chr.AFFECT_HOSIN : 94,
  34. chr.AFFECT_BOHO : 95,
  35. chr.AFFECT_KWAESOK : 110,
  36. chr.AFFECT_HEUKSIN : 79,
  37. chr.AFFECT_MUYEONG : 78,
  38. chr.AFFECT_GICHEON : 96,
  39. chr.AFFECT_JEUNGRYEOK : 111,
  40. chr.AFFECT_PABEOP : 66,
  41. }
  42.  
  43. return _dict[affect] if _dict.has_key(affect) else affect
  44.  
  45. class LovePointImage(ui.ExpandedImageBox):
  46. def __del__(self):
  47. ui.ExpandedImageBox.__del__(self)
  48.  
  49. def __init__(self):
  50. ui.ExpandedImageBox.__init__(self)
  51. self.loverName = ""
  52. self.lovePoint = 0
  53.  
  54. def SetLoverInfo(self, name, lovePoint):
  55. self.loverName = name
  56. self.lovePoint = lovePoint
  57. self.__Refresh()
  58.  
  59. def OnUpdateLovePoint(self, lovePoint):
  60. self.lovePoint = lovePoint
  61. self.__Refresh()
  62.  
  63. def __Refresh(self):
  64. self.lovePoint = max(0, self.lovePoint)
  65. self.lovePoint = min(100, self.lovePoint)
  66.  
  67. loveGrade = 0 if 0 == self.lovePoint else self.lovePoint / 25 + 1
  68.  
  69. FILE_PATH = "d:/ymir work/ui/pattern/LovePoint/"
  70.  
  71. FILE_DICT = {
  72. 0 : FILE_PATH + "01.dds",
  73. 1 : FILE_PATH + "02.dds",
  74. 2 : FILE_PATH + "02.dds",
  75. 3 : FILE_PATH + "03.dds",
  76. 4 : FILE_PATH + "04.dds",
  77. 5 : FILE_PATH + "05.dds",
  78. }
  79.  
  80. fileName = self.FILE_DICT.get(loveGrade, self.FILE_PATH+"00.dds")
  81.  
  82. try:
  83. self.LoadImage(fileName)
  84. self.SetScale(0.7, 0.7)
  85.  
  86. except:
  87. import dbg
  88. dbg.TraceError("LovePointImage.SetLoverInfo(lovePoint=%d) - LoadError %s" % (self.lovePoint, fileName))
  89.  
  90. def OnMouseOverIn(self):
  91. interface = constInfo.GetInterfaceInstance()
  92.  
  93. if interface:
  94. tooltipItem = interface.tooltipItem
  95.  
  96. if tooltipItem:
  97. tooltipItem.ClearToolTip()
  98. tooltipItem.AutoAppendNewTextLineResize(self.loverName, 0xffE9E7D2)
  99. tooltipItem.AppendSpace(5)
  100. tooltipItem.AutoAppendNewTextLineResize(localeInfo.AFF_LOVE_POINT % self.lovePoint)
  101. tooltipItem.ShowToolTip()
  102.  
  103. def OnMouseOverOut(self):
  104. interface = constInfo.GetInterfaceInstance()
  105. if interface:
  106. if interface.tooltipItem:
  107. interface.tooltipItem.HideToolTip()
  108.  
  109. class HorseImage(ui.ExpandedImageBox):
  110. def __del__(self):
  111. ui.ExpandedImageBox.__del__(self)
  112.  
  113. def __init__(self):
  114. ui.ExpandedImageBox.__init__(self)
  115. self.descriptions = []
  116.  
  117. def __GetHorseGrade(self, level):
  118. return 0 if level == 0 else (level-1)/10 + 1
  119.  
  120. def SetState(self, level, health, battery):
  121. self.descriptions = []
  122.  
  123. if level>0:
  124. try:
  125. grade = self.__GetHorseGrade(level)
  126. self.__AppendText(localeInfo.LEVEL_LIST[grade])
  127.  
  128. except IndexError:
  129. return
  130.  
  131. try:
  132. healthName=localeInfo.HEALTH_LIST[health]
  133. if len(healthName)>0:
  134. self.__AppendText(healthName)
  135.  
  136. except IndexError:
  137. return
  138.  
  139. if health>0:
  140. if battery==0:
  141. self.__AppendText(localeInfo.NEEFD_REST)
  142.  
  143. try:
  144. FILE_PATH = "d:/ymir work/ui/pattern/HorseState/"
  145. FILE_DICT = {
  146. 00 : FILE_PATH+"00.dds",
  147. 01 : FILE_PATH+"00.dds",
  148. 02 : FILE_PATH+"00.dds",
  149. 03 : FILE_PATH+"00.dds",
  150. 10 : FILE_PATH+"10.dds",
  151. 11 : FILE_PATH+"11.dds",
  152. 12 : FILE_PATH+"12.dds",
  153. 13 : FILE_PATH+"13.dds",
  154. 20 : FILE_PATH+"20.dds",
  155. 21 : FILE_PATH+"21.dds",
  156. 22 : FILE_PATH+"22.dds",
  157. 23 : FILE_PATH+"23.dds",
  158. 30 : FILE_PATH+"30.dds",
  159. 31 : FILE_PATH+"31.dds",
  160. 32 : FILE_PATH+"32.dds",
  161. 33 : FILE_PATH+"33.dds",
  162. }
  163.  
  164. fileName=FILE_DICT[health*10+battery]
  165.  
  166. except KeyError:
  167. return
  168.  
  169. try:
  170. self.LoadImage(fileName)
  171. self.SetScale(0.7, 0.7)
  172.  
  173. except:
  174. return
  175.  
  176. def __AppendText(self, text):
  177. self.descriptions.append(text)
  178.  
  179. def OnMouseOverIn(self):
  180. interface = constInfo.GetInterfaceInstance()
  181.  
  182. if interface:
  183. tooltipItem = interface.tooltipItem
  184.  
  185. if tooltipItem:
  186. tooltipItem.ClearToolTip()
  187.  
  188. for text in self.descriptions:
  189. tooltipItem.AutoAppendNewTextLineResize(text)
  190.  
  191. if len(self.descriptions):
  192. tooltipItem.ShowToolTip()
  193.  
  194. def OnMouseOverOut(self):
  195. interface = constInfo.GetInterfaceInstance()
  196.  
  197. if interface:
  198. if interface.tooltipItem:
  199. interface.tooltipItem.HideToolTip()
  200.  
  201. class AffectImage(ui.ExpandedImageBox):
  202.  
  203. COLOR_SOCKET_PERMANENT = 0xff00bffd
  204.  
  205. def __init__(self):
  206. ui.ExpandedImageBox.__init__(self)
  207.  
  208. self.toolTipText = None
  209. self.isSkillAffect = False
  210. self.description = None
  211. self.endTime = 0
  212. self.affect = None
  213. self.isClocked = TRUE
  214.  
  215. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  216. self.isCanRemove=False
  217.  
  218. def SetAffect(self, affect):
  219. self.affect = affect
  220.  
  221. def GetAffect(self):
  222. return self.affect
  223.  
  224. def SetDescription(self, description):
  225. self.description = description
  226.  
  227. def SetDuration(self, duration):
  228. self.endTime = 0
  229. if duration > 0:
  230. self.endTime = app.GetGlobalTimeStamp() + duration
  231.  
  232. if not app.ENABLE_RENEWAL_AFFECT_SHOWER:
  233. def SetToolTipText(self, text, x = 0, y = -19):
  234. if not self.toolTipText:
  235. textLine = ui.TextLine()
  236. textLine.SetParent(self)
  237. textLine.SetSize(0, 0)
  238. textLine.SetOutline()
  239. textLine.Hide()
  240.  
  241. self.toolTipText = textLine
  242.  
  243. self.toolTipText.SetText(text)
  244.  
  245. w, h = self.toolTipText.GetTextSize()
  246.  
  247. self.toolTipText.SetPosition(max(0, x + self.GetWidth()/2 - w/2), y)
  248.  
  249. def UpdateAutoPotionDescription(self):
  250. potionType = 0
  251.  
  252. if self.affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
  253. potionType = player.AUTO_POTION_TYPE_HP
  254. else:
  255. potionType = player.AUTO_POTION_TYPE_SP
  256.  
  257. self.SetToolTipText(localeInfo.SOCKET_PERMANENT, 0, 40)
  258.  
  259. def SetClock(self, isClocked):
  260. self.isClocked = isClocked
  261.  
  262. def UpdateDescription(self):
  263. if not self.isClocked:
  264. self.__UpdateDescription2()
  265. return
  266.  
  267. if not self.description:
  268. return
  269.  
  270. toolTip = self.description
  271.  
  272. if self.endTime > 0:
  273. leftTime = localeInfo.SecondToDHM(self.endTime - app.GetGlobalTimeStamp())
  274. toolTip += " (%s : %s)" % (localeInfo.LEFT_TIME, leftTime)
  275.  
  276. self.SetToolTipText(toolTip, 0, 40)
  277.  
  278. def __UpdateDescription2(self):
  279. if not self.description:
  280. return
  281.  
  282. toolTip = self.description
  283. self.SetToolTipText(toolTip, 0, 40)
  284.  
  285. def SetSkillAffectFlag(self, flag):
  286. self.isSkillAffect = flag
  287.  
  288. def IsSkillAffect(self):
  289. return self.isSkillAffect
  290.  
  291. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  292. def FormatTime(self, seconds):
  293. if seconds <= 0:
  294. return "0s"
  295.  
  296. m, s = divmod(seconds, 60)
  297. h, m = divmod(m, 60)
  298. d, h = divmod(h, 24)
  299.  
  300. timeText = ""
  301.  
  302. if d > 0:
  303. timeText += "{}d".format(d)
  304. timeText += " "
  305.  
  306. if h > 0:
  307. timeText += "{}h".format(h)
  308. timeText += " "
  309.  
  310. if m > 0:
  311. timeText += "{}m".format(m)
  312. timeText += " "
  313.  
  314. if s > 0:
  315. timeText += "{}s".format(s)
  316.  
  317. return timeText
  318.  
  319. def AddAffect(self, pointIdx, pointVal):
  320. if not [pointIdx, pointVal] in self.affectList:
  321. self.affectList.append([pointIdx, pointVal])
  322.  
  323. def RemoveAffect(self, pointIdx, pointVal):
  324. if [pointIdx, pointVal] in self.affectList:
  325. del self.affectList[self.affectList.index([pointIdx, pointVal])]
  326.  
  327. def OnMouseOverIn(self):
  328. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  329. interface = constInfo.GetInterfaceInstance()
  330. if interface:
  331. tooltip = interface.tooltipSkill if self.IsSkillAffect() else interface.tooltipItem
  332.  
  333. if tooltip:
  334. tooltip.ClearToolTip()
  335.  
  336. global overInImage, affectDict
  337. overInImage = proxy(self)
  338. affect = TypeToAffect(self.GetAffect()) if self.IsSkillAffect() else self.GetAffect()
  339.  
  340. if affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
  341. tooltip.AutoAppendNewTextLineResize(localeInfo.SOCKET_PERMANENT, self.COLOR_SOCKET_PERMANENT)
  342.  
  343. else:
  344. affectData = affectDict[affect] if affectDict.has_key(affect) else {}
  345. affectList = affectData["affect"] if affectData.has_key("affect") else []
  346. maxDuration = affectData["duration"] if affectData.has_key("duration") else 0
  347.  
  348. if self.description:
  349. tooltip.AutoAppendNewTextLineResize(self.description, 0xffE9E7D2)
  350. tooltip.AppendSpace(5)
  351.  
  352. if self.IsSkillAffect():
  353. try:
  354. tooltip.SetSkillEx(affect)
  355.  
  356. except:
  357. for data in affectList:
  358. if data[0] != 0 and uiToolTip.ItemToolTip.POINT_DICT.has_key(data[0]):
  359. tooltip.AutoAppendNewTextLineResize(uiToolTip.ItemToolTip.POINT_DICT[data[0]](data[1]), 0xff95A693)
  360.  
  361. else:
  362. try:
  363. for data in affectList:
  364. if data[0] != 0 and uiToolTip.ItemToolTip.POINT_DICT.has_key(data[0]):
  365. tooltip.AutoAppendNewTextLineResize(uiToolTip.ItemToolTip.POINT_DICT[data[0]](data[1]), 0xff95A693)
  366.  
  367. except:
  368. pass
  369.  
  370. if self.endTime > 0:
  371. tooltip.AppendSpace(5)
  372. tooltip.AutoAppendNewTextLineResize("%s: %s" % (localeInfo.LEFT_TIME, self.FormatTime(self.endTime - app.GetGlobalTimeStamp())), 0xffC5C7C4)
  373.  
  374. elif maxDuration > 0:
  375. tooltip.AppendSpace(5)
  376. tooltip.AutoAppendNewTextLineResize("%s: %s" % (localeInfo.LEFT_TIME, self.FormatTime(maxDuration - app.GetGlobalTimeStamp())), 0xffC5C7C4)
  377.  
  378. if self.isCanRemove:
  379. tooltip.AppendSpace(7)
  380. tooltip.AutoAppendNewTextLineResize(localeInfo.AFFECTSHOWER_REMOVE_TEXT)
  381.  
  382. tooltip.ShowToolTip()
  383. else:
  384. if self.toolTipText:
  385. self.toolTipText.Show()
  386.  
  387. def OnMouseOverOut(self):
  388. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  389. global overInImage
  390.  
  391. overInImage = None
  392. interface = constInfo.GetInterfaceInstance()
  393.  
  394. if interface:
  395. if interface.tooltipItem:
  396. interface.tooltipItem.HideToolTip()
  397.  
  398. if interface.tooltipSkill:
  399. interface.tooltipSkill.HideToolTip()
  400. else:
  401. if self.toolTipText:
  402. self.toolTipText.Hide()
  403.  
  404. class AffectShower(ui.Window):
  405.  
  406. MALL_DESC_IDX_START = 1000
  407. IMAGE_STEP = 25
  408. AFFECT_MAX_NUM = 32
  409.  
  410. INFINITE_AFFECT_DURATION = 0x1FFFFFFF
  411.  
  412. END_STRING = "_03"
  413.  
  414. AFFECT_DATA_DICT = {
  415.  
  416. chr.AFFECT_POISON : (localeInfo.SKILL_TOXICDIE, "d:/ymir work/ui/skill/common/affect/poison.sub", 4, 0),
  417. chr.AFFECT_SLOW : (localeInfo.SKILL_SLOW, "d:/ymir work/ui/skill/common/affect/slow.sub", 4, 0),
  418. chr.AFFECT_STUN : (localeInfo.SKILL_STUN, "d:/ymir work/ui/skill/common/affect/stun.sub", 4, 0),
  419.  
  420. chr.AFFECT_ATT_SPEED_POTION : (localeInfo.SKILL_INC_ATKSPD, "d:/ymir work/ui/skill/common/affect/Increase_Attack_Speed.sub", 3, 0),
  421. chr.AFFECT_MOV_SPEED_POTION : (localeInfo.SKILL_INC_MOVSPD, "d:/ymir work/ui/skill/common/affect/Increase_Move_Speed.sub", 3, 0),
  422. chr.AFFECT_FISH_MIND : (localeInfo.SKILL_FISHMIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub", 3, 0),
  423.  
  424. chr.AFFECT_JEONGWI : (localeInfo.SKILL_JEONGWI, "d:/ymir work/ui/skill/warrior/jeongwi" + END_STRING + ".sub", 2, 0),
  425. chr.AFFECT_GEOMGYEONG : (localeInfo.SKILL_GEOMGYEONG, "d:/ymir work/ui/skill/warrior/geomgyeong" + END_STRING + ".sub", 2, 0),
  426. chr.AFFECT_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun" + END_STRING + ".sub", 2, 0),
  427. chr.AFFECT_GYEONGGONG : (localeInfo.SKILL_GYEONGGONG, "d:/ymir work/ui/skill/assassin/gyeonggong" + END_STRING + ".sub", 2, 0),
  428. chr.AFFECT_EUNHYEONG : (localeInfo.SKILL_EUNHYEONG, "d:/ymir work/ui/skill/assassin/eunhyeong" + END_STRING + ".sub", 2, 0),
  429. chr.AFFECT_GWIGEOM : (localeInfo.SKILL_GWIGEOM, "d:/ymir work/ui/skill/sura/gwigeom" + END_STRING + ".sub", 2, 0),
  430. chr.AFFECT_GONGPO : (localeInfo.SKILL_GONGPO, "d:/ymir work/ui/skill/sura/gongpo" + END_STRING + ".sub", 2, 0),
  431. chr.AFFECT_JUMAGAP : (localeInfo.SKILL_JUMAGAP, "d:/ymir work/ui/skill/sura/jumagap" + END_STRING + ".sub", 2, 0),
  432. chr.AFFECT_HOSIN : (localeInfo.SKILL_HOSIN, "d:/ymir work/ui/skill/shaman/hosin" + END_STRING + ".sub", 2, 0),
  433. chr.AFFECT_BOHO : (localeInfo.SKILL_BOHO, "d:/ymir work/ui/skill/shaman/boho" + END_STRING + ".sub", 2, 0),
  434. chr.AFFECT_KWAESOK : (localeInfo.SKILL_KWAESOK, "d:/ymir work/ui/skill/shaman/kwaesok" + END_STRING + ".sub", 2, 0),
  435. chr.AFFECT_HEUKSIN : (localeInfo.SKILL_HEUKSIN, "d:/ymir work/ui/skill/sura/heuksin" + END_STRING + ".sub", 2, 0),
  436. chr.AFFECT_MUYEONG : (localeInfo.SKILL_MUYEONG, "d:/ymir work/ui/skill/sura/muyeong" + END_STRING + ".sub", 2, 0),
  437. chr.AFFECT_GICHEON : (localeInfo.SKILL_GICHEON, "d:/ymir work/ui/skill/shaman/gicheon" + END_STRING + ".sub", 2, 0),
  438. chr.AFFECT_JEUNGRYEOK : (localeInfo.SKILL_JEUNGRYEOK, "d:/ymir work/ui/skill/shaman/jeungryeok" + END_STRING + ".sub", 2, 0),
  439. chr.AFFECT_PABEOP : (localeInfo.SKILL_PABEOP, "d:/ymir work/ui/skill/sura/pabeop" + END_STRING + ".sub", 2, 0),
  440. chr.AFFECT_FALLEN_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun" + END_STRING + ".sub", 2, 0),
  441. 28 : (localeInfo.SKILL_FIRE, "d:/ymir work/ui/skill/sura/hwayeom" + END_STRING + ".sub", 2, 0),
  442. chr.AFFECT_CHINA_FIREWORK : (localeInfo.SKILL_POWERFUL_STRIKE, "d:/ymir work/ui/skill/common/affect/powerfulstrike.sub", 2, 0),
  443.  
  444. chr.NEW_AFFECT_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",3, 0),
  445. chr.NEW_AFFECT_ITEM_BONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",3, 0),
  446. chr.NEW_AFFECT_SAFEBOX : (localeInfo.TOOLTIP_MALL_SAFEBOX, "d:/ymir work/ui/skill/common/affect/safebox.sub",3, 0),
  447. chr.NEW_AFFECT_AUTOLOOT : (localeInfo.TOOLTIP_MALL_AUTOLOOT, "d:/ymir work/ui/skill/common/affect/autoloot.sub",3, 0),
  448. chr.NEW_AFFECT_FISH_MIND : (localeInfo.TOOLTIP_MALL_FISH_MIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub",3, 0),
  449. chr.NEW_AFFECT_MARRIAGE_FAST : (localeInfo.TOOLTIP_MALL_MARRIAGE_FAST, "d:/ymir work/ui/skill/common/affect/marriage_fast.sub",3, 0),
  450. chr.NEW_AFFECT_GOLD_BONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",3, 0),
  451. chr.NEW_AFFECT_NO_DEATH_PENALTY : (localeInfo.TOOLTIP_APPLY_NO_DEATH_PENALTY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub",3, 0),
  452.  
  453. chr.NEW_AFFECT_SKILL_BOOK_BONUS : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_BONUS, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 1),
  454. chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_NO_DELAY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 1),
  455.  
  456. chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_hpgauge/05.dds", 3, 2),
  457. chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_spgauge/05.dds", 3, 2),
  458.  
  459. chr.NEW_AFFECT_DRAGON_SOUL_DECK1 : (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/ui/dragonsoul/buff_ds_sky1.tga"),
  460. chr.NEW_AFFECT_DRAGON_SOUL_DECK2 : (localeInfo.TOOLTIP_DRAGON_SOUL_DECK2, "d:/ymir work/ui/dragonsoul/buff_ds_land1.tga"),
  461.  
  462. #chr.AFFECT_FULL_PENDANT : (localeInfo.AFFECT_TOOLTIP_PENDANT, "d:/ymir work/ui/special_equipment/full_pendant.sub"),
  463. #chr.AFFECT_IS_MARRIAGE : (localeInfo.AFFECT_TOOLTIP_MARRIAGE, "d:/ymir work/ui/skill/common/affect/is_marriage.sub"),
  464.  
  465. MALL_DESC_IDX_START+player.POINT_MALL_ATTBONUS : (localeInfo.TOOLTIP_MALL_ATTBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/att_bonus.sub", 3, 0),
  466. MALL_DESC_IDX_START+player.POINT_MALL_DEFBONUS : (localeInfo.TOOLTIP_MALL_DEFBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/def_bonus.sub", 3, 0),
  467. MALL_DESC_IDX_START+player.POINT_MALL_EXPBONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS, "d:/ymir work/ui/skill/common/affect/exp_new.sub", 3, 0),
  468. MALL_DESC_IDX_START+player.POINT_MALL_ITEMBONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS, "d:/ymir work/ui/skill/common/affect/item_bonus.sub", 3, 0),
  469. MALL_DESC_IDX_START+player.POINT_MALL_GOLDBONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub", 3, 0),
  470. MALL_DESC_IDX_START+player.POINT_CRITICAL_PCT : (localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,"d:/ymir work/ui/skill/common/affect/critical.sub", 3, 0),
  471. MALL_DESC_IDX_START+player.POINT_PENETRATE_PCT : (localeInfo.TOOLTIP_APPLY_PENETRATE_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 0),
  472. MALL_DESC_IDX_START+player.POINT_MAX_HP_PCT : (localeInfo.TOOLTIP_MAX_HP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 0),
  473. MALL_DESC_IDX_START+player.POINT_MAX_SP_PCT : (localeInfo.TOOLTIP_MAX_SP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 0),
  474.  
  475. #MALL_DESC_IDX_START+player.POINT_PC_BANG_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/EXP_Bonus_p_on.sub", 3, 0),
  476. #MALL_DESC_IDX_START+player.POINT_PC_BANG_DROP_BONUS: (localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/Item_Bonus_p_on.sub", 3, 0),
  477. }
  478.  
  479. if app.__AUTO_QUQUE_ATTACK__:
  480. AFFECT_DATA_DICT[chr.NEW_AFFECT_AUTO_METIN_FARM] = (localeInfo.NEW_AFFECT_AUTO_METIN_FARM, "icon/item/61400.tga")
  481.  
  482. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  483. AFFECT_DATA_DICT[chr.NEW_AFFECT_POLYMORPH] = (localeInfo.POLYMORPH_AFFECT_TOOLTIP, "icon/item/70104.tga")
  484.  
  485. if app.ENABLE_ALIGNMENT_AFFECT:
  486. AFFECT_DATA_DICT[chr.AFFECT_ALIGNMENT] = (localeInfo.TOOLTIP_AFFECT_ALIGNMENT, "d:/ymir work/ui/game/custom_inventory/alignment_affect.tga")
  487.  
  488. def __del__(self):
  489. ui.Window.__del__(self)
  490.  
  491. def Destroy(self):
  492. self.ClearAllAffects()
  493.  
  494. self.serverPlayTime = 0
  495. self.clientPlayTime = 0
  496. self.lastUpdateTime = 0
  497.  
  498. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  499. self.removeAffectDialog = None
  500. global affectDict, overInImage
  501. affectDict={}
  502. overInImage = None
  503.  
  504. self.horseImage = None
  505. self.lovePointImage = None
  506.  
  507. def __init__(self):
  508. ui.Window.__init__(self)
  509. self.affectImageDict={}
  510. self.Destroy()
  511.  
  512. self.SetPosition(10, 10)
  513. self.Show()
  514.  
  515. def ClearAllAffects(self):
  516. self.horseImage = None
  517. self.lovePointImage = None
  518. self.affectImageDict={}
  519. self.__ArrangeImageList()
  520.  
  521. def ClearAffects(self):
  522. self.living_affectImageDict={}
  523.  
  524. for key, image in self.affectImageDict.items():
  525. if not image.IsSkillAffect():
  526. self.living_affectImageDict[key] = image
  527.  
  528. self.affectImageDict = self.living_affectImageDict
  529. self.__ArrangeImageList()
  530.  
  531. def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
  532. print "BINARY_NEW_AddAffect", type, pointIdx, value, duration
  533.  
  534. if type == chr.NEW_AFFECT_MALL:
  535. affect = self.MALL_DESC_IDX_START + pointIdx
  536. else:
  537. affect = type
  538.  
  539. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  540. global affectDict
  541. affectNew = self.AffectToRealIndex(affect)
  542. affectData = affectDict[affectNew] if affectDict.has_key(affectNew) else {}
  543. affectList = affectData["affect"] if affectData.has_key("affect") else []
  544.  
  545. maxDuration = affectData["duration"] if affectData.has_key("duration") else 0
  546.  
  547. if not [pointIdx, value] in affectList:
  548. affectList.append([pointIdx, value])
  549.  
  550. if duration+app.GetGlobalTimeStamp() > maxDuration:
  551. affectData["duration"] = duration+app.GetGlobalTimeStamp()
  552.  
  553. affectData["affect"] = affectList
  554. affectDict[affectNew] = affectData
  555.  
  556. if type < 500 and self.CheckRemoveAffect(type) == False:
  557. return
  558.  
  559. else:
  560. if type < 500:
  561. return
  562.  
  563. if self.affectImageDict.has_key(affect):
  564. return
  565.  
  566. if not self.AFFECT_DATA_DICT.has_key(affect):
  567. return
  568.  
  569. if affect == chr.NEW_AFFECT_NO_DEATH_PENALTY or affect == chr.NEW_AFFECT_SKILL_BOOK_BONUS or affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY or affect == chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY:
  570. duration = 0
  571.  
  572. affectData = self.AFFECT_DATA_DICT[affect]
  573. description = affectData[0]
  574. filename = affectData[1]
  575.  
  576. if pointIdx == player.POINT_MALL_ITEMBONUS or pointIdx == player.POINT_MALL_GOLDBONUS:
  577. value = 1 + float(value) / 100.0
  578.  
  579. if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY:
  580. if callable(description):
  581. description = description(float(value))
  582.  
  583. image = AffectImage()
  584. image.SetParent(self)
  585. image.LoadImage(filename)
  586. image.SetDescription(description)
  587. image.SetDuration(duration)
  588. image.SetAffect(affect)
  589.  
  590. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  591. if self.CheckRemoveAffect(affect):
  592. image.isCanRemove=True
  593. image.SetEvent(ui.__mem_func__(self.__OnClickAffect),"mouse_click", affect, description)
  594.  
  595. else:
  596. if affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE or affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 or self.INFINITE_AFFECT_DURATION < duration:
  597. image.SetClock(FALSE)
  598. image.UpdateDescription()
  599.  
  600. elif affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
  601. image.UpdateAutoPotionDescription()
  602.  
  603. else:
  604. image.UpdateDescription()
  605.  
  606. isDSAffect = (affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK1 or affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK2)
  607. image.SetScale(1.0 if isDSAffect else 0.7, 1.0 if isDSAffect else 0.7)
  608. image.Show()
  609.  
  610. self.affectImageDict[affect] = image
  611. self.__ArrangeImageList()
  612.  
  613. def BINARY_NEW_RemoveAffect(self, type, pointIdx):
  614. if type == chr.NEW_AFFECT_MALL:
  615. affect = self.MALL_DESC_IDX_START + pointIdx
  616. else:
  617. affect = type
  618.  
  619. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  620. global affectDict
  621.  
  622. affectNew = self.AffectToRealIndex(affect)
  623. affectData = affectDict[affectNew] if affectDict.has_key(affectNew) else {}
  624. affectList = affectData["affect"] if affectData.has_key("affect") else []
  625.  
  626. removeIndex = -1
  627.  
  628. for data in affectList:
  629. if data[0] == pointIdx:
  630. removeIndex = affectList.index(data)
  631. break
  632.  
  633. if removeIndex != -1:
  634. del affectList[removeIndex]
  635. affectData["affect"] = affectList
  636. affectDict[affectNew] = affectData
  637.  
  638. self.__RemoveAffect(affect)
  639. self.__ArrangeImageList()
  640.  
  641. def SetAffect(self, affect):
  642. self.__AppendAffect(affect)
  643. self.__ArrangeImageList()
  644.  
  645. def ResetAffect(self, affect):
  646. self.__RemoveAffect(affect)
  647. self.__ArrangeImageList()
  648.  
  649. def SetLoverInfo(self, name, lovePoint):
  650. image = LovePointImage()
  651. image.SetParent(self)
  652. image.SetLoverInfo(name, lovePoint)
  653.  
  654. self.lovePointImage = image
  655. self.__ArrangeImageList()
  656.  
  657. def ShowLoverState(self):
  658. if self.lovePointImage:
  659. self.lovePointImage.Show()
  660. self.__ArrangeImageList()
  661.  
  662. def HideLoverState(self):
  663. if self.lovePointImage:
  664. self.lovePointImage.Hide()
  665. self.__ArrangeImageList()
  666.  
  667. def ClearLoverState(self):
  668. self.lovePointImage = None
  669. self.__ArrangeImageList()
  670.  
  671. def OnUpdateLovePoint(self, lovePoint):
  672. if self.lovePointImage:
  673. self.lovePointImage.OnUpdateLovePoint(lovePoint)
  674.  
  675. def SetHorseState(self, level, health, battery):
  676. if level==0:
  677. self.horseImage = None
  678.  
  679. else:
  680. image = HorseImage()
  681. image.SetParent(self)
  682. image.SetState(level, health, battery)
  683. image.Show()
  684.  
  685. self.horseImage=image
  686.  
  687. self.__ArrangeImageList()
  688.  
  689. def SetPlayTime(self, playTime):
  690. self.serverPlayTime = playTime
  691. self.clientPlayTime = app.GetTime()
  692.  
  693. def __AppendAffect(self, affect):
  694. if self.affectImageDict.has_key(affect):
  695. return
  696.  
  697. try:
  698. affectData = self.AFFECT_DATA_DICT[affect]
  699.  
  700. except KeyError:
  701. return
  702.  
  703. name = affectData[0]
  704. filename = affectData[1]
  705.  
  706. skillIndex = player.AffectIndexToSkillIndex(affect)
  707. if 0 != skillIndex:
  708. name = skill.GetSkillName(skillIndex)
  709.  
  710. image = AffectImage()
  711. image.SetParent(self)
  712. image.SetSkillAffectFlag(TRUE)
  713.  
  714. try:
  715. image.LoadImage(filename)
  716.  
  717. except:
  718. pass
  719.  
  720. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  721. image.SetAffect(affect)
  722. image.SetDescription(name)
  723.  
  724. if self.CheckRemoveAffect(affect):
  725. image.isCanRemove=True
  726. image.SetEvent(ui.__mem_func__(self.__OnClickAffect),"mouse_click", affect, name)
  727.  
  728. image.SetScale(0.7, 0.7)
  729. image.Show()
  730. self.affectImageDict[affect] = image
  731.  
  732. def __RemoveAffect(self, affect):
  733. if not self.affectImageDict.has_key(affect):
  734. return
  735.  
  736. del self.affectImageDict[affect]
  737. self.__ArrangeImageList()
  738.  
  739. def get_idx(self, j):
  740. return j[0]
  741.  
  742. def __ArrangeImageList(self):
  743. imageDict = self.affectImageDict
  744. sortDict = [[] for i in xrange(10)]
  745. if self.lovePointImage:
  746. sortDict[0].append([2, self.lovePointImage])
  747.  
  748. if self.horseImage:
  749. sortDict[0].append([1,self.horseImage])
  750.  
  751. for affect, affectImage in self.affectImageDict.iteritems():
  752. affectData = self.AFFECT_DATA_DICT[affect]
  753. yIdx = affectData[2] if len(affectData) > 3 else 1
  754. xIdx = affectData[3] if len(affectData) > 3 else 0
  755. sortDict[yIdx-1].append([xIdx, affectImage])
  756.  
  757. ySize, xSize, xSizeTotal = (0, 0, 0)
  758.  
  759. for imageList in sortDict:
  760. isHasImage = False
  761.  
  762. if len(imageList) > 1:
  763. imageList = sorted(imageList, key= self.get_idx, reverse=False)
  764.  
  765. for image in imageList:
  766. isHasImage = True
  767. image[1].SetPosition(xSize, ySize)
  768. xSize += self.IMAGE_STEP
  769.  
  770. if xSize > xSizeTotal:
  771. xSizeTotal = xSize
  772.  
  773. xSize = 0
  774.  
  775. if isHasImage:
  776. ySize+=26
  777.  
  778. self.SetSize(xSizeTotal, ySize)
  779.  
  780. def OnUpdate(self):
  781. try:
  782. if app.GetGlobalTime() - self.lastUpdateTime > 500:
  783. self.lastUpdateTime = app.GetGlobalTime()
  784. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  785. global overInImage
  786.  
  787. if overInImage:
  788. overInImage.OnMouseOverIn()
  789.  
  790. else:
  791. for image in self.affectImageDict.values():
  792. if image.GetAffect() == chr.NEW_AFFECT_AUTO_HP_RECOVERY or image.GetAffect() == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
  793. image.UpdateAutoPotionDescription()
  794. continue
  795.  
  796. if not image.IsSkillAffect():
  797. image.UpdateDescription()
  798.  
  799. except Exception, e:
  800. return
  801.  
  802. if app.ENABLE_RENEWAL_AFFECT_SHOWER:
  803. def AffectToRealIndex(self, affect):
  804. _dict = {
  805. 209:chr.AFFECT_POISON,
  806. 211:chr.AFFECT_SLOW,
  807. 210:chr.AFFECT_STUN,
  808. 201:chr.AFFECT_ATT_SPEED_POTION,
  809. 200:chr.AFFECT_MOV_SPEED_POTION,
  810. 208:chr.AFFECT_FISH_MIND,
  811. }
  812.  
  813. return _dict[affect] if _dict.has_key(affect) else affect
  814.  
  815. def __OnClickAffect(self, arg, affect, name):
  816. self.removeAffectDialog = uiCommon.QuestionDialog()
  817. self.removeAffectDialog.SetText(localeInfo.AFFECT_REMOVE_QUESTION % name)
  818. self.removeAffectDialog.SetAcceptEvent(lambda arg = True: self.OnCloseRemoveAffect(arg))
  819. self.removeAffectDialog.SetCancelEvent(lambda arg = False: self.OnCloseRemoveAffect(arg))
  820. self.removeAffectDialog.affect = affect
  821. self.removeAffectDialog.Open()
  822.  
  823. def OnCloseRemoveAffect(self, answer):
  824. if not self.removeAffectDialog:
  825. return
  826.  
  827. if answer:
  828. net.SendChatPacket("/remove_affect %d"%TypeToAffect(self.removeAffectDialog.affect))
  829.  
  830. self.removeAffectDialog.Close()
  831. self.removeAffectDialog = None
  832.  
  833. def CheckRemoveAffect(self, type):
  834. if type == chr.NEW_AFFECT_POLYMORPH:
  835. return True
  836.  
  837. return True if TypeToAffect(type) != type else False
  838.  
Advertisement
Add Comment
Please, Sign In to add comment