using Client.Domain.AI.State; using Client.Domain.Entities; using Client.Domain.Service; using Client.Domain.ValueObjects; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Client.Domain.AI.Deleveling { public class TransitionBuilder : TransitionBuilderInterface { public List Build() { if (transitions.Count == 0) { transitions = new List() { new(new List{BaseState.Type.Any}, BaseState.Type.Dead, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } return worldHandler.Hero.VitalStats.IsDead; }), new(new List{BaseState.Type.Dead}, BaseState.Type.Idle, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } return !worldHandler.Hero.VitalStats.IsDead; }), new(new List{BaseState.Type.FindGuard}, BaseState.Type.MoveToTarget, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } return worldHandler.Hero.Target != null; }), new(new List{BaseState.Type.MoveToTarget}, BaseState.Type.Idle, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } return worldHandler.Hero.Target == null; }), new(new List{BaseState.Type.MoveToTarget}, BaseState.Type.AttackGuard, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } if (worldHandler.Hero.Target == null) { return false; } var distance = worldHandler.Hero.Transform.Position.HorizontalDistance(worldHandler.Hero.Target.Transform.Position); var expectedDistance = config.Deleveling.AttackDistance; return distance < expectedDistance; }), new(new List{BaseState.Type.AttackGuard}, BaseState.Type.FindGuard, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } if (worldHandler.Hero.Target == null) { return true; } var distance = worldHandler.Hero.Transform.Position.HorizontalDistance(worldHandler.Hero.Target.Transform.Position); var expectedDistance = config.Deleveling.AttackDistance; return distance >= expectedDistance; }), new(new List{BaseState.Type.Idle}, BaseState.Type.FindGuard, (worldHandler, config, state) => { if (worldHandler.Hero == null) { return false; } return worldHandler.Hero.ExperienceInfo.Level > config.Deleveling.TargetLevel; }), }; } return transitions; } private List transitions = new List(); } }