#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package TurnAttack
|
#
|
# @todo:»ØºÏÖÆ¹¥»÷Âß¼
|
# @author hxp
|
# @date 2023-11-30
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2023-11-30 15:30"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import AICommon
|
import BaseAttack
|
import PlayerState
|
import IpyGameDataPY
|
import IPY_GameWorld
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PlayerControl
|
import SkillCommon
|
import NPCCommon
|
import GameWorld
|
import GameObj
|
|
(
|
FightState_Start,
|
FightState_Fighting,
|
FightState_Win,
|
FightState_Fail,
|
FightState_Over,
|
) = range(5)
|
|
#// B4 10 »ØºÏÖÆÕ½¶· #tagCMTurnFight
|
#
|
#struct tagCMTurnFight
|
#{
|
# tagHead Head;
|
# DWORD MapID; // ×Ô¶¨ÒåµØÍ¼ID£¬¿ÉÓÃÓÚ°ó¶¨Õ½¶·³¡¾°¹¦ÄÜ£¨ÈçÒ°Íâ¹Ø¿¨£¬ÅÀËþ¹¦ÄÜ£¬¾º¼¼³¡µÈ£©
|
# WORD FuncLineID;
|
# DWORD PlayerID; // ¶ÔÓ¦Íæ¼ÒID£¬¿ÉΪ0£¬Ä³Ð©¹¦ÄÜ¿ÉÄÜÓÐÓã¬È羺¼¼³¡
|
#};
|
def OnTurnFight(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
mapID = clientData.MapID
|
funcLineID = clientData.FuncLineID
|
tagPlayerID = clientData.PlayerID
|
|
if curPlayer.GetSightLevel() != curPlayer.GetID():
|
PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
|
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start)
|
|
DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick)
|
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over)
|
return
|
|
def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
|
playerID = curPlayer.GetPlayerID()
|
tagObj = None
|
if tagPlayerID:
|
pass
|
|
else:
|
ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID)
|
if not ipyData:
|
return
|
npcID = ipyData.GetNPCID()
|
if not npcID:
|
return
|
tagObj = NPCCommon.SummonMapNpc(npcID, curPlayer.GetPosX(), curPlayer.GetPosY(), sightLevel=playerID)
|
|
if not tagObj:
|
return
|
|
turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1)
|
curPet = curPlayer.GetPetMgr().GetFightPet()
|
tagPet = None
|
|
GameWorld.DebugLog("Ö´ÐлغÏÖÆÕ½¶·: mapID=%s,funcLineID=%s,tagPlayerID=%s,tagObjID=%s"
|
% (mapID, funcLineID, tagPlayerID, tagObj.GetID()), playerID)
|
GameWorld.DebugLog("curPlayer.GetSightLevel=%s,tagObj.GetSightLevel=%s"
|
% (curPlayer.GetSightLevel(), tagObj.GetSightLevel()), playerID)
|
|
#Ò»¸ö»ØºÏ¹¥»÷˳Ðò
|
#1. ¿ì·½³èÎï¹¥»÷£¬²»´æÔÚÌø¹ý
|
#2. Âý·½³èÎï¹¥»÷£¬²»´æÔÚÌø¹ý
|
#3. ¿ì·½Ö÷Ìå¹¥»÷
|
#4. Âý·½Ö÷Ìå¹¥»÷
|
|
# Õ½¶·Ç°³õʼ»¯
|
factionObjMax = 0 # ij¸öÕóÓªµÄ×î´óÕ½¶·ÊµÀýÊý
|
factionObjDict = {1:[curPet, curPlayer], 2:[tagPet, tagObj]}
|
for objList in factionObjDict.values():
|
if factionObjMax < len(objList):
|
factionObjMax = len(objList)
|
for gameObj in objList:
|
TurnFightObjStartInit(gameObj)
|
|
curSpeed = 0
|
tagSpeed = 0
|
orderList = [1, 2] if curSpeed >= tagSpeed else [2, 1]
|
GameWorld.DebugLog("playerHP=%s,tagHP=%s,curSpeed=%s,tagSpeed=%s"
|
% (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj), curSpeed, tagSpeed), playerID)
|
|
isWin = None
|
for turnNum in range(1, turnMax + 1):
|
GameWorld.DebugLog("»ØºÏÖÆÕ½¶·ÂÖ´Î: %s" % turnNum, playerID)
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax)
|
for index in range(factionObjMax):
|
for faction in orderList:
|
objList = factionObjDict[faction]
|
if index >= len(objList):
|
continue
|
gameObj = objList[index]
|
if not gameObj:
|
continue
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum)
|
tagGameObj = tagObj if faction == 1 else curPlayer
|
objType = gameObj.GetGameObjType()
|
objID = gameObj.GetID()
|
tagObjType = tagGameObj.GetGameObjType()
|
tagObjID = tagGameObj.GetID()
|
|
GameWorld.DebugLog(" Ðж¯: turnNum=%s,index=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s"
|
% (turnNum, index, faction, objType, objID, tagObjType, tagObjID), playerID)
|
if objType == IPY_GameWorld.gotPlayer:
|
PlayerAttack(gameObj, tagGameObj, tick)
|
else:
|
NPCAttack(gameObj, tagGameObj, tick)
|
|
if tagGameObj and GameObj.GetHP(tagGameObj) > 0:
|
GameWorld.DebugLog(" playerHP=%s,tagHP=%s" % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj)), playerID)
|
continue
|
|
isWin = faction == 1
|
GameWorld.DebugLog(" tagObjType=%s,tagObjID=%s,±»»÷ɱ£¬½áÊøÕ½¶·: isWin=%s" % (tagObjType, tagObjID, isWin), playerID)
|
break
|
|
if isWin != None:
|
break
|
|
if isWin != None:
|
break
|
|
overState = FightState_Win if isWin else FightState_Fail
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax)
|
|
for objList in factionObjDict.values():
|
for gameObj in objList:
|
TurnFightObjOverReset(gameObj)
|
|
GameWorld.DebugLog("»ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s"
|
% (mapID, funcLineID, tagPlayerID, isWin, overState), playerID)
|
return
|
|
def TurnFightObjStartInit(gameObj):
|
## »ØºÏÖÆÕ½¶·ÊµÀý³õʼ»¯
|
if not gameObj:
|
return
|
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 1)
|
GameObj.SetHPFull(gameObj)
|
gameObj.RefreshView()
|
|
objType = gameObj.GetGameObjType()
|
# ÖØÖü¼ÄÜCD¡¢Õ½¶·buff
|
if objType == IPY_GameWorld.gotPlayer:
|
skillManager = gameObj.GetSkillManager()
|
for i in range(skillManager.GetSkillCount()):
|
skill = skillManager.GetSkillByIndex(i)
|
skill.SetRemainTime(0)
|
|
elif objType == IPY_GameWorld.gotNPC:
|
pass
|
return
|
|
def TurnFightObjOverReset(gameObj):
|
## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖÃ
|
if not gameObj:
|
return
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 0)
|
|
objType = gameObj.GetGameObjType()
|
if objType == IPY_GameWorld.gotPlayer:
|
pass
|
|
elif objType == IPY_GameWorld.gotNPC:
|
npcObjType = gameObj.GetGameNPCObjType()
|
if npcObjType != IPY_GameWorld.gnotPet and GameObj.GetHP(gameObj):
|
NPCCommon.SetDeadEx(gameObj)
|
|
return
|
|
def NPCAttack(curObj, tagObj, tick):
|
## NPC¹¥»÷
|
if not curObj:
|
return
|
tagDist = 0
|
#---ÓÅÏÈÊͷż¼ÄÜ---
|
if not AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick):
|
#ÆÕͨ¹¥»÷
|
isOK = BaseAttack.Attack(curObj, tagObj, None, tick)
|
GameWorld.DebugLog(" NPCÆÕͨ¹¥»÷: curID=%s,tagID=%s,isOK=%s" % (curObj.GetID(), tagObj.GetID(), isOK))
|
return
|
|
def PlayerAttack(curPlayer, tagObj, tick):
|
## Íæ¼Ò¹¥»÷£¬ ²Î¿¼¼¼ÄÜʹÓà #def UseSkillEx(index, clientData, tick):
|
playerID = curPlayer.GetPlayerID()
|
job = curPlayer.GetJob()
|
jobAutoUseSkillDict = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
|
if job not in jobAutoUseSkillDict:
|
return
|
skillList = jobAutoUseSkillDict[job]
|
|
posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
|
tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
|
|
curPlayer.ClearUseSkillRec()
|
curPlayer.SetAttackTargetPos(posX, posY)
|
curPlayer.SetUseSkillPosX(tagPosX)
|
curPlayer.SetUseSkillPosY(tagPosY)
|
curPlayer.SetUseSkillTagType(tagObjType)
|
curPlayer.SetUseSkillTagID(tagObjID)
|
|
#PlayerControl.SetIsNeedProcess(curPlayer, True)
|
#PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
|
|
skillMgr = curPlayer.GetSkillManager()
|
for skillID in skillList:
|
curSkill = skillMgr.FindSkillBySkillID(skillID)
|
if not curSkill:
|
continue
|
|
#CheckSkillCondition
|
#±»¶¯¼¼ÄÜÎÞ·¨Ê¹ÓÃ
|
if SkillCommon.isPassiveSkill(curSkill):
|
continue
|
#»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å
|
if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0:
|
continue
|
|
curPlayer.SetUseSkill(curSkill.GetSkillData())
|
useSkillData = curPlayer.GetUseSkill()
|
if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
|
GameWorld.DebugLog(" ¼¼Äܹ¥»÷ʧ°Ü%s" % skillID, playerID)
|
continue
|
GameWorld.DebugLog(" ¼¼Äܹ¥»÷³É¹¦%s" % skillID, playerID)
|
|
break
|
|
curPlayer.ClearUseSkillRec()
|
return
|
|
def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0):
|
clientPack = ChPyNetSendPack.tagMCTurnFightState()
|
clientPack.Clear()
|
clientPack.MapID = mapID
|
clientPack.FuncLineID = funcLineID
|
clientPack.PlayerID = tagPlayerID
|
clientPack.State = state
|
clientPack.TurnNum = turnNum
|
clientPack.TurnMax = turnMax
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|