parent
							
								
									b2cf0d14a0
								
							
						
					
					
						commit
						e83047ff38
					
				@ -0,0 +1,89 @@ | 
				
			||||
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.BinaryUtils; | 
				
			||||
import mightypork.util.files.ion.Ionizable; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class ItemData implements Ionizable, Updateable { | 
				
			||||
	 | 
				
			||||
	public static final short ION_MARK = 701; | 
				
			||||
	 | 
				
			||||
	private Model<ItemData, RectBound> model; | 
				
			||||
	 | 
				
			||||
	// data fields for models to use
 | 
				
			||||
	public Object data; | 
				
			||||
	public boolean[] flags; | 
				
			||||
	public int[] ints; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create from model id | 
				
			||||
	 *  | 
				
			||||
	 * @param id model id | 
				
			||||
	 */ | 
				
			||||
	public ItemData(int id) { | 
				
			||||
		this(Items.get(id)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create from model | 
				
			||||
	 *  | 
				
			||||
	 * @param model model | 
				
			||||
	 */ | 
				
			||||
	public ItemData(Model<ItemData, RectBound> model) { | 
				
			||||
		this.model = model; | 
				
			||||
		model.create(this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create without model. Model will be read from ION input stream. | 
				
			||||
	 */ | 
				
			||||
	public ItemData() { | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void loadFrom(InputStream in) throws IOException | 
				
			||||
	{ | 
				
			||||
		final int id = BinaryUtils.readInt(in); | 
				
			||||
		model = Items.get(id); | 
				
			||||
		model.load(this, in); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void saveTo(OutputStream out) throws IOException | 
				
			||||
	{ | 
				
			||||
		BinaryUtils.writeInt(out, model.getId()); | 
				
			||||
		model.save(this, out); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public short getIonMark() | 
				
			||||
	{ | 
				
			||||
		return ION_MARK; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public void render(RectBound context) | 
				
			||||
	{ | 
				
			||||
		model.render(this, context); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void update(double delta) | 
				
			||||
	{ | 
				
			||||
		model.update(this, delta); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,84 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.io.InputStream; | 
				
			||||
import java.io.OutputStream; | 
				
			||||
 | 
				
			||||
import mightypork.util.annotations.DefaultImpl; | 
				
			||||
import mightypork.util.constraints.rect.proxy.RectBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * An item model | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public abstract class ItemModel implements Model<ItemData, RectBound> { | 
				
			||||
	 | 
				
			||||
	public final int id; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public ItemModel(int id) { | 
				
			||||
		this.id = id; | 
				
			||||
		Items.register(id, this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public final int getId() | 
				
			||||
	{ | 
				
			||||
		return id; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void create(ItemData item) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * On search performed (reveal hidden door etc) | 
				
			||||
	 *  | 
				
			||||
	 * @param item item in world | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void search(TileData item) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Check if an entity can walk this item. If the item is not potentially | 
				
			||||
	 * walkable, then this method must always return false. | 
				
			||||
	 *  | 
				
			||||
	 * @param item item in world | 
				
			||||
	 */ | 
				
			||||
	public abstract void isWalkable(TileData item); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void load(ItemData item, InputStream in) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void save(ItemData item, OutputStream out) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public abstract void render(ItemData item, RectBound context); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void update(ItemData item, double delta) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,26 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class Items { | 
				
			||||
	 | 
				
			||||
	private static final Map<Integer, ItemModel> registered = new HashMap<>(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public static void register(int id, ItemModel model) | 
				
			||||
	{ | 
				
			||||
		if (registered.containsKey(id)) throw new IllegalArgumentException("Item ID " + id + " already in use."); | 
				
			||||
		registered.put(id, model); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public static ItemModel get(int id) | 
				
			||||
	{ | 
				
			||||
		final ItemModel m = registered.get(id); | 
				
			||||
		if (m == null) throw new IllegalArgumentException("No item with ID " + id + "."); | 
				
			||||
		return m; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,63 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.io.InputStream; | 
				
			||||
import java.io.OutputStream; | 
				
			||||
 | 
				
			||||
import mightypork.util.constraints.rect.proxy.RectBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public interface Model<DATA, RCTX> { | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get the id. | 
				
			||||
	 *  | 
				
			||||
	 * @return id | 
				
			||||
	 */ | 
				
			||||
	int getId(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Populate an entity with data for this model | 
				
			||||
	 *  | 
				
			||||
	 * @param entity entity in world | 
				
			||||
	 */ | 
				
			||||
	void create(DATA entity); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Load entity data from a binary stream. | 
				
			||||
	 *  | 
				
			||||
	 * @param entity item to load | 
				
			||||
	 * @param in input stream | 
				
			||||
	 */ | 
				
			||||
	void load(DATA entity, InputStream in); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Save entity data to a binary stream. | 
				
			||||
	 *  | 
				
			||||
	 * @param entity entity to save | 
				
			||||
	 * @param out output stream | 
				
			||||
	 */ | 
				
			||||
	void save(DATA entity, OutputStream out); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Render according to given context. | 
				
			||||
	 *  | 
				
			||||
	 * @param entity data object | 
				
			||||
	 * @param context rendering context | 
				
			||||
	 */ | 
				
			||||
	void render(DATA entity, RCTX context); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Update the entity (animation, decay etc) | 
				
			||||
	 *  | 
				
			||||
	 * @param entity data object | 
				
			||||
	 * @param delta delta time | 
				
			||||
	 */ | 
				
			||||
	void update(DATA entity, double delta); | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,102 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.io.IOException; | 
				
			||||
import java.io.InputStream; | 
				
			||||
import java.io.OutputStream; | 
				
			||||
import java.util.Stack; | 
				
			||||
 | 
				
			||||
import mightypork.util.control.timing.Updateable; | 
				
			||||
import mightypork.util.files.ion.BinaryUtils; | 
				
			||||
import mightypork.util.files.ion.Ionizable; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Concrete tile in the world. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public class TileData implements Ionizable, Updateable { | 
				
			||||
	 | 
				
			||||
	public static final short ION_MARK = 700; | 
				
			||||
	 | 
				
			||||
	/** Items dropped onto this tile */ | 
				
			||||
	public final Stack<ItemData> items = new Stack<>(); | 
				
			||||
	 | 
				
			||||
	/** Whether the tile is occupied by an entity */ | 
				
			||||
	public boolean occupied; | 
				
			||||
	 | 
				
			||||
	private TileModel model; | 
				
			||||
	 | 
				
			||||
	// data fields for models to use
 | 
				
			||||
	public Object data; | 
				
			||||
	public boolean[] flags; | 
				
			||||
	public int[] ints; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create from model id | 
				
			||||
	 *  | 
				
			||||
	 * @param id model id | 
				
			||||
	 */ | 
				
			||||
	public TileData(int id) { | 
				
			||||
		this(Tiles.get(id)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create from model | 
				
			||||
	 *  | 
				
			||||
	 * @param model model | 
				
			||||
	 */ | 
				
			||||
	public TileData(TileModel model) { | 
				
			||||
		this.model = model; | 
				
			||||
		model.create(this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create without model. Model will be read from ION input stream. | 
				
			||||
	 */ | 
				
			||||
	public TileData() { | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void loadFrom(InputStream in) throws IOException | 
				
			||||
	{ | 
				
			||||
		final int id = BinaryUtils.readInt(in); | 
				
			||||
		model = Tiles.get(id); | 
				
			||||
		model.load(this, in); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void saveTo(OutputStream out) throws IOException | 
				
			||||
	{ | 
				
			||||
		BinaryUtils.writeInt(out, model.getId()); | 
				
			||||
		model.save(this, out); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public short getIonMark() | 
				
			||||
	{ | 
				
			||||
		return ION_MARK; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public void render(TileRenderContext context) | 
				
			||||
	{ | 
				
			||||
		model.render(this, context); | 
				
			||||
		if (!items.isEmpty()) items.peek().render(context); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void update(double delta) | 
				
			||||
	{ | 
				
			||||
		model.update(this, delta); | 
				
			||||
		if (!items.isEmpty()) items.peek().update(delta); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,13 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public interface TileHolder { | 
				
			||||
	 | 
				
			||||
	TileData getTile(int x, int y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	int getWidth(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	int getHeight(); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,106 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.io.InputStream; | 
				
			||||
import java.io.OutputStream; | 
				
			||||
 | 
				
			||||
import mightypork.util.annotations.DefaultImpl; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public abstract class TileModel { | 
				
			||||
	 | 
				
			||||
	public final int id; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public TileModel(int id) { | 
				
			||||
		this.id = id; | 
				
			||||
		Tiles.register(id, this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get the id. | 
				
			||||
	 *  | 
				
			||||
	 * @return id | 
				
			||||
	 */ | 
				
			||||
	public final int getId() | 
				
			||||
	{ | 
				
			||||
		return id; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return can be walked through (if discovered / open) | 
				
			||||
	 */ | 
				
			||||
	public abstract boolean isPotentiallyWalkable(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Populate a tile holder with data for this tile model | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile in world | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void create(TileData tile) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * On search performed (reveal hidden door etc) | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile in world | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void search(TileData tile) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Check if an entity can walk this tile. If the tile is not potentially | 
				
			||||
	 * walkable, then this method must always return false. | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile in world | 
				
			||||
	 */ | 
				
			||||
	public abstract void isWalkable(TileData tile); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Load a tile from binary stream. | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile to load | 
				
			||||
	 * @param in input stream | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void load(TileData tile, InputStream in) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Save a tile to binary stream. | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile to save | 
				
			||||
	 * @param out output stream | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void save(TileData tile, OutputStream out) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public abstract void render(TileData tile, TileRenderContext context); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Update the tile (animation, item spawning etc) | 
				
			||||
	 *  | 
				
			||||
	 * @param tile tile to update | 
				
			||||
	 * @param delta delta time | 
				
			||||
	 */ | 
				
			||||
	@DefaultImpl | 
				
			||||
	public void update(TileData tile, double delta) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,39 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.util.constraints.rect.Rect; | 
				
			||||
import mightypork.util.constraints.rect.builders.TiledRect; | 
				
			||||
import mightypork.util.constraints.rect.proxy.RectBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class TileRenderContext implements RectBound { | 
				
			||||
	 | 
				
			||||
	private final TileHolder map; | 
				
			||||
	private final TiledRect tiler; | 
				
			||||
	private int x, y; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public TileRenderContext(TileHolder map, Rect mapArea) { | 
				
			||||
		this.map = map; | 
				
			||||
		this.tiler = mapArea.tiles(map.getWidth(), map.getHeight()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public TileData getTile() | 
				
			||||
	{ | 
				
			||||
		return map.getTile(x, y); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public TileData getAdjacentTile(int offsetX, int offsetY) | 
				
			||||
	{ | 
				
			||||
		return map.getTile(x + offsetX, y + offsetY); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Rect getRect() | 
				
			||||
	{ | 
				
			||||
		return tiler.tile(x, y); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,26 @@ | 
				
			||||
package mightypork.rogue.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class Tiles { | 
				
			||||
	 | 
				
			||||
	private static final Map<Integer, TileModel> registered = new HashMap<>(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public static void register(int id, TileModel model) | 
				
			||||
	{ | 
				
			||||
		if (registered.containsKey(id)) throw new IllegalArgumentException("Tile ID " + id + " already in use."); | 
				
			||||
		registered.put(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 + "."); | 
				
			||||
		return m; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue