#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package GM.Commands.OpenFunc  
 | 
#  
 | 
# @todo:¹¦ÄÜ¿ªÆô  
 | 
# @author hxp  
 | 
# @date 2017-12-21  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ¹¦ÄÜ¿ªÆô  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2017-12-21 12:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import PlayerPrestigeSys  
 | 
import PlayerMagicWeapon  
 | 
import IpyGameDataPY  
 | 
import GameFuncComm  
 | 
import ChConfig  
 | 
import ShareDefine  
 | 
  
 | 
## GMÃüÁîÖ´ÐÐÈë¿Ú  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param list ²ÎÊýÁÐ±í  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnExec(curPlayer, cmdList):  
 | 
    GameWorld.DebugAnswer(curPlayer, "--------------")  
 | 
    if not cmdList:  
 | 
        GameWorld.DebugAnswer(curPlayer, "¿ªÆôËùÓй¦ÄÜ: OpenFunc 1")  
 | 
        GameWorld.DebugAnswer(curPlayer, "¿ªÆôÖ¸¶¨¹¦ÄÜ: OpenFunc 1 ¹¦ÄÜID")  
 | 
        GameWorld.DebugAnswer(curPlayer, "¹Ø±ÕËùÓй¦ÄÜ: OpenFunc 0")  
 | 
        GameWorld.DebugAnswer(curPlayer, "¹Ø±ÕÖ¸¶¨¹¦ÄÜ: OpenFunc 0 ¹¦ÄÜID")  
 | 
    else:  
 | 
        state = cmdList[0]  
 | 
        if not state:  
 | 
            closeFuncID = cmdList[1] if len(cmdList) > 1 else 0  
 | 
            DoGMCloseFunc(curPlayer, closeFuncID)  
 | 
        else:  
 | 
            openFuncID = cmdList[1] if len(cmdList) > 1 else 0  
 | 
            DoGMOpenFunc(curPlayer, openFuncID)  
 | 
              
 | 
    PrintFuncOpenState(curPlayer)  
 | 
    return  
 | 
  
 | 
def PrintFuncOpenState(curPlayer):  
 | 
    openFuncIDList = []  
 | 
    unOpenFuncIDList = []  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()  
 | 
    for i in xrange(funcOpenLVCount):  
 | 
        ipyData = ipyDataMgr.GetFuncOpenLVByIndex(i)  
 | 
        funcID = ipyData.GetFuncId()  
 | 
        isOpen = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, True)  
 | 
        if isOpen:  
 | 
            openFuncIDList.append(funcID)  
 | 
        else:  
 | 
            unOpenFuncIDList.append(funcID)  
 | 
              
 | 
    GameWorld.DebugAnswer(curPlayer, "ÒÑ¿ªÆôµÄ¹¦ÄÜÊý: %s/%s" % (len(openFuncIDList), funcOpenLVCount))  
 | 
    if len(openFuncIDList) < len(unOpenFuncIDList):  
 | 
        for i in range((funcOpenLVCount/10) + 1):  
 | 
            openList = openFuncIDList[i*10:(i+1)*10]  
 | 
            if not openList:  
 | 
                break  
 | 
            GameWorld.DebugAnswer(curPlayer, "%s" % openList)  
 | 
              
 | 
    GameWorld.DebugAnswer(curPlayer, "먦ÆôµÄ¹¦ÄÜ: %s/%s" % (len(unOpenFuncIDList), funcOpenLVCount))  
 | 
    if len(unOpenFuncIDList) < len(openFuncIDList):  
 | 
        for i in range((funcOpenLVCount/10) + 1):  
 | 
            unOpenList = unOpenFuncIDList[i*10:(i+1)*10]  
 | 
            if not unOpenList:  
 | 
                break  
 | 
            GameWorld.DebugAnswer(curPlayer, "%s" % unOpenList)  
 | 
    return  
 | 
  
 | 
