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; |
||||
|
||||
|
||||
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.RectBoundAdapter; |
||||
|
||||
|
||||
/** |
||||
* An item model |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class ItemModel extends EntityModel<ItemData, RectBound> { |
||||
public abstract class ItemModel { |
||||
|
||||
public final int id; |
||||
|
||||
private final RectBoundAdapter tileRect = new RectBoundAdapter(); |
||||
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); |
||||
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; |
||||
|
||||
|
||||
import mightypork.rogue.world.Entity; |
||||
import mightypork.rogue.world.item.Item; |
||||
import java.io.IOException; |
||||
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 */ |
||||
private transient boolean occupied; |
||||
public static final short ION_MARK = 700; |
||||
|
||||
private transient TileModel model; |
||||
public transient Object modelData; |
||||
public transient Animator anim; |
||||
|
||||
public Tile() { |
||||
super(); |
||||
} |
||||
public int id; |
||||
|
||||
public TileItems items; |
||||
|
||||
public Tile(TileModel model) { |
||||
super(model); |
||||
} |
||||
public boolean[] flags; |
||||
public int[] numbers; |
||||
|
||||
|
||||
public Tile(int id) { |
||||
super(Tiles.get(id)); |
||||
public Tile(int id) |
||||
{ |
||||
this(Tiles.get(id)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected TileModel getModelForId(int id) |
||||
@IonConstructor |
||||
public Tile() |
||||
{ |
||||
return Tiles.get(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
public Tile(TileModel model) |
||||
{ |
||||
return ION_MARK; |
||||
this.model = model; |
||||
this.id = model.id; |
||||
this.items = new TileItems(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void render(TileRenderContext context) |
||||
{ |
||||
super.render(context); |
||||
model.render(this, context); |
||||
|
||||
// render laying-on-top item
|
||||
if (!data.items.isEmpty()) { |
||||
final Item item = data.items.peek(); |
||||
|
||||
item.render(context.getRect()); |
||||
if (!items.isEmpty()) { |
||||
items.peek().renderOnTile(context); |
||||
} |
||||
} |
||||
|
||||
|
||||
@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
|
||||
if (!data.items.isEmpty()) { |
||||
final Item item = data.items.peek(); |
||||
item.update(delta); |
||||
} |
||||
} |
||||
final IonBundle ib = new IonBundle(); |
||||
|
||||
ib.put("id", id); |
||||
ib.put("flags", flags); |
||||
ib.put("numbers", numbers); |
||||
ib.put("items", items); |
||||
|
||||
/** |
||||
* Try to reveal secrets of this tile |
||||
*/ |
||||
public void search() |
||||
{ |
||||
model.search(data); |
||||
Ion.writeObject(out, ib); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return true if a mob can walk through |
||||
*/ |
||||
public boolean isWalkable() |
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
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() |
||||
{ |
||||
return !data.items.isEmpty(); |
||||
// renew model
|
||||
if (model == null || id != model.id) { |
||||
model = Tiles.get(id); |
||||
} |
||||
} |
||||
|
||||
|
||||
public Item removeItem() |
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
if(!hasItem()) return null; |
||||
return data.items.pop(); |
||||
return ION_MARK; |
||||
} |
||||
|
||||
|
||||
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; |
||||
|
||||
|
||||
import mightypork.rogue.world.EntityModel; |
||||
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); |
||||
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 |
||||
* generation. |
||||
* Render the tile. |
||||
* |
||||
* @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 data tile data |
||||
* @param tile |
||||
* @return is walkable at the current conditions |
||||
*/ |
||||
@DefaultImpl |
||||
public void search(TileData data) |
||||
{ |
||||
// do nothing.
|
||||
} |
||||
public abstract boolean isWalkable(Tile tile); |
||||
|
||||
|
||||
/** |
||||
* Check if a mob can walk through. |
||||
* |
||||
* @param data tile data |
||||
* @return is walkable |
||||
* @return true if the tile can be walkable at some conditions |
||||
*/ |
||||
public abstract boolean isWalkable(TileData data); |
||||
public abstract boolean isPotentiallyWalkable(); |
||||
|
||||
|
||||
public boolean isNullTile() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
} |
||||
|
@ -1,26 +1,42 @@ |
||||
package mightypork.rogue.world.tile; |
||||
|
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
import mightypork.rogue.world.tile.models.Floor; |
||||
import mightypork.rogue.world.tile.models.NullTile; |
||||
|
||||
|
||||
/** |
||||
* Tile registry |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
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) |
||||
{ |
||||
if (registered.containsKey(id)) throw new IllegalArgumentException("Tile ID " + id + " already in use."); |
||||
registered.put(id, model); |
||||
if (id < 0 || id >= tiles.length) if (tiles[id] != null) { |
||||
throw new IllegalArgumentException("Tile ID " + id + " already in use."); |
||||
} |
||||
|
||||
tiles[id] = model; |
||||
} |
||||
|
||||
|
||||
public static TileModel get(int id) |
||||
{ |
||||
final TileModel m = registered.get(id); |
||||
if (m == null) throw new IllegalArgumentException("No tile with ID " + id + "."); |
||||
final TileModel m = tiles[id]; |
||||
|
||||
if (m == null) { |
||||
throw new IllegalArgumentException("No tile with ID " + id + "."); |
||||
} |
||||
|
||||
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