public List <Animation> GetAnimations(Creature.CharacterMode mode) { return (OrientationStrings.Where((t, i) => HasAnimation(mode, (Orientation)i)) .Select(t => Animations[mode.ToString() + t]) .ToList()); }
public static Animation CreateAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, List <int> cols) { List <Point> frames = new List <Point>(); int numCols = texture.Width / frameWidth; if (cols.Count == 0) { for (int i = 0; i < numCols; i++) { frames.Add(new Point(i, row)); } } else { frames.AddRange(cols.Select(c => new Point(c, row))); } return(new Animation(GameState.Game.GraphicsDevice, texture, mode.ToString() + OrientationStrings[(int)orient], frameWidth, frameHeight, frames, true, Color.White, frameHz, (float)frameWidth / 35.0f, (float)frameHeight / 35.0f, false)); }
public void PlayAnimations(Creature.CharacterMode mode) { List <Animation> animations = GetAnimations(mode); foreach (Animation a in animations) { a.IsPlaying = true; } }
public void ResetAnimations(Creature.CharacterMode mode) { List <Animation> animations = GetAnimations(mode); foreach (Animation a in animations) { a.Reset(); } }
public static Animation CreateAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, params int[] cols) { return(CreateAnimation(mode, orient, texture, frameHz, frameWidth, frameHeight, row, cols.ToList())); }
public Animation GetAnimation(Creature.CharacterMode mode, Orientation orient) { if (HasAnimation(mode, orient)) { return(Animations[mode.ToString() + OrientationStrings[(int)orient]]); } else { return(null); } }
public void AddAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, params int[] cols) { List <int> ints = new List <int>(); ints.AddRange(cols); Animation animation = CreateAnimation(mode, orient, texture, frameHz, frameWidth, frameHeight, row, ints); Animations[mode.ToString() + OrientationStrings[(int)orient]] = animation; animation.Play(); }
public static CompositeAnimation CreateCompositeAnimation(Creature.CharacterMode mode, Orientation orient, string composite, float frameHz, List <SpriteSheet> layers, List <Color> tints, params int[][] frames ) { return(new CompositeAnimation(composite, layers, tints, frames) { FrameHZ = frameHz, Name = mode.ToString() + OrientationStrings[(int)orient], Loops = true, CurrentFrame = 0 }); }
public bool HasAnimation(Creature.CharacterMode mode, Orientation orient) { return(Animations.ContainsKey(mode.ToString() + OrientationStrings[(int)orient])); }
public override IEnumerable <Status> Run() { if (CurrentAttack == null) { yield return(Status.Fail); yield break; } Timeout.Reset(); FailTimer.Reset(); if (Target == null && TargetName != null) { Target = Agent.Blackboard.GetData <Body>(TargetName); if (Target == null) { yield return(Status.Fail); yield break; } } Inventory targetInventory = Target.GetComponent <Inventory>(); if (targetInventory != null) { targetInventory.OnDeath += targetInventory_OnDeath; } Creature.CharacterMode defaultCharachterMode = Creature.AI.Movement.CanFly ? Creature.CharacterMode.Flying : Creature.CharacterMode.Walking; bool avoided = false; while (true) { Timeout.Update(DwarfTime.LastTime); FailTimer.Update(DwarfTime.LastTime); if (FailTimer.HasTriggered) { Creature.Physics.Orientation = Physics.OrientMode.RotateY; Creature.OverrideCharacterMode = false; Creature.CurrentCharacterMode = defaultCharachterMode; yield return(Status.Fail); yield break; } if (Timeout.HasTriggered) { if (Training) { Agent.AddXP(1); Creature.Physics.Orientation = Physics.OrientMode.RotateY; Creature.OverrideCharacterMode = false; Creature.CurrentCharacterMode = defaultCharachterMode; yield return(Status.Success); yield break; } else { Creature.Physics.Orientation = Physics.OrientMode.RotateY; Creature.OverrideCharacterMode = false; Creature.CurrentCharacterMode = defaultCharachterMode; yield return(Status.Fail); yield break; } } if (Target == null || Target.IsDead) { Creature.CurrentCharacterMode = defaultCharachterMode; Creature.Physics.Orientation = Physics.OrientMode.RotateY; yield return(Status.Success); } // Find the location of the melee target Vector3 targetPos = new Vector3(Target.GlobalTransform.Translation.X, Target.GetBoundingBox().Min.Y, Target.GlobalTransform.Translation.Z); Vector2 diff = new Vector2(targetPos.X, targetPos.Z) - new Vector2(Creature.AI.Position.X, Creature.AI.Position.Z); Creature.Physics.Face(targetPos); bool intersectsbounds = Creature.Physics.BoundingBox.Intersects(Target.BoundingBox); // If we are really far from the target, something must have gone wrong. if (!intersectsbounds && diff.Length() > CurrentAttack.Range * 8) { Creature.Physics.Orientation = Physics.OrientMode.RotateY; Creature.OverrideCharacterMode = false; Creature.CurrentCharacterMode = defaultCharachterMode; yield return(Status.Fail); } // If we're out of attack range, run toward the target. if (!Creature.AI.Movement.IsSessile && !intersectsbounds && diff.Length() > CurrentAttack.Range) { if (Creature.AI.Raycast(Target.Position)) { yield return(Status.Fail); yield break; } Creature.CurrentCharacterMode = defaultCharachterMode; Vector3 output = Creature.Controller.GetOutput(DwarfTime.Dt, targetPos, Creature.Physics.GlobalTransform.Translation) * 0.9f; output.Y = 0.0f; if (Creature.AI.Movement.CanFly) { Creature.Physics.ApplyForce(-Creature.Physics.Gravity, DwarfTime.Dt); } if (Creature.AI.Movement.IsSessile) { output *= 0.0f; } Creature.Physics.ApplyForce(output, DwarfTime.Dt); Creature.Physics.Orientation = Physics.OrientMode.RotateY; } // If we have a ranged weapon, try avoiding the target for a few seconds to get within range. else if (!Creature.AI.Movement.IsSessile && !intersectsbounds && !avoided && (CurrentAttack.Mode == Attack.AttackMode.Ranged && diff.Length() < CurrentAttack.Range * 0.15f)) { FailTimer.Reset(); foreach (Act.Status stat in AvoidTarget(CurrentAttack.Range, 3.0f)) { yield return(Status.Running); } avoided = true; } // Else, stop and attack else { if (Creature.AI.Raycast(Target.Position)) { yield return(Status.Fail); yield break; } FailTimer.Reset(); avoided = false; Creature.Physics.Orientation = Physics.OrientMode.Fixed; Creature.Physics.Velocity = new Vector3(Creature.Physics.Velocity.X * 0.9f, Creature.Physics.Velocity.Y, Creature.Physics.Velocity.Z * 0.9f); CurrentAttack.RechargeTimer.Reset(CurrentAttack.RechargeRate); Creature.Sprite.ResetAnimations(Creature.CharacterMode.Attacking); Creature.Sprite.PlayAnimations(Creature.CharacterMode.Attacking); Creature.CurrentCharacterMode = Creature.CharacterMode.Attacking; while (!CurrentAttack.Perform(Creature, Target, DwarfTime.LastTime, Creature.Stats.BuffedStr + Creature.Stats.BuffedSiz, Creature.AI.Position, Creature.Faction.Name)) { Creature.Physics.Velocity = new Vector3(Creature.Physics.Velocity.X * 0.9f, Creature.Physics.Velocity.Y, Creature.Physics.Velocity.Z * 0.9f); if (Creature.AI.Movement.CanFly) { Creature.Physics.ApplyForce(-Creature.Physics.Gravity, DwarfTime.Dt); } yield return(Status.Running); } while (!Agent.Creature.Sprite.CurrentAnimation.IsDone()) { if (Creature.AI.Movement.CanFly) { Creature.Physics.ApplyForce(-Creature.Physics.Gravity, DwarfTime.Dt); } yield return(Status.Running); } Creature.CurrentCharacterMode = Creature.CharacterMode.Attacking; Creature.Sprite.PauseAnimations(Creature.CharacterMode.Attacking); CurrentAttack.RechargeTimer.Reset(CurrentAttack.RechargeRate); Vector3 dogfightTarget = Vector3.Zero; while (!CurrentAttack.RechargeTimer.HasTriggered && !Target.IsDead) { CurrentAttack.RechargeTimer.Update(DwarfTime.LastTime); if (CurrentAttack.Mode == Attack.AttackMode.Dogfight) { Creature.CurrentCharacterMode = Creature.CharacterMode.Flying; dogfightTarget += MathFunctions.RandVector3Cube() * 0.1f; Vector3 output = Creature.Controller.GetOutput(DwarfTime.Dt, dogfightTarget + Target.Position, Creature.Physics.GlobalTransform.Translation) * 0.9f; Creature.Physics.ApplyForce(output - Creature.Physics.Gravity, DwarfTime.Dt); } else { Creature.Sprite.PauseAnimations(Creature.CharacterMode.Attacking); Creature.Physics.Velocity = new Vector3(Creature.Physics.Velocity.X * 0.9f, Creature.Physics.Velocity.Y, Creature.Physics.Velocity.Z * 0.9f); if (Creature.AI.Movement.CanFly) { Creature.Physics.ApplyForce(-Creature.Physics.Gravity, DwarfTime.Dt); } } yield return(Status.Running); } Creature.CurrentCharacterMode = defaultCharachterMode; Creature.Physics.Orientation = Physics.OrientMode.RotateY; if (Target.IsDead) { if (Creature.Faction.ChopDesignations.Contains(Target)) { Creature.Faction.ChopDesignations.Remove(Target); } if (Creature.Faction.AttackDesignations.Contains(Target)) { Creature.Faction.AttackDesignations.Remove(Target); } Target = null; Agent.AddXP(10); Creature.Physics.Face(Creature.Physics.Velocity + Creature.Physics.GlobalTransform.Translation); Creature.Stats.NumThingsKilled++; Creature.AI.AddThought(Thought.ThoughtType.KilledThing); Creature.Physics.Orientation = Physics.OrientMode.RotateY; Creature.OverrideCharacterMode = false; Creature.CurrentCharacterMode = defaultCharachterMode; yield return(Status.Success); break; } } yield return(Status.Running); } }