public override void Execute(BattleSkillEvent eventInfo) { Status status = AssetHolder.StatusEffects[m_StatusEffect]; float baseDuration = m_Power * eventInfo.Power; if (status.Resistible) { int resist = eventInfo.Target["Resist " + status.Element]; if (resist > 0) { resist = resist < eventInfo.IgnoreResistance ? 0 : resist - eventInfo.IgnoreResistance; } baseDuration *= 0.01f * (100 - resist); } int duration = Mathf.FloorToInt(baseDuration); if (Random.Range(0f, 1f) < baseDuration - duration) { ++duration; } if (duration > 0) { eventInfo.Target.Inflict(status, duration, eventInfo.Time, m_StatusEffect); } else { eventInfo.Manager.Add(new BattleShowAgentMessage(eventInfo.Time, eventInfo.Manager, eventInfo.Target, "Miss")); } }
/* * public BattleManhattanDistanceZone Range(BattleAgent user) * { * switch (m_Range) * { * case "Self": * return new BattleManhattanDistanceZone(user.Coordinates, 0, 0); * case "Adjacent": * return new BattleManhattanDistanceZone(user.Coordinates, 1, 1); * case "Weapon": * Weapon primary = user.BaseCharacter.PrimaryWeapon; * * if (primary != null) * { * if (primary.Type == WeaponType.Bow) * return new BattleManhattanDistanceZone(user.Coordinates, 2, 4); * else if (primary.Type == WeaponType.Gun) * return new BattleManhattanDistanceZone(user.Coordinates, 2, 8); * } * * return new BattleManhattanDistanceZone(user.Coordinates, 1, 1); * case "Radius": * return new BattleManhattanDistanceZone(user.Coordinates, 0, user["Range " + Type]); * case "All": * return new BattleManhattanDistanceZone(user.Coordinates, 0, int.MaxValue); * } * * throw new System.ArgumentException("[Skill] Unrecognized range type: \"" + m_Range + "\""); * } * * public BattleManhattanDistanceZone Target(BattleAgent user, Vector2Int center) * { * switch (m_Target) * { * case "Single": * return new BattleManhattanDistanceZone(center, 0, 0); * case "Area": * return new BattleManhattanDistanceZone(center, 0, user["Area " + Type]); * case "All": * return Range(user); * } * * throw new System.ArgumentException("[Skill] Unrecognized target type: \"" + m_Target + "\""); * } */ public void Execute(BattleSkillEvent eventInfo) { foreach (SkillEffect effect in Effects) { effect.Execute(eventInfo); } }
public override void Execute(BattleSkillEvent eventInfo) { // Calculate resistance int resist = eventInfo.Target["Resist " + m_Element]; if (resist > 0) { resist = resist < eventInfo.IgnoreResistance ? 0 : resist - eventInfo.IgnoreResistance; } // Calculate damage float baseDamage = 0.01f * m_Power * (eventInfo.Power * (100 - resist)); float baseCritical = m_Critical; float damage = baseDamage; float critical = baseCritical; // Trigger pre-events BattleDamageEvent damageEventInfo = new BattleDamageEvent( BattleEvent.Type.BeforeTakeDamage, eventInfo.Manager, eventInfo.Time, eventInfo.Target, m_Element, Random.Range(0f, 1f) < critical ? 2 * Mathf.RoundToInt(damage) : Mathf.RoundToInt(damage) ); eventInfo.Target.Damage(damageEventInfo); }
public override void Execute(BattleManager manager, BattleQueueTime time) { BattleQueueTime.Generator timeAllTargets = new BattleQueueTime.InfiniteGenerator(time); int hpcost = Mathf.RoundToInt(HPCost * Skill.Cost(Agent)); int spcost = Mathf.RoundToInt(SPCost * Skill.Cost(Agent)); if (Agent.HP <= hpcost || Agent.SP < spcost) { return; } Agent.HP -= hpcost; Agent.SP -= spcost; foreach (Vector2Int point in Target) { BattleTile tile = manager.grid[point]; if (tile != null && tile.Actor != null) { BattleQueueTime.Generator timeThisTarget = new BattleQueueTime.FiniteGenerator(timeAllTargets.Generate(), 5); BattleAgent target = tile.Actor.Agent; // Trigger any events before the user uses the skill BattleSkillEvent eventInfo = new BattleSkillEvent( BattleEvent.Type.BeforeUseSkill, manager, timeThisTarget.Generate(), Agent, target, Skill ); eventInfo.Power = Mathf.RoundToInt(eventInfo.Power * Power); Agent.OnTrigger(eventInfo); // Trigger any events before the target is targeted by the skill eventInfo.Time = timeThisTarget.Generate(); eventInfo.Event = BattleEvent.Type.BeforeTargetedBySkill; target.OnTrigger(eventInfo); // Animate the skill if (Skill.Animation != null) { manager.Add(new BattleSpecialEffectAnimation(timeThisTarget.Generate(), Skill.Animation, eventInfo.Target)); } // Make the skill happen eventInfo.Time = timeThisTarget.Generate(); Skill.Execute(eventInfo); // Trigger any events after the target is targeted by the skill eventInfo.Time = timeThisTarget.Generate(); eventInfo.Event = BattleEvent.Type.AfterTargetedBySkill; target.OnTrigger(eventInfo); } } }
public override void Execute(StatusEvent eventInfo) { BattleSkillEvent skillEvent = eventInfo.Event as BattleSkillEvent; if (skillEvent != null) { skillEvent.Target = skillEvent.User; skillEvent.Power = Mathf.RoundToInt(skillEvent.Power * m_Power); } }
public override void Execute(StatusEvent eventInfo) { BattleSkillEvent skillEvent = eventInfo.Event as BattleSkillEvent; if (skillEvent != null) { skillEvent.IgnoreResistance += m_IgnoreResistance; Debug.Log("Activated."); } }
public override void Execute(StatusEvent eventInfo) { BattleSkillEvent skillEventInfo = eventInfo.Event as BattleSkillEvent; if (skillEventInfo != null) { Skill skill = skillEventInfo.Skill; if (skill.Type.StartsWith(m_Type) && skill.Element.StartsWith(m_Element)) { base.Execute(eventInfo); } } }
public override void Execute(BattleSkillEvent eventInfo) { float k = 0.7f + (0.2f * Accuracy * eventInfo.User["Accuracy"]) - (0.2f * eventInfo.Target["Evasion"]); float baseHitChance = 0.5f * (1f + Erf(k)); float hitChance = baseHitChance; if (Random.Range(0f, 1f) < hitChance) { foreach (SkillEffect effect in Effects) { effect.Execute(eventInfo); } } else { eventInfo.Manager.Add(new BattleShowAgentMessage(eventInfo.Time, eventInfo.Manager, eventInfo.Target, "Miss")); } }
public override void Execute(BattleSkillEvent eventInfo) { BattleManager manager = GameObject.FindObjectOfType <BattleManager>(); manager.Add(new BattleShowAgentReport(eventInfo.Time, eventInfo.Target)); }
public abstract void Execute(BattleSkillEvent eventInfo);