diff --git a/iotmcargo b/iotmcargo
new file mode 100644
index 00000000..147d4cf4
--- /dev/null
+++ b/iotmcargo
@@ -0,0 +1,30 @@
+// Cargo cultist shorts
+RegisterResourceGenerationFunction("IOTMCargoCultistShortsGenerateResource");
+void IOTMCargoCultistShortsGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ if (!get_property_boolean("_cargoPocketEmptied")) {
+ string image_name = "__item cargo cultist shorts";
+ string description = "Pick a pocket for something useful! Too many to list!";
+
+ string [int] options;
+ if (__misc_state["in run"] && my_path_id() != PATH_COMMUNITY_SERVICE)
+ {
+ if (!locationAvailable($location[The royal guard Chamber]))
+ {
+ options.listAppend("Stink like a filthworm drone");
+ }
+ if (!locationAvailable($location[The eXtreme Slope]) == false)
+ {
+ options.listAppend("Mountain Man, YR for 2x ore");
+ }
+ if ($location[The Battlefield (Frat Uniform)].turns_spent < 100)
+ {
+ options.listAppend("Green Ops Soldier, olfact for funny meme strategies");
+ }
+ }
+ if (options.count() > 0)
+ options.listAppend("Possible pockets:
" + options.listJoinComponents("
").HTMLGenerateIndentedText());
+
+ resource_entries.listAppend(ChecklistEntryMake("__item cargo cultist shorts", "inventory.php?action=pocket", ChecklistSubentryMake("Cargo shorts pocket openable", "", description), 1).ChecklistEntrySetIDTag("Cargo shorts resource"));
+ }
+}
diff --git a/iotmcrystalball b/iotmcrystalball
new file mode 100644
index 00000000..06111841
--- /dev/null
+++ b/iotmcrystalball
@@ -0,0 +1,21 @@
+//Miniature Crystal ball
+
+RegisterTaskGenerationFunction("IOTMCrystalBallGenerateTasks");
+void IOTMCrystalBallGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
+{
+ string title;
+ title = "Miniature crystal ball monster prediction";
+ monster crystalBallPrediction = (get_property_monster("crystalBallMonster"));
+ location crystalBallZone = (get_property_location("crystalBallLocation"));
+ string [int] description;
+ if (!lookupItem("miniature crystal ball").equipped())
+ {
+ description.listAppend("Next fight in " + HTMLGenerateSpanFont(crystalBallZone, "blue") + " will be: " + HTMLGenerateSpanFont(crystalBallPrediction, "blue"));
+ optional_task_entries.listAppend(ChecklistEntryMake("__item miniature crystal ball", "url", ChecklistSubentryMake(title, description)));
+ }
+ else
+ {
+ description.listAppend("Next fight in " + HTMLGenerateSpanFont(crystalBallZone, "blue") + " will be: " + HTMLGenerateSpanFont(crystalBallPrediction, "blue"));
+ task_entries.listAppend(ChecklistEntryMake("__item miniature crystal ball", "url", ChecklistSubentryMake(title, description), -11));
+ }
+}
diff --git a/iotmemotionchip b/iotmemotionchip
new file mode 100644
index 00000000..4d5c2f57
--- /dev/null
+++ b/iotmemotionchip
@@ -0,0 +1,87 @@
+//Emotion Chip
+RegisterResourceGenerationFunction("IOTMEmotionChipGenerateResource");
+void IOTMEmotionChipGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ if (!lookupSkill("Emotionally Chipped").have_skill())
+ return;
+ ChecklistSubentry getEmotions() {
+ // Title
+ string main_title = "Emotion chip feelings";
+ // Entries
+ string [int] description;
+ string [int] emotions;
+
+ int emotionDisappointed = clampi(3 - get_property_int("_feelDisappointedUsed"), 0, 3);
+ if (emotionDisappointed > 0)
+ {
+ emotions.listAppend(emotionDisappointed + " Disappointments left. This must be the 'your parents' emotion chip.");
+ }
+ int emotionExcitement = clampi(3 - get_property_int("_feelExcitementUsed"), 0, 3);
+ if (emotionExcitement > 0)
+ {
+ emotions.listAppend(emotionExcitement + " Excitement left. 20 advs of +25 Mus/Mys/Mox.");
+ }
+ int emotionLonely = clampi(3 - get_property_int("_feelLonelyUsed"), 0, 3);
+ if (emotionLonely > 0)
+ {
+ emotions.listAppend(emotionLonely + " Lonelys left. 20 advs of -5% Combat.");
+ }
+ int emotionLost = clampi(3 - get_property_int("_feelLostUsed"), 0, 3);
+ if (emotionLost > 0)
+ {
+ emotions.listAppend(emotionLost + " Losts left. 20 advs of weird Teleportitis buff.");
+ }
+ int emotionNervous = clampi(3 - get_property_int("_feelNervousUsed"), 0, 3);
+ if (emotionNervous > 0)
+ {
+ emotions.listAppend(emotionNervous + " Nervouses left. 20 avs of passive damage.");
+ }
+ int emotionPeaceful = clampi(3 - get_property_int("_feelPeacefulUsed"), 0, 3);
+ if (emotionPeaceful > 0)
+ {
+ emotions.listAppend(emotionPeaceful + " Peacefuls left. 20 advs of +2 elemental resist.");
+ }
+ int emotionPride = clampi(3 - get_property_int("_feelPrideUsed"), 0, 3);
+ if (emotionPride > 0)
+ {
+ emotions.listAppend(emotionPride + " Prides left. Triple stat gain from current fight.");
+ }
+ int emotionHatred = clampi(3 - get_property_int("_feelHatredUsed"), 0, 3);
+ if (emotionHatred > 0)
+ {
+ emotions.listAppend(emotionHatred + " Hatreds left. 50-turn banish.");
+
+ resource_entries.listAppend(ChecklistEntryMake("__skill feel hatred", "", ChecklistSubentryMake(pluralise(emotionHatred, "Feel Hatred", "Feels Hatreds"), "", "Cast Feel Hatred. Free run/banish.")).ChecklistEntrySetCombinationTag("banish").ChecklistEntrySetIDTag("Emotion chip feel hatred banish"));
+ }
+ int emotionEnvy = clampi(3 - get_property_int("_feelEnvyUsed"), 0, 3);
+ if (emotionEnvy > 0)
+ {
+ emotions.listAppend(emotionEnvy + " Envys left. Black Ray.");
+ }
+ int emotionNostalgic = clampi(3 - get_property_int("_feelNostalgicUsed"), 0, 3);
+ monster nostalgicMonster = (get_property_monster("feelNostalgicMonster"));
+ if (emotionNostalgic > 0)
+ {
+ emotions.listAppend(emotionNostalgic + " Nostalgias left. Item copying. Can currently feel nostalgic for: " + HTMLGenerateSpanFont(nostalgicMonster, "blue"));
+ }
+ int emotionSuperior = clampi(3 - get_property_int("_feelSuperiorUsed"), 0, 3);
+ if (emotionSuperior > 0)
+ {
+ emotions.listAppend(emotionSuperior + " Superiors left. +1 PvP Fight if used as killshot.");
+ }
+ return ChecklistSubentryMake(main_title, description, emotions);
+ }
+
+ ChecklistEntry entry;
+ entry.image_lookup_name = "__item emotion chip";
+ entry.tags.id = "emotion chip resource";
+
+ ChecklistSubentry emotions = getEmotions();
+ if (emotions.entries.count() > 0) {
+ entry.subentries.listAppend(emotions);
+ }
+
+ if (entry.subentries.count() > 0) {
+ resource_entries.listAppend(entry);
+ }
+}
diff --git a/iotmmaps b/iotmmaps
new file mode 100644
index 00000000..e2e49770
--- /dev/null
+++ b/iotmmaps
@@ -0,0 +1,84 @@
+//experimental cartography code
+RegisterResourceGenerationFunction("IOTMCartographyMapsGenerateResource");
+void IOTMCartographyMapsGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ if (!(__misc_state["in run"] && in_ronin())) return;
+
+ int maps_left = clampi(3 - get_property_int("_monstersMapped"), 0, 3);
+ if (maps_left > 0 && my_path_id() != PATH_POCKET_FAMILIARS)
+ {
+ string [int] description;
+ description.listAppend("Map the monsters you want to fight!");
+ description.listAppend("This IotM also gives you a special noncom in the following zones:");
+ string [int] options;
+ if (!__quest_state["cc_spookyravennecklace"].finished)
+ {
+ options.listAppend("The Haunted Billiards Room");
+ }
+ if (!__quest_state["cc_friars"].finished)
+ {
+ options.listAppend("The Dark Neck of the Woods");
+ }
+ if (get_property_int("cyrptNookEvilness") > 25)
+ {
+ options.listAppend("The Defiled Nook");
+ }
+ if (get_property_int("twinPeakProgress") != 15)
+ {
+ options.listAppend(HTMLGenerateSpanOfClass("First adv", "r_bold") + " A-Boo Peak: gives Twin Peak noncom");
+ }
+ if (!__quest_state["cc_castletop"].finished)
+ {
+ options.listAppend("Castle Top Floor");
+ }
+ if (!__quest_state["warProgress"].started)
+ {
+ options.listAppend("The Hippy Camp (Verge of War)");
+ }
+ string [int] monsterMaps;
+ if (!__quest_state["Level 11 Ron"].finished)
+ {
+ monsterMaps.listAppend("Red Butler, 30% free kill item and 15% fun drop item. Combine with Olfaction/Use the Force?");
+ }
+ if (get_property_int("twinPeakProgress") < 15 && $item[rusty hedge trimmers].available_amount() < 4)
+ {
+ monsterMaps.listAppend("hedge beast, 15% quest progress item. Possibly Spit.");
+ }
+ if (__quest_state["Level 9"].state_int["a-boo peak hauntedness"] > 0)
+ {
+ monsterMaps.listAppend("Whatsian Commander Ghost, 15% free runaway item. Possibly Spit.");
+ }
+ if ($item[star chart].available_amount() < 1 || $item[richard's star key].available_amount() < 1)
+ {
+ monsterMaps.listAppend("Astronomer");
+ }
+ if (!__quest_state["Level 12"].state_boolean["Lighthouse Finished"] && $item[barrel of gunpowder].available_amount() < 5)
+ {
+ monsterMaps.listAppend("Lobsterfrogman, probably a weak option. Combine with Use the Force?");
+ }
+ if ($location[The Battlefield (Frat Uniform)].turns_spent < 100)
+ {
+ monsterMaps.listAppend("Green Ops Soldier. Combine with Olfaction/Use the Force and Spit and Explodinal pills.");
+ }
+
+ if (options.count() > 0)
+ description.listAppend("Noncoms of interest:|*-" + options.listJoinComponents("|*-"));
+ if (monsterMaps.count() > 0)
+ description.listAppend("Monsters to map:|*-" + monsterMaps.listJoinComponents("|*-"));
+
+ resource_entries.listAppend(ChecklistEntryMake("__item Comprehensive Cartographic Compendium", "", ChecklistSubentryMake(pluralise(maps_left, "Cartography skill use", "Cartography skill uses"), "", description), 5).ChecklistEntrySetIDTag("Cartography skills resource"));
+ }
+}
+
+RegisterTaskGenerationFunction("IOTMCartographyMapsGenerateTasks");
+void IOTMCartographyMapsGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
+{
+ {
+ string [int] description;
+ string title = "Your mapping senses are activated!";
+ description.listAppend(HTMLGenerateSpanFont("Pick your monster!", "blue"));
+ if (!get_property_boolean("mappingMonsters") == false) {
+ task_entries.listAppend(ChecklistEntryMake("__item Comprehensive Cartographic Compendium", "url", ChecklistSubentryMake(title, description), -11));
+ }
+ }
+}
diff --git a/iotmpocketprof b/iotmpocketprof
new file mode 100644
index 00000000..a28042a0
--- /dev/null
+++ b/iotmpocketprof
@@ -0,0 +1,32 @@
+ if ($familiar[pocket professor].familiar_is_usable());
+ {
+ int lectures_used = get_property_int("_pocketProfessorLectures");
+ string name = lectures_used + " Pocket Professor lectures used";
+ string [int] description;
+ string image_name = "";
+
+ description.listAppend("Sausage goblins, ninja snowman assassin, ghosts, or something else...?");
+
+ string url = "";
+
+ if ($familiar[pocket professor].familiar_is_usable())
+ {
+ image_name = "pocket professor";
+ }
+
+ if (!($familiars[Frumious Bandersnatch, pocket professor] contains my_familiar()))
+ url = "familiar.php";
+
+ resource_entries.listAppend(ChecklistEntryMake(image_name, url, ChecklistSubentryMake(name, "", description)));
+
+ if (!get_property_boolean("_thesisDelivered"))
+ {
+ string [int] description;
+ description.listAppend("+8 advs from a 256+ HP monster");
+ description.listAppend("+10 advs from a 625+ HP monster");
+ description.listAppend("+11 advs from a 1,296+ HP monster");
+
+ resource_entries.listAppend(ChecklistEntryMake("__familiar Pocket Professor", "", ChecklistSubentryMake("Deliver your Thesis!", "", description), 0).ChecklistEntryTagEntry("+11 Adventures"));
+
+ }
+ }
diff --git a/iotmpowerglove b/iotmpowerglove
new file mode 100644
index 00000000..bf3a4333
--- /dev/null
+++ b/iotmpowerglove
@@ -0,0 +1,20 @@
+RegisterResourceGenerationFunction("IOTMPowerfulGloveGenerateResource");
+void IOTMPowerfulGloveGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ if (lookupItem("Powerful Glove").available_amount() == 0) return;
+ if (get_property_int("_powerfulGloveBatteryPowerUsed") < 100)
+ {
+ int uses_remaining = clampi(100 - get_property_int("_powerfulGloveBatteryPowerUsed"), 0, 100);
+ string url = "";
+ if (!lookupItem("Powerful Glove").equipped())
+ url = "inventory.php?which=2";
+ string [int] description;
+ description.listAppend("Use CHEAT CODES, which let you:");
+ description.listAppend("Get +200% stats - 5% battery");
+ description.listAppend("Get -10% combat frequency - 5% battery");
+ description.listAppend("Shrink the target - 5% battery");
+ description.listAppend("Replace the target - 10% battery");
+ //description.listAppend("Choose one of:|*" + options.listJoinComponents("|*"));
+ resource_entries.listAppend(ChecklistEntryMake("__item powerful glove", url, ChecklistSubentryMake(pluralise(uses_remaining, "% Powerful Glove battery", "% Powerful Glove battery"), "", description), 0));
+ }
+}
diff --git a/iotmshroom b/iotmshroom
new file mode 100644
index 00000000..eeee9bff
--- /dev/null
+++ b/iotmshroom
@@ -0,0 +1,25 @@
+RegisterResourceGenerationFunction("IOTMMushroomGardenGenerateResource");
+void IOTMMushroomGardenGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ int mushroom_growth = (get_property_int("mushroomGardenCropLevel"));
+ int total_piranha_fights_available = 1;
+ if (my_path_id() == PATH_OF_THE_PLUMBER)
+ total_piranha_fights_available = 5;
+ int piranha_fights_remaining = clampi(total_piranha_fights_available - get_property_int("_mushroomGardenFights"), 0, total_piranha_fights_available);
+
+ if (get_property_int("_mushroomGardenFights") < total_piranha_fights_available)
+ {
+ string url = "";
+ string [int] description;
+ description.listAppend("5 free fights if you are a Plumber.");
+ description.listAppend("Only 1 free fight if you aren't a Plumber.");
+ description.listAppend("Harvest a mushroom, or fertilize it to make it grow bigger.");
+ description.listAppend("Current growth level: " + mushroom_growth + "/5");
+ description.listAppend("4 days: 1 mushroom slab");
+ description.listAppend("5 days: 2 mushroom slabs");
+ description.listAppend("10 days: 1 mushroom house (tradable, but still bad)");
+ description.listAppend("Mushrooms give good-tier food, awesome-tier booze, or a 1-spleen +com/ML buff.");
+
+ resource_entries.listAppend(ChecklistEntryMake("__item spanish fly trap", url, ChecklistSubentryMake(pluralise(piranha_fights_remaining, "piranha plant fight", "piranha plant fights"), "", description), 0));
+ }
+}
diff --git a/iotmsnapper b/iotmsnapper
new file mode 100644
index 00000000..aa16796e
--- /dev/null
+++ b/iotmsnapper
@@ -0,0 +1,56 @@
+RegisterResourceGenerationFunction("IOTMRedNosedSnapperResource");
+void IOTMRedNosedSnapperResource(ChecklistEntry [int] resource_entries)
+{
+ ChecklistSubentry getPhylumRewards() {
+ // Title
+ string redSnapperPhylum = get_property("redSnapperPhylum");
+ int redSnapperProgress = get_property_int("redSnapperProgress");
+ string main_title = redSnapperProgress + "/11 fights until next Snapper drop";
+
+ // Subtitle
+ string subtitle = "";
+
+ // Entries
+ string [int] description;
+ if (redSnapperPhylum != "")
+ {
+ description.listAppend("Tracked phylum gains +2 copies per monster.");
+ string snapperPhylum = get_property("redSnapperPhylum");
+ description.listAppend(HTMLGenerateSpanFont("Currently tracking " + redSnapperPhylum + "-type.", "blue"));
+ description.listAppend("Red Zeppelin - track Dudes.");
+ description.listAppend("The Palindrome - track Dudes.");
+ description.listAppend("Twin Peak - track Beasts.");
+ description.listAppend("Whitey's Grove - track Beasts.");
+ description.listAppend("The Haunted Laundry Room - track Undead");
+ description.listAppend("The Haunted Wine Cellar - track Constructs.");
+ description.listAppend(HTMLGenerateSpanFont("WARNING: changing phylum resets progress.", "red"));
+ description.listAppend(HTMLGenerateSpanOfClass("Dudes:", "r_bold") + " Free banish item");
+ description.listAppend(HTMLGenerateSpanOfClass("Goblins:", "r_bold") + " 3-size " + HTMLGenerateSpanOfClass("awesome", "r_element_awesome") + " food");
+ description.listAppend(HTMLGenerateSpanOfClass("Orcs:", "r_bold") + " 3-size " + HTMLGenerateSpanOfClass("awesome", "r_element_awesome") + " booze");
+ description.listAppend(HTMLGenerateSpanOfClass("Undead:", "r_bold") + " +5 " + HTMLGenerateSpanOfClass("spooky", "r_element_spooky") + " res potion");
+ description.listAppend(HTMLGenerateSpanOfClass("Constellations:", "r_bold") + " Yellow ray");
+ }
+
+ return ChecklistSubentryMake(main_title, subtitle, description);
+ }
+
+ if (!lookupFamiliar("Red Nosed Snapper").familiar_is_usable()) return;
+
+ int muskBanishes_left = clampi(3 - get_property_int("_humanMuskUses"), 0, 3);
+ if ($item[human musk].available_amount() > 0 && in_ronin() && $item[human musk].item_is_usable())
+ {
+ resource_entries.listAppend(ChecklistEntryMake("__item human musk", "", ChecklistSubentryMake(pluralise($item[human musk]), "", "" + muskBanishes_left + " free uses left today."), 6).ChecklistEntryTagEntry("banish"));
+ }
+
+ ChecklistEntry entry;
+ entry.image_lookup_name = "__familiar red-nosed snapper";
+
+ ChecklistSubentry rewards = getPhylumRewards();
+ if (rewards.entries.count() > 0) {
+ entry.subentries.listAppend(rewards);
+ }
+
+ if (entry.subentries.count() > 0) {
+ resource_entries.listAppend(entry);
+ }
+}
diff --git a/iotmsongboom b/iotmsongboom
new file mode 100644
index 00000000..e9fe7181
--- /dev/null
+++ b/iotmsongboom
@@ -0,0 +1,41 @@
+RegisterTaskGenerationFunction("IOTMBoomBoxGenerateTasks");
+void IOTMBoomBoxGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
+{
+ if (lookupItem("SongBoom™ BoomBox").available_amount() == 0) return;
+
+ string song = get_property("boomBoxSong");
+ int changes_left = get_property_int("_boomBoxSongsLeft"); //the boys are back in town, eleven times. everyone will love it
+
+ int boomboxProgress = get_property_int("_boomBoxFights");
+ string [int] description;
+ {
+ description.listAppend("Currently playing " + song + ", the soundtrack of your life!");
+ description.listAppend("Currently " + boomboxProgress + "/11 fights until next drop.");
+ if (boomboxProgress == 9)
+ {
+ description.listAppend(HTMLGenerateSpanFont("Boombox drop soon", "blue"));
+ task_entries.listAppend(ChecklistEntryMake("__item SongBoom™ BoomBox", "inv_use.php?pwd=" + my_hash() + "&whichitem=9919", ChecklistSubentryMake("Boombox song stuff", "", description), -11));
+ }
+ description.listAppend("" + changes_left + " song changes left today.");
+
+ if (boomboxProgress == 10)
+ {
+ description.listAppend(HTMLGenerateSpanFont("Boombox drop next fight", "red"));
+ task_entries.listAppend(ChecklistEntryMake("__item SongBoom™ BoomBox", "inv_use.php?pwd=" + my_hash() + "&whichitem=9919", ChecklistSubentryMake("Boombox song stuff", "", description), -11));
+ }
+ optional_task_entries.listAppend(ChecklistEntryMake("__item SongBoom™ BoomBox", "inv_use.php?pwd=" + my_hash() + "&whichitem=9919", ChecklistSubentryMake("Boombox song stuff", "", description), 8));
+ }
+
+ if (song == "" && changes_left > 0)
+ {
+ string [int] description;
+ if (!__quest_state["Level 7"].finished && my_path_id() != PATH_COMMUNITY_SERVICE)
+ description.listAppend("Eye of the Giger: Nightmare Fuel for the cyrpt.");
+ if (fullness_limit() > 0)
+ description.listAppend("Food Vibrations: extra adventures from food" + (__misc_state["in run"] ? ", +30% food drop" : "") + ".");
+ description.listAppend("Total Eclipse of Your Meat: extra meat, +30% meat.");
+
+ optional_task_entries.listAppend(ChecklistEntryMake("__item SongBoom™ BoomBox", "inv_use.php?pwd=" + my_hash() + "&whichitem=9919", ChecklistSubentryMake("Set BoomBox song", "", description), 8));
+ }
+
+}
diff --git a/iotmvampcloake b/iotmvampcloake
new file mode 100644
index 00000000..7cb7abac
--- /dev/null
+++ b/iotmvampcloake
@@ -0,0 +1,19 @@
+RegisterResourceGenerationFunction("IOTMVampireCloakGenerateResource");
+void IOTMVampireCloakGenerateResource(ChecklistEntry [int] resource_entries)
+{
+ if (!$item[vampyric cloake].have())
+ return;
+
+ int uses_left = clampi(10 - get_property_int("_vampyreCloakeFormUses"), 0, 10);
+ if (uses_left > 0 && my_path_id() != PATH_POCKET_FAMILIARS)
+ {
+ string [int] skills;
+ skills.listAppend("Wolf: +50% muscle, +50% meat");
+ skills.listAppend("Mist: +2 all resistance");
+ skills.listAppend("Bat: +50% items");
+
+ string [int] description;
+ description.listAppend("Imitate the form of a powerful vampyre for 1 adventure:|*" + skills.listJoinComponents("|*"));
+ resource_entries.listAppend(ChecklistEntryMake("__item vampyric cloake", "", ChecklistSubentryMake(pluralise(uses_left, "Vampyric cloake skill use", "Vampyric cloake skill uses"), "", description), 5));
+ }
+}