48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
import * as e from './common.mjs';
|
|
export function build(t){
|
|
const rules=e.dict();
|
|
for(const r of t.GridFightSeasonExpScoreRow)(rules[r.ScoreRuleID]??=[]).push({
|
|
chapter:r.ChapterID,
|
|
section:r.SectionID,
|
|
weekly:r.WeeklyScore??0,
|
|
exp:r.Exp??0
|
|
});
|
|
for(const rows of Object.values(rules)){
|
|
rows.sort((a, b)=>a.chapter-b.chapter||a.section-b.section);
|
|
if(!e.uniqueValues(rows, r=>[r.chapter, r.section].join(':')))e.fail('duplicate score node');
|
|
}
|
|
const divisions=e.dict();
|
|
for(const r of t.GridFightDivisionStageRow){
|
|
const d={
|
|
rule:r.ScoreRule??0,
|
|
oc_rule:r.OCScoreRule??0,
|
|
weekly_modify:r.WeeklyScoreModify??100,
|
|
exp_modify:r.ExpModify??100
|
|
};
|
|
divisions[r.DivisionID]=d;
|
|
for(const key of ['rule', 'oc_rule'])if(d[key]&&!(d[key]in rules))e.fail(`division ${r.DivisionID}: score rule ${d[key]} has no rows`);
|
|
}
|
|
const ranks=t.GridFightScoreRewardConfigRow.map(r=>({
|
|
rank:r.ScoreRank,
|
|
score:r.Score,
|
|
reward:r.Reward??0
|
|
})).sort((a, b)=>a.rank-b.rank);
|
|
if(!ranks.length)e.fail('Empty score reward table');
|
|
return {
|
|
rules,
|
|
divisions,
|
|
weekly_ranks:ranks,
|
|
weekly_cap:Math.max(...ranks.map(r=>r.score))
|
|
};
|
|
}
|
|
export function main(){
|
|
const a=e.cli([], {
|
|
catalog:e.catalogDefault,
|
|
output:e.resource('score.json')
|
|
}),
|
|
data=build(e.loadJSON(a.catalog).tables);
|
|
e.atomic_json(a.output, data, 1, true);
|
|
console.log(`${a.output}: ${Object.keys(data.rules).length} score rules, ${Object.keys(data.divisions).length} divisions, weekly cap ${data.weekly_cap}`);
|
|
}
|
|
e.runMain(import.meta.url, main);
|