/* * 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