/// <summary> /// 是否在攻击范围内 /// </summary> public bool IsInSkillDistance(Vector2Int coordinate, Vector2Int targetCoordinate, MCharacter distanceCharacter, MSkill targetSkill) { //MSkill targetSkill = distanceCharacter.CurrentSkill; App.Model.Master.MSkill targetSkillMaster = targetSkill.master; int distance = Global.mapSearch.GetDistance(coordinate, targetCoordinate); if (distance >= targetSkillMaster.distance[0] && distance <= targetSkillMaster.distance[1]) { return(true); } //技能攻击扩展范围 List <int[]> distances = distanceCharacter.skillDistances; if (distances.Count == 0) { return(false); } foreach (int[] child in distances) { if (distance >= child[0] && distance <= child[1]) { return(true); } } return(false); }
/// <summary> /// 恢复量= /// </summary> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public int Heal(MCharacter attackCharacter, MCharacter targetCharacter, VTile tile = null, VTile targetTile = null) { MSkill skill = attackCharacter.CurrentSkill; App.Model.Master.MSkill skillMaster = skill.Master; return(1 + attackCharacter.Level + attackCharacter.Ability.MagicAttack * skillMaster.strength); }
/// <summary> /// 是否在攻击范围内 /// </summary> public bool IsInSkillDistance(int CoordinateX, int CoordinateY, int targetX, int targetY, MCharacter distanceCharacter, MSkill targetSkill) { //MSkill targetSkill = distanceCharacter.CurrentSkill; App.Model.Master.MSkill targetSkillMaster = targetSkill.Master; int distance = cBattlefield.mapSearch.GetDistance(CoordinateX, CoordinateY, targetX, targetY); if (distance >= targetSkillMaster.distance[0] && distance <= targetSkillMaster.distance[1]) { return(true); } //技能攻击扩展范围 List <int[]> distances = distanceCharacter.SkillDistances; if (distances.Count == 0) { return(false); } foreach (int[] child in distances) { if (distance >= child[0] && distance <= child[1]) { return(true); } } return(false); }
public IEnumerator OnBoutStart() { while (true) { MCharacter mCharacter = System.Array.Find(mBaseMap.Characters, c => c.Belong == this.currentBelong && c.Hp > 0 && !c.IsHide && !c.boutEventComplete); if (mCharacter == null) { break; } App.Model.Master.MSkill skill = mCharacter.BoutFixedDamageSkill; if (skill != null) { List <VCharacter> characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && !c.ViewModel.IsHide.Value && !this.charactersManager.IsSameBelong(c.ViewModel.Belong.Value, currentBelong)); yield return(OnBoutFixedDamage(mCharacter, skill, characters)); } mCharacter.boutEventComplete = true; } if (currentBelong != Belong.self) { ai.Execute(currentBelong); } else { CloseOperatingMenu(); if (scriptWaitPaths != null) { WaitScript(scriptWaitPaths); } } }
private void LevelChanged(int oldvalue, int newvalue) { App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(ViewModel.SkillId.Value, ViewModel.Level.Value); skillLevel.text = string.Format("Lv.{0}", newvalue); money.text = skillMaster.character_level > 0 ? skillMaster.price.ToString() : "MAX"; levelUpButton.SetActive(skillMaster.character_level > 0); strength.text = string.Format("威力:{0}", skillMaster.strength); }
/// <summary> /// 开始动作 /// </summary> /// <returns><c>true</c>, if start run was actioned, <c>false</c> otherwise.</returns> /// <param name="vCharacter">Current character.</param> private void ActionStartRun(VCharacterBase vCharacter) { Debug.LogError("ActionStartRun"); System.Action actionStartEvent = () => { //cBattlefield.MapMoveToPosition(currentCharacter.CoordinateX, currentCharacter.CoordinateY); //vCharacter.direction = (vCharacter.mCharacter.coordinate.x > vCharacter.mCharacter.target.coordinate.x ? Direction.left : Direction.right); vCharacter.direction = Global.mapSearch.GetDirection(vCharacter.mCharacter.coordinate, vCharacter.mCharacter.target.coordinate); vCharacter.action = ActionType.attack; App.Model.Master.MSkill skillMaster = vCharacter.mCharacter.currentSkill.master; if (!string.IsNullOrEmpty(skillMaster.animation)) { VTile vTile = Global.mapSearch.GetTile(vCharacter.mCharacter.target.coordinate); //this.cBattlefield.CreateEffect(skillMaster.animation, vTile.transform); } }; if (vCharacter.mCharacter.currentSkill.master.effect.special == SkillEffectSpecial.back_thrust) { //回马枪 VTile currentTile = Global.mapSearch.GetTile(vCharacter.mCharacter.coordinate); VTile targetTile = Global.mapSearch.GetTile(vCharacter.mCharacter.target.coordinate); Direction direction = Global.mapSearch.GetDirection(targetTile, currentTile); VTile backTile = Global.mapSearch.GetTile(currentTile, direction); if (Global.charactersManager.GetCharacter(backTile.coordinate) != null) { actionStartEvent(); return; } Sequence sequence = new Sequence(); TweenParms tweenParms = new TweenParms() .Prop("X", backTile.transform.localPosition.x, false) .Prop("Y", backTile.transform.localPosition.y, false) .Ease(EaseType.Linear); TweenParms tweenParmsTarget = new TweenParms() .Prop("X", currentTile.transform.localPosition.x, false) .Prop("Y", currentTile.transform.localPosition.y, false) .Ease(EaseType.Linear); Holoville.HOTween.Core.TweenDelegate.TweenCallback moveComplete = () => { vCharacter.mCharacter.coordinate.y = backTile.coordinate.y; vCharacter.mCharacter.coordinate.x = backTile.coordinate.x; vCharacter.mCharacter.target.coordinate.y = currentTile.coordinate.y; vCharacter.mCharacter.target.coordinate.x = currentTile.coordinate.x; actionStartEvent(); }; tweenParms.OnComplete(moveComplete); VCharacterBase vTarget = Global.charactersManager.GetVCharacter(vCharacter.mCharacter.target); sequence.Insert(0f, HOTween.To(vCharacter, 0.5f, tweenParms)); sequence.Insert(0f, HOTween.To(vTarget, 0.5f, tweenParmsTarget)); sequence.Play(); } else { actionStartEvent(); } }
public void ShowSkillDetail(int skillId) { skillPreview.SetActive(true); App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(skillId); RectTransform trans = skillPreview.GetComponent <RectTransform>(); trans.position = new Vector3(trans.position.x, Input.mousePosition.y, 0f); skillPreview.SetActive(true); skillPreview.transform.Find("Name").GetComponent <Text>().text = skillMaster.name; skillPreview.transform.Find("Detailed").GetComponent <Text>().text = skillMaster.explanation; this.StopAllCoroutines(); this.StartCoroutine(WaitForHideSkillDetail()); }
/// <summary> /// 开始动作 /// </summary> /// <returns><c>true</c>, if start run was actioned, <c>false</c> otherwise.</returns> /// <param name="currentCharacter">Current character.</param> private void ActionStartRun(MCharacter currentCharacter) { System.Action actionStartEvent = () => { cBattlefield.MapMoveToPosition(currentCharacter.CoordinateX, currentCharacter.CoordinateY); currentCharacter.Direction = (currentCharacter.X > currentCharacter.Target.X ? Direction.left : Direction.right); currentCharacter.Action = ActionType.attack; App.Model.Master.MSkill skillMaster = currentCharacter.CurrentSkill.Master; if (!string.IsNullOrEmpty(skillMaster.animation)) { VTile vTile = this.cBattlefield.mapSearch.GetTile(currentCharacter.Target.CoordinateX, currentCharacter.Target.CoordinateY); this.cBattlefield.CreateEffect(skillMaster.animation, vTile.transform); } }; if (currentCharacter.CurrentSkill.Master.effect.special == App.Model.Master.SkillEffectSpecial.back_thrust) { //回马枪 VTile currentTile = cBattlefield.mapSearch.GetTile(currentCharacter.CoordinateX, currentCharacter.CoordinateY); VTile targetTile = cBattlefield.mapSearch.GetTile(currentCharacter.Target.CoordinateX, currentCharacter.Target.CoordinateY); Direction direction = cBattlefield.mapSearch.GetDirection(targetTile, currentTile); VTile backTile = cBattlefield.mapSearch.GetTile(currentTile, direction); if (cBattlefield.charactersManager.GetCharacter(backTile.Index) != null) { actionStartEvent(); return; } Sequence sequence = new Sequence(); TweenParms tweenParms = new TweenParms().Prop("X", backTile.transform.localPosition.x, false).Prop("Y", backTile.transform.localPosition.y, false).Ease(EaseType.Linear); TweenParms tweenParmsTarget = new TweenParms().Prop("X", currentTile.transform.localPosition.x, false).Prop("Y", currentTile.transform.localPosition.y, false).Ease(EaseType.Linear); Holoville.HOTween.Core.TweenDelegate.TweenCallback moveComplete = () => { currentCharacter.CoordinateY = backTile.CoordinateY; currentCharacter.CoordinateX = backTile.CoordinateX; currentCharacter.Target.CoordinateY = currentTile.CoordinateY; currentCharacter.Target.CoordinateX = currentTile.CoordinateX; actionStartEvent(); }; tweenParms.OnComplete(moveComplete); sequence.Insert(0f, HOTween.To(currentCharacter, 0.5f, tweenParms)); sequence.Insert(0f, HOTween.To(currentCharacter.Target, 0.5f, tweenParmsTarget)); sequence.Play(); } else { actionStartEvent(); } }
/// <summary> /// 获取反击次数 /// </summary> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public int CounterAttackCount(MCharacter attackCharacter, MCharacter targetCharacter) { int count = 1; if (targetCharacter.weaponType == WeaponType.dualWield) { //双手兵器或者相关的技能可双击 count = 2; } //技能反击次数 App.Model.Master.MSkill skillMaster = attackCharacter.currentSkill.master; if (skillMaster.effect.special == SkillEffectSpecial.counter_attack_count) { count = skillMaster.effect.special_value; } return(count); }
/// <summary> /// 获取主动次数 /// </summary> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public int SkillCount(MCharacter currentCharacter, MCharacter targetCharacter) { int count = 1; if (currentCharacter.WeaponType == WeaponType.dualWield) { //双手兵器或者相关的技能可双击 count = 2; } //技能攻击次数 App.Model.Master.MSkill skillMaster = currentCharacter.CurrentSkill.Master; if (skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.attack_count) { count = skillMaster.effect.special_value; } return(count); }
public override IEnumerator OnLoad(Request request) { yield return(StartCoroutine(base.OnLoad(request))); mCharacter = request.Get <MCharacter>("character"); HidePreview(); ScrollViewSets(content, childItem, System.Array.FindAll(mCharacter.Skills, (s) => { App.Model.Master.MSkill skillMaster = s.Master; Debug.LogError("CBattleSkillListDialog : " + skillMaster.id + ", " + skillMaster.name); bool isType = App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.attack) || App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.magic) || App.Model.Master.MSkill.IsSkillType(skillMaster, SkillType.heal); if (!isType) { return(false); } bool isWeaponSkill = App.Model.Master.MSkill.IsWeaponType(skillMaster, mCharacter.WeaponType); return(isWeaponSkill); })); }
public float TileAid(App.View.VTile vTile) { int aid = 0; foreach (MSkill skill in this.Skills) { App.Model.Master.MSkill mSkill = skill.Master; if (!App.Model.Master.MSkill.IsSkillType(mSkill, SkillType.help) || mSkill.effect.special != App.Model.Master.SkillEffectSpecial.tile) { continue; } if (mSkill.wild > 0 && System.Array.Exists(App.Util.Global.Constant.tile_wild, v => v == vTile.TileId)) { aid += mSkill.wild; } if (mSkill.swim > 0 && System.Array.Exists(App.Util.Global.Constant.tile_swim, v => v == vTile.TileId)) { aid += mSkill.swim; } } return(aid == 0 ? 1f : (100 + aid) * 0.01f); }
public IEnumerator OnBoutFixedDamage(MCharacter mCharacter, App.Model.Master.MSkill skill, List <VCharacter> characters) { App.View.VTile targetTile = this.mapSearch.GetTile(mCharacter.CoordinateX, mCharacter.CoordinateY); foreach (VCharacter child in characters) { App.View.VTile tile = this.mapSearch.GetTile(child.ViewModel.CoordinateX.Value, child.ViewModel.CoordinateY.Value); if (this.mapSearch.GetDistance(targetTile, tile) <= skill.radius) { int hert = skill.strength; if (child.ViewModel.Hp.Value - hert <= 0) { hert = child.ViewModel.Hp.Value - 1; } App.Model.Battle.MDamageParam arg = new App.Model.Battle.MDamageParam(-hert); child.SendMessage(CharacterEvent.OnDamage.ToString(), arg); } } while (HasDynamicCharacter()) { yield return(new UnityEngine.WaitForEndOfFrame()); } }
public override void UpdateView() { content.SetActive(ViewModel.SkillId.Value > 0); emptyContent.SetActive(ViewModel.SkillId.Value == 0); if (ViewModel.SkillId.Value == 0) { background.color = wakeColor; return; } App.Model.Master.MSkill skillMaster = App.Util.Cacher.SkillCacher.Instance.Get(ViewModel.SkillId.Value); skillName.text = skillMaster.name; icon.sprite = ImageAssetBundleManager.GetSkillIcon(ViewModel.SkillId.Value); levelupContent.SetActive(ViewModel.Id.Value > 0); unlockContent.SetActive(ViewModel.Id.Value == 0); if (ViewModel.Id.Value == 0) { unlockButton.SetActive(ViewModel.CanUnlock.Value); unlockLabel.gameObject.SetActive(!ViewModel.CanUnlock.Value); background.color = ViewModel.CanUnlock.Value ? wakeColor : disabledColor; return; } background.color = learnedColor; LevelChanged(0, ViewModel.Level.Value); }
/// <summary> /// 获取攻击到的所有敌人 /// </summary> /// <returns>The damage characters.</returns> /// <param name="vCharacter">攻击方</param> /// <param name="targetView">攻击目标</param> /// <param name="skill">Skill.</param> public List <VCharacter> GetTargetCharacters(VCharacter vCharacter, VCharacter targetView, App.Model.Master.MSkill skill) { List <VCharacter> result = new List <VCharacter>() { targetView }; if (skill.radius_type == RadiusType.point) { return(result); } List <VCharacter> characters; if (System.Array.Exists(skill.types, s => s == SkillType.heal)) { characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && this.IsSameBelong(c.ViewModel.Belong.Value, vCharacter.ViewModel.Belong.Value) && !this.IsSameCharacter(targetView, c)); } else/* if (System.Array.Exists(skill.types, s => s == SkillType.attack))*/ { characters = vBaseMap.Characters.FindAll(c => c.ViewModel.Hp.Value > 0 && this.IsSameBelong(c.ViewModel.Belong.Value, targetView.ViewModel.Belong.Value) && !this.IsSameCharacter(targetView, c)); } VTile targetTile; if (skill.effect.special == App.Model.Master.SkillEffectSpecial.attack_all_near) { targetTile = cBattlefield.mapSearch.GetTile(vCharacter.ViewModel.CoordinateX.Value, vCharacter.ViewModel.CoordinateY.Value); } else { targetTile = cBattlefield.mapSearch.GetTile(targetView.ViewModel.CoordinateX.Value, targetView.ViewModel.CoordinateY.Value); } if (skill.radius_type == RadiusType.range) { foreach (VCharacter child in characters) { VTile tile = cBattlefield.mapSearch.GetTile(child.ViewModel.CoordinateX.Value, child.ViewModel.CoordinateY.Value); if (targetTile.Index != tile.Index && cBattlefield.mapSearch.GetDistance(targetTile, tile) <= skill.radius) { result.Add(child); } } bool quantity_plus = skill.effect.special == App.Model.Master.SkillEffectSpecial.quantity_plus; if (quantity_plus) { List <VCharacter> resultPlus = new List <VCharacter>(); while (result.Count > 1 && resultPlus.Count < skill.effect.special_value) { int index = Random.Range(1, result.Count - 1); VCharacter plusView = result[index]; resultPlus.Add(plusView); result.RemoveAt(index); } resultPlus.Add(targetView); return(resultPlus); } } else if (skill.radius_type == RadiusType.direction) { VTile tile = cBattlefield.mapSearch.GetTile(vCharacter.ViewModel.CoordinateX.Value, vCharacter.ViewModel.CoordinateY.Value); int distance = cBattlefield.mapSearch.GetDistance(targetTile, tile); if (distance > 1) { return(result); } var direction = cBattlefield.mapSearch.GetDirection(tile, targetTile); var radius = skill.radius; while (radius-- > 0) { tile = cBattlefield.mapSearch.GetTile(targetTile, direction); VCharacter child = GetCharacter(tile.Index, characters); if (child == null) { break; } result.Add(child); targetTile = tile; } } return(result); }
/// <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 void Update(MCharacter mCharacter) { App.Model.Master.MCharacter master = mCharacter.Master; if (master == null) { return; } App.Model.MSkill[] skills = mCharacter.Skills; this.Power = master.power; this.Knowledge = master.knowledge; this.Speed = master.speed; this.Trick = master.trick; this.Endurance = master.endurance; this.MovingPower = master.moving_power; this.Riding = master.riding; this.Walker = master.walker; this.Pike = master.pike; this.Sword = master.sword; this.LongKnife = master.long_knife; this.Knife = master.knife; this.LongAx = master.long_ax; this.Ax = master.ax; this.LongSticks = master.long_sticks; this.Sticks = master.sticks; this.Archery = master.archery; this.HiddenWeapons = master.hidden_weapons; this.DualWield = master.dual_wield; this.ResistanceMetal += master.resistance_metal; this.ResistanceWood += master.resistance_wood; this.ResistanceWater += master.resistance_water; this.ResistanceFire += master.resistance_fire; this.ResistanceEarth += master.resistance_earth; int hp = master.hp; int mp = master.mp; if (skills != null) { foreach (App.Model.MSkill skill in skills) { App.Model.Master.MSkill skillMaster = skill.Master; if (skillMaster == null) { Debug.LogError("master.name=" + master.name + ", " + skill.SkillId + "," + skill.Level); return; } if (!System.Array.Exists(skillMaster.types, s => s == SkillType.ability)) { continue; } hp += skillMaster.hp; mp += skillMaster.mp; this.Power += skillMaster.power; this.Knowledge += skillMaster.knowledge; this.Speed += skillMaster.speed; this.Trick += skillMaster.trick; this.Endurance += skillMaster.endurance; this.MovingPower += skillMaster.moving_power; this.Riding += skillMaster.riding; this.Walker += skillMaster.walker; this.Pike += skillMaster.pike; this.Sword += skillMaster.sword; this.LongKnife += skillMaster.long_knife; this.Knife += skillMaster.knife; this.LongAx += skillMaster.long_ax; this.Ax += skillMaster.ax; this.LongSticks += skillMaster.long_sticks; this.Sticks += skillMaster.sticks; this.Archery += skillMaster.archery; this.HiddenWeapons += skillMaster.hidden_weapons; this.DualWield += skillMaster.dual_wield; this.Magic += skillMaster.magic; this.ResistanceMetal += skillMaster.resistance_metal; this.ResistanceWood += skillMaster.resistance_wood; this.ResistanceWater += skillMaster.resistance_water; this.ResistanceFire += skillMaster.resistance_fire; this.ResistanceEarth += skillMaster.resistance_earth; } } List <App.Model.Master.MEquipment> equipments = new List <App.Model.Master.MEquipment>(); if (mCharacter.Weapon > 0) { equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Weapon, App.Model.Master.MEquipment.EquipmentType.weapon)); } if (mCharacter.Clothes > 0) { equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Clothes, App.Model.Master.MEquipment.EquipmentType.clothes)); } if (mCharacter.Horse > 0) { equipments.Add(EquipmentCacher.Instance.GetEquipment(mCharacter.Horse, App.Model.Master.MEquipment.EquipmentType.horse)); } int physicalAttack = 0; int physicalDefense = 0; int magicAttack = 0; int magicDefense = 0; foreach (App.Model.Master.MEquipment equipment in equipments) { hp += equipment.hp; mp += equipment.mp; this.Power += equipment.power; this.Knowledge += equipment.knowledge; this.Speed += equipment.speed; this.Trick += equipment.trick; this.Endurance += equipment.endurance; this.MovingPower += equipment.moving_power; this.Riding += equipment.riding; this.Walker += equipment.walker; this.Pike += equipment.pike; this.Sword += equipment.sword; this.LongKnife += equipment.long_knife; this.Knife += equipment.knife; this.LongAx += equipment.long_ax; this.Ax += equipment.ax; this.LongSticks += equipment.long_sticks; this.Sticks += equipment.sticks; this.Archery += equipment.archery; this.HiddenWeapons += equipment.hidden_weapons; this.DualWield += equipment.dual_wield; this.Magic += equipment.magic; this.ResistanceMetal += equipment.resistance_metal; this.ResistanceWood += equipment.resistance_wood; this.ResistanceWater += equipment.resistance_water; this.ResistanceFire += equipment.resistance_fire; this.ResistanceEarth += equipment.resistance_earth; physicalAttack += equipment.physical_attack; physicalDefense += equipment.physical_defense; magicAttack += equipment.magic_attack; magicDefense += equipment.magic_defense; } this.HpMax = Mathf.FloorToInt(mCharacter.Level * (10 + this.Endurance * 0.2f) + hp); this.MpMax = Mathf.FloorToInt(mCharacter.Level * (5 + this.Knowledge * 0.1f) + mp); float moveTypeValue = (mCharacter.MoveType == MoveType.cavalry ? this.Riding : this.Walker); switch (mCharacter.WeaponType) { case WeaponType.archery: moveTypeValue += this.Archery; break; case WeaponType.pike: moveTypeValue += this.Pike; break; case WeaponType.sword: moveTypeValue += this.Sword; break; case WeaponType.longAx: moveTypeValue += this.LongAx; break; case WeaponType.ax: moveTypeValue += this.Ax; break; case WeaponType.longKnife: moveTypeValue += this.LongKnife; break; case WeaponType.shortKnife: moveTypeValue += this.Knife; break; case WeaponType.longSticks: moveTypeValue += this.LongSticks; break; case WeaponType.sticks: moveTypeValue += this.Sticks; break; case WeaponType.dualWield: moveTypeValue += this.DualWield; break; case WeaponType.magic: moveTypeValue += this.Magic; break; } float starPower = 0.7f + mCharacter.Star * 0.06f; this.PhysicalAttack = Mathf.FloorToInt((this.Power + this.Knowledge) * 0.3f + (this.Power * 2f + this.Knowledge) * (0.4f + (moveTypeValue * 0.5f) * 0.006f) * (1f + mCharacter.Level * starPower * 0.5f) * 0.1f); this.PhysicalAttack += physicalAttack; this.MagicAttack = Mathf.FloorToInt((this.Trick + this.Knowledge) * 0.3f + (this.Trick * 2f + this.Knowledge) * (0.4f + (moveTypeValue * 0.5f) * 0.006f) * (1f + mCharacter.Level * starPower * 0.5f) * 0.1f); this.MagicAttack += magicAttack; this.PhysicalDefense = Mathf.FloorToInt((this.Power * 0.5f + this.Knowledge) * 0.3f + (this.Power + this.Knowledge) * (1f + mCharacter.Level * starPower * 0.5f) * 0.04f); this.PhysicalDefense += physicalDefense; this.MagicDefense = Mathf.FloorToInt((this.Trick * 0.5f + this.Knowledge) * 0.3f + (this.Trick + this.Knowledge) * (1f + mCharacter.Level * starPower * 0.5f) * 0.04f); this.MagicDefense += magicDefense; }
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())); } } }
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())); } } }