lainTSX/src/core/scene-keypress-handlers/handleBootSceneKeyPress.ts

206 lines
6.6 KiB
TypeScript
Raw Normal View History

2021-02-09 17:26:08 +00:00
import authorize_user_letters from "../../resources/authorize_user_letters.json";
import handleNameSelection from "../../helpers/name-selection-helpers";
import {
changeMainMenuComponent,
changePromptComponent,
enterLoadData,
enterUserAuthorization,
exitLoadData,
exitUserAuthorization,
failUpdatePlayerName,
loadGame,
loadGameFail,
removePlayerNameLastChar,
startNewGame,
updateAuthorizeUserLetterIdx,
updatePlayerName,
} from "../eventTemplates";
import { BootSceneContext, GameEvent } from "../../types/types";
2021-02-09 17:26:08 +00:00
const handleBootSceneKeyPress = (
bootSceneContext: BootSceneContext
): GameEvent | undefined => {
const {
keyPress,
subscene,
activeMainMenuComponent,
activePromptComponent,
promptVisible,
authorizeUserLetterIdx,
2021-02-09 17:26:08 +00:00
playerName,
} = bootSceneContext;
if (promptVisible) {
switch (keyPress) {
case "LEFT":
return changePromptComponent({ activePromptComponent: "yes" });
case "RIGHT":
return changePromptComponent({ activePromptComponent: "no" });
case "CIRCLE":
switch (activePromptComponent) {
case "no":
return exitLoadData;
case "yes":
const stateToLoad = localStorage.getItem("lainSaveState");
if (stateToLoad)
return loadGame({
userSaveState: JSON.parse(stateToLoad),
});
else return loadGameFail;
}
}
} else {
switch (subscene) {
case "main_menu":
switch (keyPress) {
case "UP":
case "DOWN":
const newComponent =
keyPress === "UP" ? "authorize_user" : "load_data";
return changeMainMenuComponent({
activeMainMenuComponent: newComponent,
});
case "CIRCLE":
switch (activeMainMenuComponent) {
case "authorize_user":
return enterUserAuthorization;
case "load_data":
return enterLoadData;
}
}
break;
case "authorize_user":
switch (keyPress) {
2021-02-10 16:05:20 +00:00
case "START":
if (playerName.length > 0) {
return startNewGame;
2021-02-10 16:05:20 +00:00
}
return;
case "X":
2021-02-09 17:26:08 +00:00
if (playerName.length > 0) {
return removePlayerNameLastChar({
2021-02-09 17:26:08 +00:00
playerName: playerName.slice(0, -1),
});
2021-02-09 17:26:08 +00:00
} else {
return exitUserAuthorization;
2021-02-09 17:26:08 +00:00
}
case "LEFT":
// if utmost left, break
2021-02-10 16:05:20 +00:00
if (
[0, 13, 26, 39, 52].includes(authorizeUserLetterIdx) ||
authorizeUserLetterIdx === 15
)
return;
2021-02-10 16:05:20 +00:00
// skip
else if (
authorizeUserLetterIdx === 41 ||
authorizeUserLetterIdx === 17 ||
authorizeUserLetterIdx === 30 ||
authorizeUserLetterIdx === 43 ||
authorizeUserLetterIdx === 19 ||
authorizeUserLetterIdx === 45
) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx - 2,
});
2021-02-10 16:05:20 +00:00
} else {
return updateAuthorizeUserLetterIdx({
authorizeUserLetterIdx: authorizeUserLetterIdx - 1,
});
}
case "RIGHT":
// if utmost right, break
if ([12, 25, 38, 51, 64].includes(authorizeUserLetterIdx)) return;
2021-02-10 16:05:20 +00:00
// skip empty
else if (
authorizeUserLetterIdx === 39 ||
authorizeUserLetterIdx === 41 ||
authorizeUserLetterIdx === 28 ||
authorizeUserLetterIdx === 15 ||
authorizeUserLetterIdx === 43 ||
authorizeUserLetterIdx === 17
) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx + 2,
});
2021-02-10 16:05:20 +00:00
} else {
return updateAuthorizeUserLetterIdx({
authorizeUserLetterIdx: authorizeUserLetterIdx + 1,
});
}
case "DOWN":
// if utmost down, break
if (
Array.from(new Array(13), (x, i) => i + 52).includes(
authorizeUserLetterIdx
)
2021-02-10 16:05:20 +00:00
) {
return;
2021-02-10 16:05:20 +00:00
// skip empty
} else if (
authorizeUserLetterIdx === 0 ||
authorizeUserLetterIdx === 1 ||
authorizeUserLetterIdx === 52 ||
authorizeUserLetterIdx === 27 ||
authorizeUserLetterIdx === 31 ||
authorizeUserLetterIdx === 5
) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx + 26,
});
2021-02-10 16:05:20 +00:00
} else if (authorizeUserLetterIdx === 3) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx + 52,
});
2021-02-10 16:05:20 +00:00
} else {
return updateAuthorizeUserLetterIdx({
authorizeUserLetterIdx: authorizeUserLetterIdx + 13,
});
}
case "UP":
// if utmost up, break
if (
Array.from(new Array(13), (x, i) => i).includes(
authorizeUserLetterIdx
)
2021-02-10 16:05:20 +00:00
) {
return;
2021-02-10 16:05:20 +00:00
// skip empty
} else if (
authorizeUserLetterIdx === 26 ||
authorizeUserLetterIdx === 27 ||
authorizeUserLetterIdx === 53 ||
authorizeUserLetterIdx === 31 ||
authorizeUserLetterIdx === 57
) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx - 26,
});
2021-02-10 16:05:20 +00:00
} else if (authorizeUserLetterIdx === 55) {
return updateAuthorizeUserLetterIdx({
2021-02-10 16:05:20 +00:00
authorizeUserLetterIdx: authorizeUserLetterIdx - 52,
});
2021-02-10 16:05:20 +00:00
} else {
return updateAuthorizeUserLetterIdx({
authorizeUserLetterIdx: authorizeUserLetterIdx - 13,
});
}
2021-02-09 17:26:08 +00:00
case "CIRCLE":
const chosenCharacter =
authorize_user_letters[
authorizeUserLetterIdx.toString() as keyof typeof authorize_user_letters
];
const newName = handleNameSelection(playerName, chosenCharacter);
if (newName !== undefined)
return updatePlayerName({ playerName: newName });
else return failUpdatePlayerName;
}
}
}
};
export default handleBootSceneKeyPress;