some changes, nothing much

v5stable
Ondřej Hruška 10 years ago
parent 0d5b6eb995
commit 2f26602d15
  1. BIN
      fuck.ion
  2. 4
      src/mightypork/gamecore/render/fonts/impl/CachedFont.java
  3. 2
      src/mightypork/gamecore/render/textures/DeferredTexture.java
  4. 4
      src/mightypork/gamecore/render/textures/GLTexture.java
  5. 2
      src/mightypork/rogue/App.java
  6. 12
      src/mightypork/rogue/world/World.java
  7. 49
      src/mightypork/rogue/world/item/Item.java
  8. 14
      src/mightypork/rogue/world/item/ItemModel.java
  9. 3
      src/mightypork/rogue/world/map/Level.java
  10. 4
      src/mightypork/rogue/world/map/MapAccess.java
  11. 2
      src/mightypork/rogue/world/map/TileRenderContext.java
  12. 19
      src/mightypork/rogue/world/structs/ItemStack.java
  13. 19
      src/mightypork/rogue/world/structs/LevelList.java
  14. 45
      src/mightypork/rogue/world/tile/DroppedItemRenderer.java
  15. 94
      src/mightypork/rogue/world/tile/Tile.java
  16. 28
      src/mightypork/rogue/world/tile/TileModel.java
  17. 17
      src/mightypork/rogue/world/tile/models/AbstractNullTile.java
  18. 5
      src/mightypork/rogue/world/tile/models/Floor.java
  19. 31
      src/mightypork/rogue/world/tile/models/SimpleTile.java
  20. 5
      src/mightypork/rogue/world/tile/models/Wall.java
  21. 2
      src/mightypork/util/constraints/rect/builders/TiledRect.java
  22. 2
      src/mightypork/util/constraints/rect/caching/RectDigest.java
  23. 9
      src/mightypork/util/control/timing/Animator.java
  24. 4
      src/mightypork/util/files/ion/IonBundle.java
  25. 38
      src/mightypork/util/files/ion/Ionizable.java
  26. 36
      src/mightypork/util/files/ion/Streamable.java
  27. 4
      src/mightypork/util/files/ion/templates/StreamableArrayList.java
  28. 4
      src/mightypork/util/files/ion/templates/StreamableHashMap.java
  29. 4
      src/mightypork/util/files/ion/templates/StreamableHashSet.java
  30. 4
      src/mightypork/util/files/ion/templates/StreamableLinkedHashMap.java
  31. 4
      src/mightypork/util/files/ion/templates/StreamableLinkedList.java
  32. 4
      src/mightypork/util/files/ion/templates/StreamableStack.java
  33. 4
      src/mightypork/util/files/ion/templates/StreamableTreeSet.java

Binary file not shown.

