Hikayeler

Reklam vermek için turkmmo@gmail.com

yohara eklerken aldığım syserr

Mustlight

Enchanted by Light5
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
TM Üye
Üye
Katılım
17 Tem 2018
Konular
99
Mesajlar
374
Online süresi
2ay 25g
Reaksiyon Skoru
115
Altın Konu
1
Başarım Puanı
134
TM Yaşı
7 Yıl 9 Ay 8 Gün
MmoLira
1,042
DevLira
18

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

Öncelikle merhaba, yohara eklerken aldığım syserr dosyasını bırakıyorum çözemedim yardımcı olabilirseniz çok sevinirim.


Syserr veren dosya:
import ui
import uiScriptLocale
import app
import net
import dbg
import snd
import player
import mouseModule
import wndMgr
import skill
import playerSettingModule
import quest
import localeInfo
import uiToolTip
import constInfo
import emotion
import chr
if app.ENABLE_QUEST_RENEWAL:
    import math, uiQuest

SHOW_ONLY_ACTIVE_SKILL = FALSE
SHOW_LIMIT_SUPPORT_SKILL_LIST = []
HIDE_SUPPORT_SKILL_POINT = FALSE

if app.ENABLE_CONQUEROR_LEVEL:
    HIDE_SUPPORT_SKILL_POINT = TRUE
    SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140, 132, 133, 134, 246]
else:
    if localeInfo.IsYMIR():
        SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
        [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140, 0, 0, 0, 0]
        if not localeInfo.IsCHEONMA():
            HIDE_SUPPORT_SKILL_POINT = TRUE
            SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
    elif localeInfo.IsJAPAN() or   (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/ca") and (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/br"):
        HIDE_SUPPORT_SKILL_POINT = TRUE   
        SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140]

    else:
        HIDE_SUPPORT_SKILL_POINT = TRUE
    
FACE_IMAGE_DICT = {
    playerSettingModule.RACE_WARRIOR_M    : "icon/face/warrior_m.tga",
    playerSettingModule.RACE_WARRIOR_W    : "icon/face/warrior_w.tga",
    playerSettingModule.RACE_ASSASSIN_M    : "icon/face/assassin_m.tga",
    playerSettingModule.RACE_ASSASSIN_W    : "icon/face/assassin_w.tga",
    playerSettingModule.RACE_SURA_M        : "icon/face/sura_m.tga",
    playerSettingModule.RACE_SURA_W        : "icon/face/sura_w.tga",
    playerSettingModule.RACE_SHAMAN_M    : "icon/face/shaman_m.tga",
    playerSettingModule.RACE_SHAMAN_W    : "icon/face/shaman_w.tga",
}
if app.ENABLE_WOLFMAN_CHARACTER:
    FACE_IMAGE_DICT.update({playerSettingModule.RACE_WOLFMAN_M  : "icon/face/wolfman_m.tga",})

def unsigned32(n):
    return n & 0xFFFFFFFFL
if app.ENABLE_QUEST_RENEWAL:
    quest_slot_listbar = {
        "name" : "Quest_Slot",
        "type" : "listbar",

        "x" : 0,
        "y" : 0,

        "width" : 210,
        "height" : 20,

        "text" : "Quest title",
        "align" : "left",

        "horizontal_align" : "left",
        "vertical_align" : "left",
        "text_horizontal_align" : "left",
        "all_align" : "left",

        "text_height": 40
    }

    quest_lable_expend_img_path_dict = {
        0: "d:/ymir work/ui/quest_re/tabcolor_1_main.tga",
        1: "d:/ymir work/ui/quest_re/tabcolor_2_sub.tga",
        2: "d:/ymir work/ui/quest_re/tabcolor_3_levelup.tga",
        3: "d:/ymir work/ui/quest_re/tabcolor_4_event.tga",
        4: "d:/ymir work/ui/quest_re/tabcolor_5_collection.tga",
        5: "d:/ymir work/ui/quest_re/tabcolor_6_system.tga",
        6: "d:/ymir work/ui/quest_re/tabcolor_7_scroll.tga",
        7: "d:/ymir work/ui/quest_re/tabcolor_8_daily.tga"
    }

    quest_label_dict = {
        0 : uiScriptLocale.QUEST_UI_TEXT_MAIN,
        1 : uiScriptLocale.QUEST_UI_TEXT_SUB,
        2 : uiScriptLocale.QUEST_UI_TEXT_LEVELUP,
        3 : uiScriptLocale.QUEST_UI_TEXT_EVENT,
        4 : uiScriptLocale.QUEST_UI_TEXT_COLLECTION,
        5 : uiScriptLocale.QUEST_UI_TEXT_SYSTEM,
        6 : uiScriptLocale.QUEST_UI_TEXT_SCROLL,
        7 : uiScriptLocale.QUEST_UI_TEXT_DAILY,
    }

