找回密码
 注册用户
查看: 49|回复: 0

[RMMZ] 【汉化】地图图块颜色滤镜

[复制链接]

89

主题

7

回帖

1280

积分

资深会员

积分
1280
发表于 2024-12-31 16:10:07 | 显示全部楼层 |阅读模式
本帖最后由 烁灵 于 2024-12-31 16:11 编辑

原贴:Tile Color Filter - Apply tone, blend color, hue, brightness, and opacity to tiles only (Ver.1.2.4) | RPG Maker Forums (rpgmakerweb.com)


仅变更地图颜色、色调、色相、透明度的滤镜

效果:
QQ截图20241231160716.png


脚本:保存为 TileColorFilter.js
  1. // TileColorFilter.js Ver.1.2.4
  2. // MIT License (C) 2024 あわやまたな
  3. // http://opensource.org/licenses/mit-license.php


  4. /*:
  5. * @target MZ
  6. * @plugindesc 对地图图块进行多种操作,不影响角色.
  7. * 汉化 by 烁灵 更多脚本请访问 www.hknmtt.com
  8. * @author あわやまたな (Awaya_Matana)
  9. * @url https://awaya3ji.seesaa.net/article/505508535.html
  10. * @help Ver.1.2.4
  11. * [地图、图块备注]
  12. * <tileTone:R,G,B,gray> // 图块色调
  13. * RGB:-255 到 255 gray:0 到 255
  14. * <tileBlend:R,G,B,Opacity> // 图块合成颜色
  15. * RGB:0 到 255 Opacity:0 到 255
  16. * <tileHue:hue> // 图块色相
  17. * hue:-360 到 360
  18. * <tileBrightness:brightness> // 图块明度
  19. * brightness:0 到 255
  20. * <tileOpacity:opacity> // 图块透明度
  21. * <tileOpacity:upperOpacity,lowerOpacity> // 上层、下层不同设定
  22. * opacity:0 到 255
  23. *
  24. * [脚本]
  25. * $gameMap.tone() // 获取地图色调
  26. * $gameMap.blendColor() // 获取地图合成颜色
  27. * $gameMap.brightness() // 获取地图明度
  28. * $gameMap.hue() // 获取地图色相
  29. * $gameMap.upperOpacity() // 获取上层透明度
  30. * $gameMap.lowerOpacity() // 获取下层透明度
  31. *
  32. * [特别说明]
  33. * 当你 "更改地图图块" 后, 图块备注将被重置
  34. * 如果你想保持图块备注,请用 “重置滤镜”
  35. *
  36. * @param bgSyncList
  37. * @text 背景同步列表
  38. * @desc 将背景图与下层图块同步的参数
  39. * @type select[]
  40. * @value Tone
  41. * @value BlendColor
  42. * @value Hue
  43. * @value Brightness
  44. * @value Opacity
  45. * @default ["Tone","BlendColor"]
  46. *
  47. * @param fgSyncList
  48. * @text 前景同步列表
  49. * @desc 将前景图与上层图块同步的参数
  50. * @type select[]
  51. * @value Tone
  52. * @value BlendColor
  53. * @value Hue
  54. * @value Brightness
  55. * @value Opacity
  56. * @default ["Tone","BlendColor"]
  57. *
  58. * @param preconvert
  59. * @text 预转换
  60. * @desc 在启动时生成滤镜效果,避免首次加载时的延迟。
  61. * @type boolean
  62. * @default true
  63. *
  64. * @command setColorTone
  65. * @text 更改颜色色调
  66. * @arg tone
  67. * @text 色调
  68. * @desc R,G,B,gray
  69. * RGB:-255 到 255 gray:0 到 255
  70. * @default 0,0,0,0
  71. * @type combo
  72. * @option 0,0,0,0
  73. * @option -68,-68,-68,0  // 黑暗
  74. * @option 34,-34,-68,170 // 墨汁
  75. * @option 68,-34,-34,0   // 日落
  76. * @option -68,-68,0,68   // 夜晚
  77. * @arg duration
  78. * @text 持续时间
  79. * @desc 立即生效则设置为0
  80. * @default 0
  81. * @arg wait
  82. * @text 是否等待完成
  83. * @default false
  84. * @type boolean
  85. *
  86. * @command setBlendColor
  87. * @text 更改合成颜色
  88. * @arg blendColor
  89. * @text 合成颜色
  90. * @desc R,G,B,opacity
  91. * RGB:0 到 255 opacity:0 到 255
  92. * @default 0,0,0,0
  93. * @arg duration
  94. * @text 持续时间
  95. * @desc 立即生效则设置为0
  96. * @default 0
  97. * @arg wait
  98. * @text 是否等待完成
  99. * @default false
  100. * @type boolean
  101. *
  102. * @command setHue
  103. * @text 更改色相
  104. * @arg hue
  105. * @text 色相
  106. * @desc -360 到 360
  107. * @default 0
  108. * @arg duration
  109. * @text 持续时间
  110. * @desc 立即生效则设置为0
  111. * @default 0
  112. * @arg wait
  113. * @text 是否等待完成
  114. * @default false
  115. * @type boolean
  116. *
  117. * @command setBrightness
  118. * @text 更改明度
  119. * @arg brightness
  120. * @text 明度
  121. * @desc 0 到 255
  122. * @default 255
  123. * @arg duration
  124. * @text 持续时间
  125. * @desc 立即生效则设置为0
  126. * @default 0
  127. * @arg wait
  128. * @text 是否等待完成
  129. * @default false
  130. * @type boolean
  131. *
  132. * @command setOpacity
  133. * @text 更改透明度
  134. * @arg layer
  135. * @text 层
  136. * @default All
  137. * @type select
  138. * @value All
  139. * @value Upper
  140. * @value Lower
  141. * @arg opacity
  142. * @text 透明度
  143. * @desc 0 到 255
  144. * @default 255
  145. * @arg duration
  146. * @text 持续时间
  147. * @desc 立即生效则设置为0
  148. * @default 0
  149. * @arg wait
  150. * @text 是否等待完成
  151. * @default false
  152. * @type boolean
  153. *
  154. * @command resetFilter
  155. * @text 重置滤镜
  156. * @arg filter
  157. * @text 种类
  158. * @default All
  159. * @type select
  160. * @option 所有
  161. * @value All
  162. * @option 色调
  163. * @value Tone
  164. * @option 合成颜色
  165. * @value BlendColor
  166. * @option 色相
  167. * @value Hue
  168. * @option 明度
  169. * @value Brightness
  170. * @option 透明度
  171. * @value Opacity
  172. * @arg duration
  173. * @text 持续时间
  174. * @desc 立即生效则设置为0
  175. * @default 0
  176. * @arg wait
  177. * @text 是否等待完成
  178. * @default false
  179. * @type boolean
  180. *
  181. */


  182. /*:ja
  183. * @target MZ
  184. * @plugindesc マップタイルに対して様々な操作を行えます。
  185. * キャラクターには影響しません。
  186. * @author あわやまたな (Awaya_Matana)
  187. * @url https://awaya3ji.seesaa.net/article/505508535.html
  188. * @help [メモ(マップ及びタイルセット)]
  189. * <tileTone:R,G,B,gray> //タイルの色調
  190. * RGB:-255~255 gray:0~255
  191. * <tileBlend:R,G,B,opacity> //タイルの合成色
  192. * RGB:0~255 opacity:0~255
  193. * <tileHue:hue> //タイルの色相
  194. * hue:-360~360
  195. * <tileBrightness:brightness> //タイルの明度
  196. * brightness:0~255
  197. * <tileOpacity:opacity> //タイルの不透明度
  198. * <tileOpacity:upperOpacity,lowerOpacity> //上層、下層の個別指定
  199. * opacity:0~255
  200. *
  201. * [スクリプト]
  202. * $gameMap.tone() //色調の取得
  203. * $gameMap.blendColor() //合成色の取得
  204. * $gameMap.brightness() //明度の取得
  205. * $gameMap.hue() //色相の取得
  206. * $gameMap.upperOpacity() //上層の不透明度の取得
  207. * $gameMap.lowerOpacity() //下層の不透明度の取得
  208. *
  209. * [仕様]
  210. * 「タイルセットの変更」をするとタイルセットのメモが反映されます。
  211. * マップのメモを優先したい場合は直後に「フィルターのリセット」を
  212. * 実行してください。
  213. *
  214. * [更新履歴]
  215. * 2024/11/03:Ver.1.0.0 公開。
  216. * 2024/11/04:Ver.1.1.0 処理を削減しました。
  217. * 2024/11/06:Ver.1.1.1 スペルミスを修正しました。
  218. * 2024/11/06:Ver.1.2.0 タイルセットのメモを追加しました。
  219. * 2024/11/09:Ver.1.2.1 イベントテスト時のエラーを修正。
  220. * 2024/11/25:Ver.1.2.2 FilterControllerMZ併用時の挙動を修正。
  221. * 2024/11/26:Ver.1.2.3 初回操作時のラグを抑制する処理を追加。
  222. * 2024/12/27:Ver.1.2.4 描画の不具合を修正。
  223. *
  224. * @param bgSyncList
  225. * @text 遠景の同期リスト
  226. * @desc 遠景を下層タイルと同期させます。
  227. * @type select[]
  228. * @option 色調
  229. * @value Tone
  230. * @option 合成色
  231. * @value BlendColor
  232. * @option 色相
  233. * @value Hue
  234. * @option 明度
  235. * @value Brightness
  236. * @option 不透明度
  237. * @value Opacity
  238. * @default ["Tone","BlendColor"]
  239. *
  240. * @param fgSyncList
  241. * @text 近景の同期リスト
  242. * @desc 近景を上層タイルと同期させます。
  243. * @type select[]
  244. * @option 色調
  245. * @value Tone
  246. * @option 合成色
  247. * @value BlendColor
  248. * @option 色相
  249. * @value Hue
  250. * @option 明度
  251. * @value Brightness
  252. * @option 不透明度
  253. * @value Opacity
  254. * @default ["Tone","BlendColor"]
  255. *
  256. * @param preconvert
  257. * @text 事前変換
  258. * @desc ブート時にフィルターを生成して、初回のラグを防ぎます。
  259. * @type boolean
  260. * @default true
  261. *
  262. * @command setColorTone
  263. * @text 色調の変更
  264. * @arg tone
  265. * @text 色調
  266. * @desc R,G,B,グレー
  267. * RGB:-255~255 グレー:0~255
  268. * @default 0,0,0,0
  269. * @type combo
  270. * @option 0,0,0,0
  271. * @option -68,-68,-68,0  //ダーク
  272. * @option 34,-34,-68,170 //セピア
  273. * @option 68,-34,-34,0   //夕暮れ
  274. * @option -68,-68,0,68   //夜
  275. * @arg duration
  276. * @text 時間
  277. * @desc 0で瞬間適用
  278. * @default 0
  279. * @arg wait
  280. * @text 完了までウェイト
  281. * @default false
  282. * @type boolean
  283. *
  284. * @command setBlendColor
  285. * @text 色の合成
  286. * @arg blendColor
  287. * @text 合成色
  288. * @desc R,G,B,不透明度
  289. * RGB:0~255 不透明度:0~255
  290. * @default 0,0,0,0
  291. * @arg duration
  292. * @text 時間
  293. * @desc 0で瞬間適用
  294. * @default 0
  295. * @arg wait
  296. * @text 完了までウェイト
  297. * @default false
  298. * @type boolean
  299. *
  300. * @command setHue
  301. * @text 色相の変更
  302. * @arg hue
  303. * @text 色相
  304. * @desc -360~360
  305. * @default 0
  306. * @arg duration
  307. * @text 時間
  308. * @desc 0で瞬間適用
  309. * @default 0
  310. * @arg wait
  311. * @text 完了までウェイト
  312. * @default false
  313. * @type boolean
  314. *
  315. * @command setBrightness
  316. * @text 明度の変更
  317. * @arg brightness
  318. * @text 明度
  319. * @desc 0~255
  320. * @default 255
  321. * @arg duration
  322. * @text 時間
  323. * @desc 0で瞬間適用
  324. * @default 0
  325. * @arg wait
  326. * @text 完了までウェイト
  327. * @default false
  328. * @type boolean
  329. *
  330. * @command setOpacity
  331. * @text 不透明度の変更
  332. * @arg layer
  333. * @text レイヤー
  334. * @default All
  335. * @type select
  336. * @option 全て
  337. * @value All
  338. * @option 上層
  339. * @value Upper
  340. * @option 下層
  341. * @value Lower
  342. * @arg opacity
  343. * @text 不透明度
  344. * @desc 0~255
  345. * @default 255
  346. * @arg duration
  347. * @text 時間
  348. * @desc 0で瞬間適用
  349. * @default 0
  350. * @arg wait
  351. * @text 完了までウェイト
  352. * @default false
  353. * @type boolean
  354. *
  355. * @command resetFilter
  356. * @text フィルターのリセット
  357. * @arg filter
  358. * @text フィルター
  359. * @default All
  360. * @type select
  361. * @option 全て
  362. * @value All
  363. * @option 色調
  364. * @value Tone
  365. * @option 合成色
  366. * @value BlendColor
  367. * @option 色相
  368. * @value Hue
  369. * @option 明度
  370. * @value Brightness
  371. * @option 不透明度
  372. * @value Opacity
  373. * @arg duration
  374. * @text 時間
  375. * @desc 0で瞬間適用
  376. * @default 0
  377. * @arg wait
  378. * @text 完了までウェイト
  379. * @default false
  380. * @type boolean
  381. *
  382. */


  383. 'use strict';
  384. {
  385.         //プラグイン名取得。
  386.         const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
  387.         const parameters = PluginManager.parameters(pluginName);
  388.         const _PluginManager = window.PluginManagerEx ?? PluginManager;
  389.         const script = window.PluginManagerEx ? document.currentScript : pluginName;
  390.         const bgSyncMethods = createMethods(parameters.bgSyncList);
  391.         const fgSyncMethods = createMethods(parameters.fgSyncList, true);
  392.         const preconvert = parameters.preconvert !== "false";
  393.         function createMethods(list, upper) {
  394.                 const methods = [];
  395.                 for (const name of JSON.parse(list || "[]")) {
  396.                         switch (name) {
  397.                         case "Tone":
  398.                                 methods.push(["setColorTone", "tone"]);
  399.                                 break;
  400.                         case "BlendColor":
  401.                                 methods.push(["setBlendColor", "blendColor"]);
  402.                                 break;
  403.                         case "Hue":
  404.                                 methods.push(["setHue", "hue"]);
  405.                                 break;
  406.                         case "Brightness":
  407.                                 methods.push(["setBrightness", "brightness"]);
  408.                                 break;
  409.                         case "Opacity":
  410.                                 methods.push(["setOpacity", (upper ? "upperOpacity" : "lowerOpacity")]);
  411.                                 break;
  412.                         }
  413.                 }
  414.                 return methods;
  415.         }


  416.         const _layers = ["Layer"];
  417.         const hasFilterControllerMZ = PluginManager._scripts.contains("FilterControllerMZ");
  418.         const hasBillboard = ["TF_LayeredMap", "TF_Billboard"].some(name => PluginManager._scripts.contains(name));
  419.         if (Utils.checkRMVersion("1.7.0")) {
  420.                 _layers.push("CombinedLayer");
  421.         }


  422.         //-----------------------------------------------------------------------------
  423.         // PluginManager


  424.         _PluginManager.registerCommand(script, "setColorTone", function(args) {
  425.                 const d = +args.duration;
  426.                 $gameMap.setTone(args.tone.split(",").map(n=>parseInt(n)), d);
  427.                 if (d && String(args.wait) === "true") {
  428.                         this.wait(d);
  429.                 }
  430.         });


  431.         _PluginManager.registerCommand(script, "setBlendColor", function(args) {
  432.                 const d = +args.duration;
  433.                 $gameMap.setBlendColor(args.blendColor.split(",").map(Number), d);
  434.                 if (d && String(args.wait) === "true") {
  435.                         this.wait(d);
  436.                 }
  437.         });


  438.         _PluginManager.registerCommand(script, "setHue", function(args) {
  439.                 const d = +args.duration;
  440.                 $gameMap.setHue(+args.hue, d);
  441.                 if (d && String(args.wait) === "true") {
  442.                         this.wait(d);
  443.                 }
  444.         });


  445.         _PluginManager.registerCommand(script, "setBrightness", function(args) {
  446.                 const d = +args.duration;
  447.                 $gameMap.setBrightness(+args.brightness, d);
  448.                 if (d && String(args.wait) === "true") {
  449.                         this.wait(d);
  450.                 }
  451.         });


  452.         _PluginManager.registerCommand(script, "setOpacity", function(args) {
  453.                 const opacity = +args.opacity;
  454.                 const d = +args.duration;
  455.                 switch (args.layer){
  456.                 case "Upper":
  457.                         $gameMap.setUpperOpacity(opacity, d);
  458.                         break;
  459.                 case "Lower":
  460.                         $gameMap.setLowerOpacity(opacity, d);
  461.                         break;
  462.                 default:
  463.                         $gameMap.setUpperOpacity(opacity, d);
  464.                         $gameMap.setLowerOpacity(opacity, d);
  465.                         break;
  466.                 }
  467.                 if (d && String(args.wait) === "true") {
  468.                         this.wait(d);
  469.                 }
  470.         });


  471.         _PluginManager.registerCommand(script, "resetFilter", function(args) {
  472.                 const d = +args.duration;
  473.                 switch (args.filter){
  474.                 case "All":
  475.                         $gameMap.resetTone(d);
  476.                         $gameMap.resetBlendColor(d);
  477.                         $gameMap.resetHue(d);
  478.                         $gameMap.resetBrightness(d);
  479.                         $gameMap.resetOpacity(d);
  480.                         break;
  481.                 default:
  482.                         $gameMap["reset" + args.filter](d);
  483.                         break;
  484.                 }
  485.                 if (d && String(args.wait) === "true") {
  486.                         this.wait(d);
  487.                 }
  488.         });


  489.         //-----------------------------------------------------------------------------
  490.         // Game_Map


  491.         const _Game_Map_initialize = Game_Map.prototype.initialize;
  492.         Game_Map.prototype.initialize = function() {
  493.                 _Game_Map_initialize.call(this);
  494.                 this.clearTone();
  495.                 this.clearBlendColor();
  496.                 this.clearHue();
  497.                 this.clearBrightness();
  498.                 this.clearUpperOpacity();
  499.                 this.clearLowerOpacity();
  500.         };


  501.         const _Game_Map_setup = Game_Map.prototype.setup;
  502.         Game_Map.prototype.setup = function(mapId) {
  503.                 _Game_Map_setup.call(this, mapId);
  504.                 this.setupTone();
  505.                 this.setupBlendColor();
  506.                 this.setupHue();
  507.                 this.setupBrightness();
  508.                 this.setupOpacity();
  509.         };


  510.         Game_Map.prototype.tone = function() {
  511.                 return this._tone;
  512.         };


  513.         Game_Map.prototype.blendColor = function() {
  514.                 return this._blendColor;
  515.         };


  516.         Game_Map.prototype.hue = function() {
  517.                 return this._hue;
  518.         };


  519.         Game_Map.prototype.brightness = function() {
  520.                 return this._brightness;
  521.         };


  522.         Game_Map.prototype.upperOpacity = function() {
  523.                 return this._upperOpacity;
  524.         };


  525.         Game_Map.prototype.lowerOpacity = function() {
  526.                 return this._lowerOpacity;
  527.         };


  528.         Game_Map.prototype.clearTone = function() {
  529.                 this._tone = [0, 0, 0, 0];
  530.                 this._toneTarget = [0, 0, 0, 0];
  531.                 this._toneDuration = 0;
  532.         };


  533.         Game_Map.prototype.clearBlendColor = function() {
  534.                 this._blendColor = [0, 0, 0, 0];
  535.                 this._blendTarget = [0, 0, 0, 0];
  536.                 this._blendDuration = 0;
  537.         };


  538.         Game_Map.prototype.clearHue = function() {
  539.                 this._hue = 0;
  540.                 this._hueTarget = 0;
  541.                 this._hueDuration = 0;
  542.         };


  543.         Game_Map.prototype.clearBrightness = function() {
  544.                 this._brightness = 255;
  545.                 this._brightnessTarget = 0;
  546.                 this._brightnessDuration = 0;
  547.         };


  548.         Game_Map.prototype.clearUpperOpacity = function() {
  549.                 this._upperOpacity = 255;
  550.                 this._upperOpacityTarget = 0;
  551.                 this._upperOpacityDuration = 0;
  552.         };


  553.         Game_Map.prototype.clearLowerOpacity = function() {
  554.                 this._lowerOpacity = 255;
  555.                 this._lowerOpacityTarget = 0;
  556.                 this._lowerOpacityDuration = 0;
  557.         };


  558.         function getMeta(name, _this) {
  559.                 const tileset = _this.tileset();
  560.                 return ($dataMap.meta && $dataMap.meta[name]) || (tileset && tileset.meta && tileset.meta[name]);
  561.         };


  562.         Game_Map.prototype.setupTone = function() {
  563.                 this.clearTone();
  564.                 const meta = getMeta("tileTone", this);
  565.                 if (meta) {
  566.                         const tone = meta.split(",").map(Number);
  567.                         this.setTone(tone);
  568.                 }
  569.         };


  570.         Game_Map.prototype.setupBlendColor = function() {
  571.                 this.clearBlendColor();
  572.                 const meta = getMeta("tileBlend", this);
  573.                 if (meta) {
  574.                         const blendColor = meta.split(",").map(Number);
  575.                         this.setBlendColor(blendColor);
  576.                 }
  577.         };


  578.         Game_Map.prototype.setupHue = function() {
  579.                 this.clearHue();
  580.                 const meta = getMeta("tileHue", this);
  581.                 if (meta) {
  582.                         const hue = Number(meta || 0);
  583.                         this.setHue(hue);
  584.                 }
  585.         };


  586.         Game_Map.prototype.setupBrightness = function() {
  587.                 this.clearBrightness();
  588.                 const meta = getMeta("tileBrightness", this);
  589.                 if (meta) {
  590.                         const brightness = Number(meta || 0);
  591.                         this.setBrightness(brightness);
  592.                 }
  593.         };


  594.         Game_Map.prototype.setupOpacity = function() {
  595.                 this.clearUpperOpacity();
  596.                 this.clearLowerOpacity();
  597.                 const meta = getMeta("tileOpacity", this);
  598.                 if (meta) {
  599.                         const opacity = meta.split(",").map(Number);
  600.                         this.setUpperOpacity(opacity[0]);
  601.                         this.setLowerOpacity(opacity[1] ?? opacity[0]);
  602.                 }
  603.         };


  604.         Game_Map.prototype.setTone = function(tone, duration) {
  605.                 this._toneTarget = tone.clone();
  606.                 this._toneDuration = duration;
  607.                 if (!duration) {
  608.                         this._tone = this._toneTarget.clone();
  609.                 }
  610.         };


  611.         Game_Map.prototype.setBlendColor = function(color, duration) {
  612.                 this._blendTarget = color.clone();
  613.                 this._blendDuration = duration;
  614.                 if (!duration) {
  615.                         this._blendColor = this._blendTarget.clone();
  616.                 }
  617.         };


  618.         Game_Map.prototype.setHue = function(hue, duration) {
  619.                 this._hueTarget = hue;
  620.                 this._hueDuration = duration;
  621.                 if (!duration) {
  622.                         this._hue = this._hueTarget;
  623.                 }
  624.         };


  625.         Game_Map.prototype.setBrightness = function(brightness, duration) {
  626.                 this._brightnessTarget = brightness;
  627.                 this._brightnessDuration = duration;
  628.                 if (!duration) {
  629.                         this._brightness = this._brightnessTarget;
  630.                 }
  631.         };


  632.         Game_Map.prototype.setUpperOpacity = function(opacity, duration) {
  633.                 this._upperOpacityTarget = opacity;
  634.                 this._upperOpacityDuration = duration;
  635.                 if (!duration) {
  636.                         this._upperOpacity = this._upperOpacityTarget;
  637.                 }
  638.         };


  639.         Game_Map.prototype.setLowerOpacity = function(opacity, duration) {
  640.                 this._lowerOpacityTarget = opacity;
  641.                 this._lowerOpacityDuration = duration;
  642.                 if (!duration) {
  643.                         this._lowerOpacity = this._lowerOpacityTarget;
  644.                 }
  645.         };


  646.         Game_Map.prototype.resetTone = function(duration) {
  647.                 const tone = this.tone();
  648.                 this.setupTone();
  649.                 const toneTarget = this.tone();
  650.                 this.setTone(tone);
  651.                 this.setTone(toneTarget, duration);
  652.         };


  653.         Game_Map.prototype.resetBlendColor = function(duration) {
  654.                 const color = this.blendColor();
  655.                 this.setupBlendColor();
  656.                 const colorTarget = this.blendColor();
  657.                 this.setBlendColor(color);
  658.                 this.setBlendColor(colorTarget, duration);
  659.         };


  660.         Game_Map.prototype.resetHue = function(duration) {
  661.                 const hue = this.hue();
  662.                 this.setupHue();
  663.                 const hueTarget = this.hue();
  664.                 this.setHue(hue);
  665.                 this.setHue(hueTarget, duration);
  666.         };


  667.         Game_Map.prototype.resetBrightness = function(duration) {
  668.                 const brightness = this.brightness();
  669.                 this.setupBrightness();
  670.                 const brightnessTarget = this.brightness();
  671.                 this.setBrightness(brightness);
  672.                 this.setBrightness(brightnessTarget, duration);
  673.         };


  674.         Game_Map.prototype.resetOpacity = function(duration) {
  675.                 const upperOpacity = this.upperOpacity();
  676.                 const lowerOpacity = this.lowerOpacity();
  677.                 this.setupOpacity();
  678.                 const upperTarget = this.upperOpacity();
  679.                 const lowerTarget = this.lowerOpacity();
  680.                 this.setUpperOpacity(upperOpacity);
  681.                 this.setLowerOpacity(lowerOpacity);
  682.                 this.setUpperOpacity(upperTarget, duration);
  683.                 this.setLowerOpacity(lowerTarget, duration);
  684.         };


  685.         Game_Map.prototype.updateTone = function() {
  686.                 if (this._toneDuration > 0) {
  687.                         const d = this._toneDuration;
  688.                         for (let i = 0; i < 4; i++) {
  689.                                 this._tone[i] = (this._tone[i] * (d - 1) + this._toneTarget[i]) / d;
  690.                         }
  691.                         this._toneDuration--;
  692.                 }
  693.         };


  694.         Game_Map.prototype.updateBlendColor = function() {
  695.                 if (this._blendDuration > 0) {
  696.                         const d = this._blendDuration;
  697.                         for (let i = 0; i < 4; i++) {
  698.                                 this._blendColor[i] = (this._blendColor[i] * (d - 1) + this._blendTarget[i]) / d;
  699.                         }
  700.                         this._blendDuration--;
  701.                 }
  702.         };


  703.         Game_Map.prototype.updateHue = function() {
  704.                 if (this._hueDuration > 0) {
  705.                         const d = this._hueDuration;
  706.                         this._hue = (this._hue * (d - 1) + this._hueTarget) / d;
  707.                         this._hueDuration--;
  708.                 }
  709.         };


  710.         Game_Map.prototype.updateBrightness = function() {
  711.                 if (this._brightnessDuration > 0) {
  712.                         const d = this._brightnessDuration;
  713.                         this._brightness = (this._brightness * (d - 1) + this._brightnessTarget) / d;
  714.                         this._brightnessDuration--;
  715.                 }
  716.         };


  717.         Game_Map.prototype.updateOpacity = function() {
  718.                 if (this._upperOpacityDuration > 0) {
  719.                         const d = this._upperOpacityDuration;
  720.                         this._upperOpacity = (this._upperOpacity * (d - 1) + this._upperOpacityTarget) / d;
  721.                         this._upperOpacityDuration--;
  722.                 }
  723.                 if (this._lowerOpacityDuration > 0) {
  724.                         const d = this._lowerOpacityDuration;
  725.                         this._lowerOpacity = (this._lowerOpacity * (d - 1) + this._lowerOpacityTarget) / d;
  726.                         this._lowerOpacityDuration--;
  727.                 }
  728.         };


  729.         const _Game_Map_update = Game_Map.prototype.update;
  730.         Game_Map.prototype.update = function(sceneActive) {
  731.                 _Game_Map_update.call(this, sceneActive);
  732.                 this.updateTone();
  733.                 this.updateBlendColor();
  734.                 this.updateHue();
  735.                 this.updateBrightness();
  736.                 this.updateOpacity();
  737.         };


  738.         const _Game_Map_changeTileset = Game_Map.prototype.changeTileset;
  739.         Game_Map.prototype.changeTileset = function(tilesetId) {
  740.                 _Game_Map_changeTileset.call(this, tilesetId);
  741.                 const tileset = this.tileset();
  742.                 const meta = tileset && tileset.meta;
  743.                 if (!meta) return;
  744.                 if (meta.tileTone) {
  745.                         const tone = meta.tileTone.split(",").map(Number);
  746.                         this.setTone(tone);
  747.                 }
  748.                 if (meta.tileBlend) {
  749.                         const blendColor = meta.tileBlend.split(",").map(Number);
  750.                         this.setBlendColor(blendColor);
  751.                 }
  752.                 if (meta.tileHue) {
  753.                         const hue = Number(meta.tileHue || 0);
  754.                         this.setHue(hue);
  755.                 }
  756.                 if (meta.tileBrightness) {
  757.                         const brightness = Number(meta.tileBrightness || 0);
  758.                         this.setBrightness(brightness);
  759.                 }
  760.                 if (meta.tileOpacity) {
  761.                         const opacity = meta.tileOpacity.split(",").map(Number);
  762.                         this.setUpperOpacity(opacity[0]);
  763.                         this.setLowerOpacity(opacity[1] ?? opacity[0]);
  764.                 }
  765.         };




  766.         //-----------------------------------------------------------------------------
  767.         // Spriteset_Map


  768.         const _Spriteset_Map_updateTilemap = Spriteset_Map.prototype.updateTilemap;
  769.         Spriteset_Map.prototype.updateTilemap = function() {
  770.                 _Spriteset_Map_updateTilemap.call(this);
  771.                 const upperLayer = this._tilemap._upperLayer;
  772.                 const lowerLayer = this._tilemap._lowerLayer;
  773.                 upperLayer.setColorTone($gameMap.tone());
  774.                 lowerLayer.setColorTone($gameMap.tone());
  775.                 upperLayer.setBlendColor($gameMap.blendColor());
  776.                 lowerLayer.setBlendColor($gameMap.blendColor());
  777.                 upperLayer.setHue($gameMap.hue());
  778.                 lowerLayer.setHue($gameMap.hue());
  779.                 upperLayer.setBrightness($gameMap.brightness());
  780.                 lowerLayer.setBrightness($gameMap.brightness());
  781.                 upperLayer.setOpacity($gameMap.upperOpacity());
  782.                 lowerLayer.setOpacity($gameMap.lowerOpacity());
  783.         };


  784.         if (hasBillboard) {
  785.                 const _Spriteset_Map_updateTilemap = Spriteset_Map.prototype.updateTilemap;
  786.                 Spriteset_Map.prototype.updateTilemap = function() {
  787.                         _Spriteset_Map_updateTilemap.call(this);
  788.                         for (const billboard of this._tilemap._billboards) {
  789.                                 billboard.setColorTone($gameMap.tone());
  790.                                 billboard.setBlendColor($gameMap.blendColor());
  791.                                 billboard.setHue($gameMap.hue());
  792.                                 billboard.setBrightness($gameMap.brightness());
  793.                                 billboard.setOpacity($gameMap.upperOpacity());
  794.                         }
  795.                 };
  796.         }


  797.         if (bgSyncMethods.length) {
  798.                 const _Spriteset_Map_updateParallax = Spriteset_Map.prototype.updateParallax;
  799.                 Spriteset_Map.prototype.updateParallax = function() {
  800.                         _Spriteset_Map_updateParallax.call(this);
  801.                         if (this._parallax.bitmap) {
  802.                                 for (const methods of bgSyncMethods) {
  803.                                         this._parallax[methods[0]]($gameMap[methods[1]]());
  804.                                 }
  805.                         }
  806.                 };
  807.         }


  808.         if (Spriteset_Map.prototype.updateForeground && fgSyncMethods.length) {
  809.                 const _Spriteset_Map_updateForeground = Spriteset_Map.prototype.updateForeground;
  810.                 Spriteset_Map.prototype.updateForeground = function() {
  811.                         _Spriteset_Map_updateForeground.apply(this, arguments);
  812.                         if (this._foreground.bitmap) {
  813.                                 for (const methods of fgSyncMethods) {
  814.                                         this._foreground[methods[0]]($gameMap[methods[1]]());
  815.                                 }
  816.                         }
  817.                 };
  818.         }


  819.         //-----------------------------------------------------------------------------
  820.         // Sprite_Character


  821.         const _Sprite_Character_updateOther = Sprite_Character.prototype.updateOther;
  822.         Sprite_Character.prototype.updateOther = function() {
  823.                 _Sprite_Character_updateOther.call(this);
  824.                 if (this._tileId > 0) {
  825.                         this.setHue($gameMap.hue());
  826.                 } else {
  827.                         this.setHue(0);
  828.                 }
  829.         };


  830.         //-----------------------------------------------------------------------------
  831.         // Tilemap.(Combined)Layer


  832.         for (const Layer of _layers) {
  833.                 const _Tilemap_Layer_initialize = Tilemap[Layer].prototype.initialize;
  834.                 Tilemap[Layer].prototype.initialize = function() {
  835.                         _Tilemap_Layer_initialize.apply(this, arguments);
  836.                         this._opacity = 255;
  837.                         this._hue = 0;
  838.                         this._brightness = 255;
  839.                         this._blendColor = [0, 0, 0, 0];
  840.                         this._colorTone = [0, 0, 0, 0];
  841.                         this._alphaFilter = null;
  842.                         this._colorFilter = null;
  843.                 };


  844.                 Tilemap[Layer].prototype.setOpacity = function(opacity) {
  845.                         if (this._opacity !== Number(opacity)) {
  846.                                 this._opacity = Number(opacity);
  847.                                 this._updateColorFilter();
  848.                         }
  849.                 };


  850.                 Tilemap[Layer].prototype.setHue = function(hue) {
  851.                         if (this._hue !== Number(hue)) {
  852.                                 this._hue = Number(hue);
  853.                                 this._updateColorFilter();
  854.                         }
  855.                 };


  856.                 Tilemap[Layer].prototype.setBrightness = function(brightness) {
  857.                         if (this._brightness !== Number(brightness)) {
  858.                                 this._brightness = Number(brightness);
  859.                                 this._updateColorFilter();
  860.                         }
  861.                 };


  862.                 Tilemap[Layer].prototype.getBlendColor = function() {
  863.                         return this._blendColor.clone();
  864.                 };


  865.                 Tilemap[Layer].prototype.setBlendColor = function(color) {
  866.                         if (!(color instanceof Array)) {
  867.                                 throw new Error("Argument must be an array");
  868.                         }
  869.                         if (!this._blendColor.equals(color)) {
  870.                                 this._blendColor = color.clone();
  871.                                 this._updateColorFilter();
  872.                         }
  873.                 };


  874.                 Tilemap[Layer].prototype.getColorTone = function() {
  875.                         return this._colorTone.clone();
  876.                 };


  877.                 Tilemap[Layer].prototype.setColorTone = function(tone) {
  878.                         if (!(tone instanceof Array)) {
  879.                                 throw new Error("Argument must be an array");
  880.                         }
  881.                         if (!this._colorTone.equals(tone)) {
  882.                                 this._colorTone = tone.clone();
  883.                                 this._updateColorFilter();
  884.                         }
  885.                 };


  886.                 Tilemap[Layer].prototype._createColorFilter = function() {
  887.                         this._colorFilter = new TileColorFilter();
  888.                         if (!this.filters) {
  889.                                 this.filters = [];
  890.                         }
  891.                         this.filters.push(this._colorFilter);
  892.                         if (!this.filterArea) {
  893.                                 this.filterArea = new Rectangle(0, 0, Graphics.width, Graphics.height);
  894.                         }
  895.                 };


  896.                 Tilemap[Layer].prototype._updateColorFilter = function() {
  897.                         if (!this._colorFilter) {
  898.                                 this._createColorFilter();
  899.                         }
  900.                         this._colorFilter.setOpacity(this._opacity);
  901.                         this._colorFilter.setHue(this._hue);
  902.                         this._colorFilter.setBrightness(this._brightness);
  903.                         this._colorFilter.setBlendColor(this._blendColor);
  904.                         this._colorFilter.setColorTone(this._colorTone);
  905.                         this._colorFilter.enabled = this._opacity < 255 || this._hue > 0 || this._brightness < 255 || !this._blendColor.equals([0,0,0,0]) || !this._colorTone.equals([0,0,0,0]);
  906.                 };
  907.         }


  908.         if (!hasFilterControllerMZ && Tilemap.Layer.prototype._render === PIXI.Container.prototype._render) {
  909.                 Tilemap.Layer.prototype._render = Tilemap.Layer.prototype.render;
  910.                 Tilemap.Layer.prototype.render = PIXI.Container.prototype.render;
  911.         }


  912.         //-----------------------------------------------------------------------------
  913.         // TileColorFilter


  914.         function TileColorFilter() {
  915.                 this.initialize(...arguments);
  916.         }


  917.         TileColorFilter.prototype = Object.create(ColorFilter.prototype);
  918.         TileColorFilter.prototype.constructor = TileColorFilter;


  919.         TileColorFilter.prototype.initialize = function() {
  920.                 ColorFilter.prototype.initialize.call(this);
  921.                 this.uniforms.opacity = 255;
  922.         };


  923.         TileColorFilter.prototype.setOpacity = function(opacity) {
  924.                 this.uniforms.opacity = Number(opacity);
  925.         };


  926.         TileColorFilter.prototype._fragmentSrc = function() {
  927.                 return `varying vec2 vTextureCoord;
  928.                 uniform sampler2D uSampler;
  929.                 uniform float hue;
  930.                 uniform vec4 colorTone;
  931.                 uniform vec4 blendColor;
  932.                 uniform float brightness;
  933.                 uniform float opacity;
  934.                 vec3 rgbToHsl(vec3 rgb) {
  935.                         float r = rgb.r;
  936.                         float g = rgb.g;
  937.                         float b = rgb.b;
  938.                         float cmin = min(r, min(g, b));
  939.                         float cmax = max(r, max(g, b));
  940.                         float h = 0.0;
  941.                         float s = 0.0;
  942.                         float l = (cmin + cmax) / 2.0;
  943.                         float delta = cmax - cmin;
  944.                         if (delta > 0.0) {
  945.                                 if (r == cmax) {
  946.                                         h = mod((g - b) / delta + 6.0, 6.0) / 6.0;
  947.                                 } else if (g == cmax) {
  948.                                         h = ((b - r) / delta + 2.0) / 6.0;
  949.                                 } else {
  950.                                         h = ((r - g) / delta + 4.0) / 6.0;
  951.                                 }
  952.                                 if (l < 1.0) {
  953.                                         s = delta / (1.0 - abs(2.0 * l - 1.0));
  954.                                 }
  955.                         }
  956.                         return vec3(h, s, l);
  957.                 }
  958.                 vec3 hslToRgb(vec3 hsl) {
  959.                         float h = hsl.x;
  960.                         float s = hsl.y;
  961.                         float l = hsl.z;
  962.                         float c = (1.0 - abs(2.0 * l - 1.0)) * s;
  963.                         float x = c * (1.0 - abs((mod(h * 6.0, 2.0)) - 1.0));
  964.                         float m = l - c / 2.0;
  965.                         float cm = c + m;
  966.                         float xm = x + m;
  967.                         if (h < 1.0 / 6.0) {
  968.                                 return vec3(cm, xm, m);
  969.                         } else if (h < 2.0 / 6.0) {
  970.                                 return vec3(xm, cm, m);
  971.                         } else if (h < 3.0 / 6.0) {
  972.                                 return vec3(m, cm, xm);
  973.                         } else if (h < 4.0 / 6.0) {
  974.                                 return vec3(m, xm, cm);
  975.                         } else if (h < 5.0 / 6.0) {
  976.                                 return vec3(xm, m, cm);
  977.                         } else {
  978.                                 return vec3(cm, m, xm);
  979.                         }
  980.                 }
  981.                 void main() {
  982.                         vec4 sample = texture2D(uSampler, vTextureCoord) * opacity / 255.0;
  983.                         float a = sample.a;
  984.                         vec3 hsl = rgbToHsl(sample.rgb);
  985.                         hsl.x = mod(hsl.x + hue / 360.0, 1.0);
  986.                         hsl.y = hsl.y * (1.0 - colorTone.a / 255.0);
  987.                         vec3 rgb = hslToRgb(hsl);
  988.                         float r = rgb.r;
  989.                         float g = rgb.g;
  990.                         float b = rgb.b;
  991.                         float r2 = colorTone.r / 255.0;
  992.                         float g2 = colorTone.g / 255.0;
  993.                         float b2 = colorTone.b / 255.0;
  994.                         float r3 = blendColor.r / 255.0;
  995.                         float g3 = blendColor.g / 255.0;
  996.                         float b3 = blendColor.b / 255.0;
  997.                         float i3 = blendColor.a / 255.0;
  998.                         float i1 = 1.0 - i3;
  999.                         r = clamp((r / a + r2) * a, 0.0, 1.0);
  1000.                         g = clamp((g / a + g2) * a, 0.0, 1.0);
  1001.                         b = clamp((b / a + b2) * a, 0.0, 1.0);
  1002.                         r = clamp(r * i1 + r3 * i3 * a, 0.0, 1.0);
  1003.                         g = clamp(g * i1 + g3 * i3 * a, 0.0, 1.0);
  1004.                         b = clamp(b * i1 + b3 * i3 * a, 0.0, 1.0);
  1005.                         r = r * brightness / 255.0;
  1006.                         g = g * brightness / 255.0;
  1007.                         b = b * brightness / 255.0;
  1008.                         gl_FragColor = vec4(r, g, b, a);
  1009.                 }`;
  1010.         };


  1011.         //-----------------------------------------------------------------------------
  1012.         // TilingSprite


  1013.         if (bgSyncMethods.length) {
  1014.                 const _TilingSprite_initialize = TilingSprite.prototype.initialize;
  1015.                 TilingSprite.prototype.initialize = function(bitmap) {
  1016.                         _TilingSprite_initialize.apply(this, arguments);
  1017.                         this._hue = 0;
  1018.                         this._brightness = 255;
  1019.                         this._blendColor = [0, 0, 0, 0];
  1020.                         this._colorTone = [0, 0, 0, 0];
  1021.                         this._colorFilter = null;
  1022.                 };


  1023.                 TilingSprite.prototype.setHue = function(hue) {
  1024.                         if (this._hue !== Number(hue)) {
  1025.                                 this._hue = Number(hue);
  1026.                                 this._updateColorFilter();
  1027.                         }
  1028.                 };


  1029.                 TilingSprite.prototype.setBrightness = function(brightness) {
  1030.                         if (this._brightness !== Number(brightness)) {
  1031.                                 this._brightness = Number(brightness);
  1032.                                 this._updateColorFilter();
  1033.                         }
  1034.                 };


  1035.                 TilingSprite.prototype.setOpacity = function(opacity) {
  1036.                         this.opacity = opacity;
  1037.                 };


  1038.                 TilingSprite.prototype.getBlendColor = function() {
  1039.                         return this._blendColor.clone();
  1040.                 };


  1041.                 TilingSprite.prototype.setBlendColor = function(color) {
  1042.                         if (!(color instanceof Array)) {
  1043.                                 throw new Error("Argument must be an array");
  1044.                         }
  1045.                         if (!this._blendColor.equals(color)) {
  1046.                                 this._blendColor = color.clone();
  1047.                                 this._updateColorFilter();
  1048.                         }
  1049.                 };


  1050.                 TilingSprite.prototype.getColorTone = function() {
  1051.                         return this._colorTone.clone();
  1052.                 };


  1053.                 TilingSprite.prototype.setColorTone = function(tone) {
  1054.                         if (!(tone instanceof Array)) {
  1055.                                 throw new Error("Argument must be an array");
  1056.                         }
  1057.                         if (!this._colorTone.equals(tone)) {
  1058.                                 this._colorTone = tone.clone();
  1059.                                 this._updateColorFilter();
  1060.                         }
  1061.                 };


  1062.                 TilingSprite.prototype._createColorFilter = function() {
  1063.                         this._colorFilter = new ColorFilter();
  1064.                         if (!this.filters) {
  1065.                                 this.filters = [];
  1066.                         }
  1067.                         this.filters.push(this._colorFilter);
  1068.                 };


  1069.                 TilingSprite.prototype._updateColorFilter = function() {
  1070.                         if (!this._colorFilter) {
  1071.                                 this._createColorFilter();
  1072.                         }
  1073.                         this._colorFilter.setHue(this._hue);
  1074.                         this._colorFilter.setBrightness(this._brightness);
  1075.                         this._colorFilter.setBlendColor(this._blendColor);
  1076.                         this._colorFilter.setColorTone(this._colorTone);
  1077.                         this._colorFilter.enabled = this._hue > 0 || this._brightness < 255 || !this._blendColor.equals([0,0,0,0]) || !this._colorTone.equals([0,0,0,0]);
  1078.                 };
  1079.         }


  1080.         //-----------------------------------------------------------------------------
  1081.         // Scene_Boot
  1082.         //事前に変換して初回時を軽量化
  1083.         if (preconvert && !DataManager.isBattleTest()) {
  1084.                 const _Scene_Boot_create = Scene_Boot.prototype.create;
  1085.                 Scene_Boot.prototype.create = function() {
  1086.                         _Scene_Boot_create.apply(this, arguments);
  1087.                         const sprite = new Sprite();
  1088.                         const filter = new TileColorFilter();
  1089.                         sprite.filters = [filter];
  1090.                         this.addChild(sprite);
  1091.                 };
  1092.         }
  1093. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册用户

本版积分规则

Archiver|QQ群: 48625831|爱上RPG|哈库纳玛塔塔 |网站地图 Clicky

GMT+8, 2025-1-18 09:47 , Processed in 0.058584 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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