// ==UserScript==
// @name Conquer Club Map Rank GL
// @namespace http://userscripts.org/
// @version 1.5.6
// @description Script to work out Player Map-specific Rank
// @include http://www.conquerclub.com/*
// @include https://www.conquerclub.com/*
// ==/UserScript==
var versiont = GM_info.script.version;
var latestVersiont = 0;
var __eventListeners = [];
var ranks = {};
var updateInfo = {};
var maps = [];
var unique = {};
var totals, myOptions, myStore;
var cid = 0;
var viewer = null;
var ghist = [];
var rateReq = [];
var xrateReq = [];
var current = -1;
var suggtot = 0;
var phist = "";
var loadedName = "";
var icons = 0;
var ratings = 0;
var dark = 0;
var pcount = 0;
var sortable = ["smap","spts","swin","suni","skil", "srel"];
var graphTypes = {
'points' : new GraphType("Points","point gain/loss",pointsalg,1000, "red",null,null) ,
'winloss' : new GraphType("Win/Loss %","win/loss",winlossalg,0, "green(win) and red(loss)",100,0)
};
var gm = {
standard : 'S',
terminator : 'C',
assassin: 'A',
doubles: 'D',
triples : 'T',
quadruples : 'Q'
};
function findKeyByValue(object, value) {
for (var key in object) {
if (object[key] == value) {
return key;
}
}
return undefined;
};
var modulo = {
'D' : 2,
'T' : 3,
'Q' : 4
};
var medlev = {
'standard' : [0,20,100,400],
'crossmap' : [0,20,40,60],
'rating' : [0,40,200,500]
};
var medname = ["0", "Bronze (1)", "Silver (2)", "Gold (3)"];
var medclass = ["nomedal", "bmedal", "smedal", "gmedal", "omedal"];
var meddivclass = ["nomeddiv", "bmeddiv", "smeddiv", "gmeddiv", "omeddiv"];
var medcombo = ["manual", "freestyle", "fog", "speed", "crossmap", "nuclear"];
var medcombourl = ["&it=M", "&po=F", "&wf=Y", "&tw=Y" , "&sg=Y", "", "&bc=4"];
var medmatrix = []; // all possible combinations to get medals.
for (var i = 0; i < medcombo.length; i++) {
for (var j = 0, length = medmatrix.length; j < length; j++) {
var temp = medmatrix[j].slice(0);
temp.push(i);
medmatrix.push(temp);
}
medmatrix.push([i]);
}
medmatrix.sort(function(a,b) { // longest first
return b.length - a.length;
});
var slider;
var sarray;
var baseURL = window.location.protocol + "//www.conquerclub.com/";
var surl = "";
var lastLog = new Date();
lastLog.setFullYear(2008,1,13);
var lastTime = lastLog.getTime();
function Point(time, points) {
this._time = time;
this._points = points;
}
function Rank() {
this._wins = 0;
this._rank = 0;
this._counter = 0;
this._firsts = 0;
this._wonfirsts = 0;
this._missing = 0;
this._games = [];
this._parray = [];
this._warray = [];
this._kills = 0;
this._meanwin = 0;
this._beaten = 0;
this._defeats = new Defeats();
}
function Store() {
this._ranks = {};
this._unique = {};
this._date = new Date();
this._total = 0;
}
function Totals(insignia) {
this._insignia = insignia;
this._points = 0;
this._maps = 0;
this._unique = [];
this._crossmap = [];
this._crossmaps = 0;
this._wins = 0;
this._pages = 0;
this._rpages = 0;
this._expected = 0;
this._games = 0;
this._kills = 0;
this._meanwin = 0;
this._beaten = 0;
this._firsts = 0;
this._wonfirsts = 0;
this._missing = 0;
this._realscore = null;
this._parray = [];
this._warray = [];
this._sorted = [];
this._contribute = [];
this._medals = 0;
this._xmedals = 0;
this._counter = 0;
this._types = [];
this._defeats = new Defeats();
}
function pushUnique(array, value) {
if (array.indexOf(value) == -1) {
array.push(value);
}
}
function Defeats() {
this.standard = [];
this.terminator = [];
this.assassin = [];
this.doubles = [];
this.triples = [];
this.quadruples = [];
this.speed = [];
this.manual = [];
this.fog = [];
this.trench = [];
this.freestyle = [];
this.nuclear = [];
this.random = [];
this.rating = [];
this.xStandard = [];
this.xTerminator = [];
this.xAssassin = [];
this.xDoubles = [];
this.xTriples = [];
this.xQuadruples = [];
this.xSpeed = [];
this.xManual = [];
this.xFog = [];
this.xTrench = [];
this.xFreestyle = [];
this.xNuclear = [];
this.xRandom = [];
this.xRating = [];
}
function Summary(name) {
this._medal = name;
this._current = 0;
this._next = 0;
this._medals = 0;
this._best = [];
}
function Pinfo() {
this._defeats = {};
}
function GraphType(type,info,alg,initial,markers,maxbound,minbound) {
this._type = type;
this._info = info;
this._markers = markers;
this._running = function(array) {
return(alg(array));
};
this._initial = initial;
this._maxbound = maxbound;
this._minbound = minbound;
}
function Streak() {
this._start = 0;
this._num = 0;
}
function PointInfo(data, colour) {
this._data = [];
this._colour = [];
this._winstreak = new Streak();
this._losstreak = new Streak();
}
function Slide(length,to,parray) {
this._pxLen = length;
this._scale = to / length;
this._toVal = to;
this._parray = parray;
}
function MapOpts(player2, num, type, bonus, order, fort, fog, trench, joinable, speed, tname, versus, versus2, ex1, ex2, player3,player4,versus3,versus4,ex3,ex4,troops) {
this._pcount = 0;
this._players = {
p2: player2,
p3: player3,
p4: player4,
v1: versus,
v2: versus2,
v3: versus3,
v4: versus4,
x1: ex1,
x2: ex2,
x3: ex3,
x4: ex4
};
for (var i in this._players) {
if (this._players[i]) {
this._pcount++;
}
}
this._num = num;
this._type = type;
this._bonus = bonus;
this._order = order;
this._troops = troops;
this._fort = fort;
this._fog = fog;
this._trench = trench;
this._joinable = joinable;
this._speed = speed;
this._tname = tname;
}
function addListener(instance, eventName, listener) {
var listenerFn = listener;
instance.addEventListener(eventName, listenerFn, false);
var event = {
instance: instance,
name: eventName,
listener: listenerFn
};
__eventListeners.push(event);
return event;
}
function removeListener(event) {
var instance = event.instance;
instance.removeEventListener(event.name, event.listener, false);
for (var i = 0; i < __eventListeners.length; i++) {
if (__eventListeners[i] == event) {
__eventListeners.splice(i, 1);
break;
}
}
}
function setThumbnails(opts) {
var thumbs = '';
for (var i = 0; i < opts.length; i++) {
if (opts[i].selected) {
var map_status = (unsafeWindow.mapStatuses[i] == 'B') ? 'http://static.conquerclub.com/map_beta.png' : 'http://static.conquerclub.com/map_normal.png';
thumbs += ' ';
}
}
unsafeWindow.map_thumbs.innerHTML = thumbs;
unsafeWindow.initLightbox();
}
function pointsalg(array) {
var counter = 1000;
var running = new PointInfo();
for (var f=0; f< array.length; f++) {
counter += array[f]._points;
running._data.push(counter);
if (array[f]._points < 0) running._colour.push("red");
else running._colour.push("green");
}
return running;
}
function winlossalg(array) {
var counter = 0;
var winstreak = new Streak();
var losstreak = new Streak();
var running = new PointInfo();
if (array[0]._points == 1) {
counter += array[0]._points;
running._colour.push("green");
winstreak._num++;
} else {
running._colour.push("red");
losstreak._num++;
}
running._data.push(100 * counter);
for (var f=1; f< array.length; f++) {
if (array[f]._points == 1) {
counter += array[f]._points;
if (array[f - 1]._points == -1) {
if (losstreak._num > running._losstreak._num) {
running._losstreak._start = losstreak._start;
running._losstreak._num = losstreak._num;
}
winstreak._start = f;
winstreak._num = 0;
}
winstreak._num++;
running._colour.push("green");
}
else{
if (array[f - 1]._points == 1) {
if (winstreak._num > running._winstreak._num) {
running._winstreak._start = winstreak._start;
running._winstreak._num = winstreak._num;
}
losstreak._start = f;
losstreak._num = 0;
}
losstreak._num++;
running._colour.push("red");
}
running._data.push((100 * counter / (f+1)).toFixed(0));
}
if (array[f - 1]._points == -1) {
if (losstreak._num > running._losstreak._num) {
running._losstreak._start = losstreak._start;
running._losstreak._num = losstreak._num;
}
}
else if (array[f - 1]._points == 1) {
if (winstreak._num > running._winstreak._num) {
running._winstreak._start = winstreak._start;
running._winstreak._num = winstreak._num;
}
}
return running;
}
function cascadewin(pinfoarray, name) {
if (!pinfoarray[name]) return 0;
var retVal = 0;
for (var x in pinfoarray[name]._defeats) {
retVal += pinfoarray[name]._defeats[x] + (pinfoarray[name]._defeats[x] * cascadewin(pinfoarray,x));
}
return retVal;
}
function cascadeloss(pinfoarray, name) {
if (!pinfoarray[name]) return 1;
var retVal;
for (var x in pinfoarray[name]._defeats) {
retVal = pinfoarray[name]._defeats[x] * cascadeloss(pinfoarray,x);
}
return retVal;
}
function previousSib(node){
var tempNode=node.previousSibling;
while(tempNode.nodeType!=1){
tempNode=tempNode.previousSibling;
}
return tempNode;
}
function nextSib(node){
var tempNode=node.nextSibling;
while(tempNode.nodeType!=1){
tempNode=tempNode.nextSibling;
}
return tempNode;
}
function setTable() {
var rws = viewer.document.getElementById('ranktable').getElementsByTagName('tr');
var cross = totals._crossmaps;
if (cross >= 60) {
cross = "gmedal";
}
else if (cross >= 40) {
cross = "smedal";
}
else if (cross >= 20) {
cross = "bmedal";
}
var cwidth = totals._maps < 25 ? "noflow" : "";
for (var r=0; r= medlev[s][e]) sm._medals = e;
else{
sm._next = medlev[s][e] - sm._current;
break;
}
}
}
else{
for (var e=0; e< medlev.standard.length; e++) {
if (sm._current >= medlev.standard[e]) sm._medals = e;
else{
sm._next = medlev.standard[e] - sm._current;
break;
}
}
}
totals._medals += sm._medals;
var best = [];
if (sm._current) {
for (var j in ranks) {
if (ranks[j]._defeats[s] && s!= 'rating') {
if (ranks[j]._defeats[s].length > sm._best) {
sm._best = ranks[j]._defeats[s].length;
best = [];
best.push(j);
}
else if (ranks[j]._defeats[s].length == sm._best) best.push(j);
}
}
}
sm._best = best;
summary.push(sm);
if (s == 'speed' || s == 'fog' || s == 'trench' || s == 'freestyle' || s == 'manual' || s == 'nuclear') pm[s] = sm;
}
}
}
for (var m in ranks) {
if (ranks[m]._rank >= 1000) {
srank = "+" + (ranks[m]._rank - 1000);
pos.push(m);
}
else {
srank = ranks[m]._rank - 1000;
neg.push(m);
}
totals._points += ranks[m]._rank - 1000;
var tr = viewer.document.createElement('tr');
totals._sorted.push(m);
totals._sorted.sort();
viewer.document.getElementById('ranktable').insertBefore(tr,viewer.document.getElementById('ranktable').getElementsByTagName('tr')[totals._sorted.indexOf(m)]);
tr.className = "result";
if (unique[m].length >= 5) {
totals._crossmap[maps.indexOf(m)] = 1;
totals._crossmaps++;
mu.push(m);
}
else{
totals._crossmap[maps.indexOf(m)] = 0;
mnu.push(m);
}
if (ranks[m]._missing) {
missing = "" + ranks[m]._missing + "";
totals._missing += ranks[m]._missing;
}
else missing = "";
var td = viewer.document.createElement('td');
td.id = "gtot" + maps.indexOf(m);
td.innerHTML = m + missing;
tr.appendChild(td);
td = viewer.document.createElement('td');
td.innerHTML = '' + getRank(250, ranks[m]._rank) + nextRank(ranks[m]._rank);
tr.appendChild(td);
td = viewer.document.createElement('td');
td.innerHTML = '' + srank;
tr.appendChild(td);
td = viewer.document.createElement('td');
td.id = "wtot" + maps.indexOf(m);
td.innerHTML = ranks[m]._wins + " from " + ranks[m]._counter + "(" + (100 * (ranks[m]._wins)/(ranks[m]._counter)).toFixed(0) + "%)";
tr.appendChild(td);
td = viewer.document.createElement('td');
td.id = "result" + maps.indexOf(m);
td.innerHTML = '' + unique[m].length;
tr.appendChild(td);
td = viewer.document.createElement('td');
td.innerHTML = '' + getKiller(ranks[m]._counter - ranks[m]._wins,ranks[m]._kills);
tr.appendChild(td);
td = viewer.document.createElement('td');
td.innerHTML = '' + getRelative(ranks[m]._meanwin,ranks[m]._beaten);
tr.appendChild(td);
if (ranks[m]._wins) mwon.push(m);
else mlost.push(m);
if (ranks[m]._counter >= 5) freq.push(m);
else nfreq.push(m);
for (var ms =0; msGame " + ranks[m]._games[ms] + "");
}
viewer.document.getElementById('progress').innerHTML = "Scanned " + user + " on " + m;
}
var cm = new Summary('crossmap');
cm._current = totals._crossmaps;
for (var e=0; e< medlev['crossmap'].length; e++) {
if (cm._current >= medlev['crossmap'][e]) cm._medals = e;
else{
cm._next = medlev['crossmap'][e] - cm._current;
break;
}
}
totals._medals += cm._medals;
var best = [];
if (totals._crossmaps) {
for (var j in ranks) {
if (unique[j] && unique[j].length < 5){
if (unique[j].length > cm._best) {
cm._best = unique[j].length;
best = [];
best.push(j);
}
else if (unique[j].length == cm._best) best.push(j);
}
}
}
cm._best = best;
summary.push(cm);
summary.sort(ssort);
var medal = totals._unique.length;
if (medal >= 400) {
medal = "" + medal + "";
}
else if (medal >= 100) {
medal = "" + medal + "";
} else if (medal >= 20) {
medal = "" + medal + "";
} else {
medal = "" + medal + "";
}
var cross = medclass[cm._medals];
var firstLog=new Date();
firstLog.setFullYear(2008,1,6);
var firstTime = firstLog.getTime();
var runningscore = 0;
var dummyscore = 0;
var hiscore = 0;
var hitime = 0;
harray = totals["_parray"];
harray.sort(psort);
for (var t=0; t hiscore) {
hiscore = runningscore;
}
if (totals._realscore != null) {
if (harray[t]._time > lastTime) {
if (runningscore + totals._realscore - totals._points - 1000 > dummyscore) {
dummyscore = runningscore + totals._realscore - totals._points - 1000;
hitime = harray[t]._time;
}
}
if (harray[t]._time < firstTime){
if (runningscore > dummyscore) {
dummyscore = runningscore;
hitime = harray[t]._time;
}
}
}
}
if (totals._points >= 0) trank = "+" + (totals._points);
else trank = totals._points;
if (totals._realscore != null) trank = totals._realscore;
if (totals._missing) missing = "" + totals._missing + "";
else missing = "";
var tds = viewer.document.getElementById('summary').getElementsByTagName('td');
tds[0].id = "gtot";
tds[0].innerHTML = "Totals" + missing + "";
if (totals._realscore != null) {
tds[1].innerHTML = '' + getRank(totals._games, totals._realscore) + nextRank(totals._realscore);
} else {
tds[1].innerHTML = '' + getRank(totals._games, totals._points + 1000) + nextRank(totals._points + 1000);
}
tds[2].innerHTML = '' + trank;
tds[3].id = "wtot";
tds[3].innerHTML = totals._wins + " from " + totals._games + "(" + (100 * (totals._wins)/(totals._games)).toFixed(0) + "%)";
tds[4].innerHTML = '' + medal + " (" + totals._crossmaps + ")";
tds[5].innerHTML = '' + getKiller(totals._games - totals._wins,totals._kills);
tds[6].innerHTML = '' + getRelative(totals._meanwin,totals._beaten);
for (var d=0; d