prison-brave/js/plugins/AsyncLoadImage.js
2025-08-28 10:38:20 -05:00

169 lines
6.1 KiB
JavaScript

//=============================================================================
// RPG Maker MZ - AsyncLoadImage
//
// Copyright 2024 Panzer-IV. All rights reserved.
// This source code or any portion thereof must not be
// reproduced or used without licensed in any manner whatsoever.
//=============================================================================
/*:
* @target MZ
* @plugindesc 画像の非同期読み込みプラグイン
* @author 四号戦車
* @base PluginCommonBase
* @orderAfter PluginCommonBase
*
* @help AsyncLoadImage.js
*
* Version: 0.0.1
*
* ImageManagerのBitmapローディングは非同期なので困る場面があるため、
* コールバック地獄回避のためにPromiseで返す処理を追加するプラグイン
*
*/
(() => {
"use strict";
const pluginName = "AsyncLoadImage";
const script = document.currentScript;
const param = PluginManagerEx.createParameter(script);
//========================================================================
// モジュールインポート
//========================================================================
const fs = require('fs');
/********************************************************************************************************
* 共有基盤
********************************************************************************************************/
const log = (text) => {
if (DebugSwitch.isEnable()) {
console.log(text);
}
};
const fileExists = (path) => {
try {
const realPath = Utils.hasEncryptedImages() ? `${path}_` : path;
fs.accessSync(realPath, fs.constants.R_OK);
return true;
} catch (err) {
Logger.w(`cannot access: path = ${path}, err = ${err}`);
return false;
}
};
/********************************************************************************************************
* ImageManagerへのfunction追加
********************************************************************************************************/
const _Bitmap_prototype_initialize = Bitmap.prototype.initialize;
Bitmap.prototype.initialize = function(width, height) {
_Bitmap_prototype_initialize.apply(this, arguments);
this._errorListeners = [];
}
Bitmap.prototype.addErrorListener = function(listner) {
if (this._loadingState !== "error") {
this._errorListeners.push(listner);
} else {
listner(this);
}
};
const _Bitmap_prototype__onError = Bitmap.prototype._onError;
Bitmap.prototype._onError = function() {
_Bitmap_prototype__onError.apply(this, arguments);
while (this._errorListeners.length > 0) {
const listener = this._errorListeners.shift();
listener(this);
}
}
/********************************************************************************************************
* ImageManagerへのfunction追加
********************************************************************************************************/
ImageManager.loadAnimationAsync = function(filename) {
return this.loadBitmapAsync("img/animations/", filename);
};
ImageManager.loadBattleback1Async = function(filename) {
return this.loadBitmapAsync("img/battlebacks1/", filename);
};
ImageManager.loadBattleback2Async = function(filename) {
return this.loadBitmapAsync("img/battlebacks2/", filename);
};
ImageManager.loadEnemyAsync = function(filename) {
return this.loadBitmapAsync("img/enemies/", filename);
};
ImageManager.loadCharacterAsync = function(filename) {
return this.loadBitmapAsync("img/characters/", filename);
};
ImageManager.loadFaceAsync = function(filename) {
return this.loadBitmapAsync("img/faces/", filename);
};
ImageManager.loadParallaxAsync = function(filename) {
return this.loadBitmapAsync("img/parallaxes/", filename);
};
ImageManager.loadPictureAsync = function(filename) {
return this.loadBitmapAsync("img/pictures/", filename);
};
ImageManager.loadSvActorAsync = function(filename) {
return this.loadBitmapAsync("img/sv_actors/", filename);
};
ImageManager.loadSvEnemyAsync = function(filename) {
return this.loadBitmapAsync("img/sv_enemies/", filename);
};
ImageManager.loadSystemAsync = function(filename) {
return this.loadBitmapAsync("img/system/", filename);
};
ImageManager.loadTilesetAsync = function(filename) {
return this.loadBitmapAsync("img/tilesets/", filename);
};
ImageManager.loadTitle1Async = function(filename) {
return this.loadBitmapAsync("img/titles1/", filename);
};
ImageManager.loadTitle2Async = function(filename) {
return this.loadBitmapAsync("img/titles2/", filename);
};
ImageManager.loadBitmapAsync = function(folder, filename) {
if (!!filename) {
const url = folder + Utils.encodeURI(filename) + ".png";
return this.loadBitmapFromUrlAsync(url);
} else {
return Promise.resolve(this._emptyBitmap);
}
}
ImageManager.loadBitmapFromUrlAsync = function(url) {
return new Promise((resolve, reject) => {
const cache = url.includes("/system/") ? this._system : this._cache;
if (!cache[url] || !cache[url]._baseTexture) {
if (fileExists(decodeURIComponent(url))) {
const bitmap = Bitmap.load(url);
cache[url] = bitmap;
bitmap.addLoadListener(() => {
resolve(bitmap);
});
bitmap.addErrorListener(() => reject(bitmap));
} else {
reject(`file does not exists, url = ${decodeURIComponent(url)}`);
}
} else {
resolve(cache[url]);
}
});
};
})();