diff --git a/Source/relay/TourGuide/Items of the Month/2025/Blood Cubic Zirconia.ash b/Source/relay/TourGuide/Items of the Month/2025/Blood Cubic Zirconia.ash index 347f105c..c86fadde 100644 --- a/Source/relay/TourGuide/Items of the Month/2025/Blood Cubic Zirconia.ash +++ b/Source/relay/TourGuide/Items of the Month/2025/Blood Cubic Zirconia.ash @@ -26,6 +26,14 @@ void IOTMBloodCubicZirconiaGenerateTasks(ChecklistEntry [int] task_entries, Chec else if (bczRefracts >= 13) { description.listAppend(HTMLGenerateSpanFont("Next Refract costs " + refractCost + " mys. EXPENSIVE!", "red") + ""); } + if (lookupItem("monodent of the sea").equipped_amount() == 0) + { + description.listAppend(HTMLGenerateSpanFont("Seadent not equipped", "red")); + } + else if (lookupItem("monodent of the sea").equipped_amount() > 0) + { + description.listAppend(HTMLGenerateSpanFont("Seadent FLEESH ok!", "blue")); + } if (bczBullets < 13) { description.listAppend("Next Bullet costs " + HTMLGenerateSpanFont(bulletCost + "", "red") + " mox"); } @@ -85,4 +93,14 @@ void IOTMBloodCubicZirconiaGenerateResource(ChecklistEntry [int] resource_entrie description.listAppend("Next Pheromone costs " + HTMLGenerateSpanFont(pheromoneCost + "", "brown") + " mox"); resource_entries.listAppend(ChecklistEntryMake("__item blood cubic zirconia", url, ChecklistSubentryMake(HTMLGenerateSpanFont("BCZ: Blood Cubic Zirconia skills", "brown"), description), 11).ChecklistEntrySetIDTag("bcz important skills")); + + + + int pheromoneBlasts = get_property_int("markYourTerritoryCharges"); + if (pheromoneBlasts > 0) + { + string [int] description2; + description2.listAppend("Instakill no items/meat"); + resource_entries.listAppend(ChecklistEntryMake("__skill mark your territory", "", ChecklistSubentryMake(pluralise(pheromoneBlasts, "BCZ pheromone", "BCZ pheromones"), "", description2), 0).ChecklistEntrySetCombinationTag("banish").ChecklistEntrySetIDTag("BCZ pheromone banish")); + } } diff --git a/Source/relay/TourGuide/Items of the Month/2025/Cooler Yeti.ash b/Source/relay/TourGuide/Items of the Month/2025/Cooler Yeti.ash index 0f231b2b..3f773f7f 100644 --- a/Source/relay/TourGuide/Items of the Month/2025/Cooler Yeti.ash +++ b/Source/relay/TourGuide/Items of the Month/2025/Cooler Yeti.ash @@ -3,20 +3,25 @@ RegisterTaskGenerationFunction("IOTMCoolerYetiGenerateTasks"); void IOTMCoolerYetiGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries) { if (!lookupFamiliar("Cooler Yeti").familiar_is_usable()) return; - if (my_familiar() != lookupFamiliar("Cooler Yeti")) return; string url = "familiar.php"; string [int] description; int yetiExperience = ($familiar[cooler yeti].experience); int famExpNeededFor400 = (400 - yetiExperience); - string fightsForYeti; + string fightsForYeti400; - if (!get_property_boolean("_coolerYetiAdventures")) { - if (yetiExperience >= 400) { - description.listAppend("" + HTMLGenerateSpanFont("Doublebooze ready!", "blue")); - string url = "main.php?talktoyeti=1"; - task_entries.listAppend(ChecklistEntryMake("__item dreadsylvanian cold-fashioned", url, ChecklistSubentryMake("Yeti booze time", description), -11).ChecklistEntrySetIDTag("cooler yeti booze time")); - } + if (get_property("coolerYetiMode") == "buff") { + description.listAppend("" + HTMLGenerateSpanFont("Buffbooze primed!!!", "blue")); + task_entries.listAppend(ChecklistEntryMake("__item oversized ice molecule", url, ChecklistSubentryMake("Yeti booze time", description), -11)); + } + if (get_property("coolerYetiMode") == "adventures") { + description.listAppend("" + HTMLGenerateSpanFont("Doublebooze primed!!!", "blue")); + task_entries.listAppend(ChecklistEntryMake("__item dreadsylvanian cold-fashioned", url, ChecklistSubentryMake("Yeti booze time", description), -11)); + } + if (my_familiar() == lookupFamiliar("Cooler Yeti") && !get_property_boolean("_coolerYetiAdventures") && yetiExperience >= 400) { + description.listAppend("" + HTMLGenerateSpanFont("Doublebooze ready", "blue")); + url = "main.php?talktoyeti=1"; + task_entries.listAppend(ChecklistEntryMake("__item perfect ice cube", url, ChecklistSubentryMake("Yeti booze time", description), -11).ChecklistEntrySetIDTag("cooler yeti booze time")); } } @@ -28,16 +33,19 @@ void IOTMCoolerYetiGenerateResource(ChecklistEntry [int] resource_entries) // Title int famExperienceGain = numeric_modifier("familiar experience") + 1; int yetiExperience = ($familiar[cooler yeti].experience); + int famExpNeededFor225 = (225 - yetiExperience); int famExpNeededFor400 = (400 - yetiExperience); string [int] description; string url = "familiar.php"; - string fightsForYeti; - string title = HTMLGenerateSpanFont("Cooler Yeti fxp", "blue"); + string fightsForYeti400; + string fightsForYeti225; + string title = HTMLGenerateSpanFont(yetiExperience + " Cooler Yeti fxp", "blue"); if (famExperienceGain > 0) { - fightsForYeti = pluralise(ceil(to_float(famExpNeededFor400) / famExperienceGain), "fight", "fights"); + fightsForYeti400 = pluralise(ceil(to_float(famExpNeededFor400) / famExperienceGain), "fight", "fights"); + fightsForYeti225 = pluralise(ceil(to_float(famExpNeededFor225) / famExperienceGain), "fight", "fights"); } else { - fightsForYeti = "cannot get"; + fightsForYeti400 = "cannot get"; } if (!get_property_boolean("_coolerYetiAdventures")) { if (yetiExperience >= 400) { @@ -49,10 +57,18 @@ void IOTMCoolerYetiGenerateResource(ChecklistEntry [int] resource_entries) description.listAppend(HTMLGenerateSpanOfClass("100 advs of +100% item/meat", "r_bold") + " costs 225 fxp."); } - description.listAppend(`Currently have {HTMLGenerateSpanOfClass(yetiExperience, "r_bold")} experience, currently gain {HTMLGenerateSpanOfClass(famExperienceGain, "r_bold")} fam exp per fight.`); + description.listAppend(`Currently gain {HTMLGenerateSpanOfClass(famExperienceGain, "r_bold")} fam exp per fight.`); + if (yetiExperience < 225) { + description.listAppend(`{HTMLGenerateSpanOfClass(famExpNeededFor225, "r_bold")} famxp for +100% meat/item. ({fightsForYeti225})`); + } if (yetiExperience < 400) { - description.listAppend(`Need {HTMLGenerateSpanOfClass(famExpNeededFor400, "r_bold")} more famxp for doublebooze. ({fightsForYeti})`); + description.listAppend(`{HTMLGenerateSpanOfClass(famExpNeededFor400, "r_bold")} famxp for doublebooze. ({fightsForYeti400})`); + } + if (get_property_boolean("_coolerYetiAdventures")) { + description.listAppend(HTMLGenerateSpanFont("Doublebooze already used today.", "grey")); + } + if (my_familiar() == lookupFamiliar("Cooler Yeti")) { + url = "main.php?talktoyeti=1"; } - resource_entries.listAppend(ChecklistEntryMake("__familiar cooler yeti", url, ChecklistSubentryMake(title, "", description), -1)); } diff --git a/Source/relay/TourGuide/Items of the Month/2025/Shrunken Head.ash b/Source/relay/TourGuide/Items of the Month/2025/Shrunken Head.ash new file mode 100644 index 00000000..75bbe0a3 --- /dev/null +++ b/Source/relay/TourGuide/Items of the Month/2025/Shrunken Head.ash @@ -0,0 +1,22 @@ +//shrunken head +RegisterTaskGenerationFunction("IOTMShrunkenHeadGenerateTasks"); +void IOTMShrunkenHeadGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries) +{ + if ($item[shrunken head].available_amount() == 0) return; + string url = "inventory.php?ftext=shrunken+head"; + string [int] description; + + if (lookupItem("shrunken head").equipped_amount() > 0) + { + description.listAppend("Targets:"); + description.listAppend("Baa sheep 25%"); + description.listAppend("Banshee librarian 10%"); + description.listAppend("Mountain man 40%"); + description.listAppend("Pygmy janitor 20%"); + description.listAppend("Pygmy bowler 40%"); + description.listAppend("Nook skeleton 20%"); + description.listAppend("Smut orc 10%"); + description.listAppend("Dairy goat 40%"); + task_entries.listAppend(ChecklistEntryMake("__item shrunken head", url, ChecklistSubentryMake(HTMLGenerateSpanFont("Shrunken head equipped", "blue"), description), -11).ChecklistEntrySetIDTag("shrunken head")); + } +} diff --git a/Source/relay/TourGuide/Items of the Month/2025/crimboskeleton.ash b/Source/relay/TourGuide/Items of the Month/2025/Skeleton of Crimbo Past.ash similarity index 79% rename from Source/relay/TourGuide/Items of the Month/2025/crimboskeleton.ash rename to Source/relay/TourGuide/Items of the Month/2025/Skeleton of Crimbo Past.ash index 0b515d86..d832ce87 100644 --- a/Source/relay/TourGuide/Items of the Month/2025/crimboskeleton.ash +++ b/Source/relay/TourGuide/Items of the Month/2025/Skeleton of Crimbo Past.ash @@ -8,7 +8,7 @@ void IOTMSkeletonOfCrimboPastGenerateTasks(ChecklistEntry [int] task_entries, Ch int fightKnucklebones = get_property_int("_knuckleboneDrops"); int restKnucklebones = get_property_int("_knuckleboneRests"); - int totalKnucklebonesLeft = clampi(100 - (fightKnucklebones + restKnucklebones), 0, 100); + int totalKnucklebonesLeft = clampi(100 - (fightKnucklebones), 0, 100); description.listAppend(5 - restKnucklebones + " rest knucklebones available."); if (totalKnucklebonesLeft == 0 && my_familiar() == lookupFamiliar("skeleton of crimbo past")) { @@ -29,7 +29,7 @@ void IOTMSkeletonOfCrimboPastGenerateResource(ChecklistEntry [int] resource_entr int fightKnucklebones = get_property_int("_knuckleboneDrops"); int restKnucklebones = get_property_int("_knuckleboneRests"); - int totalKnucklebonesLeft = clampi(100 - (fightKnucklebones + restKnucklebones), 0, 100); + int totalKnucklebonesLeft = clampi(100 - (fightKnucklebones), 0, 100); description.listAppend(5 - restKnucklebones + " rest knucklebones available."); @@ -38,6 +38,13 @@ void IOTMSkeletonOfCrimboPastGenerateResource(ChecklistEntry [int] resource_entr } else if (totalKnucklebonesLeft > 0) { title = (HTMLGenerateSpanFont(totalKnucklebonesLeft + " knucklebone drops left", "green")); + description.listAppend("90% - skeleton"); + description.listAppend("70% - orc / pirate"); + description.listAppend("50% - dude / elf / hobo"); + description.listAppend("30% - beast / demon / goblin / humanoid / undead"); + description.listAppend("20% - fish / penguin / weird"); + description.listAppend("10% - construct / bug"); + description.listAppend("0% - constellation / elemental / hippy / horror / mer-kin / plant / slime"); } resource_entries.listAppend(ChecklistEntryMake("__familiar skeleton of crimbo past", url, ChecklistSubentryMake(title, description), 11)); } diff --git a/Source/relay/TourGuide/Items of the Month/2026/Legendary seal-clubbing club.ash b/Source/relay/TourGuide/Items of the Month/2026/Legendary seal-clubbing club.ash new file mode 100644 index 00000000..1b2f3fd2 --- /dev/null +++ b/Source/relay/TourGuide/Items of the Month/2026/Legendary seal-clubbing club.ash @@ -0,0 +1,100 @@ +//legendary seal-clubbing club +RegisterTaskGenerationFunction("IOTMLegendaryClubGenerateTasks"); +void IOTMLegendaryClubGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries) +{ + if ($item[legendary seal-clubbing club].available_amount() == 0) return; + string url = "inventory.php?ftext=legendary+seal-clubbing+club"; + string [int] description; + string title; + + { int nextWeekTurn = get_property_int("clubEmNextWeekMonsterTurn") + 8; + int nextWeekTimer = (nextWeekTurn - total_turns_played()); + + string image_name = get_property("clubEmNextWeekMonster"); + string [int] description; + string [int] warnings; + + // Adding a few warnings for the sake of it + boolean [string] holidayTracker = getHolidaysToday(); + + if (holidayTracker["El Dia de Los Muertos Borrachos"] == true || holidayTracker["Feast of Boris"] == true) { + warnings[1] = 'Be careful -- Borrachos & Feast of Boris wanderers can show up instead of your Legendary club wanderer!'; + } + + if (nextWeekTurn <= total_turns_played() && (image_name != "")) + { + description.listAppend(HTMLGenerateSpanFont("Wandering monster", "orange")); + + // Only show warnings if it's right about to happen + foreach i, warning in warnings { + description.listAppend(HTMLGenerateSpanFont("|* ➾ "+warning, "red")); + } + task_entries.listAppend(ChecklistEntryMake("__monster " + image_name, "", ChecklistSubentryMake("Legendary club: " + get_property("clubEmNextWeekMonster") + HTMLGenerateSpanFont(" now", "red"), "", description), -11)); + } + else if (nextWeekTurn -1 == total_turns_played() && (image_name != "")) + { + description.listAppend(HTMLGenerateSpanFont("Wandering monster", "orange")); + task_entries.listAppend(ChecklistEntryMake("__monster " + image_name, "", ChecklistSubentryMake("Legendary club: " + get_property("clubEmNextWeekMonster") + HTMLGenerateSpanFont(" in 1 more adv", "blue"), "", description), -11)); + } + else if (image_name != "") + { + description.listAppend(nextWeekTimer + " advs until Next Week fight."); + optional_task_entries.listAppend(ChecklistEntryMake("__monster " + image_name, "", ChecklistSubentryMake("Legendary club: " + get_property("clubEmNextWeekMonster") + "", "", description), 10)); + } + } + + if (lookupItem("legendary seal-clubbing club").equipped_amount() > 0) + { + int clubBattlefieldsLeft = clampi(5 - get_property_int("_clubEmBattlefieldUsed"), 0, 5); + int clubNextWeeksLeft = clampi(5 - get_property_int("_clubEmNextWeekUsed"), 0, 5); + int clubBackwardsLeft = clampi(5 - get_property_int("_clubEmTimeUsed"), 0, 5); + + if (clubBattlefieldsLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Battlefield Clubs left.", "red")); + } else { + description.listAppend(clubBattlefieldsLeft + " Battlefield Clubs. Weird Saber Force."); + } + if (clubNextWeeksLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Next Week Clubs left.", "red")); + } else { + description.listAppend(clubNextWeeksLeft + " Next Week Clubs. 7-turn Wanderer."); + } + if (clubBackwardsLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Backwards Clubs left.", "red")); + } else { + description.listAppend(clubBackwardsLeft + " Backwards Clubs. Free kill NO ITEMS."); + } + task_entries.listAppend(ChecklistEntryMake("__item legendary seal-clubbing club", url, ChecklistSubentryMake(HTMLGenerateSpanFont("Legendary seal-clubbing club skills", "orange"), description), -11).ChecklistEntrySetIDTag("LSSC skills")); + } +} + +RegisterResourceGenerationFunction("IOTMLegendaryClubGenerateResource"); +void IOTMLegendaryClubGenerateResource(ChecklistEntry [int] resource_entries) +{ + if ($item[legendary seal-clubbing club].available_amount() == 0) return; + string url = "inventory.php?ftext=legendary+seal-clubbing+club"; + string [int] description; + string title; + + int clubBattlefieldsLeft = clampi(5 - get_property_int("_clubEmBattlefieldUsed"), 0, 5); + int clubNextWeeksLeft = clampi(5 - get_property_int("_clubEmNextWeekUsed"), 0, 5); + int clubBackwardsLeft = clampi(5 - get_property_int("_clubEmTimeUsed"), 0, 5); + + if (clubBattlefieldsLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Battlefield Clubs left.", "red")); + } else { + description.listAppend(clubBattlefieldsLeft + " Battlefield Clubs. Weird Saber Force."); + } + if (clubNextWeeksLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Next Week Clubs left.", "red")); + } else { + description.listAppend(clubNextWeeksLeft + " Next Week Clubs. 7-turn Wanderer."); + } + if (clubBackwardsLeft == 0) { + description.listAppend(HTMLGenerateSpanFont("No Backwards Clubs left.", "red")); + } else { + description.listAppend(clubBackwardsLeft + " Backwards Clubs. Free kill NO ITEMS."); + } + + resource_entries.listAppend(ChecklistEntryMake("__item legendary seal-clubbing club", url, ChecklistSubentryMake(HTMLGenerateSpanFont("Legendary seal-clubbing club skills", "orange"), description), 1).ChecklistEntrySetIDTag("LSSC skills")); +}