feat: improve combat feedback and progression
This commit is contained in:
58
scripts/verify-combat-presentation-settings.mjs
Normal file
58
scripts/verify-combat-presentation-settings.mjs
Normal file
@@ -0,0 +1,58 @@
|
||||
import { createServer } from 'vite';
|
||||
|
||||
const server = await createServer({
|
||||
logLevel: 'error',
|
||||
server: { middlewareMode: true, hmr: false },
|
||||
appType: 'custom'
|
||||
});
|
||||
|
||||
function assert(condition, message) {
|
||||
if (!condition) {
|
||||
throw new Error(message);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const presentation = await server.ssrLoadModule('/src/game/settings/combatPresentation.ts');
|
||||
const values = new Map();
|
||||
const storage = {
|
||||
getItem: (key) => values.get(key) ?? null,
|
||||
setItem: (key, value) => values.set(key, value)
|
||||
};
|
||||
|
||||
assert(presentation.loadCombatPresentationMode(storage) === 'important', 'The default mode must show only important cut-ins.');
|
||||
assert(
|
||||
presentation.nextCombatPresentationMode('always') === 'important' &&
|
||||
presentation.nextCombatPresentationMode('important') === 'map' &&
|
||||
presentation.nextCombatPresentationMode('map') === 'always',
|
||||
'The three presentation modes must cycle in the displayed order.'
|
||||
);
|
||||
|
||||
for (const mode of presentation.combatPresentationModes) {
|
||||
presentation.saveCombatPresentationMode(mode, storage);
|
||||
assert(presentation.loadCombatPresentationMode(storage) === mode, `Mode ${mode} did not persist.`);
|
||||
}
|
||||
|
||||
values.set(presentation.combatPresentationStorageKey, 'invalid');
|
||||
assert(presentation.loadCombatPresentationMode(storage) === 'important', 'Invalid stored values must normalize to the default.');
|
||||
|
||||
const normal = {};
|
||||
const critical = { critical: true };
|
||||
const defeated = { defeated: true };
|
||||
const signature = { signature: true };
|
||||
const resonance = { resonance: true };
|
||||
const growth = { growth: true };
|
||||
|
||||
assert(presentation.shouldUseFullCombatCutIn('always', normal), 'Always mode must promote normal attacks.');
|
||||
assert(!presentation.shouldUseFullCombatCutIn('important', normal), 'Important mode must keep normal attacks on the map.');
|
||||
assert(presentation.shouldUseFullCombatCutIn('important', critical), 'Critical hits must be promoted.');
|
||||
assert(presentation.shouldUseFullCombatCutIn('important', defeated), 'Defeats must be promoted.');
|
||||
assert(presentation.shouldUseFullCombatCutIn('important', signature), 'Signature tactics must be promoted.');
|
||||
assert(presentation.shouldUseFullCombatCutIn('important', resonance), 'Resonance actions must be promoted.');
|
||||
assert(presentation.shouldUseFullCombatCutIn('important', growth), 'Level-up actions must be promoted.');
|
||||
assert(!presentation.shouldUseFullCombatCutIn('map', signature), 'Map mode must suppress even signature cut-ins.');
|
||||
|
||||
console.info('Verified combat presentation settings, persistence, cycling, and importance promotion.');
|
||||
} finally {
|
||||
await server.close();
|
||||
}
|
||||
Reference in New Issue
Block a user