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) { BattleDamageEvent eventInfo = new BattleDamageEvent( BattleEvent.Type.BeforeTakeDamage, manager, time, m_Agent, m_Element, m_Damage ); m_Agent.Damage(eventInfo); }
public override void Execute(StatusEvent eventInfo) { BattleDamageEvent damageEventInfo = eventInfo.Event as BattleDamageEvent; if (damageEventInfo != null) { if (((damageEventInfo.Damage > 0 && m_Damaged) || (damageEventInfo.Damage < 0 && !m_Damaged)) && (m_Element == Element.Null || damageEventInfo.Element == m_Element)) { base.Execute(eventInfo); } } }
/// <summary> /// Cause the agent to take damage. /// </summary> /// <param name="eventInfo">Information about the damage to be taken</param> public void Damage(BattleDamageEvent eventInfo) { BattleQueueTime.Generator time = new BattleQueueTime.FiniteGenerator(eventInfo.Time, 3); string message = eventInfo.Damage < 0 ? (-eventInfo.Damage).ToString() : eventInfo.Damage.ToString(); Color color = Color.white; // Pre-events eventInfo.Event = BattleEvent.Type.BeforeTakeDamage; eventInfo.Time = time.Generate(); OnTrigger(eventInfo); // CP damage if (eventInfo.Affects == BattleDamageEvent.DamageTo.CP) { CP -= eventInfo.Damage; if (CP < 0) { CP = 0; } if (CP > 100) { CP = 100; } message += " CP"; } // SP damage if (eventInfo.Affects == BattleDamageEvent.DamageTo.SP) { SP -= eventInfo.Damage; if (SP < 0) { SP = 0; } if (SP > this["SP"]) { SP = this["SP"]; } message += " SP"; } // HP damage if (eventInfo.Affects == BattleDamageEvent.DamageTo.HP) { int hp = HP - eventInfo.Damage; if (hp <= 0) { if (HP > 0) // Inflict critical status { Inflict(AssetHolder.StatusEffects["Critical"], 1, time.Generate(), "Critical"); } else if (eventInfo.Damage > 1) // Inflict KO status { Inflict(AssetHolder.StatusEffects["KO"], int.MaxValue, time.Generate(), "KO"); } HP = 0; CP = 0; message = ""; } else { if (hp > this["HP"]) { HP = this["HP"]; } else { HP = hp; } } } // Show damage taken if (!message.Equals("")) { eventInfo.Manager.Add(new BattleShowAgentMessage( time.Generate(), eventInfo.Manager, this, message, color )); } // Post-effects eventInfo.Event = BattleEvent.Type.AfterTakeDamage; eventInfo.Time = time.Generate(); OnTrigger(eventInfo); }