libram 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/combat.d.ts CHANGED
@@ -120,9 +120,10 @@ export declare class Macro {
120
120
  * Create a new macro with a condition evaluated at the time of building the macro.
121
121
  * @param condition The JS condition.
122
122
  * @param ifTrue Continuation to add if the condition is true.
123
+ * @param ifFalse Optional input to turn this into an if...else statement.
123
124
  * @returns {Macro} This object itself.
124
125
  */
125
- static externalIf<T extends Macro>(this: Constructor<T>, condition: boolean, ifTrue: string | Macro): T;
126
+ static externalIf<T extends Macro>(this: Constructor<T>, condition: boolean, ifTrue: string | Macro, ifFalse?: string | Macro): T;
126
127
  /**
127
128
  * Add a repeat step to the macro.
128
129
  * @returns {Macro} This object itself.
@@ -198,6 +199,26 @@ export declare class Macro {
198
199
  * @returns {Macro} This object itself.
199
200
  */
200
201
  static attack<T extends Macro>(this: Constructor<T>): T;
202
+ /**
203
+ * Create an if_ statement based on what holiday of loathing it currently is. On non-holidays, returns the original macro, unmutated.
204
+ * @param macro The macro to place in the if_ statement
205
+ */
206
+ ifHolidayWanderer(macro: Macro): this;
207
+ /**
208
+ * Create a new macro starting with an ifHolidayWanderer step.
209
+ * @param macro The macro to place inside the if_ statement
210
+ */
211
+ static ifHolidayWanderer<T extends Macro>(this: Constructor<T>, macro: Macro): T;
212
+ /**
213
+ * Create an if_ statement based on what holiday of loathing it currently is. On non-holidays, returns the original macro, with the input macro appended.
214
+ * @param macro The macro to place in the if_ statement.
215
+ */
216
+ ifNotHolidayWanderer(macro: Macro): this;
217
+ /**
218
+ * Create a new macro starting with an ifNotHolidayWanderer step.
219
+ * @param macro The macro to place inside the if_ statement
220
+ */
221
+ static ifNotHolidayWanderer<T extends Macro>(this: Constructor<T>, macro: Macro): T;
201
222
  }
202
223
  /**
203
224
  * Adventure in a location and handle all combats with a given macro.
package/dist/combat.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { adv1, choiceFollowsFight, getAutoAttack, inMultiFight, removeProperty, runCombat, setAutoAttack, toInt, urlEncode, visitUrl, xpath, } from "kolmafia";
2
2
  import { $items, $skills } from "./template-string";
3
3
  import { get, set } from "./property";
4
+ import { getTodaysHolidayWanderers } from "./lib";
4
5
  const MACRO_NAME = "Script Autoattack Macro";
5
6
  /**
6
7
  * Get the KoL native ID of the macro with name Script Autoattack Macro.
@@ -256,10 +257,11 @@ export class Macro {
256
257
  * Create a new macro with a condition evaluated at the time of building the macro.
257
258
  * @param condition The JS condition.
258
259
  * @param ifTrue Continuation to add if the condition is true.
260
+ * @param ifFalse Optional input to turn this into an if...else statement.
259
261
  * @returns {Macro} This object itself.
260
262
  */
261
- static externalIf(condition, ifTrue) {
262
- return new this().externalIf(condition, ifTrue);
263
+ static externalIf(condition, ifTrue, ifFalse) {
264
+ return new this().externalIf(condition, ifTrue, ifFalse);
263
265
  }
264
266
  /**
265
267
  * Add a repeat step to the macro.
@@ -372,6 +374,40 @@ export class Macro {
372
374
  static attack() {
373
375
  return new this().attack();
374
376
  }
377
+ /**
378
+ * Create an if_ statement based on what holiday of loathing it currently is. On non-holidays, returns the original macro, unmutated.
379
+ * @param macro The macro to place in the if_ statement
380
+ */
381
+ ifHolidayWanderer(macro) {
382
+ const todaysWanderers = getTodaysHolidayWanderers();
383
+ if (todaysWanderers.length === 0)
384
+ return this;
385
+ return this.if_(todaysWanderers.map((monster) => `monsterid ${monster.id}`).join(" || "), macro);
386
+ }
387
+ /**
388
+ * Create a new macro starting with an ifHolidayWanderer step.
389
+ * @param macro The macro to place inside the if_ statement
390
+ */
391
+ static ifHolidayWanderer(macro) {
392
+ return new this().ifHolidayWanderer(macro);
393
+ }
394
+ /**
395
+ * Create an if_ statement based on what holiday of loathing it currently is. On non-holidays, returns the original macro, with the input macro appended.
396
+ * @param macro The macro to place in the if_ statement.
397
+ */
398
+ ifNotHolidayWanderer(macro) {
399
+ const todaysWanderers = getTodaysHolidayWanderers();
400
+ if (todaysWanderers.length === 0)
401
+ return this.step(macro);
402
+ return this.if_(todaysWanderers.map((monster) => `!monsterid ${monster.id}`).join(" && "), macro);
403
+ }
404
+ /**
405
+ * Create a new macro starting with an ifNotHolidayWanderer step.
406
+ * @param macro The macro to place inside the if_ statement
407
+ */
408
+ static ifNotHolidayWanderer(macro) {
409
+ return new this().ifNotHolidayWanderer(macro);
410
+ }
375
411
  }
376
412
  Macro.SAVED_MACRO_PROPERTY = "libram_savedMacro";
377
413
  Macro.cachedMacroId = null;
@@ -1,11 +1,15 @@
1
- import { fullnessLimit, getWorkshed, inebrietyLimit, itemType, mallPrice, mallPrices, myFullness, myPrimestat, mySpleenUse, npcPrice, spleenLimit, } from "kolmafia";
1
+ import { canEquip, fullnessLimit, getWorkshed, inebrietyLimit, itemType, mallPrice, mallPrices, myFullness, myInebriety, myLevel, myPrimestat, mySpleenUse, npcPrice, spleenLimit, } from "kolmafia";
2
2
  import { knapsack } from "./knapsack";
3
3
  import { have } from "../lib";
4
+ import { get as getModifier } from "../modifier";
4
5
  import { get } from "../property";
5
6
  import { $effect, $item, $items, $skill, $stat } from "../template-string";
6
7
  import { sum } from "../utils";
