public IEnumerator Execute() { BattleCalculateManager calculateManager = Global.battleManager.calculateManager; BattleCharactersManager charactersManager = Global.charactersManager; TileMap mapSearch = Global.mapSearch; //行动顺序 List <MCharacter> characters = charactersManager.mCharacters.FindAll((c) => { return(c.belong == this.belong && c.hp > 0 && !c.isHide && !c.actionOver); }); characters.Sort((a, b) => { VTile aTile = mapSearch.GetTile(a.coordinate); VTile bTile = mapSearch.GetTile(b.coordinate); App.Model.Master.MTile aMTile = TileCacher.Instance.Get(aTile.tileId); App.Model.Master.MTile bMTile = TileCacher.Instance.Get(bTile.tileId); //恢复地形 if (aMTile.heal > bMTile.heal) { return(1); } else if (aMTile.heal > bMTile.heal) { return(-1); } bool aPant = a.isPant; bool bPant = b.isPant; //残血状态 if (aPant && !bPant) { return(1); } else if (!aPant && bPant) { return(-1); } bool aMagic = a.weaponType == WeaponType.magic; bool bMagic = b.weaponType == WeaponType.magic; bool aHeal = a.canHeal; bool bHeal = b.canHeal; //攻击型法师 if (aMagic && !bMagic && !aHeal) { return(1); } else if (!aMagic && bMagic && !bHeal) { return(-1); } bool aArchery = a.isArcheryWeapon; bool bArchery = b.isArcheryWeapon; //远程类 if (aArchery && !bArchery) { return(1); } else if (!aArchery && bArchery) { return(-1); } //近战类 if (!aMagic && bMagic) { return(1); } else if (aMagic && !bMagic) { return(-1); } //恢复型法师 return(0); }); mCharacter = characters[0]; Debug.LogError("mCharacter = " + mCharacter.name); MSkill attackSkill = System.Array.Find(mCharacter.skills, (MSkill skill) => { Model.Master.MSkill skillMaster = skill.master; return(System.Array.Exists(skillMaster.types, s => (s == SkillType.attack || s == SkillType.magic)) && System.Array.IndexOf(skillMaster.weaponTypes, mCharacter.weaponType) >= 0); }); mCharacter.currentSkill = attackSkill; Global.battleManager.ClickNoneNode(mCharacter.coordinate); //VTile tile = mapSearch.GetTile(mCharacter.coordinate); //Global.battleManager.ClickNoneNode(tile.coordinate); yield return(new WaitForEndOfFrame()); FindAttackTarget(); Debug.LogError("targetTile=" + targetTile); bool canKill = false; if (targetTile != null) { canKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0; } Debug.LogError("canKill=" + canKill); if (canKill) { yield return(AppManager.CurrentScene.StartCoroutine(Attack())); } else { bool needHeal = false; MSkill healSkill = System.Array.Find(mCharacter.skills, (MSkill skill) => { App.Model.Master.MSkill skillMaster = skill.master; return(System.Array.Exists(skillMaster.types, s => s == SkillType.heal) && System.Array.IndexOf(skillMaster.weaponTypes, mCharacter.weaponType) >= 0); }); Debug.LogError("healSkill=" + healSkill); if (healSkill != null) { mCharacter.currentSkill = healSkill; Global.battleManager.CharacterReturnNone(); Global.battleManager.ClickNoneNode(mCharacter.coordinate); yield return(new WaitForEndOfFrame()); MCharacter healTarget = null; VTile healTile = null; FindHealTarget(out healTarget, out healTile); if (healTarget != null) { attackTarget = healTarget; targetTile = healTile; needHeal = true; } } if (needHeal) { yield return(AppManager.CurrentScene.StartCoroutine(Heal())); mCharacter.currentSkill = attackSkill; } else { if (healSkill != null) { Global.battleManager.CharacterReturnNone(); Global.battleManager.ClickNoneNode(mCharacter.coordinate); yield return(new WaitForEndOfFrame()); mCharacter.currentSkill = attackSkill; } yield return(AppManager.CurrentScene.StartCoroutine(Attack())); } } }
/// <summary> /// 攻击伤害=技能*0.3+攻击力-防御力*2 /// </summary> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public int Hert(MCharacter attackCharacter, MCharacter targetCharacter, VTile tile = null, VTile targetTile = null) { //获取地形辅助 float tileAid = attackCharacter.TileAid(tile); float targetTileAid = targetCharacter.TileAid(targetTile); MSkill skill = attackCharacter.CurrentSkill; App.Model.Master.MSkill skillMaster = skill.Master; if (tile == null) { tile = cBattlefield.mapSearch.GetTile(attackCharacter.CoordinateX, attackCharacter.CoordinateY); } if (targetTile == null) { targetTile = cBattlefield.mapSearch.GetTile(targetCharacter.CoordinateX, targetCharacter.CoordinateY); } float attack = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? attackCharacter.Ability.PhysicalAttack : attackCharacter.Ability.MagicAttack; //地形辅助 attack *= tileAid; if (attackCharacter.IsPike && targetCharacter.IsKnife) { //枪剑类克制刀类 attack *= 1.2f; } else if (attackCharacter.IsKnife && targetCharacter.IsAx) { //刀类克制斧类 attack *= 1.2f; } else if (attackCharacter.IsAx && targetCharacter.IsPike) { //斧类克制枪剑类 attack *= 1.2f; } float defense = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? targetCharacter.Ability.PhysicalDefense : targetCharacter.Ability.MagicDefense; //地形辅助 defense *= targetTileAid; if (attackCharacter.IsLongWeapon && targetCharacter.IsShortWeapon) { //长兵器克制短兵器 defense *= 0.8f; } else if (attackCharacter.IsShortWeapon && targetCharacter.IsArcheryWeapon) { //短兵器克制远程兵器 defense *= 0.8f; } else if (attackCharacter.IsArcheryWeapon && targetCharacter.IsLongWeapon) { //远程类兵器克制长兵器 defense *= 0.8f; } App.Model.Master.MTile mTile = TileCacher.Instance.Get(targetTile.TileId); //地形对技能威力的影响 int five_elements = (int)skillMaster.five_elements; float skillStrength = skillMaster.strength * mTile.strategys[five_elements]; //抗性对技能威力的影响 int resistance = targetCharacter.Master.resistances[five_elements]; if (resistance > 0) { skillStrength *= ((100 - resistance) * 0.01f); } float result = skillStrength * 0.3f + attack - defense; //Debug.LogError("result="+result + ", skillMaster.strength="+skillMaster.strength +", attack=" + attack+", defense="+defense); if (attackCharacter.MoveType == MoveType.cavalry && targetCharacter.MoveType == MoveType.infantry && !targetCharacter.IsArcheryWeapon) { //骑兵克制近身步兵 result *= 1.2f; } else if (attackCharacter.IsArcheryWeapon && targetCharacter.MoveType == MoveType.cavalry && !targetCharacter.IsArcheryWeapon) { //远程类克制近身类骑兵 result *= 1.2f; } else if (attackCharacter.MoveType == MoveType.infantry && targetCharacter.WeaponType != WeaponType.archery && targetCharacter.IsArcheryWeapon) { //近身步兵克制远程类 result *= 1.2f; } if (targetCharacter.MoveType == MoveType.cavalry && skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.horse_hert) { //对骑兵技能伤害加成 result *= (1f + skillMaster.effect.special_value * 0.01f); } else if (skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.move_and_attack && attackCharacter.roadLength > 0) { //移动攻击 result *= (1f + attackCharacter.roadLength * skillMaster.effect.special_value * 0.01f); } result = result > 1 ? result : 1; result = result > targetCharacter.Hp ? targetCharacter.Hp : result; return((int)result); }
public IEnumerator Execute() { //行动顺序 MCharacter[] characters = System.Array.FindAll(mBaseMap.Characters, c => c.Belong == this.belong && c.Hp > 0 && !c.IsHide && !c.ActionOver); System.Array.Sort(characters, (a, b) => { VTile aTile = cBattlefield.mapSearch.GetTile(a.CoordinateX, a.CoordinateY); VTile bTile = cBattlefield.mapSearch.GetTile(b.CoordinateX, b.CoordinateY); App.Model.Master.MTile aMTile = TileCacher.Instance.Get(aTile.TileId); App.Model.Master.MTile bMTile = TileCacher.Instance.Get(bTile.TileId); //恢复地形 if (aMTile.heal > bMTile.heal) { return(1); } else if (aMTile.heal > bMTile.heal) { return(-1); } bool aPant = a.IsPant; bool bPant = b.IsPant; //残血状态 if (aPant && !bPant) { return(1); } else if (!aPant && bPant) { return(-1); } bool aMagic = a.WeaponType == WeaponType.magic; bool bMagic = b.WeaponType == WeaponType.magic; bool aHeal = a.CanHeal; bool bHeal = b.CanHeal; //攻击型法师 if (aMagic && !bMagic && !aHeal) { return(1); } else if (!aMagic && bMagic && !bHeal) { return(-1); } bool aArchery = a.IsArcheryWeapon; bool bArchery = b.IsArcheryWeapon; //远程类 if (aArchery && !bArchery) { return(1); } else if (!aArchery && bArchery) { return(-1); } //近战类 if (!aMagic && bMagic) { return(1); } else if (aMagic && !bMagic) { return(-1); } //恢复型法师 return(0); }); mCharacter = characters[0]; MSkill attackSkill = System.Array.Find(mCharacter.Skills, delegate(MSkill skill){ App.Model.Master.MSkill skillMaster = skill.Master; return(System.Array.Exists(skillMaster.types, s => (s == SkillType.attack || s == SkillType.magic)) && System.Array.IndexOf(skillMaster.weapon_types, mCharacter.WeaponType) >= 0); }); mCharacter.CurrentSkill = attackSkill; int index = cBattlefield.mapSearch.GetTile(mCharacter.CoordinateX, mCharacter.CoordinateY).Index; cBattlefield.manager.ClickNoneNode(index); yield return(new WaitForEndOfFrame()); FindAttackTarget(); //yield return cBattlefield.StartCoroutine(); bool canKill = false; if (targetTile != null) { canKill = cBattlefield.calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.Hp >= 0; } if (canKill) { yield return(cBattlefield.StartCoroutine(Attack())); } else { bool needHeal = false; MSkill healSkill = System.Array.Find(mCharacter.Skills, delegate(MSkill skill){ App.Model.Master.MSkill skillMaster = skill.Master; return(System.Array.Exists(skillMaster.types, s => s == SkillType.heal) && System.Array.IndexOf(skillMaster.weapon_types, mCharacter.WeaponType) >= 0); }); if (healSkill != null) { mCharacter.CurrentSkill = healSkill; cBattlefield.manager.CharacterReturnNone(); cBattlefield.manager.ClickNoneNode(index); yield return(new WaitForEndOfFrame()); MCharacter healTarget = null; VTile healTile = null; FindHealTarget(out healTarget, out healTile); if (healTarget != null) { attackTarget = healTarget; targetTile = healTile; needHeal = true; } } if (needHeal) { yield return(cBattlefield.StartCoroutine(Heal())); mCharacter.CurrentSkill = attackSkill; } else { if (healSkill != null) { cBattlefield.manager.CharacterReturnNone(); cBattlefield.manager.ClickNoneNode(index); yield return(new WaitForEndOfFrame()); mCharacter.CurrentSkill = attackSkill; } yield return(cBattlefield.StartCoroutine(Attack())); } } }