Advertisement
jegarba

uitooltip.py

Nov 13th, 2020
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 99.36 KB | None | 0 0
  1. import dbg
  2. import player
  3. import item
  4. import grp
  5. import wndMgr
  6. import skill
  7. import shop
  8. import exchange
  9. import grpText
  10. import safebox
  11. import localeInfo
  12. import app
  13. import background
  14. import nonplayer
  15. import chr
  16. import player
  17. import ui
  18. import mouseModule
  19. import constInfo
  20. if app.ENABLE_SASH_SYSTEM:
  21.     import sash
  22.  
  23. WARP_SCROLLS = [22011, 22000, 22010]
  24.  
  25. DESC_DEFAULT_MAX_COLS = 26
  26. DESC_WESTERN_MAX_COLS = 35
  27. DESC_WESTERN_MAX_WIDTH = 220
  28.  
  29. def chop(n):
  30.     return round(n - 0.5, 1)
  31.  
  32. def SplitDescription(desc, limit):
  33.     total_tokens = desc.split()
  34.     line_tokens = []
  35.     line_len = 0
  36.     lines = []
  37.     for token in total_tokens:
  38.         if "|" in token:
  39.             sep_pos = token.find("|")
  40.             line_tokens.append(token[:sep_pos])
  41.  
  42.             lines.append(" ".join(line_tokens))
  43.             line_len = len(token) - (sep_pos + 1)
  44.             line_tokens = [token[sep_pos+1:]]
  45.         else:
  46.             line_len += len(token)
  47.             if len(line_tokens) + line_len > limit:
  48.                 lines.append(" ".join(line_tokens))
  49.                 line_len = len(token)
  50.                 line_tokens = [token]
  51.             else:
  52.                 line_tokens.append(token)
  53.    
  54.     if line_tokens:
  55.         lines.append(" ".join(line_tokens))
  56.  
  57.     return lines
  58.  
  59. ###################################################################################################
  60. ## ToolTip
  61. ##
  62. ##   NOTE : ÇöÀç´Â Item°ú SkillÀ» »ó¼ÓÀ¸·Î Ưȭ ½ÃÄѵξúÀ½
  63. ##          ÇÏÁö¸¸ ±×´ÙÁö Àǹ̰¡ ¾ø¾î º¸ÀÓ
  64. ##
  65. class ToolTip(ui.ThinBoard):
  66.  
  67.     TOOL_TIP_WIDTH = 190
  68.     TOOL_TIP_HEIGHT = 10
  69.  
  70.     TEXT_LINE_HEIGHT = 17
  71.  
  72.     TITLE_COLOR = grp.GenerateColor(0.9490, 0.9058, 0.7568, 1.0)
  73.     SPECIAL_TITLE_COLOR = grp.GenerateColor(1.0, 0.7843, 0.0, 1.0)
  74.     NORMAL_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
  75.     FONT_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
  76.     PRICE_COLOR = 0xffFFB96D
  77.  
  78.     HIGH_PRICE_COLOR = SPECIAL_TITLE_COLOR
  79.     MIDDLE_PRICE_COLOR = grp.GenerateColor(0.85, 0.85, 0.85, 1.0)
  80.     LOW_PRICE_COLOR = grp.GenerateColor(0.7, 0.7, 0.7, 1.0)
  81.     GREEN_COLOR_PRICE_FREE = 0xff8EC292
  82.  
  83.     ENABLE_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
  84.     DISABLE_COLOR = grp.GenerateColor(0.9, 0.4745, 0.4627, 1.0)
  85.  
  86.     NEGATIVE_COLOR = grp.GenerateColor(0.9, 0.4745, 0.4627, 1.0)
  87.     POSITIVE_COLOR = grp.GenerateColor(0.5411, 0.7254, 0.5568, 1.0)
  88.     SPECIAL_POSITIVE_COLOR = grp.GenerateColor(0.6911, 0.8754, 0.7068, 1.0)
  89.     SPECIAL_POSITIVE_COLOR2 = grp.GenerateColor(0.8824, 0.9804, 0.8824, 1.0)
  90.  
  91.     CONDITION_COLOR = 0xffBEB47D
  92.     BONUS_COLOR = 0xffE5E58A
  93.     CAN_LEVEL_UP_COLOR = 0xff8EC292
  94.     CANNOT_LEVEL_UP_COLOR = DISABLE_COLOR
  95.     NEED_SKILL_POINT_COLOR = 0xff9A9CDB
  96.  
  97.     def __init__(self, width = TOOL_TIP_WIDTH, isPickable=False):
  98.         ui.ThinBoard.__init__(self, "TOP_MOST")
  99.  
  100.         if isPickable:
  101.             pass
  102.         else:
  103.             self.AddFlag("not_pick")
  104.  
  105.         self.AddFlag("float")
  106.  
  107.         self.followFlag = True
  108.         self.toolTipWidth = width
  109.  
  110.         self.xPos = -1
  111.         self.yPos = -1
  112.  
  113.         self.defFontName = localeInfo.UI_DEF_FONT
  114.         self.ClearToolTip()
  115.  
  116.     def __del__(self):
  117.         ui.ThinBoard.__del__(self)
  118.  
  119.     def ClearToolTip(self):
  120.         self.toolTipHeight = 12
  121.         self.childrenList = []
  122.  
  123.     def SetFollow(self, flag):
  124.         self.followFlag = flag
  125.  
  126.     def SetDefaultFontName(self, fontName):
  127.         self.defFontName = fontName
  128.  
  129.     def AppendSpace(self, size):
  130.         self.toolTipHeight += size
  131.         self.ResizeToolTip()
  132.  
  133.     def AppendHorizontalLine(self):
  134.  
  135.         for i in xrange(2):
  136.             horizontalLine = ui.Line()
  137.             horizontalLine.SetParent(self)
  138.             horizontalLine.SetPosition(0, self.toolTipHeight + 3 + i)
  139.             horizontalLine.SetWindowHorizontalAlignCenter()
  140.             horizontalLine.SetSize(150, 0)
  141.             horizontalLine.Show()
  142.  
  143.             if 0 == i:
  144.                 horizontalLine.SetColor(0xff555555)
  145.             else:
  146.                 horizontalLine.SetColor(0xff000000)
  147.  
  148.             self.childrenList.append(horizontalLine)
  149.  
  150.         self.toolTipHeight += 11
  151.         self.ResizeToolTip()
  152.  
  153.     def AlignHorizonalCenter(self):
  154.         for child in self.childrenList:
  155.             (x, y)=child.GetLocalPosition()
  156.             child.SetPosition(self.toolTipWidth/2, y)
  157.  
  158.         self.ResizeToolTip()
  159.  
  160.     def AutoAppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
  161.         textLine = ui.TextLine()
  162.         textLine.SetParent(self)
  163.         textLine.SetFontName(self.defFontName)
  164.         textLine.SetPackedFontColor(color)
  165.         textLine.SetText(text)
  166.         textLine.SetOutline()
  167.         textLine.SetFeather(False)
  168.         textLine.Show()
  169.  
  170.         if centerAlign:
  171.             textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
  172.             textLine.SetHorizontalAlignCenter()
  173.  
  174.         else:
  175.             textLine.SetPosition(10, self.toolTipHeight)
  176.  
  177.         self.childrenList.append(textLine)
  178.  
  179.         (textWidth, textHeight)=textLine.GetTextSize()
  180.  
  181.         textWidth += 40
  182.         textHeight += 5
  183.  
  184.         if self.toolTipWidth < textWidth:
  185.             self.toolTipWidth = textWidth
  186.  
  187.         self.toolTipHeight += textHeight
  188.  
  189.         return textLine
  190.  
  191.     def AppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
  192.         textLine = ui.TextLine()
  193.         textLine.SetParent(self)
  194.         textLine.SetFontName(self.defFontName)
  195.         textLine.SetPackedFontColor(color)
  196.         textLine.SetText(text)
  197.         textLine.SetOutline()
  198.         textLine.SetFeather(False)
  199.         textLine.Show()
  200.  
  201.         if centerAlign:
  202.             textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
  203.             textLine.SetHorizontalAlignCenter()
  204.  
  205.         else:
  206.             textLine.SetPosition(10, self.toolTipHeight)
  207.  
  208.         self.childrenList.append(textLine)
  209.  
  210.         self.toolTipHeight += self.TEXT_LINE_HEIGHT
  211.         self.ResizeToolTip()
  212.  
  213.         return textLine
  214.  
  215.     def AppendDescription(self, desc, limit, color = FONT_COLOR):
  216.         if localeInfo.IsEUROPE():
  217.             self.__AppendDescription_WesternLanguage(desc, color)
  218.         else:
  219.             self.__AppendDescription_EasternLanguage(desc, limit, color)
  220.  
  221.     def __AppendDescription_EasternLanguage(self, description, characterLimitation, color=FONT_COLOR):
  222.         length = len(description)
  223.         if 0 == length:
  224.             return
  225.  
  226.         lineCount = grpText.GetSplitingTextLineCount(description, characterLimitation)
  227.         for i in xrange(lineCount):
  228.             if 0 == i:
  229.                 self.AppendSpace(5)
  230.             self.AppendTextLine(grpText.GetSplitingTextLine(description, characterLimitation, i), color)
  231.  
  232.     def __AppendDescription_WesternLanguage(self, desc, color=FONT_COLOR):
  233.         lines = SplitDescription(desc, DESC_WESTERN_MAX_COLS)
  234.         if not lines:
  235.             return
  236.  
  237.         self.AppendSpace(5)
  238.         for line in lines:
  239.             self.AppendTextLine(line, color)
  240.            
  241.  
  242.     def ResizeToolTip(self):
  243.         self.SetSize(self.toolTipWidth, self.TOOL_TIP_HEIGHT + self.toolTipHeight)
  244.  
  245.     def SetTitle(self, name):
  246.         self.AppendTextLine(name, self.TITLE_COLOR)
  247.  
  248.     def GetLimitTextLineColor(self, curValue, limitValue):
  249.         if curValue < limitValue:
  250.             return self.DISABLE_COLOR
  251.  
  252.         return self.ENABLE_COLOR
  253.  
  254.     def GetChangeTextLineColor(self, value, isSpecial=False):
  255.         if value > 0:
  256.             if isSpecial:
  257.                 return self.SPECIAL_POSITIVE_COLOR
  258.             else:
  259.                 return self.POSITIVE_COLOR
  260.  
  261.         if 0 == value:
  262.             return self.NORMAL_COLOR
  263.  
  264.         return self.NEGATIVE_COLOR
  265.  
  266.     def SetToolTipPosition(self, x = -1, y = -1):
  267.         self.xPos = x
  268.         self.yPos = y
  269.  
  270.     def ShowToolTip(self):
  271.         self.SetTop()
  272.         self.Show()
  273.  
  274.         self.OnUpdate()
  275.  
  276.     def HideToolTip(self):
  277.         self.Hide()
  278.  
  279.     def OnUpdate(self):
  280.  
  281.         if not self.followFlag:
  282.             return
  283.  
  284.         x = 0
  285.         y = 0
  286.         width = self.GetWidth()
  287.         height = self.toolTipHeight
  288.  
  289.         if -1 == self.xPos and -1 == self.yPos:
  290.  
  291.             (mouseX, mouseY) = wndMgr.GetMousePosition()
  292.  
  293.             if mouseY < wndMgr.GetScreenHeight() - 300:
  294.                 y = mouseY + 40
  295.             else:
  296.                 y = mouseY - height - 30
  297.  
  298.             x = mouseX - width/2               
  299.  
  300.         else:
  301.  
  302.             x = self.xPos - width/2
  303.             y = self.yPos - height
  304.  
  305.         x = max(x, 0)
  306.         y = max(y, 0)
  307.         x = min(x + width/2, wndMgr.GetScreenWidth() - width/2) - width/2
  308.         y = min(y + self.GetHeight(), wndMgr.GetScreenHeight()) - self.GetHeight()
  309.  
  310.         parentWindow = self.GetParentProxy()
  311.         if parentWindow:
  312.             (gx, gy) = parentWindow.GetGlobalPosition()
  313.             x -= gx
  314.             y -= gy
  315.  
  316.         self.SetPosition(x, y)
  317.  
  318. class ItemToolTip(ToolTip):
  319.     if app.ENABLE_SEND_TARGET_INFO:
  320.         isStone = False
  321.         isBook = False
  322.         isBook2 = False
  323.  
  324.     CHARACTER_NAMES = (
  325.         localeInfo.TOOLTIP_WARRIOR,
  326.         localeInfo.TOOLTIP_ASSASSIN,
  327.         localeInfo.TOOLTIP_SURA,
  328.         localeInfo.TOOLTIP_SHAMAN
  329.     )      
  330.  
  331.     CHARACTER_COUNT = len(CHARACTER_NAMES)
  332.     WEAR_NAMES = (
  333.         localeInfo.TOOLTIP_ARMOR,
  334.         localeInfo.TOOLTIP_HELMET,
  335.         localeInfo.TOOLTIP_SHOES,
  336.         localeInfo.TOOLTIP_WRISTLET,
  337.         localeInfo.TOOLTIP_WEAPON,
  338.         localeInfo.TOOLTIP_NECK,
  339.         localeInfo.TOOLTIP_EAR,
  340.         localeInfo.TOOLTIP_UNIQUE,
  341.         localeInfo.TOOLTIP_SHIELD,
  342.         localeInfo.TOOLTIP_ARROW,
  343.     )
  344.     WEAR_COUNT = len(WEAR_NAMES)
  345.  
  346.     AFFECT_DICT_SWITCH = {
  347.         item.APPLY_MAX_HP : localeInfo.TOOLTIP_MAX_HP,
  348.         item.APPLY_MAX_SP : localeInfo.TOOLTIP_MAX_SP,
  349.         item.APPLY_CON : localeInfo.TOOLTIP_CON,
  350.         item.APPLY_INT : localeInfo.TOOLTIP_INT,
  351.         item.APPLY_STR : localeInfo.TOOLTIP_STR,
  352.         item.APPLY_DEX : localeInfo.TOOLTIP_DEX,
  353.         item.APPLY_ATT_SPEED : localeInfo.TOOLTIP_ATT_SPEED,
  354.         item.APPLY_MOV_SPEED : localeInfo.TOOLTIP_MOV_SPEED,
  355.         item.APPLY_CAST_SPEED : localeInfo.TOOLTIP_CAST_SPEED,
  356.         item.APPLY_HP_REGEN : localeInfo.TOOLTIP_HP_REGEN,
  357.         item.APPLY_SP_REGEN : localeInfo.TOOLTIP_SP_REGEN,
  358.         item.APPLY_POISON_PCT : localeInfo.TOOLTIP_APPLY_POISON_PCT,
  359.         item.APPLY_STUN_PCT : localeInfo.TOOLTIP_APPLY_STUN_PCT,
  360.         item.APPLY_SLOW_PCT : localeInfo.TOOLTIP_APPLY_SLOW_PCT,
  361.         item.APPLY_CRITICAL_PCT : localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,
  362.         item.APPLY_PENETRATE_PCT : localeInfo.TOOLTIP_APPLY_PENETRATE_PCT,
  363.         item.APPLY_ATTBONUS_WARRIOR : localeInfo.TOOLTIP_APPLY_ATTBONUS_WARRIOR,
  364.         item.APPLY_ATTBONUS_ASSASSIN : localeInfo.TOOLTIP_APPLY_ATTBONUS_ASSASSIN,
  365.         item.APPLY_ATTBONUS_SURA : localeInfo.TOOLTIP_APPLY_ATTBONUS_SURA,
  366.         item.APPLY_ATTBONUS_SHAMAN : localeInfo.TOOLTIP_APPLY_ATTBONUS_SHAMAN,
  367.         item.APPLY_ATTBONUS_MONSTER : localeInfo.TOOLTIP_APPLY_ATTBONUS_MONSTER,
  368.         item.APPLY_ATTBONUS_HUMAN : localeInfo.TOOLTIP_APPLY_ATTBONUS_HUMAN,
  369.         item.APPLY_ATTBONUS_ANIMAL : localeInfo.TOOLTIP_APPLY_ATTBONUS_ANIMAL,
  370.         item.APPLY_ATTBONUS_ORC : localeInfo.TOOLTIP_APPLY_ATTBONUS_ORC,
  371.         item.APPLY_ATTBONUS_MILGYO : localeInfo.TOOLTIP_APPLY_ATTBONUS_MILGYO,
  372.         item.APPLY_ATTBONUS_UNDEAD : localeInfo.TOOLTIP_APPLY_ATTBONUS_UNDEAD,
  373.         item.APPLY_ATTBONUS_DEVIL : localeInfo.TOOLTIP_APPLY_ATTBONUS_DEVIL,
  374.         item.APPLY_STEAL_HP : localeInfo.TOOLTIP_APPLY_STEAL_HP,
  375.         item.APPLY_STEAL_SP : localeInfo.TOOLTIP_APPLY_STEAL_SP,
  376.         item.APPLY_MANA_BURN_PCT : localeInfo.TOOLTIP_APPLY_MANA_BURN_PCT,
  377.         item.APPLY_DAMAGE_SP_RECOVER : localeInfo.TOOLTIP_APPLY_DAMAGE_SP_RECOVER,
  378.         item.APPLY_BLOCK : localeInfo.TOOLTIP_APPLY_BLOCK,
  379.         item.APPLY_DODGE : localeInfo.TOOLTIP_APPLY_DODGE,
  380.         item.APPLY_RESIST_SWORD : localeInfo.TOOLTIP_APPLY_RESIST_SWORD,
  381.         item.APPLY_RESIST_TWOHAND : localeInfo.TOOLTIP_APPLY_RESIST_TWOHAND,
  382.         item.APPLY_RESIST_DAGGER : localeInfo.TOOLTIP_APPLY_RESIST_DAGGER,
  383.         item.APPLY_RESIST_BELL : localeInfo.TOOLTIP_APPLY_RESIST_BELL,
  384.         item.APPLY_RESIST_FAN : localeInfo.TOOLTIP_APPLY_RESIST_FAN,
  385.         item.APPLY_RESIST_BOW : localeInfo.TOOLTIP_RESIST_BOW,
  386.         item.APPLY_RESIST_FIRE : localeInfo.TOOLTIP_RESIST_FIRE,
  387.         item.APPLY_RESIST_ELEC : localeInfo.TOOLTIP_RESIST_ELEC,
  388.         item.APPLY_RESIST_MAGIC : localeInfo.TOOLTIP_RESIST_MAGIC,
  389.         item.APPLY_RESIST_WIND : localeInfo.TOOLTIP_APPLY_RESIST_WIND,
  390.         item.APPLY_REFLECT_MELEE : localeInfo.TOOLTIP_APPLY_REFLECT_MELEE,
  391.         item.APPLY_REFLECT_CURSE : localeInfo.TOOLTIP_APPLY_REFLECT_CURSE,
  392.         item.APPLY_POISON_REDUCE : localeInfo.TOOLTIP_APPLY_POISON_REDUCE,
  393.         item.APPLY_KILL_SP_RECOVER : localeInfo.TOOLTIP_APPLY_KILL_SP_RECOVER,
  394.         item.APPLY_EXP_DOUBLE_BONUS : localeInfo.TOOLTIP_APPLY_EXP_DOUBLE_BONUS,
  395.         item.APPLY_GOLD_DOUBLE_BONUS : localeInfo.TOOLTIP_APPLY_GOLD_DOUBLE_BONUS,
  396.         item.APPLY_ITEM_DROP_BONUS : localeInfo.TOOLTIP_APPLY_ITEM_DROP_BONUS,
  397.         item.APPLY_POTION_BONUS : localeInfo.TOOLTIP_APPLY_POTION_BONUS,
  398.         item.APPLY_KILL_HP_RECOVER : localeInfo.TOOLTIP_APPLY_KILL_HP_RECOVER,
  399.         item.APPLY_IMMUNE_STUN : localeInfo.TOOLTIP_APPLY_IMMUNE_STUN,
  400.         item.APPLY_IMMUNE_SLOW : localeInfo.TOOLTIP_APPLY_IMMUNE_SLOW,
  401.         item.APPLY_IMMUNE_FALL : localeInfo.TOOLTIP_APPLY_IMMUNE_FALL,
  402.         item.APPLY_BOW_DISTANCE : localeInfo.TOOLTIP_BOW_DISTANCE,
  403.         item.APPLY_DEF_GRADE_BONUS : localeInfo.TOOLTIP_DEF_GRADE,
  404.         item.APPLY_ATT_GRADE_BONUS : localeInfo.TOOLTIP_ATT_GRADE,
  405.         item.APPLY_MAGIC_ATT_GRADE : localeInfo.TOOLTIP_MAGIC_ATT_GRADE,
  406.         item.APPLY_MAGIC_DEF_GRADE : localeInfo.TOOLTIP_MAGIC_DEF_GRADE,
  407.         item.APPLY_MAX_STAMINA : localeInfo.TOOLTIP_MAX_STAMINA,
  408.         item.APPLY_MALL_ATTBONUS : localeInfo.TOOLTIP_MALL_ATTBONUS,
  409.         item.APPLY_MALL_DEFBONUS : localeInfo.TOOLTIP_MALL_DEFBONUS,
  410.         item.APPLY_MALL_EXPBONUS : localeInfo.TOOLTIP_MALL_EXPBONUS,
  411.         item.APPLY_MALL_ITEMBONUS : localeInfo.TOOLTIP_MALL_ITEMBONUS,
  412.         item.APPLY_MALL_GOLDBONUS : localeInfo.TOOLTIP_MALL_GOLDBONUS,
  413.         item.APPLY_SKILL_DAMAGE_BONUS : localeInfo.TOOLTIP_SKILL_DAMAGE_BONUS,
  414.         item.APPLY_NORMAL_HIT_DAMAGE_BONUS : localeInfo.TOOLTIP_NORMAL_HIT_DAMAGE_BONUS,
  415.         item.APPLY_SKILL_DEFEND_BONUS : localeInfo.TOOLTIP_SKILL_DEFEND_BONUS,
  416.         item.APPLY_NORMAL_HIT_DEFEND_BONUS : localeInfo.TOOLTIP_NORMAL_HIT_DEFEND_BONUS,
  417.         item.APPLY_PC_BANG_EXP_BONUS : localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC,
  418.         item.APPLY_PC_BANG_DROP_BONUS : localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC,
  419.         item.APPLY_RESIST_WARRIOR : localeInfo.TOOLTIP_APPLY_RESIST_WARRIOR,
  420.         item.APPLY_RESIST_ASSASSIN : localeInfo.TOOLTIP_APPLY_RESIST_ASSASSIN,
  421.         item.APPLY_RESIST_SURA : localeInfo.TOOLTIP_APPLY_RESIST_SURA,
  422.         item.APPLY_RESIST_SHAMAN : localeInfo.TOOLTIP_APPLY_RESIST_SHAMAN,
  423.         item.APPLY_MAX_HP_PCT : localeInfo.TOOLTIP_APPLY_MAX_HP_PCT,
  424.         item.APPLY_MAX_SP_PCT : localeInfo.TOOLTIP_APPLY_MAX_SP_PCT,
  425.         item.APPLY_ENERGY : localeInfo.TOOLTIP_ENERGY,
  426.         item.APPLY_COSTUME_ATTR_BONUS : localeInfo.TOOLTIP_COSTUME_ATTR_BONUS,
  427.         item.APPLY_MAGIC_ATTBONUS_PER : localeInfo.TOOLTIP_MAGIC_ATTBONUS_PER,
  428.         item.APPLY_MELEE_MAGIC_ATTBONUS_PER : localeInfo.TOOLTIP_MELEE_MAGIC_ATTBONUS_PER,
  429.         item.APPLY_RESIST_ICE : localeInfo.TOOLTIP_RESIST_ICE,
  430.         item.APPLY_RESIST_EARTH : localeInfo.TOOLTIP_RESIST_EARTH,
  431.         item.APPLY_RESIST_DARK : localeInfo.TOOLTIP_RESIST_DARK,
  432.         item.APPLY_ANTI_CRITICAL_PCT : localeInfo.TOOLTIP_ANTI_CRITICAL_PCT,
  433.         item.APPLY_ANTI_PENETRATE_PCT : localeInfo.TOOLTIP_ANTI_PENETRATE_PCT,
  434.     }
  435.  
  436.     AFFECT_DICT = {
  437.         item.APPLY_MAX_HP                       : [localeInfo.TOOLTIP_MAX_HP, 5000],
  438.         item.APPLY_MAX_SP                       : [localeInfo.TOOLTIP_MAX_SP, 2000],
  439.         item.APPLY_CON                          : [localeInfo.TOOLTIP_CON, 12],
  440.         item.APPLY_INT                          : [localeInfo.TOOLTIP_INT, 12],
  441.         item.APPLY_STR                          : [localeInfo.TOOLTIP_STR, 12],
  442.         item.APPLY_DEX                          : [localeInfo.TOOLTIP_DEX, 12],
  443.         item.APPLY_ATT_SPEED                    : [localeInfo.TOOLTIP_ATT_SPEED, 30],
  444.         item.APPLY_MOV_SPEED                    : [localeInfo.TOOLTIP_MOV_SPEED, 30],
  445.         item.APPLY_CAST_SPEED                   : [localeInfo.TOOLTIP_CAST_SPEED, 20],
  446.         item.APPLY_HP_REGEN                     : [localeInfo.TOOLTIP_HP_REGEN, 20],
  447.         item.APPLY_SP_REGEN                     : [localeInfo.TOOLTIP_SP_REGEN, 20],
  448.         item.APPLY_POISON_PCT                   : [localeInfo.TOOLTIP_APPLY_POISON_PCT, 8],
  449.         item.APPLY_STUN_PCT                     : [localeInfo.TOOLTIP_APPLY_STUN_PCT, 8],
  450.         item.APPLY_SLOW_PCT                     : [localeInfo.TOOLTIP_APPLY_SLOW_PCT, 8],
  451.         item.APPLY_CRITICAL_PCT                 : [localeInfo.TOOLTIP_APPLY_CRITICAL_PCT, 20],
  452.         item.APPLY_PENETRATE_PCT                : [localeInfo.TOOLTIP_APPLY_PENETRATE_PCT, 20],
  453.         item.APPLY_ATTBONUS_WARRIOR             : [localeInfo.TOOLTIP_APPLY_ATTBONUS_WARRIOR, 15],
  454.         item.APPLY_ATTBONUS_ASSASSIN            : [localeInfo.TOOLTIP_APPLY_ATTBONUS_ASSASSIN, 15],
  455.         item.APPLY_ATTBONUS_SURA                : [localeInfo.TOOLTIP_APPLY_ATTBONUS_SURA, 15],
  456.         item.APPLY_ATTBONUS_SHAMAN              : [localeInfo.TOOLTIP_APPLY_ATTBONUS_SHAMAN, 15],
  457.         item.APPLY_ATTBONUS_MONSTER             : [localeInfo.TOOLTIP_APPLY_ATTBONUS_MONSTER, 20],
  458.         item.APPLY_ATTBONUS_HUMAN               : [localeInfo.TOOLTIP_APPLY_ATTBONUS_HUMAN, 20],
  459.         item.APPLY_ATTBONUS_ANIMAL              : [localeInfo.TOOLTIP_APPLY_ATTBONUS_ANIMAL, 20],
  460.         item.APPLY_ATTBONUS_ORC                 : [localeInfo.TOOLTIP_APPLY_ATTBONUS_ORC, 20],
  461.         item.APPLY_ATTBONUS_MILGYO              : [localeInfo.TOOLTIP_APPLY_ATTBONUS_MILGYO, 20],
  462.         item.APPLY_ATTBONUS_UNDEAD              : [localeInfo.TOOLTIP_APPLY_ATTBONUS_UNDEAD, 20],
  463.         item.APPLY_ATTBONUS_DEVIL               : [localeInfo.TOOLTIP_APPLY_ATTBONUS_DEVIL, 20],
  464.         item.APPLY_STEAL_HP                     : [localeInfo.TOOLTIP_APPLY_STEAL_HP, 10],
  465.         item.APPLY_STEAL_SP                     : [localeInfo.TOOLTIP_APPLY_STEAL_SP, 10],
  466.         item.APPLY_MANA_BURN_PCT                : [localeInfo.TOOLTIP_APPLY_MANA_BURN_PCT, 20],
  467.         item.APPLY_DAMAGE_SP_RECOVER            : [localeInfo.TOOLTIP_APPLY_DAMAGE_SP_RECOVER, 10],
  468.         item.APPLY_BLOCK                        : [localeInfo.TOOLTIP_APPLY_BLOCK, 15],
  469.         item.APPLY_DODGE                        : [localeInfo.TOOLTIP_APPLY_DODGE, 15],
  470.         item.APPLY_RESIST_SWORD                 : [localeInfo.TOOLTIP_APPLY_RESIST_SWORD, 15],
  471.         item.APPLY_RESIST_TWOHAND               : [localeInfo.TOOLTIP_APPLY_RESIST_TWOHAND, 15],
  472.         item.APPLY_RESIST_DAGGER                : [localeInfo.TOOLTIP_APPLY_RESIST_DAGGER, 15],
  473.         item.APPLY_RESIST_BELL                  : [localeInfo.TOOLTIP_APPLY_RESIST_BELL, 15],
  474.         item.APPLY_RESIST_FAN                   : [localeInfo.TOOLTIP_APPLY_RESIST_FAN, 15],
  475.         item.APPLY_RESIST_BOW                   : [localeInfo.TOOLTIP_RESIST_BOW, 15],
  476.         item.APPLY_RESIST_FIRE                  : [localeInfo.TOOLTIP_RESIST_FIRE, 15],
  477.         item.APPLY_RESIST_ELEC                  : [localeInfo.TOOLTIP_RESIST_ELEC, 15],
  478.         item.APPLY_RESIST_MAGIC                 : [localeInfo.TOOLTIP_RESIST_MAGIC, 15],
  479.         item.APPLY_RESIST_WIND                  : [localeInfo.TOOLTIP_APPLY_RESIST_WIND, 15],
  480.         item.APPLY_REFLECT_MELEE                : [localeInfo.TOOLTIP_APPLY_REFLECT_MELEE, 15],
  481.         item.APPLY_REFLECT_CURSE                : [localeInfo.TOOLTIP_APPLY_REFLECT_CURSE, 20],
  482.         item.APPLY_POISON_REDUCE                : [localeInfo.TOOLTIP_APPLY_POISON_REDUCE, 20],
  483.         item.APPLY_KILL_SP_RECOVER              : [localeInfo.TOOLTIP_APPLY_KILL_SP_RECOVER, 20],
  484.         item.APPLY_EXP_DOUBLE_BONUS             : [localeInfo.TOOLTIP_APPLY_EXP_DOUBLE_BONUS, 20],
  485.         item.APPLY_GOLD_DOUBLE_BONUS            : [localeInfo.TOOLTIP_APPLY_GOLD_DOUBLE_BONUS, 20],
  486.         item.APPLY_ITEM_DROP_BONUS              : [localeInfo.TOOLTIP_APPLY_ITEM_DROP_BONUS, 20],
  487.         item.APPLY_POTION_BONUS                 : [localeInfo.TOOLTIP_APPLY_POTION_BONUS, 20],
  488.         item.APPLY_KILL_HP_RECOVER              : [localeInfo.TOOLTIP_APPLY_KILL_HP_RECOVER, 10],
  489.         item.APPLY_IMMUNE_STUN                  : [localeInfo.TOOLTIP_APPLY_IMMUNE_STUN, 20],
  490.         item.APPLY_IMMUNE_SLOW                  : [localeInfo.TOOLTIP_APPLY_IMMUNE_SLOW, 20],
  491.         item.APPLY_IMMUNE_FALL                  : [localeInfo.TOOLTIP_APPLY_IMMUNE_FALL, 20],
  492.         item.APPLY_BOW_DISTANCE                 : [localeInfo.TOOLTIP_BOW_DISTANCE, 20],
  493.         item.APPLY_DEF_GRADE_BONUS              : [localeInfo.TOOLTIP_DEF_GRADE, 20],
  494.         item.APPLY_ATT_GRADE_BONUS              : [localeInfo.TOOLTIP_ATT_GRADE, 50],
  495.         item.APPLY_MAGIC_ATT_GRADE              : [localeInfo.TOOLTIP_MAGIC_ATT_GRADE, 20],
  496.         item.APPLY_MAGIC_DEF_GRADE              : [localeInfo.TOOLTIP_MAGIC_DEF_GRADE, 20],
  497.         item.APPLY_MAX_STAMINA                  : [localeInfo.TOOLTIP_MAX_STAMINA, 20],
  498.         item.APPLY_MALL_ATTBONUS                : [localeInfo.TOOLTIP_MALL_ATTBONUS, 20],
  499.         item.APPLY_MALL_DEFBONUS                : [localeInfo.TOOLTIP_MALL_DEFBONUS, 20],
  500.         item.APPLY_MALL_EXPBONUS                : [localeInfo.TOOLTIP_MALL_EXPBONUS, 20],
  501.         item.APPLY_MALL_ITEMBONUS               : [localeInfo.TOOLTIP_MALL_ITEMBONUS, 20],
  502.         item.APPLY_MALL_GOLDBONUS               : [localeInfo.TOOLTIP_MALL_GOLDBONUS, 20],
  503.         item.APPLY_SKILL_DAMAGE_BONUS           : [localeInfo.TOOLTIP_SKILL_DAMAGE_BONUS, 22],
  504.         item.APPLY_NORMAL_HIT_DAMAGE_BONUS      : [localeInfo.TOOLTIP_NORMAL_HIT_DAMAGE_BONUS, 60],
  505.         item.APPLY_SKILL_DEFEND_BONUS           : [localeInfo.TOOLTIP_SKILL_DEFEND_BONUS, 50],
  506.         item.APPLY_NORMAL_HIT_DEFEND_BONUS      : [localeInfo.TOOLTIP_NORMAL_HIT_DEFEND_BONUS, 50],
  507.         item.APPLY_PC_BANG_EXP_BONUS            : [localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC, 20],
  508.         item.APPLY_PC_BANG_DROP_BONUS           : [localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC, 20],
  509.         item.APPLY_RESIST_WARRIOR               : [localeInfo.TOOLTIP_APPLY_RESIST_WARRIOR, 5],
  510.         item.APPLY_RESIST_ASSASSIN              : [localeInfo.TOOLTIP_APPLY_RESIST_ASSASSIN, 5],
  511.         item.APPLY_RESIST_SURA                  : [localeInfo.TOOLTIP_APPLY_RESIST_SURA, 5],
  512.         item.APPLY_RESIST_SHAMAN                : [localeInfo.TOOLTIP_APPLY_RESIST_SHAMAN, 5],
  513.         item.APPLY_MAX_HP_PCT                   : [localeInfo.TOOLTIP_APPLY_MAX_HP_PCT, 20],
  514.         item.APPLY_MAX_SP_PCT                   : [localeInfo.TOOLTIP_APPLY_MAX_SP_PCT, 20],
  515.         item.APPLY_ENERGY                       : [localeInfo.TOOLTIP_ENERGY, 20],
  516.         item.APPLY_COSTUME_ATTR_BONUS           : [localeInfo.TOOLTIP_COSTUME_ATTR_BONUS, 20],
  517.         item.APPLY_MAGIC_ATTBONUS_PER           : [localeInfo.TOOLTIP_MAGIC_ATTBONUS_PER, 20],
  518.         item.APPLY_MELEE_MAGIC_ATTBONUS_PER     : [localeInfo.TOOLTIP_MELEE_MAGIC_ATTBONUS_PER, 20],
  519.         item.APPLY_RESIST_ICE                   : [localeInfo.TOOLTIP_RESIST_ICE, 20],
  520.         item.APPLY_RESIST_EARTH                 : [localeInfo.TOOLTIP_RESIST_EARTH, 20],
  521.         item.APPLY_RESIST_DARK                  : [localeInfo.TOOLTIP_RESIST_DARK, 20],
  522.         item.APPLY_ANTI_CRITICAL_PCT            : [localeInfo.TOOLTIP_ANTI_CRITICAL_PCT, 20],
  523.         item.APPLY_ANTI_PENETRATE_PCT           : [localeInfo.TOOLTIP_ANTI_PENETRATE_PCT, 20],
  524.     }
  525.  
  526.     ATTRIBUTE_NEED_WIDTH = {
  527.         23 : 230,
  528.         24 : 230,
  529.         25 : 230,
  530.         26 : 220,
  531.         27 : 210,
  532.  
  533.         35 : 210,
  534.         36 : 210,
  535.         37 : 210,
  536.         38 : 210,
  537.         39 : 210,
  538.         40 : 210,
  539.         41 : 210,
  540.  
  541.         42 : 220,
  542.         43 : 230,
  543.         45 : 230,
  544.     }
  545.  
  546.     ANTI_FLAG_DICT = {
  547.         0 : item.ITEM_ANTIFLAG_WARRIOR,
  548.         1 : item.ITEM_ANTIFLAG_ASSASSIN,
  549.         2 : item.ITEM_ANTIFLAG_SURA,
  550.         3 : item.ITEM_ANTIFLAG_SHAMAN,
  551.     }
  552.  
  553.     FONT_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
  554.  
  555.     def __init__(self, *args, **kwargs):
  556.         ToolTip.__init__(self, *args, **kwargs)
  557.         self.itemVnum = 0
  558.         self.isShopItem = False
  559.  
  560.         # ¾ÆÀÌÅÛ ÅøÆÁÀ» Ç¥½ÃÇÒ ¶§ ÇöÀç ij¸¯ÅÍ°¡ Âø¿ëÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ̶ó¸é °­Á¦·Î Disable Color·Î ¼³Á¤ (ÀÌ¹Ì ±×·¸°Ô ÀÛµ¿ÇÏ°í ÀÖÀ¸³ª ²¨¾ß ÇÒ ÇÊ¿ä°¡ À־)
  561.         self.bCannotUseItemForceSetDisableColor = True
  562.  
  563.     def __del__(self):
  564.         ToolTip.__del__(self)
  565.  
  566.     def SetCannotUseItemForceSetDisableColor(self, enable):
  567.         self.bCannotUseItemForceSetDisableColor = enable
  568.  
  569.     def CanEquip(self):
  570.         if not item.IsEquipmentVID(self.itemVnum):
  571.             return True
  572.  
  573.         race = player.GetRace()
  574.         job = chr.RaceToJob(race)
  575.         if not self.ANTI_FLAG_DICT.has_key(job):
  576.             return False
  577.  
  578.         if item.IsAntiFlag(self.ANTI_FLAG_DICT[job]):
  579.             return False
  580.  
  581.         sex = chr.RaceToSex(race)
  582.        
  583.         MALE = 1
  584.         FEMALE = 0
  585.  
  586.         if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE) and sex == MALE:
  587.             return False
  588.  
  589.         if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE) and sex == FEMALE:
  590.             return False
  591.  
  592.         for i in xrange(item.LIMIT_MAX_NUM):
  593.             (limitType, limitValue) = item.GetLimit(i)
  594.  
  595.             if item.LIMIT_LEVEL == limitType:
  596.                 if player.GetStatus(player.LEVEL) < limitValue:
  597.                     return False
  598.             """
  599.             elif item.LIMIT_STR == limitType:
  600.                 if player.GetStatus(player.ST) < limitValue:
  601.                     return False
  602.             elif item.LIMIT_DEX == limitType:
  603.                 if player.GetStatus(player.DX) < limitValue:
  604.                     return False
  605.             elif item.LIMIT_INT == limitType:
  606.                 if player.GetStatus(player.IQ) < limitValue:
  607.                     return False
  608.             elif item.LIMIT_CON == limitType:
  609.                 if player.GetStatus(player.HT) < limitValue:
  610.                     return False
  611.             """
  612.  
  613.         return True
  614.  
  615.     def AppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
  616.         if not self.CanEquip() and self.bCannotUseItemForceSetDisableColor:
  617.             color = self.DISABLE_COLOR
  618.  
  619.         return ToolTip.AppendTextLine(self, text, color, centerAlign)
  620.  
  621.     def ClearToolTip(self):
  622.         self.isShopItem = False
  623.         self.toolTipWidth = self.TOOL_TIP_WIDTH
  624.         ToolTip.ClearToolTip(self)
  625.  
  626.     def SetInventoryItem(self, slotIndex, window_type = player.INVENTORY):
  627.         itemVnum = player.GetItemIndex(window_type, slotIndex)
  628.         if 0 == itemVnum:
  629.             return
  630.  
  631.         self.ClearToolTip()
  632.         if shop.IsOpen():
  633.             if not shop.IsPrivateShop():
  634.                 item.SelectItem(itemVnum)
  635.                 self.AppendSellingPrice(player.GetISellItemPrice(window_type, slotIndex))
  636.  
  637.         metinSlot = [player.GetItemMetinSocket(window_type, slotIndex, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
  638.         attrSlot = [player.GetItemAttribute(window_type, slotIndex, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
  639.  
  640.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  641.     if app.ENABLE_SEND_TARGET_INFO:
  642.         def SetItemToolTipStone(self, itemVnum):
  643.             self.itemVnum = itemVnum
  644.             item.SelectItem(itemVnum)
  645.             itemType = item.GetItemType()
  646.  
  647.             itemDesc = item.GetItemDescription()
  648.             itemSummary = item.GetItemSummary()
  649.             attrSlot = 0
  650.             self.__AdjustMaxWidth(attrSlot, itemDesc)
  651.             itemName = item.GetItemName()
  652.             realName = itemName[:itemName.find("+")]
  653.             self.SetTitle(realName + " +0 - +4")
  654.  
  655.             ## Description ###
  656.             self.AppendDescription(itemDesc, 26)
  657.             self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
  658.  
  659.             if item.ITEM_TYPE_METIN == itemType:
  660.                 self.AppendMetinInformation()
  661.                 self.AppendMetinWearInformation()
  662.  
  663.             for i in xrange(item.LIMIT_MAX_NUM):
  664.                 (limitType, limitValue) = item.GetLimit(i)
  665.  
  666.                 if item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
  667.                     self.AppendRealTimeStartFirstUseLastTime(item, metinSlot, i)
  668.  
  669.                 elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
  670.                     self.AppendTimerBasedOnWearLastTime(metinSlot)
  671.  
  672.             self.ShowToolTip()
  673.     def SetShopItem(self, slotIndex):
  674.         itemVnum = shop.GetItemID(slotIndex)
  675.         if 0 == itemVnum:
  676.             return
  677.  
  678.         price = shop.GetItemPrice(slotIndex)
  679.         self.ClearToolTip()
  680.         self.isShopItem = True
  681.  
  682.         metinSlot = []
  683.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  684.             metinSlot.append(shop.GetItemMetinSocket(slotIndex, i))
  685.         attrSlot = []
  686.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  687.             attrSlot.append(shop.GetItemAttribute(slotIndex, i))
  688.  
  689.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  690.         self.AppendPrice(price)
  691.  
  692.     def SetShopItemBySecondaryCoin(self, slotIndex):
  693.         itemVnum = shop.GetItemID(slotIndex)
  694.         if 0 == itemVnum:
  695.             return
  696.  
  697.         price = shop.GetItemPrice(slotIndex)
  698.         self.ClearToolTip()
  699.         self.isShopItem = True
  700.  
  701.         metinSlot = []
  702.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  703.             metinSlot.append(shop.GetItemMetinSocket(slotIndex, i))
  704.         attrSlot = []
  705.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  706.             attrSlot.append(shop.GetItemAttribute(slotIndex, i))
  707.  
  708.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  709.         self.AppendPriceBySecondaryCoin(price)
  710.  
  711.     def SetExchangeOwnerItem(self, slotIndex):
  712.         itemVnum = exchange.GetItemVnumFromSelf(slotIndex)
  713.         if 0 == itemVnum:
  714.             return
  715.  
  716.         self.ClearToolTip()
  717.  
  718.         metinSlot = []
  719.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  720.             metinSlot.append(exchange.GetItemMetinSocketFromSelf(slotIndex, i))
  721.         attrSlot = []
  722.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  723.             attrSlot.append(exchange.GetItemAttributeFromSelf(slotIndex, i))
  724.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  725.  
  726.     def SetExchangeTargetItem(self, slotIndex):
  727.         itemVnum = exchange.GetItemVnumFromTarget(slotIndex)
  728.         if 0 == itemVnum:
  729.             return
  730.  
  731.         self.ClearToolTip()
  732.  
  733.         metinSlot = []
  734.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  735.             metinSlot.append(exchange.GetItemMetinSocketFromTarget(slotIndex, i))
  736.         attrSlot = []
  737.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  738.             attrSlot.append(exchange.GetItemAttributeFromTarget(slotIndex, i))
  739.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  740.  
  741.     def SetPrivateShopBuilderItem(self, invenType, invenPos, privateShopSlotIndex):
  742.         itemVnum = player.GetItemIndex(invenType, invenPos)
  743.         if 0 == itemVnum:
  744.             return
  745.  
  746.         item.SelectItem(itemVnum)
  747.         self.ClearToolTip()
  748.         self.AppendSellingPrice(shop.GetPrivateShopItemPrice(invenType, invenPos))
  749.  
  750.         metinSlot = []
  751.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  752.             metinSlot.append(player.GetItemMetinSocket(invenPos, i))
  753.         attrSlot = []
  754.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  755.             attrSlot.append(player.GetItemAttribute(invenPos, i))
  756.  
  757.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  758.  
  759.     def SetSafeBoxItem(self, slotIndex):
  760.         itemVnum = safebox.GetItemID(slotIndex)
  761.         if 0 == itemVnum:
  762.             return
  763.  
  764.         self.ClearToolTip()
  765.         metinSlot = []
  766.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  767.             metinSlot.append(safebox.GetItemMetinSocket(slotIndex, i))
  768.         attrSlot = []
  769.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  770.             attrSlot.append(safebox.GetItemAttribute(slotIndex, i))
  771.        
  772.         self.AddItemData(itemVnum, metinSlot, attrSlot, safebox.GetItemFlags(slotIndex))
  773.  
  774.     def SetMallItem(self, slotIndex):
  775.         itemVnum = safebox.GetMallItemID(slotIndex)
  776.         if 0 == itemVnum:
  777.             return
  778.  
  779.         self.ClearToolTip()
  780.         metinSlot = []
  781.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  782.             metinSlot.append(safebox.GetMallItemMetinSocket(slotIndex, i))
  783.         attrSlot = []
  784.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  785.             attrSlot.append(safebox.GetMallItemAttribute(slotIndex, i))
  786.  
  787.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  788.  
  789.     def SetItemToolTip(self, itemVnum):
  790.         self.ClearToolTip()
  791.         metinSlot = []
  792.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  793.             metinSlot.append(0)
  794.         attrSlot = []
  795.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  796.             attrSlot.append((0, 0))
  797.  
  798.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  799.  
  800.     def __AppendAttackSpeedInfo(self, item):
  801.         atkSpd = item.GetValue(0)
  802.  
  803.         if atkSpd < 80:
  804.             stSpd = localeInfo.TOOLTIP_ITEM_VERY_FAST
  805.         elif atkSpd <= 95:
  806.             stSpd = localeInfo.TOOLTIP_ITEM_FAST
  807.         elif atkSpd <= 105:
  808.             stSpd = localeInfo.TOOLTIP_ITEM_NORMAL
  809.         elif atkSpd <= 120:
  810.             stSpd = localeInfo.TOOLTIP_ITEM_SLOW
  811.         else:
  812.             stSpd = localeInfo.TOOLTIP_ITEM_VERY_SLOW
  813.  
  814.         self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_SPEED % stSpd, self.NORMAL_COLOR)
  815.  
  816.     def __AppendAttackGradeInfo(self):
  817.         atkGrade = item.GetValue(1)
  818.         self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_GRADE % atkGrade, self.GetChangeTextLineColor(atkGrade))
  819.  
  820.     if app.ENABLE_SASH_SYSTEM:
  821.         def CalcSashValue(self, value, abs):
  822.             if not value:
  823.                 return 0
  824.            
  825.             valueCalc = int((round(value * abs) / 100) - .5) + int(int((round(value * abs) / 100) - .5) > 0)
  826.             if valueCalc <= 0 and value > 0:
  827.                 value = 1
  828.             else:
  829.                 value = valueCalc
  830.            
  831.             return value
  832.  
  833.     def __AppendAttackPowerInfo(self, itemAbsChance = 0):
  834.         minPower = item.GetValue(3)
  835.         maxPower = item.GetValue(4)
  836.         addPower = item.GetValue(5)
  837.        
  838.         if app.ENABLE_SASH_SYSTEM:
  839.             if itemAbsChance:
  840.                 minPower = self.CalcSashValue(minPower, itemAbsChance)
  841.                 maxPower = self.CalcSashValue(maxPower, itemAbsChance)
  842.                 addPower = self.CalcSashValue(addPower, itemAbsChance)
  843.        
  844.         if maxPower > minPower:
  845.             self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_POWER % (minPower + addPower, maxPower + addPower), self.POSITIVE_COLOR)
  846.         else:
  847.             self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_POWER_ONE_ARG % (minPower + addPower), self.POSITIVE_COLOR)
  848.  
  849.     def __AppendMagicAttackInfo(self, itemAbsChance = 0):
  850.         minMagicAttackPower = item.GetValue(1)
  851.         maxMagicAttackPower = item.GetValue(2)
  852.         addPower = item.GetValue(5)
  853.        
  854.         if app.ENABLE_SASH_SYSTEM:
  855.             if itemAbsChance:
  856.                 minMagicAttackPower = self.CalcSashValue(minMagicAttackPower, itemAbsChance)
  857.                 maxMagicAttackPower = self.CalcSashValue(maxMagicAttackPower, itemAbsChance)
  858.                 addPower = self.CalcSashValue(addPower, itemAbsChance)
  859.        
  860.         if minMagicAttackPower > 0 or maxMagicAttackPower > 0:
  861.             if maxMagicAttackPower > minMagicAttackPower:
  862.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_ATT_POWER % (minMagicAttackPower + addPower, maxMagicAttackPower + addPower), self.POSITIVE_COLOR)
  863.             else:
  864.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_ATT_POWER_ONE_ARG % (minMagicAttackPower + addPower), self.POSITIVE_COLOR)
  865.  
  866.     def __AppendMagicDefenceInfo(self, itemAbsChance = 0):
  867.         magicDefencePower = item.GetValue(0)
  868.        
  869.         if app.ENABLE_SASH_SYSTEM:
  870.             if itemAbsChance:
  871.                 magicDefencePower = self.CalcSashValue(magicDefencePower, itemAbsChance)
  872.        
  873.         if magicDefencePower > 0:
  874.             self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_DEF_POWER % magicDefencePower, self.GetChangeTextLineColor(magicDefencePower))
  875.  
  876.     def __AppendAttributeInformation(self, attrSlot, itemAbsChance = 0):
  877.         if 0 != attrSlot:
  878.             count = 0
  879.  
  880.             for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  881.                 type = attrSlot[i][0]
  882.                 value = attrSlot[i][1]
  883.  
  884.                 if 0 == value:
  885.                     continue
  886.  
  887.                 affectString = self.__GetAffectString(type, value, 1)
  888.                 if app.ENABLE_SASH_SYSTEM:
  889.                     if item.GetItemType() == item.ITEM_TYPE_COSTUME and item.GetItemSubType() == item.COSTUME_TYPE_SASH and itemAbsChance:
  890.                         value = self.CalcSashValue(value, itemAbsChance)
  891.                         affectString = self.__GetAffectString(type, value)
  892.  
  893.                 if affectString:
  894.                     affectColor = self.__GetAttributeColor(i, value)
  895.                     self.AppendTextLine(affectString, affectColor)
  896.                    
  897.                 count = count+1
  898.  
  899.             if (count == 0) and (item.GetItemType() == item.ITEM_TYPE_ARMOR or (item.GetItemType() == item.ITEM_TYPE_WEAPON and item.GetItemSubType() != item.WEAPON_ARROW)):
  900.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_BONUS_FIRSTADD, self.BONUS_COLOR)
  901.  
  902.             if (count < 7 and count != 0) and (item.GetItemType() == item.ITEM_TYPE_ARMOR or (item.GetItemType() == item.ITEM_TYPE_WEAPON and item.GetItemSubType() != item.WEAPON_ARROW)):
  903.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_BONUS_NEXTADD, self.BONUS_COLOR)
  904.  
  905.     def __GetAttributeColor(self, index, value):
  906.         if value > 0:
  907.             if index >= 5:
  908.                 return self.SPECIAL_POSITIVE_COLOR2
  909.             else:
  910.                 return self.SPECIAL_POSITIVE_COLOR
  911.         elif value == 0:
  912.             return self.NORMAL_COLOR
  913.         else:
  914.             return self.NEGATIVE_COLOR
  915.  
  916.     def __IsPolymorphItem(self, itemVnum):
  917.         if itemVnum >= 70103 and itemVnum <= 70106:
  918.             return 1
  919.         return 0
  920.  
  921.     def __SetPolymorphItemTitle(self, monsterVnum):
  922.         if localeInfo.IsVIETNAM():
  923.             itemName =item.GetItemName()
  924.             itemName+=" "
  925.             itemName+=nonplayer.GetMonsterName(monsterVnum)
  926.         else:
  927.             itemName =nonplayer.GetMonsterName(monsterVnum)
  928.             itemName+=" "
  929.             itemName+=item.GetItemName()
  930.         self.SetTitle(itemName)
  931.  
  932.     def __SetNormalItemTitle(self):
  933.         if app.ENABLE_SEND_TARGET_INFO:
  934.             if self.isStone:
  935.                 itemName = item.GetItemName()
  936.                 realName = itemName[:itemName.find("+")]
  937.                 self.SetTitle(realName + " +0 - +4")
  938.             else:
  939.                 self.SetTitle(item.GetItemName())
  940.         else:
  941.             self.SetTitle(item.GetItemName())
  942.  
  943.     def __SetSpecialItemTitle(self):
  944.         self.AppendTextLine(item.GetItemName(), self.SPECIAL_TITLE_COLOR)
  945.  
  946.     def __SetItemTitle(self, itemVnum, metinSlot, attrSlot):
  947.         if localeInfo.IsCANADA():
  948.             if 72726 == itemVnum or 72730 == itemVnum:
  949.                 self.AppendTextLine(item.GetItemName(), grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
  950.                 return
  951.            
  952.         if self.__IsPolymorphItem(itemVnum):
  953.             self.__SetPolymorphItemTitle(metinSlot[0])
  954.         else:
  955.             if self.__IsAttr(attrSlot):
  956.                 self.__SetSpecialItemTitle()
  957.                 return
  958.  
  959.             self.__SetNormalItemTitle()
  960.  
  961.     def __IsAttr(self, attrSlot):
  962.         if not attrSlot:
  963.             return False
  964.  
  965.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  966.             type = attrSlot[i][0]
  967.             if 0 != type:
  968.                 return True
  969.  
  970.         return False
  971.    
  972.     def AddRefineItemData(self, itemVnum, metinSlot, attrSlot = 0):
  973.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  974.             metinSlotData=metinSlot[i]
  975.             if self.GetMetinItemIndex(metinSlotData) == constInfo.ERROR_METIN_STONE:
  976.                 metinSlot[i]=player.METIN_SOCKET_TYPE_SILVER
  977.  
  978.         self.AddItemData(itemVnum, metinSlot, attrSlot)
  979.  
  980.     def AddItemData_Offline(self, itemVnum, itemDesc, itemSummary, metinSlot, attrSlot):
  981.         self.__AdjustMaxWidth(attrSlot, itemDesc)
  982.         self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
  983.        
  984.         if self.__IsHair(itemVnum):
  985.             self.__AppendHairIcon(itemVnum)
  986.  
  987.         ### Description ###
  988.         self.AppendDescription(itemDesc, 26)
  989.         self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
  990.  
  991.     def AddItemData(self, itemVnum, metinSlot, attrSlot = 0, flags = 0, unbindTime = 0, window_type = player.INVENTORY, slotIndex = -1):
  992.         self.itemVnum = itemVnum
  993.         item.SelectItem(itemVnum)
  994.         itemType = item.GetItemType()
  995.         itemSubType = item.GetItemSubType()
  996.  
  997.         self.ShowToolTip()
  998.        
  999.         if 50026 == itemVnum:
  1000.             if 0 != metinSlot:
  1001.                 name = item.GetItemName()
  1002.                 if metinSlot[0] > 0:
  1003.                     name += " "
  1004.                     name += localeInfo.NumberToMoneyString(metinSlot[0])
  1005.                 self.SetTitle(name)
  1006.  
  1007.                 self.ShowToolTip()
  1008.             return
  1009.  
  1010.         ### Skill Book ###
  1011.         if app.ENABLE_SEND_TARGET_INFO:
  1012.             if 50300 == itemVnum and not self.isBook:
  1013.                 if 0 != metinSlot and not self.isBook:
  1014.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILLBOOK_NAME, 1)
  1015.                     self.ShowToolTip()
  1016.                 elif self.isBook:
  1017.                     self.SetTitle(item.GetItemName())
  1018.                     self.AppendDescription(item.GetItemDescription(), 26)
  1019.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1020.                     self.ShowToolTip()                 
  1021.                 return
  1022.             elif 70037 == itemVnum :
  1023.                 if 0 != metinSlot and not self.isBook2:
  1024.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
  1025.                     self.AppendDescription(item.GetItemDescription(), 26)
  1026.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1027.                     self.ShowToolTip()
  1028.                 elif self.isBook2:
  1029.                     self.SetTitle(item.GetItemName())
  1030.                     self.AppendDescription(item.GetItemDescription(), 26)
  1031.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1032.                     self.ShowToolTip()                 
  1033.                 return
  1034.             elif 70055 == itemVnum:
  1035.                 if 0 != metinSlot:
  1036.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
  1037.                     self.AppendDescription(item.GetItemDescription(), 26)
  1038.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1039.                     self.ShowToolTip()
  1040.                 return
  1041.         else:
  1042.             if 50300 == itemVnum:
  1043.                 if 0 != metinSlot:
  1044.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILLBOOK_NAME, 1)
  1045.                     self.ShowToolTip()
  1046.                 return
  1047.             elif 70037 == itemVnum:
  1048.                 if 0 != metinSlot:
  1049.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
  1050.                     self.AppendDescription(item.GetItemDescription(), 26)
  1051.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1052.                     self.ShowToolTip()
  1053.                 return
  1054.             elif 70055 == itemVnum:
  1055.                 if 0 != metinSlot:
  1056.                     self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
  1057.                     self.AppendDescription(item.GetItemDescription(), 26)
  1058.                     self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  1059.                     self.ShowToolTip()
  1060.                 return
  1061.         ###########################################################################################
  1062.  
  1063.  
  1064.         itemDesc = item.GetItemDescription()
  1065.         itemSummary = item.GetItemSummary()
  1066.  
  1067.         isCostumeItem = 0
  1068.         isCostumeHair = 0
  1069.         isCostumeBody = 0
  1070.         #isCostumeMount = 0
  1071.         if app.ENABLE_COSTUME_WEAPON_SYSTEM:
  1072.             isCostumeWeapon = 0
  1073.         if app.ENABLE_SASH_SYSTEM:
  1074.             isCostumeSash = 0
  1075.  
  1076.  
  1077.         if app.ENABLE_COSTUME_SYSTEM:
  1078.             if item.ITEM_TYPE_COSTUME == itemType:
  1079.                 isCostumeItem = 1
  1080.                 isCostumeHair = item.COSTUME_TYPE_HAIR == itemSubType
  1081.                 isCostumeBody = item.COSTUME_TYPE_BODY == itemSubType
  1082.                 #isCostumeMount = item.COSTUME_TYPE_MOUNT == itemSubType
  1083.                 if app.ENABLE_COSTUME_WEAPON_SYSTEM:
  1084.                     isCostumeWeapon = item.COSTUME_TYPE_WEAPON == itemSubType
  1085.                 if app.ENABLE_SASH_SYSTEM:
  1086.                     isCostumeSash = itemSubType == item.COSTUME_TYPE_SASH
  1087.  
  1088.                
  1089.                 #dbg.TraceError("IS_COSTUME_ITEM! body(%d) hair(%d)" % (isCostumeBody, isCostumeHair))
  1090.  
  1091.         self.__AdjustMaxWidth(attrSlot, itemDesc)
  1092.         self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
  1093.        
  1094.         ### Hair Preview Image ###
  1095.         if self.__IsHair(itemVnum):
  1096.             self.__AppendHairIcon(itemVnum)
  1097.  
  1098.         ### Description ###
  1099.         self.AppendDescription(itemDesc, 26)
  1100.         self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
  1101.  
  1102.         ### Weapon ###
  1103.         if item.ITEM_TYPE_WEAPON == itemType:
  1104.  
  1105.             self.__AppendLimitInformation()
  1106.  
  1107.             self.AppendSpace(5)
  1108.  
  1109.             ## ºÎäÀÏ °æ¿ì ¸¶°øÀ» ¸ÕÀú Ç¥½ÃÇÑ´Ù.
  1110.             if item.WEAPON_FAN == itemSubType:
  1111.                 self.__AppendMagicAttackInfo()
  1112.                 self.__AppendAttackPowerInfo()
  1113.  
  1114.             else:
  1115.                 self.__AppendAttackPowerInfo()
  1116.                 self.__AppendMagicAttackInfo()
  1117.  
  1118.             self.__AppendAffectInformation()
  1119.             self.__AppendAttributeInformation(attrSlot)
  1120.  
  1121.             self.AppendWearableInformation()
  1122.             self.__AppendMetinSlotInfo(metinSlot)
  1123.  
  1124.         ### Armor ###
  1125.         elif item.ITEM_TYPE_ARMOR == itemType:
  1126.             self.__AppendLimitInformation()
  1127.  
  1128.             ## ¹æ¾î·Â
  1129.             defGrade = item.GetValue(1)
  1130.             defBonus = item.GetValue(5)*2 ## ¹æ¾î·Â Ç¥½Ã À߸ø µÇ´Â ¹®Á¦¸¦ ¼öÁ¤
  1131.             if defGrade > 0:
  1132.                 self.AppendSpace(5)
  1133.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade+defBonus), self.GetChangeTextLineColor(defGrade))
  1134.  
  1135.             self.__AppendMagicDefenceInfo()
  1136.             self.__AppendAffectInformation()
  1137.             self.__AppendAttributeInformation(attrSlot)
  1138.  
  1139.             self.AppendWearableInformation()
  1140.  
  1141.             if itemSubType in (item.ARMOR_WRIST, item.ARMOR_NECK, item.ARMOR_EAR):             
  1142.                 self.__AppendAccessoryMetinSlotInfo(metinSlot, constInfo.GET_ACCESSORY_MATERIAL_VNUM(itemVnum, itemSubType))
  1143.             else:
  1144.                 self.__AppendMetinSlotInfo(metinSlot)
  1145.  
  1146.         ### Ring Slot Item (Not UNIQUE) ###
  1147.         elif item.ITEM_TYPE_RING == itemType:
  1148.             self.__AppendLimitInformation()
  1149.             self.__AppendAffectInformation()
  1150.             self.__AppendAttributeInformation(attrSlot)
  1151.  
  1152.             #¹ÝÁö ¼ÒÄÏ ½Ã½ºÅÛ °ü·ÃÇؼ± ¾ÆÁ÷ ±âȹ ¹ÌÁ¤
  1153.             #self.__AppendAccessoryMetinSlotInfo(metinSlot, 99001)
  1154.            
  1155.  
  1156.         ### Belt Item ###
  1157.         elif item.ITEM_TYPE_BELT == itemType:
  1158.             self.__AppendLimitInformation()
  1159.             self.__AppendAffectInformation()
  1160.             self.__AppendAttributeInformation(attrSlot)
  1161.  
  1162.             self.__AppendAccessoryMetinSlotInfo(metinSlot, constInfo.GET_BELT_MATERIAL_VNUM(itemVnum))
  1163.  
  1164.         ## ÄÚ½ºÃõ ¾ÆÀÌÅÛ ##
  1165.         elif 0 != isCostumeItem:
  1166.             self.__AppendLimitInformation()
  1167.            
  1168.             if app.ENABLE_SASH_SYSTEM:
  1169.                 if isCostumeSash:
  1170.                     ## ABSORPTION RATE
  1171.                     absChance = int(metinSlot[sash.ABSORPTION_SOCKET])
  1172.                     self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (absChance), self.CONDITION_COLOR)
  1173.                     ## END ABSOPRTION RATE
  1174.                    
  1175.                     itemAbsorbedVnum = int(metinSlot[sash.ABSORBED_SOCKET])
  1176.                     if itemAbsorbedVnum:
  1177.                         ## ATTACK / DEFENCE
  1178.                         item.SelectItem(itemAbsorbedVnum)
  1179.                         if item.GetItemType() == item.ITEM_TYPE_WEAPON:
  1180.                             if item.GetItemSubType() == item.WEAPON_FAN:
  1181.                                 self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
  1182.                                 item.SelectItem(itemAbsorbedVnum)
  1183.                                 self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
  1184.                             else:
  1185.                                 self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
  1186.                                 item.SelectItem(itemAbsorbedVnum)
  1187.                                 self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
  1188.                         elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
  1189.                             defGrade = item.GetValue(1)
  1190.                             defBonus = item.GetValue(5) * 2
  1191.                             defGrade = self.CalcSashValue(defGrade, metinSlot[sash.ABSORPTION_SOCKET])
  1192.                             defBonus = self.CalcSashValue(defBonus, metinSlot[sash.ABSORPTION_SOCKET])
  1193.                            
  1194.                             if defGrade > 0:
  1195.                                 self.AppendSpace(5)
  1196.                                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
  1197.                            
  1198.                             item.SelectItem(itemAbsorbedVnum)
  1199.                             self.__AppendMagicDefenceInfo(metinSlot[sash.ABSORPTION_SOCKET])
  1200.                         ## END ATTACK / DEFENCE
  1201.                        
  1202.                         ## EFFECT
  1203.                         item.SelectItem(itemAbsorbedVnum)
  1204.                         for i in xrange(item.ITEM_APPLY_MAX_NUM):
  1205.                             (affectType, affectValue) = item.GetAffect(i)
  1206.                             affectValue = self.CalcSashValue(affectValue, metinSlot[sash.ABSORPTION_SOCKET])
  1207.                             affectString = self.__GetAffectString(affectType, affectValue)
  1208.                             if affectString and affectValue > 0:
  1209.                                 self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
  1210.                            
  1211.                             item.SelectItem(itemAbsorbedVnum)
  1212.                         # END EFFECT
  1213.                        
  1214.                         item.SelectItem(itemVnum)
  1215.                         ## ATTR
  1216.                         self.__AppendAttributeInformation(attrSlot, metinSlot[sash.ABSORPTION_SOCKET])
  1217.                         # END ATTR
  1218.                     else:
  1219.                         # ATTR
  1220.                         self.__AppendAttributeInformation(attrSlot)
  1221.                         # END ATTR
  1222.                 else:
  1223.                     self.__AppendAffectInformation()
  1224.                     self.__AppendAttributeInformation(attrSlot)
  1225.             else:
  1226.                 self.__AppendAffectInformation()
  1227.                 self.__AppendAttributeInformation(attrSlot)
  1228.            
  1229.             self.AppendWearableInformation()
  1230.             bHasRealtimeFlag = 0
  1231.             for i in xrange(item.LIMIT_MAX_NUM):
  1232.                 (limitType, limitValue) = item.GetLimit(i)
  1233.                 if item.LIMIT_REAL_TIME == limitType:
  1234.                     bHasRealtimeFlag = 1
  1235.            
  1236.             if bHasRealtimeFlag == 1:
  1237.                 self.AppendMallItemLastTime(metinSlot[0])
  1238.  
  1239.                
  1240.         ## Rod ##
  1241.         elif item.ITEM_TYPE_ROD == itemType:
  1242.  
  1243.             if 0 != metinSlot:
  1244.                 curLevel = item.GetValue(0) / 10
  1245.                 curEXP = metinSlot[0]
  1246.                 maxEXP = item.GetValue(2)
  1247.                 self.__AppendLimitInformation()
  1248.                 self.__AppendRodInformation(curLevel, curEXP, maxEXP)
  1249.  
  1250.         ## Pick ##
  1251.         elif item.ITEM_TYPE_PICK == itemType:
  1252.  
  1253.             if 0 != metinSlot:
  1254.                 curLevel = item.GetValue(0) / 10
  1255.                 curEXP = metinSlot[0]
  1256.                 maxEXP = item.GetValue(2)
  1257.                 self.__AppendLimitInformation()
  1258.                 self.__AppendPickInformation(curLevel, curEXP, maxEXP)
  1259.  
  1260.         ## Lottery ##
  1261.         elif item.ITEM_TYPE_LOTTERY == itemType:
  1262.             if 0 != metinSlot:
  1263.  
  1264.                 ticketNumber = int(metinSlot[0])
  1265.                 stepNumber = int(metinSlot[1])
  1266.  
  1267.                 self.AppendSpace(5)
  1268.                 self.AppendTextLine(localeInfo.TOOLTIP_LOTTERY_STEP_NUMBER % (stepNumber), self.NORMAL_COLOR)
  1269.                 self.AppendTextLine(localeInfo.TOOLTIP_LOTTO_NUMBER % (ticketNumber), self.NORMAL_COLOR);
  1270.  
  1271.         ### Metin ###
  1272.         elif item.ITEM_TYPE_METIN == itemType:
  1273.             self.AppendMetinInformation()
  1274.             self.AppendMetinWearInformation()
  1275.  
  1276.         ### Fish ###
  1277.         elif item.ITEM_TYPE_FISH == itemType:
  1278.             if 0 != metinSlot:
  1279.                 self.__AppendFishInfo(metinSlot[0])
  1280.        
  1281.         ## item.ITEM_TYPE_BLEND
  1282.         elif item.ITEM_TYPE_BLEND == itemType:
  1283.             self.__AppendLimitInformation()
  1284.  
  1285.             if metinSlot:
  1286.                 affectType = metinSlot[0]
  1287.                 affectValue = metinSlot[1]
  1288.                 time = metinSlot[2]
  1289.                 self.AppendSpace(5)
  1290.                 affectText = self.__GetAffectString(affectType, affectValue)
  1291.  
  1292.                 self.AppendTextLine(affectText, self.NORMAL_COLOR)
  1293.  
  1294.                 if time > 0:
  1295.                     minute = (time / 60)
  1296.                     second = (time % 60)
  1297.                     timeString = localeInfo.TOOLTIP_POTION_TIME
  1298.  
  1299.                     if minute > 0:
  1300.                         timeString += str(minute) + localeInfo.TOOLTIP_POTION_MIN
  1301.                     if second > 0:
  1302.                         timeString += " " + str(second) + localeInfo.TOOLTIP_POTION_SEC
  1303.  
  1304.                     self.AppendTextLine(timeString)
  1305.                 else:
  1306.                     self.AppendTextLine(localeInfo.BLEND_POTION_NO_TIME)
  1307.             else:
  1308.                 self.AppendTextLine("BLEND_POTION_NO_INFO")
  1309.  
  1310.         elif item.ITEM_TYPE_UNIQUE == itemType:
  1311.             if 0 != metinSlot:
  1312.                 bHasRealtimeFlag = 0
  1313.                
  1314.                 for i in xrange(item.LIMIT_MAX_NUM):
  1315.                     (limitType, limitValue) = item.GetLimit(i)
  1316.  
  1317.                     if item.LIMIT_REAL_TIME == limitType:
  1318.                         bHasRealtimeFlag = 1
  1319.                
  1320.                 if 1 == bHasRealtimeFlag:
  1321.                     self.AppendMallItemLastTime(metinSlot[0])      
  1322.                 else:
  1323.                     time = metinSlot[player.METIN_SOCKET_MAX_NUM-1]
  1324.  
  1325.                     if 1 == item.GetValue(2): ## ½Ç½Ã°£ ÀÌ¿ë Flag / ÀåÂø ¾ÈÇصµ ÁØ´Ù
  1326.                         self.AppendMallItemLastTime(time)
  1327.                     else:
  1328.                         self.AppendUniqueItemLastTime(time)
  1329.  
  1330.         ### Use ###
  1331.         elif item.ITEM_TYPE_USE == itemType:
  1332.             self.__AppendLimitInformation()
  1333.  
  1334.             if item.USE_POTION == itemSubType or item.USE_POTION_NODELAY == itemSubType:
  1335.                 self.__AppendPotionInformation()
  1336.  
  1337.             elif item.USE_ABILITY_UP == itemSubType:
  1338.                 self.__AppendAbilityPotionInformation()
  1339.  
  1340.  
  1341.             ## ¿µ¼® °¨Áö±â
  1342.             if 27989 == itemVnum or 76006 == itemVnum:
  1343.                 if 0 != metinSlot:
  1344.                     useCount = int(metinSlot[0])
  1345.  
  1346.                     self.AppendSpace(5)
  1347.                     self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (6 - useCount), self.NORMAL_COLOR)
  1348.  
  1349.             ## À̺¥Æ® °¨Áö±â
  1350.             elif 50004 == itemVnum:
  1351.                 if 0 != metinSlot:
  1352.                     useCount = int(metinSlot[0])
  1353.  
  1354.                     self.AppendSpace(5)
  1355.                     self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (10 - useCount), self.NORMAL_COLOR)
  1356.  
  1357.             ## ÀÚµ¿¹°¾à
  1358.             elif constInfo.IS_AUTO_POTION(itemVnum):
  1359.                 if 0 != metinSlot:
  1360.                     ## 0: È°¼ºÈ­, 1: »ç¿ë·®, 2: ÃÑ·®
  1361.                     isActivated = int(metinSlot[0])
  1362.                     usedAmount = float(metinSlot[1])
  1363.                     totalAmount = float(metinSlot[2])
  1364.                    
  1365.                     if 0 == totalAmount:
  1366.                         totalAmount = 1
  1367.                    
  1368.                     self.AppendSpace(5)
  1369.  
  1370.                     if 0 != isActivated:
  1371.                         self.AppendTextLine("(%s)" % (localeInfo.TOOLTIP_AUTO_POTION_USING), self.SPECIAL_POSITIVE_COLOR)
  1372.                         self.AppendSpace(5)
  1373.                        
  1374.                     self.AppendTextLine(localeInfo.TOOLTIP_AUTO_POTION_REST % (100.0 - ((usedAmount / totalAmount) * 100.0)), self.POSITIVE_COLOR)
  1375.                                
  1376.             ## ±Íȯ ±â¾ïºÎ
  1377.             elif itemVnum in WARP_SCROLLS:
  1378.                 if 0 != metinSlot:
  1379.                     xPos = int(metinSlot[0])
  1380.                     yPos = int(metinSlot[1])
  1381.  
  1382.                     if xPos != 0 and yPos != 0:
  1383.                         (mapName, xBase, yBase) = background.GlobalPositionToMapInfo(xPos, yPos)
  1384.                        
  1385.                         localeMapName=localeInfo.MINIMAP_ZONE_NAME_DICT.get(mapName, "")
  1386.  
  1387.                         self.AppendSpace(5)
  1388.  
  1389.                         if localeMapName!="":                      
  1390.                             self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION % (localeMapName, int(xPos-xBase)/100, int(yPos-yBase)/100), self.NORMAL_COLOR)
  1391.                         else:
  1392.                             self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION_ERROR % (int(xPos)/100, int(yPos)/100), self.NORMAL_COLOR)
  1393.                             dbg.TraceError("NOT_EXIST_IN_MINIMAP_ZONE_NAME_DICT: %s" % mapName)
  1394.  
  1395.             #####
  1396.             if item.USE_SPECIAL == itemSubType:
  1397.                 bHasRealtimeFlag = 0
  1398.                 for i in xrange(item.LIMIT_MAX_NUM):
  1399.                     (limitType, limitValue) = item.GetLimit(i)
  1400.  
  1401.                     if item.LIMIT_REAL_TIME == limitType:
  1402.                         bHasRealtimeFlag = 1
  1403.        
  1404.                 ## ÀÖ´Ù¸é °ü·Ã Á¤º¸¸¦ Ç¥½ÃÇÔ. ex) ³²Àº ½Ã°£ : 6ÀÏ 6½Ã°£ 58ºÐ
  1405.                 if 1 == bHasRealtimeFlag:
  1406.                     self.AppendMallItemLastTime(metinSlot[0])
  1407.                 else:
  1408.                     # ... ÀÌ°Å... ¼­¹ö¿¡´Â ÀÌ·± ½Ã°£ üũ ¾ÈµÇ¾î Àִµ¥...
  1409.                     # ¿Ö ÀÌ·±°Ô ÀÖ´ÂÁö ¾ËÁö´Â ¸øÇϳª ±×³É µÎÀÚ...
  1410.                     if 0 != metinSlot:
  1411.                         time = metinSlot[player.METIN_SOCKET_MAX_NUM-1]
  1412.  
  1413.                         ## ½Ç½Ã°£ ÀÌ¿ë Flag
  1414.                         if 1 == item.GetValue(2):
  1415.                             self.AppendMallItemLastTime(time)
  1416.            
  1417.             elif item.USE_TIME_CHARGE_PER == itemSubType:
  1418.                 bHasRealtimeFlag = 0
  1419.                 for i in xrange(item.LIMIT_MAX_NUM):
  1420.                     (limitType, limitValue) = item.GetLimit(i)
  1421.  
  1422.                     if item.LIMIT_REAL_TIME == limitType:
  1423.                         bHasRealtimeFlag = 1
  1424.                 if metinSlot[2]:
  1425.                     self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(metinSlot[2]))
  1426.                 else:
  1427.                     self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(item.GetValue(0)))
  1428.        
  1429.                 ## ÀÖ´Ù¸é °ü·Ã Á¤º¸¸¦ Ç¥½ÃÇÔ. ex) ³²Àº ½Ã°£ : 6ÀÏ 6½Ã°£ 58ºÐ
  1430.                 if 1 == bHasRealtimeFlag:
  1431.                     self.AppendMallItemLastTime(metinSlot[0])
  1432.  
  1433.             elif item.USE_TIME_CHARGE_FIX == itemSubType:
  1434.                 bHasRealtimeFlag = 0
  1435.                 for i in xrange(item.LIMIT_MAX_NUM):
  1436.                     (limitType, limitValue) = item.GetLimit(i)
  1437.  
  1438.                     if item.LIMIT_REAL_TIME == limitType:
  1439.                         bHasRealtimeFlag = 1
  1440.                 if metinSlot[2]:
  1441.                     self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_FIX(metinSlot[2]))
  1442.                 else:
  1443.                     self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_FIX(item.GetValue(0)))
  1444.        
  1445.                 ## ÀÖ´Ù¸é °ü·Ã Á¤º¸¸¦ Ç¥½ÃÇÔ. ex) ³²Àº ½Ã°£ : 6ÀÏ 6½Ã°£ 58ºÐ
  1446.                 if 1 == bHasRealtimeFlag:
  1447.                     self.AppendMallItemLastTime(metinSlot[0])
  1448.  
  1449.         elif item.ITEM_TYPE_QUEST == itemType:
  1450.             if itemVnum >= 53001 and itemVnum <= 53026:
  1451.                 self.AppendSpace(5)
  1452.                 for g in xrange(item.ITEM_APPLY_MAX_NUM):
  1453.                     (affectType, affectValue) = item.GetAffect(g)
  1454.                     affectString = self.__GetAffectString(affectType, affectValue)
  1455.                     if affectString:
  1456.                         affectColor = self.GetChangeTextLineColor(affectValue)
  1457.                         self.AppendTextLine(affectString, affectColor)
  1458.  
  1459.             for i in xrange(item.LIMIT_MAX_NUM):
  1460.                 (limitType, limitValue) = item.GetLimit(i)
  1461.  
  1462.                 if item.LIMIT_REAL_TIME == limitType:
  1463.                     self.AppendMallItemLastTime(metinSlot[0])
  1464.  
  1465.         elif item.ITEM_TYPE_DS == itemType:
  1466.             self.AppendTextLine(self.__DragonSoulInfoString(itemVnum))
  1467.             self.__AppendAttributeInformation(attrSlot)
  1468.         else:
  1469.             self.__AppendLimitInformation()
  1470.  
  1471.         for i in xrange(item.LIMIT_MAX_NUM):
  1472.             (limitType, limitValue) = item.GetLimit(i)
  1473.             #dbg.TraceError("LimitType : %d, limitValue : %d" % (limitType, limitValue))
  1474.            
  1475.             if item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
  1476.                 self.AppendRealTimeStartFirstUseLastTime(item, metinSlot, i)
  1477.                 #dbg.TraceError("2) REAL_TIME_START_FIRST_USE flag On ")
  1478.                
  1479.             elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
  1480.                 self.AppendTimerBasedOnWearLastTime(metinSlot)
  1481.                 #dbg.TraceError("1) REAL_TIME flag On ")
  1482.  
  1483.         if chr.IsGameMaster(player.GetMainCharacterIndex()):
  1484.             self.AppendTextLine("Item Vnum: %i" % itemVnum, self.PRICE_COLOR)
  1485.                
  1486.         self.AppendAntiflagInformation()       
  1487.         self.ShowToolTip()
  1488.  
  1489.     def __DragonSoulInfoString (self, dwVnum):
  1490.         step = (dwVnum / 100) % 10
  1491.         refine = (dwVnum / 10) % 10
  1492.         if 0 == step:
  1493.             return localeInfo.DRAGON_SOUL_STEP_LEVEL1 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
  1494.         elif 1 == step:
  1495.             return localeInfo.DRAGON_SOUL_STEP_LEVEL2 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
  1496.         elif 2 == step:
  1497.             return localeInfo.DRAGON_SOUL_STEP_LEVEL3 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
  1498.         elif 3 == step:
  1499.             return localeInfo.DRAGON_SOUL_STEP_LEVEL4 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
  1500.         elif 4 == step:
  1501.             return localeInfo.DRAGON_SOUL_STEP_LEVEL5 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
  1502.         else:
  1503.             return ""
  1504.  
  1505.  
  1506.     ## Çì¾îÀΰ¡?
  1507.     def __IsHair(self, itemVnum):
  1508.         return (self.__IsOldHair(itemVnum) or
  1509.             self.__IsNewHair(itemVnum) or
  1510.             self.__IsNewHair2(itemVnum) or
  1511.             self.__IsNewHair3(itemVnum) or
  1512.             self.__IsCostumeHair(itemVnum)
  1513.             )
  1514.  
  1515.     def __IsOldHair(self, itemVnum):
  1516.         return itemVnum > 73000 and itemVnum < 74000   
  1517.  
  1518.     def __IsNewHair(self, itemVnum):
  1519.         return itemVnum > 74000 and itemVnum < 75000   
  1520.  
  1521.     def __IsNewHair2(self, itemVnum):
  1522.         return itemVnum > 75000 and itemVnum < 76000   
  1523.  
  1524.     def __IsNewHair3(self, itemVnum):
  1525.         return ((74012 < itemVnum and itemVnum < 74022) or
  1526.             (74262 < itemVnum and itemVnum < 74272) or
  1527.             (74512 < itemVnum and itemVnum < 74522) or
  1528.             (74762 < itemVnum and itemVnum < 74772) or
  1529.             (45000 < itemVnum and itemVnum < 47000))
  1530.  
  1531.     def __IsCostumeHair(self, itemVnum):
  1532.         return app.ENABLE_COSTUME_SYSTEM and self.__IsNewHair3(itemVnum - 100000)
  1533.        
  1534.     def __AppendHairIcon(self, itemVnum):
  1535.         itemImage = ui.ImageBox()
  1536.         itemImage.SetParent(self)
  1537.         itemImage.Show()           
  1538.  
  1539.         if self.__IsOldHair(itemVnum):
  1540.             itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum)+".tga")
  1541.         elif self.__IsNewHair3(itemVnum):
  1542.             itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
  1543.         elif self.__IsNewHair(itemVnum): # ±âÁ¸ Çì¾î ¹øÈ£¸¦ ¿¬°á½ÃÄѼ­ »ç¿ëÇÑ´Ù. »õ·Î¿î ¾ÆÀÌÅÛÀº 1000¸¸Å­ ¹øÈ£°¡ ´Ã¾ú´Ù.
  1544.             itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum-1000)+".tga")
  1545.         elif self.__IsNewHair2(itemVnum):
  1546.             itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
  1547.         elif self.__IsCostumeHair(itemVnum):
  1548.             itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum - 100000))
  1549.  
  1550.         itemImage.SetPosition(itemImage.GetWidth()/2, self.toolTipHeight)
  1551.         self.toolTipHeight += itemImage.GetHeight()
  1552.         #self.toolTipWidth += itemImage.GetWidth()/2
  1553.         self.childrenList.append(itemImage)
  1554.         self.ResizeToolTip()
  1555.  
  1556.     ## »çÀÌÁî°¡ Å« Description ÀÏ °æ¿ì ÅøÆÁ »çÀÌÁ Á¶Á¤ÇÑ´Ù
  1557.     def __AdjustMaxWidth(self, attrSlot, desc):
  1558.         newToolTipWidth = self.toolTipWidth
  1559.         newToolTipWidth = max(self.__AdjustAttrMaxWidth(attrSlot), newToolTipWidth)
  1560.         newToolTipWidth = max(self.__AdjustDescMaxWidth(desc), newToolTipWidth)
  1561.         if newToolTipWidth > self.toolTipWidth:
  1562.             self.toolTipWidth = newToolTipWidth
  1563.             self.ResizeToolTip()
  1564.  
  1565.     def __AdjustAttrMaxWidth(self, attrSlot):
  1566.         if 0 == attrSlot:
  1567.             return self.toolTipWidth
  1568.  
  1569.         maxWidth = self.toolTipWidth
  1570.         for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  1571.             type = attrSlot[i][0]
  1572.             value = attrSlot[i][1]
  1573.             if self.ATTRIBUTE_NEED_WIDTH.has_key(type):
  1574.                 if value > 0:
  1575.                     maxWidth = max(self.ATTRIBUTE_NEED_WIDTH[type], maxWidth)
  1576.  
  1577.                     # ATTR_CHANGE_TOOLTIP_WIDTH
  1578.                     #self.toolTipWidth = max(self.ATTRIBUTE_NEED_WIDTH[type], self.toolTipWidth)
  1579.                     #self.ResizeToolTip()
  1580.                     # END_OF_ATTR_CHANGE_TOOLTIP_WIDTH
  1581.  
  1582.         return maxWidth
  1583.  
  1584.     def __AdjustDescMaxWidth(self, desc):
  1585.         if len(desc) < DESC_DEFAULT_MAX_COLS:
  1586.             return self.toolTipWidth
  1587.    
  1588.         return DESC_WESTERN_MAX_WIDTH
  1589.  
  1590.     def __SetSkillBookToolTip(self, skillIndex, bookName, skillGrade):
  1591.         skillName = skill.GetSkillName(skillIndex)
  1592.  
  1593.         if not skillName:
  1594.             return
  1595.  
  1596.         if localeInfo.IsVIETNAM():
  1597.             itemName = bookName + " " + skillName
  1598.         else:
  1599.             itemName = skillName + " " + bookName
  1600.         self.SetTitle(itemName)
  1601.  
  1602.     def __AppendPickInformation(self, curLevel, curEXP, maxEXP):
  1603.         self.AppendSpace(5)
  1604.         self.AppendTextLine(localeInfo.TOOLTIP_PICK_LEVEL % (curLevel), self.NORMAL_COLOR)
  1605.         self.AppendTextLine(localeInfo.TOOLTIP_PICK_EXP % (curEXP, maxEXP), self.NORMAL_COLOR)
  1606.  
  1607.         if curEXP == maxEXP:
  1608.             self.AppendSpace(5)
  1609.             self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE1, self.NORMAL_COLOR)
  1610.             self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE2, self.NORMAL_COLOR)
  1611.             self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE3, self.NORMAL_COLOR)
  1612.  
  1613.  
  1614.     def __AppendRodInformation(self, curLevel, curEXP, maxEXP):
  1615.         self.AppendSpace(5)
  1616.         self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_LEVEL % (curLevel), self.NORMAL_COLOR)
  1617.         self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_EXP % (curEXP, maxEXP), self.NORMAL_COLOR)
  1618.  
  1619.         if curEXP == maxEXP:
  1620.             self.AppendSpace(5)
  1621.             self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE1, self.NORMAL_COLOR)
  1622.             self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE2, self.NORMAL_COLOR)
  1623.             self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE3, self.NORMAL_COLOR)
  1624.  
  1625.     def __AppendLimitInformation(self):
  1626.  
  1627.         appendSpace = False
  1628.  
  1629.         for i in xrange(item.LIMIT_MAX_NUM):
  1630.  
  1631.             (limitType, limitValue) = item.GetLimit(i)
  1632.  
  1633.             if limitValue > 0:
  1634.                 if False == appendSpace:
  1635.                     self.AppendSpace(5)
  1636.                     appendSpace = True
  1637.  
  1638.             else:
  1639.                 continue
  1640.  
  1641.             if item.LIMIT_LEVEL == limitType:
  1642.                 color = self.GetLimitTextLineColor(player.GetStatus(player.LEVEL), limitValue)
  1643.                 self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_LEVEL % (limitValue), color)
  1644.  
  1645.     def __GetAffectString(self, affectType, affectValue, smax = 0):
  1646.         if 0 == affectType:
  1647.             return None
  1648.  
  1649.         if 0 == affectValue:
  1650.             return None
  1651.  
  1652.         try:
  1653.             if self.AFFECT_DICT[affectType][1] == affectValue and smax != 0:
  1654.                 return self.AFFECT_DICT[affectType][0](affectValue) + " |cFFFF0000|h[TOP]"
  1655.             else:
  1656.                 return self.AFFECT_DICT[affectType][0](affectValue)
  1657.         except TypeError:
  1658.             return "UNKNOWN_VALUE[%s] %s" % (affectType, affectValue)
  1659.         except KeyError:
  1660.             return "UNKNOWN_TYPE[%s] %s" % (affectType, affectValue)
  1661.  
  1662.     def AppendAntiflagInformation(self):
  1663.         antiFlagDict = {
  1664.             "|Eemoji/anti_drop|e"               : item.ITEM_ANTIFLAG_DROP,
  1665.             "|Eemoji/anti_sell|e"               : item.ITEM_ANTIFLAG_SELL,
  1666.             "|Eemoji/anti_trade|e"              : item.ITEM_ANTIFLAG_GIVE,
  1667.             localeInfo.TOOLTIP_ANTIFLAG_PKDROP  : item.ITEM_ANTIFLAG_PKDROP,
  1668.             localeInfo.TOOLTIP_ANTIFLAG_STACK   : item.ITEM_ANTIFLAG_STACK,
  1669.             "|Eemoji/anti_shop|e"               : item.ITEM_ANTIFLAG_MYSHOP,
  1670.         #   localeInfo.TOOLTIP_ANTIFLAG_SAFEBOX : item.ITEM_ANTIFLAG_SAFEBOX,
  1671.         }
  1672.        
  1673.         antiFlagNames = [name for name, flag in antiFlagDict.iteritems() if item.IsAntiFlag(flag)]
  1674.         if len(antiFlagNames) > 0:
  1675.             self.AppendTextLine(localeInfo.NOT_POSSIBLE, self.NEGATIVE_COLOR)
  1676.  
  1677.         if antiFlagNames:
  1678.             textLine = self.AppendTextLine('{} {}'.format(', '.join(antiFlagNames), ""), self.CONDITION_COLOR)
  1679.             textLine.SetFeather()
  1680.  
  1681.     def __AppendAffectInformation(self):
  1682.         for i in xrange(item.ITEM_APPLY_MAX_NUM):
  1683.  
  1684.             (affectType, affectValue) = item.GetAffect(i)
  1685.  
  1686.             affectString = self.__GetAffectString(affectType, affectValue)
  1687.             if affectString:
  1688.                 self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
  1689.  
  1690.     def AppendWearableInformation(self):
  1691.  
  1692.         self.AppendSpace(5)
  1693.         self.AppendTextLine(localeInfo.TOOLTIP_ITEM_WEARABLE_JOB, self.NORMAL_COLOR)
  1694.  
  1695.         flagList = (
  1696.             not item.IsAntiFlag(item.ITEM_ANTIFLAG_WARRIOR),
  1697.             not item.IsAntiFlag(item.ITEM_ANTIFLAG_ASSASSIN),
  1698.             not item.IsAntiFlag(item.ITEM_ANTIFLAG_SURA),
  1699.             not item.IsAntiFlag(item.ITEM_ANTIFLAG_SHAMAN))
  1700.  
  1701.         characterNames = ""
  1702.         for i in xrange(self.CHARACTER_COUNT):
  1703.  
  1704.             name = self.CHARACTER_NAMES[i]
  1705.             flag = flagList[i]
  1706.  
  1707.             if flag:
  1708.                 characterNames += " "
  1709.                 characterNames += name
  1710.  
  1711.         textLine = self.AppendTextLine(characterNames, self.NORMAL_COLOR, True)
  1712.         textLine.SetFeather()
  1713.  
  1714.         if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE):
  1715.             textLine = self.AppendTextLine(localeInfo.FOR_FEMALE, self.NORMAL_COLOR, True)
  1716.             textLine.SetFeather()
  1717.  
  1718.         if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE):
  1719.             textLine = self.AppendTextLine(localeInfo.FOR_MALE, self.NORMAL_COLOR, True)
  1720.             textLine.SetFeather()
  1721.  
  1722.     def __AppendPotionInformation(self):
  1723.         self.AppendSpace(5)
  1724.  
  1725.         healHP = item.GetValue(0)
  1726.         healSP = item.GetValue(1)
  1727.         healStatus = item.GetValue(2)
  1728.         healPercentageHP = item.GetValue(3)
  1729.         healPercentageSP = item.GetValue(4)
  1730.  
  1731.         if healHP > 0:
  1732.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_HP_POINT % healHP, self.GetChangeTextLineColor(healHP))
  1733.         if healSP > 0:
  1734.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_SP_POINT % healSP, self.GetChangeTextLineColor(healSP))
  1735.         if healStatus != 0:
  1736.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_CURE)
  1737.         if healPercentageHP > 0:
  1738.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_HP_PERCENT % healPercentageHP, self.GetChangeTextLineColor(healPercentageHP))
  1739.         if healPercentageSP > 0:
  1740.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_SP_PERCENT % healPercentageSP, self.GetChangeTextLineColor(healPercentageSP))
  1741.  
  1742.     def __AppendAbilityPotionInformation(self):
  1743.  
  1744.         self.AppendSpace(5)
  1745.  
  1746.         abilityType = item.GetValue(0)
  1747.         time = item.GetValue(1)
  1748.         point = item.GetValue(2)
  1749.  
  1750.         if abilityType == item.APPLY_ATT_SPEED:
  1751.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_ATTACK_SPEED % point, self.GetChangeTextLineColor(point))
  1752.         elif abilityType == item.APPLY_MOV_SPEED:
  1753.             self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_MOVING_SPEED % point, self.GetChangeTextLineColor(point))
  1754.  
  1755.         if time > 0:
  1756.             minute = (time / 60)
  1757.             second = (time % 60)
  1758.             timeString = localeInfo.TOOLTIP_POTION_TIME
  1759.  
  1760.             if minute > 0:
  1761.                 timeString += str(minute) + localeInfo.TOOLTIP_POTION_MIN
  1762.             if second > 0:
  1763.                 timeString += " " + str(second) + localeInfo.TOOLTIP_POTION_SEC
  1764.  
  1765.             self.AppendTextLine(timeString)
  1766.  
  1767.     def GetPriceColor(self, price):
  1768.         if price>=constInfo.HIGH_PRICE:
  1769.             return self.HIGH_PRICE_COLOR
  1770.         if price>=constInfo.MIDDLE_PRICE:
  1771.             return self.MIDDLE_PRICE_COLOR
  1772.         else:
  1773.             return self.LOW_PRICE_COLOR
  1774.  
  1775. #   def AppendPrice(self, price):
  1776. #       self.AppendSpace(5)
  1777. #       self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE  % (localeInfo.NumberToMoneyString(price)), self.GetPriceColor(price))
  1778.  
  1779.     def GetPriceColorFree(self, price):
  1780.         if price == 0:
  1781.             return self.GREEN_COLOR_PRICE_FREE
  1782.  
  1783.     def AppendPrice(self, price):
  1784.         self.AppendSpace(5)
  1785.         if price == 0:
  1786.             self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE_FREE, self.GetPriceColorFree(price))
  1787.         else:
  1788.             self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE  % (localeInfo.NumberToMoneyString(price)), self.GetPriceColor(price))
  1789.  
  1790.     def AppendPriceBySecondaryCoin(self, price):
  1791.         self.AppendSpace(5)
  1792.         self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE  % (localeInfo.NumberToSecondaryCoinString(price)), self.GetPriceColor(price))
  1793.  
  1794.     def AppendSellingPrice(self, price):
  1795.         if item.IsAntiFlag(item.ITEM_ANTIFLAG_SELL):           
  1796.             self.AppendTextLine(localeInfo.TOOLTIP_ANTI_SELL, self.DISABLE_COLOR)
  1797.             self.AppendSpace(5)
  1798.         else:
  1799.             self.AppendTextLine(localeInfo.TOOLTIP_SELLPRICE % (localeInfo.NumberToMoneyString(price)), self.GetPriceColor(price))
  1800.             self.AppendSpace(5)
  1801.  
  1802.     def AppendMetinInformation(self):
  1803.         affectType, affectValue = item.GetAffect(0)
  1804.         #affectType = item.GetValue(0)
  1805.         #affectValue = item.GetValue(1)
  1806.  
  1807.         affectString = self.__GetAffectString(affectType, affectValue)
  1808.  
  1809.         if affectString:
  1810.             self.AppendSpace(5)
  1811.             self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
  1812.  
  1813.     def AppendMetinWearInformation(self):
  1814.  
  1815.         self.AppendSpace(5)
  1816.         self.AppendTextLine(localeInfo.TOOLTIP_SOCKET_REFINABLE_ITEM, self.NORMAL_COLOR)
  1817.  
  1818.         flagList = (item.IsWearableFlag(item.WEARABLE_BODY),
  1819.                     item.IsWearableFlag(item.WEARABLE_HEAD),
  1820.                     item.IsWearableFlag(item.WEARABLE_FOOTS),
  1821.                     item.IsWearableFlag(item.WEARABLE_WRIST),
  1822.                     item.IsWearableFlag(item.WEARABLE_WEAPON),
  1823.                     item.IsWearableFlag(item.WEARABLE_NECK),
  1824.                     item.IsWearableFlag(item.WEARABLE_EAR),
  1825.                     item.IsWearableFlag(item.WEARABLE_UNIQUE),
  1826.                     item.IsWearableFlag(item.WEARABLE_SHIELD),
  1827.                     item.IsWearableFlag(item.WEARABLE_ARROW))
  1828.  
  1829.         wearNames = ""
  1830.         for i in xrange(self.WEAR_COUNT):
  1831.  
  1832.             name = self.WEAR_NAMES[i]
  1833.             flag = flagList[i]
  1834.  
  1835.             if flag:
  1836.                 wearNames += "  "
  1837.                 wearNames += name
  1838.  
  1839.         textLine = ui.TextLine()
  1840.         textLine.SetParent(self)
  1841.         textLine.SetFontName(self.defFontName)
  1842.         textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
  1843.         textLine.SetHorizontalAlignCenter()
  1844.         textLine.SetPackedFontColor(self.NORMAL_COLOR)
  1845.         textLine.SetText(wearNames)
  1846.         textLine.Show()
  1847.         self.childrenList.append(textLine)
  1848.  
  1849.         self.toolTipHeight += self.TEXT_LINE_HEIGHT
  1850.         self.ResizeToolTip()
  1851.  
  1852.     def GetMetinSocketType(self, number):
  1853.         if player.METIN_SOCKET_TYPE_NONE == number:
  1854.             return player.METIN_SOCKET_TYPE_NONE
  1855.         elif player.METIN_SOCKET_TYPE_SILVER == number:
  1856.             return player.METIN_SOCKET_TYPE_SILVER
  1857.         elif player.METIN_SOCKET_TYPE_GOLD == number:
  1858.             return player.METIN_SOCKET_TYPE_GOLD
  1859.         else:
  1860.             item.SelectItem(number)
  1861.             if item.METIN_NORMAL == item.GetItemSubType():
  1862.                 return player.METIN_SOCKET_TYPE_SILVER
  1863.             elif item.METIN_GOLD == item.GetItemSubType():
  1864.                 return player.METIN_SOCKET_TYPE_GOLD
  1865.             elif "USE_PUT_INTO_ACCESSORY_SOCKET" == item.GetUseType(number):
  1866.                 return player.METIN_SOCKET_TYPE_SILVER
  1867.             elif "USE_PUT_INTO_RING_SOCKET" == item.GetUseType(number):
  1868.                 return player.METIN_SOCKET_TYPE_SILVER
  1869.             elif "USE_PUT_INTO_BELT_SOCKET" == item.GetUseType(number):
  1870.                 return player.METIN_SOCKET_TYPE_SILVER
  1871.  
  1872.         return player.METIN_SOCKET_TYPE_NONE
  1873.  
  1874.     def GetMetinItemIndex(self, number):
  1875.         if player.METIN_SOCKET_TYPE_SILVER == number:
  1876.             return 0
  1877.         if player.METIN_SOCKET_TYPE_GOLD == number:
  1878.             return 0
  1879.  
  1880.         return number
  1881.  
  1882.     def __AppendAccessoryMetinSlotInfo(self, metinSlot, mtrlVnum):     
  1883.         ACCESSORY_SOCKET_MAX_SIZE = 3      
  1884.  
  1885.         cur=min(metinSlot[0], ACCESSORY_SOCKET_MAX_SIZE)
  1886.         end=min(metinSlot[1], ACCESSORY_SOCKET_MAX_SIZE)
  1887.  
  1888.         affectType1, affectValue1 = item.GetAffect(0)
  1889.         affectList1=[0, max(1, affectValue1*10/100), max(2, affectValue1*20/100), max(3, affectValue1*40/100)]
  1890.  
  1891.         affectType2, affectValue2 = item.GetAffect(1)
  1892.         affectList2=[0, max(1, affectValue2*10/100), max(2, affectValue2*20/100), max(3, affectValue2*40/100)]
  1893.  
  1894.         mtrlPos=0
  1895.         mtrlList=[mtrlVnum]*cur+[player.METIN_SOCKET_TYPE_SILVER]*(end-cur)
  1896.         for mtrl in mtrlList:
  1897.             affectString1 = self.__GetAffectString(affectType1, affectList1[mtrlPos+1]-affectList1[mtrlPos])           
  1898.             affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos+1]-affectList2[mtrlPos])
  1899.  
  1900.             leftTime = 0
  1901.             if cur == mtrlPos+1:
  1902.                 leftTime=metinSlot[2]
  1903.  
  1904.             self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, leftTime)
  1905.             mtrlPos+=1
  1906.  
  1907.     def __AppendMetinSlotInfo(self, metinSlot):
  1908.         if self.__AppendMetinSlotInfo_IsEmptySlotList(metinSlot):
  1909.             return
  1910.  
  1911.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  1912.             self.__AppendMetinSlotInfo_AppendMetinSocketData(i, metinSlot[i])
  1913.  
  1914.     def __AppendMetinSlotInfo_IsEmptySlotList(self, metinSlot):
  1915.         if 0 == metinSlot:
  1916.             return 1
  1917.  
  1918.         for i in xrange(player.METIN_SOCKET_MAX_NUM):
  1919.             metinSlotData=metinSlot[i]
  1920.             if 0 != self.GetMetinSocketType(metinSlotData):
  1921.                 if 0 != self.GetMetinItemIndex(metinSlotData):
  1922.                     return 0
  1923.  
  1924.         return 1
  1925.  
  1926.     def __AppendMetinSlotInfo_AppendMetinSocketData(self, index, metinSlotData, custumAffectString="", custumAffectString2="", leftTime=0):
  1927.  
  1928.         slotType = self.GetMetinSocketType(metinSlotData)
  1929.         itemIndex = self.GetMetinItemIndex(metinSlotData)
  1930.  
  1931.         if 0 == slotType:
  1932.             return
  1933.  
  1934.         self.AppendSpace(5)
  1935.  
  1936.         slotImage = ui.ImageBox()
  1937.         slotImage.SetParent(self)
  1938.         slotImage.Show()
  1939.  
  1940.         ## Name
  1941.         nameTextLine = ui.TextLine()
  1942.         nameTextLine.SetParent(self)
  1943.         nameTextLine.SetFontName(self.defFontName)
  1944.         nameTextLine.SetPackedFontColor(self.NORMAL_COLOR)
  1945.         nameTextLine.SetOutline()
  1946.         nameTextLine.SetFeather()
  1947.         nameTextLine.Show()        
  1948.  
  1949.         self.childrenList.append(nameTextLine)
  1950.  
  1951.         if player.METIN_SOCKET_TYPE_SILVER == slotType:
  1952.             slotImage.LoadImage("d:/ymir work/ui/game/windows/metin_slot_silver.sub")
  1953.         elif player.METIN_SOCKET_TYPE_GOLD == slotType:
  1954.             slotImage.LoadImage("d:/ymir work/ui/game/windows/metin_slot_gold.sub")
  1955.  
  1956.         self.childrenList.append(slotImage)
  1957.        
  1958.         if localeInfo.IsARABIC():
  1959.             slotImage.SetPosition(self.toolTipWidth - slotImage.GetWidth() - 9, self.toolTipHeight-1)
  1960.             nameTextLine.SetPosition(self.toolTipWidth - 50, self.toolTipHeight + 2)
  1961.         else:
  1962.             slotImage.SetPosition(9, self.toolTipHeight-1)
  1963.             nameTextLine.SetPosition(50, self.toolTipHeight + 2)
  1964.  
  1965.         metinImage = ui.ImageBox()
  1966.         metinImage.SetParent(self)
  1967.         metinImage.Show()
  1968.         self.childrenList.append(metinImage)
  1969.  
  1970.         if itemIndex:
  1971.  
  1972.             item.SelectItem(itemIndex)
  1973.  
  1974.             ## Image
  1975.             try:
  1976.                 metinImage.LoadImage(item.GetIconImageFileName())
  1977.             except:
  1978.                 dbg.TraceError("ItemToolTip.__AppendMetinSocketData() - Failed to find image file %d:%s" %
  1979.                     (itemIndex, item.GetIconImageFileName())
  1980.                 )
  1981.  
  1982.             nameTextLine.SetText(item.GetItemName())
  1983.            
  1984.             ## Affect      
  1985.             affectTextLine = ui.TextLine()
  1986.             affectTextLine.SetParent(self)
  1987.             affectTextLine.SetFontName(self.defFontName)
  1988.             affectTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
  1989.             affectTextLine.SetOutline()
  1990.             affectTextLine.SetFeather()
  1991.             affectTextLine.Show()          
  1992.                
  1993.             if localeInfo.IsARABIC():
  1994.                 metinImage.SetPosition(self.toolTipWidth - metinImage.GetWidth() - 10, self.toolTipHeight)
  1995.                 affectTextLine.SetPosition(self.toolTipWidth - 50, self.toolTipHeight + 16 + 2)
  1996.             else:
  1997.                 metinImage.SetPosition(10, self.toolTipHeight)
  1998.                 affectTextLine.SetPosition(50, self.toolTipHeight + 16 + 2)
  1999.                            
  2000.             if custumAffectString:
  2001.                 affectTextLine.SetText(custumAffectString)
  2002.             elif itemIndex!=constInfo.ERROR_METIN_STONE:
  2003.                 affectType, affectValue = item.GetAffect(0)
  2004.                 affectString = self.__GetAffectString(affectType, affectValue)
  2005.                 if affectString:
  2006.                     affectTextLine.SetText(affectString)
  2007.             else:
  2008.                 affectTextLine.SetText(localeInfo.TOOLTIP_APPLY_NOAFFECT)
  2009.            
  2010.             self.childrenList.append(affectTextLine)           
  2011.  
  2012.             if custumAffectString2:
  2013.                 affectTextLine = ui.TextLine()
  2014.                 affectTextLine.SetParent(self)
  2015.                 affectTextLine.SetFontName(self.defFontName)
  2016.                 affectTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
  2017.                 affectTextLine.SetPosition(50, self.toolTipHeight + 16 + 2 + 16 + 2)
  2018.                 affectTextLine.SetOutline()
  2019.                 affectTextLine.SetFeather()
  2020.                 affectTextLine.Show()
  2021.                 affectTextLine.SetText(custumAffectString2)
  2022.                 self.childrenList.append(affectTextLine)
  2023.                 self.toolTipHeight += 16 + 2
  2024.  
  2025.             if 0 != leftTime:
  2026.                 timeText = (localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(leftTime))
  2027.  
  2028.                 timeTextLine = ui.TextLine()
  2029.                 timeTextLine.SetParent(self)
  2030.                 timeTextLine.SetFontName(self.defFontName)
  2031.                 timeTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
  2032.                 timeTextLine.SetPosition(50, self.toolTipHeight + 16 + 2 + 16 + 2)
  2033.                 timeTextLine.SetOutline()
  2034.                 timeTextLine.SetFeather()
  2035.                 timeTextLine.Show()
  2036.                 timeTextLine.SetText(timeText)
  2037.                 self.childrenList.append(timeTextLine)
  2038.                 self.toolTipHeight += 16 + 2
  2039.  
  2040.         else:
  2041.             nameTextLine.SetText(localeInfo.TOOLTIP_SOCKET_EMPTY)
  2042.  
  2043.         self.toolTipHeight += 35
  2044.         self.ResizeToolTip()
  2045.  
  2046.     def __AppendFishInfo(self, size):
  2047.         if size > 0:
  2048.             self.AppendSpace(5)
  2049.             self.AppendTextLine(localeInfo.TOOLTIP_FISH_LEN % (float(size) / 100.0), self.NORMAL_COLOR)
  2050.  
  2051.     def AppendUniqueItemLastTime(self, restMin):
  2052.         restSecond = restMin*60
  2053.         self.AppendSpace(5)
  2054.         self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(restSecond), self.NORMAL_COLOR)
  2055.  
  2056.     def AppendMallItemLastTime(self, endTime):
  2057.         leftSec = max(0, endTime - app.GetGlobalTimeStamp())
  2058.         self.AppendSpace(5)
  2059.         self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(leftSec), self.NORMAL_COLOR)
  2060.        
  2061.     def AppendTimerBasedOnWearLastTime(self, metinSlot):
  2062.         if 0 == metinSlot[0]:
  2063.             self.AppendSpace(5)
  2064.             self.AppendTextLine(localeInfo.CANNOT_USE, self.DISABLE_COLOR)
  2065.         else:
  2066.             endTime = app.GetGlobalTimeStamp() + metinSlot[0]
  2067.             self.AppendMallItemLastTime(endTime)       
  2068.    
  2069.     def AppendRealTimeStartFirstUseLastTime(self, item, metinSlot, limitIndex):    
  2070.         useCount = metinSlot[1]
  2071.         endTime = metinSlot[0]
  2072.        
  2073.         # ÇÑ ¹øÀÌ¶óµµ »ç¿ëÇß´Ù¸é Socket0¿¡ Á¾·á ½Ã°£(2012³â 3¿ù 1ÀÏ 13½Ã 01ºÐ °°Àº..) ÀÌ ¹ÚÇôÀÖÀ½.
  2074.         # »ç¿ëÇÏÁö ¾Ê¾Ò´Ù¸é Socket0¿¡ ÀÌ¿ë°¡´É½Ã°£(À̸¦Å׸é 600 °°Àº °ª. ÃÊ´ÜÀ§)ÀÌ µé¾îÀÖÀ» ¼ö ÀÖ°í, 0À̶ó¸é Limit Value¿¡ ÀÖ´Â ÀÌ¿ë°¡´É½Ã°£À» »ç¿ëÇÑ´Ù.
  2075.         if 0 == useCount:
  2076.             if 0 == endTime:
  2077.                 (limitType, limitValue) = item.GetLimit(limitIndex)
  2078.                 endTime = limitValue
  2079.  
  2080.             endTime += app.GetGlobalTimeStamp()
  2081.    
  2082.         self.AppendMallItemLastTime(endTime)
  2083.  
  2084.     if app.ENABLE_SASH_SYSTEM:
  2085.         def SetSashResultItem(self, slotIndex, window_type = player.INVENTORY):
  2086.             (itemVnum, MinAbs, MaxAbs) = sash.GetResultItem()
  2087.             if not itemVnum:
  2088.                 return
  2089.            
  2090.             self.ClearToolTip()
  2091.            
  2092.             metinSlot = [player.GetItemMetinSocket(window_type, slotIndex, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
  2093.             attrSlot = [player.GetItemAttribute(window_type, slotIndex, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
  2094.            
  2095.             item.SelectItem(itemVnum)
  2096.             itemType = item.GetItemType()
  2097.             itemSubType = item.GetItemSubType()
  2098.             if itemType != item.ITEM_TYPE_COSTUME and itemSubType != item.COSTUME_TYPE_SASH:
  2099.                 return
  2100.            
  2101.             absChance = MaxAbs
  2102.             itemDesc = item.GetItemDescription()
  2103.             self.__AdjustMaxWidth(attrSlot, itemDesc)
  2104.             self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
  2105.             self.AppendDescription(itemDesc, 26)
  2106.             self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  2107.             self.__AppendLimitInformation()
  2108.            
  2109.             ## ABSORPTION RATE
  2110.             if MinAbs == MaxAbs:
  2111.                 self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (MinAbs), self.CONDITION_COLOR)
  2112.             else:
  2113.                 self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE2 % (MinAbs, MaxAbs), self.CONDITION_COLOR)
  2114.             ## END ABSOPRTION RATE
  2115.            
  2116.             itemAbsorbedVnum = int(metinSlot[sash.ABSORBED_SOCKET])
  2117.             if itemAbsorbedVnum:
  2118.                 ## ATTACK / DEFENCE
  2119.                 item.SelectItem(itemAbsorbedVnum)
  2120.                 if item.GetItemType() == item.ITEM_TYPE_WEAPON:
  2121.                     if item.GetItemSubType() == item.WEAPON_FAN:
  2122.                         self.__AppendMagicAttackInfo(absChance)
  2123.                         item.SelectItem(itemAbsorbedVnum)
  2124.                         self.__AppendAttackPowerInfo(absChance)
  2125.                     else:
  2126.                         self.__AppendAttackPowerInfo(absChance)
  2127.                         item.SelectItem(itemAbsorbedVnum)
  2128.                         self.__AppendMagicAttackInfo(absChance)
  2129.                 elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
  2130.                     defGrade = item.GetValue(1)
  2131.                     defBonus = item.GetValue(5) * 2
  2132.                     defGrade = self.CalcSashValue(defGrade, absChance)
  2133.                     defBonus = self.CalcSashValue(defBonus, absChance)
  2134.                    
  2135.                     if defGrade > 0:
  2136.                         self.AppendSpace(5)
  2137.                         self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
  2138.                    
  2139.                     item.SelectItem(itemAbsorbedVnum)
  2140.                     self.__AppendMagicDefenceInfo(absChance)
  2141.                 ## END ATTACK / DEFENCE
  2142.                
  2143.                 ## EFFECT
  2144.                 item.SelectItem(itemAbsorbedVnum)
  2145.                 for i in xrange(item.ITEM_APPLY_MAX_NUM):
  2146.                     (affectType, affectValue) = item.GetAffect(i)
  2147.                     affectValue = self.CalcSashValue(affectValue, absChance)
  2148.                     affectString = self.__GetAffectString(affectType, affectValue)
  2149.                     if affectString and affectValue > 0:
  2150.                         self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
  2151.                    
  2152.                     item.SelectItem(itemAbsorbedVnum)
  2153.                 # END EFFECT
  2154.                
  2155.             item.SelectItem(itemVnum)
  2156.             ## ATTR
  2157.             self.__AppendAttributeInformation(attrSlot, MaxAbs)
  2158.             # END ATTR
  2159.            
  2160.             self.AppendWearableInformation()
  2161.             self.ShowToolTip()
  2162.  
  2163.         def SetSashResultAbsItem(self, slotIndex1, slotIndex2, window_type = player.INVENTORY):
  2164.             itemVnumSash = player.GetItemIndex(window_type, slotIndex1)
  2165.             itemVnumTarget = player.GetItemIndex(window_type, slotIndex2)
  2166.             if not itemVnumSash or not itemVnumTarget:
  2167.                 return
  2168.            
  2169.             self.ClearToolTip()
  2170.            
  2171.             item.SelectItem(itemVnumSash)
  2172.             itemType = item.GetItemType()
  2173.             itemSubType = item.GetItemSubType()
  2174.             if itemType != item.ITEM_TYPE_COSTUME and itemSubType != item.COSTUME_TYPE_SASH:
  2175.                 return
  2176.            
  2177.             metinSlot = [player.GetItemMetinSocket(window_type, slotIndex1, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
  2178.             attrSlot = [player.GetItemAttribute(window_type, slotIndex2, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
  2179.            
  2180.             itemDesc = item.GetItemDescription()
  2181.             self.__AdjustMaxWidth(attrSlot, itemDesc)
  2182.             self.__SetItemTitle(itemVnumSash, metinSlot, attrSlot)
  2183.             self.AppendDescription(itemDesc, 26)
  2184.             self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
  2185.             item.SelectItem(itemVnumSash)
  2186.             self.__AppendLimitInformation()
  2187.            
  2188.             ## ABSORPTION RATE
  2189.             self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (metinSlot[sash.ABSORPTION_SOCKET]), self.CONDITION_COLOR)
  2190.             ## END ABSOPRTION RATE
  2191.            
  2192.             ## ATTACK / DEFENCE
  2193.             itemAbsorbedVnum = itemVnumTarget
  2194.             item.SelectItem(itemAbsorbedVnum)
  2195.             if item.GetItemType() == item.ITEM_TYPE_WEAPON:
  2196.                 if item.GetItemSubType() == item.WEAPON_FAN:
  2197.                     self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
  2198.                     item.SelectItem(itemAbsorbedVnum)
  2199.                     self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
  2200.                 else:
  2201.                     self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
  2202.                     item.SelectItem(itemAbsorbedVnum)
  2203.                     self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
  2204.             elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
  2205.                 defGrade = item.GetValue(1)
  2206.                 defBonus = item.GetValue(5) * 2
  2207.                 defGrade = self.CalcSashValue(defGrade, metinSlot[sash.ABSORPTION_SOCKET])
  2208.                 defBonus = self.CalcSashValue(defBonus, metinSlot[sash.ABSORPTION_SOCKET])
  2209.                
  2210.                 if defGrade > 0:
  2211.                     self.AppendSpace(5)
  2212.                     self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
  2213.                
  2214.                 item.SelectItem(itemAbsorbedVnum)
  2215.                 self.__AppendMagicDefenceInfo(metinSlot[sash.ABSORPTION_SOCKET])
  2216.             ## END ATTACK / DEFENCE
  2217.            
  2218.             ## EFFECT
  2219.             item.SelectItem(itemAbsorbedVnum)
  2220.             for i in xrange(item.ITEM_APPLY_MAX_NUM):
  2221.                 (affectType, affectValue) = item.GetAffect(i)
  2222.                 affectValue = self.CalcSashValue(affectValue, metinSlot[sash.ABSORPTION_SOCKET])
  2223.                 affectString = self.__GetAffectString(affectType, affectValue)
  2224.                 if affectString and affectValue > 0:
  2225.                     self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
  2226.                
  2227.                 item.SelectItem(itemAbsorbedVnum)
  2228.             ## END EFFECT
  2229.            
  2230.             ## ATTR
  2231.             item.SelectItem(itemAbsorbedVnum)
  2232.             for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
  2233.                 type = attrSlot[i][0]
  2234.                 value = attrSlot[i][1]
  2235.                 if not value:
  2236.                     continue
  2237.                
  2238.                 value = self.CalcSashValue(value, metinSlot[sash.ABSORPTION_SOCKET])
  2239.                 affectString = self.__GetAffectString(type, value)
  2240.                 if affectString and value > 0:
  2241.                     affectColor = self.__GetAttributeColor(i, value)
  2242.                     self.AppendTextLine(affectString, affectColor)
  2243.                
  2244.                 item.SelectItem(itemAbsorbedVnum)
  2245.             ## END ATTR
  2246.            
  2247.             ## WEARABLE
  2248.             item.SelectItem(itemVnumSash)
  2249.             self.AppendSpace(5)
  2250.             self.AppendTextLine(localeInfo.TOOLTIP_ITEM_WEARABLE_JOB, self.NORMAL_COLOR)
  2251.            
  2252.             item.SelectItem(itemVnumSash)
  2253.             flagList = (
  2254.                         not item.IsAntiFlag(item.ITEM_ANTIFLAG_WARRIOR),
  2255.                         not item.IsAntiFlag(item.ITEM_ANTIFLAG_ASSASSIN),
  2256.                         not item.IsAntiFlag(item.ITEM_ANTIFLAG_SURA),
  2257.                         not item.IsAntiFlag(item.ITEM_ANTIFLAG_SHAMAN)
  2258.             )
  2259.            
  2260.            
  2261.             characterNames = ""
  2262.             for i in xrange(self.CHARACTER_COUNT):
  2263.                 name = self.CHARACTER_NAMES[i]
  2264.                 flag = flagList[i]
  2265.                 if flag:
  2266.                     characterNames += " "
  2267.                     characterNames += name
  2268.            
  2269.             textLine = self.AppendTextLine(characterNames, self.NORMAL_COLOR, True)
  2270.             textLine.SetFeather()
  2271.            
  2272.             item.SelectItem(itemVnumSash)
  2273.             if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE):
  2274.                 textLine = self.AppendTextLine(localeInfo.FOR_FEMALE, self.NORMAL_COLOR, True)
  2275.                 textLine.SetFeather()
  2276.            
  2277.             if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE):
  2278.                 textLine = self.AppendTextLine(localeInfo.FOR_MALE, self.NORMAL_COLOR, True)
  2279.                 textLine.SetFeather()
  2280.             ## END WEARABLE
  2281.            
  2282.             self.ShowToolTip()
  2283.  
  2284. class HyperlinkItemToolTip(ItemToolTip):
  2285.     def __init__(self):
  2286.         ItemToolTip.__init__(self, isPickable=True)
  2287.  
  2288.     def SetHyperlinkItem(self, tokens):
  2289.         minTokenCount = 3 + player.METIN_SOCKET_MAX_NUM
  2290.         maxTokenCount = minTokenCount + 2 * player.ATTRIBUTE_SLOT_MAX_NUM
  2291.         if tokens and len(tokens) >= minTokenCount and len(tokens) <= maxTokenCount:
  2292.             head, vnum, flag = tokens[:3]
  2293.             itemVnum = int(vnum, 16)
  2294.             metinSlot = [int(metin, 16) for metin in tokens[3:6]]
  2295.  
  2296.             rests = tokens[6:]
  2297.             if rests:
  2298.                 attrSlot = []
  2299.  
  2300.                 rests.reverse()
  2301.                 while rests:
  2302.                     key = int(rests.pop(), 16)
  2303.                     if rests:
  2304.                         val = int(rests.pop())
  2305.                         attrSlot.append((key, val))
  2306.  
  2307.                 attrSlot += [(0, 0)] * (player.ATTRIBUTE_SLOT_MAX_NUM - len(attrSlot))
  2308.             else:
  2309.                 attrSlot = [(0, 0)] * player.ATTRIBUTE_SLOT_MAX_NUM
  2310.  
  2311.             self.ClearToolTip()
  2312.             self.AddItemData(itemVnum, metinSlot, attrSlot)
  2313.  
  2314.             ItemToolTip.OnUpdate(self)
  2315.  
  2316.     def OnUpdate(self):
  2317.         pass
  2318.  
  2319.     def OnMouseLeftButtonDown(self):
  2320.         self.Hide()
  2321.  
  2322. class SkillToolTip(ToolTip):
  2323.  
  2324.     POINT_NAME_DICT = {
  2325.         player.LEVEL : localeInfo.SKILL_TOOLTIP_LEVEL,
  2326.         player.IQ : localeInfo.SKILL_TOOLTIP_INT,
  2327.     }
  2328.  
  2329.     SKILL_TOOL_TIP_WIDTH = 200
  2330.     PARTY_SKILL_TOOL_TIP_WIDTH = 340
  2331.  
  2332.     PARTY_SKILL_EXPERIENCE_AFFECT_LIST = (  ( 2, 2,  10,),
  2333.                                             ( 8, 3,  20,),
  2334.                                             (14, 4,  30,),
  2335.                                             (22, 5,  45,),
  2336.                                             (28, 6,  60,),
  2337.                                             (34, 7,  80,),
  2338.                                             (38, 8, 100,), )
  2339.  
  2340.     PARTY_SKILL_PLUS_GRADE_AFFECT_LIST = (  ( 4, 2, 1, 0,),
  2341.                                             (10, 3, 2, 0,),
  2342.                                             (16, 4, 2, 1,),
  2343.                                             (24, 5, 2, 2,), )
  2344.  
  2345.     PARTY_SKILL_ATTACKER_AFFECT_LIST = (    ( 36, 3, ),
  2346.                                             ( 26, 1, ),
  2347.                                             ( 32, 2, ), )
  2348.  
  2349.     SKILL_GRADE_NAME = {    player.SKILL_GRADE_MASTER : localeInfo.SKILL_GRADE_NAME_MASTER,
  2350.                             player.SKILL_GRADE_GRAND_MASTER : localeInfo.SKILL_GRADE_NAME_GRAND_MASTER,
  2351.                             player.SKILL_GRADE_PERFECT_MASTER : localeInfo.SKILL_GRADE_NAME_PERFECT_MASTER, }
  2352.  
  2353.     AFFECT_NAME_DICT =  {
  2354.                             "HP" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_POWER,
  2355.                             "ATT_GRADE" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_GRADE,
  2356.                             "DEF_GRADE" : localeInfo.TOOLTIP_SKILL_AFFECT_DEF_GRADE,
  2357.                             "ATT_SPEED" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_SPEED,
  2358.                             "MOV_SPEED" : localeInfo.TOOLTIP_SKILL_AFFECT_MOV_SPEED,
  2359.                             "DODGE" : localeInfo.TOOLTIP_SKILL_AFFECT_DODGE,
  2360.                             "RESIST_NORMAL" : localeInfo.TOOLTIP_SKILL_AFFECT_RESIST_NORMAL,
  2361.                             "REFLECT_MELEE" : localeInfo.TOOLTIP_SKILL_AFFECT_REFLECT_MELEE,
  2362.                         }
  2363.     AFFECT_APPEND_TEXT_DICT =   {
  2364.                                     "DODGE" : "%",
  2365.                                     "RESIST_NORMAL" : "%",
  2366.                                     "REFLECT_MELEE" : "%",
  2367.                                 }
  2368.  
  2369.     def __init__(self):
  2370.         ToolTip.__init__(self, self.SKILL_TOOL_TIP_WIDTH)
  2371.     def __del__(self):
  2372.         ToolTip.__del__(self)
  2373.  
  2374.     def SetSkill(self, skillIndex, skillLevel = -1):
  2375.  
  2376.         if 0 == skillIndex:
  2377.             return
  2378.  
  2379.         if skill.SKILL_TYPE_GUILD == skill.GetSkillType(skillIndex):
  2380.  
  2381.             if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
  2382.                 self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
  2383.                 self.ResizeToolTip()
  2384.  
  2385.             self.AppendDefaultData(skillIndex)
  2386.             self.AppendSkillConditionData(skillIndex)
  2387.             self.AppendGuildSkillData(skillIndex, skillLevel)
  2388.  
  2389.         else:
  2390.  
  2391.             if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
  2392.                 self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
  2393.                 self.ResizeToolTip()
  2394.  
  2395.             slotIndex = player.GetSkillSlotIndex(skillIndex)
  2396.             skillGrade = player.GetSkillGrade(slotIndex)
  2397.             skillLevel = player.GetSkillLevel(slotIndex)
  2398.             skillCurrentPercentage = player.GetSkillCurrentEfficientPercentage(slotIndex)
  2399.             skillNextPercentage = player.GetSkillNextEfficientPercentage(slotIndex)
  2400.  
  2401.             self.AppendDefaultData(skillIndex)
  2402.             self.AppendSkillConditionData(skillIndex)
  2403.             self.AppendSkillDataNew(slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage)
  2404.             self.AppendSkillRequirement(skillIndex, skillLevel)
  2405.  
  2406.         self.ShowToolTip()
  2407.  
  2408.     def SetSkillNew(self, slotIndex, skillIndex, skillGrade, skillLevel):
  2409.  
  2410.         if 0 == skillIndex:
  2411.             return
  2412.  
  2413.         if player.SKILL_INDEX_TONGSOL == skillIndex:
  2414.  
  2415.             slotIndex = player.GetSkillSlotIndex(skillIndex)
  2416.             skillLevel = player.GetSkillLevel(slotIndex)
  2417.  
  2418.             self.AppendDefaultData(skillIndex)
  2419.             self.AppendPartySkillData(skillGrade, skillLevel)
  2420.  
  2421.         elif player.SKILL_INDEX_RIDING == skillIndex:
  2422.  
  2423.             slotIndex = player.GetSkillSlotIndex(skillIndex)
  2424.             self.AppendSupportSkillDefaultData(skillIndex, skillGrade, skillLevel, 30)
  2425.  
  2426.         elif player.SKILL_INDEX_SUMMON == skillIndex:
  2427.  
  2428.             maxLevel = 10
  2429.  
  2430.             self.ClearToolTip()
  2431.             self.__SetSkillTitle(skillIndex, skillGrade)
  2432.  
  2433.             ## Description
  2434.             description = skill.GetSkillDescription(skillIndex)
  2435.             self.AppendDescription(description, 25)
  2436.  
  2437.             if skillLevel == 10:
  2438.                 self.AppendSpace(5)
  2439.                 self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
  2440.                 self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (skillLevel*10), self.NORMAL_COLOR)
  2441.  
  2442.             else:
  2443.                 self.AppendSpace(5)
  2444.                 self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
  2445.                 self.__AppendSummonDescription(skillLevel, self.NORMAL_COLOR)
  2446.  
  2447.                 self.AppendSpace(5)
  2448.                 self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel+1), self.NEGATIVE_COLOR)
  2449.                 self.__AppendSummonDescription(skillLevel+1, self.NEGATIVE_COLOR)
  2450.  
  2451.         elif skill.SKILL_TYPE_GUILD == skill.GetSkillType(skillIndex):
  2452.  
  2453.             if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
  2454.                 self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
  2455.                 self.ResizeToolTip()
  2456.  
  2457.             self.AppendDefaultData(skillIndex)
  2458.             self.AppendSkillConditionData(skillIndex)
  2459.             self.AppendGuildSkillData(skillIndex, skillLevel)
  2460.  
  2461.         else:
  2462.  
  2463.             if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
  2464.                 self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
  2465.                 self.ResizeToolTip()
  2466.  
  2467.             slotIndex = player.GetSkillSlotIndex(skillIndex)
  2468.  
  2469.             skillCurrentPercentage = player.GetSkillCurrentEfficientPercentage(slotIndex)
  2470.             skillNextPercentage = player.GetSkillNextEfficientPercentage(slotIndex)
  2471.  
  2472.             self.AppendDefaultData(skillIndex, skillGrade)
  2473.             self.AppendSkillConditionData(skillIndex)
  2474.             self.AppendSkillDataNew(slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage)
  2475.             self.AppendSkillRequirement(skillIndex, skillLevel)
  2476.  
  2477.         self.ShowToolTip()
  2478.  
  2479.     def __SetSkillTitle(self, skillIndex, skillGrade):
  2480.         self.SetTitle(skill.GetSkillName(skillIndex, skillGrade))
  2481.         self.__AppendSkillGradeName(skillIndex, skillGrade)
  2482.  
  2483.     def __AppendSkillGradeName(self, skillIndex, skillGrade):      
  2484.         if self.SKILL_GRADE_NAME.has_key(skillGrade):
  2485.             self.AppendSpace(5)
  2486.             self.AppendTextLine(self.SKILL_GRADE_NAME[skillGrade] % (skill.GetSkillName(skillIndex, 0)), self.CAN_LEVEL_UP_COLOR)
  2487.  
  2488.     def SetSkillOnlyName(self, slotIndex, skillIndex, skillGrade):
  2489.         if 0 == skillIndex:
  2490.             return
  2491.  
  2492.         slotIndex = player.GetSkillSlotIndex(skillIndex)
  2493.  
  2494.         self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
  2495.         self.ResizeToolTip()
  2496.  
  2497.         self.ClearToolTip()
  2498.         self.__SetSkillTitle(skillIndex, skillGrade)       
  2499.         self.AppendDefaultData(skillIndex, skillGrade)
  2500.         self.AppendSkillConditionData(skillIndex)      
  2501.         self.ShowToolTip()
  2502.  
  2503.     def AppendDefaultData(self, skillIndex, skillGrade = 0):
  2504.         self.ClearToolTip()
  2505.         self.__SetSkillTitle(skillIndex, skillGrade)
  2506.  
  2507.         ## Level Limit
  2508.         levelLimit = skill.GetSkillLevelLimit(skillIndex)
  2509.         if levelLimit > 0:
  2510.  
  2511.             color = self.NORMAL_COLOR
  2512.             if player.GetStatus(player.LEVEL) < levelLimit:
  2513.                 color = self.NEGATIVE_COLOR
  2514.  
  2515.             self.AppendSpace(5)
  2516.             self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_LEVEL % (levelLimit), color)
  2517.  
  2518.         ## Description
  2519.         description = skill.GetSkillDescription(skillIndex)
  2520.         self.AppendDescription(description, 25)
  2521.  
  2522.     def AppendSupportSkillDefaultData(self, skillIndex, skillGrade, skillLevel, maxLevel):
  2523.         self.ClearToolTip()
  2524.         self.__SetSkillTitle(skillIndex, skillGrade)
  2525.  
  2526.         ## Description
  2527.         description = skill.GetSkillDescription(skillIndex)
  2528.         self.AppendDescription(description, 25)
  2529.  
  2530.         if 1 == skillGrade:
  2531.             skillLevel += 19
  2532.         elif 2 == skillGrade:
  2533.             skillLevel += 29
  2534.         elif 3 == skillGrade:
  2535.             skillLevel = 40
  2536.  
  2537.         self.AppendSpace(5)
  2538.         self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_WITH_MAX % (skillLevel, maxLevel), self.NORMAL_COLOR)
  2539.  
  2540.     def AppendSkillConditionData(self, skillIndex):
  2541.         conditionDataCount = skill.GetSkillConditionDescriptionCount(skillIndex)
  2542.         if conditionDataCount > 0:
  2543.             self.AppendSpace(5)
  2544.             for i in xrange(conditionDataCount):
  2545.                 self.AppendTextLine(skill.GetSkillConditionDescription(skillIndex, i), self.CONDITION_COLOR)
  2546.  
  2547.     def AppendGuildSkillData(self, skillIndex, skillLevel):
  2548.         skillMaxLevel = 7
  2549.         skillCurrentPercentage = float(skillLevel) / float(skillMaxLevel)
  2550.         skillNextPercentage = float(skillLevel+1) / float(skillMaxLevel)
  2551.         ## Current Level
  2552.         if skillLevel > 0:
  2553.             if self.HasSkillLevelDescription(skillIndex, skillLevel):
  2554.                 self.AppendSpace(5)
  2555.                 if skillLevel == skillMaxLevel:
  2556.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
  2557.                 else:
  2558.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
  2559.  
  2560.                 #####
  2561.  
  2562.                 for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
  2563.                     self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillCurrentPercentage), self.ENABLE_COLOR)
  2564.  
  2565.                 ## Cooltime
  2566.                 coolTime = skill.GetSkillCoolTime(skillIndex, skillCurrentPercentage)
  2567.                 if coolTime > 0:
  2568.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), self.ENABLE_COLOR)
  2569.  
  2570.                 ## SP
  2571.                 needGSP = skill.GetSkillNeedSP(skillIndex, skillCurrentPercentage)
  2572.                 if needGSP > 0:
  2573.                     self.AppendTextLine(localeInfo.TOOLTIP_NEED_GSP % (needGSP), self.ENABLE_COLOR)
  2574.  
  2575.         ## Next Level
  2576.         if skillLevel < skillMaxLevel:
  2577.             if self.HasSkillLevelDescription(skillIndex, skillLevel+1):
  2578.                 self.AppendSpace(5)
  2579.                 self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_1 % (skillLevel+1, skillMaxLevel), self.DISABLE_COLOR)
  2580.  
  2581.                 #####
  2582.  
  2583.                 for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
  2584.                     self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillNextPercentage), self.DISABLE_COLOR)
  2585.  
  2586.                 ## Cooltime
  2587.                 coolTime = skill.GetSkillCoolTime(skillIndex, skillNextPercentage)
  2588.                 if coolTime > 0:
  2589.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), self.DISABLE_COLOR)
  2590.  
  2591.                 ## SP
  2592.                 needGSP = skill.GetSkillNeedSP(skillIndex, skillNextPercentage)
  2593.                 if needGSP > 0:
  2594.                     self.AppendTextLine(localeInfo.TOOLTIP_NEED_GSP % (needGSP), self.DISABLE_COLOR)
  2595.  
  2596.     def AppendSkillDataNew(self, slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage):
  2597.  
  2598.         self.skillMaxLevelStartDict = { 0 : 17, 1 : 7, 2 : 10, }
  2599.         self.skillMaxLevelEndDict = { 0 : 20, 1 : 10, 2 : 10, }
  2600.  
  2601.         skillLevelUpPoint = 1
  2602.         realSkillGrade = player.GetSkillGrade(slotIndex)
  2603.         skillMaxLevelStart = self.skillMaxLevelStartDict.get(realSkillGrade, 15)
  2604.         skillMaxLevelEnd = self.skillMaxLevelEndDict.get(realSkillGrade, 20)
  2605.  
  2606.         ## Current Level
  2607.         if skillLevel > 0:
  2608.             if self.HasSkillLevelDescription(skillIndex, skillLevel):
  2609.                 self.AppendSpace(5)
  2610.                 if skillGrade == skill.SKILL_GRADE_COUNT:
  2611.                     pass
  2612.                 elif skillLevel == skillMaxLevelEnd:
  2613.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
  2614.                 else:
  2615.                     self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
  2616.                 self.AppendSkillLevelDescriptionNew(skillIndex, skillCurrentPercentage, self.ENABLE_COLOR)
  2617.  
  2618.         ## Next Level
  2619.         if skillGrade != skill.SKILL_GRADE_COUNT:
  2620.             if skillLevel < skillMaxLevelEnd:
  2621.                 if self.HasSkillLevelDescription(skillIndex, skillLevel+skillLevelUpPoint):
  2622.                     self.AppendSpace(5)
  2623.                     ## HPº¸°­, °üÅëȸÇÇ º¸Á¶½ºÅ³ÀÇ °æ¿ì
  2624.                     if skillIndex == 141 or skillIndex == 142:
  2625.                         self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_3 % (skillLevel+1), self.DISABLE_COLOR)
  2626.                     else:
  2627.                         self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_1 % (skillLevel+1, skillMaxLevelEnd), self.DISABLE_COLOR)
  2628.                     self.AppendSkillLevelDescriptionNew(skillIndex, skillNextPercentage, self.DISABLE_COLOR)
  2629.  
  2630.     def AppendSkillLevelDescriptionNew(self, skillIndex, skillPercentage, color):
  2631.  
  2632.         affectDataCount = skill.GetNewAffectDataCount(skillIndex)
  2633.         if affectDataCount > 0:
  2634.             for i in xrange(affectDataCount):
  2635.                 type, minValue, maxValue = skill.GetNewAffectData(skillIndex, i, skillPercentage)
  2636.  
  2637.                 if not self.AFFECT_NAME_DICT.has_key(type):
  2638.                     continue
  2639.  
  2640.                 minValue = int(minValue)
  2641.                 maxValue = int(maxValue)
  2642.                 affectText = self.AFFECT_NAME_DICT[type]
  2643.  
  2644.                 if "HP" == type:
  2645.                     if minValue < 0 and maxValue < 0:
  2646.                         minValue *= -1
  2647.                         maxValue *= -1
  2648.  
  2649.                     else:
  2650.                         affectText = localeInfo.TOOLTIP_SKILL_AFFECT_HEAL
  2651.  
  2652.                 affectText += str(minValue)
  2653.                 if minValue != maxValue:
  2654.                     affectText += " - " + str(maxValue)
  2655.                 affectText += self.AFFECT_APPEND_TEXT_DICT.get(type, "")
  2656.  
  2657.                 #import debugInfo
  2658.                 #if debugInfo.IsDebugMode():
  2659.                 #   affectText = "!!" + affectText
  2660.  
  2661.                 self.AppendTextLine(affectText, color)
  2662.            
  2663.         else:
  2664.             for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
  2665.                 self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillPercentage), color)
  2666.        
  2667.  
  2668.         ## Duration
  2669.         duration = skill.GetDuration(skillIndex, skillPercentage)
  2670.         if duration > 0:
  2671.             self.AppendTextLine(localeInfo.TOOLTIP_SKILL_DURATION % (duration), color)
  2672.  
  2673.         ## Cooltime
  2674.         coolTime = skill.GetSkillCoolTime(skillIndex, skillPercentage)
  2675.         if coolTime > 0:
  2676.             self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), color)
  2677.  
  2678.         ## SP
  2679.         needSP = skill.GetSkillNeedSP(skillIndex, skillPercentage)
  2680.         if needSP != 0:
  2681.             continuationSP = skill.GetSkillContinuationSP(skillIndex, skillPercentage)
  2682.  
  2683.             if skill.IsUseHPSkill(skillIndex):
  2684.                 self.AppendNeedHP(needSP, continuationSP, color)
  2685.             else:
  2686.                 self.AppendNeedSP(needSP, continuationSP, color)
  2687.  
  2688.     def AppendSkillRequirement(self, skillIndex, skillLevel):
  2689.  
  2690.         skillMaxLevel = skill.GetSkillMaxLevel(skillIndex)
  2691.  
  2692.         if skillLevel >= skillMaxLevel:
  2693.             return
  2694.  
  2695.         isAppendHorizontalLine = False
  2696.  
  2697.         ## Requirement
  2698.         if skill.IsSkillRequirement(skillIndex):
  2699.  
  2700.             if not isAppendHorizontalLine:
  2701.                 isAppendHorizontalLine = True
  2702.                 self.AppendHorizontalLine()
  2703.  
  2704.             requireSkillName, requireSkillLevel = skill.GetSkillRequirementData(skillIndex)
  2705.  
  2706.             color = self.CANNOT_LEVEL_UP_COLOR
  2707.             if skill.CheckRequirementSueccess(skillIndex):
  2708.                 color = self.CAN_LEVEL_UP_COLOR
  2709.             self.AppendTextLine(localeInfo.TOOLTIP_REQUIREMENT_SKILL_LEVEL % (requireSkillName, requireSkillLevel), color)
  2710.  
  2711.         ## Require Stat
  2712.         requireStatCount = skill.GetSkillRequireStatCount(skillIndex)
  2713.         if requireStatCount > 0:
  2714.  
  2715.             for i in xrange(requireStatCount):
  2716.                 type, level = skill.GetSkillRequireStatData(skillIndex, i)
  2717.                 if self.POINT_NAME_DICT.has_key(type):
  2718.  
  2719.                     if not isAppendHorizontalLine:
  2720.                         isAppendHorizontalLine = True
  2721.                         self.AppendHorizontalLine()
  2722.  
  2723.                     name = self.POINT_NAME_DICT[type]
  2724.                     color = self.CANNOT_LEVEL_UP_COLOR
  2725.                     if player.GetStatus(type) >= level:
  2726.                         color = self.CAN_LEVEL_UP_COLOR
  2727.                     self.AppendTextLine(localeInfo.TOOLTIP_REQUIREMENT_STAT_LEVEL % (name, level), color)
  2728.  
  2729.     def HasSkillLevelDescription(self, skillIndex, skillLevel):
  2730.         if skill.GetSkillAffectDescriptionCount(skillIndex) > 0:
  2731.             return True
  2732.         if skill.GetSkillCoolTime(skillIndex, skillLevel) > 0:
  2733.             return True
  2734.         if skill.GetSkillNeedSP(skillIndex, skillLevel) > 0:
  2735.             return True
  2736.  
  2737.         return False
  2738.  
  2739.     def AppendMasterAffectDescription(self, index, desc, color):
  2740.         self.AppendTextLine(desc, color)
  2741.  
  2742.     def AppendNextAffectDescription(self, index, desc):
  2743.         self.AppendTextLine(desc, self.DISABLE_COLOR)
  2744.  
  2745.     def AppendNeedHP(self, needSP, continuationSP, color):
  2746.  
  2747.         self.AppendTextLine(localeInfo.TOOLTIP_NEED_HP % (needSP), color)
  2748.  
  2749.         if continuationSP > 0:
  2750.             self.AppendTextLine(localeInfo.TOOLTIP_NEED_HP_PER_SEC % (continuationSP), color)
  2751.  
  2752.     def AppendNeedSP(self, needSP, continuationSP, color):
  2753.  
  2754.         if -1 == needSP:
  2755.             self.AppendTextLine(localeInfo.TOOLTIP_NEED_ALL_SP, color)
  2756.  
  2757.         else:
  2758.             self.AppendTextLine(localeInfo.TOOLTIP_NEED_SP % (needSP), color)
  2759.  
  2760.         if continuationSP > 0:
  2761.             self.AppendTextLine(localeInfo.TOOLTIP_NEED_SP_PER_SEC % (continuationSP), color)
  2762.  
  2763.     def AppendPartySkillData(self, skillGrade, skillLevel):
  2764.  
  2765.         if 1 == skillGrade:
  2766.             skillLevel += 19
  2767.         elif 2 == skillGrade:
  2768.             skillLevel += 29
  2769.         elif 3 == skillGrade:
  2770.             skillLevel =  40
  2771.  
  2772.         if skillLevel <= 0:
  2773.             return
  2774.  
  2775.         skillIndex = player.SKILL_INDEX_TONGSOL
  2776.         slotIndex = player.GetSkillSlotIndex(skillIndex)
  2777.         skillPower = player.GetSkillCurrentEfficientPercentage(slotIndex)
  2778.         if localeInfo.IsBRAZIL():
  2779.             k = skillPower
  2780.         else:
  2781.             k = player.GetSkillLevel(skillIndex) / 100.0
  2782.         self.AppendSpace(5)
  2783.         self.AutoAppendTextLine(localeInfo.TOOLTIP_PARTY_SKILL_LEVEL % skillLevel, self.NORMAL_COLOR)
  2784.  
  2785.         if skillLevel>=10:
  2786.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_ATTACKER % chop( 10 + 60 * k ))
  2787.  
  2788.         if skillLevel>=20:
  2789.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BERSERKER    % chop(1 + 5 * k))
  2790.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_TANKER   % chop(50 + 1450 * k))
  2791.  
  2792.         if skillLevel>=25:
  2793.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BUFFER % chop(5 + 45 * k ))
  2794.  
  2795.         if skillLevel>=35:
  2796.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_SKILL_MASTER % chop(25 + 600 * k ))
  2797.  
  2798.         if skillLevel>=40:
  2799.             self.AutoAppendTextLine(localeInfo.PARTY_SKILL_DEFENDER % chop( 5 + 30 * k ))
  2800.  
  2801.         self.AlignHorizonalCenter()
  2802.  
  2803.     def __AppendSummonDescription(self, skillLevel, color):
  2804.         if skillLevel > 1:
  2805.             self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (skillLevel * 10), color)
  2806.         elif 1 == skillLevel:
  2807.             self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (15), color)
  2808.         elif 0 == skillLevel:
  2809.             self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (10), color)
  2810.  
  2811.  
  2812. if __name__ == "__main__"
  2813.     import app
  2814.     import wndMgr
  2815.     import systemSetting
  2816.     import mouseModule
  2817.     import grp
  2818.     import ui
  2819.    
  2820.     #wndMgr.SetOutlineFlag(True)
  2821.  
  2822.     app.SetMouseHandler(mouseModule.mouseController)
  2823.     app.SetHairColorEnable(True)
  2824.     wndMgr.SetMouseHandler(mouseModule.mouseController)
  2825.     wndMgr.SetScreenSize(systemSetting.GetWidth(), systemSetting.GetHeight())
  2826.     app.Create("METIN2 CLOSED BETA", systemSetting.GetWidth(), systemSetting.GetHeight(), 1)
  2827.     mouseModule.mouseController.Create()
  2828.  
  2829.     toolTip = ItemToolTip()
  2830.     toolTip.ClearToolTip()
  2831.     #toolTip.AppendTextLine("Test")
  2832.     desc = "Item descriptions:|increase of width of display to 35 digits per row AND installation of function that the displayed words are not broken up in two parts, but instead if one word is too long to be displayed in this row, this word will start in the next row."
  2833.     summ = ""
  2834.  
  2835.     toolTip.AddItemData_Offline(10, desc, summ, 0, 0)
  2836.     toolTip.Show()
  2837.    
  2838.     app.Loop()
  2839.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement