//=============================================================================
// RPG Maker MZ - ButtonEventTrigger
//
// Copyright 2025 Panzer-IV. All rights reserved.
// This source code or any portion thereof must not be
// reproduced or used without licensed in any manner whatsoever.
//=============================================================================
/*:
 * @target MZ
 * @plugindesc ボタン/キーでのイベントトリガー
 * @author 四号戦車
 * @base PluginUtils
 * @base InputExtension
 * @orderAfter PluginUtils
 * @orderAfter InputExtension
 * 
 * @param triggers
 * @text トリガー一覧
 * @desc トリガーのリストです。
 * @type struct<EventTrigger>[]
 * @default []
 *
 * @param comment
 * @text 備考欄
 * @desc プラグイン側では使用しません。
 *       メモ欄としてお使いください。
 * @type multiline_string
 * @default
 *
 * @help ButtonEventTrigger.js
 *
 * Version: 0.0.1
 *
 * ボタン/キーでのイベントトリガー
 * 
 * 指定のボタンを押した時に指定のイベントを実行します。
 * スイッチを指定して有効/無効を切り替えることができます。
 * マップ中のみ有効です。（戦闘中は使用できません）
 *
 */

/*~struct~EventTrigger:
 * 
 * @param trigger
 * @text トリガーとなるキー
 * @desc トリガーとなるキー/ボタンを指定します。
 * @type select
 * @default select
 * @option SHIFT
 * @value shift
 * @option START
 * @value start
 * @option SELECT
 * @value select
 * 
 * @param switch
 * @text 制御スイッチ
 * @desc ONの時のみ有効になるスイッチです。
 *       未指定の場合無条件で有効になります。
 * @type switch
 * @default 0
 * 
 * @param event
 * @text イベント
 * @desc 実行するイベントです。
 * @type common_event
 * @default 0
 *
 */
(() => {
	"use strict";

    //========================================================================
    // プラグイン定義
    //========================================================================
    const pluginName = "ButtonEventTrigger";
    const script = document.currentScript;
    const param  = PluginUtils.reparseParameter(script);

    //========================================================================
    // 定数定義
    //========================================================================
    const convertTriggerToKey = (trigger) => {
        const key = trigger.trigger;
        switch (key) {
            case 'shift':
                return InputClass.INPUT_CLASS_SHIFT;
            case 'select':
                return InputClass.INPUT_CLASS_SELECT;
            case 'start':
                return InputClass.INPUT_CLASS_START;
            default:
                return null;
        } // switch
    };

    //========================================================================
    // コアスクリプト変更部 (Game_Map)
    //========================================================================
    const _Scene_Map_prototype_updateMain = Scene_Map.prototype.updateMain;
    Scene_Map.prototype.updateMain = function() {
        _Scene_Map_prototype_updateMain.apply(this, arguments);
        if (this.isPlayerActive()) {
            param.triggers.forEach(trigger => {
                const key = convertTriggerToKey(trigger); 
                if (!key) {
                    // キー指定が不正
                    return;
                }

                if (!!trigger.event && trigger.event === 0) {
                    // イベント指定が無い
                    return;
                }

                const flag = (trigger.switch === 0) || $gameSwitches.value(trigger.switch);
                if (flag === false)  {
                    // 制御スイッチがOFF
                    return;
                }

                if (Input.isTriggered(key)) {
                    PluginUtils.fireCommonEvent(trigger.event);
                }
            });
        }
    };
})();
