From c5374f5f6e7b27ea2655e8397118bafd4546d08d Mon Sep 17 00:00:00 2001 From: ondra Date: Mon, 28 Apr 2014 12:17:04 +0200 Subject: [PATCH] Reworked tile system --- src/mightypork/rogue/world/tile/Tile.java | 77 +++++++++++++++---- src/mightypork/rogue/world/tile/TileType.java | 35 ++++++++- .../rogue/world/tile/tiles/BasicTile.java | 58 -------------- .../rogue/world/tile/tiles/DoorTile.java | 35 ++------- .../rogue/world/tile/tiles/FloorTile.java | 26 +------ .../{TileWithItems.java => GroundTile.java} | 45 ++++++++--- .../rogue/world/tile/tiles/NullTile.java | 34 ++++---- .../rogue/world/tile/tiles/SolidTile.java | 43 +++++++++++ .../rogue/world/tile/tiles/WallTile.java | 29 +------ 9 files changed, 202 insertions(+), 180 deletions(-) delete mode 100644 src/mightypork/rogue/world/tile/tiles/BasicTile.java rename src/mightypork/rogue/world/tile/tiles/{TileWithItems.java => GroundTile.java} (65%) create mode 100644 src/mightypork/rogue/world/tile/tiles/SolidTile.java diff --git a/src/mightypork/rogue/world/tile/Tile.java b/src/mightypork/rogue/world/tile/Tile.java index 719caf8..85c1520 100644 --- a/src/mightypork/rogue/world/tile/Tile.java +++ b/src/mightypork/rogue/world/tile/Tile.java @@ -7,7 +7,7 @@ import java.util.Stack; import mightypork.rogue.world.item.Item; import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.render.TileRenderContext; -import mightypork.util.files.ion.IonBinary; +import mightypork.util.annotations.DefaultImpl; import mightypork.util.files.ion.IonBinaryHeadless; import mightypork.util.files.ion.IonInput; import mightypork.util.files.ion.IonOutput; @@ -31,14 +31,12 @@ public abstract class Tile implements IonBinaryHeadless { protected final Stack items = new Stack<>(); - // temporary flag for map. protected boolean occupied; protected boolean explored; - public Tile(int id, TileRenderer renderer) - { + public Tile(int id, TileRenderer renderer) { this.id = id; this.renderer = renderer; } @@ -47,7 +45,17 @@ public abstract class Tile implements IonBinaryHeadless { /** * Render the tile, using the main texture sheet. */ - public abstract void renderTile(TileRenderContext context); + @DefaultImpl + public void renderTile(TileRenderContext context) + { + if (!isExplored()) return; + + renderer.renderTile(context); + + if (doesReceiveShadow()) renderer.renderShadows(context); + + renderer.renderUnexploredFog(context); + } /** @@ -56,7 +64,8 @@ public abstract class Tile implements IonBinaryHeadless { * * @param context */ - public abstract void renderExtra(TileRenderContext context); + @DefaultImpl + public void renderExtra(TileRenderContext context) {} @Override @@ -121,27 +130,69 @@ public abstract class Tile implements IonBinaryHeadless { } - public abstract void update(Level level, double delta); + @DefaultImpl + public void update(Level level, double delta) + { + } - public abstract boolean isWalkable(); + /** + * Check if this tile is right now walkable.
+ * If type is not potentially walkable, this method must return false. + * + * @return true if currently walkable + */ + @DefaultImpl + public boolean isWalkable() + { + return isPotentiallyWalkable(); + } - public abstract boolean isPotentiallyWalkable(); + public final boolean isPotentiallyWalkable() + { + return getType().isPotentiallyWalkable(); + } public abstract TileType getType(); - public abstract boolean canHaveItems(); + public abstract boolean doesCastShadow(); - public abstract boolean doesCastShadow(); + @DefaultImpl + public boolean doesReceiveShadow() + { + return !doesCastShadow(); + } - public abstract boolean doesReceiveShadow(); + public final Color getMapColor() + { + return getType().getMapColor(); + } + + /** + * Drop item onto this tile + * + * @param item + * @return true if dropped + */ + public abstract boolean dropItem(Item item); - public abstract Color getMapColor(); + + /** + * Remove an item from this tile + * @return the picked item, or null if none + */ + public abstract Item pickItem(); + + + /** + * @return true if the tile has dropped items + */ + public abstract boolean hasItem(); } diff --git a/src/mightypork/rogue/world/tile/TileType.java b/src/mightypork/rogue/world/tile/TileType.java index d84fa70..85633b5 100644 --- a/src/mightypork/rogue/world/tile/TileType.java +++ b/src/mightypork/rogue/world/tile/TileType.java @@ -1,6 +1,11 @@ package mightypork.rogue.world.tile; +import mightypork.util.math.color.Color; +import mightypork.util.math.color.PAL16; +import mightypork.util.math.color.RGB; + + /** * Kinds of tiles * @@ -8,5 +13,33 @@ package mightypork.rogue.world.tile; */ public enum TileType { - NULL, FLOOR, WALL, DOOR; + /** No tile */ + NULL(RGB.NONE, false), + /** Floor tile */ + FLOOR(RGB.GRAY_DARK, true), + /** Wall tile */ + WALL(RGB.GRAY_LIGHT, false), + /** Door/gate tile */ + DOOR(PAL16.NEWPOOP, true); + + private final Color mapColor; + private final boolean potentiallyWalkable; + + + private TileType(Color mapColor, boolean potentiallyWalkable) { + this.mapColor = mapColor; + this.potentiallyWalkable = potentiallyWalkable; + } + + + public Color getMapColor() + { + return mapColor; + } + + + public boolean isPotentiallyWalkable() + { + return potentiallyWalkable; + } } diff --git a/src/mightypork/rogue/world/tile/tiles/BasicTile.java b/src/mightypork/rogue/world/tile/tiles/BasicTile.java deleted file mode 100644 index 250ef68..0000000 --- a/src/mightypork/rogue/world/tile/tiles/BasicTile.java +++ /dev/null @@ -1,58 +0,0 @@ -package mightypork.rogue.world.tile.tiles; - - -import mightypork.rogue.world.level.Level; -import mightypork.rogue.world.level.render.TileRenderContext; -import mightypork.rogue.world.tile.Tile; -import mightypork.rogue.world.tile.TileRenderer; -import mightypork.util.annotations.DefaultImpl; - - -public abstract class BasicTile extends Tile { - - public BasicTile(int id, TileRenderer renderer) - { - super(id, renderer); - } - - - @Override - public boolean isWalkable() - { - return isPotentiallyWalkable(); - } - - - @Override - public void renderTile(TileRenderContext context) - { - if (!isExplored()) return; - - renderer.renderTile(context); - - if (doesReceiveShadow()) renderer.renderShadows(context); - - renderer.renderUnexploredFog(context); - } - - - @Override - @DefaultImpl - public void renderExtra(TileRenderContext context) - { - } - - - @Override - @DefaultImpl - public void update(Level level, double delta) - { - } - - - @Override - public boolean doesReceiveShadow() - { - return !doesCastShadow(); - } -} diff --git a/src/mightypork/rogue/world/tile/tiles/DoorTile.java b/src/mightypork/rogue/world/tile/tiles/DoorTile.java index 8fafff7..5dea905 100644 --- a/src/mightypork/rogue/world/tile/tiles/DoorTile.java +++ b/src/mightypork/rogue/world/tile/tiles/DoorTile.java @@ -1,46 +1,25 @@ package mightypork.rogue.world.tile.tiles; + import mightypork.rogue.world.tile.TileRenderer; import mightypork.rogue.world.tile.TileType; -import mightypork.util.math.color.Color; -import mightypork.util.math.color.PAL16; - -public class DoorTile extends BasicTile { - public DoorTile(int id, TileRenderer renderer) - { +public class DoorTile extends SolidTile { + + public DoorTile(int id, TileRenderer renderer) { super(id, renderer); } - + @Override - public boolean isPotentiallyWalkable() + public boolean isWalkable() { return true; } - + @Override public TileType getType() { return TileType.DOOR; } - - @Override - public boolean canHaveItems() - { - return false; - } - - @Override - public boolean doesCastShadow() - { - return true; - } - - @Override - public Color getMapColor() - { - return PAL16.NEWPOOP; - } - } diff --git a/src/mightypork/rogue/world/tile/tiles/FloorTile.java b/src/mightypork/rogue/world/tile/tiles/FloorTile.java index 121600a..949623f 100644 --- a/src/mightypork/rogue/world/tile/tiles/FloorTile.java +++ b/src/mightypork/rogue/world/tile/tiles/FloorTile.java @@ -3,11 +3,9 @@ package mightypork.rogue.world.tile.tiles; import mightypork.rogue.world.tile.TileRenderer; import mightypork.rogue.world.tile.TileType; -import mightypork.util.math.color.Color; -import mightypork.util.math.color.RGB; -public class FloorTile extends TileWithItems { +public class FloorTile extends GroundTile { public FloorTile(int id, TileRenderer renderer) { @@ -15,31 +13,9 @@ public class FloorTile extends TileWithItems { } - @Override - public boolean isPotentiallyWalkable() - { - return true; - } - - @Override public TileType getType() { return TileType.FLOOR; } - - - @Override - public boolean doesCastShadow() - { - return false; - } - - - @Override - public Color getMapColor() - { - return RGB.GRAY_DARK; - } - } diff --git a/src/mightypork/rogue/world/tile/tiles/TileWithItems.java b/src/mightypork/rogue/world/tile/tiles/GroundTile.java similarity index 65% rename from src/mightypork/rogue/world/tile/tiles/TileWithItems.java rename to src/mightypork/rogue/world/tile/tiles/GroundTile.java index 24dddf5..f58ac24 100644 --- a/src/mightypork/rogue/world/tile/tiles/TileWithItems.java +++ b/src/mightypork/rogue/world/tile/tiles/GroundTile.java @@ -3,20 +3,22 @@ package mightypork.rogue.world.tile.tiles; import java.io.IOException; +import mightypork.rogue.world.item.Item; import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.rogue.world.tile.DroppedItemRenderer; +import mightypork.rogue.world.tile.Tile; import mightypork.rogue.world.tile.TileRenderer; import mightypork.util.files.ion.IonInput; import mightypork.util.files.ion.IonOutput; -public abstract class TileWithItems extends BasicTile { +public abstract class GroundTile extends Tile { private DroppedItemRenderer itemRenderer = new DroppedItemRenderer(); - public TileWithItems(int id, TileRenderer renderer) + public GroundTile(int id, TileRenderer renderer) { super(id, renderer); } @@ -38,13 +40,6 @@ public abstract class TileWithItems extends BasicTile { } - @Override - public boolean canHaveItems() - { - return true; - } - - @Override public void save(IonOutput out) throws IOException { @@ -61,4 +56,36 @@ public abstract class TileWithItems extends BasicTile { in.readSequence(items); } + + @Override + public boolean doesCastShadow() + { + return false; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public boolean dropItem(Item item) + { + items.push(item); + return true; + } + + @Override + public Item pickItem() + { + return hasItem() ? items.pop() : null; + } + + @Override + public boolean hasItem() + { + return !items.isEmpty(); + } + } diff --git a/src/mightypork/rogue/world/tile/tiles/NullTile.java b/src/mightypork/rogue/world/tile/tiles/NullTile.java index 7b683aa..5ad12e1 100644 --- a/src/mightypork/rogue/world/tile/tiles/NullTile.java +++ b/src/mightypork/rogue/world/tile/tiles/NullTile.java @@ -1,13 +1,12 @@ package mightypork.rogue.world.tile.tiles; +import mightypork.rogue.world.item.Item; import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.rogue.world.tile.Tile; import mightypork.rogue.world.tile.TileRenderer; import mightypork.rogue.world.tile.TileType; -import mightypork.util.math.color.Color; -import mightypork.util.math.color.RGB; public class NullTile extends Tile { @@ -43,13 +42,6 @@ public class NullTile extends Tile { } - @Override - public boolean isPotentiallyWalkable() - { - return false; - } - - @Override public TileType getType() { @@ -58,29 +50,35 @@ public class NullTile extends Tile { @Override - public boolean canHaveItems() + public boolean doesCastShadow() { return false; } @Override - public boolean doesCastShadow() + public boolean doesReceiveShadow() { return false; } - - + @Override - public boolean doesReceiveShadow() + public boolean dropItem(Item item) { return false; } - - + + @Override - public Color getMapColor() + public Item pickItem() { - return RGB.NONE; + return null; + } + + + @Override + public boolean hasItem() + { + return false; } } diff --git a/src/mightypork/rogue/world/tile/tiles/SolidTile.java b/src/mightypork/rogue/world/tile/tiles/SolidTile.java new file mode 100644 index 0000000..2173c51 --- /dev/null +++ b/src/mightypork/rogue/world/tile/tiles/SolidTile.java @@ -0,0 +1,43 @@ +package mightypork.rogue.world.tile.tiles; + +import mightypork.rogue.world.item.Item; +import mightypork.rogue.world.tile.Tile; +import mightypork.rogue.world.tile.TileRenderer; + + +public abstract class SolidTile extends Tile { + + public SolidTile(int id, TileRenderer renderer) { + super(id, renderer); + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public boolean doesCastShadow() + { + return true; + } + + @Override + public boolean hasItem() + { + return false; + } + + @Override + public boolean dropItem(Item item) + { + return false; + } + + @Override + public Item pickItem() + { + return null; + } +} diff --git a/src/mightypork/rogue/world/tile/tiles/WallTile.java b/src/mightypork/rogue/world/tile/tiles/WallTile.java index 6f74737..7c3be10 100644 --- a/src/mightypork/rogue/world/tile/tiles/WallTile.java +++ b/src/mightypork/rogue/world/tile/tiles/WallTile.java @@ -2,45 +2,18 @@ package mightypork.rogue.world.tile.tiles; import mightypork.rogue.world.tile.TileRenderer; import mightypork.rogue.world.tile.TileType; -import mightypork.util.math.color.Color; -import mightypork.util.math.color.RGB; -public class WallTile extends BasicTile { +public class WallTile extends SolidTile { public WallTile(int id, TileRenderer renderer) { super(id, renderer); } - @Override - public boolean isPotentiallyWalkable() - { - return false; - } - @Override public TileType getType() { return TileType.WALL; } - - @Override - public boolean canHaveItems() - { - return false; - } - - @Override - public boolean doesCastShadow() - { - return true; - } - - @Override - public Color getMapColor() - { - return RGB.GRAY_LIGHT; - } - }