Reworked tile system
This commit is contained in:
@@ -7,7 +7,7 @@ import java.util.Stack;
|
|||||||
import mightypork.rogue.world.item.Item;
|
import mightypork.rogue.world.item.Item;
|
||||||
import mightypork.rogue.world.level.Level;
|
import mightypork.rogue.world.level.Level;
|
||||||
import mightypork.rogue.world.level.render.TileRenderContext;
|
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.IonBinaryHeadless;
|
||||||
import mightypork.util.files.ion.IonInput;
|
import mightypork.util.files.ion.IonInput;
|
||||||
import mightypork.util.files.ion.IonOutput;
|
import mightypork.util.files.ion.IonOutput;
|
||||||
@@ -31,14 +31,12 @@ public abstract class Tile implements IonBinaryHeadless {
|
|||||||
|
|
||||||
protected final Stack<Item> items = new Stack<>();
|
protected final Stack<Item> items = new Stack<>();
|
||||||
|
|
||||||
|
|
||||||
// temporary flag for map.
|
// temporary flag for map.
|
||||||
protected boolean occupied;
|
protected boolean occupied;
|
||||||
protected boolean explored;
|
protected boolean explored;
|
||||||
|
|
||||||
|
|
||||||
public Tile(int id, TileRenderer renderer)
|
public Tile(int id, TileRenderer renderer) {
|
||||||
{
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
}
|
}
|
||||||
@@ -47,7 +45,17 @@ public abstract class Tile implements IonBinaryHeadless {
|
|||||||
/**
|
/**
|
||||||
* Render the tile, using the main texture sheet.
|
* 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
|
* @param context
|
||||||
*/
|
*/
|
||||||
public abstract void renderExtra(TileRenderContext context);
|
@DefaultImpl
|
||||||
|
public void renderExtra(TileRenderContext context) {}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@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.<br>
|
||||||
|
* 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 TileType getType();
|
||||||
|
|
||||||
|
|
||||||
public abstract boolean canHaveItems();
|
|
||||||
|
|
||||||
|
|
||||||
public abstract boolean doesCastShadow();
|
public abstract boolean doesCastShadow();
|
||||||
|
|
||||||
|
|
||||||
public abstract boolean doesReceiveShadow();
|
@DefaultImpl
|
||||||
|
public boolean doesReceiveShadow()
|
||||||
|
{
|
||||||
|
return !doesCastShadow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract Color getMapColor();
|
public final Color getMapColor()
|
||||||
|
{
|
||||||
|
return getType().getMapColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop item onto this tile
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* @return true if dropped
|
||||||
|
*/
|
||||||
|
public abstract boolean dropItem(Item item);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
package mightypork.rogue.world.tile;
|
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
|
* Kinds of tiles
|
||||||
*
|
*
|
||||||
@@ -8,5 +13,33 @@ package mightypork.rogue.world.tile;
|
|||||||
*/
|
*/
|
||||||
public enum TileType
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +1,25 @@
|
|||||||
package mightypork.rogue.world.tile.tiles;
|
package mightypork.rogue.world.tile.tiles;
|
||||||
|
|
||||||
|
|
||||||
import mightypork.rogue.world.tile.TileRenderer;
|
import mightypork.rogue.world.tile.TileRenderer;
|
||||||
import mightypork.rogue.world.tile.TileType;
|
import mightypork.rogue.world.tile.TileType;
|
||||||
import mightypork.util.math.color.Color;
|
|
||||||
import mightypork.util.math.color.PAL16;
|
|
||||||
|
|
||||||
|
|
||||||
public class DoorTile extends BasicTile {
|
public class DoorTile extends SolidTile {
|
||||||
|
|
||||||
public DoorTile(int id, TileRenderer renderer)
|
public DoorTile(int id, TileRenderer renderer) {
|
||||||
{
|
|
||||||
super(id, renderer);
|
super(id, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isPotentiallyWalkable()
|
public boolean isWalkable()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileType getType()
|
public TileType getType()
|
||||||
{
|
{
|
||||||
return TileType.DOOR;
|
return TileType.DOOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canHaveItems()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean doesCastShadow()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Color getMapColor()
|
|
||||||
{
|
|
||||||
return PAL16.NEWPOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ package mightypork.rogue.world.tile.tiles;
|
|||||||
|
|
||||||
import mightypork.rogue.world.tile.TileRenderer;
|
import mightypork.rogue.world.tile.TileRenderer;
|
||||||
import mightypork.rogue.world.tile.TileType;
|
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)
|
public FloorTile(int id, TileRenderer renderer)
|
||||||
{
|
{
|
||||||
@@ -15,31 +13,9 @@ public class FloorTile extends TileWithItems {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPotentiallyWalkable()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileType getType()
|
public TileType getType()
|
||||||
{
|
{
|
||||||
return TileType.FLOOR;
|
return TileType.FLOOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean doesCastShadow()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Color getMapColor()
|
|
||||||
{
|
|
||||||
return RGB.GRAY_DARK;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-9
@@ -3,20 +3,22 @@ package mightypork.rogue.world.tile.tiles;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import mightypork.rogue.world.item.Item;
|
||||||
import mightypork.rogue.world.level.Level;
|
import mightypork.rogue.world.level.Level;
|
||||||
import mightypork.rogue.world.level.render.TileRenderContext;
|
import mightypork.rogue.world.level.render.TileRenderContext;
|
||||||
import mightypork.rogue.world.tile.DroppedItemRenderer;
|
import mightypork.rogue.world.tile.DroppedItemRenderer;
|
||||||
|
import mightypork.rogue.world.tile.Tile;
|
||||||
import mightypork.rogue.world.tile.TileRenderer;
|
import mightypork.rogue.world.tile.TileRenderer;
|
||||||
import mightypork.util.files.ion.IonInput;
|
import mightypork.util.files.ion.IonInput;
|
||||||
import mightypork.util.files.ion.IonOutput;
|
import mightypork.util.files.ion.IonOutput;
|
||||||
|
|
||||||
|
|
||||||
public abstract class TileWithItems extends BasicTile {
|
public abstract class GroundTile extends Tile {
|
||||||
|
|
||||||
private DroppedItemRenderer itemRenderer = new DroppedItemRenderer();
|
private DroppedItemRenderer itemRenderer = new DroppedItemRenderer();
|
||||||
|
|
||||||
|
|
||||||
public TileWithItems(int id, TileRenderer renderer)
|
public GroundTile(int id, TileRenderer renderer)
|
||||||
{
|
{
|
||||||
super(id, renderer);
|
super(id, renderer);
|
||||||
}
|
}
|
||||||
@@ -38,13 +40,6 @@ public abstract class TileWithItems extends BasicTile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canHaveItems()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save(IonOutput out) throws IOException
|
public void save(IonOutput out) throws IOException
|
||||||
{
|
{
|
||||||
@@ -61,4 +56,36 @@ public abstract class TileWithItems extends BasicTile {
|
|||||||
|
|
||||||
in.readSequence(items);
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
package mightypork.rogue.world.tile.tiles;
|
package mightypork.rogue.world.tile.tiles;
|
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.world.item.Item;
|
||||||
import mightypork.rogue.world.level.Level;
|
import mightypork.rogue.world.level.Level;
|
||||||
import mightypork.rogue.world.level.render.TileRenderContext;
|
import mightypork.rogue.world.level.render.TileRenderContext;
|
||||||
import mightypork.rogue.world.tile.Tile;
|
import mightypork.rogue.world.tile.Tile;
|
||||||
import mightypork.rogue.world.tile.TileRenderer;
|
import mightypork.rogue.world.tile.TileRenderer;
|
||||||
import mightypork.rogue.world.tile.TileType;
|
import mightypork.rogue.world.tile.TileType;
|
||||||
import mightypork.util.math.color.Color;
|
|
||||||
import mightypork.util.math.color.RGB;
|
|
||||||
|
|
||||||
|
|
||||||
public class NullTile extends Tile {
|
public class NullTile extends Tile {
|
||||||
@@ -43,13 +42,6 @@ public class NullTile extends Tile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPotentiallyWalkable()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileType getType()
|
public TileType getType()
|
||||||
{
|
{
|
||||||
@@ -57,13 +49,6 @@ public class NullTile extends Tile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canHaveItems()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doesCastShadow()
|
public boolean doesCastShadow()
|
||||||
{
|
{
|
||||||
@@ -76,11 +61,24 @@ public class NullTile extends Tile {
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Color getMapColor()
|
public boolean dropItem(Item item)
|
||||||
{
|
{
|
||||||
return RGB.NONE;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item pickItem()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasItem()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,45 +2,18 @@ package mightypork.rogue.world.tile.tiles;
|
|||||||
|
|
||||||
import mightypork.rogue.world.tile.TileRenderer;
|
import mightypork.rogue.world.tile.TileRenderer;
|
||||||
import mightypork.rogue.world.tile.TileType;
|
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)
|
public WallTile(int id, TileRenderer renderer)
|
||||||
{
|
{
|
||||||
super(id, renderer);
|
super(id, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPotentiallyWalkable()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileType getType()
|
public TileType getType()
|
||||||
{
|
{
|
||||||
return TileType.WALL;
|
return TileType.WALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canHaveItems()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean doesCastShadow()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Color getMapColor()
|
|
||||||
{
|
|
||||||
return RGB.GRAY_LIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user