From efeda9c5ff0f1487467229d50da24ee2d2bb5160 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 12 Nov 2021 14:30:24 -0500 Subject: [PATCH] v1.1.0: converted alchemical energy to a currency like gold Things still to do: - add interface for creating alchemical energy - redesign alchemize spell - fix toolkit --- core/src/main/assets/interfaces/icons.png | Bin 13116 -> 13395 bytes .../assets/messages/items/items.properties | 3 + .../assets/messages/scenes/scenes.properties | 2 +- core/src/main/assets/sprites/items.png | Bin 19913 -> 20022 bytes .../shatteredpixeldungeon/Dungeon.java | 16 ++- .../actors/blobs/Alchemy.java | 32 ++--- .../actors/hero/Hero.java | 5 - .../items/EnergyCrystal.java | 67 ++++++++++ .../shatteredpixeldungeon/items/Gold.java | 15 +-- .../items/artifacts/AlchemistsToolkit.java | 29 ++--- .../items/spells/Alchemize.java | 15 +-- .../rooms/secret/SecretLaboratoryRoom.java | 10 +- .../levels/rooms/special/LaboratoryRoom.java | 17 ++- .../scenes/AlchemyScene.java | 62 ++++----- .../sprites/ItemSpriteSheet.java | 20 +-- .../ui/CurrencyIndicator.java | 120 ++++++++++++++++++ .../ui/GoldIndicator.java | 83 ------------ .../shatteredpixeldungeon/ui/Icons.java | 19 ++- .../shatteredpixeldungeon/ui/QuickRecipe.java | 2 +- .../shatteredpixeldungeon/ui/Toolbar.java | 8 +- .../shatteredpixeldungeon/windows/WndBag.java | 68 +++++++--- 21 files changed, 373 insertions(+), 220 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CurrencyIndicator.java delete mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/GoldIndicator.java diff --git a/core/src/main/assets/interfaces/icons.png b/core/src/main/assets/interfaces/icons.png index 89547535613d5ff220c4e1a3801640a9fe03dd1c..5d9944d10f6b119d7c8088bf78ecc1e8cd61520e 100644 GIT binary patch literal 13395 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 literal 19913 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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 5eeb6a99f..d2f3652ca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -162,7 +162,9 @@ public class Dungeon { public static QuickSlot quickslot = new QuickSlot(); public static int depth; + public static int gold; + public static int energy; public static HashSet chapters; @@ -203,6 +205,7 @@ public class Dungeon { depth = 0; gold = 0; + energy = 0; droppedItems = new SparseArray<>(); portedItems = new SparseArray<>(); @@ -443,8 +446,9 @@ public class Dungeon { private static final String CHALLENGES = "challenges"; private static final String MOBS_TO_CHAMPION = "mobs_to_champion"; private static final String HERO = "hero"; - private static final String GOLD = "gold"; private static final String DEPTH = "depth"; + private static final String GOLD = "gold"; + private static final String ENERGY = "energy"; private static final String DROPPED = "dropped%d"; private static final String PORTED = "ported%d"; private static final String LEVEL = "level"; @@ -463,9 +467,11 @@ public class Dungeon { bundle.put( CHALLENGES, challenges ); bundle.put( MOBS_TO_CHAMPION, mobsToChampion ); bundle.put( HERO, hero ); - bundle.put( GOLD, gold ); bundle.put( DEPTH, depth ); + bundle.put( GOLD, gold ); + bundle.put( ENERGY, energy ); + for (int d : droppedItems.keyArray()) { bundle.put(Messages.format(DROPPED, d), droppedItems.get(d)); } @@ -609,9 +615,11 @@ public class Dungeon { hero = null; hero = (Hero)bundle.get( HERO ); - gold = bundle.getInt( GOLD ); depth = bundle.getInt( DEPTH ); - + + gold = bundle.getInt( GOLD ); + energy = bundle.getInt( ENERGY ); + Statistics.restoreFromBundle( bundle ); Generator.restoreFromBundle( bundle ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Alchemy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Alchemy.java index 81e5eaa9c..a8123859f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Alchemy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Alchemy.java @@ -24,10 +24,12 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.blobs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.EnergyCrystal; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; -import com.shatteredpixel.shatteredpixeldungeon.scenes.AlchemyScene; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; -public class Alchemy extends Blob implements AlchemyScene.AlchemyProvider { +public class Alchemy extends Blob { protected int pos; @@ -39,6 +41,17 @@ public class Alchemy extends Blob implements AlchemyScene.AlchemyProvider { cell = j + i* Dungeon.level.width(); if (Dungeon.level.insideMap(cell)) { off[cell] = cur[cell]; + + //for pre-v1.1.0 saves, drops 1/4 the pot's old energy contents in crystals + if (off[cell] >= 1){ + int n; + do { + n = cell + PathFinder.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Dungeon.level.passable[n] && !Dungeon.level.avoid[n]); + Dungeon.level.drop( new EnergyCrystal((int)Math.ceil(off[cell]/4f)), n ).sprite.drop( cell ); + off[cell] = 1; + } + volume += off[cell]; if (off[cell] > 0 && Dungeon.level.heroFOV[cell]){ Notes.add( Notes.Landmark.ALCHEMY ); @@ -53,18 +66,5 @@ public class Alchemy extends Blob implements AlchemyScene.AlchemyProvider { super.use( emitter ); emitter.start( Speck.factory( Speck.BUBBLE ), 0.33f, 0 ); } - - public static int alchPos; - - //1 volume is kept in reserve - - @Override - public int getEnergy() { - return Math.max(0, cur[alchPos] - 1); - } - - @Override - public void spendEnergy(int reduction) { - cur[alchPos] = Math.max(1, cur[alchPos] - reduction); - } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 16d33faa0..061eed67e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -832,11 +832,6 @@ public class Hero extends Char { return false; } - Alchemy alch = (Alchemy) Dungeon.level.blobs.get(Alchemy.class); - if (alch != null) { - alch.alchPos = dst; - AlchemyScene.setProvider( alch ); - } ShatteredPixelDungeon.switchScene(AlchemyScene.class); return false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java new file mode 100644 index 000000000..907ad3039 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java @@ -0,0 +1,67 @@ +package com.shatteredpixel.shatteredpixeldungeon.items; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Random; + +import java.util.ArrayList; + +public class EnergyCrystal extends Item { + + private static final String TXT_VALUE = "%+d"; + + { + image = ItemSpriteSheet.ENERGY; + stackable = true; + } + + public EnergyCrystal() { + this( 1 ); + } + + public EnergyCrystal( int value ) { + this.quantity = value; + } + + @Override + public ArrayList actions(Hero hero ) { + return new ArrayList<>(); + } + + @Override + public boolean doPickUp( Hero hero ) { + + Dungeon.energy += quantity; + //TODO Statistics.goldCollected += quantity; + //Badges.validateGoldCollected(); + + GameScene.pickUp( this, hero.pos ); + hero.sprite.showStatus( 0x44CCFF, TXT_VALUE, quantity ); + hero.spendAndNext( TIME_TO_PICK_UP ); + + Sample.INSTANCE.play( Assets.Sounds.ITEM ); + + return true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public Item random() { + quantity = Random.IntRange( 4, 6 ); + return this; + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java index 8db4c50e7..ef48d80f5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java @@ -93,18 +93,5 @@ public class Gold extends Item { quantity = Random.Int( 30 + Dungeon.depth * 10, 60 + Dungeon.depth * 20 ); return this; } - - private static final String VALUE = "value"; - - @Override - public void storeInBundle( Bundle bundle ) { - super.storeInBundle( bundle ); - bundle.put( VALUE, quantity ); - } - - @Override - public void restoreFromBundle( Bundle bundle ) { - super.restoreFromBundle(bundle); - quantity = bundle.getInt( VALUE ); - } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java index 2ba96997b..078761033 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java @@ -73,8 +73,9 @@ public class AlchemistsToolkit extends Artifact { else if (!alchemyReady) GLog.i( Messages.get(this, "not_ready") ); else if (hero.visibleEnemies() > hero.mindVisionEnemies.size()) GLog.i( Messages.get(this, "enemy_near") ); else { - - AlchemyScene.setProvider(hero.buff(kitEnergy.class)); + + //TODO notify scene we're using a toolkit here instead + //AlchemyScene.setProvider(hero.buff(kitEnergy.class)); Game.switchScene(AlchemyScene.class); } @@ -164,7 +165,7 @@ public class AlchemistsToolkit extends Artifact { alchemyReady = bundle.getBoolean(READY); } - public class kitEnergy extends ArtifactBuff implements AlchemyScene.AlchemyProvider { + public class kitEnergy extends ArtifactBuff { public void gainCharge(float levelPortion) { alchemyReady = true; @@ -197,32 +198,22 @@ public class AlchemistsToolkit extends Artifact { } else partialCharge = 0; } - - @Override - public int getEnergy() { - return charge; - } - - @Override - public void spendEnergy(int reduction) { - charge = Math.max(0, charge - reduction); - Talent.onArtifactUsed(Dungeon.hero); - } + } - + + //TODO this isn't working with new energy yet, atm it's just sucking up all energy possible public static class upgradeKit extends Recipe { @Override public boolean testIngredients(ArrayList ingredients) { - return ingredients.get(0) instanceof AlchemistsToolkit - && !AlchemyScene.providerIsToolkit(); + return ingredients.get(0) instanceof AlchemistsToolkit; } private static int lastCost; @Override public int cost(ArrayList ingredients) { - return lastCost = Math.max(1, AlchemyScene.availableEnergy()); + return lastCost = Math.max(1, Dungeon.energy); } @Override @@ -245,7 +236,7 @@ public class AlchemistsToolkit extends Artifact { sample.partialCharge = existing.partialCharge; sample.exp = existing.exp; sample.level(existing.level()); - sample.absorbEnergy(AlchemyScene.availableEnergy()); + sample.absorbEnergy(Dungeon.energy); return sample; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java index e9c5d0e00..4009c3b10 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java @@ -29,7 +29,8 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.AlchemyScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -public class Alchemize extends Spell implements AlchemyScene.AlchemyProvider { +//TODO redesign +public class Alchemize extends Spell { { image = ItemSpriteSheet.ALCHEMIZE; @@ -43,20 +44,10 @@ public class Alchemize extends Spell implements AlchemyScene.AlchemyProvider { } detach( curUser.belongings.backpack ); updateQuickslot(); - AlchemyScene.setProvider(this); + //AlchemyScene.setProvider(this); ShatteredPixelDungeon.switchScene(AlchemyScene.class); } - @Override - public int getEnergy() { - return 0; - } - - @Override - public void spendEnergy(int reduction) { - //do nothing - } - @Override public int value() { //prices of ingredients, divided by output quantity diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java index 32c6f56c8..7b12bd57f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Alchemy; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.items.EnergyCrystal; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; @@ -72,11 +73,16 @@ public class SecretLaboratoryRoom extends SecretRoom { Painter.set( level, pot, Terrain.ALCHEMY ); Blob.seed( pot.x + level.width() * pot.y, 1+Random.NormalIntRange(20, 30), Alchemy.class, level ); - + + int pos; + do { + pos = level.pointToCell(random()); + } while (level.map[pos] != Terrain.EMPTY_SP || level.heaps.get( pos ) != null); + level.drop( new EnergyCrystal().random(), pos ); + int n = Random.IntRange( 2, 3 ); HashMap, Float> chances = new HashMap<>(potionChances); for (int i=0; i < n; i++) { - int pos; do { pos = level.pointToCell(random()); } while (level.map[pos] != Terrain.EMPTY_SP || level.heaps.get( pos ) != null); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java index 1c797fa65..e06085fc7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Alchemy; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.items.EnergyCrystal; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.journal.AlchemyPage; @@ -62,11 +63,18 @@ public class LaboratoryRoom extends SpecialRoom { Painter.set( level, pot, Terrain.ALCHEMY ); int chapter = 1 + Dungeon.depth/5; - Blob.seed( pot.x + level.width() * pot.y, 1 + chapter*10 + Random.NormalIntRange(0, 10), Alchemy.class, level ); - - int n = Random.NormalIntRange( 1, 3 ); + Blob.seed( pot.x + level.width() * pot.y, 1, Alchemy.class, level ); + + int pos; + do { + pos = level.pointToCell(random()); + } while ( + level.map[pos] != Terrain.EMPTY_SP || + level.heaps.get( pos ) != null); + level.drop( new EnergyCrystal().random(), pos ); + + int n = Random.NormalIntRange( 1, 2 ); for (int i=0; i < n; i++) { - int pos; do { pos = level.pointToCell(random()); } while ( @@ -100,7 +108,6 @@ public class LaboratoryRoom extends SpecialRoom { for (int i = 0; i < pagesToDrop; i++) { AlchemyPage p = new AlchemyPage(); p.page(missingPages.remove(0)); - int pos; do { pos = level.pointToCell(random()); } while ( diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java index 222b2d346..db5e25b90 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java @@ -73,8 +73,11 @@ public class AlchemyScene extends PixelScene { private Emitter lowerBubbles; private SkinnedBlock water; - + + private Image energyIcon; private RenderedTextBlock energyLeft; + private IconButton energyAdd; + private RenderedTextBlock energyCost; private RedButton btnCombine; @@ -287,12 +290,24 @@ public class AlchemyScene extends PixelScene { btnGuide.setRect(0, 0, 20, 20); add(btnGuide); - energyLeft = PixelScene.renderTextBlock(Messages.get(AlchemyScene.class, "energy", availableEnergy()), 9); + energyLeft = PixelScene.renderTextBlock(Messages.get(AlchemyScene.class, "energy", Dungeon.energy), 9); energyLeft.setPos( (Camera.main.width - energyLeft.width())/2, - Camera.main.height - 5 - energyLeft.height() + Camera.main.height - 8 - energyLeft.height() ); + energyLeft.hardlight(0x44CCFF); add(energyLeft); + + energyIcon = Icons.get(Icons.ENERGY); + energyIcon.x = energyLeft.left() - energyIcon.width(); + energyIcon.y = energyLeft.top() - (energyIcon.height() - energyLeft.height())/2; + align(energyIcon); + add(energyIcon); + + //TODO does nothing currently + energyAdd = new IconButton(Icons.get(Icons.PLUS)); + energyAdd.setRect(energyLeft.right(), energyIcon.y, 16, 16); + add(energyAdd); energyCost = PixelScene.renderTextBlock(6); add(energyCost); @@ -384,9 +399,9 @@ public class AlchemyScene extends PixelScene { energyCost.visible = (cost > 0); - if (cost <= availableEnergy()) { + if (cost <= Dungeon.energy) { btnCombine.enable(true); - energyCost.resetColor(); + energyCost.hardlight(0x44CCFF); } else { btnCombine.enable(false); energyCost.hardlight(0xFF0000); @@ -408,12 +423,18 @@ public class AlchemyScene extends PixelScene { Item result = null; if (recipe != null){ - provider.spendEnergy(recipe.cost(ingredients)); - energyLeft.text(Messages.get(AlchemyScene.class, "energy", availableEnergy())); + Dungeon.energy -= recipe.cost(ingredients); + energyLeft.text(Messages.get(AlchemyScene.class, "energy", Dungeon.energy)); energyLeft.setPos( (Camera.main.width - energyLeft.width())/2, - Camera.main.height - 5 - energyLeft.height() + Camera.main.height - 8 - energyLeft.height() ); + + energyIcon.x = energyLeft.left() - energyIcon.width(); + energyIcon.y = energyLeft.top() - (energyIcon.height() - energyLeft.height())/2; + align(energyIcon); + + energyAdd.setRect(energyLeft.right(), energyIcon.y, 16, 16); result = recipe.brew(ingredients); } @@ -572,26 +593,7 @@ public class AlchemyScene extends PixelScene { slot.item( this.item = item ); } } - - private static AlchemyProvider provider; - - public static void setProvider( AlchemyProvider p ){ - provider = p; - } - - public static int availableEnergy(){ - return provider == null ? 0 : provider.getEnergy(); - } - - public static boolean providerIsToolkit(){ - return provider instanceof AlchemistsToolkit.kitEnergy; - } - - public interface AlchemyProvider { - - int getEnergy(); - - void spendEnergy(int reduction); - - } + + //TODO add code here for the toolkit's energy + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 49ebab521..4fe5c243e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -81,18 +81,22 @@ public class ItemSpriteSheet { private static final int UNCOLLECTIBLE = xy(1, 2); //16 slots public static final int GOLD = UNCOLLECTIBLE+0; - public static final int DEWDROP = UNCOLLECTIBLE+1; - public static final int PETAL = UNCOLLECTIBLE+2; - public static final int SANDBAG = UNCOLLECTIBLE+3; - public static final int SPIRIT_ARROW = UNCOLLECTIBLE+4; + public static final int ENERGY = UNCOLLECTIBLE+1; + + public static final int DEWDROP = UNCOLLECTIBLE+3; + public static final int PETAL = UNCOLLECTIBLE+4; + public static final int SANDBAG = UNCOLLECTIBLE+5; + public static final int SPIRIT_ARROW = UNCOLLECTIBLE+6; - public static final int GUIDE_PAGE = UNCOLLECTIBLE+6; - public static final int ALCH_PAGE = UNCOLLECTIBLE+7; + public static final int GUIDE_PAGE = UNCOLLECTIBLE+8; + public static final int ALCH_PAGE = UNCOLLECTIBLE+9; - public static final int TENGU_BOMB = UNCOLLECTIBLE+9; - public static final int TENGU_SHOCKER = UNCOLLECTIBLE+10; + public static final int TENGU_BOMB = UNCOLLECTIBLE+11; + public static final int TENGU_SHOCKER = UNCOLLECTIBLE+12; static{ assignItemRect(GOLD, 15, 13); + assignItemRect(ENERGY, 16, 16); + assignItemRect(DEWDROP, 10, 10); assignItemRect(PETAL, 8, 8); assignItemRect(SANDBAG, 10, 10); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CurrencyIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CurrencyIndicator.java new file mode 100644 index 000000000..1ec0fa5c3 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CurrencyIndicator.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2021 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.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Game; +import com.watabou.noosa.ui.Component; + +public class CurrencyIndicator extends Component { + + private static final float TIME = 2f; + + private int lastGold = 0; + private int lastEnergy = 0; + + private BitmapText gold; + private BitmapText energy; + + private float goldTime; + private float energyTime; + + @Override + protected void createChildren() { + gold = new BitmapText( PixelScene.pixelFont); + add( gold ); + + energy = new BitmapText( PixelScene.pixelFont); + add( energy ); + + gold.visible = energy.visible = false; + } + + @Override + protected void layout() { + gold.x = x + (width - gold.width()) / 2; + gold.y = bottom() - gold.height(); + + energy.x = x + (width - energy.width()) / 2; + if (gold.visible) { + energy.y = bottom() - energy.height() - gold.height() + 2; + } else { + energy.y = bottom() - energy.height(); + } + } + + @Override + public void update() { + super.update(); + + if (gold.visible) { + + goldTime -= Game.elapsed; + if (goldTime > 0) { + gold.alpha( goldTime > TIME / 2 ? 1f : goldTime * 2 / TIME ); + } else { + gold.visible = false; + } + + } + + if (energy.visible) { + + energyTime -= Game.elapsed; + if (energyTime > 0) { + energy.alpha( energyTime > TIME / 2 ? 1f : energyTime * 2 / TIME ); + } else { + energy.visible = false; + } + + } + + if (Dungeon.gold != lastGold) { + + lastGold = Dungeon.gold; + + gold.text( Integer.toString(lastGold) ); + gold.measure(); + gold.hardlight( 0xFFFF00 ); + + gold.visible = true; + goldTime = TIME; + + layout(); + } + + if (Dungeon.energy != lastEnergy) { + lastEnergy = Dungeon.energy; + + energy.text( Integer.toString(lastEnergy) ); + energy.measure(); + energy.hardlight( 0x44CCFF ); + + energy.visible = true; + energyTime = TIME; + + layout(); + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/GoldIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/GoldIndicator.java deleted file mode 100644 index 9100c44a1..000000000 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/GoldIndicator.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2021 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.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; -import com.watabou.noosa.BitmapText; -import com.watabou.noosa.Game; -import com.watabou.noosa.ui.Component; - -public class GoldIndicator extends Component { - - private static final float TIME = 2f; - - private int lastValue = 0; - - private BitmapText tf; - - private float time; - - @Override - protected void createChildren() { - tf = new BitmapText( PixelScene.pixelFont); - tf.hardlight( 0xFFFF00 ); - add( tf ); - - visible = false; - } - - @Override - protected void layout() { - tf.x = x + (width - tf.width()) / 2; - tf.y = bottom() - tf.height(); - } - - @Override - public void update() { - super.update(); - - if (visible) { - - time -= Game.elapsed; - if (time > 0) { - tf.alpha( time > TIME / 2 ? 1f : time * 2 / TIME ); - } else { - visible = false; - } - - } - - if (Dungeon.gold != lastValue) { - - lastValue = Dungeon.gold; - - tf.text( Integer.toString( lastValue ) ); - tf.measure(); - - visible = true; - time = TIME; - - layout(); - } - } -} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java index 12ec82930..3ab36d811 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.watabou.noosa.Image; +//TODO the icons asset is getting pretty bloated, should expand the texture and reorganize public enum Icons { //button icons @@ -46,6 +47,7 @@ public enum Icons { MAGNIFY, BUFFS, BACKPACK_LRG, + PLUS, //ingame UI icons SKULL, @@ -58,8 +60,11 @@ public enum Icons { BACKPACK, SEED_POUCH, SCROLL_HOLDER, - POTION_BANDOLIER, WAND_HOLSTER, + POTION_BANDOLIER, + ENERGY, + COIN_SML, + ENERGY_SML, //hero & rankings icons DEPTH, @@ -150,6 +155,9 @@ public enum Icons { case BACKPACK_LRG: icon.frame( icon.texture.uvRect( 64, 80, 80, 96 ) ); break; + case PLUS: + icon.frame( icon.texture.uvRect( 80, 80, 91, 91 ) ); + break; case SKULL: icon.frame( icon.texture.uvRect( 0, 32, 8, 40 ) ); @@ -187,6 +195,15 @@ public enum Icons { case POTION_BANDOLIER: icon.frame( icon.texture.uvRect( 88, 32, 98, 42 ) ); break; + case ENERGY: + icon.frame( icon.texture.uvRect( 96, 80, 112, 96 ) ); + break; + case COIN_SML: + icon.frame( icon.texture.uvRect( 112, 80, 119, 87 ) ); + break; + case ENERGY_SML: + icon.frame( icon.texture.uvRect( 112, 88, 120, 95 ) ); + break; case DEPTH: icon.frame( icon.texture.uvRect( 0, 48, 13, 64 ) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java index 926781988..98da32fe1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java @@ -133,7 +133,7 @@ public class QuickRecipe extends Component { if (cost > 0) { arrow = new arrow(Icons.get(Icons.ARROW), cost); - arrow.hardlightText(0x00CCFF); + arrow.hardlightText(0x44CCFF); } else { arrow = new arrow(Icons.get(Icons.ARROW)); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java index f799cfddf..169ac85ee 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java @@ -139,7 +139,7 @@ public class Toolbar extends Component { }); add(btnInventory = new Tool(0, 0, 24, 26) { - private GoldIndicator gold; + private CurrencyIndicator ind; @Override protected void onClick() { @@ -160,14 +160,14 @@ public class Toolbar extends Component { @Override protected void createChildren() { super.createChildren(); - gold = new GoldIndicator(); - add(gold); + ind = new CurrencyIndicator(); + add(ind); } @Override protected void layout() { super.layout(); - gold.fill(this); + ind.fill(this); } }); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java index cdeeb0e19..24e50c525 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -167,26 +167,64 @@ public class WndBag extends WndTabbed { } protected void placeTitle( Bag bag, int width ){ - - ItemSprite gold = new ItemSprite(ItemSpriteSheet.GOLD, null); - gold.x = width - gold.width() - 1; - gold.y = (TITLE_HEIGHT - gold.height())/2f - 1; - PixelScene.align(gold); - add(gold); - - BitmapText amt = new BitmapText( Integer.toString(Dungeon.gold), PixelScene.pixelFont ); - amt.hardlight(TITLE_COLOR); - amt.measure(); - amt.x = width - gold.width() - amt.width() - 2; - amt.y = (TITLE_HEIGHT - amt.baseLine())/2f - 1; - PixelScene.align(amt); - add(amt); + + float titleWidth; + if (Dungeon.energy == 0) { + ItemSprite gold = new ItemSprite(ItemSpriteSheet.GOLD, null); + gold.x = width - gold.width(); + gold.y = (TITLE_HEIGHT - gold.height()) / 2f; + PixelScene.align(gold); + add(gold); + + BitmapText amt = new BitmapText(Integer.toString(Dungeon.gold), PixelScene.pixelFont); + amt.hardlight(TITLE_COLOR); + amt.measure(); + amt.x = width - gold.width() - amt.width() - 1; + amt.y = (TITLE_HEIGHT - amt.baseLine()) / 2f - 1; + PixelScene.align(amt); + add(amt); + + titleWidth = amt.x; + } else { + + Image gold = Icons.get(Icons.COIN_SML); + gold.x = width - gold.width() - 0.5f; + gold.y = 0; + PixelScene.align(gold); + add(gold); + + BitmapText amt = new BitmapText(Integer.toString(Dungeon.gold), PixelScene.pixelFont); + amt.hardlight(TITLE_COLOR); + amt.measure(); + amt.x = width - gold.width() - amt.width() - 2f; + amt.y = 0; + PixelScene.align(amt); + add(amt); + + titleWidth = amt.x; + + Image energy = Icons.get(Icons.ENERGY_SML); + energy.x = width - energy.width(); + energy.y = gold.height(); + PixelScene.align(energy); + add(energy); + + amt = new BitmapText(Integer.toString(Dungeon.energy), PixelScene.pixelFont); + amt.hardlight(0x44CCFF); + amt.measure(); + amt.x = width - energy.width() - amt.width() - 1; + amt.y = energy.y; + PixelScene.align(amt); + add(amt); + + titleWidth = Math.min(titleWidth, amt.x); + } String title = selector != null ? selector.textPrompt() : null; RenderedTextBlock txtTitle = PixelScene.renderTextBlock( title != null ? Messages.titleCase(title) : Messages.titleCase( bag.name() ), 8 ); txtTitle.hardlight( TITLE_COLOR ); - txtTitle.maxWidth( (int)amt.x - 2 ); + txtTitle.maxWidth( (int)titleWidth - 2 ); txtTitle.setPos( 1, (TITLE_HEIGHT - txtTitle.height()) / 2f - 1