Files
Superproject1/js/plugins/YEP_PictureSpritesheets.js
alexpolo1 3cfd07d722 2
2023-04-10 00:05:51 +02:00

224 lines
8.4 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Picture Spritesheets
// YEP_PictureSpritesheets.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_PictureSpritesheets = true;
var Yanfly = Yanfly || {};
Yanfly.PicSS = Yanfly.PicSS || {};
Yanfly.PicSS.version = 1.00;
//=============================================================================
/*:
* @plugindesc v1.00 Another function from RPG Maker 2003 is back. You can now
* use spritesheets in your pictures folder and change them to specific frames.
* @author Yanfly Engine Plugins
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* In RPG Maker 2003, pictures had the ability to load spritesheets and display
* certain frames from them at the issue of a command. Ever since then, later
* iterations of RPG Maker lacked the feature. This plugin will bring back that
* old feature and give you access to use spritesheets as pictures once more
* with complete frame control.
*
* ============================================================================
* Instructions
* ============================================================================
*
* When putting a spritesheet into your project's /img/pictures/ folder, you
* have to name them a certain way.
*
* filename[HxV]
*
* Replace H in the filename with the number of horizontal cells it has.
* Replace V in the filename with the number of vertical cells it has.
*
* --- For example ---
*
* "Actor1_1(9x6)" will have 9 horizontal cells and 6 vertical cells.
*
* As long as the picture's filename is formatted in such a way, it will be
* displayed in-game as a spritesheet.
*
* --- Frames ---
*
* Individual frames can be displayed using Plugin Commands or Script Calls
* (look in the later help sections to figure out how). To identify which frame
* ID a particular spritesheet cell is, start with 0 in the upper left. The
* frame ID increases as you go left to right, then it loops back around at the
* start of a new row. For example:
*
* 0 1 2 3 4 5 6 7 8
* 9 10 11 12 13 14 15 16 17
* 18 19 20 21 22 23 24 25 26
* 27 28 29 30 31 32 33 34 35
* 36 37 38 39 40 41 42 43 44
* 45 46 47 48 49 50 51 52 53
*
* ============================================================================
* Plugin Commands
* ============================================================================
*
* Using the Plugin Command event, you can set a specific picture to change to
* a different cell by using the Plugin Command below:
*
* Plugin Commands:
*
* Picture x Frame y
* - Replace 'x' with the ID of the picture you wish to change the frame of.
* - Replace 'y' with the frame ID to change the picture to.
*
* ============================================================================
* Script Calls
* ============================================================================
*
* For those who wish to use JavaScript code instead of Plugin Commands, you
* can use the Script Call event command to do so:
*
* var pictureId = 5;
* var frame = 10;
* $gameScreen.picture(pictureId).setSpritesheetFrame(frame);
*
* The above code will adjust the designated picture to change to desired frame
* setting you would like.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.00:
* - Finished Plugin!
*
* ============================================================================
* End of Helpfile
* ============================================================================
*
*/
//=============================================================================
//=============================================================================
// Game_Picture
//=============================================================================
Yanfly.PicSS.Game_Picture_initialize = Game_Picture.prototype.initialize;
Game_Picture.prototype.initialize = function() {
Yanfly.PicSS.Game_Picture_initialize.call(this);
this.initSpritesheetFrame();
};
Game_Picture.prototype.initSpritesheetFrame = function() {
this._spritesheetFrame = 0;
};
Game_Picture.prototype.getSpritesheetFrame = function() {
if (this._spritesheetFrame === undefined) this.initSpritesheetFrame();
return this._spritesheetFrame;
};
Game_Picture.prototype.setSpritesheetFrame = function(value) {
if (this._spritesheetFrame === undefined) this.initSpritesheetFrame();
this._spritesheetFrame = value;
};
Yanfly.PicSS.Game_Picture_show = Game_Picture.prototype.show;
Game_Picture.prototype.show = function(name, origin, x, y, scaleX, scaleY, opacity, blendMode) {
Yanfly.PicSS.Game_Picture_show.call(this, name, origin, x, y, scaleX, scaleY, opacity, blendMode);
this.initSpritesheetFrame();
};
Yanfly.PicSS.Game_Picture_erase = Game_Picture.prototype.erase;
Game_Picture.prototype.erase = function() {
Yanfly.PicSS.Game_Picture_erase.call(this);
this.initSpritesheetFrame();
};
//=============================================================================
// Game_Interpreter
//=============================================================================
Yanfly.PicSS.Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
Yanfly.PicSS.Game_Interpreter_pluginCommand.call(this, command, args);
var line = this._params[0];
if (line.match(/Picture (\d+) Frame (\d+)/i)) {
var pictureId = Number(RegExp.$1);
var frame = Number(RegExp.$2);
$gameScreen.picture(pictureId).setSpritesheetFrame(frame);
}
};
//=============================================================================
// Sprite_Picture
//=============================================================================
Yanfly.PicSS.Sprite_Picture_initialize = Sprite_Picture.prototype.initialize;
Sprite_Picture.prototype.initialize = function(pictureId) {
Yanfly.PicSS.Sprite_Picture_initialize.call(this, pictureId);
this.initPictureSpritesheetSettings();
};
Sprite_Picture.prototype.initPictureSpritesheetSettings = function() {
this._spritesheetHorzCells = 1;
this._spritesheetVertCells = 1;
this._lastSpritesheetFrame = -1;
};
Yanfly.PicSS.Sprite_Picture_loadBitmap = Sprite_Picture.prototype.loadBitmap;
Sprite_Picture.prototype.loadBitmap = function() {
Yanfly.PicSS.Sprite_Picture_loadBitmap.call(this);
this.initPictureSpritesheetSettings();
this.setupPictureSpritesheetSettings();
if (this.isSpritesheet()) {
this.bitmap.addLoadListener(this.updateSpritesheetFrame.bind(this));
} else {
this.bitmap.addLoadListener(this.resetSpritesheetFrame.bind(this));
}
};
Sprite_Picture.prototype.setupPictureSpritesheetSettings = function() {
var name = this.picture().name();
if (name && name.match(/\((\d+)x(\d+)\)/i)) {
this._spritesheetHorzCells = Number(RegExp.$1);
this._spritesheetVertCells = Number(RegExp.$2);
}
};
Sprite_Picture.prototype.isSpritesheet = function() {
return this._spritesheetHorzCells > 1 || this._spritesheetVertCells > 1;
};
Sprite_Picture.prototype.spritesheetFrame = function() {
return this.picture().getSpritesheetFrame();
};
Sprite_Picture.prototype.updateSpritesheetFrame = function() {
if (this._lastSpritesheetFrame === this.spritesheetFrame()) return;
if (this.bitmap.width <= 0) return;
this._lastSpritesheetFrame = this.spritesheetFrame();
var pw = this.bitmap.width / this._spritesheetHorzCells;
var ph = this.bitmap.height / this._spritesheetVertCells;
var sx = this.spritesheetFrame() % this._spritesheetHorzCells * pw;
var sy = Math.floor(this.spritesheetFrame() / this._spritesheetHorzCells) * ph;
this.setFrame(sx, sy, pw, ph);
};
Sprite_Picture.prototype.resetSpritesheetFrame = function() {
this.setFrame(0, 0, this.bitmap.width, this.bitmap.height);
};
Yanfly.PicSS.Sprite_Picture_update = Sprite_Picture.prototype.update;
Sprite_Picture.prototype.update = function() {
Yanfly.PicSS.Sprite_Picture_update.call(this);
if (this.isSpritesheet()) this.updateSpritesheetFrame();
};
//=============================================================================
// End of File
//=============================================================================