Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0c2525a
bcz tiles
docrostov Apr 8, 2026
7c9e339
seadent tiles
docrostov Apr 8, 2026
85f3e85
a few new tiles
docrostov Apr 8, 2026
a6a322a
committing some tile specs
docrostov Apr 8, 2026
5d5c773
Merge branch 'main' of https://github.com/loathers/TourGuide into spr…
docrostov Apr 8, 2026
813de99
fast forward to main + proper __iotms_usable[] usage
docrostov Apr 8, 2026
cac69bd
few new todos
docrostov Apr 8, 2026
156b839
attempting to add shrunken head to location bar
docrostov Apr 8, 2026
77dd0c5
fat fingered a dumb find/replace to snojo
docrostov Apr 8, 2026
101972b
location bar upgrade; bofa/zombie -> item table
docrostov Apr 9, 2026
ce679ef
iotm usability display fix
docrostov Apr 9, 2026
f34771d
spade tile spec
docrostov Apr 9, 2026
1076d51
few last location bar tweaks...
docrostov Apr 9, 2026
75effdc
heartstone tile
docrostov Apr 10, 2026
c72015b
archaeologist spade tile
docrostov Apr 10, 2026
108c05b
add ballroom to spade tile
docrostov Apr 10, 2026
42903a0
peridot tile + location bar peridot usage indicator
docrostov Apr 10, 2026
3fabf0e
shrunken head tile revamp w/ optional task
docrostov Apr 11, 2026
8e02760
baseball tile + updated banisher support
docrostov Apr 13, 2026
e5bee87
unrestricted clutter reduction
docrostov Apr 13, 2026
8fd6ef2
resolving multiple git issues
docrostov Apr 13, 2026
8208ba2
fixing bug identified on discord (wrong monster reference in cheddarM…
docrostov Apr 13, 2026
f3cc26a
forgot to remove last condition on vampfangs
docrostov Apr 13, 2026
94cb659
brand new lucky combination tile
docrostov Apr 13, 2026
ef56255
version push + fix to crafting tile
docrostov Apr 13, 2026
8f3b54b
bug sweep
docrostov Apr 13, 2026
475cab0
final bug sweep (?)
docrostov Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,16 @@ void IOTMPlasticVampireFangsGenerateResource(ChecklistEntry [int] resource_entri
url = "inventory.php?ftext=plastic+vampire+fangs";
}
}

else if ($item[Interview With You (a Vampire)].available_amount() > 0) {
fang_source = $item[Interview With You (a Vampire)];
url = "inventory.php?ftext=interview+with+you";
}

