213 lines
6.9 KiB
JavaScript
213 lines
6.9 KiB
JavaScript
//=============================================================================
|
|
// RPG Maker MZ - IM_EventSelector
|
|
//
|
|
// Copyright 2025 I'm moralist/min-pub.com 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 I'm moralist
|
|
* @base PluginCommonBase
|
|
* @base PluginUtils
|
|
* @orderAfter PluginCommonBase
|
|
* @orderAfter PluginUtils
|
|
*
|
|
* @param level
|
|
* @text 判定値
|
|
* @desc 判定に使用する変数(エロステ段階)
|
|
* @type variable
|
|
* @default 0
|
|
*
|
|
* @param stoped
|
|
* @text 打ち止め時イベント
|
|
* @desc 再生出来るイベントが無くなった際のイベント
|
|
* @type common_event
|
|
* @default 0
|
|
*
|
|
* @command selectEvent
|
|
* @text イベント再生
|
|
* @desc イベントを判定して再生
|
|
*
|
|
* @arg playLog
|
|
* @text 再生回数記録用変数
|
|
* @desc 再生回数を記録する変数
|
|
* @type variable
|
|
* @default 0
|
|
*
|
|
* @arg firstPlayed
|
|
* @text 初回再生済フラグ
|
|
* @desc 初回イベントを再生済だとONにします
|
|
* @type switch
|
|
* @default 0
|
|
*
|
|
* @arg level01
|
|
* @text 1段階目
|
|
* @desc 1段階目のイベント
|
|
* @type struct<EventType>
|
|
* @default
|
|
*
|
|
* @arg level02
|
|
* @text 2段階目
|
|
* @desc 2段階目のイベント
|
|
* @type struct<EventType>
|
|
* @default
|
|
*
|
|
* @arg level03
|
|
* @text 3段階目
|
|
* @desc 3段階目のイベント
|
|
* @type struct<EventType>
|
|
* @default
|
|
*
|
|
* @arg level04
|
|
* @text 4段階目
|
|
* @desc 4段階目のイベント
|
|
* @type struct<EventType>
|
|
* @default
|
|
*
|
|
* @help IM_EventSelector.js
|
|
*
|
|
* Version: 0.0.1
|
|
*
|
|
* 監獄勇者イベント選択プラグイン
|
|
*/
|
|
/*~struct~EventType:
|
|
*
|
|
* @param firstEvent
|
|
* @text 最初のイベント
|
|
* @desc その段階で最初のイベント
|
|
* @type common_event
|
|
* @default 0
|
|
*
|
|
* @param seconds
|
|
* @text 2回目以降のイベント
|
|
* @desc その段階で2回目以降のイベント
|
|
* @type common_event[]
|
|
* @default []
|
|
*
|
|
*/
|
|
(() => {
|
|
"use strict";
|
|
|
|
const pluginName = "IM_EventSelector";
|
|
const script = document.currentScript;
|
|
const param = PluginManagerEx.createParameter(script);
|
|
|
|
//========================================================================
|
|
// 共通基盤
|
|
//========================================================================
|
|
|
|
//========================================================================
|
|
// コアスクリプト変更部 ()
|
|
//========================================================================
|
|
|
|
//========================================================================
|
|
// プラグインコマンド
|
|
//========================================================================
|
|
const dataFromVariable = (variable) => {
|
|
const text = PluginUtils.getVariables(variable);
|
|
if (!text || text === 0) {
|
|
return {
|
|
lastPlayLevel: 0,
|
|
firstPlayed: false,
|
|
playedEvents: [],
|
|
};
|
|
} else {
|
|
return JSON.parse(text);
|
|
}
|
|
};
|
|
|
|
const decideEvent = (events, data, level) => {
|
|
// 最後に再生したイベント段階にエロステ段階が先行
|
|
if (data.lastPlayLevel < level) {
|
|
let index = data.lastPlayLevel + 1;
|
|
for (index = (data.lastPlayLevel + 1); index <= level; index++) {
|
|
if (events[index].firstEvent !== 0) {
|
|
// 初回イベント未指定の場合は飛ばす
|
|
break;
|
|
}
|
|
// 次の初回イベントはまだ見てないので
|
|
data.firstPlayed = false;
|
|
}
|
|
|
|
// indexが4以上になることを抑止
|
|
if (index > level) {
|
|
index = level;
|
|
}
|
|
|
|
if (data.firstPlayed === false) {
|
|
// まだ初回イベント見てないので初回イベントを流す
|
|
return {
|
|
data: data,
|
|
event: events[index].firstEvent,
|
|
level: index,
|
|
};
|
|
} else {
|
|
// 初回イベントの取りこぼしがあるのでそれを流す
|
|
data.firstPlayed = true;
|
|
const playedIndex = Math.min(index + 1, 3); // 間違ってもLv.4以上の箇所を見ないように
|
|
return {
|
|
data: data,
|
|
event: events[playedIndex].firstEvent,
|
|
level: index,
|
|
};
|
|
}
|
|
} else if (data.firstPlayed === false) {
|
|
// このレベルの初回イベントを見てない
|
|
data.firstPlayed = true;
|
|
return {
|
|
data: data,
|
|
event: events[level].firstEvent,
|
|
level: level,
|
|
};
|
|
} else {
|
|
const randomEvents = events.filter((events, index) => {
|
|
return index <= data.lastPlayLevel;
|
|
}).flatMap(events => {
|
|
return events.seconds;
|
|
}).filter(event => {
|
|
return !!event && event > 0
|
|
// }).filter(event => {
|
|
// return !data.playedEvents.includes(event);
|
|
});
|
|
|
|
let event = param.stoped;
|
|
if (randomEvents.length > 0) {
|
|
const randomIndex = Math.floor(Math.random() * randomEvents.length);
|
|
event = randomEvents[randomIndex];
|
|
} else {
|
|
// 2回目イベントが無い
|
|
event = events[level].firstEvent;
|
|
}
|
|
|
|
return {
|
|
data: data,
|
|
event: event,
|
|
level: data.lastPlayLevel,
|
|
};
|
|
}
|
|
};
|
|
|
|
PluginManagerEx.registerCommand(script, 'selectEvent', args => {
|
|
const events = [
|
|
args.level01._parameter,
|
|
args.level02._parameter,
|
|
args.level03._parameter,
|
|
args.level04._parameter,
|
|
];
|
|
|
|
const level = Number(PluginUtils.getVariables(param.level) - 1).clamp(0, 4);
|
|
const data = dataFromVariable(args.playLog);
|
|
const event = decideEvent(events, data, level);
|
|
// event.data.playedEvents.push(event.event);
|
|
if (args.firstPlayed > 0) {
|
|
const firstPlayed = (level === event.data.lastPlayLevel) && event.data.firstPlayed;
|
|
$gameSwitches.setValue(args.firstPlayed, firstPlayed);
|
|
}
|
|
event.data.lastPlayLevel = event.level;
|
|
|
|
$gameVariables.setValue(args.playLog, JSON.stringify(event.data, null, 2));
|
|
PluginUtils.waitCommonEvent(event.event, args.interpreter);
|
|
});
|
|
})();
|