using Godot; namespace FOU.Scripts.Elements; public class Element { public Color Color = Colors.Black; public Vector2I Position; protected readonly float MaxColorVariance = 0.1f; protected readonly Level Level; private int lastUpdate = -1; public Element(Element e) { Position = e.Position; Level = e.Level; } public Element(int x, int y, Level level) { Position.X = x; Position.Y = y; Level = level; } /// /// base update method, checks if anything is to do at all /// /// /// false if there is nothing to do public virtual bool Update(int currentFrame) { if (lastUpdate == currentFrame) return false; // already updated this frame lastUpdate = currentFrame; return true; } public override string ToString() { return $"{GetType()} {Position}"; } protected virtual void Tick() { int randomDirection = 1; if (GD.Randi() % 2 != 0) randomDirection *= -1; if (Level.IsEmpty(Position + Vector2I.Down)) { Level.Swap(this, Position + Vector2I.Down); } else if (Level.IsEmpty(Position + Vector2I.Down + Vector2I.Right * randomDirection)) { Level.Swap(this, Position + Vector2I.Right * randomDirection); } else if (Level.IsEmpty(Position + Vector2I.Down + Vector2I.Right * randomDirection * -1)) { Level.Swap(this, Position + Vector2I.Right*randomDirection); } } protected Color AddColorVariance(Color baseColor) { Color c = baseColor; c.R += (GD.Randf() - 1) * MaxColorVariance; c.G += (GD.Randf() - 1) * MaxColorVariance; c.B += (GD.Randf() - 1) * MaxColorVariance; return c; } }