Skip to content

Instantly share code, notes, and snippets.

Created March 10, 2017 07:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/d22b47bbd2a11c8257941e7df4dea8f6 to your computer and use it in GitHub Desktop.
Save anonymous/d22b47bbd2a11c8257941e7df4dea8f6 to your computer and use it in GitHub Desktop.
Either download the file or replace all the coding here with all the coding in pcstats.js
var pcstatnames = {
0: 'Shots',
1: 'ShotsThatDamage',
2: 'SpecialAbilityUses',
3: 'TilesUncovered',
4: 'Teleports',
5: 'PotionsDrunk',
6: 'MonsterKills',
7: 'MonsterAssists',
8: 'GodKills',
9: 'GodAssists',
10: 'CubeKills',
11: 'OryxKills',
12: 'QuestsCompleted',
13: 'PirateCavesCompleted',
14: 'UndeadLairsCompleted',
15: 'AbyssOfDemonsCompleted',
16: 'SnakePitsCompleted',
17: 'SpiderDensCompleted',
18: 'SpriteWorldsCompleted',
19: 'LevelUpAssists',
20: 'MinutesActive',
21: 'TombsCompleted',
22: 'TrenchesCompleted',
23: 'JunglesCompleted',
24: 'ManorsCompleted',
25: 'ForestMazeCompleted',
28: 'HauntedCemetarysCompleted',
30: 'MadLabsCompleted',
31: 'DavyJonesLockersCompleted',
34: 'IceCavesCompleted',
35: 'DeadwaterDocksCompleted',
36: 'CrawlingDepthsCompleted',
37: 'WoodlandLabyrinthCompleted',
39: 'ShattersCompleted',
41: 'PuppetMastersTheatreCompleted',
42: 'SewersCompleted',
43: 'HivesCompleted',
}
var shortdungeonnames = { // sorted by "tier"
13: 'Pirate',
23: 'Jungle',
17: 'Spider',
16: 'Snake',
18: 'Sprite',
24: 'Manor',
14: 'UDL',
15: 'Abyss',
22: 'Trench',
21: 'Tomb',
}
var bonuses = {
'Ancestor': function(s, c) {
return (c.id < 2) ? {mul: 0.1, add: 20} : 0;
},
'Legacy Builder': function(s, c, d) {
// 0.1
},
'Pacifist': function(s) {
return s[1] ? 0 : 0.25;
},
'Thirsty': function(s) {
return s[5] ? 0 : 0.25;
},
'Mundane': function(s) {
return s[2] ? 0 : 0.25;
},
'Boots on the Ground': function(s) {
return s[4] ? 0 : 0.25;
},
'Tunnel Rat': function(s) {
for (var i in shortdungeonnames) if (!s[i]) return 0;
return 0.1;
},
'Enemy of the Gods': function(s) {
return (s[8] / (s[6] + s[8]) > 0.1) ? 0.1 : 0;
},
'Slayer of the Gods': function(s) {
return (s[8] / (s[6] + s[8]) > 0.5) ? 0.1 : 0;
},
'Oryx Slayer': function(s) {
return s[11] ? 0.1 : 0;
},
'Accurate': function(s) {
return (s[1] / s[0] > 0.25) ? 0.1 : 0;
},
'Sharpshooter': function(s) {
return (s[1] / s[0] > 0.5) ? 0.1 : 0;
},
'Sniper': function(s) {
return (s[1] / s[0] > 0.75) ? 0.1 : 0;
},
'Explorer': function(s) {
return (s[3] > 1e6) ? 0.05 : 0;
},
'Cartographer': function(s) {
return (s[3] > 4e6) ? 0.05 : 0;
},
'Team Player': function(s) {
return (s[19] > 100) ? 0.1 : 0;
},
'Leader of Men': function(s) {
return (s[19] > 1000) ? 0.1 : 0;
},
'Doer of Deeds': function(s) {
return (s[12] > 1000) ? 0.1 : 0;
},
'Friend of the Cubes': function(s) {
return s[10] ? 0 : 0.1;
},
'Well Equipped': function(s, c) {
var eq = c.Equipment.split(',');
var b = 0;
for (var i = 0; i < 4; i++) {
var it = items[+eq[i]] || items[-1];
b += it[5];
}
return b * 0.01;
},
'First Born': function(s, c, d, f) {
return (d.Account.Stats.BestCharFame < f) ? 0.1: 0;
},
}
var goals = {
'Tunnel Rat': function(s) {
var r = [];
for (var i in shortdungeonnames) {
if (!s[i]) r.push(shortdungeonnames[i]);
}
return [r.join(', '), 'dungeons'];
},
'Enemy of the Gods': function(s) {
var x = s[6] / 9 - s[8];
if (Math.ceil(x) == x) x += 1;
return [Math.ceil(x), 'god kills'];
},
'Slayer of the Gods': function(s) {
return [s[6] - s[8] + 1, 'god kills'];
},
'Oryx Slayer': function(s) {
return s[11] ? 0 : [1, 'Oryx kill'];
},
'Accurate': function(s) {
var x = (0.25 * s[0] - s[1]) / 0.75;
if (Math.ceil(x) == x) x += 1;
return [Math.ceil(x), 'shots'];
},
'Sharpshooter': function(s) {
var x = (0.5 * s[0] - s[1]) / 0.5;
if (Math.ceil(x) == x) x += 1;
return [Math.ceil(x), 'shots'];
},
'Sniper': function(s) {
var x = (0.75 * s[0] - s[1]) / 0.25;
if (Math.ceil(x) == x) x += 1;
return [Math.ceil(x), 'shots'];
},
'Explorer': function(s) {
return [1e6 - s[3] + 1, 'tiles'];
},
'Cartographer': function(s) {
return [4e6 - s[3] + 1, 'tiles'];
},
'Team Player': function(s) {
return [100 - s[19] + 1, 'party levelups'];
},
'Leader of Men': function(s) {
return [1000 - s[19] + 1, 'party levelups'];
},
'Doer of Deeds': function(s) {
return [1000 - s[12] + 1, 'quests'];
},
}
function readstats(pcstats) {
function readInt32BE(str, idx) {
var r = 0;
for (var i = 0; i < 4; i++) {
var t = str.charCodeAt(idx + 3 - i);
r += t << (8 * i);
}
return r;
}
pcstats = pcstats || ''
var b = atob(pcstats.replace(/-/g, '+').replace(/_/g, '/'));
var r = [];
for (var i = 0; i < b.length; i += 5) {
var f = b.charCodeAt(i);
var val = readInt32BE(b, i + 1);
r[f] = val;
}
for (var i in pcstatnames) if (!r[i]) r[i] = 0;
return r;
}
function printstats(c, d, dogoals, dostats) {
var st = readstats(c.PCStats);
var $c = $('<table class="pcstats" />');
var fame = +c.CurrentFame;
function tline(name, val, cl) {
$('<tr>')
.append($('<td>').text(name))
.append($('<td>').addClass(cl || 'pcstat').text(val))
.appendTo($c);
}
function gline(t, b) {
$('<tr>')
.append($('<td colspan=2>')
.addClass('goal')
.append($('<span>').text(t))
.append($('<span class="bonus">').text(b))).appendTo($c);
}
if (dogoals) {
var p = '';
for (var a in goals) {
var x = goals[a](st);
if (!x || x[0] <= 0) continue;
var s = x[0] + ' for ';
if (p != x[1]) {
p = x[1]
s = '\u2022 ' + x[1] + ': ' + s
}
gline(s, a);
}
}
if (!dostats) return $c;
for (var i in st) {
if (!st[i]) continue;
var sname = pcstatnames[i] || '#' + i;
tline(sname, st[i]);
}
if (st[20] > 59) {
var v = st[20], r = []
var divs = { 'd': 24 * 60, 'h': 60, 'm': 1 }
for (var s in divs) {
if (r.length > 2) break;
var t = Math.floor(v / divs[s]);
if (t) r.push(t + s);
v %= divs[s];
}
tline('Active', r.join(' '), 'info');
}
if (st[0] && st[1]) {
tline('Accuracy', Math.round(10000 * st[1] / st[0]) / 100 + '%', 'info');
}
if (st[8]) {
tline('God kill ratio', Math.round(10000 * st[8] / (st[6] + st[8])) / 100 + '%', 'info');
}
if (!fame) return $c;
for (var k in bonuses) {
var b = bonuses[k](st, c, d, fame);
if (!b) continue;
var incr = 0;
if (typeof b == 'object') {
incr += b.add;
b = b.mul;
}
incr += Math.floor(fame * b);
fame += incr;
tline(k, '+' + incr, 'bonus');
}
tline('Total Fame', fame, 'bonus');
return $c;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment