From fef73210e9fa1fb5a39d79a8d593083730e566ce Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 7 Oct 2016 04:10:01 -0400 Subject: [PATCH] v0.4.3: plants and traps are now on a terrain tilemap pt.1 Still needs some cleaning up, but everything works --- core/src/main/assets/plants.png | Bin 1602 -> 0 bytes core/src/main/assets/terrain_features.png | Bin 0 -> 13170 bytes core/src/main/assets/traps.png | Bin 8620 -> 0 bytes .../shatteredpixeldungeon/Assets.java | 5 +- .../shatteredpixeldungeon/levels/Level.java | 6 +- .../levels/PrisonBossLevel.java | 4 - .../levels/traps/Trap.java | 3 + .../shatteredpixeldungeon/plants/Plant.java | 8 +- .../scenes/GameScene.java | 30 ++-- .../sprites/PlantSprite.java | 2 +- .../sprites/TrapSprite.java | 2 +- .../ui/TerrainFeaturesTilemap.java | 140 ++++++++++++++++++ .../windows/WndInfoPlant.java | 7 +- .../windows/WndInfoTrap.java | 5 +- 14 files changed, 171 insertions(+), 41 deletions(-) delete mode 100644 core/src/main/assets/plants.png create mode 100644 core/src/main/assets/terrain_features.png delete mode 100644 core/src/main/assets/traps.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TerrainFeaturesTilemap.java diff --git a/core/src/main/assets/plants.png b/core/src/main/assets/plants.png deleted file mode 100644 index 3ca895faab35b7bc4487c25ce90f77722ced5a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1602 zcmY*adpOez82-&>bJ<*LWf>A_C8IXoI5wuCXi2p+QL#!T-7L4wC5KR0h0%p_iYTHR zHQRA0iBYK0A~MsdMa!~{_B(o>bDpR3{qeo;_q^ZpKJWL}cZL=~MHyfW002Pw`cMJ^ z05VGf6Ful`7oj%C&w`A$F~}PP!Jh&EfE=LC3SicOVcyct0jUB6r9Ja3;+-?N8)-Z3 zymEO0KH$eY&H|^vn#HvW(9!qp>EQNK#_VS8`I?1unM>LMThGLdlYkhU0eoWI{2UFo z5{$`q&_DcA!J&=W-C%3H;tLP-JiClrZk1D97kSK`ux=iY$K#UUoZVdQ?`ZIwHN=-K z_eik6u}$a@7~<`qI~#8w-JO!Q{2*?sUDa>Sd(PEqx4JW=fbnl5`?4U<=^Can|iduU z#QzPy3cvC`XGEY20KnRODdeD2kV|=K4NJ+$)FbP|qK>jyvL9E!+}k2qn9z}H`-p~9oAZUcy{bP(`oOFTBApj*zt(u=H=L2BxGrGHt2TZ z=wOl9suyn4@~V7IM?A-?*P11-NkNEHq7h3R`-TeTa^_Mum3;hsUyI${E*+;L6V0Jw8PM9( zByo|DozPu!<=Kx$no%#dtm?j(6={WO?B=6oxQ$FENkbjcxY!|~fZ^2rqIX5dj+doG%I@1Jz>ZpWgj!%HSu3GX4aJiW z_yaLhyCLTy(*G)TcgHdD8vfKY9awx4n0vvT!!JmS!Md1uRYo&LpXc)yFqt#pctzA< z!K3Um`G?X)z1`WXqQg7qV65s_uJ~MWm#DU&;Vq~no~>J83}F{F1J1hM? zXP<&qa4L+nzMwN;seWM`eoh}CP8@+1s{6N!aVe2P>cP0tho}jK9p_i_eaD$eGRlFu?N1iw0(N9J&^eZmlcz#ks2!1A8AAnPah+4U989wUG z8v8ICk_!+QuxZ04y0oa$9;r<5JNV7aRy}WnZZo%Q4zIm!rgShF6UX_x` zEl--BDqt2QuuwLw$s8K8L_a|yu>}M;2Vny{7=lKXm@RqN@MF*P_vKQHUJpxsL}B+2 z4D?A&Pc%WpQgE+Q)dzo^%X0Vld&(NoA2$%XZ)BWFej1fQ~!V}LnCn=WeEX84so!qN!CG6{6*)jhkM* zEi59OlKD8|t@%vtXQAb{j99rGt1f&-;2&syGw8Z!z}~Dzbp1uOv8XYg)EDGKB8)@o z)v{f!yK=ed&#XTtXLITh1o#DU8ZE&2dQYROFSjXlQIQyy;{9i*@oUmz(yeW7qT74cKp0i))OjtF?Mm$XYPCSqppDkvcP`

