alter-egoism/js/plugins/MPP_MapLight_Op2.js
2025-11-01 14:17:42 -05:00

376 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// MPP_MapLight_Op2.js
//=============================================================================
// Copyright (c) 2021 - 2024 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @target MV MZ
* @plugindesc The brightness of the tile changes depending on the region.
* @author Mokusei Penguin
* @url
*
* @base MPP_MapLight
* @orderAfter MPP_MapLight
*
* @help [version 1.2.1]
* - This plugin is for RPG Maker MV and MZ.
*
* ▼ Plugin command
* MV / MZ
*
* ChangeRegionLights boolean / changeRegionLights
* boolean : true / false (Enable / Disable)
* - Enables or disables region lighting.
*
*
* ▼ Plugin parameter details
* About light level
* - You can set the brightness of the tile with the region ID.
* - The higher the level, the brighter it becomes.
*
* Region ID array specification
* - When setting numbers in an array, you can specify numbers from n to m
* by writing n-m.
* Example: 1-4,8,10-12
*
* ================================
* Mail : wood_penguinyahoo.co.jp ( is half-width)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command changeRegionLights
* @desc
* @arg boolean
* @desc
* @type boolean
* @default true
*
*
* @param Light Level 1 Regions
* @desc
* @default 1,9,17,25,33,41,49,57
*
* @param Light Level 2 Regions
* @desc
* @default 2,10,18,26,34,42,50,58
*
* @param Light Level 3 Regions
* @desc
* @default 3,11,19,27,35,43,51,59
*
* @param Light Level 4 Regions
* @desc
* @default 4,12,20,28,36,44,52,60
*
* @param Light Level 5 Regions
* @desc
* @default 5,13,21,29,37,45,53,61
*
* @param Light Level 6 Regions
* @desc
* @default 6,14,22,30,38,46,54,62
*
* @param Light Level 7 Regions
* @desc
* @default 7,15,23,31,39,47,55,63
*
*/
/*:ja
* @target MV MZ
* @plugindesc リージョンでそのタイルの明るさが変わります。
* @author 木星ペンギン
* @url
*
* @base MPP_MapLight
* @orderAfter MPP_MapLight
*
* @help [version 1.2.1]
* - このプラグインはRPGツクールMVおよびMZ用です。
*
* ▼ プラグインコマンド
* MV / MZ
*
* リージョン灯り変更 boolean / リージョン灯り変更
* boolean : true / false (有効 / 無効)
* - リージョン灯りの有効/無効を変更します。
*
*
* ▼ プラグインパラメータ 詳細
* 明るさレベルについて
* - リージョンIDでそのタイルの明るさを設定できます。
* - レベルが高いほど明るくなります。
*
* リージョンIDの配列指定
* - 数値を配列で設定する際、n-m と表記することでnからmまでの数値を指定できます。
* 例 : 1-4,8,10-12
*
* ================================
* Mail : wood_penguinyahoo.co.jp (@は半角)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command changeRegionLights
* @text リージョン灯り変更
* @desc
* @arg boolean
* @text 有効/無効
* @desc
* @type boolean
* @default true
*
*
* @param Light Level 1 Regions
* @text 明るさレベル1リージョン
* @desc
* @default 1,9,17,25,33,41,49,57
*
* @param Light Level 2 Regions
* @text 明るさレベル2リージョン
* @desc
* @default 2,10,18,26,34,42,50,58
*
* @param Light Level 3 Regions
* @text 明るさレベル3リージョン
* @desc
* @default 3,11,19,27,35,43,51,59
*
* @param Light Level 4 Regions
* @text 明るさレベル4リージョン
* @desc
* @default 4,12,20,28,36,44,52,60
*
* @param Light Level 5 Regions
* @text 明るさレベル5リージョン
* @desc
* @default 5,13,21,29,37,45,53,61
*
* @param Light Level 6 Regions
* @text 明るさレベル6リージョン
* @desc
* @default 6,14,22,30,38,46,54,62
*
* @param Light Level 7 Regions
* @text 明るさレベル7リージョン
* @desc
* @default 7,15,23,31,39,47,55,63
*
*/
(() => {
'use strict';
const pluginName = 'MPP_MapLight_Op2';
// Plugin Parameters
const parameters = PluginManager.parameters(pluginName);
const convertToSet = (param) => {
return param.split(',').reduce((r, item) => {
if (item) {
const match = /(\d+)-(\d+)/.exec(item);
if (match) {
for (const n of range(+match[1], +match[2] + 1)) {
r.add(n);
}
} else {
r.add(+item);
}
}
return r;
}, new Set());
};
const param_LightRegions = [];
for (let i = 0; i < 7; i++) {
const paramName = `Light Level ${i + 1} Regions`;
param_LightRegions[i] = convertToSet(parameters[paramName]);
}
/**
* start から end までの整数を返すイテレータ。
*
* @param {number} start - 最初の数値。
* @param {number} end - 最後の数値(範囲には含まれない)。
* @returns {number}
*/
const range = function* (start, end) {
for (let i = start; i < end; i++) {
yield i;
}
};
//-------------------------------------------------------------------------
// Tilemap
if (Tilemap.prototype._paintAllTiles) {
const _Tilemap__paintAllTiles = Tilemap.prototype._paintAllTiles;
Tilemap.prototype._paintAllTiles = function(startX, startY) {
this._darknessLayer.clearBase();
_Tilemap__paintAllTiles.apply(this, arguments);
};
const _Tilemap__paintTiles = Tilemap.prototype._paintTiles;
Tilemap.prototype._paintTiles = function(startX, startY, x, y) {
_Tilemap__paintTiles.apply(this, arguments);
this._paintDarknessBitmap(startX, startY, x, y);
};
} else {
const _Tilemap__addAllSpots = Tilemap.prototype._addAllSpots;
Tilemap.prototype._addAllSpots = function(startX, startY) {
this._darknessLayer.clearBase();
_Tilemap__addAllSpots.apply(this, arguments);
};
const _Tilemap__addSpot = Tilemap.prototype._addSpot;
Tilemap.prototype._addSpot = function(startX, startY, x, y) {
_Tilemap__addSpot.apply(this, arguments);
this._paintDarknessBitmap(startX, startY, x, y);
};
}
Tilemap.prototype._paintDarknessBitmap = function(startX, startY, x, y) {
const level = this._getDarknessLevel(startX + x, startY + y);
this._darknessLayer._paintBaseBitmap(x, y, level);
};
Tilemap.prototype._getDarknessLevel = function(x, y) {
if ($gameMap.isRegionLightsHidden()) {
return 0;
}
const regionId = this._readMapData(x, y, 5);
return param_LightRegions.findIndex(regions => regions.has(regionId)) + 1;
};
Tilemap.prototype._paintFillDarkness = function() {
this._darknessLayer.bltBase();
};
const _Tilemap_createDarknessBitmap = Tilemap.prototype.createDarknessBitmap;
Tilemap.prototype.createDarknessBitmap = function() {
_Tilemap_createDarknessBitmap.call(this);
const widthWithMargin = this.width + this._margin * 2;
const heightWithMargin = this.height + this._margin * 2;
const tileCols = Math.ceil(widthWithMargin / this.tileWidth) + 1;
const tileRows = Math.ceil(heightWithMargin / this.tileHeight) + 1;
this._darknessLayer.createBaseBitmap(tileCols, tileRows);
};
//-------------------------------------------------------------------------
// ShaderTilemap
if (Tilemap.prototype._paintAllTiles) {
const _ShaderTilemap__paintAllTiles = ShaderTilemap.prototype._paintAllTiles;
ShaderTilemap.prototype._paintAllTiles = function(startX, startY) {
this._darknessLayer.clearBase();
_ShaderTilemap__paintAllTiles.apply(this, arguments);
};
const _ShaderTilemap__paintTiles = ShaderTilemap.prototype._paintTiles;
ShaderTilemap.prototype._paintTiles = function(startX, startY, x, y) {
_ShaderTilemap__paintTiles.apply(this, arguments);
this._paintDarknessBitmap(startX, startY, x, y);
};
}
//-------------------------------------------------------------------------
// DarknessLayer
const _DarknessLayer_destroy = DarknessLayer.prototype.destroy;
DarknessLayer.prototype.destroy = function() {
if (this._baseBitmap) {
this._baseBitmap.destroy();
}
_DarknessLayer_destroy.call(this);
};
DarknessLayer.prototype.createBaseBitmap = function(width, height) {
this._baseBitmap = new Bitmap(width, height);
};
DarknessLayer.prototype.clearBase = function() {
if (this._baseBitmap) {
this._baseBitmap.clear();
}
};
DarknessLayer.prototype.bltBase = function() {
const bitmap = this.bitmap;
const { width:sw, height:sh } = this._baseBitmap;
const { width:dw, height:dh } = bitmap;
bitmap.clear();
bitmap.blt(this._baseBitmap, 0, 0, sw, sh, 0, 0, dw, dh);
};
DarknessLayer.prototype._paintBaseBitmap = function(x, y, level) {
const baseBitmap = this._baseBitmap;
baseBitmap.paintOpacity = 255 * (7 - level) / 7;
baseBitmap.fillRect(x, y, 1, 1, $gameMap.darknessColor());
};
//-------------------------------------------------------------------------
// Game_Map
const _Game_Map_initialize = Game_Map.prototype.initialize;
Game_Map.prototype.initialize = function() {
_Game_Map_initialize.apply(this, arguments);
this._regionLightsVisible = true;
};
Game_Map.prototype.isRegionLightsHidden = function() {
return this._regionLightsVisible === false;
};
Game_Map.prototype.visibleRegionLights = function() {
this._regionLightsVisible = true;
};
Game_Map.prototype.hiddenRegionLights = function() {
this._regionLightsVisible = false;
};
//-------------------------------------------------------------------------
// Game_Interpreter
const _mzCommands = {
ChangeRegionLights: { name:'changeRegionLights', keys:['boolean'] }
};
Object.assign(_mzCommands, {
'リージョン灯り変更': _mzCommands.ChangeRegionLights
});
const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);
const mzCommand = _mzCommands[command];
if (mzCommand) {
const args2 = Object.assign(
{}, ...mzCommand.keys.map((k, i) => ({ [k]: args[i] || '' }))
);
PluginManager.callCommandMV(this, pluginName, mzCommand.name, args2);
}
};
//-------------------------------------------------------------------------
// PluginManager
const _registerCommandName = PluginManager.registerCommand
? 'registerCommand'
: 'registerCommandMV';
PluginManager[_registerCommandName](pluginName, 'changeRegionLights', args => {
if (args.boolean === 'true') {
$gameMap.visibleRegionLights();
} else {
$gameMap.hiddenRegionLights();
}
});
})();