From a3f2ab7a896da8b9688e5b140732cfef815fafe1 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 11 Jun 2024 15:35:29 -0400 Subject: [PATCH] v2.5.0: more thoroughly filled out equipment and consumable catalog tabs --- .../messages/windows/windows.properties | 4 +- .../actors/hero/HeroClass.java | 2 + .../shatteredpixeldungeon/items/Dewdrop.java | 2 + .../items/EnergyCrystal.java | 3 + .../shatteredpixeldungeon/items/Gold.java | 5 +- .../shatteredpixeldungeon/items/Item.java | 2 +- .../items/armor/Armor.java | 28 ++++- .../items/artifacts/DriedRose.java | 2 + .../items/artifacts/TimekeepersHourglass.java | 2 + .../shatteredpixeldungeon/items/keys/Key.java | 2 + .../items/weapon/Weapon.java | 30 ++++- .../journal/Catalog.java | 58 ++++++--- .../sprites/ItemSprite.java | 11 ++ .../ui/ScrollingGridPane.java | 10 +- .../windows/WndJournal.java | 113 +++++++++++++----- 15 files changed, 216 insertions(+), 58 deletions(-) diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 2658a437c..b18ff79d1 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -122,7 +122,9 @@ windows.wndjournal$notestab.landmarks=Landmarks windows.wndjournal$catalogtab.title=Catalogs windows.wndjournal$catalogtab.title_equipment=Equipment windows.wndjournal$catalogtab.title_consumables=Consumables -windows.wndjournal$catalogtab.not_seen=You haven't identified this item yet. +windows.wndjournal$catalogtab.not_seen_item=You haven't found and identified that item in any of your runs yet. +windows.wndjournal$catalogtab.not_seen_enchantment=You haven't found and identified a weapon with that enchantmet in any of your runs yet. +windows.wndjournal$catalogtab.not_seen_glyph=You haven't found and identified an armor with that glyph in any of your runs yet. windows.wndjournal$loretab.title=Documents windows.wndkeybindings.controller_info=The left stick moves your character\nThe right stick controls an on-screen pointer diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index d01d3b6cb..92bb5515f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -71,6 +71,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortswor import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingSpike; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingStone; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.watabou.utils.DeviceCompat; @@ -164,6 +165,7 @@ public enum HeroClass { if (hero.belongings.armor != null){ hero.belongings.armor.affixSeal(new BrokenSeal()); + Catalog.setSeen(BrokenSeal.class); //as it's not added to the inventory } new PotionOfHealing().identify(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java index 326c52254..fd97e50cc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -49,6 +50,7 @@ public class Dewdrop extends Item { public boolean doPickUp(Hero hero, int pos) { Waterskin flask = hero.belongings.getItem( Waterskin.class ); + Catalog.setSeen(getClass()); if (flask != null && !flask.isFull()){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java index abc428c51..94f412ac5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -54,6 +55,8 @@ public class EnergyCrystal extends Item { @Override public boolean doPickUp(Hero hero, int pos) { + Catalog.setSeen(getClass()); + Dungeon.energy += quantity; //TODO track energy collected maybe? We do already track recipes crafted though.. 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 f8934fb61..c072956f3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -57,7 +58,9 @@ public class Gold extends Item { @Override public boolean doPickUp(Hero hero, int pos) { - + + Catalog.setSeen(getClass()); + Dungeon.gold += quantity; Statistics.goldCollected += quantity; Badges.validateGoldCollected(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index 3b23365b5..0ecea366d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -268,7 +268,7 @@ public class Item implements Bundlable { } - public boolean collect() { + public final boolean collect() { return collect( Dungeon.hero.belongings.backpack ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index 044a15b2f..8cae7282c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -57,8 +57,10 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Stone; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Thorns; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; +import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana; import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.ParchmentScrap; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; @@ -201,6 +203,26 @@ public class Armor extends EquipableItem { } } + @Override + public boolean collect(Bag container) { + if(super.collect(container)){ + if (isIdentified() && glyph != null){ + Catalog.setSeen(glyph.getClass()); + } + return true; + } else { + return false; + } + } + + @Override + public Item identify(boolean byHero) { + if (glyph != null && byHero && Dungeon.hero != null && Dungeon.hero.isAlive()){ + Catalog.setSeen(glyph.getClass()); + } + return super.identify(byHero); + } + @Override public boolean doEquip( Hero hero ) { @@ -613,6 +635,10 @@ public class Armor extends EquipableItem { if (seal != null){ seal.setGlyph(glyph); } + if (isIdentified() && Dungeon.hero != null + && Dungeon.hero.isAlive() && Dungeon.hero.belongings.contains(this)){ + Catalog.setSeen(glyph.getClass()); + } return this; } @@ -660,7 +686,7 @@ public class Armor extends EquipableItem { 10 //3.33% each }; - private static final Class[] curses = new Class[]{ + public static final Class[] curses = new Class[]{ AntiEntropy.class, Corrosion.class, Displacement.class, Metabolism.class, Multiplicity.class, Stench.class, Overgrowth.class, Bulk.class }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java index 1d04e7af5..44b0ffea4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java @@ -53,6 +53,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetributio import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.AlchemyScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; @@ -489,6 +490,7 @@ public class DriedRose extends Artifact { @Override public boolean doPickUp(Hero hero, int pos) { + Catalog.setSeen(getClass()); DriedRose rose = hero.belongings.getItem( DriedRose.class ); if (rose == null){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java index 58e3e171d..5841225c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java @@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; @@ -475,6 +476,7 @@ public class TimekeepersHourglass extends Artifact { @Override public boolean doPickUp(Hero hero, int pos) { + Catalog.setSeen(getClass()); TimekeepersHourglass hourglass = hero.belongings.getItem( TimekeepersHourglass.class ); if (hourglass != null && !hourglass.cursed) { hourglass.upgrade(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java index f280d4432..4965a7640 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.keys; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.windows.WndJournal; @@ -49,6 +50,7 @@ public abstract class Key extends Item { @Override public boolean doPickUp(Hero hero, int pos) { + Catalog.setSeen(getClass()); GameScene.pickUpJournal(this, pos); WndJournal.last_index = 2; Notes.add(this); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index 3a25ec443..1726836a0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon; +import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror; @@ -58,6 +59,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstab import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Vampiric; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RunicBlade; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Scimitar; +import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -176,6 +178,26 @@ abstract public class Weapon extends KindOfWeapon { usesLeftToID = USES_TO_ID; availableUsesToID = USES_TO_ID/2f; } + + @Override + public boolean collect(Bag container) { + if(super.collect(container)){ + if (isIdentified() && enchantment != null){ + Catalog.setSeen(enchantment.getClass()); + } + return true; + } else { + return false; + } + } + + @Override + public Item identify(boolean byHero) { + if (enchantment != null && byHero && Dungeon.hero != null && Dungeon.hero.isAlive()){ + Catalog.setSeen(enchantment.getClass()); + } + return super.identify(byHero); + } @Override public float accuracyFactor(Char owner, Char target) { @@ -331,6 +353,10 @@ abstract public class Weapon extends KindOfWeapon { if (ench == null || !ench.curse()) curseInfusionBonus = false; enchantment = ench; updateQuickslot(); + if (isIdentified() && Dungeon.hero != null + && Dungeon.hero.isAlive() && Dungeon.hero.belongings.contains(this)){ + Catalog.setSeen(ench.getClass()); + } return this; } @@ -377,8 +403,8 @@ abstract public class Weapon extends KindOfWeapon { 40, //6.67% each 10 //3.33% each }; - - private static final Class[] curses = new Class[]{ + + public static final Class[] curses = new Class[]{ Annoying.class, Displacing.class, Dazzling.class, Explosive.class, Sacrificial.class, Wayward.class, Polarized.class, Friendly.class }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java index 32e4bb3ac..eafbcd23d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java @@ -25,18 +25,19 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.items.Amulet; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; import com.shatteredpixel.shatteredpixeldungeon.items.ArcaneResin; +import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; import com.shatteredpixel.shatteredpixeldungeon.items.EnergyCrystal; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.Honeypot; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.KingsCrown; import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; import com.shatteredpixel.shatteredpixeldungeon.items.TengusMask; import com.shatteredpixel.shatteredpixeldungeon.items.Torch; import com.shatteredpixel.shatteredpixeldungeon.items.Waterskin; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.bags.MagicalHolster; import com.shatteredpixel.shatteredpixeldungeon.items.bags.PotionBandolier; import com.shatteredpixel.shatteredpixeldungeon.items.bags.ScrollHolder; @@ -83,6 +84,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIc import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfToxicEssence; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CeremonialCandle; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.DarkGold; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.DwarfToken; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; import com.shatteredpixel.shatteredpixeldungeon.items.quest.GooBlob; import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard; import com.shatteredpixel.shatteredpixeldungeon.items.remains.BowFragment; @@ -104,6 +110,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.UnstableSpell; import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.TrinketCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.watabou.utils.Bundle; @@ -119,6 +126,8 @@ public enum Catalog { //EQUIPMENT MELEE_WEAPONS, ARMOR, + ENCHANTMENTS, + GLYPHS, THROWN_WEAPONS, WANDS, RINGS, @@ -140,16 +149,16 @@ public enum Catalog { SPELLS, MISC_CONSUMABLES; - private LinkedHashMap, Boolean> seen = new LinkedHashMap<>(); + private LinkedHashMap, Boolean> seen = new LinkedHashMap<>(); - public Collection> items(){ + public Collection> items(){ return seen.keySet(); } //should only be used when initializing private void addItems( Class... items){ for (Class item : items){ - seen.put((Class) item, false); + seen.put(item, false); } } @@ -186,6 +195,16 @@ public enum Catalog { THROWN_WEAPONS.addItems(Generator.Category.MIS_T4.classes); THROWN_WEAPONS.addItems(Generator.Category.MIS_T5.classes); + ENCHANTMENTS.addItems(Weapon.Enchantment.common); + ENCHANTMENTS.addItems(Weapon.Enchantment.uncommon); + ENCHANTMENTS.addItems(Weapon.Enchantment.rare); + ENCHANTMENTS.addItems(Weapon.Enchantment.curses); + + GLYPHS.addItems(Armor.Glyph.common); + GLYPHS.addItems(Armor.Glyph.uncommon); + GLYPHS.addItems(Armor.Glyph.rare); + GLYPHS.addItems(Armor.Glyph.curses); + WANDS.addItems(Generator.Category.WAND.classes); RINGS.addItems(Generator.Category.RING.classes); @@ -194,7 +213,7 @@ public enum Catalog { TRINKETS.addItems(Generator.Category.TRINKET.classes); - MISC_EQUIPMENT.addItems( SpiritBow.class, Waterskin.class, VelvetPouch.class, + MISC_EQUIPMENT.addItems(BrokenSeal.class, SpiritBow.class, Waterskin.class, VelvetPouch.class, PotionBandolier.class, ScrollHolder.class, MagicalHolster.class, Amulet.class); @@ -232,6 +251,7 @@ public enum Catalog { MISC_CONSUMABLES.addItems( Gold.class, EnergyCrystal.class, Dewdrop.class, IronKey.class, GoldenKey.class, CrystalKey.class, SkeletonKey.class, TrinketCatalyst.class, Stylus.class, Torch.class, Honeypot.class, Ankh.class, + CorpseDust.class, Embers.class, CeremonialCandle.class, DarkGold.class, DwarfToken.class, GooBlob.class, TengusMask.class, MetalShard.class, KingsCrown.class, LiquidMetal.class, ArcaneResin.class, SealShard.class, BrokenStaff.class, CloakScrap.class, BowFragment.class, BrokenHilt.class); @@ -253,6 +273,8 @@ public enum Catalog { static { equipmentCatalogs.add(MELEE_WEAPONS); equipmentCatalogs.add(ARMOR); + equipmentCatalogs.add(ENCHANTMENTS); + equipmentCatalogs.add(GLYPHS); equipmentCatalogs.add(THROWN_WEAPONS); equipmentCatalogs.add(WANDS); equipmentCatalogs.add(RINGS); @@ -277,7 +299,7 @@ public enum Catalog { consumableCatalogs.add(MISC_CONSUMABLES); } - public static boolean isSeen(Class itemClass){ + public static boolean isSeen(Class itemClass){ for (Catalog cat : values()) { if (cat.seen.containsKey(itemClass)) { return cat.seen.get(itemClass); @@ -286,10 +308,10 @@ public enum Catalog { return false; } - public static void setSeen(Class itemClass){ + public static void setSeen(Class cls){ for (Catalog cat : values()) { - if (cat.seen.containsKey(itemClass) && !cat.seen.get(itemClass)) { - cat.seen.put(itemClass, true); + if (cat.seen.containsKey(cls) && !cat.seen.get(cls)) { + cat.seen.put(cls, true); Journal.saveNeeded = true; } } @@ -305,15 +327,15 @@ public enum Catalog { ArrayList seen = new ArrayList<>(); //if we have identified all items of a set, we use the badge to keep track instead. - if (!Badges.isUnlocked(Badges.Badge.ALL_ITEMS_IDENTIFIED)) { + //if (!Badges.isUnlocked(Badges.Badge.ALL_ITEMS_IDENTIFIED)) { for (Catalog cat : values()) { - if (!Badges.isUnlocked(catalogBadges.get(cat))) { - for (Class item : cat.items()) { + //if (!Badges.isUnlocked(catalogBadges.get(cat))) { + for (Class item : cat.items()) { if (cat.seen.get(item)) seen.add(item); } - } + //} } - } + //} bundle.put( CATALOG_ITEMS, seen.toArray(new Class[0]) ); @@ -335,13 +357,13 @@ public enum Catalog { }*/ //catalog-specific badge logic - /*for (Catalog cat : values()){ + for (Catalog cat : values()){ if (Badges.isUnlocked(catalogBadges.get(cat))){ - for (Class item : cat.items()){ + for (Class item : cat.items()){ cat.seen.put(item, true); } } - }*/ + } //general save/load if (bundle.contains(CATALOG_ITEMS)) { @@ -351,7 +373,7 @@ public enum Catalog { } for (Catalog cat : values()) { - for (Class item : cat.items()) { + for (Class item : cat.items()) { if (seenClasses.contains(item)) { cat.seen.put(item, true); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSprite.java index 3cf597a44..02b124fa9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSprite.java @@ -38,6 +38,7 @@ import com.watabou.glwrap.Matrix; import com.watabou.glwrap.Vertexbuffer; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; +import com.watabou.noosa.Image; import com.watabou.noosa.MovieClip; import com.watabou.noosa.NoosaScript; import com.watabou.noosa.audio.Sample; @@ -125,6 +126,16 @@ public class ItemSprite extends MovieClip { } } + @Override + public void copy(Image other) { + super.copy(other); + + if (other instanceof ItemSprite && ((ItemSprite) other).glowing != null){ + glow(((ItemSprite) other).glowing); + } + + } + public void visible(boolean value){ this.visible = value; if (emitter != null && !visible){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollingGridPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollingGridPane.java index b7a99c85c..6d60c86af 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollingGridPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollingGridPane.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.watabou.noosa.ColorBlock; import com.watabou.noosa.Image; import com.watabou.noosa.ui.Component; @@ -112,7 +113,13 @@ public class ScrollingGridPane extends ScrollPane { public GridItem( Image icon ) { super(); + if (icon instanceof ItemSprite){ + this.icon = new ItemSprite(); + } else { + this.icon = new Image(); + } this.icon.copy(icon); + add(this.icon); } public void addSecondIcon( Image icon ){ @@ -133,9 +140,6 @@ public class ScrollingGridPane extends ScrollPane { protected void createChildren() { bg = new ColorBlock( 1, 1, 0x9953564D); add(bg); - - icon = new Image(); - add( icon ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java index a0c8112a2..cee386150 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java @@ -25,10 +25,12 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; @@ -556,52 +558,101 @@ public class WndJournal extends WndTabbed { } - private static void addGridItems( ScrollingGridPane grid, Collection> itemClasses) { - for (Class itemClass : itemClasses) { - Item item = Reflection.newInstance(itemClass); - boolean itemSeen = Catalog.isSeen(itemClass); + private static void addGridItems( ScrollingGridPane grid, Collection> classes) { + for (Class itemClass : classes) { - if (itemSeen) { - if (item instanceof Ring) { - ((Ring) item).anonymize(); - } else if (item instanceof Potion) { - ((Potion) item).anonymize(); - } else if (item instanceof Scroll) { - ((Scroll) item).anonymize(); + boolean seen = Catalog.isSeen(itemClass);; + Image sprite = null; + Image secondIcon = null; + String title = ""; + String desc = ""; + + if (Item.class.isAssignableFrom(itemClass)) { + + Item item = (Item) Reflection.newInstance(itemClass); + + if (seen) { + if (item instanceof Ring) { + ((Ring) item).anonymize(); + } else if (item instanceof Potion) { + ((Potion) item).anonymize(); + } else if (item instanceof Scroll) { + ((Scroll) item).anonymize(); + } } + + sprite = new ItemSprite(item.image, seen ? item.glowing() : null); + if (!seen) { + sprite.lightness(0); + title = "???"; + desc = Messages.get(CatalogTab.class, "not_seen_item"); + } else { + title = Messages.titleCase(item.trueName()); + desc = item instanceof ClassArmor ? item.desc() : item.info(); + + if (item.icon != -1) { + secondIcon = new Image(Assets.Sprites.ITEM_ICONS); + secondIcon.frame(ItemSpriteSheet.Icons.film.get(item.icon)); + } + } + + } else if (Weapon.Enchantment.class.isAssignableFrom(itemClass)){ + + Weapon.Enchantment ench = (Weapon.Enchantment) Reflection.newInstance(itemClass); + + if (seen){ + sprite = new ItemSprite(ItemSpriteSheet.WORN_SHORTSWORD, ench.glowing()); + title = Messages.titleCase(ench.name()); + desc = ench.desc(); + } else { + sprite = new ItemSprite(ItemSpriteSheet.WORN_SHORTSWORD); + sprite.lightness(0f); + title = "???"; + desc = Messages.get(CatalogTab.class, "not_seen_enchantment"); + } + + } else if (Armor.Glyph.class.isAssignableFrom(itemClass)){ + + Armor.Glyph glyph = (Armor.Glyph) Reflection.newInstance(itemClass); + + if (seen){ + sprite = new ItemSprite(ItemSpriteSheet.ARMOR_CLOTH, glyph.glowing()); + title = Messages.titleCase(glyph.name()); + desc = glyph.desc(); + } else { + sprite = new ItemSprite(ItemSpriteSheet.ARMOR_CLOTH); + sprite.lightness(0f); + title = "???"; + desc = Messages.get(CatalogTab.class, "not_seen_glyph"); + } + } - Image sprite = new ItemSprite(item); - if (!itemSeen) sprite.lightness(0); - ScrollingGridPane.GridItem gridItem = new ScrollingGridPane.GridItem( - sprite) { + String finalTitle = title; + String finalDesc = desc; + ScrollingGridPane.GridItem gridItem = new ScrollingGridPane.GridItem(sprite) { @Override public boolean onClick(float x, float y) { if (inside(x, y)) { - Image sprite = new Image(icon); - if (itemSeen) { - GameScene.show(new WndTitledMessage(sprite, - Messages.titleCase(item.trueName()), - item instanceof ClassArmor ? item.desc() : item.info())); + //TODO need to dupe! + Image sprite; + if (icon instanceof ItemSprite){ + sprite = new ItemSprite(); + sprite.copy(icon); } else { - sprite.lightness(0); - GameScene.show(new WndTitledMessage(sprite, - "???", - Messages.get(CatalogTab.class, "not_seen"))); + sprite = new Image(icon); } + GameScene.show(new WndTitledMessage(sprite, finalTitle, finalDesc)); return true; } else { return false; } } }; - if (itemSeen) { - if (item.icon != -1) { - Image icon = new Image(Assets.Sprites.ITEM_ICONS); - icon.frame(ItemSpriteSheet.Icons.film.get(item.icon)); - gridItem.addSecondIcon(icon); - } - } else { + if (secondIcon != null){ + gridItem.addSecondIcon(secondIcon); + } + if (!seen) { gridItem.hardLightBG(2f, 1f, 2f); } grid.addItem(gridItem);