parent
66adc1ffa9
commit
c74869d3b7
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
@ -0,0 +1,20 @@ |
|||||||
|
package mightypork.rogue.world.events; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.eventbus.BusEvent; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Player wants to go up |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class WorldAscendRequest extends BusEvent<WorldAscendRequestListener> { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void handleBy(WorldAscendRequestListener handler) |
||||||
|
{ |
||||||
|
handler.onAscendRequest(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
package mightypork.rogue.world.events; |
||||||
|
|
||||||
|
|
||||||
|
public interface WorldAscendRequestListener { |
||||||
|
|
||||||
|
/** |
||||||
|
* Player clicked up-stairs |
||||||
|
*/ |
||||||
|
void onAscendRequest(); |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package mightypork.rogue.world.events; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.eventbus.BusEvent; |
||||||
|
|
||||||
|
|
||||||
|
public class WorldDescendRequest extends BusEvent<WorldDescendRequestListener> { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void handleBy(WorldDescendRequestListener handler) |
||||||
|
{ |
||||||
|
handler.onDescendRequest(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
package mightypork.rogue.world.events; |
||||||
|
|
||||||
|
|
||||||
|
public interface WorldDescendRequestListener { |
||||||
|
|
||||||
|
/** |
||||||
|
* Player clicked down-stairs |
||||||
|
*/ |
||||||
|
void onDescendRequest(); |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
package mightypork.rogue.world.gen.rooms; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.Random; |
||||||
|
|
||||||
|
import mightypork.gamecore.util.math.algo.Coord; |
||||||
|
import mightypork.rogue.world.gen.MapTheme; |
||||||
|
import mightypork.rogue.world.gen.ScratchMap; |
||||||
|
import mightypork.rogue.world.gen.TileProtectLevel; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
|
||||||
|
|
||||||
|
public class EntranceRoom extends AbstractRectRoom { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Coord getInnerSize(Random rand) |
||||||
|
{ |
||||||
|
return Coord.make(3 + rand.nextInt(2) * 2, 3 + rand.nextInt(2) * 3); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileProtectLevel getWallProtectionLevel() |
||||||
|
{ |
||||||
|
return TileProtectLevel.WEAK; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileModel getDoorType(MapTheme theme, Random rand) |
||||||
|
{ |
||||||
|
switch (rand.nextInt(5)) { |
||||||
|
case 0: |
||||||
|
case 1: |
||||||
|
return theme.passage(); |
||||||
|
case 2: |
||||||
|
return theme.secretDoor(); |
||||||
|
default: |
||||||
|
return theme.door(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected void buildExtras(ScratchMap map, MapTheme theme, Random rand, Coord min, Coord max) |
||||||
|
{ |
||||||
|
final Coord c = Coord.make((max.x + min.x) / 2, (max.y + min.y) / 2); |
||||||
|
map.set(c, theme.entrance()); |
||||||
|
map.protect(c, c, TileProtectLevel.STRONG); |
||||||
|
map.setEntrance(c.add(1, 0)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected int getDoorCount(Random rand) |
||||||
|
{ |
||||||
|
return 1 + rand.nextInt(4); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package mightypork.rogue.world.gen.rooms; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.Random; |
||||||
|
|
||||||
|
import mightypork.gamecore.util.math.algo.Coord; |
||||||
|
import mightypork.rogue.world.gen.MapTheme; |
||||||
|
import mightypork.rogue.world.gen.ScratchMap; |
||||||
|
import mightypork.rogue.world.gen.TileProtectLevel; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
|
||||||
|
|
||||||
|
public class ExitRoom extends AbstractRectRoom { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Coord getInnerSize(Random rand) |
||||||
|
{ |
||||||
|
return Coord.make(3, 3); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileProtectLevel getWallProtectionLevel() |
||||||
|
{ |
||||||
|
return TileProtectLevel.NONE; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileModel getDoorType(MapTheme theme, Random rand) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected void buildExtras(ScratchMap map, MapTheme theme, Random rand, Coord min, Coord max) |
||||||
|
{ |
||||||
|
final Coord c = Coord.make((max.x + min.x) / 2, (max.y + min.y) / 2); |
||||||
|
map.set(c, theme.exit()); |
||||||
|
map.protect(c, c, TileProtectLevel.STRONG); |
||||||
|
map.setExit(c.add(-1, 0)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected int getDoorCount(Random rand) |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,109 +0,0 @@ |
|||||||
package mightypork.rogue.world.level; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.eventbus.events.Updateable; |
|
||||||
import mightypork.gamecore.util.math.algo.Coord; |
|
||||||
import mightypork.rogue.world.World; |
|
||||||
import mightypork.rogue.world.entity.Entity; |
|
||||||
import mightypork.rogue.world.tile.Tile; |
|
||||||
import mightypork.rogue.world.tile.TileModel; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Level full access |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public interface LevelAccess extends LevelReadAccess, Updateable { |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Mark tile and surrounding area as explored |
|
||||||
* |
|
||||||
* @param center center the explored tile |
|
||||||
*/ |
|
||||||
public abstract void explore(Coord center); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Assign a world |
|
||||||
* |
|
||||||
* @param world new world |
|
||||||
*/ |
|
||||||
public abstract void setWorld(World world); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Set level entry point |
|
||||||
* |
|
||||||
* @param pos pos where the player enters |
|
||||||
*/ |
|
||||||
public abstract void setEnterPoint(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Mark tile as free (entity left) |
|
||||||
* |
|
||||||
* @param pos tile pos |
|
||||||
*/ |
|
||||||
public abstract void freeTile(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Mark tile as occupied (entity entered) |
|
||||||
* |
|
||||||
* @param pos tile pos |
|
||||||
*/ |
|
||||||
public abstract void occupyTile(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Remove an entity from the level, if present |
|
||||||
* |
|
||||||
* @param eid entity id |
|
||||||
*/ |
|
||||||
public abstract void removeEntity(int eid); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Remove an entity from the level, if present |
|
||||||
* |
|
||||||
* @param entity entity |
|
||||||
*/ |
|
||||||
public abstract void removeEntity(Entity entity); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Set level seed (used for visuals; the seed used for generation) |
|
||||||
* |
|
||||||
* @param seed seed |
|
||||||
*/ |
|
||||||
public abstract void setSeed(long seed); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Set tile at pos |
|
||||||
* |
|
||||||
* @param pos tile pos |
|
||||||
* @param tile the tile instance to set |
|
||||||
*/ |
|
||||||
public abstract void setTile(Coord pos, Tile tile); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Fill whole map with tile type |
|
||||||
* |
|
||||||
* @param model tile model |
|
||||||
*/ |
|
||||||
public abstract void fill(TileModel model); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Try to add entity at given pos |
|
||||||
* |
|
||||||
* @param entity the entity |
|
||||||
* @param pos pos |
|
||||||
* @return true if added (false if void, wall etc) |
|
||||||
*/ |
|
||||||
public abstract boolean addEntity(Entity entity, Coord pos); |
|
||||||
} |
|
@ -1,127 +0,0 @@ |
|||||||
package mightypork.rogue.world.level; |
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection; |
|
||||||
|
|
||||||
import mightypork.gamecore.util.math.algo.Coord; |
|
||||||
import mightypork.gamecore.util.math.noise.NoiseGen; |
|
||||||
import mightypork.rogue.world.World; |
|
||||||
import mightypork.rogue.world.entity.Entity; |
|
||||||
import mightypork.rogue.world.entity.EntityType; |
|
||||||
import mightypork.rogue.world.tile.Tile; |
|
||||||
|
|
||||||
|
|
||||||
public interface LevelReadAccess { |
|
||||||
|
|
||||||
/** |
|
||||||
* Ge tile at X,Y |
|
||||||
* |
|
||||||
* @param pos |
|
||||||
* @return tile |
|
||||||
*/ |
|
||||||
Tile getTile(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return map width in tiles |
|
||||||
*/ |
|
||||||
int getWidth(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return map height in tiles |
|
||||||
*/ |
|
||||||
int getHeight(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return map seed |
|
||||||
*/ |
|
||||||
long getSeed(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return level-specific noise generator |
|
||||||
*/ |
|
||||||
NoiseGen getNoiseGen(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Check if entity is in the level |
|
||||||
* |
|
||||||
* @param entity entity |
|
||||||
* @return is present |
|
||||||
*/ |
|
||||||
boolean isEntityPresent(Entity entity); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Check if entity is in the level |
|
||||||
* |
|
||||||
* @param eid entity ID |
|
||||||
* @return true if present |
|
||||||
*/ |
|
||||||
boolean isEntityPresent(int eid); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get entity of type closest to coord |
|
||||||
* |
|
||||||
* @param self the querying entity - to provide position, and to be excluded |
|
||||||
* from the search. |
|
||||||
* @param type wanted entity type |
|
||||||
* @param radius search radius; -1 for unlimited. |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
Entity getClosestEntity(Entity self, EntityType type, double radius); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get the level's world |
|
||||||
* |
|
||||||
* @return world |
|
||||||
*/ |
|
||||||
World getWorld(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get location where the player enters the level |
|
||||||
* |
|
||||||
* @return pos |
|
||||||
*/ |
|
||||||
Coord getEnterPoint(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Check entity on tile |
|
||||||
* |
|
||||||
* @param pos tile coord |
|
||||||
* @return true if some entity is standing there |
|
||||||
*/ |
|
||||||
boolean isOccupied(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Check tile walkability |
|
||||||
* |
|
||||||
* @param pos tile coord |
|
||||||
* @return true if the tile is walkable by entity |
|
||||||
*/ |
|
||||||
boolean isWalkable(Coord pos); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get entity by ID |
|
||||||
* |
|
||||||
* @param eid entity ID |
|
||||||
* @return the entity, or null |
|
||||||
*/ |
|
||||||
Entity getEntity(int eid); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return all entities |
|
||||||
*/ |
|
||||||
Collection<Entity> getEntities(); |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,33 @@ |
|||||||
|
package mightypork.rogue.world.tile.render; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.render.Render; |
||||||
|
import mightypork.gamecore.resources.textures.TxQuad; |
||||||
|
import mightypork.rogue.world.level.render.TileRenderContext; |
||||||
|
import mightypork.rogue.world.tile.Tile; |
||||||
|
import mightypork.rogue.world.tile.TileRenderer; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Tile that spans across two tiles visually (two-high) |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class OneFrameTileRenderer extends TileRenderer { |
||||||
|
|
||||||
|
private final TxQuad txq; |
||||||
|
|
||||||
|
|
||||||
|
public OneFrameTileRenderer(Tile tile, TxQuad txq) |
||||||
|
{ |
||||||
|
super(tile); |
||||||
|
this.txq = txq; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void renderTile(TileRenderContext context) |
||||||
|
{ |
||||||
|
Render.quadTextured(context.getRect(), txq); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package mightypork.rogue.world.tile.render; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.render.Render; |
||||||
|
import mightypork.gamecore.resources.textures.TxQuad; |
||||||
|
import mightypork.gamecore.util.math.constraints.rect.Rect; |
||||||
|
import mightypork.rogue.world.level.render.TileRenderContext; |
||||||
|
import mightypork.rogue.world.tile.Tile; |
||||||
|
import mightypork.rogue.world.tile.TileRenderer; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Tile that spans across two tiles visually (two-high) |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class TwoHighTileRenderer extends TileRenderer { |
||||||
|
|
||||||
|
private final TxQuad txq; |
||||||
|
|
||||||
|
|
||||||
|
public TwoHighTileRenderer(Tile tile, TxQuad txq) |
||||||
|
{ |
||||||
|
super(tile); |
||||||
|
this.txq = txq; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void renderTile(TileRenderContext context) |
||||||
|
{ |
||||||
|
final Rect rect = context.getRect(); |
||||||
|
Render.quadTextured(rect.growUp(rect.height()), txq); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package mightypork.rogue.world.tile.tiles; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.util.math.algo.Coord; |
||||||
|
import mightypork.rogue.world.events.WorldAscendRequest; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class TileBaseEntrance extends TileBaseStairs { |
||||||
|
|
||||||
|
public TileBaseEntrance(TileModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean onClick() |
||||||
|
{ |
||||||
|
Coord plpos = getWorld().getPlayerEntity().getCoord(); |
||||||
|
if(!plpos.equals(getLevel().getEnterPoint())) return false; |
||||||
|
|
||||||
|
getEventBus().send(new WorldAscendRequest()); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean doesCastShadow() |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package mightypork.rogue.world.tile.tiles; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.util.math.algo.Coord; |
||||||
|
import mightypork.rogue.world.events.WorldDescendRequest; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class TileBaseExit extends TileBaseStairs { |
||||||
|
|
||||||
|
public TileBaseExit(TileModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean onClick() |
||||||
|
{ |
||||||
|
Coord plpos = getWorld().getPlayerEntity().getCoord(); |
||||||
|
if(!plpos.equals(getLevel().getExitPoint())) return false; |
||||||
|
|
||||||
|
getEventBus().send(new WorldDescendRequest()); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean doesCastShadow() |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package mightypork.rogue.world.tile.tiles; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
import mightypork.rogue.world.tile.TileType; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class TileBaseStairs extends TileSolid { |
||||||
|
|
||||||
|
public TileBaseStairs(TileModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public TileType getType() |
||||||
|
{ |
||||||
|
return TileType.STAIRS; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package mightypork.rogue.world.tile.tiles.brick; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.Res; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
import mightypork.rogue.world.tile.TileRenderer; |
||||||
|
import mightypork.rogue.world.tile.render.OneFrameTileRenderer; |
||||||
|
import mightypork.rogue.world.tile.tiles.TileBaseEntrance; |
||||||
|
|
||||||
|
|
||||||
|
public class TileBrickEntrance extends TileBaseEntrance { |
||||||
|
|
||||||
|
public TileBrickEntrance(TileModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileRenderer makeRenderer() |
||||||
|
{ |
||||||
|
return new OneFrameTileRenderer(this, Res.txq("tile.brick.stairs.up")); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package mightypork.rogue.world.tile.tiles.brick; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.Res; |
||||||
|
import mightypork.rogue.world.tile.TileModel; |
||||||
|
import mightypork.rogue.world.tile.TileRenderer; |
||||||
|
import mightypork.rogue.world.tile.render.OneFrameTileRenderer; |
||||||
|
import mightypork.rogue.world.tile.tiles.TileBaseExit; |
||||||
|
|
||||||
|
|
||||||
|
public class TileBrickExit extends TileBaseExit { |
||||||
|
|
||||||
|
public TileBrickExit(TileModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected TileRenderer makeRenderer() |
||||||
|
{ |
||||||
|
return new OneFrameTileRenderer(this, Res.txq("tile.brick.stairs.down")); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue