lust-oni/www/js/SimpleMenuLayout.js
2025-10-26 23:43:42 -05:00

521 lines
16 KiB
JavaScript
Raw Permalink 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.

//=============================================================================
// SimpleMenuLayout.js
// ----------------------------------------------------------------------------
// Copyright (c) 2017 Tsumio
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.0 2017/10/28 公開。
// ----------------------------------------------------------------------------
// [GitHub] : https://github.com/Tsumio/rmmv-plugins
// [Blog] : http://ntgame.wpblog.jp/
// [Twitter]: https://twitter.com/TsumioNtGame
//=============================================================================
/*:
* @plugindesc This plugin remodels the menu scene.
* @author Tsumio
*
* @param ----Basic Settings----
* @desc
* @default
*
* @param MenuWidth
* @type number
* @desc Set the width of the menu window.
* @default 240
*
* @param MenuCols
* @type number
* @desc Set the cols of the menu window.
* @default 1
*
* @param MenuXPosition
* @type struct<XPos>
* @desc Set the X position of the menu window.
* @default {"basis":"center","correction":"0"}
*
* @param MenuYPosition
* @type struct<YPos>
* @desc Set the Y position of the menu window.
* @default {"basis":"center","correction":"0"}
*
* @help This plugin remodels the menu scene.
*
* ----feature----
* -> Remodels the menu scene.
* -> Show a picture according to the first character in the menu scene.
*
* ----how to use----
* The introduction of the plugin will change the design of the menu scene.
*
* To display a picture in accordance with the first character, write the following in the memo field of the actor.
* <stand_sml:["fileName","X","Y"]>
*
* Example: <stand_sml:["Package1_2","400","50"]>
*
* The image file is read from the img/tsumio folder.
*
* ----plugin command----
* There is no plugin command.
*
*
* ----change log---
* 1.0.0 2017/10/28 Release.
*
* ----remarks----
* I shall not be responsible for any loss, damages and troubles from using this plugin.
*
* --Terms of Use--
* This plugin is free for both commercial and non-commercial use.
* You may edit the source code to suit your needs,
* so long as you don't claim the source code belongs to you.
*
*/
/*:ja
* @plugindesc シンプルなメニュー画面を実装します。
* @author ツミオ
*
* @param ----基本的な設定----
* @desc
* @default
*
* @param メニュー幅
* @type number
* @desc メニューウィンドウの幅を指定します。
* @default 240
*
* @param メニュー列数
* @type number
* @desc メニューウィンドウの列数を指定します。
* @default 1
*
* @param メニューX座標
* @type struct<XPos>
* @desc メニューウィンドウのX座標を指定します。
* @default {"basis":"center","correction":"0"}
*
* @param メニューY座標
* @type struct<YPos>
* @desc メニューウィンドウのY座標を指定します。
* @default {"basis":"center","correction":"0"}
*
* @help シンプルなメニュー画面を実装します。
*
* 【特徴】
* ・メニュー画面のデザインを変更します。
* ・先頭のキャラクターに合わせて一枚絵を表示できます。
*
* 【使用方法】
* プラグインを導入するとメニュー画面のデザインが変更されます。
*
* 先頭のキャラクターに合わせて一枚絵を表示するには、アクターのメモ欄に以下のような記述をします。
* <stand_sml:["ファイル名","X座標","Y座標"]>
*
* 例:<stand_sml:["Package1_2","400","50"]>
*
* なお、画像ファイルはimg/tsumioフォルダから読み込まれます。
*
*
* 【プラグインコマンド】
* プラグインコマンドはありません。
*
*
* 【更新履歴】
* 1.0.0 2017/10/28 公開。
*
* 【備考】
* 当プラグインを利用したことによるいかなる損害に対しても、制作者は一切の責任を負わないこととします。
*
* 【利用規約】
* ソースコードの著作権者が自分であると主張しない限り、
* 作者に無断で改変、再配布が可能です。
* 利用形態商用、18禁利用等についても制限はありません。
* 自由に使用してください。
*
*/
/*~struct~XPos:
*
* @param basis
* @type select
* @option right
* @option left
* @option center
* @desc 基準位置(basis).
*
* @param correction
* @type number
* @min -3000
* @max 3000
* @desc 補正(correction).
*/
/*~struct~YPos:
*
* @param basis
* @type select
* @option top
* @option bottom
* @option center
* @desc 基準位置(basis).
*
* @param correction
* @type number
* @min -3000
* @max 3000
* @desc 補正(correction).
*/
(function() {
'use strict';
var pluginName = 'SimpleMenuLayout';
////=============================================================================
//// Local function
//// These functions checks & formats pluguin's command parameters.
//// I borrowed these functions from Triacontane.Thanks!
////=============================================================================
var getParamString = function(paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (var i = 0; i < paramNames.length; i++) {
var name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return name;
}
return '';
};
var getParamNumber = function(paramNames, min, max) {
var value = getParamString(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(value) || 0).clamp(min, max);
};
//This function is not written by Triacontane.Tsumio wrote this function !
var convertParam = function(param) {
if(param !== undefined){
try {
return JSON.parse(param);
}catch(e){
console.group();
console.error('%cParameter is invalid ! You should check the following parameter !','background-color: #5174FF');
console.error('Parameter:' + eval(param));
console.error('Error message :' + e);
console.groupEnd();
}
}
};
////=============================================================================
//// Get and set pluguin parameters.
////=============================================================================
var param = {};
//Basic Stteings
param.menuWidth = getParamNumber(['MenuWidth', 'メニュー幅']);
param.menuCols = getParamNumber(['MenuCols', 'メニュー列数']);
param.menuXPos = getParamString(['MenuXPosition', 'メニューX座標']);
param.menuYPos = getParamString(['MenuYPosition', 'メニューY座標']);
////==============================
//// Convert parameters.
////==============================
param.menuXPos = convertParam(param.menuXPos);
param.menuYPos = convertParam(param.menuYPos);
////==============================
//// Convert to Number.
////==============================
//None
////==============================
//// Add tsumio folder to ImageManager.
////==============================
ImageManager.loadTsumio = function(filename) {
return this.loadBitmap('img/tsumio/', filename, 0, true);
};
////=============================================================================
//// SceneManager
//// Snap clear background.
////=============================================================================
const _SceneManager_snapForBackground = SceneManager.snapForBackground;
SceneManager.snapForBackground = function() {
_SceneManager_snapForBackground.call(this);
if(SceneManager.isNextScene(Scene_Menu)){
this._backgroundBitmap = this.snap();
}
};
////=============================================================================
//// Scene_Menu
//// New simple menu scene!
////=============================================================================
const _Scene_Menu_initialize = Scene_Menu.prototype.initialize;
Scene_Menu.prototype.initialize = function() {
_Scene_Menu_initialize.call(this);
this._metaData = null;
};
const _Scene_Menu_start = Scene_Menu.prototype.start;
Scene_Menu.prototype.start = function() {
_Scene_Menu_start.call(this);
this.hideUnnecessaryWindows();
this.resetMenuWindowPos();
};
const _Scene_Menu_create = Scene_Menu.prototype.create;
Scene_Menu.prototype.create = function() {
_Scene_Menu_create.call(this);
const actor = $gameParty.members()[0];
this.setMetaData(actor);
this.createStandPicture();
};
Scene_Menu.prototype.createStandPicture = function() {
const fileName = this.getMetaData()[0];
const x = Number(this.getMetaData()[1]);
const y = Number(this.getMetaData()[2]);
if(!fileName){
return;
}
//Create and addChild.
const picture = new Sprite(ImageManager.loadTsumio(fileName));
picture.x = x;
picture.y = y;
this.addChild(picture);
};
const _Scene_Menu_commandPersonal = Scene_Menu.prototype.commandPersonal;
Scene_Menu.prototype.commandPersonal = function() {
_Scene_Menu_commandPersonal.call(this);
this.onPersonalOk();//Skip selecting character in status window.
};
Scene_Menu.prototype.hideUnnecessaryWindows = function() {
this._statusWindow.hide();
this._goldWindow.hide();
};
Scene_Menu.prototype.resetMenuWindowPos = function() {
const width = this._commandWindow.width;
const height = this._commandWindow.height;
this._commandWindow.x = MenuPosition.x(width);
this._commandWindow.y = MenuPosition.y(height);
};
Scene_Menu.prototype.setMetaData = function(actor) {
const actorId = actor.actorId();
if($dataActors[actorId].meta['stand_sml']){
this._metaData = JSON.parse($dataActors[actorId].meta['stand_sml']);
}else{
//Assign blank data.
this._metaData = [null, 0, 0];
}
};
Scene_Menu.prototype.getMetaData = function() {
return this._metaData;
};
////=============================================================================
//// Scene_Menu
//// New simple menu window!
////=============================================================================
Window_MenuCommand.prototype.windowWidth = function() {
return param.menuWidth;
};
Window_MenuCommand.prototype.maxCols = function() {
return param.menuCols;
};
Window_MenuCommand.prototype.windowHeight = function() {
return this.fittingHeight(this.numVisibleRows());
};
Window_MenuCommand.prototype.numVisibleRows = function() {
return Math.ceil(this.maxItems() / this.maxCols());
};
////=============================================================================
//// MenuPosition
//// This static class is for calculate Window position.
////=============================================================================
class MenuPosition {
static basisX(width){
switch(param.menuXPos.basis){
case 'right' :
return Graphics.boxWidth - width;
break;
case 'left' :
return 0;
break;
case 'center' :
return Graphics.boxWidth/2 - width/2;
break;
default :
return 0;
break;
}
}
static get correctX(){
return Number(param.menuXPos.correction);
}
static x(width){
return this.basisX(width) + this.correctX;
}
static basisY(height){
switch(param.menuYPos.basis){
case 'top' :
return 0;
break;
case 'bottom' :
return Graphics.boxHeight - height;
break;
case 'center' :
return Graphics.boxHeight/2 - height/2;
break;
default :
return 0;
break;
}
}
static get correctY(){
return Number(param.menuYPos.correction);
}
static y(height){
return this.basisY(height) + this.correctY;
}
}
////=============================================================================
//// Debug
//// This static class is for simple debugging.I/O.
////=============================================================================
class Debug {
/**
* Instead of constructor.
* At debugging, this method should be executed on loaded.
*/
static on() {
this._debugMode = true;
this._stack = [];
console.warn(`${this.FILENAME} : Debug mode turned ON.`);
}
/**
* Instead of constructor.
* At release, this method should be executed on loaded.
*/
static off() {
this._debugMode = false;
this._stack = [];
console.warn(`${this.FILENAME} : Debug mode turned OFF.`);
}
static get FILENAME(){
return 'SimpleMenuLayout';
}
static get isDebugMode() {
return this._debugMode;
}
static outputStack() {
if(!this.isDebugMode){
return;
}
if(this._stack.length > 0){
this._stack.forEach(function(element) {
console.log(element);
}, this);
return `Stack length is ${this._stack.length}.`;
}
return 'Stack length is 0.';
}
static clearStack() {
if(!this.isDebugMode){
return;
}
this._stack = [];
}
static push(arg) {
if(!this.isDebugMode){
return;
}
this._stack.push(arg);
}
/**
* Private method.
* @param {Function} func
* @param {Array} args
*/
static _output(func, args) {
if(!this.isDebugMode){
return;
}
args = Array.prototype.slice.call(args);//ES6: Array.from(args);
for(var arg of args) {
console[func](arg);
this.push(args);
}
}
static log(args) {
this._output('log', arguments);
}
static dir(args) {
this._output('dir', arguments);
}
static info(args) {
this._output('info', arguments);
}
static warn(args) {
this._output('warn', arguments);
}
static error(args) {
this._output('error', arguments);
}
static assert(test, message, optionalParam) {
if(!this.isDebugMode){
return;
}
console.assert(test, message, optionalParam);
}
static modify() {
this._debugMode = !this._debugMode;
var status = this._debugMode ? 'ON' : 'OFF';
console.warn(`Debug mode turned ${status}.`);
}
}
//Debug.on();
Debug.off();
})();