| | |
| | | |
| | | # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等 |
| | | for gameObj in fightObjList: |
| | | TurnFightObjPerTurnStart(gameObj, turnNum) |
| | | TurnFightObjPerTurnStart(gameObj, turnNum, tick) |
| | | |
| | | # 回合战斗: 轮流依次攻击 |
| | | for actNum, gameObj in enumerate(fightObjList, 1): |
| | |
| | | tagObjID = tagGameObj.GetID() |
| | | |
| | | GameWorld.DebugLog(" 行动: turnNum=%s,actNum=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s" |
| | | % (turnNum, actNum, faction, objType, objID, tagObjType, tagObjID), playerID) |
| | | % (turnNum, actNum, faction, objType, objID, tagObjType, tagObjID)) |
| | | DoAttack(gameObj, tagGameObj, tick) |
| | | |
| | | playerDead = GameObj.GetHP(curPlayer) <= 0 |
| | |
| | | |
| | | objType = gameObj.GetGameObjType() |
| | | npcID = gameObj.GetNPCID() if objType == IPY_GameWorld.gotNPC else 0 |
| | | GameWorld.DebugLog(" 初始化实例: objID=%s,npcID=%s,faction=%s,atkSpeed=%s,HP=%s" |
| | | % (gameObj.GetID(), npcID, GameObj.GetFaction(gameObj), GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj))) |
| | | GameWorld.DebugLog("初始化实例: objID=%s,npcID=%s,faction=%s,atkSpeed=%s,HP=%s,Atk=%s,Def=%s" |
| | | % (gameObj.GetID(), npcID, GameObj.GetFaction(gameObj), GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef())) |
| | | GameWorld.DebugLog(" 闪命(%s,%s),闪避(%s,%s),暴击(%s,%s),击晕(%s,%s),连击(%s,%s),反击(%s,%s),吸血(%s,%s)" |
| | | % (gameObj.GetMiss(), gameObj.GetHit(), |
| | | 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: |
| | |
| | | pass |
| | | return |
| | | |
| | | def TurnFightObjPerTurnStart(gameObj, turnNum): |
| | | def TurnFightObjPerTurnStart(gameObj, turnNum, tick): |
| | | ## 回合制战斗实例 - 每回合开始时处理 |
| | | if not gameObj: |
| | | return |
| | |
| | | # 重置连击、反击数 |
| | | 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() |
| | | GameWorld.DebugLog("ObjPerTurnStart: faction=%s,objType=%s,objID=%s,turnNum=%s,HP=%s" % (GameObj.GetFaction(gameObj), objType, objID, turnNum, 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)) |
| | | |
| | | if objType == IPY_GameWorld.gotPlayer: |
| | | pass |
| | | |
| | | gameObj.SetTickByType(ChConfig.TYPE_Player_Tick_Buff, 0) |
| | | gameObj.SetPersistBuffTick(0) |
| | | |
| | | #刷新玩家Buff |
| | | reFlashBuff = PlayerState.ProcessRefreshBuffState(gameObj, tick) |
| | | #刷新玩家场景buff效果 |
| | | PlayerState.ProcessPlayerBuffEffect(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: |
| | | pass |
| | | |
| | | 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): |
| | |
| | | curID = curObj.GetID() |
| | | tagID = tagObj.GetID() |
| | | if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: |
| | | atkRet = PlayerAttack(curObj, tagObj, tick) |
| | | atkOK = PlayerAttack(curObj, tagObj, tick) |
| | | else: |
| | | atkRet = NPCAttack(curObj, tagObj, tick) |
| | | atkOK = NPCAttack(curObj, tagObj, tick) |
| | | |
| | | turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型 |
| | | |
| | | if not atkRet: |
| | | if not atkOK: |
| | | return |
| | | |
| | | if turnBattleType == ChConfig.TurnBattleType_Combo: |
| | |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum) |
| | | GameWorld.DebugLog(" 反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum)) |
| | | |
| | | GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, GameObj.GetHP(curObj), tagID, GameObj.GetHP(tagObj))) |
| | | 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 |
| | | |
| | | # 反击,反击可打断连击,所以优先判断 |
| | | if CanAtkBack(curObj, tagObj): |
| | |
| | | if not curObj: |
| | | return |
| | | tagDist = 0 |
| | | atkRet = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick) |
| | | atkOK = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick) |
| | | #---优先释放技能--- |
| | | if not atkRet: |
| | | if not atkOK: |
| | | #普通攻击 |
| | | atkRet = BaseAttack.Attack(curObj, tagObj, None, tick) |
| | | if atkRet: |
| | | GameWorld.DebugLog(" NPC普通攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet)) |
| | | atkOK = BaseAttack.Attack(curObj, tagObj, None, tick) |
| | | if atkOK: |
| | | GameWorld.DebugLog(" NPC普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" NPC攻击失败: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet)) |
| | | GameWorld.DebugLog(" NPC攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" NPC技能攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet)) |
| | | return atkRet |
| | | GameWorld.DebugLog(" NPC技能攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | return atkOK |
| | | |
| | | def PlayerAttack(curPlayer, tagObj, tick): |
| | | ## 玩家攻击, 参考技能使用 #def UseSkillEx(index, clientData, tick): |
| | |
| | | curPlayer.SetUseSkill(curSkill.GetSkillData()) |
| | | useSkillData = curPlayer.GetUseSkill() |
| | | if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick): |
| | | GameWorld.DebugLog(" 技能攻击失败%s" % skillID, playerID) |
| | | GameWorld.DebugLog(" 玩家技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | continue |
| | | useSkillResult = True |
| | | GameWorld.DebugLog(" 技能攻击成功%s" % skillID, playerID) |
| | | GameWorld.DebugLog(" 玩家技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | |
| | | break |
| | | |
| | | curPlayer.ClearUseSkillRec() |
| | | |
| | | if not useSkillResult: |
| | | #普通攻击 |
| | | atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick) |
| | | if atkOK: |
| | | useSkillResult = True |
| | | GameWorld.DebugLog(" 玩家普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" 玩家攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | return useSkillResult |
| | | |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0): |