grYlSU0D#rdK-U}q0A3^kNCvu# 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

NrlZ$i>Q63{(*-*j6%bon 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 a_Vinw(>1<%;qRX@oE^^ESD(0i>wf_L@a!1? diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 79dcae763..9ad977ae9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -97,9 +97,8 @@ public class Assets { public static final String ROT_HEART= "rot_heart.png"; public static final String GUARD = "guard.png"; - public static final String ITEMS = "items.png"; - public static final String PLANTS = "plants.png"; - public static final String TRAPS = "traps.png"; + public static final String ITEMS = "items.png"; + public static final String TERRAIN_FEATURES = "terrain_features.png"; public static final String TILES_SEWERS = "tiles0.png"; public static final String TILES_PRISON = "tiles1.png"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java index 5aacac451..0287bb614 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java @@ -734,19 +734,19 @@ public abstract class Level implements Bundlable { map[pos] == Terrain.EMPTY_DECO) { map[pos] = Terrain.GRASS; flamable[pos] = true; - GameScene.updateMap( pos ); } plant = seed.couch( pos ); plants.put( pos, plant ); - GameScene.add( plant ); + GameScene.updateMap( pos ); return plant; } public void uproot( int pos ) { plants.remove(pos); + GameScene.updateMap( pos ); } public Trap setTrap( Trap trap, int pos ){ @@ -757,7 +757,7 @@ public abstract class Level implements Bundlable { } trap.set( pos ); traps.put( pos, trap ); - GameScene.add(trap); + GameScene.updateMap( pos ); return trap; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java index b632ef82a..dacab602f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java @@ -216,9 +216,6 @@ public class PrisonBossLevel extends Level { } private void resetTraps(){ - for (Trap trap : traps.values()){ - trap.sprite.kill(); - } traps.clear(); for (int i = 0; i < length(); i++){ @@ -273,7 +270,6 @@ public class PrisonBossLevel extends Level { for (Plant plant : plants.values()){ if (safeArea == null || !safeArea.inside(cellToPoint(plant.pos))){ plants.remove(plant.pos); - plant.sprite.kill(); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java index 8eb923a5d..1c6a51903 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.TrapSprite; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.tweeners.AlphaTweener; @@ -54,6 +55,7 @@ public abstract class Trap implements Bundlable { sprite.alpha( 0 ); sprite.parent.add( new AlphaTweener( sprite, 1, 0.6f)); } + GameScene.updateMap(pos); return this; } @@ -61,6 +63,7 @@ public abstract class Trap implements Bundlable { visible = false; if (sprite != null) sprite.visible = false; + GameScene.updateMap(pos); return this; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java index 5d7b51d36..0d5cb2738 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java @@ -38,7 +38,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.PlantSprite; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundlable; import com.watabou.utils.Bundle; @@ -52,8 +51,6 @@ public abstract class Plant implements Bundlable { public int image; public int pos; - - public PlantSprite sprite; public void trigger(){ @@ -71,8 +68,7 @@ public abstract class Plant implements Bundlable { public void wither() { Dungeon.level.uproot( pos ); - - sprite.kill(); + if (Dungeon.visible[pos]) { CellEmitter.get( pos ).burst( LeafParticle.GENERAL, 6 ); } @@ -142,7 +138,7 @@ public abstract class Plant implements Bundlable { @Override protected void onThrow( int cell ) { - if (Dungeon.level.map[cell] == Terrain.ALCHEMY || Level.pit[cell]) { + if (Dungeon.level.map[cell] == Terrain.ALCHEMY || Level.pit[cell] || Dungeon.level.traps.get(cell) != null) { super.onThrow( cell ); } else { Dungeon.level.plant( this, cell ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index fb0dbf519..727cc5bb8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -71,6 +71,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.LootIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; import com.shatteredpixel.shatteredpixeldungeon.ui.ResumeIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.StatusPane; +import com.shatteredpixel.shatteredpixeldungeon.ui.TerrainFeaturesTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.Toast; import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; @@ -111,6 +112,7 @@ public class GameScene extends PixelScene { private SkinnedBlock water; private DungeonTilemap tiles; + private TerrainFeaturesTilemap terrainFeatures; private FogOfWar fog; private HeroSprite hero; @@ -193,30 +195,17 @@ public class GameScene extends PixelScene { for( CustomTileVisual visual : Dungeon.level.customTiles){ addCustomTile(visual.create()); } + + terrainFeatures = new TerrainFeaturesTilemap(Dungeon.level.plants, Dungeon.level.traps); + terrain.add(terrainFeatures); levelVisuals = Dungeon.level.addVisuals(); add(levelVisuals); - - traps = new Group(); - add(traps); - - int size = Dungeon.level.traps.size(); - for (int i=0; i < size; i++) { - addTrapSprite( Dungeon.level.traps.valueAt( i ) ); - } - - plants = new Group(); - add( plants ); - - size = Dungeon.level.plants.size(); - for (int i=0; i < size; i++) { - addPlantSprite( Dungeon.level.plants.valueAt( i ) ); - } heaps = new Group(); add( heaps ); - size = Dungeon.level.heaps.size(); + int size = Dungeon.level.heaps.size(); for (int i=0; i < size; i++) { addHeapSprite( Dungeon.level.heaps.valueAt( i ) ); } @@ -541,12 +530,11 @@ public class GameScene extends PixelScene { } private void addPlantSprite( Plant plant ) { - (plant.sprite = (PlantSprite)plants.recycle( PlantSprite.class )).reset( plant ); + } private void addTrapSprite( Trap trap ) { - (trap.sprite = (TrapSprite)traps.recycle( TrapSprite.class )).reset( trap ); - trap.sprite.visible = trap.visible; + } private void addBlobSprite( final Blob gas ) { @@ -689,12 +677,14 @@ public class GameScene extends PixelScene { public static void updateMap() { if (scene != null) { scene.tiles.updateMap(); + scene.terrainFeatures.updateMap(); } } public static void updateMap( int cell ) { if (scene != null) { scene.tiles.updateMapCell( cell ); + scene.terrainFeatures.updateMapCell( cell ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PlantSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PlantSprite.java index 1128f0b8c..a05e17ed7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PlantSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PlantSprite.java @@ -44,7 +44,7 @@ public class PlantSprite extends Image { private int pos = -1; public PlantSprite() { - super( Assets.PLANTS ); + super( Assets.TERRAIN_FEATURES ); if (frames == null) { frames = new TextureFilm( texture, 16, 16 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java index 72295d197..c9086b333 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java @@ -56,7 +56,7 @@ public class TrapSprite extends Image { public TrapSprite() { - super( Assets.TRAPS ); + super( Assets.TERRAIN_FEATURES ); if (frames == null) { frames = new TextureFilm( texture, 16, 16 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TerrainFeaturesTilemap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TerrainFeaturesTilemap.java new file mode 100644 index 000000000..ca359c06f --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TerrainFeaturesTilemap.java @@ -0,0 +1,140 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2016 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.shatteredpixel.shatteredpixeldungeon.ui; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.sprites.TrapSprite; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.Tilemap; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; +import com.watabou.utils.SparseArray; + +public class TerrainFeaturesTilemap extends Tilemap { + + public static final int SIZE = 16; + + private static TerrainFeaturesTilemap instance; + + private int[] map; + private float[] tileVariance; + + private SparseArray plants; + private SparseArray traps; + + public TerrainFeaturesTilemap(SparseArray plants, SparseArray traps) { + super(Assets.TERRAIN_FEATURES, new TextureFilm( Assets.TERRAIN_FEATURES, SIZE, SIZE )); + + this.plants = plants; + this.traps = traps; + + Random.seed( Dungeon.seedCurDepth()); + tileVariance = new float[Dungeon.level.map.length]; + for (int i = 0; i < tileVariance.length; i++) + tileVariance[i] = Random.Float(); + Random.seed(); + + map( Dungeon.level.map, Dungeon.level.width() ); + + instance = this; + } + + @Override + //we need to retain two arrays, map is the dungeon tilemap which we can reference. + // Data is our own internal image representation of the tiles, which may differ. + public void map(int[] data, int cols) { + map = data; + super.map(new int[data.length], cols); + } + + @Override + public synchronized void updateMap() { + super.updateMap(); + for (int i = 0; i < data.length; i++) + data[i] = getTileVisual(i ,map[i]); + } + + @Override + public synchronized void updateMapCell(int cell) { + //update in a 3x3 grid to account for neighbours which might also be affected + if (Dungeon.level.insideMap(cell)) { + super.updateMapCell(cell - mapWidth - 1); + super.updateMapCell(cell + mapWidth + 1); + for (int i : PathFinder.NEIGHBOURS9) + data[cell + i] = getTileVisual(cell + i, map[cell + i]); + + //unless we're at the level's edge, then just do the one tile. + } else { + super.updateMapCell(cell); + data[cell] = getTileVisual(cell, map[cell]); + } + } + + private int getTileVisual(int pos, int tile){ + if (traps.get(pos) != null){ + Trap trap = traps.get(pos); + if (!trap.visible) + return -1; + else + return (trap.active ? trap.color : TrapSprite.BLACK) + (trap.shape * 16); + } + + if (plants.get(pos) != null){ + return plants.get(pos).image + 7*16; + } + + if (tile == Terrain.HIGH_GRASS){ + return 9 + 16*((Dungeon.depth-1)/5) + (tileVariance[pos] > 0.5f ? 1 : 0); + } else if (tile == Terrain.GRASS) { + return 11 + 16*((Dungeon.depth-1)/5) + (tileVariance[pos] > 0.5f ? 1 : 0); + } else if (tile == Terrain.EMBERS) { + return 13 + (tileVariance[pos] > 0.5f ? 1 : 0); + } + + return -1; + } + + public static Image tile(int pos, int tile ) { + Image img = new Image( instance.texture ); + img.frame( instance.tileset.get( instance.getTileVisual( pos, tile ) ) ); + return img; + } + + @Override + public boolean overlapsPoint( float x, float y ) { + return true; + } + + @Override + public boolean overlapsScreenPoint( int x, int y ) { + return true; + } + + @Override + protected boolean needsRender(int pos) { + return data[pos] != -1; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoPlant.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoPlant.java index c822b03d6..670ceae66 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoPlant.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoPlant.java @@ -20,14 +20,19 @@ */ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.PlantSprite; +import com.shatteredpixel.shatteredpixeldungeon.ui.TerrainFeaturesTilemap; public class WndInfoPlant extends WndTitledMessage { public WndInfoPlant( Plant plant ) { - super(new PlantSprite( plant.image ), plant.plantName, plant.desc()); + super(TerrainFeaturesTilemap.tile( plant.pos, Dungeon.level.map[plant.pos]), + plant.plantName, plant.desc()); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java index df2dc4cf1..bc8f6947f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java @@ -20,15 +20,16 @@ */ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.TrapSprite; +import com.shatteredpixel.shatteredpixeldungeon.ui.TerrainFeaturesTilemap; public class WndInfoTrap extends WndTitledMessage { public WndInfoTrap(Trap trap) { - super(new TrapSprite( trap.color + (trap.shape * 16) ), + super(TerrainFeaturesTilemap.tile( trap.pos, Dungeon.level.map[trap.pos]), trap.name, (!trap.active ? Messages.get(WndInfoTrap.class, "inactive") + "\n\n" : "") + trap.desc());