You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
6.5 KiB
JavaScript

/*:
@plugindesc 将ATB量规更改为一条线
@author うなぎおおとろ(twitter https://twitter.com/unagiootoro8388)
@param viewMode
@type string
@default wide
@desc
wideを設定すると、横にラインを表示します。longを設定すると、縦にラインを表示します。
@param useLineImage
@type boolean
@default false
@desc
trueを設定すると、ラインに画像を使用します。
@param lineImageFileName
@type string
@default line
@desc
ラインに画像を使用する場合、画像のファイル名を指定します。
横方向の場合「720, 32」、縦方向の場合「32, 384」の画像を使用してください。
@param defaultEnemyIconFileName
@type number
@default Monster
@desc
敵キャラアイコンに使用するキャラクター画像のファイル名を指定します。
@param defaultEnemyIconX
@type number
@default 7
@desc
敵キャラアイコンに使用する画像のX方向インデックスを指定します。
@param defaultEnemyIconY
@type number
@default 4
@desc
敵キャラアイコンに使用する画像のY方向インデックスを指定します。
@help
このプラグインは、「ATB.js」の導入が必要です。
「ATBLine.js」は、「ATB.js」よりも後に入れてください。
敵キャラのメモ欄に
<battlerIcon: ["角色图像文件名", X方向索引, Y方向索引]>
指定的话,可以设定任意的敌人角色图标。
<battlerIcon: ["Evil", 7, 4]
【ライセンス】
このプラグインは、MITライセンスの条件の下で利用可能です。
【更新履歴】
v1.0.0 新規作成
*/
{
const param = PluginManager.parameters("ATBLine");
const viewMode = param["viewMode"];
const useLineImage = (param["useLineImage"] === "true" ? true : false);
const lineImageFileName = param["lineImageFileName"];
const defaultEnemyIconFileName = param["defaultEnemyIconFileName"];
const defaultEnemyIconX = parseInt(param["defaultEnemyIconX"]);
const defaultEnemyIconY = parseInt(param["defaultEnemyIconY"]);
ATBConfig.drawEnemyUnderGauge = true;
ATBConfig.drawUnderGauge = true;
Game_Actor.prototype.battlerIconName = function() {
return this.characterName();
};
Game_Actor.prototype.characterBlockX = function() {
return this.characterIndex() % 4 * 3;
};
Game_Actor.prototype.characterBlockY = function() {
return Math.floor(this.characterIndex() / 4) * 4;
};
Game_Enemy.prototype.battlerIconName = function() {
if (!this.enemy().meta.battlerIcon) return defaultEnemyIconFileName;
return JSON.parse(this.enemy().meta.battlerIcon)[0];
};
Game_Enemy.prototype.characterBlockX = function() {
if (!this.enemy().meta.battlerIcon) return defaultEnemyIconX;
return JSON.parse(this.enemy().meta.battlerIcon)[1];
};
Game_Enemy.prototype.characterBlockY = function() {
if (!this.enemy().meta.battlerIcon) return defaultEnemyIconY;
return JSON.parse(this.enemy().meta.battlerIcon)[2];
};
class Sprite_ATBLine extends Sprite {
static get LINE_WIDTH() {
if (viewMode === "wide") {
return Graphics.width - 96;
} else {
return 32;
}
};
static get LINE_HEIGHT() {
if (viewMode === "wide") {
return 32;
} else {
return Graphics.height - 240;
}
};
initialize() {
const bitmap = this.createBitmap();
super.initialize(bitmap);
if (viewMode === "wide") {
this.x = 48;
this.y = 24;
} else {
this.x = Graphics.width - 48;
this.y = 24;
}
}
createBitmap() {
let bitmap;
if (useLineImage) {
bitmap = ImageManager.loadPicture(lineImageFileName);
} else {
bitmap = new Bitmap(Sprite_ATBLine.LINE_WIDTH, Sprite_ATBLine.LINE_HEIGHT);
if (viewMode === "wide") {
bitmap.fillRect(0, 8, Sprite_ATBLine.LINE_WIDTH, 8, "#000000");
} else {
bitmap.fillRect(8, 0, 8, Sprite_ATBLine.LINE_HEIGHT, "#000000");
}
}
return bitmap;
}
}
class Sprite_LineIcon extends Sprite {
static get BATTLER_ICON_WIDTH() { return 48 };
static get BATTLER_ICON_HEIGHT() {
if (viewMode === "wide") {
return Sprite_ATBLine.LINE_HEIGHT;
} else {
return 32;
}
};
initialize(gauge, x, y) {
this._gauge = gauge;
const bitmap = this.loadCharacterBitmap(gauge.battler());
super.initialize(bitmap);
this.setupBattlerIcon(gauge.battler(), gauge.purpose);
this._baseX = x;
this._baseY = y;
this.x = x;
this.y = y;
}
update() {
super.update();
this.updatePosition();
if (!this._gauge.isUsable()) this.visible = false;
}
updatePosition() {
if (viewMode === "wide") {
this.x = this._baseX + (this._gauge.value / 1000) * (Sprite_ATBLine.LINE_WIDTH - Sprite_LineIcon.BATTLER_ICON_WIDTH);
} else {
this.y = this._baseY - (this._gauge.value / 1000) * (Sprite_ATBLine.LINE_HEIGHT - Sprite_LineIcon.BATTLER_ICON_HEIGHT / 2);
}
}
loadCharacterBitmap(battler) {
return ImageManager.loadCharacter(battler.battlerIconName());
}
setupBattlerIcon(battler, gaugePurpose) {
const px = battler.characterBlockX() * 48;
const py = battler.characterBlockY() * 48;
this.setFrame(px, py, 48, 32);
}
}
/* class Spriteset_Battle */
const _Spriteset_Battle_initialize = Spriteset_Battle.prototype.initialize;
Spriteset_Battle.prototype.initialize = function() {
_Spriteset_Battle_initialize.call(this);
this._atbLine = new Sprite_ATBLine();
this._baseSprite.addChild(this._atbLine);
}
Spriteset_Battle.prototype.createGaugeLine = function(battler) {
if (viewMode === "wide") {
this._baseSprite.addChild(new Sprite_LineIcon(battler.gauge(), this._atbLine.x, this._atbLine.y - 8));
} else {
this._baseSprite.addChild(new Sprite_LineIcon(battler.gauge(), this._atbLine.x - 12, Sprite_ATBLine.LINE_HEIGHT));
}
};
};