Reworked tile system

v5stable
ondra 10 years ago
parent d7348ded53
commit c5374f5f6e
  1. 77
      src/mightypork/rogue/world/tile/Tile.java
  2. 35
      src/mightypork/rogue/world/tile/TileType.java
  3. 58
      src/mightypork/rogue/world/tile/tiles/BasicTile.java
  4. 35
      src/mightypork/rogue/world/tile/tiles/DoorTile.java
  5. 26
      src/mightypork/rogue/world/tile/tiles/FloorTile.java
  6. 45
      src/mightypork/rogue/world/tile/tiles/GroundTile.java
  7. 34
      src/mightypork/rogue/world/tile/tiles/NullTile.java
  8. 43
      src/mightypork/rogue/world/tile/tiles/SolidTile.java
  9. 29
      src/mightypork/rogue/world/tile/tiles/WallTile.java

@ -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(); @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();
} }

@ -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 DoorTile(int id, TileRenderer renderer) public class DoorTile extends SolidTile {
{
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;
}
} }

@ -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()
{ {
@ -58,29 +50,35 @@ public class NullTile extends Tile {
@Override @Override
public boolean canHaveItems() public boolean doesCastShadow()
{ {
return false; return false;
} }
@Override @Override
public boolean doesCastShadow() public boolean doesReceiveShadow()
{ {
return false; return false;
} }
@Override @Override
public boolean doesReceiveShadow() public boolean dropItem(Item item)
{ {
return false; return false;
} }
@Override @Override
public Color getMapColor() public Item pickItem()
{ {
return RGB.NONE; 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;
}
} }

Loading…
Cancel
Save