| 赞 | 168 |
| VIP | |
| 好人卡 | |
| 积分 | 229 |
| 经验 | |
| 最后登录 | 2025-4-1 |
| 在线时间 | 8598 小时 |
- 梦石
- 0
- 星屑
- 22879
- 在线时间
- 8598 小时
- 注册时间
- 2011-12-31
- 回帖
- 3270
|
发表于 2019-9-9 11:21:36
|
显示全部楼层
本帖最后由 tseyik 于 2019-9-9 11:24 编辑
選択肢拡張(ver. 3.10)[pre lang="javascript"]//=============================================================================
// MPP_ChoiceEX.js
//=============================================================================
// Copyright (c) 2015-2019 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc 【ver.3.10】選択肢の機能拡張
* @author 木星ペンギン
*
* @help ※[]内は未設定でも動作します。
* プラグインコマンド:
* ChoicePos x y[ row] # 選択肢の位置(x,y)と行数(row)指定
* ChoiceVariableId n # 選択肢のデフォルト位置を変数n番にする
* ChoiceRect x y width height
* # 選択肢の座標とサイズを指定
* ChoiceUnderMessage # 選択肢をメッセージの下に表示
*
* ※ プラグインコマンドにて指定する値には変数が使用できます。
* v[n] と記述することでn番の変数の値を参照します。
*
* 注釈:
* 選択肢ヘルプ # 各項目の下に設定することでヘルプを表示させる
*
* 選択肢テキスト:
* if(条件) # 条件が偽になると項目が表示されなくなる
* en(条件) # 条件が偽になると項目が選択不可
*
* ================================================================
* ▼ 使い方
* --------------------------------
* 〇 選択肢を増やす
* イベントコマンド『選択肢の表示』を続けて配置すると
* 一つの選択肢にまとめられます。
* まとめたくない場合は、間に注釈などを入れることで
* 通常通り分けることができます。
*
* 『デフォルト』の処理は、なし以外を設定したものが適用されます。
* 『デフォルト』の処理が複数ある場合、
* 後に設定された選択肢のものが適用されます。
*
* 『キャンセル』の処理は、禁止以外を設定したものが適用されます。
* 『キャンセル』の処理が複数ある場合、
* 後に設定された選択肢のものが適用されます。
*
* 『背景』と『ウィンドウ位置』は後の選択肢のものが適用されます。
*
*
* ================================================================
* ▼ プラグインコマンド 詳細
* --------------------------------
* 〇 ChoicePos x y[ row]
* x : 選択肢ウィンドウのX座標
* y : 選択肢ウィンドウのY座標
* row : 選択肢ウィンドウの行数。未設定の場合はすべて表示
*
* 次に表示する選択肢の位置(x,y)と行数(row)指定します。
*
* --------------------------------
* 〇 ChoiceVariableId n
* n : 変数番号
*
* 次に表示する選択肢のデフォルト位置を変数の値にします。
* さらに現在のカーソル位置を変数に入れます。
*
* カーソル位置は最初の選択肢が上から0~5、次の選択肢は10~15と、
* 選択肢毎に+10されます。
*
* 変数に入った値の項目が表示されない場合、なしと同じ処理をします。
*
* --------------------------------
* 〇 ChoiceRect x y width height
* x : X座標
* y : Y座標
* width : 幅
* height : 高さ
*
* 次に表示する選択肢の座標とサイズを指定します。
*
* 各項目、未設定もしくは-1を指定した場合、通常の値が適用されます。
*
* --------------------------------
* 〇 ChoiceUnderMessage
*
* 次に表示する選択肢をメッセージウィンドウ内に表示させます。
*
* この機能は[文章の表示]と併用しなければ機能しません。
* [文章の表示]の前に実行してください。
*
* 選択肢ウィンドウの[背景]は設定したものが適用されます。
*
*
* ================================================================
* ▼ 選択肢テキスト 詳細
* --------------------------------
* 〇 項目が表示される条件の設定
* 選択肢の文章中に
* if(条件)
* と入れ、その条件が偽になると項目が表示されなくなります。
*
* 『デフォルト』の項目が表示されない場合の動作は、
* プラグインパラメータの[Disabled Index]にて設定できます。
*
* 『キャンセル』の項目が表示されない場合、禁止と同じ処理をします。
*
* 条件内では s でスイッチ、v で変数を参照できます。
*
* 例:if(s[1]) とした場合
* => スイッチ1番がONで表示、OFFで非表示。
* if(!s[2]) とした場合
* => スイッチ2番がOFFで表示、ONで非表示。
* if(v[5]>0) とした場合
* => 変数5番が0より大きければ表示、0以下で非表示。
*
* 変数で使える不等号
* === : 等しい
* !== : 等しくない
* < : より小さい
* <= : より小さいまたは等しい
* > : より大きい
* >= : より大きいまたは等しい
*
* 条件式はeval関数で処理されているため、他演算子も使用できます。
*
* --------------------------------
* 〇 項目を半透明で表示する条件の設定
* 選択肢の文章中に
* en(条件)
* と入れ、その条件が偽になると項目が半透明で表示されます。
* 半透明となった項目は選択できなくなります。
*
* 条件は上の『項目が表示される条件の設定』と同じです。
*
* 『キャンセル』の項目が半透明の場合、ブザーが鳴ります。
*
*
* ================================================================
* ▼ プラグインパラメータ 詳細
* --------------------------------
* 〇 Disabled Index
*
* [デフォルト]となる項目がif(条件)により非表示となった場合、
* デフォルト位置をどこにするかを設定します。
*
* none : [なし]と同じ
* top : 先頭の項目
*
* --------------------------------
* 〇 Plugin Commands / Event Comment
*
* プラグインコマンドや注釈で使用するコマンドは、
* プラグインパラメータから変更できます。
*
* コマンドを短くしたり日本語にしたりなどして、
* 自分が使いやすいようにしてください。
*
* プラグインコマンドのみ、変更後もデフォルトのコマンドでも動作します。
*
*
* ================================================================
* ▼ その他
* --------------------------------
* 〇 プラグインコマンドの実行タイミング
* プラグインコマンドを使用する場合、[選択肢の表示]の前に実行するのが
* 好ましいです。
* ただし、メッセージウィンドウを表示したまま選択肢の処理を実行したい場合、
* [文章の表示]より前にプラグインコマンドを実行してください。
*
* --------------------------------
* 〇 ヘルプメッセージの表示
* 各選択肢項目の下に注釈で以下の文字列を入れると、
* 続きの文章をヘルプメッセージとしてカーソルを合わせたときに
* 標示させることができます。
*
* 選択肢ヘルプ
*
* ※注意点
* ヘルプメッセージは[文章の表示]と同じ機能を使っているため、
* 制御文字が使用できます。
* ただし、\!と\^は使用できません。
*
* ================================
* 制作 : 木星ペンギン
* URL : http://woodpenguin.blog.fc2.com/
*
* @param maxPageRow
* @type number
* @desc 1ページに表示される行数
* @default 6
*
* @param Disabled Index
* @type select
* @option none
* @option top
* @desc [デフォルト]となる選択肢が表示されない場合のデフォルト位置
* @default none
*
*
* @param === Command ===
*
* @param Plugin Commands
* @type struct<Plugin>
* @desc プラグインコマンド名
* @default {"ChoicePos":"ChoicePos","ChoiceVariableId":"ChoiceVariableId","ChoiceRect":"ChoiceRect","ChoiceUnderMessage":"ChoiceUnderMessage"}
* @parent === Command ===
*
* @param Event Comment
* @type struct<EventComment>
* @desc イベントの注釈で使うコマンド名
* @default {"ChoiceHelp":"選択肢ヘルプ"}
* @parent === Command ===
*
*/
/*~struct~Plugin:
* @param ChoicePos
* @desc 選択肢の位置(x,y)と行数(row)指定
* @default ChoicePos
*
* @param ChoiceVariableId
* @desc 選択肢のデフォルト位置を変数n番にする
* @default ChoiceVariableId
*
* @param ChoiceRect
* @desc 選択肢の座標とサイズ(x,y,width,height)指定
* @default ChoiceRect
*
* @param ChoiceUnderMessage
* @desc 選択肢をメッセージの下に表示
* @default ChoiceUnderMessage
*
*/
/*~struct~EventComment:
* @param ChoiceHelp
* @desc 各項目の下に設定することでヘルプを表示させる
* @default 選択肢ヘルプ
*/
(function() {
const MPPlugin = {};
{
let parameters = PluginManager.parameters('MPP_ChoiceEX');
MPPlugin.maxPageRow = Number(parameters['maxPageRow']);
MPPlugin.DisabledIndex = parameters['Disabled Index'];
MPPlugin.PluginCommands = JSON.parse(parameters['Plugin Commands']);
MPPlugin.EventComment = JSON.parse(parameters['Event Comment']);
}
const Alias = {};
//-----------------------------------------------------------------------------
// Game_Message
//15
Alias.GaMe_clear = Game_Message.prototype.clear;
Game_Message.prototype.clear = function() {
Alias.GaMe_clear.apply(this, arguments);
this._choiceEnables = [];
this._choiceResults = [];
this._helpTexts = [];
this._choiceX = -1;
this._choiceY = -1;
this._choiceWidth = -1;
this._choiceHeight = -1;
this._choiceMaxRow = MPPlugin.maxPageRow;
this._choiceVariableId = 0;
this.choiceUnderMes = false;
};
Game_Message.prototype.setChoiceEnables = function(enables) {
this._choiceEnables = enables;
};
Game_Message.prototype.choiceEnables = function() {
return this._choiceEnables;
};
Game_Message.prototype.setChoiceResults = function(results) {
this._choiceResults = results;
};
Game_Message.prototype.setChoiceHelpTexts = function(texts) {
this._helpTexts = texts;
};
Game_Message.prototype.isHelp = function() {
return this._helpTexts.length > 0;
};
Game_Message.prototype.setChoicePos = function(x, y, row) {
this._choiceX = x;
this._choiceY = y;
this._choiceWidth = -1;
this._choiceHeight = -1;
this._choiceMaxRow = row;
};
Game_Message.prototype.setChoiceRect = function(x, y, width, height) {
this._choiceX = x;
this._choiceY = y;
this._choiceWidth = width;
this._choiceHeight = height;
};
Game_Message.prototype.setChoiceVariableId = function(id) {
this._choiceVariableId = id;
};
Game_Message.prototype.shiftLine = function(height) {
this._choiceY += height;
this._choiceHeight -= height;
};
//-----------------------------------------------------------------------------
// Game_Interpreter
//336
Game_Interpreter.prototype.setupChoices = function(params) {
var data = {
choices: [],
enables: [],
results: [],
helpTexts: [],
cancelType: -1,
defaultType: -1,
positionType: 0,
background: 0
};
data = this.addChoices(params, this._index, data, 0);
if (data.choices.length > 0) {
var helpTexts = [];
if (data.helpTexts.length > 0) {
helpTexts = data.results.map( i => data.helpTexts );
}
var cancelType = -1;
if (data.cancelType.mod(10) === 8 || data.results.contains(data.cancelType)) {
data.results.push(data.cancelType);
cancelType = data.choices.length;
}
var index = data.defaultType;
if ($gameMessage._choiceVariableId > 0) {
index = $gameVariables.value($gameMessage._choiceVariableId);
}
var defaultType = data.results.indexOf(index);
if (index >= 0 && defaultType < 0 && MPPlugin.DisabledIndex === "top") {
defaultType = 0;
}
$gameMessage.setChoices(data.choices, defaultType, cancelType);
$gameMessage.setChoiceEnables(data.enables);
$gameMessage.setChoiceResults(data.results);
$gameMessage.setChoiceHelpTexts(helpTexts);
$gameMessage.setChoiceBackground(data.background);
$gameMessage.setChoicePositionType(data.positionType);
$gameMessage.setChoiceCallback( n => this._branch[this._indent] = data.results[n] );
} else {
this._branch[this._indent] = -1;
}
};
Game_Interpreter.prototype.addChoices = function(params, i, data, d) {
var regIf = /\s*if\((.+?)\)/;
var regEn = /\s*en\((.+?)\)/;
for (var n = 0; n < params[0].length; n++) {
var str = params[0][n];
if (regIf.test(str)) {
str = str.replace(regIf, '');
if (RegExp.$1 && !this.evalChoice(RegExp.$1)) continue;
}
var enable = true;
if (regEn.test(str)) {
str = str.replace(regEn, '');
enable = this.evalChoice(RegExp.$1);
}
data.choices.push(str);
data.enables.push(enable);
data.results.push(n + d);
}
var cancelType = params[1];
if (cancelType !== -1) {
data.cancelType = cancelType + d;
}
var defaultType = params.length > 2 ? params[2] : 0;
if (defaultType >= 0) {
data.defaultType = defaultType + d;
}
data.positionType = params.length > 3 ? params[3] : 2;
data.background = params.length > 4 ? params[4] : 0;
var command;
for (;;) {
i++;
command = this._list;
if (!command) break;
if (command.indent === this._indent) {
if (command.code === 402) {
this.getHelpText(command.parameters[0] + d, i + 1, data);
} else if (command.code === 404) {
break;
}
}
}
command = this._list[i + 1];
if (command && command.code === 102) {
this.addChoices(command.parameters, i + 1, data, d + 10);
}
return data;
};
Game_Interpreter.prototype.getHelpText = function(c, i, data) {
var command = MPPlugin.EventComment.ChoiceHelp || '選択肢ヘルプ';
if (this._list.code === 108 && this._list.parameters[0] === command) {
var texts = [];
while (this._list[i + 1].code === 408) {
i++;
texts.push(this._list.parameters[0]);
}
data.helpTexts[c] = texts;
}
};
Game_Interpreter.prototype.evalChoice = function(formula) {
try {
var s = $gameSwitches._data;
var formula2 = formula.replace(/v\[(\d+)\]/g,
(match, p1) => $gameVariables.value(parseInt(p1)) );
return !!eval(formula2);
} catch (e) {
alert("条件エラー \n\n " + formula);
return true;
}
};
//362
Game_Interpreter.prototype.command403 = function() {
if (this._branch[this._indent] !== -2) {
this.skipBranch();
}
return true;
};
Game_Interpreter.prototype.command404 = function() {
if (this.nextEventCode() === 102) {
this._branch[this._indent] -= 10;
this._index++;
}
return true;
};
//1739
Alias.GaIn_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
Alias.GaIn_pluginCommand.apply(this, arguments);
var args2 = this.mppPluginCommandArgs(args);
switch (command) {
case MPPlugin.PluginCommands.ChoicePos:
case 'ChoicePos':
var x = args2[0];
var y = args2[1];
var row = args2[2] || 99;
$gameMessage.setChoicePos(x, y, row);
break;
case MPPlugin.PluginCommands.ChoiceVariableId:
case 'ChoiceVariableId':
$gameMessage.setChoiceVariableId(args2[0]);
break;
case MPPlugin.PluginCommands.ChoiceRect:
case 'ChoiceRect':
var x = (args2[0] === undefined ? -1 : args2[0]);
var y = (args2[1] === undefined ? -1 : args2[1]);
var width = (args2[2] === undefined ? -1 : args2[2]);
var height = (args2[3] === undefined ? -1 : args2[3]);
$gameMessage.setChoiceRect(x, y, width, height);
break;
case MPPlugin.PluginCommands.ChoiceUnderMessage:
case 'ChoiceUnderMessage':
$gameMessage.choiceUnderMes = true;
break;
}
return true;
};
Game_Interpreter.prototype.mppPluginCommandArgs = function(args) {
var v = $gameVariables._data;
return args.map(function(arg) {
try {
return eval(arg) || 0;
} catch (e) {
return arg;
}
});
};
//-----------------------------------------------------------------------------
// Window
Window.prototype.isClearWindowRect = function() {
return true;
};
//-----------------------------------------------------------------------------
// WindowLayer
//7100
Alias.WiLa__canvasClearWindowRect = WindowLayer.prototype._canvasClearWindowRect;
WindowLayer.prototype._canvasClearWindowRect = function(renderSession, window) {
if (window.isClearWindowRect())
Alias.WiLa__canvasClearWindowRect.apply(this, arguments);
};
//7162
Alias.WiLa__maskWindow = WindowLayer.prototype._maskWindow;
WindowLayer.prototype._maskWindow = function(window, shift) {
Alias.WiLa__maskWindow.apply(this, arguments);
if (!window.isClearWindowRect()) {
var rect = this._windowRect;
rect.x = 0;
rect.y = 0;
rect.width = 0;
rect.height = 0;
}
};
//-----------------------------------------------------------------------------
// Window_ChoiceList
Window_ChoiceList.prototype.isClearWindowRect = function() {
return !this._underMessage;
};
if (Window_ChoiceList.prototype.hasOwnProperty('close')) {
Alias.WiChLi_close = Window_ChoiceList.prototype.close
}
Window_ChoiceList.prototype.close = function() {
if ($gameMessage.isHelp()) this._messageWindow.onShowFast();
var _super = Alias.WiChLi_close || Window_Command.prototype.close;
_super.apply(this, arguments);
};
if (Window_ChoiceList.prototype.hasOwnProperty('select')) {
Alias.WiChli_select = Window_ChoiceList.prototype.select;
}
Window_ChoiceList.prototype.select = function(index) {
var variableId = $gameMessage._choiceVariableId;
if (index !== this.index() && variableId > 0) {
var results = $gameMessage._choiceResults;
$gameVariables.setValue(variableId, results[index]);
}
var _super = Alias.WiChli_select = Window_Command.prototype.select
_super.apply(this, arguments);
};
//34
Alias.WiChLi_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
Window_ChoiceList.prototype.updatePlacement = function() {
Alias.WiChLi_updatePlacement.apply(this, arguments);
if ($gameMessage._choiceWidth >= 0) {
this.width = Math.min($gameMessage._choiceWidth, Graphics.boxWidth);
}
if ($gameMessage._choiceHeight >= 0) {
this.height = Math.min($gameMessage._choiceHeight, Graphics.boxHeight);
}
if ($gameMessage._choiceX >= 0) {
this.x = Math.min($gameMessage._choiceX, Graphics.boxWidth - this.width);
}
if ($gameMessage._choiceY >= 0) {
this.y = Math.min($gameMessage._choiceY, Graphics.boxHeight - this.height);
}
this._underMessage = $gameMessage.choiceUnderMes;
};
//67
Window_ChoiceList.prototype.numVisibleRows = function() {
return Math.min($gameMessage.choices().length, $gameMessage._choiceMaxRow);
};
//103
Window_ChoiceList.prototype.makeCommandList = function() {
var choices = $gameMessage.choices();
var enables = $gameMessage._choiceEnables;
for (var i = 0; i < choices.length; i++) {
this.addCommand(choices, 'choice', enables);
}
};
//110
Alias.WiChLi_drawItem = Window_ChoiceList.prototype.drawItem;
Window_ChoiceList.prototype.drawItem = function(index) {
this.changePaintOpacity(this.isCommandEnabled(index));
Alias.WiChLi_drawItem.apply(this, arguments);
};
//123
Alias.WiChLi_callOkHandler = Window_ChoiceList.prototype.callOkHandler;
Window_ChoiceList.prototype.callOkHandler = function() {
Alias.WiChLi_callOkHandler.apply(this, arguments);
this._messageWindow.forceClear();
};
//129
Alias.WiChLi_callCancelHandler = Window_ChoiceList.prototype.callCancelHandler;
Window_ChoiceList.prototype.callCancelHandler = function() {
Alias.WiChLi_callCancelHandler.apply(this, arguments);
this._messageWindow.forceClear();
};
if (Window_ChoiceList.prototype.hasOwnProperty('processCancel')) {
Alias.WiChLi_processCancel = Window_ChoiceList.prototype.processCancel
}
Window_ChoiceList.prototype.processCancel = function() {
var type = $gameMessage.choiceCancelType();
var results = $gameMessage._choiceResults;
var index = results.indexOf(results[type]);
if (this.isCancelEnabled() && index !== type && !this.isCommandEnabled(index)) {
this.playBuzzerSound();
} else {
var _super = Alias.WiChLi_processCancel || Window_Command.prototype.processCancel;
_super.apply(this, arguments);
}
};
Window_ChoiceList.prototype.callUpdateHelp = function() {
if (this.active && this._messageWindow && $gameMessage.isHelp())
this.updateHelp();
};
Window_ChoiceList.prototype.updateHelp = function() {
this._messageWindow.forceClear();
var texts = $gameMessage._helpTexts[this.index()];
$gameMessage._texts = texts ? texts.clone() : [''];
this._messageWindow.startMessage();
};
//-----------------------------------------------------------------------------
// Window_Message
//109
Alias.WiMe_updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function() {
Alias.WiMe_updatePlacement.apply(this, arguments);
this.clearUnderChoice();
};
Window_Message.prototype.clearUnderChoice = function() {
if ($gameMessage.choiceUnderMes) {
var x = this.x + this.standardPadding();
x += this._textState.left || 0;
var y = this.y + 4;
var height = this.windowHeight();
$gameMessage.setChoiceRect(x, y, -1, height);
}
};
if (Window_Message.prototype.hasOwnProperty('processNewLine')) {
Alias.WiMe_processNewLine = Window_Message.prototype.processNewLine;
}
Window_Message.prototype.processNewLine = function(textState) {
if ($gameMessage.choiceUnderMes) $gameMessage.shiftLine(textState.height);
var _super = Alias.WiMe_processNewLine || Window_Base.prototype.processNewLine;
_super.apply(this, arguments);
};
//149
Alias.WiMe_updateInput = Window_Message.prototype.updateInput;
Window_Message.prototype.updateInput = function() {
if ($gameMessage.isHelp() && this._textState) return false;
return Alias.WiMe_updateInput.apply(this, arguments);
};
//196
Alias.WiMe_onEndOfText = Window_Message.prototype.onEndOfText;
Window_Message.prototype.onEndOfText = function() {
if ($gameMessage.isHelp() && !this._choiceWindow.active) {
this.startInput();
} else {
Alias.WiMe_onEndOfText.apply(this, arguments);
}
};
//207
Alias.WiMe_startInput = Window_Message.prototype.startInput;
Window_Message.prototype.startInput = function() {
if (this._choiceWindow.active) return true;
if ($gameMessage.isChoice() && $gameMessage.choiceUnderMes)
$gameMessage.shiftLine(this._textState.height);
return Alias.WiMe_startInput.apply(this, arguments);
};
Window_Message.prototype.forceClear = function() {
this._textState = null;
this.close();
this._goldWindow.close();
};
Window_Message.prototype.onShowFast = function() {
this._showFast = true;
};
//243
Alias.WiMe_newPage = Window_Message.prototype.newPage;
Window_Message.prototype.newPage = function(textState) {
Alias.WiMe_newPage.apply(this, arguments);
this.clearUnderChoice();
};
})();
[/pre]
http://woodpenguin.web.fc2.com/MV_Plugin/MPP_ChoiceEX.html
通常6つまでしか表示できない選択肢を、無制限に拡張できます。
通常最多只能顯示6個選項可以無限擴展。
スイッチや変数などによる条件で、その選択肢の有無を設定できます。
您可以根據開關和變量等條件設置該選項是否可用。
選択肢ウィンドウの表示位置を一時的に変更することができます。
可以臨時更改選項窗口的顯示位置
条件を設定することで、その項目を半透明にして選択不可にすることができます。
通過設置條件,您可以使項目半透明而不可選擇。
|
|