princess-knight/js/plugins/GABA_EventDisplayName.js
2024-10-03 21:18:24 -05:00

425 lines
12 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.

//=============================================================================
// RPG Maker MZ - Event Display Name
//=============================================================================
/*:
* @target MZ
* @plugindesc Show name above the event.
* @author gabacho(Ichiro Meiken)
* @url https://star-write-dream.com/
* @help GABA_EventDisplayName.js(ver1.0.0)
*
* Show name above the event.
*
* --------------------------
* Copyright (c) 2020 Gabacho(Ichiro Meiken)
* Released under the MIT license
* https://opensource.org/licenses/mit-license.php
* --------------------------
*
* @param nameFontSize
* @text Name font size
* @type number
* @desc Enter the font size of the name.(Default:16)
* @default 16
*
* @param nameFontColor
* @text Name font color
* @type number
* @desc Enter the font color of the name. (Default:0) The same as the method for specifying the message font color.
* @default 0
*
* @param nameOutlineColor
* @text Name outline color
* @type number
* @desc Enter the outline color of the name. (Default:19) The same as the method for specifying the message font color.
* @default 19
*
* @param nameDisplayWidth
* @text Name display width
* @type number
* @desc Enter the display width of the name. (Default:80) If it does not fit, the font is reduced.
* @default 80
*
* @param par
* @text Background setting
*
* @param paddingX
* @parent par
* @text Padding of background (left and right)
* @type number
* @desc Enter the left and right padding of the background in pixels. (Default: 4)
* @default 4
*
* @param paddingY
* @parent par
* @text Padding of background (top and bottom)
* @type number
* @desc Enter the top and bottom padding of the background in pixels. (Default: 4)
* @default 4
*
* @param baseColor
* @parent par
* @text Bace color
* @type struct<Color>
* @desc Background base color
* @default {"red":"0","green":"0","blue":"255", "opacity":"0.8"}
*
* @param gradationColor
* @parent par
* @text Gradient color
* @type struct<Color>
* @desc Background gradient color
* @default {"red":"0","green":"0","blue":"0", "opacity":"0.8"}
*
* @param verticalMode
* @parent par
* @text Gradation in the vertical direction
* @type boolean
* @desc ON:Vertical OFF:Horizontal
* @on ON
* @off OFF
* @default true
*
*/
/*:ja
* @target MZ
* @plugindesc イベントの上部にテキストを表示します。
* @author ガバチョ(溟犬一六)
* @url https://star-write-dream.com/
*
* @help GABA_EventDisplayName.js(ver1.0.0)
*
* イベントの上方に任意のテキストを表示します。
* イベントのメモ欄に<dn:なまえ>と入力してください。
*
* イベントの画像が(なし)だと表示されません。
* 移動イベントなど画像不要で名前を表示したい場合は、
* 透明の画像を選択してください。
*
* プラグインコマンドはありません。
*
* --------------------------
* Copyright (c) 2020 Gabacho(Ichiro Meiken)
* Released under the MIT license
* https://opensource.org/licenses/mit-license.php
* --------------------------
*
* @param nameFontSize
* @text フォントサイズ
* @type number
* @desc フォントサイズを指定します。初期値16
* @default 16
*
* @param nameFontColor
* @text フォントカラー
* @type number
* @desc フォントカラーを指定します。初期値0メッセージのフォントカラーの指定方法と同じです。
* @default 0
*
* @param nameOutlineColor
* @text アウトラインカラー
* @type number
* @desc アウトラインカラーを指定します。初期値19メッセージのフォントカラーの指定方法と同じです。
* @default 19
*
* @param nameDisplayWidth
* @text 表示幅
* @type number
* @desc 表示幅を指定します。初期値80収まらない場合はフォントが小さくなります。
* @default 80
*
* @param par
* @text 背景の設定
*
* @param paddingX
* @parent par
* @text 背景の内側余白(左右)
* @type number
* @desc 背景の左右内側余白をピクセル数で指定します。初期値4
* @default 4
*
* @param paddingY
* @parent par
* @text 背景の内側余白(上下)
* @type number
* @desc 背景の上下内側余白をピクセル数で指定します。初期値4
* @default 4
*
* @param baseColor
* @parent par
* @text ベースカラー
* @type struct<Color>
* @desc 背景の色
* @default {"red":"0","green":"0","blue":"255", "opacity":"0.8"}
*
* @param gradationColor
* @parent par
* @text グラデーションカラー
* @type struct<Color>
* @desc 背景のグラデーション用の色
* @default {"red":"255","green":"255","blue":"255", "opacity":"0.8"}
*
* @param verticalMode
* @parent par
* @text 縦方向にグラデーションする
* @type boolean
* @desc ON:縦にグラデーションします。 OFF:横にグラデーションします。
* @on ON
* @off OFF
* @default true
*
*
*/
/*~struct~Color:
*
* @param red
* @type number
* @max 255
* @desc 赤(R)。0255で指定してください。
* @default 0
* @decimals 0
*
* @param green
* @type number
* @max 255
* @desc 緑(G)。0255で指定してください。
* @default 0
* @decimals 0
*
* @param blue
* @type number
* @max 255
* @desc 青(B)。0255で指定してください。
* @default 0
* @decimals 0
*
* @param opacity
* @type number
* @max 1
* @desc 不透明度を01で指定してください。0で透明です。
* @default 1
* @decimals 1
*
*/
(() => {
"use strict";
const pluginName = "GABA_EventDisplayName";
let eventDisplayName = "";
let oldName = "";
const convertArrayParam = function (param) {
if (!param) {
return;
}
if (param !== undefined) {
try {
const array = JSON.parse(param);
for (let i = 0; i < array.length; i++) {
array[i] = JSON.parse(array[i]);
}
return array;
} catch (e) {
console.group();
console.error(
"%cParameter is invalid ! GABA_EventDisplayNameのパラメータ準備に失敗しました。",
"background-color: #5174FF"
);
console.error("Parameter:" + eval(param));
console.error("Error message :" + e);
console.groupEnd();
}
}
};
const parameters = PluginManager.parameters(pluginName);
const nameFontSize = parseInt(parameters["nameFontSize"]) || 0;
const nameFontColor = parseInt(parameters["nameFontColor"]) || 0;
const nameOutlineColor = parseInt(parameters["nameOutlineColor"]) || 15;
const nameDisplayWidth = parseInt(parameters["nameDisplayWidth"]) || 80;
const paddingX = parseInt(parameters["paddingX"]) || 0;
const paddingY = parseInt(parameters["paddingY"]) || 0;
const isVerticalMode = Boolean(
parameters["verticalMode"] === "true" || false
);
let param = {};
param.color1 = String(parameters["baseColor"]);
param.color1 = convertArrayParam(param.color1);
param.color2 = String(parameters["gradationColor"]);
param.color2 = convertArrayParam(param.color2);
const c1 =
"rgba(" +
param.color1.red +
"," +
param.color1.green +
"," +
param.color1.blue +
"," +
param.color1.opacity +
")";
const c2 =
"rgba(" +
param.color2.red +
"," +
param.color2.green +
"," +
param.color2.blue +
"," +
param.color2.opacity +
")";
function createEventDisplayNameBitmap(dispName) {
const tempWindow = new Window_Base(new Rectangle());
tempWindow.padding = 0;
tempWindow.move(
paddingX,
0,
nameDisplayWidth + paddingX * 2,
nameFontSize + paddingY * 2
);
tempWindow.createContents();
tempWindow.contents.textColor = ColorManager.textColor(nameFontColor);
tempWindow.contents.outlineColor = ColorManager.textColor(nameOutlineColor);
tempWindow.contents.fontSize = nameFontSize;
tempWindow.contents.gradientFillRect(
0,
0,
nameDisplayWidth,
nameFontSize + paddingY * 2,
c1,
c2,
isVerticalMode
);
const wNameDisplayWidth = nameDisplayWidth - paddingX * 2;
tempWindow.contents.drawText(
dispName,
paddingX,
paddingY,
wNameDisplayWidth,
nameFontSize,
"center"
);
const bitmap = tempWindow.contents;
bitmap.gaba_isEventDisplayName = true;
tempWindow.contents = null;
tempWindow.destroy();
return bitmap;
}
// Sprite_EventDisplayNameの定義
// Sprite_Balloonをベースにします
function Sprite_EventDisplayName() {
this.initialize(...arguments);
}
Sprite_EventDisplayName.prototype = Object.create(Sprite_Balloon.prototype);
Sprite_EventDisplayName.prototype.constructor = Sprite_EventDisplayName;
Sprite_EventDisplayName.prototype.initialize = function () {
Sprite.prototype.initialize.call(this);
this.initMembers();
};
Sprite_EventDisplayName.prototype.initMembers = function () {
this._target = null;
this._balloonId = 0;
this._duration = 0;
this.anchor.x = 0.45;
this.anchor.y = 1;
this.z = 9;
};
Sprite_EventDisplayName.prototype.setup = function (targetSprite, balloonId) {
this._target = targetSprite;
this._balloonId = balloonId;
this._duration = 1;
};
Sprite_EventDisplayName.prototype.update = function () {
Sprite.prototype.update.call(this);
if (this._duration > 0) {
this.updateDisplay();
this.updatePosition();
}
};
Sprite_EventDisplayName.prototype.updatePosition = function () {
this.x = this._target.x;
this.y = this._target.y - this._target.height;
};
Sprite_EventDisplayName.prototype.updateDisplay = function () {
if (this._target._character._characterName === "") {
this.bitmap.clear();
return;
}
if (this.characterName === this._target._character._characterName) {
return;
} else {
this.characterName = this._target._character._characterName;
}
const dispName = this._target._character.event().meta.dn;
this.bitmap = createEventDisplayNameBitmap(dispName);
};
// Spriteset_Map
const _Spriteset_Map_initialize = Spriteset_Map.prototype.initialize;
Spriteset_Map.prototype.initialize = function () {
_Spriteset_Map_initialize.apply(this, arguments);
this._eventDisplayNameSprites = [];
this.processEventDisplayNameRequests();
};
const _Spriteset_Map_destroy = Spriteset_Map.prototype.destroy;
Spriteset_Map.prototype.destroy = function (options) {
this.removeAllEventDisplayName();
_Spriteset_Map_destroy.apply(this, arguments);
};
Spriteset_Map.prototype.processEventDisplayNameRequests = function () {
for (let ev of $gameMap._events) {
if (ev != null) {
if (ev.event().meta.dn != null) {
this.createEventDisplayName(ev);
}
}
}
};
Spriteset_Map.prototype.createEventDisplayName = function (request) {
const targetSprite = this.findTargetSprite(request);
if (targetSprite) {
const dispName = request.event().meta.dn;
let eventDisplayNameSprite = new Sprite_EventDisplayName();
eventDisplayNameSprite.bitmap = createEventDisplayNameBitmap(dispName.replace(/_/g, ' '));
eventDisplayNameSprite.targetObject = request;
eventDisplayNameSprite.setup(targetSprite, 0);
eventDisplayNameSprite.characterName = request._characterName;
this._effectsContainer.addChild(eventDisplayNameSprite);
this._eventDisplayNameSprites.push(eventDisplayNameSprite);
}
};
Spriteset_Map.prototype.removeAllEventDisplayName = function () {
for (const sprite of this._eventDisplayNameSprites) {
this.removeEventDisplayName(sprite);
}
};
Spriteset_Map.prototype.removeEventDisplayName = function (sprite) {
this._eventDisplayNameSprites.remove(sprite);
this._effectsContainer.removeChild(sprite);
sprite.destroy();
};
})();