Revision 16170 reports on the previously unknown monster ID and then reports the correct number of factoids you have for that monster.
Here is a (slightly) updated copy of mm.ash
Here is a (slightly) updated copy of mm.ash
Code:
script "missingManuel.ash";
static boolean [monster] blocked_monsters = $monsters[
Hockey Elemental, Count Bakula, Infinite Meat Bug, The Master of Thieves, Crazy Bastard, Baiowulf, Hypnotist of Hey Deze, The Temporal Bandit, Knott Slanding, Pooltergeist (Ultra-Rare), QuickBASIC Elemental, The Nuge,
The Whole Kingdom, The Hermit,
Don Crimbo, Edwing Abbidriel, Crys-Rock, Trollipop, The Colollilossus, The Fudge Wizard, The Abominable Fudgeman, Uncle Hobo, Underworld Tree,
Hammered Yam Golem, Soused Stuffing Golem, Plastered Can of Cranberry Sauce, Inebriated Tofurkey,
space beast matriarch,
The Darkness (blind),
CDMoyer's Butt, Hotstuff's Butt, Jick's Butt, Mr. Skullhead's Butt, Multi Czar's Butt, Riff's Butt,
Slime2, Slime3, Slime4, Slime5,
Ed the Undying (1), Ed the Undying (2), Ed the Undying (3), Ed the Undying (4), Ed the Undying (5), Ed the Undying (6), Ed the Undying (7),
Count Drunkula (Hard Mode), Falls-From-Sky (Hard Mode), Great Wolf of the Air (Hard Mode), Mayor Ghost (Hard Mode), The Unkillable Skeleton (Hard Mode), Zombie Homeowners' Association (Hard Mode),
wild seahorse,
giant pumpkin-head, large-headed werewolf, oddly-proportioned ghost,
All-Hallow's Steve, The Sagittarian, general seal, Frank "Skipper" Dan\, the Accordion Lord, Chef Boy\, R&D, spirit alarm clock,
Disorganized Files, Endless Conference Call, Hideous Slide Show, Tedious Spreadsheet, Unoptimized Database, Your Overflowing Inbox, Chatty Coworker, The Book Of Faces, The Tome Of Tropes, The Water Cooler, Totally Malicious 'Zine, The Best Game Ever,
Caveman Dan, Crimbomega];
boolean [monster] get_all_monsters()
{
boolean [monster] all_monsters = all_monsters_with_id();
// Remove uncopyable monsters that have a known id
// Here is how we would do it if KoLmafia had a "nocopy" proxy field
/*
foreach m in all_monsters {
if ( m.nocopy ) {
remove all_monsters[ m ];
}
}
*/
foreach m in blocked_monsters {
remove all_monsters[ m ];
}
return all_monsters;
}
void visit_page( string page )
{
print( page );
visit_url( "questlog.php?which=6&vl=" + page.to_lower_case() );
}
void visit_all()
{
flush_monster_manuel_cache();
visit_page("A");
visit_page("B");
visit_page("C");
visit_page("D");
visit_page("E");
visit_page("F");
visit_page("G");
visit_page("H");
visit_page("I");
visit_page("J");
visit_page("K");
visit_page("L");
visit_page("M");
visit_page("N");
visit_page("O");
visit_page("P");
visit_page("Q");
visit_page("R");
visit_page("S");
visit_page("T");
visit_page("U");
visit_page("V");
visit_page("W");
visit_page("X");
visit_page("Y");
visit_page("Z");
print("Now I know my ABCs!");
visit_url("questlog.php?which=6&vl=-");
}
int three, two, one, zero;
string GetLocName(string locName)
{
if (locName == "Foyer") return "Vanya's Castle";
if (locName == "A Well-Groomed Lawn") return "Landscaper's Map";
if (locName == "Post-War Junkyard") return "Junkyard";
if (locName == "1st Floor, Shiawase-Mitsuhama Building") return "Shiawase-Mitsuhama Building";
return locName;
}
boolean print_all = false;
boolean process_monster ( monster m, string loc, boolean print_header )
{
int missed = 3 - monster_factoids_available( m, true );
if (missed == 0) {
three += 1;
if ( !print_all ) {
return print_header;
}
}
if (missed == 1)
two += 1;
else if (missed == 2)
one += 1;
else if (missed == 3)
zero += 1;
if ( print_header ) {
print("[" + GetLocName(loc) + "]");
}
if (missed > 2) {
print(m + " {" + missed + "}", "red");
}
else {
print(m + " {" + missed + "}");
}
return false;
}
void CheckManuel ()
{
print_all = user_confirm("Display full list?");
print("Checking Monster Manuel...", "blue");
visit_all();
print("Done checking Monster Manuel!", "blue");
boolean [monster] all_monsters = get_all_monsters();
print("=================================");
boolean print_header;
foreach loc in $locations[] {
print_header = true;
monster [int] mon_list = get_monsters(loc);
foreach i, m in mon_list {
if ( m.id > 0 && all_monsters contains m ) {
print_header = process_monster( m, loc.to_string(), print_header );
remove all_monsters[ m ];
}
}
if ( !print_header ) {
print("=================================");
}
}
// Here is where we would process "Extra Areas" where we have
// manually inserted certain monsters.
print_header = true;
foreach m in all_monsters {
print_header = process_monster( m, "Unsorted", print_header );
}
if ( !print_header ) {
print("=================================");
}
print("");
print("You have casually researched " + one + " creatures.");
print("You have thoroughly researched " + two + " creatures.");
print("You have exhaustively researched " + three + " creatures.");
print("You have not researched " + zero + " creatures.");
print("Total creatures: " + (one + two + three + zero) + ".");
print("Done.", "blue");
}
void main ()
{
if ( !visit_url("questlog.php?which=6").contains_text( "[Monster Manuel]" )) {
print("Thank you, Mario, but your Monster Manuel is in another castle!", "blue");
print("Perhaps you should consider getting one?");
print("");
print("=================================");
print("[Every Single Area]");
print("NOTHING! ABSOLUTELY NOTHING!", "red");
print("=================================");
print("");
print("You have casually researched 0 creatures.");
print("You have thoroughly researched 0 creatures.");
print("You have exhaustively researched 0 creatures.");
print("You have not researched ANY creatures.");
print("Done.", "blue");
return;
}
CheckManuel();
}