diff --git a/src/sig/events/DataEvent.java b/src/sig/events/DataEvent.java index 963a92e..13fe616 100644 --- a/src/sig/events/DataEvent.java +++ b/src/sig/events/DataEvent.java @@ -6,5 +6,10 @@ public class DataEvent implements Event{ public boolean perform(int x, int y) { return true; } + + @Override + public boolean performCollision(int x, int y) { + return true; + } } diff --git a/src/sig/events/Event.java b/src/sig/events/Event.java index 96e279e..3830755 100644 --- a/src/sig/events/Event.java +++ b/src/sig/events/Event.java @@ -2,9 +2,19 @@ package sig.events; public interface Event{ /** - * Perform this event at position {@code (x,y)}. + * Runs a constant update event on this tile at the given position. + * @param x The X Coordinate in pixel space the event is occuring in. (NOT Tile coordinates) + * @param y The Y Coordinate in pixel space the event is occuring in. (NOT Tile coordinates) * @return {@code True} to keep this event alive after it runs. * {@code False} to remove this event from the game after it runs. */ public boolean perform(int x, int y); + /** + * Runs a player collision event on this tile at the given position. + * @param x The X Coordinate in pixel space the event is occuring in. (NOT Tile coordinates) + * @param y The Y Coordinate in pixel space the event is occuring in. (NOT Tile coordinates) + * @return {@code True} to keep this event alive after it runs. + * {@code False} to remove this event from the game after it runs. + */ + public boolean performCollision(int x, int y); } diff --git a/src/sig/events/SpawnEvent.java b/src/sig/events/SpawnEvent.java index a097387..c002a3f 100644 --- a/src/sig/events/SpawnEvent.java +++ b/src/sig/events/SpawnEvent.java @@ -24,5 +24,10 @@ public class SpawnEvent implements Event{ } return false; } + + @Override + public boolean performCollision(int x, int y) { + return false; + } } diff --git a/src/sig/events/WaterEvent.java b/src/sig/events/WaterEvent.java index 4194996..8ad1e6e 100644 --- a/src/sig/events/WaterEvent.java +++ b/src/sig/events/WaterEvent.java @@ -1,17 +1,25 @@ package sig.events; import sig.RabiClone; +import sig.map.Tile; public class WaterEvent implements Event{ @Override public boolean perform(int x, int y) { - char val1=RabiClone.CURRENT_MAP.getMap().getDataTileValue(x+1, y); - char val2=RabiClone.CURRENT_MAP.getMap().getDataTileValue(x, y+1); - if (val1!=0) { + return true; + } + + @Override + public boolean performCollision(int x, int y) { + char val1=RabiClone.CURRENT_MAP.getMap().getDataTileValue(x/Tile.TILE_WIDTH+1, y/Tile.TILE_HEIGHT); + char val2=RabiClone.CURRENT_MAP.getMap().getDataTileValue(x/Tile.TILE_WIDTH, y/Tile.TILE_HEIGHT+1); + if (val1!=Character.MAX_VALUE) { RabiClone.CURRENT_MAP.getMap().setWaterLevel(val1); + System.out.println("Water level set to "+(int)RabiClone.CURRENT_MAP.getMap().getWaterLevel()); } else { RabiClone.CURRENT_MAP.getMap().setWaterLevel(val2); + System.out.println("Water level set to "+(int)RabiClone.CURRENT_MAP.getMap().getWaterLevel()); } return true; } diff --git a/src/sig/map/DataTile.java b/src/sig/map/DataTile.java index e8848a1..deebbc6 100644 --- a/src/sig/map/DataTile.java +++ b/src/sig/map/DataTile.java @@ -34,7 +34,7 @@ public enum DataTile { public String getDescription() { return description; } - public boolean perform(int x, int y) { - return event.perform(x, y); + public Event getEvent() { + return event; } } diff --git a/src/sig/map/Map.java b/src/sig/map/Map.java index 1082f4f..34b748c 100644 --- a/src/sig/map/Map.java +++ b/src/sig/map/Map.java @@ -266,12 +266,16 @@ public class Map { this.waterLevel = waterLevel; } - /* + /** * This will return the tile's value minus 8192. * This value represents a data tile value, but not * necessarily a data tile. */ public char getDataTileValue(int x,int y) { - return (char)(data[y*Map.MAP_WIDTH+x]-8192); + if (data[y*Map.MAP_WIDTH+x]>=8192) { + return (char)(data[y*Map.MAP_WIDTH+x]-8192); + } else { + return Character.MAX_VALUE; + } } } diff --git a/src/sig/map/Maps.java b/src/sig/map/Maps.java index 994e056..3274f85 100644 --- a/src/sig/map/Maps.java +++ b/src/sig/map/Maps.java @@ -63,7 +63,11 @@ public enum Maps { } } - public char getDataTileValue(int x, int y) { + /** + * This will return the tile's raw data value. + * Data Tile values will not have 8192 subtracted from itself through this function. + */ + public char getDataTileRawValue(int x, int y) { int index = y*Map.MAP_WIDTH+x; if (index<0||index>=this.map.data.length) { return (char)DataTile.NULL.ordinal(); diff --git a/src/sig/objects/EditorRenderer.java b/src/sig/objects/EditorRenderer.java index 4989301..fc432cf 100644 --- a/src/sig/objects/EditorRenderer.java +++ b/src/sig/objects/EditorRenderer.java @@ -146,8 +146,8 @@ public class EditorRenderer extends LevelRenderer{ } if (dataTileView) { drawMapTileForDataTileMode(p,x,y); - if (RabiClone.CURRENT_MAP.getDataTileValue(x, y)>=8192) { - DrawDataTileValue(p,x*Tile.TILE_WIDTH-this.getX(),y*Tile.TILE_HEIGHT-this.getY(),RabiClone.CURRENT_MAP.getDataTileValue(x, y)); + if (RabiClone.CURRENT_MAP.getDataTileRawValue(x, y)>=8192) { + DrawDataTileValue(p,x*Tile.TILE_WIDTH-this.getX(),y*Tile.TILE_HEIGHT-this.getY(),RabiClone.CURRENT_MAP.getDataTileRawValue(x, y)); } else if (RabiClone.CURRENT_MAP.getDataTile(x, y)!=DataTile.NULL) { DrawDataTile(p,x*Tile.TILE_WIDTH-this.getX(),y*Tile.TILE_HEIGHT-this.getY(),RabiClone.CURRENT_MAP.getDataTile(x, y)); } diff --git a/src/sig/objects/LevelRenderer.java b/src/sig/objects/LevelRenderer.java index b7d0ba7..2682ab5 100644 --- a/src/sig/objects/LevelRenderer.java +++ b/src/sig/objects/LevelRenderer.java @@ -45,8 +45,8 @@ public class LevelRenderer extends Object{ if (x<0||x>Map.MAP_WIDTH) { continue; } - if (RabiClone.CURRENT_MAP.getDataTileValue(x,y)<8192&&RabiClone.CURRENT_MAP.getDataTile(x,y)!=DataTile.NULL) { - if (!RabiClone.CURRENT_MAP.getDataTile(x,y).perform(x*Tile.TILE_WIDTH,y*Tile.TILE_HEIGHT)) { + if (RabiClone.CURRENT_MAP.getDataTileRawValue(x,y)<8192&&RabiClone.CURRENT_MAP.getDataTile(x,y)!=DataTile.NULL) { + if (!RabiClone.CURRENT_MAP.getDataTile(x,y).getEvent().perform(x*Tile.TILE_WIDTH,y*Tile.TILE_HEIGHT)) { RabiClone.CURRENT_MAP.ModifyDataTile(x, y, DataTile.NULL); } } diff --git a/src/sig/objects/Player.java b/src/sig/objects/Player.java index 04af5fb..1803b94 100644 --- a/src/sig/objects/Player.java +++ b/src/sig/objects/Player.java @@ -10,6 +10,7 @@ import sig.engine.Rectangle; import sig.engine.Sprite; import sig.engine.Transform; import sig.engine.objects.AnimatedObject; +import sig.map.DataTile; import sig.map.Map; import sig.map.Tile; import sig.map.View; @@ -81,6 +82,7 @@ public class Player extends PhysicsObject{ super.update(updateMult); handleCameraRoomMovement(); handleCollisionBatch(); + handleEventCollisions(); switch (state) { case ATTACK: @@ -214,6 +216,19 @@ public class Player extends PhysicsObject{ // System.out.println(state); } + private void handleEventCollisions() { + int x = (int)getX()/Tile.TILE_WIDTH; + int y = (int)getY()/Tile.TILE_HEIGHT; + if (x>=0&&x=0&&y