mirror of
https://gitlab.com/lecarore/breakout71.git
synced 2025-04-29 00:09:14 -04:00
99 lines
3.3 KiB
TypeScript
99 lines
3.3 KiB
TypeScript
![]() |
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()
|
||
|
|
||
|
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('')
|
||
|
|
||
|
|
||
|
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
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|