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(BattleManager manager, BattleQueueTime time) { BattleQueueTime.Generator t = new BattleQueueTime.FiniteGenerator(time, Sequence.Count); foreach (BattleAction action in Sequence) { manager.Add(new BattleActionExecution(t.Generate(), action)); } }
public override bool QUpdate(BattleManager manager) { if (m_Agent.CP < 100) { return(true); } BattleAction decision = m_Decider.Update(); if (decision != null) { BattleQueueTime.Generator t = new BattleQueueTime.FiniteGenerator(time - 1, 2); decision.Execute(manager, t.Generate()); time = t.Generate(); manager.Add(this); return(true); } return(false); }
/// <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); }