class CharacterWindow(ui.ScriptWindow):
    if app.ENABLE_CONQUEROR_LEVEL:
        ACTIVE_PAGE_SLOT_COUNT = 8
        SUPPORT_PAGE_SLOT_COUNT = 12

        PAGE_SLOT_COUNT = 12
        PAGE_HORSE = 2

    SKILL_GROUP_NAME_DICT = {
        playerSettingModule.JOB_WARRIOR    : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1,    2 : localeInfo.SKILL_GROUP_WARRIOR_2, },
        playerSettingModule.JOB_ASSASSIN    : { 1 : localeInfo.SKILL_GROUP_ASSASSIN_1,    2 : localeInfo.SKILL_GROUP_ASSASSIN_2, },
        playerSettingModule.JOB_SURA        : { 1 : localeInfo.SKILL_GROUP_SURA_1,        2 : localeInfo.SKILL_GROUP_SURA_2, },
        playerSettingModule.JOB_SHAMAN        : { 1 : localeInfo.SKILL_GROUP_SHAMAN_1,    2 : localeInfo.SKILL_GROUP_SHAMAN_2, },
    }
    if app.ENABLE_WOLFMAN_CHARACTER:
        SKILL_GROUP_NAME_DICT.update({playerSettingModule.JOB_WOLFMAN        : { 1 : localeInfo.JOB_WOLFMAN1,    2 : localeInfo.JOB_WOLFMAN2, },})

    STAT_DESCRIPTION =    {
        "HTH" : localeInfo.STAT_TOOLTIP_CON,
        "INT" : localeInfo.STAT_TOOLTIP_INT,
        "STR" : localeInfo.STAT_TOOLTIP_STR,
        "DEX" : localeInfo.STAT_TOOLTIP_DEX,
    }


    STAT_MINUS_DESCRIPTION = localeInfo.STAT_MINUS_DESCRIPTION
    if app.ENABLE_QUEST_RENEWAL:
        MAX_QUEST_PAGE_HEIGHT = 293.5

    def __init__(self):
        ui.ScriptWindow.__init__(self)
        if app.ENABLE_QUEST_RENEWAL:
            self.isQuestCategoryLoad = False
        self.state = "STATUS"
        if app.ENABLE_CONQUEROR_LEVEL:
            self.substate = "BASE"
    
            self.statusConquerorPlusCommandDict={
                "SMH_STR" : "/conqueror_stat smh_str",
                "SMH_HP" : "/conqueror_stat smh_hp",
                "SMH_MOVE" : "/conqueror_stat smh_move",
                "SMH_INMUNE" : "/conqueror_stat smh_inmune",
            }

        self.isLoaded = 0

        self.toolTipSkill = 0

        self.__Initialize()
        self.__LoadWindow()

        self.statusPlusCommandDict={
            "HTH" : "/stat ht",
            "INT" : "/stat iq",
            "STR" : "/stat st",
            "DEX" : "/stat dx",
        }

        self.statusMinusCommandDict={
            "HTH-" : "/stat- ht",
            "INT-" : "/stat- iq",
            "STR-" : "/stat- st",
            "DEX-" : "/stat- dx",
        }

    def __del__(self):
        ui.ScriptWindow.__del__(self)

    def __Initialize(self):
        self.refreshToolTip = 0
        self.curSelectedSkillGroup = 0
        self.canUseHorseSkill = -1

        self.toolTip = None
        self.toolTipJob = None
        self.toolTipAlignment = None
        self.toolTipSkill = None

        self.faceImage = None
        self.statusPlusLabel = None
        self.statusPlusValue = None
        self.activeSlot = None
        self.tabDict = None
        self.tabButtonDict = None
        self.pageDict = None
        self.titleBarDict = None
        self.statusPlusButtonDict = None
        self.statusMinusButtonDict = None

        if app.ENABLE_CONQUEROR_LEVEL:
            self.statusConquerorPlusButtonDict = None

        self.skillPageDict = None
        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar = None
            self.questLastScrollPosition = 0
            self.questPage = None
            self.questTitleBar = None
            self.questSlotList = []
            self.questCategory = {}
            self.questCategoryList = []

            self.questColorList = {
                "green" : 0xFF83C055,
                "blue": 0xFF45678D,
                "golden": 0xFFCAB62F,
                "default_title": 0xFFCEC6B5
            }

            self.questOpenedCategories = []
            self.questMaxOpenedCategories = 1

            self.questClicked = []
            self.questIndexMap = {}
            self.questCounterList = []
            self.questClockList = []
            self.questSeparatorList = []

            self.displayY = 0
            self.baseCutY = 0
            self.questCategoryRenderPos = []

            self.questSlideWnd = {}
            self.questSlideWndNewKey = 0
        else:
            self.questShowingStartIndex = 0
            self.questScrollBar = None
            self.questSlot = None
            self.questNameList = None
            self.questLastTimeList = None
            self.questLastCountList = None
        self.skillGroupButton = ()

        self.activeSlot = None
        self.activeSkillPointValue = None
        self.supportSkillPointValue = None
        self.skillGroupButton1 = None
        self.skillGroupButton2 = None
        self.activeSkillGroupName = None

        self.guildNameSlot = None
        self.guildNameValue = None
        self.characterNameSlot = None
        self.characterNameValue = None

        self.emotionToolTip = None
        self.soloEmotionSlot = None
        self.dualEmotionSlot = None
        
        if app.ENABLE_CONQUEROR_LEVEL:
            self.toolTipConquerorInfoButton = None
            
            self.tabSungmaButtonDict = None
            self.SungmaButton = None
        if app.ENABLE_EMOJI_UPDATE:
            self.specialEmotionSlot = None

    def Show(self):
        self.__LoadWindow()

        ui.ScriptWindow.Show(self)

    def __LoadScript(self, fileName):
        pyScrLoader = ui.PythonScriptLoader()
        pyScrLoader.LoadScriptFile(self, fileName)

    def __BindObject(self):
        self.toolTip = uiToolTip.ToolTip()
        self.toolTipJob = uiToolTip.ToolTip()
        self.toolTipAlignment = uiToolTip.ToolTip(130)

        if app.ENABLE_CONQUEROR_LEVEL:
            self.toolTipConquerorInfoButton = uiToolTip.ToolTip()

        self.faceImage = self.GetChild("Face_Image")

        faceSlot=self.GetChild("Face_Slot")
        if 949 == app.GetDefaultCodePage():
            faceSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowJobToolTip)
            faceSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideJobToolTip)

        self.statusPlusLabel = self.GetChild("Status_Plus_Label")
        self.statusPlusValue = self.GetChild("Status_Plus_Value")

        self.characterNameSlot = self.GetChild("Character_Name_Slot")
        self.characterNameValue = self.GetChild("Character_Name")
        self.guildNameSlot = self.GetChild("Guild_Name_Slot")
        self.guildNameValue = self.GetChild("Guild_Name")
        self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowAlignmentToolTip)
        self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideAlignmentToolTip)

        self.activeSlot = self.GetChild("Skill_Active_Slot")
        self.activeSkillPointValue = self.GetChild("Active_Skill_Point_Value")
        self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value")
        self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1")
        self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2")
        self.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name")
        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar = self.GetChild("Quest_ScrollBar")
            self.questPage = self.GetChild("Quest_Page")
            self.questTitleBar = self.GetChild("Quest_TitleBar")
            self.quest_page_board_window = self.GetChild("quest_page_board_window")
            self.quest_object_board_window = self.GetChild("quest_object_board_window")

        self.tabDict = {
            "STATUS"    : self.GetChild("Tab_01"),
            "SKILL"        : self.GetChild("Tab_02"),
            "EMOTICON"    : self.GetChild("Tab_03"),
            "QUEST"        : self.GetChild("Tab_04"),
        }

        self.tabButtonDict = {
            "STATUS"    : self.GetChild("Tab_Button_01"),
            "SKILL"        : self.GetChild("Tab_Button_02"),
            "EMOTICON"    : self.GetChild("Tab_Button_03"),
            "QUEST"        : self.GetChild("Tab_Button_04")
        }

        self.pageDict = {
            "STATUS"    : self.GetChild("Character_Page"),
            "SKILL"        : self.GetChild("Skill_Page"),
            "EMOTICON"    : self.GetChild("Emoticon_Page"),
            "QUEST"        : self.GetChild("Quest_Page")
        }

        self.titleBarDict = {
            "STATUS"    : self.GetChild("Character_TitleBar"),
            "SKILL"        : self.GetChild("Skill_TitleBar"),
            "EMOTICON"    : self.GetChild("Emoticon_TitleBar"),
            "QUEST"        : self.GetChild("Quest_TitleBar")
        }

        self.statusPlusButtonDict = {
            "HTH"        : self.GetChild("HTH_Plus"),
            "INT"        : self.GetChild("INT_Plus"),
            "STR"        : self.GetChild("STR_Plus"),
            "DEX"        : self.GetChild("DEX_Plus"),
        }

        self.statusMinusButtonDict = {
            "HTH-"        : self.GetChild("HTH_Minus"),
            "INT-"        : self.GetChild("INT_Minus"),
            "STR-"        : self.GetChild("STR_Minus"),
            "DEX-"        : self.GetChild("DEX_Minus"),
        }

        self.skillPageDict = {
            "ACTIVE" : self.GetChild("Skill_Active_Slot"),
            "SUPPORT" : self.GetChild("Skill_ETC_Slot"),
            "HORSE" : self.GetChild("Skill_Active_Slot"),
        }

        self.skillPageStatDict = {
            "SUPPORT"    : player.SKILL_SUPPORT,
            "ACTIVE"    : player.SKILL_ACTIVE,
            "HORSE"        : player.SKILL_HORSE,
        }

        self.skillGroupButton = (
            self.GetChild("Skill_Group_Button_1"),
            self.GetChild("Skill_Group_Button_2"),
        )

        if app.ENABLE_CONQUEROR_LEVEL:
            self.tabSungmaButtonDict = {
                "BASE"        : self.GetChild("change_base_button"),
                "SUNGMA"    : self.GetChild("change_conqueror_button")
            }
            
            self.SungmaPageDict = {
                "BASE" : self.GetChild("base_info"),
                "SUNGMA" : self.GetChild("sungma_info"),
            }
            
            self.statusConquerorPlusButtonDict = {
                "SMH_STR"        : self.GetChild("sungma_str_plus"),
                "SMH_HP"        : self.GetChild("sungma_hp_plus"),
                "SMH_MOVE"        : self.GetChild("sungma_move_plus"),
                "SMH_INMUNE"        : self.GetChild("sungma_immune_plus"),
            }           
            
            self.HTH_IMG = self.GetChild("HTH_IMG")
            self.INT_IMG = self.GetChild("INT_IMG")
            self.STR_IMG = self.GetChild("STR_IMG")
            self.DEX_IMG = self.GetChild("DEX_IMG")
            
            self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHTHToolTip)
            self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHTHToolTip)
            
            self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINTToolTip)
            self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINTToolTip)
            
            self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTRToolTip)
            self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTRToolTip)
            
            self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowDEXToolTip)
            self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideDEXToolTip)
            
            self.MSPD_IMG = self.GetChild("MSPD_IMG")
            self.ASPD_IMG = self.GetChild("ASPD_IMG")
            self.CSPD_IMG = self.GetChild("CSPD_IMG")
            self.MATT_IMG = self.GetChild("MATT_IMG")
            self.MDEF_IMG = self.GetChild("MDEF_IMG")
            [HASH=4621]#self.DEX_IMG[/HASH] = self.GetChild("ER_IMG")
            
            self.MSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMSPDToolTip)
            self.MSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMSPDToolTip)
            
            self.ASPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowASPDToolTip)
            self.ASPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideASPDToolTip)
            
            self.CSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowCSPDToolTip)
            self.CSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideCSPDToolTip)
            
            self.MATT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMATTToolTip)
            self.MATT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMATTToolTip)

            self.MDEF_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMDEFToolTip)
            self.MDEF_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMDEFToolTip)
            

        global SHOW_ONLY_ACTIVE_SKILL
        global HIDE_SUPPORT_SKILL_POINT
        if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT:
            self.GetChild("Support_Skill_Point_Label").Hide()

        self.soloEmotionSlot = self.GetChild("SoloEmotionSlot")
        self.dualEmotionSlot = self.GetChild("DualEmotionSlot")
        if app.ENABLE_EMOJI_UPDATE:
            self.specialEmotionSlot = self.GetChild("SpecialEmotionSlot")
        self.__SetEmotionSlot()

        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar.SetParent(self.quest_page_board_window)
            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                self.questCategory = ui.SubTitleBar()
                self.questCategory.SetParent(self.questPage)
                self.questCategory.MakeSubTitleBar(210, "red")
                self.questCategory.SetText(quest_label_dict[i])
                self.questCategory.SetSize(210, 16)
                self.questCategory.SetPosition(13, 0)
                self.questCategoryList.append(self.questCategory)

                self.questCategoryRenderPos.append(0)

            self.questScrollBar.SetParent(self.questPage)
            self.RearrangeQuestCategories(xrange(quest.QUEST_CATEGORY_MAX_NUM))
        else:
            self.questShowingStartIndex = 0
            self.questScrollBar = self.GetChild("Quest_ScrollBar")
            self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll))
            self.questSlot = self.GetChild("Quest_Slot")
            for i in xrange(quest.QUEST_MAX_NUM):
                self.questSlot.HideSlotBaseImage(i)
                self.questSlot.SetCoverButton(i,\
                    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_02.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_03.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_03.sub", True)

            self.questNameList = []
            self.questLastTimeList = []
            self.questLastCountList = []
            for i in xrange(quest.QUEST_MAX_NUM):
                self.questNameList.append(self.GetChild("Quest_Name_0" + str(i)))
                self.questLastTimeList.append(self.GetChild("Quest_LastTime_0" + str(i)))
                self.questLastCountList.append(self.GetChild("Quest_LastCount_0" + str(i)))

    def __SetSkillSlotEvent(self):
        for skillPageValue in self.skillPageDict.itervalues():
            skillPageValue.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
            skillPageValue.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectSkill))
            skillPageValue.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
            skillPageValue.SetUnselectItemSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
            skillPageValue.SetUseSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
            skillPageValue.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
            skillPageValue.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
            skillPageValue.SetPressedSlotButtonEvent(ui.__mem_func__(self.OnPressedSlotButton))
            skillPageValue.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_down.sub")

    def __SetEmotionSlot(self):

        self.emotionToolTip = uiToolTip.ToolTip()

        for slot in (self.soloEmotionSlot, self.dualEmotionSlot, self.specialEmotionSlot):#ENABLE_EMOJI_UPDATE
            slot.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
            slot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectEmotion))
            slot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
            slot.SetUseSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
            slot.SetOverInItemEvent(ui.__mem_func__(self.__OverInEmotion))
            slot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutEmotion))
            slot.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_down.sub")

        for slotIdx, datadict in emotion.EMOTION_DICT.items():
            emotionIdx = slotIdx

            slot = self.soloEmotionSlot
            if app.ENABLE_EMOJI_UPDATE:
                if slotIdx > 50 and slotIdx < 101:
                    slot = self.dualEmotionSlot
                elif slotIdx >= 101:
                    slot = self.specialEmotionSlot
            else:
                if slotIdx > 50:
                    slot = self.dualEmotionSlot

            slot.SetEmotionSlot(slotIdx, emotionIdx)
            slot.SetCoverButton(slotIdx)

    def __SelectEmotion(self, slotIndex):
        if not slotIndex in emotion.EMOTION_DICT:
            return

        if app.IsPressed(app.DIK_LCONTROL):
            player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex)
            return

        mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex)

    def __ClickEmotionSlot(self, slotIndex):
        print "click emotion"
        if not slotIndex in emotion.EMOTION_DICT:
            return

        print "check acting"
        if player.IsActingEmotion():
            return

        command = emotion.EMOTION_DICT[slotIndex]["command"]
        print "command", command

        if slotIndex > 50 and slotIndex < 101:#ENABLE_EMOJI_UPDATE
            vid = player.GetTargetVID()

            if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid):
                import chat
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE)
                return

            command += " " + chr.GetNameByVID(vid)

        print "send_command", command
        net.SendChatPacket(command)

    def ActEmotion(self, emotionIndex):
        self.__ClickEmotionSlot(emotionIndex)

    def __OverInEmotion(self, slotIndex):
        if self.emotionToolTip:

            if not slotIndex in emotion.EMOTION_DICT:
                return

            self.emotionToolTip.ClearToolTip()
            self.emotionToolTip.SetTitle(emotion.EMOTION_DICT[slotIndex]["name"])
            self.emotionToolTip.AlignHorizonalCenter()
            self.emotionToolTip.ShowToolTip()

    def __OverOutEmotion(self):
        if self.emotionToolTip:
            self.emotionToolTip.HideToolTip()

    def __BindEvent(self):
        for i in xrange(len(self.skillGroupButton)):
            self.skillGroupButton[i].SetEvent(lambda arg=i: self.__SelectSkillGroup(arg))

        self.RefreshQuest()
        self.__HideJobToolTip()

        for (tabKey, tabButton) in self.tabButtonDict.items():
            tabButton.SetEvent(ui.__mem_func__(self.__OnClickTabButton), tabKey)

        if app.ENABLE_CONQUEROR_LEVEL:
            for (tabKey, tabButton) in self.tabSungmaButtonDict.items():
                tabButton.SetEvent(ui.__mem_func__(self.__OnClickTabSungmaButton), tabKey)

        for (statusPlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.SAFE_SetEvent(self.__OnClickStatusPlusButton, statusPlusKey)
            statusPlusButton.ShowToolTip = lambda arg=statusPlusKey: self.__OverInStatButton(arg)
            statusPlusButton.HideToolTip = lambda arg=statusPlusKey: self.__OverOutStatButton()

        for (statusMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.SAFE_SetEvent(self.__OnClickStatusMinusButton, statusMinusKey)
            statusMinusButton.ShowToolTip = lambda arg=statusMinusKey: self.__OverInStatMinusButton(arg)
            statusMinusButton.HideToolTip = lambda arg=statusMinusKey: self.__OverOutStatMinusButton()

        for titleBarValue in self.titleBarDict.itervalues():
            titleBarValue.SetCloseEvent(ui.__mem_func__(self.Hide))

        if app.ENABLE_QUEST_RENEWAL:
            self.questTitleBar.SetCloseEvent(ui.__mem_func__(self.Close))
            self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.__OnScrollQuest))

            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                self.questCategoryList[i].SetEvent(ui.__mem_func__(self.__OnClickQuestCategoryButton), i)
        else:
            self.questSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectQuest))

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            self.__LoadScript("UIScript/CharacterWindow.py")

            self.__BindObject()
            self.__BindEvent()
        except:
            import exception
            exception.Abort("CharacterWindow.__LoadWindow")

        [HASH=4622]#self.tabButtonDict[/HASH]["EMOTICON"].Disable()
        self.SetState("STATUS")
        if app.ENABLE_CONQUEROR_LEVEL:
            self.SetSubState("BASE")

    def Destroy(self):
        self.ClearDictionary()

        self.__Initialize()

    def Close(self):
        if 0 != self.toolTipSkill:
            self.toolTipSkill.Hide()
        if app.ENABLE_QUEST_RENEWAL:
            if self.questSlideWndNewKey > 0:
                if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                    self.questSlideWnd[self.questSlideWndNewKey-1].CloseSelf()

        self.Hide()

    def SetSkillToolTip(self, toolTipSkill):
        self.toolTipSkill = toolTipSkill

    if app.ENABLE_CONQUEROR_LEVEL:
        def __OnClickConquerorStatusPlusButton(self, statusKey):
            try:
                statusConquerorPlusCommand=self.statusConquerorPlusCommandDict[statusKey]
                net.SendChatPacket(statusConquerorPlusCommand)
            except KeyError, msg:
                dbg.TraceError("CharacterWindow.__OnClickStatusPlusButton KeyError: %s", msg)
                

    def __OnClickStatusPlusButton(self, statusKey):
        try:
            statusPlusCommand=self.statusPlusCommandDict[statusKey]
            net.SendChatPacket(statusPlusCommand)
        except KeyError, msg:
            dbg.TraceError("CharacterWindow.__OnClickStatusPlusButton KeyError: %s", msg)

    def __OnClickStatusMinusButton(self, statusKey):
        try:
            statusMinusCommand=self.statusMinusCommandDict[statusKey]
            net.SendChatPacket(statusMinusCommand)
        except KeyError, msg:
            dbg.TraceError("CharacterWindow.__OnClickStatusMinusButton KeyError: %s", msg)


    def __OnClickTabButton(self, stateKey):
        self.SetState(stateKey)

    if app.ENABLE_CONQUEROR_LEVEL:
        def __OnClickTabSungmaButton(self, stateKey):
            self.SetSubState(stateKey)

    def SetState(self, stateKey):

        self.state = stateKey
        if app.ENABLE_QUEST_RENEWAL:
            if stateKey != "QUEST":
                self.questPage.Hide()
                if self.questSlideWndNewKey > 0:
                    if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                        self.questSlideWnd[self.questSlideWndNewKey-1].CloseSelf()
            else:
                self.__LoadQuestCategory()
        for (tabKey, tabButton) in self.tabButtonDict.items():
            if stateKey!=tabKey:
                tabButton.SetUp()

        for tabValue in self.tabDict.itervalues():
            tabValue.Hide()

        for pageValue in self.pageDict.itervalues():
            pageValue.Hide()

        for titleBarValue in self.titleBarDict.itervalues():
            titleBarValue.Hide()

        self.titleBarDict[stateKey].Show()
        self.tabDict[stateKey].Show()
        self.pageDict[stateKey].Show()


    def GetState(self):
        return self.state

    if app.ENABLE_CONQUEROR_LEVEL:
        def SetSubState(self, stateSubKey):
            
            self.substate = stateSubKey

            for (tabKey, tabButton) in self.tabSungmaButtonDict.items():
                if stateSubKey!=tabKey:
                    tabButton.SetUp()

            for pageValue in self.SungmaPageDict.itervalues():
                pageValue.Hide()

            self.__RefreshStatusPlusButtonList()
            self.SungmaPageDict[stateSubKey].Show()
            

        def GetSubState(self):
            return self.substate   

    def __GetTotalAtkText(self):
        minAtk=player.GetStatus(player.ATT_MIN)
        maxAtk=player.GetStatus(player.ATT_MAX)
        atkBonus=player.GetStatus(player.ATT_BONUS)
        attackerBonus=player.GetStatus(player.ATTACKER_BONUS)

        if minAtk==maxAtk:
            return "%d" % (minAtk+atkBonus+attackerBonus)
        else:
            return "%d-%d" % (minAtk+atkBonus+attackerBonus, maxAtk+atkBonus+attackerBonus)

    def __GetTotalMagAtkText(self):
        minMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MIN_MAGIC_WEP)
        maxMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MAX_MAGIC_WEP)

        if minMagAtk==maxMagAtk:
            return "%d" % (minMagAtk)
        else:
            return "%d-%d" % (minMagAtk, maxMagAtk)

    def __GetTotalDefText(self):
        defValue=player.GetStatus(player.DEF_GRADE)
        if constInfo.ADD_DEF_BONUS_ENABLE:
            defValue+=player.GetStatus(player.DEF_BONUS)
        return "%d" % (defValue)

    def RefreshStatus(self):
        if self.isLoaded==0:
            return

        try:
            if app.ENABLE_CONQUEROR_LEVEL:
                if player.GetStatus(player.CONQUEROR_LEVEL) >= 1:
                    self.GetChild("Level_Value").SetText(str(player.GetStatus(player.CONQUEROR_LEVEL)))
                    self.GetChild("Exp_Value").SetText(str(unsigned32(player.GetConquerorEXP())))
                    self.GetChild("RestExp_Value").SetText(str(unsigned32(player.GetStatus(player.CONQUEROR_NEXT_EXP)) - unsigned32(player.GetStatus(player.CONQUEROR_EXP))))
                else:
                    self.GetChild("Level_Value").SetText(str(player.GetStatus(player.LEVEL)))
                    self.GetChild("Exp_Value").SetText(str(unsigned32(player.GetEXP())))
                    self.GetChild("RestExp_Value").SetText(str(unsigned32(player.GetStatus(player.NEXT_EXP)) - unsigned32(player.GetStatus(player.EXP))))
                    self.GetChild("HP_Value").SetText(str(player.GetStatus(player.HP)) + '/' + str(player.GetStatus(player.MAX_HP)))
                    self.GetChild("SP_Value").SetText(str(player.GetStatus(player.SP)) + '/' + str(player.GetStatus(player.MAX_SP)))

                    self.GetChild("STR_Value").SetText(str(player.GetStatus(player.ST)))
                    self.GetChild("DEX_Value").SetText(str(player.GetStatus(player.DX)))
                    self.GetChild("HTH_Value").SetText(str(player.GetStatus(player.HT)))
                    self.GetChild("INT_Value").SetText(str(player.GetStatus(player.IQ)))

                    self.GetChild("ATT_Value").SetText(self.__GetTotalAtkText())
                    self.GetChild("DEF_Value").SetText(self.__GetTotalDefText())

                    self.GetChild("MATT_Value").SetText(self.__GetTotalMagAtkText())
            [HASH=4623]#self.GetChild([/HASH]"MATT_Value").SetText(str(player.GetStatus(player.MAG_ATT)))

                    self.GetChild("MDEF_Value").SetText(str(player.GetStatus(player.MAG_DEF)))
                    self.GetChild("ASPD_Value").SetText(str(player.GetStatus(player.ATT_SPEED)))
                    self.GetChild("MSPD_Value").SetText(str(player.GetStatus(player.MOVING_SPEED)))
                    self.GetChild("CSPD_Value").SetText(str(player.GetStatus(player.CASTING_SPEED)))
                    self.GetChild("ER_Value").SetText(str(player.GetStatus(player.EVADE_RATE)))

        except:
            [HASH=4624]#import[/HASH] exception
            [HASH=4625]#exception.Abort([/HASH]"CharacterWindow.RefreshStatus.BindObject")
            ## 게임이 튕겨 버림
            pass

        self.__RefreshStatusPlusButtonList()
        self.__RefreshStatusMinusButtonList()
        self.RefreshAlignment()

        if self.refreshToolTip:
            self.refreshToolTip()

    def __RefreshStatusPlusButtonList(self):
        if self.isLoaded==0:
            return
        if app.ENABLE_CONQUEROR_LEVEL:
            if self.GetSubState() == "SUNGMA":
                statusPlusPoint=player.GetStatus(player.CONQUEROR_POINT)
            else:
                statusPlusPoint=player.GetStatus(player.STAT)
        else:
            statusPlusPoint=player.GetStatus(player.STAT)

        if statusPlusPoint>0:
            self.statusPlusValue.SetText(str(statusPlusPoint))
            self.statusPlusLabel.Show()
            self.ShowStatusPlusButtonList()
        else:
            self.statusPlusValue.SetText(str(0))
            self.statusPlusLabel.Hide()
            self.HideStatusPlusButtonList()
    def __RefreshStatusMinusButtonList(self):ENABLE_CONQUEROR_LEVEL
        if self.isLoaded==0:
            return

        statusMinusPoint=self.__GetStatMinusPoint()

        if statusMinusPoint>0:
            self.__ShowStatusMinusButtonList()
        else:
            self.__HideStatusMinusButtonList()

    def RefreshAlignment(self):
        point, grade = player.GetAlignmentData()

        import colorInfo
        COLOR_DICT = {    0 : colorInfo.TITLE_RGB_GOOD_4,
                        1 : colorInfo.TITLE_RGB_GOOD_3,
                        2 : colorInfo.TITLE_RGB_GOOD_2,
                        3 : colorInfo.TITLE_RGB_GOOD_1,
                        4 : colorInfo.TITLE_RGB_NORMAL,
                        5 : colorInfo.TITLE_RGB_EVIL_1,
                        6 : colorInfo.TITLE_RGB_EVIL_2,
                        7 : colorInfo.TITLE_RGB_EVIL_3,
                        8 : colorInfo.TITLE_RGB_EVIL_4, }
        colorList = COLOR_DICT.get(grade, colorInfo.TITLE_RGB_NORMAL)
        gradeColor = ui.GenerateColor(colorList[0], colorList[1], colorList[2])

        self.toolTipAlignment.ClearToolTip()
        self.toolTipAlignment.AutoAppendTextLine(localeInfo.TITLE_NAME_LIST[grade], gradeColor)
        self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME + str(point))
        self.toolTipAlignment.AlignHorizonalCenter()

    def __ShowStatusMinusButtonList(self):
        for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.Show()

    def __HideStatusMinusButtonList(self):
        for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.Hide()

    def ShowStatusPlusButtonList(self):
        for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.Show()

    def HideStatusPlusButtonList(self):
        for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.Hide()

    if app.ENABLE_CONQUEROR_LEVEL:
        def ShowConquerorStatusPlusButtonList(self):
            for (statePlusKey, statusPlusButton) in self.statusConquerorPlusButtonDict.items():
                statusPlusButton.Show()
                
        def HideConquerorStatusPlusButtonList(self):
            for (statePlusKey, statusPlusButton) in self.statusConquerorPlusButtonDict.items():
                statusPlusButton.Hide()
                
    def SelectSkill(self, skillSlotIndex):

        mouseController = mouseModule.mouseController

        if False == mouseController.isAttached():

            srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex)
            selectedSkillIndex = player.GetSkillIndex(srcSlotIndex)

            if skill.CanUseSkill(selectedSkillIndex):

                if app.IsPressed(app.DIK_LCONTROL):

                    player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex)
                    return

                mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex)

        else:

            mouseController.DeattachObject()

    def SelectEmptySlot(self, SlotIndex):
        mouseModule.mouseController.DeattachObject()

    ## ToolTip
    def OverInItem(self, slotNumber):

        if mouseModule.mouseController.isAttached():
            return

        if 0 == self.toolTipSkill:
            return

        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)
        skillIndex = player.GetSkillIndex(srcSlotIndex)
        skillLevel = player.GetSkillLevel(srcSlotIndex)
        skillGrade = player.GetSkillGrade(srcSlotIndex)
        skillType = skill.GetSkillType(skillIndex)

        ## ACTIVE
        if skill.SKILL_TYPE_ACTIVE == skillType:
            overInSkillGrade = self.__GetSkillGradeFromSlot(slotNumber)

            if overInSkillGrade == skill.SKILL_GRADE_COUNT-1 and skillGrade == skill.SKILL_GRADE_COUNT:
                self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)
            elif overInSkillGrade == skillGrade:
                self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, overInSkillGrade, skillLevel)
            else:
                self.toolTipSkill.SetSkillOnlyName(srcSlotIndex, skillIndex, overInSkillGrade)

        else:
            self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)

    def OverOutItem(self):
        if 0 != self.toolTipSkill:
            self.toolTipSkill.HideToolTip()

    ## Quest
    def __SelectQuest(self, slotIndex):
        if app.ENABLE_QUEST_RENEWAL:
            questIndex = self.questIndexMap[slotIndex]
            if not questIndex in self.questClicked:
                self.questClicked.append(questIndex)
        else:
            questIndex = quest.GetQuestIndex(self.questShowingStartIndex + slotIndex)

        import event
        event.QuestButtonClick(-2147483648 + questIndex)

    def RefreshQuest(self):
        if app.ENABLE_QUEST_RENEWAL:
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            for cat in self.questOpenedCategories:
                self.RefreshQuestCategory(cat)

            self.RefreshQuestCategoriesCount()
        else:
            if self.isLoaded==0:
                return

            self.OnQuestScroll()

            questCount = quest.GetQuestCount()
            questRange = range(quest.QUEST_MAX_NUM)

            if questCount > quest.QUEST_MAX_NUM:
                self.questScrollBar.Show()
            else:
                self.questScrollBar.Hide()

            for i in questRange[:questCount]:
                (questName, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(self.questShowingStartIndex + i)

                self.questNameList[i].SetText(questName)
                self.questNameList[i].Show()
                self.questLastCountList[i].Show()
                self.questLastTimeList[i].Show()

                if len(questCounterName) > 0:
                    self.questLastCountList[i].SetText("%s : %d" % (questCounterName, questCounterValue))
                else:
                    self.questLastCountList[i].SetText("")

                ## Icon
                self.questSlot.SetSlot(i, i, 1, 1, questIcon)

            for i in questRange[questCount:]:
                self.questNameList[i].Hide()
                self.questLastTimeList[i].Hide()
                self.questLastCountList[i].Hide()
                self.questSlot.ClearSlot(i)
                self.questSlot.HideSlotBaseImage(i)

            self.__UpdateQuestClock()

    def __UpdateQuestClock(self):
        if "QUEST" == self.state:
            if app.ENABLE_QUEST_RENEWAL:
                for clock in self.questClockList:
                    clockText = localeInfo.QUEST_UNLIMITED_TIME

                    if clock.GetProperty("idx"):
                        (lastName, lastTime) = quest.GetQuestLastTime(clock.GetProperty("idx"))

                        if len(lastName) > 0:
                            if lastTime <= 0:
                                clockText = localeInfo.QUEST_TIMEOVER
                            else:
                                questLastMinute = lastTime / 60
                                questLastSecond = lastTime % 60

                                clockText = lastName + " : "

                                if questLastMinute > 0:
                                    clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                                    if questLastSecond > 0:
                                        clockText += " "

                                if questLastSecond > 0:
                                    clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                    clock.SetText(clockText)
            else:
                # QUEST_LIMIT_COUNT_BUG_FIX
                for i in xrange(min(quest.GetQuestCount(), quest.QUEST_MAX_NUM)):
                # END_OF_QUEST_LIMIT_COUNT_BUG_FIX
                    (lastName, lastTime) = quest.GetQuestLastTime(i + self.questShowingStartIndex)

                    clockText = localeInfo.QUEST_UNLIMITED_TIME
                    if len(lastName) > 0:

                        if lastTime <= 0:
                            clockText = localeInfo.QUEST_TIMEOVER
                        else:
                            questLastMinute = lastTime / 60
                            questLastSecond = lastTime % 60

                            clockText = lastName + " : "

                            if questLastMinute > 0:
                                clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                                if questLastSecond > 0:
                                    clockText += " "

                            if questLastSecond > 0:
                                clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                    self.questLastTimeList[i].SetText(clockText)

    def __GetStatMinusPoint(self):
        POINT_STAT_RESET_COUNT = 112
        return player.GetStatus(POINT_STAT_RESET_COUNT)

    def __OverInStatMinusButton(self, stat):
        try:
            self.__ShowStatToolTip(self.STAT_MINUS_DESCRIPTION[stat] % self.__GetStatMinusPoint())
        except KeyError:
            pass

        self.refreshToolTip = lambda arg=stat: self.__OverInStatMinusButton(arg)

    def __OverOutStatMinusButton(self):
        self.__HideStatToolTip()
        self.refreshToolTip = 0

    def __OverInStatButton(self, stat):
        try:
            self.__ShowStatToolTip(self.STAT_DESCRIPTION[stat])
        except KeyError:
            pass

    def __OverOutStatButton(self):
        self.__HideStatToolTip()

    def __ShowStatToolTip(self, statDesc):
        self.toolTip.ClearToolTip()
        self.toolTip.AppendTextLine(statDesc)
        self.toolTip.Show()

    def __HideStatToolTip(self):
        self.toolTip.Hide()

    def OnPressEscapeKey(self):
        if app.ENABLE_QUEST_RENEWAL:
            if self.questSlideWndNewKey > 0:
                if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                    self.questSlideWnd[self.questSlideWndNewKey-1].OnPressEscapeKey()
        self.Close()
        return True

    def OnUpdate(self):
        self.__UpdateQuestClock()

    ## Skill Process
    def __RefreshSkillPage(self, name, slotCount):
        global SHOW_LIMIT_SUPPORT_SKILL_LIST

        skillPage = self.skillPageDict[name]

        startSlotIndex = skillPage.GetStartIndex()
        if "ACTIVE" == name:
            if self.PAGE_HORSE == self.curSelectedSkillGroup:
                startSlotIndex += slotCount

        getSkillType=skill.GetSkillType
        getSkillIndex=player.GetSkillIndex
        getSkillGrade=player.GetSkillGrade
        getSkillLevel=player.GetSkillLevel
        getSkillLevelUpPoint=skill.GetSkillLevelUpPoint
        getSkillMaxLevel=skill.GetSkillMaxLevel

        for i in xrange(slotCount+1):
            slotIndex = i + startSlotIndex
            skillIndex = getSkillIndex(slotIndex)
            if app.ENABLE_SLOT_WINDOW_EX:
                activeList = {}
                cooltmList = {}

            for j in xrange(skill.SKILL_GRADE_COUNT):
                realSlotIndex = self.__GetRealSkillSlot(j, i)
                if app.ENABLE_SLOT_WINDOW_EX:
                    activeList[realSlotIndex] = skillPage.IsActivatedSlot(realSlotIndex)
                    cooltmList[realSlotIndex] = skillPage.GetSlotCoolTime(realSlotIndex)
                skillPage.ClearSlot(realSlotIndex)

            if 0 == skillIndex:
                continue

            skillGrade = getSkillGrade(slotIndex)
            skillLevel = getSkillLevel(slotIndex)
            skillType = getSkillType(skillIndex)

            ## 승마 스킬 예외 처리
            if player.SKILL_INDEX_RIDING == skillIndex:
                if 1 == skillGrade:
                    skillLevel += 19
                elif 2 == skillGrade:
                    skillLevel += 29
                elif 3 == skillGrade:
                    skillLevel = 40

                skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel)
                skillPage.SetSlotCount(slotIndex, skillLevel)

            ## ACTIVE
            elif skill.SKILL_TYPE_ACTIVE == skillType:
                for j in xrange(skill.SKILL_GRADE_COUNT):
                    realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
                    skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
                    skillPage.SetCoverButton(realSlotIndex)

                    if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1):
                        skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
                    elif (not self.__CanUseSkillNow()) or (skillGrade != j):
                        skillPage.SetSlotCount(realSlotIndex, 0)
                        skillPage.DisableCoverButton(realSlotIndex)
                    else:
                        skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)

                    if app.ENABLE_SLOT_WINDOW_EX:
                        isActive = activeList.get(realSlotIndex, False)
                        coolTime,elapsedTime = cooltmList.get(realSlotIndex, (0,0))
                        if isActive:
                            skillPage.ActivateSlot(realSlotIndex)
                        if coolTime:
                            skillPage.SetSlotCoolTime(realSlotIndex, coolTime, elapsedTime)
            ## 그외
            else:
                if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
                    realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
                    skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
                    skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)

                    if skill.CanUseSkill(skillIndex):
                        skillPage.SetCoverButton(realSlotIndex)

            skillPage.RefreshSlot()

    def RefreshSkill(self):

        if self.isLoaded==0:
            return

        if self.__IsChangedHorseRidingSkillLevel():
            self.RefreshCharacter()
            return


        global SHOW_ONLY_ACTIVE_SKILL
        if SHOW_ONLY_ACTIVE_SKILL:
            self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
        else:
            self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
            self.__RefreshSkillPage("SUPPORT", self.SUPPORT_PAGE_SLOT_COUNT)

        self.RefreshSkillPlusButtonList()

    def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint):

        ## 스킬이 있으면
        if 0 == skillIndex:
            return False

        ## 레벨업 조건을 만족한다면
        if not skill.CanLevelUpSkill(skillIndex, skillLevel):
            return False

        return True

    def __RefreshSkillPlusButton(self, name):
        global HIDE_SUPPORT_SKILL_POINT
        if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name:
            return

        slotWindow = self.skillPageDict[name]
        slotWindow.HideAllSlotButton()

        slotStatType = self.skillPageStatDict[name]
        if 0 == slotStatType:
            return

        statPoint = player.GetStatus(slotStatType)
        startSlotIndex = slotWindow.GetStartIndex()
        if "HORSE" == name:
            startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT

        if statPoint > 0:
            for i in xrange(self.PAGE_SLOT_COUNT):
                slotIndex = i + startSlotIndex
                skillIndex = player.GetSkillIndex(slotIndex)
                skillGrade = player.GetSkillGrade(slotIndex)
                skillLevel = player.GetSkillLevel(slotIndex)

                if skillIndex == 0:
                    continue
                if skillGrade != 0:
                    continue

                if name == "HORSE":
                    if player.GetStatus(player.LEVEL) >= skill.GetSkillLevelLimit(skillIndex):
                        if skillLevel < 20:
                            slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex))

                else:
                    if "SUPPORT" == name:
                        if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
                            if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
                                slotWindow.ShowSlotButton(slotIndex)
                    else:
                        if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
                            slotWindow.ShowSlotButton(slotIndex)


    def RefreshSkillPlusButtonList(self):

        if self.isLoaded==0:
            return

        self.RefreshSkillPlusPointLabel()

        if not self.__CanUseSkillNow():
            return

        try:
            if self.PAGE_HORSE == self.curSelectedSkillGroup:
                self.__RefreshSkillPlusButton("HORSE")
            else:
                self.__RefreshSkillPlusButton("ACTIVE")

            self.__RefreshSkillPlusButton("SUPPORT")

        except:
            import exception
            exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject")

    def RefreshSkillPlusPointLabel(self):
        if self.isLoaded==0:
            return

        if self.PAGE_HORSE == self.curSelectedSkillGroup:
            activeStatPoint = player.GetStatus(player.SKILL_HORSE)
            self.activeSkillPointValue.SetText(str(activeStatPoint))

        else:
            activeStatPoint = player.GetStatus(player.SKILL_ACTIVE)
            self.activeSkillPointValue.SetText(str(activeStatPoint))

        supportStatPoint = max(0, player.GetStatus(player.SKILL_SUPPORT))
        self.supportSkillPointValue.SetText(str(supportStatPoint))

    ## Skill Level Up Button
    def OnPressedSlotButton(self, slotNumber):
        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)

        skillIndex = player.GetSkillIndex(srcSlotIndex)
        curLevel = player.GetSkillLevel(srcSlotIndex)
        maxLevel = skill.GetSkillMaxLevel(skillIndex)

        net.SendChatPacket("/skillup " + str(skillIndex))

    ## Use Skill
    def ClickSkillSlot(self, slotIndex):

        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotIndex)
        skillIndex = player.GetSkillIndex(srcSlotIndex)
        skillType = skill.GetSkillType(skillIndex)

        if not self.__CanUseSkillNow():
            if skill.SKILL_TYPE_ACTIVE == skillType:
                return

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if skill.CanUseSkill(skillIndex):
                    player.ClickSkillSlot(srcSlotIndex)
                    return

        mouseModule.mouseController.DeattachObject()

    ## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다.
    ##         매우 불합리. 구조 자체를 개선해야 할듯.
    def OnUseSkill(self, slotIndex, coolTime):

        skillIndex = player.GetSkillIndex(slotIndex)
        skillType = skill.GetSkillType(skillIndex)

        ## ACTIVE
        if skill.SKILL_TYPE_ACTIVE == skillType:
            skillGrade = player.GetSkillGrade(slotIndex)
            slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
        ## ETC
        else:
            slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                slotWindow.SetSlotCoolTime(slotIndex, coolTime)
                return

    def OnActivateSkill(self, slotIndex):

        skillGrade = player.GetSkillGrade(slotIndex)
        slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if app.ENABLE_ACCE_SYSTEM:
                    slotWindow.ActivateSlotOld(slotIndex)
                else:
                    slotWindow.ActivateSlot(slotIndex)
                return

    def OnDeactivateSkill(self, slotIndex):

        skillGrade = player.GetSkillGrade(slotIndex)
        slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if app.ENABLE_ACCE_SYSTEM:
                    slotWindow.DeactivateSlotOld(slotIndex)
                else:
                    slotWindow.DeactivateSlot(slotIndex)
                return

    def __ShowJobToolTip(self):
        self.toolTipJob.ShowToolTip()

    def __HideJobToolTip(self):
        self.toolTipJob.HideToolTip()

    def __SetJobText(self, mainJob, subJob):
        if player.GetStatus(player.LEVEL)<5:
            subJob=0

        if 949 == app.GetDefaultCodePage():
            self.toolTipJob.ClearToolTip()

            try:
                jobInfoTitle=localeInfo.JOBINFO_TITLE[mainJob][subJob]
                jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob]
            except IndexError:
                print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob)
                return

            self.toolTipJob.AutoAppendTextLine(jobInfoTitle)
            self.toolTipJob.AppendSpace(5)

            for jobInfoDataLine in jobInfoData:
                self.toolTipJob.AutoAppendTextLine(jobInfoDataLine)

            self.toolTipJob.AlignHorizonalCenter()

    def __ShowAlignmentToolTip(self):
        self.toolTipAlignment.ShowToolTip()

    def __HideAlignmentToolTip(self):
        self.toolTipAlignment.HideToolTip()

    if app.ENABLE_CONQUEROR_LEVEL:
        def __ShowHTHToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_CON)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideHTHToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        def __ShowINTToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_INT)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideINTToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        def __ShowSTRToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_STR)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideSTRToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
            
        def __ShowDEXToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_DEX)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideDEXToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        ###############################################################################
        def __ShowBaseToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_BASE_LEVEL)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideBaseToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ###
        def __ShowSungmaToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_CONQUEROR_LEVEL)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideSungmaToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()           
        
        ###
        
        def __ShowMSPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MOVE_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMSPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ####
        def __ShowASPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_ATT_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideASPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ###   
        def __ShowCSPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_CAST_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideCSPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
            
        ###   
        def __ShowMATTToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MAG_ATT)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMATTToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
            
        ###   
        def __ShowMDEFToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MAG_DEF)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
            
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMDEFToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ##############################################################################################   
    def RefreshCharacter(self):

        if self.isLoaded==0:
            return

        ## Name
        try:
            characterName = player.GetName()
            guildName = player.GetGuildName()
            self.characterNameValue.SetText(characterName)
            self.guildNameValue.SetText(guildName)
            if not guildName:
                if localeInfo.IsARABIC():
                    self.characterNameSlot.SetPosition(190, 34)
                else:
                    self.characterNameSlot.SetPosition(109, 34)

                self.guildNameSlot.Hide()
            else:
                if localeInfo.IsJAPAN():
                    self.characterNameSlot.SetPosition(143, 34)
                else:
                    self.characterNameSlot.SetPosition(153, 34)
                self.guildNameSlot.Show()
        except:
            import exception
            exception.Abort("CharacterWindow.RefreshCharacter.BindObject")

        race = net.GetMainActorRace()
        group = net.GetMainActorSkillGroup()
        empire = net.GetMainActorEmpire()

        ## Job Text
        job = chr.RaceToJob(race)
        self.__SetJobText(job, group)

        ## FaceImage
        try:
            faceImageName = FACE_IMAGE_DICT[race]

            try:
                self.faceImage.LoadImage(faceImageName)
            except:
                print "CharacterWindow.RefreshCharacter(race=%d, faceImageName=%s)" % (race, faceImageName)
                self.faceImage.Hide()

        except KeyError:
            self.faceImage.Hide()

        ## GroupName
        self.__SetSkillGroupName(race, group)

        ## Skill
        if 0 == group:
            self.__SelectSkillGroup(0)

        else:
            self.__SetSkillSlotData(race, group, empire)

            if self.__CanUseHorseSkill():
                self.__SelectSkillGroup(0)

    def __SetSkillGroupName(self, race, group):

        job = chr.RaceToJob(race)

        if not self.SKILL_GROUP_NAME_DICT.has_key(job):
            return

        nameList = self.SKILL_GROUP_NAME_DICT[job]

        if 0 == group:
            self.skillGroupButton1.SetText(nameList[1])
            self.skillGroupButton2.SetText(nameList[2])
            self.skillGroupButton1.Show()
            self.skillGroupButton2.Show()
            self.activeSkillGroupName.Hide()

            ## 수인족은 직군이 하나이므로 한개만 표시
            if app.ENABLE_WOLFMAN_CHARACTER and playerSettingModule.RACE_WOLFMAN_M == race:
                self.skillGroupButton2.Hide()
        else:

            if self.__CanUseHorseSkill():
                self.activeSkillGroupName.Hide()
                self.skillGroupButton1.SetText(nameList.get(group, "Noname"))
                self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE)
                self.skillGroupButton1.Show()
                self.skillGroupButton2.Show()

            else:
                self.activeSkillGroupName.SetText(nameList.get(group, "Noname"))
                self.activeSkillGroupName.Show()
                self.skillGroupButton1.Hide()
                self.skillGroupButton2.Hide()

    def __SetSkillSlotData(self, race, group, empire=0):

        ## SkillIndex
        playerSettingModule.RegisterSkill(race, group, empire)

        ## Event
        self.__SetSkillSlotEvent()

        ## Refresh
        self.RefreshSkill()

    def __SelectSkillGroup(self, index):
        for btn in self.skillGroupButton:
            btn.SetUp()
        self.skillGroupButton[index].Down()

        if self.__CanUseHorseSkill():
            if 0 == index:
                index = net.GetMainActorSkillGroup()-1
            elif 1 == index:
                index = self.PAGE_HORSE

        self.curSelectedSkillGroup = index
        self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire())

    def __CanUseSkillNow(self):
        if 0 == net.GetMainActorSkillGroup():
            return False

        return True

    def __CanUseHorseSkill(self):

        slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING)

        if not slotIndex:
            return False

        grade = player.GetSkillGrade(slotIndex)
        level = player.GetSkillLevel(slotIndex)
        if level < 0:
            level *= -1
        if grade >= 1 and level >= 1:
            return True

        return False

    def __IsChangedHorseRidingSkillLevel(self):
        ret = False

        if -1 == self.canUseHorseSkill:
            self.canUseHorseSkill = self.__CanUseHorseSkill()

        if self.canUseHorseSkill != self.__CanUseHorseSkill():
            ret = True

        self.canUseHorseSkill = self.__CanUseHorseSkill()
        return ret

    def __GetRealSkillSlot(self, skillGrade, skillSlot):
        return skillSlot + min(skill.SKILL_GRADE_COUNT-1, skillGrade)*skill.SKILL_GRADE_STEP_COUNT

    def __GetETCSkillRealSlotIndex(self, skillSlot):
        if skillSlot > 100:
            return skillSlot
        return skillSlot % self.ACTIVE_PAGE_SLOT_COUNT

    def __RealSkillSlotToSourceSlot(self, realSkillSlot):
        if realSkillSlot > 100:
            return realSkillSlot
        if self.PAGE_HORSE == self.curSelectedSkillGroup:
            return realSkillSlot + self.ACTIVE_PAGE_SLOT_COUNT
        return realSkillSlot % skill.SKILL_GRADE_STEP_COUNT

    def __GetSkillGradeFromSlot(self, skillSlot):
        return int(skillSlot / skill.SKILL_GRADE_STEP_COUNT)

    def SelectSkillGroup(self, index):
        self.__SelectSkillGroup(index)

    def OnQuestScroll(self):
        questCount = quest.GetQuestCount()
        scrollLineCount = max(0, questCount - quest.QUEST_MAX_NUM)
        startIndex = int(scrollLineCount * self.questScrollBar.GetPos())

        if startIndex != self.questShowingStartIndex:
            self.questShowingStartIndex = startIndex
            self.RefreshQuest()

    if app.ENABLE_QUEST_RENEWAL:
        def __OnScrollQuest(self):
            if self.state != "QUEST":
                return

            curPos = self.questScrollBar.GetPos()
            if math.fabs(curPos - self.questLastScrollPosition) >= 0.001:
                self.RerenderQuestPage()
                self.questLastScrollPosition = curPos

        def ResetQuestScroll(self):
            self.questScrollBar.Hide()

            if self.questScrollBar.GetPos() != 0:
                self.questScrollBar.SetPos(0)

        def RerenderQuestPage(self):
            overflowingY = self.displayY - self.MAX_QUEST_PAGE_HEIGHT
            if overflowingY < 0:
                overflowingY = 0

            self.baseCutY = math.ceil(overflowingY * self.questScrollBar.GetPos())
            self.displayY = 0
            self.RearrangeQuestCategories(xrange(quest.QUEST_CATEGORY_MAX_NUM))
            self.RefreshQuestCategory()

            if overflowingY > 0:
                if (len(self.questOpenedCategories)) == 0:
                    self.ResetQuestScroll()
                else:
                    self.questScrollBar.Show()
            else:
                self.ResetQuestScroll()

        def __LoadQuestCategory(self):
            self.questPage.Show()

            if self.isLoaded == 0:
                return

            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                category = self.questCategoryList[i]

                categoryName = category.GetProperty("name")
                if not categoryName:
                    category.SetProperty("name", category.GetText())
                    categoryName = category.GetText()

                questCount = self.GetQuestCountInCategory(i)
                self.questCategoryList[i].SetTextAlignLeft(categoryName + " (" + str(questCount) + ")")
                self.questCategoryList[i].SetTextColor(self.GetQuestCategoryColor(i))
                self.questCategoryList[i].SetQuestLabel(quest_lable_expend_img_path_dict[i], self.GetQuestCountInCategory(i))
                self.questCategoryList[i].Show()

            self.RefreshQuestCategory()
            if self.isQuestCategoryLoad == False:
                self.questScrollBar.Hide()
            else:
                self.RerenderQuestPage()

            self.isQuestCategoryLoad = True

        def GetQuestCategoryColor(self, category):
            return self.questColorList["default_title"]

        def GetQuestProperties(self, questName):
            findString = {
                "*" : "blue",
                "&" : "green",
                "~" : "golden"
            }

            if questName[0] in findString:
                return (questName[1:], findString[questName[0]])

            return (questName, None)

        def IsQuestCategoryOpen(self, category):
            return (category in self.questOpenedCategories)

        def ToggleCategory(self, category):
            if self.IsQuestCategoryOpen(category):
                self.CloseQuestCategory(category)
            else:
                self.OpenQuestCategory(category)

        def RearrangeQuestCategories(self, categoryRange):
            i = 0
            for i in categoryRange:
                if (self.displayY - self.baseCutY) >= 0 and (self.displayY - self.baseCutY) < self.MAX_QUEST_PAGE_HEIGHT - 20:
                    self.questCategoryList[i].SetPosition(13, (self.displayY - self.baseCutY) + 10)
                    self.questCategoryList[i].Show()
                else:
                    self.questCategoryList[i].Hide()

                self.displayY += 20
                self.questCategoryRenderPos[i] = self.displayY

        def CloseQuestCategory(self, category):
            self.questCategoryList[category].CloseCategory(self.GetQuestCountInCategory(category))

            if category in self.questOpenedCategories:
                self.questOpenedCategories.remove(category)

            for currentSlot in self.questSlotList:
                if currentSlot.GetProperty("category") == category:
                    currentSlot.Hide()
                    self.displayY -= currentSlot.GetHeight()

            self.RerenderQuestPage()

        def OpenQuestCategory(self, category):
            if self.GetQuestCountInCategory(category) == 0:
                return

            while len(self.questOpenedCategories) >= self.questMaxOpenedCategories:
                openedCategories = self.questOpenedCategories.pop()
                self.CloseQuestCategory(openedCategories)

            self.questCategoryList[category].OpenCategory(self.GetQuestCountInCategory(category))
            self.questOpenedCategories.append(category)
            self.RefreshQuestCategory(category)
            self.RerenderQuestPage()

        def RefreshQuestCategory(self, category = -1):
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            categories = []
            if category == -1:
                categories = self.questOpenedCategories
            elif not category in self.questOpenedCategories:
                self.OpenQuestCategory(category)
                return
            else:
                categories.append(category)

            for currentCategory in categories:
                self.displayY = self.questCategoryRenderPos[currentCategory]

                self.LoadCategory(currentCategory)
                self.RearrangeQuestCategories(xrange(currentCategory + 1, quest.QUEST_CATEGORY_MAX_NUM))

        def RefreshQuestCategoriesCount(self):
            for category in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                categoryName = self.questCategoryList[category].GetProperty("name")
                questCount = self.GetQuestCountInCategory(category)
                self.questCategoryList[category].SetTextAlignLeft(categoryName + " (" + str(questCount) + ")")

        def RefreshQuest(self):
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            for category in self.questOpenedCategories:
                self.RefreshQuestCategory(category)

            self.RefreshQuestCategoriesCount()

        def CreateQuestSlot(self, name):
            for questSlot in self.questSlotList:
                if questSlot.GetWindowName() == name:
                    return questSlot

            pyScrLoader = ui.PythonScriptLoader()
            slot = ui.ListBar()
            pyScrLoader.LoadElementListBar(slot, quest_slot_listbar, self.questPage)

            slot.SetParent(self.quest_page_board_window)
            slot.SetWindowName(name)
            slot.Hide()
            self.questSlotList.append(slot)
            return slot

        def SetQuest(self, slot, questID, questName, questCounterName, questCounterValue):
            (name, color) = self.GetQuestProperties(questName)
            slot.SetTextAlignLeft(name, 20)
            if color:
                slot.SetTextColor(self.questColorList[color])
            slot.SetEvent(ui.__mem_func__(self.__SelectQuest), questID)
            slot.SetWindowHorizontalAlignLeft()
            slot.Show()

        def LoadCategory(self, category):
            self.questIndexMap = {}
            self.questCounterList = []
            self.questClockList = []
            self.questSeparatorList = []

            for questSlot in self.questSlotList:
                questSlot.Hide()

            questCount = 0
            for questIdx in self.GetQuestsInCategory(category):
                questCount += 1
                (questID, questIndex, questName, questCategory, _, questCounterName, questCounterValue) = questIdx
                (lastName, lastTime) = quest.GetQuestLastTime(questID)

                slot = self.CreateQuestSlot("QuestSlotList_" + str(questCategory) + "_" + str(questID))

                slot.SetPosition(0, (self.displayY - self.baseCutY))
                slot.SetParent(self.quest_page_board_window)
                baseDisplayY = self.displayY

                ## -- Quest Counter
                hasCounter = False
                if questCounterName != "":
                    self.displayY += 15

                    counter = ui.TextLine()
                    counter.SetParent(slot)
                    counter.SetPosition(20, 20 - 2.5)
                    counter.SetText(questCounterName + ": " + str(questCounterValue))
                    counter.Show()

                    self.questCounterList.append(counter)
                    hasCounter = True
                ## -- Quest Counter

                ## -- Quest Clock
                self.displayY += 15

                clockText = localeInfo.QUEST_UNLIMITED_TIME
                if len(lastName) > 0:
                    if lastTime <= 0:
                        clockText = localeInfo.QUEST_TIMEOVER
                    else:
                        questLastMinute = lastTime / 60
                        questLastSecond = lastTime % 60

                        clockText = lastName + " : "

                        if questLastMinute > 0:
                            clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                            if questLastSecond > 0:
                                clockText += " "

                        if questLastSecond > 0:
                            clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                clock = ui.TextLine()
                clock.SetParent(slot)
                clock.SetPosition(20, 20 + (int(hasCounter) * 14) - 2.5)
                clock.SetText(clockText)
                clock.SetProperty("idx", questID)
                self.questClockList.append(clock)
                clock.Show()
                ## -- Quest Clock

                ## -- Quest Separator
                self.displayY += 5
                if questCount < self.GetQuestCountInCategory(category):
                    seperator = ui.ImageBox()
                    seperator.SetParent(slot)
                    seperator.SetPosition(4, 20 + (int(hasCounter) * 14 - 2.5) + 15)
                    seperator.LoadImage("d:/ymir work/ui/quest_re/quest_list_line_01.tga")
                    seperator.Show()
                    self.questSeparatorList.append(seperator)
                ## -- Quest Separator

                slot.SetProperty("category", questCategory)

                if questIndex in self.questClicked:
                    slot.OnClickEvent()

                if (baseDisplayY - self.baseCutY) + 2 >= 0 and (baseDisplayY - self.baseCutY) + 2 < self.MAX_QUEST_PAGE_HEIGHT - 30:
                    self.questIndexMap[questID] = questIndex
                    self.SetQuest(slot, questID, questName, questCounterName, questCounterValue)

                self.displayY += 15

            newList = []
            for questSlot in self.questSlotList:
                if questSlot.IsShow():
                    newList.append(questSlot)

            self.questSlotList = newList

        def __OnClickQuestCategoryButton(self, category):
            self.ToggleCategory(category)

        def GetQuestsInCategory(self, category, retCount = False):
            questList = []
            count = 0
            for i in xrange(quest.GetQuestCount()):
                (questIndex, questName, questCategory, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(i)
                if questCategory == category:
                    count += 1
                    questList.append((i, questIndex, questName, questCategory, questIcon, questCounterName, questCounterValue))

            if retCount:
                return count

            return questList

        def GetQuestCountInCategory(self, category):
            return self.GetQuestsInCategory(category, True)


Aldığım syserr hatası.:
0613 23:58:02807 ::
networkModule.py(line:200) SetSelectCharacterPhase
system.py(line:177) __hybrid_import
system.py(line:142) _process_result
introSelect.py(line:25) <module>
system.py(line:177) __hybrid_import

networkModule.SetSelectCharacterPhase - <type 'exceptions.IndentationError'>:unexpected indent (uiCharacter.py, line 816)

0613 23:58:02807 :: ============================================================================================================
0613 23:58:02807 :: Abort!!!!
 
Çözüm
Eyvallah çözdüm çok teşekkür ederim :).

