parent
65ad97994b
commit
8872fd3f5f
@ -0,0 +1,32 @@ |
||||
package mightypork.rogue.screens.ingame; |
||||
|
||||
|
||||
import java.util.Random; |
||||
|
||||
import mightypork.gamecore.gui.screens.Screen; |
||||
import mightypork.gamecore.gui.screens.ScreenLayer; |
||||
import mightypork.rogue.world.MapGenerator; |
||||
import mightypork.rogue.world.World; |
||||
|
||||
|
||||
public class WorldLayer extends ScreenLayer { |
||||
|
||||
public WorldLayer(Screen screen) |
||||
{ |
||||
super(screen); |
||||
|
||||
Random rand = new Random(); |
||||
World w = MapGenerator.createWorld(rand.nextLong()); |
||||
|
||||
WorldRenderer wr = new WorldRenderer(w); |
||||
wr.setRect(root); |
||||
root.add(wr); |
||||
} |
||||
|
||||
@Override |
||||
public int getPriority() |
||||
{ |
||||
return -1; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,68 @@ |
||||
package mightypork.rogue.screens.ingame; |
||||
|
||||
|
||||
import mightypork.gamecore.control.events.MouseButtonEvent; |
||||
import mightypork.gamecore.gui.components.InputComponent; |
||||
import mightypork.gamecore.render.Render; |
||||
import mightypork.rogue.world.World; |
||||
import mightypork.util.constraints.num.Num; |
||||
import mightypork.util.constraints.rect.Rect; |
||||
import mightypork.util.control.timing.Updateable; |
||||
import mightypork.util.math.color.PAL16; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
public class WorldRenderer extends InputComponent implements Updateable { |
||||
|
||||
private final World world; |
||||
private final Rect rightShadow; |
||||
private final Rect leftShadow; |
||||
private final Rect topShadow; |
||||
private final Rect bottomShadow; |
||||
|
||||
|
||||
public WorldRenderer(World world) |
||||
{ |
||||
this.world = world; |
||||
|
||||
final Num h = height(); |
||||
final Num w = width(); |
||||
final Num minWH = w.min(h).max(700); |
||||
|
||||
Num grX = w.perc(30); |
||||
Num grY = h.perc(20); |
||||
|
||||
leftShadow = leftEdge().growRight(grX); |
||||
rightShadow = rightEdge().growLeft(grX); |
||||
topShadow = topEdge().growDown(grY); |
||||
bottomShadow = bottomEdge().growUp(grY).moveY(minWH.perc(-6)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void receive(MouseButtonEvent event) |
||||
{ |
||||
System.out.println("world clciked, yo"); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void renderComponent() |
||||
{ |
||||
world.render(this, 8, 6, 64); |
||||
|
||||
Render.quadGradH(leftShadow, RGB.BLACK, RGB.NONE); |
||||
Render.quadGradH(rightShadow, RGB.NONE, RGB.BLACK); |
||||
|
||||
Render.quadGradV(topShadow, RGB.BLACK, RGB.NONE); |
||||
Render.quadGradV(bottomShadow, RGB.NONE, RGB.BLACK); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(double delta) |
||||
{ |
||||
world.update(delta); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,83 @@ |
||||
package mightypork.rogue.world; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.IonBundle; |
||||
import mightypork.util.files.ion.IonConstructor; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
/** |
||||
* Player info |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class LocalPlayer implements Ionizable, MapObserver { |
||||
|
||||
public static final short ION_MARK = 708; |
||||
|
||||
public WorldPos position = new WorldPos(); |
||||
|
||||
|
||||
@IonConstructor |
||||
public LocalPlayer() |
||||
{ |
||||
} |
||||
|
||||
|
||||
public LocalPlayer(int x, int y, int floor) |
||||
{ |
||||
this.position.setTo(x, y, floor); |
||||
} |
||||
|
||||
|
||||
public LocalPlayer(WorldPos pos) |
||||
{ |
||||
this.position = pos; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
IonBundle ib = (IonBundle) Ion.readObject(in); |
||||
|
||||
position = ib.get("pos", position); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
IonBundle ib = new IonBundle(); |
||||
|
||||
ib.put("pos", position); |
||||
|
||||
Ion.writeObject(out, ib); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
return ION_MARK; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public WorldPos getPosition() |
||||
{ |
||||
return position; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public int getViewRange() |
||||
{ |
||||
return 15; |
||||
} |
||||
} |
@ -0,0 +1,54 @@ |
||||
package mightypork.rogue.world; |
||||
|
||||
|
||||
import java.util.Random; |
||||
|
||||
import mightypork.rogue.world.map.LevelMap; |
||||
import mightypork.rogue.world.tile.Tiles; |
||||
|
||||
|
||||
public class MapGenerator { |
||||
|
||||
public static final Random rand = new Random(); |
||||
|
||||
|
||||
public static World createWorld(long seed) |
||||
{ |
||||
synchronized (rand) { |
||||
rand.setSeed(seed); |
||||
|
||||
World w = new World(); |
||||
w.setSeed(seed); |
||||
|
||||
int levels = 4 + rand.nextInt(6); |
||||
|
||||
for (int i = 0; i < levels; i++) { |
||||
w.addLevel(createLevel(rand.nextLong())); |
||||
} |
||||
|
||||
// TODO place on start position
|
||||
w.setPlayer(new LocalPlayer(10, 10, 0)); |
||||
return w; |
||||
} |
||||
} |
||||
|
||||
|
||||
private static LevelMap createLevel(long seed) |
||||
{ |
||||
// TODO
|
||||
|
||||
LevelMap lm = new LevelMap(20, 20); |
||||
|
||||
lm.fill(Tiles.CRYSTAL_FLOOR); |
||||
|
||||
Random rand = new Random(); |
||||
rand.setSeed(seed); |
||||
|
||||
for (int i = 0; i < 150; i++) { |
||||
lm.setTile(Tiles.CRYSTAL_WALL, rand.nextInt(20), rand.nextInt(20)); |
||||
} |
||||
|
||||
return lm; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,22 @@ |
||||
package mightypork.rogue.world; |
||||
|
||||
|
||||
/** |
||||
* Player observing a map represented by an observer. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public interface MapObserver { |
||||
|
||||
/** |
||||
* @return observer's position |
||||
*/ |
||||
public WorldPos getPosition(); |
||||
|
||||
|
||||
/** |
||||
* @return observed range (in tiles) |
||||
*/ |
||||
public int getViewRange(); |
||||
|
||||
} |
@ -0,0 +1,185 @@ |
||||
package mightypork.rogue.world; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
import mightypork.gamecore.render.Render; |
||||
import mightypork.rogue.world.map.LevelMap; |
||||
import mightypork.rogue.world.map.TileRenderContext; |
||||
import mightypork.rogue.world.structs.LevelList; |
||||
import mightypork.util.constraints.rect.Rect; |
||||
import mightypork.util.constraints.rect.RectConst; |
||||
import mightypork.util.constraints.rect.proxy.RectBound; |
||||
import mightypork.util.constraints.vect.Vect; |
||||
import mightypork.util.constraints.vect.VectConst; |
||||
import mightypork.util.control.timing.Updateable; |
||||
import mightypork.util.error.CorruptedDataException; |
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.IonBundle; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
import mightypork.util.math.color.RGB; |
||||
|
||||
|
||||
public class World implements Ionizable, Updateable { |
||||
|
||||
public static final short ION_MARK = 706; |
||||
|
||||
private LevelList levels = new LevelList(); |
||||
|
||||
private LocalPlayer player = new LocalPlayer(); |
||||
|
||||
private transient final Set<MapObserver> observers = new HashSet<>(); |
||||
|
||||
private long seed; |
||||
|
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
// world data
|
||||
IonBundle ib = (IonBundle) Ion.readObject(in); |
||||
player = ib.get("player", player); |
||||
levels = ib.get("levels", levels); |
||||
seed = ib.get("seed", seed); |
||||
|
||||
// levels
|
||||
Ion.readSequence(in, levels); |
||||
|
||||
if (player == null) throw new CorruptedDataException("Null player in world."); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
IonBundle ib = new IonBundle(); |
||||
ib.put("player", player); |
||||
ib.put("levels", levels); |
||||
ib.put("seed", seed); |
||||
} |
||||
|
||||
|
||||
public void setPlayer(LocalPlayer player) |
||||
{ |
||||
removeObserver(this.player); |
||||
|
||||
this.player = player; |
||||
|
||||
addObserver(player); |
||||
} |
||||
|
||||
|
||||
public void removeObserver(MapObserver observer) |
||||
{ |
||||
observers.remove(observer); |
||||
} |
||||
|
||||
|
||||
public void addObserver(MapObserver observer) |
||||
{ |
||||
observers.add(observer); |
||||
} |
||||
|
||||
|
||||
public void addLevel(LevelMap level) |
||||
{ |
||||
levels.add(level); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
return ION_MARK; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(double delta) |
||||
{ |
||||
for (int level = 0; level < levels.size(); level++) { |
||||
for (MapObserver observer : observers) { |
||||
if (observer.getPosition().floor == level) { |
||||
levels.get(level).update(observer, delta); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
public LevelMap getLevelForObserver(MapObserver observer) |
||||
{ |
||||
return levels.get(observer.getPosition().floor); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Draw on screen |
||||
* |
||||
* @param viewport rendering area on screen |
||||
* @param xTiles Desired nr of tiles horizontally |
||||
* @param yTiles Desired nr of tiles vertically |
||||
* @param minSize minimum tile size |
||||
*/ |
||||
public void render(final RectBound viewport, final int yTiles, final int xTiles, final int minSize) |
||||
{ |
||||
LevelMap floor = getLevelForObserver(player); // TODO fractional movement
|
||||
|
||||
Rect r = viewport.getRect(); |
||||
double vpH = r.height().value(); |
||||
double vpW = r.width().value(); |
||||
|
||||
// adjust tile size to fit desired amount of tiles
|
||||
|
||||
double allowedSizeW = vpW / xTiles; |
||||
double allowedSizeH = vpH / yTiles; |
||||
int tileSize = (int) Math.round(Math.max(Math.min(allowedSizeH, allowedSizeW), minSize)); |
||||
|
||||
tileSize -= tileSize % 16; |
||||
|
||||
VectConst vpCenter = r.center().sub(tileSize * 0.5, tileSize).freeze(); // 0.5 to center, 1 to move up (down is teh navbar)
|
||||
|
||||
int playerX = player.getPosition().x; |
||||
int playerY = player.getPosition().y; |
||||
|
||||
// total map area
|
||||
//@formatter:off
|
||||
RectConst mapRect = vpCenter.startRect().grow( |
||||
playerX*tileSize, |
||||
playerY*tileSize,//
|
||||
(floor.getWidth() - playerX) * tileSize, |
||||
(floor.getHeight() - playerY) * tileSize |
||||
).freeze(); |
||||
//@formatter:on
|
||||
|
||||
// tiles to render
|
||||
int x1 = (int) Math.floor(playerX - (vpW / tileSize)); |
||||
int y1 = (int) Math.floor(playerY - (vpH / tileSize)); |
||||
int x2 = (int) Math.ceil(playerX + (vpW / tileSize)); |
||||
int y2 = (int) Math.ceil(playerY + (vpH / tileSize)); |
||||
|
||||
TileRenderContext trc = new TileRenderContext(floor, mapRect); //-tileSize*0.5
|
||||
for (trc.y = y1; trc.y <= y2; trc.y++) { |
||||
for (trc.x = x1; trc.x <= x2; trc.x++) { |
||||
trc.render(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
public void setSeed(long seed) |
||||
{ |
||||
this.seed = seed; |
||||
} |
||||
|
||||
|
||||
public long getSeed() |
||||
{ |
||||
return seed; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,71 @@ |
||||
package mightypork.rogue.world; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.IonConstructor; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
/** |
||||
* A simple dimension data object |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class WorldPos implements Ionizable { |
||||
|
||||
public static final short ION_MARK = 707; |
||||
|
||||
public int x, y, floor; |
||||
|
||||
|
||||
public WorldPos(int x, int y, int z) |
||||
{ |
||||
super(); |
||||
this.x = x; |
||||
this.y = y; |
||||
this.floor = z; |
||||
} |
||||
|
||||
|
||||
@IonConstructor |
||||
public WorldPos() |
||||
{ |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
x = Ion.readInt(in); |
||||
y = Ion.readInt(in); |
||||
floor = Ion.readInt(in); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeInt(out, x); |
||||
Ion.writeInt(out, y); |
||||
Ion.writeInt(out, floor); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
return ION_MARK; |
||||
} |
||||
|
||||
|
||||
public void setTo(int x, int y, int z) |
||||
{ |
||||
this.x = x; |
||||
this.y = y; |
||||
this.floor = z; |
||||
} |
||||
} |
@ -0,0 +1,40 @@ |
||||
package mightypork.rogue.world.map; |
||||
|
||||
|
||||
import mightypork.rogue.world.tile.Tile; |
||||
|
||||
|
||||
/** |
||||
* Access interface for a level map. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public interface MapAccess { |
||||
|
||||
/** |
||||
* Ge tile at X,Y |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @return tile |
||||
*/ |
||||
Tile getTile(int x, int y); |
||||
|
||||
|
||||
/** |
||||
* @return map width in tiles |
||||
*/ |
||||
int getWidth(); |
||||
|
||||
|
||||
/** |
||||
* @return map height in tiles |
||||
*/ |
||||
int getHeight(); |
||||
|
||||
|
||||
/** |
||||
* @return map seed |
||||
*/ |
||||
long getSeed(); |
||||
} |
@ -0,0 +1,19 @@ |
||||
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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,18 @@ |
||||
package mightypork.rogue.world.structs; |
||||
|
||||
|
||||
import mightypork.rogue.world.map.LevelMap; |
||||
import mightypork.util.files.ion.templates.IonizableArrayList; |
||||
|
||||
|
||||
public class LevelList extends IonizableArrayList<LevelMap> { |
||||
|
||||
public static final short ION_MARK = 709; |
||||
|
||||
@Override |
||||
public short getIonMark() |
||||
{ |
||||
return ION_MARK; |
||||
} |
||||
|
||||
} |
@ -1,13 +0,0 @@ |
||||
package mightypork.rogue.world.tile; |
||||
|
||||
|
||||
public interface TileGrid { |
||||
|
||||
Tile getTile(int x, int y); |
||||
|
||||
|
||||
int getWidth(); |
||||
|
||||
|
||||
int getHeight(); |
||||
} |
@ -0,0 +1,18 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
public class NullFloor extends AbstractNullTile { |
||||
|
||||
public NullFloor(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,18 @@ |
||||
package mightypork.rogue.world.tile.models; |
||||
|
||||
|
||||
public class NullWall extends AbstractNullTile { |
||||
|
||||
public NullWall(int id) |
||||
{ |
||||
super(id); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isPotentiallyWalkable() |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,6 @@ |
||||
package mightypork.test; |
||||
|
||||
|
||||
public class testworldtofile { |
||||
|
||||
} |
@ -0,0 +1,36 @@ |
||||
package mightypork.util.error; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
|
||||
/** |
||||
* To be used when a data could not be read successfully. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class CorruptedDataException extends IOException { |
||||
|
||||
public CorruptedDataException() |
||||
{ |
||||
super(); |
||||
} |
||||
|
||||
|
||||
public CorruptedDataException(String message, Throwable cause) |
||||
{ |
||||
super(message, cause); |
||||
} |
||||
|
||||
|
||||
public CorruptedDataException(String message) |
||||
{ |
||||
super(message); |
||||
} |
||||
|
||||
|
||||
public CorruptedDataException(Throwable cause) |
||||
{ |
||||
super(cause); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.ArrayList; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableArrayList<E> extends ArrayList<E> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readSequence(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeSequence(out, this); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.HashMap; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableHashMap<K, V> extends HashMap<K, V> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readMap(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeMap(out, this); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.HashSet; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableHashSet<E> extends HashSet<E> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readSequence(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeSequence(out, this); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.LinkedHashMap; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableLinkedHashMap<K, V> extends LinkedHashMap<K, V> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readMap(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeMap(out, this); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.LinkedList; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableLinkedList<E> extends LinkedList<E> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readSequence(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeSequence(out, this); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
package mightypork.util.files.ion.templates; |
||||
|
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.TreeSet; |
||||
|
||||
import mightypork.util.files.ion.Ion; |
||||
import mightypork.util.files.ion.Ionizable; |
||||
|
||||
|
||||
public abstract class IonizableTreeSet<E> extends TreeSet<E> implements Ionizable { |
||||
|
||||
@Override |
||||
public void load(InputStream in) throws IOException |
||||
{ |
||||
Ion.readSequence(in, this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void save(OutputStream out) throws IOException |
||||
{ |
||||
Ion.writeSequence(out, this); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue