From 6946abadb8e25f7a4e73c7bd07e0afa22741360c Mon Sep 17 00:00:00 2001
From: Wlowscha <54003515+Wlowscha@users.noreply.github.com>
Date: Mon, 30 Dec 2024 16:35:45 +0100
Subject: [PATCH] [UI/UX] Add cursor memory option (#5028)

* Adding a new key determining whether the command cursor resets at the beginning of each new battle.

* Allowing user to toggle commandCursorReset on and off.

* Changing option name to commandCursorMemory

* Fixed caps in settings.ts

* Moved Command_Cursor_Memory from Display settings to General settings
---
 src/battle-scene.ts             |  1 +
 src/phases/command-phase.ts     |  8 +++++++-
 src/system/settings/settings.ts | 11 +++++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/battle-scene.ts b/src/battle-scene.ts
index c430a12ae3e..11950f0a47f 100644
--- a/src/battle-scene.ts
+++ b/src/battle-scene.ts
@@ -147,6 +147,7 @@ export default class BattleScene extends SceneBase {
   public damageNumbersMode: integer = 0;
   public reroll: boolean = false;
   public shopCursorTarget: number = ShopCursorTarget.REWARDS;
+  public commandCursorMemory: boolean = false;
   public showMovesetFlyout: boolean = true;
   public showArenaFlyout: boolean = true;
   public showTimeOfDayWidget: boolean = true;
diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts
index eab76282908..fa85f2427e5 100644
--- a/src/phases/command-phase.ts
+++ b/src/phases/command-phase.ts
@@ -35,8 +35,14 @@ export class CommandPhase extends FieldPhase {
     this.scene.updateGameInfo();
 
     const commandUiHandler = this.scene.ui.handlers[Mode.COMMAND];
+
+    // If one of these conditions is true, we always reset the cursor to Command.FIGHT
+    const cursorResetEvent = this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER ||
+                              this.scene.currentBattle.battleType === BattleType.TRAINER ||
+                              this.scene.arena.biomeType === Biome.END;
+
     if (commandUiHandler) {
-      if (this.scene.currentBattle.turn === 1 || commandUiHandler.getCursor() === Command.POKEMON) {
+      if ((this.scene.currentBattle.turn === 1 && (!this.scene.commandCursorMemory || cursorResetEvent)) || commandUiHandler.getCursor() === Command.POKEMON) {
         commandUiHandler.setCursor(Command.FIGHT);
       } else {
         commandUiHandler.setCursor(commandUiHandler.getCursor());
diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts
index 64ddfdae5cf..ebdcad1c4f9 100644
--- a/src/system/settings/settings.ts
+++ b/src/system/settings/settings.ts
@@ -157,6 +157,7 @@ export const SettingKeys = {
   Move_Animations: "MOVE_ANIMATIONS",
   Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
   Shop_Cursor_Target: "SHOP_CURSOR_TARGET",
+  Command_Cursor_Memory: "COMMAND_CURSOR_MEMORY",
   Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
   Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
   Move_Info: "MOVE_INFO",
@@ -339,6 +340,13 @@ export const Setting: Array<Setting> = [
     default: 0,
     type: SettingType.GENERAL
   },
+  {
+    key: SettingKeys.Command_Cursor_Memory,
+    label: i18next.t("settings:commandCursorMemory"),
+    options: OFF_ON,
+    default: 0,
+    type: SettingType.GENERAL
+  },
   {
     key: SettingKeys.Enable_Retries,
     label: i18next.t("settings:enableRetries"),
@@ -827,6 +835,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
       const selectedValue = shopCursorTargetIndexMap[value];
       scene.shopCursorTarget = selectedValue;
       break;
+    case SettingKeys.Command_Cursor_Memory:
+      scene.commandCursorMemory = Setting[index].options[value].value === "On";
+      break;
     case SettingKeys.EXP_Gains_Speed:
       scene.expGainsSpeed = value;
       break;