289 lines
8.8 KiB
JavaScript
289 lines
8.8 KiB
JavaScript
//=============================================================================
|
|
// RPG Maker MZ - CustomChoiceList
|
|
//
|
|
// 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 選択肢UI
|
|
* @author 四号戦車
|
|
* @base PluginCommonBase
|
|
* @orderAfter PluginCommonBase
|
|
* @base AsyncLoadImage
|
|
* @orderAfter PluginCommonBase
|
|
* @orderAfter DebugSwitch
|
|
* @orderAfter AsyncLoadImage
|
|
*
|
|
* @help CustomChoiceList.js
|
|
*
|
|
* Version: 0.0.2
|
|
*
|
|
* 選択肢UI変更プラグインです。
|
|
*
|
|
* @requiredAssets img/system/choice_bg_active
|
|
* @requiredAssets img/system/choice_bg_normal
|
|
*
|
|
*/
|
|
(() => {
|
|
"use strict";
|
|
|
|
const pluginName = "CustomChoiceList";
|
|
const script = document.currentScript;
|
|
const param = PluginManagerEx.createParameter(script);
|
|
|
|
const UNSELECTED_TEXT_COLOR = '#A1A1A1';
|
|
|
|
/********************************************************************************************************
|
|
* 共有基盤
|
|
********************************************************************************************************/
|
|
const log = (text) => {
|
|
if (DebugSwitch.isEnable()) {
|
|
console.log(text);
|
|
}
|
|
};
|
|
|
|
/********************************************************************************************************
|
|
* クラス拡張
|
|
********************************************************************************************************/
|
|
const CHOICE_SPACING = 30;
|
|
|
|
class Window_CustomChoiceList extends Window_ChoiceList {
|
|
constructor(top, commands, onSetup) {
|
|
super();
|
|
|
|
const empty = new Bitmap(1, 1);
|
|
this.bgImage = empty;
|
|
this.bgImageActive = empty;
|
|
|
|
this.commands = commands;
|
|
this.cancellable = true;
|
|
this.autoHeightPlacement = false;
|
|
this.placementTop = top;
|
|
|
|
const bg = ImageManager.loadSystemAsync('choice_bg_normal');
|
|
const bgActive = ImageManager.loadSystemAsync('choice_bg_active');
|
|
|
|
const loaded = array => {
|
|
this.bgImage = array[0];
|
|
this.bgImageActive = array[1];
|
|
log('choice list bg loaded');
|
|
this.refresh();
|
|
|
|
if (!!onSetup && typeof onSetup === 'function') {
|
|
onSetup(this);
|
|
}
|
|
};
|
|
Promise.all([ bg, bgActive ]).then(loaded.bind(this));
|
|
this.cursorVisible = false;
|
|
}
|
|
|
|
itemWidth() {
|
|
if (!!this.bgImage) {
|
|
return this.bgImage.width;
|
|
} else {
|
|
return 96;
|
|
}
|
|
}
|
|
|
|
itemHeight() {
|
|
if (!!this.bgImage) {
|
|
return this.bgImage.height + CHOICE_SPACING;
|
|
} else {
|
|
return 194;
|
|
}
|
|
}
|
|
|
|
colSpacing() {
|
|
return 0;
|
|
}
|
|
|
|
rowSpacing() {
|
|
return CHOICE_SPACING;
|
|
}
|
|
|
|
start() {
|
|
this.refresh();
|
|
super.start();
|
|
}
|
|
|
|
drawItemBackground(index) {
|
|
const rect = this.itemRect(index);
|
|
log(`drawItemBackground: index = ${index}, x = ${rect.x}, y = ${rect.y}, width = ${rect.width}, height = ${rect.height}`);
|
|
|
|
const enabled = !this.commands || this.commands[index].enabled;
|
|
const bitmap = (index === this._index && enabled) ? this.bgImageActive : this.bgImage;
|
|
|
|
if (!!bitmap) {
|
|
|
|
this.contentsBack.fontSize = 38;
|
|
this.contentsBack.clearRect(rect.x, rect.y, rect.width, rect.height);
|
|
this.contentsBack.paintOpacity = enabled ? 255 : PluginUtils.percent(255, 60);
|
|
this.contentsBack.blt(bitmap, 0, 0, bitmap.width, bitmap.height,
|
|
rect.x, rect.y, rect.width, rect.height);
|
|
}
|
|
}
|
|
|
|
setHeightPlacement(auto) {
|
|
this.autoHeightPlacement = true;
|
|
}
|
|
|
|
//========================================================================
|
|
// 親クラスの処理変更・抑止したい系
|
|
//========================================================================
|
|
updatePlacement() {
|
|
this.width = this.windowWidth();
|
|
this.height = this.windowHeight();
|
|
|
|
this.x = (Graphics.width - this.width) / 2;
|
|
if (this.autoHeightPlacement === false) {
|
|
this.y = (Graphics.height - this.height) / 2;
|
|
} else {
|
|
this.y = this.placementTop;
|
|
}
|
|
}
|
|
|
|
loadWindowskin() {
|
|
this.windowskin = new Bitmap(this.width, this.height);
|
|
}
|
|
|
|
updatePadding() {
|
|
this.padding = 0;
|
|
}
|
|
|
|
updateBackOpacity() {
|
|
this.backOpacity = 256;
|
|
}
|
|
|
|
contentsWidth() {
|
|
return this.width;
|
|
}
|
|
|
|
contentsHeight() {
|
|
return this.height;
|
|
}
|
|
|
|
selectDefault() {
|
|
log(`selectDefault`);
|
|
if (!!this.commands) {
|
|
this.select(0);
|
|
} else {
|
|
super.selectDefault();
|
|
}
|
|
}
|
|
|
|
updateBackground() {
|
|
// DO NOTHING
|
|
log(`updateBackGround`);
|
|
}
|
|
|
|
select(index) {
|
|
super.select(index);
|
|
this.paint();
|
|
log(`select: index = ${index}`);
|
|
}
|
|
|
|
windowY() {
|
|
return this.y;
|
|
}
|
|
|
|
callOkHandler() {
|
|
if (!!this.commands) {
|
|
log(`callOkHandler: index = ${this._index}`);
|
|
const command = this.commands[this._index];
|
|
if (!!command.ext && typeof command.ext === 'function') {
|
|
command.ext(this._index);
|
|
}
|
|
} else {
|
|
super.callOkHandler();
|
|
}
|
|
}
|
|
|
|
callCancelHandler() {
|
|
if (!!this.commands) {
|
|
SceneManager.pop();
|
|
} else {
|
|
super.callCancelHandler();
|
|
}
|
|
}
|
|
|
|
makeCommandList() {
|
|
if (!!this.commands) {
|
|
for (const command of this.commands) {
|
|
this.addCommand(command.name, command.symbol, command.enabled, command.ext);
|
|
}
|
|
} else {
|
|
super.makeCommandList();
|
|
}
|
|
this.updatePlacement();
|
|
}
|
|
|
|
drawText(text, x, y, maxWidth, align) {
|
|
this.contents.outlineWidth = 2;
|
|
this.contents.fontSize = 38;
|
|
this.contents.drawText(text, x, y, maxWidth, this.lineHeight(), align);
|
|
}
|
|
|
|
drawItem(index) {
|
|
const rect = this.itemLineRect(index);
|
|
const enabled = !this.commands || this.commands[index].enabled;
|
|
this.contents.paintOpacity = enabled ? 255 : PluginUtils.percent(255, 60);
|
|
this.contents.textColor = (index === this._index && enabled) ? ColorManager.normalColor() : UNSELECTED_TEXT_COLOR;
|
|
this.drawText(this.commandName(index), rect.x, rect.y, rect.width, 'center');
|
|
}
|
|
|
|
windowX() {
|
|
const width = this.windowWidth();
|
|
return (Graphics.width - width) / 2;
|
|
}
|
|
|
|
windowWidth() {
|
|
return this.maxChoiceWidth();
|
|
}
|
|
|
|
fittingHeight(numLines) {
|
|
log(`CustomChoiceList.fittingHeight: numLines = ${numLines}`);
|
|
if (!!this.bgImage) {
|
|
return numLines * this.itemHeight();
|
|
} else {
|
|
return super.fittingHeight(numLines);
|
|
}
|
|
}
|
|
|
|
numVisibleRows() {
|
|
if (!!this.commands) {
|
|
const length = this.commands.length;
|
|
return Math.min(length, this.maxLines());
|
|
} else {
|
|
return super.numVisibleRows();
|
|
}
|
|
}
|
|
|
|
maxChoiceWidth() {
|
|
if (!!this.bgImage && this.bgImage._loadingState === "loaded") {
|
|
return this.bgImage.width;
|
|
} else {
|
|
return 96;
|
|
}
|
|
}
|
|
|
|
setCancellable(enable) {
|
|
this.cancellable = enable;
|
|
}
|
|
|
|
isCancelEnabled() {
|
|
return this.cancellable;
|
|
}
|
|
|
|
paint() {
|
|
this.contents.clear();
|
|
this.drawAllItems();
|
|
}
|
|
|
|
update() {
|
|
super.update();
|
|
}
|
|
}
|
|
window.Window_CustomChoiceList = Window_CustomChoiceList;
|
|
})();
|