This commit is contained in:
Renan LE CARO 2025-04-07 14:08:48 +02:00
parent 9624c5b351
commit e78021ff83
24 changed files with 840 additions and 437 deletions

View file

@ -1,99 +1,117 @@
import {getHistory} from "./gameOver";
import {icons} from "./loadGameData";
import {t} from "./i18n/i18n";
import {asyncAlert} from "./asyncAlert";
import {rawUpgrades} from "./upgrades";
import { getHistory } from "./gameOver";
import { icons } from "./loadGameData";
import { t } from "./i18n/i18n";
import { asyncAlert } from "./asyncAlert";
import { rawUpgrades } from "./upgrades";
export function runHistoryViewerMenuEntry(){
const history = getHistory()
export function runHistoryViewerMenuEntry() {
const history = getHistory();
return {
icon:icons['icon:history'],
text:t('history.title'),
disabled : history.length<10,
help: history.length<10 ? t('history.locked'):t('history.help',{count:history.length}),
async value(){
let sort = 0
let sortDir = -1
let columns = [
{
label:t('history.columns.started'),
field: r=>r.started,
render(v){
return new Date(v).toISOString().slice(0,10)
}
},
{
label:t('history.columns.score'),
field: r=>r.score
},
{
label:t('history.columns.runTime'),
tooltip:t('history.columns.runTime_tooltip'),
return {
icon: icons["icon:history"],
text: t("history.title"),
disabled: history.length < 10,
help:
history.length < 10
? t("history.locked")
: t("history.help", { count: history.length }),
async value() {
let sort = 0;
let sortDir = -1;
let columns = [
{
label: t("history.columns.started"),
field: (r) => r.started,
render(v) {
return new Date(v).toISOString().slice(0, 10);
},
},
{
label: t("history.columns.score"),
field: (r) => r.score,
},
{
label: t("history.columns.runTime"),
tooltip: t("history.columns.runTime_tooltip"),
field: r=>r.runTime,
render(v){
return Math.floor(v/1000)+'s'
}
},
{
label:t('history.columns.puck_bounces'),
tooltip:t('history.columns.puck_bounces_tooltip'),
field: r=>r.puck_bounces,
},
{
label:t('history.columns.max_combo'),
field: r=>r.max_combo,
},
{
label:t('history.columns.upgrades_picked'),
field: r=>r.upgrades_picked,
},
...rawUpgrades.map(u=>({
label: icons['icon:'+u.id],
tooltip:u.name,
field: r=>r.perks[u.id]||0,
render(v){
if(!v) return '-'
return v
}
}))
]
while(true){
const header = columns.map((c, ci) => `<th data-tooltip="${c.tooltip || ''}" data-resolve-to="sort:${ci}">${c.label}</th>`).join('')
const toString = v => v.toString()
const tbody = history.sort((a, b) => sortDir * (columns[sort].field(a) - columns[sort].field(b))).map(h => '<tr>' + columns.map(c => {
const value = c.field(h) ?? 0
const render = c.render || toString
return '<td>' + render(value) + '</td>'
}).join('') + '</tr>').join('')
field: (r) => r.runTime,
render(v) {
return Math.floor(v / 1000) + "s";
},
},
{
label: t("history.columns.puck_bounces"),
tooltip: t("history.columns.puck_bounces_tooltip"),
field: (r) => r.puck_bounces,
},
{
label: t("history.columns.max_combo"),
field: (r) => r.max_combo,
},
{
label: t("history.columns.upgrades_picked"),
field: (r) => r.upgrades_picked,
},
...rawUpgrades.map((u) => ({
label: icons["icon:" + u.id],
tooltip: u.name,
field: (r) => r.perks?.[u.id] || 0,
render(v) {
if (!v) return "-";
return v;
},
})),
];
while (true) {
const header = columns
.map(
(c, ci) =>
`<th data-tooltip="${c.tooltip || ""}" data-resolve-to="sort:${ci}">${c.label}</th>`,
)
.join("");
const toString = (v) => v.toString();
const tbody = history
.sort(
(a, b) =>
sortDir * (columns[sort].field(a) - columns[sort].field(b)),
)
.map(
(h) =>
"<tr>" +
columns
.map((c) => {
const value = c.field(h) ?? 0;
const render = c.render || toString;
return "<td>" + render(value) + "</td>";
})
.join("") +
"</tr>",
)
.join("");
const result = await asyncAlert({
title: t('history.title'),
className: 'history',
content: [
`
const result = await asyncAlert({
title: t("history.title"),
className: "history",
content: [
`
<table>
<thead><tr>${header}</tr></thead>
<tbody>${tbody}</tbody>
</table>
`
]
})
if(!result) return
if(result.startsWith('sort:')){
const newSort = parseInt(result.split(':')[1])
if(newSort==sort){
sortDir*=-1
}else{
sortDir=-1
sort=newSort
}
}
}
`,
],
});
if (!result) return;
if (result.startsWith("sort:")) {
const newSort = parseInt(result.split(":")[1]);
if (newSort == sort) {
sortDir *= -1;
} else {
sortDir = -1;
sort = newSort;
}
}
}
}
}
},
};
}