AWBW Stats

Enchanced Stats Charts for Advance Wars By Web

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name          AWBW Stats
// @namespace     https://github.com/zielinskigr/awbw_stats/
// @version       0.2.14
// @author        zielinskigr
// @source        https://github.com/zielinskigr/awbw_stats/
// @match         https://awbw.amarriner.com/2030.php*
// @require       https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js
// @icon          https://raw.githubusercontent.com/zielinskigr/awbw_stats/main/res/img/stats128.png
// @description   Enchanced Stats Charts for Advance Wars By Web
// ==/UserScript==


/******/ (() => { // webpackBootstrap
var __webpack_exports__ = {};
(()=>{"use strict";async function t(t){return await new Promise((e=>setTimeout(e,t)))}async function e(t,e=0){return(await fetch("https://awbw.amarriner.com/api/game/load_replay.php",{method:"POST",body:JSON.stringify({gameId:t,turn:e,initial:!0})})).json()}const a=t=>{t.attributes=t.attributes||[],t.classes=t.classes||[],t.children=t.children||[];const e=document.createElement(t.tag);return e.classList.add(...t.classes),t.attributes.forEach((([t,a])=>{e.setAttribute(t,a)})),e.innerText="",t.children.forEach((t=>{"string"==typeof t?e.innerText+=t:e.appendChild(t)})),e},n={fundschart:{name:"Total Funds Generated",button:{id:"fundsbutton",children:"Total Funds",chartName:"fundschart"},dataset:[{name:"fundsDataSet",type:"line"}],data:"funds"},incomechart:{name:"Income",button:{id:"incomebutton",children:"Income",chartName:"incomechart"},dataset:[{name:"incomeDataSet",type:"line"}],data:"income"},ucchart:{name:"Unit Count",button:{id:"ucbutton",children:"Unit Count",chartName:"ucchart"},dataset:[{name:"ucDataSet",type:"line"}],data:"unitCount"},uvchart:{name:"Unit Value",button:{id:"uvbutton",children:"Army Value",chartName:"uvchart"},dataset:[{name:"uvDataSet",type:"line"}],data:"unitValue"},hpchart:{name:"Unit HP",button:{id:"hpbutton",children:"Unit HP",chartName:"hpchart"},dataset:[{name:"hpDataSet",type:"line"}],data:"unitHP"},capturechart:{name:"Caps",button:{id:"capturebutton",children:"Caps",chartName:"capturechart"},dataset:[{name:"captureDataSet",type:"bar"}],data:"captureCount"},damagedealtchart:{name:"Damage Dealt",button:{id:"damagedealtbutton",children:"Damage Dealt",chartName:"damagedealtchart"},dataset:[{name:"damageDealtDataSet",type:"bar"}],data:"damageDealt"}},r={1:{primary:"#F46243",secondary:"#F89F8B",tertiary:"#D4310C"},2:{primary:"#446EFF",secondary:"#99AFFF",tertiary:"#001F8F"},3:{primary:"#12D815",secondary:"#8EF690",tertiary:"#064B07"},4:{primary:"#FBD412",secondary:"#FDE986",tertiary:"#B59703"},5:{primary:"#8A3E96",secondary:"#C78BD0",tertiary:"#5D2965"},6:{primary:"#C4443D",secondary:"#CF6863",tertiary:"#9C3530"},7:{primary:"#999B98",secondary:"#C2C2C1",tertiary:"#525251"},8:{primary:"#C58950",secondary:"#DBB694",tertiary:"#8A5A2E"},9:{primary:"#FCA339",secondary:"#FDC886",tertiary:"#DD7B03"},10:{primary:"#CBDDBA",secondary:"#A2C284",tertiary:"#6F964A"},16:{primary:"#1B43BD",secondary:"#3B65E3",tertiary:"#122D7D"},17:{primary:"#FE68CF",secondary:"#FE9ADF",tertiary:"#FD0DB1"},19:{primary:"#3ACFC1",secondary:"#7CDFD5",tertiary:"#208379"},20:{primary:"#CE64FE",secondary:"#DF9AFE",tertiary:"#A602F2"},21:{primary:"#5F7C0C",secondary:"#8DBA12",tertiary:"#B3E920"},22:{primary:"#BB534F",secondary:"#C66F6C",tertiary:"#E2B7B6"}};async function s(){const s=document.getElementById("gamecontainer"),i=function(){let t=[],e=[];Object.keys(n).forEach((r=>{let s=a({tag:"div",attributes:[["id",n[r].button.id]],children:[n[r].button.children]});s.onclick=()=>{Object.keys(n).forEach((t=>{document.getElementById(n[t].button.chartName).setAttribute("style","display: none;max-width: 100%!important; width: 100%!important;")})),document.getElementById(n[r].button.chartName).setAttribute("style","display: block;max-width: 100%!important; width: 100%!important;")};let i=a({tag:"canvas",attributes:[["style","display: none;max-width: 100%!important;width: 100%!important;"],["id",n[r].button.chartName]]});t.push(s),e.push(i)}));const r=a({tag:"div",attributes:[["style","position:absolute;right: -10px;background: #ddd;padding: 5px;top: -6px;"],["id","closebutton"]],children:["X"]});r.onclick=()=>{o.remove()};const s=a({tag:"div",attributes:[["id","chartsmenu"],["style","position:relative;display: flex;flex-flow: row;justify-content: space-around;margin-top: -25px;margin-bottom: 10px;cursor: pointer;"]],children:[...t,r]}),i=a({tag:"div",attributes:[["id","chartloader"]],children:["Fetching game data, this can take up to a minute depending on game length, please wait..."]}),u=a({tag:"div",attributes:[["id","chartswrapper"],["style","position: relative; width: 100%;"]],children:[i,...e]}),o=a({tag:"div",attributes:[["id","chartscontainer"],["style","position: relative; margin-top:20px;top: 33%;max-width: 1000px;width: 100%;height: 500px;padding: 40px 20px 20px;background: #fff;overflow: hidden;display: flex;flex-flow: column;"]],children:[s,u]});return o}();let u;s.appendChild(i);try{u=await async function(){const a=new URLSearchParams(window.location.search).get("games_id"),n=await async function(a){const n=await e(a),r=n.daySelector.length;let s,i={};if(2!==n.players.length)throw new Error("Can only work on 2 players, sorry.");n.players.forEach((async t=>{i[t.id]={player:t,turnsArray:[]}}));let u=0;for(;u<r;)await t(250),s=await e(a,u),i[s.gameState.currentTurnPId].turnsArray.push(s),u++;return i}(a);let r={};const s=Object.keys(n);let i={};Object.keys(n).forEach((t=>{t==s[0]?i[t]=n[s[0]].player.order>n[s[1]].player.order?2:1:i[t]=n[s[1]].player.order>n[s[0]].player.order?2:1})),Object.keys(n).forEach((t=>{r[t]={name:n[t].turnsArray[0].gameState.players[t].users_username,turns:n[t].turnsArray.length,country:n[t].player.countries_id,turnOrder:i[t],units:[],funds:[],income:[],unitCount:[],unitValue:[],unitHP:[],unitHPCount:[],captureCount:[],damageDealt:[],damageTaken:[],coPowers:[],coPowerData:[]}}));let u=[];return Object.keys(n).forEach((t=>{let e=0;n[t].turnsArray.forEach(((a,n)=>{r[t].coPowers[n]=0,r[s[0]].units[n]=a.gameState.units,r[s[1]].units[n]=a.gameState.units,e+=a.gameState.players[t].players_income;let o=0;Object.values(a.gameState.units).forEach((e=>{e.units_players_id==t&&(o+=e.units_hit_points)}));let c=o/a.gameState.players_units_count[t].total;const d=((t,e,a,n,r,s)=>{let i=0,u=0,o=0,c=0,d=0,l={};return s.forEach((t=>{l[t]={},l[t].funds=0,l[t].turnNumber=a,l[t].turnOrder=n[e].turnOrder})),Object.values(t.actions).forEach((r=>{if("Power"===r.action&&(n[e].coPowers[a]++,r.hpChange&&(r.hpChange.hpGain&&r.hpChange.hpGain.players.forEach((t=>{Object.values(n[t].units[a]).forEach((e=>{n[t].units[a][e.units_id].units_hit_points+=r.hpChange.hpGain.hp,n[t].units[a][e.units_id].units_hit_points>=10&&(n[t].units[a][e.units_id].units_hit_points=10)}))})),r.hpChange.hpLoss&&r.hpChange.hpLoss.players.forEach((t=>{Object.values(n[t].units[a]).forEach((e=>{n[t].units[a][e.units_id].units_hit_points+=r.hpChange.hpLoss.hp,n[t].units[a][e.units_id].units_hit_points<=0&&(n[t].units[a][e.units_id].units_hit_points=0)}))}))),r.playerReplace&&Object.keys(r.playerReplace).forEach((t=>{r.playerReplace[t].players_funds&&(l[t].funds=Math.round(.333333*r.playerReplace[t].players_funds,0))}))),"Capt"===r.action&&20==r.buildingInfo.buildings_capture&&i++,"Fire"===r.action){let s=r.attacker.units_id,i=(n[e].units[a][s].units_players_id,n[e].units[a][s].units_cost),h=n[e].units[a][s].units_hit_points,p=r.attacker.units_hit_points;10!=p&&(0==p?(o=Math.round(i/10*h),n[e].units[a][s].units_hit_points=0):(o=Math.round(i/10*(h-p)),n[e].units[a][s].units_hit_points=p));let y=r.defender.units_id,m=(t.gameState.units[y].units_players_id,n[e].units[a][y].units_cost),f=n[e].units[a][y].units_hit_points,g=r.defender.units_hit_points;10!=g&&(0==g?(u=Math.round(m/10*f),n[e].units[a][y].units_hit_points=0):(u=Math.round(m/10*(f-g)),n[e].units[a][y].units_hit_points=g)),c+=u,d+=o,r.gainedFunds&&Object.keys(r.gainedFunds).forEach((t=>{l[t].funds+=r.gainedFunds[t]}))}})),{captures:i,chartData:n,wholeDamageDealt:c,wholeDamageTaken:d,fundsGenerated:l}})(a,t,n,r,0,s);r=d.chartData;const l=d.captures,h=d.wholeDamageDealt,p=d.wholeDamageTaken;u.push(d.fundsGenerated),r[t].funds.push({x:`${n+1}.${i[t]}`,y:e}),r[t].income.push({x:`${n+1}.${i[t]}`,y:a.gameState.players[t].players_income}),r[t].unitCount.push({x:`${n+1}.${i[t]}`,y:a.gameState.players_units_count[t].total}),r[t].unitValue.push({x:`${n+1}.${i[t]}`,y:a.gameState.players_units_count[t].value}),r[t].unitHP.push({x:`${n+1}.${i[t]}`,y:o}),r[t].unitHPCount.push({x:`${n+1}.${i[t]}`,y:c}),r[t].captureCount.push({x:`${n+1}.${i[t]}`,y:l}),t==s[0]?(r[s[0]].damageDealt.push({x:`${n+1}.${i[t]}`,y:h}),r[s[1]].damageDealt.push({x:`${n+1}.${i[t]}`,y:p})):(r[s[1]].damageDealt.push({x:`${n+1}.${i[t]}`,y:h}),r[s[0]].damageDealt.push({x:`${n+1}.${i[t]}`,y:p}))}))})),Object.values(u).forEach((t=>{Object.keys(n).forEach((e=>{if(0!=t[e].funds){let a=`${t[e].turnNumber+1}.${t[e].turnOrder}`,n=!1;if(r[e].funds.forEach(((s,i)=>{1==n&&(r[e].funds[i].y+=t[e].funds),s.x==a&&(r[e].funds[i].y+=t[e].funds,n=!0)})),!n)if(r[e].turnOrder<t[e].turnOrder){let n=r[e].funds[t[e].turnNumber].y;r[e].funds.forEach(((a,n)=>{n>t[e].turnNumber&&(r[e].funds[n].y+=t[e].funds)})),r[e].funds.push({x:a,y:n+t[e].funds})}else{let n=r[e].funds[t[e].turnNumber-1].y;r[e].funds.forEach(((a,n)=>{n>t[e].turnNumber-1&&(r[e].funds[n].y+=t[e].funds)})),r[e].funds.push({x:a,y:n+t[e].funds})}}}))})),Object.keys(n).forEach((t=>{r[t].funds.sort(((t,e)=>t.y-e.y)),r[t].coPowers.forEach(((e,a)=>{1==e&&r[t].coPowerData.push({x:`${a+1}.${i[t]}`,y:0,r:10})}))})),r}()}catch(t){i.remove(),console.log(t)}if(!u)throw i.remove(),new Error("Failed to load game data.");document.getElementById("chartloader").remove(),Object.keys(u);const o=Math.max(...(t=>{let e=[];return Object.values(t).forEach((t=>{e.push(t.turns)})),e})(u));!function(t,e){let a=function(t){let e={fundsDataSet:[],incomeDataSet:[],ucDataSet:[],uvDataSet:[],uvDataSet2:[],hpDataSet:[],hpcDataSet:[],ucuvDataSet:[],captureDataSet:[],damageDealtDataSet:[],damageTakenDataSet:[],coPowerDataSet:[]};return Object.keys(n).forEach((a=>{"UC/UV"==n[a].name||Object.values(t).forEach((t=>{let s={label:t.name+" "+n[a].name,backgroundColor:r[t.country].primary,borderColor:r[t.country].primary,data:t[n[a].data]};e[n[a].dataset[0].name].push(s);let i={label:t.name+" Power",backgroundColor:r[t.country].secondary,borderColor:r[t.country].secondary,data:t.coPowerData,type:"bubble"};e[n[a].dataset[0].name].push(i)}))})),e}(t);Object.keys(n).forEach((t=>{const r={labels:e,datasets:a[n[t].dataset[0].name]},s={type:n[t].dataset[0].type,data:r,options:{}};new Chart(document.getElementById(t),s)})),document.getElementById("fundschart").setAttribute("style","display: block;")}(u,Array.from(Array(o).keys(),(t=>[[`${t+1}.1`],[`${t+1}.2`]].flat())).flat())}var i;i=function(){const t=a({tag:"div",classes:["game-tools-bg"],children:["Stats"]}),e=a({tag:"div",classes:["game-tools-btn","enchanced-stats"],children:[t]});e.onclick=()=>{s()};const n=a({tag:"section",children:[e]});document.getElementById("game-menu-controls").prepend(n)}(),"complete"===document.readyState||"interactive"===document.readyState?setTimeout(i,1):document.addEventListener("DOMContentLoaded",i)})();
/******/ })()
;