refactoring
This commit is contained in:
@@ -6,8 +6,8 @@ public class Element{
|
||||
|
||||
public Chunk Chunk;
|
||||
public Vector2I Position;
|
||||
public int Density;
|
||||
|
||||
protected int Density;
|
||||
protected int DiffuseSpeed = 10;
|
||||
protected Color color = Colors.Black;
|
||||
protected const int MAX_DIFFUSE_SPEED = 100;
|
||||
@@ -17,37 +17,40 @@ public class Element{
|
||||
private const float MAX_COLOR_VARIANCE = 0.1f;
|
||||
|
||||
private bool active = false;
|
||||
private bool markedForUpdate = true;
|
||||
private int lastUpdate = -1;
|
||||
private int lastMove = 0;
|
||||
private Color originalColor;
|
||||
private bool markedForUpdate = false;
|
||||
|
||||
public Element(Element e) {
|
||||
Position = e.Position;
|
||||
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) {
|
||||
Position.X = x;
|
||||
Position.Y = y;
|
||||
Chunk = chunk;
|
||||
Active = active;
|
||||
lastMove = Engine.GetFramesDrawn();
|
||||
Chunk.SetElementActive(this, Active);
|
||||
}
|
||||
|
||||
public bool Active {
|
||||
get => active;
|
||||
set {
|
||||
if (active == value) return;
|
||||
|
||||
active = value;
|
||||
Chunk.SetElementActive(this, value);
|
||||
lastMove = Engine.GetFramesDrawn();
|
||||
|
||||
if (!active)
|
||||
ResetColor();
|
||||
else
|
||||
if (active) {
|
||||
Moved();
|
||||
} else {
|
||||
ResetColor();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +71,6 @@ public class Element{
|
||||
return false; // already updated this frame
|
||||
|
||||
lastUpdate = frame;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -76,29 +78,7 @@ public class Element{
|
||||
return $"{GetType()} {Position}[{Chunk.Index}] {active}";
|
||||
}
|
||||
|
||||
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 virtual void Tick() { }
|
||||
|
||||
protected Vector2I RandomDirectionDown() {
|
||||
int randomDirection = GD.Randi() % 2 != 0 ? 1 : -1;
|
||||
|
||||
@@ -17,7 +17,7 @@ public abstract class Liquid : Element {
|
||||
return true; // not necessarily end, subclasses could do some more things
|
||||
}
|
||||
|
||||
protected override void Tick() {
|
||||
protected virtual void Tick() {
|
||||
Vector2I randomDirection = RandomDirectionDown();
|
||||
if (randomDirection.Y != 0)
|
||||
randomDirection *= Vector2I.Left * (int)(GD.Randi() % MAX_VERTICAL_SPREAD);
|
||||
|
||||
@@ -14,4 +14,29 @@ public abstract class Solid : Element {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user