v2.4.0: trinket selection window now remembers trinkets if game is quit

This commit is contained in:
Evan Debenham
2024-03-28 17:37:06 -04:00
parent d64bf7c422
commit 39ec287ee5
@@ -37,8 +37,10 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.windows.IconTitle; import com.shatteredpixel.shatteredpixeldungeon.windows.IconTitle;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoItem; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoItem;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndSadGhost; import com.shatteredpixel.shatteredpixeldungeon.windows.WndSadGhost;
import com.watabou.utils.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
public class TrinketCatalyst extends Item { public class TrinketCatalyst extends Item {
@@ -58,6 +60,27 @@ public class TrinketCatalyst extends Item {
return false; return false;
} }
private ArrayList<Trinket> rolledTrinkets = new ArrayList<>();
private static final String ROLLED_TRINKETS = "rolled_trinkets";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
if (!rolledTrinkets.isEmpty()){
bundle.put(ROLLED_TRINKETS, rolledTrinkets);
}
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
rolledTrinkets.clear();
if (bundle.contains(ROLLED_TRINKETS)){
rolledTrinkets.addAll((Collection<Trinket>) ((Collection<?>)bundle.getCollection( ROLLED_TRINKETS )));
}
}
public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe {
@Override @Override
@@ -67,18 +90,22 @@ public class TrinketCatalyst extends Item {
@Override @Override
public int cost(ArrayList<Item> ingredients) { public int cost(ArrayList<Item> ingredients) {
if (ingredients.get(0) instanceof TrinketCatalyst && !((TrinketCatalyst) ingredients.get(0)).rolledTrinkets.isEmpty()){
return 0; //costs 0 if rolledTrinkets has items as the player already paid 6 energy
}
return 6; return 6;
} }
@Override @Override
public Item brew(ArrayList<Item> ingredients) { public Item brew(ArrayList<Item> ingredients) {
ingredients.get(0).quantity(0);
//we silently re-add the catalyst so that we can clear it when a trinket is selected //we silently re-add the catalyst so that we can clear it when a trinket is selected
//this way player isn't totally screwed if they quit the game while selecting //this way player isn't totally screwed if they quit the game while selecting
new TrinketCatalyst().collect(); TrinketCatalyst newCata = (TrinketCatalyst) ingredients.get(0).duplicate();
newCata.collect();
ShatteredPixelDungeon.scene().addToFront(new WndTrinket()); ingredients.get(0).quantity(0);
ShatteredPixelDungeon.scene().addToFront(new WndTrinket(newCata));
return null; return null;
} }
@@ -97,9 +124,7 @@ public class TrinketCatalyst extends Item {
private static final int NUM_TRINKETS = 3; private static final int NUM_TRINKETS = 3;
public WndTrinket(){ public WndTrinket( TrinketCatalyst cata ){
TrinketCatalyst cata = new TrinketCatalyst();
IconTitle titlebar = new IconTitle(); IconTitle titlebar = new IconTitle();
titlebar.icon(new ItemSprite(cata)); titlebar.icon(new ItemSprite(cata));
@@ -112,17 +137,20 @@ public class TrinketCatalyst extends Item {
message.setPos(0, titlebar.bottom() + GAP); message.setPos(0, titlebar.bottom() + GAP);
add( message ); add( message );
for (int i = 1; i <= NUM_TRINKETS; i++){ //roll new trinkets if trinkets were not already rolled
while (cata.rolledTrinkets.size() < NUM_TRINKETS){
cata.rolledTrinkets.add((Trinket) Generator.random(Generator.Category.TRINKET));
}
for (int i = 0; i < NUM_TRINKETS; i++){
ItemButton btnReward = new ItemButton(){ ItemButton btnReward = new ItemButton(){
@Override @Override
protected void onClick() { protected void onClick() {
ShatteredPixelDungeon.scene().addToFront(new RewardWindow(item())); ShatteredPixelDungeon.scene().addToFront(new RewardWindow(item()));
} }
}; };
//TODO we need to persist these through save/load in case someone quits when the window is up btnReward.item(cata.rolledTrinkets.get(i));
//alternatively we could just 'peek' at the items and then actually remove them when one is awarded. btnReward.setRect( (i+1)*(WIDTH - BTN_GAP) / NUM_TRINKETS - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE );
btnReward.item(Generator.random(Generator.Category.TRINKET));
btnReward.setRect( i*(WIDTH - BTN_GAP) / NUM_TRINKETS - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE );
add( btnReward ); add( btnReward );
} }