crushyourfoes
Version:
A LotRO combat log parser
140 lines (107 loc) • 5.44 kB
JavaScript
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);
}
}