forked from metin2/client
744 lines
22 KiB
Python
744 lines
22 KiB
Python
import ui
|
|
import grp
|
|
import player
|
|
import uiToolTip
|
|
import net
|
|
import locale
|
|
import uiScriptLocale
|
|
import constInfo
|
|
import mouseModule
|
|
|
|
class PartyMemberInfoBoard(ui.ScriptWindow):
|
|
if locale.IsJAPAN():
|
|
BOARD_WIDTH = 130
|
|
else:
|
|
BOARD_WIDTH = 106
|
|
BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.5)
|
|
GAUGE_OUT_LINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 0.3)
|
|
|
|
LINK_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
|
|
UNLINK_COLOR = grp.GenerateColor(0.5, 0.5, 0.5, 1.0)
|
|
#UNLINK_COLOR = grp.GenerateColor(0.9, 0.4745, 0.4627, 1.0)
|
|
|
|
PARTY_AFFECT_EXPERIENCE = 0
|
|
PARTY_AFFECT_ATTACKER = 1
|
|
PARTY_AFFECT_TANKER = 2
|
|
PARTY_AFFECT_BUFFER = 3
|
|
PARTY_AFFECT_SKILL_MASTER = 4
|
|
PARTY_AFFECT_BERSERKER = 5
|
|
PARTY_AFFECT_DEFENDER = 6
|
|
#PARTY_AFFECT_TIME_BONUS = 5
|
|
#PARTY_AFFECT_REGEN_BONUS = 6
|
|
PARTY_AFFECT_INCREASE_AREA_150 = 7
|
|
PARTY_AFFECT_INCREASE_AREA_200 = 8
|
|
AFFECT_STRING_DICT = { PARTY_AFFECT_EXPERIENCE : locale.PARTY_BONUS_EXP,
|
|
PARTY_AFFECT_ATTACKER : locale.PARTY_BONUS_ATTACKER,
|
|
PARTY_AFFECT_TANKER : locale.PARTY_BONUS_TANKER,
|
|
PARTY_AFFECT_BUFFER : locale.PARTY_BONUS_BUFFER,
|
|
PARTY_AFFECT_SKILL_MASTER : locale.PARTY_BONUS_SKILL_MASTER,
|
|
PARTY_AFFECT_BERSERKER : locale.PARTY_BONUS_BERSERKER,
|
|
PARTY_AFFECT_DEFENDER : locale.PARTY_BONUS_DEFENDER,
|
|
PARTY_AFFECT_INCREASE_AREA_150 : locale.PARTY_INCREASE_AREA_150,
|
|
PARTY_AFFECT_INCREASE_AREA_200 : locale.PARTY_INCREASE_AREA_200, }
|
|
|
|
PARTY_SKILL_HEAL = 1
|
|
PARTY_SKILL_WARP = 2
|
|
MEMBER_BUTTON_NORMAL = 10
|
|
MEMBER_BUTTON_WARP = 11
|
|
MEMBER_BUTTON_EXPEL = 12
|
|
MEMBER_BUTTON_PATH = "d:/ymir work/ui/game/windows/"
|
|
MEMBER_BUTTON_IMAGE_FILE_NAME_DICT = { player.PARTY_STATE_LEADER : "party_state_leader",
|
|
player.PARTY_STATE_ATTACKER : "party_state_attacker",
|
|
player.PARTY_STATE_BERSERKER : "party_state_berserker",
|
|
player.PARTY_STATE_TANKER : "party_state_tanker",
|
|
player.PARTY_STATE_DEFENDER : "party_state_defender",
|
|
player.PARTY_STATE_BUFFER : "party_state_buffer",
|
|
player.PARTY_STATE_SKILL_MASTER : "party_state_skill_master",
|
|
MEMBER_BUTTON_NORMAL : "party_state_normal",
|
|
MEMBER_BUTTON_WARP : "party_skill_warp",
|
|
MEMBER_BUTTON_EXPEL : "party_expel", }
|
|
|
|
STATE_NAME_DICT = { player.PARTY_STATE_ATTACKER : locale.PARTY_SET_ATTACKER,
|
|
player.PARTY_STATE_BERSERKER : locale.PARTY_SET_BERSERKER,
|
|
player.PARTY_STATE_TANKER : locale.PARTY_SET_TANKER,
|
|
player.PARTY_STATE_DEFENDER : locale.PARTY_SET_DEFENDER,
|
|
player.PARTY_STATE_BUFFER : locale.PARTY_SET_BUFFER,
|
|
player.PARTY_STATE_SKILL_MASTER : locale.PARTY_SET_SKILL_MASTER, }
|
|
|
|
def __init__(self):
|
|
ui.ScriptWindow.__init__(self)
|
|
|
|
self.pid = None
|
|
self.vid = None
|
|
self.partyAffectImageList = []
|
|
self.stateButtonDict = {}
|
|
self.affectValueDict = {}
|
|
self.state = -1
|
|
self.isShowStateButton = FALSE
|
|
|
|
self.__LoadBoard()
|
|
self.__CreateAffectToolTip()
|
|
self.__CreateStateButton()
|
|
self.Show()
|
|
|
|
def __del__(self):
|
|
ui.ScriptWindow.__del__(self)
|
|
|
|
print " =============================== DESTROIED PartyMemberInfoBoard"
|
|
|
|
def __LoadBoard(self):
|
|
try:
|
|
pyScrLoader = ui.PythonScriptLoader()
|
|
if locale.IsJAPAN():
|
|
pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "PartyMemberInfoBoard.py")
|
|
else:
|
|
pyScrLoader.LoadScriptFile(self, "UIScript/PartyMemberInfoBoard.py")
|
|
except:
|
|
import exception
|
|
exception.Abort("PartyMemberInfoBoard.__LoadBoard.LoadScript")
|
|
|
|
try:
|
|
self.nameTextLine = self.GetChild("NamePrint")
|
|
self.gauge = self.GetChild("Gauge")
|
|
self.stateButton = self.GetChild("StateButton")
|
|
self.partyAffectImageList.append(self.GetChild("ExperienceImage"))
|
|
self.partyAffectImageList.append(self.GetChild("AttackerImage"))
|
|
self.partyAffectImageList.append(self.GetChild("DefenderImage"))
|
|
self.partyAffectImageList.append(self.GetChild("BufferImage"))
|
|
self.partyAffectImageList.append(self.GetChild("SkillMasterImage"))
|
|
self.partyAffectImageList.append(self.GetChild("TimeBonusImage"))
|
|
self.partyAffectImageList.append(self.GetChild("RegenBonus"))
|
|
self.partyAffectImageList.append(self.GetChild("IncreaseArea150"))
|
|
self.partyAffectImageList.append(self.GetChild("IncreaseArea200"))
|
|
self.stateButton.SetEvent(ui.__mem_func__(self.OnMouseLeftButtonDown))
|
|
except:
|
|
import exception
|
|
exception.Abort("PartyMemberInfoBoard.__LoadBoard.BindObject")
|
|
|
|
self.__SetAffectsMouseEvent()
|
|
self.__HideAllAffects()
|
|
|
|
def Destroy(self):
|
|
self.ClearDictionary()
|
|
self.nameTextLine = None
|
|
self.gauge = None
|
|
self.stateButton = None
|
|
self.partyAffectImageList = []
|
|
self.stateButtonDict = {}
|
|
|
|
self.leaderButton = None
|
|
self.attackerButton = None
|
|
self.tankerButton = None
|
|
|
|
self.Hide()
|
|
|
|
def __SetAffectsMouseEvent(self):
|
|
for i in xrange(len(self.partyAffectImageList)):
|
|
self.partyAffectImageList[i].OnMouseOverIn = lambda selfArg = self, index = i: selfArg.OnAffectOverIn(index)
|
|
for i in xrange(len(self.partyAffectImageList)):
|
|
self.partyAffectImageList[i].OnMouseOverOut = lambda selfArg = self, index = i: selfArg.OnAffectOverOut(index)
|
|
|
|
def __HideAllAffects(self):
|
|
for img in self.partyAffectImageList:
|
|
img.Hide()
|
|
|
|
def __CreateAffectToolTip(self):
|
|
affectToolTip = uiToolTip.ToolTip(220)
|
|
affectToolTip.Hide()
|
|
self.affectToolTip = affectToolTip
|
|
|
|
def __CreateStateButton(self):
|
|
for key, name in self.MEMBER_BUTTON_IMAGE_FILE_NAME_DICT.items():
|
|
if key == player.PARTY_STATE_LEADER:
|
|
continue
|
|
button = ui.Button()
|
|
button.SetUpVisual(self.MEMBER_BUTTON_PATH + name + "_01.sub")
|
|
button.SetOverVisual(self.MEMBER_BUTTON_PATH + name + "_02.sub")
|
|
button.SetDownVisual(self.MEMBER_BUTTON_PATH + name + "_03.sub")
|
|
button.Hide()
|
|
self.stateButtonDict[key] = button
|
|
|
|
for state, name in self.STATE_NAME_DICT.items():
|
|
button = self.stateButtonDict[state]
|
|
button.SetToolTipText(name)
|
|
button.SetEvent(ui.__mem_func__(self.OnSelectState), state)
|
|
|
|
self.stateButtonDict[self.MEMBER_BUTTON_NORMAL].SetEvent(ui.__mem_func__(self.OnSelectState), -1)
|
|
self.stateButtonDict[self.MEMBER_BUTTON_NORMAL].SetToolTipText(locale.PARTY_SET_NORMAL)
|
|
self.stateButtonDict[self.MEMBER_BUTTON_WARP].SetEvent(ui.__mem_func__(self.OnWarp))
|
|
self.stateButtonDict[self.MEMBER_BUTTON_WARP].SetToolTipText(locale.PARTY_RECALL_MEMBER)
|
|
self.stateButtonDict[self.MEMBER_BUTTON_EXPEL].SetToolTipText(locale.TARGET_BUTTON_EXCLUDE)
|
|
self.stateButtonDict[self.MEMBER_BUTTON_EXPEL].SetEvent(ui.__mem_func__(self.OnExpel))
|
|
|
|
def __GetPartySkillLevel(self):
|
|
slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_TONGSOL)
|
|
skillGrade = player.GetSkillGrade(slotIndex)
|
|
skillLevel = player.GetSkillLevel(slotIndex)
|
|
return skillLevel + skillGrade*20
|
|
|
|
def __AppendStateButton(self, x, y, state):
|
|
if state == self.state:
|
|
button = self.stateButtonDict[self.MEMBER_BUTTON_NORMAL]
|
|
else:
|
|
button = self.stateButtonDict[state]
|
|
|
|
button.SetPosition(x, y)
|
|
button.Show()
|
|
|
|
def __ShowStateButton(self):
|
|
self.isShowStateButton = TRUE
|
|
|
|
(x, y) = self.GetGlobalPosition()
|
|
xPos = x + 110
|
|
|
|
skillLevel = self.__GetPartySkillLevel()
|
|
|
|
## Tanker
|
|
if skillLevel >= 10:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_ATTACKER)
|
|
xPos += 23
|
|
|
|
## Attacker
|
|
if skillLevel >= 20:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_BERSERKER)
|
|
xPos += 23
|
|
|
|
## Tanker
|
|
if skillLevel >= 20:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_TANKER)
|
|
xPos += 23
|
|
|
|
## Buffer
|
|
if skillLevel >= 25:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_BUFFER)
|
|
xPos += 23
|
|
|
|
## Skill Master
|
|
if skillLevel >= 35:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_SKILL_MASTER)
|
|
xPos += 23
|
|
|
|
## Defender
|
|
if skillLevel >= 40:
|
|
self.__AppendStateButton(xPos, y, player.PARTY_STATE_DEFENDER)
|
|
xPos += 23
|
|
|
|
## Warp
|
|
#if skillLevel >= 35:
|
|
# if self.stateButtonDict.has_key(self.MEMBER_BUTTON_WARP):
|
|
# button = self.stateButtonDict[self.MEMBER_BUTTON_WARP]
|
|
# button.SetPosition(xPos, y)
|
|
# button.Show()
|
|
# xPos += 23
|
|
|
|
## Expel
|
|
if self.stateButtonDict.has_key(self.MEMBER_BUTTON_EXPEL):
|
|
button = self.stateButtonDict[self.MEMBER_BUTTON_EXPEL]
|
|
button.SetPosition(xPos, y)
|
|
button.Show()
|
|
xPos += 23
|
|
|
|
def __HideStateButton(self):
|
|
self.isShowStateButton = FALSE
|
|
for button in self.stateButtonDict.values():
|
|
button.Hide()
|
|
|
|
def __GetAffectNumber(self, img):
|
|
for i in xrange(self.partyAffectImageList):
|
|
if img == self.partyAffectImageList[i]:
|
|
return i
|
|
|
|
return -1
|
|
|
|
def SetCharacterName(self, name):
|
|
self.nameTextLine.SetText(name)
|
|
|
|
def GetCharacterName(self):
|
|
return self.nameTextLine.GetText()
|
|
|
|
def SetCharacterPID(self, pid):
|
|
self.pid = pid
|
|
|
|
def SetCharacterVID(self, vid):
|
|
self.vid = vid
|
|
|
|
def GetCharacterPID(self):
|
|
return self.pid
|
|
|
|
def GetCharacterVID(self):
|
|
return self.vid
|
|
|
|
def SetCharacterHP(self, hpPercentage):
|
|
hpPercentage = max(0, hpPercentage)
|
|
self.gauge.SetPercentage(hpPercentage, 100)
|
|
|
|
def SetCharacterState(self, state):
|
|
|
|
if self.state == state:
|
|
return
|
|
|
|
self.state = state
|
|
self.stateButton.Show()
|
|
|
|
name = self.MEMBER_BUTTON_IMAGE_FILE_NAME_DICT[self.MEMBER_BUTTON_NORMAL]
|
|
if self.MEMBER_BUTTON_IMAGE_FILE_NAME_DICT.has_key(state):
|
|
name = self.MEMBER_BUTTON_IMAGE_FILE_NAME_DICT[state]
|
|
|
|
self.stateButton.SetUpVisual(self.MEMBER_BUTTON_PATH + name + "_01.sub")
|
|
self.stateButton.SetOverVisual(self.MEMBER_BUTTON_PATH + name + "_02.sub")
|
|
self.stateButton.SetDownVisual(self.MEMBER_BUTTON_PATH + name + "_03.sub")
|
|
|
|
def SetAffect(self, affectSlotIndex, affectValue):
|
|
|
|
if affectSlotIndex >= len(self.partyAffectImageList):
|
|
return
|
|
|
|
if affectValue > 0:
|
|
self.partyAffectImageList[affectSlotIndex].Show()
|
|
else:
|
|
self.partyAffectImageList[affectSlotIndex].Hide()
|
|
|
|
self.affectValueDict[affectSlotIndex] = affectValue
|
|
|
|
def Link(self):
|
|
self.nameTextLine.SetPackedFontColor(self.LINK_COLOR)
|
|
self.gauge.Show()
|
|
|
|
def Unlink(self):
|
|
self.vid = None
|
|
self.nameTextLine.SetPackedFontColor(self.UNLINK_COLOR)
|
|
self.gauge.Hide()
|
|
self.__HideAllAffects()
|
|
|
|
def OnSelectState(self, state):
|
|
|
|
self.__HideStateButton()
|
|
if state <= 0:
|
|
net.SendPartySetStatePacket(self.pid, self.state, FALSE)
|
|
|
|
else:
|
|
|
|
if self.state <= 0:
|
|
net.SendPartySetStatePacket(self.pid, state, TRUE)
|
|
|
|
else:
|
|
net.SendPartySetStatePacket(self.pid, self.state, FALSE)
|
|
net.SendPartySetStatePacket(self.pid, state, TRUE)
|
|
|
|
def OnWarp(self):
|
|
self.__HideStateButton()
|
|
|
|
if self.vid:
|
|
net.SendPartyUseSkillPacket(self.PARTY_SKILL_WARP, self.vid)
|
|
|
|
def OnExpel(self):
|
|
self.__HideStateButton()
|
|
|
|
if not self.pid:
|
|
return
|
|
net.SendPartyRemovePacket(self.pid)
|
|
|
|
def OnMouseLeftButtonDown(self):
|
|
|
|
if self.vid:
|
|
player.SetTarget(self.vid)
|
|
player.OpenCharacterMenu(self.vid)
|
|
|
|
if mouseModule.mouseController.isAttached():
|
|
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
|
|
net.SendExchangeStartPacket(self.vid)
|
|
net.SendExchangeItemAddPacket(attachedSlotPos, 0)
|
|
mouseModule.mouseController.DeattachObject()
|
|
return
|
|
|
|
if player.IsPartyLeader(player.GetMainCharacterIndex()):
|
|
if player.PARTY_STATE_LEADER != self.state:
|
|
|
|
if self.isShowStateButton:
|
|
self.__HideStateButton()
|
|
|
|
else:
|
|
self.__ShowStateButton()
|
|
|
|
def OnMouseLeftButtonUp(self):
|
|
|
|
if self.vid:
|
|
player.SetTarget(self.vid)
|
|
player.OpenCharacterMenu(self.vid)
|
|
|
|
if mouseModule.mouseController.isAttached():
|
|
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
|
|
net.SendExchangeStartPacket(self.vid)
|
|
net.SendExchangeItemAddPacket(attachedSlotPos, 0)
|
|
mouseModule.mouseController.DeattachObject()
|
|
|
|
def OnMouseRightButtonDown(self):
|
|
self.OnMouseLeftButtonDown()
|
|
|
|
def OnAffectOverIn(self, index):
|
|
|
|
if not self.AFFECT_STRING_DICT.has_key(index):
|
|
return
|
|
if not self.affectValueDict.has_key(index):
|
|
return
|
|
|
|
(x, y) = self.GetGlobalPosition()
|
|
|
|
self.affectToolTip.ClearToolTip()
|
|
self.affectToolTip.SetTitle(self.AFFECT_STRING_DICT[index](self.affectValueDict[index]))
|
|
self.affectToolTip.SetToolTipPosition(x + index*12, y + 11)
|
|
self.affectToolTip.ShowToolTip()
|
|
|
|
def OnAffectOverOut(self, index):
|
|
self.affectToolTip.HideToolTip()
|
|
|
|
class PartyMenu(ui.ThinBoard):
|
|
|
|
BUTTON_NAME = ( locale.PARTY_HEAL_ALL_MEMBER, locale.PARTY_BREAK_UP, locale.PARTY_LEAVE )
|
|
|
|
def __init__(self):
|
|
ui.ThinBoard.__init__(self)
|
|
self.buttonDict = {}
|
|
self.distributionMode = 0
|
|
self.isLeader = FALSE
|
|
self.showingButtonList = []
|
|
self.modeButtonList = {}
|
|
self.__CreateButtons()
|
|
self.__CreateModeButtons()
|
|
def __del__(self):
|
|
ui.ThinBoard.__del__(self)
|
|
|
|
def Destroy(self):
|
|
self.buttonDict = {}
|
|
self.showingButtonList = []
|
|
self.modeButtonList = {}
|
|
|
|
def __CreateModeButtons(self):
|
|
|
|
self.modeTitle = ui.MakeTextLine(self)
|
|
self.modeTitle.SetText(locale.PARTY_EXP_DISTRIBUTION_MODE)
|
|
|
|
self.modeButtonList = {}
|
|
|
|
level = ui.RadioButton()
|
|
level.SetParent(self)
|
|
level.SetWindowHorizontalAlignCenter()
|
|
level.SetEvent(ui.__mem_func__(self.OnClickEXPLevel))
|
|
level.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub")
|
|
level.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub")
|
|
level.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub")
|
|
level.SetText(locale.PARTY_EXP_DISTRIBUTION_MODE_LEVEL)
|
|
level.SetToolTipText(locale.PARTY_EXP_DISTRIBUTION_MODE_LEVEL_TOOLTIP, 70)
|
|
level.Show()
|
|
self.modeButtonList[player.PARTY_EXP_NON_DISTRIBUTION] = level
|
|
|
|
parity = ui.RadioButton()
|
|
parity.SetParent(self)
|
|
parity.SetWindowHorizontalAlignCenter()
|
|
parity.SetEvent(ui.__mem_func__(self.OnClickEXPDistributeParity))
|
|
parity.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub")
|
|
parity.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub")
|
|
parity.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub")
|
|
parity.SetText(locale.PARTY_EXP_DISTRIBUTION_MODE_PARITY)
|
|
parity.SetToolTipText(locale.PARTY_EXP_DISTRIBUTION_MODE_PARITY_TOOLTIP, 70)
|
|
parity.Show()
|
|
self.modeButtonList[player.PARTY_EXP_DISTRIBUTION_PARITY] = parity
|
|
|
|
self.ChangePartyParameter(self.distributionMode)
|
|
|
|
def __CreateButtons(self):
|
|
|
|
for name in self.BUTTON_NAME:
|
|
button = ui.Button()
|
|
button.SetParent(self)
|
|
button.SetWindowHorizontalAlignCenter()
|
|
button.SetToolTipText(name)
|
|
self.buttonDict[name] = button
|
|
|
|
self.buttonDict[locale.PARTY_HEAL_ALL_MEMBER].SetEvent(ui.__mem_func__(self.OnPartyUseSkill))
|
|
self.buttonDict[locale.PARTY_HEAL_ALL_MEMBER].SetUpVisual("d:/ymir work/ui/game/windows/Party_Skill_Heal_01.sub")
|
|
self.buttonDict[locale.PARTY_HEAL_ALL_MEMBER].SetOverVisual("d:/ymir work/ui/game/windows/Party_Skill_Heal_02.sub")
|
|
self.buttonDict[locale.PARTY_HEAL_ALL_MEMBER].SetDownVisual("d:/ymir work/ui/game/windows/Party_Skill_Heal_03.sub")
|
|
|
|
self.buttonDict[locale.PARTY_BREAK_UP].SetEvent(net.SendPartyExitPacket)
|
|
self.buttonDict[locale.PARTY_BREAK_UP].SetUpVisual("d:/ymir work/ui/game/windows/Party_Disband_01.sub")
|
|
self.buttonDict[locale.PARTY_BREAK_UP].SetOverVisual("d:/ymir work/ui/game/windows/Party_Disband_02.sub")
|
|
self.buttonDict[locale.PARTY_BREAK_UP].SetDownVisual("d:/ymir work/ui/game/windows/Party_Disband_03.sub")
|
|
|
|
self.buttonDict[locale.PARTY_LEAVE].SetEvent(net.SendPartyExitPacket)
|
|
self.buttonDict[locale.PARTY_LEAVE].SetUpVisual("d:/ymir work/ui/game/windows/Party_Exit_01.sub")
|
|
self.buttonDict[locale.PARTY_LEAVE].SetOverVisual("d:/ymir work/ui/game/windows/Party_Exit_02.sub")
|
|
self.buttonDict[locale.PARTY_LEAVE].SetDownVisual("d:/ymir work/ui/game/windows/Party_Exit_03.sub")
|
|
|
|
def __ClearShowingButtons(self):
|
|
self.showingButtonList = []
|
|
|
|
def __ArrangeButtons(self):
|
|
|
|
STEP_SIZE = 37
|
|
|
|
showingButtonCount = len(self.showingButtonList)
|
|
xPos = (showingButtonCount-1) * (-STEP_SIZE/2)
|
|
for button in self.showingButtonList:
|
|
button.SetPosition(xPos, 15)
|
|
button.Show()
|
|
xPos += 37
|
|
|
|
yPos = 85
|
|
for button in self.modeButtonList.values():
|
|
button.SetPosition(0, yPos)
|
|
yPos += 25
|
|
|
|
self.UpdateRect()
|
|
|
|
def __ShowButton(self, name):
|
|
if not self.buttonDict.has_key(name):
|
|
return
|
|
|
|
self.showingButtonList.append(self.buttonDict[name])
|
|
self.__ArrangeButtons()
|
|
|
|
def __HideButton(self, name):
|
|
if not self.buttonDict.has_key(name):
|
|
return
|
|
|
|
searchingButton = self.buttonDict[name]
|
|
searchingButton.Hide()
|
|
for btn in self.showingButtonList:
|
|
if btn == searchingButton:
|
|
self.showingButtonList.remove(btn)
|
|
|
|
self.__ArrangeButtons()
|
|
|
|
def ShowLeaderButton(self):
|
|
self.isLeader = TRUE
|
|
self.__ClearShowingButtons()
|
|
self.__ShowButton(locale.PARTY_BREAK_UP)
|
|
|
|
def ShowMemberButton(self):
|
|
self.isLeader = FALSE
|
|
self.__ClearShowingButtons()
|
|
self.__ShowButton(locale.PARTY_LEAVE)
|
|
|
|
def OnPartyUseSkill(self):
|
|
net.SendPartyUseSkillPacket(PartyMemberInfoBoard.PARTY_SKILL_HEAL, 0)
|
|
self.__HideButton(locale.PARTY_HEAL_ALL_MEMBER)
|
|
|
|
def PartyHealReady(self):
|
|
self.__ShowButton(locale.PARTY_HEAL_ALL_MEMBER)
|
|
|
|
def __UpAllModeButtons(self):
|
|
for button in self.modeButtonList.values():
|
|
button.SetUp()
|
|
|
|
def __SetModeButton(self, mode):
|
|
self.__UpAllModeButtons()
|
|
self.modeButtonList[mode].Down()
|
|
self.distributionMode = mode
|
|
|
|
def OnClickEXPLevel(self):
|
|
self.__SetModeButton(self.distributionMode)
|
|
if self.isLeader:
|
|
net.SendPartyParameterPacket(player.PARTY_EXP_NON_DISTRIBUTION)
|
|
|
|
def OnClickEXPDistributeParity(self):
|
|
self.__SetModeButton(self.distributionMode)
|
|
if self.isLeader:
|
|
net.SendPartyParameterPacket(player.PARTY_EXP_DISTRIBUTION_PARITY)
|
|
|
|
def ChangePartyParameter(self, distributionMode):
|
|
try:
|
|
self.__SetModeButton(distributionMode)
|
|
except:
|
|
pass
|
|
|
|
class PartyWindow(ui.Window):
|
|
|
|
def __init__(self):
|
|
ui.Window.__init__(self)
|
|
|
|
self.SetPosition(10, 52)
|
|
self.partyMemberInfoBoardList = []
|
|
|
|
self.__CreatePartyMenuButton()
|
|
self.__CreatePartyMenu()
|
|
|
|
def __del__(self):
|
|
ui.Window.__del__(self)
|
|
|
|
print " =============================== DESTROIED PartyWindow"
|
|
|
|
def Destroy(self):
|
|
self.DestroyPartyMemberInfoBoard()
|
|
self.partyMenu.Destroy()
|
|
self.partyMenuButton = None
|
|
self.partyMenu = None
|
|
|
|
def DestroyPartyMemberInfoBoard(self):
|
|
for board in self.partyMemberInfoBoardList:
|
|
board.Destroy()
|
|
|
|
self.partyMemberInfoBoardList = []
|
|
|
|
def __CreatePartyMenuButton(self):
|
|
partyMenuButton = ui.Button()
|
|
partyMenuButton.SetParent(self)
|
|
partyMenuButton.SetWindowHorizontalAlignCenter()
|
|
partyMenuButton.SetWindowVerticalAlignBottom()
|
|
partyMenuButton.SetPosition(0, 20)
|
|
partyMenuButton.SetUpVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_01.sub")
|
|
partyMenuButton.SetOverVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_02.sub")
|
|
partyMenuButton.SetDownVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_03.sub")
|
|
partyMenuButton.SetEvent(ui.__mem_func__(self.OnTogglePartyMenu))
|
|
partyMenuButton.Show()
|
|
self.partyMenuButton = partyMenuButton
|
|
|
|
def __CreatePartyMenu(self):
|
|
partyMenu = PartyMenu()
|
|
partyMenu.SetSize(106, 70 + 70)
|
|
partyMenu.Hide()
|
|
self.partyMenu = partyMenu
|
|
|
|
def AddPartyMember(self, pid, name):
|
|
|
|
board = self.__FindPartyMemberInfoBoardByPID(pid)
|
|
|
|
if None == board:
|
|
|
|
board = PartyMemberInfoBoard()
|
|
board.SetParent(self)
|
|
board.SetCharacterPID(pid)
|
|
|
|
self.partyMemberInfoBoardList.append(board)
|
|
self.__ArrangePartyMemberInfoBoard()
|
|
self.UpdateRect()
|
|
|
|
if not name:
|
|
name = locale.PARTY_MEMBER_OFFLINE
|
|
|
|
board.SetCharacterName(name)
|
|
board.Unlink()
|
|
|
|
self.Show()
|
|
|
|
def RemovePartyMember(self, pid):
|
|
|
|
board = self.__FindPartyMemberInfoBoardByPID(pid)
|
|
|
|
if None == board:
|
|
return
|
|
|
|
vid = board.GetCharacterVID()
|
|
|
|
if None != vid and player.IsMainCharacterIndex(vid):
|
|
|
|
self.ExitParty()
|
|
player.ExitParty()
|
|
|
|
else:
|
|
|
|
board.Destroy()
|
|
player.RemovePartyMember(pid)
|
|
self.partyMemberInfoBoardList.remove(board)
|
|
self.__ArrangePartyMemberInfoBoard()
|
|
self.UpdateRect()
|
|
|
|
def UpdatePartyMemberInfo(self, pid):
|
|
|
|
board = self.__FindPartyMemberInfoBoardByPID(pid)
|
|
|
|
if None == board:
|
|
return
|
|
|
|
state = player.GetPartyMemberState(pid)
|
|
hpPercentage = player.GetPartyMemberHPPercentage(pid)
|
|
affectsList = player.GetPartyMemberAffects(pid)
|
|
|
|
board.SetCharacterState(state)
|
|
board.SetCharacterHP(hpPercentage)
|
|
for i in xrange(len(affectsList)):
|
|
board.SetAffect(i, affectsList[i])
|
|
|
|
vid = board.GetCharacterVID()
|
|
if None != vid:
|
|
if player.IsMainCharacterIndex(vid):
|
|
if player.PARTY_STATE_LEADER == player.GetPartyMemberState(pid):
|
|
self.partyMenu.ShowLeaderButton()
|
|
else:
|
|
self.partyMenu.ShowMemberButton()
|
|
|
|
def LinkPartyMember(self, pid, vid):
|
|
|
|
board = self.__FindPartyMemberInfoBoardByPID(pid)
|
|
|
|
if None == board:
|
|
return
|
|
|
|
board.Link()
|
|
board.SetCharacterVID(vid)
|
|
|
|
def UnlinkPartyMember(self, pid):
|
|
|
|
board = self.__FindPartyMemberInfoBoardByPID(pid)
|
|
|
|
if None == board:
|
|
return
|
|
|
|
board.Unlink()
|
|
|
|
def UnlinkAllPartyMember(self):
|
|
for board in self.partyMemberInfoBoardList:
|
|
board.Unlink()
|
|
|
|
def ExitParty(self):
|
|
self.partyMenu.Hide()
|
|
self.DestroyPartyMemberInfoBoard()
|
|
self.Hide()
|
|
|
|
def __ArrangePartyMemberInfoBoard(self):
|
|
|
|
count = 0
|
|
newHeight = 20
|
|
|
|
for board in self.partyMemberInfoBoardList:
|
|
board.SetPosition(0, count * (board.GetHeight() + 2))
|
|
count += 1
|
|
newHeight += board.GetHeight() + 2
|
|
|
|
self.SetSize(PartyMemberInfoBoard.BOARD_WIDTH, newHeight)
|
|
|
|
(x, y) = self.GetGlobalPosition()
|
|
self.partyMenu.SetPosition(10, y + newHeight + 2)
|
|
|
|
def __FindPartyMemberInfoBoardByVID(self, vid):
|
|
for board in self.partyMemberInfoBoardList:
|
|
if vid == board.GetCharacterVID():
|
|
return board
|
|
|
|
return None
|
|
|
|
def __FindPartyMemberInfoBoardByPID(self, pid):
|
|
for board in self.partyMemberInfoBoardList:
|
|
if pid == board.GetCharacterPID():
|
|
return board
|
|
|
|
return None
|
|
|
|
def PartyHealReady(self):
|
|
self.partyMenu.PartyHealReady()
|
|
|
|
def ChangePartyParameter(self, distributionMode):
|
|
self.partyMenu.ChangePartyParameter(distributionMode)
|
|
|
|
def OnTogglePartyMenu(self):
|
|
if self.partyMenu.IsShow():
|
|
self.partyMenuButton.SetUpVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_01.sub")
|
|
self.partyMenuButton.SetOverVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_02.sub")
|
|
self.partyMenuButton.SetDownVisual("d:/ymir work/ui/game/windows/Party_Menu_Open_03.sub")
|
|
self.partyMenu.Hide()
|
|
else:
|
|
self.partyMenuButton.SetUpVisual("d:/ymir work/ui/game/windows/Party_Menu_Close_01.sub")
|
|
self.partyMenuButton.SetOverVisual("d:/ymir work/ui/game/windows/Party_Menu_Close_02.sub")
|
|
self.partyMenuButton.SetDownVisual("d:/ymir work/ui/game/windows/Party_Menu_Close_03.sub")
|
|
self.partyMenu.Show()
|