4 Commits

Author SHA1 Message Date
4220e94e38 improved overwrite 2025-06-28 14:35:16 +02:00
b0b5e95eda adjusted liquid behavior 2025-05-25 13:12:26 +02:00
7458d5749c imrpvoed water behavior 2025-05-05 20:10:02 +02:00
9a36418d23 activated activateneighbors experiment 2025-05-01 23:46:18 +02:00
3 changed files with 64 additions and 18 deletions

View File

@@ -13,7 +13,6 @@ public class Chunk {
public Chunk NeighborS = null; public Chunk NeighborS = null;
public Chunk NeighborW = null; public Chunk NeighborW = null;
private readonly Image image;
private readonly int sizeX; private readonly int sizeX;
private readonly int sizeY; private readonly int sizeY;
private readonly HashSet<Element> activeElements; private readonly HashSet<Element> activeElements;
@@ -33,9 +32,6 @@ public class Chunk {
} }
activeElements = new HashSet<Element>(sizeX * sizeY); activeElements = new HashSet<Element>(sizeX * sizeY);
image = Image.CreateEmpty(sizeX, sizeY, false, Image.Format.Rgb8);
image.Fill(Colors.Black);
} }
public void Update() { public void Update() {
@@ -73,15 +69,16 @@ public class Chunk {
return; return;
} }
// check if not empty and overwrite not allowed:
if (!Elements[x,y].IsEmpty() && !Main.Instance.AllowOverwrite)
return;
else if (!Elements[x,y].IsEmpty()) {
Elements[x, y].Chunk.RemoveFromChunk(Elements[x, y]);
}
Type type = typeof(T); Type type = typeof(T);
object o = Activator.CreateInstance(type, x, y, this); object o = Activator.CreateInstance(type, x, y, this);
// check if not empty and overwrite not allowed:
if (!Elements[x,y].IsEmpty() && !Main.Instance.AllowOverwrite) {
return;
}
Elements[x, y].Chunk.RemoveFromChunk(Elements[x, y]);
Elements[x, y] = o as Element; Elements[x, y] = o as Element;
Elements[x, y].Active = true; Elements[x, y].Active = true;
} }
@@ -90,10 +87,6 @@ public class Chunk {
return activeElements.Count; return activeElements.Count;
} }
public void Swap(Element what, Vector2I pos) {
Swap(what, Get(pos));
}
public Element Get(Vector2I pos) { public Element Get(Vector2I pos) {
Element e = null; Element e = null;
@@ -129,6 +122,10 @@ public class Chunk {
return Get(pos)?.GetType() == typeof(Element); return Get(pos)?.GetType() == typeof(Element);
} }
public void Swap(Element what, Vector2I pos) {
Swap(what, Get(pos));
}
private void Swap(Element what, Element swapTo) { private void Swap(Element what, Element swapTo) {
if (what == null || swapTo == null) { if (what == null || swapTo == null) {
GD.PrintErr("Trying to swap null"); GD.PrintErr("Trying to swap null");
@@ -155,8 +152,13 @@ public class Chunk {
what.Active = true; what.Active = true;
what.Moved(); what.Moved();
if (what.IsEmpty())
what.ActivateNeighbors();
swapTo.Active = true; swapTo.Active = true;
swapTo.Moved(); swapTo.Moved();
if (swapTo.IsEmpty())
swapTo.ActivateNeighbors();
} }
public override string ToString() { public override string ToString() {

View File

@@ -31,7 +31,7 @@ public class Element{
Chunk.SetElementActive(this, Active); Chunk.SetElementActive(this, Active);
} }
public Element(int x, int y, Chunk chunk) { public Element(int x, int y, Chunk chunk, bool active = true) {
Position.X = x; Position.X = x;
Position.Y = y; Position.Y = y;
Chunk = chunk; Chunk = chunk;
@@ -131,4 +131,23 @@ public class Element{
public bool IsEmpty() { public bool IsEmpty() {
return GetType() == typeof(Element); return GetType() == typeof(Element);
} }
public virtual void ActivateNeighbors() {
Element n = Chunk.Get(Position + Vector2I.Up);
if (n != null && !n.IsEmpty())
n.Active = true;
//
// Element e = Chunk.Get(Position + Vector2I.Right);
// if (e != null && !e.IsEmpty())
// e.Active = true;
//
// Element s = Chunk.Get(Position + Vector2I.Down);
// if (null != s && !s.IsEmpty())
// s.Active = true;
//
// Element w = Chunk.Get(Position + Vector2I.Left);
// if (null != w && !w.IsEmpty())
// w.Active = true;
}
} }

View File

@@ -26,9 +26,34 @@ public abstract class Liquid : Element {
Chunk.Swap(this, Position + Vector2I.Down); Chunk.Swap(this, Position + Vector2I.Down);
else if (Chunk.IsEmpty(Position + randomDirection)) else if (Chunk.IsEmpty(Position + randomDirection))
Chunk.Swap(this, Position + Vector2I.Right * randomDirection); Chunk.Swap(this, Position + randomDirection);
else if (Chunk.IsEmpty(Position + randomDirection * VERTICAL_OPPOSITE))
Chunk.Swap(this, Position + randomDirection * VERTICAL_OPPOSITE);
else if (Chunk.IsEmpty(Position + randomDirection)) else if (Chunk.IsEmpty(Position + 1 * randomDirection))
Chunk.Swap(this, Position + Vector2I.Right * randomDirection * VERTICAL_OPPOSITE); Chunk.Swap(this, Position + 1 * randomDirection);
else if (Chunk.IsEmpty(Position - 1 * randomDirection * VERTICAL_OPPOSITE))
Chunk.Swap(this, Position - 1 * randomDirection * VERTICAL_OPPOSITE);
else if (Chunk.IsEmpty(Position + 2 * randomDirection))
Chunk.Swap(this, Position + 2 * randomDirection);
else if (Chunk.IsEmpty(Position - 2 * randomDirection * VERTICAL_OPPOSITE))
Chunk.Swap(this, Position - 2 * randomDirection * VERTICAL_OPPOSITE);
}
public override void ActivateNeighbors() {
Element n = Chunk.Get(Position + Vector2I.Up);
if (n != null && !n.IsEmpty())
n.Active = true;
// only activate liquids left or right
Element e = Chunk.Get(Position + Vector2I.Right);
if (e != null && e.GetType() == typeof(Liquid))
e.Active = true;
Element s = Chunk.Get(Position + Vector2I.Down);
if (null != s && s.GetType() == typeof(Liquid))
s.Active = true;
} }
} }