From 12fa719716cae69f97753cf1e60fa14fdf7dfe4a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sun, 25 Jul 2021 20:41:50 -0400 Subject: [PATCH] v0.9.4: initial implementation of unblessed ankh changes, missing polish --- core/src/main/assets/interfaces/buffs.png | Bin 1308 -> 1314 bytes .../main/assets/interfaces/large_buffs.png | Bin 2723 -> 2748 bytes .../assets/messages/actors/actors.properties | 3 + .../assets/messages/items/items.properties | 3 + core/src/main/assets/sprites/items.png | Bin 19763 -> 19909 bytes .../shatteredpixeldungeon/Dungeon.java | 3 +- .../actors/buffs/LostInventory.java | 27 ++++++ .../actors/hero/Belongings.java | 71 ++++++--------- .../actors/hero/Hero.java | 82 +++++++++--------- .../items/Generator.java | 5 +- .../shatteredpixeldungeon/items/Item.java | 18 ++-- .../items/LostBackpack.java | 28 ++++++ .../shatteredpixeldungeon/items/bags/Bag.java | 11 +++ .../scenes/GameScene.java | 11 ++- .../scenes/InterlevelScene.java | 29 +++++-- .../sprites/ItemSpriteSheet.java | 12 +-- .../ui/BuffIndicator.java | 1 + .../ui/QuickSlotButton.java | 3 +- .../shatteredpixeldungeon/windows/WndBag.java | 17 ++-- .../windows/WndQuickBag.java | 8 +- .../windows/WndResurrect.java | 24 ++--- .../windows/WndUseItem.java | 5 +- 22 files changed, 215 insertions(+), 146 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/LostInventory.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java diff --git a/core/src/main/assets/interfaces/buffs.png b/core/src/main/assets/interfaces/buffs.png index f77c4ca574a3e0975b2afb6e18fa3c3b098c40c4..46508f7ba92134c0a800879f0bde39fdcbb7df7e 100644 GIT binary patch delta 1022 zcmV-TLA!(T)+g;>z!|tAORqM%}GQ-RCobokOe|SF$@LkW&OLm-2aNa zBsf#|N!15hFveIECwL(UQES0gd|Za&9W>df!sL=6ov)L zvV=f|n=2pcrfupFJ2YK%FHF8zpzk3t3?sc?B0*r9CK8zEnFW?lft3U{64;O9*nbFr zq?t-pmTHYf{(-_mK!WlY?@>a7mzxl|i4KpUNchN?aiG0O{{@z1VS#gnz{UyhQ~nmn z6ld*3z!n7z&AF?;`A^=DU)BwHS5mMNZfbYOJ2H+D24G6Dy zz$hfpwXQ)S764MLeFi{)KK%OtXj3~n(3pZ&iydI6-ZTXyAb?x-6ny#r6qxjXT{@Nq zQYHY+<1UniU4y0ESAgVVlOw^2ND24ApqB+ZGbCkkQG%>71^*D z@;W%?0)SiaFF|0lJkMt~{xAlA!FY8?t{ombpmJr6PTZ&w2+Bf#6IfB^5Gg4~?7)EL7|GAT)t7~7;kGN~^G(xKFrOlnJ0$!f_c zsf`>!7>4-!BCD`1#e*mXKqrC1fa0h91@MRm;v)e{0WeHH?(xF0CtG8?x1RuhI)K0+ z{Q>_V`3FFEhvP=wva}U{?M1CL0YMA^_kRGOM}6qR=(|@!4M2YYkN^oht)G|xzqIN9 z{0ji0*BsKnNHYDR0Nlzd6u!z@QN$~WI~@>g5-<|D4Tk<{}jNpoY(}K{p6EJmvuRNcCUchB(`K%5Az#jqpD!2HkP sYEHqQ2@Eh8b-<_tMjbHffKdkk05i!~@b5`7e*gdg07*qoM6N<$g6%QBHUIzs delta 1016 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 delta 2446 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 literal 19763 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 { public Bag backpack; + //FIXME these need accessor methods so they can work in conjunction with the lost inventory debuff =I public KindOfWeapon weapon = null; public Armor armor = null; public Artifact artifact = null; @@ -152,10 +153,27 @@ public class Belongings implements Iterable { info.armorTier = 0; } } + + //ignores lost inventory debuff + public ArrayList getBags(){ + ArrayList result = new ArrayList<>(); + + result.add(backpack); + + for (Item i : this){ + if (i instanceof Bag){ + result.add((Bag)i); + } + } + + return result; + } @SuppressWarnings("unchecked") public T getItem( Class itemClass ) { + if (owner != null && owner.buff(LostInventory.class) != null) return null; + for (Item item : this) { if (itemClass.isInstance( item )) { return (T)item; @@ -168,6 +186,8 @@ public class Belongings implements Iterable { public ArrayList getAllItems( Class itemClass ) { ArrayList result = new ArrayList<>(); + if (owner != null && owner.buff(LostInventory.class) != null) return result; + for (Item item : this) { if (itemClass.isInstance( item )) { result.add((T) item); @@ -178,6 +198,8 @@ public class Belongings implements Iterable { } public boolean contains( Item contains ){ + + if (owner != null && owner.buff(LostInventory.class) != null) return false; for (Item item : this) { if (contains == item ) { @@ -189,6 +211,8 @@ public class Belongings implements Iterable { } public Item getSimilar( Item similar ){ + + if (owner != null && owner.buff(LostInventory.class) != null) return null; for (Item item : this) { if (similar != item && similar.isSimilar(item)) { @@ -201,6 +225,8 @@ public class Belongings implements Iterable { public ArrayList getAllSimilar( Item similar ){ ArrayList result = new ArrayList<>(); + + if (owner != null && owner.buff(LostInventory.class) != null) return result; for (Item item : this) { if (item != similar && similar.isSimilar(item)) { @@ -253,49 +279,6 @@ public class Belongings implements Iterable { return Random.element( backpack.items ); } - public void resurrect( int depth ) { - - for (Item item : backpack.items.toArray( new Item[0])) { - if (item instanceof Key) { - if (((Key)item).depth == depth) { - item.detachAll( backpack ); - } - } else if (item.unique) { - item.detachAll(backpack); - //you keep the bag itself, not its contents. - if (item instanceof Bag){ - ((Bag)item).resurrect(); - } - item.collect(); - } else if (!item.isEquipped( owner )) { - item.detachAll( backpack ); - } - } - - if (weapon != null) { - weapon.cursed = false; - weapon.activate( owner ); - } - - if (armor != null) { - armor.cursed = false; - armor.activate( owner ); - } - - if (artifact != null) { - artifact.cursed = false; - artifact.activate( owner ); - } - if (misc != null) { - misc.cursed = false; - misc.activate( owner ); - } - if (ring != null) { - ring.cursed = false; - ring.activate( owner ); - } - } - public int charge( float charge ) { int count = 0; 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 ba679631a..48882996a 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 @@ -47,6 +47,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Fury; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HoldFast; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; @@ -378,6 +379,9 @@ public class Hero extends Char { } public void live() { + for (Buff b : buffs()){ + b.detach(); + } Buff.affect( this, Regeneration.class ); Buff.affect( this, Hunger.class ); } @@ -1596,7 +1600,7 @@ public class Hero extends Char { } @Override - public void die( Object cause ) { + public void die( Object cause ) { curAction = null; @@ -1611,49 +1615,43 @@ public class Hero extends Char { } } - if (ankh != null && ankh.isBlessed()) { - this.HP = HT/4; - - PotionOfHealing.cure(this); - Buff.prolong(this, AnkhInvulnerability.class, AnkhInvulnerability.DURATION); - + if (ankh != null) { ankh.detach(belongings.backpack); - SpellSprite.show(this, SpellSprite.ANKH); - GameScene.flash(0x80FFFF40); - Sample.INSTANCE.play( Assets.Sounds.TELEPORT ); - GLog.w( Messages.get(this, "revive") ); - Statistics.ankhsUsed++; - - for (Char ch : Actor.chars()){ - if (ch instanceof DriedRose.GhostHero){ - ((DriedRose.GhostHero) ch).sayAnhk(); - return; - } - } + if (ankh.isBlessed()) { + this.HP = HT / 4; + PotionOfHealing.cure(this); + Buff.prolong(this, AnkhInvulnerability.class, AnkhInvulnerability.DURATION); + + SpellSprite.show(this, SpellSprite.ANKH); + GameScene.flash(0x80FFFF40); + Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + GLog.w(Messages.get(this, "revive")); + Statistics.ankhsUsed++; + + for (Char ch : Actor.chars()) { + if (ch instanceof DriedRose.GhostHero) { + ((DriedRose.GhostHero) ch).sayAnhk(); + return; + } + } + } else { + + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + GameScene.show( new WndResurrect() ); + } + }); + + } return; } Actor.fixTime(); super.die( cause ); - - if (ankh == null) { - - reallyDie( cause ); - - } else { - - Dungeon.deleteGame( GamesInProgress.curSlot, false ); - final Ankh finalAnkh = ankh; - Game.runOnRenderThread(new Callback() { - @Override - public void call() { - GameScene.show( new WndResurrect( finalAnkh, cause ) ); - } - }); - - } + reallyDie( cause ); } public static void reallyDie( Object cause ) { @@ -1983,15 +1981,13 @@ public class Hero extends Char { return smthFound; } - public void resurrect( int resetLevel ) { - + public void resurrect() { HP = HT; - Dungeon.gold = 0; - exp = 0; - - belongings.resurrect( resetLevel ); - live(); + + Buff.affect(this, LostInventory.class); + Buff.affect(this, Invisibility.class, 3f); + //lost inventory is dropped in interlevelscene } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index ff300d676..e28fb06b9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -231,8 +231,9 @@ public class Generator { return i; } } - - return item instanceof Bag ? Integer.MAX_VALUE : Integer.MAX_VALUE - 1; + + //items without a category-defined order are sorted based on the spritesheet + return Short.MAX_VALUE+item.image(); } static { 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 c8cf65bb5..e3a7fca4d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -181,8 +181,17 @@ public class Item implements Bundlable { return true; } + if (!container.canHold(this)){ + GLog.n( Messages.get(Item.class, "pack_full", container.name()) ); + return false; + } + ArrayList items = container.items; + if (items.contains( this )) { + return true; + } + for (Item item:items) { if (item instanceof Bag && ((Bag)item).canHold( this )) { if (collect( (Bag)item )){ @@ -190,15 +199,6 @@ public class Item implements Bundlable { } } } - - if (!container.canHold(this)){ - GLog.n( Messages.get(Item.class, "pack_full", container.name()) ); - return false; - } - - if (items.contains( this )) { - return true; - } if (stackable) { for (Item item:items) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java new file mode 100644 index 000000000..b4195d083 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java @@ -0,0 +1,28 @@ +package com.shatteredpixel.shatteredpixeldungeon.items; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.noosa.audio.Sample; + +public class LostBackpack extends Item { + + { + image = ItemSpriteSheet.BACKPACK; + + unique = true; + } + + @Override + public boolean doPickUp(Hero hero) { + if (hero.buff(LostInventory.class) != null){ + hero.buff(LostInventory.class).detach(); + } + Item.updateQuickslot(); + Sample.INSTANCE.play( Assets.Sounds.DEWDROP ); + hero.spendAndNext(TIME_TO_PICK_UP); + return true; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java index 844221344..5a34fdddd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.bags; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -140,12 +141,18 @@ public class Bag extends Item implements Iterable { bundle.put( ITEMS, items ); } + //temp variable so that bags can load contents even with lost inventory debuff + private boolean loading; + @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle( bundle ); + + loading = true; for (Bundlable item : bundle.getCollection( ITEMS )) { if (item != null) ((Item)item).collect( this ); } + loading = false; } public boolean contains( Item item ) { @@ -160,6 +167,10 @@ public class Bag extends Item implements Iterable { } public boolean canHold( Item item ){ + if (!loading && owner != null && owner.buff(LostInventory.class) != null){ + return false; + } + if (items.contains(item) || item instanceof Bag || items.size() < capacity()){ return true; } else if (item.stackable) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index cf23065b3..43b9ba7e3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -97,6 +97,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoPlant; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoTrap; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndResurrect; import com.shatteredpixel.shatteredpixeldungeon.windows.WndStory; import com.watabou.glwrap.Blending; import com.watabou.noosa.Camera; @@ -360,8 +361,9 @@ public class GameScene extends PixelScene { switch (InterlevelScene.mode) { case RESURRECT: - ScrollOfTeleportation.appear( Dungeon.hero, Dungeon.level.entrance ); - new Flare( 8, 32 ).color( 0xFFFF66, true ).show( hero, 2f ) ; + ScrollOfTeleportation.appear( Dungeon.hero, Dungeon.hero.pos ); + SpellSprite.show(Dungeon.hero, SpellSprite.ANKH); + new Flare( 5, 16 ).color( 0xFFFF00, true ).show( hero, 6f ) ; break; case RETURN: ScrollOfTeleportation.appear( Dungeon.hero, Dungeon.hero.pos ); @@ -528,6 +530,11 @@ public class GameScene extends PixelScene { fadeIn(); + //assume the hero died with an ankh + if (!Dungeon.hero.isAlive()){ + add(new WndResurrect()); + } + } public void destroy() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java index 59a1467d1..a76583d96 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.items.LostBackpack; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom; @@ -40,6 +41,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.shatteredpixel.shatteredpixeldungeon.windows.WndError; import com.shatteredpixel.shatteredpixeldungeon.windows.WndStory; import com.watabou.gltextures.TextureCache; @@ -439,19 +441,32 @@ public class InterlevelScene extends PixelScene { } } - private void resurrect() throws IOException { + private void resurrect() { Mob.holdAllies( Dungeon.level ); - + + Level level; if (Dungeon.level.locked) { - Dungeon.hero.resurrect( Dungeon.depth ); + Dungeon.hero.resurrect(); Dungeon.depth--; - Level level = Dungeon.newLevel(); - Dungeon.switchLevel( level, level.entrance ); + level = Dungeon.newLevel(); + Dungeon.hero.pos = level.randomRespawnCell(Dungeon.hero); + level.drop(new LostBackpack(), level.randomRespawnCell(null)); } else { - Dungeon.hero.resurrect( -1 ); - Dungeon.resetLevel(); + Dungeon.hero.resurrect(); + level = Dungeon.level; + BArray.setFalse(level.visited); + BArray.setFalse(level.mapped); + int invPos = Dungeon.hero.pos; + int tries = 0; + do { + Dungeon.hero.pos = level.randomRespawnCell(Dungeon.hero); + tries++; + } while (level.trueDistance(invPos, Dungeon.hero.pos) <= 30 - (tries/10)); + level.drop(new LostBackpack(), invPos); } + + Dungeon.switchLevel( level, Dungeon.hero.pos ); } private void reset() throws IOException { 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 9c7d5f301..5bb15928b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -673,13 +673,15 @@ public class ItemSpriteSheet { private static final int BAGS = xy(1, 31); //16 slots public static final int WATERSKIN = BAGS+0; - public static final int POUCH = BAGS+1; - public static final int HOLDER = BAGS+2; - public static final int BANDOLIER = BAGS+3; - public static final int HOLSTER = BAGS+4; - public static final int VIAL = BAGS+5; + public static final int BACKPACK = BAGS+1; + public static final int POUCH = BAGS+2; + public static final int HOLDER = BAGS+3; + public static final int BANDOLIER = BAGS+4; + public static final int HOLSTER = BAGS+5; + public static final int VIAL = BAGS+6; static{ assignItemRect(WATERSKIN, 16, 14); + assignItemRect(BACKPACK, 16, 16); assignItemRect(POUCH, 14, 15); assignItemRect(HOLDER, 16, 16); assignItemRect(BANDOLIER, 15, 16); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index d5b799d09..862aae58c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -99,6 +99,7 @@ public class BuffIndicator extends Component { public static final int UPGRADE = 50; public static final int MOMENTUM = 51; public static final int ANKH = 52; + public static final int NOINV = 53; public static final int SIZE = 7; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java index 7735e1e65..f5c42d60b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -215,7 +216,7 @@ public class QuickSlotButton extends Button { } private void enableSlot() { - slot.enable(Dungeon.quickslot.isNonePlaceholder( slotNum )); + slot.enable(Dungeon.quickslot.isNonePlaceholder( slotNum ) && Dungeon.hero.buff(LostInventory.class) == null); } public static void useTargeting(int idx){ 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 345f5a29a..f10d65aa5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; @@ -129,15 +130,7 @@ public class WndBag extends WndTabbed { resize( windowWidth, windowHeight ); - Belongings stuff = Dungeon.hero.belongings; - Bag[] bags = { - stuff.backpack, - stuff.getItem( VelvetPouch.class ), - stuff.getItem( ScrollHolder.class ), - stuff.getItem( PotionBandolier.class ), - stuff.getItem( MagicalHolster.class )}; - - for (Bag b : bags) { + for (Bag b : Dungeon.hero.belongings.getBags()) { if (b != null) { BagTab tab = new BagTab( b ); add( tab ); @@ -393,8 +386,10 @@ public class WndBag extends WndTabbed { if (item.name() == null) { enable( false ); - } else if (selector != null) { - enable(selector.itemSelectable(item)); + } else if (selector != null && !selector.itemSelectable(item)) { + enable(false); + } else if (Dungeon.hero.buff(LostInventory.class) != null){ + enable(false); } } else { bg.color( NORMAL ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndQuickBag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndQuickBag.java index 69539405a..acbfa8f72 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndQuickBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndQuickBag.java @@ -3,7 +3,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.QuickSlot; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; @@ -198,6 +198,10 @@ public class WndQuickBag extends Window { } } + if (Dungeon.hero.buff(LostInventory.class) != null){ + enable(false); //TODO enable when hero has selected this item to keep + } + } else { bg.color(NORMAL); } @@ -215,7 +219,7 @@ public class WndQuickBag extends Window { @Override protected void onClick() { - if (Dungeon.hero == null || !Dungeon.hero.isAlive()){ + if (Dungeon.hero == null || !Dungeon.hero.isAlive() || !Dungeon.hero.belongings.contains(item)){ Game.scene().addToFront(new WndUseItem(WndQuickBag.this, item)); return; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndResurrect.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndResurrect.java index 310976c49..427fa1495 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndResurrect.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndResurrect.java @@ -21,10 +21,12 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Rankings; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; +import com.shatteredpixel.shatteredpixeldungeon.items.LostBackpack; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; @@ -41,14 +43,14 @@ public class WndResurrect extends Window { private static final float GAP = 2; public static WndResurrect instance; - public static Object causeOfDeath; - public WndResurrect( final Ankh ankh, Object causeOfDeath ) { + public WndResurrect() { super(); instance = this; - WndResurrect.causeOfDeath = causeOfDeath; + + Ankh ankh = new Ankh(); IconTitle titlebar = new IconTitle(); titlebar.icon( new ItemSprite( ankh.image(), null ) ); @@ -56,7 +58,7 @@ public class WndResurrect extends Window { titlebar.setRect( 0, 0, WIDTH, 0 ); add( titlebar ); - RenderedTextBlock message = PixelScene.renderTextBlock( Messages.get(this, "message"), 6 ); + RenderedTextBlock message = PixelScene.renderTextBlock( "TODO, need to add item selection here. Atm we just revive and all equipped items work", 6 ); message.maxWidth(WIDTH); message.setPos(0, titlebar.bottom() + GAP); add( message ); @@ -74,20 +76,8 @@ public class WndResurrect extends Window { }; btnYes.setRect( 0, message.top() + message.height() + GAP, WIDTH, BTN_HEIGHT ); add( btnYes ); - - RedButton btnNo = new RedButton( Messages.get(this, "no") ) { - @Override - protected void onClick() { - hide(); - Hero.reallyDie( WndResurrect.causeOfDeath ); - Rankings.INSTANCE.submit( false, WndResurrect.causeOfDeath.getClass() ); - } - }; - btnNo.setRect( 0, btnYes.bottom() + GAP, WIDTH, BTN_HEIGHT ); - add( btnNo ); - - resize( WIDTH, (int)btnNo.bottom() ); + resize( WIDTH, (int)btnYes.bottom() ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java index b512af2b9..17ba3004e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java @@ -38,9 +38,10 @@ public class WndUseItem extends WndInfoItem { super(item); - float y = height + GAP; + float y = height; - if (Dungeon.hero.isAlive()) { + if (Dungeon.hero.isAlive() && Dungeon.hero.belongings.contains(item)) { + y += GAP; ArrayList buttons = new ArrayList<>(); for (final String action : item.actions( Dungeon.hero )) {