@ -396,8 +396,8 @@ public class CachedFont implements GLFont {
// draw quad // draw quad
float txmin = chtx.texPosX; final float txmin = chtx.texPosX;
float tymin = chtx.texPosY; final float tymin = chtx.texPosY;
final float draw_width = minx + chtx.width - minx; final float draw_width = minx + chtx.width - minx;
final float draw_height = (float) (chtx.height) - (float) 0; final float draw_height = (float) (chtx.height) - (float) 0;

@ -56,7 +56,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
if (!alphal) { if (!alphal) {
alphal = true; alphal = true;
alpha = backingTexture.hasAlpha(); alpha = backingTexture.hasAlpha();
} }
return alpha; return alpha;

@ -83,8 +83,8 @@ public interface GLTexture extends Destroyable {
* Bind to GL context, applying the filters prescribed. * Bind to GL context, applying the filters prescribed.
*/ */
void bind(); void bind();
/** /**
* @return true if the image is RGBA * @return true if the image is RGBA
*/ */

@ -27,7 +27,6 @@ import mightypork.rogue.world.World;
import mightypork.rogue.world.WorldPos; import mightypork.rogue.world.WorldPos;
import mightypork.rogue.world.item.Item; import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.map.Level; import mightypork.rogue.world.map.Level;
import mightypork.rogue.world.structs.LevelList;
import mightypork.rogue.world.tile.Tile; import mightypork.rogue.world.tile.Tile;
import mightypork.util.control.eventbus.EventBus; import mightypork.util.control.eventbus.EventBus;
import mightypork.util.control.eventbus.events.Event; import mightypork.util.control.eventbus.events.Event;
@ -112,7 +111,6 @@ public final class App extends BaseApp {
{ {
Ion.registerIonizable(Item.ION_MARK, Item.class); Ion.registerIonizable(Item.ION_MARK, Item.class);
Ion.registerIonizable(Level.ION_MARK, Level.class); Ion.registerIonizable(Level.ION_MARK, Level.class);
Ion.registerIonizable(LevelList.ION_MARK, LevelList.class);
Ion.registerIonizable(PlayerInfo.ION_MARK, PlayerInfo.class); Ion.registerIonizable(PlayerInfo.ION_MARK, PlayerInfo.class);
Ion.registerIonizable(Tile.ION_MARK, Tile.class); Ion.registerIonizable(Tile.ION_MARK, Tile.class);
Ion.registerIonizable(World.ION_MARK, World.class); Ion.registerIonizable(World.ION_MARK, World.class);

@ -9,23 +9,22 @@ import java.util.Set;
import mightypork.rogue.world.map.Level; import mightypork.rogue.world.map.Level;
import mightypork.rogue.world.map.TileRenderContext; import mightypork.rogue.world.map.TileRenderContext;
import mightypork.rogue.world.structs.LevelList;
import mightypork.util.constraints.rect.Rect; import mightypork.util.constraints.rect.Rect;
import mightypork.util.constraints.rect.RectConst; import mightypork.util.constraints.rect.RectConst;
import mightypork.util.constraints.rect.proxy.RectBound; import mightypork.util.constraints.rect.proxy.RectBound;
import mightypork.util.constraints.vect.VectConst; import mightypork.util.constraints.vect.VectConst;
import mightypork.util.control.timing.Updateable; import mightypork.util.control.timing.Updateable;
import mightypork.util.error.CorruptedDataException;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.IonBundle; import mightypork.util.files.ion.IonBundle;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Ionizable;
import mightypork.util.files.ion.templates.StreamableArrayList;
public class World implements Ionizable, Updateable { public class World implements Ionizable, Updateable {
public static final short ION_MARK = 706; public static final short ION_MARK = 706;
private LevelList levels = new LevelList(); private StreamableArrayList<Level> levels = new StreamableArrayList<>();
private PlayerInfo player = new PlayerInfo(); private PlayerInfo player = new PlayerInfo();
@ -42,12 +41,8 @@ public class World implements Ionizable, Updateable {
final IonBundle ib = (IonBundle) Ion.readObject(in); final IonBundle ib = (IonBundle) Ion.readObject(in);
player = ib.get("player", player); player = ib.get("player", player);
seed = ib.get("seed", seed); seed = ib.get("seed", seed);
levels = ib.get("levels", levels);
// levels
Ion.readSequence(in, levels); Ion.readSequence(in, levels);
if (player == null) throw new CorruptedDataException("Null player in world.");
} }
@ -57,8 +52,9 @@ public class World implements Ionizable, Updateable {
final IonBundle ib = new IonBundle(); final IonBundle ib = new IonBundle();
ib.put("player", player); ib.put("player", player);
ib.put("seed", seed); ib.put("seed", seed);
ib.put("levels", levels);
Ion.writeObject(out, ib); Ion.writeObject(out, ib);
Ion.writeSequence(out, levels);
} }

@ -5,31 +5,20 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import mightypork.rogue.world.map.TileRenderContext;
import mightypork.util.constraints.rect.proxy.RectBound; import mightypork.util.constraints.rect.proxy.RectBound;
import mightypork.util.control.timing.Animator;
import mightypork.util.control.timing.AnimatorBounce;
import mightypork.util.control.timing.Updateable;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.IonBundle;
import mightypork.util.files.ion.IonConstructor; import mightypork.util.files.ion.IonConstructor;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Ionizable;
import mightypork.util.math.Easing;
public class Item implements Updateable, Ionizable { public class Item implements Ionizable {
public static final short ION_MARK = 701; public static final short ION_MARK = 701;
private transient ItemModel model; private transient ItemModel model;
public transient Object modelData;
public transient Animator anim;
public int id; public int id;
public boolean[] flags;
public int[] numbers;
public Item(int id) public Item(int id)
{ {
@ -47,7 +36,6 @@ public class Item implements Updateable, Ionizable {
{ {
this.model = model; this.model = model;
this.id = model.id; this.id = model.id;
this.anim = new AnimatorBounce(2, Easing.SINE_BOTH);
} }
@ -60,28 +48,17 @@ public class Item implements Updateable, Ionizable {
@Override @Override
public void save(OutputStream out) throws IOException public void save(OutputStream out) throws IOException
{ {
final IonBundle ib = new IonBundle(); Ion.writeShort(out, (short) id);
ib.put("id", id);
ib.put("flags", flags);
ib.put("numbers", numbers);
Ion.writeObject(out, ib);
} }
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException
{ {
final IonBundle ib = (IonBundle) Ion.readObject(in); id = Ion.readShort(in);
id = ib.get("id", 0);
flags = ib.get("flags", null);
numbers = ib.get("numbers", null);
if (id != model.id) { // if id changed, get new model
model = Items.get(id); if (model == null || id != model.id) model = Items.get(id);
}
} }
@ -91,20 +68,4 @@ public class Item implements Updateable, Ionizable {
return ION_MARK; return ION_MARK;
} }
@Override
public void update(double delta)
{
if (anim != null) {
anim.update(delta);
}
}
public void renderOnTile(TileRenderContext context)
{
model.renderOnTile(this, context);
}
} }

@ -13,11 +13,6 @@ public abstract class ItemModel {
public final int id; 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) public ItemModel(int id)
{ {
@ -38,13 +33,4 @@ public abstract class ItemModel {
public abstract void render(Item item, RectBound context); 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);
}
} }

@ -32,7 +32,7 @@ public class Level implements MapAccess, Ionizable {
/** Level seed (used for generation and tile variation) */ /** Level seed (used for generation and tile variation) */
public long seed; public long seed;
private NoiseGen noiseGen; private NoiseGen noiseGen;
@ -193,6 +193,7 @@ public class Level implements MapAccess, Ionizable {
} }
} }
@Override @Override
public NoiseGen getNoiseGen() public NoiseGen getNoiseGen()
{ {

@ -38,8 +38,8 @@ public interface MapAccess {
* @return map seed * @return map seed
*/ */
long getSeed(); long getSeed();
/** /**
* @return level-specific noise generator * @return level-specific noise generator
*/ */

@ -28,7 +28,7 @@ public final class TileRenderContext implements RectBound {
this.map = map; this.map = map;
this.tiler = drawArea.tiles(map.getWidth(), map.getHeight()); this.tiler = drawArea.tiles(map.getWidth(), map.getHeight());
this.tiler.setOverlap(0.001); this.tiler.setOverlap(0.001); // avoid gaps (rounding error?)
this.noise = map.getNoiseGen(); this.noise = map.getNoiseGen();
} }

@ -1,19 +0,0 @@
package mightypork.rogue.world.structs;
import mightypork.rogue.world.item.Item;
import mightypork.util.files.ion.templates.IonizableStack;
public class ItemStack extends IonizableStack<Item> {
private static final short ION_MARK = 710;
@Override
public short getIonMark()
{
return ION_MARK;
}
}

@ -1,19 +0,0 @@
package mightypork.rogue.world.structs;
import mightypork.rogue.world.map.Level;
import mightypork.util.files.ion.templates.IonizableArrayList;
public class LevelList extends IonizableArrayList<Level> {
public static final short ION_MARK = 709;
@Override
public short getIonMark()
{
return ION_MARK;
}
}

@ -0,0 +1,45 @@
package mightypork.rogue.world.tile;
import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.map.TileRenderContext;
import mightypork.util.constraints.rect.Rect;
import mightypork.util.constraints.rect.proxy.RectBoundAdapter;
import mightypork.util.control.timing.Animator;
import mightypork.util.control.timing.AnimatorBounce;
import mightypork.util.control.timing.Updateable;
import mightypork.util.math.Easing;
public class DroppedItemRenderer implements Updateable {
private Animator itemAnim = new AnimatorBounce(2, Easing.SINE_BOTH);
// prepared constraints, to avoid re-building each frame
private final RectBoundAdapter tileRectAdapter = new RectBoundAdapter();
private final Rect itemRect = tileRectAdapter.shrink(tileRectAdapter.height().perc(10)).moveY(itemAnim.neg());
public Animator getItemAnim()
{
if (itemAnim == null) {
itemAnim = new AnimatorBounce(2, Easing.SINE_BOTH);
}
return itemAnim;
}
public void render(Item item, TileRenderContext context)
{
tileRectAdapter.setRect(context);
item.render(itemRect);
}
@Override
public void update(double delta)
{
itemAnim.update(delta);
}
}

@ -4,14 +4,17 @@ package mightypork.rogue.world.tile;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Stack;
import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.map.TileRenderContext; import mightypork.rogue.world.map.TileRenderContext;
import mightypork.rogue.world.structs.ItemStack;
import mightypork.util.control.timing.Animator; import mightypork.util.control.timing.Animator;
import mightypork.util.control.timing.Updateable; import mightypork.util.control.timing.Updateable;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.IonBundle;
import mightypork.util.files.ion.IonConstructor; import mightypork.util.files.ion.IonConstructor;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Ionizable;
import mightypork.util.files.ion.Streamable;
public final class Tile implements Ionizable, Updateable { public final class Tile implements Ionizable, Updateable {
@ -19,15 +22,19 @@ public final class Tile implements Ionizable, Updateable {
public static final short ION_MARK = 700; public static final short ION_MARK = 700;
private transient TileModel model; private transient TileModel model;
/**
* Temporary storage for the model (unlocked door state, lever switched etc)
*/
public transient Object modelData; public transient Object modelData;
public transient Animator anim;
public int id; /** Animator field for the model to use, if needed */
public transient Animator anim;
public ItemStack items = new ItemStack(); private transient DroppedItemRenderer itemRenderer; // lazy
public boolean[] flags; public int id;
public int[] numbers; private final Stack<Item> items = new Stack<>();
public Tile(int id) public Tile(int id)
@ -36,16 +43,16 @@ public final class Tile implements Ionizable, Updateable {
} }
@IonConstructor public Tile(TileModel model)
public Tile()
{ {
this.model = model;
this.id = model.id;
} }
public Tile(TileModel model) @IonConstructor
public Tile()
{ {
this.model = model;
this.id = model.id;
} }
@ -54,7 +61,7 @@ public final class Tile implements Ionizable, Updateable {
model.render(context); model.render(context);
if (!items.isEmpty()) { if (!items.isEmpty()) {
items.peek().renderOnTile(context); getItemRenderer().render(items.peek(), context);
} }
} }
@ -64,17 +71,15 @@ public final class Tile implements Ionizable, Updateable {
{ {
if (model.isNullTile()) throw new RuntimeException("Cannot save null tile."); if (model.isNullTile()) throw new RuntimeException("Cannot save null tile.");
Ion.writeShort(out, (short) id); Ion.writeShort(out, (short) id); // tile ID
Ion.writeSequence(out, items); // if empty, writes single END mark
byte written = 0;
if (flags != null) written |= 1;
if (numbers != null) written |= 2;
if (items != null && !items.isEmpty()) written |= 4;
Ion.writeByte(out, written);
if ((written & 1) != 0) Ion.writeBooleanArray(out, flags); // models with metadata can save their stuff
if ((written & 2) != 0) Ion.writeIntArray(out, numbers); if (model.hasMetadata()) {
if ((written & 4) != 0) Ion.writeObject(out, items); IonBundle ib = new IonBundle();
model.saveMetadata(this, ib);
Ion.writeObject(out, ib);
}
} }
@ -83,33 +88,38 @@ public final class Tile implements Ionizable, Updateable {
{ {
id = Ion.readShort(in); id = Ion.readShort(in);
final byte written = Ion.readByte(in); // check if model is changed (can happen)
if ((written & 1) != 0) flags = Ion.readBooleanArray(in);
if ((written & 2) != 0) numbers = Ion.readIntArray(in);
if ((written & 4) != 0) items = (ItemStack) Ion.readObject(in);
// renew model
if (model == null || id != model.id) { if (model == null || id != model.id) {
model = Tiles.get(id); model = Tiles.get(id);
} }
Ion.readSequence(in, items); // if END is found, nothing is read.
// load model's stuff
if (model.hasMetadata()) {
IonBundle ib = (IonBundle) Ion.readObject(in);
model.loadMetadata(this, ib);
}
} }
@Override @Override
public short getIonMark() public void update(double delta)
{ {
return ION_MARK; model.update(this, delta);
if (!items.isEmpty()) {
getItemRenderer().update(delta);
}
} }
@Override private DroppedItemRenderer getItemRenderer()
public void update(double delta)
{ {
model.update(this, delta); if (itemRenderer == null) {
if (!items.isEmpty()) { itemRenderer = new DroppedItemRenderer();
items.peek().update(delta);
} }
return itemRenderer;
} }
@ -118,4 +128,16 @@ public final class Tile implements Ionizable, Updateable {
return model; return model;
} }
public boolean hasItems()
{
return !items.isEmpty();
}
@Override
public short getIonMark()
{
return ION_MARK;
}
} }

@ -3,6 +3,7 @@ package mightypork.rogue.world.tile;
import mightypork.rogue.world.map.TileRenderContext; import mightypork.rogue.world.map.TileRenderContext;
import mightypork.util.annotations.DefaultImpl; import mightypork.util.annotations.DefaultImpl;
import mightypork.util.files.ion.IonBundle;
/** /**
@ -76,4 +77,31 @@ public abstract class TileModel {
*/ */
public abstract void update(Tile tile, double delta); public abstract void update(Tile tile, double delta);
/**
* Store tile metadata (door lock state etc)
*
* @param tile stored tile
* @param ib written data bundle
*/
public abstract void saveMetadata(Tile tile, IonBundle ib);
/**
* Load from an IonBundle. The bundle is guaranteed to not be null, but
* could be empty.
*
* @param tile loaded tile
* @param ib item data bundle
*/
public abstract void loadMetadata(Tile tile, IonBundle ib);
/**
* True if this tile's data should be saved/loaded.<br>
* Must be a constant value.
*
* @return has data
*/
public abstract boolean hasMetadata();
} }

@ -4,6 +4,7 @@ package mightypork.rogue.world.tile.models;
import mightypork.rogue.world.map.TileRenderContext; import mightypork.rogue.world.map.TileRenderContext;
import mightypork.rogue.world.tile.Tile; import mightypork.rogue.world.tile.Tile;
import mightypork.rogue.world.tile.TileModel; import mightypork.rogue.world.tile.TileModel;
import mightypork.util.files.ion.IonBundle;
/** /**
@ -58,4 +59,20 @@ public abstract class AbstractNullTile extends TileModel {
return inst; return inst;
} }
@Override
public boolean hasMetadata()
{
return false;
}
@Override
public void loadMetadata(Tile tile, IonBundle ib)
{
}
@Override
public void saveMetadata(Tile tile, IonBundle ib)
{
}
} }

@ -1,6 +1,11 @@
package mightypork.rogue.world.tile.models; package mightypork.rogue.world.tile.models;
/**
* Template for floor tiles with no metadata
*
* @author MightyPork
*/
public class Floor extends SimpleTile { public class Floor extends SimpleTile {
public Floor(int id, String sheetKey) public Floor(int id, String sheetKey)

@ -8,8 +8,14 @@ import mightypork.rogue.world.map.TileRenderContext;
import mightypork.rogue.world.tile.Tile; import mightypork.rogue.world.tile.Tile;
import mightypork.rogue.world.tile.TileModel; import mightypork.rogue.world.tile.TileModel;
import mightypork.util.annotations.DefaultImpl; import mightypork.util.annotations.DefaultImpl;
import mightypork.util.files.ion.IonBundle;
/**
* Basic implementation of a tile with coord-random texture and no animation.
*
* @author MightyPork
*/
public abstract class SimpleTile extends TileModel { public abstract class SimpleTile extends TileModel {
protected final TxSheet sheet; protected final TxSheet sheet;
@ -36,8 +42,10 @@ public abstract class SimpleTile extends TileModel {
} }
/*
* Items can override this if their walkability changes based on something
*/
@Override @Override
@DefaultImpl
public boolean isWalkable(Tile tile) public boolean isWalkable(Tile tile)
{ {
return isPotentiallyWalkable(); return isPotentiallyWalkable();
@ -47,4 +55,25 @@ public abstract class SimpleTile extends TileModel {
@Override @Override
public abstract boolean isPotentiallyWalkable(); public abstract boolean isPotentiallyWalkable();
@Override
@DefaultImpl
public boolean hasMetadata()
{
return false; // it's a SIMPLE tile
}
@Override
@DefaultImpl
public void loadMetadata(Tile tile, IonBundle ib)
{
}
@Override
@DefaultImpl
public void saveMetadata(Tile tile, IonBundle ib)
{
}
} }

@ -1,6 +1,11 @@
package mightypork.rogue.world.tile.models; package mightypork.rogue.world.tile.models;
/**
* Template for wall tiles with no metadata
*
* @author MightyPork
*/
public class Wall extends SimpleTile { public class Wall extends SimpleTile {
public Wall(int id, String sheetKey) public Wall(int id, String sheetKey)

@ -97,7 +97,7 @@ public class TiledRect extends RectProxy {
Log.w("Y coordinate(s) out of range.", new IllegalAccessException()); Log.w("Y coordinate(s) out of range.", new IllegalAccessException());
} }
Vect orig = origin().add(perCol.mul(x), perRow.mul(y)); final Vect orig = origin().add(perCol.mul(x), perRow.mul(y));
return Rect.make(orig, perCol.mul(size_x), perRow.mul(size_y)); return Rect.make(orig, perCol.mul(size_x), perRow.mul(size_y));
} }

@ -18,7 +18,7 @@ public class RectDigest {
public RectDigest(Rect rect) public RectDigest(Rect rect)
{ {
this.x = rect.origin().x(); this.x = rect.origin().x();
this.y = rect.origin().y(); this.y = rect.origin().y();

@ -4,11 +4,10 @@ package mightypork.util.control.timing;
import mightypork.util.annotations.DefaultImpl; import mightypork.util.annotations.DefaultImpl;
import mightypork.util.constraints.num.Num; import mightypork.util.constraints.num.Num;
import mightypork.util.constraints.num.mutable.NumAnimated; import mightypork.util.constraints.num.mutable.NumAnimated;
import mightypork.util.constraints.num.proxy.NumBound;
import mightypork.util.math.Easing; import mightypork.util.math.Easing;
public abstract class Animator implements Updateable, Pauseable, NumBound { public abstract class Animator extends Num implements Updateable, Pauseable {
private final NumAnimated animator; private final NumAnimated animator;
private final Num num; private final Num num;
@ -81,12 +80,6 @@ public abstract class Animator implements Updateable, Pauseable, NumBound {
@Override @Override
public final Num getNum()
{
return num;
}
public final double value() public final double value()
{ {
return num.value(); return num.value();

@ -1,7 +1,7 @@
package mightypork.util.files.ion; package mightypork.util.files.ion;
import mightypork.util.files.ion.templates.IonizableHashMap; import mightypork.util.files.ion.templates.StreamableHashMap;
/** /**
@ -16,7 +16,7 @@ import mightypork.util.files.ion.templates.IonizableHashMap;
* *
* @author MightyPork * @author MightyPork
*/ */
public class IonBundle extends IonizableHashMap<String, Object> { public class IonBundle extends StreamableHashMap<String, Object> implements Ionizable {
/** /**
* Get an object. If not found, fallback is returned. * Get an object. If not found, fallback is returned.

@ -1,39 +1,19 @@
package mightypork.util.files.ion; package mightypork.util.files.ion;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/** /**
* Object that can be saved to and loaded from Ion file.<br> * <p>
* All classes implementing Ionizable must be registered to {@link Ion} using * Data object that can be reconstructed by Ion based on it's mark. Such object
* Ion.registerIonizable(obj.class). * MUST provide an implicit constructor.
* </p>
* <p>
* All {@link Ionizable}s must be registered to {@link Ion}, otherwise they
* can't be written/loaded using the mark.
* </p>
* *
* @author MightyPork * @author MightyPork
*/ */
public interface Ionizable { public interface Ionizable extends Streamable {
/**
* Load data from the input stream. Mark has already been read, begin
* reading right after it.
*
* @param in input stream
* @throws IOException
*/
void load(InputStream in) throws IOException;
/**
* Store data to output stream. Mark has already been written, begin right
* after it.
*
* @param out Output stream
* @throws IOException
*/
void save(OutputStream out) throws IOException;
/** /**
* Get Ion mark byte. * Get Ion mark byte.

@ -0,0 +1,36 @@
package mightypork.util.files.ion;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
*
* Saveable to a stream.
*
*
* @author MightyPork
*/
public interface Streamable {
/**
* Load data from the input stream. Must be compatible with the
* <code>save</code> method.
*
* @param in input stream
* @throws IOException
*/
void load(InputStream in) throws IOException;
/**
* Store data to output stream.
*
* @param out Output stream
* @throws IOException
*/
void save(OutputStream out) throws IOException;
}

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableArrayList<E> extends ArrayList<E> implements Ionizable { public class StreamableArrayList<E> extends ArrayList<E> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.HashMap; import java.util.HashMap;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableHashMap<K, V> extends HashMap<K, V> implements Ionizable { public class StreamableHashMap<K, V> extends HashMap<K, V> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.HashSet; import java.util.HashSet;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableHashSet<E> extends HashSet<E> implements Ionizable { public abstract class StreamableHashSet<E> extends HashSet<E> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableLinkedHashMap<K, V> extends LinkedHashMap<K, V> implements Ionizable { public class StreamableLinkedHashMap<K, V> extends LinkedHashMap<K, V> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.LinkedList; import java.util.LinkedList;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableLinkedList<E> extends LinkedList<E> implements Ionizable { public class StreamableLinkedList<E> extends LinkedList<E> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.Stack; import java.util.Stack;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableStack<E> extends Stack<E> implements Ionizable { public class StreamableStack<E> extends Stack<E> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException

@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.TreeSet; import java.util.TreeSet;
import mightypork.util.files.ion.Ion; import mightypork.util.files.ion.Ion;
import mightypork.util.files.ion.Ionizable; import mightypork.util.files.ion.Streamable;
public abstract class IonizableTreeSet<E> extends TreeSet<E> implements Ionizable { public class StreamableTreeSet<E> extends TreeSet<E> implements Streamable {
@Override @Override
public void load(InputStream in) throws IOException public void load(InputStream in) throws IOException
Loading…
Cancel
Save