diff --git a/client/src/state/progress.ts b/client/src/state/progress.ts index c8c4242..c01eca0 100644 --- a/client/src/state/progress.ts +++ b/client/src/state/progress.ts @@ -53,22 +53,22 @@ const initalLevelProgressState: LevelProgressState = {code: "", completed: false /** Add an empty skeleton with progress for the current game */ function addGameProgress (state: ProgressState, action: PayloadAction<{game: string}>) { - if (!state.games[action.payload.game]) { - state.games[action.payload.game] = {inventory: [], openedIntro: true, data: {}, difficulty: DEFAULT_DIFFICULTY} + if (!state.games[action.payload.game.toLowerCase()]) { + state.games[action.payload.game.toLowerCase()] = {inventory: [], openedIntro: true, data: {}, difficulty: DEFAULT_DIFFICULTY} } - if (!state.games[action.payload.game].data) { - state.games[action.payload.game].data = {} + if (!state.games[action.payload.game.toLowerCase()].data) { + state.games[action.payload.game.toLowerCase()].data = {} } } /** Add an empty skeleton with progress for the current level */ function addLevelProgress(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) { addGameProgress(state, action) - if (!state.games[action.payload.game].data[action.payload.world]) { - state.games[action.payload.game].data[action.payload.world] = {} + if (!state.games[action.payload.game.toLowerCase()].data[action.payload.world]) { + state.games[action.payload.game.toLowerCase()].data[action.payload.world] = {} } - if (!state.games[action.payload.game].data[action.payload.world][action.payload.level]) { - state.games[action.payload.game].data[action.payload.world][action.payload.level] = {...initalLevelProgressState} + if (!state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level]) { + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level] = {...initalLevelProgressState} } } @@ -79,58 +79,58 @@ export const progressSlice = createSlice({ /** put edited code in the state and set completed to false */ codeEdited(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number, code: string}>) { addLevelProgress(state, action) - state.games[action.payload.game].data[action.payload.world][action.payload.level].code = action.payload.code - state.games[action.payload.game].data[action.payload.world][action.payload.level].completed = false + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].code = action.payload.code + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].completed = false }, /** TODO: docstring */ changedSelection(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number, selections: Selection[]}>) { addLevelProgress(state, action) - state.games[action.payload.game].data[action.payload.world][action.payload.level].selections = action.payload.selections + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].selections = action.payload.selections }, /** mark level as completed */ levelCompleted(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) { addLevelProgress(state, action) - state.games[action.payload.game].data[action.payload.world][action.payload.level].completed = true + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].completed = true }, /** Set the list of rows where help is displayed */ helpEdited(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number, help: number[]}>) { addLevelProgress(state, action) console.debug(`!setting help to: ${action.payload.help}`) - state.games[action.payload.game].data[action.payload.world][action.payload.level].help = action.payload.help + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].help = action.payload.help }, /** delete all progress for this game */ deleteProgress(state: ProgressState, action: PayloadAction<{game: string}>) { - state.games[action.payload.game] = {inventory: [], data: {}, openedIntro: true, difficulty: DEFAULT_DIFFICULTY} + state.games[action.payload.game.toLowerCase()] = {inventory: [], data: {}, openedIntro: true, difficulty: DEFAULT_DIFFICULTY} }, /** delete progress for this level */ deleteLevelProgress(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) { addLevelProgress(state, action) - state.games[action.payload.game].data[action.payload.world][action.payload.level] = initalLevelProgressState + state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level] = initalLevelProgressState }, /** load progress, e.g. from external import */ loadProgress(state: ProgressState, action: PayloadAction<{game: string, data:GameProgressState}>) { console.debug(`setting data to:\n ${action.payload.data}`) - state.games[action.payload.game] = action.payload.data + state.games[action.payload.game.toLowerCase()] = action.payload.data }, /** set the current inventory */ changedInventory(state: ProgressState, action: PayloadAction<{game: string, inventory: string[]}>) { addGameProgress(state, action) - state.games[action.payload.game].inventory = action.payload.inventory + state.games[action.payload.game.toLowerCase()].inventory = action.payload.inventory }, /** set the difficulty */ changedDifficulty(state: ProgressState, action: PayloadAction<{game: string, difficulty: number}>) { addGameProgress(state, action) - state.games[action.payload.game].difficulty = action.payload.difficulty + state.games[action.payload.game.toLowerCase()].difficulty = action.payload.difficulty }, /** set the difficulty */ changedOpenedIntro(state: ProgressState, action: PayloadAction<{game: string, openedIntro: boolean}>) { addGameProgress(state, action) - state.games[action.payload.game].openedIntro = action.payload.openedIntro + state.games[action.payload.game.toLowerCase()].openedIntro = action.payload.openedIntro }, /** set the typewriter mode */ changeTypewriterMode(state: ProgressState, action: PayloadAction<{game: string, typewriterMode: boolean}>) { addGameProgress(state, action) - state.games[action.payload.game].typewriterMode = action.payload.typewriterMode + state.games[action.payload.game.toLowerCase()].typewriterMode = action.payload.typewriterMode } } }) @@ -138,74 +138,74 @@ export const progressSlice = createSlice({ /** if the level does not exist, return default values */ export function selectLevel(game: string, world: string, level: number) { return (state) =>{ - if (!state.progress.games[game]) { return initalLevelProgressState } - if (!state.progress.games[game].data[world]) { return initalLevelProgressState } - if (!state.progress.games[game].data[world][level]) { return initalLevelProgressState } - return state.progress.games[game].data[world][level] + if (!state.progress.games[game.toLowerCase()]) { return initalLevelProgressState } + if (!state.progress.games[game.toLowerCase()].data[world]) { return initalLevelProgressState } + if (!state.progress.games[game.toLowerCase()].data[world][level]) { return initalLevelProgressState } + return state.progress.games[game.toLowerCase()].data[world][level] } } /** return the code of the current level */ export function selectCode(game: string, world: string, level: number) { return (state) => { - return selectLevel(game, world, level)(state).code + return selectLevel(game.toLowerCase(), world, level)(state).code } } /** return the current inventory */ export function selectInventory(game: string) { return (state) => { - if (!state.progress.games[game]) { return [] } - return state.progress.games[game].inventory + if (!state.progress.games[game.toLowerCase()]) { return [] } + return state.progress.games[game.toLowerCase()].inventory } } /** return the code of the current level */ export function selectHelp(game: string, world: string, level: number) { return (state) => { - return selectLevel(game, world, level)(state).help + return selectLevel(game.toLowerCase(), world, level)(state).help } } /** return the selections made in the current level */ export function selectSelections(game: string, world: string, level: number) { return (state) => { - return selectLevel(game, world, level)(state).selections + return selectLevel(game.toLowerCase(), world, level)(state).selections } } /** return whether the current level is clompleted */ export function selectCompleted(game: string, world: string, level: number) { return (state) => { - return selectLevel(game, world, level)(state).completed + return selectLevel(game.toLowerCase(), world, level)(state).completed } } /** return progress for the current game if it exists */ export function selectProgress(game: string) { return (state) => { - return state.progress.games[game] ?? null + return state.progress.games[game.toLowerCase()] ?? null } } /** return difficulty for the current game if it exists */ export function selectDifficulty(game: string) { return (state) => { - return state.progress.games[game]?.difficulty ?? DEFAULT_DIFFICULTY + return state.progress.games[game.toLowerCase()]?.difficulty ?? DEFAULT_DIFFICULTY } } /** return whether the intro has been read */ export function selectOpenedIntro(game: string) { return (state) => { - return state.progress.games[game]?.openedIntro + return state.progress.games[game.toLowerCase()]?.openedIntro } } /** return typewriter mode for the current game if it exists */ export function selectTypewriterMode(game: string) { return (state) => { - return state.progress.games[game]?.typewriterMode ?? true + return state.progress.games[game.toLowerCase()]?.typewriterMode ?? true } } diff --git a/doc/changelog.md b/doc/changelog.md index 2677283..8c49c42 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -4,4 +4,6 @@ ### Breaking changes +* Fix (#183): local store accepts case insensitive URL. The game progress has previously been saved under case sensitive URLs. You might need to recover old progress from your browser storage. + ## Other