AWBW Stats

Enchanced Stats Charts for Advance Wars By Web

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==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)})();
/******/ })()
;