parent
ccbc95c74a
commit
65ad97994b
@ -1,130 +0,0 @@ |
|||||||
package mightypork.rogue.world; |
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.OutputStream; |
|
||||||
|
|
||||||
import mightypork.util.constraints.rect.proxy.RectBound; |
|
||||||
import mightypork.util.control.timing.Updateable; |
|
||||||
import mightypork.util.files.ion.Ion; |
|
||||||
import mightypork.util.files.ion.Ionizable; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Abstract entity |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
* @param <D> Data object class
|
|
||||||
* @param <M> Model class
|
|
||||||
* @param <R> Render context class
|
|
||||||
*/ |
|
||||||
public abstract class Entity<D, M extends EntityModel<D, R>, R extends RectBound> implements Ionizable, Updateable { |
|
||||||
|
|
||||||
protected M model; |
|
||||||
protected D data; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Used by Ion for loading. |
|
||||||
*/ |
|
||||||
public Entity() { |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Create from model |
|
||||||
* |
|
||||||
* @param model model |
|
||||||
*/ |
|
||||||
public Entity(M model) { |
|
||||||
setModel(model); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public final void loadFrom(InputStream in) throws IOException |
|
||||||
{ |
|
||||||
final int id = Ion.readInt(in); |
|
||||||
setModel(id); |
|
||||||
model.load(data, in); // load saved data
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void initData() |
|
||||||
{ |
|
||||||
data = model.createData(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return data |
|
||||||
*/ |
|
||||||
public final D getData() |
|
||||||
{ |
|
||||||
return data; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return entity model |
|
||||||
*/ |
|
||||||
public final M getModel() |
|
||||||
{ |
|
||||||
return model; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Assign a model. |
|
||||||
* |
|
||||||
* @param id model id |
|
||||||
*/ |
|
||||||
public final void setModel(int id) |
|
||||||
{ |
|
||||||
setModel(getModelForId(id)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Assign a model. |
|
||||||
* |
|
||||||
* @param model model |
|
||||||
*/ |
|
||||||
public final void setModel(M model) |
|
||||||
{ |
|
||||||
this.model = model; |
|
||||||
initData(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public final void saveTo(OutputStream out) throws IOException |
|
||||||
{ |
|
||||||
Ion.writeInt(out, model.getId()); |
|
||||||
model.save(data, out); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void render(R context) |
|
||||||
{ |
|
||||||
model.render(data, context); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void update(double delta) |
|
||||||
{ |
|
||||||
model.update(data, delta); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get model for ID |
|
||||||
* |
|
||||||
* @param id id |
|
||||||
* @return model for the ID |
|
||||||
*/ |
|
||||||
protected abstract M getModelForId(int id); |
|
||||||
|
|
||||||
} |
|
@ -1,75 +0,0 @@ |
|||||||
package mightypork.rogue.world; |
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.OutputStream; |
|
||||||
|
|
||||||
import mightypork.util.annotations.DefaultImpl; |
|
||||||
import mightypork.util.constraints.rect.proxy.RectBound; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Entity model. Provides concrete implementation to an entity, working with |
|
||||||
* it's data object. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
* @param <D> Data object class
|
|
||||||
* @param <R> Render context class
|
|
||||||
*/ |
|
||||||
public abstract class EntityModel<D, R extends RectBound> { |
|
||||||
|
|
||||||
/** Model id */ |
|
||||||
private final int id; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Create a model. The caller must then register this instance in a Model |
|
||||||
* registry for the particular entity type. |
|
||||||
* |
|
||||||
* @param id model id |
|
||||||
*/ |
|
||||||
public EntityModel(int id) { |
|
||||||
this.id = id; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get the model id. |
|
||||||
* |
|
||||||
* @return id |
|
||||||
*/ |
|
||||||
public final int getId() |
|
||||||
{ |
|
||||||
return id; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Create a data object and populate it with default values.<br> |
|
||||||
* It's allowed to return null for no data. |
|
||||||
* |
|
||||||
* @return data object |
|
||||||
*/ |
|
||||||
public abstract D createData(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Render the item according to given context. |
|
||||||
* |
|
||||||
* @param data rendered item |
|
||||||
* @param context rendering context |
|
||||||
*/ |
|
||||||
public abstract void render(D data, R context); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Update the item (animation, decay etc) |
|
||||||
* |
|
||||||
* @param item item to update |
|
||||||
* @param delta delta time |
|
||||||
*/ |
|
||||||
@DefaultImpl |
|
||||||
public abstract void update(D item, double delta); |
|
||||||
|
|
||||||
} |
|
@ -1,13 +0,0 @@ |
|||||||
package mightypork.rogue.world.item; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Item data object. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public final class ItemData { |
|
||||||
|
|
||||||
public static final int ION_MARK = 704; |
|
||||||
|
|
||||||
} |
|
@ -1,19 +1,50 @@ |
|||||||
package mightypork.rogue.world.item; |
package mightypork.rogue.world.item; |
||||||
|
|
||||||
|
|
||||||
import mightypork.rogue.world.EntityModel; |
import mightypork.rogue.world.tile.TileRenderContext; |
||||||
|
import mightypork.util.annotations.DefaultImpl; |
||||||
|
import mightypork.util.constraints.num.proxy.NumBoundAdapter; |
||||||
|
import mightypork.util.constraints.rect.Rect; |
||||||
import mightypork.util.constraints.rect.proxy.RectBound; |
import mightypork.util.constraints.rect.proxy.RectBound; |
||||||
|
import mightypork.util.constraints.rect.proxy.RectBoundAdapter; |
||||||
|
|
||||||
|
|
||||||
/** |
public abstract class ItemModel { |
||||||
* An item model |
|
||||||
* |
public final int id; |
||||||
* @author MightyPork |
|
||||||
*/ |
private final RectBoundAdapter tileRect = new RectBoundAdapter(); |
||||||
public abstract class ItemModel extends EntityModel<ItemData, RectBound> { |
private final NumBoundAdapter yOffset = new NumBoundAdapter(); |
||||||
|
|
||||||
|
private final Rect itemRect = tileRect.shrink(tileRect.height().perc(10)).moveY(yOffset.neg()); |
||||||
|
|
||||||
public ItemModel(int id) { |
|
||||||
super(id); |
public ItemModel(int id) |
||||||
|
{ |
||||||
Items.register(id, this); |
Items.register(id, this); |
||||||
|
this.id = id; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return new tile with this model |
||||||
|
*/ |
||||||
|
@DefaultImpl |
||||||
|
public Item create() |
||||||
|
{ |
||||||
|
return new Item(this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public abstract void render(Item item, RectBound context); |
||||||
|
|
||||||
|
|
||||||
|
public void renderOnTile(Item item, TileRenderContext context) |
||||||
|
{ |
||||||
|
tileRect.setRect(context.getRect()); |
||||||
|
yOffset.setNum(item.anim); |
||||||
|
|
||||||
|
render(item, itemRect); |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,118 +1,116 @@ |
|||||||
package mightypork.rogue.world.tile; |
package mightypork.rogue.world.tile; |
||||||
|
|
||||||
|
|
||||||
import mightypork.rogue.world.Entity; |
import java.io.IOException; |
||||||
import mightypork.rogue.world.item.Item; |
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
|
||||||
|
import mightypork.util.control.timing.Animator; |
||||||
|
import mightypork.util.control.timing.Updateable; |
||||||
|
import mightypork.util.files.ion.Ion; |
||||||
|
import mightypork.util.files.ion.IonBundle; |
||||||
|
import mightypork.util.files.ion.IonConstructor; |
||||||
|
import mightypork.util.files.ion.Ionizable; |
||||||
|
|
||||||
/** |
|
||||||
* Concrete tile in the world. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public final class Tile extends Entity<TileData, TileModel, TileRenderContext> { |
|
||||||
|
|
||||||
public static final short ION_MARK = 700; |
public final class Tile implements Ionizable, Updateable { |
||||||
|
|
||||||
/** Whether the tile is occupied by an entity */ |
public static final short ION_MARK = 700; |
||||||
private transient boolean occupied; |
|
||||||
|
|
||||||
|
private transient TileModel model; |
||||||
|
public transient Object modelData; |
||||||
|
public transient Animator anim; |
||||||
|
|
||||||
public Tile() { |
public int id; |
||||||
super(); |
|
||||||
} |
|
||||||
|
|
||||||
|
public TileItems items; |
||||||
|
|
||||||
public Tile(TileModel model) { |
public boolean[] flags; |
||||||
super(model); |
public int[] numbers; |
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public Tile(int id) { |
public Tile(int id) |
||||||
super(Tiles.get(id)); |
{ |
||||||
|
this(Tiles.get(id)); |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
@Override |
@IonConstructor |
||||||
protected TileModel getModelForId(int id) |
public Tile() |
||||||
{ |
{ |
||||||
return Tiles.get(id); |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
@Override |
public Tile(TileModel model) |
||||||
public short getIonMark() |
|
||||||
{ |
{ |
||||||
return ION_MARK; |
this.model = model; |
||||||
|
this.id = model.id; |
||||||
|
this.items = new TileItems(); |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void render(TileRenderContext context) |
public void render(TileRenderContext context) |
||||||
{ |
{ |
||||||
super.render(context); |
model.render(this, context); |
||||||
|
|
||||||
// render laying-on-top item
|
if (!items.isEmpty()) { |
||||||
if (!data.items.isEmpty()) { |
items.peek().renderOnTile(context); |
||||||
final Item item = data.items.peek(); |
|
||||||
|
|
||||||
item.render(context.getRect()); |
|
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
@Override |
@Override |
||||||
public void update(double delta) |
public void save(OutputStream out) throws IOException |
||||||
{ |
{ |
||||||
super.update(delta); |
if (model.isNullTile()) throw new RuntimeException("Cannot save null tile."); |
||||||
|
|
||||||
// update laying-on-top item
|
final IonBundle ib = new IonBundle(); |
||||||
if (!data.items.isEmpty()) { |
|
||||||
final Item item = data.items.peek(); |
|
||||||
item.update(delta); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
ib.put("id", id); |
||||||
|
ib.put("flags", flags); |
||||||
|
ib.put("numbers", numbers); |
||||||
|
ib.put("items", items); |
||||||
|
|
||||||
/** |
Ion.writeObject(out, ib); |
||||||
* Try to reveal secrets of this tile |
|
||||||
*/ |
|
||||||
public void search() |
|
||||||
{ |
|
||||||
model.search(data); |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
/** |
@Override |
||||||
* @return true if a mob can walk through |
public void load(InputStream in) throws IOException |
||||||
*/ |
|
||||||
public boolean isWalkable() |
|
||||||
{ |
{ |
||||||
return model.isWalkable(data); |
final IonBundle ib = (IonBundle) Ion.readObject(in); |
||||||
} |
|
||||||
|
|
||||||
|
id = ib.get("id", id); |
||||||
|
flags = ib.get("flags", flags); |
||||||
|
numbers = ib.get("numbers", numbers); |
||||||
|
items = ib.get("items", items); |
||||||
|
|
||||||
public boolean hasItem() |
// renew model
|
||||||
{ |
if (model == null || id != model.id) { |
||||||
return !data.items.isEmpty(); |
model = Tiles.get(id); |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
public Item removeItem() |
@Override |
||||||
|
public short getIonMark() |
||||||
{ |
{ |
||||||
if(!hasItem()) return null; |
return ION_MARK; |
||||||
return data.items.pop(); |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
public boolean isOccupied() |
@Override |
||||||
|
public void update(double delta) |
||||||
{ |
{ |
||||||
return occupied; |
if (!items.isEmpty()) { |
||||||
|
items.peek().update(delta); |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
public void setOccupied(boolean occupied) |
public TileModel getModel() |
||||||
{ |
{ |
||||||
this.occupied = occupied; |
return model; |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,54 +0,0 @@ |
|||||||
package mightypork.rogue.world.tile; |
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.OutputStream; |
|
||||||
import java.util.Stack; |
|
||||||
|
|
||||||
import mightypork.rogue.world.item.Item; |
|
||||||
import mightypork.util.files.ion.IonList; |
|
||||||
import mightypork.util.files.ion.Ionizable; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Tile data object. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public final class TileData implements Ionizable { |
|
||||||
|
|
||||||
public static final short ION_MARK = 703; |
|
||||||
|
|
||||||
/** Items dropped onto this tile */ |
|
||||||
public final Stack<Item> items = new Stack<>(); |
|
||||||
|
|
||||||
public int id; |
|
||||||
|
|
||||||
public boolean[] flags; |
|
||||||
public int[] numbers; |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void loadFrom(InputStream in) throws IOException |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void saveTo(OutputStream out) throws IOException |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public short getIonMark() |
|
||||||
{ |
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
public Tile toTile() { |
|
||||||
Tile t = new Tile(Tiles.get(id)); |
|
||||||
t.s |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,39 @@ |
|||||||
|
package mightypork.rogue.world.tile; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.util.Stack; |
||||||
|
|
||||||
|
import mightypork.rogue.world.item.Item; |
||||||
|
import mightypork.util.files.ion.Ion; |
||||||
|
import mightypork.util.files.ion.Ionizable; |
||||||
|
|
||||||
|
|
||||||
|
public class TileItems extends Stack<Item> implements Ionizable { |
||||||
|
|
||||||
|
public static final short ION_MARK = 703; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void load(InputStream in) throws IOException |
||||||
|
{ |
||||||
|
Ion.readSequence(in, this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(OutputStream out) throws IOException |
||||||
|
{ |
||||||
|
Ion.writeSequence(out, this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public short getIonMark() |
||||||
|
{ |
||||||
|
return ION_MARK; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,51 +1,62 @@ |
|||||||
package mightypork.rogue.world.tile; |
package mightypork.rogue.world.tile; |
||||||
|
|
||||||
|
|
||||||
import mightypork.rogue.world.EntityModel; |
|
||||||
import mightypork.util.annotations.DefaultImpl; |
import mightypork.util.annotations.DefaultImpl; |
||||||
|
|
||||||
|
|
||||||
public abstract class TileModel extends EntityModel<TileData, TileRenderContext> { |
/** |
||||||
|
* Singleton-like tile implementation |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class TileModel { |
||||||
|
|
||||||
|
/** Model ID */ |
||||||
|
public final int id; |
||||||
|
|
||||||
public TileModel(int id) { |
|
||||||
super(id); |
public TileModel(int id) |
||||||
|
{ |
||||||
Tiles.register(id, this); |
Tiles.register(id, this); |
||||||
|
this.id = id; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
|
||||||
public TileData createData() |
/** |
||||||
|
* @return new tile with this model |
||||||
|
*/ |
||||||
|
@DefaultImpl |
||||||
|
public Tile create() |
||||||
{ |
{ |
||||||
return null; |
return new Tile(this); |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Test if this tile type is potentially walkable. Used during world |
* Render the tile. |
||||||
* generation. |
|
||||||
* |
* |
||||||
* @return can be walked through (if discovered / open) |
* @param tile |
||||||
|
* @param context |
||||||
*/ |
*/ |
||||||
public abstract boolean isWalkable(); |
public abstract void render(Tile tile, TileRenderContext context); |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Try to reveal a secret. |
* @param tile |
||||||
* |
* @return is walkable at the current conditions |
||||||
* @param data tile data |
|
||||||
*/ |
*/ |
||||||
@DefaultImpl |
public abstract boolean isWalkable(Tile tile); |
||||||
public void search(TileData data) |
|
||||||
{ |
|
||||||
// do nothing.
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Check if a mob can walk through. |
* @return true if the tile can be walkable at some conditions |
||||||
* |
|
||||||
* @param data tile data |
|
||||||
* @return is walkable |
|
||||||
*/ |
*/ |
||||||
public abstract boolean isWalkable(TileData data); |
public abstract boolean isPotentiallyWalkable(); |
||||||
|
|
||||||
|
|
||||||
|
public boolean isNullTile() |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,26 +1,42 @@ |
|||||||
package mightypork.rogue.world.tile; |
package mightypork.rogue.world.tile; |
||||||
|
|
||||||
|
|
||||||
import java.util.HashMap; |
import mightypork.rogue.world.tile.models.Floor; |
||||||
import java.util.Map; |
import mightypork.rogue.world.tile.models.NullTile; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Tile registry |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
public final class Tiles { |
public final class Tiles { |
||||||
|
|
||||||
private static final Map<Integer, TileModel> registered = new HashMap<>(); |
private static final TileModel[] tiles = new TileModel[256]; |
||||||
|
|
||||||
|
public static final TileModel NONE = new NullTile(0); |
||||||
|
public static final TileModel FLOOR_MOSSY = new Floor(1, "tile.mossy_bricks.floor"); |
||||||
|
public static final TileModel WALL_MOSSY = new Floor(2, "tile.mossy_bricks.wall"); |
||||||
|
|
||||||
|
|
||||||
static void register(int id, TileModel model) |
static void register(int id, TileModel model) |
||||||
{ |
{ |
||||||
if (registered.containsKey(id)) throw new IllegalArgumentException("Tile ID " + id + " already in use."); |
if (id < 0 || id >= tiles.length) if (tiles[id] != null) { |
||||||
registered.put(id, model); |
throw new IllegalArgumentException("Tile ID " + id + " already in use."); |
||||||
|
} |
||||||
|
|
||||||
|
tiles[id] = model; |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
public static TileModel get(int id) |
public static TileModel get(int id) |
||||||
{ |
{ |
||||||
final TileModel m = registered.get(id); |
final TileModel m = tiles[id]; |
||||||
if (m == null) throw new IllegalArgumentException("No tile with ID " + id + "."); |
|
||||||
|
if (m == null) { |
||||||
|
throw new IllegalArgumentException("No tile with ID " + id + "."); |
||||||
|
} |
||||||
|
|
||||||
return m; |
return m; |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -1,15 +0,0 @@ |
|||||||
package mightypork.rogue.world.tile.impl; |
|
||||||
|
|
||||||
public class SimpleFloor extends SimpleTile { |
|
||||||
|
|
||||||
public SimpleFloor(int id, String sheetKey) { |
|
||||||
super(id, sheetKey); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isWalkable() |
|
||||||
{ |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,71 +0,0 @@ |
|||||||
package mightypork.rogue.world.tile.impl; |
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.OutputStream; |
|
||||||
|
|
||||||
import mightypork.gamecore.render.DisplaySystem; |
|
||||||
import mightypork.gamecore.render.Render; |
|
||||||
import mightypork.gamecore.render.textures.TxSheet; |
|
||||||
import mightypork.rogue.Res; |
|
||||||
import mightypork.rogue.world.tile.TileData; |
|
||||||
import mightypork.rogue.world.tile.TileModel; |
|
||||||
import mightypork.rogue.world.tile.TileRenderContext; |
|
||||||
import mightypork.util.annotations.DefaultImpl; |
|
||||||
|
|
||||||
|
|
||||||
public abstract class SimpleTile extends TileModel { |
|
||||||
|
|
||||||
private TxSheet sheet; |
|
||||||
|
|
||||||
|
|
||||||
public SimpleTile(int id, String sheetKey) { |
|
||||||
super(id); |
|
||||||
this.sheet = Res.getTxSheet(sheetKey); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
@DefaultImpl |
|
||||||
public void load(TileData data, InputStream in) throws IOException |
|
||||||
{ |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
@DefaultImpl |
|
||||||
public void save(TileData data, OutputStream out) throws IOException |
|
||||||
{ |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void render(TileData data, TileRenderContext context) |
|
||||||
{ |
|
||||||
// TODO worldmap should take care of this and break the row drawing when it encounters end of screen etc
|
|
||||||
|
|
||||||
// not in screen -> no draw
|
|
||||||
if (!context.getRect().intersectsWith(DisplaySystem.getBounds())) return; |
|
||||||
|
|
||||||
Render.quadTextured(context.getRect(), sheet.getRandomQuad(context.getNoise())); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
@DefaultImpl |
|
||||||
public void update(TileData item, double delta) |
|
||||||
{ |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
@DefaultImpl |
|
||||||
public boolean isWalkable(TileData data) |
|
||||||
{ |
|
||||||
return isWalkable(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,16 +0,0 @@ |
|||||||
package mightypork.rogue.world.tile.impl; |
|
||||||
|
|
||||||
|
|
||||||
public class SimpleWall extends SimpleTile { |
|
||||||
|
|
||||||
public SimpleWall(int id, String sheetKey) { |
|
||||||
super(id, sheetKey); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isWalkable() |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,18 @@ |
|||||||
|
package mightypork.rogue.world.tile.models; |
||||||
|
|
||||||
|
|
||||||
|
public class Floor extends SimpleTile { |
||||||
|
|
||||||
|
public Floor(int id, String sheetKey) |
||||||
|
{ |
||||||
|
super(id, sheetKey); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPotentiallyWalkable() |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
package mightypork.rogue.world.tile.models; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.world.tile.Tile; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
import mightypork.rogue.world.tile.TileRenderContext; |
||||||
|
|
||||||
|
|
||||||
|
public class NullTile extends TileModel { |
||||||
|
|
||||||
|
private Tile inst; |
||||||
|
|
||||||
|
|
||||||
|
public NullTile(int id) |
||||||
|
{ |
||||||
|
super(id); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void render(Tile tile, TileRenderContext context) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isWalkable(Tile tile) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPotentiallyWalkable() |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isNullTile() |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public Tile create() |
||||||
|
{ |
||||||
|
if (inst == null) { |
||||||
|
inst = new Tile(this); |
||||||
|
} |
||||||
|
|
||||||
|
return inst; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
package mightypork.rogue.world.tile.models; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.render.Render; |
||||||
|
import mightypork.gamecore.render.textures.TxSheet; |
||||||
|
import mightypork.rogue.Res; |
||||||
|
import mightypork.rogue.world.tile.Tile; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
import mightypork.rogue.world.tile.TileRenderContext; |
||||||
|
import mightypork.util.annotations.DefaultImpl; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class SimpleTile extends TileModel { |
||||||
|
|
||||||
|
protected final TxSheet sheet; |
||||||
|
|
||||||
|
|
||||||
|
public SimpleTile(int id, String sheetKey) |
||||||
|
{ |
||||||
|
super(id); |
||||||
|
this.sheet = Res.getTxSheet(sheetKey); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void render(Tile tile, TileRenderContext context) |
||||||
|
{ |
||||||
|
Render.quadTextured(context.getRect(), sheet.getRandomQuad(context.getTileNoise())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
@DefaultImpl |
||||||
|
public boolean isWalkable(Tile tile) |
||||||
|
{ |
||||||
|
return isPotentiallyWalkable(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract boolean isPotentiallyWalkable(); |
||||||
|
|
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue