refactoring

This commit is contained in:
2025-05-01 23:34:31 +02:00
parent c41cdd57c4
commit f932ae1bcd
4 changed files with 40 additions and 35 deletions

View File

@@ -61,7 +61,7 @@ public class Chunk {
} }
public void SetElementActive(Element e, bool active) { public void SetElementActive(Element e, bool active) {
if (e.GetType() == typeof(Element) && active) return; if (e.GetType() == typeof(Element)) return;
if (active) AddToChunk(e); if (active) AddToChunk(e);
else RemoveFromChunk(e); else RemoveFromChunk(e);

View File

@@ -6,8 +6,8 @@ public class Element{
public Chunk Chunk; public Chunk Chunk;
public Vector2I Position; public Vector2I Position;
public int Density;
protected int Density;
protected int DiffuseSpeed = 10; protected int DiffuseSpeed = 10;
protected Color color = Colors.Black; protected Color color = Colors.Black;
protected const int MAX_DIFFUSE_SPEED = 100; protected const int MAX_DIFFUSE_SPEED = 100;
@@ -17,37 +17,40 @@ public class Element{
private const float MAX_COLOR_VARIANCE = 0.1f; private const float MAX_COLOR_VARIANCE = 0.1f;
private bool active = false; private bool active = false;
private bool markedForUpdate = true;
private int lastUpdate = -1; private int lastUpdate = -1;
private int lastMove = 0; private int lastMove = 0;
private Color originalColor; private Color originalColor;
private bool markedForUpdate = false;
public Element(Element e) { public Element(Element e) {
Position = e.Position; Position = e.Position;
Chunk = e.Chunk; Chunk = e.Chunk;
lastMove = Engine.GetFramesDrawn(); Active = e.active;
lastMove = e.lastMove;
lastUpdate = e.lastUpdate;
Chunk.SetElementActive(this, Active);
} }
public Element(int x, int y, Chunk chunk) { public Element(int x, int y, Chunk chunk) {
Position.X = x; Position.X = x;
Position.Y = y; Position.Y = y;
Chunk = chunk; Chunk = chunk;
Active = active; lastMove = Engine.GetFramesDrawn();
Chunk.SetElementActive(this, Active);
} }
public bool Active { public bool Active {
get => active; get => active;
set { set {
if (active == value) return; if (active == value) return;
active = value; active = value;
Chunk.SetElementActive(this, value); Chunk.SetElementActive(this, value);
lastMove = Engine.GetFramesDrawn();
if (!active) if (active) {
ResetColor();
else
Moved(); Moved();
} else {
ResetColor();
}
} }
} }
@@ -68,7 +71,6 @@ public class Element{
return false; // already updated this frame return false; // already updated this frame
lastUpdate = frame; lastUpdate = frame;
return true; return true;
} }
@@ -76,29 +78,7 @@ public class Element{
return $"{GetType()} {Position}[{Chunk.Index}] {active}"; return $"{GetType()} {Position}[{Chunk.Index}] {active}";
} }
protected virtual void Tick() { protected virtual void Tick() { }
Vector2I randomDirection = RandomDirectionDown();
// fall speed reduction:
if (GD.Randi() % MAX_DIFFUSE_SPEED > DiffuseSpeed) return; // descend slower
if (Chunk.IsEmpty(Position + Vector2I.Down))
Chunk.Swap(this, Position + Vector2I.Down);
else if (Chunk.IsEmpty(Position + Vector2I.Down + randomDirection))
Chunk.Swap(this, Position + Vector2I.Down + randomDirection);
else if (Chunk.IsEmpty(Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE))
Chunk.Swap(this, Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE);
// density check
if (Chunk.Get(Position + Vector2I.Down)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down);
else if (Chunk.Get(Position + Vector2I.Down + randomDirection)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down + randomDirection);
else if (Chunk.Get(Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE);
}
protected Vector2I RandomDirectionDown() { protected Vector2I RandomDirectionDown() {
int randomDirection = GD.Randi() % 2 != 0 ? 1 : -1; int randomDirection = GD.Randi() % 2 != 0 ? 1 : -1;

View File

@@ -17,7 +17,7 @@ public abstract class Liquid : Element {
return true; // not necessarily end, subclasses could do some more things return true; // not necessarily end, subclasses could do some more things
} }
protected override void Tick() { protected virtual void Tick() {
Vector2I randomDirection = RandomDirectionDown(); Vector2I randomDirection = RandomDirectionDown();
if (randomDirection.Y != 0) if (randomDirection.Y != 0)
randomDirection *= Vector2I.Left * (int)(GD.Randi() % MAX_VERTICAL_SPREAD); randomDirection *= Vector2I.Left * (int)(GD.Randi() % MAX_VERTICAL_SPREAD);

View File

@@ -14,4 +14,29 @@ public abstract class Solid : Element {
return true; // not necessarily end, subclasses could do some more things return true; // not necessarily end, subclasses could do some more things
} }
protected virtual void Tick() {
Vector2I randomDirection = RandomDirectionDown();
// fall speed reduction:
if (GD.Randi() % MAX_DIFFUSE_SPEED > DiffuseSpeed) return; // descend slower
if (Chunk.IsEmpty(Position + Vector2I.Down))
Chunk.Swap(this, Position + Vector2I.Down);
else if (Chunk.IsEmpty(Position + Vector2I.Down + randomDirection))
Chunk.Swap(this, Position + Vector2I.Down + randomDirection);
else if (Chunk.IsEmpty(Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE))
Chunk.Swap(this, Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE);
// density check
if (Chunk.Get(Position + Vector2I.Down)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down);
else if (Chunk.Get(Position + Vector2I.Down + randomDirection)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down + randomDirection);
else if (Chunk.Get(Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE)?.Density < Density)
Chunk.Swap(this, Position + Vector2I.Down + randomDirection * VERTICAL_OPPOSITE);
}
} }