else {
else if ($item[plastic vampire fangs].available_amount() > 0) {
url = "place.php?whichplace=town";
if ($item[plastic vampire fangs].equipped_amount() == 0) {
url = "inventory.php?ftext=plastic+vampire+fangs";
}
}
else {
fang_source = $item[Interview With You (a Vampire)];
url = "inventory.php?ftext=interview+with+you";
}

// Show the Isabella interview option if it is valid for the user.

Expand Down
80 changes: 41 additions & 39 deletions Source/relay/TourGuide/Items of the Month/2016/Intergnat.ash
Original file line number Diff line number Diff line change
@@ -1,43 +1,45 @@
RegisterTaskGenerationFunction("IOTMIntergnatGenerateTasks");
void IOTMIntergnatGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
{
// Commenting out demon-finding intergnat task.
// TODO: refactor into new task that only generates if you happen to have the items needed for demon summoning in-run
// RegisterTaskGenerationFunction("IOTMIntergnatGenerateTasks");
// void IOTMIntergnatGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
// {

if (!get_property_boolean("demonSummoned") && __misc_state["in run"] && !__quest_state["Level 13"].state_boolean["king waiting to be freed"] && $familiar[intergnat].familiar_is_usable() && my_path().id != PATH_AVATAR_OF_SNEAKY_PETE)
{
//Should we show this if they aren't using the intergnat? ... Yes?
//demonName12, thin black candle, scroll of ancient forbidden unspeakable evil
string [int] reasons;
if (!get_property("demonName12").contains_text("Neil ") && my_level() < 13) //13 is +50% init... it's kind of useful? But not worth mentioning if they don't have it by this point?
{
reasons.listAppend("learn demon name");
}
if ($item[thin black candle].available_amount() < 3)
{
if ($item[thin black candle].available_amount() < 2)
reasons.listAppend("collect " + int_to_wordy(3 - $item[thin black candle].available_amount()) + " more thin black candles");
else
reasons.listAppend("collect One More Thin black candle");
}
if ($item[scroll of ancient forbidden unspeakable evil].available_amount() == 0)
{
reasons.listAppend("collect a scroll of ancient forbidden unspeakable evil");
}
if (reasons.count() > 0)
{
string [int] description;
description.listAppend(reasons.listJoinComponents(", ", "and").capitaliseFirstLetter() + ".");
string url = "";
string title = "Continue running Intergnat for demon summon";
if (my_familiar() != $familiar[intergnat])
{
url = "familiar.php";
title = "Possibly run Intergnat for demon summon";
}
//Don't use the intergnat icon, because animation is distracting:
optional_task_entries.listAppend(ChecklistEntryMake("__item thin black candle", url, ChecklistSubentryMake(title, "", description)).ChecklistEntrySetIDTag("Intergnat summon Neil"));
}
}
}
// if (!get_property_boolean("demonSummoned") && __misc_state["in run"] && !__quest_state["Level 13"].state_boolean["king waiting to be freed"] && $familiar[intergnat].familiar_is_usable() && my_path().id != PATH_AVATAR_OF_SNEAKY_PETE)
// {
// //Should we show this if they aren't using the intergnat? ... Yes?
// //demonName12, thin black candle, scroll of ancient forbidden unspeakable evil
// string [int] reasons;
// if (!get_property("demonName12").contains_text("Neil ") && my_level() < 13) //13 is +50% init... it's kind of useful? But not worth mentioning if they don't have it by this point?
// {
// reasons.listAppend("learn demon name");
// }
// if ($item[thin black candle].available_amount() < 3)
// {
// if ($item[thin black candle].available_amount() < 2)
// reasons.listAppend("collect " + int_to_wordy(3 - $item[thin black candle].available_amount()) + " more thin black candles");
// else
// reasons.listAppend("collect One More Thin black candle");
// }
// if ($item[scroll of ancient forbidden unspeakable evil].available_amount() == 0)
// {
// reasons.listAppend("collect a scroll of ancient forbidden unspeakable evil");
// }
// if (reasons.count() > 0)
// {
// string [int] description;
// description.listAppend(reasons.listJoinComponents(", ", "and").capitaliseFirstLetter() + ".");
// string url = "";
// string title = "Continue running Intergnat for demon summon";
// if (my_familiar() != $familiar[intergnat])
// {
// url = "familiar.php";
// title = "Possibly run Intergnat for demon summon";
// }
// //Don't use the intergnat icon, because animation is distracting:
// optional_task_entries.listAppend(ChecklistEntryMake("__item thin black candle", url, ChecklistSubentryMake(title, "", description)).ChecklistEntrySetIDTag("Intergnat summon Neil"));
// }
// }
// }

RegisterResourceGenerationFunction("IOTMIntergnatGenerateResource");
void IOTMIntergnatGenerateResource(ChecklistEntry [int] resource_entries)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ void IOTMTunnelOfLoveGenerateTasks(ChecklistEntry [int] task_entries, ChecklistE
RegisterResourceGenerationFunction("IOTMTunnelOfLoveGenerateResource");
void IOTMTunnelOfLoveGenerateResource(ChecklistEntry [int] resource_entries)
{

if (!get_property_boolean("_loveTunnelUsed")) {
resource_entries.listAppend(ChecklistEntryMake("__item pink candy heart", "place.php?whichplace=town_wrong", ChecklistSubentryMake("3 free L.O.V. dudes", "", "Free fights and useful items/buffs."), 5).ChecklistEntrySetCombinationTag("daily free fight").ChecklistEntrySetIDTag("Love tunnel free fights"));
}

//mostly the boomerang
//what does sokka throw? a boomeraang!

Expand Down
4 changes: 3 additions & 1 deletion Source/relay/TourGuide/Items of the Month/2018/BoomBox.ash
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ RegisterTaskGenerationFunction("IOTMBoomBoxGenerateTasks");
void IOTMBoomBoxGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
{
if (lookupItem("SongBoom&trade; BoomBox").available_amount() == 0) return;


// leaving this for aftercore because TES likes this tile, but it is not needed in-run
if (__misc_state["in run"]) 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@ void IOTMCommerceGhostGenerateTasks(ChecklistEntry [int] task_entries, Checklist
int commerce_statgain2 = (my_level() * 25) * (1.0 + numeric_modifier(my_primestat().to_string() + " Experience Percent") / 100.0);
boolean in_grey_you = my_class() == $class[grey goo]; // Grey You gains zero stats from your commerce ghost.

if (__misc_state["in run"] && $familiar[Ghost of Crimbo Commerce].familiar_is_usable() && !in_grey_you)
// reduce clutter by not showing this tile if user does not need it
if (!$familiar[Ghost of Crimbo Commerce].familiar_is_usable()) return;
if (my_level() > 12) return;
if (__iotms_usable[lookupItem("Neverending Party invitation envelope")]) return;
if ($item[Sept-Ember Censer].available_amount() > 0) return;

// only show if in-run
if (__misc_state["in run"] && !in_grey_you)
{
// Title
string url = "familiar.php";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ void IOTMDaylightShavingsHelmetGenerateTasks(ChecklistEntry [int] task_entries,
nextBeardBuffDescription = nextBeardBuff[nextBeardBuffName];
nextBeardBuffEffect = boldIfValuable(nextBeardBuffName) + ", " + to_buffer(nextBeardBuffDescription);
}
description.listAppend("Next shavings effect: <br>" + nextBeardBuffEffect);

// Commenting out because you can always use the tooltip.
// description.listAppend("Next shavings effect: <br>" + nextBeardBuffEffect);

string [int][int] tooltip_table;
for i from lastBeardIndex() + 1 to lastBeardIndex() + 11 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
RegisterResourceGenerationFunction("IOTTAlliedRadioBackpackGenerateResource");
void IOTTAlliedRadioBackpackGenerateResource(ChecklistEntry [int] resource_entries)
{
if ($item[allied radio backpack].available_amount() == 0) return;
if (__iotms_usable[lookupItem("allied radio backpack")]) return;

string url = "inventory.php?action=requestdrop&pwd=" + my_hash();
int radioDropsLeft = clampi(3 - get_property_int("_alliedRadioDropsUsed"), 0, 3);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
//blood cubic zirconia
RegisterTaskGenerationFunction("IOTMBloodCubicZirconiaGenerateTasks");
void IOTMBloodCubicZirconiaGenerateTasks(ChecklistEntry [int] task_entries, ChecklistEntry [int] optional_task_entries, ChecklistEntry [int] future_task_entries)
{
// TODO: reorganize/update tile; obvious changes include:
// - maybe update the cost matrix structure, seems a lil silly
// - add refract recommendation system
// - shorten resource tile by switching the less-useful uses into a hoverover
// - small wording tweaks
// - match pheromone styling to other banishes


if (__iotms_usable[lookupItem("blood cubic zirconia")]) return;
string url = "inventory.php?ftext=blood+cubic+zirconia";
string [int] description;
int bczRefracts = get_property_int("_bczRefractedGazeCasts");
int bczBullets = get_property_int("_bczSweatBulletsCasts");
int bczEquitys = get_property_int("_bczSweatEquityCasts");

int [int] bloodCast = {
0:11, 1:23, 2:37, 3:110, 4:230,
5:370, 6:1100, 7:2300, 8:3700, 9:11000,
10:23000, 11:37000, 12:420000, 13:1100000, 14:2300000,
15:3700000};
int refractCost = bloodCast[min(bczRefracts, 15)];
int bulletCost = bloodCast[min(bczBullets, 15)];
int equityCost = bloodCast[min(bczEquitys, 15)];

if (lookupItem("blood cubic zirconia").equipped_amount() > 0)
{
if (bczRefracts < 13) {
description.listAppend("Next Refract costs " + HTMLGenerateSpanFont(refractCost + "", "red") + " mys");
}
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");
}
else if (bczBullets >= 13) {
description.listAppend(HTMLGenerateSpanFont("Next Bullet costs " + bulletCost + " mox. EXPENSIVE!", "red") + "");
}
if (bczEquitys < 13) {
description.listAppend("Next Equity costs " + HTMLGenerateSpanFont(equityCost + "", "red") + " mox");
}
else if (bczEquitys >= 13) {
description.listAppend(HTMLGenerateSpanFont("Next Equity costs " + equityCost + " mox. EXPENSIVE!", "red") + "");
}
task_entries.listAppend(ChecklistEntryMake("__item blood cubic zirconia", url, ChecklistSubentryMake(HTMLGenerateSpanFont("BCZ: Blood Cubic Zirconia skills", "brown"), description), -11).ChecklistEntrySetIDTag("bcz important skills"));
}
}

RegisterResourceGenerationFunction("IOTMBloodCubicZirconiaGenerateResource");
void IOTMBloodCubicZirconiaGenerateResource(ChecklistEntry [int] resource_entries)
{
if ($item[blood cubic zirconia].available_amount() == 0) return;
string url = "inventory.php?ftext=blood+cubic+zirconia";
string [int] description;
int bczBaths = get_property_int("_bczBloodBathCasts");
int bczThinners = get_property_int("_bczBloodThinnerCasts");
int bczDials = get_property_int("_bczDialitupCasts");
int bczPheromones = get_property_int("_bczPheromoneCocktailCasts");
int bczSpinalTapas = get_property_int("_bczSpinalTapasCasts");
int bczGeysers = get_property_int("_bczBloodGeyserCasts");
int bczRefracts = get_property_int("_bczRefractedGazeCasts");
int bczBullets = get_property_int("_bczSweatBulletsCasts");
int bczEquitys = get_property_int("_bczSweatEquityCasts");

int [int] bloodCast = {
0:11, 1:23, 2:37, 3:110, 4:230,
5:370, 6:1100, 7:2300, 8:3700, 9:11000,
10:23000, 11:37000, 12:420000, 13:1100000, 14:2300000,
15:3700000};
int bathCost = bloodCast[min(bczBaths, 15)];
int thinnerCost = bloodCast[min(bczThinners, 15)];
int dialCost = bloodCast[min(bczDials, 15)];
int pheromoneCost = bloodCast[min(bczPheromones, 15)];
int tapasCost = bloodCast[min(bczSpinalTapas, 15)];
int geyserCost = bloodCast[min(bczGeysers, 15)];
int refractCost = bloodCast[min(bczRefracts, 15)];
int bulletCost = bloodCast[min(bczBullets, 15)];
int equityCost = bloodCast[min(bczEquitys, 15)];

description.listAppend("Next Refract costs " + HTMLGenerateSpanFont(refractCost + "", "red") + " mys");
description.listAppend("Next Bullet costs " + HTMLGenerateSpanFont(bulletCost + "", "red") + " mox");
description.listAppend("Next Equity costs " + HTMLGenerateSpanFont(equityCost + "", "red") + " mox");

description.listAppend("Next Geyser costs " + HTMLGenerateSpanFont(geyserCost + "", "brown") + " mus");
description.listAppend("Next Bath costs " + HTMLGenerateSpanFont(bathCost + "", "brown") + " mus");
description.listAppend("Next Dial costs " + HTMLGenerateSpanFont(dialCost + "", "brown") + " mys");
description.listAppend("Next Thinner costs " + HTMLGenerateSpanFont(thinnerCost + "", "brown") + " mus");
description.listAppend("Next Tapas costs " + HTMLGenerateSpanFont(tapasCost + "", "brown") + " mys");
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"));
}
}
Loading
Loading