239 lines
No EOL
10 KiB
JavaScript
239 lines
No EOL
10 KiB
JavaScript
/*:ja
|
||
* @target MZ
|
||
* @author kurogoma knights
|
||
* @base PluginCommonBase
|
||
* @plugindesc Eventの便利機能を提供
|
||
*/
|
||
|
||
(() => {
|
||
'use strict';
|
||
const script = document.currentScript;
|
||
const param = PluginManagerEx.createParameter(script);
|
||
|
||
window.Kurogoma = window.Kurogoma || {};
|
||
|
||
// イベントヘルパー
|
||
class EventHelper {
|
||
|
||
// 体験版スキップタグの有無チェック
|
||
static isTrialSkip = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
// イベント本体のメモ欄を参照
|
||
const meta = event.event()?.meta;
|
||
return !!meta?.TrialSkip; // true/falseで返す
|
||
}
|
||
|
||
// 敗北イベントタグの有無チェック
|
||
static hasDefeatEvent = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
const eventName = event.event()?.name;
|
||
if (!eventName) return false;
|
||
|
||
// 同名の敵データを検索(Troops.jsonはJP名のままなのでブリッジ)
|
||
const troop = $dataTroops.find(t => t && t.name === eventName);
|
||
const enemy = troop ? $dataEnemies[troop.id] : $dataEnemies.find(e => e && e.name === eventName);
|
||
if (!enemy) return false;
|
||
|
||
// DefeatEventタグの有無をチェック
|
||
const hasTag = /<DefeatEvent:\s*.+?\s*>/i.test(enemy.note);
|
||
return hasTag;
|
||
};
|
||
|
||
// 敗北時スチルIDを変数にセット
|
||
static setDefeatSimpleStillIdToVariable = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
const eventName = event.event().name;
|
||
if (!eventName) return false;
|
||
|
||
// 敵データを名前一致で検索(Troops.jsonはJP名のままなのでブリッジ)
|
||
const troop = $dataTroops.find(t => t && t.name === eventName);
|
||
const enemy = troop ? $dataEnemies[troop.id] : $dataEnemies.find(e => e && e.name === eventName);
|
||
if (!enemy) return false;
|
||
|
||
// タグからIDを取得
|
||
const stillId = enemy.meta?.DefeatSimpleStillID;
|
||
if (!stillId) {
|
||
console.warn(`[EventHelper] <DefeatSimpleStillID> タグが見つかりません: ${eventName}`);
|
||
return false;
|
||
}
|
||
|
||
// 変数15番に格納 (centralized const)
|
||
$gameVariables.setValue(Kurogoma.VariableConst.StillId, stillId);
|
||
console.log(`[EventHelper] ${Kurogoma.VariableConst.StillId} に設定: ${stillId}`);
|
||
return true;
|
||
};
|
||
|
||
// 記憶所持チェック
|
||
static hasMemory = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
const eventName = event.event().name;
|
||
if (!eventName) return false;
|
||
|
||
// 敵データから同名のものを探す(Troops.jsonはJP名のままなのでブリッジ)
|
||
const troop = $dataTroops.find(t => t && t.name === eventName);
|
||
const enemy = troop ? $dataEnemies[troop.id] : $dataEnemies.find(e => e && e.name === eventName);
|
||
if (!enemy) return false;
|
||
|
||
// DefeatEventタグを抽出
|
||
const match = enemy.note.match(/<DefeatEvent:\s*(.+?)\s*>/i);
|
||
if (!match) return false;
|
||
const memoryItemName = match[1].trim();
|
||
|
||
// アイテム所持チェック
|
||
const item = $dataItems.find(i => i && i.name === memoryItemName);
|
||
return !!(item && $gameParty.hasItem(item));
|
||
};
|
||
|
||
// 敗北記憶付与
|
||
static addMemory = function(notify = false) {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
const eventName = event.event()?.name;
|
||
if (!eventName) return false;
|
||
|
||
// 敵データから同名のものを探す(Troops.jsonはJP名のままなのでブリッジ)
|
||
const troop = $dataTroops.find(t => t && t.name === eventName);
|
||
const enemy = troop ? $dataEnemies[troop.id] : $dataEnemies.find(e => e && e.name === eventName);
|
||
if (!enemy) return false;
|
||
|
||
// DefeatEventタグを抽出
|
||
const match = enemy.note.match(/<DefeatEvent:\s*(.+?)\s*>/i);
|
||
if (!match) {
|
||
console.warn(`[EventHelper] DefeatEvent タグが見つかりません: ${eventName}`);
|
||
return false;
|
||
}
|
||
|
||
const itemName = match[1].trim();
|
||
const item = $dataItems.find(i => i && i.name === itemName);
|
||
if (!item) {
|
||
console.warn(`[EventHelper] アイテムが見つかりません: ${itemName}`);
|
||
return false;
|
||
}
|
||
|
||
// すでに所持していない場合のみ付与(重複防止)
|
||
if ($gameParty.hasItem(item)) {
|
||
console.log(`[EventHelper] 既に所持済み: ${item.name}`);
|
||
return false;
|
||
}
|
||
|
||
// アイテムを1つ付与
|
||
$gameParty.gainItem(item, 1);
|
||
console.log(`[EventHelper] 記憶アイテム付与: ${item.name}`);
|
||
|
||
// 通知表示
|
||
if (notify) {
|
||
const msg = `Obtained ${item.name}!`;
|
||
Torigoya.NotifyMessage.Manager.notify(new Torigoya.NotifyMessage.NotifyItem({ message: msg, icon: item.iconIndex }));
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
// 汎用敗北記憶付与
|
||
static addCommonMemory = function() {
|
||
const item = $dataItems.find(i => i && i.name === "Memory of Defeat");
|
||
if (!item) {
|
||
console.warn(`[EventHelper] Item not found: Memory of Defeat`);
|
||
return false;
|
||
}
|
||
|
||
// すでに所持していない場合のみ付与(重複防止)
|
||
if ($gameParty.hasItem(item)) {
|
||
console.log(`[EventHelper] 既に所持済み: ${item.name}`);
|
||
return false;
|
||
}
|
||
|
||
// アイテムを1つ付与
|
||
$gameParty.gainItem(item, 1);
|
||
console.log(`[EventHelper] 記憶アイテム付与: ${item.name}`);
|
||
|
||
return true;
|
||
};
|
||
|
||
// HEvent タグの有無チェック(イベントメモ欄参照)
|
||
static hasHEvent = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
// イベントのメモ欄から HEvent タグをチェック
|
||
const hasTag = /<HEvent:\s*.+?\s*>/i.test(event.event()?.note || "");
|
||
return hasTag;
|
||
};
|
||
|
||
// エンディングイベントIDを取得(タグがない場合は空文字列を返す)
|
||
static getEndingEvent = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return "";
|
||
|
||
const eventName = event.event()?.name;
|
||
if (!eventName) return "";
|
||
|
||
// 同名の敵データを検索(Troops.jsonはJP名のままなのでブリッジ)
|
||
const troop2 = $dataTroops.find(t => t && t.name === eventName);
|
||
const enemy = troop2 ? $dataEnemies[troop2.id] : $dataEnemies.find(e => e && e.name === eventName);
|
||
if (!enemy) return "";
|
||
|
||
// EndingEventタグからIDを抽出
|
||
const match = enemy.note.match(/<EndingEvent:\s*(.+?)\s*>/i);
|
||
if (!match) return "";
|
||
|
||
const endingId = match[1].trim();
|
||
console.log(`[EventHelper] エンディングID取得: ${endingId}`);
|
||
return endingId;
|
||
};
|
||
|
||
// エンディングイベントタグの有無チェック
|
||
static hasEndingEvent = function() {
|
||
return this.getEndingEvent() !== "";
|
||
};
|
||
|
||
// Hイベントの記憶付与(イベントメモ欄参照: <HEvent:ミミックの記憶>)
|
||
static addHMemory = function() {
|
||
const interpreter = this instanceof Game_Interpreter ? this : $gameMap._interpreter;
|
||
const event = $gameMap.event(interpreter._eventId);
|
||
if (!event) return false;
|
||
|
||
// イベントのメモ欄から HEvent タグを抽出
|
||
const match = event.event()?.note.match(/<HEvent:\s*(.+?)\s*>/i);
|
||
if (!match) {
|
||
console.warn(`[EventHelper] HEvent タグが見つかりません`);
|
||
return false;
|
||
}
|
||
|
||
const itemName = match[1].trim();
|
||
const item = $dataItems.find(i => i && i.name === itemName);
|
||
if (!item) {
|
||
console.warn(`[EventHelper] アイテムが見つかりません: ${itemName}`);
|
||
return false;
|
||
}
|
||
|
||
if ($gameParty.hasItem(item)) {
|
||
console.log(`[EventHelper] 既に所持済み: ${item.name}`);
|
||
return false;
|
||
}
|
||
|
||
$gameParty.gainItem(item, 1);
|
||
console.log(`[EventHelper] 記憶アイテム付与: ${item.name}`);
|
||
return true;
|
||
};
|
||
}
|
||
|
||
window.Kurogoma.EventHelper = EventHelper;
|
||
|
||
})(); |