private IEnumerator RockDrama() { var rockUnits = UnitManager.GetInstance().units.FindAll(p => p.GetComponent <CharacterStatus>().roleEName == "Rock"); foreach (var u in rockUnits) { if (u.GetComponent <Unit>().UnitEnd) { break; } outline.RenderOutLine(u.transform); rtsCamera.FollowTarget(u.transform.position); //rock auto recovers var currentHp = u.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").value; var currentHPMax = u.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").valueMax; var restValue = (int)(currentHPMax * (0.2f + GetRockIntensity(u.gameObject.name) * 0.1f)); //if the recover HP makes currentHp full, then Hp gets full //else just recovers currentHPMax * (0.2f + GetRockIntensity(u.gameObject.name) * 0.1f) HP restValue = currentHp + restValue > currentHPMax ? currentHPMax - currentHp : restValue; var hp = currentHp + restValue; UIManager.GetInstance().FlyNum(u.GetComponent <CharacterStatus>().arrowPosition / 2 + u.transform.position + Vector3.down * 0.2f, restValue.ToString(), UIManager.hpColor); ChangeData.ChangeValue(u.transform, "hp", hp); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); yield return(new WaitForSeconds(1f)); } yield return(0); }
private void Lose() { DebugLogPanel.GetInstance().Log("失败!"); Invoke(() => { Restart(); }, 2f); }
private void Win() { DebugLogPanel.GetInstance().Log("胜利!"); Invoke(() => { Restart(); }, 2f); }
public IEnumerator playFree(int playerNumber) { var nonMyUnits = UnitManager.GetInstance().units.FindAll(u => u.playerNumber == playerNumber); foreach (var u in nonMyUnits) { if (outline) { outline.RenderOutLine(u.transform); } rtsCamera.FollowTarget(u.transform.position); if (u.GetComponent <Unit>().UnitEnd) { } else { yield return(StartCoroutine(aiFreeBattle.ActiveAI(u))); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); } yield return(new WaitForSeconds(1f)); } outline.CancelRender(); RoundManager.GetInstance().EndTurn(); }
private IEnumerator Play() { var myUnits = UnitManager.GetInstance().units.FindAll(u => u.playerNumber == playerNumber); foreach (var u in myUnits) { if (u.GetComponent<Unit>().UnitEnd) break; rtsCamera.FollowTarget(u.transform.position); outline.RenderOutLine(u.transform); if (u.GetComponent<CharacterStatus>().roleEName == "Rock") { u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent<CharacterStatus>().roleCName + "执行完毕"); yield return new WaitForSeconds(1f); } else { yield return StartCoroutine(UseSkill("EarthStyleDorodomuBarrier", u.transform)); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent<CharacterStatus>().roleCName + "执行完毕"); yield return new WaitForSeconds(1f); } } outline.CancelRender(); RoundManager.GetInstance().EndTurn(); }
//后处理附加效果 protected override void PostEffect(Transform o) { var currentMp = o.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value; DebugLogPanel.GetInstance().Log("2 MP" + "(" + character.GetComponent <CharacterStatus>().roleCName + " -> " + o.GetComponent <CharacterStatus>().roleCName + ")"); var mp = currentMp - 2; ChangeData.ChangeValue(o, "mp", mp); }
//后处理附加效果 protected override void PostEffect(Transform o) { var currentMp = o.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value; DebugLogPanel.GetInstance().Log("2 MP" + "(" + character.GetComponent <CharacterStatus>().roleCName + " -> " + o.GetComponent <CharacterStatus>().roleCName + ")"); var mp = currentMp - 2; ChangeData.ChangeValue(o, "mp", mp); UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position + Vector3.down * 0.3f, "-2", new Color(80f / 255f, 248f / 255f, 144f / 255f)); }
public override bool Check() { if (character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value >= costMP) { return(true); } else { DebugLogPanel.GetInstance().Log("查克拉不足!"); return(false); } }
public override bool Check() { if (character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").valueMax == character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value) { DebugLogPanel.GetInstance().Log("查克拉已经是最大值。"); Reset(); return(false); } else { return(true); } }
private IEnumerator Play() { var myUnits = UnitManager.GetInstance().units.FindAll(u => u.playerNumber == playerNumber); foreach (var u in myUnits) { u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); RoundManager.GetInstance().EndTurn(u.transform); yield return(new WaitForSeconds(0.2f)); } yield return(null); }
//protected override bool ApplyEffects() //{ // if (animator.GetInteger("Skill") == 0 && animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")) // { // character.GetComponent<CharacterAction>().SetSkill("ChooseDirection"); // return true; // } // return false; //} public override void Effect() { base.Effect(); var currentHP = character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").value; var currentMP = character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value; var hp = currentHP + restoreHP; var mp = currentMP + restoreMP; ChangeData.ChangeValue(character, "hp", hp); ChangeData.ChangeValue(character, "mp", mp); DebugLogPanel.GetInstance().Log("吃掉薯片,恢复了 " + restoreHP + "体力、" + restoreMP + "查克拉!"); var skills = character.GetComponent <CharacterStatus>().skills; skills.Remove(EName); }
private IEnumerator JiroubouDrama() { Unit u = UnitManager.GetInstance().units.Find(p => p.name == "jiroubou_1"); rtsCamera.FollowTarget(u.transform.position); outline.RenderOutLine(u.transform); yield return(StartCoroutine(UseSkill("EarthStyleDorodomuBarrier", u.transform))); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); yield return(new WaitForSeconds(1f)); outline.CancelRender(); yield return(0); }
//confirmUI的回调函数 public virtual void Confirm() { if (confirmUI) { UnityEngine.Object.Destroy(confirmUI); } done = true; //角色取出忽略层 UnitManager.GetInstance().units.ForEach(u => u.gameObject.layer = 0); skillState = SkillState.confirm; if (originSkill != null) { DebugLogPanel.GetInstance().Log(character.GetComponent <CharacterStatus>().roleCName + " 使用了 " + originSkill.CName + " + " + CName); } else { DebugLogPanel.GetInstance().Log(character.GetComponent <CharacterStatus>().roleCName + " 使用了 " + CName); } }
private IEnumerator Play() { var myUnits = UnitManager.GetInstance().units.FindAll(u => u.playerNumber == playerNumber); foreach (var u in myUnits) { if (u.GetComponent <Unit>().UnitEnd) { break; } rtsCamera.FollowTarget(u.transform.position); outline.RenderOutLine(u.transform); if (u.GetComponent <CharacterStatus>().roleEName == "Rock") { var currentHp = u.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").value; var currentHPMax = u.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").valueMax; var restValue = (int)(currentHPMax * 0.3f); restValue = currentHp + restValue > currentHPMax ? currentHPMax - currentHp : restValue; var hp = currentHp + restValue; UIManager.GetInstance().FlyNum(u.GetComponent <CharacterStatus>().arrowPosition / 2 + u.transform.position + Vector3.down * 0.2f, restValue.ToString(), UIManager.hpColor); ChangeData.ChangeValue(u.transform, "hp", hp); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); yield return(new WaitForSeconds(1f)); } else { yield return(StartCoroutine(UseSkill("EarthStyleDorodomuBarrier", u.transform))); u.OnUnitEnd(); //真正的回合结束所应执行的逻辑。 DebugLogPanel.GetInstance().Log(u.GetComponent <CharacterStatus>().roleCName + "执行完毕"); yield return(new WaitForSeconds(1f)); } } outline.CancelRender(); RoundManager.GetInstance().EndTurn(); }
public override void Effect() { base.Effect(); var currentHP = character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").value; var currentMP = character.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "mp").value; var hp = currentHP + restoreHP; var mp = currentMP + restoreMP; ChangeData.ChangeValue(character, "hp", hp); ChangeData.ChangeValue(character, "mp", mp); DebugLogPanel.GetInstance().Log("吃掉薯片,恢复了 " + restoreHP + "体力、" + restoreMP + "查克拉!"); UIManager.GetInstance().FlyNum(character.GetComponent <CharacterStatus>().arrowPosition / 2 + character.position, restoreHP.ToString(), UIManager.hpColor); UIManager.GetInstance().FlyNum(character.GetComponent <CharacterStatus>().arrowPosition / 2 + character.position + Vector3.down * 0.3f, "+" + restoreMP.ToString(), new Color(80f / 255f, 248f / 255f, 144f / 255f)); var skills = character.GetComponent <CharacterStatus>().skills; skills.Remove(EName); shupian.gameObject.SetActive(false); }
public override void Effect() { base.Effect(); if (target.GetComponent <CharacterStatus>().characterIdentity == CharacterStatus.CharacterIdentity.noumenon) { animator.speed = 0f; RoundManager.GetInstance().Invoke(() => { FXManager.GetInstance().SmokeSpawn(character.position, character.rotation, null); }, 0.6f); RoundManager.GetInstance().Invoke(() => { var buff = new TransfigurationBuff(duration, target); character.GetComponent <CharacterStatus>().Buffs.Add(buff); buff.Apply(character); animator.speed = 1f; }, 0.8f); } else { DebugLogPanel.GetInstance().Log("Miss"); } }
public override void Effect() { base.Effect(); DebugLogPanel.GetInstance().Log("最终伤害 + " + factor.ToString() + "%"); }
public override void Effect() { //不飘字 calculateDamage = false; base.Effect(); //animator.speed = 0; int missCount = 0; float timeline = 0; for (int i = 0; i < other.Count; i++) { var o = other[i]; //侧边 if ((int)Vector3.Angle((o.position - character.position).normalized, character.forward) % 90 != 0) { timeline = timeline + 0.3f; //确定两边 GameObject go = null; GameController.GetInstance().Invoke(() => { go = CreateMesh(character.position, o.position); }, timeline); if (DamageSystem.Miss(character, o, skillRate)) { GameController.GetInstance().Invoke(() => { var mat = go.GetComponentInChildren <MeshRenderer>().material; CreateTween(mat, "_TilingY", 0f, 1f); DebugLogPanel.GetInstance().Log("Miss"); GameController.GetInstance().Invoke(() => { GameObject.Destroy(go); }, 1f); }, timeline + 1); missCount++; } else { GameController.GetInstance().Invoke(() => { var point = CreatePoint(o); var shadowSimulationBuff = new ShadowSimulationBuff(duration, point.transform, go.transform); o.GetComponent <Unit>().Buffs.Add(shadowSimulationBuff); shadowSimulationBuff.Apply(o); }, timeline + 1); } } else { GameObject go = CreateLine(character.position, o.position); if (DamageSystem.Miss(character, o, skillRate)) { GameController.GetInstance().Invoke(() => { var mat = go.GetComponentInChildren <MeshRenderer>().material; CreateTween(mat, "_TilingY", 0f, 1f); DebugLogPanel.GetInstance().Log("Miss"); GameController.GetInstance().Invoke(() => { GameObject.Destroy(go); }, 1f); }, 1); missCount++; } else { GameController.GetInstance().Invoke(() => { var point = CreatePoint(o); var shadowSimulationBuff = new ShadowSimulationBuff(duration, point.transform, go.transform); o.GetComponent <Unit>().Buffs.Add(shadowSimulationBuff); shadowSimulationBuff.Apply(o); }, 1); } } } var selfPoint = CreatePoint(character); if (missCount == other.Count) { GameController.GetInstance().Invoke(() => { var meshes = character.GetComponentsInChildren <SkinnedMeshRenderer>(); //开启原本阴影 foreach (var m in meshes) { m.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; } var mat = selfPoint.GetComponentInChildren <MeshRenderer>().material; CreateTween(mat, "_N_mask", 0f, 1f); }, 2f); } else { //有命中的敌人的时候,也给自身施加禁止buff var buff = new ShadowSimulationBuff(duration, selfPoint.transform); character.GetComponent <Unit>().Buffs.Add(buff); GameController.GetInstance().Invoke(() => { buff.Apply(character); }, timeline + 2.5f);//稍微比动画晚0.5s } GameController.GetInstance().Invoke(() => { animator.SetTrigger("EndSkill"); }, timeline + 2); }
//突袭(Pounce):无视防御力 //背击(BackStab):无视一半防御力 //暴击(Crit):伤害结果增加50% //返回true继续执行剩余Hit,返回false停止执行剩余Hit。 public static bool ApplyDamage(Transform attacker, Transform defender, bool skipDodge, int damageFactor, int skillRate, int extraCrit, int extraPounce, bool backStabBonus, int finalDamageFactor, out int value) { //Debug.Log("暴击率:" + extraCrit + "% " + "突袭率:" + extraPounce + "%"); value = -1; var def = defender.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "def").value; var currentHp = defender.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "hp").value; var atk = attacker.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "atk").value; if (Miss(attacker, defender, skillRate)) { DebugLogPanel.GetInstance().Log("Miss"); return(true); } if (!skipDodge) { var dodgeBuff = defender.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(DodgeBuff)); if (dodgeBuff != null) { var d = (DodgeBuff)dodgeBuff; if (!d.done) { dodgeBuff.Apply(defender); //将当前AttackSkill从队列头取出并放在队列尾。 if (SkillManager.GetInstance().skillQueue.Peek().Key.GetType().IsSubclassOf(typeof(AttackSkill))) { SkillManager.GetInstance().skillQueue.Enqueue(SkillManager.GetInstance().skillQueue.Dequeue()); } value = -2; return(false); } } } if (defender.GetComponent <CharacterStatus>().characterIdentity == CharacterStatus.CharacterIdentity.clone || defender.GetComponent <CharacterStatus>().characterIdentity == CharacterStatus.CharacterIdentity.advanceClone) { FXManager.GetInstance().SmokeSpawn(defender.position, Quaternion.identity, null); RoundManager.GetInstance().Invoke(() => { defender.GetComponent <Unit>().OnDestroyed(); }, 0.1f); return(false); } int damage = ((int)(0.1f * atk * damageFactor)); //最终伤害加成 damage = (int)(damage * (1 + 0.01 * finalDamageFactor)); if (PounceSystem(extraPounce)) { DebugLogPanel.GetInstance().Log("突袭!"); } else if (backStabBonus && BackStab(attacker, defender)) { DebugLogPanel.GetInstance().Log("背击!"); damage = damage * 50 / (def / 2 + 50); } else { damage = damage * 50 / (def + 50); } if (CritSystem(extraCrit)) { DebugLogPanel.GetInstance().Log("暴击!"); damage = (int)(damage * 1.5f); } damage = damage >= 0 ? damage : 0; value = damage; //UIManager.GetInstance().FlyNum(defender.GetComponent<CharacterStatus>().arrowPosition / 2 + defender.position, damage.ToString()); //defender.GetComponent<Animator>().SetTrigger("Forward"); DebugLogPanel.GetInstance().Log(damage.ToString() + "(" + attacker.GetComponent <CharacterStatus>().roleCName + " -> " + defender.GetComponent <CharacterStatus>().roleCName + ")"); var hp = currentHp - damage; ChangeData.ChangeValue(defender, "hp", hp); if (hp <= 0) { defender.GetComponent <Unit>().OnDestroyed(); return(false); } return(true); }
public virtual void GetHit() { if (calculateDamage) { //寻找是否有最终伤害buff FinalDamageBuff finalDamageBuff = (FinalDamageBuff)character.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); foreach (var o in other) { //<伤害序列,伤害结果> List <int> damageList = new List <int>(); if (ExtraHitSystem(extraHit)) { DebugLogPanel.GetInstance().Log("速击!" + "(" + character.GetComponent <CharacterStatus>().roleCName + " -> " + o.GetComponent <CharacterStatus>().roleCName + ")"); hit++; } //每Hit for (int i = 0; i < hit; i++) { int d; var doNextHit = DamageSystem.ApplyDamage(character, o, this, comboSkill == null && hoverRange == 0 || comboSkill != null && comboSkill.hoverRange == 0, finalDamageBuff == null ? 0 : finalDamageBuff.Factor, out d); damageList.Add(d); if (!doNextHit) { break; } } //如果有最终伤害Buff,且Duration小于0,手动撤销影响。(此处应为倍化术) if (finalDamageBuff != null && finalDamageBuff.Duration < 0) { finalDamageBuff.Undo(character); } for (int i = 0; i < damageList.Count; i++) { bool donePost = false; //异步时,要把迭代器传进去。 GameController.GetInstance().Invoke(j => { if (o) { //飘字 if (damage > 0) { if (damageList[j] > 0) { //受击动作 HitEffect(o); UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position, damageList[j].ToString(), Color.white, true); } else if (damageList[j] == 0) { UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position, damageList[j].ToString(), Color.white, false); } else if (damageList[j] < 0) { //受击动作 HitEffect(o); } } else { UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position, Mathf.Abs(damageList[j]).ToString(), UIManager.hpColor, false); } if (!donePost) { PostEffect(o); donePost = true; } } }, hitInterval * i, i); } } } }
private void Awake() { instance = this; }
public override void Effect() { if (effectState == EffectState.origin) { originSkill.Effect(); } else { //结算消耗以及动作归位。 base.Effect(); if (calculateDamage) { //寻找是否有最终伤害buff FinalDamageBuff finalDamageBuff = (FinalDamageBuff)character.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); foreach (var o in other) { //<伤害序列,伤害结果> Dictionary <int, int> damageDic = new Dictionary <int, int>(); if (ExtraHitSystem(extraHit)) { DebugLogPanel.GetInstance().Log("速击!" + "(" + character.GetComponent <CharacterStatus>().roleCName + " -> " + o.GetComponent <CharacterStatus>().roleCName + ")"); hit++; } //每Hit for (int i = 0; i < hit; i++) { int d; var doNextHit = DamageSystem.ApplyDamage(character, o, skipDodge, damageFactor, skillRate, extraCrit, extraPounce, comboSkill == null && hoverRange == 0 || comboSkill != null && comboSkill.hoverRange == 0, finalDamageBuff == null ? 0 : finalDamageBuff.Factor, out d); damageDic.Add(i, d); if (!doNextHit) { break; } } //如果有最终伤害Buff,且Duration小于0,手动撤销影响。(此处应为倍化术) if (finalDamageBuff != null && finalDamageBuff.Duration < 0) { finalDamageBuff.Undo(character); } //comboSkill是指组合技的第二个技能。这里说明是第一个技能,结合前面的条件,则这里是无连续技的技能逻辑。 if (comboSkill == null) { //寻求合击的逻辑 var comboUnits = DamageSystem.ComboDetect(character, o); if (comboUnits.Count > 0) { for (int i = 0; i < comboUnits.Count; i++) { int d; FinalDamageBuff u_finalDamageBuff = (FinalDamageBuff)comboUnits[i].GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); var ninjaCombo = new NinjaCombo(); ninjaCombo.SetLevel(comboUnits[i].GetComponent <CharacterStatus>().skills["NinjaCombo"]); DamageSystem.ApplyDamage(comboUnits[i], o, false, ninjaCombo.damageFactor, ninjaCombo.skillRate, ninjaCombo.extraCrit, ninjaCombo.extraPounce, ninjaCombo.hoverRange == 0, u_finalDamageBuff == null ? 0 : u_finalDamageBuff.Factor, out d); damageDic.Add(damageDic.Count + i, d); comboUnits[i].GetComponent <Animator>().SetInteger("Skill", 0); } } } FlyNum(damageDic, o); } } } }