7
- // TODO: Include other consumption modifiers - Salty Mouth?
8
- // TODO: Include Gar-ish etc.
8
+ function isMonday() {
9
+ // Checking Tuesday's ruby is a hack to see if it's Monday in Arizona.
10
+ return getModifier("Muscle Percent", $item `Tuesday's ruby`) > 0;
11
+ }
12
+ // TODO: Include Salty Mouth and potentially other modifiers.
9
13
  function expectedAdventures(item, modifiers) {
10
14
  if (item.adventures === "")
11
15
  return 0;
@@ -18,6 +22,7 @@ function expectedAdventures(item, modifiers) {
18
22
  (itemType(item) === "booze" && item.notes?.includes("BEER"))
19
23
  ? 1.5
20
24
  : 1.3;
25
+ const garish = modifiers.garish && item.notes?.includes("LASAGNA") && !isMonday();
21
26
  const refinedPalate = modifiers.refinedPalate && item.notes?.includes("WINE");
22
27
  const pinkyRing = modifiers.pinkyRing && item.notes?.includes("WINE");
23
28
  return (sum(interpolated, (baseAdventures) => {
@@ -25,6 +30,11 @@ function expectedAdventures(item, modifiers) {
25
30
  if (modifiers.forkMug) {
26
31
  adventures = Math.floor(adventures * forkMugMultiplier);
27
32
  }
33
+ if (item.notes?.includes("SAUCY") && modifiers.saucemaven) {
34
+ adventures += myPrimestat() === $stat `Mysticality` ? 5 : 3;
35
+ }
36
+ if (garish)
37
+ adventures += 5;
28
38
  if (refinedPalate)
29
39
  adventures = Math.floor(adventures * 1.25);
30
40
  if (pinkyRing)
@@ -32,13 +42,10 @@ function expectedAdventures(item, modifiers) {
32
42
  if (item.notes?.includes("MARTINI") && modifiers.tuxedoShirt) {
33
43
  adventures += 2;
34
44
  }
35
- if (have($skill `Saucemaven`) && item.notes?.includes("SAUCY")) {
36
- adventures += myPrimestat() === $stat `Mysticality` ? 5 : 3;
37
- }
38
- if (itemType(item) === "food" && modifiers.seasoning)
39
- adventures++;
40
45
  if (itemType(item) === "food" && modifiers.mayoflex)
41
46
  adventures++;
47
+ if (itemType(item) === "food" && modifiers.seasoning)
48
+ adventures++;
42
49
  return adventures;
43
50
  }) / interpolated.length);
44
51
  }
@@ -98,6 +105,8 @@ MenuItem.defaultOptions = new Map([
98
105
  size: -1,
99
106
  },
100
107
  ],
108
+ [$item `spice melange`, { maximum: "auto" }],
109
+ [$item `Ultra Mega Sour Ball`, { maximum: "auto" }],
101
110
  ]);
102
111
  const organs = ["food", "booze", "spleen item"];
103
112
  function isOrgan(x) {
@@ -114,8 +123,6 @@ class DietPlanner {
114
123
  getWorkshed() === $item `portable Mayo Clinic`
115
124
  ? menu.find((item) => item.item === $item `Mayoflex`)
116
125
  : undefined;
117
- this.pinkyRing = have($item `mafia pinky ring`);
118
- this.tuxedoShirt = have($item `tuxedo shirt`);
119
126
  this.menu = menu.filter((item) => item.organ);
120
127
  if (menu.length > 100) {
121
128
  mallPrices("food");
@@ -129,9 +136,20 @@ class DietPlanner {
129
136
  this.consumptionValue(spleenItems[0]) / spleenItems[0].item.spleen;
130
137
  }
131
138
  }
139
+ /**
140
+ * Determine the value of consuming a menu item with any profitable helpers.
141
+ * @param menuItem Menu item to check.
142
+ * @returns Value for consuming that menu item.
143
+ */
132
144
  consumptionValue(menuItem) {
133
145
  return this.consumptionHelpersAndValue(menuItem, {})[1];
134
146
  }
147
+ /**
148
+ * Determine which helpers will be used with a menu item and its resulting value.
149
+ * @param menuItem Menu item to check.
150
+ * @param overrideModifiers Overrides for consumption modifiers, if any.
151
+ * @returns Pair [array of helpers and base menu item, value].
152
+ */
135
153
  consumptionHelpersAndValue(menuItem, overrideModifiers) {
136
154
  const helpers = [];
137
155
  if (this.seasoning &&
@@ -148,9 +166,11 @@ class DietPlanner {
148
166
  forkMug: false,
149
167
  seasoning: this.seasoning ? helpers.includes(this.seasoning) : false,
150
168
  mayoflex: this.mayoflex ? helpers.includes(this.mayoflex) : false,
151
- refinedPalate: false,
152
- pinkyRing: this.pinkyRing,
153
- tuxedoShirt: this.tuxedoShirt,
169
+ refinedPalate: have($effect `Refined Palate`),
170
+ garish: have($effect `Gar-ish`),
171
+ saucemaven: have($skill `Saucemaven`),
172
+ pinkyRing: have($item `mafia pinky ring`) && canEquip($item `mafia pinky ring`),
173
+ tuxedoShirt: have($item `tuxedo shirt`) && canEquip($item `tuxedo shirt`),
154
174
  ...overrideModifiers,
155
175
  };
156
176
  const forkMug = itemType(menuItem.item) === "food"
@@ -178,8 +198,14 @@ class DietPlanner {
178
198
  ? [[...helpers, forkMug, menuItem], valueForkMug + valueSpleen]
179
199
  : [[...helpers, menuItem], valueRaw + valueSpleen];
180
200
  }
201
+ /**
202
+ * Plan an individual organ.
203
+ * @param capacity Organ capacity.
204
+ * @param overrideModifiers Overrides for consumption modifiers, if any.
205
+ * @returns Pair of [value, menu items and quantities].
206
+ */
181
207
  planOrgan(organ, capacity, overrideModifiers = {}) {
182
- const submenu = this.menu.filter((item) => item.organ === organ);
208
+ const submenu = this.menu.filter((menuItem) => menuItem.organ === organ && myLevel() >= menuItem.item.levelreq);
183
209
  const knapsackValues = submenu.map((menuItem) => [
184
210
  ...this.consumptionHelpersAndValue(menuItem, overrideModifiers),
185
211
  menuItem.size,
@@ -187,6 +213,12 @@ class DietPlanner {
187
213
  ]);
188
214
  return knapsack(knapsackValues, capacity);
189
215
  }
216
+ /**
217
+ * Plan organs.
218
+ * @param organCapacities Organ capacities.
219
+ * @param overrideModifiers Overrides for consumption modifiers, if any.
220
+ * @returns Pair of [value, menu items and quantities].
221
+ */
190
222
  planOrgans(organCapacities, overrideModifiers = {}) {
191
223
  const valuePlans = organCapacities.map(([organ, capacity]) => this.planOrgan(organ, capacity, overrideModifiers));
192
224
  return [
@@ -194,12 +226,23 @@ class DietPlanner {
194
226
  [].concat(...valuePlans.map(([, plan]) => plan)),
195
227
  ];
196
228
  }
197
- planOrgansWithTrials(organCapacities, trialItems, overrideModifiers = {}) {
229
+ /**
230
+ * Plan organs, retrying with and without each trial item. Runtime is
231
+ * proportional to 2 ^ trialItems.length.
232
+ * @param organCapacities Organ capacities.
233
+ * @param trialItems Items to rerun solver with and without.
234
+ * @param overrideModifiers Overrides for consumption modifiers, if any.
235
+ * @returns Pair of [value, menu items and quantities].
236
+ */
237
+ planOrgansWithTrials(organCapacities, trialItems, overrideModifiers) {
198
238
  if (trialItems.length === 0) {
199
239
  return this.planOrgans(organCapacities, overrideModifiers);
200
240
  }
201
- const organCapacitiesWithMap = new Map(organCapacities);
202
241
  const [trialItem, organSizes] = trialItems[0];
242
+ if (trialItem.maximum !== undefined && trialItem.maximum <= 0) {
243
+ return this.planOrgansWithTrials(organCapacities, trialItems.slice(1), overrideModifiers);
244
+ }
245
+ const organCapacitiesWithMap = new Map(organCapacities);
203
246
  for (const [organ, size] of organSizes) {
204
247
  const current = organCapacitiesWithMap.get(organ);
205
248
  if (current !== undefined) {
@@ -207,12 +250,18 @@ class DietPlanner {
207
250
  }
208
251
  }
209
252
  const organCapacitiesWith = [...organCapacitiesWithMap];
210
- const isRefinedPalate = trialItem.item === $item `pocket wish` &&
211
- trialItem.wishEffect === $effect `Refined Palate`;
253
+ const isRefinedPalate = (trialItem.item === $item `pocket wish` &&
254
+ trialItem.wishEffect === $effect `Refined Palate`) ||
255
+ trialItem.item === $item `toasted brie`;
256
+ const isGarish = (trialItem.item === $item `pocket wish` &&
257
+ trialItem.wishEffect === $effect `Gar-ish`) ||
258
+ trialItem.item === $item `potion of the field gar`;
212
259
  const [valueWithout, planWithout] = this.planOrgansWithTrials(organCapacities, trialItems.slice(1), overrideModifiers);
213
- const [valueWith, planWith] = this.planOrgansWithTrials(organCapacitiesWith, trialItems.slice(1), isRefinedPalate
214
- ? { ...overrideModifiers, refinedPalate: true }
215
- : overrideModifiers);
260
+ const [valueWith, planWith] = this.planOrgansWithTrials(organCapacitiesWith, trialItems.slice(1), {
261
+ ...overrideModifiers,
262
+ ...(isRefinedPalate ? { refinedPalate: true } : {}),
263
+ ...(isGarish ? { garish: true } : {}),
264
+ });
216
265
  const [helpersAndItem, value] = this.consumptionHelpersAndValue(trialItem, {});
217
266
  return valueWithout > valueWith + value
218
267
  ? [valueWithout, planWithout]
@@ -267,6 +316,10 @@ const interactingItems = [
267
316
  ["booze", -2],
268
317
  ],
269
318
  ],
319
+ [$effect `Refined Palate`, []],
320
+ [$item `toasted brie`, [["food", 2]]],
321
+ [$effect `Gar-ish`, []],
322
+ [$item `potion of the field gar`, []],
270
323
  ];
271
324
  /**
272
325
  * Plan out an optimal diet using a knapsack algorithm.
@@ -280,37 +333,58 @@ export function planDiet(mpa, menu, organCapacities = [
280
333
  ["booze", null],
281
334
  ["spleen item", null],
282
335
  ]) {
283
- const dietPlanner = new DietPlanner(mpa, menu);
336
+ // FIXME: Figure out a better way to handle overfull organs (e.g. coming out of Ed).
284
337
  const resolvedOrganCapacities = organCapacities.map(([organ, size]) => [
285
338
  organ,
286
339
  size ??
287
340
  (organ === "food"
288
- ? fullnessLimit() -
289
- myFullness() +
290
- (have($item `distention pill`) ? 1 : 0)
341
+ ? fullnessLimit() - myFullness()
291
342
  : organ === "booze"
292
- ? inebrietyLimit() + (have($item `synthetic dog hair pill`) ? 1 : 0)
343
+ ? inebrietyLimit() - myInebriety()
293
344
  : organ === "spleen item"
294
345
  ? spleenLimit() - mySpleenUse()
295
346
  : 0),
296
347
  ]);
297
- const allItems = new Map(menu.map((menuItem) => [menuItem.item, menuItem]));
298
- const includedInteractingItems = interactingItems
299
- .map(([item, sizes]) => [allItems.get(item), sizes])
300
- .filter(([menuItem]) => menuItem);
301
- // TODO: support toasted brie.
302
- // Refined Palate must also be treated as an interacting item, as it's a one-time cost.
303
- const palateWish = menu.find((menuItem) => menuItem.item === $item `pocket wish` &&
304
- menuItem.wishEffect === $effect `Refined Palate`);
305
- if (palateWish) {
306
- includedInteractingItems.push([palateWish, []]);
348
+ /**
349
+ * Per above description, separate out items with cross-organ interaction
350
+ * ("interacting items") for special treatment. These will be checked by
351
+ * running the solver several times.
352
+ */
353
+ const includedInteractingItems = menu
354
+ .map((menuItem) => {
355
+ const interacting = interactingItems.find(([itemOrEffect]) => menuItem.item === itemOrEffect ||
356
+ (menuItem.item === $item `pocket wish` &&
357
+ menuItem.wishEffect === itemOrEffect));
358
+ if (interacting) {
359
+ const [, organSizes] = interacting;
360
+ return [menuItem, organSizes];
361
+ }
362
+ else {
363
+ return null;
364
+ }
365
+ })
366
+ .filter((value) => value !== null);
367
+ // Filter out interacting items from natural consideration.
368
+ const dietPlanner = new DietPlanner(mpa, menu.filter((menuItem) => !includedInteractingItems.some(([interacting]) => interacting === menuItem)));
369
+ /**
370
+ * Because our knapsack solver is one-dimensional, we have to consider
371
+ * each organ separately. Since there are no spleen items that affect
372
+ * stomach/liver, we consider those two first, with an approximation of the
373
+ * value of spleen-cleaning. Afterwards, we see how much spleen we have and
374
+ * plan that.
375
+ */
376
+ const [, planFoodBooze] = dietPlanner.planOrgansWithTrials(resolvedOrganCapacities.filter(([organ, capacity]) => ["food", "booze"].includes(organ) && capacity >= 0), includedInteractingItems, {});
377
+ const spleenCapacity = resolvedOrganCapacities.find(([organ]) => organ === "spleen item");
378
+ if (spleenCapacity) {
379
+ // Count sliders and pickle juice, figure out how much extra spleen we got.
380
+ const additionalSpleen = sum(planFoodBooze, ([items, number]) => items.some((menuItem) => $items `jar of fermented pickle juice, extra-greasy slider`.includes(menuItem.item))
381
+ ? 5 * number
382
+ : 0);
383
+ const [, availableSpleen] = spleenCapacity;
384
+ const [, planSpleen] = dietPlanner.planOrgan("spleen item", availableSpleen + additionalSpleen);
385
+ return [...planFoodBooze, ...planSpleen];
386
+ }
387
+ else {
388
+ return planFoodBooze;
307
389
  }
308
- const [, planFoodBooze] = dietPlanner.planOrgansWithTrials(resolvedOrganCapacities.filter(([organ]) => ["food", "booze"].includes(organ)), includedInteractingItems);
309
- // Count sliders and pickle juice, figure out how much extra spleen we got.
310
- const additionalSpleen = sum(planFoodBooze, ([items, number]) => items.some((menuItem) => $items `jar of fermented pickle juice, extra-greasy slider`.includes(menuItem.item))
311
- ? 5 * number
312
- : 0);
313
- const [, availableSpleen] = resolvedOrganCapacities.find(([organ]) => organ === "spleen item") ?? ["spleen item", 0];
314
- const [, planSpleen] = dietPlanner.planOrgan("spleen item", availableSpleen + additionalSpleen);
315
- return [...planFoodBooze, ...planSpleen];
316
390
  }
@@ -32,17 +32,30 @@ function aggregate(list, isEqual) {
32
32
  * @returns Tuple {[totalValue, items]} of selected items and total value of those items.
33
33
  */
34
34
  export function knapsack(values, capacity) {
35
+ if (!Number.isFinite(capacity)) {
36
+ throw new Error("Invalid capacity.");
37
+ }
35
38
  // Invert negative values into a fake value for not using it.
36
- const valuesInverted = values.map(([thing, value, weight, maximum]) => (weight < 0 && maximum
39
+ const valuesInverted = values.map(([thing, value, weight, maximum]) => (weight < 0 && maximum !== undefined
37
40
  ? [new Not(thing), -value, -weight, maximum]
38
41
  : [thing, value, weight, maximum]));
39
- const capacityAdjustment = sum(values, ([, , weight, maximum]) => weight < 0 && maximum ? -weight * maximum : 0);
42
+ const capacityAdjustment = sum(values, ([, , weight, maximum]) => weight < 0 && maximum !== undefined ? -weight * maximum : 0);
40
43
  const adjustedCapacity = capacity + capacityAdjustment;
44
+ if (adjustedCapacity < 0) {
45
+ // We don't have enough cleaners to create any space, so can't fit anything.
46
+ return [-Infinity, []];
47
+ }
41
48
  // Sort values by weight.
42
49
  const valuesSorted = [...valuesInverted].sort((x, y) => x[2] - y[2]);
43
50
  // Convert the problem into 0/1 knapsack - just include as many copies as possible of each item.
44
51
  const values01 = [].concat(...valuesSorted.map(([thing, value, weight, maximum]) => {
52
+ if (!Number.isFinite(weight) || weight < 0) {
53
+ throw new Error(`Invalid weight ${weight} for ${thing instanceof Not ? `not ${thing.thing}` : thing}`);
54
+ }
45
55
  const maxQuantity = maximum ?? Math.floor(adjustedCapacity / weight);
56
+ if (maxQuantity < 0) {
57
+ throw new Error(`Invalid max quantity ${maxQuantity} for ${thing instanceof Not ? `not ${thing.thing}` : thing}`);
58
+ }
46
59
  return new Array(maxQuantity).fill([
47
60
  thing,
48
61
  value,
package/dist/lib.d.ts CHANGED
@@ -265,3 +265,5 @@ export declare function findLeprechaunMultiplier(familiar: Familiar): number;
265
265
  * @param familiar The familiar whose fairy multiplier you're interested in
266
266
  */
267
267
  export declare function findFairyMultiplier(familiar: Familiar): number;
268
+ export declare const holidayWanderers: Map<string, Monster[]>;
269
+ export declare function getTodaysHolidayWanderers(): Monster[];
package/dist/lib.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /** @module GeneralLibrary */
2
2
  import "core-js/modules/es.object.entries";
3
- import { appearanceRates, autosellPrice, availableAmount, booleanModifier, cliExecute, fullnessLimit, getCampground, getCounters, getPlayerId, getPlayerName, getRelated, haveEffect, haveFamiliar, haveServant, haveSkill, inebrietyLimit, mallPrice, myEffects, myFamiliar, myFullness, myInebriety, myPath, mySpleenUse, myThrall, myTurncount, numericModifier, spleenLimit, toItem, toSkill, totalTurnsPlayed, } from "kolmafia";
4
- import { $class, $familiar, $item, $items } from "./template-string";
3
+ import { appearanceRates, autosellPrice, availableAmount, booleanModifier, cliExecute, fullnessLimit, getCampground, getCounters, getPlayerId, getPlayerName, getRelated, haveEffect, haveFamiliar, haveServant, haveSkill, holiday, inebrietyLimit, mallPrice, myEffects, myFamiliar, myFullness, myInebriety, myPath, mySpleenUse, myThrall, myTurncount, numericModifier, spleenLimit, toItem, toSkill, totalTurnsPlayed, } from "kolmafia";
4
+ import { $class, $familiar, $item, $items, $monsters } from "./template-string";
5
5
  import { get } from "./property";
6
6
  import { chunk } from "./utils";
7
7
  /**
@@ -506,3 +506,23 @@ export function findFairyMultiplier(familiar) {
506
506
  return 0;
507
507
  return Math.pow(Math.sqrt(itemBonus + 55 / 4 + 3) - Math.sqrt(55) / 2, 2);
508
508
  }
509
+ export const holidayWanderers = new Map([
510
+ [
511
+ "El Dia De Los Muertos Borrachos",
512
+ $monsters `Novia Cadáver, Novio Cadáver, Padre Cadáver, Persona Inocente Cadáver`,
513
+ ],
514
+ [
515
+ "Feast of Boris",
516
+ $monsters `Candied Yam Golem, Malevolent Tofurkey, Possessed Can of Cranberry Sauce, Stuffing Golem`,
517
+ ],
518
+ [
519
+ "Talk Like a Pirate Day",
520
+ $monsters `ambulatory pirate, migratory pirate, peripatetic pirate`,
521
+ ],
522
+ ]);
523
+ export function getTodaysHolidayWanderers() {
524
+ return holiday()
525
+ .split("/")
526
+ .map((holiday) => holidayWanderers.get(holiday) ?? [])
527
+ .flat();
528
+ }
package/dist/mood.d.ts CHANGED
@@ -72,6 +72,11 @@ export declare class Mood {
72
72
  * @param effect Effect to wish for in the mood.
73
73
  */
74
74
  genie(effect: Effect): Mood;
75
+ /**
76
+ * Add an Asdon Martin driving style to the mood.
77
+ * @param effect Driving style to add to the mood.
78
+ */
79
+ drive(effect: Effect): Mood;
75
80
  /**
76
81
  * Execute the mood, trying to ensure {ensureTurns} of each effect.
77
82
  * @param ensureTurns Turns of each effect to try and achieve.
package/dist/mood.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { availableAmount, buy, cliExecute, eat, effectModifier, haveEffect, haveSkill, hpCost, itemAmount, mallPrice, mpCost, myHp, myMaxmp, myMp, numericModifier, retrieveItem, toEffect, toSkill, turnsPerCast, use, useSkill, } from "kolmafia";
2
2
  import { getActiveSongs, have, isSong } from "./lib";
3
3
  import { get } from "./property";
4
+ import { AsdonMartin } from "./resources";
4
5
  import { $item, $skill } from "./template-string";
5
6
  import { clamp, sum } from "./utils";
6
7
  export class MpSource {
@@ -171,6 +172,15 @@ class CustomMoodElement extends MoodElement {
171
172
  return haveEffect(this.effect) > ensureTurns;
172
173
  }
173
174
  }
175
+ class AsdonMoodElement extends MoodElement {
176
+ constructor(effect) {
177
+ super();
178
+ this.effect = effect;
179
+ }
180
+ execute(mood, ensureTurns) {
181
+ return AsdonMartin.drive(this.effect, ensureTurns);
182
+ }
183
+ }
174
184
  /**
175
185
  * Class representing a mood object. Add mood elements using the instance methods, which can be chained.
176
186
  */
@@ -246,6 +256,16 @@ export class Mood {
246
256
  this.elements.push(new GenieMoodElement(effect));
247
257
  return this;
248
258
  }
259
+ /**
260
+ * Add an Asdon Martin driving style to the mood.
261
+ * @param effect Driving style to add to the mood.
262
+ */
263
+ drive(effect) {
264
+ if (Object.values(AsdonMartin.Driving).includes(effect)) {
265
+ this.elements.push(new AsdonMoodElement(effect));
266
+ }
267
+ return this;
268
+ }
249
269
  /**
250
270
  * Execute the mood, trying to ensure {ensureTurns} of each effect.
251
271
  * @param ensureTurns Turns of each effect to try and achieve.
package/dist/property.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import "core-js/modules/es.object.entries";
2
2
  import "core-js/modules/es.object.from-entries";
3
3
  import { getProperty, setProperty } from "kolmafia";
4
- import { isBooleanProperty, isLocationProperty, isMonsterProperty, isNumericProperty, } from "./propertyTyping";
4
+ import { isBooleanProperty, isLocationProperty, isMonsterProperty, isNumericProperty, isPhylumProperty, } from "./propertyTyping";
5
5
  const createPropertyGetter = (transform) => (property, default_) => {
6
6
  const value = getProperty(property);
7
7
  if (default_ !== undefined && value === "") {
@@ -51,6 +51,9 @@ export function get(property, _default) {
51
51
  if (isNumericProperty(property, value)) {
52
52
  return getNumber(property, _default);
53
53
  }
54
+ if (isPhylumProperty(property)) {
55
+ return getPhylum(property);
56
+ }
54
57
  return value;
55
58
  }
56
59
  export function set(property, value) {
@@ -3,7 +3,8 @@ export declare type BooleanProperty = "addChatCommandLine" | "addCreationQueue"
3
3
  export declare type NumericProperty = "charsheetDropdown" | "chatStyle" | "coinMasterIndex" | "dailyDeedsVersion" | "defaultDropdown1" | "defaultDropdown2" | "defaultDropdownSplit" | "defaultLimit" | "fixedThreadPoolSize" | "itemManagerIndex" | "lastBuffRequestType" | "lastGlobalCounterDay" | "lastImageCacheClear" | "lastRssUpdate" | "previousUpdateRevision" | "relaySkillButtonCount" | "scriptButtonPosition" | "statusDropdown" | "svnThreadPoolSize" | "toolbarPosition" | "_g9Effect" | "addingScrolls" | "affirmationCookiesEaten" | "aminoAcidsUsed" | "antagonisticSnowmanKitCost" | "autoAbortThreshold" | "autoAntidote" | "autoBuyPriceLimit" | "availableCandyCredits" | "availableDimes" | "availableFunPoints" | "availableQuarters" | "availableStoreCredits" | "availableSwagger" | "averageSwagger" | "awolMedicine" | "awolPointsBeanslinger" | "awolPointsCowpuncher" | "awolPointsSnakeoiler" | "awolDeferredPointsBeanslinger" | "awolDeferredPointsCowpuncher" | "awolDeferredPointsSnakeoiler" | "awolVenom" | "bagOTricksCharges" | "ballpitBonus" | "bankedKarma" | "barrelGoal" | "bartenderTurnsUsed" | "basementMallPrices" | "basementSafetyMargin" | "batmanFundsAvailable" | "batmanBonusInitialFunds" | "batmanTimeLeft" | "bearSwagger" | "beeCounter" | "birdformCold" | "birdformHot" | "birdformRoc" | "birdformSleaze" | "birdformSpooky" | "birdformStench" | "blackBartsBootyCost" | "blackPuddingsDefeated" | "blackForestProgress" | "blankOutUsed" | "bloodweiserDrunk" | "bondPoints" | "bondVillainsDefeated" | "boneAbacusVictories" | "booPeakProgress" | "borisPoints" | "breakableHandling" | "breakableHandling1964" | "breakableHandling9691" | "breakableHandling9692" | "breakableHandling9699" | "brodenBacteria" | "brodenSprinkles" | "buffBotMessageDisposal" | "buffBotPhilanthropyType" | "buffJimmyIngredients" | "burnoutsDefeated" | "burrowgrubSummonsRemaining" | "camelSpit" | "camerasUsed" | "campAwayDecoration" | "carboLoading" | "catBurglarBankHeists" | "cellarLayout" | "charitableDonations" | "chasmBridgeProgress" | "chefTurnsUsed" | "chessboardsCleared" | "chilledToTheBone" | "cinderellaMinutesToMidnight" | "cinderellaScore" | "cocktailSummons" | "controlPanelOmega" | "cornucopiasOpened" | "cozyCounter6332" | "cozyCounter6333" | "cozyCounter6334" | "crimbo16BeardChakraCleanliness" | "crimbo16BootsChakraCleanliness" | "crimbo16BungChakraCleanliness" | "crimbo16CrimboHatChakraCleanliness" | "crimbo16GutsChakraCleanliness" | "crimbo16HatChakraCleanliness" | "crimbo16JellyChakraCleanliness" | "crimbo16LiverChakraCleanliness" | "crimbo16NippleChakraCleanliness" | "crimbo16NoseChakraCleanliness" | "crimbo16ReindeerChakraCleanliness" | "crimbo16SackChakraCleanliness" | "crimboTreeDays" | "cubelingProgress" | "currentExtremity" | "currentHedgeMazeRoom" | "currentMojoFilters" | "currentNunneryMeat" | "cyrptAlcoveEvilness" | "cyrptCrannyEvilness" | "cyrptNicheEvilness" | "cyrptNookEvilness" | "cyrptTotalEvilness" | "darkGyfftePoints" | "daycareEquipment" | "daycareInstructors" | "daycareLastScavenge" | "daycareToddlers" | "dbNemesisSkill1" | "dbNemesisSkill2" | "dbNemesisSkill3" | "desertExploration" | "desktopHeight" | "desktopWidth" | "dinseyFilthLevel" | "dinseyFunProgress" | "dinseyNastyBearsDefeated" | "dinseySocialJusticeIProgress" | "dinseySocialJusticeIIProgress" | "dinseyTouristsFed" | "dinseyToxicMultiplier" | "doctorBagQuestLights" | "doctorBagUpgrades" | "dreadScroll1" | "dreadScroll2" | "dreadScroll3" | "dreadScroll4" | "dreadScroll5" | "dreadScroll6" | "dreadScroll7" | "dreadScroll8" | "dripAdventuresSinceAscension" | "drippingHallAdventuresSinceAscension" | "drippingTreesAdventuresSinceAscension" | "drippyBatsUnlocked" | "drippyJuice" | "drippyOrbsClaimed" | "drunkenSwagger" | "edDefeatAbort" | "edPoints" | "eldritchTentaclesFought" | "electricKoolAidEaten" | "encountersUntilDMTChoice" | "encountersUntilNEPChoice" | "ensorceleeLevel" | "essenceOfAnnoyanceCost" | "essenceOfBearCost" | "extraRolloverAdventures" | "falloutShelterLevel" | "fingernailsClipped" | "fistSkillsKnown" | "flyeredML" | "fossilB" | "fossilD" | "fossilN" | "fossilP" | "fossilS" | "fossilW" | "fratboysDefeated" | "frenchGuardTurtlesFreed" | "garbageChampagneCharge" | "garbageFireProgress" | "garbageShirtCharge" | "garbageTreeCharge" | "garlandUpgrades" | "gingerDigCount" | "gingerLawChoice" | "gingerMuscleChoice" | "gingerTrainScheduleStudies" | "gladiatorBallMovesKnown" | "gladiatorBladeMovesKnown" | "gladiatorNetMovesKnown" | "glitchItemCost" | "glitchItemImplementationCount" | "glitchItemImplementationLevel" | "glitchSwagger" | "gloverPoints" | "gnasirProgress" | "goldenMrAccessories" | "gongPath" | "goreCollected" | "gourdItemCount" | "grimoire1Summons" | "grimoire2Summons" | "grimoire3Summons" | "grimstoneCharge" | "guardTurtlesFreed" | "guideToSafariCost" | "guyMadeOfBeesCount" | "guzzlrBronzeDeliveries" | "guzzlrDeliveryProgress" | "guzzlrGoldDeliveries" | "guzzlrPlatinumDeliveries" | "haciendaLayout" | "heavyRainsStartingThunder" | "heavyRainsStartingRain" | "heavyRainsStartingLightning" | "heroDonationBoris" | "heroDonationJarlsberg" | "heroDonationSneakyPete" | "hiddenApartmentProgress" | "hiddenBowlingAlleyProgress" | "hiddenHospitalProgress" | "hiddenOfficeProgress" | "hiddenTavernUnlock" | "highTopPumped" | "hippiesDefeated" | "holidayHalsBookCost" | "holidaySwagger" | "hpAutoRecovery" | "hpAutoRecoveryTarget" | "iceSwagger" | "item9084" | "jarlsbergPoints" | "jungCharge" | "junglePuns" | "knownAscensions" | "kolhsTotalSchoolSpirited" | "lastAnticheeseDay" | "lastArcadeAscension" | "lastBadMoonReset" | "lastBangPotionReset" | "lastBarrelSmashed" | "lastBattlefieldReset" | "lastBreakfast" | "lastCastleGroundUnlock" | "lastCastleTopUnlock" | "lastCellarReset" | "lastChanceThreshold" | "lastChasmReset" | "lastColosseumRoundWon" | "lastCouncilVisit" | "lastCounterDay" | "lastDesertUnlock" | "lastDispensaryOpen" | "lastDMTDuplication" | "lastDwarfFactoryReset" | "lastEVHelmetValue" | "lastEVHelmetReset" | "lastEasterEggBalloon" | "lastEmptiedStorage" | "lastFilthClearance" | "lastGoofballBuy" | "lastGuildStoreOpen" | "lastGuyMadeOfBeesReset" | "lastFratboyCall" | "lastFriarCeremonyAscension" | "lastHippyCall" | "lastIslandUnlock" | "lastKeyotronUse" | "lastKingLiberation" | "lastLightsOutTurn" | "lastMushroomPlot" | "lastMiningReset" | "lastNemesisReset" | "lastPaperStripReset" | "lastPirateEphemeraReset" | "lastPirateInsultReset" | "lastPlusSignUnlock" | "lastQuartetAscension" | "lastQuartetRequest" | "lastSecondFloorUnlock" | "lastSemirareReset" | "lastSkateParkReset" | "lastStillBeatingSpleen" | "lastTavernAscension" | "lastTavernSquare" | "lastTelescopeReset" | "lastTempleAdventures" | "lastTempleButtonsUnlock" | "lastTempleUnlock" | "lastTr4pz0rQuest" | "lastVioletFogMap" | "lastVoteMonsterTurn" | "lastWartDinseyDefeated" | "lastWuTangDefeated" | "lastYearbookCameraAscension" | "lastZapperWand" | "lawOfAveragesCost" | "libramSummons" | "lightsOutAutomation" | "louvreDesiredGoal" | "louvreGoal" | "lttQuestDifficulty" | "lttQuestStageCount" | "manaBurnSummonThreshold" | "manaBurningThreshold" | "manaBurningTrigger" | "manorDrawerCount" | "manualOfNumberologyCost" | "mapToKokomoCost" | "masksUnlocked" | "maximizerMRUSize" | "maximizerCombinationLimit" | "maximizerEquipmentLevel" | "maximizerEquipmentScope" | "maximizerMaxPrice" | "maximizerPriceLevel" | "maxManaBurn" | "mayflyExperience" | "mayoLevel" | "meansuckerPrice" | "merkinVocabularyMastery" | "miniAdvClass" | "miniMartinisDrunk" | "moleTunnelLevel" | "mothershipProgress" | "mpAutoRecovery" | "mpAutoRecoveryTarget" | "munchiesPillsUsed" | "mushroomGardenCropLevel" | "nextParanormalActivity" | "nextQuantumFamiliarTurn" | "noobPoints" | "noobDeferredPoints" | "noodleSummons" | "nsContestants1" | "nsContestants2" | "nsContestants3" | "numericSwagger" | "nunsVisits" | "oilPeakProgress" | "optimalSwagger" | "optimisticCandleProgress" | "palindomeDudesDefeated" | "parasolUsed" | "pendingMapReflections" | "pirateSwagger" | "plantingDay" | "plumberBadgeCost" | "plumberCostumeCost" | "plumberPoints" | "poolSharkCount" | "poolSkill" | "prismaticSummons" | "procrastinatorLanguageFluency" | "promptAboutCrafting" | "puzzleChampBonus" | "pyramidPosition" | "rockinRobinProgress" | "ROMOfOptimalityCost" | "quantumPoints" | "reagentSummons" | "reanimatorArms" | "reanimatorLegs" | "reanimatorSkulls" | "reanimatorWeirdParts" | "reanimatorWings" | "recentLocations" | "redSnapperProgress" | "relocatePygmyJanitor" | "relocatePygmyLawyer" | "rumpelstiltskinTurnsUsed" | "rumpelstiltskinKidsRescued" | "safariSwagger" | "sausageGrinderUnits" | "schoolOfHardKnocksDiplomaCost" | "schoolSwagger" | "scrapbookCharges" | "scriptMRULength" | "seaodesFound" | "SeasoningSwagger" | "semirareCounter" | "sexChanges" | "shenInitiationDay" | "shockingLickCharges" | "singleFamiliarRun" | "skillBurn3" | "skillBurn90" | "skillBurn153" | "skillBurn154" | "skillBurn155" | "skillBurn1019" | "skillBurn5017" | "skillBurn6014" | "skillBurn6015" | "skillBurn6016" | "skillBurn6020" | "skillBurn6021" | "skillBurn6022" | "skillBurn6023" | "skillBurn6024" | "skillBurn6026" | "skillBurn6028" | "skillBurn7323" | "skillBurn14008" | "skillBurn14028" | "skillBurn14038" | "skillBurn15011" | "skillBurn15028" | "skillBurn17005" | "skillBurn22034" | "skillBurn22035" | "skillBurn23301" | "skillBurn23302" | "skillBurn23303" | "skillBurn23304" | "skillBurn23305" | "skillBurn23306" | "skillLevel46" | "skillLevel47" | "skillLevel48" | "skillLevel117" | "skillLevel118" | "skillLevel121" | "skillLevel128" | "skillLevel134" | "skillLevel144" | "skillLevel180" | "skillLevel188" | "skillLevel7254" | "slimelingFullness" | "slimelingStacksDropped" | "slimelingStacksDue" | "smoresEaten" | "smutOrcNoncombatProgress" | "sneakyPetePoints" | "snojoMoxieWins" | "snojoMuscleWins" | "snojoMysticalityWins" | "sourceAgentsDefeated" | "sourceEnlightenment" | "sourceInterval" | "sourcePoints" | "sourceTerminalGram" | "sourceTerminalPram" | "sourceTerminalSpam" | "spaceBabyLanguageFluency" | "spacePirateLanguageFluency" | "spelunkyNextNoncombat" | "spelunkySacrifices" | "spelunkyWinCount" | "spookyPuttyCopiesMade" | "statbotUses" | "sugarCounter4178" | "sugarCounter4179" | "sugarCounter4180" | "sugarCounter4181" | "sugarCounter4182" | "sugarCounter4183" | "sugarCounter4191" | "summonAnnoyanceCost" | "tacoDanCocktailSauce" | "tacoDanFishMeat" | "tavernLayout" | "telescopeUpgrades" | "tempuraSummons" | "timeSpinnerMedals" | "timesRested" | "tomeSummons" | "totalCharitableDonations" | "turtleBlessingTurns" | "twinPeakProgress" | "unicornHornInflation" | "universalSeasoningCost" | "usable1HWeapons" | "usable1xAccs" | "usable2HWeapons" | "usable3HWeapons" | "usableAccessories" | "usableHats" | "usableOffhands" | "usableOther" | "usablePants" | "usableShirts" | "valueOfAdventure" | "valueOfInventory" | "valueOfStill" | "valueOfTome" | "violetFogGoal" | "walfordBucketProgress" | "warehouseProgress" | "welcomeBackAdv" | "writingDesksDefeated" | "xoSkeleltonXProgress" | "xoSkeleltonOProgress" | "yearbookCameraAscensions" | "yearbookCameraUpgrades" | "youRobotBody" | "youRobotBottom" | "youRobotLeft" | "youRobotRight" | "youRobotTop" | "zeppelinProtestors" | "zombiePoints" | "_absintheDrops" | "_abstractionDropsCrown" | "_aguaDrops" | "_xenomorphCharge" | "_ancestralRecallCasts" | "_antihangoverBonus" | "_astralDrops" | "_backUpUses" | "_badlyRomanticArrows" | "_badgerCharge" | "_balefulHowlUses" | "_banderRunaways" | "_bastilleGames" | "_beanCannonUses" | "_bearHugs" | "_beerLensDrops" | "_benettonsCasts" | "_birdsSoughtToday" | "_boomBoxFights" | "_boomBoxSongsLeft" | "_bootStomps" | "_boxingGloveArrows" | "_brickoEyeSummons" | "_brickoFights" | "_campAwayCloudBuffs" | "_campAwaySmileBuffs" | "_candySummons" | "_captainHagnkUsed" | "_carnieCandyDrops" | "_carrotNoseDrops" | "_catBurglarCharge" | "_catBurglarHeistsComplete" | "_cheerleaderSteam" | "_chestXRayUsed" | "_chipBags" | "_chocolateCigarsUsed" | "_chocolateSculpturesUsed" | "_chocolatesUsed" | "_chronolithActivations" | "_clanFortuneConsultUses" | "_clipartSummons" | "_companionshipCasts" | "_dailySpecialPrice" | "_daycareGymScavenges" | "_daycareRecruits" | "_deckCardsDrawn" | "_deluxeKlawSummons" | "_demandSandwich" | "_detectiveCasesCompleted" | "_disavowed" | "_dnaPotionsMade" | "_donhosCasts" | "_dreamJarDrops" | "_drunkPygmyBanishes" | "_edDefeats" | "_edLashCount" | "_elronsCasts" | "_enamorangs" | "_energyCollected" | "_expertCornerCutterUsed" | "_favorRareSummons" | "_feastUsed" | "_feelinTheRhythm" | "_feelPrideUsed" | "_feelExcitementUsed" | "_feelHatredUsed" | "_feelLonelyUsed" | "_feelNervousUsed" | "_feelEnvyUsed" | "_feelDisappointedUsed" | "_feelSuperiorUsed" | "_feelLostUsed" | "_feelNostalgicUsed" | "_feelPeacefulUsed" | "_fingertrapArrows" | "_fireExtinguisherCharge" | "_fragrantHerbsUsed" | "_freeBeachWalksUsed" | "_frButtonsPressed" | "_fudgeWaspFights" | "_gapBuffs" | "_garbageFireDropsCrown" | "_genieFightsUsed" | "_genieWishesUsed" | "_gibbererAdv" | "_gibbererCharge" | "_gingerbreadCityTurns" | "_glarkCableUses" | "_glitchMonsterFights" | "_gnomeAdv" | "_godLobsterFights" | "_goldenMoneyCharge" | "_gongDrops" | "_gothKidCharge" | "_gothKidFights" | "_grimBrotherCharge" | "_grimFairyTaleDrops" | "_grimFairyTaleDropsCrown" | "_grimoireConfiscatorSummons" | "_grimoireGeekySummons" | "_grimstoneMaskDrops" | "_grimstoneMaskDropsCrown" | "_grooseCharge" | "_grooseDrops" | "_guzzlrDeliveries" | "_guzzlrGoldDeliveries" | "_guzzlrPlatinumDeliveries" | "_hareAdv" | "_hareCharge" | "_highTopPumps" | "_hipsterAdv" | "_hoardedCandyDropsCrown" | "_hoboUnderlingSummons" | "_holoWristDrops" | "_holoWristProgress" | "_hotAshesDrops" | "_hotJellyUses" | "_hotTubSoaks" | "_humanMuskUses" | "_iceballUses" | "_inigosCasts" | "_jerksHealthMagazinesUsed" | "_jiggleCheese" | "_jiggleCream" | "_jiggleLife" | "_jiggleSteak" | "_jitbCharge" | "_jungDrops" | "_kgbClicksUsed" | "_kgbDispenserUses" | "_kgbTranquilizerDartUses" | "_klawSummons" | "_kloopCharge" | "_kloopDrops" | "_kolhsAdventures" | "_kolhsSavedByTheBell" | "_lastDailyDungeonRoom" | "_lastSausageMonsterTurn" | "_lastZomboEye" | "_latteRefillsUsed" | "_leafblowerML" | "_legionJackhammerCrafting" | "_llamaCharge" | "_longConUsed" | "_loveChocolatesUsed" | "_lynyrdSnareUses" | "_machineTunnelsAdv" | "_macrometeoriteUses" | "_mafiaThumbRingAdvs" | "_monstersMapped" | "_mayflowerDrops" | "_mayflySummons" | "_mediumSiphons" | "_meteoriteAdesUsed" | "_meteorShowerUses" | "_micrometeoriteUses" | "_miniMartiniDrops" | "_mushroomGardenFights" | "_nanorhinoCharge" | "_navelRunaways" | "_neverendingPartyFreeTurns" | "_newYouQuestSharpensDone" | "_newYouQuestSharpensToDo" | "_nextQuantumAlignment" | "_nightmareFuelCharges" | "_noobSkillCount" | "_nuclearStockpileUsed" | "_oilExtracted" | "_optimisticCandleDropsCrown" | "_oreDropsCrown" | "_otoscopeUsed" | "_pantsgivingBanish" | "_pantsgivingCount" | "_pantsgivingCrumbs" | "_pantsgivingFullness" | "_pasteDrops" | "_peteJukeboxFixed" | "_peteJumpedShark" | "_petePeeledOut" | "_pieDrops" | "_piePartsCount" | "_pixieCharge" | "_pocketProfessorLectures" | "_poisonArrows" | "_pokeGrowFertilizerDrops" | "_poolGames" | "_powderedGoldDrops" | "_powderedMadnessUses" | "_powerfulGloveBatteryPowerUsed" | "_powerPillDrops" | "_powerPillUses" | "_precisionCasts" | "_radlibSummons" | "_raindohCopiesMade" | "_rapidPrototypingUsed" | "_raveStealCount" | "_reflexHammerUsed" | "_resolutionAdv" | "_resolutionRareSummons" | "_riftletAdv" | "_rogueProgramCharge" | "_romanticFightsLeft" | "_saberForceMonsterCount" | "_saberForceUses" | "_saberMod" | "_saltGrainsConsumed" | "_sandwormCharge" | "_saplingsPlanted" | "_sausageFights" | "_sausagesEaten" | "_sausagesMade" | "_sealFigurineUses" | "_sealScreeches" | "_sealsSummoned" | "_shatteringPunchUsed" | "_shortOrderCookCharge" | "_shrubCharge" | "_sloppyDinerBeachBucks" | "_smilesOfMrA" | "_smithsnessSummons" | "_snojoFreeFights" | "_snojoParts" | "_snokebombUsed" | "_snowconeSummons" | "_snowglobeDrops" | "_snowSuitCount" | "_sourceTerminalDigitizeMonsterCount" | "_sourceTerminalDigitizeUses" | "_sourceTerminalDuplicateUses" | "_sourceTerminalEnhanceUses" | "_sourceTerminalExtrudes" | "_sourceTerminalPortscanUses" | "_spaceFurDropsCrown" | "_spacegatePlanetIndex" | "_spacegateTurnsLeft" | "_spaceJellyfishDrops" | "_speakeasyDrinksDrunk" | "_spelunkerCharges" | "_spelunkingTalesDrops" | "_spookyJellyUses" | "_stackLumpsUses" | "_steamCardDrops" | "_stickerSummons" | "_stinkyCheeseCount" | "_stressBallSqueezes" | "_sugarSummons" | "_taffyRareSummons" | "_taffyYellowSummons" | "_thanksgettingFoodsEaten" | "_thingfinderCasts" | "_thinknerdPackageDrops" | "_thorsPliersCrafting" | "_timeHelmetAdv" | "_timeSpinnerMinutesUsed" | "_tokenDrops" | "_transponderDrops" | "_turkeyBlastersUsed" | "_turkeyBooze" | "_turkeyMuscle" | "_turkeyMyst" | "_turkeyMoxie" | "_unaccompaniedMinerUsed" | "_unconsciousCollectiveCharge" | "_universeCalculated" | "_universeImploded" | "_usedReplicaBatoomerang" | "_vampyreCloakeFormUses" | "_villainLairProgress" | "_vitachocCapsulesUsed" | "_vmaskAdv" | "_volcanoItem1" | "_volcanoItem2" | "_volcanoItem3" | "_volcanoItemCount1" | "_volcanoItemCount2" | "_volcanoItemCount3" | "_voteFreeFights" | "_VYKEACompanionLevel" | "_warbearAutoAnvilCrafting" | "_whiteRiceDrops" | "_witchessFights" | "_xoHugsUsed" | "_yellowPixelDropsCrown" | "_zapCount";
4
4
  export declare type MonsterProperty = "cameraMonster" | "chateauMonster" | "crappyCameraMonster" | "crudeMonster" | "crystalBallMonster" | "enamorangMonster" | "envyfishMonster" | "lastCopyableMonster" | "iceSculptureMonster" | "longConMonster" | "makeFriendsMonster" | "merkinLockkeyMonster" | "nosyNoseMonster" | "olfactedMonster" | "photocopyMonster" | "rainDohMonster" | "romanticTarget" | "screencappedMonster" | "spookyPuttyMonster" | "stenchCursedMonster" | "superficiallyInterestedMonster" | "waxMonster" | "yearbookCameraTarget" | "_gallapagosMonster" | "_jiggleCreamedMonster" | "_latteMonster" | "_nanorhinoBanishedMonster" | "_newYouQuestMonster" | "_relativityMonster" | "_saberForceMonster" | "_sourceTerminalDigitizeMonster" | "_voteMonster";
5
5
  export declare type LocationProperty = "crystalBallLocation" | "currentJunkyardLocation" | "doctorBagQuestLocation" | "ghostLocation" | "guzzlrQuestLocation" | "nextSpookyravenElizabethRoom" | "nextSpookyravenStephenRoom" | "semirareLocation" | "sourceOracleTarget";
6
- export declare type StringProperty = "autoLogin" | "browserBookmarks" | "chatFontSize" | "combatHotkey0" | "combatHotkey1" | "combatHotkey2" | "combatHotkey3" | "combatHotkey4" | "combatHotkey5" | "combatHotkey6" | "combatHotkey7" | "combatHotkey8" | "combatHotkey9" | "commandLineNamespace" | "cookies.inventory" | "dailyDeedsOptions" | "defaultBorderColor" | "displayName" | "externalEditor" | "getBreakfast" | "headerStates" | "highlightList" | "http.proxyHost" | "http.proxyPassword" | "http.proxyPort" | "http.proxyUser" | "https.proxyHost" | "https.proxyPassword" | "https.proxyPort" | "https.proxyUser" | "initialDesktop" | "initialFrames" | "innerChatColor" | "innerTabColor" | "lastRelayUpdate" | "lastRssVersion" | "lastUserAgent" | "lastUsername" | "logPreferenceChangeFilter" | "loginScript" | "loginServerName" | "loginWindowLogo" | "logoutScript" | "outerChatColor" | "outerTabColor" | "previousNotifyList" | "previousUpdateVersion" | "saveState" | "saveStateActive" | "scriptList" | "swingLookAndFeel" | "useDecoratedTabs" | "userAgent" | "afterAdventureScript" | "autoOlfact" | "autoPutty" | "backupCameraMode" | "banishedMonsters" | "banishingShoutMonsters" | "barrelLayout" | "batmanStats" | "batmanZone" | "batmanUpgrades" | "battleAction" | "beachHeadsUnlocked" | "beforePVPScript" | "betweenBattleScript" | "boomBoxSong" | "breakfastAlways" | "breakfastHardcore" | "breakfastSoftcore" | "buffBotCasting" | "buyScript" | "cargoPocketsEmptied" | "cargoPocketScraps" | "chatbotScript" | "chatPlayerScript" | "choiceAdventureScript" | "chosenTrip" | "clanFortuneReply1" | "clanFortuneReply2" | "clanFortuneReply3" | "clanFortuneWord1" | "clanFortuneWord2" | "clanFortuneWord3" | "commerceGhostItem" | "counterScript" | "copperheadClubHazard" | "crimbotChassis" | "crimbotArm" | "crimbotPropulsion" | "csServicesPerformed" | "currentEasyBountyItem" | "currentHardBountyItem" | "currentHippyStore" | "currentJunkyardTool" | "currentMood" | "currentPVPSeason" | "currentPvpVictories" | "currentSpecialBountyItem" | "customCombatScript" | "cyrusAdjectives" | "defaultFlowerLossMessage" | "defaultFlowerWinMessage" | "demonName1" | "demonName2" | "demonName3" | "demonName4" | "demonName5" | "demonName6" | "demonName7" | "demonName8" | "demonName9" | "demonName10" | "demonName11" | "demonName12" | "demonName13" | "dinseyGatorStenchDamage" | "dinseyRollercoasterStats" | "dnaSyringe" | "doctorBagQuestItem" | "dolphinItem" | "edPiece" | "ensorcelee" | "EVEDirections" | "extraCosmeticModifiers" | "familiarScript" | "gameProBossSpecialPower" | "grimoireSkillsHardcore" | "grimoireSkillsSoftcore" | "grimstoneMaskPath" | "guzzlrQuestClient" | "guzzlrQuestBooze" | "guzzlrQuestTier" | "harvestGardenHardcore" | "harvestGardenSoftcore" | "hpAutoRecoveryItems" | "invalidBuffMessage" | "jickSwordModifier" | "kingLiberatedScript" | "lassoTraining" | "lastAdventure" | "lastBangPotion819" | "lastBangPotion820" | "lastBangPotion821" | "lastBangPotion822" | "lastBangPotion823" | "lastBangPotion824" | "lastBangPotion825" | "lastBangPotion826" | "lastBangPotion827" | "lastChanceBurn" | "lastChessboard" | "lastDwarfDiceRolls" | "lastDwarfDigitRunes" | "lastDwarfEquipmentRunes" | "lastDwarfFactoryItem118" | "lastDwarfFactoryItem119" | "lastDwarfFactoryItem120" | "lastDwarfFactoryItem360" | "lastDwarfFactoryItem361" | "lastDwarfFactoryItem362" | "lastDwarfFactoryItem363" | "lastDwarfFactoryItem364" | "lastDwarfFactoryItem365" | "lastDwarfFactoryItem910" | "lastDwarfFactoryItem3199" | "lastDwarfOfficeItem3208" | "lastDwarfOfficeItem3209" | "lastDwarfOfficeItem3210" | "lastDwarfOfficeItem3211" | "lastDwarfOfficeItem3212" | "lastDwarfOfficeItem3213" | "lastDwarfOfficeItem3214" | "lastDwarfOreRunes" | "lastDwarfHopper1" | "lastDwarfHopper2" | "lastDwarfHopper3" | "lastDwarfHopper4" | "lastEncounter" | "lastMacroError" | "lastMessageId" | "lastPaperStrip3144" | "lastPaperStrip4138" | "lastPaperStrip4139" | "lastPaperStrip4140" | "lastPaperStrip4141" | "lastPaperStrip4142" | "lastPaperStrip4143" | "lastPaperStrip4144" | "lastPirateEphemera" | "lastPorkoBoard" | "lastPorkoPayouts" | "lastPorkoExpected" | "lastSlimeVial3885" | "lastSlimeVial3886" | "lastSlimeVial3887" | "lastSlimeVial3888" | "lastSlimeVial3889" | "lastSlimeVial3890" | "lastSlimeVial3891" | "lastSlimeVial3892" | "lastSlimeVial3893" | "lastSlimeVial3894" | "lastSlimeVial3895" | "lastSlimeVial3896" | "latteModifier" | "latteUnlocks" | "libramSkillsHardcore" | "libramSkillsSoftcore" | "louvreOverride" | "lovePotion" | "lttQuestName" | "maximizerList" | "maximizerMRUList" | "mayoInMouth" | "mayoMinderSetting" | "merkinQuestPath" | "mineLayout1" | "mineLayout2" | "mineLayout3" | "mineLayout4" | "mineLayout5" | "mineLayout6" | "mpAutoRecoveryItems" | "muffinOnOrder" | "nextAdventure" | "nsChallenge2" | "nsChallenge3" | "nsChallenge4" | "nsChallenge5" | "nsTowerDoorKeysUsed" | "oceanAction" | "oceanDestination" | "pastaThrall1" | "pastaThrall2" | "pastaThrall3" | "pastaThrall4" | "pastaThrall5" | "pastaThrall6" | "pastaThrall7" | "pastaThrall8" | "peteMotorbikeTires" | "peteMotorbikeGasTank" | "peteMotorbikeHeadlight" | "peteMotorbikeCowling" | "peteMotorbikeMuffler" | "peteMotorbikeSeat" | "pieStuffing" | "plantingDate" | "plantingLength" | "plantingScript" | "plumberCostumeWorn" | "pokefamBoosts" | "postAscensionScript" | "preAscensionScript" | "retroCapeSuperhero" | "retroCapeWashingInstructions" | "questDoctorBag" | "questECoBucket" | "questESlAudit" | "questESlBacteria" | "questESlCheeseburger" | "questESlCocktail" | "questESlDebt" | "questESlFish" | "questESlMushStash" | "questESlSalt" | "questESlSprinkles" | "questESpEVE" | "questESpJunglePun" | "questESpGore" | "questESpClipper" | "questESpFakeMedium" | "questESpSerum" | "questESpSmokes" | "questESpOutOfOrder" | "questEStFishTrash" | "questEStGiveMeFuel" | "questEStNastyBears" | "questEStSocialJusticeI" | "questEStSocialJusticeII" | "questEStSuperLuber" | "questEStWorkWithFood" | "questEStZippityDooDah" | "questEUNewYou" | "questF01Primordial" | "questF02Hyboria" | "questF03Future" | "questF04Elves" | "questF05Clancy" | "questG01Meatcar" | "questG02Whitecastle" | "questG03Ego" | "questG04Nemesis" | "questG05Dark" | "questG06Delivery" | "questG07Myst" | "questG08Moxie" | "questG09Muscle" | "questGuzzlr" | "questI01Scapegoat" | "questI02Beat" | "questL02Larva" | "questL03Rat" | "questL04Bat" | "questL05Goblin" | "questL06Friar" | "questL07Cyrptic" | "questL08Trapper" | "questL09Topping" | "questL10Garbage" | "questL11MacGuffin" | "questL11Black" | "questL11Business" | "questL11Curses" | "questL11Desert" | "questL11Doctor" | "questL11Manor" | "questL11Palindome" | "questL11Pyramid" | "questL11Ron" | "questL11Shen" | "questL11Spare" | "questL11Worship" | "questL12War" | "questL12HippyFrat" | "questL13Final" | "questL13Warehouse" | "questLTTQuestByWire" | "questM01Untinker" | "questM02Artist" | "questM03Bugbear" | "questM05Toot" | "questM06Gourd" | "questM07Hammer" | "questM08Baker" | "questM09Rocks" | "questM10Azazel" | "questM11Postal" | "questM12Pirate" | "questM13Escape" | "questM14Bounty" | "questM15Lol" | "questM16Temple" | "questM17Babies" | "questM18Swamp" | "questM19Hippy" | "questM20Necklace" | "questM21Dance" | "questM22Shirt" | "questM23Meatsmith" | "questM24Doc" | "questM25Armorer" | "questM26Oracle" | "questPAGhost" | "questS01OldGuy" | "questS02Monkees" | "raveCombo1" | "raveCombo2" | "raveCombo3" | "raveCombo4" | "raveCombo5" | "raveCombo6" | "recoveryScript" | "redSnapperPhylum" | "relayCounters" | "royalty" | "scriptMRUList" | "seahorseName" | "shenQuestItem" | "shrubGarland" | "shrubGifts" | "shrubLights" | "shrubTopper" | "sideDefeated" | "sidequestArenaCompleted" | "sidequestFarmCompleted" | "sidequestJunkyardCompleted" | "sidequestLighthouseCompleted" | "sidequestNunsCompleted" | "sidequestOrchardCompleted" | "skateParkStatus" | "snowsuit" | "sourceTerminalChips" | "sourceTerminalEducate1" | "sourceTerminalEducate2" | "sourceTerminalEnquiry" | "sourceTerminalEducateKnown" | "sourceTerminalEnhanceKnown" | "sourceTerminalEnquiryKnown" | "sourceTerminalExtrudeKnown" | "spadingData" | "spadingScript" | "spelunkyStatus" | "spelunkyUpgrades" | "spookyravenRecipeUsed" | "stationaryButton1" | "stationaryButton2" | "stationaryButton3" | "stationaryButton4" | "stationaryButton5" | "streamCrossDefaultTarget" | "sweetSynthesisBlacklist" | "telescope1" | "telescope2" | "telescope3" | "telescope4" | "telescope5" | "testudinalTeachings" | "textColors" | "thanksMessage" | "tomeSkillsHardcore" | "tomeSkillsSoftcore" | "trackVoteMonster" | "trapperOre" | "umdLastObtained" | "violetFogLayout" | "volcanoMaze1" | "volcanoMaze2" | "volcanoMaze3" | "volcanoMaze4" | "volcanoMaze5" | "walfordBucketItem" | "warProgress" | "workteaClue" | "yourFavoriteBird" | "yourFavoriteBirdMods" | "youRobotCPUUpgrades" | "_beachHeadsUsed" | "_beachLayout" | "_beachMinutes" | "_birdOfTheDay" | "_birdOfTheDayMods" | "_bittycar" | "_campAwaySmileBuffSign" | "_cloudTalkMessage" | "_cloudTalkSmoker" | "_dailySpecial" | "_deckCardsSeen" | "_feastedFamiliars" | "_floristPlantsUsed" | "_frAreasUnlocked" | "_frHoursLeft" | "_frMonstersKilled" | "_horsery" | "_horseryCrazyMox" | "_horseryCrazyMus" | "_horseryCrazyMys" | "_horseryCrazyName" | "_horseryCurrentName" | "_horseryDarkName" | "_horseryNormalName" | "_horseryPaleName" | "_jickJarAvailable" | "_jiggleCheesedMonsters" | "_lastCombatStarted" | "_LastPirateRealmIsland" | "_mummeryMods" | "_mummeryUses" | "_newYouQuestSkill" | "_noHatModifier" | "_pantogramModifier" | "_questESp" | "_questPartyFair" | "_questPartyFairProgress" | "_questPartyFairQuest" | "_roboDrinks" | "_spacegateAnimalLife" | "_spacegateCoordinates" | "_spacegateHazards" | "_spacegateIntelligentLife" | "_spacegatePlanetName" | "_spacegatePlantLife" | "_stolenAccordions" | "_tempRelayCounters" | "_timeSpinnerFoodAvailable" | "_unknownEasyBountyItem" | "_unknownHardBountyItem" | "_unknownSpecialBountyItem" | "_untakenEasyBountyItem" | "_untakenHardBountyItem" | "_untakenSpecialBountyItem" | "_userMods" | "_villainLairColor" | "_villainLairKey" | "_voteLocal1" | "_voteLocal2" | "_voteLocal3" | "_voteLocal4" | "_voteMonster1" | "_voteMonster2" | "_voteModifier" | "_VYKEACompanionType" | "_VYKEACompanionRune" | "_VYKEACompanionName";
6
+ export declare type StringProperty = "autoLogin" | "browserBookmarks" | "chatFontSize" | "combatHotkey0" | "combatHotkey1" | "combatHotkey2" | "combatHotkey3" | "combatHotkey4" | "combatHotkey5" | "combatHotkey6" | "combatHotkey7" | "combatHotkey8" | "combatHotkey9" | "commandLineNamespace" | "cookies.inventory" | "dailyDeedsOptions" | "defaultBorderColor" | "displayName" | "externalEditor" | "getBreakfast" | "headerStates" | "highlightList" | "http.proxyHost" | "http.proxyPassword" | "http.proxyPort" | "http.proxyUser" | "https.proxyHost" | "https.proxyPassword" | "https.proxyPort" | "https.proxyUser" | "initialDesktop" | "initialFrames" | "innerChatColor" | "innerTabColor" | "lastRelayUpdate" | "lastRssVersion" | "lastUserAgent" | "lastUsername" | "logPreferenceChangeFilter" | "loginScript" | "loginServerName" | "loginWindowLogo" | "logoutScript" | "outerChatColor" | "outerTabColor" | "previousNotifyList" | "previousUpdateVersion" | "saveState" | "saveStateActive" | "scriptList" | "swingLookAndFeel" | "useDecoratedTabs" | "userAgent" | "afterAdventureScript" | "autoOlfact" | "autoPutty" | "backupCameraMode" | "banishedMonsters" | "banishingShoutMonsters" | "barrelLayout" | "batmanStats" | "batmanZone" | "batmanUpgrades" | "battleAction" | "beachHeadsUnlocked" | "beforePVPScript" | "betweenBattleScript" | "boomBoxSong" | "breakfastAlways" | "breakfastHardcore" | "breakfastSoftcore" | "buffBotCasting" | "buyScript" | "cargoPocketsEmptied" | "cargoPocketScraps" | "chatbotScript" | "chatPlayerScript" | "choiceAdventureScript" | "chosenTrip" | "clanFortuneReply1" | "clanFortuneReply2" | "clanFortuneReply3" | "clanFortuneWord1" | "clanFortuneWord2" | "clanFortuneWord3" | "commerceGhostItem" | "counterScript" | "copperheadClubHazard" | "crimbotChassis" | "crimbotArm" | "crimbotPropulsion" | "csServicesPerformed" | "currentEasyBountyItem" | "currentHardBountyItem" | "currentHippyStore" | "currentJunkyardTool" | "currentMood" | "currentPVPSeason" | "currentPvpVictories" | "currentSpecialBountyItem" | "customCombatScript" | "cyrusAdjectives" | "defaultFlowerLossMessage" | "defaultFlowerWinMessage" | "demonName1" | "demonName2" | "demonName3" | "demonName4" | "demonName5" | "demonName6" | "demonName7" | "demonName8" | "demonName9" | "demonName10" | "demonName11" | "demonName12" | "demonName13" | "dinseyGatorStenchDamage" | "dinseyRollercoasterStats" | "doctorBagQuestItem" | "dolphinItem" | "edPiece" | "ensorcelee" | "EVEDirections" | "extraCosmeticModifiers" | "familiarScript" | "gameProBossSpecialPower" | "grimoireSkillsHardcore" | "grimoireSkillsSoftcore" | "grimstoneMaskPath" | "guzzlrQuestClient" | "guzzlrQuestBooze" | "guzzlrQuestTier" | "harvestGardenHardcore" | "harvestGardenSoftcore" | "hpAutoRecoveryItems" | "invalidBuffMessage" | "jickSwordModifier" | "kingLiberatedScript" | "lassoTraining" | "lastAdventure" | "lastBangPotion819" | "lastBangPotion820" | "lastBangPotion821" | "lastBangPotion822" | "lastBangPotion823" | "lastBangPotion824" | "lastBangPotion825" | "lastBangPotion826" | "lastBangPotion827" | "lastChanceBurn" | "lastChessboard" | "lastDwarfDiceRolls" | "lastDwarfDigitRunes" | "lastDwarfEquipmentRunes" | "lastDwarfFactoryItem118" | "lastDwarfFactoryItem119" | "lastDwarfFactoryItem120" | "lastDwarfFactoryItem360" | "lastDwarfFactoryItem361" | "lastDwarfFactoryItem362" | "lastDwarfFactoryItem363" | "lastDwarfFactoryItem364" | "lastDwarfFactoryItem365" | "lastDwarfFactoryItem910" | "lastDwarfFactoryItem3199" | "lastDwarfOfficeItem3208" | "lastDwarfOfficeItem3209" | "lastDwarfOfficeItem3210" | "lastDwarfOfficeItem3211" | "lastDwarfOfficeItem3212" | "lastDwarfOfficeItem3213" | "lastDwarfOfficeItem3214" | "lastDwarfOreRunes" | "lastDwarfHopper1" | "lastDwarfHopper2" | "lastDwarfHopper3" | "lastDwarfHopper4" | "lastEncounter" | "lastMacroError" | "lastMessageId" | "lastPaperStrip3144" | "lastPaperStrip4138" | "lastPaperStrip4139" | "lastPaperStrip4140" | "lastPaperStrip4141" | "lastPaperStrip4142" | "lastPaperStrip4143" | "lastPaperStrip4144" | "lastPirateEphemera" | "lastPorkoBoard" | "lastPorkoPayouts" | "lastPorkoExpected" | "lastSlimeVial3885" | "lastSlimeVial3886" | "lastSlimeVial3887" | "lastSlimeVial3888" | "lastSlimeVial3889" | "lastSlimeVial3890" | "lastSlimeVial3891" | "lastSlimeVial3892" | "lastSlimeVial3893" | "lastSlimeVial3894" | "lastSlimeVial3895" | "lastSlimeVial3896" | "latteModifier" | "latteUnlocks" | "libramSkillsHardcore" | "libramSkillsSoftcore" | "louvreOverride" | "lovePotion" | "lttQuestName" | "maximizerList" | "maximizerMRUList" | "mayoInMouth" | "mayoMinderSetting" | "merkinQuestPath" | "mineLayout1" | "mineLayout2" | "mineLayout3" | "mineLayout4" | "mineLayout5" | "mineLayout6" | "mpAutoRecoveryItems" | "muffinOnOrder" | "nextAdventure" | "nsChallenge2" | "nsChallenge3" | "nsChallenge4" | "nsChallenge5" | "nsTowerDoorKeysUsed" | "oceanAction" | "oceanDestination" | "pastaThrall1" | "pastaThrall2" | "pastaThrall3" | "pastaThrall4" | "pastaThrall5" | "pastaThrall6" | "pastaThrall7" | "pastaThrall8" | "peteMotorbikeTires" | "peteMotorbikeGasTank" | "peteMotorbikeHeadlight" | "peteMotorbikeCowling" | "peteMotorbikeMuffler" | "peteMotorbikeSeat" | "pieStuffing" | "plantingDate" | "plantingLength" | "plantingScript" | "plumberCostumeWorn" | "pokefamBoosts" | "postAscensionScript" | "preAscensionScript" | "retroCapeSuperhero" | "retroCapeWashingInstructions" | "questDoctorBag" | "questECoBucket" | "questESlAudit" | "questESlBacteria" | "questESlCheeseburger" | "questESlCocktail" | "questESlDebt" | "questESlFish" | "questESlMushStash" | "questESlSalt" | "questESlSprinkles" | "questESpEVE" | "questESpJunglePun" | "questESpGore" | "questESpClipper" | "questESpFakeMedium" | "questESpSerum" | "questESpSmokes" | "questESpOutOfOrder" | "questEStFishTrash" | "questEStGiveMeFuel" | "questEStNastyBears" | "questEStSocialJusticeI" | "questEStSocialJusticeII" | "questEStSuperLuber" | "questEStWorkWithFood" | "questEStZippityDooDah" | "questEUNewYou" | "questF01Primordial" | "questF02Hyboria" | "questF03Future" | "questF04Elves" | "questF05Clancy" | "questG01Meatcar" | "questG02Whitecastle" | "questG03Ego" | "questG04Nemesis" | "questG05Dark" | "questG06Delivery" | "questG07Myst" | "questG08Moxie" | "questG09Muscle" | "questGuzzlr" | "questI01Scapegoat" | "questI02Beat" | "questL02Larva" | "questL03Rat" | "questL04Bat" | "questL05Goblin" | "questL06Friar" | "questL07Cyrptic" | "questL08Trapper" | "questL09Topping" | "questL10Garbage" | "questL11MacGuffin" | "questL11Black" | "questL11Business" | "questL11Curses" | "questL11Desert" | "questL11Doctor" | "questL11Manor" | "questL11Palindome" | "questL11Pyramid" | "questL11Ron" | "questL11Shen" | "questL11Spare" | "questL11Worship" | "questL12War" | "questL12HippyFrat" | "questL13Final" | "questL13Warehouse" | "questLTTQuestByWire" | "questM01Untinker" | "questM02Artist" | "questM03Bugbear" | "questM05Toot" | "questM06Gourd" | "questM07Hammer" | "questM08Baker" | "questM09Rocks" | "questM10Azazel" | "questM11Postal" | "questM12Pirate" | "questM13Escape" | "questM14Bounty" | "questM15Lol" | "questM16Temple" | "questM17Babies" | "questM18Swamp" | "questM19Hippy" | "questM20Necklace" | "questM21Dance" | "questM22Shirt" | "questM23Meatsmith" | "questM24Doc" | "questM25Armorer" | "questM26Oracle" | "questPAGhost" | "questS01OldGuy" | "questS02Monkees" | "raveCombo1" | "raveCombo2" | "raveCombo3" | "raveCombo4" | "raveCombo5" | "raveCombo6" | "recoveryScript" | "relayCounters" | "royalty" | "scriptMRUList" | "seahorseName" | "shenQuestItem" | "shrubGarland" | "shrubGifts" | "shrubLights" | "shrubTopper" | "sideDefeated" | "sidequestArenaCompleted" | "sidequestFarmCompleted" | "sidequestJunkyardCompleted" | "sidequestLighthouseCompleted" | "sidequestNunsCompleted" | "sidequestOrchardCompleted" | "skateParkStatus" | "snowsuit" | "sourceTerminalChips" | "sourceTerminalEducate1" | "sourceTerminalEducate2" | "sourceTerminalEnquiry" | "sourceTerminalEducateKnown" | "sourceTerminalEnhanceKnown" | "sourceTerminalEnquiryKnown" | "sourceTerminalExtrudeKnown" | "spadingData" | "spadingScript" | "spelunkyStatus" | "spelunkyUpgrades" | "spookyravenRecipeUsed" | "stationaryButton1" | "stationaryButton2" | "stationaryButton3" | "stationaryButton4" | "stationaryButton5" | "streamCrossDefaultTarget" | "sweetSynthesisBlacklist" | "telescope1" | "telescope2" | "telescope3" | "telescope4" | "telescope5" | "testudinalTeachings" | "textColors" | "thanksMessage" | "tomeSkillsHardcore" | "tomeSkillsSoftcore" | "trackVoteMonster" | "trapperOre" | "umdLastObtained" | "violetFogLayout" | "volcanoMaze1" | "volcanoMaze2" | "volcanoMaze3" | "volcanoMaze4" | "volcanoMaze5" | "walfordBucketItem" | "warProgress" | "workteaClue" | "yourFavoriteBird" | "yourFavoriteBirdMods" | "youRobotCPUUpgrades" | "_beachHeadsUsed" | "_beachLayout" | "_beachMinutes" | "_birdOfTheDay" | "_birdOfTheDayMods" | "_bittycar" | "_campAwaySmileBuffSign" | "_cloudTalkMessage" | "_cloudTalkSmoker" | "_dailySpecial" | "_deckCardsSeen" | "_feastedFamiliars" | "_floristPlantsUsed" | "_frAreasUnlocked" | "_frHoursLeft" | "_frMonstersKilled" | "_horsery" | "_horseryCrazyMox" | "_horseryCrazyMus" | "_horseryCrazyMys" | "_horseryCrazyName" | "_horseryCurrentName" | "_horseryDarkName" | "_horseryNormalName" | "_horseryPaleName" | "_jickJarAvailable" | "_jiggleCheesedMonsters" | "_lastCombatStarted" | "_LastPirateRealmIsland" | "_mummeryMods" | "_mummeryUses" | "_newYouQuestSkill" | "_noHatModifier" | "_pantogramModifier" | "_questESp" | "_questPartyFair" | "_questPartyFairProgress" | "_questPartyFairQuest" | "_roboDrinks" | "_spacegateAnimalLife" | "_spacegateCoordinates" | "_spacegateHazards" | "_spacegateIntelligentLife" | "_spacegatePlanetName" | "_spacegatePlantLife" | "_stolenAccordions" | "_tempRelayCounters" | "_timeSpinnerFoodAvailable" | "_unknownEasyBountyItem" | "_unknownHardBountyItem" | "_unknownSpecialBountyItem" | "_untakenEasyBountyItem" | "_untakenHardBountyItem" | "_untakenSpecialBountyItem" | "_userMods" | "_villainLairColor" | "_villainLairKey" | "_voteLocal1" | "_voteLocal2" | "_voteLocal3" | "_voteLocal4" | "_voteMonster1" | "_voteMonster2" | "_voteModifier" | "_VYKEACompanionType" | "_VYKEACompanionRune" | "_VYKEACompanionName";
7
7
  export declare type NumericOrStringProperty = "statusEngineering" | "statusGalley" | "statusMedbay" | "statusMorgue" | "statusNavigation" | "statusScienceLab" | "statusSonar" | "statusSpecialOps" | "statusWasteProcessing" | "choiceAdventure2" | "choiceAdventure3" | "choiceAdventure4" | "choiceAdventure5" | "choiceAdventure6" | "choiceAdventure7" | "choiceAdventure8" | "choiceAdventure9" | "choiceAdventure10" | "choiceAdventure11" | "choiceAdventure12" | "choiceAdventure14" | "choiceAdventure15" | "choiceAdventure16" | "choiceAdventure17" | "choiceAdventure18" | "choiceAdventure19" | "choiceAdventure20" | "choiceAdventure21" | "choiceAdventure22" | "choiceAdventure23" | "choiceAdventure24" | "choiceAdventure25" | "choiceAdventure26" | "choiceAdventure27" | "choiceAdventure28" | "choiceAdventure29" | "choiceAdventure40" | "choiceAdventure41" | "choiceAdventure42" | "choiceAdventure45" | "choiceAdventure46" | "choiceAdventure47" | "choiceAdventure71" | "choiceAdventure72" | "choiceAdventure73" | "choiceAdventure74" | "choiceAdventure75" | "choiceAdventure76" | "choiceAdventure77" | "choiceAdventure86" | "choiceAdventure87" | "choiceAdventure88" | "choiceAdventure89" | "choiceAdventure90" | "choiceAdventure91" | "choiceAdventure105" | "choiceAdventure106" | "choiceAdventure107" | "choiceAdventure108" | "choiceAdventure109" | "choiceAdventure110" | "choiceAdventure111" | "choiceAdventure112" | "choiceAdventure113" | "choiceAdventure114" | "choiceAdventure115" | "choiceAdventure116" | "choiceAdventure117" | "choiceAdventure118" | "choiceAdventure120" | "choiceAdventure123" | "choiceAdventure125" | "choiceAdventure126" | "choiceAdventure127" | "choiceAdventure129" | "choiceAdventure131" | "choiceAdventure132" | "choiceAdventure135" | "choiceAdventure136" | "choiceAdventure137" | "choiceAdventure138" | "choiceAdventure139" | "choiceAdventure140" | "choiceAdventure141" | "choiceAdventure142" | "choiceAdventure143" | "choiceAdventure144" | "choiceAdventure145" | "choiceAdventure146" | "choiceAdventure147" | "choiceAdventure148" | "choiceAdventure149" | "choiceAdventure151" | "choiceAdventure152" | "choiceAdventure153" | "choiceAdventure154" | "choiceAdventure155" | "choiceAdventure156" | "choiceAdventure157" | "choiceAdventure158" | "choiceAdventure159" | "choiceAdventure160" | "choiceAdventure161" | "choiceAdventure162" | "choiceAdventure163" | "choiceAdventure164" | "choiceAdventure165" | "choiceAdventure166" | "choiceAdventure167" | "choiceAdventure168" | "choiceAdventure169" | "choiceAdventure170" | "choiceAdventure171" | "choiceAdventure172" | "choiceAdventure177" | "choiceAdventure178" | "choiceAdventure180" | "choiceAdventure181" | "choiceAdventure182" | "choiceAdventure184" | "choiceAdventure185" | "choiceAdventure186" | "choiceAdventure187" | "choiceAdventure188" | "choiceAdventure189" | "choiceAdventure191" | "choiceAdventure197" | "choiceAdventure198" | "choiceAdventure199" | "choiceAdventure200" | "choiceAdventure201" | "choiceAdventure202" | "choiceAdventure203" | "choiceAdventure204" | "choiceAdventure205" | "choiceAdventure206" | "choiceAdventure207" | "choiceAdventure208" | "choiceAdventure211" | "choiceAdventure212" | "choiceAdventure213" | "choiceAdventure214" | "choiceAdventure215" | "choiceAdventure216" | "choiceAdventure217" | "choiceAdventure218" | "choiceAdventure219" | "choiceAdventure220" | "choiceAdventure221" | "choiceAdventure222" | "choiceAdventure223" | "choiceAdventure224" | "choiceAdventure225" | "choiceAdventure230" | "choiceAdventure272" | "choiceAdventure273" | "choiceAdventure276" | "choiceAdventure277" | "choiceAdventure278" | "choiceAdventure279" | "choiceAdventure280" | "choiceAdventure281" | "choiceAdventure282" | "choiceAdventure283" | "choiceAdventure284" | "choiceAdventure285" | "choiceAdventure286" | "choiceAdventure287" | "choiceAdventure288" | "choiceAdventure289" | "choiceAdventure290" | "choiceAdventure291" | "choiceAdventure292" | "choiceAdventure293" | "choiceAdventure294" | "choiceAdventure295" | "choiceAdventure296" | "choiceAdventure297" | "choiceAdventure298" | "choiceAdventure299" | "choiceAdventure302" | "choiceAdventure303" | "choiceAdventure304" | "choiceAdventure305" | "choiceAdventure306" | "choiceAdventure307" | "choiceAdventure308" | "choiceAdventure309" | "choiceAdventure310" | "choiceAdventure311" | "choiceAdventure317" | "choiceAdventure318" | "choiceAdventure319" | "choiceAdventure320" | "choiceAdventure321" | "choiceAdventure322" | "choiceAdventure326" | "choiceAdventure327" | "choiceAdventure328" | "choiceAdventure329" | "choiceAdventure330" | "choiceAdventure331" | "choiceAdventure332" | "choiceAdventure333" | "choiceAdventure334" | "choiceAdventure335" | "choiceAdventure336" | "choiceAdventure337" | "choiceAdventure338" | "choiceAdventure339" | "choiceAdventure340" | "choiceAdventure341" | "choiceAdventure342" | "choiceAdventure343" | "choiceAdventure344" | "choiceAdventure345" | "choiceAdventure346" | "choiceAdventure347" | "choiceAdventure348" | "choiceAdventure349" | "choiceAdventure350" | "choiceAdventure351" | "choiceAdventure352" | "choiceAdventure353" | "choiceAdventure354" | "choiceAdventure355" | "choiceAdventure356" | "choiceAdventure357" | "choiceAdventure358" | "choiceAdventure360" | "choiceAdventure361" | "choiceAdventure362" | "choiceAdventure363" | "choiceAdventure364" | "choiceAdventure365" | "choiceAdventure366" | "choiceAdventure367" | "choiceAdventure372" | "choiceAdventure376" | "choiceAdventure387" | "choiceAdventure388" | "choiceAdventure389" | "choiceAdventure390" | "choiceAdventure391" | "choiceAdventure392" | "choiceAdventure393" | "choiceAdventure395" | "choiceAdventure396" | "choiceAdventure397" | "choiceAdventure398" | "choiceAdventure399" | "choiceAdventure400" | "choiceAdventure401" | "choiceAdventure402" | "choiceAdventure403" | "choiceAdventure423" | "choiceAdventure424" | "choiceAdventure425" | "choiceAdventure426" | "choiceAdventure427" | "choiceAdventure428" | "choiceAdventure429" | "choiceAdventure430" | "choiceAdventure431" | "choiceAdventure432" | "choiceAdventure433" | "choiceAdventure435" | "choiceAdventure438" | "choiceAdventure439" | "choiceAdventure442" | "choiceAdventure444" | "choiceAdventure445" | "choiceAdventure446" | "choiceAdventure447" | "choiceAdventure448" | "choiceAdventure449" | "choiceAdventure451" | "choiceAdventure452" | "choiceAdventure453" | "choiceAdventure454" | "choiceAdventure455" | "choiceAdventure456" | "choiceAdventure457" | "choiceAdventure458" | "choiceAdventure460" | "choiceAdventure461" | "choiceAdventure462" | "choiceAdventure463" | "choiceAdventure464" | "choiceAdventure465" | "choiceAdventure467" | "choiceAdventure468" | "choiceAdventure469" | "choiceAdventure470" | "choiceAdventure471" | "choiceAdventure472" | "choiceAdventure473" | "choiceAdventure474" | "choiceAdventure475" | "choiceAdventure477" | "choiceAdventure478" | "choiceAdventure480" | "choiceAdventure483" | "choiceAdventure484" | "choiceAdventure485" | "choiceAdventure486" | "choiceAdventure488" | "choiceAdventure489" | "choiceAdventure490" | "choiceAdventure491" | "choiceAdventure496" | "choiceAdventure497" | "choiceAdventure502" | "choiceAdventure503" | "choiceAdventure504" | "choiceAdventure505" | "choiceAdventure506" | "choiceAdventure507" | "choiceAdventure509" | "choiceAdventure510" | "choiceAdventure511" | "choiceAdventure512" | "choiceAdventure513" | "choiceAdventure514" | "choiceAdventure515" | "choiceAdventure517" | "choiceAdventure518" | "choiceAdventure519" | "choiceAdventure521" | "choiceAdventure522" | "choiceAdventure523" | "choiceAdventure527" | "choiceAdventure528" | "choiceAdventure529" | "choiceAdventure530" | "choiceAdventure531" | "choiceAdventure532" | "choiceAdventure533" | "choiceAdventure534" | "choiceAdventure535" | "choiceAdventure536" | "choiceAdventure538" | "choiceAdventure539" | "choiceAdventure542" | "choiceAdventure543" | "choiceAdventure544" | "choiceAdventure546" | "choiceAdventure548" | "choiceAdventure549" | "choiceAdventure550" | "choiceAdventure551" | "choiceAdventure552" | "choiceAdventure553" | "choiceAdventure554" | "choiceAdventure556" | "choiceAdventure557" | "choiceAdventure558" | "choiceAdventure559" | "choiceAdventure560" | "choiceAdventure561" | "choiceAdventure562" | "choiceAdventure563" | "choiceAdventure564" | "choiceAdventure565" | "choiceAdventure566" | "choiceAdventure567" | "choiceAdventure568" | "choiceAdventure569" | "choiceAdventure571" | "choiceAdventure572" | "choiceAdventure573" | "choiceAdventure574" | "choiceAdventure575" | "choiceAdventure576" | "choiceAdventure577" | "choiceAdventure578" | "choiceAdventure579" | "choiceAdventure581" | "choiceAdventure582" | "choiceAdventure583" | "choiceAdventure584" | "choiceAdventure594" | "choiceAdventure595" | "choiceAdventure596" | "choiceAdventure597" | "choiceAdventure598" | "choiceAdventure599" | "choiceAdventure600" | "choiceAdventure603" | "choiceAdventure604" | "choiceAdventure616" | "choiceAdventure634" | "choiceAdventure640" | "choiceAdventure654" | "choiceAdventure655" | "choiceAdventure656" | "choiceAdventure657" | "choiceAdventure658" | "choiceAdventure664" | "choiceAdventure669" | "choiceAdventure670" | "choiceAdventure671" | "choiceAdventure672" | "choiceAdventure673" | "choiceAdventure674" | "choiceAdventure675" | "choiceAdventure676" | "choiceAdventure677" | "choiceAdventure678" | "choiceAdventure679" | "choiceAdventure681" | "choiceAdventure683" | "choiceAdventure684" | "choiceAdventure685" | "choiceAdventure686" | "choiceAdventure687" | "choiceAdventure688" | "choiceAdventure689" | "choiceAdventure690" | "choiceAdventure691" | "choiceAdventure692" | "choiceAdventure693" | "choiceAdventure694" | "choiceAdventure695" | "choiceAdventure696" | "choiceAdventure697" | "choiceAdventure698" | "choiceAdventure700" | "choiceAdventure701" | "choiceAdventure705" | "choiceAdventure706" | "choiceAdventure707" | "choiceAdventure708" | "choiceAdventure709" | "choiceAdventure710" | "choiceAdventure711" | "choiceAdventure712" | "choiceAdventure713" | "choiceAdventure714" | "choiceAdventure715" | "choiceAdventure716" | "choiceAdventure717" | "choiceAdventure721" | "choiceAdventure725" | "choiceAdventure729" | "choiceAdventure733" | "choiceAdventure737" | "choiceAdventure741" | "choiceAdventure745" | "choiceAdventure749" | "choiceAdventure753" | "choiceAdventure771" | "choiceAdventure778" | "choiceAdventure780" | "choiceAdventure781" | "choiceAdventure783" | "choiceAdventure784" | "choiceAdventure785" | "choiceAdventure786" | "choiceAdventure787" | "choiceAdventure788" | "choiceAdventure789" | "choiceAdventure791" | "choiceAdventure793" | "choiceAdventure794" | "choiceAdventure795" | "choiceAdventure796" | "choiceAdventure797" | "choiceAdventure805" | "choiceAdventure808" | "choiceAdventure809" | "choiceAdventure813" | "choiceAdventure815" | "choiceAdventure830" | "choiceAdventure832" | "choiceAdventure833" | "choiceAdventure834" | "choiceAdventure835" | "choiceAdventure837" | "choiceAdventure838" | "choiceAdventure839" | "choiceAdventure840" | "choiceAdventure841" | "choiceAdventure842" | "choiceAdventure851" | "choiceAdventure852" | "choiceAdventure853" | "choiceAdventure854" | "choiceAdventure855" | "choiceAdventure856" | "choiceAdventure857" | "choiceAdventure858" | "choiceAdventure866" | "choiceAdventure873" | "choiceAdventure875" | "choiceAdventure876" | "choiceAdventure877" | "choiceAdventure878" | "choiceAdventure879" | "choiceAdventure880" | "choiceAdventure881" | "choiceAdventure882" | "choiceAdventure888" | "choiceAdventure889" | "choiceAdventure918" | "choiceAdventure919" | "choiceAdventure920" | "choiceAdventure921" | "choiceAdventure923" | "choiceAdventure924" | "choiceAdventure925" | "choiceAdventure926" | "choiceAdventure927" | "choiceAdventure928" | "choiceAdventure929" | "choiceAdventure930" | "choiceAdventure931" | "choiceAdventure932" | "choiceAdventure940" | "choiceAdventure941" | "choiceAdventure942" | "choiceAdventure943" | "choiceAdventure944" | "choiceAdventure945" | "choiceAdventure946" | "choiceAdventure950" | "choiceAdventure955" | "choiceAdventure957" | "choiceAdventure958" | "choiceAdventure959" | "choiceAdventure960" | "choiceAdventure961" | "choiceAdventure962" | "choiceAdventure963" | "choiceAdventure964" | "choiceAdventure965" | "choiceAdventure966" | "choiceAdventure970" | "choiceAdventure973" | "choiceAdventure974" | "choiceAdventure975" | "choiceAdventure976" | "choiceAdventure977" | "choiceAdventure979" | "choiceAdventure980" | "choiceAdventure981" | "choiceAdventure982" | "choiceAdventure983" | "choiceAdventure988" | "choiceAdventure989" | "choiceAdventure993" | "choiceAdventure998" | "choiceAdventure1000" | "choiceAdventure1003" | "choiceAdventure1005" | "choiceAdventure1006" | "choiceAdventure1007" | "choiceAdventure1008" | "choiceAdventure1009" | "choiceAdventure1010" | "choiceAdventure1011" | "choiceAdventure1012" | "choiceAdventure1013" | "choiceAdventure1015" | "choiceAdventure1016" | "choiceAdventure1017" | "choiceAdventure1018" | "choiceAdventure1019" | "choiceAdventure1020" | "choiceAdventure1021" | "choiceAdventure1022" | "choiceAdventure1023" | "choiceAdventure1026" | "choiceAdventure1027" | "choiceAdventure1028" | "choiceAdventure1029" | "choiceAdventure1030" | "choiceAdventure1031" | "choiceAdventure1032" | "choiceAdventure1033" | "choiceAdventure1034" | "choiceAdventure1035" | "choiceAdventure1036" | "choiceAdventure1037" | "choiceAdventure1038" | "choiceAdventure1039" | "choiceAdventure1040" | "choiceAdventure1041" | "choiceAdventure1042" | "choiceAdventure1044" | "choiceAdventure1045" | "choiceAdventure1046" | "choiceAdventure1048" | "choiceAdventure1051" | "choiceAdventure1052" | "choiceAdventure1053" | "choiceAdventure1054" | "choiceAdventure1055" | "choiceAdventure1056" | "choiceAdventure1057" | "choiceAdventure1059" | "choiceAdventure1060" | "choiceAdventure1061" | "choiceAdventure1062" | "choiceAdventure1065" | "choiceAdventure1067" | "choiceAdventure1068" | "choiceAdventure1069" | "choiceAdventure1070" | "choiceAdventure1071" | "choiceAdventure1073" | "choiceAdventure1077" | "choiceAdventure1080" | "choiceAdventure1081" | "choiceAdventure1082" | "choiceAdventure1083" | "choiceAdventure1084" | "choiceAdventure1085" | "choiceAdventure1091" | "choiceAdventure1094" | "choiceAdventure1095" | "choiceAdventure1096" | "choiceAdventure1097" | "choiceAdventure1102" | "choiceAdventure1106" | "choiceAdventure1107" | "choiceAdventure1108" | "choiceAdventure1110" | "choiceAdventure1114" | "choiceAdventure1115" | "choiceAdventure1116" | "choiceAdventure1118" | "choiceAdventure1119" | "choiceAdventure1120" | "choiceAdventure1121" | "choiceAdventure1122" | "choiceAdventure1123" | "choiceAdventure1171" | "choiceAdventure1172" | "choiceAdventure1173" | "choiceAdventure1174" | "choiceAdventure1175" | "choiceAdventure1193" | "choiceAdventure1195" | "choiceAdventure1196" | "choiceAdventure1197" | "choiceAdventure1198" | "choiceAdventure1199" | "choiceAdventure1202" | "choiceAdventure1203" | "choiceAdventure1204" | "choiceAdventure1205" | "choiceAdventure1206" | "choiceAdventure1207" | "choiceAdventure1208" | "choiceAdventure1209" | "choiceAdventure1210" | "choiceAdventure1211" | "choiceAdventure1212" | "choiceAdventure1213" | "choiceAdventure1214" | "choiceAdventure1215" | "choiceAdventure1219" | "choiceAdventure1222" | "choiceAdventure1223" | "choiceAdventure1224" | "choiceAdventure1225" | "choiceAdventure1226" | "choiceAdventure1227" | "choiceAdventure1228" | "choiceAdventure1229" | "choiceAdventure1236" | "choiceAdventure1237" | "choiceAdventure1238" | "choiceAdventure1239" | "choiceAdventure1240" | "choiceAdventure1241" | "choiceAdventure1242" | "choiceAdventure1243" | "choiceAdventure1244" | "choiceAdventure1245" | "choiceAdventure1246" | "choiceAdventure1247" | "choiceAdventure1248" | "choiceAdventure1249" | "choiceAdventure1250" | "choiceAdventure1251" | "choiceAdventure1252" | "choiceAdventure1253" | "choiceAdventure1254" | "choiceAdventure1255" | "choiceAdventure1256" | "choiceAdventure1266" | "choiceAdventure1280" | "choiceAdventure1281" | "choiceAdventure1282" | "choiceAdventure1283" | "choiceAdventure1284" | "choiceAdventure1285" | "choiceAdventure1286" | "choiceAdventure1287" | "choiceAdventure1288" | "choiceAdventure1289" | "choiceAdventure1290" | "choiceAdventure1291" | "choiceAdventure1292" | "choiceAdventure1293" | "choiceAdventure1294" | "choiceAdventure1295" | "choiceAdventure1296" | "choiceAdventure1297" | "choiceAdventure1298" | "choiceAdventure1299" | "choiceAdventure1300" | "choiceAdventure1301" | "choiceAdventure1302" | "choiceAdventure1303" | "choiceAdventure1304" | "choiceAdventure1305" | "choiceAdventure1307" | "choiceAdventure1310" | "choiceAdventure1312" | "choiceAdventure1313" | "choiceAdventure1314" | "choiceAdventure1315" | "choiceAdventure1316" | "choiceAdventure1317" | "choiceAdventure1318" | "choiceAdventure1319" | "choiceAdventure1321" | "choiceAdventure1322" | "choiceAdventure1323" | "choiceAdventure1324" | "choiceAdventure1325" | "choiceAdventure1326" | "choiceAdventure1327" | "choiceAdventure1328" | "choiceAdventure1332" | "choiceAdventure1333" | "choiceAdventure1335" | "choiceAdventure1340" | "choiceAdventure1341" | "choiceAdventure1345" | "choiceAdventure1389" | "choiceAdventure1392" | "choiceAdventure1399" | "choiceAdventure1405" | "choiceAdventure1411" | "choiceAdventure1415";
8
8
  export declare type FamiliarProperty = "commaFamiliar" | "nextQuantumFamiliar" | "preBlackbirdFamiliar";
9
9
  export declare type StatProperty = "nsChallenge1" | "snojoSetting";
10
+ export declare type PhylumProperty = "dnaSyringe" | "redSnapperPhylum";
@@ -1,4 +1,4 @@
1
- import { BooleanProperty, FamiliarProperty, LocationProperty, MonsterProperty, NumericOrStringProperty, NumericProperty, StatProperty, StringProperty } from "./propertyTypes";
1
+ import { BooleanProperty, FamiliarProperty, LocationProperty, MonsterProperty, NumericOrStringProperty, NumericProperty, PhylumProperty, StatProperty, StringProperty } from "./propertyTypes";
2
2
  export declare function isNumericProperty(property: string, value: string): property is NumericProperty;
3
3
  export declare function isNumericOrStringProperty(property: string): property is NumericOrStringProperty;
4
4
  export declare function isBooleanProperty(property: string, value: string): property is BooleanProperty;
@@ -6,5 +6,6 @@ export declare function isLocationProperty(property: string): property is Locati
6
6
  export declare function isMonsterProperty(property: string): property is MonsterProperty;
7
7
  export declare function isFamiliarProperty(property: string): property is FamiliarProperty;
8
8
  export declare function isStatProperty(property: string): property is StatProperty;
9
- export declare type KnownProperty = NumericProperty | BooleanProperty | MonsterProperty | LocationProperty | FamiliarProperty | StatProperty | StringProperty | NumericOrStringProperty;
10
- export declare type PropertyValue<Property, Default = any> = Property extends NumericProperty ? number : Property extends BooleanProperty ? boolean : Property extends MonsterProperty ? Monster | null : Property extends LocationProperty ? Location | null : Property extends StringProperty ? string : Property extends FamiliarProperty ? Familiar | null : Property extends StatProperty ? Stat | null : Property extends NumericOrStringProperty ? number | string : Default;
9
+ export declare function isPhylumProperty(property: string): property is PhylumProperty;
10
+ export declare type KnownProperty = NumericProperty | BooleanProperty | MonsterProperty | LocationProperty | FamiliarProperty | PhylumProperty | StatProperty | StringProperty | NumericOrStringProperty;
11
+ export declare type PropertyValue<Property, Default = any> = Property extends NumericProperty ? number : Property extends BooleanProperty ? boolean : Property extends MonsterProperty ? Monster | null : Property extends LocationProperty ? Location | null : Property extends StringProperty ? string : Property extends FamiliarProperty ? Familiar | null : Property extends StatProperty ? Stat | null : Property extends PhylumProperty ? Phylum | null : Property extends NumericOrStringProperty ? number | string : Default;
@@ -46,3 +46,7 @@ const statProps = ["nsChallenge1", "shrugTopper", "snojoSetting"];
46
46
  export function isStatProperty(property) {
47
47
  return statProps.includes(property);
48
48
  }
49
+ const phylumProps = ["dnaSyringe"];
50
+ export function isPhylumProperty(property) {
51
+ return phylumProps.includes(property) || property.endsWith("Phylum");
52
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Checks if you have DNA lab in inventory or installed
3
+ */
4
+ export declare function have(): boolean;
5
+ /**
6
+ * Checks if you have DNA lab installed
7
+ */
8
+ export declare function installed(): boolean;
9
+ /**
10
+ * Tells you whether you are currently hybridized. When passed with an input of any sort, tells you whether you are currently hybridized with that effect.
11
+ * @param tonic Optional input. When passed, the function returns whether that specific effect is hybridized.
12
+ */
13
+ export declare function isHybridized(tonic?: Effect | Phylum | Item): boolean;
14
+ /**
15
+ * Returns the tonic item associated with a particular phylum.
16
+ * @param phylum The phylum in question.
17
+ * @returns The tonic item associated with that phylum; returns $item`none` for $phylum`none`.
18
+ */
19
+ export declare function getTonic(phylum: Phylum): Item;
20
+ /**
21
+ * Returns the tonic effect associated with a particular phylum.
22
+ * @param phylum The phylum in question.
23
+ * @returns The tonic effect associated with that phylum; returns $effect`none` for $phylum`none`.
24
+ */
25
+ export declare function getEffect(phylum: Phylum): Effect;
26
+ /**
27
+ * Tells you which phylum to hunt down for a given effect or item.
28
+ * @param dnatype The tonic effect or item in question
29
+ * @returns The Phylum associated with that effect or item; null if an invalid choice
30
+ */
31
+ export declare function phylumFor(dnatype: Effect | Item): Phylum | null;
32
+ /**
33
+ * Hybridize yourself with the current contents of your syringe, if possible.
34
+ * @returns Whether or not we succeeded
35
+ */
36
+ export declare function hybridize(): boolean;
37
+ /**
38
+ * Makes tonics with whatever phylum is currently in your syringe
39
+ * @param {number} [amount=1] the number of tonics to make
40
+ * @returns Whether we successfully made tonics; returns true if we made as many as we could, regardless of whether that was the number requested
41
+ */
42
+ export declare function makeTonic(amount?: 1 | 2 | 3): boolean;
43
+ /**
44
+ * Tells you how many tonics you can make the rest of the day.
45
+ * @returns The remaining tonics you can make
46
+ */
47
+ export declare function tonicsLeft(): number;
@@ -0,0 +1,154 @@
1
+ import { cliExecute, getWorkshed, haveEffect, itemAmount } from "kolmafia";
2
+ import { $effect, $item, $phylum } from "../../template-string";
3
+ import { have as haveItem } from "../../lib";
4
+ import { get } from "../../property";
5
+ import { get as getModifier } from "../../modifier";
6
+ import { clamp } from "../../utils";
7
+ const lab = $item `Little Geneticist DNA-Splicing Lab`;
8
+ /**
9
+ * Checks if you have DNA lab in inventory or installed
10
+ */
11
+ export function have() {
12
+ return haveItem(lab) || getWorkshed() === lab;
13
+ }
14
+ /**
15
+ * Checks if you have DNA lab installed
16
+ */
17
+ export function installed() {
18
+ return getWorkshed() === lab;
19
+ }
20
+ const phylaEffects = new Map([
21
+ [$phylum `beast`, $effect `Human-Beast Hybrid`],
22
+ [$phylum `bug`, $effect `Human-Insect Hybrid`],
23
+ [$phylum `constellation`, $effect `Human-Constellation Hybrid`],
24
+ [$phylum `construct`, $effect `Human-Machine Hybrid`],
25
+ [$phylum `demon`, $effect `Human-Demon Hybrid`],
26
+ [$phylum `dude`, $effect `Human-Human Hybrid`],
27
+ [$phylum `elemental`, $effect `Human-Elemental Hybrid`],
28
+ [$phylum `elf`, $effect `Human-Elf Hybrid`],
29
+ [$phylum `fish`, $effect `Human-Fish Hybrid`],
30
+ [$phylum `goblin`, $effect `Human-Goblin Hybrid`],
31
+ [$phylum `hippy`, $effect `Human-Hobo Hybrid`],
32
+ [$phylum `horror`, $effect `Human-Horror Hybrid`],
33
+ [$phylum `humanoid`, $effect `Human-Humanoid Hybrid`],
34
+ [$phylum `mer-kin`, $effect `Human-Mer-kin Hybrid`],
35
+ [$phylum `orc`, $effect `Human-Orc Hybrid`],
36
+ [$phylum `penguin`, $effect `Human-Penguin Hybrid`],
37
+ [$phylum `pirate`, $effect `Human-Pirate Hybrid`],
38
+ [$phylum `plant`, $effect `Human-Plant Hybrid`],
39
+ [$phylum `slime`, $effect `Human-Slime Hybrid`],
40
+ [$phylum `undead`, $effect `Human-Undead Hybrid`],
41
+ [$phylum `weird`, $effect `Human-Weird Thing Hybrid`],
42
+ ]);
43
+ const phylaTonics = new Map([
44
+ [$phylum `beast`, $item `Gene Tonic: Beast`],
45
+ [$phylum `bug`, $item `Gene Tonic: Insect`],
46
+ [$phylum `constellation`, $item `Gene Tonic: Constellation`],
47
+ [$phylum `construct`, $item `Gene Tonic: Construct`],
48
+ [$phylum `demon`, $item `Gene Tonic: Demon`],
49
+ [$phylum `dude`, $item `Gene Tonic: Humanoid`],
50
+ [$phylum `elemental`, $item `Gene Tonic: Elemental`],
51
+ [$phylum `elf`, $item `Gene Tonic: Elf`],
52
+ [$phylum `fish`, $item `Gene Tonic: Fish`],
53
+ [$phylum `goblin`, $item `Gene Tonic: Goblin`],
54
+ [$phylum `hippy`, $item `Gene Tonic: Hobo`],
55
+ [$phylum `horror`, $item `Gene Tonic: Horror`],
56
+ [$phylum `humanoid`, $item `Gene Tonic: Humanoid`],
57
+ [$phylum `mer-kin`, $item `Gene Tonic: Mer-kin`],
58
+ [$phylum `orc`, $item `Gene Tonic: Orc`],
59
+ [$phylum `penguin`, $item `Gene Tonic: Penguin`],
60
+ [$phylum `pirate`, $item `Gene Tonic: Pirate`],
61
+ [$phylum `plant`, $item `Gene Tonic: Plant`],
62
+ [$phylum `slime`, $item `Gene Tonic: Slime`],
63
+ [$phylum `undead`, $item `Gene Tonic: Undead`],
64
+ [$phylum `weird`, $item `Gene Tonic: Weird`],
65
+ ]);
66
+ const tonicEffects = Array.from(phylaEffects.values());
67
+ /**
68
+ * Tells you whether you are currently hybridized. When passed with an input of any sort, tells you whether you are currently hybridized with that effect.
69
+ * @param tonic Optional input. When passed, the function returns whether that specific effect is hybridized.
70
+ */
71
+ export function isHybridized(tonic) {
72
+ if (!tonic)
73
+ return installed() && get("_dnaHybrid");
74
+ const tonicEffect = tonic instanceof Effect
75
+ ? tonic
76
+ : tonic instanceof Phylum
77
+ ? getEffect(tonic)
78
+ : getModifier("Effect", tonic);
79
+ return (tonicEffects.includes(tonicEffect) && haveEffect(tonicEffect) === 2147483647);
80
+ }
81
+ /**
82
+ * Returns the tonic item associated with a particular phylum.
83
+ * @param phylum The phylum in question.
84
+ * @returns The tonic item associated with that phylum; returns $item`none` for $phylum`none`.
85
+ */
86
+ export function getTonic(phylum) {
87
+ return phylaTonics.get(phylum) ?? $item `none`;
88
+ //return $item`none` rather than null because it should never happen.
89
+ }
90
+ /**
91
+ * Returns the tonic effect associated with a particular phylum.
92
+ * @param phylum The phylum in question.
93
+ * @returns The tonic effect associated with that phylum; returns $effect`none` for $phylum`none`.
94
+ */
95
+ export function getEffect(phylum) {
96
+ return phylaEffects.get(phylum) ?? $effect `none`;
97
+ //return $effect`none` rather than null because it should never happen
98
+ }
99
+ /**
100
+ * Tells you which phylum to hunt down for a given effect or item.
101
+ * @param dnatype The tonic effect or item in question
102
+ * @returns The Phylum associated with that effect or item; null if an invalid choice
103
+ */
104
+ export function phylumFor(dnatype) {
105
+ if (dnatype instanceof Effect) {
106
+ const phylumPair = Array.from(phylaEffects.entries()).find(([, effect]) => effect === dnatype);
107
+ return phylumPair ? phylumPair[0] : null;
108
+ }
109
+ else {
110
+ const phylumPair = Array.from(phylaTonics.entries()).find(([, tonic]) => tonic === dnatype);
111
+ return phylumPair ? phylumPair[0] : null;
112
+ }
113
+ }
114
+ /**
115
+ * Hybridize yourself with the current contents of your syringe, if possible.
116
+ * @returns Whether or not we succeeded
117
+ */
118
+ export function hybridize() {
119
+ if (get("_dnaHybrid"))
120
+ return false;
121
+ if (!installed())
122
+ return false;
123
+ const currentSyringe = get("dnaSyringe");
124
+ if (!currentSyringe)
125
+ return false;
126
+ const tonicPotion = getTonic(currentSyringe);
127
+ const expectedEffect = getModifier("Effect", tonicPotion);
128
+ cliExecute("camp dnainject");
129
+ return isHybridized(expectedEffect);
130
+ }
131
+ /**
132
+ * Makes tonics with whatever phylum is currently in your syringe
133
+ * @param {number} [amount=1] the number of tonics to make
134
+ * @returns Whether we successfully made tonics; returns true if we made as many as we could, regardless of whether that was the number requested
135
+ */
136
+ export function makeTonic(amount = 1) {
137
+ if (!installed())
138
+ return false;
139
+ const currentSyringe = get("dnaSyringe");
140
+ if (!currentSyringe)
141
+ return false;
142
+ const tonicPotion = getTonic(currentSyringe);
143
+ const amountToMake = clamp(amount, 0, tonicsLeft());
144
+ const startingAmount = itemAmount(tonicPotion);
145
+ cliExecute(`camp dnapotion ${amountToMake}`);
146
+ return itemAmount(tonicPotion) - startingAmount === amountToMake;
147
+ }
148
+ /**
149
+ * Tells you how many tonics you can make the rest of the day.
150
+ * @returns The remaining tonics you can make
151
+ */
152
+ export function tonicsLeft() {
153
+ return clamp(3 - get("_dnaPotionsMade"), 0, 3);
154
+ }
@@ -5,6 +5,8 @@ export declare const Mayo: {
5
5
  zapine: Item;
6
6
  flex: Item;
7
7
  };
8
+ export declare function installed(): boolean;
9
+ export declare function have(): boolean;
8
10
  /**
9
11
  * Sets mayo minder to a particular mayo, and ensures you have enough of it.
10
12
  * @param mayo Mayo to use
@@ -1,6 +1,6 @@
1
1
  import "core-js/modules/es.object.values";
2
2
  import { buy, getWorkshed, retrieveItem, toInt, use } from "kolmafia";
3
- import { have } from "../../lib";
3
+ import { have as haveItem } from "../../lib";
4
4
  import logger from "../../logger";
5
5
  import { get, withChoice } from "../../property";
6
6
  import { $item } from "../../template-string";
@@ -10,6 +10,12 @@ export const Mayo = {
10
10
  zapine: $item `Mayozapine`,
11
11
  flex: $item `Mayoflex`,
12
12
  };
13
+ export function installed() {
14
+ return getWorkshed() === $item `portable Mayo Clinic`;
15
+ }
16
+ export function have() {
17
+ return haveItem($item `portable Mayo Clinic`) || installed();
18
+ }
13
19
  /**
14
20
  * Sets mayo minder to a particular mayo, and ensures you have enough of it.
15
21
  * @param mayo Mayo to use
@@ -27,7 +33,7 @@ export function setMayoMinder(mayo, quantity = 1) {
27
33
  return false;
28
34
  }
29
35
  retrieveItem(quantity, mayo);
30
- if (!have($item `Mayo Minder™`))
36
+ if (!haveItem($item `Mayo Minder™`))
31
37
  buy($item `Mayo Minder™`);
32
38
  if (get("mayoMinderSetting") !== mayo.name) {
33
39
  withChoice(1076, toInt(mayo) - 8260, () => use($item `Mayo Minder™`));
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Fill your Asdon Martin to the given fuel level in the cheapest way possible
3
+ * @param targetUnits Fuel level to attempt to reach.
4
+ * @returns Whether we succeeded at filling to the target fuel level.
5
+ */
6
+ export declare function fillTo(targetUnits: number): boolean;
7
+ /**
8
+ * Object consisting of the various Asdon driving styles
9
+ */
10
+ export declare const Driving: {
11
+ Obnoxiously: Effect;
12
+ Stealthily: Effect;
13
+ Wastefully: Effect;
14
+ Safely: Effect;
15
+ Recklessly: Effect;
16
+ Intimidatingly: Effect;
17
+ Quickly: Effect;
18
+ Observantly: Effect;
19
+ Waterproofly: Effect;
20
+ };
21
+ /**
22
+ * Attempt to drive with a particular style for a particular number of turns
23
+ * @param style The driving style to use
24
+ * @param turns The number of turns to attempt to get
25
+ * @returns Whether we have at least as many turns as requested of said driving style.
26
+ */
27
+ export declare function drive(style: Effect, turns?: number): boolean;
@@ -0,0 +1,80 @@
1
+ import { cliExecute, getFuel, haveEffect, historicalPrice, isNpcItem, mallPrice, retrieveItem, toInt, visitUrl, } from "kolmafia";
2
+ import { getAverageAdventures } from "../../lib";
3
+ import { $effect, $items } from "../../template-string";
4
+ const fuelSkiplist = $items `cup of "tea", thermos of "whiskey", Lucky Lindy, Bee's Knees, Sockdollager, Ish Kabibble, Hot Socks, Phonus Balonus, Flivver, Sloppy Jalopy, glass of "milk"`;
5
+ function price(item) {
6
+ return historicalPrice(item) === 0 ? mallPrice(item) : historicalPrice(item);
7
+ }
8
+ function calculateFuelEfficiency(it, targetUnits) {
9
+ const units = getAverageAdventures(it);
10
+ return price(it) / Math.min(targetUnits, units);
11
+ }
12
+ function isFuelItem(it) {
13
+ return (!isNpcItem(it) &&
14
+ it.fullness + it.inebriety > 0 &&
15
+ getAverageAdventures(it) > 0 &&
16
+ it.tradeable &&
17
+ it.discardable &&
18
+ !fuelSkiplist.includes(it));
19
+ }
20
+ const potentialFuel = $items ``.filter(isFuelItem);
21
+ function getBestFuel(targetUnits) {
22
+ const key1 = (item) => -getAverageAdventures(item);
23
+ const key2 = (item) => calculateFuelEfficiency(item, targetUnits);
24
+ potentialFuel.sort((x, y) => key1(x) - key1(y));
25
+ potentialFuel.sort((x, y) => key2(x) - key2(y));
26
+ return potentialFuel[0];
27
+ }
28
+ function insertFuel(it, quantity = 1) {
29
+ const result = visitUrl(`campground.php?action=fuelconvertor&pwd&qty=${quantity}&iid=${toInt(it)}&go=Convert%21`);
30
+ return result.includes("The display updates with a");
31
+ }
32
+ /**
33
+ * Fill your Asdon Martin to the given fuel level in the cheapest way possible
34
+ * @param targetUnits Fuel level to attempt to reach.
35
+ * @returns Whether we succeeded at filling to the target fuel level.
36
+ */
37
+ export function fillTo(targetUnits) {
38
+ while (getFuel() < targetUnits) {
39
+ const remaining = targetUnits - getFuel();
40
+ const fuel = getBestFuel(remaining);
41
+ const count = Math.ceil(targetUnits / getAverageAdventures(fuel));
42
+ retrieveItem(count, fuel);
43
+ if (!insertFuel(fuel, count)) {
44
+ throw new Error("Failed to fuel Asdon Martin.");
45
+ }
46
+ }
47
+ return getFuel() >= targetUnits;
48
+ }
49
+ /**
50
+ * Object consisting of the various Asdon driving styles
51
+ */
52
+ export const Driving = {
53
+ Obnoxiously: $effect `Driving Obnoxiously`,
54
+ Stealthily: $effect `Driving Stealthily`,
55
+ Wastefully: $effect `Driving Wastefully`,
56
+ Safely: $effect `Driving Safely`,
57
+ Recklessly: $effect `Driving Recklessly`,
58
+ Intimidatingly: $effect `Driving Intimidatingly`,
59
+ Quickly: $effect `Driving Quickly`,
60
+ Observantly: $effect `Driving Observantly`,
61
+ Waterproofly: $effect `Driving Waterproofly`,
62
+ };
63
+ /**
64
+ * Attempt to drive with a particular style for a particular number of turns
65
+ * @param style The driving style to use
66
+ * @param turns The number of turns to attempt to get
67
+ * @returns Whether we have at least as many turns as requested of said driving style.
68
+ */
69
+ export function drive(style, turns = 1) {
70
+ if (!Object.values(Driving).includes(style))
71
+ return false;
72
+ if (haveEffect(style) >= turns)
73
+ return true;
74
+ const fuelNeeded = 37 * Math.ceil((turns - haveEffect(style)) / 30);
75
+ fillTo(fuelNeeded);
76
+ while (getFuel() >= 37 && haveEffect(style) < turns) {
77
+ cliExecute(`asdonmartin drive ${style.name.replace("Driving ", "")}`);
78
+ }
79
+ return haveEffect(style) >= turns;
80
+ }
@@ -1,4 +1,4 @@
1
- import { cliExecute, haveFamiliar, myFamiliar, toPhylum, useFamiliar, } from "kolmafia";
1
+ import { cliExecute, haveFamiliar, myFamiliar, useFamiliar } from "kolmafia";
2
2
  import { get } from "../../property";
3
3
  const familiar = Familiar.get("Red-Nosed Snapper");
4
4
  /**
@@ -44,8 +44,7 @@ export function have() {
44
44
  * @returns Tracked phylum, or null if no phylum tracked.
45
45
  */
46
46
  export function getTrackedPhylum() {
47
- const phylum = toPhylum(get("redSnapperPhylum"));
48
- return phylum === Phylum.get("none") ? null : phylum;
47
+ return get("redSnapperPhylum");
49
48
  }
50
49
  /**
51
50
  * Set snapper tracking to a certain phylum.
@@ -1,7 +1,9 @@
1
+ import * as AsdonMartin from "./2017/AsdonMartin";
1
2
  import * as Bandersnatch from "./2009/Bandersnatch";
2
3
  import * as BeachComb from "./2019/BeachComb";
3
4
  import * as ChateauMantegna from "./2015/ChateauMantegna";
4
5
  import * as CrownOfThrones from "./2010/CrownOfThrones";
6
+ import * as DNALab from "./2014/DNALab";
5
7
  import * as FloristFriar from "./2013/Florist";
6
8
  import * as Guzzlr from "./2020/Guzzlr";
7
9
  import * as MayoClinic from "./2015/MayoClinic";
@@ -14,6 +16,6 @@ import * as SpookyPutty from "./2009/SpookyPutty";
14
16
  import * as TunnelOfLove from "./2017/TunnelOfLove";
15
17
  import * as WinterGarden from "./2014/WinterGarden";
16
18
  import * as Witchess from "./2016/Witchess";
17
- export { Bandersnatch, BeachComb, ChateauMantegna, CrownOfThrones, FloristFriar, Guzzlr, MayoClinic, ObtuseAngel, RainDoh, SongBoom, SourceTerminal, Snapper, SpookyPutty, TunnelOfLove, WinterGarden, Witchess, };
19
+ export { AsdonMartin, Bandersnatch, BeachComb, ChateauMantegna, CrownOfThrones, DNALab, FloristFriar, Guzzlr, MayoClinic, ObtuseAngel, RainDoh, SongBoom, SourceTerminal, Snapper, SpookyPutty, TunnelOfLove, WinterGarden, Witchess, };
18
20
  export * from "./putty-likes";
19
21
  export * from "./LibramSummon";
@@ -1,7 +1,9 @@
1
+ import * as AsdonMartin from "./2017/AsdonMartin";
1
2
  import * as Bandersnatch from "./2009/Bandersnatch";
2
3
  import * as BeachComb from "./2019/BeachComb";
3
4
  import * as ChateauMantegna from "./2015/ChateauMantegna";
4
5
  import * as CrownOfThrones from "./2010/CrownOfThrones";
6
+ import * as DNALab from "./2014/DNALab";
5
7
  import * as FloristFriar from "./2013/Florist";
6
8
  import * as Guzzlr from "./2020/Guzzlr";
7
9
  import * as MayoClinic from "./2015/MayoClinic";
@@ -14,6 +16,6 @@ import * as SpookyPutty from "./2009/SpookyPutty";
14
16
  import * as TunnelOfLove from "./2017/TunnelOfLove";
15
17
  import * as WinterGarden from "./2014/WinterGarden";
16
18
  import * as Witchess from "./2016/Witchess";
17
- export { Bandersnatch, BeachComb, ChateauMantegna, CrownOfThrones, FloristFriar, Guzzlr, MayoClinic, ObtuseAngel, RainDoh, SongBoom, SourceTerminal, Snapper, SpookyPutty, TunnelOfLove, WinterGarden, Witchess, };
19
+ export { AsdonMartin, Bandersnatch, BeachComb, ChateauMantegna, CrownOfThrones, DNALab, FloristFriar, Guzzlr, MayoClinic, ObtuseAngel, RainDoh, SongBoom, SourceTerminal, Snapper, SpookyPutty, TunnelOfLove, WinterGarden, Witchess, };
18
20
  export * from "./putty-likes";
19
21
  export * from "./LibramSummon";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libram",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "JavaScript helper library for KoLmafia",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",