diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 798115e0395..32e105aec66 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -63,6 +63,10 @@ import * as v1_8_3 from "./versions/v1_8_3"; // biome-ignore lint/style/noNamespaceImport: Convenience import * as v1_9_0 from "./versions/v1_9_0"; +// --- v1.10.0 PATCHES --- // +// biome-ignore lint/style/noNamespaceImport: Convenience +import * as v1_10_0 from "./versions/v1_10_0"; + /** Current game version */ const LATEST_VERSION = version; @@ -85,6 +89,7 @@ const sessionMigrators: SessionSaveMigrator[] = []; sessionMigrators.push(...v1_0_4.sessionMigrators); sessionMigrators.push(...v1_7_0.sessionMigrators); sessionMigrators.push(...v1_9_0.sessionMigrators); +sessionMigrators.push(...v1_10_0.sessionMigrators); /** All settings migrators */ const settingsMigrators: SettingsSaveMigrator[] = []; diff --git a/src/system/version_migration/versions/v1_10_0.ts b/src/system/version_migration/versions/v1_10_0.ts new file mode 100644 index 00000000000..9fb95f003a6 --- /dev/null +++ b/src/system/version_migration/versions/v1_10_0.ts @@ -0,0 +1,46 @@ +import type { SessionSaveMigrator } from "#app/@types/SessionSaveMigrator"; +import type { BattlerIndex } from "#app/battle"; +import type { MoveResult, TurnMove } from "#app/field/pokemon"; +import type { SessionSaveData } from "#app/system/game-data"; +import { MoveUseType } from "#enums/move-use-type"; +import type { Moves } from "#enums/moves"; + +/** Prior signature of `TurnMove`; used to ensure parity */ +interface OldTurnMove { + move: Moves; + targets: BattlerIndex[]; + result?: MoveResult; + virtual?: boolean; + turn?: number; + ignorePP?: boolean; +} + +/** + * Fix player pokemon move history entries with updated `MoveUseTypes`, + * based on the prior values of `virtual` and `ignorePP`. + * Needed to ensure Last Resort and move-calling moves still work OK. + * @param data - {@linkcode SystemSaveData} + */ +const fixMoveHistory: SessionSaveMigrator = { + version: "1.10.0", + migrate: (data: SessionSaveData): void => { + const mapTurnMove = (tm: OldTurnMove): TurnMove => ({ + move: tm.move, + targets: tm.targets, + result: tm.result, + turn: tm.turn, + // NOTE: This currently mis-classifies Dancer and Magic Bounce-induced moves, but not much we can do about it tbh + useType: tm.virtual ? MoveUseType.FOLLOW_UP : tm.ignorePP ? MoveUseType.IGNORE_PP : MoveUseType.NORMAL, + }); + data.party.forEach(pkmn => { + pkmn.summonData.moveHistory = (pkmn.summonData.moveHistory as OldTurnMove[]).map(mapTurnMove); + pkmn.summonData.moveQueue = (pkmn.summonData.moveQueue as OldTurnMove[]).map(mapTurnMove); + }); + data.enemyParty.forEach(pkmn => { + pkmn.summonData.moveHistory = (pkmn.summonData.moveHistory as OldTurnMove[]).map(mapTurnMove); + pkmn.summonData.moveQueue = (pkmn.summonData.moveQueue as OldTurnMove[]).map(mapTurnMove); + }); + }, +}; + +export const sessionMigrators: Readonly = [fixMoveHistory] as const;