1. import ui, localeInfo, uiScriptLocale
  2. import chr, app, skill, player, uiToolTip
  3. import uiCommon, constInfo, net, math
  4. from _weakref import proxy
  5. import wndMgr
  6. overInImage = None
  7. affectDict={}
  8. def TypeToAffect(affect):
  9. _dict = {
  10. chr.AFFECT_JEONGWI : 3,
  11. chr.AFFECT_GEOMGYEONG : 4,
  12. chr.AFFECT_CHEONGEUN : 19,
  13. chr.AFFECT_GYEONGGONG : 49,
  14. chr.AFFECT_EUNHYEONG : 34,
  15. chr.AFFECT_GWIGEOM : 63,
  16. chr.AFFECT_GONGPO : 64,
  17. chr.AFFECT_JUMAGAP : 65,
  18. chr.AFFECT_HOSIN : 94,
  19. chr.AFFECT_BOHO : 95,
  20. chr.AFFECT_KWAESOK : 110,
  21. chr.AFFECT_HEUKSIN : 79,
  22. chr.AFFECT_MUYEONG : 78,
  23. chr.AFFECT_GICHEON : 96,
  24. chr.AFFECT_JEUNGRYEOK : 111,
  25. chr.AFFECT_PABEOP : 66,
  26. }
  27. return _dict[affect] if _dict.has_key(affect) else affect
  28. class LovePointImage(ui.ExpandedImageBoxWheel):
  29. def __del__(self):
  30. ui.ExpandedImageBoxWheel.__del__(self)
  31. def __init__(self):
  32. ui.ExpandedImageBoxWheel.__init__(self)
  33. self.loverName = ""
  34. self.lovePoint = 0
  35. def SetLoverInfo(self, name, lovePoint):
  36. self.loverName = name
  37. self.lovePoint = lovePoint
  38. self.__Refresh()
  39. def OnUpdateLovePoint(self, lovePoint):
  40. self.lovePoint = lovePoint
  41. self.__Refresh()
  42. def __Refresh(self):
  43. self.lovePoint = max(0, self.lovePoint)
  44. self.lovePoint = min(100, self.lovePoint)
  45. loveGrade = 0 if 0 == self.lovePoint else self.lovePoint / 25 + 1
  46. FILE_PATH = "d:/ymir work/ui/pattern/LovePoint/"
  47. FILE_DICT = {
  48. 0 : FILE_PATH + "01.dds",
  49. 1 : FILE_PATH + "02.dds",
  50. 2 : FILE_PATH + "02.dds",
  51. 3 : FILE_PATH + "03.dds",
  52. 4 : FILE_PATH + "04.dds",
  53. 5 : FILE_PATH + "05.dds",
  54. }
  55. fileName = self.FILE_DICT.get(loveGrade, self.FILE_PATH+"00.dds")
  56. try:
  57. self.LoadImage(fileName)
  58. self.SetScale(0.7, 0.7)
  59. except:
  60. import dbg
  61. dbg.TraceError("LovePointImage.SetLoverInfo(lovePoint=%d) - LoadError %s" % (self.lovePoint, fileName))
  62. def OnMouseOverIn(self):
  63. interface = constInfo.GetInterfaceInstance()
  64. if interface:
  65. tooltipItem = interface.tooltipItem
  66. if tooltipItem:
  67. tooltipItem.ClearToolTip()
  68. tooltipItem.AutoAppendNewTextLineResize(self.loverName, 0xffE9E7D2)
  69. tooltipItem.AppendSpace(5)
  70. tooltipItem.AutoAppendNewTextLineResize(localeInfo.AFF_LOVE_POINT % self.lovePoint)
  71. tooltipItem.ShowToolTip()
  72. def OnMouseOverOut(self):
  73. interface = constInfo.GetInterfaceInstance()
  74. if interface:
  75. if interface.tooltipItem:
  76. interface.tooltipItem.HideToolTip()
  77. class HorseImage(ui.ExpandedImageBoxWheel):
  78. def __del__(self):
  79. ui.ExpandedImageBoxWheel.__del__(self)
  80. def __init__(self):
  81. ui.ExpandedImageBoxWheel.__init__(self)
  82. self.descriptions = []
  83. def __GetHorseGrade(self, level):
  84. return 0 if level == 0 else (level-1)/10 + 1
  85. def SetState(self, level, health, battery):
  86. self.descriptions = []
  87. if level>0:
  88. try:
  89. grade = self.__GetHorseGrade(level)
  90. self.__AppendText(localeInfo.LEVEL_LIST[grade])
  91. except IndexError:
  92. return
  93. try:
  94. healthName=localeInfo.HEALTH_LIST[health]
  95. if len(healthName)>0:
  96. self.__AppendText(healthName)
  97. except IndexError:
  98. return
  99. if health>0:
  100. if battery==0:
  101. self.__AppendText(localeInfo.NEEFD_REST)
  102. try:
  103. FILE_PATH = "d:/ymir work/ui/pattern/HorseState/"
  104. FILE_DICT = {
  105. 00 : FILE_PATH+"00.dds",
  106. 01 : FILE_PATH+"00.dds",
  107. 02 : FILE_PATH+"00.dds",
  108. 03 : FILE_PATH+"00.dds",
  109. 10 : FILE_PATH+"10.dds",
  110. 11 : FILE_PATH+"11.dds",
  111. 12 : FILE_PATH+"12.dds",
  112. 13 : FILE_PATH+"13.dds",
  113. 20 : FILE_PATH+"20.dds",
  114. 21 : FILE_PATH+"21.dds",
  115. 22 : FILE_PATH+"22.dds",
  116. 23 : FILE_PATH+"23.dds",
  117. 30 : FILE_PATH+"30.dds",
  118. 31 : FILE_PATH+"31.dds",
  119. 32 : FILE_PATH+"32.dds",
  120. 33 : FILE_PATH+"33.dds",
  121. }
  122. fileName=FILE_DICT[health*10+battery]
  123. except KeyError:
  124. return
  125. try:
  126. self.LoadImage(fileName)
  127. self.SetScale(0.7, 0.7)
  128. except:
  129. return
  130. def __AppendText(self, text):
  131. self.descriptions.append(text)
  132. def OnMouseOverIn(self):
  133. interface = constInfo.GetInterfaceInstance()
  134. if interface:
  135. tooltipItem = interface.tooltipItem
  136. if tooltipItem:
  137. tooltipItem.ClearToolTip()
  138. for text in self.descriptions:
  139. tooltipItem.AutoAppendNewTextLineResize(text)
  140. if len(self.descriptions):
  141. tooltipItem.ShowToolTip()
  142. def OnMouseOverOut(self):
  143. interface = constInfo.GetInterfaceInstance()
  144. if interface:
  145. if interface.tooltipItem:
  146. interface.tooltipItem.HideToolTip()
  147. class AffectImage(ui.ExpandedImageBoxWheel):
  148. def __init__(self):
  149. ui.ExpandedImageBoxWheel.__init__(self)
  150. self.toolTipText = None
  151. self.isSkillAffect = True
  152. self.description = None
  153. self.endTime = 0
  154. self.affect = None
  155. self.isClocked = True
  156. self.isCanRemove=False
  157. self.affectList = []
  158. def SetAffect(self, affect):
  159. self.affect = affect
  160. def GetAffect(self):
  161. return self.affect
  162. def GetSkillIndex(self):
  163. return self.skillIndex
  164. def FormatTime2(self, time):
  165. text = ""
  166. mo = time // (30 * 24 * 3600)
  167. time = time % (30 * 24 * 3600)
  168. d = time // (24 * 3600)
  169. time = time % (24 * 3600)
  170. h = time // 3600
  171. time %= 3600
  172. m = time // 60
  173. time %= 60
  174. s = time
  175. if mo:
  176. text += "%d %s " % (mo, uiScriptLocale.TIME_MONTH)
  177. if d:
  178. text += "%d %s " % (d, uiScriptLocale.OFFLINE_SHOP_DAY_TEXT)
  179. if text or h:
  180. text += uiScriptLocale.MAINTENANCE_TIME_TXT3 % h
  181. if text or m:
  182. text += uiScriptLocale.MAINTENANCE_TIME_TXT1 % m
  183. if text or s:
  184. text += "%d %s " % (s, uiScriptLocale.TIME_SECONDS)
  185. return text[:-1]
  186. def SetDescription(self, description):
  187. self.description = description
  188. def SetDuration(self, duration):
  189. self.endTime = 0
  190. if duration > 0:
  191. self.endTime = app.GetGlobalTimeStamp() + duration
  192. def SetSkillAffectFlag(self, flag):
  193. self.isSkillAffect = flag
  194. def IsSkillAffect(self):
  195. return self.isSkillAffect
  196. def FormatTime(self, seconds):
  197. if seconds <= 0:
  198. return "0s"
  199. m, s = divmod(seconds, 60)
  200. h, m = divmod(m, 60)
  201. d, h = divmod(h, 24)
  202. timeText = ""
  203. if d > 0:
  204. timeText += "{}d".format(d)
  205. timeText += " "
  206. if h > 0:
  207. timeText += "{}h".format(h)
  208. timeText += " "
  209. if m > 0:
  210. timeText += "{}m".format(m)
  211. timeText += " "
  212. if s > 0:
  213. timeText += "{}s".format(s)
  214. return timeText
  215. def AddAffect(self, pointIdx, pointVal):
  216. if not [pointIdx, pointVal] in self.affectList:
  217. self.affectList.append([pointIdx, pointVal])
  218. def RemoveAffect(self, pointIdx, pointVal):
  219. if [pointIdx, pointVal] in self.affectList:
  220. del self.affectList[self.affectList.index([pointIdx, pointVal])]
  221. def OnMouseOverIn(self):
  222. interface = constInfo.GetInterfaceInstance()
  223. if interface:
  224. tooltip = interface.tooltipSkill if self.IsSkillAffect() else interface.tooltipItem
  225. if tooltip:
  226. tooltip.ClearToolTip()
  227. global overInImage, affectDict
  228. overInImage = proxy(self)
  229. affect = TypeToAffect(self.GetAffect()) if self.IsSkillAffect() else self.GetAffect()
  230. if affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
  231. potionType = player.AUTO_POTION_TYPE_HP if affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY else player.AUTO_POTION_TYPE_SP
  232. (isActivated, currentAmount, totalAmount, slotIndex) = player.GetAutoPotionInfo(potionType)
  233. amountPercent = 0.0
  234. try:
  235. amountPercent = (float(currentAmount) / totalAmount) * 100.0
  236. except:
  237. amountPercent = 100.0
  238. tooltip.AutoAppendNewTextLineResize(self.description % amountPercent, 0xffC5C7C4)
  239. else:
  240. affectData = affectDict[affect] if affectDict.has_key(affect) else {}
  241. affectList = affectData["affect"] if affectData.has_key("affect") else []
  242. maxDuration = affectData["duration"] if affectData.has_key("duration") else 0
  243. if self.description:
  244. tooltip.AutoAppendNewTextLineResize(self.description, 0xffE9E7D2)
  245. tooltip.AppendSpace(5)
  246. if self.IsSkillAffect():
  247. try:
  248. tooltip.SetSkillEx(affect)
  249. except:
  250. for data in affectList:
  251. if data[0] != 0 and uiToolTip.ItemToolTip.POINT_DICT.has_key(data[0]):
  252. tooltip.AutoAppendNewTextLineResize(uiToolTip.ItemToolTip.POINT_DICT[data[0]](data[1]), 0xff95A693)
  253. else:
  254. try:
  255. for data in affectList:
  256. if data[0] != 0 and uiToolTip.ItemToolTip.POINT_DICT.has_key(data[0]):
  257. tooltip.AutoAppendNewTextLineResize(uiToolTip.ItemToolTip.POINT_DICT[data[0]](data[1]), 0xff95A693)
  258. except:
  259. pass
  260. if self.endTime > 0:
  261. tooltip.AppendSpace(5)
  262. tooltip.AutoAppendNewTextLineResize("%s: %s" % (localeInfo.LEFT_TIME, self.FormatTime2(self.endTime - app.GetGlobalTimeStamp())), 0xffC5C7C4)
  263. elif maxDuration > 0:
  264. tooltip.AppendSpace(5)
  265. tooltip.AutoAppendNewTextLineResize("%s: %s" % (localeInfo.LEFT_TIME, self.FormatTime2(maxDuration - app.GetGlobalTimeStamp())), 0xffC5C7C4)
  266. if self.isCanRemove or affect == 66:
  267. tooltip.AppendSpace(7)
  268. tooltip.AutoAppendNewTextLineResize(localeInfo.AFFECTSHOWER_REMOVE_TEXT)
  269. tooltip.ShowToolTip()
  270. def OnMouseOverOut(self):
  271. global overInImage
  272. overInImage = None
  273. interface = constInfo.GetInterfaceInstance()
  274. if interface:
  275. if interface.tooltipItem:
  276. interface.tooltipItem.HideToolTip()
  277. if interface.tooltipSkill:
  278. interface.tooltipSkill.HideToolTip()
  279. class AffectShower(ui.Window):
  280. MALL_DESC_IDX_START = 1000
  281. IMAGE_STEP = 29
  282. AFFECT_MAX_NUM = 64
  283. INFINITE_AFFECT_DURATION = 0x1FFFFFFF
  284. END_STRING = "_03"
  285. AFFECT_DATA_DICT = {
  286. chr.AFFECT_POISON : (localeInfo.SKILL_TOXICDIE, "d:/ymir work/ui/skill/common/affect/poison.sub", 4, 0),
  287. chr.AFFECT_SLOW : (localeInfo.SKILL_SLOW, "d:/ymir work/ui/skill/common/affect/slow.sub", 4, 0),
  288. chr.AFFECT_STUN : (localeInfo.SKILL_STUN, "d:/ymir work/ui/skill/common/affect/stun.sub", 4, 0),
  289. chr.AFFECT_ATT_SPEED_POTION : (localeInfo.SKILL_INC_ATKSPD, "d:/ymir work/ui/skill/common/affect/Increase_Attack_Speed.sub", 3, 0),
  290. chr.AFFECT_MOV_SPEED_POTION : (localeInfo.SKILL_INC_MOVSPD, "d:/ymir work/ui/skill/common/affect/Increase_Move_Speed.sub", 3, 0),
  291. chr.AFFECT_FISH_MIND : (localeInfo.SKILL_FISHMIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub", 3, 0),
  292. chr.AFFECT_JEONGWI : (localeInfo.SKILL_JEONGWI, "d:/ymir work/ui/skill/warrior/jeongwi" + END_STRING + ".sub", 2, 0),
  293. chr.AFFECT_GEOMGYEONG : (localeInfo.SKILL_GEOMGYEONG, "d:/ymir work/ui/skill/warrior/geomgyeong" + END_STRING + ".sub", 2, 0),
  294. chr.AFFECT_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun" + END_STRING + ".sub", 2, 0),
  295. chr.AFFECT_GYEONGGONG : (localeInfo.SKILL_GYEONGGONG, "d:/ymir work/ui/skill/assassin/gyeonggong" + END_STRING + ".sub", 2, 0),
  296. chr.AFFECT_EUNHYEONG : (localeInfo.SKILL_EUNHYEONG, "d:/ymir work/ui/skill/assassin/eunhyeong" + END_STRING + ".sub", 2, 0),
  297. chr.AFFECT_GWIGEOM : (localeInfo.SKILL_GWIGEOM, "d:/ymir work/ui/skill/sura/gwigeom" + END_STRING + ".sub", 2, 0),
  298. chr.AFFECT_GONGPO : (localeInfo.SKILL_GONGPO, "d:/ymir work/ui/skill/sura/gongpo" + END_STRING + ".sub", 2, 0),
  299. chr.AFFECT_JUMAGAP : (localeInfo.SKILL_JUMAGAP, "d:/ymir work/ui/skill/sura/jumagap" + END_STRING + ".sub", 2, 0),
  300. chr.AFFECT_HOSIN : (localeInfo.SKILL_HOSIN, "d:/ymir work/ui/skill/shaman/hosin" + END_STRING + ".sub", 2, 0),
  301. chr.AFFECT_BOHO : (localeInfo.SKILL_BOHO, "d:/ymir work/ui/skill/shaman/boho" + END_STRING + ".sub", 2, 0),
  302. chr.AFFECT_KWAESOK : (localeInfo.SKILL_KWAESOK, "d:/ymir work/ui/skill/shaman/kwaesok" + END_STRING + ".sub", 2, 0),
  303. chr.AFFECT_HEUKSIN : (localeInfo.SKILL_HEUKSIN, "d:/ymir work/ui/skill/sura/heuksin" + END_STRING + ".sub", 2, 0),
  304. chr.AFFECT_MUYEONG : (localeInfo.SKILL_MUYEONG, "d:/ymir work/ui/skill/sura/muyeong" + END_STRING + ".sub", 2, 0),
  305. chr.AFFECT_GICHEON : (localeInfo.SKILL_GICHEON, "d:/ymir work/ui/skill/shaman/gicheon" + END_STRING + ".sub", 2, 0),
  306. chr.AFFECT_JEUNGRYEOK : (localeInfo.SKILL_JEUNGRYEOK, "d:/ymir work/ui/skill/shaman/jeungryeok" + END_STRING + ".sub", 2, 0),
  307. chr.AFFECT_PABEOP : (localeInfo.SKILL_PABEOP, "d:/ymir work/ui/skill/sura/pabeop" + END_STRING + ".sub", 2, 0),
  308. chr.AFFECT_FALLEN_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun" + END_STRING + ".sub", 2, 0),
  309. chr.AFFECT_CHINA_FIREWORK : (localeInfo.SKILL_POWERFUL_STRIKE, "d:/ymir work/ui/skill/common/affect/powerfulstrike.sub", 2, 0),
  310. chr.NEW_AFFECT_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",3, 0),
  311. chr.NEW_AFFECT_ITEM_BONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",3, 0),
  312. chr.NEW_AFFECT_SAFEBOX : (localeInfo.TOOLTIP_MALL_SAFEBOX, "d:/ymir work/ui/skill/common/affect/safebox.sub",3, 0),
  313. chr.NEW_AFFECT_AUTOLOOT : (localeInfo.TOOLTIP_MALL_AUTOLOOT, "d:/ymir work/ui/skill/common/affect/autoloot.sub",3, 0),
  314. chr.NEW_AFFECT_FISH_MIND : (localeInfo.TOOLTIP_MALL_FISH_MIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub",3, 0),
  315. chr.NEW_AFFECT_MARRIAGE_FAST : (localeInfo.TOOLTIP_MALL_MARRIAGE_FAST, "d:/ymir work/ui/skill/common/affect/marriage_fast.sub",3, 0),
  316. chr.NEW_AFFECT_GOLD_BONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",3, 0),
  317. chr.NEW_AFFECT_NO_DEATH_PENALTY : (localeInfo.TOOLTIP_APPLY_NO_DEATH_PENALTY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub",3, 0),
  318. chr.NEW_AFFECT_SKILL_BOOK_BONUS : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_BONUS, "d:/ymir work/ui/skill/common/affect/gold_premium.sub", 3, 1),
  319. 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),
  320. chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_hpgauge/05.dds", 3, 2),
  321. chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_spgauge/05.dds", 3, 2),
  322. chr.NEW_AFFECT_DRAGON_SOUL_DECK1 : (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/ui/dragonsoul/buff_ds_sky1.tga"),
  323. chr.NEW_AFFECT_DRAGON_SOUL_DECK2 : (localeInfo.TOOLTIP_DRAGON_SOUL_DECK2, "d:/ymir work/ui/dragonsoul/buff_ds_land1.tga"),
  324. chr.NEW_AFFECT_AUTOHUNT : (localeInfo.TOOLTIP_OTOMATIK_AV, "d:/ymir work/affect/affects_av.tga"),
  325. #chr.NEW_AFFECT_RAMADAN_ABILITY : (localeInfo.NEW_AFFECT_RAMADAN_ABILITY, "icon/item/50183.tga"),
  326. #chr.NEW_AFFECT_NOG_POCKET_ABILITY : (localeInfo.NEW_AFFECT_NOG_POCKET_ABILITY, "icon/item/50216.tga"),
  327. 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),
  328. MALL_DESC_IDX_START+player.POINT_ATT_BONUS : (localeInfo.TOOLTIP_MALL_ATTBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/att_bonus.sub",),
  329. 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),
  330. MALL_DESC_IDX_START+player.POINT_MALL_EXPBONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS, "d:/ymir work/ui/skill/common/affect/exp_new.sub", 3, 0),
  331. MALL_DESC_IDX_START+player.POINT_MALL_ITEMBONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS, "d:/ymir work/ui/skill/common/affect/item_bonus.sub", 3, 0),
  332. MALL_DESC_IDX_START+player.POINT_MALL_GOLDBONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub", 3, 0),
  333. MALL_DESC_IDX_START+player.POINT_CRITICAL_PCT : (localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,"d:/ymir work/ui/skill/common/affect/critical.sub", 3, 0),
  334. 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),
  335. 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),
  336. 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),
  337. }
  338. if app.ENABLE_AFFECT_POLYMORPH_REMOVE:
  339. AFFECT_DATA_DICT[chr.NEW_AFFECT_POLYMORPH] = (localeInfo.POLYMORPH_AFFECT_TOOLTIP, "d:/ymir work/affect/kure.tga")
  340. if app.SKILL_DURATION_COOLDOWN:
  341. AFFECT_DATA_DICT[chr.NEW_AFFECT_COOLDOWN_SKILL] = (localeInfo.NEW_AFFECT_COOLDOWN_SKILL, "d:/ymir work/affect/duration.tga")
  342. if app.ENABLE_PREMIUM_PRIVATE_SHOP:
  343. AFFECT_DATA_DICT[chr.NEW_AFFECT_PREMIUM_PRIVATE_SHOP] = (localeInfo.TOOLTIP_AFFECT_PREMIUM_PRIVATE_SHOP, "d:/ymir work/ui/skill/common/affect/premium_private_shop.sub")
  344. def __del__(self):
  345. ui.Window.__del__(self)
  346. def Destroy(self):
  347. self.ClearAllAffects()
  348. self.serverPlayTime=0
  349. self.clientPlayTime=0
  350. self.lastUpdateTime=0
  351. self.removeAffectDialog = None
  352. global affectDict, overInImage
  353. affectDict={}
  354. overInImage=None
  355. self.horseImage=None
  356. self.lovePointImage=None
  357. def __init__(self):
  358. ui.Window.__init__(self)
  359. self.affectImageDict={}
  360. self.Destroy()
  361. self.SetPosition(10, 10)
  362. self.Show()
  363. def ClearAllAffects(self):
  364. self.horseImage=None
  365. self.lovePointImage=None
  366. self.affectImageDict={}
  367. self.__ArrangeImageList()
  368. def ClearAffects(self):
  369. self.living_affectImageDict={}
  370. for key, image in self.affectImageDict.items():
  371. if not image.IsSkillAffect():
  372. self.living_affectImageDict[key] = image
  373. self.affectImageDict = self.living_affectImageDict
  374. self.__ArrangeImageList()
  375. def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
  376. #print "BINARY_NEW_AddAffect", type, pointIdx, value, duration
  377. if type == chr.NEW_AFFECT_MALL:
  378. affect = self.MALL_DESC_IDX_START + pointIdx
  379. else:
  380. affect = type
  381. global affectDict
  382. affectNew = self.AffectToRealIndex(affect)
  383. affectData = affectDict[affectNew] if affectDict.has_key(affectNew) else {}
  384. affectList = affectData["affect"] if affectData.has_key("affect") else []
  385. maxDuration = 0
  386. maxDuration = affectData["duration"] if affectData.has_key("duration") else 0
  387. if not [pointIdx, value] in affectList:
  388. affectList.append([pointIdx, value])
  389. if duration+app.GetGlobalTimeStamp() > maxDuration:
  390. affectData["duration"] = duration+app.GetGlobalTimeStamp()
  391. affectData["affect"] = affectList
  392. affectDict[affectNew] = affectData
  393. if type < 500 and self.CheckRemoveAffect(type) == False:
  394. return
  395. if self.affectImageDict.has_key(affect):
  396. return
  397. if not self.AFFECT_DATA_DICT.has_key(affect):
  398. return
  399. if type == chr.NEW_AFFECT_AUTOHUNT:
  400. import constInfo
  401. constInfo.autohunt_bonus = 1
  402. 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:
  403. duration = 0
  404. affectData = self.AFFECT_DATA_DICT[affect]
  405. description = affectData[0]
  406. filename = affectData[1]
  407. if pointIdx == player.POINT_MALL_ITEMBONUS or pointIdx == player.POINT_MALL_GOLDBONUS:
  408. value = 1 + float(value) / 100.0
  409. #try:
  410. if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY:
  411. description = description(float(value))
  412. image = AffectImage()
  413. image.SetParent(self)
  414. image.LoadImage(filename)
  415. image.SetDescription(description)
  416. image.SetDuration(duration)
  417. image.SetAffect(affect)
  418. if self.CheckRemoveAffect(affect):
  419. image.isCanRemove=True
  420. image.SetEvent(ui.__mem_func__(self.__OnClickAffect),"mouse_click", affect, description)
  421. isDSAffect = (affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK1 or affect == chr.NEW_AFFECT_DRAGON_SOUL_DECK2)
  422. image.SetScale(1.0 if isDSAffect else 0.7, 1.0 if isDSAffect else 0.7)
  423. image.SetSkillAffectFlag(False)
  424. image.Show()
  425. self.affectImageDict[affect] = image
  426. self.__ArrangeImageList()
  427. #except Exception, e:
  428. # dbg.TraceError("BINARY_NEW_AddAffect : " + str(e))
  429. def BINARY_NEW_RemoveAffect(self, type, pointIdx):
  430. if type == chr.NEW_AFFECT_MALL:
  431. affect = self.MALL_DESC_IDX_START + pointIdx
  432. else:
  433. affect = type
  434. global affectDict
  435. affectNew = self.AffectToRealIndex(affect)
  436. affectData = affectDict[affectNew] if affectDict.has_key(affectNew) else {}
  437. affectList = affectData["affect"] if affectData.has_key("affect") else []
  438. removeIndex = -1
  439. for data in affectList:
  440. if data[0] == pointIdx:
  441. removeIndex = affectList.index(data)
  442. break
  443. if removeIndex != -1:
  444. del affectList[removeIndex]
  445. affectData["affect"] = affectList
  446. affectDict[affectNew] = affectData
  447. self.__RemoveAffect(affect)
  448. self.__ArrangeImageList()
  449. def SetAffect(self, affect):
  450. self.__AppendAffect(affect)
  451. self.__ArrangeImageList()
  452. def ResetAffect(self, affect):
  453. self.__RemoveAffect(affect)
  454. self.__ArrangeImageList()
  455. def SetLoverInfo(self, name, lovePoint):
  456. image = LovePointImage()
  457. image.SetParent(self)
  458. image.SetLoverInfo(name, lovePoint)
  459. self.lovePointImage = image
  460. self.__ArrangeImageList()
  461. def ShowLoverState(self):
  462. if self.lovePointImage:
  463. self.lovePointImage.Show()
  464. self.__ArrangeImageList()
  465. def HideLoverState(self):
  466. if self.lovePointImage:
  467. self.lovePointImage.Hide()
  468. self.__ArrangeImageList()
  469. def ClearLoverState(self):
  470. self.lovePointImage = None
  471. self.__ArrangeImageList()
  472. def OnUpdateLovePoint(self, lovePoint):
  473. if self.lovePointImage:
  474. self.lovePointImage.OnUpdateLovePoint(lovePoint)
  475. def SetHorseState(self, level, health, battery):
  476. if level==0:
  477. self.horseImage=None
  478. else:
  479. image = HorseImage()
  480. image.SetParent(self)
  481. image.SetState(level, health, battery)
  482. image.Show()
  483. self.horseImage=image
  484. self.__ArrangeImageList()
  485. def SetPlayTime(self, playTime):
  486. self.serverPlayTime = playTime
  487. self.clientPlayTime = app.GetTime()
  488. def __AppendAffect(self, affect):
  489. if self.affectImageDict.has_key(affect):
  490. return
  491. try:
  492. affectData = self.AFFECT_DATA_DICT[affect]
  493. except KeyError:
  494. return
  495. name = affectData[0]
  496. filename = affectData[1]
  497. skillIndex = player.AffectIndexToSkillIndex(affect)
  498. if 0 != skillIndex:
  499. name = skill.GetSkillName(skillIndex)
  500. image = AffectImage()
  501. image.SetParent(self)
  502. image.SetSkillAffectFlag(True)
  503. try:
  504. image.LoadImage(filename)
  505. except:
  506. pass
  507. image.SetAffect(affect)
  508. image.SetDescription(name)
  509. if self.CheckRemoveAffect(affect):
  510. image.isCanRemove=True
  511. image.SetEvent(ui.__mem_func__(self.__OnClickAffect),"mouse_click", affect, name)
  512. image.SetScale(0.7, 0.7)
  513. image.Show()
  514. self.affectImageDict[affect] = image
  515. def __RemoveAffect(self, affect):
  516. if not self.affectImageDict.has_key(affect):
  517. return
  518. del self.affectImageDict[affect]
  519. self.__ArrangeImageList()
  520. def get_idx(self, j):
  521. return j[0]
  522. def __ArrangeImageList(self):
  523. imageDict = self.affectImageDict
  524. sortDict = [[] for i in xrange(10)]
  525. if self.lovePointImage:
  526. sortDict[0].append([2, self.lovePointImage])
  527. if self.horseImage:
  528. sortDict[0].append([1,self.horseImage])
  529. for affect, affectImage in self.affectImageDict.iteritems():
  530. affectData = self.AFFECT_DATA_DICT[affect]
  531. yIdx = affectData[2] if len(affectData) > 3 else 1
  532. xIdx = affectData[3] if len(affectData) > 3 else 0
  533. sortDict[yIdx-1].append([xIdx, affectImage])
  534. ySize, xSize, xSizeTotal = (0, 0, 0)
  535. for imageList in sortDict:
  536. isHasImage = False
  537. if len(imageList) > 1:
  538. imageList = sorted(imageList, key= self.get_idx, reverse=False)
  539. for image in imageList:
  540. isHasImage = True
  541. image[1].SetPosition(xSize, ySize)
  542. xSize += self.IMAGE_STEP
  543. if xSize > xSizeTotal:
  544. xSizeTotal = xSize
  545. xSize = 0
  546. if isHasImage:
  547. ySize+=26
  548. self.SetSize(xSizeTotal, ySize)
  549. def OnUpdate(self):
  550. try:
  551. if app.GetGlobalTime() - self.lastUpdateTime > 500:
  552. self.lastUpdateTime = app.GetGlobalTime()
  553. global overInImage
  554. if overInImage:
  555. overInImage.OnMouseOverIn()
  556. except Exception, e:
  557. return
  558. def AffectToRealIndex(self, affect):
  559. _dict = {
  560. 209:chr.AFFECT_POISON,
  561. 211:chr.AFFECT_SLOW,
  562. 210:chr.AFFECT_STUN,
  563. 201:chr.AFFECT_ATT_SPEED_POTION,
  564. 200:chr.AFFECT_MOV_SPEED_POTION,
  565. 208:chr.AFFECT_FISH_MIND,
  566. }
  567. return _dict[affect] if _dict.has_key(affect) else affect
  568. def __OnClickAffect(self, arg, affect, name):
  569. self.removeAffectDialog = uiCommon.QuestionDialog()
  570. self.removeAffectDialog.SetText(localeInfo.AFFECT_REMOVE_QUESTION % name)
  571. self.removeAffectDialog.SetAcceptEvent(lambda arg = True: self.OnCloseRemoveAffect(arg))
  572. self.removeAffectDialog.SetCancelEvent(lambda arg = False: self.OnCloseRemoveAffect(arg))
  573. self.removeAffectDialog.affect = affect
  574. self.removeAffectDialog.Open()
  575. def OnCloseRemoveAffect(self, answer):
  576. if not self.removeAffectDialog:
  577. return
  578. if answer:
  579. net.SendChatPacket("/remove_buff %d"%TypeToAffect(self.removeAffectDialog.affect))
  580. self.removeAffectDialog.Close()
  581. self.removeAffectDialog = None
  582. def CheckRemoveAffect(self, type):
  583. if type == chr.NEW_AFFECT_POLYMORPH:
  584. return True
  585. return True if TypeToAffect(type) != type else False