From fc3cbf395a4bdccf096eec542a555f345f710bdb Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 12 Mar 2024 14:51:10 -0400 Subject: [PATCH] v2.4.0: the rat skull finally returns as the game's first trinket --- .../assets/messages/items/items.properties | 3 + core/src/main/assets/sprites/items.png | Bin 22367 -> 22387 bytes .../actors/mobs/Bestiary.java | 4 +- .../actors/mobs/Elemental.java | 4 +- .../actors/mobs/Piranha.java | 4 +- .../actors/mobs/Statue.java | 5 +- .../actors/mobs/Wraith.java | 4 +- .../shatteredpixeldungeon/items/Recipe.java | 4 +- .../items/{quest => trinkets}/RatSkull.java | 39 +++++++----- .../items/trinkets/Trinket.java | 57 ++++++++++++++++++ .../items/trinkets/TrinketCatalyst.java | 2 + .../rooms/special/CrystalVaultRoom.java | 5 +- .../sprites/ItemSpriteSheet.java | 10 +-- .../ui/changelist/v2_X_Changes.java | 2 +- 14 files changed, 116 insertions(+), 27 deletions(-) rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/{quest => trinkets}/RatSkull.java (58%) diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index c30a7b924..e8ae8f711 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1291,6 +1291,9 @@ items.stones.stoneofshock.desc=This runestone unleashes a blast of electrical en ###trinkets +items.trinkets.ratskull.name=rat skull +items.trinkets.ratskull.desc=This macabre trinket isn't much larger than the skull of a normal rat, which is somehow a rarity down in this dungeon. The skull's magical influence seems to attract the more rare denizens of the dungeon, making them appear far more often.\n\nAt its current level it will make rare exotic enemies _%dx_ as likely to appear. The skull is only half as effective at attracting crystal mimics and armored statues, however. + items.trinkets.trinketcatalyst.name=trinket catalyst items.trinkets.trinketcatalyst.window_text=The water begins to glow as you use the catalyst. There are a few nearby items you could imbue with magical energy. items.trinkets.trinketcatalyst.desc=TODO diff --git a/core/src/main/assets/sprites/items.png b/core/src/main/assets/sprites/items.png index a7a9ad0355ebdcc127478d0c20f9cffdda1423a1..da78b405fdb759b5793b75532fa4ce3816429775 100644 GIT binary patch delta 21371 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�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 delta 21313 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 EAKEw8fB*mh diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index 96156acc4..315337c1f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.watabou.utils.Random; import java.util.ArrayList; @@ -211,8 +212,9 @@ public class Bestiary { //switches out regular mobs for their alt versions when appropriate private static void swapMobAlts(ArrayList> rotation){ + float altChance = 1/50f * RatSkull.exoticChanceMultiplier(); for (int i = 0; i < rotation.size(); i++){ - if (Random.Int( 50 ) == 0) { + if (Random.Float() < altChance) { Class cl = rotation.get(i); if (cl == Rat.class) { cl = Albino.class; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java index f0b5df22d..27467a3e0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java @@ -44,6 +44,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlam import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.items.wands.CursedWand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -561,7 +562,8 @@ public abstract class Elemental extends Mob { } public static Class random(){ - if (Random.Int( 50 ) == 0){ + float altChance = 1/50f * RatSkull.exoticChanceMultiplier(); + if (Random.Float() < altChance){ return ChaosElemental.class; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Piranha.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Piranha.java index 630b9b1ba..1bc33cc8b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Piranha.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Piranha.java @@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.BlobImmunity; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.sprites.PiranhaSprite; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -197,7 +198,8 @@ public class Piranha extends Mob { } public static Piranha random(){ - if (Random.Int(50) == 0){ + float altChance = 1/50f * RatSkull.exoticChanceMultiplier(); + if (Random.Float() < altChance){ return new PhantomPiranha(); } else { return new Piranha(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java index c0ab7e3fe..c1f4ff515 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Statue.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon.Enchantment; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; @@ -194,7 +195,9 @@ public class Statue extends Mob { public static Statue random( boolean useDecks ){ Statue statue; - if (Random.Int(10) == 0){ + float altChance = 1/10f * RatSkull.exoticChanceMultiplier(); + if (altChance > 0.1f) altChance = (altChance+0.1f)/2f; //rat skull is 1/2 as effective here + if (Random.Float() < altChance){ statue = new ArmoredStatue(); } else { statue = new Statue(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java index 3163110b9..04f195cbe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Wraith.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ChallengeParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.WraithSprite; import com.watabou.noosa.tweeners.AlphaTweener; @@ -116,7 +117,8 @@ public class Wraith extends Mob { Wraith w; //if no wraith type is specified, 1/100 chance for exotic, otherwise normal if (wraithClass == null){ - if (Random.Int(100) == 0){ + float altChance = 1/100f * RatSkull.exoticChanceMultiplier(); + if (Random.Float() < altChance){ w = new TormentedSpirit(); } else { w = new Wraith(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java index 428e56e16..23429a103 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -55,6 +55,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.SummonElemental; import com.shatteredpixel.shatteredpixeldungeon.items.spells.TelekineticGrab; import com.shatteredpixel.shatteredpixeldungeon.items.spells.UnstableSpell; import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.Trinket; import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.TrinketCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; @@ -191,7 +192,8 @@ public abstract class Recipe { new TelekineticGrab.Recipe(), new SummonElemental.Recipe(), new StewedMeat.oneMeat(), - new TrinketCatalyst.Recipe() + new TrinketCatalyst.Recipe(), + new Trinket.UpgradeTrinket() }; private static Recipe[] twoIngredientRecipes = new Recipe[]{ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/RatSkull.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java similarity index 58% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/RatSkull.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java index 41541c900..af6fbde79 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/RatSkull.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java @@ -19,28 +19,37 @@ * along with this program. If not, see */ -package com.shatteredpixel.shatteredpixeldungeon.items.quest; +package com.shatteredpixel.shatteredpixeldungeon.items.trinkets; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -//this one's still hanging around to support quests from old saves -//I may reuse it at some point. -public class RatSkull extends Item { - +public class RatSkull extends Trinket { + { - image = ItemSpriteSheet.SKULL; - - unique = true; + image = ItemSpriteSheet.RAT_SKULL; } - + @Override - public boolean isUpgradable() { - return false; + protected int upgradeEnergyCost() { + return 5 + 10*level(); } - + @Override - public boolean isIdentified() { - return true; + public String desc() { + return Messages.get(this, "desc", (int)(exoticChanceMultiplier(buffedLvl()))); } + + public static float exoticChanceMultiplier(){ + return exoticChanceMultiplier(trinketLevel(RatSkull.class)); + } + + public static float exoticChanceMultiplier( int level ){ + if (level == -1){ + return 1f; + } else { + return 2f + 2f*level; + } + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/Trinket.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/Trinket.java index af0629599..a8d68e49a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/Trinket.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/Trinket.java @@ -21,11 +21,21 @@ package com.shatteredpixel.shatteredpixeldungeon.items.trinkets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import java.util.ArrayList; + public abstract class Trinket extends Item { + { + levelKnown = true; + + unique = true; + } + @Override public boolean isIdentified() { return true; @@ -36,12 +46,33 @@ public abstract class Trinket extends Item { return false; } + protected abstract int upgradeEnergyCost(); + + protected static int trinketLevel(Class trinketType ){ + if (Dungeon.hero == null || Dungeon.hero.belongings == null){ + return -1; + } + + Trinket trinket = Dungeon.hero.belongings.getItem(trinketType); + + if (trinket != null){ + return trinket.buffedLvl(); + } else { + return -1; + } + } + public static class PlaceHolder extends Trinket { { image = ItemSpriteSheet.TRINKET_HOLDER; } + @Override + protected int upgradeEnergyCost() { + return 0; + } + @Override public boolean isSimilar(Item item) { return item instanceof Trinket; @@ -53,4 +84,30 @@ public abstract class Trinket extends Item { } } + + public static class UpgradeTrinket extends Recipe { + + @Override + public boolean testIngredients(ArrayList ingredients) { + return ingredients.size() == 1 && ingredients.get(0) instanceof Trinket && ingredients.get(0).level() < 3; + } + + @Override + public int cost(ArrayList ingredients) { + return ((Trinket)ingredients.get(0)).upgradeEnergyCost(); + } + + @Override + public Item brew(ArrayList ingredients) { + Item result = ingredients.get(0).duplicate(); + ingredients.get(0).quantity(0); + result.upgrade(); + return result; + } + + @Override + public Item sampleOutput(ArrayList ingredients) { + return ingredients.get(0).duplicate().upgrade(); + } + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java index e957d25ac..d922b2ddb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java @@ -44,6 +44,8 @@ public class TrinketCatalyst extends Item { { image = ItemSpriteSheet.ARCANE_RESIN; + + unique = true; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalVaultRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalVaultRoom.java index fa1d5a259..d4af2d1ac 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalVaultRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalVaultRoom.java @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.RatSkull; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; @@ -70,7 +71,9 @@ public class CrystalVaultRoom extends SpecialRoom { } while (level.adjacent(i1Pos, doorPos) || level.adjacent(i2Pos, doorPos)); level.drop( i1, i1Pos ).type = Heap.Type.CRYSTAL_CHEST; - if (Random.Int(10) == 0){ + float altChance = 1/10f * RatSkull.exoticChanceMultiplier(); + if (altChance > 0.1f) altChance = (altChance+0.1f)/2f; //rat skull is 1/2 as effective here + if (Random.Float() < altChance){ level.mobs.add(Mimic.spawnAt(i2Pos, CrystalMimic.class, i2)); } else { level.drop(i2, i2Pos).type = Heap.Type.CRYSTAL_CHEST; 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 e84e8885e..7a659c740 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -418,7 +418,7 @@ public class ItemSpriteSheet { assignItemRect(i, 8, 10); } - private static final int ARTIFACTS = xy(1, 16); //32 slots + private static final int ARTIFACTS = xy(1, 16); //24 slots public static final int ARTIFACT_CLOAK = ARTIFACTS+0; public static final int ARTIFACT_ARMBAND = ARTIFACTS+1; public static final int ARTIFACT_CAPE = ARTIFACTS+2; @@ -468,7 +468,11 @@ public class ItemSpriteSheet { assignItemRect(ARTIFACT_ROSE3, 14, 14); } - //16 free slots + private static final int TRINKETS = xy(9, 17); //24 slots + public static final int RAT_SKULL = TRINKETS+0; + static{ + assignItemRect(RAT_SKULL, 16, 11); + } private static final int SCROLLS = xy(1, 19); //16 slots public static final int SCROLL_KAUNAN = SCROLLS+0; @@ -694,7 +698,6 @@ public class ItemSpriteSheet { } private static final int QUEST = xy(1, 30); //16 slots - public static final int SKULL = QUEST+0; public static final int DUST = QUEST+1; public static final int CANDLE = QUEST+2; public static final int EMBER = QUEST+3; @@ -704,7 +707,6 @@ public class ItemSpriteSheet { public static final int BLOB = QUEST+7; public static final int SHARD = QUEST+8; static{ - assignItemRect(SKULL, 16, 11); assignItemRect(DUST, 12, 11); assignItemRect(CANDLE, 12, 12); assignItemRect(EMBER, 12, 11); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java index ff288f7e2..fa6be2a9a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java @@ -63,7 +63,7 @@ public class v2_X_Changes { "\n" + "I'd like to try and release v2.4.0 fairly quickly to put us onto a good pace for 2024, but we'll see how well that actually turns out. Expect to hear something from me one way or another later in early to mid March. Please keep in mind that while I always try to keep to the ETAs I provide, they are just estimates. If you don't hear from me by the ETA, it means I'm still busy with the update!")); - changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.SKULL), "Trinkets", + changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.RAT_SKULL), "Trinkets", "Trinkets are a new item type that are more about tweaking gameplay variables than giving direct power or utility. You'll be able to get one trinket per run (with some choice), which will change up the game slightly with effects such as increasing rare enemy spawn rates or making enchantments and curses more likely. Trinkets will be upgradeable via alchemical energy, increasing the strength of their effect.")); changes.addButton( new ChangeButton(Icons.get(Icons.PREFS), "Smaller Changes/Fixes",