thinking about ascension log parsing

For review of out of clan ascension logs and those in-clan logs that don't share our super secret strategies.

Moderator: Raccoon

Post Reply
User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

thinking about ascension log parsing

Post by bleary » Mon Nov 11, 2013 6:02 pm

I'm thinking about embarking on a project of starting some work on a web-based replacement for the ALV and on modifiying Mafia so that it'll add lines to the session logs to make them easier to parse and analyze. It seems to me that there's no good reason for Mafia not to be able to create verbose, easily machine-readable logs. Nor is there any good reason for a log parsing program attempt to figure out stuff that Mafia already knows.

With this in mind, I'm starting to think about what an ascension log should look like: what's essential and interesting about the ALV format, what seems to be filler, what's weird about the format, and what's missing. Here's a section from maddsurgeon's recent log:

Code: Select all

[307] Haunted Ballroom [0,0,194]
     -> Turn [307] He-Boulder
     => Level 10 (Turn 307)! (57/57/85)
[308-332] Fantasy Airship [297,261,681]
     +> [308] Got divine cracker
     +> [309] Got ocarina of space
     +> [311] Got barrel of gunpowder
     +> [317] Got Tissue Paper Immateria
     +> [321] Got metallic A, photoprotoneutron torpedo
     +> [323] Got Tin Foil Immateria
     +> [325] Got Gauze Immateria
     +> [326] Got Plastic Wrap Immateria
     +> [331] Got barrel of gunpowder
     +> [332] Got S.O.C.K.
     *> [312] Started hunting Quiet Healer
     *> [324] Started hunting Spunky Princess
     }> [322] Disintegrated Burly Sidekick
     -> Turn [310] Nanorhino
     -> Turn [311] He-Boulder
     -> Turn [314] Pair of Stomping Boots
     -> Turn [318] Fancypants Scarecrow
     -> Turn [321] He-Boulder
     -> Turn [322] Pair of Stomping Boots
     -> Turn [324] Fancypants Scarecrow
     -> Turn [330] Pair of Stomping Boots
     &> 9 / 9 free retreats
Here we see that madd spent turn 307 in the Ballroom, gained 194 moxie substats, and hit Level 10. I think the "(57/57/85)" indicates what his mus/mys/mox stats were at that point.

After this, he spends 24 turns in the Airship. 11 items are reported, 3 of which don't drop in the location (the divine cracker and the two barrels). After this, 8 familiar switches are reported. Finally, 9 free retreats are reported.

What's missing: It appears he ran into at least 33 encounters (possibly more) based on the number of runaways reported at the end of the location, but we know nothing about the exact number or what percentage were combats versus non-combats. The familiar switching, the item drops, and the runaways are presented out-of-order and with no information about the familiar weight or any active counters. Note that the location was started with the He-Boulder from turn 307, but this is not reported in the Airship section. It's also not clear whether he switched to the He-Boulder before or after turn 307 was spent in the Ballroom. Did we banish something with the Nanorhino? What mobs did we use the free runaways on? How much +item was he running? What dropped when the Burly Sidekick was disintegrated? We also get no information about what combat looked like during these encounters, how much +ML was being run, etc. etc.

Further, we might ask whether the information on quest progress is actually explaining what's going on.The immateria come from noncombats in a particular order, and they're all subject to a 5 turn cumulative delay. The log reveals little about the strategy used in completing the quest, and obscures what little it does reveal. We're not given any information about the runaways, the amount of +/-combat he was running when he encountered the immateria.

This section of the log could be reordered and edited to read:

Code: Select all

[307] Haunted Ballroom [0,0,194]
     => Level 10 (Turn 307)! (57/57/85)
[308-332] Fantasy Airship [297,261,681]
     -> [308] He-Boulder
     +> [308] Got divine cracker
     +> [309] Got ocarina of space
     -> [311] Nanorhino
     +> [311] Got barrel of gunpowder
     -> [312] He-Boulder
     *> [312] Started hunting Quiet Healer
     -> [315] Pair of Stomping Boots
     -> [319] Fancypants Scarecrow
     +> [321] Got metallic A, photoprotoneutron torpedo
     -> [322] He-Boulder
     }> [322] Disintegrated Burly Sidekick
     -> [323] Pair of Stomping Boots
     *> [324] Started hunting Spunky Princess
     -> [325] Fancypants Scarecrow
	 +> [326] Got Plastic Wrap Immateria
     -> [330] Pair of Stomping Boots
     +> [331] Got barrel of gunpowder
     +> [332] Got S.O.C.K.
     &> 9 / 9 free retreats
But I'd like to see something more like:

Code: Select all

[307] Haunted Ballroom [0,0,194]
	(307) Curtains [0,0,194] (-15% combat)
     => Level 10 (Turn 307)! (57/57/85)
