| #!/usr/bin/python | 
| # -*- coding: GBK -*- | 
| #------------------------------------------------------------------------------- | 
| # | 
| ##@package TurnAttack | 
| # | 
| # @todo:»ØºÏÖÆ¹¥»÷Âß¼ | 
| # @author hxp | 
| # @date 2023-11-30 | 
| # @version 1.0 | 
| # | 
| # ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼£¬¾ùʹÓÃNPCʵÀý×÷Ϊս¶·Ö÷Ìå | 
| # | 
| #------------------------------------------------------------------------------- | 
| #"""Version = 2023-11-30 15:30""" | 
| #------------------------------------------------------------------------------- | 
|   | 
| import ChConfig | 
| import ChPyNetSendPack | 
| import NetPackCommon | 
| import PlayerControl | 
| import GameWorld | 
| import GameObj | 
| import FBCommon | 
| import FBLogic | 
|   | 
| # »ØºÏÕ½¶·Á÷³Ì״̬ | 
| ( | 
| FightState_Start, # 0 Æðʼ״̬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±í¿ªÊ¼ÁË£¬ÓëOver¶ÔÓ¦ | 
| FightState_PrepareOK, # 1 ×¼±¸Íê±Ï£¬°üº¬¶ÔÕ½NPCÕÙ»½OK¡¢ÆäËûµÈ | 
| FightState_Fighting, # 2 Õ½¶·ÖÐ | 
| FightState_FightEnd, # 3 Õ½¶·½áÊø | 
| FightState_Award, # 4 ½áËã½±Àø | 
| FightState_Over, # 5 ½áÊø×´Ì¬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±íËùÓд¦Àí½áÊøÁË£¬ÓëStart¶ÔÓ¦ | 
| ) = range(6) | 
|   | 
| #// B4 10 »ØºÏÖÆÕ½¶· #tagCMTurnFight | 
| # | 
| #struct    tagCMTurnFight | 
| #{ | 
| #    tagHead        Head; | 
| #    DWORD        MapID;    // ×Ô¶¨ÒåµØÍ¼ID£¬¿ÉÓÃÓÚ°ó¶¨Õ½¶·³¡¾°¹¦ÄÜ£¨ÈçÒ°Íâ¹Ø¿¨£¬ÅÀËþ¹¦ÄÜ£¬¾º¼¼³¡µÈ£© | 
| #    WORD        FuncLineID; | 
| #    BYTE        TagType;    // Õ½¶·Ä¿±êÀàÐÍ£¬0-NPC£¬1-Íæ¼Ò£¬2-¶ÓÎé | 
| #    DWORD        TagID;    // Õ½¶·Ä¿±êÀàÐͶÔÓ¦µÄID | 
| #    BYTE        ValueCount; | 
| #    DWORD        ValueList[ValueCount]; // ¸½¼ÓÖµÁÐ±í£¬¿ÉÑ¡£¬¾ßÌ庬ÒåÓÉMapID¾ö¶¨ | 
| #}; | 
| def OnTurnFight(index, clientData, tick): | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|     mapID = clientData.MapID | 
|     funcLineID = clientData.FuncLineID | 
|     tagType = clientData.TagType | 
|     tagID = clientData.TagID | 
|     valueList = clientData.ValueList | 
|      | 
|     playerID = curPlayer.GetPlayerID() | 
|     if tagType == ChConfig.TurnBattle_TagType_Player: | 
|         if tagID == playerID: | 
|             GameWorld.DebugLog("²»ÄÜ´ò×Ô¼º!", playerID) | 
|             return | 
|          | 
|     reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) | 
|     if not reqRet: | 
|         return | 
|      | 
|     # ÐèÒª·¢Ë͵½GameServerÑéÖ¤ | 
|     if mapID in ChConfig.Def_TFMapID_SendToGameServer: | 
|         SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) | 
|         return | 
|      | 
|     DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) | 
|     return | 
|   | 
| def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): | 
|     playerID = curPlayer.GetPlayerID() | 
|     msgList = str([msgType, dataMsg]) | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "TurnFight", msgList, len(msgList)) | 
|     GameWorld.Log("»ØºÏÕ½¶··¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID) | 
|     return | 
|   | 
| def GameServer_TurnFight_DoResult(curPlayer, msgData, tick): | 
|      | 
|     msgType, dataMsg, ret = msgData | 
|      | 
|     if not ret: | 
|         return | 
|      | 
|     if msgType == "TurnFightRequest": | 
|         mapID, funcLineID, tagType, tagID, valueList = dataMsg | 
|         DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) | 
|          | 
|     elif msgType == "TurnFightOver": | 
|         mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg | 
|         FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) | 
|          | 
|     elif msgType == "TurnFightTagPlayerInfo": | 
|         mapID, funcLineID, tagType, tagID, valueList = dataMsg | 
|         DoTrunFightVSPlayer(curPlayer, tagID, [mapID, funcLineID, valueList], ret) | 
|             | 
|     return | 
|   | 
| def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): | 
|     ## Ö´ÐлغÏÖÆÕ½¶·µÄÍêÕûÁ÷³Ì | 
|      | 
|     #if curPlayer.GetSightLevel() != curPlayer.GetID(): | 
|     #    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) | 
|          | 
|     SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) | 
|      | 
|     tagPlayerInfo = {} | 
|     if tagType == ChConfig.TurnBattle_TagType_Player and tagID >= 10000 : | 
|         tagPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(tagID) | 
|         if tagPlayer: | 
|             tagPlayerInfo = __GetPlayerInfo(tagPlayer) | 
|         else: | 
|             SendToGameServer_TurnFight(curPlayer, "TurnFightTagPlayerInfo", [mapID, funcLineID, tagType, tagID, valueList]) | 
|             return | 
|          | 
|     DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) | 
|      | 
|     SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) | 
|     return | 
|   | 
| def __GetPlayerInfo(curPlayer): | 
|     infoDict = { | 
|                 "Name":curPlayer.GetPlayerName(), | 
|                 "Job":curPlayer.GetJob(), | 
|                 "LV":curPlayer.GetLV(), | 
|                 "RealmLV":curPlayer.GetOfficialRank(), | 
|                 "MaxHP":GameObj.GetMaxHP(curPlayer), | 
|                 "FightPower":PlayerControl.GetFightPower(curPlayer), | 
|                 } | 
|     return infoDict | 
|   | 
| def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, tagPlayerInfo): | 
|     tagType = ChConfig.TurnBattle_TagType_Player | 
|     tagID = tagPlayerID | 
|     mapID, funcLineID, valueList = callData | 
|     if tagPlayerInfo and curPlayer.GetPlayerID() != tagPlayerID: | 
|         tick = GameWorld.GetGameWorld().GetTick() | 
|         DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) | 
|     SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) | 
|     return | 
|   | 
| def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagInfo=None): | 
|     if not tagID: | 
|         return | 
|     if not tagInfo: | 
|         tagInfo = {} | 
|     playerID = curPlayer.GetPlayerID() | 
|     GameWorld.DebugLog("»ØºÏÕ½¶·: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s,tagInfo=%s"  | 
|                        % (mapID, funcLineID, tagType, tagID, valueList, tagInfo), playerID) | 
|      | 
|     factionSyncInfoA = __GetPlayerInfo(curPlayer) | 
|     factionSyncInfoB = tagInfo | 
|     SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) | 
|      | 
|     turnNum, turnMax = 1, 15 | 
|      | 
|     curFightPower = PlayerControl.GetFightPower(curPlayer) | 
|     tagFightPower = tagInfo.get("FightPower", 0) | 
|     isWin = 1 if curFightPower >= tagFightPower else 0 | 
|     GameWorld.DebugLog("    Õ½¶·½á¹û: isWin=%s,curFightPower=%s,tagFightPower=%s" % (isWin, curFightPower, tagFightPower), playerID) | 
|      | 
|     factionTotalHurtDict = {} | 
|      | 
|     playbackID = 0 # Õ½¶·»Ø·ÅID£¬¿É¸ù¾Ý¸ÃID²é¿´»Ø·Å | 
|      | 
|     # Õ½¶·½áÊøºó´¦Àí | 
|     fightRet = [isWin, turnNum, turnMax, factionTotalHurtDict, playbackID] | 
|      | 
|     needSendGameServer, awardItemList, overInfoEx = False, [], {} | 
|     overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) | 
|     if overRet != None: | 
|         needSendGameServer, awardItemList, overInfoEx = overRet | 
|          | 
|     if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: | 
|         SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) | 
|          | 
|     overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":0} | 
|     playbackID and overMsg.update({"playbackID":playbackID}) | 
|     overInfoEx and overMsg.update(overInfoEx) | 
|     SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) | 
|     return | 
|   | 
| def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, state, turnNum=0, turnMax=0, msg=""): | 
|     if not curPlayer: | 
|         return | 
|     clientPack = ChPyNetSendPack.tagMCTurnFightState() | 
|     clientPack.Clear() | 
|     clientPack.MapID = mapID | 
|     clientPack.FuncLineID = funcLineID | 
|     clientPack.TagType = tagType | 
|     clientPack.TagID = tagID | 
|     clientPack.State = state | 
|     clientPack.TurnNum = turnNum | 
|     clientPack.TurnMax = turnMax | 
|     clientPack.Msg = str(msg) | 
|     clientPack.Len = len(clientPack.Msg)     | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack) | 
|     return |