white-thirst/www/js/plugins/LazyTilesets.js
2025-01-07 13:09:58 -06:00

175 lines
5.6 KiB
JavaScript

//=============================================================================
// Lazy Tilesets
// by Shaz
// Last Updated: 2015.10.21
//=============================================================================
/*:
* @plugindesc Allows you to export/import/copy tilesets and all their data
* @author Shaz
*
* @help This plugin does not provide plugin commands.
*
* Tileset Note:
* <lzexport: filename> # Export settings to img/tilesets/filename.MVTileset
* <lzimport: filename> # Import settings from img/tilesets/filename.MVTileset
* <lzcopy: ID> # Copy settings from tileset with ID
*
* <lzimport: filename A1 A2 B C>
* <lzcopy: ID A1 A2 B C> # Import/copy slots A1, A2, B and C
*
* <lzimport: filename B:D C:E>
* <lzcopy: ID B:D C:E> # Import/copy slots B and C, placing them into D and E
*
* Remember to remove the commands after use to prevent loss of custom changes
* This plugin only runs in DEBUG mode (from PlayTest)
*/
*
/*:ja
* @plugindesc タイルセットとその全データの
* エクスポート/インポート/コピーを可能にします。
* @author Shaz
*
* @help このプラグインは、プラグインコマンドを含みません。
*
* Tileset Note:
* <lzexport: filename> #
* img/tilesets/filename.MVTilesetに設定をエクスポートします。
* <lzimport: filename> #
* img/tilesets/filename.MVTilesetからファイルをインポートします。
* <lzcopy: ID> #
* タイルセットから設定をコピーします。
*
* <lzimport: filename A1 A2 B C>
* <lzcopy: ID A1 A2 B C> #
* A1, A2, B, Cのインポート/コピーを行います。
*
* <lzimport: filename B:D C:E>
* <lzcopy: ID B:D C:E> #
* B, Cのインポート/コピーを行い、D, Eに置換します。
*
* 変更の反映を失わないために、使用後はコマンドを消去してください。
* このプラグインはデバッグモードのみで動作します。
*/
(function() {
var slots = {
'A1': [0, 2048, 2815],
'A2': [1, 2816, 4351],
'A3': [2, 4352, 5887],
'A4': [3, 5888, 8191],
'A5': [4, 1536, 1663],
'B': [5, 0, 255],
'C': [6, 256, 511],
'D': [7, 512, 767],
'E': [8, 768, 1023]
};
var _Scene_Boot_start = Scene_Boot.prototype.start;
Scene_Boot.prototype.start = function() {
_Scene_Boot_start.call(this);
if (!Utils.isOptionValid('test')) return;
var saveMods = false;
var fs = require('fs');
for (var i = 0; i < $dataTilesets.length; i++) {
ts = $dataTilesets[i];
if (!ts) continue;
if (ts.meta.lzexport) {
filename = ts.meta.lzexport.trim();
fs.writeFileSync(StorageManager.lzFile(filename), JSON.stringify(ts));
}
if (ts.meta.lzimport) {
var options = ts.meta.lzimport.trim().split(' ');
filename = options.shift();
data = JSON.parse(fs.readFileSync(StorageManager.lzFile(filename)));
$dataTilesets[i] = this.lzReadData(data, options, i);
saveMods = true;
}
if (ts.meta.lzcopy) {
var options = ts.meta.lzcopy.trim().split(' ');
tilesetId = options.shift();
data = $dataTilesets[Number(tilesetId)];
$dataTilesets[i] = this.lzReadData(data, options, i);
saveMods = true;
}
}
if (saveMods) {
fs.writeFileSync(StorageManager.lzData('Tilesets'), JSON.stringify($dataTilesets));
}
};
Scene_Boot.prototype.lzReadData = function(data, options, tilesetId) {
if (options.length < 1) {
return data;
} else {
var rtnData = $dataTilesets[tilesetId];
msgprfx = 'Tileset #' + String(tilesetId) + ' - ' + rtnData.name + ': ';
for (i = 0; i < options.length; i++) {
var group = options[i].toUpperCase().split(':');
var fromSlot = group[0];
var toSlot = group[1] || group[0];
// 'from' slot not valid
if ((slots[fromSlot] || 'X') === 'X') {
window.alert(msgprfx + 'Invalid slot ' + fromSlot);
return rtnData;
}
// 'to' slot not valid
if ((slots[toSlot] || 'X') === 'X') {
window.alert(msgprfx + 'Invalid slot ' + toSlot);
return rtnData;
}
// trying to move something invalid into/out of one of the A slots
if (fromSlot !== toSlot && ('BCDE'.indexOf(fromSlot) < 0 || 'BCDE'.indexOf(toSlot) < 0)) {
window.alert(msgprfx + 'A1-A5 slots cannot be moved');
return rtnData;
}
// all good - copy the slot data in
fromSlotId = slots[fromSlot][0];
fromSlotStart = slots[fromSlot][1];
fromSlotEnd = slots[fromSlot][2];
toSlotId = slots[toSlot][0];
k = slots[toSlot][1];
rtnData.tilesetNames[toSlotId] = data.tilesetNames[fromSlotId];
for (j = fromSlotStart; j <= fromSlotEnd; j++) {
rtnData.flags[k] = data.flags[j];
k++;
}
}
}
return rtnData;
};
StorageManager.lzFile = function(filename) {
var path = window.location.pathname.replace(/\/[^\/]*$/, '/img/tilesets/');
if (path.match(/^\/([A-Z]\:)/)) {
path = path.slice(1);
}
return decodeURIComponent(path) + filename.replace(/[^a-zA-Z0-9]/,'') + '.MVTileset';
};
StorageManager.lzData = function(filename) {
var path = window.location.pathname.replace(/\/[^\/]*$/, '/data/');
if (path.match(/^\/([A-Z]\:)/)) {
path = path.slice(1);
}
return decodeURIComponent(path) + filename.replace(/[^a-zA-Z0-9]/,'') + '.json';
}
})();