[308-332] Fantasy Airship [297,261,681]
	 (25 adv / 37 enc / 9 noncom / 26 com) 
     [308-310] He-Boulder (11 lbs)
	     +> [309] Got ocarina of space
     [311] Nanorhino (11 lbs)
     	{311} Lobsterfrogman (romantic #2)
        	+> barrel of gunpowder (100%)
     [312-314] He-Boulder (11 lbs)
     	{312} Quiet Healer
        	*> started hunting 
     [315-318] Pair of Stomping Boots (20 lbs)
     	{316} Protagonist
    		&> free retreat [boots (3/4)]
	    {316} Irritating Series of Random Encounters
    	    &> free retreat [boots (4/4)]
	    (317) Gesundheitgeist! (-5% combat) [delay +5]
     [319-321] Fancypants Scarecrow (28 lbs)
     	{312} MagiMechTech MechaMech
        	 +> metallic A (100%), photoprotoneutron torpedo (100%)
     [322] He-Boulder (11 lbs)
    	{322} Protagonist
        	 &> free retreat [parasol #2]
	    {322} Burly Sidekick
    	     -> disintegrated by he-boulder
        	 +> armgun, cocoa eggshell fragment, Mohawk wig, tiny house
     {323-324} Pair of Stomping Boots (35 lbs)
     	(323) Don't Chew on That Spirit! (-5% combat) [delay +5]
     	{324} Irritating Series of Random Encounters
    	    &> free retreat [boots (5/7)]
     	{324} Irritating Series of Random Encounters
    	    &> free retreat [boots (6/7)]
     	{324} Irritating Series of Random Encounters
    	    &> free retreat [boots (7/7)]
	    {324} Spunky Princess
    	    *> started hunting
     {325-329} Fancypants Scarecrow (28 lbs)
    	(325) The Most Absorbent Spirit Ever (-15% combat) [delay +3]
     	(326) Rip Rop Wrappety Do (-15% combat) [delay +1]
     {330-332} Pair of Stomping Boots (30 lbs)
	     {331} Lobsterfrogman (romantic #3)
		     +> barrel of gunpowder (100%)
		 (332) F-F-Fantastic! (-15% combat) [delay +0]
     
It's a lot more longer and denser, but seems to me to have more actual useful information. Thoughts?
Image

User avatar
lostcalpolydude
Forum Maestro
Posts: 2940
Joined: Wed Apr 23, 2008 6:54 pm

Re: thinking about ascension log parsing

Post by lostcalpolydude » Mon Nov 11, 2013 6:12 pm

As a starting comment, KoL doesn't make it possible to reliably track all free retreats. As I recall, there is no message if you use a free runaway in Dis or the Haiku Dungeon.

It's possible that some of the people that posted here would be up for helping out, if an updated log parser gets going.
bmaher: Softcore character
lostcalpolydude: Hardcore character (abandoned)

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Wed Nov 27, 2013 10:58 am

As an update on my quixotic endeavor to bring improved logging and parsing to the kingdom:

I've managed to patch mafia so that it'll dump some machine-readable data into the session log, in JSON format. This will allow future log parsers to concentrate on analyzing the data, rather than attempting to parse a textual log or reconstruct the state of the game at various points. By including all of this internal data, log parsers will be able to report on things like average combat percentage modifiers and item drop bonuses over quests, whether particular quest-essential item drops were capped, levels of relevant elemental resistance in certain zones, the amount of +ML being used at various times, etc. I'm still working on figuring out how best to get Mafia to log choice adventures and noncombats, as well as consumption of food/booze/spleen, and in drumming up some interest into actually incorporating the change into Mafia itself. See http://kolmafia.us/showthread.php?14262 ... le-logging

These data dumps tentatively look like this:

Code: Select all

@@JSONSTATUS-B64Z
eJxVUu1u3CAQfJWK305l/MXZr1JVEcFrGR0GB3Au11PevQP4WkX+4WXZHWZm98HeZKDNfWpiUztUbN3Z
NPCKxcPbEFcd/GHZxBukQtTqSj6w6Vdd4ftdsbOx6yo2o/DKphrJe6qURsc7mxpc0fuh941sZNODLXLT
Rkufk2jlbV8heaVV2jlkgF3aGBJqjYNblnSTL1YJiCZBSqUaVIyc55gjHrqSbyGgrkXFlLNRakueTX3f
Q5uSfv4RDNEHZbgbyd1B3XDh4KC8u1m3xNU7S4VIWLXHi/UXGDozk39d8+/pwOnCLO//rRorZvCAASy6
DmOKJ5Sod70ARy9v3yzqOAryGI6gDKjxMTk760Vntx/MU9AhSqsoH4PRW1GgQKcwjWTVWsLdueu9+OVi
SRmSf6gImWUaZ/Z8O4nioCNtCJqf/TiIToi+6UYxjE/iTX5re0vxSyq3GlGfhKFfpOkX9KTtVNFe0rX8
3DBlniZZglPqtx2pS2NZJiwEhvpEaRrsz7KQilk6HzB2pITAyBveie7SDp34qv7tFQA4CuT8gYU7fHKM
j0Nmsj6ZhB1LYBPjv6Ex58o=
JSON@@
@@JSONINV-B64Z
eJw9Ukm2BCEIu4vrXggyWVfr13f/fhNqxWCEEPgOmXONRz9jrT0eOdZhYjzrM8SZTYDqmrS8WdNrZKff
/HGSALkvMYHQKcnEDHxNWD0/8xjTQowCknuhdm5DazyzYSF0d0Om8/OCK0E7O02+ieemgF+ogA82Fy06
lZ58nL5COoCpWPfPdsB/lUFPCdCW2QB8FWEcr9OI6KFCW6zXwVZ2N1ly1xOSeFClIlKUYjJEBdvkJ0XB
MuBwY2d1dxGygzGlVnNODv6FzmoQcc22vJtJihPwUJd2UNF3ApKcuxiCjy6GqMczkUXau2V8B9reEziw
UdZL2S0oRRiPn5CCc7BzBtUODyLqzmixb2V1xB7QxiKalSPTqxPevf93+P0BIJWfYA==
JSON@@


[122] The Haunted Library
Encounter: banshee librarian
Round 0: Authority wins initiative!
Round 1: Macrinus is just skin and bones. Well, slime and slime, technically, but still -- you should feed him!
Round 1: Authority attacks!
Round 2: banshee librarian takes 126 damage.
Round 2: Macrinus tosses a tureen of hot gravy at her, dealing 18 damage.
Round 2: banshee librarian takes 18 damage.
Round 2: Authority wins the fight!
After Battle: Macrinus hops around, dancing a jig accompanied by wet squelching noises.
You gain 8 Muscleboundness
You gain 14 Mysteriousness
You gain 21 Roguishness
You gain a Moxie point!
@@JSONCOMBAT
{"adventure":104,"monster":"banshee librarian","rounds":[{"monster status":{"defense":53,"hp":76,"attack":64}},{"monster status":{"defense":53,"hp":76,"attack":64},"player action":"attack"},{"familiar damage":18,"monster change":{"hp":[-126,-18]},"substats":[8,14,21]}],"outcome":"victory"}
JSON@@
@@JSONINFO
{"adv":-1}
JSON@@
The encoded portions are compressed in order to avoid spamming the log. One is player status in a format that mimics the API 'status' call (plus additional 'modifiers' data calculated by kolmafia), and the other is kolmafia's best understanding of the player inventory. They decode to:

Code: Select all

{'adventures': 196,
 'basemoxie': 36,
 'basemuscle': 19,
 'basemysticality': 20,
 'daysthisrun': 9,
 'drunk': 0,
 'effects': {'162': 2, '771': 2147483647},
 'equipment': {'acc1': 4644,
                'acc2': 4911,
                'acc3': 6007,
                'card sleeve': 0,
                'container': 5556,
                'crownofthrones': 0,
                'fakehands': 0,
                'familiarequip': 4135,
                'hat': 224,
                'offhand': 0,
                'pants': 4400,
                'shirt': 0,
                'weapon': 6815},
 'familiar': 112,
 'folder_holder': [0, 0, 0, 0, 0],
 'full': 0,
 'hp': 61,
 'level': 6,
 'maxhp': 100,
 'maxmp': 100,
 'meat': 4574,
 'modifiers': {'combat': -5,
                'da': 125,
                'dr': 0,
                'famlevel': 5,
                'init': 50,
                'item': 52.59674775249769,
                'meat': 20,
                'ml': 7,
                'resistances': {'cold': 0,
                                 'hot': 0,
                                 'sleaze': 0,
                                 'slime': 0,
                                 'spooky': 0,
                                 'stench': 0}},
 'moxie': 44,
 'mp': 10,
 'muscle': 22,
 'mysticality': 24,
 'rawmoxie': 1351,
 'rawmuscle': 380,
 'rawmysticality': 410,
 'spleen': 0,
 'stickers': [0, 0, 0],
 'turnsthisrun': 121}


{"214": 1, "213": 1, "134": 1, "6006": 1, "25": 7, "27": 2, "6002": 1, "6847": 1, "403": 1, "4": 1, "2017": 1, "3831": 3, "1793": 1, "1794": 2, "1957": 2, "1956": 1, "2": 1, "1959": 1, "1958": 1, "50": 1, "3843": 2, "829": 6, "6252": 1, "6251": 1, "199": 1, "197": 7, "310": 1, "192": 1, "81": 3, "5560": 1, "5561": 1, "5562": 1, "5563": 1, "3": 1, "7": 1, "308": 1, "309": 1, "2283": 1, "305": 1, "306": 1, "6005": 1, "588": 1, "246": 1, "6175": 1, "38": 2, "37": 2, "36": 3, "35": 1, "4958": 1, "5978": 1, "1245": 1, "1003": 2, "339": 1, "258": 3, "1987": 1, "1983": 1, "1980": 2, "602": 1, "182": 1, "181": 1, "184": 1, "6": 1, "402": 1, "2428": 1, "196": 2, "469": 2, "468": 3, "560": 1, "563": 1, "1356": 2, "566": 2, "98": 1, "5557": 1, "5559": 1, "5558": 1, "11": 1, "10": 1, "16": 2, "19": 1, "4666": 1, "741": 1, "559": 1, "747": 1, "159": 1, "556": 1, "238": 1, "879": 1, "45": 1, "42": 1, "1": 1, "9": 1, "141": 1, "77": 2, "76": 1, "75": 1, "74": 1, "70": 1, "4711": 1, "5554": 1, "1977": 2, "1975": 2, "49": 5, "4718": 1, "470": 2, "471": 1, "476": 1, "1764": 1}
source: http://introvert.net/2013/11/machinelog ... 1alpha.zip

User avatar
lostcalpolydude
Forum Maestro
Posts: 2940
Joined: Wed Apr 23, 2008 6:54 pm

Re: thinking about ascension log parsing

Post by lostcalpolydude » Wed Nov 27, 2013 11:20 am

In that combat output, the familiar damage looks like a separate round instead of happening on the same round as the attack, right?

What would item acquisition look like, either mid-combat or at the end of combat? Or from an NPC store, for that matter, or consumed when creating other items?

I'll likely be the one adding this stuff to mafia eventually, but since I'm not writing a parser I'm curious what you have in mind.
bmaher: Softcore character
lostcalpolydude: Hardcore character (abandoned)

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Wed Nov 27, 2013 11:42 am

lostcalpolydude wrote:In that combat output, the familiar damage looks like a separate round instead of happening on the same round as the attack, right?
It looks like Mafia logs the player choice of action in one round, and then the results appear in the next. (Round 1: Authority attacks! Round 2: banshee librarian takes 126 damage.) Because I'm not that familiar with mafia's internals, I haven't made any heroic efforts to improve the way Mafia does what it already does, and I also have probably inserted my logging hooks in suboptimal parts of combat logging.
What would item acquisition look like, either mid-combat or at the end of combat?
Let me find a combat with an item drop in it for you. Here's one where I pickpocketed a sonar (and 5 meat!) and an enchanted bean dropped. Clearly, I don't have it properly logging pickpocket attempts, even though the item gets logged.

Code: Select all

[67] The Beanbat Chamber
Encounter: beanbat
Round 0: bleary wins initiative!
Round 1: bleary tries to steal an item!
You acquire an item: sonar-in-a-biscuit
You gain 5 Meat.
Round 2: bleary attacks!
Round 3: beanbat takes 31 damage.
Round 3: bleary wins the fight!
You gain 34 Meat
After Battle: my man godfrey does a half-hearted little dance, grumbling. "Don't you have any proper trousers? If the lads from my club should witness this, I'd hear no end of it."
You acquire an item: enchanted bean
You gain 2 Muscleboundness
You gain 2 Magicalness
You gain 8 Sarcasm
@@JSONCOMBAT
{"adventure":33,"monster":"beanbat",
"rounds":[{"monster status":{"defense":18,
                 "hp":18,"attack":21}},
               {"monster status":{"defense":18,"hp":18,"attack":21}},
               {"monster status":{"defense":18,"hp":18,"attack":21},
                "player action":"attack",
                "meat":5,
                "item":563},
               {"monster change":{"hp":-31},
                "item":186,"meat":34,
                "substats":[2,2,8]}],
"outcome":"victory"}
JSON@@
Or from an NPC store, for that matter, or consumed when creating other items?
Right now, these look like this:

Code: Select all

buy 1 Knob Goblin seltzer for 76 each from The Knob Dispensary
You acquire an item: Knob Goblin seltzer
You spent 76 Meat
@@JSONINFO
{"meat":-76,"item":344}
JSON@@

use 1 Knob Goblin seltzer
You gain 11 Mojo Points
@@JSONINFO
{"player change":{"mp":11}}
JSON@@
@@JSONINFO
{"item":-344}
JSON@@

cast 1 Ur-Kel's Aria of Annoyance
You acquire an effect: Ur-Kel's Aria of Annoyance (duration: 20 Adventures)
@@JSONINFO
{"effect":[["Ur-Kel's Aria of Annoyance",20]]}
JSON@@
@@JSONINFO
{"player change":{"mp":-30}}
JSON@@
Which is to say, they're not quite right yet. I've hooked into ResultProcessor.tallyResult(), but my code isn't great at figuring out when more than one thing is happening at once and logging it all together. Again, I'm figuring out Mafia's internals as I go, and it's tough sledding.

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Sun Dec 01, 2013 12:47 am

Eleron needled me a bit today in-game on this, and I've encountered a little push-back from the mafia devs. If, indeed, there's no prospect of getting machine-readable data into the session logs, and any machine-readable info needs to be kept in separate files, it makes sense to re-evaluate the format a bit, and consider broader aims, like some compatibility with kolproxy.

To the best of my understanding, kolproxy has two kinds of logs. One is the database it maintains on the client-side, which contains almost (?) every pageload proxy performs. The schema looks like:

Code: Select all

CREATE TABLE pageloads(idx INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, time TEXT NOT NULL, statusbefore TEXT NOT NULL, statusafter TEXT, statebefore TEXT, stateafter TEXT, sessionid TEXT NOT NULL, requestedurl TEXT NOT NULL, parameters TEXT, retrievedurl TEXT, pagetext TEXT);
Where 'statusbefore' and 'statusafter' are the contents of the KoL 'status' API call, 'statebefore' and 'stateafter' are internal kolproxy variables (I think), and 'pagetext' is the html returned from the server.

This is obviously a bit unwieldy as a log, so kolproxy reduces it (and here it's not clear to me whether this happens on the client side or on Eleron's server) to an array of simpler JSON objects for analysis/presentation. Each one has the properties 'statusafter', 'fromurlpath', 'title', 'urlpath', 'mcd', 'statusbefore', 'daysthisrun', and 'zonename'. The two status structures are subsets of the API result. (It's not yet clear to me why 'mcd' and 'daysthisrun' get promoted out of the status structure). 'zonename' is present even when the logged event isn't a visit to a zone. These core properties are enough to create a simple overview of a run.

kolproxy also occasionally adds the properties new_fight, lost_effects, gained_effects, item, page_redirect, encounter_source, new_runstate, fired_romantic_arrow and pulls. 'item' seems to be used for some item usages (like consumption or photocopied monsters) but many (hair spray, e.g.) are not reported. Not every effect is tracked by lost_ and gained_effects, and the subset of the status structures don't contain the current effects, intrinsics, or equipment. There may be more combat events reported than just the romantic arrow, but that's the only one I saw. It ends up looking like a bunch of these, sometimes with multiple logged events per combat. Here's one where a guy fights a tan gnat on turn 497 and gains 21 mp, some substats, and some meat:

Code: Select all

  {
    "statusafter": {
      "familiar": {"pic": "gcube", "id": 171, "famlevel": 3},
      "hp": 78,
      "maxhp": 82,
      "locked": "fight",
      "turnsthisrun": 496,
      "rawmoxie": 6512,
      "rawmysticality": 13522,
      "meat": 14485,
      "maxmp": 234,
      "adventures": 96,
      "rawmuscle": 6377,
      "mp": 188
    },
    "urlpath": "/fight.php",
    "fromurlpath": "/adventure.php",
    "daysthisrun": 3,
    "new_fight": true,
    "title": "a Tan Gnat",
    "mcd": 10,
    "statusbefore": {
      "familiar": {"pic": "gcube", "id": 171, "famlevel": 3},
      "hp": 78,
      "maxhp": 82,
      "locked": "cancelable-choice",
      "turnsthisrun": 496,
      "rawmoxie": 6512,
      "rawmysticality": 13522,
      "meat": 14485,
      "maxmp": 234,
      "adventures": 96,
      "rawmuscle": 6377,
      "mp": 188
    },
    "zonename": "The Palindome"
  },
  {
    "statusafter": {
      "familiar": {"pic": "gcube", "id": 171, "famlevel": 4},
      "hp": 78,
      "maxhp": 82,
      "locked": false,
      "turnsthisrun": 497,
      "rawmoxie": 6534,
      "rawmysticality": 13564,
      "meat": 14509,
      "maxmp": 234,
      "adventures": 95,
      "rawmuscle": 6388,
      "mp": 209
    },
    "urlpath": "/fight.php",
    "fromurlpath": "/fight.php",
    "daysthisrun": 3,
    "title": "a Tan Gnat",
    "mcd": 10,
    "statusbefore": {
      "familiar": {"pic": "gcube", "id": 171, "famlevel": 3},
      "hp": 78,
      "maxhp": 82,
      "locked": "fight",
      "turnsthisrun": 496,
      "rawmoxie": 6512,
      "rawmysticality": 13522,
      "meat": 14485,
      "maxmp": 234,
      "adventures": 96,
      "rawmuscle": 6377,
      "mp": 188
    },
    "zonename": "The Palindome"
  }

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Sun Dec 01, 2013 6:16 pm

So, a proposed log format:

Code: Select all

[
    {
	"title": "monster name, noncombat title, or other descriptive text"
	"statusbefore": {}
	"statusafter": {}

	"location": "(optional) name of encounter location"
	"urlpath": "(optional) source of this event"
	"fromurlpath": "(optional) source of redirect"

	"parsedinfo": [{}, {}, {}, ...]
    }
    ...
]
I've rewritten my code to begin dropping JSON in a distinct file. See the diff and the java class at http://introvert.net/2013/11/machinelog/

It's becoming clear to me that I don't really understand how Mafia works, as I am having real trouble figuring out how to get it to properly log redirects. There may be threading involved? Sigh.

Lilac
Just Plain Old Pie
Posts: 3
Joined: Thu Sep 09, 2010 11:28 am

Re: thinking about ascension log parsing

Post by Lilac » Mon Dec 02, 2013 1:41 pm

I'm down for a single JSON log that is produced by both Mafia and Proxy. Seems like the most elegant solution.

User avatar
Eleron
Has a thing!
Posts: 870
Joined: Tue Jun 03, 2008 1:52 pm

Re: thinking about ascension log parsing

Post by Eleron » Tue Dec 03, 2013 5:36 pm

bleary wrote:To the best of my understanding, kolproxy has two kinds of logs. One is the database it maintains on the client-side, which contains almost (?) every pageload proxy performs.

This is obviously a bit unwieldy as a log, so kolproxy reduces it (and here it's not clear to me whether this happens on the client side or on Eleron's server) to an array of simpler JSON objects for analysis/presentation.
Kolproxy has logs of everything that happened, and a parser (part of kolproxy client-side) to produce a reduced version for ascension log purposes that gets uploaded to the server (at the JSON log stage is where it overlaps with your ascension logging thoughts). The server is simply a repository of gzipped JSON logs, where you post to http://www.houeland.com/kolproxy/ascension-log with action=store, playerid=, secretkey=, charactername=, ascensionnumber=, and base64gzippedjsonlog=. The secret key is a private key demonstrating access to the account (it's not actually used for anything at the moment, but is MD5("kolproxylogparse:" + statusbefore.eleronkey + ":kolproxylogparse"). Might actually be good to use compatible secret keys for different programs, in which case the "kolproxy" in there is somewhat unfortunate. But hell, the game says "eleron", we've got bigger naming issues :P). Uploading a log gives you back a logid which is used to identify the log and can be given to anyone you want to show it to. Passing action=retrieve, logid= will give you the gzipped json back. (It's not stored in base64, that's just when posting it, and your browser will decode the gzipping.)

There's also a http://www.houeland.com/kol/viewlog webpage with a client-side javascript log parser that will retrieve the log by logid from /ascension-log and present an HTML display version. (The only thing the server does for that page is copying the logid from the URL query into a variable the javascript uses to connect to the server to retrieve the log. The web server is not "doing anything" at any point in the process.)
bleary wrote:Each one has the properties 'statusafter', 'fromurlpath', 'title', 'urlpath', 'mcd', 'statusbefore', 'daysthisrun', and 'zonename'. The two status structures are subsets of the API result. (It's not yet clear to me why 'mcd' and 'daysthisrun' get promoted out of the status structure). 'zonename' is present even when the logged event isn't a visit to a zone. These core properties are enough to create a simple overview of a run.

kolproxy also occasionally adds the properties new_fight, lost_effects, gained_effects, item, page_redirect, encounter_source, new_runstate, fired_romantic_arrow and pulls. 'item' seems to be used for some item usages (like consumption or photocopied monsters) but many (hair spray, e.g.) are not reported. Not every effect is tracked by lost_ and gained_effects, and the subset of the status structures don't contain the current effects, intrinsics, or equipment. There may be more combat events reported than just the romantic arrow, but that's the only one I saw. It ends up looking like a bunch of these, sometimes with multiple logged events per combat.
daysthisrun doesn't change during a pageload, and a pageload that changes mcd just isn't interesting (same with familiar type, just the weight there is interesting).

When/if something is missing, that's probably a bug in the parsing (since my version of the log displayer doesn't use all of it, not everything is getting thoroughly tested).
bleary wrote:So, a proposed log format:

Code: Select all

	"title": "monster name, noncombat title, or other descriptive text"
	"statusbefore": {}
	"statusafter": {}
	"location": "(optional) name of encounter location"
	"urlpath": "(optional) source of this event"
	"fromurlpath": "(optional) source of redirect"
	"parsedinfo": [{}, {}, {}, ...]
It's becoming clear to me that I don't really understand how Mafia works, as I am having real trouble figuring out how to get it to properly log redirects. There may be threading involved? Sigh.
The title is parsed, location is not very meaningful without doing any parsing first, and parsedinfo should not be an array. What's in there?

You're not going to be able to get everything accurately out of mafia, since it just doesn't know, so be happy if you get at least as much as the session logs. The basic architecture/current player status/networking/logging code in mafia are the worst parts since no one can work on them.

For the log parsing, the thing that spits out something for users to look at should definitely be working through things to understand context, not just converting lines independently of one another. The JSON log it's based on could possibly be changed so each line there is independent, but it seems unlikely because it would be bloated in very inconsistent ways (parsing page text down to just a title but including the full inventory would be crazy talk).

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Tue Dec 03, 2013 7:08 pm

Eleron wrote:Might actually be good to use compatible secret keys for different programs, in which case the "kolproxy" in there is somewhat unfortunate. But hell, the game says "eleron", we've got bigger naming issues :P).
I've been wondering what the 'eleronkey' status element was. I just figured it opened the 'eleronsunkenchest'.
Eleron wrote: daysthisrun doesn't change during a pageload, and a pageload that changes mcd just isn't interesting (same with familiar type, just the weight there is interesting).
I'm defaulting to stuffing the whole status into the log (except for 'pwd', 'eleronkey' and 'flag_config'), lots of it isn't interesting to me, but may be to some log analyzer down the road. All that duplicated text compresses real nice.
bleary wrote:So, a proposed log format:

Code: Select all

	"title": "monster name, noncombat title, or other descriptive text"
	"statusbefore": {}
	"statusafter": {}
	"location": "(optional) name of encounter location"
	"urlpath": "(optional) source of this event"
	"fromurlpath": "(optional) source of redirect"
	"parsedinfo": [{}, {}, {}, ...]
The title is parsed, location is not very meaningful without doing any parsing first, and parsedinfo should not be an array. What's in there?
Presumably "location" is redundant with some of the url paths, so maybe it can be left out. I do think it would make it easier for simpler log parsers if it's in. 'title' is parsed out of the page text, I guess.

'parsedinfo' I'm proposing for data which is parsed out of the page text. It's an array because it could (in the case of a combat) consist of multiple rounds. It's optional in the log, since some logged events might not have any content in there. For a combat, it looks like this:

Code: Select all

[   {"player action": ["steal"]}, 
    {"player action": ["skill 6030"]},
    {"monster change": {"hp": [-66]}, "player action": ["attack"], "player change": [{"hp": 5}, {"mp": 5}]}, 
    {"player action": ["attack"], "monster change": {"hp": [-79]}},
    {"adv": -1, "substats": [26, 18, 54], "monster change": {"hp": [-80]}}
]
It's my effort to capture mafia's best guess at what happened in each round of the combat. Not necessarily accurate, not guaranteed complete, but better than nothing.

For some other page loads, here's me turning in my barrels of gunpowder and getting some bombs from the lighthouse:

Code: Select all

{
        "urlpath": "bigisland.php?place=lighthouse&action=pyro", 
        "statusafter": {...}, 
        "fromurlpath": "bigisland.php?place=lighthouse&action=pyro", 
        "statusbefore": {...}, 
        "parsed_info": [
            { "item": [ -2403, -2403, -2403, -2403, -2403 ] }
        ]
    }, 
    {
        "urlpath": "bigisland.php?place=lighthouse&action=pyro", 
        "statusafter": {...}, 
        "fromurlpath": "bigisland.php?place=lighthouse&action=pyro", 
        "statusbefore": {...}, 
        "parsed_info": [
            { "item": [ 2068, 2068, 2400 ] }
        ]
    }
]
Here's me making and eating a pumpkin pie.

Code: Select all

{
        "urlpath": "store.php", 
        "statusafter": {...}, 
        "fromurlpath": "store.php", 
        "statusbefore": {...}, 
        "parsed_info": [
            {  "item": 158, "meat": -28    }
        ]
    }, 
    {
        "urlpath": "craft.php", 
        "statusafter": {...}, 
        "fromurlpath": "craft.php", 
        "statusbefore": {...}, 
        "parsed_info": [
            {  "item": [160,   -158,  -159 ]   }
        ]
    }, 
    {
        "urlpath": "craft.php", 
        "statusafter": {...}, 
        "fromurlpath": "craft.php", 
        "statusbefore": {...}, 
        "parsed_info": [
            { "item": [    4763,  -160,  -4761 ]  }
        ]
    }, 
    {
        "urlpath": "inv_eat.php", 
        "statusafter": {...}, 
        "fromurlpath": "inv_eat.php", 
        "statusbefore": {...}, 
        "parsed_info": [
            {  "adv": 17,  "item": -4763,  "substats": [  30,  22, 18  ]  }
        ]
    }
Obviously the adventure and substat gain should be reflected in the before/after status. Not sure whether/if the entire inventory ought to be dumped to the log once in a while. Seems like we could do it, but I wonder whether it would ever be interesting to a log analyzer.

User avatar
lostcalpolydude
Forum Maestro
Posts: 2940
Joined: Wed Apr 23, 2008 6:54 pm

Re: thinking about ascension log parsing

Post by lostcalpolydude » Tue Dec 03, 2013 8:37 pm

I'm curious what your thoughts are for logging consumption from the microbrewery or chez, since the things that are always in there aren't actual items and a lot of what you have there represents things by item id.
bmaher: Softcore character
lostcalpolydude: Hardcore character (abandoned)

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Tue Dec 03, 2013 8:49 pm

lostcalpolydude wrote:I'm curious what your thoughts are for logging consumption from the microbrewery or chez, since the things that are always in there aren't actual items and a lot of what you have there represents things by item id.
Looks like this currently. Obviously all of the info parsed out of the page could have been gotten from the status before/after as well.

Code: Select all

{
    "urlpath":"cafe.php",
    "statusafter":{},
    "fromurlpath":"cafe.php",
    "parsed_info":[
        {
            "meat":-100,
            "drunk":3,
            "adv":3
        }
    ],
    "statusbefore":{}
}

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Thu Dec 05, 2013 5:14 pm


User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Sat Dec 07, 2013 12:01 am

Eleron wanted me to post some ascension log stuff, so as an example of the kind of things we ought to be able to extract from improved logs:

Code: Select all

2165 events in the log
Billiards Room [13 turns: 19-31]
     Searching for pool cue, handful of hand chalk, Spookyraven library key
     in The Haunted Billiards Room
         avg +item: 24.21%
         avg +combat: -10%

     [20] chalkdust wraith
         -> handful of hand chalk (120.00% drop)
     (27) That's your cue (-10% combat)
         -> pool cue
     (31) Unknown choice adventure (-10% combat)
         -> Spookyraven library key


** Pirates
** 48 turns
** [187-201, 213-214, 225-248, 253-258, 260]

* obtain pirate outfit [17 turns: 187-201, 213-214]
     Searching for eyepatch, swashbuckling pants, stuffed shoulder parrot
     in The Obligatory Pirate's Cove
         avg +item: 176.26%
         avg +combat: -5%

     (187) Unknown choice adventure (-5% combat)
         -> swashbuckling pants
     (189) Unknown choice adventure (-5% combat)
         -> eyepatch
     (214) Unknown choice adventure (-5% combat)
         -> stuffed shoulder parrot


* unlock f'c'le [24 turns: 225-248]
     in Barrrney's Barrr
     and using Cap'm Caronch's Map, Orcish Frat House blueprints
     (242) booty crab
         -> Cap'm Caronch's nasty booty
     (244) Unknown choice adventure
         -> Cap'm Caronch's dentures


* obtain pirate fledges [7 turns: 253-258, 260]
     Searching for rigging shampoo, ball polish, mizzenmast mop, pirate fledges
     in The F'c'le
         avg +item: 187.07%
         avg +combat: -5%

     [253] curmudgeonly pirate
         -> mizzenmast mop (86.55% drop)
     [254] cleanly pirate
         -> rigging shampoo (86.55% drop)
     [258] creamy pirate
         -> ball polish (86.55% drop)
     (260) A Fledgling Pirate Is You! (-5% combat)
         -> pirate fledges


** Highlands
** 61 turns
** [288-340, 342-348, 350]

* The Smut Orc Logging Camp [21 turns: 288-308]

* A-Boo Peak [14 turns: 325-333, 342-346]
     9 combats with avg +item: 239.11%
     [326] Battlie Knight Ghost
         -> A-Boo clue (52.72% drop)
     [327] Space Tourist Explorer Ghost
         -> A-Boo clue (52.72% drop)
     [328] Space Tourist Explorer Ghost
         -> A-Boo clue (52.72% drop)
     [333] Whatsian Commando Ghost
         -> A-Boo clue (53.47% drop)
     (342) The Horror...
         ---  spooky res: 4 - cold res: 7 - hp: 334/334
     (343) The Horror...
         ---  spooky res: 4 - cold res: 7 - hp: 334/334
     (344) The Horror...
         ---  spooky res: 4 - cold res: 7 - hp: 334/334
     (345) The Horror...
         ---  spooky res: 4 - cold res: 7 - hp: 340/340

* Twin Peak [10 turns: 334-340, 347-348, 350]

* Oil Peak [16 turns: 309-324]


User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

Re: thinking about ascension log parsing

Post by bleary » Fri Dec 13, 2013 3:14 pm

Here's how my ascension log is looking now:

Code: Select all

***
*** bleary - Ascension #64
*** Hardcore - Class Act II: A Class For Pigs
***

*** Day 1 ***

[0]  None
     => Level 1 (turn 0)
[1-2]  The Haunted Pantry
[3]  photocopied monster
     [3] sleepy mariachi
         | yellow-rayed sleepy mariachi (150 turn cooldown)
         |      spangly mariachi pants
         |      spangly sombrero
[4-9]  The Haunted Pantry
     => Level 2 (turn 4)
     (7) A Sandwich Appears!
         * guild unlock complete [6 turns / 6 encounters]
     => Level 3 (turn 8)
     (9) The Manor in Which You're Accustomed
         * manor unlock complete [8 turns / 10 encounters]
[10-12]  The Outskirts of Cobb's Knob
[13-19]  The Spooky Forest
     (19) Arboreal Respite
         -> mosquito larva
         * find larva complete [7 turns / 9 encounters]
         * avg item +32.74% | combat -10%
[20-32]  The Haunted Billiards Room
     [21] chalkdust wraith
         -> handful of hand chalk (120.00% drop)
     => Level 4 (turn 21)
     (28) That's your cue
         -> pool cue
     (32) Minnesota Incorporeals
         -> Spookyraven library key
         * library key complete [13 turns / 14 encounters]
         * avg item +22.33% | combat -10%
[33-41]  The Haunted Library
     [36] banshee librarian
         | sniffed banshee librarian 
     (38) Take a Look, it's in a Book! (Rise)
         * manor stairs complete [6 turns / 6 encounters]
     => Level 5 (turn 41)
[42-50]  The Haunted Bedroom
     (50) One Nightstand (Wooden)
         -> Spookyraven ballroom key
         * ballroom key complete [9 turns / 9 encounters]
         * avg item +134.29% | combat -6%
[51-52]  The Haunted Ballroom
     (52) Strung-Up Quartet
         | ballroom song set to combat -5%
[53-60]  The Outskirts of Cobb's Knob
     (60) Code Red
         -> Knob Goblin encryption key
         * knob unlock complete [11 turns / 11 encounters]
         * avg item +45.00% | combat -8%
[61-63]  The Bat Hole Entrance
[64-69]  Cobb's Knob Harem
     [66] Knob Goblin Harem Girl
         -> Knob Goblin harem pants (35.23% drop)
     => Level 6 (turn 68)
     [69] Knob Goblin Harem Girl
         -> Knob Goblin harem veil (35.72% drop)
         * harem outfit complete [6 turns / 7 encounters]
         * avg item +77.22% | combat -5%
[70]  Guano Junction
     (70) How I Wonder What You're At
         -> sonar-in-a-biscuit, sonar-in-a-biscuit
[71-72]  The Beanbat Chamber
     [72] beanbat
         -> sonar-in-a-biscuit (23.10% drop)
         * boss bat unlock complete [6 turns / 6 encounters]
         * avg item +119.73% | combat -7%
[73-76]  The Boss Bat's Lair
[77]  Cobb's Knob Kitchens
[78]  Cobb's Knob Barracks
[79-80]  The Boss Bat's Lair
     [80] The Boss Bat
         -> Boss Bat bandana
         * boss bat complete [6 turns / 6 encounters]
         * avg item +60.00% | combat -5%
[81-82]  Cobb's Knob Harem
[82]  Tavern Cellar
[85-93]  The Shore, Inc. Travel Agency
[94-108]  8-Bit Realm
     [94] Blooper
         | sniffed Blooper 
     [94a] Octorok
         | popper banished Octorok (5 turns)
[108-119]  Tavern Cellar

User avatar
bleary
Pie in the Sky
Posts: 196
Joined: Sun Apr 18, 2010 2:07 pm
Location: Chicago
Contact:

bleary's HCCA2 Sauceror 4/707

Post by bleary » Sun Jan 12, 2014 5:39 pm

Development continues. I think I've mostly gotten the modifications to KolMafia correct, though I'm occasionally finding that certain encounters aren't ending up in the machine-readable log.

***
*** bleary - Ascension #66
*** Hardcore - Class Act II: A Class For Pigs
***

*** Day 1 ***

Code: Select all

[0]  None
     => Level 1 (turn 0)
[0]  Video Game Level 1
[1]  photocopied monster
[2-11]  The Haunted Pantry
     => Level 2 (turn 5)
     (7) A Sandwich Appears!
         [x] guild unlock [6 turns / 6 encounters]
         *      ml +10 | combat -10%
     (11) The Manor in Which You're Accustomed
         [x] manor unlock [10 turns / 11 encounters]
         *      ml +10 | 
[12-19]  The Haunted Billiards Room
     (12) That's your cue
         -> pool cue
     [13] chalkdust wraith
         -> handful of hand chalk (135.00% drop)
     => Level 3 (turn 13)
     (19) Minnesota Incorporeals
         -> Spookyraven library key
         [x] library key [8 turns / 8 encounters]
         *           ml +10 | item +35.00%
         *      combat -10% |             
[20-25]  The Haunted Library
     => Level 4 (turn 21)
     [22] banshee librarian
         | yellow-rayed banshee librarian (150 turn cooldown)
         |      disintegrating quill pen
         |      killing jar
     (25) Take a Look, it's in a Book!
         [x] manor stairs [5 turns / 5 encounters]
         *      ml +10 | 
[25-31]  The Haunted Bedroom
     => Level 5 (turn 30)
     (31) One Nightstand
         -> Spookyraven ballroom key
         [x] ballroom key [6 turns / 8 encounters]
         *           ml +10 | item +75.25%
         *      combat -10% |             
[32-36]  The Haunted Ballroom
     (36) Strung-Up Quartet
         | ballroom song set to combat -5%
[37-44]  The Spooky Forest
     (44) Arboreal Respite
         -> mosquito larva
         [x] find larva [8 turns / 8 encounters]
         *           ml +28 | item +50.02%
         *      combat -10% |             
[45-54]  The Outskirts of Cobb's Knob
     => Level 6 (turn 52)
     (54) Code Red
         -> Knob Goblin encryption key
         [x] knob unlock [10 turns / 12 encounters]
         *          ml +12 | item +45.00%
         *      combat -9% |             
[55]  Guano Junction
     (55) How I Wonder What You're At
         -> sonar-in-a-biscuit, sonar-in-a-biscuit
[56]  The Spooky Forest
[56-66]  The Typical Tavern Cellar
[67-74]  The Beanbat Chamber
[75-79]  The Boss Bat's Lair
[80]  Cobb's Knob Kitchens
[81-82]  The Boss Bat's Lair
     [82] The Boss Bat
         -> Boss Bat bandana
         [x] boss bat [7 turns / 8 encounters]
         *           ml +7 | item +55.00%
         *      combat -5% |             
[83-87]  Cobb's Knob Kitchens
[88]  Cobb's Knob Barracks
[89-100]  8-Bit Realm
     [93] Blooper
         | sniffed Blooper 

*** Day 2 ***

Code: Select all

[103-109]  The Shore, Inc. Travel Agency
     => Level 7 (turn 109)
[109]  None
[110]  Hippy Camp
     [110] filthy hippy jewelry maker
         | yellow-rayed filthy hippy jewelry maker (150 turn cooldown)
         |      phat turquoise bead
         |      hemp string
         |      filthy corduroys
         |      filthy knitted dread sack
         |      reodorant
         |      patchouli incense stick
         |      clay peace-sign bead
         |      beach glass bead
         |      double-barreled sling
[111-112]  The Spooky Forest
     [111a] warwelf
         | free bander runaway! [xx/2]
     [111b] spooky mummy
         | free bander runaway! [xx/2]
     [112a] triffid
         | free bander runaway! [xx/3]
     [112c] wolfman
         | free bander runaway! [xx/4]
[113-124]  The Dark Heart of the Woods
     (124) Imp Be Nimble, Imp Be Quick
         -> box of birthday candles
[125-136]  The Dark Elbow of the Woods
     (136) Butter Knife?  I'll Take the Knife
         -> eldritch butterknife
[137-142]  The Dark Neck of the Woods
     (142) Dodecahedrariffic!
         -> dodecagram
         [x] friars [30 turns / 30 encounters]
         *           ml +11 | item +105.10%
         *      combat -15% |              
[143-145]  The Daily Dungeon
[146-148]  The Defiled Alcove
[149-160]  The Defiled Cranny
[161-170]  The Defiled Niche
     [161] dirty old lihc
         | sniffed dirty old lihc 
[171-179]  The Defiled Nook
     => Level 8 (turn 174)
[180-183]  The Obligatory Pirate's Cove
     (180) Barrie Me at Sea
         -> swashbuckling pants
     (181) The Arrrbitrator
         -> eyepatch
     [183] swarthy pirate
         -> stuffed shoulder parrot (24.12% drop)
         [x] pirate outfit [4 turns / 4 encounters]
         *          ml +10 | item +156.11%
         *      combat -5% |              
[184-201]  Barrrney's Barrr
[202-206]  The Defiled Alcove
     [206] conjoined zmombie
         [x]  [8 turns / 9 encounters]
         *      ml +10 | init +91.00%
[207]  The Defiled Nook
     [207] giant skeelton
         [x]  [10 turns / 10 encounters]
         *      ml +10 | item +200.95%
[208]  The Defiled Niche
     [208] gargantulihc
         [x]  [11 turns / 11 encounters]
         *      ml +15 | 
[209-210]  The Defiled Cranny
     [209] huge ghuol
         [x]  [13 turns / 13 encounters]
         *      ml +57 | combat -10%
[211]  Post-Cyrpt Cemetary
[212-220]  The Goatlet
     [213] dairy goat
         | sniffed dairy goat 
[221-224]  Barrrney's Barrr
[225-234]  The F'c'le
     [230] cleanly pirate
         -> rigging shampoo (82.79% drop)
     [231] creamy pirate
         -> ball polish (82.79% drop)
     [233] curmudgeonly pirate
         -> mizzenmast mop (82.79% drop)
     (234) A Fledgling Pirate Is You!
         -> pirate fledges
         [x] f'c'le [10 turns / 11 encounters]
         *          ml +10 | item +175.95%
         *      combat -5% |              
[235-240]  Video Game Level 1
     => Level 9 (turn 240)
[241-252]  The Smut Orc Logging Camp
[253-255]  Itznotyerzitz Mine
[255-256]  Itznotyerzitz Mine (in Disguise)
[257-260]  The Smut Orc Logging Camp
[261]  Hippy Camp
     [261] filthy hippy
         | yellow-rayed filthy hippy (150 turn cooldown)
         |      tambourine bells
         |      patchouli incense stick
         |      decorative fountain
         |      filthy corduroys
         |      filthy knitted dread sack
         |      reodorant
         |      double-barreled sling
[262]  photocopied monster
*** Day 3 ***

Code: Select all

[262-264]  Video Game Level 1
[264-265]  None
[266]  photocopied monster
[266-268]  Itznotyerzitz Mine (in Disguise)
[269]  Lair of the Ninja Snowmen
[270-289]  The eXtreme Slope
[290-293]  Mist-Shrouded Peak
[294-299]  The Smut Orc Logging Camp
[299-312]  Oil Peak
[312-319]  A-Boo Peak
[319-323]  Twin Peak
[324-327]  A-Boo Peak
[328-337]  Twin Peak
     [329] bearpig topiary animal
         | sniffed bearpig topiary animal 
     => Level 10 (turn 334)
[337-365]  The Penultimate Fantasy Airship
     [345a] Protagonist
         | popper banished Protagonist (5 turns)
     (361) Gesundheitgeist!
         -> Tissue Paper Immateria
[366-368]  The Spooky Forest
     [366a] wolfman
         | free bander runaway! [xx/2]
[369-386]  The Penultimate Fantasy Airship
     (373) Don't Chew on That Spirit!
         -> Tin Foil Immateria
     [375] Burly Sidekick
         | sniffed Burly Sidekick 
     (381) The Most Absorbent Spirit Ever
         -> Gauze Immateria
     (384) Rip Rop Wrappety Do
         -> Plastic Wrap Immateria
     (386) F-F-Fantastic!
         -> S.O.C.K.
         [x]  [46 turns / 53 encounters]
         *           ml +9 | item +185.66%
         *      combat -5% |              
[387-392]  The Castle in the Clouds in the Sky (Basement)
[393-401]  The Castle in the Clouds in the Sky (Ground Floor)
[402-408]  The Castle in the Clouds in the Sky (Top Floor)
[409-426]  The Hole in the Sky
     [416] The Astronomer
         | sniffed The Astronomer 
     => Level 11 (turn 424)
[427-429]  The Daily Dungeon
[430-441]  The Black Forest
[442]  The Hidden Temple
[445-448]  The Shore, Inc. Travel Agency
[448]  The Poop Deck
     [448] warty pirate
         | free bander runaway! [xx/3]
     [448b] witty pirate
         | free bander runaway! [xx/3]
     [448g] wealthy pirate
         | free bander runaway! [xx/4]
     [448i] whiny pirate
         | free bander runaway! [xx/5]
     [448k] wacky pirate
         | free bander runaway! [xx/6]
[449-452]  The Hidden Temple
[453-455]  The Poop Deck
[456-458]  Belowdecks
     [456f] gritty pirate
         | popper banished gritty pirate (5 turns)
     [456g] 
         NOTITLE
         [u'', u'']
         [u'adventure.php?snarfblat=160', u'fight.php']
         [[{}], [{u'player action': [u'item 3121']}, {u'item': [-3121]}]]
         []
         | popper banished  (5 turns)
     [457] gaudy pirate
         | sniffed gaudy pirate 
[459-474]  The Palindome
     [469] Bob Racecar
         | yellow-rayed Bob Racecar (150 turn cooldown)
         |      mesh cap
         |      leather chaps
         |      stunt nuts
         |      ketchup hound
         |      a butt tuba
*** Day 4 ***

Code: Select all

[475-481]  The Hidden Park
[481]  None
[482]  Cobb's Knob Laboratory
[483-485]  The Haunted Ballroom
     [484b] zombie waltzers
         | free bander runaway! [xx/1]
     [484c] floating platter of hors d'oeuvres
         | free bander runaway! [xx/1]
     [484d] floating platter of hors d'oeuvres
         | free bander runaway! [xx/3]
     (485a) Strung-Up Quartet
         | ballroom song set to disabled
[486-488]  Whitey's Grove
[489]  Cobb's Knob Laboratory
[489]  An Overgrown Shrine (Northwest)
[489]  An Overgrown Shrine (Southwest)
[489]  An Overgrown Shrine (Southeast)
[489]  An Overgrown Shrine (Northeast)
[489]  A Massive Ziggurat
[490]  An Overgrown Shrine (Northwest)
[491]  An Overgrown Shrine (Southwest)
[492]  An Overgrown Shrine (Southeast)
[493]  An Overgrown Shrine (Northeast)
[494-496]  The Daily Dungeon
[497]  The Haunted Wine Cellar (Northwest)
[498]  The Haunted Wine Cellar (Southeast)
[499-503]  The Arid, Extra-Dry Desert
[504-510]  The Oasis
[510-521]  The Arid, Extra-Dry Desert
[522-525]  The Hidden Hospital
[526-536]  The Hidden Office Building
     [528] pygmy witch accountant
         | sniffed pygmy witch accountant 
[536-548]  The Hidden Bowling Alley
     [536] pygmy orderlies
         | popper banished pygmy orderlies (5 turns)
     [541] pygmy bowler
         | sniffed pygmy bowler 
[549-556]  The Hidden Apartment Building
     [549a] pygmy janitor
         | popper banished pygmy janitor (5 turns)
     [550] pygmy shaman
         | sniffed pygmy shaman 
     => Level 12 (turn 552)
[557]  Frat House
     [557] War Pledge
         | yellow-rayed War Pledge (150 turn cooldown)
         |      beer helmet
         |      bejeweled pledge pin
         |      distressed denim pants
[558]  Hippy Camp
[559-568]  Wartime Hippy Camp (Frat Disguise)
[569]  The Castle in the Clouds in the Sky (Top Floor)
[570-584]  The Themthar Hills
[585]  Next to that Barrel with Something Burning in it
[585-588]  Over Where the Old Tires Are
     [585] erudite gremlin
         | free bander runaway! [xx/5]
     [585a] erudite gremlin
         | free bander runaway! [xx/5]
[589]  Near an Abandoned Refrigerator
[590]  Out by that Rusted-Out Car
[590]  An Overgrown Shrine (Northwest)
[590]  An Overgrown Shrine (Southwest)
[590]  An Overgrown Shrine (Southeast)
[590-591]  An Overgrown Shrine (Northeast)
[592]  The Palindome
[593]  A Massive Ziggurat
[594-596]  The Upper Chamber
     [596] tomb rat
         | sniffed tomb rat 
[597-599]  The Hatching Chamber
[600]  Guano Junction
[601-604]  The Valley of Rof L'm Fao
[605-607]  The Hatching Chamber
     [607] larval filthworm
         -> filthworm hatchling scent gland (37.40% drop)
         [x]  [6 turns / 7 encounters]
         *          ml +20 | item +318.52%
         *      combat -5% |              
[608-610]  The Feeding Chamber
     [610] 
         -> filthworm drone scent gland
         [x]  [3 turns / 3 encounters]
         *          ml +20 | item +270.62%
         *      combat +0% |              
         NOTITLE
         [u'', u'', u'', u'', u'']
         [u'adventure.php?snarfblat=128', u'fight.php', u'fight.php', u'fight.php', u'fight.php']
         [[{}], [{u'player action': [u'skill 4034']}, {u'player change': [{u'mp': -8}], u'monster change': {u'attack': [-8], u'defense': [-8]}}], [{u'player action': [u'skill 7182']}, {u'monster change': {u'attack': [-7], u'defense': [-8]}}], [{u'player action': [u'item 2405']}, {u'monster change': {u'attack': [-9], u'defense': [-7]}}], [{u'player action': [u'skill 4012']}, {u'adv': [-1], u'player change': [{u'mp': 50}, {u'mp': -24}], u'meat': [70], u'item': [2345], u'substats': [20, 56, 25], u'monster change': {u'hp': [-576], u'defense': [-7], u'attack': [-7]}}]]
         []
[611-616]  The Royal Guard Chamber
     [616] filthworm royal guard
         -> filthworm royal guard scent gland (36.40% drop)
         [x]  [6 turns / 6 encounters]
         *          ml +20 | item +261.45%
         *      combat +0% |              
[617-637]  The Upper Chamber
[638-645]  The Filthworm Queen's Chamber
[646]  photocopied monster
[647-683]  The Battlefield (Frat Uniform)
     => Level 13 (turn 669)
[684-685]  South of the Border
[685]  Sorceress' Hedge Maze
[686]  The Castle in the Clouds in the Sky (Basement)
[686-693]  Sorceress' Hedge Maze
[694-699]  Guano Junction
     (694) How I Wonder What You're At
         -> sonar-in-a-biscuit
         [x] boss bat unlock [11 turns / 11 encounters]
         *          ml +10 | item +151.78%
         *      combat -5% |              
[699-701]  BRICKO ooze
[701-707]  The Shore, Inc. Travel Agency



Image

User avatar
PsyMar
Spy vs. Pie
Posts: 50
Joined: Thu Aug 15, 2013 6:14 am

Re: thinking about ascension log parsing

Post by PsyMar » Sun Jun 01, 2014 8:52 am

Just wondering how this is going.

Also, your turncounts are clearly off in day 4 of that log, as the bricko ooze doesn't take any turns.
If you're going through Hell, keep going. -- Winston Churchill
We apologise for the inconvenience. -- God's Last Message To His Creation
If something cannot go wrong at all, it will go wrong in a very spectacular way. -- Washu
If at first you don't succeed, redefine success. If at first you do succeed try to hide your astonishment. -- Washu

Post Reply