A WIP automation game
1using System.Numerics;
2
3namespace Electropunk.World;
4
5public class MovementMode
6{
7 public bool Frozen = false;
8 public bool Collides = true;
9 public float MinSpeed = 0.10f;
10 public float Friction = 1.50f;
11 public float SpeedMod = 0.00f;
12
13 public void Move(Level level, Entity e)
14 {
15 if (Frozen)
16 return;
17
18 Vector2 delta = e.Vel * (e.Speed + SpeedMod) * Program.DeltaTime;
19
20 if (Collides)
21 {
22 if (delta.X != 0 && !e.CanMoveInDirection(level, new(delta.X, 0)))
23 delta.X = 0;
24 if (delta.Y != 0 && !e.CanMoveInDirection(level, new(0, delta.Y)))
25 delta.Y = 0;
26 }
27
28 e.Pos += delta;
29
30 if (e.Vel.X > -MinSpeed && e.Vel.X < MinSpeed)
31 e.Vel.X = 0;
32 else if (e.Vel.X != 0)
33 e.Vel.X /= Friction;
34
35 if (e.Vel.Y > -MinSpeed && e.Vel.Y < MinSpeed)
36 e.Vel.Y = 0;
37 else if (e.Vel.Y != 0)
38 e.Vel.Y /= Friction;
39 }
40
41 public static readonly MovementMode None = new() { Frozen = true };
42 public static readonly MovementMode Default = new();
43 public static readonly MovementMode Flying = new() {
44 Collides = false,
45 Friction = 1.05f,
46 SpeedMod = 0.25f
47 };
48}