1. import ui
  2. import uiScriptLocale
  3. import app
  4. import net
  5. import dbg
  6. import snd
  7. import player
  8. import mouseModule
  9. import wndMgr
  10. import skill
  11. import playerSettingModule
  12. import quest
  13. import localeInfo
  14. import uiToolTip
  15. import constInfo
  16. import colorInfo
  17. import emotion
  18. import chr
  19. import chrmgr
  20. if app.ENABLE_DETAILS_UI:
  21. import uiCharacterDetails
  22. SHOW_ONLY_ACTIVE_SKILL = False
  23. SHOW_LIMIT_SUPPORT_SKILL_LIST = []
  24. HIDE_SUPPORT_SKILL_POINT = False
  25. if localeInfo.IsYMIR():
  26. SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
  27. if not localeInfo.IsCHEONMA():
  28. HIDE_SUPPORT_SKILL_POINT = True
  29. SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
  30. elif localeInfo.IsJAPAN() or (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/ca") and (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/br"):
  31. HIDE_SUPPORT_SKILL_POINT = True
  32. SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140]
  33. else:
  34. HIDE_SUPPORT_SKILL_POINT = True
  35. FACE_IMAGE_DICT = {
  36. playerSettingModule.RACE_WARRIOR_M : "icon/face/warrior_m.tga",
  37. playerSettingModule.RACE_WARRIOR_W : "icon/face/warrior_w.tga",
  38. playerSettingModule.RACE_ASSASSIN_M : "icon/face/assassin_m.tga",
  39. playerSettingModule.RACE_ASSASSIN_W : "icon/face/assassin_w.tga",
  40. playerSettingModule.RACE_SURA_M : "icon/face/sura_m.tga",
  41. playerSettingModule.RACE_SURA_W : "icon/face/sura_w.tga",
  42. playerSettingModule.RACE_SHAMAN_M : "icon/face/shaman_m.tga",
  43. playerSettingModule.RACE_SHAMAN_W : "icon/face/shaman_w.tga",
  44. }
  45. def unsigned32(n):
  46. return n & 0xFFFFFFFFL
  47. class CharacterWindow(ui.ScriptWindow):
  48. ACTIVE_PAGE_SLOT_COUNT = 8
  49. SUPPORT_PAGE_SLOT_COUNT = 12
  50. PAGE_SLOT_COUNT = 12
  51. PAGE_HORSE = 2
  52. SKILL_GROUP_NAME_DICT = {
  53. playerSettingModule.JOB_WARRIOR : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1, 2 : localeInfo.SKILL_GROUP_WARRIOR_2, },
  54. playerSettingModule.JOB_ASSASSIN : { 1 : localeInfo.SKILL_GROUP_ASSASSIN_1, 2 : localeInfo.SKILL_GROUP_ASSASSIN_2, },
  55. playerSettingModule.JOB_SURA : { 1 : localeInfo.SKILL_GROUP_SURA_1, 2 : localeInfo.SKILL_GROUP_SURA_2, },
  56. playerSettingModule.JOB_SHAMAN : { 1 : localeInfo.SKILL_GROUP_SHAMAN_1, 2 : localeInfo.SKILL_GROUP_SHAMAN_2, },
  57. }
  58. STAT_DESCRIPTION = {
  59. "HTH" : localeInfo.STAT_TOOLTIP_CON,
  60. "INT" : localeInfo.STAT_TOOLTIP_INT,
  61. "STR" : localeInfo.STAT_TOOLTIP_STR,
  62. "DEX" : localeInfo.STAT_TOOLTIP_DEX,
  63. }
  64. STAT_MINUS_DESCRIPTION = localeInfo.STAT_MINUS_DESCRIPTION
  65. def __init__(self):
  66. if app.ENABLE_DETAILS_UI:
  67. self.chDetailsWnd = None
  68. self.chStatisticsWnd = None
  69. self.isOpenedDetailsWnd = False
  70. ui.ScriptWindow.__init__(self)
  71. self.state = "STATUS"
  72. self.isLoaded = 0
  73. self.toolTipSkill = 0
  74. self.__Initialize()
  75. self.__LoadWindow()
  76. self.statusPlusCommandDict={
  77. "HTH" : "/stat ht",
  78. "INT" : "/stat iq",
  79. "STR" : "/stat st",
  80. "DEX" : "/stat dx",
  81. }
  82. self.statusMinusCommandDict={
  83. "HTH-" : "/stat- ht",
  84. "INT-" : "/stat- iq",
  85. "STR-" : "/stat- st",
  86. "DEX-" : "/stat- dx",
  87. }
  88. def __del__(self):
  89. ui.ScriptWindow.__del__(self)
  90. def __Initialize(self):
  91. self.refreshToolTip = 0
  92. self.curSelectedSkillGroup = 0
  93. self.canUseHorseSkill = -1
  94. self.toolTip = None
  95. self.toolTipJob = None
  96. self.toolTipAlignment = None
  97. self.toolTipSkill = None
  98. self.faceImage = None
  99. self.statusPlusLabel = None
  100. self.statusPlusValue = None
  101. self.activeSlot = None
  102. self.tabDict = None
  103. self.tabButtonDict = None
  104. self.pageDict = None
  105. self.titleBarDict = None
  106. self.statusPlusButtonDict = None
  107. self.statusMinusButtonDict = None
  108. self.skillPageDict = None
  109. self.questShowingStartIndex = 0
  110. self.questScrollBar = None
  111. self.questSlot = None
  112. self.questNameList = None
  113. self.questLastTimeList = None
  114. self.questLastCountList = None
  115. self.skillGroupButton = ()
  116. self.activeSlot = None
  117. self.activeSkillPointValue = None
  118. self.supportSkillPointValue = None
  119. self.skillGroupButton1 = None
  120. self.skillGroupButton2 = None
  121. self.activeSkillGroupName = None
  122. self.guildNameSlot = None
  123. self.guildNameValue = None
  124. self.characterNameSlot = None
  125. self.characterNameValue = None
  126. self.emotionToolTip = None
  127. self.soloEmotionSlot = None
  128. self.dualEmotionSlot = None
  129. if app.ENABLE_DETAILS_UI:
  130. self.chDetailsWnd = uiCharacterDetails.CharacterDetailsUI(self)
  131. self.chStatisticsWnd = uiCharacterDetails.NewStatistics(self)
  132. self.isOpenedDetailsWnd = False
  133. if app.ENABLE_DETAILS_UI:
  134. def OnTop(self):
  135. if self.chDetailsWnd:
  136. self.chDetailsWnd.SetTop()
  137. def Hide(self):
  138. if app.ENABLE_DETAILS_UI:
  139. if self.chDetailsWnd:
  140. self.isOpenedDetailsWnd = self.chDetailsWnd.IsShow()
  141. self.chDetailsWnd.Close()
  142. if self.chStatisticsWnd:
  143. self.isOpenedDetailsWnd = self.chStatisticsWnd.IsShow()
  144. self.chStatisticsWnd.Close()
  145. wndMgr.Hide(self.hWnd)
  146. def Show(self):
  147. self.__LoadWindow()
  148. if app.ENABLE_DETAILS_UI:
  149. self.__InitCharacterDetailsUIButton()
  150. if self.chDetailsWnd and self.isOpenedDetailsWnd:
  151. self.chDetailsWnd.Show()
  152. ui.ScriptWindow.Show(self)
  153. def __LoadScript(self, fileName):
  154. pyScrLoader = ui.PythonScriptLoader()
  155. pyScrLoader.LoadScriptFile(self, fileName)
  156. def __BindObject(self):
  157. self.toolTip = uiToolTip.ToolTip()
  158. self.toolTipJob = uiToolTip.ToolTip()
  159. self.toolTipAlignment = uiToolTip.ToolTip(130)
  160. self.faceImage = self.GetChild("Face_Image")
  161. faceSlot=self.GetChild("Face_Slot")
  162. if 949 == app.GetDefaultCodePage():
  163. faceSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowJobToolTip)
  164. faceSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideJobToolTip)
  165. self.statusPlusLabel = self.GetChild("Status_Plus_Label")
  166. self.statusPlusValue = self.GetChild("Status_Plus_Value")
  167. self.characterNameSlot = self.GetChild("Character_Name_Slot")
  168. self.characterNameValue = self.GetChild("Character_Name")
  169. self.guildNameSlot = self.GetChild("Guild_Name_Slot")
  170. self.guildNameValue = self.GetChild("Guild_Name")
  171. self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowAlignmentToolTip)
  172. self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideAlignmentToolTip)
  173. self.activeSlot = self.GetChild("Skill_Active_Slot")
  174. self.activeSkillPointValue = self.GetChild("Active_Skill_Point_Value")
  175. self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value")
  176. self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1")
  177. self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2")
  178. self.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name")
  179. self.tabDict = {
  180. "STATUS" : self.GetChild("Tab_01"),
  181. "SKILL" : self.GetChild("Tab_02"),
  182. "EMOTICON" : self.GetChild("Tab_03"),
  183. "QUEST" : self.GetChild("Tab_04"),
  184. }
  185. self.tabButtonDict = {
  186. "STATUS" : self.GetChild("Tab_Button_01"),
  187. "SKILL" : self.GetChild("Tab_Button_02"),
  188. "EMOTICON" : self.GetChild("Tab_Button_03"),
  189. "QUEST" : self.GetChild("Tab_Button_04")
  190. }
  191. self.pageDict = {
  192. "STATUS" : self.GetChild("Character_Page"),
  193. "SKILL" : self.GetChild("Skill_Page"),
  194. "EMOTICON" : self.GetChild("Emoticon_Page"),
  195. "QUEST" : self.GetChild("Quest_Page")
  196. }
  197. self.titleBarDict = {
  198. "STATUS" : self.GetChild("Character_TitleBar"),
  199. "SKILL" : self.GetChild("Skill_TitleBar"),
  200. "EMOTICON" : self.GetChild("Emoticon_TitleBar"),
  201. "QUEST" : self.GetChild("Quest_TitleBar")
  202. }
  203. self.statusPlusButtonDict = {
  204. "HTH" : self.GetChild("HTH_Plus"),
  205. "INT" : self.GetChild("INT_Plus"),
  206. "STR" : self.GetChild("STR_Plus"),
  207. "DEX" : self.GetChild("DEX_Plus"),
  208. }
  209. self.statusMinusButtonDict = {
  210. "HTH-" : self.GetChild("HTH_Minus"),
  211. "INT-" : self.GetChild("INT_Minus"),
  212. "STR-" : self.GetChild("STR_Minus"),
  213. "DEX-" : self.GetChild("DEX_Minus"),
  214. }
  215. self.skillPageDict = {
  216. "ACTIVE" : self.GetChild("Skill_Active_Slot"),
  217. "SUPPORT" : self.GetChild("Skill_ETC_Slot"),
  218. "HORSE" : self.GetChild("Skill_Active_Slot"),
  219. }
  220. self.skillPageStatDict = {
  221. "SUPPORT" : player.SKILL_SUPPORT,
  222. "ACTIVE" : player.SKILL_ACTIVE,
  223. "HORSE" : player.SKILL_HORSE,
  224. }
  225. self.skillGroupButton = (
  226. self.GetChild("Skill_Group_Button_1"),
  227. self.GetChild("Skill_Group_Button_2"),
  228. )
  229. global SHOW_ONLY_ACTIVE_SKILL
  230. global HIDE_SUPPORT_SKILL_POINT
  231. if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT:
  232. self.GetChild("Support_Skill_Point_Label").Hide()
  233. self.soloEmotionSlot = self.GetChild("SoloEmotionSlot")
  234. self.dualEmotionSlot = self.GetChild("DualEmotionSlot")
  235. self.__SetEmotionSlot()
  236. self.questShowingStartIndex = 0
  237. self.questScrollBar = self.GetChild("Quest_ScrollBar")
  238. self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll))
  239. self.questSlot = self.GetChild("Quest_Slot")
  240. for i in xrange(quest.QUEST_MAX_NUM):
  241. self.questSlot.HideSlotBaseImage(i)
  242. self.questSlot.SetCoverButton(i,\
  243. "d:/ymir work/ui/game/quest/slot_button_01.sub",\
  244. "d:/ymir work/ui/game/quest/slot_button_02.sub",\
  245. "d:/ymir work/ui/game/quest/slot_button_03.sub",\
  246. "d:/ymir work/ui/game/quest/slot_button_03.sub", True)
  247. self.questNameList = []
  248. self.questLastTimeList = []
  249. self.questLastCountList = []
  250. for i in xrange(quest.QUEST_MAX_NUM):
  251. self.questNameList.append(self.GetChild("Quest_Name_0" + str(i)))
  252. self.questLastTimeList.append(self.GetChild("Quest_LastTime_0" + str(i)))
  253. self.questLastCountList.append(self.GetChild("Quest_LastCount_0" + str(i)))
  254. if app.ENABLE_DETAILS_UI:
  255. """
  256. Note : Belt ???? ????, ?? ???? ??? ??
  257. """
  258. self.MainBoard = self.GetChild("board")
  259. self.ExpandBtn = ui.MakeButton(self.MainBoard, 240, 120, "", "d:/ymir work/ui/game/belt_inventory/", "btn_minimize_normal.tga", "btn_minimize_over.tga", "btn_minimize_down.tga")
  260. self.ExpandBtn.SetEvent(ui.__mem_func__(self.__ClickExpandButton))
  261. self.ExpandBtn2 = ui.MakeButton(self.MainBoard, 10000, 0, "", "d:/ymir work/ui/game/belt_inventory/", "btn_minimize_normal.tga", "btn_minimize_over.tga", "btn_minimize_down.tga")
  262. self.ExpandBtn2.SetEvent(ui.__mem_func__(self.__ClickExpandButton2))
  263. self.MinimizeBtn = ui.MakeButton(self.MainBoard, 240, 120, "", "d:/ymir work/ui/game/belt_inventory/", "btn_expand_normal.tga", "btn_expand_over.tga", "btn_expand_down.tga")
  264. self.MinimizeBtn.SetEvent(ui.__mem_func__(self.__ClickMinimizeButton))
  265. if app.ENABLE_DETAILS_UI:
  266. def __InitCharacterDetailsUIButton(self):
  267. self.ExpandBtn.Show()
  268. self.MinimizeBtn.Hide()
  269. def __ClickExpandButton(self):
  270. if not self.chDetailsWnd.IsShow():
  271. (x, y) = self.GetLocalPosition()
  272. self.chDetailsWnd.AdjustPosition(x, y)
  273. self.chDetailsWnd.Show()
  274. self.ExpandBtn.Hide()
  275. self.MinimizeBtn.Show()
  276. def __ClickExpandButton2(self):
  277. (x, y) = self.GetLocalPosition()
  278. if self.chDetailsWnd.IsShow():
  279. self.chDetailsWnd.Hide()
  280. self.chStatisticsWnd.Show()
  281. elif self.chStatisticsWnd.IsShow():
  282. self.chStatisticsWnd.Hide()
  283. self.chDetailsWnd.Show()
  284. if self.chDetailsWnd.IsShow():
  285. self.chDetailsWnd.AdjustPosition(x, y)
  286. if self.chStatisticsWnd.IsShow():
  287. self.chStatisticsWnd.AdjustPosition(x, y)
  288. def __ClickMinimizeButton(self):
  289. if self.chDetailsWnd and self.chDetailsWnd.IsShow():
  290. self.chDetailsWnd.Hide()
  291. if self.chStatisticsWnd and self.chStatisticsWnd.IsShow():
  292. self.chStatisticsWnd.Hide()
  293. self.MinimizeBtn.Hide()
  294. self.ExpandBtn.Show()
  295. def OnMoveWindow(self, x, y):
  296. if self.chDetailsWnd:
  297. self.chDetailsWnd.AdjustPosition(x, y)
  298. if self.chStatisticsWnd:
  299. self.chStatisticsWnd.AdjustPosition(x, y)
  300. def __SetSkillSlotEvent(self):
  301. for skillPageValue in self.skillPageDict.itervalues():
  302. skillPageValue.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
  303. skillPageValue.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectSkill))
  304. skillPageValue.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
  305. skillPageValue.SetUnselectItemSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
  306. skillPageValue.SetUseSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
  307. skillPageValue.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
  308. skillPageValue.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
  309. skillPageValue.SetPressedSlotButtonEvent(ui.__mem_func__(self.OnPressedSlotButton))
  310. skillPageValue.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
  311. "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
  312. "d:/ymir work/ui/game/windows/btn_plus_down.sub")
  313. def __SetEmotionSlot(self):
  314. self.emotionToolTip = uiToolTip.ToolTip()
  315. for slot in (self.soloEmotionSlot, self.dualEmotionSlot):
  316. slot.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
  317. slot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectEmotion))
  318. slot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
  319. slot.SetUseSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
  320. slot.SetOverInItemEvent(ui.__mem_func__(self.__OverInEmotion))
  321. slot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutEmotion))
  322. slot.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
  323. "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
  324. "d:/ymir work/ui/game/windows/btn_plus_down.sub")
  325. for slotIdx, datadict in emotion.EMOTION_DICT.items():
  326. emotionIdx = slotIdx
  327. slot = self.soloEmotionSlot
  328. if slotIdx > 50:
  329. slot = self.dualEmotionSlot
  330. slot.SetEmotionSlot(slotIdx, emotionIdx)
  331. slot.SetCoverButton(slotIdx)
  332. def __SelectEmotion(self, slotIndex):
  333. if not slotIndex in emotion.EMOTION_DICT:
  334. return
  335. if app.IsPressed(app.DIK_LCONTROL):
  336. player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex)
  337. return
  338. mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex)
  339. def __ClickEmotionSlot(self, slotIndex):
  340. print "click emotion"
  341. if not slotIndex in emotion.EMOTION_DICT:
  342. return
  343. print "check acting"
  344. if player.IsActingEmotion():
  345. return
  346. command = emotion.EMOTION_DICT[slotIndex]["command"]
  347. print "command", command
  348. if slotIndex > 50:
  349. vid = player.GetTargetVID()
  350. if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid):
  351. import chat
  352. chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE)
  353. return
  354. command += " " + chr.GetNameByVID(vid)
  355. print "send_command", command
  356. net.SendChatPacket(command)
  357. def ActEmotion(self, emotionIndex):
  358. self.__ClickEmotionSlot(emotionIndex)
  359. def __OverInEmotion(self, slotIndex):
  360. if self.emotionToolTip:
  361. if not slotIndex in emotion.EMOTION_DICT:
  362. return
  363. self.emotionToolTip.ClearToolTip()
  364. self.emotionToolTip.SetTitle(emotion.EMOTION_DICT[slotIndex]["name"])
  365. self.emotionToolTip.AlignHorizonalCenter()
  366. self.emotionToolTip.ShowToolTip()
  367. def __OverOutEmotion(self):
  368. if self.emotionToolTip:
  369. self.emotionToolTip.HideToolTip()
  370. def __BindEvent(self):
  371. for i in xrange(len(self.skillGroupButton)):
  372. self.skillGroupButton[i].SetEvent(lambda arg=i: self.__SelectSkillGroup(arg))
  373. self.RefreshQuest()
  374. self.__HideJobToolTip()
  375. for (tabKey, tabButton) in self.tabButtonDict.items():
  376. tabButton.SetEvent(ui.__mem_func__(self.__OnClickTabButton), tabKey)
  377. for (statusPlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
  378. statusPlusButton.SAFE_SetEvent(self.__OnClickStatusPlusButton, statusPlusKey)
  379. statusPlusButton.ShowToolTip = lambda arg=statusPlusKey: self.__OverInStatButton(arg)
  380. statusPlusButton.HideToolTip = lambda arg=statusPlusKey: self.__OverOutStatButton()
  381. for (statusMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
  382. statusMinusButton.SAFE_SetEvent(self.__OnClickStatusMinusButton, statusMinusKey)
  383. statusMinusButton.ShowToolTip = lambda arg=statusMinusKey: self.__OverInStatMinusButton(arg)
  384. statusMinusButton.HideToolTip = lambda arg=statusMinusKey: self.__OverOutStatMinusButton()
  385. for titleBarValue in self.titleBarDict.itervalues():
  386. if app.ENABLE_DETAILS_UI:
  387. titleBarValue.SetCloseEvent(ui.__mem_func__(self.Close))
  388. else:
  389. titleBarValue.SetCloseEvent(ui.__mem_func__(self.Hide))
  390. self.questSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectQuest))
  391. def __LoadWindow(self):
  392. if self.isLoaded == 1:
  393. return
  394. self.isLoaded = 1
  395. try:
  396. if localeInfo.IsARABIC() or localeInfo.IsVIETNAM() or localeInfo.IsJAPAN():
  397. self.__LoadScript(uiScriptLocale.LOCALE_UISCRIPT_PATH + "CharacterWindow.py")
  398. else:
  399. self.__LoadScript("UIScript/CharacterWindow.py")
  400. self.__BindObject()
  401. self.__BindEvent()
  402. except:
  403. import exception
  404. exception.Abort("CharacterWindow.__LoadWindow")
  405. #self.tabButtonDict["EMOTICON"].Disable()
  406. self.SetState("STATUS")
  407. def Destroy(self):
  408. self.ClearDictionary()
  409. self.__Initialize()
  410. def Close(self):
  411. if 0 != self.toolTipSkill:
  412. self.toolTipSkill.Hide()
  413. if app.ENABLE_DETAILS_UI:
  414. if self.chDetailsWnd and self.chDetailsWnd.IsShow():
  415. self.chDetailsWnd.Hide()
  416. if self.chStatisticsWnd and self.chStatisticsWnd.IsShow():
  417. self.chStatisticsWnd.Hide()
  418. self.Hide()
  419. def SetSkillToolTip(self, toolTipSkill):
  420. self.toolTipSkill = toolTipSkill
  421. def __OnClickStatusPlusButton(self, statusKey):
  422. try:
  423. statusPlusCommand=self.statusPlusCommandDict[statusKey]
  424. net.SendChatPacket(statusPlusCommand)
  425. except KeyError, msg:
  426. dbg.TraceError("CharacterWindow.__OnClickStatusPlusButton KeyError: %s", msg)
  427. def __OnClickStatusMinusButton(self, statusKey):
  428. try:
  429. statusMinusCommand=self.statusMinusCommandDict[statusKey]
  430. net.SendChatPacket(statusMinusCommand)
  431. except KeyError, msg:
  432. dbg.TraceError("CharacterWindow.__OnClickStatusMinusButton KeyError: %s", msg)
  433. def __OnClickTabButton(self, stateKey):
  434. self.SetState(stateKey)
  435. def SetState(self, stateKey):
  436. self.state = stateKey
  437. for (tabKey, tabButton) in self.tabButtonDict.items():
  438. if stateKey!=tabKey:
  439. tabButton.SetUp()
  440. for tabValue in self.tabDict.itervalues():
  441. tabValue.Hide()
  442. for pageValue in self.pageDict.itervalues():
  443. pageValue.Hide()
  444. for titleBarValue in self.titleBarDict.itervalues():
  445. titleBarValue.Hide()
  446. self.titleBarDict[stateKey].Show()
  447. self.tabDict[stateKey].Show()
  448. self.pageDict[stateKey].Show()
  449. def GetState(self):
  450. return self.state
  451. def __GetTotalAtkText(self):
  452. minAtk=player.GetStatus(player.ATT_MIN)
  453. maxAtk=player.GetStatus(player.ATT_MAX)
  454. atkBonus=player.GetStatus(player.ATT_BONUS)
  455. attackerBonus=player.GetStatus(player.ATTACKER_BONUS)
  456. if minAtk==maxAtk:
  457. return "%d" % (minAtk+atkBonus+attackerBonus)
  458. else:
  459. return "%d-%d" % (minAtk+atkBonus+attackerBonus, maxAtk+atkBonus+attackerBonus)
  460. def __GetTotalMagAtkText(self):
  461. minMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MIN_MAGIC_WEP)
  462. maxMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MAX_MAGIC_WEP)
  463. if minMagAtk==maxMagAtk:
  464. return "%d" % (minMagAtk)
  465. else:
  466. return "%d-%d" % (minMagAtk, maxMagAtk)
  467. def __GetTotalDefText(self):
  468. defValue=player.GetStatus(player.DEF_GRADE)
  469. if constInfo.ADD_DEF_BONUS_ENABLE:
  470. defValue+=player.GetStatus(player.DEF_BONUS)
  471. return "%d" % (defValue)
  472. def RefreshStatus(self):
  473. if self.isLoaded==0:
  474. return
  475. try:
  476. self.GetChild("Level_Value").SetText(str(player.GetStatus(player.LEVEL)))
  477. self.GetChild("Exp_Value").SetText(str(unsigned32(player.GetEXP())))
  478. self.GetChild("RestExp_Value").SetText(str(unsigned32(player.GetStatus(player.NEXT_EXP)) - unsigned32(player.GetStatus(player.EXP))))
  479. self.GetChild("HP_Value").SetText(str(player.GetStatus(player.HP)) + '/' + str(player.GetStatus(player.MAX_HP)))
  480. self.GetChild("SP_Value").SetText(str(player.GetStatus(player.SP)) + '/' + str(player.GetStatus(player.MAX_SP)))
  481. self.GetChild("STR_Value").SetText(str(player.GetStatus(player.ST)))
  482. self.GetChild("DEX_Value").SetText(str(player.GetStatus(player.DX)))
  483. self.GetChild("HTH_Value").SetText(str(player.GetStatus(player.HT)))
  484. self.GetChild("INT_Value").SetText(str(player.GetStatus(player.IQ)))
  485. self.GetChild("ATT_Value").SetText(self.__GetTotalAtkText())
  486. self.GetChild("DEF_Value").SetText(self.__GetTotalDefText())
  487. self.GetChild("MATT_Value").SetText(self.__GetTotalMagAtkText())
  488. #self.GetChild("MATT_Value").SetText(str(player.GetStatus(player.MAG_ATT)))
  489. self.GetChild("MDEF_Value").SetText(str(player.GetStatus(player.MAG_DEF)))
  490. self.GetChild("ASPD_Value").SetText(str(player.GetStatus(player.ATT_SPEED)))
  491. self.GetChild("MSPD_Value").SetText(str(player.GetStatus(player.MOVING_SPEED)))
  492. self.GetChild("CSPD_Value").SetText(str(player.GetStatus(player.CASTING_SPEED)))
  493. self.GetChild("ER_Value").SetText(str(player.GetStatus(player.EVADE_RATE)))
  494. except:
  495. #import exception
  496. #exception.Abort("CharacterWindow.RefreshStatus.BindObject")
  497. ## 게임이 튕겨 버림
  498. pass
  499. self.__RefreshStatusPlusButtonList()
  500. self.__RefreshStatusMinusButtonList()
  501. self.RefreshAlignment()
  502. if self.refreshToolTip:
  503. self.refreshToolTip()
  504. if app.ENABLE_DETAILS_UI:
  505. if self.chDetailsWnd and self.chDetailsWnd.IsShow():
  506. self.chDetailsWnd.Refresh()
  507. if self.chStatisticsWnd and self.chStatisticsWnd.IsShow():
  508. self.chStatisticsWnd.Refresh()
  509. def __RefreshStatusPlusButtonList(self):
  510. if self.isLoaded==0:
  511. return
  512. statusPlusPoint=player.GetStatus(player.STAT)
  513. if statusPlusPoint>0:
  514. self.statusPlusValue.SetText(str(statusPlusPoint))
  515. self.statusPlusLabel.Show()
  516. self.ShowStatusPlusButtonList()
  517. else:
  518. self.statusPlusValue.SetText(str(0))
  519. self.statusPlusLabel.Hide()
  520. self.HideStatusPlusButtonList()
  521. def __RefreshStatusMinusButtonList(self):
  522. if self.isLoaded==0:
  523. return
  524. statusMinusPoint=self.__GetStatMinusPoint()
  525. if statusMinusPoint>0:
  526. self.__ShowStatusMinusButtonList()
  527. else:
  528. self.__HideStatusMinusButtonList()
  529. def RefreshAlignment(self):
  530. point, grade = player.GetAlignmentData()
  531. import colorInfo
  532. COLOR_DICT = { 0 : colorInfo.TITLE_RGB_GOOD_4,
  533. 1 : colorInfo.TITLE_RGB_GOOD_3,
  534. 2 : colorInfo.TITLE_RGB_GOOD_2,
  535. 3 : colorInfo.TITLE_RGB_GOOD_1,
  536. 4 : colorInfo.TITLE_RGB_NORMAL,
  537. 5 : colorInfo.TITLE_RGB_EVIL_1,
  538. 6 : colorInfo.TITLE_RGB_EVIL_2,
  539. 7 : colorInfo.TITLE_RGB_EVIL_3,
  540. 8 : colorInfo.TITLE_RGB_EVIL_4, }
  541. colorList = COLOR_DICT.get(grade, colorInfo.TITLE_RGB_NORMAL)
  542. gradeColor = ui.GenerateColor(colorList[0], colorList[1], colorList[2])
  543. self.toolTipAlignment.ClearToolTip()
  544. self.toolTipAlignment.AutoAppendTextLine(localeInfo.TITLE_NAME_LIST[grade], gradeColor)
  545. self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME + str(point))
  546. self.toolTipAlignment.AlignHorizonalCenter()
  547. def __ShowStatusMinusButtonList(self):
  548. for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
  549. statusMinusButton.Show()
  550. def __HideStatusMinusButtonList(self):
  551. for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
  552. statusMinusButton.Hide()
  553. def ShowStatusPlusButtonList(self):
  554. for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
  555. statusPlusButton.Show()
  556. def HideStatusPlusButtonList(self):
  557. for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
  558. statusPlusButton.Hide()
  559. def SelectSkill(self, skillSlotIndex):
  560. mouseController = mouseModule.mouseController
  561. if False == mouseController.isAttached():
  562. srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex)
  563. selectedSkillIndex = player.GetSkillIndex(srcSlotIndex)
  564. if skill.CanUseSkill(selectedSkillIndex):
  565. if app.IsPressed(app.DIK_LCONTROL):
  566. player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex)
  567. return
  568. mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex)
  569. else:
  570. mouseController.DeattachObject()
  571. def SelectEmptySlot(self, SlotIndex):
  572. mouseModule.mouseController.DeattachObject()
  573. ## ToolTip
  574. def OverInItem(self, slotNumber):
  575. if mouseModule.mouseController.isAttached():
  576. return
  577. if 0 == self.toolTipSkill:
  578. return
  579. srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)
  580. skillIndex = player.GetSkillIndex(srcSlotIndex)
  581. skillLevel = player.GetSkillLevel(srcSlotIndex)
  582. skillGrade = player.GetSkillGrade(srcSlotIndex)
  583. skillType = skill.GetSkillType(skillIndex)
  584. ## ACTIVE
  585. if skill.SKILL_TYPE_ACTIVE == skillType:
  586. overInSkillGrade = self.__GetSkillGradeFromSlot(slotNumber)
  587. if overInSkillGrade == skill.SKILL_GRADE_COUNT-1 and skillGrade == skill.SKILL_GRADE_COUNT:
  588. self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)
  589. elif overInSkillGrade == skillGrade:
  590. self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, overInSkillGrade, skillLevel)
  591. else:
  592. self.toolTipSkill.SetSkillOnlyName(srcSlotIndex, skillIndex, overInSkillGrade)
  593. else:
  594. self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)
  595. def OverOutItem(self):
  596. if 0 != self.toolTipSkill:
  597. self.toolTipSkill.HideToolTip()
  598. ## Quest
  599. def __SelectQuest(self, slotIndex):
  600. questIndex = quest.GetQuestIndex(self.questShowingStartIndex+slotIndex)
  601. import event
  602. event.QuestButtonClick(-2147483648 + questIndex)
  603. def RefreshQuest(self):
  604. if self.isLoaded==0:
  605. return
  606. questCount = quest.GetQuestCount()
  607. questRange = range(quest.QUEST_MAX_NUM)
  608. if questCount > quest.QUEST_MAX_NUM:
  609. self.questScrollBar.Show()
  610. else:
  611. self.questScrollBar.Hide()
  612. for i in questRange[:questCount]:
  613. (questName, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(self.questShowingStartIndex+i)
  614. self.questNameList[i].SetText(questName)
  615. self.questNameList[i].Show()
  616. self.questLastCountList[i].Show()
  617. self.questLastTimeList[i].Show()
  618. if len(questCounterName) > 0:
  619. self.questLastCountList[i].SetText("%s : %d" % (questCounterName, questCounterValue))
  620. else:
  621. self.questLastCountList[i].SetText("")
  622. ## Icon
  623. self.questSlot.SetSlot(i, i, 1, 1, questIcon)
  624. for i in questRange[questCount:]:
  625. self.questNameList[i].Hide()
  626. self.questLastTimeList[i].Hide()
  627. self.questLastCountList[i].Hide()
  628. self.questSlot.ClearSlot(i)
  629. self.questSlot.HideSlotBaseImage(i)
  630. self.__UpdateQuestClock()
  631. def __UpdateQuestClock(self):
  632. if "QUEST" == self.state:
  633. # QUEST_LIMIT_COUNT_BUG_FIX
  634. for i in xrange(min(quest.GetQuestCount(), quest.QUEST_MAX_NUM)):
  635. # END_OF_QUEST_LIMIT_COUNT_BUG_FIX
  636. (lastName, lastTime) = quest.GetQuestLastTime(i)
  637. clockText = localeInfo.QUEST_UNLIMITED_TIME
  638. if len(lastName) > 0:
  639. if lastTime <= 0:
  640. clockText = localeInfo.QUEST_TIMEOVER
  641. else:
  642. questLastMinute = lastTime / 60
  643. questLastSecond = lastTime % 60
  644. clockText = lastName + " : "
  645. if questLastMinute > 0:
  646. clockText += str(questLastMinute) + localeInfo.QUEST_MIN
  647. if questLastSecond > 0:
  648. clockText += " "
  649. if questLastSecond > 0:
  650. clockText += str(questLastSecond) + localeInfo.QUEST_SEC
  651. self.questLastTimeList[i].SetText(clockText)
  652. def __GetStatMinusPoint(self):
  653. POINT_STAT_RESET_COUNT = 112
  654. return player.GetStatus(POINT_STAT_RESET_COUNT)
  655. def __OverInStatMinusButton(self, stat):
  656. try:
  657. self.__ShowStatToolTip(self.STAT_MINUS_DESCRIPTION[stat] % self.__GetStatMinusPoint())
  658. except KeyError:
  659. pass
  660. self.refreshToolTip = lambda arg=stat: self.__OverInStatMinusButton(arg)
  661. def __OverOutStatMinusButton(self):
  662. self.__HideStatToolTip()
  663. self.refreshToolTip = 0
  664. def __OverInStatButton(self, stat):
  665. try:
  666. self.__ShowStatToolTip(self.STAT_DESCRIPTION[stat])
  667. except KeyError:
  668. pass
  669. def __OverOutStatButton(self):
  670. self.__HideStatToolTip()
  671. def __ShowStatToolTip(self, statDesc):
  672. self.toolTip.ClearToolTip()
  673. self.toolTip.AppendTextLine(statDesc)
  674. self.toolTip.Show()
  675. def __HideStatToolTip(self):
  676. self.toolTip.Hide()
  677. def OnPressEscapeKey(self):
  678. self.Close()
  679. return True
  680. def OnUpdate(self):
  681. self.__UpdateQuestClock()
  682. ## Skill Process
  683. def __RefreshSkillPage(self, name, slotCount):
  684. global SHOW_LIMIT_SUPPORT_SKILL_LIST
  685. skillPage = self.skillPageDict[name]
  686. startSlotIndex = skillPage.GetStartIndex()
  687. if "ACTIVE" == name:
  688. if self.PAGE_HORSE == self.curSelectedSkillGroup:
  689. startSlotIndex += slotCount
  690. getSkillType=skill.GetSkillType
  691. getSkillIndex=player.GetSkillIndex
  692. getSkillGrade=player.GetSkillGrade
  693. getSkillLevel=player.GetSkillLevel
  694. getSkillLevelUpPoint=skill.GetSkillLevelUpPoint
  695. getSkillMaxLevel=skill.GetSkillMaxLevel
  696. for i in xrange(slotCount+1):
  697. slotIndex = i + startSlotIndex
  698. skillIndex = getSkillIndex(slotIndex)
  699. for j in xrange(skill.SKILL_GRADE_COUNT):
  700. skillPage.ClearSlot(self.__GetRealSkillSlot(j, i))
  701. if 0 == skillIndex:
  702. continue
  703. skillGrade = getSkillGrade(slotIndex)
  704. skillLevel = getSkillLevel(slotIndex)
  705. skillType = getSkillType(skillIndex)
  706. ## 승마 스킬 예외 처리
  707. if player.SKILL_INDEX_RIDING == skillIndex:
  708. if 1 == skillGrade:
  709. skillLevel += 19
  710. elif 2 == skillGrade:
  711. skillLevel += 29
  712. elif 3 == skillGrade:
  713. skillLevel = 40
  714. skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel)
  715. skillPage.SetSlotCount(slotIndex, skillLevel)
  716. ## ACTIVE
  717. elif skill.SKILL_TYPE_ACTIVE == skillType:
  718. for j in xrange(skill.SKILL_GRADE_COUNT):
  719. realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
  720. skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
  721. skillPage.SetCoverButton(realSlotIndex)
  722. if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1):
  723. skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
  724. elif (not self.__CanUseSkillNow()) or (skillGrade != j):
  725. skillPage.SetSlotCount(realSlotIndex, 0)
  726. skillPage.DisableCoverButton(realSlotIndex)
  727. else:
  728. skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
  729. ## 그외
  730. else:
  731. if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
  732. realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
  733. skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
  734. skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
  735. if skill.CanUseSkill(skillIndex):
  736. skillPage.SetCoverButton(realSlotIndex)
  737. skillPage.RefreshSlot()
  738. def RefreshSkill(self):
  739. if self.isLoaded==0:
  740. return
  741. if self.__IsChangedHorseRidingSkillLevel():
  742. self.RefreshCharacter()
  743. return
  744. global SHOW_ONLY_ACTIVE_SKILL
  745. if SHOW_ONLY_ACTIVE_SKILL:
  746. self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
  747. else:
  748. self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
  749. self.__RefreshSkillPage("SUPPORT", self.SUPPORT_PAGE_SLOT_COUNT)
  750. self.RefreshSkillPlusButtonList()
  751. def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint):
  752. ## 스킬이 있으면
  753. if 0 == skillIndex:
  754. return False
  755. ## 레벨업 조건을 만족한다면
  756. if not skill.CanLevelUpSkill(skillIndex, skillLevel):
  757. return False
  758. return True
  759. def __RefreshSkillPlusButton(self, name):
  760. global HIDE_SUPPORT_SKILL_POINT
  761. if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name:
  762. return
  763. slotWindow = self.skillPageDict[name]
  764. slotWindow.HideAllSlotButton()
  765. slotStatType = self.skillPageStatDict[name]
  766. if 0 == slotStatType:
  767. return
  768. statPoint = player.GetStatus(slotStatType)
  769. startSlotIndex = slotWindow.GetStartIndex()
  770. if "HORSE" == name:
  771. startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT
  772. if statPoint > 0:
  773. for i in xrange(self.PAGE_SLOT_COUNT):
  774. slotIndex = i + startSlotIndex
  775. skillIndex = player.GetSkillIndex(slotIndex)
  776. skillGrade = player.GetSkillGrade(slotIndex)
  777. skillLevel = player.GetSkillLevel(slotIndex)
  778. if skillIndex == 0:
  779. continue
  780. if skillGrade != 0:
  781. continue
  782. if name == "HORSE":
  783. if player.GetStatus(player.LEVEL) >= skill.GetSkillLevelLimit(skillIndex):
  784. if skillLevel < 20:
  785. slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex))
  786. else:
  787. if "SUPPORT" == name:
  788. if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
  789. if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
  790. slotWindow.ShowSlotButton(slotIndex)
  791. else:
  792. if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
  793. slotWindow.ShowSlotButton(slotIndex)
  794. def RefreshSkillPlusButtonList(self):
  795. if self.isLoaded==0:
  796. return
  797. self.RefreshSkillPlusPointLabel()
  798. if not self.__CanUseSkillNow():
  799. return
  800. try:
  801. if self.PAGE_HORSE == self.curSelectedSkillGroup:
  802. self.__RefreshSkillPlusButton("HORSE")
  803. else:
  804. self.__RefreshSkillPlusButton("ACTIVE")
  805. self.__RefreshSkillPlusButton("SUPPORT")
  806. except:
  807. import exception
  808. exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject")
  809. def RefreshSkillPlusPointLabel(self):
  810. if self.isLoaded==0:
  811. return
  812. if self.PAGE_HORSE == self.curSelectedSkillGroup:
  813. activeStatPoint = player.GetStatus(player.SKILL_HORSE)
  814. self.activeSkillPointValue.SetText(str(activeStatPoint))
  815. else:
  816. activeStatPoint = player.GetStatus(player.SKILL_ACTIVE)
  817. self.activeSkillPointValue.SetText(str(activeStatPoint))
  818. supportStatPoint = max(0, player.GetStatus(player.SKILL_SUPPORT))
  819. self.supportSkillPointValue.SetText(str(supportStatPoint))
  820. ## Skill Level Up Button
  821. def OnPressedSlotButton(self, slotNumber):
  822. srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)
  823. skillIndex = player.GetSkillIndex(srcSlotIndex)
  824. curLevel = player.GetSkillLevel(srcSlotIndex)
  825. maxLevel = skill.GetSkillMaxLevel(skillIndex)
  826. net.SendChatPacket("/skillup " + str(skillIndex))
  827. ## Use Skill
  828. def ClickSkillSlot(self, slotIndex):
  829. srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotIndex)
  830. skillIndex = player.GetSkillIndex(srcSlotIndex)
  831. skillType = skill.GetSkillType(skillIndex)
  832. if not self.__CanUseSkillNow():
  833. if skill.SKILL_TYPE_ACTIVE == skillType:
  834. return
  835. for slotWindow in self.skillPageDict.values():
  836. if slotWindow.HasSlot(slotIndex):
  837. if skill.CanUseSkill(skillIndex):
  838. player.ClickSkillSlot(srcSlotIndex)
  839. return
  840. mouseModule.mouseController.DeattachObject()
  841. ## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다.
  842. ## 매우 불합리. 구조 자체를 개선해야 할듯.
  843. def OnUseSkill(self, slotIndex, coolTime):
  844. skillIndex = player.GetSkillIndex(slotIndex)
  845. skillType = skill.GetSkillType(skillIndex)
  846. ## ACTIVE
  847. if skill.SKILL_TYPE_ACTIVE == skillType:
  848. skillGrade = player.GetSkillGrade(slotIndex)
  849. slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
  850. ## ETC
  851. else:
  852. slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
  853. for slotWindow in self.skillPageDict.values():
  854. if slotWindow.HasSlot(slotIndex):
  855. slotWindow.SetSlotCoolTime(slotIndex, coolTime)
  856. return
  857. def OnActivateSkill(self, slotIndex):
  858. skillGrade = player.GetSkillGrade(slotIndex)
  859. slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
  860. for slotWindow in self.skillPageDict.values():
  861. if slotWindow.HasSlot(slotIndex):
  862. slotWindow.ActivateSlot(slotIndex)
  863. return
  864. def OnDeactivateSkill(self, slotIndex):
  865. skillGrade = player.GetSkillGrade(slotIndex)
  866. slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
  867. for slotWindow in self.skillPageDict.values():
  868. if slotWindow.HasSlot(slotIndex):
  869. slotWindow.DeactivateSlot(slotIndex)
  870. return
  871. def __ShowJobToolTip(self):
  872. self.toolTipJob.ShowToolTip()
  873. def __HideJobToolTip(self):
  874. self.toolTipJob.HideToolTip()
  875. def __SetJobText(self, mainJob, subJob):
  876. if player.GetStatus(player.LEVEL)<5:
  877. subJob=0
  878. if 949 == app.GetDefaultCodePage():
  879. self.toolTipJob.ClearToolTip()
  880. try:
  881. jobInfoTitle=localeInfo.JOBINFO_TITLE[mainJob][subJob]
  882. jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob]
  883. except IndexError:
  884. print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob)
  885. return
  886. self.toolTipJob.AutoAppendTextLine(jobInfoTitle)
  887. self.toolTipJob.AppendSpace(5)
  888. for jobInfoDataLine in jobInfoData:
  889. self.toolTipJob.AutoAppendTextLine(jobInfoDataLine)
  890. self.toolTipJob.AlignHorizonalCenter()
  891. def __ShowAlignmentToolTip(self):
  892. self.toolTipAlignment.ShowToolTip()
  893. def __HideAlignmentToolTip(self):
  894. self.toolTipAlignment.HideToolTip()
  895. def RefreshCharacter(self):
  896. if self.isLoaded==0:
  897. return
  898. ## Name
  899. try:
  900. characterName = player.GetName()
  901. guildName = player.GetGuildName()
  902. self.characterNameValue.SetText(characterName)
  903. self.guildNameValue.SetText(guildName)
  904. if not guildName:
  905. if localeInfo.IsARABIC():
  906. self.characterNameSlot.SetPosition(190, 34)
  907. else:
  908. self.characterNameSlot.SetPosition(109, 34)
  909. self.guildNameSlot.Hide()
  910. else:
  911. if localeInfo.IsJAPAN():
  912. self.characterNameSlot.SetPosition(143, 34)
  913. else:
  914. self.characterNameSlot.SetPosition(153, 34)
  915. self.guildNameSlot.Show()
  916. except:
  917. import exception
  918. exception.Abort("CharacterWindow.RefreshCharacter.BindObject")
  919. race = net.GetMainActorRace()
  920. group = net.GetMainActorSkillGroup()
  921. empire = net.GetMainActorEmpire()
  922. ## Job Text
  923. job = chr.RaceToJob(race)
  924. self.__SetJobText(job, group)
  925. ## FaceImage
  926. try:
  927. faceImageName = FACE_IMAGE_DICT[race]
  928. try:
  929. self.faceImage.LoadImage(faceImageName)
  930. except:
  931. print "CharacterWindow.RefreshCharacter(race=%d, faceImageName=%s)" % (race, faceImageName)
  932. self.faceImage.Hide()
  933. except KeyError:
  934. self.faceImage.Hide()
  935. ## GroupName
  936. self.__SetSkillGroupName(race, group)
  937. ## Skill
  938. if 0 == group:
  939. self.__SelectSkillGroup(0)
  940. else:
  941. self.__SetSkillSlotData(race, group, empire)
  942. if self.__CanUseHorseSkill():
  943. self.__SelectSkillGroup(0)
  944. def __SetSkillGroupName(self, race, group):
  945. job = chr.RaceToJob(race)
  946. if not self.SKILL_GROUP_NAME_DICT.has_key(job):
  947. return
  948. nameList = self.SKILL_GROUP_NAME_DICT[job]
  949. if 0 == group:
  950. self.skillGroupButton1.SetText(nameList[1])
  951. self.skillGroupButton2.SetText(nameList[2])
  952. self.skillGroupButton1.Show()
  953. self.skillGroupButton2.Show()
  954. self.activeSkillGroupName.Hide()
  955. else:
  956. if self.__CanUseHorseSkill():
  957. self.activeSkillGroupName.Hide()
  958. self.skillGroupButton1.SetText(nameList.get(group, "Noname"))
  959. self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE)
  960. self.skillGroupButton1.Show()
  961. self.skillGroupButton2.Show()
  962. else:
  963. self.activeSkillGroupName.SetText(nameList.get(group, "Noname"))
  964. self.activeSkillGroupName.Show()
  965. self.skillGroupButton1.Hide()
  966. self.skillGroupButton2.Hide()
  967. def __SetSkillSlotData(self, race, group, empire=0):
  968. ## SkillIndex
  969. playerSettingModule.RegisterSkill(race, group, empire)
  970. ## Event
  971. self.__SetSkillSlotEvent()
  972. ## Refresh
  973. self.RefreshSkill()
  974. def __SelectSkillGroup(self, index):
  975. for btn in self.skillGroupButton:
  976. btn.SetUp()
  977. self.skillGroupButton[index].Down()
  978. if self.__CanUseHorseSkill():
  979. if 0 == index:
  980. index = net.GetMainActorSkillGroup()-1
  981. elif 1 == index:
  982. index = self.PAGE_HORSE
  983. self.curSelectedSkillGroup = index
  984. self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire())
  985. def __CanUseSkillNow(self):
  986. if 0 == net.GetMainActorSkillGroup():
  987. return False
  988. return True
  989. def __CanUseHorseSkill(self):
  990. slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING)
  991. if not slotIndex:
  992. return False
  993. grade = player.GetSkillGrade(slotIndex)
  994. level = player.GetSkillLevel(slotIndex)
  995. if level < 0:
  996. level *= -1
  997. if grade >= 1 and level >= 1:
  998. return True
  999. return False
  1000. def __IsChangedHorseRidingSkillLevel(self):
  1001. ret = False
  1002. if -1 == self.canUseHorseSkill:
  1003. self.canUseHorseSkill = self.__CanUseHorseSkill()
  1004. if self.canUseHorseSkill != self.__CanUseHorseSkill():
  1005. ret = True
  1006. self.canUseHorseSkill = self.__CanUseHorseSkill()
  1007. return ret
  1008. def __GetRealSkillSlot(self, skillGrade, skillSlot):
  1009. return skillSlot + min(skill.SKILL_GRADE_COUNT-1, skillGrade)*skill.SKILL_GRADE_STEP_COUNT
  1010. def __GetETCSkillRealSlotIndex(self, skillSlot):
  1011. if skillSlot > 100:
  1012. return skillSlot
  1013. return skillSlot % self.ACTIVE_PAGE_SLOT_COUNT
  1014. def __RealSkillSlotToSourceSlot(self, realSkillSlot):
  1015. if realSkillSlot > 100:
  1016. return realSkillSlot
  1017. if self.PAGE_HORSE == self.curSelectedSkillGroup:
  1018. return realSkillSlot + self.ACTIVE_PAGE_SLOT_COUNT
  1019. return realSkillSlot % skill.SKILL_GRADE_STEP_COUNT
  1020. def __GetSkillGradeFromSlot(self, skillSlot):
  1021. return int(skillSlot / skill.SKILL_GRADE_STEP_COUNT)
  1022. def SelectSkillGroup(self, index):
  1023. self.__SelectSkillGroup(index)
  1024. def OnQuestScroll(self):
  1025. questCount = quest.GetQuestCount()
  1026. scrollLineCount = max(0, questCount - quest.QUEST_MAX_NUM)
  1027. startIndex = int(scrollLineCount * self.questScrollBar.GetPos())
  1028. if startIndex != self.questShowingStartIndex:
  1029. self.questShowingStartIndex = startIndex
  1030. self.RefreshQuest()

uicharacter