:Ama şimdi farklı bir hata alıyorum bakabilrsen sevinirim.


uichracter:
import ui
import uiScriptLocale
import app
import net
import dbg
import snd
import player
import mouseModule
import wndMgr
import skill
import playerSettingModule
import quest
import localeInfo
import uiToolTip
import constInfo
import emotion
import chr
if app.ENABLE_QUEST_RENEWAL:
    import math, uiQuest

SHOW_ONLY_ACTIVE_SKILL = FALSE
SHOW_LIMIT_SUPPORT_SKILL_LIST = []
HIDE_SUPPORT_SKILL_POINT = FALSE

if app.ENABLE_CONQUEROR_LEVEL:
    HIDE_SUPPORT_SKILL_POINT = TRUE
    SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140, 132, 133, 134, 246]
else:
    if localeInfo.IsYMIR()...
System.py arat 177 142 177 satırlarını kontrol et modülünde de bir sıkıntı var sanırım karma içe aktarma almışsın bide sistem veya satır çakışması olabilir satırları bir kontrol et bakalım dostum bende çok anlamıyorum ama cevap göremeyince yardımcı olmak istedim umarım faydası olur.
 
System.py arat 177 142 177 satırlarını kontrol et modülünde de bir sıkıntı var sanırım karma içe aktarma almışsın bide sistem veya satır çakışması olabilir satırları bir kontrol et bakalım dostum bende çok anlamıyorum ama cevap göremeyince yardımcı olmak istedim umarım faydası olur.
system.py ile alakası yok
 