def DoGMOpenFunc(curPlayer, openFuncID=0):  
 | 
    openFuncIDList = []  
 | 
    if openFuncID:  
 | 
        if GameFuncComm.GetFuncCanUse(curPlayer, openFuncID):  
 | 
            GameWorld.DebugLog("¹¦ÄÜÒÑ¿ªÆô£¬²»ÐèÒªÖØ¸´¼¤»î!openFuncID=%s" % openFuncID, curPlayer.GetPlayerID())  
 | 
            return  
 | 
        openFuncIDList = [openFuncID]  
 | 
          
 | 
    if openFuncIDList:  
 | 
        needLV, needMagicWeaponIDList, needRealmLV, needMissionIDList = __GetOpenFuncLimit(openFuncIDList)  
 | 
        if needMagicWeaponIDList:  
 | 
            openFuncIDList.append(ShareDefine.GameFuncID_MagicWeapon)  
 | 
        if needRealmLV:  
 | 
            openFuncIDList.append(ShareDefine.GameFuncID_Official)  
 | 
    needLV, needMagicWeaponIDList, needRealmLV, needMissionIDList = __GetOpenFuncLimit(openFuncIDList)  
 | 
      
 | 
    GameWorld.DebugLog("GM´¦ÀíµÈ¼¶¿ªÆô¹¦ÄÜ: openFuncID=%s,openFuncIDList=%s,needLV=%s" % (openFuncID, openFuncIDList, needLV), curPlayer.GetPlayerID())  
 | 
      
 | 
    # ÓÅÏÈ´¦ÀíÉý¼¶          
 | 
    if needLV:  
 | 
        preLV = needLV - 1  
 | 
        curPlayer.SetLV(preLV)  
 | 
        PlayerControl.SetPlayerTotalExp(curPlayer, PlayerControl.GetTotalExpByPlayerLv(preLV))  
 | 
        PlayerControl.PlayerControl(curPlayer).PlayerLvUp()  
 | 
              
 | 
    GameWorld.DebugLog("GM´¦Àí·¨±¦¿ªÆô¹¦ÄÜ: needMagicWeaponIDList=%s" % needMagicWeaponIDList, curPlayer.GetPlayerID())  
 | 
    for mwIDKey in needMagicWeaponIDList:  
 | 
        mwID, mwLV = mwIDKey/100, mwIDKey%100  
 | 
        for lv in xrange(mwLV+1):  
 | 
            PlayerMagicWeapon.DoActiveMW(curPlayer, mwID, lv)  
 | 
          
 | 
          
 | 
    GameWorld.DebugLog("GM´¦Àí¾³½ç¿ªÆô¹¦ÄÜ: needRealmLV=%s" % needRealmLV, curPlayer.GetPlayerID())  
 | 
    if needRealmLV:  
 | 
        curPlayer.SetOfficialRank(needRealmLV - 1)  
 | 
        PlayerPrestigeSys.DoRealmLVUpLogic(curPlayer)  
 | 
          
 | 
    GameWorld.DebugLog("GM´¦ÀíÈÎÎñ¿ªÆô¹¦ÄÜ: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())  
 | 
    #×îºóÇ¿ÖÆ´¥·¢Ò»´Î  
 | 
    #if needMissionIDList:  
 | 
    GameFuncComm.DoFuncOpenLogic(curPlayer, needMissionIDList)  
 | 
    return  
 | 
  
 | 
def __GetOpenFuncLimit(openFuncIDList):  
 | 
    maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV")  
 | 
    needLV = 0  
 | 
    needRealmLV = 0  
 | 
    needMissionIDList = []  
 | 
    needMagicWeaponIDList = []  
 | 
      
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()  
 | 
    for i in xrange(funcOpenLVCount):  
 | 
        ipyData = ipyDataMgr.GetFuncOpenLVByIndex(i)  
 | 
        funcID = ipyData.GetFuncId()  
 | 
        if openFuncIDList and funcID not in openFuncIDList:  
 | 
            continue  
 | 
          
 | 
        limitLV = ipyData.GetLimitLV()  
 | 
        if limitLV and limitLV <= maxLV and needLV < limitLV:  
 | 
            needLV = limitLV  
 | 
              
 | 
        limitMagicWeaponID = ipyData.GetLimitMagicWeapon()  
 | 
        if limitMagicWeaponID and limitMagicWeaponID not in needMagicWeaponIDList:  
 | 
            needMagicWeaponIDList.append(limitMagicWeaponID)  
 | 
              
 | 
        limitRealmLV = ipyData.GetLimiRealmLV()  
 | 
        if limitRealmLV and needRealmLV < limitRealmLV:  
 | 
            needRealmLV = limitRealmLV  
 | 
              
 | 
        limitMissionID = ipyData.GetLimitMissionID()  
 | 
        if limitMissionID and limitMissionID not in needMissionIDList:  
 | 
            needMissionIDList.append(limitMissionID)  
 | 
    return needLV, needMagicWeaponIDList, needRealmLV, needMissionIDList  
 | 
  
 | 
def DoGMCloseFunc(curPlayer, closeFuncID):  
 | 
    ## GM¹Ø±Õ¹¦ÄÜ  
 | 
    if not closeFuncID:  
 | 
        curPlayer.SetLV(1)  
 | 
        curPlayer.SetOfficialRank(0)  
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
        for i in xrange(ipyDataMgr.GetTreasureCount()):  
 | 
            ipyData = ipyDataMgr.GetTreasureByIndex(i)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponLV % ipyData.GetID(), 0)  
 | 
              
 | 
        for keyNum in xrange(8):  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch % keyNum, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState % keyNum, 0)  
 | 
              
 | 
        needLV, needMagicWeaponIDList, needRealmLV, needMissionIDList = __GetOpenFuncLimit([])  
 | 
        for missionID in needMissionIDList:  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % missionID, 0)  
 | 
          
 | 
        GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)  
 | 
        GameWorld.DebugAnswer(curPlayer, "¹Ø±ÕËùÓй¦ÄÜ!")  
 | 
        return  
 | 
      
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, closeFuncID):  
 | 
        GameWorld.DebugLog("¹¦ÄÜÒѹرգ¬²»ÐèÒªÖØ¸´¹Ø±Õ! closeFuncID=%s" % closeFuncID, curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("FuncOpenLV", closeFuncID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    limitLV = ipyData.GetLimitLV()  
 | 
    if limitLV and curPlayer.GetLV() >= limitLV:  
 | 
        curPlayer.SetLV(max(1, limitLV - 1))  
 | 
        PlayerControl.SetPlayerTotalExp(curPlayer, 0)  
 | 
          
 | 
    limitRealmLV = ipyData.GetLimiRealmLV()  
 | 
    if limitRealmLV and curPlayer.GetOfficialRank() >= limitRealmLV:  
 | 
        curPlayer.SetOfficialRank(max(0, limitRealmLV - 1))  
 | 
          
 | 
    limitMagicWeaponID = ipyData.GetLimitMagicWeapon()  
 | 
    if limitMagicWeaponID:  
 | 
        mwID = limitMagicWeaponID / 100  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponLV % mwID, 0)  
 | 
          
 | 
    limitMissionID = ipyData.GetLimitMissionID()  
 | 
    if limitMissionID:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 0)  
 | 
              
 | 
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, closeFuncID, 0)  
 | 
    GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)  
 | 
    GameWorld.DebugAnswer(curPlayer, "¹Ø±Õ¹¦ÄÜ: %s" % closeFuncID)  
 | 
    return  
 |