parent
307d8d2b10
commit
7b862cb5c8
@ -0,0 +1,21 @@ |
||||
package mightypork.rogue.world.pathfinding; |
||||
|
||||
|
||||
import mightypork.rogue.world.Coord; |
||||
|
||||
|
||||
public interface FillContext { |
||||
|
||||
boolean canEnter(Coord pos); |
||||
|
||||
|
||||
boolean canSpread(Coord pos); |
||||
|
||||
|
||||
/** |
||||
* Get the max distance filled form start point. Use -1 for unlimited range. |
||||
* |
||||
* @return max distance |
||||
*/ |
||||
int getMaxDistance(); |
||||
} |
@ -0,0 +1,41 @@ |
||||
package mightypork.rogue.world.pathfinding; |
||||
|
||||
|
||||
import java.util.*; |
||||
|
||||
import mightypork.rogue.world.Coord; |
||||
|
||||
|
||||
public class FloodFill { |
||||
|
||||
private static final Coord[] spread = { Coord.make(0, -1), Coord.make(0, 1), Coord.make(1, 0), Coord.make(-1, 0) }; |
||||
|
||||
|
||||
public static final Collection<Coord> fill(Coord start, FillContext context) |
||||
{ |
||||
Set<Coord> filled = new HashSet<>(); |
||||
Stack<Coord> active = new Stack<>(); |
||||
|
||||
int maxDist = context.getMaxDistance(); |
||||
|
||||
active.push(start); |
||||
|
||||
while (!active.isEmpty()) { |
||||
Coord current = active.pop(); |
||||
|
||||
filled.add(current); |
||||
|
||||
for (Coord spr : spread) { |
||||
Coord next = current.add(spr); |
||||
|
||||
if (next.dist(start) > maxDist) continue; |
||||
|
||||
if (context.canSpread(next)) { |
||||
active.push(next); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return filled; |
||||
} |
||||
} |
@ -1,54 +0,0 @@ |
||||
package mightypork.rogue.world.tile; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
|
||||
import mightypork.util.error.YouFuckedUpException; |
||||
import mightypork.util.files.ion.IonBinary; |
||||
import mightypork.util.files.ion.IonBundle; |
||||
import mightypork.util.files.ion.IonInput; |
||||
import mightypork.util.files.ion.IonOutput; |
||||
|
||||
|
||||
public class TileData implements IonBinary { |
||||
|
||||
private static final byte BIT_EXPLORED = 1 << 0; |
||||
private static final byte BIT_LOCKED = 1 << 1; |
||||
|
||||
public boolean explored = false; |
||||
public boolean locked = false; |
||||
|
||||
public final IonBundle extra = new IonBundle(); |
||||
|
||||
|
||||
@Override |
||||
public void load(IonInput in) throws IOException |
||||
{ |
||||
final byte flags = in.readByte(); |
||||
in.readBundle(extra); |
||||
|
||||
explored = (flags & BIT_EXPLORED) != 0; |
||||
locked = (flags & BIT_LOCKED) != 0; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(IonOutput out) throws IOException |
||||
{ |
||||
byte flags = 0; |
||||
if (explored) flags |= BIT_EXPLORED; |
||||
if (locked) flags |= BIT_LOCKED; |
||||
out.writeByte(flags); |
||||
|
||||
|
||||
out.writeBundle(extra); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
throw new YouFuckedUpException("TileData is not to be read from ION using mark."); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,12 @@ |
||||
package mightypork.rogue.world.tile; |
||||
|
||||
|
||||
/** |
||||
* Kinds of tiles |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public enum TileType |
||||
{ |
||||
NULL, FLOOR, WALL, DOOR; |
||||
} |
@ -1,53 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
|
||||
|
||||
/** |
||||
* Null tile |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class AbstractNullTile extends AbstractTile { |
||||
|
||||
private Tile inst; |
||||
|
||||
|
||||
public AbstractNullTile(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isNullTile() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Tile createTile() |
||||
{ |
||||
if (inst == null) { |
||||
inst = new Tile(this); |
||||
} |
||||
|
||||
return inst; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean hasDroppedItems() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean doesCastShadow() |
||||
{ |
||||
return false; |
||||
} |
||||
} |
@ -1,62 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.level.Level; |
||||
import mightypork.rogue.world.tile.Tile; |
||||
import mightypork.rogue.world.tile.TileModel; |
||||
import mightypork.util.annotations.DefaultImpl; |
||||
|
||||
|
||||
/** |
||||
* Basic implementation of a tile. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class AbstractTile extends TileModel { |
||||
|
||||
public AbstractTile(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isWalkable(Tile tile) |
||||
{ |
||||
return isPotentiallyWalkable(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isDoor() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isWall() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isFloor() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean doesReceiveShadow() |
||||
{ |
||||
return isFloor(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
@DefaultImpl |
||||
public void update(Tile tile, Level level, double delta) |
||||
{ |
||||
} |
||||
} |
@ -1,50 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
import mightypork.util.math.color.Color; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
public class Floor extends AbstractTile { |
||||
|
||||
public Floor(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean hasDroppedItems() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean doesCastShadow() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isFloor() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Color getMapColor(Tile tile) |
||||
{ |
||||
return RGB.GRAY_DARK; |
||||
} |
||||
} |
@ -1,29 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
import mightypork.util.math.color.Color; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
public class NullTile extends AbstractNullTile { |
||||
|
||||
public NullTile(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Color getMapColor(Tile tile) |
||||
{ |
||||
return RGB.NONE; |
||||
} |
||||
} |
@ -1,65 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
import mightypork.rogue.world.tile.renderers.DoorRenderer; |
||||
import mightypork.util.math.color.Color; |
||||
import mightypork.util.math.color.PAL16; |
||||
|
||||
|
||||
public class SimpleDoor extends AbstractTile { |
||||
|
||||
public SimpleDoor(int id) |
||||
{ |
||||
super(id); |
||||
setRenderer(new DoorRenderer("tile.door.closed", "tile.door.open")); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isWalkable(Tile tile) |
||||
{ |
||||
return !isLocked(tile); |
||||
} |
||||
|
||||
|
||||
protected boolean isLocked(Tile tile) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isDoor() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean doesCastShadow() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean hasDroppedItems() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Color getMapColor(Tile tile) |
||||
{ |
||||
return PAL16.NEWPOOP; |
||||
} |
||||
} |
@ -1,55 +0,0 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
import mightypork.util.math.color.Color; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
/** |
||||
* Template for wall tiles with no metadata |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class Wall extends AbstractTile { |
||||
|
||||
public Wall(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final boolean hasDroppedItems() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final boolean doesCastShadow() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final boolean isWall() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final boolean isPotentiallyWalkable() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Color getMapColor(Tile tile) |
||||
{ |
||||
return RGB.GRAY_LIGHT; |
||||
} |
||||
} |
@ -0,0 +1,58 @@ |
||||
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(); |
||||
} |
||||
} |
@ -0,0 +1,46 @@ |
||||
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) |
||||
{ |
||||
super(id, renderer); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,45 @@ |
||||
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 FloorTile(int id, TileRenderer renderer) |
||||
{ |
||||
super(id, renderer); |
||||
} |
||||
|
||||
|
||||
@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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,36 @@ |
||||
package mightypork.rogue.world.tile.tiles; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
|
||||
import mightypork.rogue.world.tile.TileRenderer; |
||||
import mightypork.util.files.ion.IonInput; |
||||
import mightypork.util.files.ion.IonOutput; |
||||
|
||||
|
||||
public class LockedDoorTile extends DoorTile { |
||||
|
||||
public boolean locked = true; |
||||
|
||||
|
||||
public LockedDoorTile(int id, TileRenderer renderer) |
||||
{ |
||||
super(id, renderer); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void load(IonInput in) throws IOException |
||||
{ |
||||
super.load(in); |
||||
locked = in.readBoolean(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(IonOutput out) throws IOException |
||||
{ |
||||
super.save(out); |
||||
out.writeBoolean(locked); |
||||
} |
||||
} |
@ -0,0 +1,86 @@ |
||||
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.rogue.world.tile.TileType; |
||||
import mightypork.util.math.color.Color; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
public class NullTile extends Tile { |
||||
|
||||
public NullTile(int id, TileRenderer renderer) |
||||
{ |
||||
super(id, renderer); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(Level level, double delta) |
||||
{ |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void renderTile(TileRenderContext context) |
||||
{ |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void renderExtra(TileRenderContext context) |
||||
{ |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isWalkable() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public TileType getType() |
||||
{ |
||||
return TileType.NULL; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean canHaveItems() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean doesCastShadow() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean doesReceiveShadow() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Color getMapColor() |
||||
{ |
||||
return RGB.NONE; |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
package mightypork.rogue.world.tile.tiles; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
|
||||
import mightypork.rogue.world.level.Level; |
||||
import mightypork.rogue.world.level.render.TileRenderContext; |
||||
import mightypork.rogue.world.tile.DroppedItemRenderer; |
||||
import mightypork.rogue.world.tile.TileRenderer; |
||||
import mightypork.util.files.ion.IonInput; |
||||
import mightypork.util.files.ion.IonOutput; |
||||
|
||||
|
||||
public abstract class TileWithItems extends BasicTile { |
||||
|
||||
private DroppedItemRenderer itemRenderer = new DroppedItemRenderer(); |
||||
|
||||
|
||||
public TileWithItems(int id, TileRenderer renderer) |
||||
{ |
||||
super(id, renderer); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void renderExtra(TileRenderContext context) |
||||
{ |
||||
if (!items.isEmpty()) { |
||||
itemRenderer.render(items.peek(), context); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(Level level, double delta) |
||||
{ |
||||
itemRenderer.update(delta); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean canHaveItems() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(IonOutput out) throws IOException |
||||
{ |
||||
super.save(out); |
||||
|
||||
out.writeSequence(items); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void load(IonInput in) throws IOException |
||||
{ |
||||
super.load(in); |
||||
|
||||
in.readSequence(items); |
||||
} |
||||
} |
@ -0,0 +1,46 @@ |
||||
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 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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,31 @@ |
||||
package mightypork.util.files.ion; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
|
||||
|
||||
/** |
||||
* Binary ion object, with no mark = cannot be loaded on it's own |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public interface IonBinaryHeadless { |
||||
|
||||
/** |
||||
* Load data from the input stream. |
||||
* |
||||
* @param in input stream |
||||
* @throws IOException |
||||
*/ |
||||
void load(IonInput in) throws IOException; |
||||
|
||||
|
||||
/** |
||||
* Store data to output stream (in such way that the load method will later |
||||
* be able to read it). |
||||
* |
||||
* @param out Output stream |
||||
* @throws IOException |
||||
*/ |
||||
void save(IonOutput out) throws IOException; |
||||
} |
Loading…
Reference in new issue