/*:
 * @target MZ
 * @plugindesc スイッチ112がONのとき、クリックで左右キーを擬似入力＋右クリックで解除（初期化安全版）
 * @author you
 *
 * @help
 * ■ 概要
 * スイッチ112がONの間だけ、以下の操作を行います。
 *
 * ・画面右半分（x ≥ 641）を左クリック → 右矢印キーを押したのと同じ挙動
 * ・画面左半分（x ≤ 640）を左クリック → 左矢印キーを押したのと同じ挙動
 * ・右クリックを押した場合 → スイッチ112をOFFにする
 *
 * ■ 注意
 * ・マップ上・バトル中どちらでも動作します。
 * ・スイッチ112がOFFの間は何もしません。
 * ・ゲーム起動直後のエラー回避のため、「ゲーム開始後にだけ」判定が動くようにしています。
 */

(() => {
  const SWITCH_ID = 112; // 制御スイッチID
  const CENTER_X  = 640; // 画面中央（1280x720前提）

  // 「スイッチが使えるようになったかどうか」のフラグ
  let switchesReady = false;

  // ゲーム開始時（タイトルからニューゲームなどでスタートしたあと）に有効化
  const _Scene_Boot_start = Scene_Boot.prototype.start;
  Scene_Boot.prototype.start = function() {
    _Scene_Boot_start.call(this);
    switchesReady = true; // この時点で $gameSwitches が必ず生成されている
  };

  // 安全にスイッチ状態を取得する関数
  function isSwitchOn(id) {
    if (!switchesReady) return false;          // まだゲーム開始前なら常にOFF扱い
    if (!$gameSwitches) return false;          // 念のため null チェック
    return $gameSwitches.value(id);            // ここでようやく .value を呼ぶ
  }

  // 左クリック（タッチ）のフック
  const _onTrigger = TouchInput._onTrigger;
  TouchInput._onTrigger = function(x, y) {
    _onTrigger.call(this, x, y);
    if (!isSwitchOn(SWITCH_ID)) return; // スイッチ112がOFFなら何もしない

    // 右半分クリック → 右キー
    if (x >= CENTER_X + 1) {
      Input._currentState.right = true;
    }
    // 左半分クリック → 左キー
    else if (x <= CENTER_X) {
      Input._currentState.left = true;
    }
  };

  // 右クリックのフック
  const _onRightButtonDown = TouchInput._onRightButtonDown;
  TouchInput._onRightButtonDown = function(event) {
    _onRightButtonDown.call(this, event);
    if (isSwitchOn(SWITCH_ID)) {
      $gameSwitches.setValue(SWITCH_ID, false); // 右クリックでモード解除
    }
  };

  // クリックによる左右入力を1フレーム限定にする（押しっぱなし防止）
  const _updateMain = SceneManager.updateMain;
  SceneManager.updateMain = function() {
    _updateMain.call(this);

    // スイッチ112がONのときだけ矢印入力を毎フレームリセット
    if (isSwitchOn(SWITCH_ID)) {
      Input._currentState.left  = false;
      Input._currentState.right = false;
    }
  };
})();
