UNPKG

crushyourfoes

Version:

A LotRO combat log parser

140 lines (107 loc) 5.44 kB
#!/usr/bin/env node var fs = require('fs'); var cyf = require('../lib/CRUSHYOURFOES.js'); if (process.argv.length < 3) throw new Error("Missing logfile!").toString(); var logFile = process.argv[2]; var player = process.argv[3] || "Luringdad"; var opponent = process.argv[4] || "ALL"; var lines = fs.readFileSync(logFile).toString().split("\n"); var myDPS = cyf.GetTotalDPS(player, opponent, lines); // watch out, these parameters are transposed var myEvades = cyf.ParseEvades(opponent, player, lines); var myBlocks = cyf.ParseBlocks(opponent, player, lines); var myParries = cyf.ParseParries(opponent, player, lines); var myResists = cyf.ParseResists(opponent, player, lines); // then flip back var myAttacks = cyf.NumberOfAttacks(player, opponent, lines); var myPartialAttacks = cyf.PartialAttacks(player, lines); var bigHitOut = cyf.FindBiggestHit(player, opponent, lines); var myCrits = cyf.FindCrits(player, opponent, lines); var myDevCrits = cyf.FindDevCrits(player, opponent, lines); var theirDPS = cyf.GetTotalDPS(opponent, player, lines); // watch out, these parameters are transposed var theirEvades = cyf.ParseEvades(player, opponent, lines); var theirBlocks = cyf.ParseBlocks(player, opponent, lines); var theirParries = cyf.ParseParries(player, opponent, lines); var theirResists = cyf.ParseResists(player, opponent, lines); // then flip back var theirAttacks = cyf.NumberOfAttacks(opponent, player, lines); var theirPartialAttacks = cyf.PartialAttacks(opponent, lines); var bigHitIn = cyf.FindBiggestHit(opponent, player, lines); var theirCrits = cyf.FindCrits(opponent, player, lines); var theirDevCrits = cyf.FindDevCrits(opponent, player, lines); var myTotalAvoidances = myEvades + myBlocks + myParries; var theirTotalAvoidances = theirEvades + theirBlocks + theirParries; var mySuccessfulAttacks = myAttacks - theirEvades - theirBlocks - theirParries - theirResists; var theirSuccessfulAttacks = theirAttacks - myEvades - myBlocks - myParries - myResists; // avoids div by zero var myDPA = (myAttacks > 0 && myDPS > 0) ? cyf.DamagePerAttack(myAttacks, myDPS) : 0; var myDPATaken = (theirAttacks > 0 && theirDPS > 0) ? cyf.DamagePerAttack(theirAttacks, theirDPS) : 0; var theirAvoidResist = (mySuccessfulAttacks > 0) ? 100 - cyf.CalculatePercentage(myAttacks, mySuccessfulAttacks) : 0; var myAvoidResist = (theirSuccessfulAttacks > 0) ? 100 - cyf.CalculatePercentage(theirAttacks, theirSuccessfulAttacks) : 0; var myCritPct = (mySuccessfulAttacks > 0 && myCrits > 0) ? cyf.CalculatePercentage(mySuccessfulAttacks, myCrits) : 0; var theirCritPct = (theirSuccessfulAttacks > 0 && theirCrits > 0) ? cyf.CalculatePercentage(theirSuccessfulAttacks, theirCrits) : 0; var myDevCritPct = (mySuccessfulAttacks > 0 && myDevCrits > 0) ? cyf.CalculatePercentage(mySuccessfulAttacks, myDevCrits) : 0; var theirDevCritPct = (theirSuccessfulAttacks > 0 && theirDevCrits > 0) ? cyf.CalculatePercentage(theirSuccessfulAttacks, theirDevCrits) : 0; var myBiggestHitOut = bigHitOut[0]; var myBiggestHitIn = bigHitIn[0]; var bigCombatLogOut = bigHitOut[1]; var bigCombatLogIn = bigHitIn[1]; var myKBs = cyf.MyKillingBlows(lines); var myKills = cyf.WhoDied(lines); console.log("Eagles of Thorondor Combat Stats"); console.log("================================\n"); console.log("player: %s opponent: %s logfile: %s\n", player, opponent, logFile); console.log("Your total damage done was %d", myDPS); console.log("Total damage done to you was %d", theirDPS); console.log("Your average damage per attack was %d", myDPA); console.log("Average damage you took per attack was %d", myDPATaken); console.log("The largest hit you landed was for %d", myBiggestHitOut); console.log("The largest hit you took was for %d", myBiggestHitIn); console.log("Your total number of attempted attacks was %d", myAttacks); console.log("Total number of attempted attacks against you was %d", theirAttacks); console.log("Your number of successful attacks was %d", mySuccessfulAttacks); console.log("Number of successful attacks against you was %d", theirSuccessfulAttacks); console.log("Your combined avoidance/resistance was %d%%", myAvoidResist.toFixed(2)); console.log("Opponents' combined avoidance/resistance was %d%%", theirAvoidResist.toFixed(2)); console.log("Your critical percentage was %d%%", myCritPct.toFixed(2)); console.log("Opponents' critical percentage was %d%%", theirCritPct.toFixed(2)); console.log("Your devastating critical percentage was %d%%", myDevCritPct.toFixed(2)); console.log("Opponents' devastating critical percentage was %d%%", theirDevCritPct.toFixed(2)); console.log('\n---------------------------'); console.log('\nDetails of your biggest incoming attack:'); console.log("\t%s", bigCombatLogIn); console.log('\nDetails of your biggest outgoing attack:'); console.log("\t%s", bigCombatLogOut); console.log("\n\nYou killed the following: "); mobs = {}; myKills.forEach(function(line) { if (mobs.hasOwnProperty(line)) { mobs[line]++; } else { mobs[line] = 0; } }); for (var who in mobs) { if (mobs[who] > 1) { console.log("\t%d x %s", mobs[who], who.replace("The","").trim()); } else { console.log("\t%s", who); } }