//=============================================================================
// RPG Maker MZ - RandomCommonEvents
//
// Copyright 2024 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 PluginCommonBase
 * @base DebugSwitch
 * @base TextResource
 * @base PluginUtils
 * @orderAfter PluginCommonBase
 * @orderAfter DebugSwitch
 * @orderAfter TextResource
 * @orderAfter PluginUtils
 *
 * @command fireRandomEvent
 * @text ランダムイベントの実行
 * @desc 指定したイベントの中からランダムで一つ実行します。
 *       後方互換用です。
 *
 * @arg events
 * @text イベント候補
 * @desc 実行するイベントの候補です。
 * @type common_event[]
 * @default []
 *
 * @arg sweep
 * @text 完了時スイープ指定
 * @desc イベント完了時にスイープするか否か
 * @type boolean
 * @default true;
 *
 * @command fireConditionalRandomEvent
 * @text 条件付きランダムイベントの実行
 * @desc 指定したイベントの中からランダムで一つ実行します。
 *
 * @arg events
 * @text 無条件イベント候補
 * @desc 無条件で実行するイベントの候補です。
 * @type common_event[]
 * @default []
 *
 * @arg conditionalEvents
 * @text 条件付きイベント候補
 * @desc 指定の条件で選択候補に入るイベントです。
 * @type struct<EventPool>[]
 * @default []
 *
 * @arg sweep
 * @text 完了時スイープ指定
 * @desc イベント完了時にスイープするか否か
 * @type boolean
 * @default true;
 *
 * @help RandomCommonEvents.js
 *
 * Version: 0.0.2
 *
 * 複数のコモンイベントを候補としてランダムで実行することが出来るプラグインです。
 *
 */
/*~struct~EventPool:
 *
 * @param name
 * @text プール名
 * @desc イベントプールの名前
 * @type string
 * @default
 *
 * @param switch
 * @text 有効化条件スイッチ
 * @desc イベントプールを有効化するためのスイッチ
 * @type switch
 * @default 0
 *
 * @param events
 * @text イベント
 * @desc 対象のイベント群
 * @type common_event[]
 * @default []
 */
(() => {
	"use strict";

    //========================================================================
    // プラグイン定義
    //========================================================================
    const pluginName = "RandomCommonEvents";
    const script = document.currentScript;
    const param  = PluginManagerEx.createParameter(script);

    //========================================================================
    // コアスクリプト変更部 ()
    //========================================================================

    //========================================================================
    // 定数定義 ()
    //========================================================================
    PluginUtils.fireRandomEvent = (events, sweep, interpreter) => {
        const filteredEvents = events.filter(eventId => !!eventId && eventId > 0);
        const index = Math.floor(Math.random() * filteredEvents.length);
        const eventId = filteredEvents[index];

        const child = !!interpreter ? PluginUtils.waitCommonEvent(eventId, interpreter) : PluginUtils.fireCommonEvent(eventId);
        interpreter?.setSweep?.(sweep);
        return interpreter;
    };

    //========================================================================
    // クラス定義 ()
    //========================================================================

    //========================================================================
    // プラグインコマンド
    //========================================================================
    PluginManagerEx.registerCommand(script, 'fireRandomEvent', args => {
        const noCondition = !!args.events ? args.events : [];
        const interpreter = PluginUtils.fireRandomEvent(noCondition, args.sweep, args.interpreter);
    });

    PluginManagerEx.registerCommand(script, 'fireConditionalRandomEvent', args => {
        const conditionalEvents = !!args.conditionalEvents ? args.conditionalEvents : [];
        const noCondition = !!args.events ? args.events : [];
        const events = conditionalEvents.map(p => p._parameter).filter(events => {
            return PluginUtils.getSwitch(events.switch, false);
        }).map(events => {
            return events.events;
        }).concat(noCondition).flat();

        const interpreter = PluginUtils.fireRandomEvent(events, args.sweep, args.interpreter);
    });

})();
