#!/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
|
import BuffSkill
|
import FBCommon
|
import ItemControler
|
import PlayerPet
|
|
# »ØºÏÕ½¶·Á÷³Ì״̬
|
(
|
FightState_Start, # 0 Æðʼ״̬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±í¿ªÊ¼ÁË£¬ÓëOver¶ÔÓ¦
|
FightState_PrepareOK, # 1 ×¼±¸Íê±Ï£¬°üº¬¶ÔÕ½NPCÕÙ»½OK¡¢ÆäËûµÈ
|
FightState_Fighting, # 2 Õ½¶·ÖÐ
|
FightState_FightEnd, # 3 Õ½¶·½áÊø
|
FightState_Award, # 4 ½áËã½±Àø
|
FightState_Over, # 5 ½áÊø×´Ì¬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±íËùÓд¦Àí½áÊøÁË£¬ÓëStart¶ÔÓ¦
|
) = range(6)
|
|
# »ØºÏÕ½¶·¸´»îÀàÐÍ
|
(
|
RebornType_PetSkill,
|
) = range(1, 1 + 1)
|
|
def GetObjName(gameObj):
|
objName = gameObj.GetName()
|
faction = GameObj.GetFaction(gameObj)
|
fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
|
curID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
|
if not curID and gameObj.GetGameObjType() == IPY_GameWorld.gotNPC:
|
curID = gameObj.GetNPCID()
|
return "%s%s %s[%s-%s]" % ("A" if faction == 1 else "B", fightPlaceNum, objName, gameObj.GetID(), curID)
|
|
#// 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()
|
|
PlayerViewCacheTube.UpdPlayerPropPlusCache(curPlayer) # Ç¿ÖÆË¢Ò»ÏÂ×Ô¼ºµÄ¾µÏñ»º´æ
|
factionInfoA = {"playerID":playerID, "pet":PlayerPet.GetPetCacheInfo(curPlayer)}
|
factionInfoB = {}
|
ipyData = None
|
if tagPlayerID:
|
PlusData = PlayerViewCacheTube.GetPlayerPropPlusDictByID(tagPlayerID)[1] # ´Ó»º´æÖлñÈ¡
|
factionInfoB = {"playerID":tagPlayerID, "pet":PlusData.get("Pet")}
|
else:
|
ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID)
|
if not ipyData:
|
return
|
npcID = ipyData.GetNPCID()
|
if not npcID:
|
return
|
petNPCIDList = ipyData.GetPetNPCIDList()
|
petCacheInfo = [] # ´ÓÅä±íÖжÁÈ¡×éºÏ£¬¼¼ÄÜĬÈÏÈ¡NPC±íÅäÖõÄ
|
for state, petNPCID in enumerate(petNPCIDList, 1):
|
petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0})
|
factionInfoB = {"npcID":npcID, "pet":petCacheInfo}
|
|
ret = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer)
|
if not ret:
|
return
|
isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = ret
|
|
# ½áËã½±Àø...´ýÀ©Õ¹
|
awardItemList = []
|
if isWin and ipyData:
|
# ɽկ²âÊÔÏÈĬÈ϶¼ÊÇÊ״ν±Àø£¬ÕýʽºóÐèɾ³ý
|
awardItemList = ipyData.GetAwardItemListFirst()
|
|
GameWorld.DebugLog("½±ÀøÎïÆ·: %s" % awardItemList)
|
ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
|
|
overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
|
playbackID and overMsg.update({"playbackID":playbackID})
|
SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg)
|
return
|
|
def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False):
|
''' ´¦Àí×Ô¶¯»ØºÏÕ½¶·¹ý³Ì£¬½ö×öÕ½¶·Á÷³Ì´¦Àí£¬²»×ö¼°ÆäËû¹¦ÄÜÂß¼
|
@param mapID: ¿ÉÊÓΪ¹¦ÄÜID
|
@param funcLineID: ¶Ô¹¦ÄÜIDµÄÀ©Õ¹
|
@param factionInfoA: A·½ÕóÓªÐÅÏ¢£¬playerID ºÍ npcID ¶þѡһ {"playerID":Ö÷ÌåÍæ¼Ò¾µÏñID, "npcID":Ö÷ÌåNPCID, "pet":[{³öÕ½Áé³èÐÅÏ¢¼æÈÝÍæ¼Ò»º´æµÄÁé³èÐÅÏ¢k:v, ...}, ...]}
|
@param factionInfoB: B·½ÕóÓªÐÅÏ¢
|
@param syncPlayer: ÐèҪ֪ͨµÄÍæ¼Ò£¬¿ÉÄÜΪNone£¬×¢Òâ½ö×ö֪ͨÓ㬸ÃÍæ¼Ò¿ÉÄܺÍABÕóÓªÎÞÈκιØÏµ
|
@param isSavePlayback: ÊÇ·ñ±£´æÕ½¶·»Ø·Å
|
@return: None-ÎÞ½á¹û£»»ò (isWin, turnNum, turnMax, factionTotalHurtDict)
|
isWin: ÊÇ·ñ»ñʤ
|
turnNum: ´òÁ˼¸»ØºÏ
|
factionTotalHurtDict: Ë«·½ÉËѪͳ¼Æ
|
'''
|
if syncPlayer:
|
syncPlayer.SetCanAttack(False) # ¸ÃÍæ¼ÒÉèÖÃΪ²»¿É±»¹¥»÷
|
playerID = syncPlayer.GetPlayerID()
|
sightLevel, posX, posY = playerID, syncPlayer.GetPosX(), syncPlayer.GetPosY()
|
else:
|
playerID = 0
|
sightLevel, posX, posY = 99, 192, 109 # ϵͳĬÈÏ´¦ÀíµÄ²ã¼¶¼°×ø±ê
|
|
objRetA = __SummonFactionObjs(factionInfoA, sightLevel, posX, posY)
|
objRetB = __SummonFactionObjs(factionInfoB, sightLevel, posX, posY)
|
objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [])
|
objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [])
|
if not objA or not objB:
|
return
|
playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # ¿ÉÄÜΪ0£¬·ÇÍæ¼Ò¾µÏñʱΪ0
|
playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # ¿ÉÄÜΪ0£¬·ÇÍæ¼Ò¾µÏñʱΪ0
|
|
objNameA = GetObjName(objA)
|
objNameB = GetObjName(objB)
|
GameWorld.DebugLog("===== Ö´ÐлغÏÖÆÕ½¶·: %s VS %s =====" % (objNameA, objNameB))
|
|
turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1)
|
# ³èÎïÏȹ¥»÷
|
factionListA = petObjListA + [objA]
|
factionListB = petObjListB + [objB]
|
atkFactionList = [factionListA, factionListB]
|
|
# ÉèÖÃÕ½¶·Ö÷Ìå
|
objA.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRole, 1)
|
objB.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(objA) < GameObj.GetAtkSpeed(objB):
|
atkFactionList = [factionListB, factionListA]
|
for i in range(len(factionListA)):
|
for factionObjList in atkFactionList:
|
fightObjList.append(factionObjList[i])
|
|
SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB])
|
|
isWin = None
|
for turnNum in range(1, turnMax + 1):
|
GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿" % turnNum)
|
SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_Fighting, turnNum, turnMax)
|
|
# »ØºÏ¿ªÊ¼: ×öһЩÿ»ØºÏÖØÖÃÂß¼»òÕßijЩ¸ù¾Ý»ØºÏ´¥·¢µÄЧ¹ûµÈ
|
for gameObj in fightObjList:
|
TurnFightObjPerTurnStart(gameObj, turnNum, tick)
|
|
isWin = CheckIswin(objA, objB)
|
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(syncPlayer, 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 = objB if faction == 1 else objA
|
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(objA, objB)
|
if isWin != None:
|
break
|
|
if isWin != None:
|
break
|
|
GameWorld.DebugLog("--- Õ½¶·½áÊø´¦Àí --- isWin=%s" % isWin)
|
isWin = 1 if isWin else 0
|
|
# ͳ¼Æ×ÜÉ˺¦
|
factionTotalHurtDict = {}
|
for gameObj in fightObjList:
|
if not gameObj:
|
continue
|
faction = GameObj.GetFaction(gameObj)
|
objName = GetObjName(gameObj)
|
objID = gameObj.GetID()
|
totalHurtEx = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
|
totalHurt = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx
|
factionTotalHurtDict[faction] = factionTotalHurtDict.get(faction, 0) + totalHurt
|
GameWorld.DebugLog("%s objID=%s,faction=%s, ×ÜÊä³ö: %s" % (objName, objID, faction, totalHurt))
|
for faction, totalHurt in factionTotalHurtDict.items():
|
GameWorld.DebugLog("faction=%s, ÕóÓª×ÜÊä³ö: %s" % (faction, totalHurt))
|
|
GameWorld.DebugLog("AÊ£ÓàѪÁ¿: %s / %s" % (GameObj.GetHP(objA), GameObj.GetMaxHP(objA)))
|
GameWorld.DebugLog("BÊ£ÓàѪÁ¿: %s / %s" % (GameObj.GetHP(objB), GameObj.GetMaxHP(objB)))
|
|
SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_FightEnd, turnNum, turnMax)
|
|
for gameObj in fightObjList:
|
TurnFightObjOverReset(gameObj, tick)
|
|
playbackID = 0 # Õ½¶·»Ø·ÅID£¬¿É¸ù¾Ý¸ÃID²é¿´»Ø·Å
|
#playbackInfo = "" # Õ½¶·»Ø·ÅÐÅÏ¢
|
if isSavePlayback:
|
pass
|
|
GameWorld.DebugLog("===== »ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,playerIDA=%s,playerIDB=%s,isWin=%s"
|
% (mapID, funcLineID, playerIDA, playerIDB, isWin))
|
return isWin, turnNum, turnMax, factionTotalHurtDict, playbackID
|
|
def __SummonFactionObjs(factionInfo, sightLevel, posX, posY):
|
## ÕÙ»½ÕóÓªÕ½¶·ÊµÀý
|
factionSyncInfo = {} # ͬ²½Ç°¶ËµÄÕóÓªÐÅÏ¢£¬°üº¬Ö÷ID¡¢Áé³è¡¢ÆäËûÁéͨµÈ
|
playerID = factionInfo.get("playerID")
|
npcID = factionInfo.get("npcID")
|
if playerID:
|
npcID = ChConfig.Def_NPCID_PVP
|
mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, mirrorPlayerID=playerID)
|
factionSyncInfo["playerID"] = playerID
|
elif npcID:
|
mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel)
|
factionSyncInfo["npcID"] = npcID
|
else:
|
return
|
if not mainObj:
|
return
|
petObjList = PetControl.CalloutFightPet(mainObj, factionInfo.get("pet"))
|
petObjIDList = []
|
for petObj in petObjList:
|
if petObj:
|
petObjIDList.append(petObj.GetID())
|
factionSyncInfo.update({"objID":mainObj.GetID(), "petObjIDList":petObjIDList})
|
return mainObj, petObjList, factionSyncInfo
|
|
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)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, 0)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 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, tick):
|
## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖÃ
|
if not gameObj:
|
return
|
|
objType = gameObj.GetGameObjType()
|
|
#NPCÖ±½Ó»ØÊÕ
|
if objType == IPY_GameWorld.gotNPC:
|
RecycleObj(gameObj)
|
return
|
|
if objType != IPY_GameWorld.gotPlayer:
|
return
|
|
timeline = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
|
isDelRefresh = ClearTurnFightBuff(gameObj, timeline, tick)
|
SetTimeline(gameObj, 0, 0)
|
gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0)
|
GameObj.SetFaction(gameObj, 0)
|
GameObj.SetHPFull(gameObj)
|
if isDelRefresh:
|
playerControl = PlayerControl.PlayerControl(gameObj)
|
playerControl.RefreshPlayerAttrByBuff()
|
return
|
|
def ClearTurnFightBuff(gameObj, timeLine, tick):
|
## Çå³ý»ØºÏÖÆÕ½¶·Ïà¹Øbuff
|
isDelRefresh = False
|
objType = gameObj.GetGameObjType()
|
objID = gameObj.GetID()
|
for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):
|
if objType != IPY_GameWorld.gotPlayer and buffType in ChConfig.Def_BuffType_OnlyPlayer:
|
continue
|
buffTuple = SkillCommon.GetBuffManagerByBuffType(gameObj, buffType)
|
if buffTuple == ():
|
continue
|
buffState = buffTuple[0]
|
for i in range(0, buffState.GetBuffCount())[::-1]:
|
curBuff = buffState.GetBuff(i)
|
curSkill = curBuff.GetSkill()
|
buffSkillID = curSkill.GetSkillID()
|
if not buffSkillID:
|
continue
|
if curBuff.GetCalcStartTick() > timeLine:
|
# »ØºÏÖÆÖвúÉúµÄbuffÊÇÒÔtimeline×÷ΪCalcStartTickµÄ£¬ËùÒÔ³¬¹ýtimelineµÄ¿ÉÊÓΪ·Ç»ØºÏÖÆbuff
|
continue
|
GameWorld.DebugLog(" ɾ³ý»ØºÏÖÆbuff: objID=%s,buffSkillID=%s" % (objID, buffSkillID))
|
ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
|
BuffSkill.DoBuffDisApper(gameObj, curBuff, tick)
|
buffState.DeleteBuffByIndex(i)
|
SkillShell.ClearBuffEffectBySkillID(gameObj, buffSkillID, ownerID, ownerType)
|
#ɾ³ýδ֪BUFF£¬Ë¢ÐÂÊôÐÔ
|
isDelRefresh = True
|
return isDelRefresh
|
|
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 AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, curSkill=None):
|
if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
|
return
|
skillID = curSkill.GetSkillID() if curSkill else 0
|
totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
|
totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx + hurtValue
|
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue)
|
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue)
|
GameWorld.DebugLog(" ÉËѪ: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s"
|
% (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt))
|
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, msg=""):
|
if not curPlayer:
|
return
|
clientPack = ChPyNetSendPack.tagMCTurnFightState()
|
clientPack.Clear()
|
clientPack.MapID = mapID
|
clientPack.FuncLineID = funcLineID
|
clientPack.PlayerID = tagPlayerID
|
clientPack.State = state
|
clientPack.TurnNum = turnNum
|
clientPack.TurnMax = turnMax
|
clientPack.Msg = str(msg)
|
clientPack.Len = len(clientPack.Msg)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def SyncTurnFightObjAction(curPlayer, turnNum, objType, objID):
|
if not curPlayer:
|
return
|
clientPack = ChPyNetSendPack.tagMCTurnFightObjAction()
|
clientPack.Clear()
|
clientPack.TurnNum = turnNum
|
clientPack.ObjID = objID
|
clientPack.ObjType = objType
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|