AWBW Stats

Enchanced Stats Charts for Advance Wars By Web

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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)})();
/******/ })()
;