Files
2019-11-05 20:14:51 +01:00

462 lines
16 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.
//=============================================================================
// Yanfly Engine Plugins - Overkill Bonus
// YEP_OverkillBonus.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_OverkillBonus = true;
var Yanfly = Yanfly || {};
Yanfly.OKB = Yanfly.OKB || {};
Yanfly.OKB.version = 1.02;
//=============================================================================
/*:
* @plugindesc v1.02 Extra rewards (EXP, Gold, Items) for overkilling
* enemies in battle.
* @author Yanfly Engine Plugins + Tigress Collaboration
*
* @param Overkill Formula
* @desc The default formula used for each enemy and how much DMG needs
* to be dealt in a single hit on the killing blow.
* @default 0.5 * enemy.mhp
*
* @param Overkill Animation
* @type animation
* @desc This animation will play on the enemy if the enemy is overkilled.
* Leave this at 0 if you do not want to play any animations.
* @default 13
*
* @param EXP Bonus Rate
* @type number
* @decimals 2
* @min 0
* @desc This is the bonus EXP modified when an enemy is ovekilled.
* This is a rate. 0 is 0%. 1.00 is 100%. 0.50 is 50%.
* @default 2.00
*
* @param EXP Bonus Flat
* @type number
* @min 0
* @desc This is the bonus EXP given out when an enemy is ovekilled.
* This is a flat amount.
* @default 0
*
* @param Gold Bonus Rate
* @type number
* @decimals 2
* @min 0
* @desc This is the bonus Gold modified when an enemy is ovekilled.
* This is a rate. 0 is 0%. 1.00 is 100%. 0.50 is 50%.
* @default 2.00
*
* @param Gold Bonus Flat
* @type number
* @min 0
* @desc This is the bonus Gold given out when an enemy is ovekilled.
* This is a flat amount.
* @default 0
*
* @param Drop Bonus Rate
* @type number
* @decimals 2
* @min 0
* @desc This is the bonus drop modified when an enemy is ovekilled.
* This is a rate. 0 is 0%. 1.00 is 100%. 0.50 is 50%.
* @default 2.00
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* Overkill occurs when an actor defeats an enemy with excessive damage. All
* enemies have an Overkill damage requirement and if a battler lands a killing
* blow dealing damage equal to or greater than this number, an animation is
* played on the enemy before the enemy collapses. When an enemy is overkilled,
* that enemy will reward the player with more EXP, more gold, a higher drop
* rate, and if YEP_ExtraEnemyDrops is installed, more possibilities for extra
* items under the condition of being Overkilled.
*
* This is a collaboration plugin by Tigress and Yanfly to ensure compatibility
* with the Yanfly Engine Plugins library.
*
* If you are using YEP_ExtraEnemyDrops, place this plugin underneath that
* plugin in the plugin manager list to get access to the Overkill condition
* that is provided within this plugin.
*
* ============================================================================
* Notetags
* ============================================================================
*
* Insert the following notetags into the enemy noteboxes you wish to alter the
* overkill requirements for.
*
* Enemy Notetags
*
* <Overkill Requirement: x>
* - Changes the enemy's overkill requirement to X. This is how much damage
* needs to be dealt minimum on the killing blow. You can use JS code here if
* you can fit it all on one line. Otherwise, use the notetag setup below in
* the Lunatic Mode section.
*
* <Overkill Animation: x>
* - This is the animation played when the enemy is overkilled. Replace x
* with an animation ID from the database.
*
* <Overkill EXP Rate: x%>
* <Overkill EXP Flat: x>
* - This is the bonus EXP gained when the enemy is overkilled. Replace x
* with a number value. This EXP gained from overkilling will be added on top
* of the already gained EXP.
*
* <Overkill Gold Rate: x%>
* <Overkill Gold Flat: x>
* - This is the bonus gold gained when the enemy is overkilled. Replace x
* with a number value. This gold gained from overkilling will be added on
* top of the already gained gold.
*
* <Overkill Drop Rate: x%>
* - This is the bonus drop rate gained when the enemy is overkilled. Replace
* x with the percent rate increase.
*
* ============================================================================
* Extra Enemy Drops Compatibility - Conditional Drop - Overkill
* ============================================================================
*
* To be used together with the YEP_ExtraEnemyDrops plugin. Place this plugin
* underneath YEP_ExtraEnemyDrops in the plugin manager list for compatibility.
* Then, you can use the following condition:
*
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* IS OVERKILLED
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This condition will pass only if the enemy is overkilled. If the overkill
* requirement isn't met, there will be no additional changes to the drop rate.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Example: Is Overkilled: +100%
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*
* One thing you can do to make Overkill only items is using something like the
* following setup:
*
* <Conditional Potion Drop>
* is overkilled: +100%
* </Conditional Potion Drop>
*
* This notetag setup will make the 'Potion' item only drop if the enemy has
* been overkilled. Otherwise, nothing will come out of it.
*
* ============================================================================
* Lunatic Mode - Custom Overkill Settings
* ============================================================================
*
* This section is for those who wish to dabble with JavaScript a bit more to
* make certain overkill aspects more customized.
*
* Enemy Notetags
*
* --------------------------------------------------------------------------
*
* <Overkill Requirement Formula>
* requirement = x;
* <Overkill Requirement Formula>
*
* - Changes the enemy's overkill requirement to X. This is how much damage
* needs to be dealt minimum on the killing blow. You can use JS code here if
* you know how to code. The 'requirement' variable is the value that will be
* used to check if overkill is achieved.
*
* --------------------------------------------------------------------------
*
* <Custom Overkill Effect>
* // Insert any code you want here
* </Custom Overkill Effect>
*
* - This code will run when the enemy is overkilled and collapses. The
* 'enemy' variable used here will refer to the enemy itself. The JS code you
* can use here can be anything you want, including turning on switches,
* setting variables, anything that comes to mind.
*
* --------------------------------------------------------------------------
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.02:
* - Bypass the isDevToolsOpen() error when bad code is inserted into a script
* call or custom Lunatic Mode code segment due to updating to MV 1.6.1.
*
* Version 1.01:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.setupParameters = function() {
var parameters = PluginManager.parameters('YEP_OverkillBonus');
this.Param = this.Param || {};
this.Param.OverkillFormula = String(parameters['Overkill Formula']);
this.Param.OverkillAniId = Number(parameters['Overkill Animation']);
this.Param.OverkillExpRate = Number(parameters['EXP Bonus Rate']);
this.Param.OverkillExpFlat = Number(parameters['EXP Bonus Flat']);
this.Param.OverkillGoldRate = Number(parameters['Gold Bonus Rate']);
this.Param.OverkillGoldFlat = Number(parameters['Gold Bonus Flat']);
this.Param.OverkillDropRate = Number(parameters['Drop Bonus Rate']);
};
Yanfly.setupParameters(); // Setup Parameters
//=============================================================================
// DataManager
// ----------------------------------------------------------------------------
// Notetags added by Yanfly
//=============================================================================
Yanfly.OKB.DataManager_isDatabaseLoaded =
DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.OKB.DataManager_isDatabaseLoaded.call(this))
return false;
if (!Yanfly._loaded_YEP_OverkillBonus) {
this.processOverkillBonusNotetags1($dataEnemies);
Yanfly._loaded_YEP_OverkillBonus = true;
}
return true;
};
DataManager.processOverkillBonusNotetags1 = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.overkillFormula = 'requirement = ' + Yanfly.Param.OverkillFormula;
obj.overkillAnimationId = Yanfly.Param.OverkillAniId;
obj.overkillExpRate = Yanfly.Param.OverkillExpRate;
obj.overkillExpFlat = Yanfly.Param.OverkillExpFlat;
obj.overkillGoldRate = Yanfly.Param.OverkillGoldRate;
obj.overkillGoldFlat = Yanfly.Param.OverkillGoldFlat;
obj.overkillDropRate = Yanfly.Param.OverkillDropRate;
obj.overkillEffect = '';
var evalMode = 'none';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<OVERKILL REQUIREMENT:[ ](.*)>/i)) {
obj.overkillFormula = 'requirement = ' + String(RegExp.$1);
} else if (line.match(/<OVERKILL REQUIREMENT FORMULA>/i)) {
evalMode = 'overkill formula';
obj.overkillFormula = '';
} else if (line.match(/<\/OVERKILL REQUIREMENT FORMULA>/i)) {
evalMode = 'none';
} else if (evalMode === 'overkill formula') {
obj.overkillFormula += line + '\n';
} else if (line.match(/<OVERKILL ANIMATION:[ ](\d+)>/i)) {
obj.overkillAnimationId = parseInt(RegExp.$1);
} else if (line.match(/<OVERKILL EXP RATE:[ ](\d+)([%%])>/i)) {
obj.overkillExpRate = parseFloat(RegExp.$1) * 0.01;
} else if (line.match(/<OVERKILL EXP FLAT:[ ](\d+)>/i)) {
obj.overkillExpFlat = parseInt(RegExp.$1);
} else if (line.match(/<OVERKILL GOLD RATE:[ ](\d+)([%%])>/i)) {
obj.overkillGoldRate = parseFloat(RegExp.$1) * 0.01;
} else if (line.match(/<OVERKILL GOLD FLAT:[ ](\d+)>/i)) {
obj.overkillGoldFlat = parseInt(RegExp.$1);
} else if (line.match(/<OVERKILL DROP RATE:[ ](\d+)([%%])>/i)) {
obj.overkillDropRate = parseFloat(RegExp.$1) * 0.01;
} else if (line.match(/<CUSTOM OVERKILL EFFECT>/i)) {
evalMode = 'custom overkill effect';
} else if (line.match(/<\/CUSTOM OVERKILL EFFECT>/i)) {
evalMode = 'none';
} else if (evalMode === 'custom overkill effect') {
obj.overkillEffect += line + '\n';
}
}
}
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.OKB.Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function(target, value) {
Yanfly.OKB.Game_Action_executeHpDamage.call(this, target, value);
if (target.isEnemy() && (target.hp < 1 || target.isDead())) {
target.checkOverkill();
}
};
//=============================================================================
// Game_Enemy
//=============================================================================
Yanfly.OKB.Game_Enemy_setup = Game_Enemy.prototype.setup;
Game_Enemy.prototype.setup = function(enemyId, x, y) {
Yanfly.OKB.Game_Enemy_setup.call(this, enemyId, x, y);
this.setOverkill(false);
};
Game_Enemy.prototype.checkOverkill = function() {
var result = this._result;
if (result) {
var dmg = this._result.hpDamage;
var requirement = this.overkillRequirement();
if (dmg >= requirement) {
this.setOverkill(true);
}
}
};
Game_Enemy.prototype.overkillRequirement = function() {
if (this._overkillRequirement) {
return this._overkillRequirement;
}
var user = this;
var a = this;
var b = this;
var target = this;
var enemy = this;
var subject = this;
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var requirement = 0;
var code = this.enemy().overkillFormula;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'OVERKILL FORMULA ERROR');
}
this._overkillRequirement = requirement;
return this._overkillRequirement;
};
Game_Enemy.prototype.setOverkill = function(status) {
this._overkill = status;
};
Yanfly.OKB.Game_Enemy_performCollapse = Game_Enemy.prototype.performCollapse;
Game_Enemy.prototype.performCollapse = function() {
if (this.isOverkilled()) {
this.performOverkillCollapse();
}
Yanfly.OKB.Game_Enemy_performCollapse.call(this);
if (this.isOverkilled()) {
this.performOverkillEffect();
}
};
Game_Enemy.prototype.overkillAnimationId = function() {
return this.enemy().overkillAnimationId;
};
Game_Enemy.prototype.performOverkillCollapse = function() {
this.startAnimation(this.overkillAnimationId());
};
Game_Enemy.prototype.performOverkillEffect = function() {
var user = this;
var a = this;
var b = this;
var target = this;
var enemy = this;
var subject = this;
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = this.enemy().overkillEffect;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'OVERKILL EFFECT ERROR');
}
};
Game_Enemy.prototype.isOverkilled = function() {
return this._overkill;
};
Yanfly.OKB.Game_Enemy_exp = Game_Enemy.prototype.exp;
Game_Enemy.prototype.exp = function() {
var exp = Yanfly.OKB.Game_Enemy_exp.call(this);
if (this.isOverkilled()) {
exp *= this.enemy().overkillExpRate;
exp += this.enemy().overkillExpFlat;
}
return Math.round(exp);
};
Yanfly.OKB.Game_Enemy_gold = Game_Enemy.prototype.gold;
Game_Enemy.prototype.gold = function() {
var gold = Yanfly.OKB.Game_Enemy_gold.call(this);
if (this.isOverkilled()) {
gold *= this.enemy().overkillGoldRate;
gold += this.enemy().overkillGoldFlat;
}
return Math.round(gold);
};
Yanfly.OKB.Game_Enemy_dropItemRate = Game_Enemy.prototype.dropItemRate;
Game_Enemy.prototype.dropItemRate = function() {
var dropRate = Yanfly.OKB.Game_Enemy_dropItemRate.call(this);
if (this.isOverkilled()) {
dropRate *= this.enemy().overkillDropRate;
}
return dropRate;
};
//=============================================================================
// Compatibility Stuff
// ----------------------------------------------------------------------------
// YEP_ExtraEnemyDrops
//=============================================================================
if (Imported.YEP_ExtraEnemyDrops) {
Yanfly.OKB.DropManager_meetsLineCondition = DropManager.meetsLineCondition;
DropManager.meetsLineCondition = function(line) {
// IS OVERKILL
if (line.match(/IS OVERKILL/i)) {
return this.conditionIsOverkilled(line);
}
return Yanfly.OKB.DropManager_meetsLineCondition.call(this, line);
};
DropManager.conditionIsOverkilled = function(line) {
return this._enemy.isOverkilled();
};
}; // Imported.YEP_ExtraEnemyDrops
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
Yanfly.Util.displayError = function(e, code, message) {
console.log(message);
console.log(code || 'NON-EXISTENT');
console.error(e);
if (Utils.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= "1.6.0") return;
if (Utils.isNwjs() && Utils.isOptionValid('test')) {
if (!require('nw.gui').Window.get().isDevToolsOpen()) {
require('nw.gui').Window.get().showDevTools();
}
}
};
//=============================================================================
// End of File
//=============================================================================