Öncelikle merhaba, yohara eklerken aldığım syserr dosyasını bırakıyorum çözemedim yardımcı olabilirseniz çok sevinirim.


Syserr veren dosya:
import ui
import uiScriptLocale
import app
import net
import dbg
import snd
import player
import mouseModule
import wndMgr
import skill
import playerSettingModule
import quest
import localeInfo
import uiToolTip
import constInfo
import emotion
import chr
if app.ENABLE_QUEST_RENEWAL:
    import math, uiQuest

SHOW_ONLY_ACTIVE_SKILL = FALSE
SHOW_LIMIT_SUPPORT_SKILL_LIST = []
HIDE_SUPPORT_SKILL_POINT = FALSE

if app.ENABLE_CONQUEROR_LEVEL:
    HIDE_SUPPORT_SKILL_POINT = TRUE
    SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140, 132, 133, 134, 246]
else:
    if localeInfo.IsYMIR():
        SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
        [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140, 0, 0, 0, 0]
        if not localeInfo.IsCHEONMA():
            HIDE_SUPPORT_SKILL_POINT = TRUE
            SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140,141,142]
    elif localeInfo.IsJAPAN() or   (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/ca") and (localeInfo.IsEUROPE() and app.GetLocalePath() != "locale/br"):
        HIDE_SUPPORT_SKILL_POINT = TRUE  
        SHOW_LIMIT_SUPPORT_SKILL_LIST = [121, 122, 123, 124, 126, 127, 129, 128, 131, 137, 138, 139, 140]

    else:
        HIDE_SUPPORT_SKILL_POINT = TRUE
   
FACE_IMAGE_DICT = {
    playerSettingModule.RACE_WARRIOR_M    : "icon/face/warrior_m.tga",
    playerSettingModule.RACE_WARRIOR_W    : "icon/face/warrior_w.tga",
    playerSettingModule.RACE_ASSASSIN_M    : "icon/face/assassin_m.tga",
    playerSettingModule.RACE_ASSASSIN_W    : "icon/face/assassin_w.tga",
    playerSettingModule.RACE_SURA_M        : "icon/face/sura_m.tga",
    playerSettingModule.RACE_SURA_W        : "icon/face/sura_w.tga",
    playerSettingModule.RACE_SHAMAN_M    : "icon/face/shaman_m.tga",
    playerSettingModule.RACE_SHAMAN_W    : "icon/face/shaman_w.tga",
}
if app.ENABLE_WOLFMAN_CHARACTER:
    FACE_IMAGE_DICT.update({playerSettingModule.RACE_WOLFMAN_M  : "icon/face/wolfman_m.tga",})

def unsigned32(n):
    return n & 0xFFFFFFFFL
if app.ENABLE_QUEST_RENEWAL:
    quest_slot_listbar = {
        "name" : "Quest_Slot",
        "type" : "listbar",

        "x" : 0,
        "y" : 0,

        "width" : 210,
        "height" : 20,

        "text" : "Quest title",
        "align" : "left",

        "horizontal_align" : "left",
        "vertical_align" : "left",
        "text_horizontal_align" : "left",
        "all_align" : "left",

        "text_height": 40
    }

    quest_lable_expend_img_path_dict = {
        0: "d:/ymir work/ui/quest_re/tabcolor_1_main.tga",
        1: "d:/ymir work/ui/quest_re/tabcolor_2_sub.tga",
        2: "d:/ymir work/ui/quest_re/tabcolor_3_levelup.tga",
        3: "d:/ymir work/ui/quest_re/tabcolor_4_event.tga",
        4: "d:/ymir work/ui/quest_re/tabcolor_5_collection.tga",
        5: "d:/ymir work/ui/quest_re/tabcolor_6_system.tga",
        6: "d:/ymir work/ui/quest_re/tabcolor_7_scroll.tga",
        7: "d:/ymir work/ui/quest_re/tabcolor_8_daily.tga"
    }

    quest_label_dict = {
        0 : uiScriptLocale.QUEST_UI_TEXT_MAIN,
        1 : uiScriptLocale.QUEST_UI_TEXT_SUB,
        2 : uiScriptLocale.QUEST_UI_TEXT_LEVELUP,
        3 : uiScriptLocale.QUEST_UI_TEXT_EVENT,
        4 : uiScriptLocale.QUEST_UI_TEXT_COLLECTION,
        5 : uiScriptLocale.QUEST_UI_TEXT_SYSTEM,
        6 : uiScriptLocale.QUEST_UI_TEXT_SCROLL,
        7 : uiScriptLocale.QUEST_UI_TEXT_DAILY,
    }

class CharacterWindow(ui.ScriptWindow):
    if app.ENABLE_CONQUEROR_LEVEL:
        ACTIVE_PAGE_SLOT_COUNT = 8
        SUPPORT_PAGE_SLOT_COUNT = 12

        PAGE_SLOT_COUNT = 12
        PAGE_HORSE = 2

    SKILL_GROUP_NAME_DICT = {
        playerSettingModule.JOB_WARRIOR    : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1,    2 : localeInfo.SKILL_GROUP_WARRIOR_2, },
        playerSettingModule.JOB_ASSASSIN    : { 1 : localeInfo.SKILL_GROUP_ASSASSIN_1,    2 : localeInfo.SKILL_GROUP_ASSASSIN_2, },
        playerSettingModule.JOB_SURA        : { 1 : localeInfo.SKILL_GROUP_SURA_1,        2 : localeInfo.SKILL_GROUP_SURA_2, },
        playerSettingModule.JOB_SHAMAN        : { 1 : localeInfo.SKILL_GROUP_SHAMAN_1,    2 : localeInfo.SKILL_GROUP_SHAMAN_2, },
    }
    if app.ENABLE_WOLFMAN_CHARACTER:
        SKILL_GROUP_NAME_DICT.update({playerSettingModule.JOB_WOLFMAN        : { 1 : localeInfo.JOB_WOLFMAN1,    2 : localeInfo.JOB_WOLFMAN2, },})

    STAT_DESCRIPTION =    {
        "HTH" : localeInfo.STAT_TOOLTIP_CON,
        "INT" : localeInfo.STAT_TOOLTIP_INT,
        "STR" : localeInfo.STAT_TOOLTIP_STR,
        "DEX" : localeInfo.STAT_TOOLTIP_DEX,
    }


    STAT_MINUS_DESCRIPTION = localeInfo.STAT_MINUS_DESCRIPTION
    if app.ENABLE_QUEST_RENEWAL:
        MAX_QUEST_PAGE_HEIGHT = 293.5

    def __init__(self):
        ui.ScriptWindow.__init__(self)
        if app.ENABLE_QUEST_RENEWAL:
            self.isQuestCategoryLoad = False
        self.state = "STATUS"
        if app.ENABLE_CONQUEROR_LEVEL:
            self.substate = "BASE"
   
            self.statusConquerorPlusCommandDict={
                "SMH_STR" : "/conqueror_stat smh_str",
                "SMH_HP" : "/conqueror_stat smh_hp",
                "SMH_MOVE" : "/conqueror_stat smh_move",
                "SMH_INMUNE" : "/conqueror_stat smh_inmune",
            }

        self.isLoaded = 0

        self.toolTipSkill = 0

        self.__Initialize()
        self.__LoadWindow()

        self.statusPlusCommandDict={
            "HTH" : "/stat ht",
            "INT" : "/stat iq",
            "STR" : "/stat st",
            "DEX" : "/stat dx",
        }

        self.statusMinusCommandDict={
            "HTH-" : "/stat- ht",
            "INT-" : "/stat- iq",
            "STR-" : "/stat- st",
            "DEX-" : "/stat- dx",
        }

    def __del__(self):
        ui.ScriptWindow.__del__(self)

    def __Initialize(self):
        self.refreshToolTip = 0
        self.curSelectedSkillGroup = 0
        self.canUseHorseSkill = -1

        self.toolTip = None
        self.toolTipJob = None
        self.toolTipAlignment = None
        self.toolTipSkill = None

        self.faceImage = None
        self.statusPlusLabel = None
        self.statusPlusValue = None
        self.activeSlot = None
        self.tabDict = None
        self.tabButtonDict = None
        self.pageDict = None
        self.titleBarDict = None
        self.statusPlusButtonDict = None
        self.statusMinusButtonDict = None

        if app.ENABLE_CONQUEROR_LEVEL:
            self.statusConquerorPlusButtonDict = None

        self.skillPageDict = None
        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar = None
            self.questLastScrollPosition = 0
            self.questPage = None
            self.questTitleBar = None
            self.questSlotList = []
            self.questCategory = {}
            self.questCategoryList = []

            self.questColorList = {
                "green" : 0xFF83C055,
                "blue": 0xFF45678D,
                "golden": 0xFFCAB62F,
                "default_title": 0xFFCEC6B5
            }

            self.questOpenedCategories = []
            self.questMaxOpenedCategories = 1

            self.questClicked = []
            self.questIndexMap = {}
            self.questCounterList = []
            self.questClockList = []
            self.questSeparatorList = []

            self.displayY = 0
            self.baseCutY = 0
            self.questCategoryRenderPos = []

            self.questSlideWnd = {}
            self.questSlideWndNewKey = 0
        else:
            self.questShowingStartIndex = 0
            self.questScrollBar = None
            self.questSlot = None
            self.questNameList = None
            self.questLastTimeList = None
            self.questLastCountList = None
        self.skillGroupButton = ()

        self.activeSlot = None
        self.activeSkillPointValue = None
        self.supportSkillPointValue = None
        self.skillGroupButton1 = None
        self.skillGroupButton2 = None
        self.activeSkillGroupName = None

        self.guildNameSlot = None
        self.guildNameValue = None
        self.characterNameSlot = None
        self.characterNameValue = None

        self.emotionToolTip = None
        self.soloEmotionSlot = None
        self.dualEmotionSlot = None
       
        if app.ENABLE_CONQUEROR_LEVEL:
            self.toolTipConquerorInfoButton = None
           
            self.tabSungmaButtonDict = None
            self.SungmaButton = None
        if app.ENABLE_EMOJI_UPDATE:
            self.specialEmotionSlot = None

    def Show(self):
        self.__LoadWindow()

        ui.ScriptWindow.Show(self)

    def __LoadScript(self, fileName):
        pyScrLoader = ui.PythonScriptLoader()
        pyScrLoader.LoadScriptFile(self, fileName)

    def __BindObject(self):
        self.toolTip = uiToolTip.ToolTip()
        self.toolTipJob = uiToolTip.ToolTip()
        self.toolTipAlignment = uiToolTip.ToolTip(130)

        if app.ENABLE_CONQUEROR_LEVEL:
            self.toolTipConquerorInfoButton = uiToolTip.ToolTip()

        self.faceImage = self.GetChild("Face_Image")

        faceSlot=self.GetChild("Face_Slot")
        if 949 == app.GetDefaultCodePage():
            faceSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowJobToolTip)
            faceSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideJobToolTip)

        self.statusPlusLabel = self.GetChild("Status_Plus_Label")
        self.statusPlusValue = self.GetChild("Status_Plus_Value")

        self.characterNameSlot = self.GetChild("Character_Name_Slot")
        self.characterNameValue = self.GetChild("Character_Name")
        self.guildNameSlot = self.GetChild("Guild_Name_Slot")
        self.guildNameValue = self.GetChild("Guild_Name")
        self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowAlignmentToolTip)
        self.characterNameSlot.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideAlignmentToolTip)

        self.activeSlot = self.GetChild("Skill_Active_Slot")
        self.activeSkillPointValue = self.GetChild("Active_Skill_Point_Value")
        self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value")
        self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1")
        self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2")
        self.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name")
        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar = self.GetChild("Quest_ScrollBar")
            self.questPage = self.GetChild("Quest_Page")
            self.questTitleBar = self.GetChild("Quest_TitleBar")
            self.quest_page_board_window = self.GetChild("quest_page_board_window")
            self.quest_object_board_window = self.GetChild("quest_object_board_window")

        self.tabDict = {
            "STATUS"    : self.GetChild("Tab_01"),
            "SKILL"        : self.GetChild("Tab_02"),
            "EMOTICON"    : self.GetChild("Tab_03"),
            "QUEST"        : self.GetChild("Tab_04"),
        }

        self.tabButtonDict = {
            "STATUS"    : self.GetChild("Tab_Button_01"),
            "SKILL"        : self.GetChild("Tab_Button_02"),
            "EMOTICON"    : self.GetChild("Tab_Button_03"),
            "QUEST"        : self.GetChild("Tab_Button_04")
        }

        self.pageDict = {
            "STATUS"    : self.GetChild("Character_Page"),
            "SKILL"        : self.GetChild("Skill_Page"),
            "EMOTICON"    : self.GetChild("Emoticon_Page"),
            "QUEST"        : self.GetChild("Quest_Page")
        }

        self.titleBarDict = {
            "STATUS"    : self.GetChild("Character_TitleBar"),
            "SKILL"        : self.GetChild("Skill_TitleBar"),
            "EMOTICON"    : self.GetChild("Emoticon_TitleBar"),
            "QUEST"        : self.GetChild("Quest_TitleBar")
        }

        self.statusPlusButtonDict = {
            "HTH"        : self.GetChild("HTH_Plus"),
            "INT"        : self.GetChild("INT_Plus"),
            "STR"        : self.GetChild("STR_Plus"),
            "DEX"        : self.GetChild("DEX_Plus"),
        }

        self.statusMinusButtonDict = {
            "HTH-"        : self.GetChild("HTH_Minus"),
            "INT-"        : self.GetChild("INT_Minus"),
            "STR-"        : self.GetChild("STR_Minus"),
            "DEX-"        : self.GetChild("DEX_Minus"),
        }

        self.skillPageDict = {
            "ACTIVE" : self.GetChild("Skill_Active_Slot"),
            "SUPPORT" : self.GetChild("Skill_ETC_Slot"),
            "HORSE" : self.GetChild("Skill_Active_Slot"),
        }

        self.skillPageStatDict = {
            "SUPPORT"    : player.SKILL_SUPPORT,
            "ACTIVE"    : player.SKILL_ACTIVE,
            "HORSE"        : player.SKILL_HORSE,
        }

        self.skillGroupButton = (
            self.GetChild("Skill_Group_Button_1"),
            self.GetChild("Skill_Group_Button_2"),
        )

        if app.ENABLE_CONQUEROR_LEVEL:
            self.tabSungmaButtonDict = {
                "BASE"        : self.GetChild("change_base_button"),
                "SUNGMA"    : self.GetChild("change_conqueror_button")
            }
           
            self.SungmaPageDict = {
                "BASE" : self.GetChild("base_info"),
                "SUNGMA" : self.GetChild("sungma_info"),
            }
           
            self.statusConquerorPlusButtonDict = {
                "SMH_STR"        : self.GetChild("sungma_str_plus"),
                "SMH_HP"        : self.GetChild("sungma_hp_plus"),
                "SMH_MOVE"        : self.GetChild("sungma_move_plus"),
                "SMH_INMUNE"        : self.GetChild("sungma_immune_plus"),
            }          
           
            self.HTH_IMG = self.GetChild("HTH_IMG")
            self.INT_IMG = self.GetChild("INT_IMG")
            self.STR_IMG = self.GetChild("STR_IMG")
            self.DEX_IMG = self.GetChild("DEX_IMG")
           
            self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHTHToolTip)
            self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHTHToolTip)
           
            self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINTToolTip)
            self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINTToolTip)
           
            self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTRToolTip)
            self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTRToolTip)
           
            self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowDEXToolTip)
            self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideDEXToolTip)
           
            self.MSPD_IMG = self.GetChild("MSPD_IMG")
            self.ASPD_IMG = self.GetChild("ASPD_IMG")
            self.CSPD_IMG = self.GetChild("CSPD_IMG")
            self.MATT_IMG = self.GetChild("MATT_IMG")
            self.MDEF_IMG = self.GetChild("MDEF_IMG")
            [HASH=4621]#self.DEX_IMG[/HASH] = self.GetChild("ER_IMG")
           
            self.MSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMSPDToolTip)
            self.MSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMSPDToolTip)
           
            self.ASPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowASPDToolTip)
            self.ASPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideASPDToolTip)
           
            self.CSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowCSPDToolTip)
            self.CSPD_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideCSPDToolTip)
           
            self.MATT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMATTToolTip)
            self.MATT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMATTToolTip)

            self.MDEF_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMDEFToolTip)
            self.MDEF_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMDEFToolTip)
           

        global SHOW_ONLY_ACTIVE_SKILL
        global HIDE_SUPPORT_SKILL_POINT
        if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT:
            self.GetChild("Support_Skill_Point_Label").Hide()

        self.soloEmotionSlot = self.GetChild("SoloEmotionSlot")
        self.dualEmotionSlot = self.GetChild("DualEmotionSlot")
        if app.ENABLE_EMOJI_UPDATE:
            self.specialEmotionSlot = self.GetChild("SpecialEmotionSlot")
        self.__SetEmotionSlot()

        if app.ENABLE_QUEST_RENEWAL:
            self.questScrollBar.SetParent(self.quest_page_board_window)
            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                self.questCategory = ui.SubTitleBar()
                self.questCategory.SetParent(self.questPage)
                self.questCategory.MakeSubTitleBar(210, "red")
                self.questCategory.SetText(quest_label_dict[i])
                self.questCategory.SetSize(210, 16)
                self.questCategory.SetPosition(13, 0)
                self.questCategoryList.append(self.questCategory)

                self.questCategoryRenderPos.append(0)

            self.questScrollBar.SetParent(self.questPage)
            self.RearrangeQuestCategories(xrange(quest.QUEST_CATEGORY_MAX_NUM))
        else:
            self.questShowingStartIndex = 0
            self.questScrollBar = self.GetChild("Quest_ScrollBar")
            self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll))
            self.questSlot = self.GetChild("Quest_Slot")
            for i in xrange(quest.QUEST_MAX_NUM):
                self.questSlot.HideSlotBaseImage(i)
                self.questSlot.SetCoverButton(i,\
                    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_02.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_03.sub",\
                    "d:/ymir work/ui/game/quest/slot_button_03.sub", True)

            self.questNameList = []
            self.questLastTimeList = []
            self.questLastCountList = []
            for i in xrange(quest.QUEST_MAX_NUM):
                self.questNameList.append(self.GetChild("Quest_Name_0" + str(i)))
                self.questLastTimeList.append(self.GetChild("Quest_LastTime_0" + str(i)))
                self.questLastCountList.append(self.GetChild("Quest_LastCount_0" + str(i)))

    def __SetSkillSlotEvent(self):
        for skillPageValue in self.skillPageDict.itervalues():
            skillPageValue.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
            skillPageValue.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectSkill))
            skillPageValue.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
            skillPageValue.SetUnselectItemSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
            skillPageValue.SetUseSlotEvent(ui.__mem_func__(self.ClickSkillSlot))
            skillPageValue.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
            skillPageValue.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
            skillPageValue.SetPressedSlotButtonEvent(ui.__mem_func__(self.OnPressedSlotButton))
            skillPageValue.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_down.sub")

    def __SetEmotionSlot(self):

        self.emotionToolTip = uiToolTip.ToolTip()

        for slot in (self.soloEmotionSlot, self.dualEmotionSlot, self.specialEmotionSlot):#ENABLE_EMOJI_UPDATE
            slot.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
            slot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectEmotion))
            slot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
            slot.SetUseSlotEvent(ui.__mem_func__(self.__ClickEmotionSlot))
            slot.SetOverInItemEvent(ui.__mem_func__(self.__OverInEmotion))
            slot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutEmotion))
            slot.AppendSlotButton("d:/ymir work/ui/game/windows/btn_plus_up.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_over.sub",\
                                            "d:/ymir work/ui/game/windows/btn_plus_down.sub")

        for slotIdx, datadict in emotion.EMOTION_DICT.items():
            emotionIdx = slotIdx

            slot = self.soloEmotionSlot
            if app.ENABLE_EMOJI_UPDATE:
                if slotIdx > 50 and slotIdx < 101:
                    slot = self.dualEmotionSlot
                elif slotIdx >= 101:
                    slot = self.specialEmotionSlot
            else:
                if slotIdx > 50:
                    slot = self.dualEmotionSlot

            slot.SetEmotionSlot(slotIdx, emotionIdx)
            slot.SetCoverButton(slotIdx)

    def __SelectEmotion(self, slotIndex):
        if not slotIndex in emotion.EMOTION_DICT:
            return

        if app.IsPressed(app.DIK_LCONTROL):
            player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex)
            return

        mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex)

    def __ClickEmotionSlot(self, slotIndex):
        print "click emotion"
        if not slotIndex in emotion.EMOTION_DICT:
            return

        print "check acting"
        if player.IsActingEmotion():
            return

        command = emotion.EMOTION_DICT[slotIndex]["command"]
        print "command", command

        if slotIndex > 50 and slotIndex < 101:#ENABLE_EMOJI_UPDATE
            vid = player.GetTargetVID()

            if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid):
                import chat
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE)
                return

            command += " " + chr.GetNameByVID(vid)

        print "send_command", command
        net.SendChatPacket(command)

    def ActEmotion(self, emotionIndex):
        self.__ClickEmotionSlot(emotionIndex)

    def __OverInEmotion(self, slotIndex):
        if self.emotionToolTip:

            if not slotIndex in emotion.EMOTION_DICT:
                return

            self.emotionToolTip.ClearToolTip()
            self.emotionToolTip.SetTitle(emotion.EMOTION_DICT[slotIndex]["name"])
            self.emotionToolTip.AlignHorizonalCenter()
            self.emotionToolTip.ShowToolTip()

    def __OverOutEmotion(self):
        if self.emotionToolTip:
            self.emotionToolTip.HideToolTip()

    def __BindEvent(self):
        for i in xrange(len(self.skillGroupButton)):
            self.skillGroupButton[i].SetEvent(lambda arg=i: self.__SelectSkillGroup(arg))

        self.RefreshQuest()
        self.__HideJobToolTip()

        for (tabKey, tabButton) in self.tabButtonDict.items():
            tabButton.SetEvent(ui.__mem_func__(self.__OnClickTabButton), tabKey)

        if app.ENABLE_CONQUEROR_LEVEL:
            for (tabKey, tabButton) in self.tabSungmaButtonDict.items():
                tabButton.SetEvent(ui.__mem_func__(self.__OnClickTabSungmaButton), tabKey)

        for (statusPlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.SAFE_SetEvent(self.__OnClickStatusPlusButton, statusPlusKey)
            statusPlusButton.ShowToolTip = lambda arg=statusPlusKey: self.__OverInStatButton(arg)
            statusPlusButton.HideToolTip = lambda arg=statusPlusKey: self.__OverOutStatButton()

        for (statusMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.SAFE_SetEvent(self.__OnClickStatusMinusButton, statusMinusKey)
            statusMinusButton.ShowToolTip = lambda arg=statusMinusKey: self.__OverInStatMinusButton(arg)
            statusMinusButton.HideToolTip = lambda arg=statusMinusKey: self.__OverOutStatMinusButton()

        for titleBarValue in self.titleBarDict.itervalues():
            titleBarValue.SetCloseEvent(ui.__mem_func__(self.Hide))

        if app.ENABLE_QUEST_RENEWAL:
            self.questTitleBar.SetCloseEvent(ui.__mem_func__(self.Close))
            self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.__OnScrollQuest))

            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                self.questCategoryList[i].SetEvent(ui.__mem_func__(self.__OnClickQuestCategoryButton), i)
        else:
            self.questSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectQuest))

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            self.__LoadScript("UIScript/CharacterWindow.py")

            self.__BindObject()
            self.__BindEvent()
        except:
            import exception
            exception.Abort("CharacterWindow.__LoadWindow")

        [HASH=4622]#self.tabButtonDict[/HASH]["EMOTICON"].Disable()
        self.SetState("STATUS")
        if app.ENABLE_CONQUEROR_LEVEL:
            self.SetSubState("BASE")

    def Destroy(self):
        self.ClearDictionary()

        self.__Initialize()

    def Close(self):
        if 0 != self.toolTipSkill:
            self.toolTipSkill.Hide()
        if app.ENABLE_QUEST_RENEWAL:
            if self.questSlideWndNewKey > 0:
                if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                    self.questSlideWnd[self.questSlideWndNewKey-1].CloseSelf()

        self.Hide()

    def SetSkillToolTip(self, toolTipSkill):
        self.toolTipSkill = toolTipSkill

    if app.ENABLE_CONQUEROR_LEVEL:
        def __OnClickConquerorStatusPlusButton(self, statusKey):
            try:
                statusConquerorPlusCommand=self.statusConquerorPlusCommandDict[statusKey]
                net.SendChatPacket(statusConquerorPlusCommand)
            except KeyError, msg:
                dbg.TraceError("CharacterWindow.__OnClickStatusPlusButton KeyError: %s", msg)
               

    def __OnClickStatusPlusButton(self, statusKey):
        try:
            statusPlusCommand=self.statusPlusCommandDict[statusKey]
            net.SendChatPacket(statusPlusCommand)
        except KeyError, msg:
            dbg.TraceError("CharacterWindow.__OnClickStatusPlusButton KeyError: %s", msg)

    def __OnClickStatusMinusButton(self, statusKey):
        try:
            statusMinusCommand=self.statusMinusCommandDict[statusKey]
            net.SendChatPacket(statusMinusCommand)
        except KeyError, msg:
            dbg.TraceError("CharacterWindow.__OnClickStatusMinusButton KeyError: %s", msg)


    def __OnClickTabButton(self, stateKey):
        self.SetState(stateKey)

    if app.ENABLE_CONQUEROR_LEVEL:
        def __OnClickTabSungmaButton(self, stateKey):
            self.SetSubState(stateKey)

    def SetState(self, stateKey):

        self.state = stateKey
        if app.ENABLE_QUEST_RENEWAL:
            if stateKey != "QUEST":
                self.questPage.Hide()
                if self.questSlideWndNewKey > 0:
                    if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                        self.questSlideWnd[self.questSlideWndNewKey-1].CloseSelf()
            else:
                self.__LoadQuestCategory()
        for (tabKey, tabButton) in self.tabButtonDict.items():
            if stateKey!=tabKey:
                tabButton.SetUp()

        for tabValue in self.tabDict.itervalues():
            tabValue.Hide()

        for pageValue in self.pageDict.itervalues():
            pageValue.Hide()

        for titleBarValue in self.titleBarDict.itervalues():
            titleBarValue.Hide()

        self.titleBarDict[stateKey].Show()
        self.tabDict[stateKey].Show()
        self.pageDict[stateKey].Show()


    def GetState(self):
        return self.state

    if app.ENABLE_CONQUEROR_LEVEL:
        def SetSubState(self, stateSubKey):
           
            self.substate = stateSubKey

            for (tabKey, tabButton) in self.tabSungmaButtonDict.items():
                if stateSubKey!=tabKey:
                    tabButton.SetUp()

            for pageValue in self.SungmaPageDict.itervalues():
                pageValue.Hide()

            self.__RefreshStatusPlusButtonList()
            self.SungmaPageDict[stateSubKey].Show()
           

        def GetSubState(self):
            return self.substate  

    def __GetTotalAtkText(self):
        minAtk=player.GetStatus(player.ATT_MIN)
        maxAtk=player.GetStatus(player.ATT_MAX)
        atkBonus=player.GetStatus(player.ATT_BONUS)
        attackerBonus=player.GetStatus(player.ATTACKER_BONUS)

        if minAtk==maxAtk:
            return "%d" % (minAtk+atkBonus+attackerBonus)
        else:
            return "%d-%d" % (minAtk+atkBonus+attackerBonus, maxAtk+atkBonus+attackerBonus)

    def __GetTotalMagAtkText(self):
        minMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MIN_MAGIC_WEP)
        maxMagAtk=player.GetStatus(player.MAG_ATT)+player.GetStatus(player.MAX_MAGIC_WEP)

        if minMagAtk==maxMagAtk:
            return "%d" % (minMagAtk)
        else:
            return "%d-%d" % (minMagAtk, maxMagAtk)

    def __GetTotalDefText(self):
        defValue=player.GetStatus(player.DEF_GRADE)
        if constInfo.ADD_DEF_BONUS_ENABLE:
            defValue+=player.GetStatus(player.DEF_BONUS)
        return "%d" % (defValue)

    def RefreshStatus(self):
        if self.isLoaded==0:
            return

        try:
            if app.ENABLE_CONQUEROR_LEVEL:
                if player.GetStatus(player.CONQUEROR_LEVEL) >= 1:
                    self.GetChild("Level_Value").SetText(str(player.GetStatus(player.CONQUEROR_LEVEL)))
                    self.GetChild("Exp_Value").SetText(str(unsigned32(player.GetConquerorEXP())))
                    self.GetChild("RestExp_Value").SetText(str(unsigned32(player.GetStatus(player.CONQUEROR_NEXT_EXP)) - unsigned32(player.GetStatus(player.CONQUEROR_EXP))))
                else:
                    self.GetChild("Level_Value").SetText(str(player.GetStatus(player.LEVEL)))
                    self.GetChild("Exp_Value").SetText(str(unsigned32(player.GetEXP())))
                    self.GetChild("RestExp_Value").SetText(str(unsigned32(player.GetStatus(player.NEXT_EXP)) - unsigned32(player.GetStatus(player.EXP))))
                    self.GetChild("HP_Value").SetText(str(player.GetStatus(player.HP)) + '/' + str(player.GetStatus(player.MAX_HP)))
                    self.GetChild("SP_Value").SetText(str(player.GetStatus(player.SP)) + '/' + str(player.GetStatus(player.MAX_SP)))

                    self.GetChild("STR_Value").SetText(str(player.GetStatus(player.ST)))
                    self.GetChild("DEX_Value").SetText(str(player.GetStatus(player.DX)))
                    self.GetChild("HTH_Value").SetText(str(player.GetStatus(player.HT)))
                    self.GetChild("INT_Value").SetText(str(player.GetStatus(player.IQ)))

                    self.GetChild("ATT_Value").SetText(self.__GetTotalAtkText())
                    self.GetChild("DEF_Value").SetText(self.__GetTotalDefText())

                    self.GetChild("MATT_Value").SetText(self.__GetTotalMagAtkText())
            [HASH=4623]#self.GetChild([/HASH]"MATT_Value").SetText(str(player.GetStatus(player.MAG_ATT)))

                    self.GetChild("MDEF_Value").SetText(str(player.GetStatus(player.MAG_DEF)))
                    self.GetChild("ASPD_Value").SetText(str(player.GetStatus(player.ATT_SPEED)))
                    self.GetChild("MSPD_Value").SetText(str(player.GetStatus(player.MOVING_SPEED)))
                    self.GetChild("CSPD_Value").SetText(str(player.GetStatus(player.CASTING_SPEED)))
                    self.GetChild("ER_Value").SetText(str(player.GetStatus(player.EVADE_RATE)))

        except:
            [HASH=4624]#import[/HASH] exception
            [HASH=4625]#exception.Abort([/HASH]"CharacterWindow.RefreshStatus.BindObject")
            ## 게임이 튕겨 버림
            pass

        self.__RefreshStatusPlusButtonList()
        self.__RefreshStatusMinusButtonList()
        self.RefreshAlignment()

        if self.refreshToolTip:
            self.refreshToolTip()

    def __RefreshStatusPlusButtonList(self):
        if self.isLoaded==0:
            return
        if app.ENABLE_CONQUEROR_LEVEL:
            if self.GetSubState() == "SUNGMA":
                statusPlusPoint=player.GetStatus(player.CONQUEROR_POINT)
            else:
                statusPlusPoint=player.GetStatus(player.STAT)
        else:
            statusPlusPoint=player.GetStatus(player.STAT)

        if statusPlusPoint>0:
            self.statusPlusValue.SetText(str(statusPlusPoint))
            self.statusPlusLabel.Show()
            self.ShowStatusPlusButtonList()
        else:
            self.statusPlusValue.SetText(str(0))
            self.statusPlusLabel.Hide()
            self.HideStatusPlusButtonList()
    def __RefreshStatusMinusButtonList(self):ENABLE_CONQUEROR_LEVEL
        if self.isLoaded==0:
            return

        statusMinusPoint=self.__GetStatMinusPoint()

        if statusMinusPoint>0:
            self.__ShowStatusMinusButtonList()
        else:
            self.__HideStatusMinusButtonList()

    def RefreshAlignment(self):
        point, grade = player.GetAlignmentData()

        import colorInfo
        COLOR_DICT = {    0 : colorInfo.TITLE_RGB_GOOD_4,
                        1 : colorInfo.TITLE_RGB_GOOD_3,
                        2 : colorInfo.TITLE_RGB_GOOD_2,
                        3 : colorInfo.TITLE_RGB_GOOD_1,
                        4 : colorInfo.TITLE_RGB_NORMAL,
                        5 : colorInfo.TITLE_RGB_EVIL_1,
                        6 : colorInfo.TITLE_RGB_EVIL_2,
                        7 : colorInfo.TITLE_RGB_EVIL_3,
                        8 : colorInfo.TITLE_RGB_EVIL_4, }
        colorList = COLOR_DICT.get(grade, colorInfo.TITLE_RGB_NORMAL)
        gradeColor = ui.GenerateColor(colorList[0], colorList[1], colorList[2])

        self.toolTipAlignment.ClearToolTip()
        self.toolTipAlignment.AutoAppendTextLine(localeInfo.TITLE_NAME_LIST[grade], gradeColor)
        self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME + str(point))
        self.toolTipAlignment.AlignHorizonalCenter()

    def __ShowStatusMinusButtonList(self):
        for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.Show()

    def __HideStatusMinusButtonList(self):
        for (stateMinusKey, statusMinusButton) in self.statusMinusButtonDict.items():
            statusMinusButton.Hide()

    def ShowStatusPlusButtonList(self):
        for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.Show()

    def HideStatusPlusButtonList(self):
        for (statePlusKey, statusPlusButton) in self.statusPlusButtonDict.items():
            statusPlusButton.Hide()

    if app.ENABLE_CONQUEROR_LEVEL:
        def ShowConquerorStatusPlusButtonList(self):
            for (statePlusKey, statusPlusButton) in self.statusConquerorPlusButtonDict.items():
                statusPlusButton.Show()
               
        def HideConquerorStatusPlusButtonList(self):
            for (statePlusKey, statusPlusButton) in self.statusConquerorPlusButtonDict.items():
                statusPlusButton.Hide()
               
    def SelectSkill(self, skillSlotIndex):

        mouseController = mouseModule.mouseController

        if False == mouseController.isAttached():

            srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex)
            selectedSkillIndex = player.GetSkillIndex(srcSlotIndex)

            if skill.CanUseSkill(selectedSkillIndex):

                if app.IsPressed(app.DIK_LCONTROL):

                    player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex)
                    return

                mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex)

        else:

            mouseController.DeattachObject()

    def SelectEmptySlot(self, SlotIndex):
        mouseModule.mouseController.DeattachObject()

    ## ToolTip
    def OverInItem(self, slotNumber):

        if mouseModule.mouseController.isAttached():
            return

        if 0 == self.toolTipSkill:
            return

        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)
        skillIndex = player.GetSkillIndex(srcSlotIndex)
        skillLevel = player.GetSkillLevel(srcSlotIndex)
        skillGrade = player.GetSkillGrade(srcSlotIndex)
        skillType = skill.GetSkillType(skillIndex)

        ## ACTIVE
        if skill.SKILL_TYPE_ACTIVE == skillType:
            overInSkillGrade = self.__GetSkillGradeFromSlot(slotNumber)

            if overInSkillGrade == skill.SKILL_GRADE_COUNT-1 and skillGrade == skill.SKILL_GRADE_COUNT:
                self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)
            elif overInSkillGrade == skillGrade:
                self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, overInSkillGrade, skillLevel)
            else:
                self.toolTipSkill.SetSkillOnlyName(srcSlotIndex, skillIndex, overInSkillGrade)

        else:
            self.toolTipSkill.SetSkillNew(srcSlotIndex, skillIndex, skillGrade, skillLevel)

    def OverOutItem(self):
        if 0 != self.toolTipSkill:
            self.toolTipSkill.HideToolTip()

    ## Quest
    def __SelectQuest(self, slotIndex):
        if app.ENABLE_QUEST_RENEWAL:
            questIndex = self.questIndexMap[slotIndex]
            if not questIndex in self.questClicked:
                self.questClicked.append(questIndex)
        else:
            questIndex = quest.GetQuestIndex(self.questShowingStartIndex + slotIndex)

        import event
        event.QuestButtonClick(-2147483648 + questIndex)

    def RefreshQuest(self):
        if app.ENABLE_QUEST_RENEWAL:
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            for cat in self.questOpenedCategories:
                self.RefreshQuestCategory(cat)

            self.RefreshQuestCategoriesCount()
        else:
            if self.isLoaded==0:
                return

            self.OnQuestScroll()

            questCount = quest.GetQuestCount()
            questRange = range(quest.QUEST_MAX_NUM)

            if questCount > quest.QUEST_MAX_NUM:
                self.questScrollBar.Show()
            else:
                self.questScrollBar.Hide()

            for i in questRange[:questCount]:
                (questName, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(self.questShowingStartIndex + i)

                self.questNameList[i].SetText(questName)
                self.questNameList[i].Show()
                self.questLastCountList[i].Show()
                self.questLastTimeList[i].Show()

                if len(questCounterName) > 0:
                    self.questLastCountList[i].SetText("%s : %d" % (questCounterName, questCounterValue))
                else:
                    self.questLastCountList[i].SetText("")

                ## Icon
                self.questSlot.SetSlot(i, i, 1, 1, questIcon)

            for i in questRange[questCount:]:
                self.questNameList[i].Hide()
                self.questLastTimeList[i].Hide()
                self.questLastCountList[i].Hide()
                self.questSlot.ClearSlot(i)
                self.questSlot.HideSlotBaseImage(i)

            self.__UpdateQuestClock()

    def __UpdateQuestClock(self):
        if "QUEST" == self.state:
            if app.ENABLE_QUEST_RENEWAL:
                for clock in self.questClockList:
                    clockText = localeInfo.QUEST_UNLIMITED_TIME

                    if clock.GetProperty("idx"):
                        (lastName, lastTime) = quest.GetQuestLastTime(clock.GetProperty("idx"))

                        if len(lastName) > 0:
                            if lastTime <= 0:
                                clockText = localeInfo.QUEST_TIMEOVER
                            else:
                                questLastMinute = lastTime / 60
                                questLastSecond = lastTime % 60

                                clockText = lastName + " : "

                                if questLastMinute > 0:
                                    clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                                    if questLastSecond > 0:
                                        clockText += " "

                                if questLastSecond > 0:
                                    clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                    clock.SetText(clockText)
            else:
                # QUEST_LIMIT_COUNT_BUG_FIX
                for i in xrange(min(quest.GetQuestCount(), quest.QUEST_MAX_NUM)):
                # END_OF_QUEST_LIMIT_COUNT_BUG_FIX
                    (lastName, lastTime) = quest.GetQuestLastTime(i + self.questShowingStartIndex)

                    clockText = localeInfo.QUEST_UNLIMITED_TIME
                    if len(lastName) > 0:

                        if lastTime <= 0:
                            clockText = localeInfo.QUEST_TIMEOVER
                        else:
                            questLastMinute = lastTime / 60
                            questLastSecond = lastTime % 60

                            clockText = lastName + " : "

                            if questLastMinute > 0:
                                clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                                if questLastSecond > 0:
                                    clockText += " "

                            if questLastSecond > 0:
                                clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                    self.questLastTimeList[i].SetText(clockText)

    def __GetStatMinusPoint(self):
        POINT_STAT_RESET_COUNT = 112
        return player.GetStatus(POINT_STAT_RESET_COUNT)

    def __OverInStatMinusButton(self, stat):
        try:
            self.__ShowStatToolTip(self.STAT_MINUS_DESCRIPTION[stat] % self.__GetStatMinusPoint())
        except KeyError:
            pass

        self.refreshToolTip = lambda arg=stat: self.__OverInStatMinusButton(arg)

    def __OverOutStatMinusButton(self):
        self.__HideStatToolTip()
        self.refreshToolTip = 0

    def __OverInStatButton(self, stat):
        try:
            self.__ShowStatToolTip(self.STAT_DESCRIPTION[stat])
        except KeyError:
            pass

    def __OverOutStatButton(self):
        self.__HideStatToolTip()

    def __ShowStatToolTip(self, statDesc):
        self.toolTip.ClearToolTip()
        self.toolTip.AppendTextLine(statDesc)
        self.toolTip.Show()

    def __HideStatToolTip(self):
        self.toolTip.Hide()

    def OnPressEscapeKey(self):
        if app.ENABLE_QUEST_RENEWAL:
            if self.questSlideWndNewKey > 0:
                if self.questSlideWnd[self.questSlideWndNewKey-1] is not None:
                    self.questSlideWnd[self.questSlideWndNewKey-1].OnPressEscapeKey()
        self.Close()
        return True

    def OnUpdate(self):
        self.__UpdateQuestClock()

    ## Skill Process
    def __RefreshSkillPage(self, name, slotCount):
        global SHOW_LIMIT_SUPPORT_SKILL_LIST

        skillPage = self.skillPageDict[name]

        startSlotIndex = skillPage.GetStartIndex()
        if "ACTIVE" == name:
            if self.PAGE_HORSE == self.curSelectedSkillGroup:
                startSlotIndex += slotCount

        getSkillType=skill.GetSkillType
        getSkillIndex=player.GetSkillIndex
        getSkillGrade=player.GetSkillGrade
        getSkillLevel=player.GetSkillLevel
        getSkillLevelUpPoint=skill.GetSkillLevelUpPoint
        getSkillMaxLevel=skill.GetSkillMaxLevel

        for i in xrange(slotCount+1):
            slotIndex = i + startSlotIndex
            skillIndex = getSkillIndex(slotIndex)
            if app.ENABLE_SLOT_WINDOW_EX:
                activeList = {}
                cooltmList = {}

            for j in xrange(skill.SKILL_GRADE_COUNT):
                realSlotIndex = self.__GetRealSkillSlot(j, i)
                if app.ENABLE_SLOT_WINDOW_EX:
                    activeList[realSlotIndex] = skillPage.IsActivatedSlot(realSlotIndex)
                    cooltmList[realSlotIndex] = skillPage.GetSlotCoolTime(realSlotIndex)
                skillPage.ClearSlot(realSlotIndex)

            if 0 == skillIndex:
                continue

            skillGrade = getSkillGrade(slotIndex)
            skillLevel = getSkillLevel(slotIndex)
            skillType = getSkillType(skillIndex)

            ## 승마 스킬 예외 처리
            if player.SKILL_INDEX_RIDING == skillIndex:
                if 1 == skillGrade:
                    skillLevel += 19
                elif 2 == skillGrade:
                    skillLevel += 29
                elif 3 == skillGrade:
                    skillLevel = 40

                skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel)
                skillPage.SetSlotCount(slotIndex, skillLevel)

            ## ACTIVE
            elif skill.SKILL_TYPE_ACTIVE == skillType:
                for j in xrange(skill.SKILL_GRADE_COUNT):
                    realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
                    skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
                    skillPage.SetCoverButton(realSlotIndex)

                    if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1):
                        skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
                    elif (not self.__CanUseSkillNow()) or (skillGrade != j):
                        skillPage.SetSlotCount(realSlotIndex, 0)
                        skillPage.DisableCoverButton(realSlotIndex)
                    else:
                        skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)

                    if app.ENABLE_SLOT_WINDOW_EX:
                        isActive = activeList.get(realSlotIndex, False)
                        coolTime,elapsedTime = cooltmList.get(realSlotIndex, (0,0))
                        if isActive:
                            skillPage.ActivateSlot(realSlotIndex)
                        if coolTime:
                            skillPage.SetSlotCoolTime(realSlotIndex, coolTime, elapsedTime)
            ## 그외
            else:
                if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
                    realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
                    skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
                    skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)

                    if skill.CanUseSkill(skillIndex):
                        skillPage.SetCoverButton(realSlotIndex)

            skillPage.RefreshSlot()

    def RefreshSkill(self):

        if self.isLoaded==0:
            return

        if self.__IsChangedHorseRidingSkillLevel():
            self.RefreshCharacter()
            return


        global SHOW_ONLY_ACTIVE_SKILL
        if SHOW_ONLY_ACTIVE_SKILL:
            self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
        else:
            self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
            self.__RefreshSkillPage("SUPPORT", self.SUPPORT_PAGE_SLOT_COUNT)

        self.RefreshSkillPlusButtonList()

    def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint):

        ## 스킬이 있으면
        if 0 == skillIndex:
            return False

        ## 레벨업 조건을 만족한다면
        if not skill.CanLevelUpSkill(skillIndex, skillLevel):
            return False

        return True

    def __RefreshSkillPlusButton(self, name):
        global HIDE_SUPPORT_SKILL_POINT
        if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name:
            return

        slotWindow = self.skillPageDict[name]
        slotWindow.HideAllSlotButton()

        slotStatType = self.skillPageStatDict[name]
        if 0 == slotStatType:
            return

        statPoint = player.GetStatus(slotStatType)
        startSlotIndex = slotWindow.GetStartIndex()
        if "HORSE" == name:
            startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT

        if statPoint > 0:
            for i in xrange(self.PAGE_SLOT_COUNT):
                slotIndex = i + startSlotIndex
                skillIndex = player.GetSkillIndex(slotIndex)
                skillGrade = player.GetSkillGrade(slotIndex)
                skillLevel = player.GetSkillLevel(slotIndex)

                if skillIndex == 0:
                    continue
                if skillGrade != 0:
                    continue

                if name == "HORSE":
                    if player.GetStatus(player.LEVEL) >= skill.GetSkillLevelLimit(skillIndex):
                        if skillLevel < 20:
                            slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex))

                else:
                    if "SUPPORT" == name:
                        if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
                            if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
                                slotWindow.ShowSlotButton(slotIndex)
                    else:
                        if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
                            slotWindow.ShowSlotButton(slotIndex)


    def RefreshSkillPlusButtonList(self):

        if self.isLoaded==0:
            return

        self.RefreshSkillPlusPointLabel()

        if not self.__CanUseSkillNow():
            return

        try:
            if self.PAGE_HORSE == self.curSelectedSkillGroup:
                self.__RefreshSkillPlusButton("HORSE")
            else:
                self.__RefreshSkillPlusButton("ACTIVE")

            self.__RefreshSkillPlusButton("SUPPORT")

        except:
            import exception
            exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject")

    def RefreshSkillPlusPointLabel(self):
        if self.isLoaded==0:
            return

        if self.PAGE_HORSE == self.curSelectedSkillGroup:
            activeStatPoint = player.GetStatus(player.SKILL_HORSE)
            self.activeSkillPointValue.SetText(str(activeStatPoint))

        else:
            activeStatPoint = player.GetStatus(player.SKILL_ACTIVE)
            self.activeSkillPointValue.SetText(str(activeStatPoint))

        supportStatPoint = max(0, player.GetStatus(player.SKILL_SUPPORT))
        self.supportSkillPointValue.SetText(str(supportStatPoint))

    ## Skill Level Up Button
    def OnPressedSlotButton(self, slotNumber):
        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotNumber)

        skillIndex = player.GetSkillIndex(srcSlotIndex)
        curLevel = player.GetSkillLevel(srcSlotIndex)
        maxLevel = skill.GetSkillMaxLevel(skillIndex)

        net.SendChatPacket("/skillup " + str(skillIndex))

    ## Use Skill
    def ClickSkillSlot(self, slotIndex):

        srcSlotIndex = self.__RealSkillSlotToSourceSlot(slotIndex)
        skillIndex = player.GetSkillIndex(srcSlotIndex)
        skillType = skill.GetSkillType(skillIndex)

        if not self.__CanUseSkillNow():
            if skill.SKILL_TYPE_ACTIVE == skillType:
                return

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if skill.CanUseSkill(skillIndex):
                    player.ClickSkillSlot(srcSlotIndex)
                    return

        mouseModule.mouseController.DeattachObject()

    ## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다.
    ##         매우 불합리. 구조 자체를 개선해야 할듯.
    def OnUseSkill(self, slotIndex, coolTime):

        skillIndex = player.GetSkillIndex(slotIndex)
        skillType = skill.GetSkillType(skillIndex)

        ## ACTIVE
        if skill.SKILL_TYPE_ACTIVE == skillType:
            skillGrade = player.GetSkillGrade(slotIndex)
            slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
        ## ETC
        else:
            slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                slotWindow.SetSlotCoolTime(slotIndex, coolTime)
                return

    def OnActivateSkill(self, slotIndex):

        skillGrade = player.GetSkillGrade(slotIndex)
        slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if app.ENABLE_ACCE_SYSTEM:
                    slotWindow.ActivateSlotOld(slotIndex)
                else:
                    slotWindow.ActivateSlot(slotIndex)
                return

    def OnDeactivateSkill(self, slotIndex):

        skillGrade = player.GetSkillGrade(slotIndex)
        slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)

        for slotWindow in self.skillPageDict.values():
            if slotWindow.HasSlot(slotIndex):
                if app.ENABLE_ACCE_SYSTEM:
                    slotWindow.DeactivateSlotOld(slotIndex)
                else:
                    slotWindow.DeactivateSlot(slotIndex)
                return

    def __ShowJobToolTip(self):
        self.toolTipJob.ShowToolTip()

    def __HideJobToolTip(self):
        self.toolTipJob.HideToolTip()

    def __SetJobText(self, mainJob, subJob):
        if player.GetStatus(player.LEVEL)<5:
            subJob=0

        if 949 == app.GetDefaultCodePage():
            self.toolTipJob.ClearToolTip()

            try:
                jobInfoTitle=localeInfo.JOBINFO_TITLE[mainJob][subJob]
                jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob]
            except IndexError:
                print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob)
                return

            self.toolTipJob.AutoAppendTextLine(jobInfoTitle)
            self.toolTipJob.AppendSpace(5)

            for jobInfoDataLine in jobInfoData:
                self.toolTipJob.AutoAppendTextLine(jobInfoDataLine)

            self.toolTipJob.AlignHorizonalCenter()

    def __ShowAlignmentToolTip(self):
        self.toolTipAlignment.ShowToolTip()

    def __HideAlignmentToolTip(self):
        self.toolTipAlignment.HideToolTip()

    if app.ENABLE_CONQUEROR_LEVEL:
        def __ShowHTHToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_CON)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideHTHToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        def __ShowINTToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_INT)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideINTToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        def __ShowSTRToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_STR)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideSTRToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
           
        def __ShowDEXToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_DEX)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideDEXToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()

        ###############################################################################
        def __ShowBaseToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_BASE_LEVEL)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideBaseToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ###
        def __ShowSungmaToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_CONQUEROR_LEVEL)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideSungmaToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()          
       
        ###
       
        def __ShowMSPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MOVE_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMSPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ####
        def __ShowASPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_ATT_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideASPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ###  
        def __ShowCSPDToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_CAST_SPEED)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideCSPDToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
           
        ###  
        def __ShowMATTToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MAG_ATT)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMATTToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
           
        ###  
        def __ShowMDEFToolTip(self):
            self.toolTipConquerorInfoButton.ClearToolTip()
            self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_MAG_DEF)
            self.toolTipConquerorInfoButton.AlignHorizonalCenter()
           
            self.toolTipConquerorInfoButton.ShowToolTip()

        def __HideMDEFToolTip(self):
            self.toolTipConquerorInfoButton.HideToolTip()
        ##############################################################################################  
    def RefreshCharacter(self):

        if self.isLoaded==0:
            return

        ## Name
        try:
            characterName = player.GetName()
            guildName = player.GetGuildName()
            self.characterNameValue.SetText(characterName)
            self.guildNameValue.SetText(guildName)
            if not guildName:
                if localeInfo.IsARABIC():
                    self.characterNameSlot.SetPosition(190, 34)
                else:
                    self.characterNameSlot.SetPosition(109, 34)

                self.guildNameSlot.Hide()
            else:
                if localeInfo.IsJAPAN():
                    self.characterNameSlot.SetPosition(143, 34)
                else:
                    self.characterNameSlot.SetPosition(153, 34)
                self.guildNameSlot.Show()
        except:
            import exception
            exception.Abort("CharacterWindow.RefreshCharacter.BindObject")

        race = net.GetMainActorRace()
        group = net.GetMainActorSkillGroup()
        empire = net.GetMainActorEmpire()

        ## Job Text
        job = chr.RaceToJob(race)
        self.__SetJobText(job, group)

        ## FaceImage
        try:
            faceImageName = FACE_IMAGE_DICT[race]

            try:
                self.faceImage.LoadImage(faceImageName)
            except:
                print "CharacterWindow.RefreshCharacter(race=%d, faceImageName=%s)" % (race, faceImageName)
                self.faceImage.Hide()

        except KeyError:
            self.faceImage.Hide()

        ## GroupName
        self.__SetSkillGroupName(race, group)

        ## Skill
        if 0 == group:
            self.__SelectSkillGroup(0)

        else:
            self.__SetSkillSlotData(race, group, empire)

            if self.__CanUseHorseSkill():
                self.__SelectSkillGroup(0)

    def __SetSkillGroupName(self, race, group):

        job = chr.RaceToJob(race)

        if not self.SKILL_GROUP_NAME_DICT.has_key(job):
            return

        nameList = self.SKILL_GROUP_NAME_DICT[job]

        if 0 == group:
            self.skillGroupButton1.SetText(nameList[1])
            self.skillGroupButton2.SetText(nameList[2])
            self.skillGroupButton1.Show()
            self.skillGroupButton2.Show()
            self.activeSkillGroupName.Hide()

            ## 수인족은 직군이 하나이므로 한개만 표시
            if app.ENABLE_WOLFMAN_CHARACTER and playerSettingModule.RACE_WOLFMAN_M == race:
                self.skillGroupButton2.Hide()
        else:

            if self.__CanUseHorseSkill():
                self.activeSkillGroupName.Hide()
                self.skillGroupButton1.SetText(nameList.get(group, "Noname"))
                self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE)
                self.skillGroupButton1.Show()
                self.skillGroupButton2.Show()

            else:
                self.activeSkillGroupName.SetText(nameList.get(group, "Noname"))
                self.activeSkillGroupName.Show()
                self.skillGroupButton1.Hide()
                self.skillGroupButton2.Hide()

    def __SetSkillSlotData(self, race, group, empire=0):

        ## SkillIndex
        playerSettingModule.RegisterSkill(race, group, empire)

        ## Event
        self.__SetSkillSlotEvent()

        ## Refresh
        self.RefreshSkill()

    def __SelectSkillGroup(self, index):
        for btn in self.skillGroupButton:
            btn.SetUp()
        self.skillGroupButton[index].Down()

        if self.__CanUseHorseSkill():
            if 0 == index:
                index = net.GetMainActorSkillGroup()-1
            elif 1 == index:
                index = self.PAGE_HORSE

        self.curSelectedSkillGroup = index
        self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire())

    def __CanUseSkillNow(self):
        if 0 == net.GetMainActorSkillGroup():
            return False

        return True

    def __CanUseHorseSkill(self):

        slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING)

        if not slotIndex:
            return False

        grade = player.GetSkillGrade(slotIndex)
        level = player.GetSkillLevel(slotIndex)
        if level < 0:
            level *= -1
        if grade >= 1 and level >= 1:
            return True

        return False

    def __IsChangedHorseRidingSkillLevel(self):
        ret = False

        if -1 == self.canUseHorseSkill:
            self.canUseHorseSkill = self.__CanUseHorseSkill()

        if self.canUseHorseSkill != self.__CanUseHorseSkill():
            ret = True

        self.canUseHorseSkill = self.__CanUseHorseSkill()
        return ret

    def __GetRealSkillSlot(self, skillGrade, skillSlot):
        return skillSlot + min(skill.SKILL_GRADE_COUNT-1, skillGrade)*skill.SKILL_GRADE_STEP_COUNT

    def __GetETCSkillRealSlotIndex(self, skillSlot):
        if skillSlot > 100:
            return skillSlot
        return skillSlot % self.ACTIVE_PAGE_SLOT_COUNT

    def __RealSkillSlotToSourceSlot(self, realSkillSlot):
        if realSkillSlot > 100:
            return realSkillSlot
        if self.PAGE_HORSE == self.curSelectedSkillGroup:
            return realSkillSlot + self.ACTIVE_PAGE_SLOT_COUNT
        return realSkillSlot % skill.SKILL_GRADE_STEP_COUNT

    def __GetSkillGradeFromSlot(self, skillSlot):
        return int(skillSlot / skill.SKILL_GRADE_STEP_COUNT)

    def SelectSkillGroup(self, index):
        self.__SelectSkillGroup(index)

    def OnQuestScroll(self):
        questCount = quest.GetQuestCount()
        scrollLineCount = max(0, questCount - quest.QUEST_MAX_NUM)
        startIndex = int(scrollLineCount * self.questScrollBar.GetPos())

        if startIndex != self.questShowingStartIndex:
            self.questShowingStartIndex = startIndex
            self.RefreshQuest()

    if app.ENABLE_QUEST_RENEWAL:
        def __OnScrollQuest(self):
            if self.state != "QUEST":
                return

            curPos = self.questScrollBar.GetPos()
            if math.fabs(curPos - self.questLastScrollPosition) >= 0.001:
                self.RerenderQuestPage()
                self.questLastScrollPosition = curPos

        def ResetQuestScroll(self):
            self.questScrollBar.Hide()

            if self.questScrollBar.GetPos() != 0:
                self.questScrollBar.SetPos(0)

        def RerenderQuestPage(self):
            overflowingY = self.displayY - self.MAX_QUEST_PAGE_HEIGHT
            if overflowingY < 0:
                overflowingY = 0

            self.baseCutY = math.ceil(overflowingY * self.questScrollBar.GetPos())
            self.displayY = 0
            self.RearrangeQuestCategories(xrange(quest.QUEST_CATEGORY_MAX_NUM))
            self.RefreshQuestCategory()

            if overflowingY > 0:
                if (len(self.questOpenedCategories)) == 0:
                    self.ResetQuestScroll()
                else:
                    self.questScrollBar.Show()
            else:
                self.ResetQuestScroll()

        def __LoadQuestCategory(self):
            self.questPage.Show()

            if self.isLoaded == 0:
                return

            for i in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                category = self.questCategoryList[i]

                categoryName = category.GetProperty("name")
                if not categoryName:
                    category.SetProperty("name", category.GetText())
                    categoryName = category.GetText()

                questCount = self.GetQuestCountInCategory(i)
                self.questCategoryList[i].SetTextAlignLeft(categoryName + " (" + str(questCount) + ")")
                self.questCategoryList[i].SetTextColor(self.GetQuestCategoryColor(i))
                self.questCategoryList[i].SetQuestLabel(quest_lable_expend_img_path_dict[i], self.GetQuestCountInCategory(i))
                self.questCategoryList[i].Show()

            self.RefreshQuestCategory()
            if self.isQuestCategoryLoad == False:
                self.questScrollBar.Hide()
            else:
                self.RerenderQuestPage()

            self.isQuestCategoryLoad = True

        def GetQuestCategoryColor(self, category):
            return self.questColorList["default_title"]

        def GetQuestProperties(self, questName):
            findString = {
                "*" : "blue",
                "&" : "green",
                "~" : "golden"
            }

            if questName[0] in findString:
                return (questName[1:], findString[questName[0]])

            return (questName, None)

        def IsQuestCategoryOpen(self, category):
            return (category in self.questOpenedCategories)

        def ToggleCategory(self, category):
            if self.IsQuestCategoryOpen(category):
                self.CloseQuestCategory(category)
            else:
                self.OpenQuestCategory(category)

        def RearrangeQuestCategories(self, categoryRange):
            i = 0
            for i in categoryRange:
                if (self.displayY - self.baseCutY) >= 0 and (self.displayY - self.baseCutY) < self.MAX_QUEST_PAGE_HEIGHT - 20:
                    self.questCategoryList[i].SetPosition(13, (self.displayY - self.baseCutY) + 10)
                    self.questCategoryList[i].Show()
                else:
                    self.questCategoryList[i].Hide()

                self.displayY += 20
                self.questCategoryRenderPos[i] = self.displayY

        def CloseQuestCategory(self, category):
            self.questCategoryList[category].CloseCategory(self.GetQuestCountInCategory(category))

            if category in self.questOpenedCategories:
                self.questOpenedCategories.remove(category)

            for currentSlot in self.questSlotList:
                if currentSlot.GetProperty("category") == category:
                    currentSlot.Hide()
                    self.displayY -= currentSlot.GetHeight()

            self.RerenderQuestPage()

        def OpenQuestCategory(self, category):
            if self.GetQuestCountInCategory(category) == 0:
                return

            while len(self.questOpenedCategories) >= self.questMaxOpenedCategories:
                openedCategories = self.questOpenedCategories.pop()
                self.CloseQuestCategory(openedCategories)

            self.questCategoryList[category].OpenCategory(self.GetQuestCountInCategory(category))
            self.questOpenedCategories.append(category)
            self.RefreshQuestCategory(category)
            self.RerenderQuestPage()

        def RefreshQuestCategory(self, category = -1):
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            categories = []
            if category == -1:
                categories = self.questOpenedCategories
            elif not category in self.questOpenedCategories:
                self.OpenQuestCategory(category)
                return
            else:
                categories.append(category)

            for currentCategory in categories:
                self.displayY = self.questCategoryRenderPos[currentCategory]

                self.LoadCategory(currentCategory)
                self.RearrangeQuestCategories(xrange(currentCategory + 1, quest.QUEST_CATEGORY_MAX_NUM))

        def RefreshQuestCategoriesCount(self):
            for category in xrange(quest.QUEST_CATEGORY_MAX_NUM):
                categoryName = self.questCategoryList[category].GetProperty("name")
                questCount = self.GetQuestCountInCategory(category)
                self.questCategoryList[category].SetTextAlignLeft(categoryName + " (" + str(questCount) + ")")

        def RefreshQuest(self):
            if self.isLoaded == 0 or self.state != "QUEST":
                return

            for category in self.questOpenedCategories:
                self.RefreshQuestCategory(category)

            self.RefreshQuestCategoriesCount()

        def CreateQuestSlot(self, name):
            for questSlot in self.questSlotList:
                if questSlot.GetWindowName() == name:
                    return questSlot

            pyScrLoader = ui.PythonScriptLoader()
            slot = ui.ListBar()
            pyScrLoader.LoadElementListBar(slot, quest_slot_listbar, self.questPage)

            slot.SetParent(self.quest_page_board_window)
            slot.SetWindowName(name)
            slot.Hide()
            self.questSlotList.append(slot)
            return slot

        def SetQuest(self, slot, questID, questName, questCounterName, questCounterValue):
            (name, color) = self.GetQuestProperties(questName)
            slot.SetTextAlignLeft(name, 20)
            if color:
                slot.SetTextColor(self.questColorList[color])
            slot.SetEvent(ui.__mem_func__(self.__SelectQuest), questID)
            slot.SetWindowHorizontalAlignLeft()
            slot.Show()

        def LoadCategory(self, category):
            self.questIndexMap = {}
            self.questCounterList = []
            self.questClockList = []
            self.questSeparatorList = []

            for questSlot in self.questSlotList:
                questSlot.Hide()

            questCount = 0
            for questIdx in self.GetQuestsInCategory(category):
                questCount += 1
                (questID, questIndex, questName, questCategory, _, questCounterName, questCounterValue) = questIdx
                (lastName, lastTime) = quest.GetQuestLastTime(questID)

                slot = self.CreateQuestSlot("QuestSlotList_" + str(questCategory) + "_" + str(questID))

                slot.SetPosition(0, (self.displayY - self.baseCutY))
                slot.SetParent(self.quest_page_board_window)
                baseDisplayY = self.displayY

                ## -- Quest Counter
                hasCounter = False
                if questCounterName != "":
                    self.displayY += 15

                    counter = ui.TextLine()
                    counter.SetParent(slot)
                    counter.SetPosition(20, 20 - 2.5)
                    counter.SetText(questCounterName + ": " + str(questCounterValue))
                    counter.Show()

                    self.questCounterList.append(counter)
                    hasCounter = True
                ## -- Quest Counter

                ## -- Quest Clock
                self.displayY += 15

                clockText = localeInfo.QUEST_UNLIMITED_TIME
                if len(lastName) > 0:
                    if lastTime <= 0:
                        clockText = localeInfo.QUEST_TIMEOVER
                    else:
                        questLastMinute = lastTime / 60
                        questLastSecond = lastTime % 60

                        clockText = lastName + " : "

                        if questLastMinute > 0:
                            clockText += str(questLastMinute) + localeInfo.QUEST_MIN
                            if questLastSecond > 0:
                                clockText += " "

                        if questLastSecond > 0:
                            clockText += str(questLastSecond) + localeInfo.QUEST_SEC

                clock = ui.TextLine()
                clock.SetParent(slot)
                clock.SetPosition(20, 20 + (int(hasCounter) * 14) - 2.5)
                clock.SetText(clockText)
                clock.SetProperty("idx", questID)
                self.questClockList.append(clock)
                clock.Show()
                ## -- Quest Clock

                ## -- Quest Separator
                self.displayY += 5
                if questCount < self.GetQuestCountInCategory(category):
                    seperator = ui.ImageBox()
                    seperator.SetParent(slot)
                    seperator.SetPosition(4, 20 + (int(hasCounter) * 14 - 2.5) + 15)
                    seperator.LoadImage("d:/ymir work/ui/quest_re/quest_list_line_01.tga")
                    seperator.Show()
                    self.questSeparatorList.append(seperator)
                ## -- Quest Separator

                slot.SetProperty("category", questCategory)

                if questIndex in self.questClicked:
                    slot.OnClickEvent()

                if (baseDisplayY - self.baseCutY) + 2 >= 0 and (baseDisplayY - self.baseCutY) + 2 < self.MAX_QUEST_PAGE_HEIGHT - 30:
                    self.questIndexMap[questID] = questIndex
                    self.SetQuest(slot, questID, questName, questCounterName, questCounterValue)

                self.displayY += 15

            newList = []
            for questSlot in self.questSlotList:
                if questSlot.IsShow():
                    newList.append(questSlot)

            self.questSlotList = newList

        def __OnClickQuestCategoryButton(self, category):
            self.ToggleCategory(category)

        def GetQuestsInCategory(self, category, retCount = False):
            questList = []
            count = 0
            for i in xrange(quest.GetQuestCount()):
                (questIndex, questName, questCategory, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(i)
                if questCategory == category:
                    count += 1
                    questList.append((i, questIndex, questName, questCategory, questIcon, questCounterName, questCounterValue))

            if retCount:
                return count

            return questList

        def GetQuestCountInCategory(self, category):
            return self.GetQuestsInCategory(category, True)


Aldığım syserr hatası.:
0613 23:58:02807 ::
networkModule.py(line:200) SetSelectCharacterPhase
system.py(line:177) __hybrid_import
system.py(line:142) _process_result
introSelect.py(line:25) <module>
system.py(line:177) __hybrid_import

networkModule.SetSelectCharacterPhase - <type 'exceptions.IndentationError'>:unexpected indent (uiCharacter.py, line 816)

0613 23:58:02807 :: ============================================================================================================
0613 23:58:02807 :: Abort!!!!
uiCharacter.py dosyasında hatalı ekleme yapmışsın 816. satırı ss at
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst