From 4071a47a5612e5cc0744f1dbcafe7c335603bdc8 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 3 Jul 2024 21:37:55 -0400 Subject: [PATCH] v2.5.0: finished custom note functionality! --- .../src/main/assets/messages/ui/ui.properties | 16 +- .../messages/windows/windows.properties | 2 +- .../items/EquipableItem.java | 18 +- .../shatteredpixeldungeon/items/Item.java | 12 + .../items/potions/Potion.java | 6 + .../items/rings/Ring.java | 3 +- .../items/scrolls/Scroll.java | 6 + .../shatteredpixeldungeon/journal/Notes.java | 51 +++- .../scenes/PixelScene.java | 4 +- .../ui/CustomNoteButton.java | 222 +++++++++++++++++- .../shatteredpixeldungeon/windows/WndBag.java | 11 +- .../windows/WndJournal.java | 2 +- 12 files changed, 332 insertions(+), 21 deletions(-) diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index 2b67a10e4..21d9971fb 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -1,5 +1,17 @@ -ui.customnotebutton.hover_text=Add a Custom Note -ui.customnotebutton.default_title_text=Custom Text Note +ui.customnotebutton.title=Add a Custom Note +ui.customnotebutton.limit_title=Note Limit Reached +ui.customnotebutton.limit_text=You can delete existing notes to make room for more. +ui.customnotebutton.desc=Custom Notes let you record anything you'd like in the journal.\n\nThey can be just text on its own, or they can be associated with a dungeon floor, one of your items, or a type of potion/scroll/ring. +ui.customnotebutton.new_text=New Text Note +ui.customnotebutton.new_text_title=Write a title for this custom text note: +ui.customnotebutton.new_floor=New Dungeon Floor Note +ui.customnotebutton.new_floor_prompt=Select a floor of the dungeon to associate this note with. +ui.customnotebutton.new_floor_title=Write a title for this custom note for _floor %d_: +ui.customnotebutton.new_inv=New Inventory Item Note +ui.customnotebutton.new_inv_prompt=Select a Note Item +ui.customnotebutton.new_item_title=Write a title for this custom note for the item:\n_%s_ +ui.customnotebutton.new_type=New Item Type Note +ui.customnotebutton.new_type_prompt=Select a type of item you'd like to associate this note with. ui.customnotebutton$customnotewindow.edit_title=Edit Title ui.customnotebutton$customnotewindow.add_text=Add Text ui.customnotebutton$customnotewindow.edit_text=Edit Text diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 457ce6926..e1774daa6 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -117,7 +117,7 @@ windows.wndjournal$alchemytab.title=Alchemy Guide windows.wndjournal$guidetab.missing=page missing windows.wndjournal$notestab.title=Adventuring Notes windows.wndjournal$notestab.desc=As you journey through the dungeon, you will automatically record noteworthy things here. -windows.wndjournal$notestab.custom_notes=Custom Notes +windows.wndjournal$notestab.custom_notes=Custom windows.wndjournal$notestab.floor_header=Floor %d windows.wndjournal$catalogtab.title=Catalogs windows.wndjournal$catalogtab.title_equipment=Equipment diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java index 1c29190b5..16da9d9ea 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java @@ -27,12 +27,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.journal.Guidebook; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; import java.util.ArrayList; @@ -41,6 +41,8 @@ public abstract class EquipableItem extends Item { public static final String AC_EQUIP = "EQUIP"; public static final String AC_UNEQUIP = "UNEQUIP"; + public int customNoteID = -1; + { bones = true; } @@ -157,4 +159,18 @@ public abstract class EquipableItem extends Item { } public void activate( Char ch ){} + + private static final String CUSTOM_NOTE_ID = "custom_note_id"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + if (customNoteID != -1) bundle.put(CUSTOM_NOTE_ID, customNoteID); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + if (bundle.contains(CUSTOM_NOTE_ID)) customNoteID = bundle.getInt(CUSTOM_NOTE_ID); + } } 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 a46d4c038..0cba1a87b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWea import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; +import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; @@ -502,6 +503,17 @@ public class Item implements Bundlable { public Emitter emitter() { return null; } public String info() { + + Notes.CustomRecord note; + if (this instanceof EquipableItem){ + note = Notes.findCustomRecord(((EquipableItem) this).customNoteID); + } else { + note = Notes.findCustomRecord(getClass()); + } + + if (note != null){ + return "This item has a custom note: \"_" + note.title() + "_\"\n\n" + desc(); + } return desc(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java index 7a6811844..2ca1f084f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java @@ -369,6 +369,12 @@ public class Potion extends Item { return isKnown() ? super.name() : Messages.get(this, color); } + @Override + public String info() { + //skip custom notes if anonymized and un-Ided + return (anonymous && !isIdentified()) ? super.desc() : super.info(); + } + @Override public String desc() { return isKnown() ? super.desc() : Messages.get(this, "unknown_desc"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java index 0c6e1ca89..1ab316ebf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java @@ -169,7 +169,8 @@ public class Ring extends KindofMisc { @Override public String info(){ - String desc = super.info(); + //skip custom notes if anonymized and un-Ided + String desc = (anonymous && !isIdentified()) ? super.desc() : super.info(); if (cursed && isEquipped( Dungeon.hero )) { desc += "\n\n" + Messages.get(Ring.class, "cursed_worn"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java index d83883e8c..9e9dd97b1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java @@ -230,6 +230,12 @@ public abstract class Scroll extends Item { return isKnown() ? super.name() : Messages.get(this, rune); } + @Override + public String info() { + //skip custom notes if anonymized and un-Ided + return (anonymous && !isIdentified()) ? super.desc() : super.info(); + } + @Override public String desc() { return isKnown() ? super.desc() : Messages.get(this, "unknown_desc"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java index a5d46e5dd..08151b0e8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.journal; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Foliage; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SacrificialFire; @@ -46,6 +47,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.BlacksmithSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ImpSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.RatKingSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkeeperSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SpawnerSprite; @@ -57,6 +59,7 @@ import com.watabou.noosa.Image; import com.watabou.noosa.Visual; import com.watabou.utils.Bundlable; import com.watabou.utils.Bundle; +import com.watabou.utils.Reflection; import java.util.ArrayList; import java.util.Collections; @@ -354,9 +357,8 @@ public class Notes { public enum CustomType { TEXT, - DEPTH, //TODO - ITEM, //TODO - ITEM_TYPE //TODO + DEPTH, + ITEM, } public static class CustomRecord extends Record { @@ -391,6 +393,10 @@ public class Notes { body = desc; } + public int ID(){ + return ID; + } + @Override public int depth() { if (type == CustomType.DEPTH){ @@ -407,6 +413,9 @@ public class Notes { return Icons.SCROLL_COLOR.get(); case DEPTH: return Icons.STAIRS.get(); + case ITEM: + Item i = (Item) Reflection.newInstance(itemClass); + return new ItemSprite(i); } } @@ -414,12 +423,19 @@ public class Notes { public Visual secondIcon() { switch (type){ case TEXT: default: - //TODO perhaps use first few chars from title? return null; case DEPTH: BitmapText text = new BitmapText(Integer.toString(depth()), PixelScene.pixelFont); text.measure(); return text; + case ITEM: + Item item = (Item) Reflection.newInstance(itemClass); + if (item.isIdentified() && item.icon != -1) { + Image secondIcon = new Image(Assets.Sprites.ITEM_ICONS); + secondIcon.frame(ItemSpriteSheet.Icons.film.get(item.icon)); + return secondIcon; + } + return null; } } @@ -451,6 +467,8 @@ public class Notes { private static final String TYPE = "type"; private static final String ID_NUMBER = "id_number"; + private static final String ITEM_CLASS = "item_class"; + private static final String TITLE = "title"; private static final String BODY = "body"; @@ -459,6 +477,7 @@ public class Notes { super.storeInBundle(bundle); bundle.put(TYPE, type); bundle.put(ID_NUMBER, ID); + if (itemClass != null) bundle.put(ITEM_CLASS, itemClass); bundle.put(TITLE, title); bundle.put(BODY, body); } @@ -469,6 +488,8 @@ public class Notes { type = bundle.getEnum(TYPE, CustomType.class); ID = bundle.getInt(ID_NUMBER); + if (bundle.contains(ITEM_CLASS)) itemClass = bundle.getClass(ITEM_CLASS); + title = bundle.getString(TITLE); body = bundle.getString(BODY); } @@ -584,7 +605,7 @@ public class Notes { public static ArrayList getRecords(int depth){ ArrayList filtered = new ArrayList<>(); for (Record rec : records){ - if (rec.depth() == depth){ + if (rec.depth() == depth && !(rec instanceof CustomRecord)){ filtered.add(rec); } } @@ -594,6 +615,26 @@ public class Notes { return filtered; } + public static CustomRecord findCustomRecord( int ID ){ + for (Record rec : records){ + if (rec instanceof CustomRecord && ((CustomRecord) rec).ID == ID) + return (CustomRecord) rec; + } + return null; + } + + public static CustomRecord findCustomRecord( Class itemClass ){ + for (Record rec : records){ + if (rec instanceof CustomRecord && ((CustomRecord) rec).itemClass == itemClass) + return (CustomRecord) rec; + } + return null; + } + + public static int customRecordLimit(){ + return 5; + } + private static final Comparator comparator = new Comparator() { @Override public int compare(Record r1, Record r2) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java index 1b5126ddd..0eea5cfdf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java @@ -272,7 +272,7 @@ public class PixelScene extends Scene { } } - //FIXME this system currently only works for a subset of windows + //this system only preserves windows with a public zero-arg constructor private static ArrayList> savedWindows = new ArrayList<>(); private static Class savedClass = null; @@ -294,7 +294,7 @@ public class PixelScene extends Scene { try{ add(Reflection.newInstanceUnhandled(w)); } catch (Exception e){ - //window has no public zero-arg constructor, just eat the exception + //just eat the exception } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CustomNoteButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CustomNoteButton.java index f160ec0fa..6dab1d21a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CustomNoteButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/CustomNoteButton.java @@ -22,15 +22,28 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; +import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndJournalItem; import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTextInput; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndTitledMessage; import com.watabou.noosa.Game; import com.watabou.utils.Callback; +import com.watabou.utils.Reflection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; //this is contained in its own class as custom notes have a lot of messy window UI logic public class CustomNoteButton extends IconButton { @@ -46,17 +59,195 @@ public class CustomNoteButton extends IconButton { protected void onClick() { super.onClick(); - //TODO we want a selection window for note type here, atm it's only plaintext notes - Notes.CustomRecord custom = new Notes.CustomRecord(Messages.get(this, "default_title_text"), ""); - Notes.add(custom); - refreshScene(custom); + if (Notes.getRecords(Notes.CustomRecord.class).size() >= Notes.customRecordLimit()){ + GameScene.show(new WndTitledMessage(Icons.INFO.get(), + Messages.get(this, "limit_title"), + Messages.get(this, "limit_text"))); + return; + } + + GameScene.show(new WndOptions(Icons.SCROLL_COLOR.get(), + Messages.get(CustomNoteButton.class, "title"), + Messages.get(CustomNoteButton.class, "desc"), + Messages.get(CustomNoteButton.class, "new_text"), + Messages.get(CustomNoteButton.class, "new_floor"), + Messages.get(CustomNoteButton.class, "new_inv"), + Messages.get(CustomNoteButton.class, "new_type")){ + @Override + protected void onSelect(int index) { + if (index == 0){ + Notes.CustomRecord custom = new Notes.CustomRecord("", ""); + addNote(custom, + Messages.get(CustomNoteButton.class, "new_text"), + Messages.get(CustomNoteButton.class, "new_text_title")); + } else if (index == 1){ + GameScene.show(new WndDepthSelect()); + } else if (index == 2){ + GameScene.selectItem(itemSelector); + } else { + GameScene.show(new WndItemtypeSelect()); + } + } + + @Override + public void hide() { + //do nothing, prevents window closing when user steps back in note creation process + } + + @Override + public void onBackPressed() { + super.hide(); //actually hide in this case + } + }); } @Override protected String hoverText() { - return Messages.get(this, "hover_text"); + return Messages.get(this, "title"); } + private class WndDepthSelect extends WndTitledMessage { + + public WndDepthSelect(){ + super(Icons.STAIRS.get(), + Messages.get(CustomNoteButton.class, "new_floor"), + Messages.get(CustomNoteButton.class, "new_floor_prompt")); + + int top = height+2; + int left = 0; + + for (int i = Statistics.deepestFloor; i > 0; i --){ + if (i % 5 == 0 && left > 0){ + left = 0; + top += 17; + } + int finalI = i; + RedButton btnDepth = new RedButton(Integer.toString(finalI)){ + @Override + protected void onClick() { + addNote(new Notes.CustomRecord(finalI, "", ""), + Messages.get(CustomNoteButton.class, "new_floor"), + Messages.get(CustomNoteButton.class, "new_floor_title", finalI)); + } + }; + btnDepth.setRect(left, top, 23, 16); + left += 24; + add(btnDepth); + } + + resize(width, top + (left == 0 ? 0 : 16)); + + } + + } + + private WndBag.ItemSelector itemSelector = new WndBag.ItemSelector() { + + @Override + public String textPrompt() { + return Messages.get(CustomNoteButton.class, "new_inv_prompt"); + } + + @Override + public boolean hideAfterSelecting() { + return false; + } + + @Override + public boolean itemSelectable(Item item) { + if (item instanceof EquipableItem){ + return ((EquipableItem) item).customNoteID == -1 + || Notes.findCustomRecord(((EquipableItem) item).customNoteID) == null; + } else { + return Notes.findCustomRecord(item.getClass()) == null; + } + } + + @Override + public void onSelect( Item item ) { + if (item != null){ + Notes.CustomRecord custom = new Notes.CustomRecord(item, "", ""); + if (item instanceof EquipableItem){ + ((EquipableItem) item).customNoteID = custom.ID(); + } + + addNote(custom, + Messages.get(CustomNoteButton.class, "new_inv"), + Messages.get(CustomNoteButton.class, "new_item_title", Messages.titleCase(item.name()))); + } + } + }; + + private static class WndItemtypeSelect extends WndTitledMessage { + + public WndItemtypeSelect() { + super(Icons.SCROLL_COLOR.get(), + Messages.get(CustomNoteButton.class, "new_type"), + Messages.get(CustomNoteButton.class, "new_type_prompt")); + + int top = height + 2; + int left = 0; + + ArrayList items = new ArrayList<>(); + for (Class potionCls : Generator.Category.POTION.classes) { + items.add((Item) Reflection.newInstance(potionCls)); + } + for (Class potionCls : Generator.Category.SCROLL.classes) { + items.add((Item) Reflection.newInstance(potionCls)); + } + for (Class potionCls : Generator.Category.RING.classes) { + items.add((Item) Reflection.newInstance(potionCls)); + } + Collections.sort(items, itemVisualcomparator); + for (Item item : items) { + ItemButton itemButton = new ItemButton(){ + @Override + protected void onClick() { + addNote(new Notes.CustomRecord(item, "", ""), + Messages.get(CustomNoteButton.class, "new_type"), + Messages.get(CustomNoteButton.class, "new_item_title", Messages.titleCase(item.name()))); + } + }; + itemButton.item(item); + itemButton.setRect(left, top, 19, 19); + add(itemButton); + + if (Notes.findCustomRecord(item.getClass()) != null){ + itemButton.slot.enable(false); + } + + left += 20; + if (left >= width - 19){ + top += 20; + left = 0; + } + } + if (left > 0){ + top += 20; + left = 0; + } + + resize(width, top); + } + } + + //items are sorted first sorted potions -> scrolls -> rings, and then based on their sprites. + private static Comparator itemVisualcomparator = new Comparator() { + @Override + public int compare(Item i1, Item i2) { + int i1Idx = i1.image(); + int i2Idx = i2.image(); + + if (i1 instanceof Scroll) i1Idx += 1000; + if (i1 instanceof Ring) i1Idx += 2000; + + if (i2 instanceof Scroll) i2Idx += 1000; + if (i2 instanceof Ring) i2Idx += 2000; + + return i1Idx - i2Idx; + } + }; + public static class CustomNoteWindow extends WndJournalItem { public CustomNoteWindow(Notes.CustomRecord rec) { @@ -74,7 +265,7 @@ public class CustomNoteButton extends IconButton { Messages.get(CustomNoteWindow.class, "cancel")){ @Override public void onSelect(boolean positive, String text) { - if (positive){ + if (positive && !text.isEmpty()){ rec.editText(text, rec.desc()); refreshScene(rec); } @@ -135,6 +326,25 @@ public class CustomNoteButton extends IconButton { } + private static void addNote(Notes.CustomRecord note, String promptTitle, String prompttext){ + GameScene.show(new WndTextInput(promptTitle, + prompttext, + "", + 50, + false, + Messages.get(CustomNoteWindow.class, "confirm"), + Messages.get(CustomNoteWindow.class, "cancel")){ + @Override + public void onSelect(boolean positive, String text) { + if (positive && !text.isEmpty()){ + Notes.add(note); + note.editText(text, ""); + refreshScene(null); + } + } + }); + } + private static void refreshScene(Notes.CustomRecord recToShow){ if (recToShow == null){ ShatteredPixelDungeon.seamlessResetScene(); 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 3f602d6c4..53ab2e8f3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -286,7 +286,9 @@ public class WndBag extends WndTabbed { } else if (selector != null) { - hide(); + if (selector.hideAfterSelecting()){ + hide(); + } selector.onSelect( item ); } else { @@ -304,7 +306,9 @@ public class WndBag extends WndTabbed { } else if (selector != null) { - hide(); + if (selector.hideAfterSelecting()){ + hide(); + } selector.onSelect( item ); } else { @@ -469,6 +473,9 @@ public class WndBag extends WndTabbed { public Class preferredBag(){ return null; //defaults to last bag opened } + public boolean hideAfterSelecting(){ + return true; //defaults to hiding the window when an item is picked + } public abstract boolean itemSelectable( Item item ); public abstract void onSelect( Item item ); } 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 aaa813a33..d937e9967 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java @@ -448,7 +448,7 @@ public class WndJournal extends WndTabbed { ArrayList customRecs = Notes.getRecords(Notes.CustomRecord.class); if (!customRecs.isEmpty()){ - grid.addHeader("_" + Messages.get(this, "custom_notes") + "_"); + grid.addHeader("_" + Messages.get(this, "custom_notes") + "_ (" + customRecs.size() + "/" + Notes.customRecordLimit() + ")"); for (Notes.CustomRecord rec : customRecs){ ScrollingGridPane.GridItem gridItem = new ScrollingGridPane.GridItem(rec.icon()){