missingManuel.ash - Yet Another Manuel Script!

The names of the extra zones I created are clashing with the names of the real zones. The script first checks the real zones, and it happens that Fear Man's Level (I think) shows up first, so it processes all the postAreas starting from Fear Man's Level before it actually checks the extra zones. When the monsters are properly added to the zones in Mafia, I can remove the extra areas and the zones will appear in the order they would show up normally in Mafia. For now, if you want to order them, you can rename the extra areas by adding a space at the end (so it doesn't look too ugly), fix the postAreas to use the names with the spaces at the end, and add the line
Code:
printLocation("The Gourd ", extraAreas["The Gourd "]);
after the line
Code:
printLocation("Bees Hate You", extraAreas["Bees Hate You"]);
in the CheckManuel method.
 
I did as you said and it works very nicely indeed. Thank you. Now I've got all my Psychoses in the same place and properly ordered so that they can gang up on me.

In case you or someone else approves of my suggestion and wants to add it to the current version, I'll save a bit of typing with a quick copy-paste.

Code:
	extraAreas["The Gourd "] = $monsters[canned goblin conspirator, Fnord the Unspeakable, goblin conspirator, spider conspirator, spider-goblin conspirator, tin can conspirator, tin spider conspirator];
	extraAreas["Anger Man's Level "] = $monsters[frustrating knight, rage flame, ticking time bomb, Anger Man];
	extraAreas["Fear Man's Level "] = $monsters[animated possessions, morbid skull, natural spider, Fear Man];
	extraAreas["Doubt Man's Level "] = $monsters[judgmental eye, reproachful heart, work hat, Doubt Man];
	extraAreas["Regret Man's Level "] = $monsters[ancient ghost, contemplative ghost, lovesick ghost, Regret Man];
	extraAreas["The Nightmare Meatrealm " ] = $monsters[bacon snake, cold cutter, groast, pork butterfly, salaminder, The Beefhemoth];
	extraAreas["A Kitchen Drawer "] = $monsters[Butterknife of Regret, Cookie Cutter of Loneliness, Creme Brulee Torch of Fury, Spatula of Despair, Whisk of Misery];
	extraAreas["A Grocery Bag "] = $monsters[bag of Potatoes of Security, box of Batter Mix of Hope, bundle of Meat of Happiness, carton of Eggs of Confidence, loaf of Bread of Wonder];
	extraAreas["The Old Man's Bathtime Adventure "] = $monsters[fearsome giant squid, ferocious roc, giant man-eating shark, Bristled Man-O-War, The Cray-kin, Deadly Hydra];
	extraAreas["Triad Factory "] = $monsters[clean-room daemon, fabricator guài, triad code wizard, The Sierpinski brothers];
	extraAreas["Shiawase-Mitsuhama Building "] = $monsters[salaryninja, security robot, yakuza guard, Chief Electronic Overseer];
	extraAreas["Chinatown Shops "] = $monsters[grinning pork bun, lucky cat statue, roasted duck golem, yakuza courier];
	extraAreas["Chinatown Tenement "] = $monsters[desperate gold farmer, rabid MMO addict, yakuza thug, The Server, White Bone Demon];
	//extraAreas[""] = $monsters[];

	postAreas["The Gourd "] = "Anger Man's Level ";
	postAreas["Anger Man's Level "] = "Doubt Man's Level ";
	postAreas["Doubt Man's Level "] = "Fear Man's Level ";
	postAreas["Fear Man's Level "] = "Regret Man's Level ";
	postAreas["Regret Man's Level "] = "The Nightmare Meatrealm ";
	postAreas["The Nightmare Meatrealm "] = "The Old Man's Bathtime Adventure ";
	postAreas["The Old Man's Bathtime Adventure "] = "A Kitchen Drawer ";
	postAreas["A Kitchen Drawer "] = "A Grocery Bag ";
	postAreas["A Grocery Bag "] = "Chinatown Shops ";
	postAreas["Chinatown Shops "] = "Triad Factory ";
	postAreas["Triad Factory "] = "Shiawase-Mitsuhama Building ";
	postAreas["Shiawase-Mitsuhama Building "] = "Chinatown Tenement ";
 
Last edited:
Version 1.8 is up.

The Ninja Snowman Assassin was showing up twice. Got that fixed. I ended up patching the Lonely Construct. It's not perfect, but it should at least detect that you have 2 of them researched, though if you only have one, it can't tell which one it is.
 
I've gotten a lot of use out of this script, but as usual, I'm completely incapable of not tinkering with it... So I've added the ability to check just the monsters from a single zone, which saves a bunch of time and server hits.
PHP:
boolean is_alphabetic(string chr)
{
    matcher alpha = create_matcher("[a-zA-Z]", chr);
    return find(alpha);
}

void CheckManuel(string location_name)
{
    if (location_name != "all" && location_name.to_location() == $location[none]) {
        abort("I don't understand which zone " + location_name + " is.");
    }

    CheckVersion();
    printAll = user_confirm("Display full list?");

    loadData();

    print("Checking Monster Manuel...", "blue");
    if (location_name == "all") {
        parseall();
    } else {
        boolean [string] first_letters;
        foreach i, m in get_monsters(location_name.to_location()) {
            string letter = m.char_at(0).to_lower_case();
            if (!letter.is_alphabetic()) letter = "-";
            first_letters [letter] = true;
        }
        foreach l in first_letters {
            if (l.is_alphabetic()) {
                print("Checking: " + l.to_upper_case());
            } else {
                print("Checking: Other");
            }
            parseManuel("questlog.php?which=6&vl=" + l);
        }
    }
    print("Done checking Monster Manuel!", "blue");

    print("=================================");
    
    foreach loc in $locations[] if (location_name == "all" || location_name.to_location() == loc)
    {
<nothing new here>
    }

    if (location_name == "all") {
        printLocation("Bees Hate You", extraAreas["Bees Hate You"]);

        foreach area in extraAreas
        {
            if (!(processedExtraAreas contains area))
            {
                printLocation(area, extraAreas[area]);
            }
        }

        printLocation("Unsorted", $monsters[]);

        foreach monst in m_factoids
        {
            print("Unrecognized: " + monst + " (" + (3 - m_factoids[monst]) + ")");
        }
    }

    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 (string location_name)
{
    string page = visit_url("questlog.php?which=6");
    if (contains_text(page, "[Monster Manuel]"))
    {
        CheckManuel(location_name);
    }

etc...

This is a pretty quick and dirty proof of concept so far, because it doesn't handle extra monsters or extra areas yet. But even in its current unfinished state it's pretty sweet for hunting down factoids in regular areas.
 
The script isn't recognizing that I've already have all the factoids for:
Lumpy, the Sinister Sauceblob (Inner Sanctum) (3)
Lumpy, the Sinister Sauceblob (The Nemesis' Lair) (3)
Lumpy, the Sinister Sauceblob (Volcanic Cave) (3)
 
Last edited:
All the content is procedurally generated and doesn't have factoids.

Nope!

HotStuff said:
Alright, alright.

Factoids have been added, though they are for tiers of monsters rather than individualized for each of the umpteen million possible monster types you might encounter.

Ranger Bill XX said:
Unrelated, I've found 5 new factoids:
Video Game Boss
Video Game Miniboss
Video Game Minion (moderate)
Video Game Minion (strong)
Video Game Minion (weak)
 
Oh cool, I haven't adventured there or read that thread since the first day it was released.
 
Ok, this is weird. This is my manuel score on my char:

You have casually researched 29 creatures.
You have thoroughly researched 36 creatures.
You have exhaustively researched 948 creatures.

This is what missingmanuel is reporting:

You have casually researched 27 creatures.
You have thoroughly researched 36 creatures.
You have exhaustively researched 954 creatures.

I know the 2 missing casuals are from the new Jarlsberg path. But where did I end up with +6 exhaustive?
 
Hm, nope on both fronts. A search told me that these were the only castle enemies listed:

Code:
=================================
[Giant's Castle (Basement)]
Alphabet Giant (0)
Fitness Giant (0)
Furry Giant (0)
Neckbeard Giant (0)
=================================
[Giant's Castle (Ground Floor)]
Foodie Giant (0)
Possibility Giant (0)
Procrastination Giant (0)
Renaissance Giant (0)
=================================
[Giant's Castle (Top Floor)]
Goth Giant (0)
Punk Rock Giant (0)
Raver Giant (0)
Steampunk Giant (0)
=================================
 
Back
Top