AWBW Stats

Enchanced Stats Charts for Advance Wars By Web

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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址