kolmafia / kolmafia
Showing 30 of 31 files from the diff.
Other files ignored by Codecov

@@ -9,6 +9,8 @@
Loading
9 9
import net.sourceforge.kolmafia.RequestLogger;
10 10
import net.sourceforge.kolmafia.objectpool.ItemPool;
11 11
import net.sourceforge.kolmafia.preferences.Preferences;
12 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Option;
13 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Spoilers;
12 14
import net.sourceforge.kolmafia.utilities.StringUtilities;
13 15
import net.sourceforge.kolmafia.webui.RelayLoader;
14 16
@@ -452,33 +454,23 @@
Loading
452 454
    return true;
453 455
  }
454 456
455 -
  public static final String[][] choiceSpoilers(final int choice) {
457 +
  public static final Spoilers choiceSpoilers(final int choice) {
456 458
    // We only handle Violet Fog choices
457 459
    if (!VioletFogManager.fogChoice(choice)) {
458 460
      return null;
459 461
    }
460 462
461 -
    // Return an array with the same structure as used by built-in
462 -
    // choice adventures.
463 -
    String[][] result = new String[3][];
464 -
465 -
    // The choice option is the first element
466 -
    result[0] = new String[1];
467 -
    result[0][0] = "choiceAdventure" + choice;
468 -
469 -
    // The name of the choice is second element
470 -
    result[1] = new String[1];
471 -
    result[1][0] = VioletFogManager.FogLocationNames[choice - VioletFogManager.FIRST_CHOICE];
463 +
    String name = VioletFogManager.FogLocationNames[choice - VioletFogManager.FIRST_CHOICE];
472 464
473 465
    // An array of choice spoilers is the third element
474 466
    int[] choices = VioletFogManager.FogChoiceTable[choice - VioletFogManager.FIRST_CHOICE];
475 -
    result[2] = new String[4];
476 -
    result[2][0] = VioletFogManager.choiceName(choice, choices[0]);
477 -
    result[2][1] = VioletFogManager.choiceName(choice, choices[1]);
478 -
    result[2][2] = VioletFogManager.choiceName(choice, choices[2]);
479 -
    result[2][3] = VioletFogManager.choiceName(choice, choices[3]);
467 +
    Option[] options = new Option[4];
468 +
    options[0] = new Option(VioletFogManager.choiceName(choice, choices[0]));
469 +
    options[1] = new Option(VioletFogManager.choiceName(choice, choices[1]));
470 +
    options[2] = new Option(VioletFogManager.choiceName(choice, choices[2]));
471 +
    options[3] = new Option(VioletFogManager.choiceName(choice, choices[3]));
480 472
481 -
    return result;
473 +
    return new Spoilers(choice, name, options);
482 474
  }
483 475
484 476
  private static String choiceName(final int choice, final int destination) {

@@ -1156,7 +1156,7 @@
Loading
1156 1156
1157 1157
      case 1315: // Castle vs. Castle
1158 1158
        endBattle(text);
1159 -
        switch (ChoiceManager.extractChoice(text)) {
1159 +
        switch (ChoiceUtilities.extractChoice(text)) {
1160 1160
          case 1314:
1161 1161
            // We won and it wasn't the last battle.
1162 1162
            parseCastle(text);
@@ -1185,8 +1185,8 @@
Loading
1185 1185
  }
1186 1186
1187 1187
  public static final boolean registerRequest(final String urlString) {
1188 -
    int choice = ChoiceManager.extractChoiceFromURL(urlString);
1189 -
    int decision = ChoiceManager.extractOptionFromURL(urlString);
1188 +
    int choice = ChoiceUtilities.extractChoiceFromURL(urlString);
1189 +
    int decision = ChoiceUtilities.extractOptionFromURL(urlString);
1190 1190
    int turn = Preferences.getInteger("_bastilleGameTurn");
1191 1191
1192 1192
    StringBuilder buf = new StringBuilder();

@@ -6,7 +6,7 @@
Loading
6 6
import net.sourceforge.kolmafia.RequestLogger;
7 7
import net.sourceforge.kolmafia.RequestThread;
8 8
import net.sourceforge.kolmafia.objectpool.ItemPool;
9 -
import net.sourceforge.kolmafia.session.ChoiceManager;
9 +
import net.sourceforge.kolmafia.utilities.ChoiceUtilities;
10 10
import net.sourceforge.kolmafia.utilities.StringUtilities;
11 11
12 12
public class TerminalRequest extends GenericRequest {
@@ -47,7 +47,7 @@
Loading
47 47
      return false;
48 48
    }
49 49
50 -
    int choice = ChoiceManager.extractChoiceFromURL(urlString);
50 +
    int choice = ChoiceUtilities.extractChoiceFromURL(urlString);
51 51
52 52
    if (choice != 1191) {
53 53
      return false;

@@ -8,6 +8,8 @@
Loading
8 8
import java.util.regex.Pattern;
9 9
import net.sourceforge.kolmafia.RequestEditorKit;
10 10
import net.sourceforge.kolmafia.preferences.Preferences;
11 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Option;
12 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Spoilers;
11 13
import net.sourceforge.kolmafia.utilities.StringUtilities;
12 14
13 15
public class MonorailManager {
@@ -36,7 +38,7 @@
Loading
36 38
    }
37 39
  }
38 40
39 -
  public static Object[][] choiceSpoilers(final int choice, final StringBuffer buffer) {
41 +
  public static Spoilers choiceSpoilers(final int choice, final StringBuffer buffer) {
40 42
    if (choice != 1308 || buffer == null) {
41 43
      return null;
42 44
    }
@@ -48,7 +50,7 @@
Loading
48 50
49 51
    // We'll have to imitate RequestEditorKit.addChoiceSpoilers( final String location, final
50 52
    // StringBuffer buffer )
51 -
    List<ChoiceManager.Option> options = new ArrayList<>();
53 +
    List<Option> options = new ArrayList<>();
52 54
53 55
    Matcher matcher =
54 56
        Pattern.compile("name=choiceform\\d+(.*?)</form>", Pattern.DOTALL).matcher(buffer);
@@ -69,12 +71,10 @@
Loading
69 71
70 72
      if (lyleSpoilers.containsKey(buttonText)) {
71 73
        String[] thisOption = MonorailManager.lyleSpoilers.get(buttonText);
72 -
        options.add(new ChoiceManager.Option(thisOption[0], choiceNumber, thisOption[1]));
74 +
        options.add(new Option(thisOption[0], choiceNumber, thisOption[1]));
73 75
      }
74 76
    }
75 77
76 -
    return new Object[][] {
77 -
      new String[] {""}, new String[] {"On a Downtown Train"}, options.toArray()
78 -
    };
78 +
    return new Spoilers(choice, "On a Downtown Train", options.toArray(new Option[options.size()]));
79 79
  }
80 80
}

@@ -19,6 +19,7 @@
Loading
19 19
import net.sourceforge.kolmafia.preferences.Preferences;
20 20
import net.sourceforge.kolmafia.request.EquipmentRequest;
21 21
import net.sourceforge.kolmafia.request.GenericRequest;
22 +
import net.sourceforge.kolmafia.utilities.ChoiceUtilities;
22 23
import net.sourceforge.kolmafia.utilities.StringUtilities;
23 24
24 25
public abstract class YouRobotManager {
@@ -735,8 +736,8 @@
Loading
735 736
    //   1445 - Reassembly Station
736 737
    //   1447 - Statbot 5000
737 738
738 -
    int choice = ChoiceManager.extractChoiceFromURL(urlString);
739 -
    int decision = ChoiceManager.extractOptionFromURL(urlString);
739 +
    int choice = ChoiceUtilities.extractChoiceFromURL(urlString);
740 +
    int decision = ChoiceUtilities.extractOptionFromURL(urlString);
740 741
741 742
    String message;
742 743

@@ -1,108 +1,40 @@
Loading
1 1
package net.sourceforge.kolmafia.session;
2 2
3 3
import java.io.File;
4 -
import java.text.ParseException;
5 -
import java.text.SimpleDateFormat;
6 -
import java.util.ArrayList;
7 -
import java.util.Arrays;
8 -
import java.util.Calendar;
9 -
import java.util.Date;
10 -
import java.util.HashMap;
11 -
import java.util.Iterator;
12 4
import java.util.List;
13 5
import java.util.Map;
14 -
import java.util.Map.Entry;
15 -
import java.util.regex.Matcher;
16 -
import java.util.regex.Pattern;
17 6
import net.sourceforge.kolmafia.AdventureResult;
18 -
import net.sourceforge.kolmafia.AdventureResult.AdventureLongCountResult;
19 -
import net.sourceforge.kolmafia.AscensionClass;
20 -
import net.sourceforge.kolmafia.EdServantData;
21 -
import net.sourceforge.kolmafia.FamiliarData;
22 -
import net.sourceforge.kolmafia.KoLAdventure;
23 7
import net.sourceforge.kolmafia.KoLCharacter;
24 8
import net.sourceforge.kolmafia.KoLConstants;
25 9
import net.sourceforge.kolmafia.KoLConstants.MafiaState;
26 10
import net.sourceforge.kolmafia.KoLmafia;
27 11
import net.sourceforge.kolmafia.KoLmafiaASH;
28 12
import net.sourceforge.kolmafia.KoLmafiaCLI;
29 -
import net.sourceforge.kolmafia.Modifiers;
30 -
import net.sourceforge.kolmafia.Modifiers.Modifier;
31 -
import net.sourceforge.kolmafia.Modifiers.ModifierList;
32 13
import net.sourceforge.kolmafia.RequestEditorKit;
33 14
import net.sourceforge.kolmafia.RequestLogger;
34 -
import net.sourceforge.kolmafia.RequestThread;
35 -
import net.sourceforge.kolmafia.VYKEACompanionData;
36 -
import net.sourceforge.kolmafia.combat.MonsterStatusTracker;
37 -
import net.sourceforge.kolmafia.moods.HPRestoreItemList;
38 -
import net.sourceforge.kolmafia.moods.MPRestoreItemList;
39 15
import net.sourceforge.kolmafia.objectpool.EffectPool;
40 -
import net.sourceforge.kolmafia.objectpool.FamiliarPool;
41 16
import net.sourceforge.kolmafia.objectpool.ItemPool;
42 17
import net.sourceforge.kolmafia.objectpool.OutfitPool;
43 18
import net.sourceforge.kolmafia.persistence.AdventureDatabase;
44 19
import net.sourceforge.kolmafia.persistence.AdventureSpentDatabase;
45 -
import net.sourceforge.kolmafia.persistence.ConcoctionDatabase;
46 -
import net.sourceforge.kolmafia.persistence.HolidayDatabase;
47 -
import net.sourceforge.kolmafia.persistence.ItemDatabase;
48 -
import net.sourceforge.kolmafia.persistence.MonsterDatabase;
49 -
import net.sourceforge.kolmafia.persistence.MonsterDatabase.Element;
50 -
import net.sourceforge.kolmafia.persistence.MonsterDatabase.Phylum;
51 20
import net.sourceforge.kolmafia.persistence.QuestDatabase;
52 21
import net.sourceforge.kolmafia.persistence.QuestDatabase.Quest;
53 -
import net.sourceforge.kolmafia.persistence.SkillDatabase;
54 22
import net.sourceforge.kolmafia.preferences.Preferences;
55 -
import net.sourceforge.kolmafia.request.AdventureRequest;
56 -
import net.sourceforge.kolmafia.request.ApiRequest;
57 23
import net.sourceforge.kolmafia.request.ArcadeRequest;
58 -
import net.sourceforge.kolmafia.request.BeachCombRequest;
59 -
import net.sourceforge.kolmafia.request.BeerPongRequest;
60 -
import net.sourceforge.kolmafia.request.CampgroundRequest;
61 -
import net.sourceforge.kolmafia.request.CampgroundRequest.Mushroom;
62 -
import net.sourceforge.kolmafia.request.CargoCultistShortsRequest;
63 -
import net.sourceforge.kolmafia.request.CharPaneRequest;
64 -
import net.sourceforge.kolmafia.request.CharPaneRequest.Companion;
65 -
import net.sourceforge.kolmafia.request.DeckOfEveryCardRequest;
66 -
import net.sourceforge.kolmafia.request.DecorateTentRequest;
67 -
import net.sourceforge.kolmafia.request.EatItemRequest;
68 -
import net.sourceforge.kolmafia.request.EdBaseRequest;
69 -
import net.sourceforge.kolmafia.request.EquipmentRequest;
70 24
import net.sourceforge.kolmafia.request.FightRequest;
71 -
import net.sourceforge.kolmafia.request.FloristRequest;
72 -
import net.sourceforge.kolmafia.request.FloristRequest.Florist;
73 25
import net.sourceforge.kolmafia.request.GenericRequest;
74 -
import net.sourceforge.kolmafia.request.GenieRequest;
75 -
import net.sourceforge.kolmafia.request.LatteRequest;
76 -
import net.sourceforge.kolmafia.request.MummeryRequest;
77 -
import net.sourceforge.kolmafia.request.PantogramRequest;
78 -
import net.sourceforge.kolmafia.request.PyramidRequest;
79 -
import net.sourceforge.kolmafia.request.QuestLogRequest;
80 26
import net.sourceforge.kolmafia.request.RelayRequest;
81 -
import net.sourceforge.kolmafia.request.SaberRequest;
82 -
import net.sourceforge.kolmafia.request.SpaaaceRequest;
83 -
import net.sourceforge.kolmafia.request.SpelunkyRequest;
84 -
import net.sourceforge.kolmafia.request.SweetSynthesisRequest;
85 -
import net.sourceforge.kolmafia.request.TavernRequest;
86 -
import net.sourceforge.kolmafia.request.UmbrellaRequest;
87 27
import net.sourceforge.kolmafia.request.UseItemRequest;
88 -
import net.sourceforge.kolmafia.request.WildfireCampRequest;
28 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.ChoiceAdventure;
29 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.ChoiceSpoiler;
30 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Option;
31 +
import net.sourceforge.kolmafia.session.ChoiceAdventures.Spoilers;
89 32
import net.sourceforge.kolmafia.textui.ScriptRuntime;
90 -
import net.sourceforge.kolmafia.textui.command.EdPieceCommand;
91 -
import net.sourceforge.kolmafia.textui.command.SnowsuitCommand;
92 33
import net.sourceforge.kolmafia.utilities.ChoiceUtilities;
93 34
import net.sourceforge.kolmafia.utilities.StringUtilities;
94 -
import net.sourceforge.kolmafia.webui.ClanFortuneDecorator;
95 -
import net.sourceforge.kolmafia.webui.MemoriesDecorator;
96 35
import net.sourceforge.kolmafia.webui.VillainLairDecorator;
97 36
98 37
public abstract class ChoiceManager {
99 -
  public static final GenericRequest CHOICE_HANDLER =
100 -
      new GenericRequest("choice.php") {
101 -
        @Override
102 -
        protected boolean shouldFollowRedirect() {
103 -
          return false;
104 -
        }
105 -
      };
106 38
107 39
  public static boolean handlingChoice = false;
108 40
  public static int lastChoice = 0;
@@ -111,8 +43,17 @@
Loading
111 43
  public static String lastDecoratedResponseText = "";
112 44
113 45
  private static int skillUses = 0;
46 +
47 +
  public static final void setSkillUses(int uses) {
48 +
    // Used for casting skills that lead to a choice adventure
49 +
    ChoiceManager.skillUses = uses;
50 +
  }
51 +
114 52
  private static boolean canWalkAway;
115 -
  private static int abooPeakLevel = 0;
53 +
54 +
  public static boolean canWalkAway() {
55 +
    return ChoiceManager.canWalkAway;
56 +
  }
116 57
117 58
  private enum PostChoiceAction {
118 59
    NONE,
@@ -126,17458 +67,363 @@
Loading
126 67
    return ChoiceManager.handlingChoice ? ChoiceManager.lastChoice : 0;
127 68
  }
128 69
129 -
  public static int extractChoice(final String responseText) {
130 -
    return ChoiceUtilities.extractChoice(responseText);
70 +
  public static final int getLastChoice() {
71 +
    return ChoiceManager.lastChoice;
131 72
  }
132 73
133 -
  public static final Pattern URL_CHOICE_PATTERN = Pattern.compile("whichchoice=(\\d+)");
74 +
  public static final int getLastDecision() {
75 +
    return ChoiceManager.lastDecision;
76 +
  }
134 77
135 -
  public static int extractChoiceFromURL(final String urlString) {
136 -
    Matcher matcher = ChoiceManager.URL_CHOICE_PATTERN.matcher(urlString);
137 -
    return matcher.find() ? StringUtilities.parseInt(matcher.group(1)) : 0;
78 +
  public static void initializeAfterChoice() {
79 +
    ChoiceManager.action = PostChoiceAction.INITIALIZE;
80 +
    GenericRequest request = ChoiceManager.CHOICE_HANDLER;
81 +
    request.constructURLString("choice.php");
82 +
    request.run();
83 +
    ChoiceUtilities.printChoices(ChoiceManager.lastResponseText);
138 84
  }
139 85
140 -
  public static final Pattern URL_OPTION_PATTERN = Pattern.compile("(?<!force)option=(\\d+)");
86 +
  public static boolean initializingAfterChoice() {
87 +
    return ChoiceManager.action == PostChoiceAction.INITIALIZE;
88 +
  }
141 89
142 -
  public static int extractOptionFromURL(final String urlString) {
143 -
    Matcher matcher = ChoiceManager.URL_OPTION_PATTERN.matcher(urlString);
144 -
    return matcher.find() ? StringUtilities.parseInt(matcher.group(1)) : 0;
90 +
  public static void ascendAfterChoice() {
91 +
    ChoiceManager.action = PostChoiceAction.ASCEND;
145 92
  }
146 93
147 -
  public static final Pattern URL_IID_PATTERN = Pattern.compile("iid=(\\d+)");
94 +
  /*
95 +
   * Here is how we automate a choice chain.
96 +
   *
97 +
   * This is invoked by:
98 +
   *
99 +
   * - GenericRequest when redirected to choice.php
100 +
   * - UseItemRequest when redirected to choice.php
101 +
   * - CampgroundRequest when automating mushroom garden
102 +
   *
103 +
   * And by user actions:
104 +
   *
105 +
   * - RelayRequest when the user hits the "auto" button on a choice page.
106 +
   * - The "choice" command from the gCLI
107 +
   * - The run_choice() function of ASH
108 +
   */
109 +
110 +
  public static final GenericRequest CHOICE_HANDLER =
111 +
      new GenericRequest("choice.php") {
112 +
        @Override
113 +
        protected boolean shouldFollowRedirect() {
114 +
          return false;
115 +
        }
116 +
      };
148 117
149 -
  public static int extractIidFromURL(final String urlString) {
150 -
    Matcher matcher = ChoiceManager.URL_IID_PATTERN.matcher(urlString);
151 -
    return matcher.find() ? StringUtilities.parseInt(matcher.group(1)) : -1;
118 +
  public static final void processRedirectedChoiceAdventure(final String redirectLocation) {
119 +
    ChoiceManager.processChoiceAdventure(ChoiceManager.CHOICE_HANDLER, redirectLocation, null);
152 120
  }
153 121
154 -
  public static final Pattern URL_QTY_PATTERN = Pattern.compile("qty=(\\d+)");
122 +
  public static final void processChoiceAdventure(final String responseText) {
123 +
    ChoiceManager.processChoiceAdventure(ChoiceManager.CHOICE_HANDLER, "choice.php", responseText);
124 +
  }
155 125
156 -
  public static int extractQtyFromURL(final String urlString) {
157 -
    Matcher matcher = ChoiceManager.URL_QTY_PATTERN.matcher(urlString);
158 -
    return matcher.find() ? StringUtilities.parseInt(matcher.group(1)) : -1;
126 +
  public static final String processChoiceAdventure(
127 +
      final String decision, final String extraFields, final boolean tryToAutomate) {
128 +
    return ChoiceManager.processChoiceAdventure(
129 +
        StringUtilities.parseInt(decision), extraFields, tryToAutomate);
159 130
  }
160 131
161 -
  private static final Pattern URL_SKILLID_PATTERN = Pattern.compile("skillid=(\\d+)");
162 -
  private static final Pattern TATTOO_PATTERN =
163 -
      Pattern.compile("otherimages/sigils/hobotat(\\d+).gif");
164 -
  private static final Pattern REANIMATOR_ARM_PATTERN = Pattern.compile("(\\d+) arms??<br>");
165 -
  private static final Pattern REANIMATOR_LEG_PATTERN = Pattern.compile("(\\d+) legs??<br>");
166 -
  private static final Pattern REANIMATOR_SKULL_PATTERN = Pattern.compile("(\\d+) skulls??<br>");
167 -
  private static final Pattern REANIMATOR_WEIRDPART_PATTERN =
168 -
      Pattern.compile("(\\d+) weird random parts??<br>");
169 -
  private static final Pattern REANIMATOR_WING_PATTERN = Pattern.compile("(\\d+) wings??<br>");
170 -
  private static final Pattern CHAMBER_PATTERN = Pattern.compile("Chamber <b>#(\\d+)</b>");
171 -
  private static final Pattern YEARBOOK_TARGET_PATTERN =
172 -
      Pattern.compile("<b>Results:</b>.*?<b>(.*?)</b>");
173 -
  private static final Pattern UNPERM_PATTERN =
174 -
      Pattern.compile("Turning (.+)(?: \\(HP\\)) into (\\d+) karma.");
175 -
  private static final Pattern ICEHOUSE_PATTERN =
176 -
      Pattern.compile("perfectly-preserved (.*?), right");
177 -
  private static final Pattern CINDERELLA_TIME_PATTERN =
178 -
      Pattern.compile("<i>It is (\\d+) minute(?:s) to midnight.</i>");
179 -
  private static final Pattern CINDERELLA_SCORE_PATTERN =
180 -
      Pattern.compile("score (?:is now|was) <b>(\\d+)</b>");
181 -
  private static final Pattern RUMPLE_MATERIAL_PATTERN =
182 -
      Pattern.compile("alt=\"(.*?)\"></td><td valign=center>(\\d+)<");
183 -
  private static final Pattern MOTORBIKE_TIRES_PATTERN = Pattern.compile("<b>Tires:</b> (.*?)?\\(");
184 -
  private static final Pattern MOTORBIKE_GASTANK_PATTERN =
185 -
      Pattern.compile("<b>Gas Tank:</b> (.*?)?\\(");
186 -
  private static final Pattern MOTORBIKE_HEADLIGHT_PATTERN =
187 -
      Pattern.compile("<b>Headlight:</b> (.*?)?\\(");
188 -
  private static final Pattern MOTORBIKE_COWLING_PATTERN =
189 -
      Pattern.compile("<b>Cowling:</b> (.*?)?\\(");
190 -
  private static final Pattern MOTORBIKE_MUFFLER_PATTERN =
191 -
      Pattern.compile("<b>Muffler:</b> (.*?)?\\(");
192 -
  private static final Pattern MOTORBIKE_SEAT_PATTERN = Pattern.compile("<b>Seat:</b> (.*?)?\\(");
193 -
  private static final Pattern CRIMBOT_CHASSIS_PATTERN =
194 -
      Pattern.compile("base chassis is the (.*?),");
195 -
  private static final Pattern CRIMBOT_ARM_PATTERN =
196 -
      Pattern.compile("(?:My arm is the|</i> equipped with a) (.*?),");
197 -
  private static final Pattern CRIMBOT_PROPULSION_PATTERN =
198 -
      Pattern.compile(
199 -
          "(?:provided by a|am mobilized by an|equipped with a pair of|move via) (.*?),");
200 -
  private static final Pattern EDPIECE_PATTERN =
201 -
      Pattern.compile("<p>The crown is currently adorned with a golden (.*?).<center>");
202 -
  private static final Pattern ED_RETURN_PATTERN =
203 -
      Pattern.compile("Return to the fight! \\((\\d+) Ka\\)");
204 -
  private static final Pattern POOL_SKILL_PATTERN = Pattern.compile("(\\d+) Pool Skill</b>");
205 -
  private static final Pattern BENCH_WARRANT_PATTERN =
206 -
      Pattern.compile("creep <font color=blueviolet><b>(\\d+)</b></font> of them");
207 -
  private static final Pattern LYNYRD_PATTERN =
208 -
      Pattern.compile(
209 -
          "(?:scare|group of|All) <b>(\\d+)</b> (?:of the protesters|protesters|of them)");
210 -
  private static final Pattern PINK_WORD_PATTERN =
211 -
      Pattern.compile(
212 -
          "scrawled in lipstick on a cocktail napkin:  <b><font color=pink>(.*?)</font></b>");
213 -
  private static final Pattern OMEGA_PATTERN =
214 -
      Pattern.compile("<br>Current power level: (\\d+)%</td>");
215 -
  private static final Pattern RADIO_STATIC_PATTERN =
216 -
      Pattern.compile("<p>(?!(?:<form|</center>))(.+?)(?=<[^i</])");
217 -
  private static final Pattern STILL_PATTERN =
218 -
      Pattern.compile("toss (.*?) cocktail onions into the still");
219 -
  private static final Pattern QTY_PATTERN = Pattern.compile("qty(\\d+)=(\\d+)");
220 -
  private static final Pattern ITEMID_PATTERN = Pattern.compile("itemid(\\d+)=(\\d+)");
221 -
  private static final Pattern DINSEY_ROLLERCOASTER_PATTERN =
222 -
      Pattern.compile("rollercoaster is currently set to (.*?) Mode");
223 -
  private static final Pattern DINSEY_PIRATE_PATTERN =
224 -
      Pattern.compile("'Updated Pirate' is (lit|dark)");
225 -
  private static final Pattern DINSEY_TEACUP_PATTERN =
226 -
      Pattern.compile("'Current Teacup Spin Rate' points to (\\d+),000 RPM");
227 -
  private static final Pattern DINSEY_SLUICE_PATTERN =
228 -
      Pattern.compile("'Sluice Swishers' is currently in the (.*?) position");
229 -
  private static final Pattern MAYO_MINDER_PATTERN =
230 -
      Pattern.compile("currently loaded up with packets of (.*?)<p>");
231 -
  private static final Pattern DESCID_PATTERN = Pattern.compile("descitem\\((.*?)\\)");
232 -
  private static final Pattern WLF_PATTERN =
233 -
      Pattern.compile(
234 -
          "<form action=choice.php>.*?<b>(.*?)</b>.*?descitem\\((.*?)\\).*?>(.*?)<.*?name=option value=([\\d]*).*?</form>",
235 -
          Pattern.DOTALL);
236 -
  private static final Pattern WLF_COUNT_PATTERN = Pattern.compile(".*? \\(([\\d]+)\\)$");
237 -
  private static final Pattern WALFORD_PATTERN =
238 -
      Pattern.compile("\\(Walford's bucket filled by (\\d+)%\\)");
239 -
  private static final Pattern SNOJO_CONSOLE_PATTERN = Pattern.compile("<b>(.*?) MODE</b>");
240 -
  private static final Pattern TELEGRAM_PATTERN = Pattern.compile("value=\"RE: (.*?)\"");
241 -
  private static final Pattern ENLIGHTENMENT_PATTERN =
242 -
      Pattern.compile("achieved <b>(\\d+)</b> enlightenment");
243 -
  private static final Pattern ORACLE_QUEST_PATTERN =
244 -
      Pattern.compile("don't remember leaving any spoons in (.*?)&quot;");
245 -
  private static final Pattern CASE_PATTERN = Pattern.compile("\\((\\d+) more case");
246 -
  private static final Pattern TIME_SPINNER_PATTERN = Pattern.compile("have (\\d+) minute");
247 -
  private static final Pattern TIME_SPINNER_MEDALS_PATTERN =
248 -
      Pattern.compile("memory of earning <b>(\\d+) medal");
249 -
  private static final Pattern LOV_EXIT_PATTERN =
250 -
      Pattern.compile("a sign above it that says <b>(.*?)</b>");
251 -
  private static final Pattern LOV_LOGENTRY_PATTERN = Pattern.compile("you scrawl <b>(.*?)</b>");
252 -
  private static final Pattern VACCINE_PATTERN =
253 -
      Pattern.compile("option value=(\\d+).*?class=button type=submit value=\"([^\"]*)");
254 -
  private static final Pattern DECEASED_TREE_PATTERN =
255 -
      Pattern.compile("Looks like it has (.*?) needle");
256 -
  private static final Pattern BROKEN_CHAMPAGNE_PATTERN =
257 -
      Pattern.compile("Looks like it has (\\d+) ounce");
258 -
  private static final Pattern GARBAGE_SHIRT_PATTERN =
259 -
      Pattern.compile("Looks like you can read roughly (\\d+) scrap");
260 -
  private static final Pattern BOOMBOX_PATTERN = Pattern.compile("you can do <b>(\\d+)</b> more");
261 -
  private static final Pattern BOOMBOX_SONG_PATTERN =
262 -
      Pattern.compile("&quot;(.*?)&quot;( \\(Keep playing\\)|)");
263 -
  private static final Pattern HEIST_PATTERN =
264 -
      Pattern.compile("He shows you a list of potential targets:<p><i>\\((\\d+) more");
265 -
  private static final Pattern SHEN_PATTERN =
266 -
      Pattern.compile(
267 -
          "(?:Bring me|artifact known only as) <b>(.*?)</b>, hidden away for centuries");
268 -
  private static final Pattern GERALD_PATTERN =
269 -
      Pattern.compile("Gerald wants (\\d+)<table>.*?descitem\\((\\d+)\\)");
270 -
  private static final Pattern GERALDINE_PATTERN =
271 -
      Pattern.compile("Geraldine wants (\\d+)<table>.*?descitem\\((\\d+)\\)");
272 -
  private static final Pattern SAFE_PATTERN = Pattern.compile("find ([\\d,]+) Meat in the safe");
273 -
  private static final Pattern TRASH_PATTERN =
274 -
      Pattern.compile("must have been (\\d+) pieces of trash");
275 -
  private static final Pattern VOTE_PATTERN =
276 -
      Pattern.compile(
277 -
          "<label><input .*? value=\\\"(\\d)\\\" class=\\\"locals\\\" /> (.*?)<br /><span .*? color: blue\\\">(.*?)</span><br /></label>");
278 -
  private static final Pattern VOTE_SPEECH_PATTERN =
279 -
      Pattern.compile(
280 -
          "<p><input type='radio' name='g' value='(\\d+)' /> <b>(.*?)</b>(.*?)<br><blockquote>(.*?)</blockquote>");
281 -
  private static final Pattern URL_VOTE_PATTERN = Pattern.compile("local\\[\\]=(\\d)");
282 -
  private static final Pattern EARLY_DAYCARE_PATTERN =
283 -
      Pattern.compile("mostly empty. (.*?) toddlers are training with (.*?) instructor");
284 -
  private static final Pattern DAYCARE_PATTERN =
285 -
      Pattern.compile(
286 -
          "(?:Looks like|Probably around) (.*?) pieces in all. (.*?) toddlers are training with (.*?) instructor");
287 -
  private static final Pattern DAYCARE_RECRUITS_PATTERN =
288 -
      Pattern.compile("<font color=blue><b>[(.*?) Meat]</b></font>");
289 -
  private static final Pattern DAYCARE_RECRUIT_PATTERN =
290 -
      Pattern.compile("attract (.*?) new children");
291 -
  private static final Pattern DAYCARE_EQUIPMENT_PATTERN =
292 -
      Pattern.compile("manage to find (.*?) used");
293 -
  private static final Pattern DAYCARE_ITEM_PATTERN =
294 -
      Pattern.compile("<td valign=center>You lose an item: </td>.*?<b>(.*?)</b> \\((.*?)\\)</td>");
295 -
  private static final Pattern SAUSAGE_PATTERN =
296 -
      Pattern.compile(
297 -
          "grinder needs (.*?) of the (.*?) required units of filling to make a sausage.  Your grinder reads \\\"(\\d+)\\\" units.");
298 -
  private static final Pattern DOCTOR_BAG_PATTERN =
299 -
      Pattern.compile("We've received a report of a patient (.*?), in (.*?)\\.");
300 -
  private static final Pattern RED_SNAPPER_PATTERN =
301 -
      Pattern.compile("guiding you towards: <b>(.*?)</b>.  You've found <b>(\\d+)</b> of them");
302 -
  private static final Pattern MUSHROOM_COSTUME_PATTERN =
303 -
      Pattern.compile(
304 -
          "<form.*?name=option value=(\\d).*?type=submit value=\"(.*?) Costume\".*?>(\\d+) coins<.*?</form>");
305 -
  private static final Pattern MUSHROOM_BADGE_PATTERN =
306 -
      Pattern.compile("Current cost: (\\d+) coins.");
307 -
  private static final Pattern GUZZLR_TIER_PATTERN =
308 -
      Pattern.compile("You have completed ([0-9,]+) (Bronze|Gold|Platinum) Tier deliveries");
309 -
  private static final Pattern GUZZLR_QUEST_PATTERN =
310 -
      Pattern.compile("<p>You are currently tasked with taking a (.*?) to (.*?) in (.*?)\\.<p>");
311 -
312 -
  public static final Pattern DECISION_BUTTON_PATTERN =
313 -
      Pattern.compile(
314 -
          "<input type=hidden name=option value=(\\d+)>(?:.*?)<input +class=button type=submit value=\"(.*?)\">");
132 +
  public static final String processChoiceAdventure(
133 +
      final int decision, final String extraFields, final boolean tryToAutomate) {
134 +
    GenericRequest request = ChoiceManager.CHOICE_HANDLER;
315 135
316 -
  private static final AdventureResult PAPAYA = ItemPool.get(ItemPool.PAPAYA, 1);
317 -
  private static final AdventureResult MAIDEN_EFFECT = EffectPool.get(EffectPool.DREAMS_AND_LIGHTS);
318 -
  private static final AdventureResult MODEL_AIRSHIP = ItemPool.get(ItemPool.MODEL_AIRSHIP, 1);
136 +
    request.constructURLString("choice.php");
137 +
    request.addFormField("whichchoice", String.valueOf(ChoiceManager.lastChoice));
138 +
    request.addFormField("option", String.valueOf(decision));
139 +
    if (!extraFields.equals("")) {
140 +
      String[] fields = extraFields.split("&");
141 +
      for (String field : fields) {
142 +
        int equals = field.indexOf("=");
143 +
        if (equals != -1) {
144 +
          request.addFormField(field.substring(0, equals), field.substring(equals + 1));
145 +
        }
146 +
      }
147 +
    }
148 +
    request.addFormField("pwd", GenericRequest.passwordHash);
149 +
    request.run();
319 150
320 -
  private static final AdventureResult CURSE1_EFFECT = EffectPool.get(EffectPool.ONCE_CURSED);
321 -
  private static final AdventureResult CURSE2_EFFECT = EffectPool.get(EffectPool.TWICE_CURSED);
322 -
  private static final AdventureResult CURSE3_EFFECT = EffectPool.get(EffectPool.THRICE_CURSED);
323 -
  private static final AdventureResult MCCLUSKY_FILE = ItemPool.get(ItemPool.MCCLUSKY_FILE, 1);
324 -
  private static final AdventureResult MCCLUSKY_FILE_PAGE5 =
325 -
      ItemPool.get(ItemPool.MCCLUSKY_FILE_PAGE5, 1);
326 -
  private static final AdventureResult BINDER_CLIP = ItemPool.get(ItemPool.BINDER_CLIP, 1);
327 -
  private static final AdventureResult STONE_TRIANGLE = ItemPool.get(ItemPool.STONE_TRIANGLE, 1);
151 +
    if (tryToAutomate) {
152 +
      ChoiceManager.processChoiceAdventure(request, "choice.php", request.responseText);
153 +
      return "";
154 +
    }
328 155
329 -
  private static final AdventureResult JOCK_EFFECT =
330 -
      EffectPool.get(EffectPool.JAMMING_WITH_THE_JOCKS);
331 -
  private static final AdventureResult NERD_EFFECT = EffectPool.get(EffectPool.NERD_IS_THE_WORD);
332 -
  private static final AdventureResult GREASER_EFFECT = EffectPool.get(EffectPool.GREASER_LIGHTNIN);
156 +
    return request.responseText;
157 +
  }
333 158
334 -
  // Dreadsylvania items and effects
335 -
  private static final AdventureResult MOON_AMBER_NECKLACE =
336 -
      ItemPool.get(ItemPool.MOON_AMBER_NECKLACE, 1);
337 -
  private static final AdventureResult BLOODY_KIWITINI = ItemPool.get(ItemPool.BLOODY_KIWITINI, 1);
338 -
  private static final AdventureResult KIWITINI_EFFECT =
339 -
      EffectPool.get(EffectPool.FIRST_BLOOD_KIWI);
340 -
  private static final AdventureResult AUDITORS_BADGE = ItemPool.get(ItemPool.AUDITORS_BADGE, 1);
341 -
  private static final AdventureResult WEEDY_SKIRT = ItemPool.get(ItemPool.WEEDY_SKIRT, 1);
342 -
  private static final AdventureResult GHOST_SHAWL = ItemPool.get(ItemPool.GHOST_SHAWL, 1);
343 -
  private static final AdventureResult SHEPHERDS_PIE = ItemPool.get(ItemPool.SHEPHERDS_PIE, 1);
344 -
  private static final AdventureResult PIE_EFFECT = EffectPool.get(EffectPool.SHEPHERDS_BREATH);
345 -
  private static final AdventureResult MAKESHIFT_TURBAN =
346 -
      ItemPool.get(ItemPool.MAKESHIFT_TURBAN, 1);
347 -
  private static final AdventureResult TEMPORARY_BLINDNESS =
348 -
      EffectPool.get(EffectPool.TEMPORARY_BLINDNESS);
349 -
  private static final AdventureResult HELPS_YOU_SLEEP = ItemPool.get(ItemPool.HELPS_YOU_SLEEP, 1);
350 -
  private static final AdventureResult SLEEP_MASK = ItemPool.get(ItemPool.SLEEP_MASK, 1);
159 +
  public static final boolean stillInChoice() {
160 +
    return ChoiceManager.stillInChoice(ChoiceManager.lastResponseText);
161 +
  }
351 162
352 -
  private static final AdventureResult[] MISTRESS_ITEMS =
353 -
      new AdventureResult[] {
354 -
        ItemPool.get(ItemPool.CHINTZY_SEAL_PENDANT, 1),
355 -
        ItemPool.get(ItemPool.CHINTZY_TURTLE_BROOCH, 1),
356 -
        ItemPool.get(ItemPool.CHINTZY_NOODLE_RING, 1),
357 -
        ItemPool.get(ItemPool.CHINTZY_SAUCEPAN_EARRING, 1),
358 -
        ItemPool.get(ItemPool.CHINTZY_DISCO_BALL_PENDANT, 1),
359 -
        ItemPool.get(ItemPool.CHINTZY_ACCORDION_PIN, 1),
360 -
        ItemPool.get(ItemPool.ANTIQUE_HAND_MIRROR, 1),
361 -
      };
163 +
  private static boolean stillInChoice(final String responseText) {
164 +
    // Doing the Maths has a choice form but, somehow, does not specify choice.php
362 165
363 -
  private static final Pattern HELLEVATOR_PATTERN =
364 -
      Pattern.compile(
365 -
          "the (lobby|first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh) (button|floor)");
366 -
367 -
  private static final String[] FLOORS =
368 -
      new String[] {
369 -
        "lobby",
370 -
        "first",
371 -
        "second",
372 -
        "third",
373 -
        "fourth",
374 -
        "fifth",
375 -
        "sixth",
376 -
        "seventh",
377 -
        "eighth",
378 -
        "ninth",
379 -
        "tenth",
380 -
        "eleventh",
381 -
      };
166 +
    // <form method="get" id="">
167 +
    //   <input type="hidden" name="whichchoice" value="1103" />
168 +
    //   <input type="hidden" name="pwd" value="xxxxxx" />
169 +
    //   <input type="hidden" name="option" value="1" />
170 +
    //   <input type="text" name="num" value="" maxlen="6" size="6" />
171 +
    //   <input type="submit" value="Calculate the Universe" class="button" />
172 +
    //   <div style="clear:both"></div>
173 +
    // </form>
382 174
383 -
  private static final String[][] OLD_MAN_PSYCHOSIS_SPOILERS = {
384 -
    {"Draw a Monster with a Crayon", "-1 Crayon, Add Cray-Kin"},
385 -
    {"Build a Bubble Mountain", "+3 crew, -8-10 bubbles"},
386 -
    {"Ask Mom for More Bath Toys", "+2 crayons, +8-11 bubbles"},
387 -
    {"Draw a Bunch of Coconuts with Crayons", "Block Ferocious roc, -2 crayons"},
388 -
    {"Splash in the Water", "Add Bristled Man-O-War"},
389 -
    {"Draw a Big Storm Cloud on the Shower Wall", "Block Deadly Hydra, -3 crayons"},
390 -
    {"Knock an Action Figure Overboard", "+20-23 bubbles, -1 crew"},
391 -
    {"Submerge Some Bubbles", "Block giant man-eating shark, -16 bubbles"},
392 -
    {"Turn on the Shower Wand", "Add Deadly Hydra"},
393 -
    {"Dump Bubble Bottle and Turn on the Faucet", "+13-19 bubbles"},
394 -
    {"Put the Toy Boat on the Side of the Tub", "+4 crayon, -1 crew"},
395 -
    {"Cover the Ship in Bubbles", "Block fearsome giant squid, -13-20 bubbles"},
396 -
    {"Pull the Drain Plug", "-8 crew, -3 crayons, -17 bubbles, increase NC rate"},
397 -
    {"Open a New Bathtub Crayon Box", "+3 crayons"},
398 -
    {"Sing a Bathtime Tune", "+3 crayons, +16 bubbles, -2 crew"},
399 -
    {"Surround Bubbles with Crayons", "+5 crew, -6-16 bubbles, -2 crayons"},
400 -
  };
401 -
402 -
  public static final Map<Quest, String> conspiracyQuestMessages = new HashMap<>();
403 -
404 -
  static {
405 -
    ChoiceManager.conspiracyQuestMessages.put(
406 -
        Quest.CLIPPER,
407 -
        "&quot;Attention any available operative. Attention any available operative. A reward has been posted for DNA evidence gathered from Lt. Weirdeaux's subjects inside Site 15. The DNA is to be gathered via keratin extraction. Message repeats.&quot;");
408 -
    ChoiceManager.conspiracyQuestMessages.put(
409 -
        Quest.EVE,
410 -
        "&quot;Attention Operative 01-A-A. General Sitterson reports a... situation involving experiment E-V-E-6. Military intervention has been requested. Message repeats.&quot;");
411 -
    ChoiceManager.conspiracyQuestMessages.put(
412 -
        Quest.FAKE_MEDIUM,
413 -
        "&quot;Attention Operative EC-T-1. An outside client has expressed interest in the acquisition of an ESP suppression collar from the laboratory. Operationally significant sums of money are involved. Message repeats.&quot;");
414 -
    ChoiceManager.conspiracyQuestMessages.put(
415 -
        Quest.GORE,
416 -
        "&quot;Attention any available operative. Attention any available operative. Laboratory overseer General Sitterson reports unacceptable levels of environmental gore. Several elevator shafts are already fully clogged, limiting staff mobility, and several surveillance camera lenses have been rendered opaque, placing the validity of experimental data at risk. Immediate janitorial assistance is requested. Message repeats.&quot;");
417 -
    ChoiceManager.conspiracyQuestMessages.put(
418 -
        Quest.JUNGLE_PUN,
419 -
        "&quot;Attention any available operative. Attention any available operative. The director of Project Buena Vista has posted a significant bounty for the collection of jungle-related puns. Repeat: Jungle-related puns. Non-jungle puns or jungle non-puns will not be accepted. Non-jungle non-puns, by order of the director, are to be rewarded with summary execution. Message repeats.&quot;");
420 -
    ChoiceManager.conspiracyQuestMessages.put(
421 -
        Quest.OUT_OF_ORDER,
422 -
        "&quot;Attention Operative QZ-N-0. Colonel Kurzweil at Jungle Interior Camp 4 reports the theft of Project T. L. B. materials. Requests immediate assistance. Is confident that it has not yet been removed from the jungle. Message repeats.&quot;");
423 -
    ChoiceManager.conspiracyQuestMessages.put(
424 -
        Quest.SERUM,
425 -
        "&quot;Attention Operative 21-B-M. Emergency deployment orders have been executed due to a shortage of experimental serum P-00. Repeat: P Zero Zero. Lt. Weirdeaux is known to have P-00 manufacturing facilities inside the Site 15 mansion. Message repeats.&quot;");
426 -
    ChoiceManager.conspiracyQuestMessages.put(
427 -
        Quest.SMOKES,
428 -
        "&quot;Attention Operative 00-A-6. Colonel Kurzweil at Jungle Interior Camp 4 reports that they have run out of smokes. Repeat: They have run out of smokes. Requests immediate assistance. Message repeats.&quot;");
175 +
    return responseText.contains("action=choice.php")
176 +
        || responseText.contains("href=choice.php")
177 +
        || responseText.contains("name=\"whichchoice\"")
178 +
        || responseText.contains("href=\"choice.php");
429 179
  }
430 180
431 -
  public static class Option {
432 -
    private final String name;
433 -
    private final int option;
434 -
    private final AdventureResult items[];
181 +
  public static final void processChoiceAdventure(
182 +
      final GenericRequest request, final String initialURL, String responseText) {
183 +
    // You can no longer simply ignore a choice adventure.  One of
184 +
    // the options may have that effect, but we must at least run
185 +
    // choice.php to find out which choice it is.
435 186
436 -
    public Option(final String name) {
437 -
      this(name, 0, null, null, null);
438 -
    }
187 +
    // Get rid of extra fields - like "action=auto"
188 +
    request.constructURLString(initialURL);
439 189
440 -
    public Option(final String name, final int option) {
441 -
      this(name, option, null, null, null);
442 -
    }
190 +
    if (responseText == null) {
191 +
      GoalManager.updateProgress(GoalManager.GOAL_CHOICE);
192 +
      request.run();
443 193
444 -
    public Option(final String name, final int option, final String item1) {
445 -
      this(name, option, item1, null, null);
446 -
    }
194 +
      if (request.responseCode == 302) {
195 +
        return;
196 +
      }
447 197
448 -
    public Option(final String name, final int option, final String item1, String item2) {
449 -
      this(name, option, item1, item2, null);
198 +
      responseText = request.responseText;
199 +
    } else {
200 +
      request.responseText = responseText;
450 201
    }
451 202
452 -
    public Option(final String name, final String item1) {
453 -
      this(name, 0, item1, null, null);
203 +
    if (GenericRequest.passwordHash.equals("")) {
204 +
      return;
454 205
    }
455 206
456 -
    public Option(final String name, final String item1, String item2) {
457 -
      this(name, 0, item1, item2, null);
458 -
    }
207 +
    for (int stepCount = 0;
208 +
        !KoLmafia.refusesContinue() && ChoiceManager.stillInChoice(responseText);
209 +
        ++stepCount) {
210 +
      int choice = ChoiceUtilities.extractChoice(responseText);
211 +
      if (choice == 0) {
212 +
        // choice.php did not offer us any choices.
213 +
        // This would be a bug in KoL itself.
214 +
        // Bail now and let the user finish by hand.
459 215
460 -
    public Option(final String name, final String item1, String item2, String item3) {
461 -
      this(name, 0, item1, item2, item3);
462 -
    }
216 +
        KoLmafia.updateDisplay(MafiaState.ABORT, "Encountered choice adventure with no choices.");
217 +
        request.showInBrowser(true);
218 +
        return;
219 +
      }
220 +
221 +
      if (ChoiceManager.invokeChoiceAdventureScript(choice, responseText)) {
222 +
        if (FightRequest.choiceFollowsFight) {
223 +
          // The choice redirected to a fight, which was immediately lost,
224 +
          // but which leads to another choice.
225 +
          // Let the caller automate that one, if desired.
226 +
          return;
227 +
        }
463 228
464 -
    public Option(
465 -
        final String name, final int option, final String item1, String item2, String item3) {
466 -
      this.name = name;
467 -
      this.option = option;
468 -
      int count = item3 != null ? 3 : item2 != null ? 2 : item1 != null ? 1 : 0;
469 -
      this.items = new AdventureResult[count];
229 +
        if (!ChoiceManager.handlingChoice) {
230 +
          // The choiceAdventureScript processed this choice.
231 +
          return;
232 +
        }
470 233
471 -
      if (count > 0) {
472 -
        this.items[0] = ItemPool.get(ItemDatabase.getItemId(item1));
234 +
        // We are still handling a choice. Maybe it is a different one.
235 +
        if (ChoiceManager.lastResponseText != null
236 +
            && choice != ChoiceUtilities.extractChoice(ChoiceManager.lastResponseText)) {
237 +
          responseText = ChoiceManager.lastResponseText;
238 +
          continue;
239 +
        }
473 240
      }
474 241
475 -
      if (count > 1) {
476 -
        this.items[1] = ItemPool.get(ItemDatabase.getItemId(item2));
242 +
      // Either no choiceAdventure script or it left us in the same choice.
243 +
      if (!ChoiceManager.automateChoice(choice, request, stepCount)) {
244 +
        return;
477 245
      }
478 246
479 -
      if (count > 2) {
480 -
        this.items[2] = ItemPool.get(ItemDatabase.getItemId(item3));
247 +
      // We automated one choice. If it redirected to a
248 +
      // fight, quit automating the choice.
249 +
      if (request.redirectLocation != null) {
250 +
        return;
481 251
      }
482 -
    }
483 252
484 -
    public String getName() {
485 -
      return this.name;
253 +
      responseText = request.responseText;
486 254
    }
255 +
  }
487 256
488 -
    public int getOption() {
489 -
      return this.option;
257 +
  private static boolean invokeChoiceAdventureScript(final int choice, final String responseText) {
258 +
    if (responseText == null) {
259 +
      return false;
490 260
    }
491 261
492 -
    public int getDecision(final int def) {
493 -
      return this.option == 0 ? def : this.option;
262 +
    String scriptName = Preferences.getString("choiceAdventureScript").trim();
263 +
    if (scriptName.length() == 0) {
264 +
      return false;
494 265
    }
495 266
496 -
    public AdventureResult[] getItems() {
497 -
      return this.items;
498 -
    }
267 +
    List<File> scriptFiles = KoLmafiaCLI.findScriptFile(scriptName);
268 +
    ScriptRuntime interpreter = KoLmafiaASH.getInterpreter(scriptFiles);
499 269
500 -
    @Override
501 -
    public String toString() {
502 -
      return this.name;
270 +
    if (interpreter == null) {
271 +
      return false;
503 272
    }
504 -
  }
505 273
506 -
  public static class ChoiceAdventure implements Comparable<ChoiceAdventure> {
507 -
    private final int choice;
508 -
    private final String zone;
509 -
    private final String setting;
510 -
    private final String name;
511 -
    private final int ordering;
512 -
513 -
    private final Object[] options;
514 -
    private final Object[][] spoilers;
274 +
    File scriptFile = scriptFiles.get(0);
515 275
516 -
    public ChoiceAdventure(
517 -
        final String zone, final String setting, final String name, final Object[] options) {
518 -
      this(zone, setting, name, options, 0);
519 -
    }
276 +
    Object[] parameters = new Object[2];
277 +
    parameters[0] = Integer.valueOf(choice);
278 +
    parameters[1] = responseText;
520 279
521 -
    public ChoiceAdventure(
522 -
        final String zone,
523 -
        final String setting,
524 -
        final String name,
525 -
        final Object[] options,
526 -
        final int ordering) {
527 -
      this.zone = zone;
528 -
      this.setting = setting;
529 -
      this.choice = setting.equals("none") ? 0 : StringUtilities.parseInt(setting.substring(15));
530 -
      this.name = name;
531 -
      this.options = options;
532 -
      this.spoilers = new Object[][] {new String[] {setting}, new String[] {name}, options};
533 -
      this.ordering = ordering;
534 -
    }
280 +
    KoLmafiaASH.logScriptExecution(
281 +
        "Starting choice adventure script: ", scriptFile.getName(), interpreter);
535 282
536 -
    public int getChoice() {
537 -
      return this.choice;
538 -
    }
283 +
    // Since we are automating, let the script execute without interruption
284 +
    KoLmafia.forceContinue();
539 285
540 -
    public String getZone() {
541 -
      return this.zone;
542 -
    }
286 +
    interpreter.execute("main", parameters);
287 +
    KoLmafiaASH.logScriptExecution(
288 +
        "Finished choice adventure script: ", scriptFile.getName(), interpreter);
543 289
544 -
    public String getSetting() {
545 -
      return this.setting;
546 -
    }
290 +
    return true;
291 +
  }
547 292
548 -
    public String getName() {
549 -
      return this.name;
550 -
    }
293 +
  private static boolean automateChoice(
294 +
      final int choice, final GenericRequest request, final int stepCount) {
295 +
    // If this choice has special handling that can't be
296 +
    // handled by a single preference (extra fields, for
297 +
    // example), handle it elsewhere.
551 298
552 -
    public Object[] getOptions() {
553 -
      return (this.options == null)
554 -
          ? ChoiceManager.dynamicChoiceOptions(this.setting)
555 -
          : this.options;
299 +
    if (ChoiceManager.specialChoiceHandling(choice, request)) {
300 +
      // Should we abort?
301 +
      return false;
556 302
    }
557 303
558 -
    public Object[][] getSpoilers() {
559 -
      return this.spoilers;
560 -
    }
304 +
    String option = "choiceAdventure" + choice;
305 +
    String optionValue = Preferences.getString(option);
306 +
    int amp = optionValue.indexOf("&");
561 307
562 -
    @Override
563 -
    public int compareTo(final ChoiceAdventure o) {
564 -
      // Choices can have a specified relative ordering
565 -
      // within zone regardless of name or choice number
566 -
      if (this.ordering != o.ordering) {
567 -
        return this.ordering - o.ordering;
568 -
      }
308 +
    String decision = (amp == -1) ? optionValue : optionValue.substring(0, amp);
309 +
    String extraFields = (amp == -1) ? "" : optionValue.substring(amp + 1);
569 310
570 -
      if (ChoiceManager.choicesOrderedByName) {
571 -
        int result = this.name.compareToIgnoreCase(o.name);
311 +
    // If choice zero is not "Manual Control", adjust it to an actual choice
572 312
573 -
        if (result != 0) {
574 -
          return result;
575 -
        }
576 -
      }
313 +
    decision =
314 +
        ChoiceManager.specialChoiceDecision1(choice, decision, stepCount, request.responseText);
577 315
578 -
      return this.choice - o.choice;
579 -
    }
580 -
  }
316 +
    // If one of the decisions will satisfy a goal, take it
581 317
582 -
  // A ChoiceSpoiler is a ChoiceAdventure that isn't user-configurable.
583 -
  // The zone is optional, since it doesn't appear in the choiceadv GUI.
584 -
  public static class ChoiceSpoiler extends ChoiceAdventure {
585 -
    public ChoiceSpoiler(final String setting, final String name, final Object[] options) {
586 -
      super("Unsorted", setting, name, options);
587 -
    }
318 +
    decision = ChoiceManager.pickGoalChoice(choice, decision);
588 319
589 -
    public ChoiceSpoiler(
590 -
        final String zone, final String setting, final String name, final Object[] options) {
591 -
      super(zone, setting, name, options);
592 -
    }
593 -
  }
320 +
    // If this choice has special handling based on
321 +
    // character state, convert to real decision index
594 322
595 -
  // NULLCHOICE is returned for failed lookups, so the caller doesn't have to do null checks.
596 -
  public static final ChoiceSpoiler NULLCHOICE = new ChoiceSpoiler("none", "none", new String[] {});
323 +
    decision =
324 +
        ChoiceManager.specialChoiceDecision2(choice, decision, stepCount, request.responseText);
597 325
598 -
  private static boolean choicesOrderedByName = true;
326 +
    // Let user handle the choice manually, if requested
599 327
600 -
  public static final void setChoiceOrdering(final boolean choicesOrderedByName) {
601 -
    ChoiceManager.choicesOrderedByName = choicesOrderedByName;
602 -
  }
328 +
    if (decision.equals("0")) {
329 +
      KoLmafia.updateDisplay(MafiaState.ABORT, "Manual control requested for choice #" + choice);
330 +
      ChoiceUtilities.printChoices(ChoiceManager.lastResponseText);
331 +
      request.showInBrowser(true);
332 +
      return false;
333 +
    }
603 334
604 -
  private static final Object[] CHOICE_DATA = {
605 -
    // Choice 1 is unknown
606 -
607 -
    // Denim Axes Examined
608 -
    new ChoiceSpoiler(
609 -
        "choiceAdventure2",
610 -
        "Palindome",
611 -
        new Object[] {
612 -
          new Option("denim axe", "denim axe"), new Option("skip adventure", "rubber axe")
613 -
        }),
614 -
    // Denim Axes Examined
615 -
    new Object[] {2, 1, ItemPool.get(ItemPool.RUBBER_AXE, -1)},
616 -
617 -
    // The Oracle Will See You Now
618 -
    new ChoiceSpoiler(
619 -
        "choiceAdventure3",
620 -
        "Teleportitis",
621 -
        new Object[] {"skip adventure", "randomly sink 100 meat", "make plus sign usable"}),
622 -
623 -
    // Finger-Lickin'... Death.
624 -
    new ChoiceAdventure(
625 -
        "Beach",
626 -
        "choiceAdventure4",
627 -
        "South of the Border",
628 -
        new Object[] {
629 -
          "small meat boost", new Option("try for poultrygeist", "poultrygeist"), "skip adventure"
630 -
        }),
631 -
    // Finger-Lickin'... Death.
632 -
    new Object[] {4, 1, new AdventureResult(AdventureResult.MEAT, -500)},
633 -
    new Object[] {4, 2, new AdventureResult(AdventureResult.MEAT, -500)},
634 -
635 -
    // Heart of Very, Very Dark Darkness
636 -
    new ChoiceAdventure(
637 -
        "MusSign",
638 -
        "choiceAdventure5",
639 -
        "Gravy Barrow",
640 -
        new Object[] {"fight the fairy queen", "skip adventure"}),
641 -
642 -
    // Darker Than Dark
643 -
    new ChoiceSpoiler(
644 -
        "choiceAdventure6", "Gravy Barrow", new Object[] {"get Beaten Up", "skip adventure"}),
645 -
646 -
    // Choice 7 is How Depressing
647 -
648 -
    // On the Verge of a Dirge -> Self Explanatory
649 -
    new ChoiceSpoiler(
650 -
        "choiceAdventure8",
651 -
        "Gravy Barrow",
652 -
        new Object[] {"enter the chamber", "enter the chamber", "enter the chamber"}),
653 -
654 -
    // Wheel In the Sky Keep on Turning: Muscle Position
655 -
    new ChoiceSpoiler(
656 -
        "choiceAdventure9",
657 -
        "Castle Wheel",
658 -
        new Object[] {"Turn to mysticality", "Turn to moxie", "Leave at muscle"}),
659 -
660 -
    // Wheel In the Sky Keep on Turning: Mysticality Position
661 -
    new ChoiceSpoiler(
662 -
        "choiceAdventure10",
663 -
        "Castle Wheel",
664 -
        new Object[] {"Turn to Map Quest", "Turn to muscle", "Leave at mysticality"}),
665 -
666 -
    // Wheel In the Sky Keep on Turning: Map Quest Position
667 -
    new ChoiceSpoiler(
668 -
        "choiceAdventure11",
669 -
        "Castle Wheel",
670 -
        new Object[] {"Turn to moxie", "Turn to mysticality", "Leave at map quest"}),
671 -
672 -
    // Wheel In the Sky Keep on Turning: Moxie Position
673 -
    new ChoiceSpoiler(
674 -
        "choiceAdventure12",
675 -
        "Castle Wheel",
676 -
        new Object[] {"Turn to muscle", "Turn to map quest", "Leave at moxie"}),
677 -
678 -
    // Choice 13 is unknown
679 -
680 -
    // A Bard Day's Night
681 -
    new ChoiceAdventure(
682 -
        "Knob",
683 -
        "choiceAdventure14",
684 -
        "Cobb's Knob Harem",
685 -
        new Object[] {
686 -
          new Option("Knob goblin harem veil", "Knob goblin harem veil"),
687 -
          new Option("Knob goblin harem pants", "Knob goblin harem pants"),
688 -
          "small meat boost",
689 -
          "complete the outfit"
690 -
        }),
691 -
692 -
    // Yeti Nother Hippy
693 -
    new ChoiceAdventure(
694 -
        "McLarge",
695 -
        "choiceAdventure15",
696 -
        "eXtreme Slope",
697 -
        new Object[] {
698 -
          new Option("eXtreme mittens", "eXtreme mittens"),
699 -
          new Option("eXtreme scarf", "eXtreme scarf"),
700 -
          "small meat boost",
701 -
          "complete the outfit"
702 -
        }),
703 -
704 -
    // Saint Beernard
705 -
    new ChoiceAdventure(
706 -
        "McLarge",
707 -
        "choiceAdventure16",
708 -
        "eXtreme Slope",
709 -
        new Object[] {
710 -
          new Option("snowboarder pants", "snowboarder pants"),
711 -
          new Option("eXtreme scarf", "eXtreme scarf"),
712 -
          "small meat boost",
713 -
          "complete the outfit"
714 -
        }),
715 -
716 -
    // Generic Teen Comedy
717 -
    new ChoiceAdventure(
718 -
        "McLarge",
719 -
        "choiceAdventure17",
720 -
        "eXtreme Slope",
721 -
        new Object[] {
722 -
          new Option("eXtreme mittens", "eXtreme mittens"),
723 -
          new Option("snowboarder pants", "snowboarder pants"),
724 -
          "small meat boost",
725 -
          "complete the outfit"
726 -
        }),
727 -
728 -
    // A Flat Miner
729 -
    new ChoiceAdventure(
730 -
        "McLarge",
731 -
        "choiceAdventure18",
732 -
        "Itznotyerzitz Mine",
733 -
        new Object[] {
734 -
          new Option("miner's pants", "miner's pants"),
735 -
          new Option("7-Foot Dwarven mattock", "7-Foot Dwarven mattock"),
736 -
          "small meat boost",
737 -
          "complete the outfit"
738 -
        }),
739 -
740 -
    // 100% Legal
741 -
    new ChoiceAdventure(
742 -
        "McLarge",
743 -
        "choiceAdventure19",
744 -
        "Itznotyerzitz Mine",
745 -
        new Object[] {
746 -
          new Option("miner's helmet", "miner's helmet"),
747 -
          new Option("miner's pants", "miner's pants"),
748 -
          "small meat boost",
749 -
          "complete the outfit"
750 -
        }),
751 -
752 -
    // See You Next Fall
753 -
    new ChoiceAdventure(
754 -
        "McLarge",
755 -
        "choiceAdventure20",
756 -
        "Itznotyerzitz Mine",
757 -
        new Object[] {
758 -
          new Option("miner's helmet", "miner's helmet"),
759 -
          new Option("7-Foot Dwarven mattock", "7-Foot Dwarven mattock"),
760 -
          "small meat boost",
761 -
          "complete the outfit"
762 -
        }),
763 -
764 -
    // Under the Knife
765 -
    new ChoiceAdventure(
766 -
        "Town",
767 -
        "choiceAdventure21",
768 -
        "Sleazy Back Alley",
769 -
        new Object[] {"switch genders", "skip adventure"}),
770 -
    // Under the Knife
771 -
    new Object[] {21, 1, new AdventureResult(AdventureResult.MEAT, -500)},
772 -
773 -
    // The Arrrbitrator
774 -
    new ChoiceAdventure(
775 -
        "Island",
776 -
        "choiceAdventure22",
777 -
        "Pirate's Cove",
778 -
        new Object[] {
779 -
          new Option("eyepatch", "eyepatch"),
780 -
          new Option("swashbuckling pants", "swashbuckling pants"),
781 -
          "small meat boost",
782 -
          "complete the outfit"
783 -
        }),
784 -
785 -
    // Barrie Me at Sea
786 -
    new ChoiceAdventure(
787 -
        "Island",
788 -
        "choiceAdventure23",
789 -
        "Pirate's Cove",
790 -
        new Object[] {
791 -
          new Option("stuffed shoulder parrot", "stuffed shoulder parrot"),
792 -
          new Option("swashbuckling pants", "swashbuckling pants"),
793 -
          "small meat boost",
794 -
          "complete the outfit"
795 -
        }),
796 -
797 -
    // Amatearrr Night
798 -
    new ChoiceAdventure(
799 -
        "Island",
800 -
        "choiceAdventure24",
801 -
        "Pirate's Cove",
802 -
        new Object[] {
803 -
          new Option("stuffed shoulder parrot", "stuffed shoulder parrot"),
804 -
          "small meat boost",
805 -
          new Option("eyepatch", "eyepatch"),
806 -
          "complete the outfit"
807 -
        }),
808 -
809 -
    // Ouch! You bump into a door!
810 -
    new ChoiceAdventure(
811 -
        "Dungeon",
812 -
        "choiceAdventure25",
813 -
        "Dungeon of Doom",
814 -
        new Object[] {
815 -
          new Option("magic lamp", "magic lamp"),
816 -
          new Option("dead mimic", "dead mimic"),
817 -
          "skip adventure"
818 -
        }),
819 -
    // Ouch! You bump into a door!
820 -
    new Object[] {25, 1, new AdventureResult(AdventureResult.MEAT, -50)},
821 -
    new Object[] {25, 2, new AdventureResult(AdventureResult.MEAT, -5000)},
822 -
823 -
    // A Three-Tined Fork
824 -
    new ChoiceSpoiler(
825 -
        "Woods",
826 -
        "choiceAdventure26",
827 -
        "Spooky Forest",
828 -
        new Object[] {"muscle classes", "mysticality classes", "moxie classes"}),
829 -
830 -
    // Footprints
831 -
    new ChoiceSpoiler(
832 -
        "Woods",
833 -
        "choiceAdventure27",
834 -
        "Spooky Forest",
835 -
        new Object[] {AscensionClass.SEAL_CLUBBER, AscensionClass.TURTLE_TAMER}),
836 -
837 -
    // A Pair of Craters
838 -
    new ChoiceSpoiler(
839 -
        "Woods",
840 -
        "choiceAdventure28",
841 -
        "Spooky Forest",
842 -
        new Object[] {AscensionClass.PASTAMANCER, AscensionClass.SAUCEROR}),
843 -
844 -
    // The Road Less Visible
845 -
    new ChoiceSpoiler(
846 -
        "Woods",
847 -
        "choiceAdventure29",
848 -
        "Spooky Forest",
849 -
        new Object[] {AscensionClass.DISCO_BANDIT, AscensionClass.ACCORDION_THIEF}),
850 -
851 -
    // Choices 30 - 39 are unknown
852 -
853 -
    // The Effervescent Fray
854 -
    new ChoiceAdventure(
855 -
        "Rift",
856 -
        "choiceAdventure40",
857 -
        "Cola Wars",
858 -
        new Object[] {
859 -
          new Option("Cloaca-Cola fatigues", "Cloaca-Cola fatigues"),
860 -
          new Option("Dyspepsi-Cola shield", "Dyspepsi-Cola shield"),
861 -
          "mysticality substats"
862 -
        }),
863 -
864 -
    // Smells Like Team Spirit
865 -
    new ChoiceAdventure(
866 -
        "Rift",
867 -
        "choiceAdventure41",
868 -
        "Cola Wars",
869 -
        new Object[] {
870 -
          new Option("Dyspepsi-Cola fatigues", "Dyspepsi-Cola fatigues"),
871 -
          new Option("Cloaca-Cola helmet", "Cloaca-Cola helmet"),
872 -
          "muscle substats"
873 -
        }),
874 -
875 -
    // What is it Good For?
876 -
    new ChoiceAdventure(
877 -
        "Rift",
878 -
        "choiceAdventure42",
879 -
        "Cola Wars",
880 -
        new Object[] {
881 -
          new Option("Dyspepsi-Cola helmet", "Dyspepsi-Cola helmet"),
882 -
          new Option("Cloaca-Cola shield", "Cloaca-Cola shield"),
883 -
          "moxie substats"
884 -
        }),
885 -
886 -
    // Choices 43 - 44 are unknown
887 -
888 -
    // Maps and Legends
889 -
    new ChoiceSpoiler(
890 -
        "Woods",
891 -
        "choiceAdventure45",
892 -
        "Spooky Forest",
893 -
        new Object[] {
894 -
          new Option("Spooky Temple map", "Spooky Temple map"), "skip adventure", "skip adventure"
895 -
        }),
896 -
897 -
    // An Interesting Choice
898 -
    new ChoiceAdventure(
899 -
        "Woods",
900 -
        "choiceAdventure46",
901 -
        "Spooky Forest Vampire",
902 -
        new Object[] {
903 -
          "moxie substats", "muscle substats", new Option("vampire heart", "vampire heart")
904 -
        }),
905 -
906 -
    // Have a Heart
907 -
    new ChoiceAdventure(
908 -
        "Woods",
909 -
        "choiceAdventure47",
910 -
        "Spooky Forest Vampire Hunter",
911 -
        new Object[] {
912 -
          new Option("bottle of used blood", "bottle of used blood"),
913 -
          new Option("skip adventure and keep vampire hearts", "vampire heart")
914 -
        }),
915 -
    // Have a Heart
916 -
    // This trades all vampire hearts for an equal number of
917 -
    // bottles of used blood.
918 -
    new Object[] {47, 1, ItemPool.get(ItemPool.VAMPIRE_HEART, 1)},
919 -
920 -
    // Choices 48 - 70 are violet fog adventures
921 -
    // Choice 71 is A Journey to the Center of Your Mind
922 -
923 -
    // Lording Over The Flies
924 -
    new ChoiceAdventure(
925 -
        "Island",
926 -
        "choiceAdventure72",
927 -
        "Frat House",
928 -
        new Object[] {
929 -
          new Option("around the world", "around the world"),
930 -
          new Option("skip adventure", "Spanish fly")
931 -
        }),
932 -
    // Lording Over The Flies
933 -
    // This trades all Spanish flies for around the worlds,
934 -
    // in multiples of 5.  Excess flies are left in inventory.
935 -
    new Object[] {72, 1, ItemPool.get(ItemPool.SPANISH_FLY, 5)},
936 -
937 -
    // Don't Fence Me In
938 -
    new ChoiceAdventure(
939 -
        "Woods",
940 -
        "choiceAdventure73",
941 -
        "Whitey's Grove",
942 -
        new Object[] {
943 -
          "muscle substats",
944 -
          new Option("white picket fence", "white picket fence"),
945 -
          new Option("wedding cake, white rice 3x (+2x w/ rice bowl)", "piece of wedding cake")
946 -
        }),
947 -
948 -
    // The Only Thing About Him is the Way That He Walks
949 -
    new ChoiceAdventure(
950 -
        "Woods",
951 -
        "choiceAdventure74",
952 -
        "Whitey's Grove",
953 -
        new Object[] {
954 -
          "moxie substats",
955 -
          new Option("boxed wine", "boxed wine"),
956 -
          new Option("mullet wig", "mullet wig")
957 -
        }),
958 -
959 -
    // Rapido!
960 -
    new ChoiceAdventure(
961 -
        "Woods",
962 -
        "choiceAdventure75",
963 -
        "Whitey's Grove",
964 -
        new Object[] {
965 -
          "mysticality substats",
966 -
          new Option("white lightning", "white lightning"),
967 -
          new Option("white collar", "white collar")
968 -
        }),
969 -
970 -
    // Junction in the Trunction
971 -
    new ChoiceAdventure(
972 -
        "Knob",
973 -
        "choiceAdventure76",
974 -
        "Knob Shaft",
975 -
        new Object[] {
976 -
          new Option("cardboard ore", "cardboard ore"),
977 -
          new Option("styrofoam ore", "styrofoam ore"),
978 -
          new Option("bubblewrap ore", "bubblewrap ore")
979 -
        }),
980 -
981 -
    // History is Fun!
982 -
    new ChoiceSpoiler(
983 -
        "choiceAdventure86",
984 -
        "Haunted Library",
985 -
        new Object[] {"Spookyraven Chapter 1", "Spookyraven Chapter 2", "Spookyraven Chapter 3"}),
986 -
987 -
    // History is Fun!
988 -
    new ChoiceSpoiler(
989 -
        "choiceAdventure87",
990 -
        "Haunted Library",
991 -
        new Object[] {"Spookyraven Chapter 4", "Spookyraven Chapter 5", "Spookyraven Chapter 6"}),
992 -
993 -
    // Naughty, Naughty
994 -
    new ChoiceSpoiler(
995 -
        "choiceAdventure88",
996 -
        "Haunted Library",
997 -
        new Object[] {"mysticality substats", "moxie substats", "Fettucini / Scarysauce"}),
998 -
    new ChoiceSpoiler(
999 -
        "choiceAdventure89",
1000 -
        "Haunted Gallery",
1001 -
        new Object[] {"Wolf Knight", "Snake Knight", "Dreams and Lights", "skip adventure"}),
1002 -
1003 -
    // Curtains
1004 -
    new ChoiceAdventure(
1005 -
        "Manor2",
1006 -
        "choiceAdventure90",
1007 -
        "Haunted Ballroom",
1008 -
        new Object[] {"enter combat", "moxie substats", "skip adventure"}),
1009 -
1010 -
    // Having a Medicine Ball
1011 -
    new ChoiceAdventure(
1012 -
        "Manor2",
1013 -
        "choiceAdventure105",
1014 -
        "Haunted Bathroom",
1015 -
        new Object[] {"mysticality substats", "other options", "guy made of bees"}),
1016 -
1017 -
    // Strung-Up Quartet
1018 -
    new ChoiceAdventure(
1019 -
        "Manor2",
1020 -
        "choiceAdventure106",
1021 -
        "Haunted Ballroom",
1022 -
        new Object[] {
1023 -
          "increase monster level",
1024 -
          "decrease combat frequency",
1025 -
          "increase item drops",
1026 -
          "disable song"
1027 -
        }),
1028 -
1029 -
    // Bad Medicine is What You Need
1030 -
    new ChoiceAdventure(
1031 -
        "Manor2",
1032 -
        "choiceAdventure107",
1033 -
        "Haunted Bathroom",
1034 -
        new Object[] {
1035 -
          new Option("antique bottle of cough syrup", "antique bottle of cough syrup"),
1036 -
          new Option("tube of hair oil", "tube of hair oil"),
1037 -
          new Option("bottle of ultravitamins", "bottle of ultravitamins"),
1038 -
          "skip adventure"
1039 -
        }),
1040 -
1041 -
    // Aww, Craps
1042 -
    new ChoiceAdventure(
1043 -
        "Town",
1044 -
        "choiceAdventure108",
1045 -
        "Sleazy Back Alley",
1046 -
        new Object[] {"moxie substats", "meat and moxie", "random effect", "skip adventure"}),
1047 -
1048 -
    // Dumpster Diving
1049 -
    new ChoiceAdventure(
1050 -
        "Town",
1051 -
        "choiceAdventure109",
1052 -
        "Sleazy Back Alley",
1053 -
        new Object[] {
1054 -
          "enter combat", "meat and moxie", new Option("Mad Train wine", "Mad Train wine")
1055 -
        }),
1056 -
1057 -
    // The Entertainer
1058 -
    new ChoiceAdventure(
1059 -
        "Town",
1060 -
        "choiceAdventure110",
1061 -
        "Sleazy Back Alley",
1062 -
        new Object[] {"moxie substats", "moxie and muscle", "small meat boost", "skip adventure"}),
1063 -
1064 -
    // Malice in Chains
1065 -
    new ChoiceAdventure(
1066 -
        "Knob",
1067 -
        "choiceAdventure111",
1068 -
        "Outskirts of The Knob",
1069 -
        new Object[] {"muscle substats", "muscle substats", "enter combat"}),
1070 -
1071 -
    // Please, Hammer
1072 -
    new ChoiceAdventure(
1073 -
        "Town",
1074 -
        "choiceAdventure112",
1075 -
        "Sleazy Back Alley",
1076 -
        new Object[] {"accept hammer quest", "reject quest", "muscle substats"}),
1077 -
1078 -
    // Knob Goblin BBQ
1079 -
    new ChoiceAdventure(
1080 -
        "Knob",
1081 -
        "choiceAdventure113",
1082 -
        "Outskirts of The Knob",
1083 -
        new Object[] {"complete cake quest", "enter combat", "get a random item"}),
1084 -
1085 -
    // The Baker's Dilemma
1086 -
    new ChoiceAdventure(
1087 -
        "Manor1",
1088 -
        "choiceAdventure114",
1089 -
        "Haunted Pantry",
1090 -
        new Object[] {"accept cake quest", "reject quest", "moxie and meat"}),
1091 -
1092 -
    // Oh No, Hobo
1093 -
    new ChoiceAdventure(
1094 -
        "Manor1",
1095 -
        "choiceAdventure115",
1096 -
        "Haunted Pantry",
1097 -
        new Object[] {"enter combat", "Good Karma", "mysticality, moxie, and meat"}),
1098 -
1099 -
    // The Singing Tree
1100 -
    new ChoiceAdventure(
1101 -
        "Manor1",
1102 -
        "choiceAdventure116",
1103 -
        "Haunted Pantry",
1104 -
        new Object[] {"mysticality substats", "moxie substats", "random effect", "skip adventure"}),
1105 -
1106 -
    // Tresspasser
1107 -
    new ChoiceAdventure(
1108 -
        "Manor1",
1109 -
        "choiceAdventure117",
1110 -
        "Haunted Pantry",
1111 -
        new Object[] {"enter combat", "mysticality substats", "get a random item"}),
1112 -
1113 -
    // When Rocks Attack
1114 -
    new ChoiceAdventure(
1115 -
        "Knob",
1116 -
        "choiceAdventure118",
1117 -
        "Outskirts of The Knob",
1118 -
        new Object[] {"accept unguent quest", "skip adventure"}),
1119 -
1120 -
    // Choice 119 is Check It Out Now
1121 -
1122 -
    // Ennui is Wasted on the Young
1123 -
    new ChoiceAdventure(
1124 -
        "Knob",
1125 -
        "choiceAdventure120",
1126 -
        "Outskirts of The Knob",
1127 -
        new Object[] {
1128 -
          "muscle and Pumped Up",
1129 -
          new Option("ice cold Sir Schlitz", "ice cold Sir Schlitz"),
1130 -
          new Option("moxie and lemon", "lemon"),
1131 -
          "skip adventure"
1132 -
        }),
1133 -
1134 -
    // Choice 121 is Next Sunday, A.D.
1135 -
    // Choice 122 is unknown
1136 -
1137 -
    // At Least It's Not Full Of Trash
1138 -
    new ChoiceSpoiler(
1139 -
        "choiceAdventure123",
1140 -
        "Hidden Temple",
1141 -
        new Object[] {"lose HP", "Unlock Quest Puzzle", "lose HP"}),
1142 -
1143 -
    // Choice 124 is unknown
1144 -
1145 -
    // No Visible Means of Support
1146 -
    new ChoiceSpoiler(
1147 -
        "choiceAdventure125",
1148 -
        "Hidden Temple",
1149 -
        new Object[] {"lose HP", "lose HP", "Unlock Hidden City"}),
1150 -
1151 -
    // Sun at Noon, Tan Us
1152 -
    new ChoiceAdventure(
1153 -
        "Plains",
1154 -
        "choiceAdventure126",
1155 -
        "Palindome",
1156 -
        new Object[] {"moxie", "chance of more moxie", "sunburned"}),
1157 -
1158 -
    // No sir, away!  A papaya war is on!
1159 -
    new ChoiceSpoiler(
1160 -
        "Plains",
1161 -
        "choiceAdventure127",
1162 -
        "Palindome",
1163 -
        new Object[] {new Option("3 papayas", "papaya"), "trade 3 papayas for stats", "stats"}),
1164 -
    // No sir, away!  A papaya war is on!
1165 -
    new Object[] {127, 2, ItemPool.get(ItemPool.PAPAYA, -3)},
1166 -
1167 -
    // Choice 128 is unknown
1168 -
1169 -
    // Do Geese See God?
1170 -
    new ChoiceSpoiler(
1171 -
        "Plains",
1172 -
        "choiceAdventure129",
1173 -
        "Palindome",
1174 -
        new Object[] {new Option("photograph of God", "photograph of God"), "skip adventure"}),
1175 -
    // Do Geese See God?
1176 -
    new Object[] {129, 1, new AdventureResult(AdventureResult.MEAT, -500)},
1177 -
1178 -
    // Choice 133 is unknown
1179 -
1180 -
    // Peace Wants Love
1181 -
    new ChoiceAdventure(
1182 -
        "Island",
1183 -
        "choiceAdventure136",
1184 -
        "Hippy Camp",
1185 -
        new Object[] {
1186 -
          new Option("filthy corduroys", "filthy corduroys"),
1187 -
          new Option("filthy knitted dread sack", "filthy knitted dread sack"),
1188 -
          "small meat boost",
1189 -
          "complete the outfit"
1190 -
        }),
1191 -
1192 -
    // An Inconvenient Truth
1193 -
    new ChoiceAdventure(
1194 -
        "Island",
1195 -
        "choiceAdventure137",
1196 -
        "Hippy Camp",
1197 -
        new Object[] {
1198 -
          new Option("filthy knitted dread sack", "filthy knitted dread sack"),
1199 -
          new Option("filthy corduroys", "filthy corduroys"),
1200 -
          "small meat boost",
1201 -
          "complete the outfit"
1202 -
        }),
1203 -
1204 -
    // Purple Hazers
1205 -
    new ChoiceAdventure(
1206 -
        "Island",
1207 -
        "choiceAdventure138",
1208 -
        "Frat House",
1209 -
        new Object[] {
1210 -
          new Option("Orcish cargo shorts", "Orcish cargo shorts"),
1211 -
          new Option("Orcish baseball cap", "Orcish baseball cap"),
1212 -
          new Option("Orcish frat-paddle", "Orcish frat-paddle"),
1213 -
          "complete the outfit"
1214 -
        }),
1215 -
1216 -
    // Bait and Switch
1217 -
    new ChoiceAdventure(
1218 -
        "IsleWar",
1219 -
        "choiceAdventure139",
1220 -
        "War Hippies",
1221 -
        new Object[] {"muscle substats", new Option("ferret bait", "ferret bait"), "enter combat"}),
1222 -
1223 -
    // The Thin Tie-Dyed Line
1224 -
    new ChoiceAdventure(
1225 -
        "IsleWar",
1226 -
        "choiceAdventure140",
1227 -
        "War Hippies",
1228 -
        new Object[] {
1229 -
          new Option("water pipe bombs", "water pipe bomb"), "moxie substats", "enter combat"
1230 -
        }),
1231 -
1232 -
    // Blockin' Out the Scenery
1233 -
    new ChoiceAdventure(
1234 -
        "IsleWar",
1235 -
        "choiceAdventure141",
1236 -
        "War Hippies",
1237 -
        new Object[] {"mysticality substats", "get some hippy food", "waste a turn"}),
1238 -
1239 -
    // Blockin' Out the Scenery
1240 -
    new ChoiceAdventure(
1241 -
        "IsleWar",
1242 -
        "choiceAdventure142",
1243 -
        "War Hippies",
1244 -
        new Object[] {"mysticality substats", "get some hippy food", "start the war"}),
1245 -
1246 -
    // Catching Some Zetas
1247 -
    new ChoiceAdventure(
1248 -
        "IsleWar",
1249 -
        "choiceAdventure143",
1250 -
        "War Fraternity",
1251 -
        new Object[] {"muscle substats", new Option("sake bombs", "sake bomb"), "enter combat"}),
1252 -
1253 -
    // One Less Room Than In That Movie
1254 -
    new ChoiceAdventure(
1255 -
        "IsleWar",
1256 -
        "choiceAdventure144",
1257 -
        "War Fraternity",
1258 -
        new Object[] {"moxie substats", new Option("beer bombs", "beer bomb"), "enter combat"}),
1259 -
1260 -
    // Fratacombs
1261 -
    new ChoiceAdventure(
1262 -
        "IsleWar",
1263 -
        "choiceAdventure145",
1264 -
        "War Fraternity",
1265 -
        new Object[] {"muscle substats", "get some frat food", "waste a turn"}),
1266 -
1267 -
    // Fratacombs
1268 -
    new ChoiceAdventure(
1269 -
        "IsleWar",
1270 -
        "choiceAdventure146",
1271 -
        "War Fraternity",
1272 -
        new Object[] {"muscle substats", "get some frat food", "start the war"}),
1273 -
1274 -
    // Cornered!
1275 -
    new ChoiceAdventure(
1276 -
        "Farm",
1277 -
        "choiceAdventure147",
1278 -
        "McMillicancuddy's Barn",
1279 -
        new Object[] {"Open The Granary (meat)", "Open The Bog (stench)", "Open The Pond (cold)"}),
1280 -
1281 -
    // Cornered Again!
1282 -
    new ChoiceAdventure(
1283 -
        "Farm",
1284 -
        "choiceAdventure148",
1285 -
        "McMillicancuddy's Barn",
1286 -
        new Object[] {"Open The Back 40 (hot)", "Open The Family Plot (spooky)"}),
1287 -
1288 -
    // How Many Corners Does this Stupid Barn Have!?
1289 -
    new ChoiceAdventure(
1290 -
        "Farm",
1291 -
        "choiceAdventure149",
1292 -
        "McMillicancuddy's Barn",
1293 -
        new Object[] {"Open The Shady Thicket (booze)", "Open The Other Back 40 (sleaze)"}),
1294 -
1295 -
    // Choice 150 is Another Adventure About BorderTown
1296 -
1297 -
    // Adventurer, $1.99
1298 -
    new ChoiceAdventure(
1299 -
        "Plains",
1300 -
        "choiceAdventure151",
1301 -
        "Fun House",
1302 -
        new Object[] {"fight the clownlord", "skip adventure"}),
1303 -
1304 -
    // Lurking at the Threshold
1305 -
    new ChoiceSpoiler(
1306 -
        "Plains",
1307 -
        "choiceAdventure152",
1308 -
        "Fun House",
1309 -
        new Object[] {"fight the clownlord", "skip adventure"}),
1310 -
1311 -
    // Turn Your Head and Coffin
1312 -
    new ChoiceAdventure(
1313 -
        "Cyrpt",
1314 -
        "choiceAdventure153",
1315 -
        "Defiled Alcove",
1316 -
        new Object[] {
1317 -
          "muscle substats",
1318 -
          "small meat boost",
1319 -
          new Option("half-rotten brain", "half-rotten brain"),
1320 -
          "skip adventure"
1321 -
        }),
1322 -
1323 -
    // Choice 154 used to be Doublewide
1324 -
1325 -
    // Skull, Skull, Skull
1326 -
    new ChoiceAdventure(
1327 -
        "Cyrpt",
1328 -
        "choiceAdventure155",
1329 -
        "Defiled Nook",
1330 -
        new Object[] {
1331 -
          "moxie substats",
1332 -
          "small meat boost",
1333 -
          new Option("rusty bonesaw", "rusty bonesaw"),
1334 -
          new Option("debonair deboner", "debonair deboner"),
1335 -
          "skip adventure"
1336 -
        }),
1337 -
1338 -
    // Choice 156 used to be Pileup
1339 -
1340 -
    // Urning Your Keep
1341 -
    new ChoiceAdventure(
1342 -
        "Cyrpt",
1343 -
        "choiceAdventure157",
1344 -
        "Defiled Niche",
1345 -
        new Object[] {
1346 -
          "mysticality substats",
1347 -
          new Option("plus-sized phylactery", "plus-sized phylactery"),
1348 -
          "small meat boost",
1349 -
          "skip adventure"
1350 -
        }),
1351 -
1352 -
    // Choice 158 used to be Lich in the Niche
1353 -
    // Choice 159 used to be Go Slow Past the Drawers
1354 -
    // Choice 160 used to be Lunchtime
1355 -
1356 -
    // Choice 161 is Bureaucracy of the Damned
1357 -
1358 -
    // Between a Rock and Some Other Rocks
1359 -
    new ChoiceSpoiler(
1360 -
        "choiceAdventure162", "Goatlet", new Object[] {"Open Goatlet", "skip adventure"}),
1361 -
1362 -
    // Melvil Dewey Would Be Ashamed
1363 -
    new ChoiceAdventure(
1364 -
        "Manor1",
1365 -
        "choiceAdventure163",
1366 -
        "Haunted Library",
1367 -
        new Object[] {
1368 -
          new Option("Necrotelicomnicon", "Necrotelicomnicon"),
1369 -
          new Option("Cookbook of the Damned", "Cookbook of the Damned"),
1370 -
          new Option("Sinful Desires", "Sinful Desires"),
1371 -
          "skip adventure"
1372 -
        }),
1373 -
1374 -
    // The Wormwood choices always come in order
1375 -
1376 -
    // 1: 164, 167, 170
1377 -
    // 2: 165, 168, 171
1378 -
    // 3: 166, 169, 172
1379 -
1380 -
    // Some first-round choices give you an effect for five turns:
1381 -
1382 -
    // 164/2 -> Spirit of Alph
1383 -
    // 167/3 -> Bats in the Belfry
1384 -
    // 170/1 -> Rat-Faced
1385 -
1386 -
    // First-round effects modify some second round options and
1387 -
    // give you a second effect for five rounds. If you do not have
1388 -
    // the appropriate first-round effect, these second-round
1389 -
    // options do not consume an adventure.
1390 -
1391 -
    // 165/1 + Rat-Faced -> Night Vision
1392 -
    // 165/2 + Bats in the Belfry -> Good with the Ladies
1393 -
    // 168/2 + Spirit of Alph -> Feelin' Philosophical
1394 -
    // 168/2 + Rat-Faced -> Unusual Fashion Sense
1395 -
    // 171/1 + Bats in the Belfry -> No Vertigo
1396 -
    // 171/3 + Spirit of Alph -> Dancing Prowess
1397 -
1398 -
    // Second-round effects modify some third round options and
1399 -
    // give you an item. If you do not have the appropriate
1400 -
    // second-round effect, most of these third-round options do
1401 -
    // not consume an adventure.
1402 -
1403 -
    // 166/1 + No Vertigo -> S.T.L.T.
1404 -
    // 166/3 + Unusual Fashion Sense -> albatross necklace
1405 -
    // 169/1 + Night Vision -> flask of Amontillado
1406 -
    // 169/3 + Dancing Prowess -> fancy ball mask
1407 -
    // 172/1 + Good with the Ladies -> Can-Can skirt
1408 -
    // 172/1 -> combat
1409 -
    // 172/2 + Feelin' Philosophical -> not-a-pipe
1410 -
1411 -
    // Down by the Riverside
1412 -
    new ChoiceAdventure(
1413 -
        "Wormwood",
1414 -
        "choiceAdventure164",
1415 -
        "Pleasure Dome",
1416 -
        new Object[] {"muscle substats", "MP & Spirit of Alph", "enter combat"}),
1417 -
1418 -
    // Beyond Any Measure
1419 -
    new ChoiceAdventure(
1420 -
        "Wormwood",
1421 -
        "choiceAdventure165",
1422 -
        "Pleasure Dome",
1423 -
        new Object[] {
1424 -
          "Rat-Faced -> Night Vision",
1425 -
          "Bats in the Belfry -> Good with the Ladies",
1426 -
          "mysticality	     substats",
1427 -
          "skip adventure"
1428 -
        }),
1429 -
1430 -
    // Death is a Boat
1431 -
    new ChoiceAdventure(
1432 -
        "Wormwood",
1433 -
        "choiceAdventure166",
1434 -
        "Pleasure Dome",
1435 -
        new Object[] {
1436 -
          new Option("No Vertigo -> S.T.L.T.", "S.T.L.T."),
1437 -
          "moxie substats",
1438 -
          new Option("Unusual Fashion Sense -> albatross necklace", "albatross necklace")
1439 -
        }),
1440 -
1441 -
    // It's a Fixer-Upper
1442 -
    new ChoiceAdventure(
1443 -
        "Wormwood",
1444 -
        "choiceAdventure167",
1445 -
        "Moulder Mansion",
1446 -
        new Object[] {"enter combat", "mysticality substats", "HP & MP & Bats in the Belfry"}),
1447 -
1448 -
    // Midst the Pallor of the Parlor
1449 -
    new ChoiceAdventure(
1450 -
        "Wormwood",
1451 -
        "choiceAdventure168",
1452 -
        "Moulder Mansion",
1453 -
        new Object[] {
1454 -
          "moxie substats",
1455 -
          "Spirit of Alph -> Feelin' Philosophical",
1456 -
          "Rat-Faced -> Unusual Fashion Sense"
1457 -
        }),
1458 -
1459 -
    // A Few Chintz Curtains, Some Throw Pillows, It
1460 -
    new ChoiceAdventure(
1461 -
        "Wormwood",
1462 -
        "choiceAdventure169",
1463 -
        "Moulder Mansion",
1464 -
        new Object[] {
1465 -
          new Option("Night Vision -> flask of Amontillado", "flask of Amontillado"),
1466 -
          "muscle substats",
1467 -
          new Option("Dancing Prowess -> fancy ball mask", "fancy ball mask")
1468 -
        }),
1469 -
1470 -
    // La Vie Boheme
1471 -
    new ChoiceAdventure(
1472 -
        "Wormwood",
1473 -
        "choiceAdventure170",
1474 -
        "Rogue Windmill",
1475 -
        new Object[] {"HP & Rat-Faced", "enter combat", "moxie substats"}),
1476 -
1477 -
    // Backstage at the Rogue Windmill
1478 -
    new ChoiceAdventure(
1479 -
        "Wormwood",
1480 -
        "choiceAdventure171",
1481 -
        "Rogue Windmill",
1482 -
        new Object[] {
1483 -
          "Bats in the Belfry -> No Vertigo", "muscle substats", "Spirit of Alph -> Dancing Prowess"
1484 -
        }),
1485 -
1486 -
    // Up in the Hippo Room
1487 -
    new ChoiceAdventure(
1488 -
        "Wormwood",
1489 -
        "choiceAdventure172",
1490 -
        "Rogue Windmill",
1491 -
        new Object[] {
1492 -
          new Option("Good with the Ladies -> Can-Can skirt", "Can-Can skirt"),
1493 -
          new Option("Feelin' Philosophical -> not-a-pipe", "not-a-pipe"),
1494 -
          "mysticality substats"
1495 -
        }),
1496 -
1497 -
    // Choice 173 is The Last Stand, Man
1498 -
    // Choice 174 is The Last Stand, Bra
1499 -
    // Choice 175-176 are unknown
1500 -
1501 -
    // Choice 177 was The Blackberry Cobbler
1502 -
1503 -
    // Hammering the Armory
1504 -
    new ChoiceAdventure(
1505 -
        "Beanstalk",
1506 -
        "choiceAdventure178",
1507 -
        "Fantasy Airship Shirt",
1508 -
        new Object[] {new Option("bronze breastplate", "bronze breastplate"), "skip adventure"}),
1509 -
1510 -
    // Choice 179 is unknown
1511 -
1512 -
    // A Pre-War Dresser Drawer, Pa!
1513 -
    new ChoiceAdventure(
1514 -
        "Plains",
1515 -
        "choiceAdventure180",
1516 -
        "Palindome Shirt",
1517 -
        new Object[] {new Option("Ye Olde Navy Fleece", "Ye Olde Navy Fleece"), "skip adventure"}),
1518 -
1519 -
    // Chieftain of the Flies
1520 -
    new ChoiceAdventure(
1521 -
        "Island",
1522 -
        "choiceAdventure181",
1523 -
        "Frat House (Stone Age)",
1524 -
        new Object[] {
1525 -
          new Option("around the world", "around the world"),
1526 -
          new Option("skip adventure", "Spanish fly")
1527 -
        }),
1528 -
    // Chieftain of the Flies
1529 -
    // This trades all Spanish flies for around the worlds,
1530 -
    // in multiples of 5.  Excess flies are left in inventory.
1531 -
    new Object[] {181, 1, ItemPool.get(ItemPool.SPANISH_FLY, 5)},
1532 -
1533 -
    // Random Lack of an Encounter
1534 -
    new ChoiceAdventure(
1535 -
        "Beanstalk",
1536 -
        "choiceAdventure182",
1537 -
        "Fantasy Airship",
1538 -
        new Object[] {
1539 -
          "enter combat",
1540 -
          new Option("Penultimate Fantasy chest", "Penultimate Fantasy chest"),
1541 -
          "stats",
1542 -
          new Option("model airship and combat", "model airship"),
1543 -
          new Option("model airship and chest", "model airship"),
1544 -
          new Option("model airship and stats", "model airship")
1545 -
        }),
1546 -
1547 -
    // That Explains All The Eyepatches
1548 -
    // Dynamically calculate options based on mainstat
1549 -
    new ChoiceAdventure("Island", "choiceAdventure184", "Barrrney's Barrr", null),
1550 -
1551 -
    // Yes, You're a Rock Starrr
1552 -
    new ChoiceAdventure("Island", "choiceAdventure185", "Barrrney's Barrr", null),
1553 -
1554 -
    // A Test of Testarrrsterone
1555 -
    new ChoiceAdventure(
1556 -
        "Island",
1557 -
        "choiceAdventure186",
1558 -
        "Barrrney's Barrr",
1559 -
        new Object[] {"stats", "drunkenness and stats", "moxie"}),
1560 -
1561 -
    // Choice 187 is Arrr You Man Enough?
1562 -
1563 -
    // The Infiltrationist
1564 -
    new ChoiceAdventure(
1565 -
        "Item-Driven",
1566 -
        "choiceAdventure188",
1567 -
        "Frathouse Blueprints",
1568 -
        new Object[] {
1569 -
          "frat boy ensemble", "mullet wig and briefcase", "frilly skirt and hot wings"
1570 -
        }),
1571 -
1572 -
    //  O Cap'm, My Cap'm
1573 -
    new Object[] {189, 1, new AdventureResult(AdventureResult.MEAT, -977)},
1574 -
1575 -
    // Choice 190 is unknown
1576 -
1577 -
    // Chatterboxing
1578 -
    new ChoiceAdventure(
1579 -
        "Island",
1580 -
        "choiceAdventure191",
1581 -
        "F'c'le",
1582 -
        new Object[] {
1583 -
          "moxie substats",
1584 -
          "use valuable trinket to banish, or lose hp",
1585 -
          "muscle substats",
1586 -
          "mysticality substats",
1587 -
          "use valuable trinket to banish, or moxie",
1588 -
          "use valuable trinket to banish, or muscle",
1589 -
          "use valuable trinket to banish, or mysticality",
1590 -
          "use valuable trinket to banish, or mainstat"
1591 -
        }),
1592 -
    new Object[] {191, 2, ItemPool.get(ItemPool.VALUABLE_TRINKET, -1)},
1593 -
1594 -
    // Choice 192 is unknown
1595 -
    // Choice 193 is Modular, Dude
1596 -
1597 -
    // Somewhat Higher and Mostly Dry
1598 -
    new ChoiceAdventure(
1599 -
        "Hobopolis",
1600 -
        "choiceAdventure197",
1601 -
        "A Maze of Sewer Tunnels",
1602 -
        new Object[] {"take the tunnel", "sewer gator", "turn the valve"}),
1603 -
1604 -
    // Disgustin' Junction
1605 -
    new ChoiceAdventure(
1606 -
        "Hobopolis",
1607 -
        "choiceAdventure198",
1608 -
        "A Maze of Sewer Tunnels",
1609 -
        new Object[] {"take the tunnel", "giant zombie goldfish", "open the grate"}),
1610 -
1611 -
    // The Former or the Ladder
1612 -
    new ChoiceAdventure(
1613 -
        "Hobopolis",
1614 -
        "choiceAdventure199",
1615 -
        "A Maze of Sewer Tunnels",
1616 -
        new Object[] {"take the tunnel", "C. H. U. M.", "head down the ladder"}),
1617 -
1618 -
    // Enter The Hoboverlord
1619 -
    new ChoiceAdventure(
1620 -
        "Hobopolis",
1621 -
        "choiceAdventure200",
1622 -
        "Hobopolis Town Square",
1623 -
        new Object[] {"enter combat with Hodgman", "skip adventure"}),
1624 -
1625 -
    // Home, Home in the Range
1626 -
    new ChoiceAdventure(
1627 -
        "Hobopolis",
1628 -
        "choiceAdventure201",
1629 -
        "Burnbarrel Blvd.",
1630 -
        new Object[] {"enter combat with Ol' Scratch", "skip adventure"}),
1631 -
1632 -
    // Bumpity Bump Bump
1633 -
    new ChoiceAdventure(
1634 -
        "Hobopolis",
1635 -
        "choiceAdventure202",
1636 -
        "Exposure Esplanade",
1637 -
        new Object[] {"enter combat with Frosty", "skip adventure"}),
1638 -
1639 -
    // Deep Enough to Dive
1640 -
    new ChoiceAdventure(
1641 -
        "Hobopolis",
1642 -
        "choiceAdventure203",
1643 -
        "The Heap",
1644 -
        new Object[] {"enter combat with Oscus", "skip adventure"}),
1645 -
1646 -
    // Welcome To You!
1647 -
    new ChoiceAdventure(
1648 -
        "Hobopolis",
1649 -
        "choiceAdventure204",
1650 -
        "The Ancient Hobo Burial Ground",
1651 -
        new Object[] {"enter combat with Zombo", "skip adventure"}),
1652 -
1653 -
    // Van, Damn
1654 -
    new ChoiceAdventure(
1655 -
        "Hobopolis",
1656 -
        "choiceAdventure205",
1657 -
        "The Purple Light District",
1658 -
        new Object[] {"enter combat with Chester", "skip adventure"}),
1659 -
1660 -
    // Getting Tired
1661 -
    new ChoiceAdventure(
1662 -
        "Hobopolis",
1663 -
        "choiceAdventure206",
1664 -
        "Burnbarrel Blvd.",
1665 -
        new Object[] {"start tirevalanche", "add tire to stack", "skip adventure"}),
1666 -
1667 -
    // Hot Dog! I Mean... Door!
1668 -
    new ChoiceAdventure(
1669 -
        "Hobopolis",
1670 -
        "choiceAdventure207",
1671 -
        "Burnbarrel Blvd.",
1672 -
        new Object[] {"increase hot hobos & get clan meat", "skip adventure"}),
1673 -
1674 -
    // Ah, So That's Where They've All Gone
1675 -
    new ChoiceAdventure(
1676 -
        "Hobopolis",
1677 -
        "choiceAdventure208",
1678 -
        "The Ancient Hobo Burial Ground",
1679 -
        new Object[] {"increase spooky hobos & decrease stench", "skip adventure"}),
1680 -
1681 -
    // Choice 209 is Timbarrrr!
1682 -
    // Choice 210 is Stumped
1683 -
1684 -
    // Despite All Your Rage
1685 -
    new ChoiceAdventure(
1686 -
        "Hobopolis",
1687 -
        "choiceAdventure211",
1688 -
        "A Maze of Sewer Tunnels",
1689 -
        new Object[] {"gnaw through the bars"}),
1690 -
1691 -
    // Choice 212 is also Despite All Your Rage, apparently after you've already
1692 -
    // tried to wait for rescue?
1693 -
    new ChoiceAdventure(
1694 -
        "Hobopolis",
1695 -
        "choiceAdventure212",
1696 -
        "A Maze of Sewer Tunnels",
1697 -
        new Object[] {"gnaw through the bars"}),
1698 -
1699 -
    // Piping Hot
1700 -
    new ChoiceAdventure(
1701 -
        "Hobopolis",
1702 -
        "choiceAdventure213",
1703 -
        "Burnbarrel Blvd.",
1704 -
        new Object[] {"increase sleaze hobos & decrease heat", "skip adventure"}),
1705 -
1706 -
    // You vs. The Volcano
1707 -
    new ChoiceAdventure(
1708 -
        "Hobopolis",
1709 -
        "choiceAdventure214",
1710 -
        "The Heap",
1711 -
        new Object[] {"decrease stench hobos & increase stench", "skip adventure"}),
1712 -
1713 -
    // Piping Cold
1714 -
    new ChoiceAdventure(
1715 -
        "Hobopolis",
1716 -
        "choiceAdventure215",
1717 -
        "Exposure Esplanade",
1718 -
        new Object[] {"decrease heat", "decrease sleaze hobos", "increase number of icicles"}),
1719 -
1720 -
    // The Compostal Service
1721 -
    new ChoiceAdventure(
1722 -
        "Hobopolis",
1723 -
        "choiceAdventure216",
1724 -
        "The Heap",
1725 -
        new Object[] {"decrease stench & spooky", "skip adventure"}),
1726 -
1727 -
    // There Goes Fritz!
1728 -
    new ChoiceAdventure(
1729 -
        "Hobopolis",
1730 -
        "choiceAdventure217",
1731 -
        "Exposure Esplanade",
1732 -
        new Object[] {"yodel a little", "yodel a lot", "yodel your heart out"}),
1733 -
1734 -
    // I Refuse!
1735 -
    new ChoiceAdventure(
1736 -
        "Hobopolis",
1737 -
        "choiceAdventure218",
1738 -
        "The Heap",
1739 -
        new Object[] {"explore the junkpile", "skip adventure"}),
1740 -
1741 -
    // The Furtivity of My City
1742 -
    new ChoiceAdventure(
1743 -
        "Hobopolis",
1744 -
        "choiceAdventure219",
1745 -
        "The Purple Light District",
1746 -
        new Object[] {
1747 -
          "fight sleaze hobo", "increase stench", "increase sleaze hobos & get clan meat"
1748 -
        }),
1749 -
1750 -
    // Returning to the Tomb
1751 -
    new ChoiceAdventure(
1752 -
        "Hobopolis",
1753 -
        "choiceAdventure220",
1754 -
        "The Ancient Hobo Burial Ground",
1755 -
        new Object[] {"increase spooky hobos & get clan meat", "skip adventure"}),
1756 -
1757 -
    // A Chiller Night
1758 -
    new ChoiceAdventure(
1759 -
        "Hobopolis",
1760 -
        "choiceAdventure221",
1761 -
        "The Ancient Hobo Burial Ground",
1762 -
        new Object[] {"study the dance moves", "dance with hobo zombies", "skip adventure"}),
1763 -
1764 -
    // A Chiller Night (2)
1765 -
    new ChoiceAdventure(
1766 -
        "Hobopolis",
1767 -
        "choiceAdventure222",
1768 -
        "The Ancient Hobo Burial Ground",
1769 -
        new Object[] {"dance with hobo zombies", "skip adventure"}),
1770 -
1771 -
    // Getting Clubbed
1772 -
    new ChoiceAdventure(
1773 -
        "Hobopolis",
1774 -
        "choiceAdventure223",
1775 -
        "The Purple Light District",
1776 -
        new Object[] {
1777 -
          "try to get inside", "try to bamboozle the crowd", "try to flimflam the crowd"
1778 -
        }),
1779 -
1780 -
    // Exclusive!
1781 -
    new ChoiceAdventure(
1782 -
        "Hobopolis",
1783 -
        "choiceAdventure224",
1784 -
        "The Purple Light District",
1785 -
        new Object[] {"fight sleaze hobo", "start barfight", "gain stats"}),
1786 -
1787 -
    // Attention -- A Tent!
1788 -
    new ChoiceAdventure(
1789 -
        "Hobopolis",
1790 -
        "choiceAdventure225",
1791 -
        "Hobopolis Town Square",
1792 -
        new Object[] {"perform on stage", "join the crowd", "skip adventure"}),
1793 -
1794 -
    // Choice 226 is Here You Are, Up On Stage (use the same system as 211 & 212)
1795 -
    // Choice 227 is Working the Crowd (use the same system as 211 & 212)
1796 -
1797 -
    // Choices 228 & 229 are unknown
1798 -
1799 -
    // Mind Yer Binder
1800 -
    new ChoiceAdventure(
1801 -
        "Hobopolis",
1802 -
        "choiceAdventure230",
1803 -
        "Hobopolis Town Square",
1804 -
        new Object[] {new Option("hobo code binder", "hobo code binder"), "skip adventure"}),
1805 -
    // Mind Yer Binder
1806 -
    new Object[] {230, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -30)},
1807 -
1808 -
    // Choices 231-271 are subchoices of Choice 272
1809 -
1810 -
    // Food, Glorious Food
1811 -
    new ChoiceSpoiler(
1812 -
        "choiceAdventure235",
1813 -
        "Hobopolis Marketplace",
1814 -
        new Object[] {"muscle food", "mysticality food", "moxie food"}),
1815 -
1816 -
    // Booze, Glorious Booze
1817 -
    new ChoiceSpoiler(
1818 -
        "choiceAdventure240",
1819 -
        "Hobopolis Marketplace",
1820 -
        new Object[] {"muscle booze", "mysticality booze", "moxie booze"}),
1821 -
1822 -
    // The Guy Who Carves Driftwood Animals
1823 -
    new Object[] {247, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -10)},
1824 -
1825 -
    // A Hattery
1826 -
    new ChoiceSpoiler(
1827 -
        "choiceAdventure250",
1828 -
        "Hobopolis Marketplace",
1829 -
        new Object[] {
1830 -
          new Option("crumpled felt fedora", "crumpled felt fedora"),
1831 -
          new Option("battered old top-hat", "battered old top-hat"),
1832 -
          new Option("shapeless wide-brimmed hat", "shapeless wide-brimmed hat")
1833 -
        }),
1834 -
    // A Hattery
1835 -
    new Object[] {250, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -250)},
1836 -
    new Object[] {250, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -150)},
1837 -
    new Object[] {250, 3, ItemPool.get(ItemPool.HOBO_NICKEL, -200)},
1838 -
1839 -
    // A Pantry
1840 -
    new ChoiceSpoiler(
1841 -
        "choiceAdventure251",
1842 -
        "Hobopolis Marketplace",
1843 -
        new Object[] {
1844 -
          new Option("mostly rat-hide leggings", "mostly rat-hide leggings"),
1845 -
          new Option("hobo dungarees", "hobo dungarees"),
1846 -
          new Option("old patched suit-pants", "old patched suit-pants")
1847 -
        }),
1848 -
    // A Pantry
1849 -
    new Object[] {251, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -200)},
1850 -
    new Object[] {251, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -150)},
1851 -
    new Object[] {251, 3, ItemPool.get(ItemPool.HOBO_NICKEL, -250)},
1852 -
1853 -
    // Hobo Blanket Bingo
1854 -
    new ChoiceSpoiler(
1855 -
        "choiceAdventure252",
1856 -
        "Hobopolis Marketplace",
1857 -
        new Object[] {
1858 -
          new Option("old soft shoes", "old soft shoes"),
1859 -
          new Option("hobo stogie", "hobo stogie"),
1860 -
          new Option("rope with some soap on it", "rope with some soap on it")
1861 -
        }),
1862 -
    // Hobo Blanket Bingo
1863 -
    new Object[] {252, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -250)},
1864 -
    new Object[] {252, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -200)},
1865 -
    new Object[] {252, 3, ItemPool.get(ItemPool.HOBO_NICKEL, -150)},
1866 -
1867 -
    // Black-and-Blue-and-Decker
1868 -
    new ChoiceSpoiler(
1869 -
        "choiceAdventure255",
1870 -
        "Hobopolis Marketplace",
1871 -
        new Object[] {
1872 -
          new Option("sharpened hubcap", "sharpened hubcap"),
1873 -
          new Option("very large caltrop", "very large caltrop"),
1874 -
          new Option("The Six-Pack of Pain", "The Six-Pack of Pain")
1875 -
        }),
1876 -
    // Black-and-Blue-and-Decker
1877 -
    new Object[] {255, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -10)},
1878 -
    new Object[] {255, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -10)},
1879 -
    new Object[] {255, 3, ItemPool.get(ItemPool.HOBO_NICKEL, -10)},
1880 -
1881 -
    // Instru-mental
1882 -
    new Object[] {258, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -99)},
1883 -
1884 -
    // We'll Make Great...
1885 -
    new ChoiceSpoiler(
1886 -
        "choiceAdventure259",
1887 -
        "Hobopolis Marketplace",
1888 -
        new Object[] {"hobo monkey", "stats", "enter combat"}),
1889 -
1890 -
    // Everybody's Got Something To Hide
1891 -
    new Object[] {261, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -1000)},
1892 -
1893 -
    // Tanning Salon
1894 -
    new ChoiceSpoiler(
1895 -
        "choiceAdventure264",
1896 -
        "Hobopolis Marketplace",
1897 -
        new Object[] {"20 adv of +50% moxie", "20 adv of +50% mysticality"}),
1898 -
    // Tanning Salon
1899 -
    new Object[] {264, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1900 -
    new Object[] {264, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1901 -
1902 -
    // Let's All Go To The Movies
1903 -
    new ChoiceSpoiler(
1904 -
        "choiceAdventure267",
1905 -
        "Hobopolis Marketplace",
1906 -
        new Object[] {"20 adv of +5 spooky resistance", "20 adv of +5 sleaze resistance"}),
1907 -
    // Let's All Go To The Movies
1908 -
    new Object[] {267, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1909 -
    new Object[] {267, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1910 -
1911 -
    // It's Fun To Stay There
1912 -
    new ChoiceSpoiler(
1913 -
        "choiceAdventure268",
1914 -
        "Hobopolis Marketplace",
1915 -
        new Object[] {"20 adv of +5 stench resistance", "20 adv of +50% muscle"}),
1916 -
    // It's Fun To Stay There
1917 -
    new Object[] {268, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1918 -
    new Object[] {268, 2, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
1919 -
1920 -
    // Marketplace Entrance
1921 -
    new ChoiceAdventure(
1922 -
        "Hobopolis",
1923 -
        "choiceAdventure272",
1924 -
        "Hobopolis Town Square",
1925 -
        new Object[] {"enter marketplace", "skip adventure"}),
1926 -
1927 -
    // Piping Cold
1928 -
    new ChoiceAdventure(
1929 -
        "Hobopolis",
1930 -
        "choiceAdventure273",
1931 -
        "Exposure Esplanade",
1932 -
        new Object[] {
1933 -
          new Option("frozen banquet", "frozen banquet"),
1934 -
          "increase cold hobos & get clan meat",
1935 -
          "skip adventure"
1936 -
        }),
1937 -
1938 -
    // Choice 274 is Tattoo Redux, a subchoice of Choice 272 when
1939 -
    // you've started a tattoo
1940 -
1941 -
    // Choice 275 is Triangle, Man, a subchoice of Choice 272 when
1942 -
    // you've already purchased your class instrument
1943 -
    // Triangle, Man
1944 -
    new Object[] {275, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -10)},
1945 -
1946 -
    // Choices 278-290 are llama lama gong related choices
1947 -
1948 -
    // The Gong Has Been Bung
1949 -
    new ChoiceSpoiler(
1950 -
        "choiceAdventure276",
1951 -
        "Gong",
1952 -
        new Object[] {"3 adventures", "12 adventures", "15 adventures"}),
1953 -
1954 -
    // Welcome Back!
1955 -
    new ChoiceSpoiler(
1956 -
        "choiceAdventure277", "Gong", new Object[] {"finish journey", "also finish journey"}),
1957 -
1958 -
    // Enter the Roach
1959 -
    new ChoiceSpoiler(
1960 -
        "choiceAdventure278",
1961 -
        "Gong",
1962 -
        new Object[] {"muscle substats", "mysticality substats", "moxie substats"}),
1963 -
1964 -
    // It's Nukyuhlur - the 'S' is Silent.
1965 -
    new ChoiceSpoiler(
1966 -
        "choiceAdventure279",
1967 -
        "Gong",
1968 -
        new Object[] {"moxie substats", "muscle substats", "gain MP"}),
1969 -
1970 -
    // Eek! Eek!
1971 -
    new ChoiceSpoiler(
1972 -
        "choiceAdventure280",
1973 -
        "Gong",
1974 -
        new Object[] {"mysticality substats", "muscle substats", "gain MP"}),
1975 -
1976 -
    // A Meta-Metamorphosis
1977 -
    new ChoiceSpoiler(
1978 -
        "choiceAdventure281",
1979 -
        "Gong",
1980 -
        new Object[] {"moxie substats", "mysticality substats", "gain MP"}),
1981 -
1982 -
    // You've Got Wings, But No Wingman
1983 -
    new ChoiceSpoiler(
1984 -
        "choiceAdventure282", "Gong", new Object[] {"+30% muscle", "+10% all stats", "+30 ML"}),
1985 -
1986 -
    // Time Enough at Last!
1987 -
    new ChoiceSpoiler(
1988 -
        "choiceAdventure283",
1989 -
        "Gong",
1990 -
        new Object[] {"+30% muscle", "+10% all stats", "+50% item drops"}),
1991 -
1992 -
    // Scavenger Is Your Middle Name
1993 -
    new ChoiceSpoiler(
1994 -
        "choiceAdventure284", "Gong", new Object[] {"+30% muscle", "+50% item drops", "+30 ML"}),
1995 -
1996 -
    // Bugging Out
1997 -
    new ChoiceSpoiler(
1998 -
        "choiceAdventure285",
1999 -
        "Gong",
2000 -
        new Object[] {"+30% mysticality", "+30 ML", "+10% all stats"}),
2001 -
2002 -
    // A Sweeping Generalization
2003 -
    new ChoiceSpoiler(
2004 -
        "choiceAdventure286",
2005 -
        "Gong",
2006 -
        new Object[] {"+50% item drops", "+10% all stats", "+30% mysticality"}),
2007 -
2008 -
    // In the Frigid Aire
2009 -
    new ChoiceSpoiler(
2010 -
        "choiceAdventure287",
2011 -
        "Gong",
2012 -
        new Object[] {"+30 ML", "+30% mysticality", "+50% item drops"}),
2013 -
2014 -
    // Our House
2015 -
    new ChoiceSpoiler(
2016 -
        "choiceAdventure288", "Gong", new Object[] {"+30 ML", "+30% moxie", "+10% all stats"}),
2017 -
2018 -
    // Workin' For The Man
2019 -
    new ChoiceSpoiler(
2020 -
        "choiceAdventure289", "Gong", new Object[] {"+30 ML", "+30% moxie", "+50% item drops"}),
2021 -
2022 -
    // The World's Not Fair
2023 -
    new ChoiceSpoiler(
2024 -
        "choiceAdventure290",
2025 -
        "Gong",
2026 -
        new Object[] {"+30% moxie", "+10% all stats", "+50% item drops"}),
2027 -
2028 -
    // A Tight Squeeze
2029 -
    new ChoiceAdventure(
2030 -
        "Hobopolis",
2031 -
        "choiceAdventure291",
2032 -
        "Burnbarrel Blvd.",
2033 -
        new Object[] {new Option("jar of squeeze", "jar of squeeze"), "skip adventure"}),
2034 -
    // A Tight Squeeze - jar of squeeze
2035 -
    new Object[] {291, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
2036 -
2037 -
    // Cold Comfort
2038 -
    new ChoiceAdventure(
2039 -
        "Hobopolis",
2040 -
        "choiceAdventure292",
2041 -
        "Exposure Esplanade",
2042 -
        new Object[] {new Option("bowl of fishysoisse", "bowl of fishysoisse"), "skip adventure"}),
2043 -
    // Cold Comfort - bowl of fishysoisse
2044 -
    new Object[] {292, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
2045 -
2046 -
    // Flowers for You
2047 -
    new ChoiceAdventure(
2048 -
        "Hobopolis",
2049 -
        "choiceAdventure293",
2050 -
        "The Ancient Hobo Burial Ground",
2051 -
        new Object[] {new Option("deadly lampshade", "deadly lampshade"), "skip adventure"}),
2052 -
    // Flowers for You - deadly lampshade
2053 -
    new Object[] {293, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
2054 -
2055 -
    // Maybe It's a Sexy Snake!
2056 -
    new ChoiceAdventure(
2057 -
        "Hobopolis",
2058 -
        "choiceAdventure294",
2059 -
        "The Purple Light District",
2060 -
        new Object[] {new Option("lewd playing card", "lewd playing card"), "skip adventure"}),
2061 -
    // Maybe It's a Sexy Snake! - lewd playing card
2062 -
    new Object[] {294, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
2063 -
2064 -
    // Juicy!
2065 -
    new ChoiceAdventure(
2066 -
        "Hobopolis",
2067 -
        "choiceAdventure295",
2068 -
        "The Heap",
2069 -
        new Object[] {
2070 -
          new Option("concentrated garbage juice", "concentrated garbage juice"), "skip adventure"
2071 -
        }),
2072 -
    // Juicy! - concentrated garbage juice
2073 -
    new Object[] {295, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -5)},
2074 -
2075 -
    // Choice 296 is Pop!
2076 -
2077 -
    // Gravy Fairy Ring
2078 -
    new ChoiceAdventure(
2079 -
        "Dungeon",
2080 -
        "choiceAdventure297",
2081 -
        "Haiku Dungeon",
2082 -
        new Object[] {
2083 -
          "mushrooms", new Option("fairy gravy boat", "fairy gravy boat"), "skip adventure"
2084 -
        }),
2085 -
2086 -
    // In the Shade
2087 -
    new ChoiceAdventure(
2088 -
        "The Sea",
2089 -
        "choiceAdventure298",
2090 -
        "An Octopus's Garden",
2091 -
        new Object[] {"plant seeds", "skip adventure"}),
2092 -
2093 -
    // Down at the Hatch
2094 -
    new ChoiceAdventure(
2095 -
        "The Sea",
2096 -
        "choiceAdventure299",
2097 -
        "The Wreck of the Edgar Fitzsimmons",
2098 -
        new Object[] {
2099 -
          "release creatures", "skip adventure", "unlock tarnished luggage key adventure"
2100 -
        }),
2101 -
2102 -
    // Choice 300 is Merry Crimbo!
2103 -
    // Choice 301 is And to All a Good Night
2104 -
    // Choice 302 is You've Hit Bottom (Sauceror)
2105 -
    // Choice 303 is You've Hit Bottom (Pastamancer)
2106 -
2107 -
    // A Vent Horizon
2108 -
    new ChoiceAdventure(
2109 -
        "The Sea",
2110 -
        "choiceAdventure304",
2111 -
        "The Marinara Trench",
2112 -
        new Object[] {
2113 -
          new Option("bubbling tempura batter", "bubbling tempura batter"), "skip adventure"
2114 -
        }),
2115 -
    // A Vent Horizon
2116 -
    new Object[] {304, 1, new AdventureLongCountResult(AdventureResult.MP, -200)},
2117 -
2118 -
    // There is Sauce at the Bottom of the Ocean
2119 -
    new ChoiceAdventure(
2120 -
        "The Sea",
2121 -
        "choiceAdventure305",
2122 -
        "The Marinara Trench",
2123 -
        new Object[] {new Option("globe of Deep Sauce", "globe of Deep Sauce"), "skip adventure"}),
2124 -
    // There is Sauce at the Bottom of the Ocean
2125 -
    new Object[] {305, 1, ItemPool.get(ItemPool.MERKIN_PRESSUREGLOBE, -1)},
2126 -
2127 -
    // Choice 306 is [Grandpa Mine Choice]
2128 -
    // Choice 307 is Ode to the Sea
2129 -
    // Choice 308 is Boxing the Juke
2130 -
2131 -
    // Barback
2132 -
    new ChoiceAdventure(
2133 -
        "The Sea",
2134 -
        "choiceAdventure309",
2135 -
        "The Dive Bar",
2136 -
        new Object[] {new Option("seaode", "seaode"), "skip adventure"}),
2137 -
2138 -
    // The Economist of Scales
2139 -
    new ChoiceAdventure(
2140 -
        "The Sea",
2141 -
        "choiceAdventure310",
2142 -
        "Madness Reef",
2143 -
        new Object[] {
2144 -
          new Option("get 1 rough fish scale", 1, "rough fish scale"),
2145 -
          new Option("get 1 pristine fish scale", 2, "pristine fish scale"),
2146 -
          new Option("get multiple rough fish scales", 4, "rough fish scale"),
2147 -
          new Option("get multiple pristine fish scales", 5, "pristine fish scale"),
2148 -
          new Option("skip adventure", 6)
2149 -
        }),
2150 -
    // The Economist of Scales
2151 -
    // This trades 10 dull fish scales in.
2152 -
    new Object[] {310, 1, ItemPool.get(ItemPool.DULL_FISH_SCALE, -10)},
2153 -
    new Object[] {310, 2, ItemPool.get(ItemPool.ROUGH_FISH_SCALE, -10)},
2154 -
    new Object[] {310, 4, ItemPool.get(ItemPool.DULL_FISH_SCALE, 10)},
2155 -
    new Object[] {310, 5, ItemPool.get(ItemPool.ROUGH_FISH_SCALE, 10)},
2156 -
2157 -
    // Heavily Invested in Pun Futures
2158 -
    new ChoiceAdventure(
2159 -
        "The Sea",
2160 -
        "choiceAdventure311",
2161 -
        "Madness Reef",
2162 -
        new Object[] {"The Economist of Scales", "skip adventure"}),
2163 -
2164 -
    // Choice 312 is unknown
2165 -
    // Choice 313 is unknown
2166 -
    // Choice 314 is unknown
2167 -
    // Choice 315 is unknown
2168 -
    // Choice 316 is unknown
2169 -
2170 -
    // Choice 317 is No Man, No Hole
2171 -
    // Choice 318 is C'mere, Little Fella
2172 -
    // Choice 319 is Turtles of the Universe
2173 -
    // Choice 320 is A Rolling Turtle Gathers No Moss
2174 -
    // Choice 321 is Boxed In
2175 -
    // Choice 322 is Capital!
2176 -
2177 -
    // Choice 323 is unknown
2178 -
    // Choice 324 is unknown
2179 -
    // Choice 325 is unknown
2180 -
2181 -
    // Showdown
2182 -
    new ChoiceAdventure(
2183 -
        "Clan Basement",
2184 -
        "choiceAdventure326",
2185 -
        "The Slime Tube",
2186 -
        new Object[] {"enter combat with Mother Slime", "skip adventure"}),
2187 -
2188 -
    // Choice 327 is Puttin' it on Wax
2189 -
    // Choice 328 is Never Break the Chain
2190 -
    // Choice 329 is Don't Be Alarmed, Now
2191 -
2192 -
    // A Shark's Chum
2193 -
    new ChoiceAdventure(
2194 -
        "Manor1",
2195 -
        "choiceAdventure330",
2196 -
        "Haunted Billiards Room",
2197 -
        new Object[] {
2198 -
          "stats and pool skill", new Option("cube of billiard chalk", "cube of billiard chalk")
2199 -
        }),
2200 -
2201 -
    // Choice 331 is Like That Time in Tortuga
2202 -
    // Choice 332 is More eXtreme Than Usual
2203 -
    // Choice 333 is Cleansing your Palette
2204 -
    // Choice 334 is O Turtle Were Art Thou
2205 -
    // Choice 335 is Blue Monday
2206 -
    // Choice 336 is Jewel in the Rough
2207 -
2208 -
    // Engulfed!
2209 -
    new ChoiceAdventure(
2210 -
        "Clan Basement",
2211 -
        "choiceAdventure337",
2212 -
        "The Slime Tube",
2213 -
        new Object[] {
2214 -
          "+1 rusty -> slime-covered item conversion", "raise area ML", "skip adventure"
2215 -
        }),
2216 -
2217 -
    // Choice 338 is Duel Nature
2218 -
    // Choice 339 is Kick the Can
2219 -
    // Choice 340 is Turtle in peril
2220 -
    // Choice 341 is Nantucket Snapper
2221 -
    // Choice 342 is The Horror...
2222 -
    // Choice 343 is Turtles All The Way Around
2223 -
    // Choice 344 is Silent Strolling
2224 -
    // Choice 345 is Training Day
2225 -
2226 -
    // Choice 346 is Soup For You
2227 -
    // Choice 347 is Yes, Soup For You
2228 -
    // Choice 348 is Souped Up
2229 -
2230 -
    // The Primordial Directive
2231 -
    new ChoiceAdventure(
2232 -
        "Memories",
2233 -
        "choiceAdventure349",
2234 -
        "The Primordial Soup",
2235 -
        new Object[] {"swim upwards", "swim in circles", "swim downwards"}),
2236 -
2237 -
    // Soupercharged
2238 -
    new ChoiceAdventure(
2239 -
        "Memories",
2240 -
        "choiceAdventure350",
2241 -
        "The Primordial Soup",
2242 -
        new Object[] {"Fight Cyrus", "skip adventure"}),
2243 -
2244 -
    // Choice 351 is Beginner's Luck
2245 -
2246 -
    // Savior Faire
2247 -
    new ChoiceAdventure(
2248 -
        "Memories",
2249 -
        "choiceAdventure352",
2250 -
        "Seaside Megalopolis",
2251 -
        new Object[] {
2252 -
          "Moxie -> Bad Reception Down Here",
2253 -
          "Muscle -> A Diseased Procurer",
2254 -
          "Mysticality -> Give it a Shot"
2255 -
        }),
2256 -
2257 -
    // Bad Reception Down Here
2258 -
    new ChoiceAdventure(
2259 -
        "Memories",
2260 -
        "choiceAdventure353",
2261 -
        "Seaside Megalopolis",
2262 -
        new Object[] {
2263 -
          new Option("Indigo Party Invitation", "Indigo Party Invitation"),
2264 -
          new Option("Violet Hunt Invitation", "Violet Hunt Invitation")
2265 -
        }),
2266 -
2267 -
    // You Can Never Be Too Rich or Too in the Future
2268 -
    new ChoiceAdventure(
2269 -
        "Memories",
2270 -
        "choiceAdventure354",
2271 -
        "Seaside Megalopolis",
2272 -
        new Object[] {"Moxie", "Serenity"}),
2273 -
2274 -
    // I'm on the Hunt, I'm After You
2275 -
    new ChoiceAdventure(
2276 -
        "Memories",
2277 -
        "choiceAdventure355",
2278 -
        "Seaside Megalopolis",
2279 -
        new Object[] {"Stats", "Phairly Pheromonal"}),
2280 -
2281 -
    // A Diseased Procurer
2282 -
    new ChoiceAdventure(
2283 -
        "Memories",
2284 -
        "choiceAdventure356",
2285 -
        "Seaside Megalopolis",
2286 -
        new Object[] {
2287 -
          new Option("Blue Milk Club Card", "Blue Milk Club Card"),
2288 -
          new Option("Mecha Mayhem Club Card", "Mecha Mayhem Club Card")
2289 -
        }),
2290 -
2291 -
    // Painful, Circuitous Logic
2292 -
    new ChoiceAdventure(
2293 -
        "Memories",
2294 -
        "choiceAdventure357",
2295 -
        "Seaside Megalopolis",
2296 -
        new Object[] {"Muscle", "Nano-juiced"}),
2297 -
2298 -
    // Brings All the Boys to the Blue Yard
2299 -
    new ChoiceAdventure(
2300 -
        "Memories",
2301 -
        "choiceAdventure358",
2302 -
        "Seaside Megalopolis",
2303 -
        new Object[] {"Stats", "Dance Interpreter"}),
2304 -
2305 -
    // Choice 359 is unknown
2306 -
2307 -
    // Cavern Entrance
2308 -
    new ChoiceAdventure(
2309 -
        "Memories",
2310 -
        "choiceAdventure360",
2311 -
        "Jungles: Wumpus Cave",
2312 -
        new Object[] {new Option("skip adventure", 2)}),
2313 -
2314 -
    // Give it a Shot
2315 -
    new ChoiceAdventure(
2316 -
        "Memories",
2317 -
        "choiceAdventure361",
2318 -
        "Seaside Megalopolis",
2319 -
        new Object[] {
2320 -
          new Option("'Smuggler Shot First' Button", "'Smuggler Shot First' Button"),
2321 -
          new Option("Spacefleet Communicator Badge", "Spacefleet Communicator Badge")
2322 -
        }),
2323 -
2324 -
    // A Bridge Too Far
2325 -
    new ChoiceAdventure(
2326 -
        "Memories",
2327 -
        "choiceAdventure362",
2328 -
        "Seaside Megalopolis",
2329 -
        new Object[] {"Stats", "Meatwise"}),
2330 -
2331 -
    // Does This Bug You? Does This Bug You?
2332 -
    new ChoiceAdventure(
2333 -
        "Memories",
2334 -
        "choiceAdventure363",
2335 -
        "Seaside Megalopolis",
2336 -
        new Object[] {"Mysticality", "In the Saucestream"}),
2337 -
2338 -
    // 451 Degrees! Burning Down the House!
2339 -
    new ChoiceAdventure(
2340 -
        "Memories",
2341 -
        "choiceAdventure364",
2342 -
        "Seaside Megalopolis",
2343 -
        new Object[] {
2344 -
          "Moxie", new Option("Supreme Being Glossary", "Supreme Being Glossary"), "Muscle"
2345 -
        }),
2346 -
2347 -
    // None Shall Pass
2348 -
    new ChoiceAdventure(
2349 -
        "Memories",
2350 -
        "choiceAdventure365",
2351 -
        "Seaside Megalopolis",
2352 -
        new Object[] {"Muscle", new Option("multi-pass", "multi-pass")}),
2353 -
2354 -
    // Entrance to the Forgotten City
2355 -
    new ChoiceAdventure(
2356 -
        "Memories",
2357 -
        "choiceAdventure366",
2358 -
        "Jungles: Forgotten City",
2359 -
        new Object[] {new Option("skip adventure", 2)}),
2360 -
2361 -
    // Choice 367 is Ancient Temple (unlocked)
2362 -
    // Choice 368 is City Center
2363 -
    // Choice 369 is North Side of the City
2364 -
    // Choice 370 is East Side of the City
2365 -
    // Choice 371 is West Side of the City
2366 -
    // Choice 372 is An Ancient Well
2367 -
    // Choice 373 is Northern Gate
2368 -
    // Choice 374 is An Ancient Tower
2369 -
    // Choice 375 is Northern Abandoned Building
2370 -
2371 -
    // Ancient Temple
2372 -
    new ChoiceAdventure(
2373 -
        "Memories",
2374 -
        "choiceAdventure376",
2375 -
        "Jungles: Ancient Temple",
2376 -
        new Object[] {"Enter the Temple", "leave"}),
2377 -
2378 -
    // Choice 377 is Southern Abandoned Building
2379 -
    // Choice 378 is Storehouse
2380 -
    // Choice 379 is Northern Building (Basement)
2381 -
    // Choice 380 is Southern Building (Upstairs)
2382 -
    // Choice 381 is Southern Building (Basement)
2383 -
    // Choice 382 is Catacombs Entrance
2384 -
    // Choice 383 is Catacombs Junction
2385 -
    // Choice 384 is Catacombs Dead-End
2386 -
    // Choice 385 is Sore of an Underground Lake
2387 -
    // Choice 386 is Catacombs Machinery
2388 -
2389 -
    // Choice 387 is Time Isn't Holding Up; Time is a Doughnut
2390 -
    // Choice 388 is Extra Savoir Faire
2391 -
    // Choice 389 is The Unbearable Supremeness of Being
2392 -
    // Choice 390 is A Winning Pass
2393 -
    // Choice 391 is OMG KAWAIII
2394 -
    // Choice 392 is The Elements of Surprise . . .
2395 -
2396 -
    // The Collector
2397 -
    new ChoiceAdventure(
2398 -
        "Item-Driven",
2399 -
        "choiceAdventure393",
2400 -
        "big bumboozer marble",
2401 -
        new Object[] {"1 of each marble -> 32768 Meat", "skip adventure"}),
2402 -
2403 -
    // Choice 394 is Hellevator Music
2404 -
    // Choice 395 is Rumble On
2405 -
2406 -
    // Woolly Scaly Bully
2407 -
    new ChoiceAdventure(
2408 -
        "The Sea",
2409 -
        "choiceAdventure396",
2410 -
        "Mer-kin Elementary School",
2411 -
        new Object[] {"lose HP", "lose HP", "unlock janitor's closet"}),
2412 -
2413 -
    // Bored of Education
2414 -
    new ChoiceAdventure(
2415 -
        "The Sea",
2416 -
        "choiceAdventure397",
2417 -
        "Mer-kin Elementary School",
2418 -
        new Object[] {"lose HP", "unlock the bathrooms", "lose HP"}),
2419 -
2420 -
    // A Mer-kin Graffiti
2421 -
    new ChoiceAdventure(
2422 -
        "The Sea",
2423 -
        "choiceAdventure398",
2424 -
        "Mer-kin Elementary School",
2425 -
        new Object[] {"unlock teacher's lounge", "lose HP", "lose HP"}),
2426 -
2427 -
    // The Case of the Closet
2428 -
    new ChoiceAdventure(
2429 -
        "The Sea",
2430 -
        "choiceAdventure399",
2431 -
        "Mer-kin Elementary School",
2432 -
        new Object[] {"fight a Mer-kin monitor", new Option("Mer-kin sawdust", "Mer-kin sawdust")}),
2433 -
2434 -
    // No Rest for the Room
2435 -
    new ChoiceAdventure(
2436 -
        "The Sea",
2437 -
        "choiceAdventure400",
2438 -
        "Mer-kin Elementary School",
2439 -
        new Object[] {
2440 -
          "fight a Mer-kin teacher", new Option("Mer-kin cancerstick", "Mer-kin cancerstick")
2441 -
        }),
2442 -
2443 -
    // Raising Cane
2444 -
    new ChoiceAdventure(
2445 -
        "The Sea",
2446 -
        "choiceAdventure401",
2447 -
        "Mer-kin Elementary School",
2448 -
        new Object[] {
2449 -
          "fight a Mer-kin punisher ", new Option("Mer-kin wordquiz", "Mer-kin wordquiz")
2450 -
        }),
2451 -
2452 -
    // Don't Hold a Grudge
2453 -
    new ChoiceAdventure(
2454 -
        "Manor2",
2455 -
        "choiceAdventure402",
2456 -
        "Haunted Bathroom",
2457 -
        new Object[] {"muscle substats", "mysticality substats", "moxie substats"}),
2458 -
2459 -
    // Picking Sides
2460 -
    new ChoiceAdventure(
2461 -
        "The Sea",
2462 -
        "choiceAdventure403",
2463 -
        "Skate Park",
2464 -
        new Object[] {
2465 -
          new Option("skate blade", "skate blade"), new Option("brand new key", "brand new key")
2466 -
        }),
2467 -
2468 -
    // Choice 409 is The Island Barracks
2469 -
    //	1 = only option
2470 -
    // Choice 410 is A Short Hallway
2471 -
    //	1 = left, 2 = right, 3 = exit
2472 -
    // Choice 411 is Hallway Left
2473 -
    //	1 = kitchen, 2 = dining room, 3 = storeroom, 4 = exit
2474 -
    // Choice 412 is Hallway Right
2475 -
    //	1 = bedroom, 2 = library, 3 = parlour, 4 = exit
2476 -
    // Choice 413 is Kitchen
2477 -
    //	1 = cupboards, 2 = pantry, 3 = fridges, 4 = exit
2478 -
    // Choice 414 is Dining Room
2479 -
    //	1 = tables, 2 = sideboard, 3 = china cabinet, 4 = exit
2480 -
    // Choice 415 is Store Room
2481 -
    //	1 = crates, 2 = workbench, 3 = gun cabinet, 4 = exit
2482 -
    // Choice 416 is Bedroom
2483 -
    //	1 = beds, 2 = dressers, 3 = bathroom, 4 = exit
2484 -
    // Choice 417 is Library
2485 -
    //	1 = bookshelves, 2 = chairs, 3 = chess set, 4 = exit
2486 -
    // Choice 418 is Parlour
2487 -
    //	1 = pool table, 2 = bar, 3 = fireplace, 4 = exit
2488 -
2489 -
    // Choice 423 is A Wrenching Encounter
2490 -
    // Choice 424 is Get Your Bolt On, Michael
2491 -
    // Choice 425 is Taking a Proper Gander
2492 -
    // Choice 426 is It's Electric, Boogie-oogie-oogie
2493 -
    // Choice 427 is A Voice Crying in the Crimbo Factory
2494 -
    // Choice 428 is Disguise the Limit
2495 -
    // Choice 429 is Diagnosis: Hypnosis
2496 -
    // Choice 430 is Secret Agent Penguin
2497 -
    // Choice 431 is Zapatos Con Crete
2498 -
    // Choice 432 is Don We Now Our Bright Apparel
2499 -
    // Choice 433 is Everything is Illuminated?
2500 -
    // Choice 435 is Season's Beatings
2501 -
    // Choice 436 is unknown
2502 -
    // Choice 437 is Flying In Circles
2503 -
2504 -
    // From Little Acorns...
2505 -
    new Object[] {438, 1, ItemPool.get(ItemPool.UNDERWORLD_ACORN, -1)},
2506 -
2507 -
    // Choice 439 is unknown
2508 -
    // Choice 440 is Puttin' on the Wax
2509 -
    // Choice 441 is The Mad Tea Party
2510 -
    // Choice 442 is A Moment of Reflection
2511 -
    new ChoiceAdventure(
2512 -
        "RabbitHole",
2513 -
        "choiceAdventure442",
2514 -
        "A Moment of Reflection",
2515 -
        new Object[] {
2516 -
          "Seal Clubber/Pastamancer/custard",
2517 -
          "Accordion Thief/Sauceror/comfit",
2518 -
          "Turtle Tamer/Disco Bandit/croqueteer",
2519 -
          "Ittah bittah hookah",
2520 -
          "Chessboard",
2521 -
          "nothing"
2522 -
        }),
2523 -
2524 -
    // Choice 443 is Chess Puzzle
2525 -
2526 -
    // Choice 444 is The Field of Strawberries (Seal Clubber)
2527 -
    new ChoiceAdventure(
2528 -
        "RabbitHole",
2529 -
        "choiceAdventure444",
2530 -
        "Reflection of Map (Seal Clubber)",
2531 -
        new Object[] {
2532 -
          new Option("walrus ice cream", "walrus ice cream"),
2533 -
          new Option("yellow matter custard", "yellow matter custard")
2534 -
        }),
2535 -
2536 -
    // Choice 445 is The Field of Strawberries (Pastamancer)
2537 -
    new ChoiceAdventure(
2538 -
        "RabbitHole",
2539 -
        "choiceAdventure445",
2540 -
        "Reflection of Map (Pastamancer)",
2541 -
        new Object[] {
2542 -
          new Option("eggman noodles", "eggman noodles"),
2543 -
          new Option("yellow matter custard", "yellow matter custard")
2544 -
        }),
2545 -
2546 -
    // Choice 446 is The Caucus Racetrack (Accordion Thief)
2547 -
    new ChoiceAdventure(
2548 -
        "RabbitHole",
2549 -
        "choiceAdventure446",
2550 -
        "Reflection of Map (Accordion Thief)",
2551 -
        new Object[] {
2552 -
          new Option("missing wine", "missing wine"),
2553 -
          new Option("delicious comfit?", "delicious comfit?")
2554 -
        }),
2555 -
2556 -
    // Choice 447 is The Caucus Racetrack (Sauceror)
2557 -
    new ChoiceAdventure(
2558 -
        "RabbitHole",
2559 -
        "choiceAdventure447",
2560 -
        "Reflection of Map (Sauceror)",
2561 -
        new Object[] {
2562 -
          new Option("Vial of <i>jus de larmes</i>", "Vial of <i>jus de larmes</i>"),
2563 -
          new Option("delicious comfit?", "delicious comfit?")
2564 -
        }),
2565 -
2566 -
    // Choice 448 is The Croquet Grounds (Turtle Tamer)
2567 -
    new ChoiceAdventure(
2568 -
        "RabbitHole",
2569 -
        "choiceAdventure448",
2570 -
        "Reflection of Map (Turtle Tamer)",
2571 -
        new Object[] {new Option("beautiful soup", "beautiful soup"), "fight croqueteer"}),
2572 -
2573 -
    // Choice 449 is The Croquet Grounds (Disco Bandit)
2574 -
    new ChoiceAdventure(
2575 -
        "RabbitHole",
2576 -
        "choiceAdventure449",
2577 -
        "Reflection of Map (Disco Bandit)",
2578 -
        new Object[] {
2579 -
          new Option("Lobster <i>qua</i> Grill", "Lobster <i>qua</i> Grill"), "fight croqueteer"
2580 -
        }),
2581 -
2582 -
    // Choice 450 is The Duchess' Cottage
2583 -
2584 -
    // Typographical Clutter
2585 -
    new ChoiceAdventure(
2586 -
        "Dungeon",
2587 -
        "choiceAdventure451",
2588 -
        "Greater-Than Sign",
2589 -
        new Object[] {
2590 -
          new Option("left parenthesis", "left parenthesis"),
2591 -
          "moxie, alternately lose then gain meat",
2592 -
          new Option("plus sign, then muscle", "plus sign"),
2593 -
          "mysticality substats",
2594 -
          "get teleportitis"
2595 -
        }),
2596 -
2597 -
    // Leave a Message and I'll Call You Back
2598 -
    new ChoiceAdventure(
2599 -
        "Jacking",
2600 -
        "choiceAdventure452",
2601 -
        "Small-O-Fier",
2602 -
        new Object[] {"combat", new Option("tiny fly glasses", "tiny fly glasses"), "fruit"}),
2603 -
2604 -
    // Getting a Leg Up
2605 -
    new ChoiceAdventure(
2606 -
        "Jacking",
2607 -
        "choiceAdventure453",
2608 -
        "Small-O-Fier",
2609 -
        new Object[] {"combat", "stats", new Option("hair of the calf", "hair of the calf")}),
2610 -
2611 -
    // Just Like the Ocean Under the Moon
2612 -
    new ChoiceAdventure(
2613 -
        "Jacking", "choiceAdventure454", "Small-O-Fier", new Object[] {"combat", "HP and MP"}),
2614 -
2615 -
    // Double Trouble in the Stubble
2616 -
    new ChoiceAdventure(
2617 -
        "Jacking", "choiceAdventure455", "Small-O-Fier", new Object[] {"stats", "quest item"}),
2618 -
2619 -
    // Made it, Ma!	 Top of the World!
2620 -
    new ChoiceAdventure(
2621 -
        "Jacking",
2622 -
        "choiceAdventure456",
2623 -
        "Huge-A-Ma-tron",
2624 -
        new Object[] {
2625 -
          "combat",
2626 -
          "Hurricane Force",
2627 -
          new Option("a dance upon the palate", "a dance upon the palate"),
2628 -
          "stats"
2629 -
        }),
2630 -
2631 -
    // Choice 457 is Oh, No! Five-Oh!
2632 -
    // Choice 458 is ... Grow Unspeakable Horrors
2633 -
    // Choice 459 is unknown
2634 -
    // Choice 460 is Space Trip (Bridge)
2635 -
    // Choice 461 is Space Trip (Navigation)
2636 -
    // Choice 462 is Space Trip (Diagnostics)
2637 -
    // Choice 463 is Space Trip (Alpha Quadrant)
2638 -
    // Choice 464 is Space Trip (Beta Quadrant)
2639 -
    // Choice 465 is Space Trip (Planet)
2640 -
    // Choice 466 is unknown
2641 -
    // Choice 467 is Space Trip (Combat)
2642 -
    // Choice 468 is Space Trip (Starbase Hub)
2643 -
    // Choice 469 is Space Trip (General Store)
2644 -
    // Choice 470 is Space Trip (Military Surplus Store)
2645 -
    // Choice 471 is DemonStar
2646 -
    // Choice 472 is Space Trip (Astrozorian Trade Vessel: Alpha)
2647 -
    // Choice 473 is Space Trip (Murderbot Miner: first encounter)
2648 -
    // Choice 474 is Space Trip (Slavers: Alpha)
2649 -
    // Choice 475 is Space Trip (Astrozorian Trade Vessel: Beta)
2650 -
    // Choice 476 is Space Trip (Astrozorian Trade Vessel: Gamma)
2651 -
    // Choice 477 is Space Trip (Gamma Quadrant)
2652 -
    // Choice 478 is Space Trip (The Source)
2653 -
    // Choice 479 is Space Trip (Slavers: Beta)
2654 -
    // Choice 480 is Space Trip (Scadian ship)
2655 -
    // Choice 481 is Space Trip (Hipsterian ship)
2656 -
    // Choice 482 is Space Trip (Slavers: Gamma)
2657 -
    // Choice 483 is Space Trip (Scadian Homeworld)
2658 -
    // Choice 484 is Space Trip (End)
2659 -
    // Choice 485 is Fighters of Fighting
2660 -
    // Choice 486 is Dungeon Fist!
2661 -
    // Choice 487 is unknown
2662 -
    // Choice 488 is Meteoid (Bridge)
2663 -
    // Choice 489 is Meteoid (SpaceMall)
2664 -
    // Choice 490 is Meteoid (Underground Complex)
2665 -
    // Choice 491 is Meteoid (End)
2666 -
    // Choice 492 is unknown
2667 -
    // Choice 493 is unknown
2668 -
    // Choice 494 is unknown
2669 -
    // Choice 495 is unknown
2670 -
2671 -
    // Choice 496 is Crate Expectations
2672 -
    // -> can skip if have +20 hot damage
2673 -
2674 -
    // Choice 497 is SHAFT!
2675 -
    // Choice 498 is unknown
2676 -
    // Choice 499 is unknown
2677 -
    // Choice 500 is unknown
2678 -
    // Choice 501 is unknown
2679 -
2680 -
    // Choice 502 is Arboreal Respite
2681 -
2682 -
    // The Road Less Traveled
2683 -
    new ChoiceSpoiler(
2684 -
        "choiceAdventure503",
2685 -
        "Spooky Forest",
2686 -
        new Object[] {
2687 -
          "gain some meat",
2688 -
          new Option("gain stakes or trade vampire hearts", "wooden stakes"),
2689 -
          new Option("gain spooky sapling or trade bar skins", "spooky sapling")
2690 -
        }),
2691 -
2692 -
    // Tree's Last Stand
2693 -
    new ChoiceSpoiler(
2694 -
        "choiceAdventure504",
2695 -
        "Spooky Forest",
2696 -
        new Object[] {
2697 -
          new Option("bar skin", "bar skin"),
2698 -
          new Option("bar skins", "bar skin"),
2699 -
          new Option("buy spooky sapling", "spooky sapling"),
2700 -
          "skip adventure"
2701 -
        }),
2702 -
    // Tree's Last Stand
2703 -
    new Object[] {504, 1, ItemPool.get(ItemPool.BAR_SKIN, -1)},
2704 -
    new Object[] {504, 2, ItemPool.get(ItemPool.BAR_SKIN, 1)},
2705 -
    new Object[] {504, 3, new AdventureResult(AdventureResult.MEAT, -100)},
2706 -
2707 -
    // Consciousness of a Stream
2708 -
    new ChoiceSpoiler(
2709 -
        "choiceAdventure505",
2710 -
        "Spooky Forest",
2711 -
        new Object[] {
2712 -
          new Option("gain mosquito larva then 3 spooky mushrooms", "mosquito larva"),
2713 -
          "gain 300 meat & tree-holed coin then nothing",
2714 -
          "fight a spooky vampire"
2715 -
        }),
2716 -
2717 -
    // Through Thicket and Thinnet
2718 -
    new ChoiceSpoiler(
2719 -
        "choiceAdventure506",
2720 -
        "Spooky Forest",
2721 -
        new Object[] {
2722 -
          "gain a starter item",
2723 -
          new Option("gain Spooky-Gro fertilizer", "Spooky-Gro fertilizer"),
2724 -
          new Option("gain spooky temple map", "spooky temple map"),
2725 -
          new Option("gain fake blood", "fake blood")
2726 -
        }),
2727 -
2728 -
    // O Lith, Mon
2729 -
    new ChoiceSpoiler(
2730 -
        "choiceAdventure507",
2731 -
        "Spooky Forest",
2732 -
        new Object[] {"gain Spooky Temple map", "skip adventure", "skip adventure"}),
2733 -
    // O Lith, Mon
2734 -
    new Object[] {507, 1, ItemPool.get(ItemPool.TREE_HOLED_COIN, -1)},
2735 -
2736 -
    // Choice 508 is Pants-Gazing
2737 -
    // Choice 509 is Of Course!
2738 -
    // Choice 510 is Those Who Came Before You
2739 -
2740 -
    // If it's Tiny, is it Still a Mansion?
2741 -
    new ChoiceAdventure(
2742 -
        "Woods",
2743 -
        "choiceAdventure511",
2744 -
        "Typical Tavern",
2745 -
        new Object[] {"Baron von Ratsworth", "skip adventure"}),
2746 -
2747 -
    // Hot and Cold Running Rats
2748 -
    new ChoiceAdventure(
2749 -
        "Woods", "choiceAdventure512", "Typical Tavern", new Object[] {"fight", "skip adventure"}),
2750 -
2751 -
    // Choice 513 is Staring Down the Barrel
2752 -
    // -> can skip if have +20 cold damage
2753 -
    // Choice 514 is 1984 Had Nothing on This Cellar
2754 -
    // -> can skip if have +20 stench damage
2755 -
    // Choice 515 is A Rat's Home...
2756 -
    // -> can skip if have +20 spooky damage
2757 -
2758 -
    // Choice 516 is unknown
2759 -
    // Choice 517 is Mr. Alarm, I Presarm
2760 -
2761 -
    // Clear and Present Danger
2762 -
    new ChoiceAdventure(
2763 -
        "Crimbo10",
2764 -
        "choiceAdventure518",
2765 -
        "Elf Alley",
2766 -
        new Object[] {"enter combat with Uncle Hobo", "skip adventure"}),
2767 -
2768 -
    // What a Tosser
2769 -
    new ChoiceAdventure(
2770 -
        "Crimbo10",
2771 -
        "choiceAdventure519",
2772 -
        "Elf Alley",
2773 -
        new Object[] {new Option("gift-a-pult", "gift-a-pult"), "skip adventure"}),
2774 -
    // What a Tosser - gift-a-pult
2775 -
    new Object[] {519, 1, ItemPool.get(ItemPool.HOBO_NICKEL, -50)},
2776 -
2777 -
    // Choice 520 is A Show-ho-ho-down
2778 -
    // Choice 521 is A Wicked Buzz
2779 -
2780 -
    // Welcome to the Footlocker
2781 -
    new ChoiceAdventure(
2782 -
        "Knob",
2783 -
        "choiceAdventure522",
2784 -
        "Cobb's Knob Barracks",
2785 -
        new Object[] {"outfit piece or donut", "skip adventure"}),
2786 -
2787 -
    // Death Rattlin'
2788 -
    new ChoiceAdventure(
2789 -
        "Cyrpt",
2790 -
        "choiceAdventure523",
2791 -
        "Defiled Cranny",
2792 -
        new Object[] {
2793 -
          "small meat boost",
2794 -
          "stats & HP & MP",
2795 -
          new Option("can of Ghuol-B-Gone&trade;", "can of Ghuol-B-Gone&trade;"),
2796 -
          "fight swarm of ghuol whelps",
2797 -
          "skip adventure"
2798 -
        }),
2799 -
2800 -
    // Choice 524 is The Adventures of Lars the Cyberian
2801 -
    // Choice 525 is Fiddling with a Puzzle
2802 -
    // Choice 526 is unknown
2803 -
2804 -
    // Choice 527 is The Haert of Darkness
2805 -
    new ChoiceAdventure(
2806 -
        "Cyrpt",
2807 -
        "choiceAdventure527",
2808 -
        "Haert of the Cyrpt",
2809 -
        new Object[] {"fight the Bonerdagon", "skip adventure"}),
2810 -
2811 -
    // Choice 528 is It Was Then That a Hideous Monster Carried You
2812 -
2813 -
    // A Swarm of Yeti-Mounted Skeletons
2814 -
    new ChoiceAdventure(
2815 -
        "Events",
2816 -
        "choiceAdventure529",
2817 -
        "Skeleton Swarm",
2818 -
        new Object[] {"Weapon Damage", "Spell Damage", "Ranged Damage"}),
2819 -
2820 -
    // It Was Then That...	Aaaaaaaah!
2821 -
    new ChoiceAdventure(
2822 -
        "Events",
2823 -
        "choiceAdventure530",
2824 -
        "Icy Peak",
2825 -
        new Object[] {new Option("hideous egg", "hideous egg"), "skip the adventure"}),
2826 -
2827 -
    // The Bonewall Is In
2828 -
    new ChoiceAdventure(
2829 -
        "Events", "choiceAdventure531", "Bonewall", new Object[] {"Item Drop", "HP Bonus"}),
2830 -
2831 -
    // You'll Sink His Battleship
2832 -
    new ChoiceAdventure(
2833 -
        "Events",
2834 -
        "choiceAdventure532",
2835 -
        "Battleship",
2836 -
        new Object[] {"Class Skills", "Accordion Thief Songs"}),
2837 -
2838 -
    // Train, Train, Choo-Choo Train
2839 -
    new ChoiceAdventure(
2840 -
        "Events",
2841 -
        "choiceAdventure533",
2842 -
        "Supply Train",
2843 -
        new Object[] {"Meat Drop", "Pressure Penalty Modifiers"}),
2844 -
2845 -
    // That's No Bone Moon...
2846 -
    new ChoiceAdventure(
2847 -
        "Events",
2848 -
        "choiceAdventure534",
2849 -
        "Bone Star",
2850 -
        new Object[] {
2851 -
          new Option("Torpedos", "photoprotoneutron torpedo"), "Initiative", "Monster Level"
2852 -
        }),
2853 -
2854 -
    // Deep Inside Ronald, Baby
2855 -
    new ChoiceAdventure(
2856 -
        "Spaaace", "choiceAdventure535", "Deep Inside Ronald", SafetyShelterManager.RonaldGoals),
2857 -
2858 -
    // Deep Inside Grimace, Bow Chick-a Bow Bow
2859 -
    new ChoiceAdventure(
2860 -
        "Spaaace", "choiceAdventure536", "Deep Inside Grimace", SafetyShelterManager.GrimaceGoals),
2861 -
2862 -
    // Choice 537 is Play Porko!
2863 -
    // Choice 538 is Big-Time Generator
2864 -
    // Choice 539 is An E.M.U. for Y.O.U.
2865 -
    // Choice 540 is Big-Time Generator - game board
2866 -
    // Choice 541 is unknown
2867 -
    // Choice 542 is Now's Your Pants!  I Mean... Your Chance!
2868 -
    // Choice 543 is Up In Their Grill
2869 -
    // Choice 544 is A Sandwich Appears!
2870 -
    // Choice 545 is unknown
2871 -
2872 -
    // Interview With You
2873 -
    new ChoiceAdventure(
2874 -
        "Item-Driven", "choiceAdventure546", "Interview With You", VampOutManager.VampOutGoals),
2875 -
2876 -
    // Behind Closed Doors
2877 -
    new ChoiceAdventure(
2878 -
        "Events",
2879 -
        "choiceAdventure548",
2880 -
        "Sorority House Necbromancer",
2881 -
        new Object[] {"enter combat with The Necbromancer", "skip adventure"}),
2882 -
2883 -
    // Dark in the Attic
2884 -
    new ChoiceSpoiler(
2885 -
        "Events",
2886 -
        "choiceAdventure549",
2887 -
        "Dark in the Attic",
2888 -
        new Object[] {
2889 -
          new Option("staff guides", "Haunted Sorority House staff guide"),
2890 -
          new Option("ghost trap", "ghost trap"),
2891 -
          "raise area ML",
2892 -
          "lower area ML",
2893 -
          new Option("mass kill werewolves with silver shotgun shell", "silver shotgun shell")
2894 -
        }),
2895 -
2896 -
    // The Unliving Room
2897 -
    new ChoiceSpoiler(
2898 -
        "Events",
2899 -
        "choiceAdventure550",
2900 -
        "The Unliving Room",
2901 -
        new Object[] {
2902 -
          "raise area ML",
2903 -
          "lower area ML",
2904 -
          new Option("mass kill zombies with chainsaw chain", "chainsaw chain"),
2905 -
          new Option("mass kill skeletons with funhouse mirror", "funhouse mirror"),
2906 -
          "get costume item"
2907 -
        }),
2908 -
2909 -
    // Debasement
2910 -
    new ChoiceSpoiler(