v3.3.0: implemented basic inventory storage/retrieval for the new quest

This commit is contained in:
Evan Debenham
2025-11-12 17:09:45 -05:00
parent 6bd2b4dff6
commit 5964a2d32c
6 changed files with 91 additions and 6 deletions

View File

@@ -69,6 +69,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.VaultLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition; import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
@@ -360,6 +361,12 @@ public class Dungeon {
case 14: case 14:
level = new MiningLevel(); level = new MiningLevel();
break; break;
case 16:
case 17:
case 18:
case 19:
level = new VaultLevel();
break;
default: default:
level = new DeadEndLevel(); level = new DeadEndLevel();
} }

View File

@@ -184,9 +184,11 @@ public class Belongings implements Iterable<Item> {
bundle.put( RING, ring ); bundle.put( RING, ring );
bundle.put( SECOND_WEP, secondWep ); bundle.put( SECOND_WEP, secondWep );
} }
public static boolean bundleRestoring = false;
public void restoreFromBundle( Bundle bundle ) { public void restoreFromBundle( Bundle bundle ) {
bundleRestoring = true;
backpack.clear(); backpack.clear();
backpack.restoreFromBundle( bundle ); backpack.restoreFromBundle( bundle );
@@ -207,6 +209,18 @@ public class Belongings implements Iterable<Item> {
secondWep = (KindOfWeapon) bundle.get(SECOND_WEP); secondWep = (KindOfWeapon) bundle.get(SECOND_WEP);
if (secondWep() != null) secondWep().activate(owner); if (secondWep() != null) secondWep().activate(owner);
bundleRestoring = false;
}
public void clear(){
//TODO probably more needed here, what about buffs from these items? e.g. chargers
backpack.clear();
weapon = secondWep = null;
armor = null;
artifact = null;
misc = null;
ring = null;
} }
public static void preview( GamesInProgress.Info info, Bundle bundle ) { public static void preview( GamesInProgress.Info info, Bundle bundle ) {

View File

@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -612,8 +613,8 @@ public class Item implements Bundlable {
cursed = bundle.getBoolean( CURSED ); cursed = bundle.getBoolean( CURSED );
//only want to populate slot on first load. //only want to populate slots when restoring belongings
if (Dungeon.hero == null) { if (Belongings.bundleRestoring) {
if (bundle.contains(QUICKSLOT)) { if (bundle.contains(QUICKSLOT)) {
Dungeon.quickslot.setSlot(bundle.getInt(QUICKSLOT), this); Dungeon.quickslot.setSlot(bundle.getInt(QUICKSLOT), this);
} }

View File

@@ -30,8 +30,10 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.VaultLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition; import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
@@ -65,6 +67,8 @@ public class EscapeCrystal extends Item {
Sample.INSTANCE.play(Assets.Sounds.TELEPORT); Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
restoreHeroBelongings(hero);
Level.beforeTransition(); Level.beforeTransition();
InterlevelScene.curTransition = new LevelTransition(Dungeon.level, InterlevelScene.curTransition = new LevelTransition(Dungeon.level,
hero.pos, hero.pos,
@@ -82,6 +86,46 @@ public class EscapeCrystal extends Item {
} }
public static String BELONGINGS = "belongings";
public static String QUICKSLOTS = "quickslots";
public static String GOLD = "gold";
public static String ENERGY = "energy";
public void storeHeroBelongings( Hero hero ){
storedItems = new Bundle();
Bundle belongings = new Bundle();
hero.belongings.storeInBundle(belongings);
storedItems.put(BELONGINGS, belongings);
Bundle quickslots = new Bundle();
Dungeon.quickslot.storePlaceholders(quickslots);
storedItems.put(QUICKSLOTS, quickslots);
storedItems.put(GOLD, Dungeon.gold);
storedItems.put(ENERGY, Dungeon.energy);
Dungeon.quickslot.reset();
QuickSlotButton.reset();
Dungeon.gold = Dungeon.energy = 0;
hero.belongings.clear();
}
public void restoreHeroBelongings( Hero hero ){
hero.belongings.clear();
Dungeon.quickslot.reset();
Dungeon.quickslot.restorePlaceholders(storedItems.getBundle(QUICKSLOTS));
QuickSlotButton.reset();
Dungeon.hero.belongings.restoreFromBundle(storedItems.getBundle(BELONGINGS));
Dungeon.gold = storedItems.getInt(GOLD);
Dungeon.energy = storedItems.getInt(ENERGY);
storedItems = null;
}
@Override @Override
public boolean isUpgradable() { public boolean isUpgradable() {
return false; return false;
@@ -92,4 +136,19 @@ public class EscapeCrystal extends Item {
return true; return true;
} }
public Bundle storedItems;
public static String STORED_ITEMS = "stored_items";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(STORED_ITEMS, storedItems);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
storedItems = bundle.getBundle(STORED_ITEMS);
}
} }

View File

@@ -27,6 +27,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.EscapeCrystal;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition; import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CityPainter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CityPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@@ -148,6 +150,11 @@ public class CityLevel extends RegularLevel {
@Override @Override
protected void onSelect(int index) { protected void onSelect(int index) {
if (index == 0){ if (index == 0){
EscapeCrystal crystal = new EscapeCrystal();
crystal.storeHeroBelongings(Dungeon.hero);
crystal.collect();
Dungeon.hero.belongings.armor = new ClothArmor();
Dungeon.hero.belongings.armor.identify();
CityLevel.super.activateTransition(hero, transition); CityLevel.super.activateTransition(hero, transition);
} }
} }

View File

@@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.EscapeCrystal;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition; import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition;
public class VaultLevel extends DeadEndLevel { //for now public class VaultLevel extends DeadEndLevel { //for now
@@ -49,8 +48,6 @@ public class VaultLevel extends DeadEndLevel { //for now
int entrance = 5 * width() + 5 / 2 + 1; int entrance = 5 * width() + 5 / 2 + 1;
map[entrance] = Terrain.WATER; //override entrance tile map[entrance] = Terrain.WATER; //override entrance tile
drop(new EscapeCrystal(), entrance - 2*width);
return true; return true;
} }