You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
527 lines
19 KiB
JavaScript
527 lines
19 KiB
JavaScript
//=============================================================================
|
|
// Yanfly Engine Plugins - Taunt
|
|
// YEP_Taunt.js
|
|
//=============================================================================
|
|
|
|
var Imported = Imported || {};
|
|
Imported.YEP_Taunt = true;
|
|
|
|
var Yanfly = Yanfly || {};
|
|
Yanfly.Taunt = Yanfly.Taunt || {};
|
|
Yanfly.Taunt.version = 1.02;
|
|
|
|
//=============================================================================
|
|
/*:
|
|
* @plugindesc v1.02 Adds a Taunt mechanic to battle. Battlers with a
|
|
* taunt property become the target of enemy focus.
|
|
* @author Yanfly Engine Plugins
|
|
*
|
|
* @help
|
|
* ============================================================================
|
|
* Introduction
|
|
* ============================================================================
|
|
*
|
|
* Taunts add a new mechanic to battle. Whenever a unit has a member with a
|
|
* taunt trait, the opposing unit's single target attacks and skills must focus
|
|
* on the taunting unit. This adds aggro control for either unit and can add a
|
|
* new level of depth for battle. Taunts are divided up into physical, magical,
|
|
* and certain hit taunts which respectively aggro physical actions, magical
|
|
* actions, and certain hit actions.
|
|
*
|
|
* If there are multiple users with taunt, the rival party can select which
|
|
* taunt user to attack. This is to prevent a lockdown caused by a rival unit
|
|
* making the battle impossible to progress.
|
|
*
|
|
* ============================================================================
|
|
* Notetags
|
|
* ============================================================================
|
|
*
|
|
* The following are some notetags you can use to add taunt traits to your
|
|
* various database objects.
|
|
*
|
|
* Actor, Class, Weapon, Armor, State, Enemy Notetags:
|
|
* <Physical Taunt>
|
|
* <Magical Taunt>
|
|
* <Certain Taunt>
|
|
* These three notetags enable the database object of choice to have the
|
|
* respective taunt mechanic against those types of actions. Physical taunts
|
|
* will cause the user to aggro all physical type of actions from the rival
|
|
* team. The same goes for magical taunts and certain taunts of their nature.
|
|
*
|
|
* <Null Physical Taunt>
|
|
* <Null Magical Taunt>
|
|
* <Null Certain Taunt>
|
|
* This nullifies the respective taunt trait on the user (not the attacker).
|
|
* What this means is if a user originally has taunt through some form or
|
|
* means, having a null taunt trait applied will remove that taunt effect and
|
|
* the user will be treated as a normal target.
|
|
*
|
|
* <Ignore Physical Taunt>
|
|
* <Ignore Magical Taunt>
|
|
* <Ignore Certain Taunt>
|
|
* This allows an attacker with this trait to ignore any taunts of the
|
|
* respective nature and gain access to all possible targets as if no taunts
|
|
* are in place.
|
|
*
|
|
* Skill and Item Notetag:
|
|
* <Bypass Taunt>
|
|
* This causes this skill/item to ignore taunts altogether and the skill/item
|
|
* is able to select single targets as if no taunts existed on the field.
|
|
*
|
|
* ============================================================================
|
|
* Changelog
|
|
* ============================================================================
|
|
*
|
|
* Version 1.02:
|
|
* - Updated for RPG Maker MV version 1.5.0.
|
|
*
|
|
* Version 1.01:
|
|
* - Updated for RPG Maker MV version 1.1.0.
|
|
*
|
|
* Version 1.00:
|
|
* - Finished Plugin!
|
|
*/
|
|
//=============================================================================
|
|
|
|
//=============================================================================
|
|
// DataManager
|
|
//=============================================================================
|
|
|
|
Yanfly.Taunt.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
|
|
DataManager.isDatabaseLoaded = function () {
|
|
if (!Yanfly.Taunt.DataManager_isDatabaseLoaded.call(this)) return false;
|
|
if (!Yanfly._loaded_YEP_Taunt) {
|
|
this.processTauntNotetags1($dataActors);
|
|
this.processTauntNotetags1($dataClasses);
|
|
this.processTauntNotetags1($dataWeapons);
|
|
this.processTauntNotetags1($dataArmors);
|
|
this.processTauntNotetags1($dataStates);
|
|
this.processTauntNotetags1($dataEnemies);
|
|
this.processTauntNotetags2($dataSkills);
|
|
this.processTauntNotetags2($dataEnemies);
|
|
Yanfly._loaded_YEP_Taunt = true;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
DataManager.processTauntNotetags1 = function (group) {
|
|
var note1 = /<(?:PHYSICAL TAUNT)>/i;
|
|
var note2 = /<(?:MAGICAL TAUNT)>/i;
|
|
var note3 = /<(?:CERTAIN TAUNT)>/i;
|
|
var note4 = /<(?:NULL PHYSICAL TAUNT)>/i;
|
|
var note5 = /<(?:NULL MAGICAL TAUNT)>/i;
|
|
var note6 = /<(?:NULL CERTAIN TAUNT)>/i;
|
|
var note7 = /<(?:IGNORE PHYSICAL TAUNT)>/i;
|
|
var note8 = /<(?:IGNORE MAGICAL TAUNT)>/i;
|
|
var note9 = /<(?:IGNORE CERTAIN TAUNT)>/i;
|
|
for (var n = 1; n < group.length; n++) {
|
|
var obj = group[n];
|
|
var notedata = obj.note.split(/[\r\n]+/);
|
|
|
|
obj.physTaunt = false;
|
|
obj.magicTaunt = false;
|
|
obj.certainTaunt = false;
|
|
|
|
obj.nullPhysTaunt = false;
|
|
obj.nullMagicTaunt = false;
|
|
obj.nullCertainTaunt = false;
|
|
|
|
obj.ignorePhysTaunt = false;
|
|
obj.ignoreMagicTaunt = false;
|
|
obj.ignoreCertainTaunt = false;
|
|
|
|
for (var i = 0; i < notedata.length; i++) {
|
|
var line = notedata[i];
|
|
if (line.match(note1)) {
|
|
obj.physTaunt = true;
|
|
} else if (line.match(note2)) {
|
|
obj.magicTaunt = true;
|
|
} else if (line.match(note3)) {
|
|
obj.certainTaunt = true;
|
|
} else if (line.match(note4)) {
|
|
obj.nullPhysTaunt = true;
|
|
} else if (line.match(note5)) {
|
|
obj.nullMagicTaunt = true;
|
|
} else if (line.match(note6)) {
|
|
obj.nullCertainTaunt = true;
|
|
} else if (line.match(note7)) {
|
|
obj.ignorePhysTaunt = true;
|
|
} else if (line.match(note8)) {
|
|
obj.ignoreMagicTaunt = true;
|
|
} else if (line.match(note9)) {
|
|
obj.ignoreCertainTaunt = true;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
DataManager.processTauntNotetags2 = function (group) {
|
|
var note1 = /<(?:BYPASS TAUNT)>/i;
|
|
for (var n = 1; n < group.length; n++) {
|
|
var obj = group[n];
|
|
var notedata = obj.note.split(/[\r\n]+/);
|
|
|
|
obj.bypassTaunt = false;
|
|
|
|
for (var i = 0; i < notedata.length; i++) {
|
|
var line = notedata[i];
|
|
if (line.match(note1)) {
|
|
obj.bypassTaunt = true;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_BattlerBase
|
|
//=============================================================================
|
|
|
|
Game_BattlerBase.prototype.tauntPhysical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.physTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.tauntMagical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.magicTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.tauntCertain = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.certainTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.nullTauntPhysical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.nullPhysTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.nullTauntMagical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.nullMagicTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.nullTauntCertain = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.nullCertainTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.ignoreTauntPhysical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.ignorePhysTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.ignoreTauntMagical = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.ignoreMagicTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Game_BattlerBase.prototype.ignoreTauntCertain = function () {
|
|
for (var i = 0; i < this.states().length; ++i) {
|
|
var state = this.states()[i];
|
|
if (state.ignoreCertainTaunt) return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Actor
|
|
//=============================================================================
|
|
|
|
Game_Actor.prototype.tauntPhysical = function () {
|
|
if (this.nullTauntPhysical()) return false;
|
|
if (this.actor().physTaunt) return true;
|
|
if (this.currentClass().physTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.physTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.tauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.tauntMagical = function () {
|
|
if (this.nullTauntMagical()) return false;
|
|
if (this.actor().magicTaunt) return true;
|
|
if (this.currentClass().magicTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.magicTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.tauntMagical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.tauntCertain = function () {
|
|
if (this.nullTauntCertain()) return false;
|
|
if (this.actor().certainTaunt) return true;
|
|
if (this.currentClass().certainTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.certainTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.tauntCertain.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.nullTauntPhysical = function () {
|
|
if (this.actor().nullPhysTaunt) return true;
|
|
if (this.currentClass().nullPhysTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.nullPhysTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.nullTauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.nullTauntMagical = function () {
|
|
if (this.actor().nullMagicTaunt) return true;
|
|
if (this.currentClass().nullMagicTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.nullMagicTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.nullTauntMagical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.nullTauntCertain = function () {
|
|
if (this.actor().nullCertainTaunt) return true;
|
|
if (this.currentClass().nullCertainTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.nullCertainTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.nullTauntCertain.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.ignoreTauntPhysical = function () {
|
|
if (this.actor().ignorePhysTaunt) return true;
|
|
if (this.currentClass().ignorePhysTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.ignorePhysTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.ignoreTauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.ignoreTauntMagical = function () {
|
|
if (this.actor().ignoreMagicTaunt) return true;
|
|
if (this.currentClass().ignoreMagicTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.ignoreMagicTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.ignoreTauntMagical.call(this);
|
|
};
|
|
|
|
Game_Actor.prototype.ignoreTauntCertain = function () {
|
|
if (this.actor().ignoreCertainTaunt) return true;
|
|
if (this.currentClass().ignoreCertainTaunt) return true;
|
|
for (var i = 0; i < this.equips().length; ++i) {
|
|
var equip = this.equips()[i];
|
|
if (equip && equip.ignoreCertainTaunt) return true;
|
|
}
|
|
return Game_BattlerBase.prototype.ignoreTauntCertain.call(this);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Enemy
|
|
//=============================================================================
|
|
|
|
Game_Enemy.prototype.tauntPhysical = function () {
|
|
if (this.nullTauntPhysical()) return false;
|
|
if (this.enemy().physTaunt) return true;
|
|
return Game_BattlerBase.prototype.tauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.tauntMagical = function () {
|
|
if (this.nullTauntMagical()) return false;
|
|
if (this.enemy().magicTaunt) return true;
|
|
return Game_BattlerBase.prototype.tauntMagical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.tauntCertain = function () {
|
|
if (this.nullTauntCertain()) return false;
|
|
if (this.enemy().certainTaunt) return true;
|
|
return Game_BattlerBase.prototype.tauntCertain.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.nullTauntPhysical = function () {
|
|
if (this.enemy().nullPhysTaunt) return true;
|
|
return Game_BattlerBase.prototype.nullTauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.nullTauntMagical = function () {
|
|
if (this.enemy().nullMagicTaunt) return true;
|
|
return Game_BattlerBase.prototype.nullTauntMagical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.nullTauntCertain = function () {
|
|
if (this.enemy().nullCertainTaunt) return true;
|
|
return Game_BattlerBase.prototype.nullTauntCertain.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.ignoreTauntPhysical = function () {
|
|
if (this.enemy().ignorePhysTaunt) return true;
|
|
return Game_BattlerBase.prototype.ignoreTauntPhysical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.ignoreTauntMagical = function () {
|
|
if (this.enemy().ignoreMagicTaunt) return true;
|
|
return Game_BattlerBase.prototype.ignoreTauntMagical.call(this);
|
|
};
|
|
|
|
Game_Enemy.prototype.ignoreTauntCertain = function () {
|
|
if (this.enemy().nullCertainTaunt) return true;
|
|
return Game_BattlerBase.prototype.ignoreTauntCertain.call(this);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Unit
|
|
//=============================================================================
|
|
|
|
Yanfly.Taunt.Game_Unit_aliveMembers = Game_Unit.prototype.aliveMembers;
|
|
Game_Unit.prototype.aliveMembers = function () {
|
|
if (this._inBattle && $gameTemp._taunt) return this.tauntMembers();
|
|
return Yanfly.Taunt.Game_Unit_aliveMembers.call(this);
|
|
};
|
|
|
|
Game_Unit.prototype.physicalTauntMembers = function () {
|
|
return this.members().filter(function (member) {
|
|
return member.isAlive() && member.tauntPhysical();
|
|
});
|
|
};
|
|
|
|
Game_Unit.prototype.magicalTauntMembers = function () {
|
|
return this.members().filter(function (member) {
|
|
return member.isAlive() && member.tauntMagical();
|
|
});
|
|
};
|
|
|
|
Game_Unit.prototype.certainTauntMembers = function () {
|
|
return this.members().filter(function (member) {
|
|
return member.isAlive() && member.tauntCertain();
|
|
});
|
|
};
|
|
|
|
Game_Unit.prototype.tauntMembers = function () {
|
|
var action;
|
|
if ($gameTemp._tauntAction) {
|
|
action = $gameTemp._tauntAction;
|
|
} else if (BattleManager.inputtingAction()) {
|
|
action = BattleManager.inputtingAction();
|
|
} else {
|
|
return Yanfly.Taunt.Game_Unit_aliveMembers.call(this);
|
|
}
|
|
if (!action.isTauntable()) {
|
|
return Yanfly.Taunt.Game_Unit_aliveMembers.call(this);
|
|
}
|
|
if (action.isPhysical() && this.physicalTauntMembers().length > 0) {
|
|
return this.physicalTauntMembers();
|
|
} else if (action.isMagical() && this.magicalTauntMembers().length > 0) {
|
|
return this.magicalTauntMembers();
|
|
} else if (action.isCertainHit() && this.certainTauntMembers().length > 0) {
|
|
return this.certainTauntMembers();
|
|
}
|
|
return Yanfly.Taunt.Game_Unit_aliveMembers.call(this);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Action
|
|
//=============================================================================
|
|
|
|
Yanfly.Taunt.Game_Action_makeTargets = Game_Action.prototype.makeTargets;
|
|
Game_Action.prototype.makeTargets = function () {
|
|
if (this.isValid() && this.isTauntable()) {
|
|
$gameTemp._taunt = true;
|
|
$gameTemp._tauntAction = this;
|
|
}
|
|
var value = Yanfly.Taunt.Game_Action_makeTargets.call(this);
|
|
if (this.isValid() && this.isTauntable()) {
|
|
$gameTemp._taunt = false;
|
|
}
|
|
$gameTemp._tauntAction = undefined;
|
|
return value;
|
|
};
|
|
|
|
Game_Action.prototype.isTauntable = function () {
|
|
if (!this.checkItemScope([1])) return false;
|
|
if (this.item().bypassTaunt) return false;
|
|
if (this.isPhysical() && this.subject().ignoreTauntPhysical()) return false;
|
|
if (this.isMagical() && this.subject().ignoreTauntMagical()) return false;
|
|
if (this.isCertainHit() && this.subject().ignoreTauntCertain()) return false;
|
|
return true;
|
|
};
|
|
|
|
Yanfly.Taunt.Game_Action_targetsForOpponents = Game_Action.prototype.targetsForOpponents;
|
|
Game_Action.prototype.targetsForOpponents = function () {
|
|
var targets = Yanfly.Taunt.Game_Action_targetsForOpponents.call(this);
|
|
if (this.isValid() && this.isTauntable() && $gameTemp._taunt) {
|
|
if (this.isForOne() && this._targetIndex >= 0) {
|
|
targets = this.getTauntTarget(targets);
|
|
}
|
|
}
|
|
return targets;
|
|
};
|
|
|
|
Game_Action.prototype.getTauntTarget = function (targets) {
|
|
var unit = this.opponentsUnit();
|
|
var target = unit.smoothTarget(this._targetIndex);
|
|
if (this.isPhysical() && unit.physicalTauntMembers().length > 0) {
|
|
if (!unit.physicalTauntMembers().contains(target)) {
|
|
var group = unit.physicalTauntMembers();
|
|
target = group[Math.floor(Math.random() * group.length)];
|
|
targets = [target];
|
|
}
|
|
} else if (this.isMagical() && unit.magicalTauntMembers().length > 0) {
|
|
if (!unit.magicalTauntMembers().contains(target)) {
|
|
var group = unit.magicalTauntMembers();
|
|
target = group[Math.floor(Math.random() * group.length)];
|
|
targets = [target];
|
|
}
|
|
} else if (this.isCertainHit() && unit.certainTauntMembers().length > 0) {
|
|
if (!unit.certainTauntMembers().contains(target)) {
|
|
var group = unit.certainTauntMembers();
|
|
target = group[Math.floor(Math.random() * group.length)];
|
|
targets = [target];
|
|
}
|
|
}
|
|
return targets;
|
|
};
|
|
|
|
//=============================================================================
|
|
// Scene_Battle
|
|
//=============================================================================
|
|
|
|
Yanfly.Taunt.Scene_Battle_selectEnemySelection = Scene_Battle.prototype.selectEnemySelection;
|
|
Scene_Battle.prototype.selectEnemySelection = function () {
|
|
$gameTemp._taunt = true;
|
|
Yanfly.Taunt.Scene_Battle_selectEnemySelection.call(this);
|
|
$gameTemp._taunt = false;
|
|
};
|
|
|
|
//=============================================================================
|
|
// End of File
|
|
//=============================================================================
|