Files
Superproject1/js/plugins/YEP_X_BattleSysSTB.js
alexpolo1 3cfd07d722 2
2023-04-10 00:05:51 +02:00

728 lines
24 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Battle System - Standard Turn Battle
// YEP_X_BattleSysSTB.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_BattleSysSTB = true;
var Yanfly = Yanfly || {};
Yanfly.STB = Yanfly.STB || {};
Yanfly.STB.version = 1.05;
//=============================================================================
/*:
* @plugindesc v1.05 (Requires YEP_BattleEngineCore.js) Add STB (Standard
* Turn Battle) into your game using this plugin!
* @author Yanfly Engine Plugins
*
* @param ---General---
* @default
*
* @param Action Speed
* @parent ---General---
* @desc This is the formula used for an action's base speed.
* Default: agi + Math.randomInt(Math.floor(5 + agi / 4))
* @default agi
*
* @param Delay Status Adjust
* @parent ---General---
* @type boolean
* @on YES
* @off NO
* @desc Delay the time it takes for the Status Window to move towards
* the center. YES - true NO - false
* @default true
*
* @param ---Escape---
* @default
*
* @param Escape Ratio
* @parent ---Escape---
* @desc How STB calculates escape ratios.
* Default: 0.5 * $gameParty.agility() / $gameTroop.agility()
* @default 0.125 * $gameParty.agility() / $gameTroop.agility()
*
* @param Fail Escape Boost
* @parent ---Escape---
* @desc Each time the player fails escape, increase the success
* rate by this much. Default: 0.1
* @default 0.025
*
* @param ---Turn Order---
* @default
*
* @param Show Turn Window
* @parent ---Turn Order---
* @type boolean
* @on Show
* @off Hide
* @desc Show the turn order window?
* YES - true NO - false
* @default false
*
* @param Turn Window X
* @parent ---Turn Order---
* @desc The turn order window's x position.
* You can use a formula.
* @default Graphics.boxWidth - width
*
* @param Turn Window Y
* @parent ---Turn Order---
* @desc The turn order window's y position.
* You can use a formula.
* @default this.fittingHeight(2)
*
* @param Turn Window Width
* @parent ---Turn Order---
* @desc The turn order window's width.
* You can use a formula.
* @default 200
*
* @param Turn Window Height
* @parent ---Turn Order---
* @desc The turn order window's height.
* You can use a formula.
* @default Graphics.boxHeight - statusHeight - this.fittingHeight(2)
*
* @param Current Battler Color
* @parent ---Turn Order---
* @type number
* @min 0
* @max 31
* @desc The text color used for the current battler.
* @default 6
*
* @param Actor Battler Color
* @parent ---Turn Order---
* @type number
* @min 0
* @max 31
* @desc The text color used for the actors.
* @default 4
*
* @param Enemy Battler Color
* @parent ---Turn Order---
* @type number
* @min 0
* @max 31
* @desc The text color used for the enemies.
* @default 2
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin requires YEP_BattleEngineCore. Make sure this plugin is located
* under YEP_BattleEngineCore in the plugin list.
*
* To use the STB system, go to the Battle Engine Core plugin and change the
* 'Default System' setting in the parameters to 'stb'.
*
* The Standard Turn Battle system functions off of the Default Turn Battle
* system's structure. Action orders are determined by the battlers' AGI values
* and they go from highest to lowest. However, actions are not selected at the
* start of the turn. Instead, the turn progresses and the actions are picked
* as each battler's turn appears, then proceeds to be executed immediately.
*
* Each battler is only allowed one action per battle turn, meaning a single
* battler cannot have twice the number of turns as another battler even if the
* battler's AGI value is double that of the other. This is to prevent any
* balancing issues that come from tick-based battle systems as they tend to be
* far more difficult to balance compared to turn-based battle systems.
*
* Because of the nature of the Standard Turn Battle System, an item or skill's
* action speed value found in the database will be disabled as it cannot push
* forward a battler's in the turn order.
*
* ============================================================================
* Plugin Commands
* ============================================================================
*
* To change your battle system to Standard Turn Battle if it isn't the default
* battle system, you can use the following Plugin Command:
*
* Plugin Command:
* setBattleSys STB Sets battle system to Standard Turn Battle.
* setBattleSys DTB Sets battle system to Default Turn Battle.
*
* Using the above Plugin Commands, you can toggle between the Default Battle
* System and Standard Turn Battle!
*
* ============================================================================
* Notetags
* ============================================================================
*
* The following are notetags that pertain to and affect the STB system.
*
* Skill and Item Notetags:
*
* <STB Help>
* text
* text
* </STB Help>
* For those planning on using multiple battle systems, sometimes you may
* have your skills perform differently while using STB. If so, using this
* notetag will allow skills and items to display different help text while
* STB is enabled.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.05:
* - Fixed Forced Action endless bug and added compatibility with Instant Cast.
*
* Version 1.04:
* - 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.03:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.02:
* - Instant Cast compatibility update.
*
* Version 1.01:
* - Fixed a bug that caused escaping to crash the game if not using STB.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
if (Imported.YEP_BattleEngineCore) {
if (Yanfly.BEC.version && Yanfly.BEC.version >= 1.42) {
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_X_BattleSysSTB');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.STBActionSpeed = String(Yanfly.Parameters['Action Speed']);
Yanfly.Param.STBDelayStatus = String(Yanfly.Parameters['Delay Status Adjust']);
Yanfly.Param.STBDelayStatus = eval(Yanfly.Param.STBDelayStatus);
Yanfly.Param.STBEscapeRatio = String(Yanfly.Parameters['Escape Ratio']);
Yanfly.Param.STBEscapeBoost = String(Yanfly.Parameters['Fail Escape Boost']);
Yanfly.Param.STBShowWindow = String(Yanfly.Parameters['Show Turn Window']);
Yanfly.Param.STBShowWindow = eval(Yanfly.Param.STBShowWindow);
Yanfly.Param.STBWindowX = String(Yanfly.Parameters['Turn Window X']);
Yanfly.Param.STBWindowY = String(Yanfly.Parameters['Turn Window Y']);
Yanfly.Param.STBWindowW = String(Yanfly.Parameters['Turn Window Width']);
Yanfly.Param.STBWindowH = String(Yanfly.Parameters['Turn Window Height']);
Yanfly.Param.STBWinSubject = Number(Yanfly.Parameters['Current Battler Color']);
Yanfly.Param.STBWinActor = Number(Yanfly.Parameters['Actor Battler Color']);
Yanfly.Param.STBWinEnemy = Number(Yanfly.Parameters['Enemy Battler Color']);
//=============================================================================
// DataManager
//=============================================================================
Yanfly.STB.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.STB.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_X_BattleSysSTB) {
this.processSTBNotetags1($dataSkills);
this.processSTBNotetags1($dataItems);
Yanfly._loaded_YEP_X_BattleSysSTB = true;
}
return true;
};
DataManager.processSTBNotetags1 = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
var evalMode = 'none';
obj.stbHelp = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:STB HELP)>/i)) {
evalMode = 'stb help';
obj.stbHelp = '';
} else if (line.match(/<\/(?:STB HELP)>/i)) {
evalMode = 'none';
} else if (evalMode === 'stb help') {
obj.stbHelp += line + '\n';
}
}
}
};
//=============================================================================
// BattleManager
//=============================================================================
BattleManager.isSTB = function() {
return this.isBattleSystem('stb');
};
Yanfly.STB.BattleManager_isTurnBased = BattleManager.isTurnBased;
BattleManager.isTurnBased = function() {
if (this.isSTB()) return true;
return Yanfly.STB.BattleManager_isTurnBased.call(this);
};
Yanfly.STB.BattleManager_makeEscapeRatio = BattleManager.makeEscapeRatio;
BattleManager.makeEscapeRatio = function() {
if (this.isSTB()) {
var code = Yanfly.Param.STBEscapeRatio;
try {
this._escapeRatio = eval(code);
} catch (e) {
this._escapeRatio = 0;
Yanfly.Util.displayError(e, code, 'STB ESCAPE RATIO ERROR');
}
var code = Yanfly.Param.STBEscapeBoost;
try {
this._escapeFailBoost = eval(code);
} catch (e) {
this._escapeFailBoost = 0;
Yanfly.Util.displayError(e, code, 'STB ESCAPE BOOST ERROR');
}
} else {
this._escapeFailBoost = 0.1;
Yanfly.STB.BattleManager_makeEscapeRatio.call(this);
}
};
Yanfly.STB.BattleManager_startInput = BattleManager.startInput;
BattleManager.startInput = function() {
Yanfly.STB.BattleManager_startInput.call(this);
if (this.isSTB() && this._phase !== 'turn') this.startTurn();
};
Yanfly.STB.BattleManager_startTurn = BattleManager.startTurn;
BattleManager.startTurn = function() {
if (this._stbFailedEscape) {
this.stbFailedEscape();
} else {
Yanfly.STB.BattleManager_startTurn.call(this);
}
};
BattleManager.stbFailedEscape = function() {
this._stbFailedEscape = false;
$gameParty.requestMotionRefresh();
};
Yanfly.STB.BattleManager_processTurn = BattleManager.processTurn;
BattleManager.processTurn = function() {
var subject = this._subject;
SceneManager._scene.refreshSTBTurnOrderWindow();
if (this.isSTB() && subject.isActor()) {
this.startSTBInput();
} else {
Yanfly.STB.BattleManager_processTurn.call(this);
}
};
BattleManager.startSTBInput = function() {
this._phase = 'input';
var battler = this._subject;
BattleManager.changeActor(battler.index(), 'undecided');
if (!battler.canInput()) {
battler.makeActions();
this.startAction();
}
};
Yanfly.STB.BattleManager_selectPreviousCommand =
BattleManager.selectPreviousCommand;
BattleManager.selectPreviousCommand = function() {
if (this.isSTB()) {
this._activeSTBActor = this._actorIndex;
this._subject = null;
this.changeActor(-1, 'undecided');
} else {
Yanfly.STB.BattleManager_selectPreviousCommand.call(this);
}
};
Yanfly.STB.BattleManager_displayEscapeFailureMessage =
BattleManager.displayEscapeFailureMessage;
BattleManager.displayEscapeFailureMessage = function() {
Yanfly.STB.BattleManager_displayEscapeFailureMessage.call(this);
if (this.isSTB()) {
this.endAction();
this._stbFailedEscape = true;
}
};
BattleManager.stbSetSubject = function() {
BattleManager.changeActor(this._activeSTBActor, 'undecided');
this._subject = this.actor();
};
Yanfly.STB.BattleManager_selectNextCommand = BattleManager.selectNextCommand;
BattleManager.selectNextCommand = function() {
if (this.isSTB()) {
if (this._subject) {
this.startAction();
} else {
this.stbSetSubject();
this.startSTBInput();
}
} else {
Yanfly.STB.BattleManager_selectNextCommand.call(this);
}
};
Yanfly.STB.BattleManager_startAction = BattleManager.startAction;
BattleManager.startAction = function() {
if (Imported.YEP_InstantCast) this.detectStbInstantCast();
Yanfly.STB.BattleManager_startAction.call(this);
};
Yanfly.STB.BattleManager_endAction = BattleManager.endAction;
BattleManager.endAction = function() {
if (this.isSTB()) {
this.endSTBAction();
} else {
Yanfly.STB.BattleManager_endAction.call(this);
}
};
BattleManager.endSTBAction = function() {
this._phase = 'turn';
if (this._stbInstantCast) {
this._stbInstantCast = false;
return Yanfly.BEC.BattleManager_endAction.call(this);
}
if (this._subject) {
this._performedBattlers.push(this._subject);
this._subject.spriteStepBack();
this._subject.onAllActionsEnd();
this._subject.removeCurrentAction();
}
if (this._processingForcedAction) {
this._phase = this._preForcePhase;
this._processingForcedAction = false;
}
if (this.loadPreForceActionSettings()) return;
this._subject = null;
Yanfly.BEC.BattleManager_endAction.call(this);
};
BattleManager.detectStbInstantCast = function() {
this._stbInstantCast = false;
if (!this.isSTB()) return;
if (!this._subject) return;
if (!this._subject.currentAction()) return;
if (!this._subject.currentAction().item()) return;
var item = this._subject.currentAction().item();
this._stbInstantCast = this._subject.isInstantCast(item);
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.STB.Game_Action_speed = Game_Action.prototype.speed;
Game_Action.prototype.speed = function() {
if (BattleManager.isSTB()) {
var user = this.subject(); var a = user;
var maxhp = user.mhp; var mhp = user.mhp; var hp = user.hp;
var maxmp = user.mmp; var mmp = user.mmp; var mp = user.mp;
var maxtp = user.maxTp(); var mtp = user.maxTp(); var tp = user.tp;
var atk = user.atk; var def = user.def; var mat = user.mat;
var int = user.mat; var mdf = user.mdf; var res = user.res;
var agi = user.agi; var luk = user.luk;
var code = Yanfly.Param.STBActionSpeed;
try {
var speed = eval(code);
} catch (e) {
var speed = agi;
Yanfly.Util.displayError(e, code, 'STB ACTION SPEED FORMULA ERROR');
}
return speed;
} else {
return Yanfly.STB.Game_Action_speed.call(this);
}
};
//=============================================================================
// Scene_Battle
//=============================================================================
Yanfly.STB.Scene_Battle_createHelpWindow =
Scene_Battle.prototype.createHelpWindow;
Scene_Battle.prototype.createHelpWindow = function() {
if (BattleManager.isSTB()) this.createSTBTurnOrderWindow();
Yanfly.STB.Scene_Battle_createHelpWindow.call(this);
};
Scene_Battle.prototype.createSTBTurnOrderWindow = function() {
if (!Yanfly.Param.STBShowWindow) return;
var statusWindow = this._statusWindow;
this._stbTurnOrderWindow = new Window_STB_TurnOrder(statusWindow);
this.addWindow(this._stbTurnOrderWindow);
};
Scene_Battle.prototype.refreshSTBTurnOrderWindow = function() {
if (!this._stbTurnOrderWindow) return;
this._stbTurnOrderWindow.refresh();
};
Yanfly.STB.Scene_Battle_commandFight = Scene_Battle.prototype.commandFight;
Scene_Battle.prototype.commandFight = function() {
if (BattleManager.isSTB()) {
BattleManager.stbSetSubject();
BattleManager.startSTBInput();
} else {
Yanfly.STB.Scene_Battle_commandFight.call(this);
}
};
Yanfly.STB.Scene_Battle_commandEscape = Scene_Battle.prototype.commandEscape;
Scene_Battle.prototype.commandEscape = function() {
if (BattleManager.isSTB()) {
BattleManager.processEscape();
} else {
Yanfly.STB.Scene_Battle_commandEscape.call(this);
}
};
if (Yanfly.Param.STBDelayStatus) {
Yanfly.STB.Scene_Battle_updateWindowPositions =
Scene_Battle.prototype.updateWindowPositions;
Scene_Battle.prototype.updateWindowPositions = function() {
if (BattleManager.isSTB()) return this.updateWindowPositionsSTB();
Yanfly.STB.Scene_Battle_updateWindowPositions.call(this);
};
Scene_Battle.prototype.updateWindowPositionsSTB = function() {
if (this._STBWindowPosCount === undefined) this._STBWindowPosCount = 0;
if (this._partyCommandWindow.active) {
this._STBWindowPosCount = 16;
var statusX = 0;
statusX = this._partyCommandWindow.width;
if (this._statusWindow.x < statusX) {
this._statusWindow.x += 16;
if (this._statusWindow.x > statusX) this._statusWindow.x = statusX;
}
if (this._statusWindow.x > statusX) {
this._statusWindow.x -= 16;
if (this._statusWindow.x < statusX) this._statusWindow.x = statusX;
}
} else if (this._actorCommandWindow.active) {
this._STBWindowPosCount = 16;
Yanfly.STB.Scene_Battle_updateWindowPositions.call(this);
} else {
if (--this._STBWindowPosCount > 0) return;
Yanfly.STB.Scene_Battle_updateWindowPositions.call(this);
}
};
}; // Yanfly.Param.STBDelayStatus
//=============================================================================
// Window_Help
//=============================================================================
Yanfly.STB.Window_Help_setItem = Window_Help.prototype.setItem;
Window_Help.prototype.setItem = function(item) {
if (this.meetSTBConditions(item)) return this.setText(item.stbHelp);
Yanfly.STB.Window_Help_setItem.call(this, item);
};
Window_Help.prototype.meetSTBConditions = function(item) {
if (!item) return false;
if (!BattleManager.isSTB()) return false;
return item.stbHelp !== undefined;
};
//=============================================================================
// Window_STB_TurnOrder
//=============================================================================
function Window_STB_TurnOrder() {
this.initialize.apply(this, arguments);
}
Window_STB_TurnOrder.prototype = Object.create(Window_Base.prototype);
Window_STB_TurnOrder.prototype.constructor = Window_STB_TurnOrder;
Window_STB_TurnOrder.prototype.initialize = function(statusWindow) {
if (statusWindow) {
var statusHeight = statusWindow.height;
} else {
statusHeight = this.fittingHeight(4);
}
var code = Yanfly.Param.STBWindowW;
try {
var width = eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'STB TURN ORDER WINDOW WIDTH ERROR');
var width = 200;
}
var code = Yanfly.Param.STBWindowH;
try {
var height = eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'STB TURN ORDER WINDOW HEIGHT ERROR');
var height = Graphics.boxHeight - statusHeight - this.fittingHeight(2);
}
var code = Yanfly.Param.STBWindowX;
try {
var x = eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'STB TURN ORDER WINDOW X ERROR');
var x = Graphics.boxWidth - width;
}
var code = Yanfly.Param.STBWindowY;
try {
var y = eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'STB TURN ORDER WINDOW Y ERROR');
var y = this.fittingHeight(2);
}
Window_Base.prototype.initialize.call(this, x, y, width, height);
this.opacity = 0;
this.refresh();
};
Window_STB_TurnOrder.prototype.refresh = function() {
this.getTurnOrderData();
this.drawTurnOrders();
};
Window_STB_TurnOrder.prototype.getTurnOrderData = function() {
if (!BattleManager._actionBattlers) return;
if (!BattleManager._performedBattlers) return;
var array = BattleManager._actionBattlers;
this._actionBattlers = array.filter(Yanfly.Util.onlyUnique);
array = BattleManager._performedBattlers;
this._performedBattlers = array.filter(Yanfly.Util.onlyUnique);
};
Window_STB_TurnOrder.prototype.drawTurnOrders = function() {
if (!this._actionBattlers) return;
if (!this._performedBattlers) return;
this.contents.clear();
var dy = 0;
dy = this.drawPerformedActors(dy);
dy = this.drawSubject(dy);
dy = this.drawActionActors(dy);
};
Window_STB_TurnOrder.prototype.drawPerformedActors = function(dy) {
var dx = this.textPadding();
var dw = this.contents.width - this.textPadding() * 2;
this.resetFontSettings();
this.changePaintOpacity(false);
var array = this._performedBattlers;
var length = array.length;
for (var i = 0; i < length; ++i) {
var battler = array[i];
if (!battler) continue;
if (battler.isDead()) continue;
if (battler === BattleManager._subject) continue;
if (battler.isActor()) {
this.changeTextColor(this.textColor(Yanfly.Param.STBWinActor));
} else {
this.changeTextColor(this.textColor(Yanfly.Param.STBWinEnemy));
}
var text = this.getBattlerName(battler);
this.drawText(text, dx, dy, dw);
dy += this.lineHeight();
}
return dy;
};
Window_STB_TurnOrder.prototype.drawSubject = function(dy) {
if (!BattleManager._subject) return dy;
if (BattleManager._subject.isDead()) return dy;
var dx = this.textPadding();
var dw = this.contents.width - this.textPadding() * 2;
this.resetFontSettings();
this.changePaintOpacity(true);
this.changeTextColor(this.textColor(Yanfly.Param.STBWinSubject));
var battler = BattleManager._subject;
var text = this.getBattlerName(battler);
this.drawText(text, dx, dy, dw);
dy += this.lineHeight();
return dy;
};
Window_STB_TurnOrder.prototype.drawActionActors = function(dy) {
var dx = this.textPadding();
var dw = this.contents.width - this.textPadding() * 2;
this.resetFontSettings();
this.changePaintOpacity(true);
var array = this._actionBattlers;
var length = array.length;
for (var i = 0; i < length; ++i) {
var battler = array[i];
if (!battler) continue;
if (battler.isDead()) continue;
if (battler === BattleManager._subject) continue;
if (this._performedBattlers.contains(battler)) continue;
if (battler.isActor()) {
this.changeTextColor(this.textColor(Yanfly.Param.STBWinActor));
} else {
this.changeTextColor(this.textColor(Yanfly.Param.STBWinEnemy));
}
var text = this.getBattlerName(battler);
this.drawText(text, dx, dy, dw);
dy += this.lineHeight();
}
return dy;
};
Window_STB_TurnOrder.prototype.getBattlerName = function(battler) {
if (Imported.YEP_EnemyLevels && battler.isEnemy()) {
var text = Yanfly.ELV.Game_Enemy_name.call(battler);
} else {
var text = battler.name();
}
return text;
};
//=============================================================================
// 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();
}
}
};
Yanfly.Util.onlyUnique = function(value, index, self) {
return self.indexOf(value) === index;
};
//=============================================================================
// End of File
//=============================================================================
} else { // Yanfly.BEC.version
var text = '================================================================\n';
text += 'YEP_X_BattleSysSTB requires YEP_BattleEngineCore to be at the ';
text += 'latest version to run properly.\n\nPlease go to www.yanfly.moe and ';
text += 'update to the latest version for the YEP_BattleEngineCore plugin.\n';
text += '================================================================\n';
console.log(text);
require('nw.gui').Window.get().showDevTools();
} // Yanfly.BEC.version
}; // YEP_BattleEngineCore