#!/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 PlayerViewCacheTube
|
import NetPackCommon
|
import PlayerControl
|
import SkillCommon
|
import NPCCommon
|
import GameWorld
|
import GameObj
|
import PetControl
|
import SkillShell
|
|
(
|
FightState_Start,
|
FightState_Fighting,
|
FightState_Win,
|
FightState_Fail,
|
FightState_Over,
|
) = range(5)
|
|
(
|
RebornType_PetSkill,
|
) = range(1, 1 + 1)
|
|
def GetObjName(gameObj):
|
objName = gameObj.GetName()
|
mirrorPlayerID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
|
if mirrorPlayerID:
|
objName = "%s[%s]" % (objName, mirrorPlayerID)
|
faction = GameObj.GetFaction(gameObj)
|
fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
|
return "%s%s %s" % ("A" if faction == 1 else "B", fightPlaceNum, objName)
|
|
#// 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)
|
|
if tagPlayerID:
|
PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID], True)
|
return
|
|
DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick)
|
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over)
|
return
|
|
def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict):
|
mapID, funcLineID = callData
|
if PropDict and curPlayer.GetPlayerID() != tagPlayerID:
|
tick = GameWorld.GetGameWorld().GetTick()
|
DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick)
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over)
|
return
|
|
def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
|
playerID = curPlayer.GetPlayerID()
|
posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
|
GameWorld.DebugLog("===== Ö´ÐлغÏÖÆÕ½¶·: mapID=%s,funcLineID=%s,tagPlayerID=%s" % (mapID, funcLineID, tagPlayerID), playerID)
|
tagObj = None
|
if tagPlayerID:
|
npcID = ChConfig.Def_NPCID_PVP
|
tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID, mirrorPlayerID=tagPlayerID)
|
if not tagObj:
|
return
|
PlusData = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID)[1] # ´Ó»º´æÖлñÈ¡
|
petCacheInfo = PlusData.get("Pet")
|
fightPetObjListB = PetControl.CalloutFightPet(tagObj, petCacheInfo)
|
else:
|
ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID)
|
if not ipyData:
|
return
|
npcID = ipyData.GetNPCID()
|
if not npcID:
|
return
|
tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID)
|
if not tagObj:
|
return
|
petNPCIDList = ipyData.GetPetNPCIDList()
|
petCacheInfo = [] # ´ÓÅä±íÖжÁÈ¡×éºÏ£¬¼¼ÄÜĬÈÏÈ¡NPC±íÅäÖõÄ
|
for state, petNPCID in enumerate(petNPCIDList, 1):
|
petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0})
|
fightPetObjListB = PetControl.CalloutFightPet(tagObj, petCacheInfo)
|
|
turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1)
|
# ³èÎïÏȹ¥»÷
|
fightPetObjListA = PetControl.CalloutFightPet(curPlayer)
|
factionListA = fightPetObjListA + [curPlayer]
|
factionListB = fightPetObjListB + [tagObj]
|
atkFactionList = [factionListA, factionListB]
|
|
# ÉèÖÃÕ½¶·Ö÷Ìå
|
curPlayer.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRole, 1)
|
tagObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRole, 1)
|
|
# Õ½¶·Ç°³õʼ»¯£¬¿ÉÄÜ»á¸Ä±ä¹¥ËÙ£¬ËùÒÔÏȳõʼ»¯
|
for faction, factionObjList in enumerate(atkFactionList, 1):
|
for gameObj in factionObjList:
|
TurnFightObjStartInit(playerID, gameObj, faction, tick)
|
|
#Ò»¸ö»ØºÏ¹¥»÷˳Ðò£¬ÎªÁ˺óÐøÂ߼ͳһ£¬¶¼ÊÇÏÈÈ·¶¨ºÃ˳Ðò
|
sortType = 2 # ¹¥»÷˳ÐòÅÅÐò·½Ê½
|
fightObjList = []
|
#·½Ê½1£º ´¿Óɹ¥»÷ËٶȾö¶¨£¬¹¥ËÙÏàͬÏÂÕóÓª1Ïȹ¥»÷£¬»¹ÏàͬÔòÓÉID¾ö¶¨
|
if sortType == 1:
|
fightObjList = factionListA + factionListB
|
fightObjList.sort(key=lambda o: (GameObj.GetAtkSpeed(o), (10 - GameObj.GetFaction(o)), o.GetID()), reverse=True)
|
#·½Ê½2£º¸ù¾ÝÕóÓªÖ÷½Ç¹¥ËÙ¾ö¶¨ÏÈÊÖ£¬È»ºóÿ¸öÕóÓªÂÖÁ÷¹Ì¶¨Î»Öù¥»÷
|
elif sortType == 2:
|
if GameObj.GetAtkSpeed(curPlayer) < GameObj.GetAtkSpeed(tagObj):
|
atkFactionList = [factionListB, factionListA]
|
for i in range(len(factionListA)):
|
for factionObjList in atkFactionList:
|
fightObjList.append(factionObjList[i])
|
|
isWin = None
|
for turnNum in range(1, turnMax + 1):
|
GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿" % turnNum)
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax)
|
|
# »ØºÏ¿ªÊ¼: ×öһЩÿ»ØºÏÖØÖÃÂß¼»òÕßijЩ¸ù¾Ý»ØºÏ´¥·¢µÄЧ¹ûµÈ
|
for gameObj in fightObjList:
|
TurnFightObjPerTurnStart(gameObj, turnNum, tick)
|
|
isWin = CheckIswin(curPlayer, tagObj)
|
if isWin != None:
|
break
|
|
# »ØºÏÕ½¶·£º ÂÖÁ÷ÒÀ´Î¹¥»÷
|
for actionNum, gameObj in enumerate(fightObjList, 1):
|
if not gameObj:
|
# ûÓжÔÏó¿ÉÊÓΪûÓиýڵã
|
continue
|
|
for obj in fightObjList:
|
TurnFightObjPerTurnActionnum(turnNum, actionNum, obj, tick)
|
|
objType = gameObj.GetGameObjType()
|
objID = gameObj.GetID()
|
SyncTurnFightObjAction(curPlayer, turnNum, objType, objID)
|
|
if GameObj.GetHP(gameObj) <= 0:
|
# ¸´»îʱ»úÔÚ×Ô¼ºÐж¯½Úµã
|
if not DoReborn(gameObj):
|
continue
|
|
faction = GameObj.GetFaction(gameObj)
|
objName = GetObjName(gameObj)
|
curHP = GameObj.GetHP(gameObj)
|
|
tagGameObj = tagObj if faction == 1 else curPlayer
|
tagObjType = tagGameObj.GetGameObjType()
|
tagObjID = tagGameObj.GetID()
|
tagHP = GameObj.GetHP(tagGameObj)
|
|
GameWorld.DebugLog(" ¡ï»ØºÏ%s.%s %s Ðж¯ : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)"
|
% (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP))
|
|
if not DoAttack(gameObj, tagGameObj, tick):
|
continue
|
|
isWin = CheckIswin(curPlayer, tagObj)
|
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 gameObj in fightObjList:
|
TurnFightObjOverReset(gameObj)
|
|
GameWorld.DebugLog("===== »ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s"
|
% (mapID, funcLineID, tagPlayerID, isWin, overState), playerID)
|
return
|
|
def CheckIswin(curPlayer, tagObj):
|
## ¼ì²éÊÇ·ñ½áÊø
|
# @return: None-δ½áÊø£»True-»ñʤ£»False-ʧ°Ü
|
playerDead = GameObj.GetHP(curPlayer) <= 0 and GetRebornTypeInfo(curPlayer) == None
|
tagObjDead = (not tagObj or GameObj.GetHP(tagObj) <= 0) and GetRebornTypeInfo(tagObj) == None
|
|
if not playerDead and not tagObjDead:
|
return
|
|
isWin = None
|
if playerDead and tagObjDead:
|
isWin = False # ƽ¾ÖËãʧ°Ü
|
GameWorld.DebugLog(" Ë«·½±»»÷ɱ£¬Æ½¾ÖËãʧ°Ü: isWin=%s" % isWin)
|
elif playerDead:
|
isWin = False
|
GameWorld.DebugLog(" Íæ¼Ò±»»÷ɱ£¬Ê§°Ü: isWin=%s" % isWin)
|
elif tagObjDead:
|
isWin = True # ʤÀû
|
GameWorld.DebugLog(" ¶ÔÊÖ±»»÷ɱ£¬Ê¤Àû: isWin=%s" % isWin)
|
|
return isWin
|
|
def SetKilled(gameObj, killer=None):
|
if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRole):
|
#GameWorld.DebugLog("·Ç»ØºÏÕ½¶·Ö÷Ìå±»»÷ɱ: curID=%s" % gameObj.GetID())
|
return
|
|
GameWorld.DebugLog(" %s »ØºÏÕ½¶·Ö÷Ìå±»»÷ɱ: curID=%s" % (GetObjName(gameObj), gameObj.GetID()))
|
GameObj.SetHP(gameObj, 0)
|
|
playerID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightID)
|
if not playerID:
|
return
|
curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID)
|
if not curPlayer:
|
return
|
|
# ֪ͨǰ¶Ë
|
clientPack = ChPyNetSendPack.tagMCTurnFightObjDead()
|
clientPack.ObjID = gameObj.GetID()
|
clientPack.ObjType = gameObj.GetGameObjType()
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return True
|
|
def GetRebornTypeInfo(gameObj):
|
''' »ñÈ¡¿É¸´»îµÄ·½Ê½ÐÅÏ¢
|
@return: None-´ú±í²»¿É¸´»î
|
'''
|
if not gameObj:
|
return
|
|
if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRole):
|
# ½öÖ÷Ìå¿É¸´»î
|
return
|
|
rebornCountMax = 1
|
curRebornCount = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnRebornCount)
|
if curRebornCount >= rebornCountMax:
|
GameWorld.DebugLog("%s ÒѾ³¬¹ý¸´»î´ÎÊý£¬²»ÄÜÔÙ¸´»î! curID=%s,curRebornCount=%s" % (GetObjName(gameObj), gameObj.GetID(), curRebornCount))
|
return
|
|
# ¼ì²éÊÇ·ñÓÐÁé³è¸´»î¼¼ÄÜ
|
for index in range(gameObj.GetSummonCount()):
|
curSummonNPC = gameObj.GetSummonNPCAt(index)
|
if not curSummonNPC:
|
continue
|
if not PetControl.IsPetNPC(curSummonNPC):
|
continue
|
skillManager = curSummonNPC.GetSkillManager()
|
for skillIndex in range(skillManager.GetSkillCount()):
|
skill = skillManager.GetSkillByIndex(skillIndex)
|
if skill.GetSkillType() != ChConfig.Def_SkillType_Revive:
|
continue
|
if not skill.GetRemainTime():
|
return RebornType_PetSkill, curSummonNPC, skill
|
|
# ¼ì²éÆäËû¹¦Äܸ´»î£¬´ýÀ©Õ¹...
|
|
#GameWorld.DebugLog(" ûÓпÉÒÔ¸´»îµÄ·½Ê½!")
|
return
|
|
def DoReborn(gameObj, hpPer=ChConfig.Def_MaxRateValue):
|
## Ö´Ðи´»î
|
rebornTypeInfo = GetRebornTypeInfo(gameObj)
|
if rebornTypeInfo == None:
|
return
|
|
objName = GetObjName(gameObj)
|
objID = gameObj.GetID()
|
objType = gameObj.GetGameObjType()
|
|
rebornType = rebornTypeInfo[0]
|
rebornValue1, rebornValue2 = 0, 0
|
if rebornType == RebornType_PetSkill:
|
petNPC, skill = rebornTypeInfo[1:]
|
skill.SetRemainTime(skill.GetCoolDownTime())
|
hpPer = skill.GetEffect(0).GetEffectValue(0)
|
rebornValue1 = petNPC.GetID()
|
rebornValue2 = skill.GetSkillID()
|
|
rebornCount = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnRebornCount) + 1
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, rebornCount)
|
setHP = int(GameObj.GetMaxHP(gameObj) * hpPer / float(ChConfig.Def_MaxRateValue))
|
GameObj.SetHP(gameObj, setHP)
|
|
if objType == IPY_GameWorld.gotPlayer:
|
gameObj.ChangeAction(IPY_GameWorld.paNull)
|
else:
|
gameObj.ChangeAction(IPY_GameWorld.laNPCNull)
|
|
curHP = GameObj.GetHP(gameObj)
|
GameWorld.DebugLog("¸´»î %s: rebornType=%s,objID=%s,hpPer=%s,curHP=%s,rebornCount=%s" % (objName, rebornType, objID, hpPer, curHP, rebornCount))
|
|
playerID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightID)
|
if not playerID:
|
return
|
curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID)
|
if not curPlayer:
|
return
|
|
# ֪ͨǰ¶Ë
|
clientPack = ChPyNetSendPack.tagMCTurnFightObjReborn()
|
clientPack.ObjID = gameObj.GetID()
|
clientPack.ObjType = gameObj.GetGameObjType()
|
clientPack.HP = curHP % ChConfig.Def_PerPointValue
|
clientPack.HPEx = curHP / ChConfig.Def_PerPointValue
|
clientPack.RebornType = rebornType
|
clientPack.RebornValue1 = rebornValue1
|
clientPack.RebornValue2 = rebornValue2
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return True
|
|
def SetTimeline(gameObj, turnNum, actionNum):
|
'''ÉèÖûغÏÖÆÕ½¶·ËùÔÚʱ¼ä½Úµã
|
@param turnNum: µÚ¼¸»ØºÏ£¬Èç¹ûÔڻغÏÖÆÕ½¶·ÖУ¬Ôò»ØºÏÊýÒ»¶¨´óÓÚ0,
|
@param actionNum: µÚ¼¸¸öÐж¯½Úµã£¬Ã¿»ØºÏµÄÐж¯½Úµã»áÖØÖã¬Ò²¾ÍÊÇ˵Ðж¯½Úµã0¿ÉÊÓΪÿ»ØºÏµÄÆðʼ½Úµã£¬1λµÚÒ»¸öÐж¯Ä¿±ê½Úµã£¬ÒÔ´ËÀàÍÆ
|
'''
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightTimeline, turnNum * 100 + actionNum)
|
return
|
|
def TurnFightObjStartInit(playerID, gameObj, faction, tick):
|
## »ØºÏÖÆÕ½¶·ÊµÀý³õʼ»¯
|
if not gameObj:
|
return
|
isMainRole = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRole)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightID, playerID)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, 0)
|
SetTimeline(gameObj, 1, 0)
|
GameObj.SetFaction(gameObj, faction)
|
GameObj.SetHPFull(gameObj)
|
gameObj.RefreshView()
|
|
objType = gameObj.GetGameObjType()
|
npcID = gameObj.GetNPCID() if objType == IPY_GameWorld.gotNPC else 0
|
objName = GetObjName(gameObj)
|
fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
|
|
GameWorld.DebugLog("¡¾ %s ³õʼ»¯ %s ¡¿ objID=%s,npcID=%s,atkSpeed=%s,HP=%s,Atk=%s,Def=%s,isMainRole=%s"
|
% (objName, BaseAttack.GetObjAttackName(gameObj), gameObj.GetID(), npcID,
|
GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef(), isMainRole))
|
GameWorld.DebugLog(" ÉÁ±Ü(%s,%s),±©»÷(%s,%s),»÷ÔÎ(%s,%s),Á¬»÷(%s,%s),·´»÷(%s,%s),ÎüѪ(%s,%s)"
|
% (GameObj.GetMissRate(gameObj), GameObj.GetMissDefRate(gameObj),
|
GameObj.GetSuperHitRate(gameObj), GameObj.GetSuperHitRateReduce(gameObj),
|
GameObj.GetFaintRate(gameObj), GameObj.GetFaintDefRate(gameObj),
|
GameObj.GetComboRate(gameObj), GameObj.GetComboDefRate(gameObj),
|
GameObj.GetAtkBackRate(gameObj), GameObj.GetAtkBackDefRate(gameObj),
|
GameObj.GetSuckHPPer(gameObj), GameObj.GetSuckHPDefPer(gameObj),
|
))
|
|
# ÖØÖü¼ÄÜCD¡¢Õ½¶·buff
|
if objType == IPY_GameWorld.gotPlayer:
|
skillManager = gameObj.GetSkillManager()
|
for i in range(skillManager.GetSkillCount()):
|
curSkill = skillManager.GetSkillByIndex(i)
|
curSkill.SetRemainTime(0)
|
|
elif objType == IPY_GameWorld.gotNPC:
|
skillIDList = []
|
skillManager = gameObj.GetSkillManager()
|
for i in range(skillManager.GetSkillCount()):
|
curSkill = skillManager.GetSkillByIndex(i)
|
if not curSkill:
|
continue
|
skillIDList.append(curSkill.GetSkillID())
|
if fightPlaceNum:
|
if curSkill.GetSkillType() != ChConfig.Def_SkillType_Revive:
|
# Áé³è¼¼ÄÜ¿ªÊ¼Ê±Ö±½Ó½øÈëCD
|
curSkill.SetLastUseTick(tick)
|
curSkill.SetRemainTime(curSkill.GetCoolDownTime())
|
GameWorld.DebugLog(" NPC¼¼ÄÜ: npcID=%s,skillIDList=%s" % (npcID, skillIDList))
|
|
return
|
|
def TurnFightObjPerTurnStart(gameObj, turnNum, tick):
|
## »ØºÏÖÆÕ½¶·ÊµÀý - ÿ»ØºÏ¿ªÊ¼Ê±´¦Àí
|
if not gameObj:
|
return
|
|
SetTimeline(gameObj, turnNum, 0)
|
# ÖØÖÃÁ¬»÷¡¢·´»÷Êý
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 0)
|
gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, 0) # »÷ÔÎCD
|
|
objType = gameObj.GetGameObjType()
|
objID = gameObj.GetID()
|
objName = GetObjName(gameObj)
|
GameWorld.DebugLog("ObjPerTurnStart: »ØºÏ%s, %s objType-ID-HP(%s-%s-%s)" % (turnNum, objName, objType, objID, GameObj.GetHP(gameObj)))
|
|
# ÿ»ØºÏ¿ªÊ¼¼õ¼¼ÄÜCD
|
skillManager = gameObj.GetSkillManager()
|
for i in range(skillManager.GetSkillCount()):
|
skill = skillManager.GetSkillByIndex(i)
|
remainTime = skill.GetRemainTime()
|
if not remainTime:
|
continue
|
skillID = skill.GetSkillID()
|
updRemainTime = max(0, remainTime - ChConfig.Def_PerTurnTick)
|
skill.SetRemainTime(updRemainTime)
|
GameWorld.DebugLog(" skillID=%s,remainTime=%s,updRemainTime=%s" % (skillID, remainTime, updRemainTime))
|
|
# ˢж¨Ê±´¦ÀíµÄbuffЧ¹û
|
SkillShell.ProcessPersistBuff(gameObj, tick)
|
return
|
|
def TurnFightObjPerTurnActionnum(turnNum, actionNum, gameObj, tick):
|
## »ØºÏÖÆÕ½¶·ÊµÀý - ÿ¸öÐж¯½Úµã´¦Àí
|
if not gameObj:
|
return
|
|
SetTimeline(gameObj, turnNum, actionNum)
|
|
objType = gameObj.GetGameObjType()
|
if objType == IPY_GameWorld.gotPlayer:
|
#Ë¢ÐÂÍæ¼ÒBuffʱ³¤
|
gameObj.SetTickByType(ChConfig.TYPE_Player_Tick_Buff, 0)
|
reFlashBuff = PlayerState.ProcessRefreshBuffState(gameObj, tick)
|
#SkillShell.ProcessPersistBuff(gameObj, tick) # ¶¨Ê±´¦ÀíµÄÔÚÿ¸öʱ¼ä½ÚµãÓÐÐèÒªÔÙ¿ªÆô£¬Ä¿Ç°Ä¬ÈϻغϿªÊ¼´¦Àí
|
|
attrBuffResult, actBuffResult = PlayerState.ProcessRefreshActionBuffState(gameObj, tick)
|
playerControl = PlayerControl.PlayerControl(gameObj)
|
if actBuffResult:
|
playerControl.RefreshPlayerActionState()
|
|
#´Ë´¦²ÅÊÇÕæÕýµÄË¢ÐÂÈËÎïÊôÐÔÖµ£¬ÐèË¢ÊôÐÔÂß¼Ó¦ÔÚ´ËÐÐǰµ÷ÓÃ
|
if not playerControl.RefreshPlayerAttrStateEx():
|
if reFlashBuff or attrBuffResult:
|
playerControl.RefreshPlayerAttrByBuff()
|
# ֻˢBUFFÇé¿ö
|
playerControl.RefreshPlayerAttrByBuffEx()
|
|
elif objType == IPY_GameWorld.gotNPC:
|
gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff, 0)
|
gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff_Timely, 0)
|
|
npcControl = NPCCommon.NPCControl(gameObj)
|
npcControl.RefreshBuffState(tick)
|
|
return
|
|
def TurnFightObjOverReset(gameObj):
|
## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖÃ
|
if not gameObj:
|
return
|
SetTimeline(gameObj, 0, 0)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0)
|
GameObj.SetFaction(gameObj, 0)
|
|
objType = gameObj.GetGameObjType()
|
if objType == IPY_GameWorld.gotPlayer:
|
pass
|
|
elif objType == IPY_GameWorld.gotNPC:
|
RecycleObj(gameObj)
|
return
|
|
def RecycleObj(gameObj):
|
## ÊͷŻغÏÖÆÕ½¶·¶ÔÏó
|
|
#Áé³è¸úÕÙ»½ÊÞÓÉÖ÷ÈË»ØÊÕʱ´¥·¢»ØÊÕ£¬²»È»»áµ¼Ö±¨´í
|
npcObjType = gameObj.GetGameNPCObjType()
|
if npcObjType == IPY_GameWorld.gnotPet:
|
#GameWorld.DebugLog("RecycleObj Áé³è²»»ØÊÕ objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID()))
|
return
|
if npcObjType == IPY_GameWorld.gnotSummon:
|
curOwner = NPCCommon.GetSummonOwnerDetel(gameObj)
|
if curOwner and curOwner.GetGameObjType() == IPY_GameWorld.gotNPC:
|
#GameWorld.DebugLog("RecycleObj ÕÙ»½ÊÞÖ÷ÈËÊÇNPC²»»ØÊÕ objID=%s,npcObjType=%s,%s,ownerID=%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID(), curOwner.GetID()))
|
return
|
|
#GameWorld.DebugLog("RecycleObj: objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID()))
|
NPCCommon.SetDeadEx(gameObj)
|
return
|
|
|
def DoAttack(curObj, tagObj, tick):
|
curID = curObj.GetID()
|
tagID = tagObj.GetID()
|
if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
atkOK = PlayerAttack(curObj, tagObj, tick)
|
elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID):
|
atkOK = PlayerMirrorAttack(curObj, tagObj, tick)
|
else:
|
atkOK = NPCAttack(curObj, tagObj, tick)
|
|
turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
|
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # ÎÞÂÛ¹¥»÷³É¹¦Óë·ñ¶¼ÖØÖÃÕ½¶·ÀàÐÍ
|
|
if not atkOK:
|
return
|
|
if turnBattleType == ChConfig.TurnBattleType_Combo:
|
comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
|
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
|
GameWorld.DebugLog(" Á¬»÷: comboID=%s,comboNum=%s" % (curID, comboNum))
|
elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
|
atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
|
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
|
GameWorld.DebugLog(" ·´»÷: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
|
|
curHP = GameObj.GetHP(curObj)
|
tagHP = GameObj.GetHP(tagObj)
|
GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP))
|
if tagHP <= 0 or curHP <= 0:
|
return True
|
|
# ·´»÷£¬·´»÷¿É´ò¶ÏÁ¬»÷£¬ËùÒÔÓÅÏÈÅжÏ
|
if CanAtkBack(curObj, tagObj):
|
DoAttack(tagObj, curObj, tick)
|
return True
|
|
# Á¬»÷
|
if CanCombo(curObj, tagObj):
|
DoAttack(curObj, tagObj, tick)
|
|
return True
|
|
def CanAtkBack(atkObj, defObj):
|
## ¿É·ñ·´»÷
|
if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) > 0:
|
#GameWorld.DebugLog(" ±»Áé³è¹¥»÷ʱÎÞ·¨´¥·¢·´»÷")
|
return False
|
defAtkBackRate = GameObj.GetAtkBackRate(defObj) # ·À·½·´»÷ÂÊ
|
atkBackNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) # ÒÑ·´»÷´ÎÊý
|
if atkBackNum > 10:
|
# ÄÚÖÃ×î¸ß·´»÷Êý·À·¶
|
return False
|
if atkBackNum > 0:
|
validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 4)
|
vaildPer = validPerList[atkBackNum - 1] if len(validPerList) >= atkBackNum else 0
|
defAtkBackRate = int(defAtkBackRate * vaildPer / 100.0)
|
|
atkAtkBackDefRate = GameObj.GetAtkBackDefRate(atkObj) # ¹¥·½µÖ¿¹·´»÷ÂÊ
|
atkBackRate = max(0, defAtkBackRate - atkAtkBackDefRate)
|
if atkBackRate <= 0 or not GameWorld.CanHappen(atkBackRate):
|
GameWorld.DebugLog(" ÎÞ·¨·´»÷: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)"
|
% (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
|
return False
|
GameWorld.DebugLog(" ¿ÉÒÔ·´»÷: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)"
|
% (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
|
defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack)
|
return True
|
|
def CanCombo(atkObj, defObj):
|
## ¿É·ñÁ¬»÷
|
|
atkComboRate = GameObj.GetComboRate(atkObj) # ¹¥·½Á¬»÷ÂÊ
|
comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) # ÒÑÁ¬»÷´ÎÊý
|
if comboNum > 10:
|
# ÄÚÖÃ×î¸ßÁ¬»÷Êý·À·¶
|
return False
|
if comboNum > 0:
|
validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 3)
|
vaildPer = validPerList[comboNum - 1] if len(validPerList) >= comboNum else 0
|
atkComboRate = int(atkComboRate * vaildPer / 100.0)
|
|
defComboReduce = GameObj.GetComboDefRate(defObj) # ·À·½µÖ¿¹Á¬»÷ÂÊ
|
comboRate = max(0, atkComboRate - defComboReduce)
|
if comboRate <= 0 or not GameWorld.CanHappen(comboRate):
|
GameWorld.DebugLog(" ÎÞ·¨Á¬»÷: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)"
|
% (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
|
return False
|
GameWorld.DebugLog(" ¿ÉÒÔÁ¬»÷: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)"
|
% (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
|
atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo)
|
return True
|
|
def NPCAttack(curObj, tagObj, tick):
|
## NPC¹¥»÷
|
if not curObj:
|
return
|
|
objName = "¡ñ %s" % GetObjName(curObj)
|
#ÓÐÖµ´ú±íÁé³èÉÏÕóλÖã¬ÅжÏÊÇ·ñÓиÅÂʹ¥»÷
|
fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
|
if fightPlaceNum > 0:
|
fightRateList = IpyGameDataPY.GetFuncEvalCfg("PetGoOutFight", 2)
|
if fightPlaceNum > len(fightRateList):
|
return
|
fightRatePer = fightRateList[fightPlaceNum - 1]
|
|
qualityAddRateInfo = IpyGameDataPY.GetFuncEvalCfg("PetGoOutFight", 3, {})
|
petQuality = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetQuality)
|
qualityAddPer = qualityAddRateInfo.get(str(petQuality), 0)
|
fightRatePer += qualityAddPer
|
if fightRatePer < 100 and not GameWorld.CanHappen(fightRatePer, 100):
|
GameWorld.DebugLog(" Áé³è¸ÅÂʲ»¹¥»÷: curID=%s,fightPlaceNum=%s,petQuality=%s,fightRatePer=%s"
|
% (curObj.GetID(), fightPlaceNum, petQuality, fightRatePer))
|
return
|
|
tagDist = 0
|
atkOK = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick)
|
#---ÓÅÏÈÊͷż¼ÄÜ---
|
if not atkOK:
|
if fightPlaceNum:
|
GameWorld.DebugLog(" Áé³è²»¿ÉÆÕͨ¹¥»÷: curID=%s,fightPlaceNum=%s" % (curObj.GetID(), fightPlaceNum))
|
else:
|
#ÆÕͨ¹¥»÷
|
atkOK = BaseAttack.Attack(curObj, tagObj, None, tick)
|
if atkOK:
|
GameWorld.DebugLog(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
|
else:
|
GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
|
else:
|
GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
|
return atkOK
|
|
def PlayerMirrorAttack(playerNPC, tagObj, tick):
|
## Íæ¼Ò¾µÏñ¹¥»÷
|
|
playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
|
objName = "¡ñ %s" % GetObjName(playerNPC)
|
tagObjID = tagObj.GetID()
|
|
autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
|
|
tagDist = 0
|
skillManager = playerNPC.GetSkillManager()
|
for skillTypeID in autoUseSkillTypeIDList:
|
curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
|
if not curSkill:
|
continue
|
skillID = curSkill.GetSkillID()
|
|
#±»¶¯¼¼ÄÜÎÞ·¨Ê¹ÓÃ
|
if SkillCommon.isPassiveSkill(curSkill):
|
continue
|
#»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å
|
if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0:
|
continue
|
|
if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick):
|
GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
|
continue
|
GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
|
return skillID
|
|
#ÆÕͨ¹¥»÷
|
atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick)
|
if atkOK:
|
GameWorld.DebugLog(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
|
else:
|
GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
|
|
return atkOK
|
|
def PlayerAttack(curPlayer, tagObj, tick):
|
## Íæ¼Ò¹¥»÷£¬ ²Î¿¼¼¼ÄÜʹÓà #def UseSkillEx(index, clientData, tick):
|
playerID = curPlayer.GetPlayerID()
|
autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
|
|
posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
|
tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
|
|
objName = "¡ñ %s" % GetObjName(curPlayer)
|
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)
|
|
useSkillResult = False
|
skillMgr = curPlayer.GetSkillManager()
|
for skillTypeID in autoUseSkillTypeIDList:
|
curSkill = skillMgr.FindSkillBySkillTypeID(skillTypeID)
|
if not curSkill:
|
continue
|
skillID = curSkill.GetSkillID()
|
|
#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 ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
|
continue
|
useSkillResult = True
|
GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
|
|
break
|
|
curPlayer.ClearUseSkillRec()
|
|
if not useSkillResult:
|
#ÆÕͨ¹¥»÷
|
atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick)
|
if atkOK:
|
useSkillResult = True
|
GameWorld.DebugLog(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
|
else:
|
GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
|
return useSkillResult
|
|
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
|
|
def SyncTurnFightObjAction(curPlayer, turnNum, objType, objID):
|
clientPack = ChPyNetSendPack.tagMCTurnFightObjAction()
|
clientPack.Clear()
|
clientPack.TurnNum = turnNum
|
clientPack.ObjID = objID
|
clientPack.ObjType = objType
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|