#!/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
|