This commit is contained in:
ondra
2014-05-07 15:55:13 +02:00
parent 8fa0dd927f
commit e4e908ad75
18 changed files with 184 additions and 79 deletions
@@ -12,7 +12,7 @@ import mightypork.gamecore.util.math.constraints.num.mutable.NumAnimated;
*/ */
public class AnimatorBounce extends Animator { public class AnimatorBounce extends Animator {
private final boolean wasUp = false; private boolean wasUp = false;
public AnimatorBounce(double start, double end, double period, Easing easing) public AnimatorBounce(double start, double end, double period, Easing easing)
@@ -47,6 +47,8 @@ public class AnimatorBounce extends Animator {
} else { } else {
anim.fadeIn(); anim.fadeIn();
} }
wasUp = !wasUp;
} }
} }
-1
View File
@@ -76,7 +76,6 @@ public final class App extends BaseApp {
{ {
super.registerIonizables(); super.registerIonizables();
Ion.registerType(Item.ION_MARK, Item.class);
Ion.registerType(Level.ION_MARK, Level.class); Ion.registerType(Level.ION_MARK, Level.class);
} }
@@ -18,12 +18,12 @@ public abstract class PlayerControl {
private World lastWorld; private World lastWorld;
protected abstract World getWorld(); protected abstract World provideWorld();
private World getWorld2() public World getWorld()
{ {
final World newWorld = getWorld(); final World newWorld = provideWorld();
if (newWorld != lastWorld) { if (newWorld != lastWorld) {
for (final EntityMoveListener eml : playerMoveListeners) { for (final EntityMoveListener eml : playerMoveListeners) {
@@ -40,9 +40,9 @@ public abstract class PlayerControl {
public Entity getPlayerEntity() public Entity getPlayerEntity()
{ {
if (getWorld2() == null) return null; if (getWorld() == null) return null;
return getWorld2().getPlayerEntity(); return getWorld().getPlayerEntity();
} }
@@ -88,7 +88,7 @@ public abstract class PlayerControl {
public Level getLevel() public Level getLevel()
{ {
return getWorld2().getCurrentLevel(); return getWorld().getCurrentLevel();
} }
@@ -114,7 +114,7 @@ public abstract class PlayerControl {
{ {
if (pos.dist(getCoord()) > 8) return false; // too far if (pos.dist(getCoord()) > 8) return false; // too far
return getLevel().getTile(pos).onClick(); return getLevel().getTile(pos).onClick(getWorld());
} }
@@ -43,7 +43,7 @@ public class WorldProvider extends RootBusNode {
private final PlayerControl playerControl = new PlayerControl() { private final PlayerControl playerControl = new PlayerControl() {
@Override @Override
protected World getWorld() protected World provideWorld()
{ {
return world; return world;
} }
@@ -9,7 +9,10 @@ import mightypork.rogue.world.entity.Entities;
import mightypork.rogue.world.entity.Entity; import mightypork.rogue.world.entity.Entity;
import mightypork.rogue.world.gen.rooms.Rooms; import mightypork.rogue.world.gen.rooms.Rooms;
import mightypork.rogue.world.gen.themes.ThemeBrick; import mightypork.rogue.world.gen.themes.ThemeBrick;
import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.item.Items;
import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.Level;
import mightypork.rogue.world.tile.Tile;
public class LevelGenerator { public class LevelGenerator {
@@ -57,6 +60,20 @@ public class LevelGenerator {
} }
} }
for (int i = 0; i < 4+complexity + rand.nextInt(1+complexity); i++) {
Item meat = Items.MEAT.createItem();
for (int j = 0; j < 20; j++) {
pos.x = rand.nextInt(lvl.getWidth());
pos.y = rand.nextInt(lvl.getHeight());
Tile t = lvl.getTile(pos);
if(t.dropItem(meat)) break;
}
}
return lvl; return lvl;
} }
} }
@@ -39,7 +39,7 @@ public class MIPMouse implements MapInteractionPlugin {
final Coord pos = view.toWorldPos(mouse); final Coord pos = view.toWorldPos(mouse);
final Tile t = pc.getLevel().getTile(pos); final Tile t = pc.getLevel().getTile(pos);
if (t.onClick()) return true; if (t.onClick(pc.getWorld())) return true;
if (!down && t.isWalkable()) { if (!down && t.isWalkable()) {
if (troToNav(view, pc, mouse)) return true; if (troToNav(view, pc, mouse)) return true;
+20 -32
View File
@@ -3,66 +3,54 @@ package mightypork.rogue.world.item;
import java.io.IOException; import java.io.IOException;
import mightypork.gamecore.util.annot.DefaultImpl;
import mightypork.gamecore.util.ion.IonInput; import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonObjBinary; import mightypork.gamecore.util.ion.IonObjBlob;
import mightypork.gamecore.util.ion.IonOutput; import mightypork.gamecore.util.ion.IonOutput;
import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound; import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;
public class Item implements IonObjBinary { public abstract class Item implements IonObjBlob {
public static final short ION_MARK = 51; private final ItemModel model;
private ItemRenderer renderer;
private ItemModel model;
public int id;
public Item(int id) public Item(ItemModel model) {
{
this(Items.get(id));
}
public Item()
{
}
public Item(ItemModel model)
{
this.model = model; this.model = model;
this.id = model.id;
} }
public void render(RectBound context) public final void render(Rect rect)
{ {
model.render(this, context); if (renderer == null) {
renderer = makeRenderer();
} }
renderer.render(rect);
};
protected abstract ItemRenderer makeRenderer();
@Override @Override
@DefaultImpl
public void save(IonOutput out) throws IOException public void save(IonOutput out) throws IOException
{ {
out.writeIntByte(id);
} }
@Override @Override
@DefaultImpl
public void load(IonInput in) throws IOException public void load(IonInput in) throws IOException
{ {
id = in.readIntByte();
// if id changed, get new model
if (model == null || id != model.id) model = Items.get(id);
} }
@Override public final ItemModel getModel()
public short getIonMark()
{ {
return ION_MARK; return model;
} }
} }
+35 -10
View File
@@ -1,32 +1,57 @@
package mightypork.rogue.world.item; package mightypork.rogue.world.item;
import mightypork.gamecore.util.annot.DefaultImpl; import java.io.IOException;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;
import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonOutput;
public abstract class ItemModel { /**
* Item model (builder)
*
* @author MightyPork
*/
public final class ItemModel {
/** Model ID */
public final int id; public final int id;
public final Class<? extends Item> itemClass;
public ItemModel(int id) public ItemModel(int id, Class<? extends Item> item)
{ {
Items.register(id, this); Items.register(id, this);
this.id = id; this.id = id;
this.itemClass = item;
} }
/** /**
* @return new tile with this model * @return new item instance of this type
*/ */
@DefaultImpl public <T extends Item> T createItem()
public Item create()
{ {
return new Item(this); try {
return (T) itemClass.getConstructor(ItemModel.class).newInstance(this);
} catch (final Exception e) {
throw new RuntimeException("Could not instantiate an item.", e);
}
} }
public abstract void render(Item item, RectBound context); public Item loadItem(IonInput in) throws IOException
{
final Item t = createItem();
t.load(in);
return t;
} }
public void saveItem(IonOutput out, Item tile) throws IOException
{
if (itemClass != tile.getClass()) throw new RuntimeException("Item class mismatch.");
tile.save(out);
}
}
+67 -2
View File
@@ -1,6 +1,14 @@
package mightypork.rogue.world.item; package mightypork.rogue.world.item;
import java.io.IOException;
import java.util.Collection;
import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonOutput;
import mightypork.rogue.world.item.items.ItemMeat;
/** /**
* Item registry * Item registry
* *
@@ -10,10 +18,18 @@ public final class Items {
private static final ItemModel[] items = new ItemModel[256]; private static final ItemModel[] items = new ItemModel[256];
public static final ItemModel MEAT = new ItemModel(1, ItemMeat.class);
public static void register(int id, ItemModel model) public static void register(int id, ItemModel model)
{ {
if (id < 0 || id >= items.length) if (items[id] != null) throw new IllegalArgumentException("Item ID " + id + " already in use."); if (id < 0 || id >= items.length) {
throw new IllegalArgumentException("Item ID " + id + " is out of range.");
}
if (items[id] != null) {
throw new IllegalArgumentException("Item ID " + id + " already in use.");
}
items[id] = model; items[id] = model;
} }
@@ -22,7 +38,56 @@ public final class Items {
public static ItemModel get(int id) public static ItemModel get(int id)
{ {
final ItemModel m = items[id]; final ItemModel m = items[id];
if (m == null) throw new IllegalArgumentException("No item with ID " + id + ".");
if (m == null) {
throw new IllegalArgumentException("No item with ID " + id + ".");
}
return m; return m;
} }
public static Item loadItem(IonInput in) throws IOException
{
final int id = in.readIntByte();
final ItemModel model = get(id);
return model.loadItem(in);
}
public static void saveItem(IonOutput out, Item item) throws IOException
{
final ItemModel model = item.getModel();
out.writeIntByte(model.id);
model.saveItem(out, item);
}
public static Item create(int tileId)
{
return get(tileId).createItem();
}
public static void loadItems(IonInput in, Collection<Item> items) throws IOException
{
items.clear();
while (in.hasNextEntry()) {
items.add(loadItem(in));
}
}
public static void saveItems(IonOutput out, Collection<Item> items) throws IOException
{
for (final Item entity : items) {
out.startEntry();
saveItem(out, entity);
}
out.endSequence();
}
} }
@@ -16,8 +16,9 @@ public class DroppedItemRenderer {
// prepared constraints, to avoid re-building each frame // prepared constraints, to avoid re-building each frame
private final RectBoundAdapter tileRectAdapter = new RectBoundAdapter(); private final RectBoundAdapter tileRectAdapter = new RectBoundAdapter();
private final Rect itemRect = tileRectAdapter.shrink(tileRectAdapter.height().perc(10)).moveY(itemAnim.neg()); private final Rect itemRect = tileRectAdapter
.shrink(tileRectAdapter.height().perc(10))
.moveY(itemAnim.neg().mul(tileRectAdapter.height().mul(0.2)));
public Animator getItemAnim() public Animator getItemAnim()
{ {
+15 -9
View File
@@ -10,6 +10,7 @@ import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonObjBlob; import mightypork.gamecore.util.ion.IonObjBlob;
import mightypork.gamecore.util.ion.IonOutput; import mightypork.gamecore.util.ion.IonOutput;
import mightypork.gamecore.util.math.color.Color; import mightypork.gamecore.util.math.color.Color;
import mightypork.rogue.world.World;
import mightypork.rogue.world.item.Item; import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.Level;
import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.rogue.world.level.render.TileRenderContext;
@@ -34,6 +35,8 @@ public abstract class Tile implements IonObjBlob {
protected boolean occupied; protected boolean occupied;
protected boolean explored; protected boolean explored;
private TileRenderer renderer;
public Tile(TileModel model) public Tile(TileModel model)
{ {
@@ -49,21 +52,24 @@ public abstract class Tile implements IonObjBlob {
{ {
if (!isExplored()) return; if (!isExplored()) return;
final TileRenderer r = getRenderer(); if (renderer == null) {
if (r == null) { renderer = makeRenderer();
Log.e("Tile with no renderer: " + Log.str(this)); }
if(renderer == null) {
Log.w("No renderer for tile "+Log.str(this));
return; return;
} }
r.renderTile(context); renderer.renderTile(context);
if (doesReceiveShadow()) r.renderShadows(context); if (doesReceiveShadow()) renderer.renderShadows(context);
r.renderUnexploredFog(context); renderer.renderUnexploredFog(context);
} }
protected abstract TileRenderer getRenderer(); protected abstract TileRenderer makeRenderer();
/** /**
@@ -143,7 +149,7 @@ public abstract class Tile implements IonObjBlob {
@DefaultImpl @DefaultImpl
public void update(Level level, double delta) public void update(Level level, double delta)
{ {
getRenderer().update(delta); makeRenderer().update(delta);
} }
@@ -220,7 +226,7 @@ public abstract class Tile implements IonObjBlob {
* @return true if the tile is interactive and did something. * @return true if the tile is interactive and did something.
*/ */
@DefaultImpl @DefaultImpl
public boolean onClick() public boolean onClick(World world)
{ {
return false; return false;
} }
@@ -19,7 +19,7 @@ public class NullTile extends Tile {
@Override @Override
protected TileRenderer getRenderer() protected TileRenderer makeRenderer()
{ {
return TileRenderer.NONE; return TileRenderer.NONE;
} }
@@ -27,7 +27,7 @@ public abstract class TileBaseDoor extends TileSolid {
@Override @Override
protected TileRenderer getRenderer() protected TileRenderer makeRenderer()
{ {
return renderer; return renderer;
} }
@@ -8,7 +8,7 @@ import mightypork.rogue.world.tile.TileType;
import mightypork.rogue.world.tile.renderers.BasicTileRenderer; import mightypork.rogue.world.tile.renderers.BasicTileRenderer;
public abstract class TileBaseFloor extends TileWalkable { public abstract class TileBaseFloor extends TileWithItems {
private final BasicTileRenderer renderer; private final BasicTileRenderer renderer;
@@ -21,7 +21,7 @@ public abstract class TileBaseFloor extends TileWalkable {
@Override @Override
protected TileRenderer getRenderer() protected TileRenderer makeRenderer()
{ {
return renderer; return renderer;
} }
@@ -27,7 +27,7 @@ public abstract class TileBasePassage extends TileSolid {
@Override @Override
protected TileRenderer getRenderer() protected TileRenderer makeRenderer()
{ {
return renderer; return renderer;
} }
@@ -8,6 +8,7 @@ import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonOutput; import mightypork.gamecore.util.ion.IonOutput;
import mightypork.gamecore.util.math.color.Color; import mightypork.gamecore.util.math.color.Color;
import mightypork.gamecore.util.math.color.pal.RGB; import mightypork.gamecore.util.math.color.pal.RGB;
import mightypork.rogue.world.World;
import mightypork.rogue.world.tile.TileModel; import mightypork.rogue.world.tile.TileModel;
import mightypork.rogue.world.tile.TileType; import mightypork.rogue.world.tile.TileType;
@@ -24,7 +25,7 @@ public abstract class TileBaseSecretDoor extends TileBaseDoor {
@Override @Override
public boolean onClick() public boolean onClick(World world)
{ {
if (!locked) return false; if (!locked) return false;
@@ -20,7 +20,7 @@ public abstract class TileBaseWall extends TileSolid {
@Override @Override
public BasicTileRenderer getRenderer() public BasicTileRenderer makeRenderer()
{ {
return renderer; return renderer;
} }
@@ -7,6 +7,8 @@ import java.util.Stack;
import mightypork.gamecore.util.ion.IonInput; import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonOutput; import mightypork.gamecore.util.ion.IonOutput;
import mightypork.rogue.world.item.Item; import mightypork.rogue.world.item.Item;
import mightypork.rogue.world.item.Items;
import mightypork.rogue.world.item.items.ItemMeat;
import mightypork.rogue.world.level.Level; import mightypork.rogue.world.level.Level;
import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.rogue.world.level.render.TileRenderContext;
import mightypork.rogue.world.tile.DroppedItemRenderer; import mightypork.rogue.world.tile.DroppedItemRenderer;
@@ -14,14 +16,14 @@ import mightypork.rogue.world.tile.Tile;
import mightypork.rogue.world.tile.TileModel; import mightypork.rogue.world.tile.TileModel;
public abstract class TileWalkable extends Tile { public abstract class TileWithItems extends Tile {
private final DroppedItemRenderer itemRenderer = new DroppedItemRenderer(); private final DroppedItemRenderer itemRenderer = new DroppedItemRenderer();
protected final Stack<Item> items = new Stack<>(); protected final Stack<Item> items = new Stack<>();
public TileWalkable(TileModel model) public TileWithItems(TileModel model)
{ {
super(model); super(model);
} }
@@ -30,7 +32,7 @@ public abstract class TileWalkable extends Tile {
@Override @Override
public void renderExtra(TileRenderContext context) public void renderExtra(TileRenderContext context)
{ {
if (!items.isEmpty()) { if (isExplored() && !items.isEmpty()) {
itemRenderer.render(items.peek(), context); itemRenderer.render(items.peek(), context);
} }
} }
@@ -49,7 +51,7 @@ public abstract class TileWalkable extends Tile {
{ {
super.save(out); super.save(out);
out.writeSequence(items); Items.saveItems(out, items);
} }
@@ -58,7 +60,7 @@ public abstract class TileWalkable extends Tile {
{ {
super.load(in); super.load(in);
in.readSequence(items); Items.loadItems(in, items);
} }
@@ -96,5 +98,4 @@ public abstract class TileWalkable extends Tile {
{ {
return !items.isEmpty(); return !items.isEmpty();
} }
} }