feat: improve combat feedback and progression

This commit is contained in:
2026-07-19 00:34:11 +09:00
parent f29956b90e
commit 87e3ddb047
16 changed files with 1284 additions and 80 deletions

View 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();
}