[UI] Ask Confirmation before disabling touch controls

This commit is contained in:
Moka 2024-11-14 23:38:26 +01:00
parent 33d8db73ef
commit d347219661
3 changed files with 74 additions and 38 deletions

View File

@ -730,15 +730,16 @@ export class GameData {
* Saves a setting to localStorage * Saves a setting to localStorage
* @param setting string ideally of SettingKeys * @param setting string ideally of SettingKeys
* @param valueIndex index of the setting's option * @param valueIndex index of the setting's option
* @param fromSettings whether the function was called from the settings menu
* @returns true * @returns true
*/ */
public saveSetting(setting: string, valueIndex: integer): boolean { public saveSetting(setting: string, valueIndex: integer, fromSettings?: boolean): boolean {
let settings: object = {}; let settings: object = {};
if (localStorage.hasOwnProperty("settings")) { if (localStorage.hasOwnProperty("settings")) {
settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct? settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct?
} }
setSetting(this.scene, setting, valueIndex); setSetting(this.scene, setting, valueIndex, fromSettings);
settings[setting] = valueIndex; settings[setting] = valueIndex;
settings["gameVersion"] = this.scene.game.config.gameVersion; settings["gameVersion"] = this.scene.game.config.gameVersion;

View File

@ -10,6 +10,7 @@ import { MoneyFormat } from "#enums/money-format";
import { PlayerGender } from "#enums/player-gender"; import { PlayerGender } from "#enums/player-gender";
import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import { getIsInitialized, initI18n } from "#app/plugins/i18n";
import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
import { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler";
function getTranslation(key: string): string { function getTranslation(key: string): string {
if (!getIsInitialized()) { if (!getIsInitialized()) {
@ -344,13 +345,6 @@ export const Setting: Array<Setting> = [
default: 1, default: 1,
type: SettingType.GENERAL type: SettingType.GENERAL
}, },
{
key: SettingKeys.Touch_Controls,
label: i18next.t("settings:touchControls"),
options: AUTO_DISABLED,
default: 0,
type: SettingType.GENERAL
},
{ {
key: SettingKeys.Vibration, key: SettingKeys.Vibration,
label: i18next.t("settings:vibrations"), label: i18next.t("settings:vibrations"),
@ -358,6 +352,28 @@ export const Setting: Array<Setting> = [
default: 0, default: 0,
type: SettingType.GENERAL type: SettingType.GENERAL
}, },
{
key: SettingKeys.Touch_Controls,
label: i18next.t("settings:touchControls"),
options: AUTO_DISABLED,
default: 0,
type: SettingType.GENERAL,
isHidden: () => !hasTouchscreen()
},
{
key: SettingKeys.Move_Touch_Controls,
label: i18next.t("settings:moveTouchControls"),
options: [
{
value: "Configure",
label: i18next.t("settings:change")
}
],
default: 0,
type: SettingType.GENERAL,
activatable: true,
isHidden: () => !hasTouchscreen()
},
{ {
key: SettingKeys.Language, key: SettingKeys.Language,
label: i18next.t("settings:language"), label: i18next.t("settings:language"),
@ -643,20 +659,6 @@ export const Setting: Array<Setting> = [
type: SettingType.AUDIO, type: SettingType.AUDIO,
requireReload: true requireReload: true
}, },
{
key: SettingKeys.Move_Touch_Controls,
label: i18next.t("settings:moveTouchControls"),
options: [
{
value: "Configure",
label: i18next.t("settings:change")
}
],
default: 0,
type: SettingType.GENERAL,
activatable: true,
isHidden: () => !hasTouchscreen()
},
{ {
key: SettingKeys.Shop_Cursor_Target, key: SettingKeys.Shop_Cursor_Target,
label: i18next.t("settings:shopCursorTarget"), label: i18next.t("settings:shopCursorTarget"),
@ -696,9 +698,11 @@ export function resetSettings(scene: BattleScene) {
* @param scene current BattleScene * @param scene current BattleScene
* @param setting string ideally from SettingKeys * @param setting string ideally from SettingKeys
* @param value value to update setting with * @param value value to update setting with
* @param fromSettings whether the function was called from the settings menu, meaning it is possible
* to access the handler and add extra interactions for the player
* @returns true if successful, false if not * @returns true if successful, false if not
*/ */
export function setSetting(scene: BattleScene, setting: string, value: integer): boolean { export function setSetting(scene: BattleScene, setting: string, value: integer, fromSettings?: boolean): boolean {
const index: number = settingIndex(setting); const index: number = settingIndex(setting);
if (index === -1) { if (index === -1) {
return false; return false;
@ -832,10 +836,43 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
} }
break; break;
case SettingKeys.Touch_Controls: case SettingKeys.Touch_Controls:
scene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); const setTouchControlsVisibility = (scene: BattleScene) => {
const touchControls = document.getElementById("touchControls"); const touchControls = document.getElementById("touchControls");
if (touchControls) { if (touchControls) {
touchControls.classList.toggle("visible", scene.enableTouchControls); touchControls.classList.toggle("visible", scene.enableTouchControls);
}
};
if (fromSettings && Setting[index].options[value].value === "Disabled") {
const optionsConfig: OptionSelectConfig = {
yOffset: 24,
delay: 1000,
options: [
{
label: i18next.t("settings:disableTouchControls"),
handler: () => {
scene.ui.revertMode();
scene.enableTouchControls = false;
setTouchControlsVisibility(scene);
return true;
}
},
{
label: i18next.t("settings:cancel"),
handler: () => {
scene.ui.revertMode();
// Put the option cursor back to "Auto" and save that
(scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(-1, 0, true);
return true;
}
}
]
};
// Player moved to the "Disabled" option, show a confirmation window, with a 1s delay before being able to confirm
scene.ui.setOverlayMode(Mode.OPTION_SELECT, optionsConfig);
} else {
scene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen();
setTouchControlsVisibility(scene);
} }
break; break;
case SettingKeys.Vibration: case SettingKeys.Vibration:
@ -846,10 +883,10 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
break; break;
case SettingKeys.Language: case SettingKeys.Language:
if (value) { if (value) {
if (scene.ui) { if (fromSettings) {
const cancelHandler = () => { const cancelHandler = () => {
scene.ui.revertMode(); scene.ui.revertMode();
(scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(0, 0, true); (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(-1, 0, true);
}; };
const changeLocaleHandler = (locale: string): boolean => { const changeLocaleHandler = (locale: string): boolean => {
try { try {

View File

@ -1,5 +1,4 @@
import BattleScene from "#app/battle-scene"; import BattleScene from "#app/battle-scene";
import { hasTouchscreen, isMobile } from "#app/touch-controls";
import { TextStyle, addTextObject } from "#app/ui/text"; import { TextStyle, addTextObject } from "#app/ui/text";
import { Mode } from "#app/ui/ui"; import { Mode } from "#app/ui/ui";
import UiHandler from "#app/ui/ui-handler"; import UiHandler from "#app/ui/ui-handler";
@ -326,19 +325,18 @@ export default class AbstractSettingsUiHandler extends UiHandler {
/** /**
* Set the option cursor to the specified position. * Set the option cursor to the specified position.
* *
* @param settingIndex - The index of the setting. * @param settingIndex - The index of the setting or -1 to change the current setting
* @param cursor - The cursor position to set. * @param cursor - The cursor position to set.
* @param save - Whether to save the setting to local storage. * @param save - Whether to save the setting to local storage.
* @returns `true` if the option cursor was set successfully. * @returns `true` if the option cursor was set successfully.
*/ */
setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean { setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean {
const setting = this.settings[settingIndex]; if (settingIndex === -1) {
settingIndex = this.cursor + this.scrollCursor;
if (setting.key === SettingKeys.Touch_Controls && cursor && hasTouchscreen() && isMobile()) {
this.getUi().playError();
return false;
} }
const setting = this.settings[settingIndex];
const lastCursor = this.optionCursors[settingIndex]; const lastCursor = this.optionCursors[settingIndex];
const lastValueLabel = this.optionValueLabels[settingIndex][lastCursor]; const lastValueLabel = this.optionValueLabels[settingIndex][lastCursor];
@ -352,7 +350,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true));
if (save) { if (save) {
this.scene.gameData.saveSetting(setting.key, cursor); this.scene.gameData.saveSetting(setting.key, cursor, true);
if (this.reloadSettings.includes(setting)) { if (this.reloadSettings.includes(setting)) {
this.reloadRequired = true; this.reloadRequired = true;
} }