//============================================================================= // Yanfly Engine Plugins + TheGreenKel - DragonBones Battle Integration // KELYEP_DragonBones.js //============================================================================= var Imported = Imported || {}; Imported.KELYEP_DragonBones = true; var Yanfly = Yanfly || {}; Yanfly.KelBattle = Yanfly.KelBattle || {}; Yanfly.KelBattle.version = 1.09; //============================================================================= /*: * @plugindesc v1.09 DragonBones Integration with YEP library compatibility! * Use DragonBones assets with your battlers! * @author Yanfly Engine Plugins + TheGreenKel Collaboration * * @param ---General--- * @default * * @param Assets Path * @parent ---General--- * @desc The folder that store all of the files exported from * DragonBones Software 5.2 (or greater) * @default ./dragonbones_assets/ * * @param Support UpperCase Animation Names * @text UpperCase Animation Names * @parent ---General--- * @type boolean * @on Support * @off Don't * @desc If your animation names are all lowercase, then turn this * off for much better performance. ON - true OFF - false * @default true * * @param Debug Console Text * @parent ---General--- * @type boolean * @on Show * @off Hide * @desc Show various status updates on the console? * SHOW - true HIDE - false * @default false * * @param ---Preload--- * @default * * @param Preload Assets * @parent ---Preload--- * @type text[] * @desc This is a list of all DragonBones assets to be preloaded at * game launch after the database is fully loaded. * @default [] * * @param Auto-Preload Battlers * @parent ---Preload--- * @type boolean * @on Auto-Preload * @off Manual-Preload * @desc Automatically preload battlers when assigned an asset from * notetags? Recommended: true YES - true NO - false * @default true * * @param ---Defaults--- * @default * * @param Replace Battler Sprite * @parent ---Defaults--- * @type boolean * @on Replace * @off Keep * @desc Fully replace the battler's sprite if it has an associated * DragonBones asset? REPLACE - true KEEP - false * @default true * * @param Default ScaleX * @parent ---Defaults--- * @type number * @decimals 1 * @desc The default amount to scale a DragonBones battler's X property. * @default 0.5 * * @param Default ScaleY * @parent ---Defaults--- * @type number * @decimals 1 * @desc The default amount to scale a DragonBones battler's Y property. * @default 0.5 * * @param Default Width * @parent ---Defaults--- * @type number * @desc The default amount to set a DragonBones battler's width. * @default 100 * * @param Default Height * @parent ---Defaults--- * @type number * @desc The default amount to scale a DragonBones battler's height. * @default 100 * * @help * ============================================================================ * Introduction * ============================================================================ * * DragonBones allows your games to use skeletal animation, a type of computer * animation in which a character (or object) is represented by skins/textures * and a digital set of interconnected bones (called the skeleton). Using a set * of instructions, the game will create animations based off these skins, * skeletons, and instructions to create beautifully smooth and light-weight * movements. * * This plugin, made by TheGreenKel, and collaborated with Yanfly, will allow * you to use skeletal animations made by DragonBones for your battle system! * This means that with skeletal animation, you can make your battles look * extremely fluid, more flexible animations outside of only 3 frames per * motion, more than 18 possible motions, get rid of sprite based resources for * faster loading times, and smaller file sizes for your games! In other words, * there's practically no drawback to using it provided you have the resources. * * This is a collaboration plugin by TheGreenKel and Yanfly to ensure * compatibility with the Yanfly Engine Plugins library. * * ============================================================================ * MIT License and Terms of Use * ============================================================================ * * MIT License for the remaining code of the Plugin * * Copyright 2017 TheGreenKel * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * * Yanfly Engine Plugins Terms of Use * * Any original material made by Yanfly is free for use with both free and * commercial RPG Maker games unless specified otherwise. I do not demand * royalties or special liberties if you choose to use Yanfly original content * in your commercial games. (Although a free copy of your game would be nice!) * I only ask that you provide 'Yanfly' or 'Yanfly Engine' a spot in your * game’s credits. * * Any edits made to Yanfly original material are okay as long as you still * provide the proper credit. Any non-Original content posted, linked, or * shared on my website and channel will still require you to contact the * respective parties for permission of use. * * ============================================================================ * Installation Instructions * ============================================================================ * * Follow these instructions to integrate DragonBones into your game: * * 1. Make sure you have at least RPG Maker MV version 1.4.0 or above. * Recommended version is 1.5.0 and above! * * 2. Download the Installation Pack from Yanfly.moe or from: * https://thegreenkel.itch.io/dragonbones-rpg-maker-mv-plugin * * 3. Extract the Installation Pack using WinZip or WinRar. * * 4. Copy the contents of the 'js' folder into your project's folder matching * the directory structure and files. * * 5. Open up your game project's index.html file with Notepad/HTML editor * * 6. Find * * * 7. Install this plugin by adding it through your Plugin Manager. * * 8. Make sure this plugin is located UNDER the following plugins: * YEP_BattleEngineCore * YEP_X_ActSeqPack1 * YEP_X_ActSeqPack2 * YEP_X_ActSeqPack3 * YEP_X_AnimatedSVEnemies * * 9. Copy the DragonBone assets from the Installation pack into the respective * folder you wish for your game project. Adjust the 'Assets Path' plugin * parameter to match the folder path. * * 10. Save your game project! * * ============================================================================ * General Usage by TheGreenKel * ============================================================================ * * The plugin is only tested on DragonBones 5.2 & 5.3. I rewrote a chunk of the * plugin to make it compatible with Yanfly plugins, and possibly more. * * Usage: * 1) After confirming your DragonBones Armature/Skeleton shares the name of * your Battler, export DragonBones data (with Data Version set to 5.0) * into the 'Assets Path' parameter. Default is 'dragonbones_assets' * * 2) Add the new armature data into 'Preload Assets' parameter * * 3) This plugin will automatically look for the 18 default * animations inside the dragonbones armature. * [walk, swing, damage, dead, wait, chant, guard, etc.] * * 4) You can overwrite default animation by using * 'dragonbone_ani_' notes. * Example: 'dragonbone_ani_walk:steady', the 'steady' animation * will be played inplace of the 'walk' * * 5) Vanilla actor/enemies now show up by default. You need to * replace it with a blank image. Check the demo project to see * what a blank image would look like. This change will make this * plugin more compatible with plugins that changes UI. * * 6) If you are using Yanfly Action Sequence 2, you can now play any * dragonbones' animation using the 'motion' command. * Example: "motion dance". The game will look into the dragonbones * armature to see if it has the 'dance' animation. If the animation * is there then the animation will be played. * * 7) You can now control whether an animation is looping or not * by setting the 'Play Times' variable inside the Dragonbones Editor. * * 8) Get more info/tutorial at forum link: * https://forums.rpgmakerweb.com/index.php?threads/rmmv-dragonbones-2d-animation-integration.81027/ * * Important DragonBones Animation note: * A limitation of DragonBones Data version 5.0 is that you must use * the same animation curves for position/rotation/scale keys. * Below is an example of how the DragonBones and exported version * differ because it prioritized the positions animation curve. * https://gyazo.com/fd3539028c0ecadd2a727b99ac8398a4 * https://gyazo.com/e79427f5f5b5e4b56a15dfc2bf76253f * * ============================================================================ * Notetags * ============================================================================ * * Use the following notetags to make full use of your DragonBone battler * integration for your RPG Maker MV game! * * Actor and Enemy Notetags: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * * - Sets the DragonBones associated with this actor/enemy to be "name". The * name will be associated with the assets used. It will be used to check for * associated filenames that end with _ske.json, _tex.json, and _tex.png. The * listed assets must be found in your assets folder. * * * Note: The name is case sensitive. * * Note: If the plugin parameter 'Auto-Preload Battlers' is set to 'true', * then this will add the battler to the list of assets to be preloaded. * * **EXAMPLES** * * * * * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * If a DragonBones battler is not detected here, it will not be able to * utilize the following notetags and their effects. * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * * - Replace 'n' with a number. It can be positive or negative, whole or * decimal number. This will affect how much the battler will be scaled by. * A number less than 1 will be smaller than the base asset itself while a * number larger than 1 will be larger than the base asset. If the number is * negative, it will be mirrored horizontally or vertically depending if * ScaleX or ScaleY is used respectively. * * * Note: This will overwrite the setting set in the plugin parameters for * 'Default ScaleX' and 'Default ScaleY'. * * **EXAMPLES** * * * * * * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * * - This allows you to set the 'width' and 'height' of the DragonBones * battler by replacing 'x' with an integar value. This value is mostly used * for collision purposes as well as mouse click activation. These values can * be adjusted because each battler can be a dynamic width/height so it is * important for you to adjust them properly. If not adjusted, they will take * on the default width/height values found in the plugin parameters. * * **EXAMPLES** * * * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * * - Lets you decide if you want to keep the original sprite used for the * actor/enemy or have the DragonBone battler replace it altogether. If you * opt to replace the sprite, then the sprite will be hidden during battle * as long as there is a DragonBone battler in place of it. * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * - Replace 'motion' with a proper battler motion name. 'animation' is to be * replaced with a skeletal animation name from DragonBones. This is for any * motion that doesn't have a specified skeletal animation of the same name * in DragonBones. * * Replace 'motion' with one of the following: * attack * walk thrust escape * wait swing victory * chant missile dying * guard skill abnormal * damage spell sleep * evade item dead * * * Note: The 'animation' to be replaced is case sensitive. * * **EXAMPLES** * * * * * * * * * * * * * * * * * * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * For those who want a more condensed way to adjust the DragonBone battler * settings, you can use the following notetag format: * * * Battler: name // The name used for the DB battler * * ScaleX: 0.3 // Scale X used for the DB battler * ScaleY: 0.3 // Scale Y used for the DB battler * Width: 150 // Width used for the DB battler * Height: 180 // Height used for the DB battler * * // Below are a bunch of battler motions tied to skeletal animations * * Ani Attack: normalAttack * Ani Walk: steady * Ani Damage: hit * Ani Dead: dead * Ani Wait: steady * Ani Chant: stun * Ani Swing: stun * Ani Evade: stun * Ani Thrust: stun * Ani Missile: stun * Ani Skill: stun * Ani Spell: stun * Ani Item: stun * Ani Victory: stun * Ani Dying: stun * Ani Abnormal: stun * Ani Sleep: stun * * Keep Sprite // Allow the sprite to show alongside DB battler * Replace Sprite // Hide the sprite while the DB battler is active * * * - Anything placed in between the notetags: and * will be used to determine the properties set for * the DragonBone battler used for the actor/enemy. With the exception of the * 'name' property, all other properties are optional and can be omitted from * the list of properties to sandwich inbetween your notetags. * * **EXAMPLES** * * * Battler: Ubbie * Replace Sprite * ScaleX: -0.2 * ScaleY: 0.2 * Width: 150 * Height: 100 * * * * Battler: Demon * Replace Sprite * ScaleX: 0.3 * ScaleY: 0.3 * Width: 140 * Height: 140 * * * * Battler: Swordsman * Replace Sprite * ScaleX: -0.4 * ScaleY: 0.4 * Width: 150 * Height: 180 * * * ============================================================================ * Changelog * ============================================================================ * * Version 1.09; * - Bugfix updated by SwiftIllusion to make sure blend color are inherited * by actor Dragonbones sprites. * * Version 1.08: * - Bugfix by Irina & SwiftIllusion for Flash Colors on Dragonbones battlers * * Version 1.07: * - Bugfixed for animation height rate for Dragonbones battlers. * * Version 1.06: * - Bugfix for Action Sequences for Jump and Float not affecting units with * DragonBones battlers. * * Version 1.05: * - Bugfix provided for crashes made by animations played on non-battler * sprites. * * Version 1.04: * - Bugfix provided by SwiftIllusion regarding the animation positioning on * DragonBones battlers. * * Version 1.03: * - Fixed an issue with state sprites appearing behind DragonBones assets. * * Version 1.02: * - Change to collapse effect occuring after death animation is completed so * that it fades away like normal instead of being stuck on the field. * Credits: Swift Illusion * * Version 1.01: * - If using YEP_X_AnimatedSVEnemies, enemies with DragonBones battlers will * be considered animated enemies, too. * * Version 1.00: * - Finished Plugin! */ //============================================================================= if (Utils.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= "1.3.5") { //============================================================================= // Parameter Variables // ---------------------------------------------------------------------------- // Code provided by TheGreenKel and Yanfly //============================================================================= var dragonBonesIntegration = []; dragonBonesIntegration.ArmatureDatabaseEnemy = []; dragonBonesIntegration.ArmatureDatabaseActor = []; dragonBonesIntegration.currentLoadIndex = 0; dragonBonesIntegration.lastFileName = ''; dragonBonesIntegration.bIsPreloading = false; Yanfly.Parameters = PluginManager.parameters('KELYEP_DragonBones'); dragonBonesIntegration.AssetsPath = String(Yanfly.Parameters['Assets Path']); dragonBonesIntegration.supportUpperCaseNames = JSON.parse(Yanfly.Parameters['Support UpperCase Animation Names']); dragonBonesIntegration.consoleDebug = JSON.parse(Yanfly.Parameters['Debug Console Text']); dragonBonesIntegration.AssetsArray = JSON.parse(Yanfly.Parameters['Preload Assets']); dragonBonesIntegration.autoPreloadBattlers = JSON.parse(Yanfly.Parameters['Auto-Preload Battlers']); dragonBonesIntegration.ReplaceBattleSprite = JSON.parse(Yanfly.Parameters['Replace Battler Sprite']); dragonBonesIntegration.DefaultScaleX = Number(Yanfly.Parameters['Default ScaleX']); dragonBonesIntegration.DefaultScaleY = Number(Yanfly.Parameters['Default ScaleY']); dragonBonesIntegration.DefaultWidth = Number(Yanfly.Parameters['Default Width']); dragonBonesIntegration.DefaultHeight = Number(Yanfly.Parameters['Default Height']); //============================================================================= // DataManager // ---------------------------------------------------------------------------- // Code provided by TheGreenKel and Yanfly //============================================================================= Yanfly.KelBattle.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!Yanfly.KelBattle.DataManager_isDatabaseLoaded.call(this)) return false; if (!Yanfly._loaded_KELYEP_DragonBones) { this.processDragonBonesBattleIntegrationNotetags1($dataActors); this.processDragonBonesBattleIntegrationNotetags1($dataEnemies); dragonBonesIntegration.PreLoadAllArmatures(); Yanfly._loaded_KELYEP_DragonBones = true; } if (dragonBonesIntegration.bIsPreloading === true) { //console.log('Running isDatabaseLoaded'); return false; } return true; }; DataManager.processDragonBonesBattleIntegrationNotetags1 = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); this.processDragonBonesDefaults(obj); var evalMode = 'none'; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; // Standard Notetags if (line.match(/<(?:DB|DRAGONBONE)[ ](?:BATTLER|SKIN|NAME):[ ]*(.*)>/i)) { obj.meta.dragonbone = String(RegExp.$1).trim(); } else if (line.match(/<(?:DB|DRAGONBONE):[ ]*(.*)>/i)) { obj.meta.dragonbone = String(RegExp.$1).trim(); } else if (line.match(/<(?:DB|DRAGONBONE)[ ]SCALEX:[ ](.*)>/i)) { obj.meta.dragonbone_scalex = Number(RegExp.$1); } else if (line.match(/<(?:DB|DRAGONBONE)[ ]SCALEY:[ ](.*)>/i)) { obj.meta.dragonbone_scaley = Number(RegExp.$1); } else if (line.match(/<(?:DB|DRAGONBONE)[ ]WIDTH:[ ](.*)>/i)) { obj.meta.dragonbone_width = Number(RegExp.$1); } else if (line.match(/<(?:DB|DRAGONBONE)[ ]HEIGHT:[ ](.*)>/i)) { obj.meta.dragonbone_height = Number(RegExp.$1); } else if (line.match(/<(?:DB|DRAGONBONE)[ ]ANI[ ](.*):[ ](.*)>/i)) { var ani1 = String(RegExp.$1).trim().toLowerCase(); var ani2 = String(RegExp.$2).trim(); obj.meta['dragonbone_ani_' + ani1] = ani2; } else if (line.match(/<(?:DB|DRAGONBONE)[ ]REPLACE SPRITE>/i)) { obj.meta.dragonbone_replace = true; } else if (line.match(/<(?:DB|DRAGONBONE)[ ]KEEP SPRITE>/i)) { obj.meta.dragonbone_replace = false; // Grouped Notetags } else if (line.match(/<(?:DB|DRAGONBONE)[ ](?:SETTINGS|SETTING)>/i)) { evalMode = 'dragonbone settings'; } else if (line.match(/<\/(?:DB|DRAGONBONE)[ ](?:SETTINGS|SETTING)>/i)) { evalMode = 'none'; } else if (evalMode === 'dragonbone settings') { if (line.match(/(?:BATTLER|SKIN|NAME):[ ]*(.*)/i)) { obj.meta.dragonbone = String(RegExp.$1).trim(); } else if (line.match(/SCALEX:[ ](.*)/i)) { obj.meta.dragonbone_scalex = Number(RegExp.$1); } else if (line.match(/SCALEY:[ ](.*)/i)) { obj.meta.dragonbone_scaley = Number(RegExp.$1); } else if (line.match(/ANI[ ](.*):[ ](.*)/i)) { var ani1 = String(RegExp.$1).trim().toLowerCase(); var ani2 = String(RegExp.$2).trim(); obj.meta['dragonbone_ani_' + ani1] = ani2; } else if (line.match(/WIDTH:[ ](.*)/i)) { obj.meta.dragonbone_width = Number(RegExp.$1); } else if (line.match(/HEIGHT:[ ](.*)/i)) { obj.meta.dragonbone_height = Number(RegExp.$1); } else if (line.match(/REPLACE SPRITE/i)) { obj.meta.dragonbone_replace = true; } else if (line.match(/KEEP SPRITE/i)) { obj.meta.dragonbone_replace = false; } } } DataManager.processDragonBonesData(obj); } }; DataManager.processDragonBonesDefaults = function(obj) { obj.meta.dragonbone = obj.meta.dragonbone || ''; obj.meta.dragonbone_scalex = obj.meta.dragonbone_scalex || dragonBonesIntegration.DefaultScaleX; obj.meta.dragonbone_scaley = obj.meta.dragonbone_scaley || dragonBonesIntegration.DefaultScaleY; obj.meta.dragonbone_width = obj.meta.dragonbone_width || dragonBonesIntegration.DefaultWidth; obj.meta.dragonbone_height = obj.meta.dragonbone_height || dragonBonesIntegration.DefaultHeight; obj.meta.dragonbone_replace = dragonBonesIntegration.ReplaceBattleSprite; }; DataManager.processDragonBonesData = function(obj) { if (!obj.meta.dragonbone) return; if (!dragonBonesIntegration.AssetsArray.contains(obj.meta.dragonbone)) { dragonBonesIntegration.AssetsArray.push(obj.meta.dragonbone); } }; //============================================================================= // dragonBonesIntegration // ---------------------------------------------------------------------------- // Code provided by TheGreenKel //============================================================================= //create a bunch of 'DragonBoy' armature to test performance dragonBonesIntegration.Performance = function(iMax, jMax) { if (iMax === undefined || iMax === null) { iMax = 10; } if (!jMax === undefined || jMax === null) { jMax = 10; } for (var i = 0; i < iMax; i++) { for (var j = 0; j < jMax; j++) { var myArmature = dragonBones.PixiFactory.factory.buildArmatureDisplay("DragonBoy"); myArmature.animation.play("walk"); SceneManager._scene.addChild(myArmature); myArmature.x = i*40 + 200; myArmature.y = j*40 + 200; myArmature.scale.x = 0.3; myArmature.scale.y = 0.3; } } }; //Load complete dragonBonesIntegration.LoadComplete = function(loader, resources) { var lastFileName = dragonBonesIntegration.lastFileName; //console.log("DragonBone Load Complete: " + lastFileName); //load dragon bone armature into memory ready for use by //dragonBonesIntegration.CreateArmature() dragonBones.PixiFactory.factory.parseDragonBonesData(resources[lastFileName + "dragonBonesData"].data); dragonBones.PixiFactory.factory.parseTextureAtlasData(resources[lastFileName + "textureDataA"].data, resources[lastFileName + "textureA"].texture); //load next dragonbone armature if not done if (dragonBonesIntegration.bIsPreloading) { dragonBonesIntegration.currentLoadIndex++; dragonBonesIntegration.PreLoadAllArmatures(); } }; //Load DragonBone data for use by dragonBonesIntegration.CreateArmature() dragonBonesIntegration.Load = function(filename) { if (filename) { filename = filename.trim(); dragonBonesIntegration.lastFileName = filename; PIXI.loader .add(filename + "dragonBonesData", dragonBonesIntegration.AssetsPath + filename + "_ske.json") .add(filename + "textureDataA", dragonBonesIntegration.AssetsPath + filename + "_tex.json") .add(filename + "textureA", dragonBonesIntegration.AssetsPath + filename + "_tex.png"); PIXI.loader.once("complete", dragonBonesIntegration.LoadComplete, this, filename); PIXI.loader.load(); } }; //Preload all DragonBones data assigned in 'Preload Assets' parameter //This is done when this plugin is loaded. dragonBonesIntegration.PreLoadAllArmatures = function() { //only load what is inside of dragonBoneAssetsArray var index = dragonBonesIntegration.currentLoadIndex; if (index < dragonBonesIntegration.AssetsArray.length) { dragonBonesIntegration.bIsPreloading = true; dragonBonesIntegration.Load(dragonBonesIntegration.AssetsArray[index]); } else { dragonBonesIntegration.bIsPreloading = false; //SceneManager.run(Scene_Boot); } }; //Create DragonBones armature ready for display on Scene. //DragonBones armature must be already loaded by dragonBonesIntegration.Load() dragonBonesIntegration.CreateArmature = function(armatureName, x, y) { var tempArmature = dragonBones.PixiFactory.factory.buildArmatureDisplay(armatureName); if (tempArmature) { tempArmature.x = x; tempArmature.y = y; } return tempArmature; } //Play animation on actor/enemies. This also handle default and overwrite //animation behavior dragonBonesIntegration.PlayAnimationOnBattler = function(battler, aniName) { //console.log("PlayAnimationOnBattler: " + battler.name() + " animation = //" + aniName); var armature; var result = false; if (battler && aniName) { if (battler.hasDragonBone === true) { //select armature depending on enemy or actor var index = battler.dragonboneIndex if (battler.isActor()) { armature = dragonBonesIntegration.ArmatureDatabaseActor[index]; } else { armature = dragonBonesIntegration.ArmatureDatabaseEnemy[index]; } //check for overwrite animation from dragonbone_ani Note tag var cmd = aniName.toLowerCase(); var dragonBoneaniName = battler.dragonboneAnimation[cmd]; if (dragonBoneaniName) { //console.log("Overwriting Animation: " + cmd + " with " + //dragonBoneaniName); cmd = dragonBoneaniName; } //play animation if armature is valid if (armature) { //if animation is found then play it if (armature.animation.animationList.contains(cmd)) { //if animation name match exactly then play armature.animation.play(cmd); result = true; } else if (dragonBonesIntegration.supportUpperCaseNames === true) { //search for animation name with case-insensitive. Higher memory // cost + performance //Prefer method is to have all dragonbones animation be lower case. //console.log("supportUpperCaseNames: Search for animation with //case-insensitive"); for (var i = 0; i < armature.animation.animationList.length; i++) { var element = armature.animation.animationList[i]; if (cmd === element.toLowerCase()) { //console.log("actionMotionTarget: Found lower case match for //" + cmd + " with " + element); armature.animation.play(element); result = true; break; } } } else { if (dragonBonesIntegration.consoleDebug) { console.log("PlayAnimationOnBattler: " + battler.name() + " Animation '" + aniName + "' not found."); } } } } } return result; }; //============================================================================= // SceneManager // ---------------------------------------------------------------------------- // Code provided by TheGreenKel //============================================================================= //(Must have for animation) Tick function required for dragonbone animations dragonBonesIntegration.SceneManager_update = SceneManager.update; SceneManager.update = function() { dragonBonesIntegration.SceneManager_update.call(this); if (dragonBones.PixiFactory._clock) { dragonBones.PixiFactory._clock.advanceTime(-1); } }; //============================================================================= // Spriteset_Battle // ---------------------------------------------------------------------------- // Code provided by TheGreenKel //============================================================================= // CREATE DRAGONBONES ARMATURE DURING SPRITESET_BATTLE Spriteset_Battle.prototype.createEnemies = function() { //enemies is an array of Game_Enemy var enemies = $gameTroop.members(); var sprites = []; for (var i = 0; i < enemies.length; i++) { sprites[i] = new Sprite_Enemy(enemies[i]); var enemyId = enemies[i]._enemyId; var tempArmatureName = $dataEnemies[enemyId].meta.dragonbone; var tempScaleX = $dataEnemies[enemyId].meta.dragonbone_scalex; var tempScaleY = $dataEnemies[enemyId].meta.dragonbone_scaley; var tempStartAnimation = $dataEnemies[enemyId].meta.dragonbone_ani_walk; if (tempArmatureName) { //Delete last battle armature if (dragonBonesIntegration.ArmatureDatabaseEnemy[i]) { dragonBonesIntegration.ArmatureDatabaseEnemy[i].dispose(); } //create new armature dragonBonesIntegration.ArmatureDatabaseEnemy[i] = dragonBonesIntegration.CreateArmature(tempArmatureName, 0, 0); if (dragonBonesIntegration.ArmatureDatabaseEnemy[i]) { //tell whether a battler has a dragonbone armature enemies[i].hasDragonBone = true; //Store index of armature for later use //Can't store armature on enemy directly because of potential memory //leak issue enemies[i].dragonboneIndex = i; enemies[i].dragonboneAnimation = []; //parse meta data into animation for (var key in $dataEnemies[enemyId].meta) { if ($dataEnemies[enemyId].meta.hasOwnProperty(key)) { var animationIndex = key.split("dragonbone_ani_"); //console.log("animationIndex = " + animationIndex); if (animationIndex[1]) { enemies[i].dragonboneAnimation[animationIndex[1]] = $dataEnemies[enemyId].meta[key]; } } } //set up auto transition to idle //transition to idle when animation finish playing. //This should stop most animation hitches. enemies[i].AutoTransitionToIdle = function(event) { if (dragonBonesIntegration.consoleDebug) { console.log("Enemy AutoTransitionToIdle"); } switch (event.type) { case dragonBones.EventObject.COMPLETE: //if actor is not knocked out if (this._states.contains(1) === false) { //var idleAnimation = this.dragonboneAnimation['walk']; //dragonBonesIntegration.ArmatureDatabaseEnemy //[this.dragonboneIndex].animation.play(idleAnimation); dragonBonesIntegration.PlayAnimationOnBattler(this, "walk"); } else { dragonBonesIntegration.Game_Enemy_prototype_performCollapse.call(this); }; break; default: //nothing } } //Automatically transition to idle when animation is complete by using //Event var enemyData = dragonBonesIntegration.ArmatureDatabaseEnemy[i]; enemyData.addEvent(dragonBones.EventObject.COMPLETE, enemies[i].AutoTransitionToIdle, enemies[i]); //play default idle animation on creation dragonBonesIntegration.PlayAnimationOnBattler(enemies[i], "walk"); //set custom scale if (tempScaleX) { dragonBonesIntegration.ArmatureDatabaseEnemy[i].scale.x = tempScaleX; } //set custom scale if (tempScaleY) { dragonBonesIntegration.ArmatureDatabaseEnemy[i].scale.y = tempScaleY; } sprites[i].addChild(dragonBonesIntegration.ArmatureDatabaseEnemy[i]); sprites[i]._dragonboneSprite = dragonBonesIntegration.ArmatureDatabaseEnemy[i]; } } else { enemies[i].dragonboneIndex = null; } } sprites.sort(this.compareEnemySprite.bind(this)); for (var i = 0; i < sprites.length; i++) { this._battleField.addChild(sprites[i]); } this._enemySprites = sprites; } Spriteset_Battle.prototype.createActors = function() { this._actorSprites = []; for (var i = 0; i < $gameParty.maxBattleMembers(); i++) { this._actorSprites[i] = new Sprite_Actor(); var actorId = $gameParty._actors[i]; if (actorId) { //console.log($dataActors[actorId]); var tempArmatureName = $dataActors[actorId].meta.dragonbone; var tempScaleX = $dataActors[actorId].meta.dragonbone_scalex; var tempScaleY = $dataActors[actorId].meta.dragonbone_scaley; if (tempArmatureName) { //Delete last battle armature if (dragonBonesIntegration.ArmatureDatabaseActor[i]) { dragonBonesIntegration.ArmatureDatabaseActor[i].dispose(); } //create new armature dragonBonesIntegration.ArmatureDatabaseActor[i] = dragonBonesIntegration.CreateArmature(tempArmatureName, 0, 0); //initialize dragon data inside the game actor in order to handle //animation state changes if (dragonBonesIntegration.ArmatureDatabaseActor[i]) { //tell whether a battler has a dragonbone armature $gameActors.actor(actorId).hasDragonBone = true; $gameActors.actor(actorId).dragonboneIndex = i; $gameActors.actor(actorId).dragonboneAnimation = []; //transition to idle when animation finish playing. This should stop //most animation hitches. $gameActors.actor(actorId).AutoTransitionToIdle = function(event) { switch (event.type) { case dragonBones.EventObject.COMPLETE: //if actor is not knocked out if (this._states.contains(1) === false) { //var idleAnimation = this.dragonboneAnimation['walk']; //dragonBonesIntegration.ArmatureDatabaseActor //[this.dragonboneIndex].animation.play(idleAnimation); this.lastMotionType = null; dragonBonesIntegration.PlayAnimationOnBattler(this, "walk"); } break; default: //nothing } } //Automatically transition to idle when animation is complete by using //Event var actorData = dragonBonesIntegration.ArmatureDatabaseActor[i]; actorData.addEvent(dragonBones.EventObject.COMPLETE, $gameActors.actor(actorId).AutoTransitionToIdle, $gameActors.actor(actorId)); //parse meta data into animation for (var key in $dataActors[actorId].meta) { if ($dataActors[actorId].meta.hasOwnProperty(key)) { var animationIndex = key.split("dragonbone_ani_"); if (animationIndex[1]) { var actor = $gameActors.actor(actorId) actor.dragonboneAnimation[animationIndex[1]] = $dataActors[actorId].meta[key]; } //console.log('Key = ' + key + ' :: ' + animationIndex + " = " + //$dataActors[actorId].meta[key]); //console.log(key + " -> " + $dataActors[actorId].meta[key]); } } //set scale if (tempScaleX) { dragonBonesIntegration.ArmatureDatabaseActor[i].scale.x = tempScaleX; } if (tempScaleY) { dragonBonesIntegration.ArmatureDatabaseActor[i].scale.y = tempScaleY; } var actorData = dragonBonesIntegration.ArmatureDatabaseActor[i]; this._actorSprites[i].addChild(actorData); this._actorSprites[i]._dragonboneSprite = actorData; } } } this._battleField.addChild(this._actorSprites[i]); } }; //============================================================================= // Sprite_Animation // ---------------------------------------------------------------------------- // Code provided by SwiftIllusion //============================================================================= dragonBonesIntegration.Sprite_Animation_updatePosition = Sprite_Animation.prototype.updatePosition; Sprite_Animation.prototype.updatePosition = function() { dragonBonesIntegration.Sprite_Animation_updatePosition.call(this); this.updateDragonBonesPosition(); }; Sprite_Animation.prototype.updateDragonBonesPosition = function() { var position = this._animation.position; if (position === 3) return; var battler = this._target._battler; if (!this._target) return; if (!this._target._battler && (this._target._battler !== undefined)) return; if (battler !== undefined) { var data = battler.isActor() ? battler.actor() : battler.enemy(); if (position === 0) { this.y -= data.meta.dragonbone_height; } else if (position === 1) { this.y -= data.meta.dragonbone_height / 2; } var heightRate = battler.battler().getFloatHeight() + battler.battler().getJumpHeight(); var height = heightRate * data.meta.dragonbone_height; this.y -= height; } else { var battler = this._target.parent._battler; if (battler && battler.hasDragonBone) { var data = battler.isActor() ? battler.actor() : battler.enemy(); if (position === 0) { this.y -= data.meta.dragonbone_height; } else if (position === 1) { this.y -= data.meta.dragonbone_height / 2; } var heightRate = battler.battler().getFloatHeight() + battler.battler().getJumpHeight(); var height = heightRate * data.meta.dragonbone_height; this.y -= height; } } }; //============================================================================= // Sprite_Battler // ---------------------------------------------------------------------------- // Code provided by Yanfly //============================================================================= dragonBonesIntegration.Sprite_Battler_update = Sprite_Battler.prototype.update; Sprite_Battler.prototype.update = function() { dragonBonesIntegration.Sprite_Battler_update.call(this); if (this._battler) this.updateStateIconSpritePosition() }; dragonBonesIntegration.Sprite_Battler_updatePosition = Sprite_Battler.prototype.updatePosition; Sprite_Battler.prototype.updatePosition = function() { dragonBonesIntegration.Sprite_Battler_updatePosition.call(this); if (Imported.YEP_X_ActSeqPack2 && this._battler.hasDragonBone) { var battler = this._battler.isActor() ? this._battler.actor() : this._battler.enemy(); var heightRate = this.getFloatHeight() + this.getJumpHeight(); var height = battler.meta.dragonbone_height * heightRate; this.anchor.y += height; this.y -= height; } }; Sprite_Battler.prototype.updateStateIconSpritePosition = function() { if (this._dbStateSpritesUpdated !== undefined) return; this._dbStateSpritesUpdated = true; if (this._stateSprite) { this.removeChild(this._stateSprite); this.addChild(this._stateSprite); } if (this._stateIconSprite) { this.removeChild(this._stateIconSprite); this.addChild(this._stateIconSprite); } }; // Code provided by Swift Illusion !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(t.__filters={},t.PIXI)}(this,function(t,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform float gamma;\nuniform float contrast;\nuniform float saturation;\nuniform float brightness;\nuniform float red;\nuniform float green;\nuniform float blue;\nuniform float alpha;\n\nvoid main(void)\n{\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n if (c.a > 0.0) {\n c.rgb /= c.a;\n\n vec3 rgb = pow(c.rgb, vec3(1. / gamma));\n rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\n rgb.r *= red;\n rgb.g *= green;\n rgb.b *= blue;\n c.rgb = rgb * brightness;\n\n c.rgb *= c.a;\n }\n\n gl_FragColor = c * alpha;\n}\n",i=function(t){function n(n){t.call(this,r,e),Object.assign(this,{gamma:1,saturation:1,contrast:1,brightness:1,red:1,green:1,blue:1,alpha:1},n)}return t&&(n.__proto__=t),n.prototype=Object.create(t&&t.prototype),n.prototype.constructor=n,n.prototype.apply=function(t,n,r,e){this.uniforms.gamma=Math.max(this.gamma,1e-4),this.uniforms.saturation=this.saturation,this.uniforms.contrast=this.contrast,this.uniforms.brightness=this.brightness,this.uniforms.red=this.red,this.uniforms.green=this.green,this.uniforms.blue=this.blue,this.uniforms.alpha=this.alpha,t.applyFilter(this,n,r,e)},n}(n.Filter);t.DragonbonesFilter=i}),Object.assign(PIXI.filters,this.__filters); // Code provided by Irina and Swift Illusion Sprite_Base.prototype.setBlendColor = function(color) { if (this._battler) { if (this._dragonboneSprite) this.setDragonbonesSpriteFlashColor(color); } else if (this.parent._battler) { if (this.parent._dragonboneSprite) this.parent.setDragonbonesSpriteFlashColor(color); } }; Sprite_Battler.prototype.setDragonbonesSpriteFlashColor = function(color) { this.setupDragonbonesSpriteFlashFilter(); this.updateDragonbonesSpriteFlashFilter(color); }; Sprite_Battler.prototype.setupDragonbonesSpriteFlashFilter = function() { var sprite = this._dragonboneSprite; sprite._filters = sprite._filters || []; if (sprite._flashFilter) return; sprite._flashFilter = new PIXI.filters.DragonbonesFilter(); sprite._filters.push(sprite._flashFilter); }; // Code provided by Irina, numbers by Swift Illusion Sprite_Battler.prototype.updateDragonbonesSpriteFlashFilter = function(color) { var filter = this._dragonboneSprite._flashFilter; if (!filter) return; var baseline = 127.5; // 255 / 2 var intensity = (Math.max(0, color[3]) / 255); filter.red = 1 + intensity * ((color[0] / baseline) - 1); filter.green = 1 + intensity * ((color[1] / baseline) - 1); filter.blue = 1 + intensity * ((color[2] / baseline) - 1); filter.contrast = 1- intensity; filter.brightness = 1; }; //============================================================================= // Spriteset_Actor // ---------------------------------------------------------------------------- // Code provided by TheGreenKel //============================================================================= // SPRITE REPLACEMENT: ENEMY, ACTOR, WEAPON //Hide default weapon sprite for Actor when there is a DragonBones armature //assigned dragonBonesIntegration.Sprite_Actor_prototype_setupWeaponAni = Sprite_Actor.prototype.setupWeaponAnimation; Sprite_Actor.prototype.setupWeaponAnimation = function() { if (this._actor.dragonboneIndex !== null && this._actor.dragonboneIndex !== undefined) { //do nothing for weapon animation } else { dragonBonesIntegration.Sprite_Actor_prototype_setupWeaponAni.call(this); } }; //============================================================================= // YEP_X_ActSeqPack2 // ---------------------------------------------------------------------------- // Compatibility Update //============================================================================= if (Imported.YEP_X_ActSeqPack2) { dragonBonesIntegration.BattleManager_actionMotionTarget = BattleManager.actionMotionTarget; BattleManager.actionMotionTarget = function(name, actionArgs) { //console.log("BattleManager.actionMotionTarget: DB") if (name.toUpperCase() === 'WAIT') return this.actionMotionWait(actionArgs); if (name.toUpperCase() === 'STANDBY') name = 'WAIT'; //get affected battlers var movers = this.makeActionTargets(actionArgs[0]); //continue if 1 or more battler are targeted if (movers.length < 1) return true; //console.log("DB actionMotionTarget: " + movers[0].name() + " = " + name); var cmd = name.toLowerCase(); var motion = 'wait'; //check for weapons if (actionArgs[1] && actionArgs[1].toUpperCase() === 'NO WEAPON') { var showWeapon = false; } else { var showWeapon = true; } if (['wait', 'chant', 'guard', 'evade', 'skill', 'spell', 'item', 'escape', 'victory', 'dying', 'abnormal', 'sleep', 'dead'].contains(cmd)) { motion = cmd; } else if (['walk', 'move'].contains(cmd)) { motion = 'walk'; } else if (['damage', 'hit'].contains(cmd)) { motion = 'damage'; } else if (['attack'].contains(cmd)) { movers.forEach(function(mover) { //console.log("Action Motion: Performing Attack"); if (mover.isActor()) { mover.performAttack(); } else { dragonBonesIntegration.PlayAnimationOnBattler(mover, "attack"); } }); return false; } else if (['thrust', 'swing', 'missile'].contains(cmd)) { motion = cmd; movers.forEach(function(mover) { if (mover.hasDragonBone === true) { //play animation through force motion for actor, //play animation directly for enemy if (mover.isActor()) { mover.forceMotion(motion); } else { dragonBonesIntegration.PlayAnimationOnBattler(mover, motion); } } else { mover.forceMotion(motion); if (mover.isActor() && showWeapon) { var weapons = mover.weapons(); var wtypeId = weapons[0] ? weapons[0].wtypeId : 0; var attackMotion = $dataSystem.attackMotions[wtypeId]; if (attackMotion && [0, 1, 2].contains(attackMotion.type)) { mover.startWeaponAnimation(attackMotion.weaponImageId); } } if (Imported.YEP_X_AnimatedSVEnemies) { if (mover.isEnemy() && mover.hasSVBattler() && showWeapon) { var attackMotion = $dataSystem.attackMotions[wtypeId]; mover.startWeaponAnimation(mover.weaponImageId()); } } } }); return false; } //all other animations movers.forEach(function(mover) { if (mover.hasDragonBone === true) { motion = cmd; if (mover.isActor()) { mover.forceMotion(motion); } else { dragonBonesIntegration.PlayAnimationOnBattler(mover, motion); } } else { mover.forceMotion(motion); } }); return false; }; //play animation with the 'motion' command on actor //this will overwrite the previous animation var Sprite_Actor_prototype_forceMotion = Sprite_Actor.prototype.forceMotion; Sprite_Actor.prototype.forceMotion = function(motionType) { //play dragonbone animation if there is a valid armature if (this._actor.hasDragonBone === true) { //console.log("DB forceMotion: "); if (dragonBonesIntegration.consoleDebug) { console.log("DB forceMotion: Play actor motion = " + motionType); } dragonBonesIntegration.PlayAnimationOnBattler(this._actor, motionType); //this.startMotion(motionType); } else { Sprite_Actor_prototype_forceMotion.call(this, motionType); } }; }; // Imported.YEP_X_ActSeqPack2 // REPLACE ACTOR/ENEMIES ANIMATIONS //Replace the default 18 sprite animations with DragonBones animation if //assigned in the Note section //if the previous animation is the same as the new one, then start motion will //let the previous animation complete dragonBonesIntegration.Sprite_Actor_prototype_startMotion = Sprite_Actor.prototype.startMotion; Sprite_Actor.prototype.startMotion = function(motionType) { //only play dragonbone animation if dragonboneIndex variable is valid if (this._actor.hasDragonBone === true) { if (this._actor.lastMotionType !== motionType) { dragonBonesIntegration.PlayAnimationOnBattler(this._actor, motionType); this._actor.lastMotionType = motionType; } } else { //console.log("Vanilla startMotion: " + this._actor._name + " motion = " + //motionType); dragonBonesIntegration.Sprite_Actor_prototype_startMotion.call(this, motionType); } }; //============================================================================= // Game_Enemy // ---------------------------------------------------------------------------- // Code provided by TheGreenKel //============================================================================= //Replace Enemy default attack animation Game_Enemy.prototype.performActionStart = function(action) { //Game_Battler.prototype.performActionStart.call(this, action); this.requestEffect('whiten'); if (dragonBonesIntegration.consoleDebug) { console.log("DB performActionStart: " + this.battlerName() + " type = " + action.type); } //console.log("DragonBoneIndex = " + this.dragonboneIndex); var result = false; if (this.hasDragonBone === true && action.isAttack()) { result = dragonBonesIntegration.PlayAnimationOnBattler(this, "swing"); } if (result === false) { Game_Battler.prototype.performActionStart.call(this, action); } }; //Replace Enemy default take damage animation Game_Enemy.prototype.performDamage = function() { Game_Battler.prototype.performDamage.call(this); SoundManager.playEnemyDamage(); var result = false; if (this.hasDragonBone === true) { result = dragonBonesIntegration.PlayAnimationOnBattler(this, "damage"); } //if dragonbones animation fail to play then run default if (result === false) { this.requestEffect('blink'); } }; //Replace Enemy default death animation dragonBonesIntegration.Game_Enemy_prototype_performCollapse = Game_Enemy.prototype.performCollapse; Game_Enemy.prototype.performCollapse = function() { //console.log("DB collapse: Game_Enemy"); var result = false; if (this.hasDragonBone === true) { //console.log("DB collapse: skeletal animation"); result = dragonBonesIntegration.PlayAnimationOnBattler(this, "dead"); SoundManager.playBossCollapse1(); } if (result === false) { dragonBonesIntegration.Game_Enemy_prototype_performCollapse.call(this); } }; //============================================================================= // Game_Battler // ---------------------------------------------------------------------------- // Code provided by Yanfly //============================================================================= Game_Battler.prototype.isReplacedByDragonBonesBattler = function() { if (!$gameParty.inBattle()) return false; if (this.isActor()) { var data = this.actor(); } else if (this.isEnemy()) { var data = this.enemy(); } else { return false; } if (data.meta.dragonbone_replace === false) return false; return this.hasDragonBone; }; if (Imported.YEP_BattleEngineCore) { dragonBonesIntegration.Game_Battler_spriteWidth = Game_Battler.prototype.spriteWidth; Game_Battler.prototype.spriteWidth = function() { if (this.isReplacedByDragonBonesBattler()) { if (this.isActor()) { return this.actor().meta.dragonbone_width; } else if (this.isEnemy()) { return this.enemy().meta.dragonbone_width; } else { return 100; } } return dragonBonesIntegration.Game_Battler_spriteWidth.call(this); }; dragonBonesIntegration.Game_Battler_spriteHeight = Game_Battler.prototype.spriteHeight; Game_Battler.prototype.spriteHeight = function() { if (this.isReplacedByDragonBonesBattler()) { if (this.isActor()) { return this.actor().meta.dragonbone_height; } else if (this.isEnemy()) { return this.enemy().meta.dragonbone_height; } else { return 100; } } return dragonBonesIntegration.Game_Battler_spriteHeight.call(this); }; }; // Imported.YEP_BattleEngineCore //============================================================================= // Game_Actor // ---------------------------------------------------------------------------- // Code provided by Yanfly //============================================================================= dragonBonesIntegration.Game_Actor_battlerName = Game_Actor.prototype.battlerName; Game_Actor.prototype.battlerName = function() { if (this.isReplacedByDragonBonesBattler()) return ''; return dragonBonesIntegration.Game_Actor_battlerName.call(this); }; dragonBonesIntegration.Game_Actor_spriteWidth = Game_Actor.prototype.spriteWidth; Game_Actor.prototype.spriteWidth = function() { if (this.isReplacedByDragonBonesBattler()) { if (this.isActor()) { return this.actor().meta.dragonbone_width; } else if (this.isEnemy()) { return this.enemy().meta.dragonbone_width; } else { return 100; } } return dragonBonesIntegration.Game_Actor_spriteWidth.call(this); }; dragonBonesIntegration.Game_Actor_spriteHeight = Game_Actor.prototype.spriteHeight; Game_Actor.prototype.spriteHeight = function() { if (this.isReplacedByDragonBonesBattler()) { if (this.isActor()) { return this.actor().meta.dragonbone_height; } else if (this.isEnemy()) { return this.enemy().meta.dragonbone_height; } else { return 100; } } return dragonBonesIntegration.Game_Actor_spriteHeight.call(this); }; //============================================================================= // Game_Enemy // ---------------------------------------------------------------------------- // Code provided by Yanfly //============================================================================= dragonBonesIntegration.Game_Enemy_battlerName = Game_Enemy.prototype.battlerName; Game_Enemy.prototype.battlerName = function() { if (this.isReplacedByDragonBonesBattler()) return ''; return dragonBonesIntegration.Game_Enemy_battlerName.call(this); }; //============================================================================= // YEP_X_AnimatedSVEnemies Compatibility // ---------------------------------------------------------------------------- // Code provided by Yanfly //============================================================================= if (Imported.YEP_X_AnimatedSVEnemies) { dragonBonesIntegration.Game_Enemy_hasSVBattler = Game_Enemy.prototype.hasSVBattler; Game_Enemy.prototype.hasSVBattler = function() { if (this._hasSvBattler === undefined) { this._hasSvBattler = dragonBonesIntegration.Game_Enemy_hasSVBattler.call(this) || this.hasDragonBone; } return this._hasSvBattler; }; dragonBonesIntegration.Game_Enemy_spriteScaleX = Game_Enemy.prototype.spriteScaleX; Game_Enemy.prototype.spriteScaleX = function() { if (this.hasDragonBone && this.hasSVBattler()) { return this.enemy().spriteScaleX; } else { return dragonBonesIntegration.Game_Enemy_spriteScaleX.call(this); } }; }; // YEP_X_AnimatedSVEnemies //============================================================================= // End of Main Functions //============================================================================= } else { var text = ''; text += 'You are getting this error because you are trying to run DragonBones '; text += 'Integration while your project files are lower than version 1.4.0.\n'; text += '\nPlease visit this thread for instructions on how to update your '; text += 'project files to 1.4.0 or higher: \n\n'; text += 'https://forums.rpgmakerweb.com/index.php?threads/'; text += 'rpg-maker-mv-1-5-0-update.79677/'; console.log(text); require('nw.gui').Window.get().showDevTools(); } // (Utils.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= '1.1.0') //============================================================================= // End of File //=============================================================================