/*
* Copyright (c) 2023 Vladimir Skrypnikov (Pheonix KageDesu)
*
*
* License: Creative Commons 4.0 Attribution, Share Alike, Commercial
*/
/*:
* @plugindesc (v.1.0)[PRO] Visual Equipment for characters (SV battle)
* @author Pheonix KageDesu
* @target MZ MV
* @url http://kdworkshop.net/plugins/battle-equip-layers
*
* @help
* ---------------------------------------------------------------------------
*
* ===========================================================================
*
* Plugin allows change the appearance of the characters in battle by
* equipping different items. This can be used to make the characters
* look more unique, or to reflect the type of equipment they are using.
* Additionally, the plugin can also be used for cosmetic purposes and for
* adding more immersion to the gameplay.
*
* HOW TO USE:
* ---------------------------------------------------------------------------
* Add next notetags to Equipment (Armor or Weapon) or Actor
*
*
*
* Where: LAYER - layer index, any number from 0 to X
* In your game you determine by your own what part of clothes on what layer will be
* Images with higher layer will be on top of images with lower layer
* IMAGENAME - layer image name from img/sv_equipLayers folder
*
* Example:
*
* ! You can add more then one Note
*
* You can clear layer, use keyword "None" instead IMAGENAME
* (for example you want hide hair layer when equip cape)
* Example:
*
* You can make layer rule is important (other equipment's not ovveride this rule)
* Add ! after comma to end of Note
* Example:
*
* ---------------------------------------------------------------------------
* How create Animated layer:
*
* Add #FRAMES_DELAY after IMAGENAME
* Example:
*
* You should have next images in img/sv_equipLayers folder
* CoolArmor_0.png, CoolArmor_1.png, CoolArmor_2.png
* (for example with 3 frames)
*
* ---------------------------------------------------------------------------
* If you need refresh character look during battle, you can call next
* Script call: PKD_SvBattleEquip_Refresh();
* ---------------------------------------------------------------------------
* If you like my Plugins, want more and offten updates,
* please support me on Boosty or Patreon!
*
* Boosty Page:
* https://boosty.to/kagedesu
* Patreon Page:
* https://www.patreon.com/KageDesu
* YouTube Channel:
* https://www.youtube.com/channel/UCA3R61ojF5vp5tGwJ1YqdgQ?
*
* You can use this plugin in your game thanks to all who supports me!
*
* License: Creative Commons 4.0 Attribution, Share Alike, Commercial
*
*
* @param PKD_SvBattleEquipLayers
* @text
*
* @param spacer|endHolder @text @desc ===============================================
*
* @command EMPTY_HOLDER
* @text
* @desc
* @default
*/
/*:ru
* @plugindesc (v.1.0)[PRO] Визаульная экипировка в бою
* @author Pheonix KageDesu
* @target MZ MV
* @url http://kdworkshop.net/plugins/battle-equip-layers
*
* @help
* ---------------------------------------------------------------------------
*
* ===========================================================================
* Плагин позволяет изменять внешний вид персонажей в зависимости
* от экипировки, которая на них одета.
*
* Доп. графика задаётся при помощи Note (заметок)
* Брони, Оружия или Персонажа
*
*
*
* Где: LAYER - номер слоя, от 0 до Х
* Сами определите в своей игре на каком слое что у Вас будет
* Изображения с большим значением слоя будут выше изображений с меньшим
* IMAGENAME - название картинки из папки img/sv_equipLayers
*
* Пример:
*
* ! Можно задавать сразу несколько заметок
*
* Можно очистить слой, исп. ключ. слово None, заместо имени картинки
* (например если хотите скрыть волосы надевая шлем)
* Пример:
*
* Слой можно сделать важным (другие предметы экипировки не изменять его)
* Добавьте ! после запетой в конце Note
* Пример:
*
* ---------------------------------------------------------------------------
* Как создать анимированный слой:
*
* Добавьте #FRAMES_DELAY после IMAGENAME
* Пример:
*
* В папке img/sv_equipLayers должны быть след. файлы
* CoolArmor_0.png, CoolArmor_1.png, CoolArmor_2.png
* (это для примера выше, с 3 кадрами)
*
* ---------------------------------------------------------------------------
* Если нужно перерисовать экипировку персонажа в бою, можно вызвать
* следующий вызов скрипта: PKD_SvBattleEquip_Refresh();
* ---------------------------------------------------------------------------
* Если Вам нравятся мои плагины, поддержите меня на Boosty!
*
* Boosty:
* https://boosty.to/kagedesu
* Patreon:
* https://www.patreon.com/KageDesu
* YouTube:
* https://www.youtube.com/channel/UCA3R61ojF5vp5tGwJ1YqdgQ?
*
*
* Лицензия: Creative Commons 4.0 Attribution, Share Alike, Commercial
*
*
* @param PKD_SvBattleEquipLayers
* @text
*
* @param spacer|endHolder @text @desc ===============================================
*
* @command EMPTY_HOLDER
* @text
* @desc
* @default
*/
var Imported = Imported || {};
Imported.PKD_SvBattleEquipLayers = true;
var PKD_SvBattleEquipLayers = {};
PKD_SvBattleEquipLayers.Version = 100;
//?VERSION
PKD_SvBattleEquipLayers.isPro = function() { return false; };
PKD_SvBattleEquipLayers.PP = {};
PKD_SvBattleEquipLayers.Utils = {};
// * Загрзука параметров
PKD_SvBattleEquipLayers.LoadPluginSettings = () => {
PKD_SvBattleEquipLayers.PP._loader = new KDCore.ParamLoader('PKD_SvBattleEquipLayers');
};
// Generated by CoffeeScript 2.6.1
window.PKD_SvBattleEquip_Refresh = function() {
var e, i, layer, len, ref;
try {
if ($gameTemp && ($gameTemp._pBattleEqLayers != null)) {
ref = $gameTemp._pBattleEqLayers;
for (i = 0, len = ref.length; i < len; i++) {
layer = ref[i];
layer.forceRefresh();
}
}
} catch (error) {
e = error;
return console.warn(e);
}
};
// Generated by CoffeeScript 2.6.1
(function() {
var _;
//@[DEFINES]
_ = PKD_SvBattleEquipLayers.PP;
})();
//_.getParamTemplate = () -> @_loader.getParam('', true)
// Generated by CoffeeScript 2.6.1
(function() {
var _;
//@[DEFINES]
_ = PKD_SvBattleEquipLayers.Utils;
_.hasMeta = function(symbol, obj) {
return (obj != null) && (obj.meta != null) && (obj.meta[symbol] != null);
};
_.getArrayOfValuesOfSameMeta = function(symbol, obj) {
var e, i, len, line, lines, result;
try {
if (!this.hasMeta(symbol, obj)) {
return [];
}
lines = obj.note.split("\n").filter(function(l) {
return l.contains(symbol);
});
result = [];
for (i = 0, len = lines.length; i < len; i++) {
line = lines[i];
try {
line = line.replace("<" + symbol + ":", "");
line = line.replace(">", "");
result.push(line);
} catch (error) {
e = error;
console.warn(e);
}
}
return result;
} catch (error) {
e = error;
console.warn(e);
}
return [];
};
})();
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ Game_Actor.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
//$[ENCODE]
(function() {
var _;
//@[DEFINES]
_ = Game_Actor.prototype;
_.pGetSvELayers = function() {
var actorLayers, all, e, equipLayers, lasts;
try {
actorLayers = this.pGetSvELayersOfActor();
equipLayers = this.PGetSvELayersOfEquips();
lasts = equipLayers.filter(function(l) {
return l.isPriority === true;
});
all = actorLayers.concat(equipLayers).concat(lasts);
return all;
} catch (error) {
e = error;
console.warn(e);
return [];
}
};
_.pGetSvELayersOfActor = function() {
var e, layers, metadata;
try {
metadata = PKD_SvBattleEquipLayers.Utils.getArrayOfValuesOfSameMeta('bEqL', this.actor());
layers = this.pParseEqLayersMetadata(metadata);
return layers;
} catch (error) {
e = error;
console.warn(e);
return [];
}
};
_.pParseEqLayersMetadata = function(metadata) {
var converted, e, elements, i, item, layers, len, parsed;
try {
elements = function(str) {
return str.split(',').map(function(s) {
return s.trim();
});
};
parsed = [];
for (i = 0, len = metadata.length; i < len; i++) {
item = metadata[i];
try {
layers = elements(item);
converted = {
index: parseInt(layers[0]),
filename: layers[1],
isPriority: layers[2] === '!'
};
} catch (error) {
e = error;
console.warn(e);
converted = null;
}
if (converted != null) {
parsed.push(converted);
}
}
return parsed;
} catch (error) {
e = error;
console.warn(e);
return [];
}
};
_.PGetSvELayersOfEquips = function() {
var e, equips, i, index, len, metadata, parsed, values;
try {
equips = $gameParty.leader().equips();
metadata = [];
for (index = i = 0, len = equips.length; i < len; index = ++i) {
e = equips[index];
if (e == null) {
continue;
}
try {
values = PKD_SvBattleEquipLayers.Utils.getArrayOfValuesOfSameMeta('bEqL', e);
} catch (error) {
e = error;
console.warn(e);
values = null;
}
if (values != null) {
metadata.push(...values);
}
}
parsed = this.pParseEqLayersMetadata(metadata);
return parsed;
} catch (error) {
e = error;
console.warn(e);
return [];
}
};
})();
// ■ END Game_Actor.coffee
//---------------------------------------------------------------------------
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ ImageManager.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
(function() {
var _;
//@[DEFINES]
_ = ImageManager;
_.loadPKDSVELayer = function(filename) {
return this.loadBitmap('img/sv_equipLayers/', filename);
};
})();
// ■ END ImageManager.coffee
//---------------------------------------------------------------------------
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ Scene_Battle.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
(function() {
var ALIAS__stop, _;
//@[DEFINES]
_ = Scene_Battle.prototype;
//@[ALIAS]
ALIAS__stop = _.stop;
_.stop = function() {
ALIAS__stop.call(this, ...arguments);
return $gameTemp._pBattleEqLayers = null;
};
})();
// ■ END Scene_Battle.coffee
//---------------------------------------------------------------------------
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ Scene_Boot.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
(function() {})();
// ■ END Scene_Boot.coffee
//---------------------------------------------------------------------------
//@[DEFINES]
//_ = Scene_Boot::
//@[ALIAS]
/*ALIAS__start = _.start
_.start = ->
ALIAS__start.call(@, ...arguments)
PKD_SvBattleEquipLayers.LoadPluginSettings()
return*/
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ Sprite_Actor.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
(function() {
var ALIAS__createMainSprite, ALIAS__setBattler, ALIAS__updateFrame, _;
//$[ENCODE]
//@[DEFINES]
_ = Sprite_Actor.prototype;
//@[ALIAS]
ALIAS__createMainSprite = _.createMainSprite;
_.createMainSprite = function() {
ALIAS__createMainSprite.call(this, ...arguments);
this._pCreateLayersSprite();
};
//@[ALIAS]
ALIAS__setBattler = _.setBattler;
_.setBattler = function(battler) {
this.__pPrev = this._actor;
ALIAS__setBattler.call(this, ...arguments);
this._pOnNewBattlerSetted(battler);
};
//@[ALIAS]
/*ALIAS__updateBitmap = _.updateBitmap
_.updateBitmap = ->
__prevBitmap = @_mainSprite.bitmap
ALIAS__updateBitmap.call(@, ...arguments)
if __prevBitmap != @_mainSprite.bitmap
@_pOnMainSprBitmapChanged()
return*/
//@[ALIAS]
ALIAS__updateFrame = _.updateFrame;
_.updateFrame = function() {
ALIAS__updateFrame.call(this, ...arguments);
return this._pOnMainSprUpdateFrame();
};
})();
// ■ END Sprite_Actor.coffee
//---------------------------------------------------------------------------
// Generated by CoffeeScript 2.6.1
//╒═════════════════════════════════════════════════════════════════════════╛
// ■ Sprite_Actor.coffee
//╒═════════════════════════════════════════════════════════════════════════╛
//---------------------------------------------------------------------------
(function() {
var _;
//@[DEFINES]
_ = Sprite_Actor.prototype;
_._pOnNewBattlerSetted = function(battler) {
var ref;
if (battler === this.__pPrev) {
return;
}
if (battler != null) {
return (ref = this._pEqLayers) != null ? ref.setBattler(battler) : void 0;
} else {
return this._pOnMainSprBitmapNull();
}
};
_._pCreateLayersSprite = function() {
if ($gameTemp._pBattleEqLayers == null) {
$gameTemp._pBattleEqLayers = [];
}
this._pEqLayers = new Sprite_PKD_SvBELayers();
this._mainSprite.addChild(this._pEqLayers);
$gameTemp._pBattleEqLayers.push(this._pEqLayers);
};
_._pOnMainSprBitmapNull = function() {
var ref;
if ((ref = this._pEqLayers) != null) {
ref._destroyLayers();
}
};
_._pOnMainSprBitmapChanged = function() {}; // * NOT USED, commented, yet
_._pOnMainSprUpdateFrame = function() {
var ref;
return (ref = this._pEqLayers) != null ? ref.refreshFrame(this._mainSprite._frame) : void 0;
};
})();
// ■ END Sprite_Actor.coffee
//---------------------------------------------------------------------------
// Generated by CoffeeScript 2.6.1
var Sprite_PKD_SvBELayerAnimated;
Sprite_PKD_SvBELayerAnimated = class Sprite_PKD_SvBELayerAnimated extends Sprite {
constructor(imageName) {
var e;
super();
this._frameIndex = 0;
this._timer = 0;
this._timerMax = 0;
try {
this._createFromParameters(imageName);
} catch (error) {
e = error;
console.warn(e);
this.disableAnimation();
}
return;
}
disableAnimation() {
this.bitmap = null;
return this._timer = null;
}
update() {
super.update();
if (this._timer != null) {
this._updateFrameTick();
}
}
_updateFrameTick() {
this._timer++;
if (this._timer >= this._timerMax) {
this._timer = 0;
this._frameTick();
}
}
_createFromParameters(imageName) {
var bitmapNameMain, delayBtwFrames, framesCount, parts, values;
values = imageName.split('#');
parts = values[1].split("_").map(function(i) {
return i.trim();
});
bitmapNameMain = values[0];
framesCount = parseInt(parts[0]);
delayBtwFrames = parseInt(parts[1]);
if (framesCount > 0 && delayBtwFrames > 0) {
this._loadBitmaps(bitmapNameMain, framesCount);
this._refreshFrameIndex();
this._timer = 0;
this._timerMax = delayBtwFrames;
}
}
_loadBitmaps(name, count = 1) {
var i, j, ref;
this._frames = [];
for (i = j = 0, ref = count; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {
this._frames.push(ImageManager.loadPKDSVELayer(name + "_" + i));
}
}
_refreshFrameIndex() {
var e;
try {
this.bitmap = this._frames[this._frameIndex];
} catch (error) {
e = error;
console.warn(e);
try {
this.bitmap = this._frames[0];
} catch (error) {
e = error;
console.warn(e);
this.disableAnimation();
}
}
}
_frameTick() {
this._frameIndex++;
if (this._frameIndex >= this._frames.length) {
this._frameIndex = 0;
}
this._refreshFrameIndex();
}
};
// Generated by CoffeeScript 2.6.1
//$[ENCODE]
var Sprite_PKD_SvBELayers;
Sprite_PKD_SvBELayers = class Sprite_PKD_SvBELayers extends Sprite {
constructor() {
super();
this._layers = [];
this.anchor.x = 0.5;
this.anchor.y = 1;
return;
}
setBattler(battler) {
if (this._battler !== battler) {
this._battler = battler;
this._createLayers();
}
}
forceRefresh() {
console.log("Layers refreshed");
return this._createLayers();
}
_createLayers() {
var finalize, i, layer, layers, len, preLayers;
this._destroyLayers();
if (this._battler == null) {
return;
}
layers = this._battler.pGetSvELayers();
preLayers = [];
for (i = 0, len = layers.length; i < len; i++) {
layer = layers[i];
if (layer.filename === "None") {
preLayers[layer.index] = null;
} else {
preLayers[layer.index] = layer.filename;
}
}
finalize = preLayers.filter(function(l) {
return l != null;
});
this._addLayers(finalize);
}
_addLayers(finalize) {
var filename, i, layer, len;
for (i = 0, len = finalize.length; i < len; i++) {
filename = finalize[i];
if (filename.contains("#")) {
layer = new Sprite_PKD_SvBELayerAnimated(filename);
} else {
layer = new Sprite(ImageManager.loadPKDSVELayer(filename));
}
layer.anchor.x = 0.5;
layer.anchor.y = 1;
this.addChild(layer);
this._layers.push(layer);
}
}
refreshFrame(frame) {
var height, i, l, len, ref, results, width, x, y;
if (frame == null) {
return;
}
({x, y, width, height} = frame);
ref = this._layers;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
l = ref[i];
results.push(l.setFrame(x, y, width, height));
}
return results;
}
_destroyLayers() {
var i, layer, len, ref;
if (this._layers.length === 0) {
return;
}
ref = this._layers;
for (i = 0, len = ref.length; i < len; i++) {
layer = ref[i];
this.removeChild(layer);
layer.visible = false;
}
this._layers = [];
}
};
//Plugin PKD_SvBattleEquipLayers builded by PKD PluginBuilder 2.2 - 21.01.2023