Widget:UnFPredictionJS

From Granblue Fantasy Wiki
Jump to navigation Jump to search
<script type="application/javascript">
let formatDaysTime = (minutesPassed) => {
    var t = minutesPassed % 1440;
    var d = Math.floor(minutesPassed / 1440) + 1;
    var m = Math.floor(t%60);
    var h = Math.floor(t/60);
    m = m < 10 ? "0" + m.toString() : m
    var dayStr = `Finals Day ${d-3}`;
    if (d < 3) dayStr = `Preliminaries Day ${d}`;
    else if (d == 3) dayStr = 'Interlude';
    else if (d == 4 && h < 7) dayStr = 'Interlude (2)';
    if (t == 0) { d = d-1; t = 1440; }

    return d >= 7 ? 'Final Result' : `${dayStr}, ${h}:${m}`;
}

let convertTeamRaidTime = (s) => {
    return formatDaysTime(1160 + (s/60) - 20);
}

let midpoint = (x,y) => { return Math.floor((x+y)/2);}

let findIndex = (list, key, defaultTo = 0) => {
    let min = 0, max = list.length-1, mid = midpoint(min,max), midi = parseInt(list[mid]);
    if (key < parseInt(list[min]) || parseInt(list[max]) < key) {
        console.log('Not in Ordered List', list, key, defaultTo); 
        return defaultTo;
    }
/*
    for (;midi != key && !(midi < key && key < parseInt(list[mid+1])); mid = midpoint(min,max), midi = parseInt(list[mid])) {
        if (midi < key) { min = mid; }
        else { max = mid; }
    }
    return mid;
*/
    return list.findIndex(x=>parseInt(x) >= key);
}

let result = document.querySelector('table#prediction-result tbody');
let asOf = document.querySelector('span#prediction-time code');

for (var data of document.querySelectorAll('div#prediction-data .prediction-data')) {
    let tier = data.dataset.label ?? data.dataset.tier;
    let prev = data.querySelector('.prev span');
    let curr = data.querySelector('.curr span');
    let prevData = {
        x: prev.dataset.seriesX.split(','),
        y: prev.dataset.seriesY.split(',')
    }
    let currData = {
        x: curr.dataset.seriesX.split(','),
        y: curr.dataset.seriesY.split(',')
    }
    let i = currData.y.length-1;
    let pi= findIndex(prevData.x, currData.x[i], i);
    let prevVal = parseInt(prevData.y[pi]);
    let currVal = parseInt(currData.y[i]);
    let prevFinal = parseInt(prevData.y[prevData.y.length-1]);
    let predict = prevFinal*currVal/prevVal;
    if (asOf.innerHTML == '') asOf.innerHTML = convertTeamRaidTime (parseInt(currData.x[i]));

    result.innerHTML += `
<tr>
<th style="text-align:right;">${tier}</th>
<td>${prevVal.toLocaleString(void 0)}</td>
<td>${currVal.toLocaleString(void 0)}</td>
<td>${prevFinal.toLocaleString(void 0)}</td>
<th style="text-align:right;">${predict.toLocaleString(void 0,{maximumFractionDigits:0})}</th>
<td>${(predict-prevFinal).toLocaleString(void 0,{maximumFractionDigits:0})}</td>
</tr>`;
}
</script>