bleary
Member
Since the parsing of Mafia session logs is a non-trivial task, and the re-calculation of turn-by-turn state is duplicative of tasks Mafia is already doing, I'd like to see an option to dump easily parsed machine-readable data into the session log. Here's a suggestion:
This is data in the format of the 'status' API call, which, if inserted into the session log at appropriate intervals, would greatly simply processing. Here's some code that does it. There are some missing data points.
If we could come up with something similar which rendered combat results into a JSON structure (along with out-of-combat item acquisition, consumption, and a bunch of other stuff), parsing Mafia session logs would become a whole lot easier.
Code:
@@JSONSTATUS
{"hp":83,"maxhp":84,"mp":11,"maxmp":84,"daysthisrun":2,"turnsthisrun":6,"adventures":74,"meat":2514,
"muscle":6,"rawmuscle":4,"mysticality":14,"rawmysticality":3,"moxie":8,"rawmoxie":6,"level":2,"full":0,"drunk":0,"spleen":0,
"modifiers":{"ml":10,"init":50,"combat":21,"meat":10,"item":21,"dr":0,"da":240,"famlevel":10},
"effects":{"80224f21d262123e7e370d440ce36937":["The Magical Mojomuscular Melody",10,"mojomusc.gif",
"not implemented",64],"846b5d2c960c2a6bd19ed296425fc41e":["Gaze of the Trickster God",2147483647,"gaze_t.gif","not implemented",771]},
"equipment":{"hat":6002,"weapon":5558,"offhand":6005,"container":5556,"shirt":0,"pants":6006,
"acc1":4644,"acc2":4402,"acc3":6007,"familiarequip":4135,"crownofthrones":0,"fakehands":0,"card sleeve":0},
"stickers":[0,0,0],"folder_holder":[0,0,0,0,0]}
JSON@@
This is data in the format of the 'status' API call, which, if inserted into the session log at appropriate intervals, would greatly simply processing. Here's some code that does it. There are some missing data points.
Code:
public static final void dumpJSONtoSessionLog()
{
JSONStringer myString = new JSONStringer();
try {
myString.object()
.key("hp")
.value( KoLCharacter.getCurrentHP() )
.key("maxhp")
.value( KoLCharacter.getMaximumHP() )
.key("mp")
.value( KoLCharacter.getCurrentMP() )
.key("maxmp")
.value( KoLCharacter.getMaximumHP() )
.key("daysthisrun")
.value( KoLCharacter.getCurrentDays() )
.key("turnsthisrun")
.value( KoLCharacter.getCurrentRun() )
.key("adventures")
.value( KoLCharacter.getAdventuresLeft())
.key("meat")
.value( KoLCharacter.getAvailableMeat() )
.key("muscle")
.value( KoLCharacter.getAdjustedMuscle() )
.key("rawmuscle")
.value( KoLCharacter.getBaseMuscle() )
.key("mysticality")
.value( KoLCharacter.getAdjustedMysticality() )
.key("rawmysticality")
.value( KoLCharacter.getBaseMysticality() )
.key("moxie")
.value( KoLCharacter.getAdjustedMoxie() )
.key("rawmoxie")
.value( KoLCharacter.getBaseMoxie() )
.key("level")
.value( KoLCharacter.getLevel() )
.key("full")
.value( KoLCharacter.getFullness() )
.key("drunk")
.value( KoLCharacter.getInebriety() )
.key("spleen")
.value( KoLCharacter.getSpleenUse() );
// modifiers sub-object
myString.key("modifiers")
.object()
.key("ml")
.value( KoLCharacter.getMonsterLevelAdjustment() )
.key("init")
.value( KoLCharacter.getInitiativeAdjustment() )
.key("combat")
.value( KoLCharacter.getMeatDropPercentAdjustment() )
.key("meat")
.value( KoLCharacter.getMonsterLevelAdjustment() )
.key("item")
.value( KoLCharacter.getItemDropPercentAdjustment() )
.key("dr")
.value( KoLCharacter.getDamageReduction() )
.key("da")
.value( KoLCharacter.getDamageAbsorption() )
.key("famlevel")
.value( KoLCharacter.getFamiliarWeightAdjustment() )
.endObject();
int size = KoLConstants.activeEffects.size();
AdventureResult[] effectsArray = new AdventureResult[ size ];
KoLConstants.activeEffects.toArray( effectsArray );
myString.key("effects")
.object();
for ( int i = 0; i < size; i++ )
{
AdventureResult effect = effectsArray[ i ];
int duration = effect.getCount();
int effectId = EffectDatabase.getEffectId(effect.name);
String descId = EffectDatabase.getDescriptionId(effectId);
myString.key(descId)
.array()
.value(effect.name)
.value(duration)
.value(EffectDatabase.getImageName(effectId))
//.value(EffectDatabase.getDefaultAction(effect.name))
.value("not implemented")
.value(effectId)
.endArray();
}
myString.endObject();
// equipment list
myString.key("equipment")
.object();
myString.key("hat")
.value( EquipmentManager.getEquipment( EquipmentManager.HAT ).getItemId())
.key("weapon")
.value(EquipmentManager.getEquipment( EquipmentManager.WEAPON ).getItemId())
.key("offhand")
.value(EquipmentManager.getEquipment( EquipmentManager.OFFHAND ).getItemId())
.key("container")
.value(EquipmentManager.getEquipment( EquipmentManager.CONTAINER ).getItemId())
.key("shirt")
.value(EquipmentManager.getEquipment( EquipmentManager.SHIRT ).getItemId())
.key("pants")
.value(EquipmentManager.getEquipment( EquipmentManager.PANTS ).getItemId())
.key("acc1")
.value(EquipmentManager.getEquipment( EquipmentManager.ACCESSORY1 ).getItemId())
.key("acc2")
.value(EquipmentManager.getEquipment( EquipmentManager.ACCESSORY2 ).getItemId())
.key("acc3")
.value(EquipmentManager.getEquipment( EquipmentManager.ACCESSORY3 ).getItemId())
.key("familiarequip")
.value(EquipmentManager.getEquipment( EquipmentManager.FAMILIAR ).getItemId())
.key("crownofthrones")
.value(EquipmentManager.getEquipment( EquipmentManager.CROWN_OF_THRONES ).getItemId())
.key("fakehands")
.value(EquipmentManager.getEquipment( EquipmentManager.FAKEHAND ).getItemId())
.key("card sleeve")
.value(EquipmentManager.getEquipment( EquipmentManager.CARD_SLEEVE ).getItemId())
.endObject();
//end equipment list
myString.key("stickers")
.array()
.value(EquipmentManager.getEquipment( EquipmentManager.STICKER1 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.STICKER2 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.STICKER3 ).getItemId())
.endArray();
myString.key("folder_holder")
.array()
.value(EquipmentManager.getEquipment( EquipmentManager.FOLDER1 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.FOLDER2 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.FOLDER3 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.FOLDER4 ).getItemId())
.value(EquipmentManager.getEquipment( EquipmentManager.FOLDER5 ).getItemId())
.endArray();
/*
// intrinsics
myString.key("intrinsics")
.value(0)
.endObject();
//effects list
.object();
.key("effects");
.value(0);
.endObject();
*/
myString.endObject(); // close container
} catch (org.json.JSONException e) {
StaticEntity.printStackTrace( e );
}
RequestLogger.sessionStream.println("@@JSONSTATUS");
RequestLogger.sessionStream.println(myString.toString());
RequestLogger.sessionStream.println("JSON@@");
}
If we could come up with something similar which rendered combat results into a JSON structure (along with out-of-combat item acquisition, consumption, and a bunch of other stuff), parsing Mafia session logs would become a whole lot easier.
Last edited: