设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1936|回复: 4
打印 上一主题 下一主题

[有事请教] 请问mz有控制选项的插件吗?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
123
在线时间
46 小时
注册时间
2022-11-23
帖子
13
跳转到指定楼层
1
发表于 2022-12-13 16:13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
想要一个可以实现控制选项,显示,隐藏,禁用等功能的插件,求推荐!

Lv5.捕梦者

梦石
0
星屑
22968
在线时间
8639 小时
注册时间
2011-12-31
帖子
3367
2
发表于 2022-12-13 16:37:54 | 只看该作者
選択肢拡張
MPP_ChoiceEX.js
通過連接選項增加項目數量
按條件隱藏項目
有條件地半透明顯示項目
更改選擇窗口的位置
指定並保存選項的初始光標位置
顯示選擇幫助
https://woodpenguin.blog.fc2.com(日本國内限定)

選択肢位置揃
MPP_ChoiceAlign
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
22968
在线时间
8639 小时
注册时间
2011-12-31
帖子
3367
3
发表于 2022-12-13 16:42:17 | 只看该作者
  1. //=============================================================================
  2. // MPP_ChoiceEX.js
  3. //=============================================================================
  4. // Copyright (c) 2015 - 2022 Mokusei Penguin
  5. // Released under the MIT license
  6. // http://opensource.org/licenses/mit-license.php
  7. //=============================================================================

  8. /*:
  9. * @target MV MZ
  10. * @plugindesc Extend the functionality of your choices.
  11. * @author Mokusei Penguin
  12. * @url
  13. *
  14. * @help [version 4.3.3]
  15. * This plugin is for RPG Maker MV and MZ.
  16. *
  17. * ▼ Plugin command
  18. *  - In MV, the variable N is referred to by writing v[N] in the item for
  19. *    inputting a numerical value.
  20. *  - In MZ, in the item to enter a numerical value, select the text and
  21. *    write v[N] to refer to the variable N.
  22. *  - It is basically preferable to execute the plugin command before
  23. *    [Show Choices].
  24. *  - If you want to use the plug-in command while the message window is
  25. *    displayed, execute it before [Display text].
  26. *  
  27. *  〇 MV / MZ
  28. *  
  29. *  〇 ChoicePos x y row  / choicePos
  30. *       x   : X coordinate of choice window
  31. *       y   : Y coordinate of choice window
  32. *       row : The number of lines in the choice window. Show all if not set
  33. *   - Specify the position (x, y) and the number of rows of the next choice
  34. *     to display.
  35. *
  36. *  〇 ChoiceVariableId varId  / choiceVariableId
  37. *       varId : Variable number
  38. *   - Set the default position of the next choice to display to the value of
  39. *     the variable.
  40. *   - In addition, put the current cursor position in a variable.
  41. *   - The cursor position is 0 to 5 for the first option from the top,
  42. *     10 to 15 for the next option, and +10 for each option.
  43. *
  44. *  〇 ChoiceRect x y width height  / choiceRect
  45. *       x      : X coordinate
  46. *       y      : Y coordinate
  47. *       width  : width
  48. *       height : height
  49. *   - Specify the coordinates and size of the next choice to display.
  50. *   - For items that have not been set or for which -1 is specified,
  51. *     normal values will be applied.
  52. *   
  53. *  〇 ChoiceInMessage  / ChoiceInMessage
  54. *   - The next choice to display is displayed in the message window.
  55. *   - This function will not work unless it is used in combination with
  56. *     [Display Text].
  57. *   - Please execute before [Display text].
  58. *   
  59. * ▼ More choices
  60. *  - If you place the event command [Display Choices] in succession,
  61. *    they will be combined into one choice.
  62. *  - If you don't want to put them together, you can separate them as usual by
  63. *    inserting annotations in between.
  64. *  - For the "default" process, the one set other than none is applied.
  65. *  - For the "Cancel" process, the ones other than prohibited are applied.
  66. *  - In both cases, the setting of the option that follows takes precedence.
  67. *  - For "Background" and "Window position", the settings of the options that
  68. *    follow are applied.
  69. *
  70. * ▼ Setting conditions for displaying items
  71. *  - If you enter
  72. *      if(condition)
  73. *    in the text of the choice and the condition becomes false,
  74. *    the item will not be displayed.
  75. *  - The operation when the "Default" item is not displayed can be set in the
  76. *    [Disabled Index] of the plug-in parameter.
  77. *  - If the "Cancel" item is not displayed, the same processing as prohibition
  78. *    is performed.
  79. *  - Within the condition, you can refer to the switch with "s" and
  80. *    the variable with "v".
  81. *     Example: When set to if(s[1])
  82. *                => Switch No. 1 is ON for display and OFF for non-display.
  83. *              When set to if(!s[2])
  84. *                => Switch 2 is displayed when it is OFF,
  85. *                   and is hidden when it is ON.
  86. *              When set to if(v[5]>0)
  87. *                => Display if variable 5 is greater than 0,
  88. *                   hide if variable 5 is less than 0.
  89. *     
  90. *     Inequalities that can be used in variables
  91. *       === : equal
  92. *       !== : Not equal
  93. *       <   : Smaller
  94. *       <=  : Less than or equal to
  95. *       >   : Greater
  96. *       >=  : Greater than or equal to
  97. *
  98. * ▼ Setting conditions for displaying items semi-transparently
  99. *  - Enter
  100. *      en(condition)
  101. *    in the text of the choice, and if the condition is false,
  102. *    the item will be displayed semi-transparently.
  103. *  - Items that are semi-transparent cannot be selected.
  104. *  - The conditions are the same as "Setting the conditions for displaying
  105. *    items" above.
  106. *  - If the "Cancel" item is semi-transparent, you cannot cancel it.
  107. *
  108. * ▼ Display help message
  109. *  - You can put
  110. *      ChoiceHelp
  111. *    in the [Comment] below each choice item to indicate the following text
  112. *    as a help message when you hover over it.
  113. *  - Help messages use the same functionality as View Text, so you can use
  114. *    control characters. (\! And \^ cannot be used)
  115. *  - The above command name can be changed with the plugin parameter.
  116. *
  117. * ================================
  118. * Mail : wood_penguin@yahoo.co.jp (@ is half-width)
  119. * Blog : http://woodpenguin.blog.fc2.com/
  120. * License : MIT license
  121. *
  122. *  @command choicePos
  123. *      @desc Specify the position and number of lines for the next choice to display.
  124. *      @arg x
  125. *          @desc -1: Default
  126. *          @type number
  127. *              @min -1
  128. *              @max 9999
  129. *          @default 0
  130. *      @arg y
  131. *          @desc -1: Default
  132. *          @type number
  133. *              @min -1
  134. *              @max 9999
  135. *          @default 0
  136. *      @arg row
  137. *          @desc 0: Show all
  138. *          @type number
  139. *              @min 0
  140. *              @max 99
  141. *          @default 0
  142. *
  143. *
  144. *  @command choiceVariableId
  145. *      @desc Set the default position of the next choice to display to the value of the variable. In addition, put the current cursor position in a variable.
  146. *      @arg varId
  147. *          @desc
  148. *          @type variable
  149. *          @default 0
  150. *
  151. *  @command choiceRect
  152. *      @desc Specify the coordinates and size of the next choice to display.
  153. * Normal values are applied to unset items.
  154. *      @arg x
  155. *          @desc -1: Default
  156. *          @type number
  157. *              @min -1
  158. *              @max 9999
  159. *          @default
  160. *      @arg y
  161. *          @desc -1: Default
  162. *          @type number
  163. *              @min -1
  164. *              @max 9999
  165. *          @default
  166. *      @arg width
  167. *          @desc -1: Default
  168. *          @type number
  169. *              @min -1
  170. *              @max 9999
  171. *          @default
  172. *      @arg height
  173. *          @desc -1: Default
  174. *          @type number
  175. *              @min -1
  176. *              @max 9999
  177. *          @default
  178. *
  179. *  @command choiceInMessage
  180. *      @desc The next choice to display is displayed in the message window.
  181. * It will not work unless it is used in combination with [Display text].
  182. *
  183. *
  184. *  @param Max Page Row
  185. *      @desc Maximum number of lines displayed on one page
  186. *      @type number
  187. *          @min 1
  188. *          @max 99
  189. *      @default 6
  190. *
  191. *  @param Disabled Position
  192. *      @desc Cursor position when the default choice is not displayed
  193. *      @type select
  194. *          @option none
  195. *          @option top
  196. *      @default none
  197. *
  198. *  @param Choice Help Commands
  199. *      @desc
  200. *      @type string[]
  201. *      @default ["ChoiceHelp","<ChoiceHelp>"]
  202. *
  203. */

  204. /*:ja
  205. * @target MV MZ
  206. * @plugindesc 選択肢の機能を拡張します。
  207. * @author 木星ペンギン
  208. * @url
  209. *
  210. * @help [version 4.3.3]
  211. * このプラグインはRPGツクールMVおよびMZ用です。
  212. *
  213. * ▼ プラグインコマンド
  214. *  - MVでは数値を入力する項目で v[N] と記述することで変数N番を参照します。
  215. *  - MZでは数値を入力する項目で、テキストを選択して v[N] と記述することで
  216. *    変数N番を参照します。
  217. *  - プラグインコマンドは基本的に[選択肢の表示]の前に実行するのが好ましいです。
  218. *  - メッセージウィンドウを表示したままプラグインコマンドを使いたい場合、
  219. *    [文章の表示]の前に実行してください。
  220. *
  221. *  〇 MV / MZ
  222. *  
  223. *  〇 ChoicePos x y row  / 選択肢位置設定
  224. *       x   : 選択肢ウィンドウのX座標
  225. *       y   : 選択肢ウィンドウのY座標
  226. *       row : 選択肢ウィンドウの行数。未設定の場合はすべて表示
  227. *   - 次に表示する選択肢の位置(x,y)と行数(row)指定します。
  228. *
  229. *  〇 ChoiceVariableId varId  / カーソル位置設定
  230. *       varId : 変数番号
  231. *   - 次に表示する選択肢のデフォルト位置を変数の値にします。
  232. *   - さらに現在のカーソル位置を変数に入れます。
  233. *   - カーソル位置は最初の選択肢が上から0~5、次の選択肢は10~15と、
  234. *     選択肢毎に+10されます。
  235. *
  236. *  〇 ChoiceRect x y width height  / 選択肢サイズ設定
  237. *       x      : X座標
  238. *       y      : Y座標
  239. *       width  : 幅
  240. *       height : 高さ
  241. *   - 次に表示する選択肢の座標とサイズを指定します。
  242. *   - 未設定もしくは-1を指定した項目は、通常の値が適用されます。
  243. *   
  244. *  〇 ChoiceInMessage  / メッセージ内表示
  245. *   - 次に表示する選択肢をメッセージウィンドウ内に表示させます。
  246. *   - この機能は[文章の表示]と併用しなければ機能しません。
  247. *   - [文章の表示]の前に実行してください。
  248. *
  249. * ▼ 選択肢を増やす
  250. *  - イベントコマンド『選択肢の表示』を続けて配置すると
  251. *    一つの選択肢にまとめられます。
  252. *  - まとめたくない場合は、間に注釈などを入れることで
  253. *    通常通り分けることができます。
  254. *  - 『デフォルト』の処理は、なし以外を設定したものが適用されます。
  255. *  - 『キャンセル』の処理は、禁止以外を設定したものが適用されます。
  256. *  - どちらも後にある選択肢の設定が優先されます。
  257. *  - 『背景』と『ウィンドウ位置』は後にある選択肢の設定が適用されます。
  258. *
  259. * ▼ 項目が表示される条件の設定
  260. *  - 選択肢の文章中に
  261. *      if(条件)
  262. *    と入れ、その条件が偽になると項目が表示されなくなります。
  263. *  - 『デフォルト』の項目が表示されない場合の動作は、
  264. *    プラグインパラメータの[Disabled Index]にて設定できます。
  265. *  - 『キャンセル』の項目が表示されない場合、禁止と同じ処理をします。
  266. *  - 条件内では s でスイッチ、v で変数を参照できます。
  267. *     例:if(s[1]) とした場合
  268. *          => スイッチ1番がONで表示、OFFで非表示。
  269. *        if(!s[2]) とした場合
  270. *          => スイッチ2番がOFFで表示、ONで非表示。
  271. *        if(v[5]>0) とした場合
  272. *          => 変数5番が0より大きければ表示、0以下で非表示。
  273. *     
  274. *     変数で使える不等号
  275. *       === : 等しい
  276. *       !== : 等しくない
  277. *       <   : より小さい
  278. *       <=  : より小さいまたは等しい
  279. *       >   : より大きい
  280. *       >=  : より大きいまたは等しい
  281. *
  282. * ▼ 項目を半透明で表示する条件の設定
  283. *  - 選択肢の文章中に
  284. *      en(条件)
  285. *    と入れ、その条件が偽になると項目が半透明で表示されます。
  286. *  - 半透明となった項目は選択できなくなります。
  287. *  - 条件は上の『項目が表示される条件の設定』と同じです。
  288. *  - 『キャンセル』の項目が半透明の場合、キャンセルできなくなります。
  289. *
  290. * ▼ ヘルプメッセージの表示
  291. *  - 各選択肢項目の下に[注釈]で
  292. *      選択肢ヘルプ
  293. *    と入れると、続きの文章をヘルプメッセージとしてカーソルを合わせたときに
  294. *    標示させることができます。
  295. *  - ヘルプメッセージは[文章の表示]と同じ機能を使っているため、
  296. *    制御文字が使用できます。(\!と\^は使用できません)
  297. *  - 上記のコマンド名はプラグインパラメータで変更できます。
  298. *
  299. * ================================
  300. * Mail : wood_penguin@yahoo.co.jp (@は半角)
  301. * Blog : http://woodpenguin.blog.fc2.com/
  302. * License : MIT license
  303. *
  304. *  @command choicePos
  305. *      @text 選択肢位置設定
  306. *      @desc 次に表示する選択肢の位置と行数を指定します。
  307. *      @arg x
  308. *          @desc -1: デフォルト
  309. *          @type number
  310. *              @min -1
  311. *              @max 9999
  312. *          @default 0
  313. *      @arg y
  314. *          @desc -1: デフォルト
  315. *          @type number
  316. *              @min -1
  317. *              @max 9999
  318. *          @default 0
  319. *       @arg row
  320. *          @text 行数
  321. *          @desc 0: 全て表示
  322. *          @type number
  323. *              @min 0
  324. *              @max 99
  325. *          @default 0
  326. *
  327. *  @command choiceVariableId
  328. *      @text カーソル位置設定
  329. *      @desc 次に表示する選択肢のデフォルト位置を変数の値にします。
  330. * さらに現在のカーソル位置を変数に入れます。
  331. *      @arg varId
  332. *          @text 変数
  333. *          @desc
  334. *          @type variable
  335. *          @default 0
  336. *
  337. *  @command choiceRect
  338. *      @text 選択肢サイズ設定
  339. *      @desc 次に表示する選択肢の座標とサイズを指定します。
  340. * 未設定の項目は通常の値が適用されます。
  341. *      @arg x
  342. *          @desc -1: デフォルト
  343. *          @type number
  344. *              @min -1
  345. *              @max 9999
  346. *          @default
  347. *      @arg y
  348. *          @desc -1: デフォルト
  349. *          @type number
  350. *              @min -1
  351. *              @max 9999
  352. *          @default
  353. *      @arg width
  354. *          @text 幅
  355. *          @desc -1: デフォルト
  356. *          @type number
  357. *              @min -1
  358. *              @max 9999
  359. *          @default
  360. *      @arg height
  361. *          @text 高さ
  362. *          @desc -1: デフォルト
  363. *          @type number
  364. *              @min -1
  365. *              @max 9999
  366. *          @default
  367. *
  368. *  @command choiceInMessage
  369. *      @text メッセージ内表示
  370. *      @desc 次に表示する選択肢をメッセージウィンドウ内に表示させます。
  371. * [文章の表示]と併用しなければ機能しません。
  372. *
  373. *
  374. *  @param Max Page Row
  375. *      @text 最大表示行数
  376. *      @desc 1ページに表示される最大行数
  377. *      @type number
  378. *          @min 1
  379. *          @max 99
  380. *      @default 6
  381. *
  382. *  @param Disabled Position
  383. *      @text 無効時のカーソル位置
  384. *      @desc [デフォルト]となる選択肢が表示されない場合のカーソル位置
  385. *      @type select
  386. *          @option なし
  387. *              @value none
  388. *          @option 先頭
  389. *              @value top
  390. *      @default none
  391. *
  392. *  @param Choice Help Commands
  393. *      @text [選択肢ヘルプ]呼び出し名
  394. *      @desc
  395. *      @type string[]
  396. *      @default ["ChoiceHelp","<ChoiceHelp>","選択肢ヘルプ","<選択肢ヘルプ>"]
  397. *
  398. */

  399. (() => {
  400.     'use strict';
  401.    
  402.     const pluginName = 'MPP_ChoiceEX';
  403.    
  404.     // Plugin Parameters
  405.     const parameters = PluginManager.parameters(pluginName);
  406.     const param_MaxPageRow = Number(parameters['Max Page Row'] || 6);
  407.     const param_DisabledPosition = parameters['Disabled Position'] || 'none';
  408.     const param_ChoiceHelpCommands = JSON.parse(parameters['Choice Help Commands'] || '[]');
  409.    
  410.     // Dealing with other plugins
  411.     const __base = (obj, prop) => {
  412.         if (obj.hasOwnProperty(prop)) {
  413.             return obj[prop];
  414.         } else {
  415.             const proto = Object.getPrototypeOf(obj);
  416.             return function () { return proto[prop].apply(this, arguments); };
  417.         }
  418.     };
  419.    
  420.     // JsExtensions 代替
  421.     const MathExt = (() => {
  422.         // Number.prototype.clamp と違い、下限優先
  423.         const clamp = (x, min, max) => Math.max(Math.min(x, max), min);
  424.         const mod = (x, n) => ((x % n) + n) % n;
  425.         return { clamp, mod };
  426.     })();

  427.     //-------------------------------------------------------------------------
  428.     // PluginManager
  429.    
  430.     if (!PluginManager.registerCommand) {
  431.         PluginManager._commandsMV = PluginManager._commandsMV || {};

  432.         PluginManager.registerCommandMV = function(pluginName, commandName, func) {
  433.             const key = pluginName + ':' + commandName;
  434.             this._commandsMV[key] = func;
  435.         };
  436.         
  437.         PluginManager.callCommandMV = function(self, pluginName, commandName, args) {
  438.             const key = pluginName + ':' + commandName;
  439.             const func = this._commandsMV[key];
  440.             if (typeof func === 'function') {
  441.                 func.bind(self)(args);
  442.             }
  443.         };
  444.     }

  445.     {
  446.         const _registerCommand = PluginManager.registerCommand || PluginManager.registerCommandMV;

  447.         _registerCommand.call(PluginManager, pluginName, 'choicePos', args => {
  448.             const x = PluginManager.mppValue(args.x);
  449.             const y = PluginManager.mppValue(args.y);
  450.             const row = PluginManager.mppValue(args.row) || 99;
  451.             $gameMessage.setChoicePos(x, y, row);
  452.         });

  453.         _registerCommand.call(PluginManager, pluginName, 'choiceVariableId', args => {
  454.             const variableId = PluginManager.mppValue(args.varId);
  455.             $gameMessage.setChoiceVariableId(variableId);
  456.         });

  457.         _registerCommand.call(PluginManager, pluginName, 'choiceRect', args => {
  458.             const x = args.x ? PluginManager.mppValue(args.x) : -1;
  459.             const y = args.y ? PluginManager.mppValue(args.y) : -1;
  460.             const width = args.width ? PluginManager.mppValue(args.width) : -1;
  461.             const height = args.height ? PluginManager.mppValue(args.height) : -1;
  462.             $gameMessage.setChoiceRect(x, y, width, height);
  463.         });

  464.         _registerCommand.call(PluginManager, pluginName, 'choiceInMessage', () => {
  465.             $gameMessage.requestChoiceInMessage();
  466.         });
  467.     }

  468.     PluginManager.mppValue = function(value) {
  469.         const match = /^V\[(\d+)\]$/i.exec(value);
  470.         return match ? $gameVariables.value(+match[1]) : +value;
  471.     };
  472.    
  473.     //-------------------------------------------------------------------------
  474.     // Game_Message

  475.     Object.defineProperties(Game_Message.prototype, {
  476.         choiceX: {
  477.             get() {
  478.                 return this._choiceX;
  479.             },
  480.             configurable: true
  481.         },
  482.         choiceY: {
  483.             get() {
  484.                 return this._choiceY;
  485.             },
  486.             configurable: true
  487.         },
  488.         choiceWidth: {
  489.             get() {
  490.                 return this._choiceWidth;
  491.             },
  492.             configurable: true
  493.         },
  494.         choiceHeight: {
  495.             get() {
  496.                 return this._choiceHeight;
  497.             },
  498.             configurable: true
  499.         }
  500.     });

  501.     const _Game_Message_clear = Game_Message.prototype.clear;
  502.     Game_Message.prototype.clear = function() {
  503.         _Game_Message_clear.apply(this, arguments);
  504.         this._choiceEnables = [];
  505.         this._choiceResults = [];
  506.         this._helpTexts = [];
  507.         this._choiceX = -1;
  508.         this._choiceY = -1;
  509.         this._choiceWidth = -1;
  510.         this._choiceHeight = -1;
  511.         this._choiceMaxRow = param_MaxPageRow;
  512.         this._choiceVariableId = 0;
  513.         this._choiceInMessage = false;
  514.     };

  515.     Game_Message.prototype.choiceMaxRow = function() {
  516.         return this._choiceMaxRow;
  517.     };

  518.     Game_Message.prototype.setTexts = function(texts) {
  519.         this._texts = texts;
  520.     };

  521.     Game_Message.prototype.setChoiceEnables = function(enables) {
  522.         this._choiceEnables = enables;
  523.     };

  524.     Game_Message.prototype.choiceEnables = function() {
  525.         return this._choiceEnables;
  526.     };

  527.     Game_Message.prototype.setChoiceResults = function(results) {
  528.         this._choiceResults = results;
  529.     };

  530.     Game_Message.prototype.choiceResults = function() {
  531.         return this._choiceResults;
  532.     };

  533.     Game_Message.prototype.setChoiceHelpTexts = function(texts) {
  534.         this._helpTexts = texts;
  535.     };

  536.     Game_Message.prototype.isChoiceHelp = function() {
  537.         return !this._choiceInMessage && this._helpTexts.length > 0;
  538.     };

  539.     Game_Message.prototype.helpTexts = function() {
  540.         return this._helpTexts;
  541.     };

  542.     Game_Message.prototype.setChoicePos = function(x, y, row) {
  543.         this._choiceX = x;
  544.         this._choiceY = y;
  545.         this._choiceWidth = -1;
  546.         this._choiceHeight = -1;
  547.         this._choiceMaxRow = row;
  548.     };

  549.     Game_Message.prototype.setChoiceRect = function(x, y, width, height) {
  550.         this._choiceX = x;
  551.         this._choiceY = y;
  552.         this._choiceWidth = width;
  553.         this._choiceHeight = height;
  554.     };

  555.     Game_Message.prototype.setChoiceVariableId = function(id) {
  556.         this._choiceVariableId = id;
  557.     };

  558.     Game_Message.prototype.lowerChoiceHeight = function(height) {
  559.         this._choiceY += height;
  560.         this._choiceHeight -= height;
  561.     };

  562.     Game_Message.prototype.requestChoiceInMessage = function() {
  563.         this._choiceInMessage = true;
  564.     };

  565.     Game_Message.prototype.choiceVariableId = function() {
  566.         return this._choiceVariableId;
  567.     };

  568.     Game_Message.prototype.isChoiceInMessage = function() {
  569.         return this._choiceInMessage;
  570.     };

  571.     //-----------------------------------------------------------------------------
  572.     // Game_Interpreter

  573.     Game_Interpreter.prototype.setupChoices = function(params) {
  574.         const data = {
  575.             choices: [],
  576.             enables: [],
  577.             results: [],
  578.             helpTexts: [],
  579.             cancelType: -1,
  580.             defaultType: -1,
  581.             positionType: 0,
  582.             background: 0
  583.         };
  584.         this.addChoices(params, this._index, data, 0);
  585.         if (data.choices.length > 0) {
  586.             const helpTexts = this.choiceHelpTexts(data);
  587.             const cancelType = this.choiceCancelType(data);
  588.             const defaultType = this.choiceDefaultType(data);
  589.             $gameMessage.setChoices(data.choices, defaultType, cancelType);
  590.             $gameMessage.setChoiceEnables(data.enables);
  591.             $gameMessage.setChoiceResults(data.results);
  592.             $gameMessage.setChoiceHelpTexts(helpTexts);
  593.             $gameMessage.setChoiceBackground(data.background);
  594.             $gameMessage.setChoicePositionType(data.positionType);
  595.             $gameMessage.setChoiceCallback(n => {
  596.                 this._branch[this._indent] = n < 0
  597.                     ? data.cancelType
  598.                     : data.results[n];
  599.             });
  600.         } else {
  601.             this._branch[this._indent] = -1;
  602.         }
  603.     };

  604.     Game_Interpreter.prototype.addChoices = function(params, index, data, d) {
  605.         const choices = [...params[0]];
  606.         const cancelType = params[1] < choices.length ? params[1] : -2;
  607.         const defaultType = params[2] || 0;
  608.         const nextCommand = this.nextCommandOfChoice(index + 1);
  609.         this.checkChoiceConditions(choices, data, d);
  610.         if (cancelType !== -1) data.cancelType = cancelType + d;
  611.         if (defaultType >= 0) data.defaultType = defaultType + d;
  612.         data.positionType = params.length > 3 ? params[3] : 2;
  613.         data.background = params[4] || 0;
  614.         this.setupHelpText(index + 1, data, d);
  615.         if (nextCommand && nextCommand.code === 102) {
  616.             const nextIndex = this._list.indexOf(nextCommand);
  617.             this.addChoices(nextCommand.parameters, nextIndex, data, d + 10);
  618.         }
  619.     };

  620.     Game_Interpreter.prototype.checkChoiceConditions = function(choices, data, d) {
  621.         const regIf = /\s?if\((.+?)\)/;
  622.         const regEn = /\s?en\((.+?)\)/;
  623.         for (const [i, text] of choices.entries()) {
  624.             if (this.meetsChoiceConditions(text, regIf)) {
  625.                 const realText = text.replace(regIf, '').replace(regEn, '');
  626.                 data.choices.push(realText);
  627.                 data.enables.push(this.meetsChoiceConditions(text, regEn));
  628.                 data.results.push(i + d);
  629.             }
  630.         };
  631.     };

  632.     Game_Interpreter.prototype.meetsChoiceConditions = function(text, reg) {
  633.         const match = reg.exec(text);
  634.         return !match || this.evalChoice(match[1]);
  635.     };

  636.     Game_Interpreter.prototype.evalChoice = function(condition) {
  637.         try {
  638.             const s = $gameSwitches._data;
  639.             const realCondition = condition.replace(
  640.                 /V\[(\d+)\]/gi,
  641.                 (_, n) => $gameVariables.value(+n)
  642.             );
  643.             return !!eval(realCondition);
  644.         } catch (e) {
  645.             console.log('条件エラー \n ' + condition);
  646.             return true;
  647.         }
  648.     };

  649.     Game_Interpreter.prototype.setupHelpText = function(index, data, d) {
  650.         for (const [i, command] of this._list.slice(index).entries()) {
  651.             if (command.indent === this._indent) {
  652.                 if (command.code === 402) {
  653.                     const type = command.parameters[0] + d;
  654.                     const helpTexts = this.extractHelpTexts(i + index + 1);
  655.                     if (helpTexts) data.helpTexts[type] = helpTexts;
  656.                 } else if (command.code === 404) {
  657.                     return;
  658.                 }
  659.             }
  660.         }
  661.     };

  662.     Game_Interpreter.prototype.extractHelpTexts = function(index) {
  663.         const command = this._list[index];
  664.         if (
  665.             command.code === 108 &&
  666.             param_ChoiceHelpCommands.includes(command.parameters[0])
  667.         ) {
  668.             return this.getCommentHelpTexts(index + 1);
  669.         }
  670.         return null;
  671.     };

  672.     Game_Interpreter.prototype.getCommentHelpTexts = function(index) {
  673.         const result = [];
  674.         for (const command of this._list.slice(index)) {
  675.             if (command.code === 408) {
  676.                 result.push(command.parameters[0]);
  677.             } else {
  678.                 break;
  679.             }
  680.         }
  681.         return result;
  682.     };

  683.     Game_Interpreter.prototype.choiceHelpTexts = function(data) {
  684.         const helpTexts = data.helpTexts;
  685.         return helpTexts.length > 0 ? data.results.map(i => helpTexts[i]) : [];
  686.     };

  687.     Game_Interpreter.prototype.choiceCancelType = function(data) {
  688.         if (data.cancelType === -1) {
  689.             return -1;
  690.         } else if (MathExt.mod(data.cancelType, 10) === 8) {
  691.             return -2;
  692.         }
  693.         return data.results.indexOf(data.cancelType);
  694.     };

  695.     Game_Interpreter.prototype.choiceDefaultType = function(data) {
  696.         const vId = $gameMessage.choiceVariableId();
  697.         const index = vId > 0 ? $gameVariables.value(vId) : data.defaultType;
  698.         const defaultType = data.results.indexOf(index);
  699.         if (index >= 0 && defaultType < 0 && param_DisabledPosition === 'top') {
  700.             return 0;
  701.         }
  702.         return defaultType;
  703.     };

  704.     Game_Interpreter.prototype.nextCommandOfChoice = function(index) {
  705.         const i = this._list.slice(index).findIndex(
  706.             command => command.indent === this._indent && command.code === 404
  707.         );
  708.         return i >= 0 ? this._list[index + i + 1] : null;
  709.     };

  710.     // overwrite
  711.     Game_Interpreter.prototype.command403 = function() {
  712.         if (this._branch[this._indent] !== -2) {
  713.             this.skipBranch();
  714.         }
  715.         return true;
  716.     };

  717.     Game_Interpreter.prototype.command404 = function() {
  718.         if (this.nextEventCode() === 102) {
  719.             this._branch[this._indent] -= 10;
  720.             this._index++;
  721.         }
  722.         return true;
  723.     };

  724.     const _mzCommands = {
  725.         ChoicePos: { name: 'choicePos', keys: ['x', 'y', 'row'] },
  726.         ChoiceVariableId: { name: 'choiceVariableId', keys: ['varId'] },
  727.         ChoiceRect: { name: 'choiceRect', keys: ['x', 'y', 'width', 'height'] },
  728.         ChoiceInMessage: { name: 'choiceInMessage', keys: [] }
  729.     };
  730.     Object.assign(_mzCommands, {
  731.         '選択肢位置設定': _mzCommands.ChoicePos,
  732.         'カーソル位置設定': _mzCommands.ChoiceVariableId,
  733.         '選択肢サイズ設定': _mzCommands.ChoiceRect,
  734.         'メッセージ内表示': _mzCommands.ChoiceInMessage
  735.     });

  736.     const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  737.     Game_Interpreter.prototype.pluginCommand = function(command, args) {
  738.         _Game_Interpreter_pluginCommand.apply(this, arguments);
  739.         const mzCommand = _mzCommands[command];
  740.         if (mzCommand) {
  741.             const args2 = Object.assign(
  742.                 {},
  743.                 ...mzCommand.keys.map((key, i) => ({ [key]: args[i] }))
  744.             );
  745.             PluginManager.callCommandMV(this, pluginName, mzCommand.name, args2);
  746.         }
  747.     };
  748.    
  749.     //-----------------------------------------------------------------------------
  750.     // Window_ChoiceList

  751.     const _Window_ChoiceList_select = __base(Window_ChoiceList.prototype, 'select');
  752.     Window_ChoiceList.prototype.select = function(index) {
  753.         const variableId = $gameMessage.choiceVariableId();
  754.         if (index !== this.index() && variableId > 0) {
  755.             const results = $gameMessage.choiceResults();
  756.             $gameVariables.setValue(variableId, results[index]);
  757.         }
  758.         _Window_ChoiceList_select.apply(this, arguments);
  759.     };

  760.     const _Window_ChoiceList_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
  761.     Window_ChoiceList.prototype.updatePlacement = function() {
  762.         _Window_ChoiceList_updatePlacement.apply(this, arguments);
  763.         const {
  764.             choiceX: x, choiceY: y, choiceWidth: width, choiceHeight: height
  765.         } = $gameMessage;
  766.         if (width >= 0) {
  767.             this.width = MathExt.clamp(width, 1, Graphics.boxWidth);
  768.         }
  769.         if (height >= 0) {
  770.             this.height = MathExt.clamp(height, 1, Graphics.boxHeight);
  771.         }
  772.         if (x >= 0) this.x = Math.min(x, Graphics.boxWidth - this.width);
  773.         if (y >= 0) this.y = Math.min(y, Graphics.boxHeight - this.height);
  774.         this._isWindow = !$gameMessage.isChoiceInMessage();
  775.     };

  776.     // overwrite
  777.     Window_ChoiceList.prototype.numVisibleRows = function() {
  778.         const choices = $gameMessage.choices();
  779.         const maxLines = $gameMessage.choiceMaxRow();
  780.         return Math.min(choices.length, maxLines);
  781.     };

  782.     // overwrite
  783.     Window_ChoiceList.prototype.makeCommandList = function() {
  784.         const enables = $gameMessage.choiceEnables();
  785.         for (const [i, choice] of $gameMessage.choices().entries()) {
  786.             this.addCommand(choice, 'choice', enables[i]);
  787.         }
  788.     };

  789.     const _Window_ChoiceList_drawItem = Window_ChoiceList.prototype.drawItem;
  790.     Window_ChoiceList.prototype.drawItem = function(index) {
  791.         this.changePaintOpacity(this.isCommandEnabled(index));
  792.         _Window_ChoiceList_drawItem.apply(this, arguments);
  793.     };

  794.     const _Window_ChoiceList_callOkHandler = Window_ChoiceList.prototype.callOkHandler;
  795.     Window_ChoiceList.prototype.callOkHandler = function() {
  796.         _Window_ChoiceList_callOkHandler.apply(this, arguments);
  797.         this._messageWindow.forceClear();
  798.         this._helpIndex = null;
  799.     };

  800.     const _Window_ChoiceList_callCancelHandler = Window_ChoiceList.prototype.callCancelHandler;
  801.     Window_ChoiceList.prototype.callCancelHandler = function() {
  802.         _Window_ChoiceList_callCancelHandler.apply(this, arguments);
  803.         this._messageWindow.forceClear();
  804.         this._helpIndex = null;
  805.     };

  806.     const _Window_ChoiceList_processCancel = __base(Window_ChoiceList.prototype, 'processCancel');
  807.     Window_ChoiceList.prototype.processCancel = function() {
  808.         const cancelType = $gameMessage.choiceCancelType();
  809.         if (
  810.             cancelType >= 0 &&
  811.             this.isCancelEnabled() &&
  812.             !this.isCommandEnabled(cancelType)
  813.         ) {
  814.             this.playBuzzerSound();
  815.             return;
  816.         }
  817.         _Window_ChoiceList_processCancel.apply(this, arguments);
  818.     };

  819.     Window_ChoiceList.prototype.callUpdateHelp = function() {
  820.         if (
  821.             this.active &&
  822.             this._messageWindow &&
  823.             $gameMessage.isChoiceHelp() &&
  824.             this._helpIndex !== this.index()
  825.         ) {
  826.             this._helpIndex = this.index();
  827.             this.updateHelp();
  828.         }
  829.     };

  830.     Window_ChoiceList.prototype.updateHelp = function() {
  831.         this._messageWindow.forceClear();
  832.         const texts = $gameMessage.helpTexts()[this.index()];
  833.         $gameMessage.setTexts(texts ? [...texts] : ['']);
  834.         this._messageWindow.startMessage();
  835.     };

  836.     //-----------------------------------------------------------------------------
  837.     // Window_Message

  838.     const _Window_Message_initialize = Window_Message.prototype.initialize;
  839.     Window_Message.prototype.initialize = function(rect) {
  840.         _Window_Message_initialize.apply(this, arguments);
  841.         this.updatePlacement();
  842.     };
  843.    
  844.     const _Window_Message_updatePlacement = Window_Message.prototype.updatePlacement;
  845.     Window_Message.prototype.updatePlacement = function() {
  846.         _Window_Message_updatePlacement.apply(this, arguments);
  847.         this.clearInChoice();
  848.     };

  849.     Window_Message.prototype.clearInChoice = function() {
  850.         if ($gameMessage.isChoiceInMessage()) {
  851.             const x = this.x + this.choiceStartX();
  852.             const y = this.y + 4;
  853.             const height = this.height;
  854.             $gameMessage.setChoiceRect(x, y, -1, height);
  855.         }
  856.     };

  857.     Window_Message.prototype.choiceStartX = function() {
  858.         if ('left' in this._textState) {
  859.             return this.standardPadding() + this._textState.left;
  860.         } else {
  861.             return $gameSystem.windowPadding() + this._textState.startX;
  862.         }
  863.     };

  864.     const _Window_Message_processNewLine = __base(Window_Message.prototype, 'processNewLine');
  865.     Window_Message.prototype.processNewLine = function(textState) {
  866.         if ($gameMessage.isChoiceInMessage()) {
  867.             $gameMessage.lowerChoiceHeight(textState.height);
  868.         }
  869.         _Window_Message_processNewLine.apply(this, arguments);
  870.     };

  871.     const _Window_Message_updateInput = Window_Message.prototype.updateInput;
  872.     Window_Message.prototype.updateInput = function() {
  873.         if ($gameMessage.isChoiceHelp() && this._textState) {
  874.             return false;
  875.         }
  876.         return _Window_Message_updateInput.apply(this, arguments);
  877.     };

  878.     const _Window_Message_onEndOfText = Window_Message.prototype.onEndOfText;
  879.     Window_Message.prototype.onEndOfText = function() {
  880.         const choiceWindow = this._choiceWindow || this._choiceListWindow;
  881.         if (!choiceWindow.active && $gameMessage.isChoiceHelp()) {
  882.             this.startInput();
  883.         } else {
  884.             _Window_Message_onEndOfText.apply(this, arguments);
  885.         }
  886.     };

  887.     const _Window_Message_startInput = Window_Message.prototype.startInput;
  888.     Window_Message.prototype.startInput = function() {
  889.         const choiceWindow = this._choiceWindow || this._choiceListWindow;
  890.         if (choiceWindow.active) return true;
  891.         if (this._textState && this.isLowerChoice()) {
  892.             $gameMessage.lowerChoiceHeight(this._textState.height);
  893.         }
  894.         return _Window_Message_startInput.apply(this, arguments);
  895.     };

  896.     Window_Message.prototype.isLowerChoice = function() {
  897.         const textState = this._textState;
  898.         const startX = 'left' in textState ? textState.left : textState.startX;
  899.         return (
  900.             $gameMessage.isChoice() &&
  901.             $gameMessage.isChoiceInMessage() &&
  902.             textState.x !== startX
  903.         );
  904.     };

  905.     Window_Message.prototype.forceClear = function() {
  906.         this._textState = null;
  907.         this.close();
  908.         this._goldWindow.close();
  909.     };

  910.     const _Window_Message_newPage = Window_Message.prototype.newPage;
  911.     Window_Message.prototype.newPage = function(textState) {
  912.         _Window_Message_newPage.apply(this, arguments);
  913.         this.clearInChoice();
  914.     };

  915. })();
复制代码
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
22968
在线时间
8639 小时
注册时间
2011-12-31
帖子
3367
4
发表于 2022-12-13 16:44:00 | 只看该作者
  1. * @target MV MZ
  2. * 擴展@plugindesc 選擇的功能。
  3. * @author 木星企鵝
  4. * @url
  5. *
  6. * @help [版本 4.3.3]
  7. * 此插件適用於 RPG Maker MV 和 MZ。
  8. *
  9. * ▼ 插件命令
  10. * - 在MV中,通過在項目中寫入v[N]以輸入數值來引用變量號N。
  11. * - 在 MZ 中,您可以通過選擇文本並寫入 v[N] 來輸入數字
  12. * 指變量號 N。
  13. * - 插件命令通常應該在 Show Choices 之前運行。
  14. * - 如果你想在保持消息窗口可見的同時使用插件命令,
  15. * 在[顯示文本]之前執行。
  16. *
  17. *〇MV/MZ
  18. *  
  19. *  〇 ChoicePos x y row  / 選択肢位置設定
  20. *       x   : 選択肢ウィンドウのX座標
  21. *       y   : 選択肢ウィンドウのY座標
  22. *       row : 選択肢ウィンドウの行数。未設定の場合はすべて表示
  23. * - 指定接下來要顯示的選項的位置 (x,y) 和行數 (row)。
  24. *
  25. * 〇 ChoiceVariableId varId / 光標位置設置
  26. * varId : 變量號
  27. * - 將下一個顯示選項的默認位置設置為變量的值。
  28. * - 還將當前光標位置放入變量中。
  29. * - 第一個選項的光標位置是從頂部開始的 0-5,下一個選項的光標位置是 10-15,
  30. * 每個選擇 +10。
  31. *
  32. * 〇 ChoiceRect xy width height / 選項大小設置
  33. *       x      : X座標
  34. *       y      : Y座標
  35. * width : 幅
  36. * 身高:身高
  37. * - 指定要顯示的下一個選擇的坐標和大小。
  38. * - 正常值適用於未設置或指定 -1 的項目。
  39. *   
  40. * 〇 ChoiceInMessage/消息中顯示
  41. * - 使下一個選擇顯示在消息窗口中。
  42. * - 此功能只能與顯示文本結合使用。
  43. * - 在 [Display Text] 之前執行。
  44. *
  45. * ▼ 更多選擇
  46. * - 如果您連續放置事件命令“顯示選項”
  47. * 組合成一個選項。
  48. * - 如果您不想將它們全部放在一起,請在它們之間添加一些註釋
  49. * 可以像往常一樣分開。
  50. * - “默認”操作適用於 None 以外的任何內容。
  51. * - “取消”流程將應用於禁止以外的任何事情。
  52. * - 兩者都會覆蓋後面選擇的設置。
  53. * - “背景”和“窗口位置”適用於以下選項的設置。
  54. *
  55. * ▼設置顯示項目的條件
  56. * - 在選擇的文本中
  57. * if(條件)
  58. * 當條件為假時隱藏項目。
  59. * - 如果未顯示“默認”項,則行為是
  60. * 可以通過插件參數中的 [Disabled Index] 進行設置。
  61. * - 如果未顯示“取消”項目,則執行與禁止相同的處理。
  62. * - 您可以在條件中引用帶有 s 的開關和帶有 v 的變量。
  63. * 例子:如果(s[1])
  64. * => 開關 1 打開時顯示,關閉時隱藏。
  65. * 如果(!s[2])
  66. * => 當開關 2 關閉時顯示,當開關 2 打開時隱藏。
  67. * 如果(v[5]>0)
  68. * => 如果變量號 5 大於 0 則顯示,如果小於 0 則隱藏。
  69. *     
  70. * 變量的不等號
  71. * === :等於
  72. * !== :不等於
  73. * < :小於
  74. * <= :小於或等於
  75. * > : 大於
  76. * >= :大於或等於
  77. *
  78. * ▼ 設置條件以半透明顯示項目
  79. * - 在選擇的文本中
  80. * en(條件)
  81. * 當條件變為假時,該項目將顯示為半透明。
  82. * - 無法選擇半透明項目。
  83. * - 條件與上述“要顯示的項目的設置條件”相同。
  84. * - 如果“取消”項目是半透明的,您將無法取消。
  85. *
  86. * ▼ 顯示幫助信息
  87. * - 在每個選擇項下的 [Annotation]
  88. * 選擇幫助
  89. 如果您輸入 *,當您將鼠標懸停在以下文本上作為幫助消息時,
  90. * 可以標記。
  91. * - 幫助消息使用與顯示文本相同的功能,因此
  92. * 允許使用控製字符。 (不允許使用 \! 和 \^)
  93. * - 上面的命令名稱可以在插件參數中更改。
  94. *
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
123
在线时间
46 小时
注册时间
2022-11-23
帖子
13
5
 楼主| 发表于 2022-12-13 19:31:33 | 只看该作者

感谢大佬分享!已解决!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 08:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表