RMMZ Objects

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 192

//=============================================================================

// rmmz_objects.js v1.8.0
//=============================================================================

//-----------------------------------------------------------------------------
// Game_Temp
//
// The game object class for temporary data that is not included in save data.

function Game_Temp() {
this.initialize(...arguments);
}

Game_Temp.prototype.initialize = function() {
this._isPlaytest = Utils.isOptionValid("test");
this._destinationX = null;
this._destinationY = null;
this._touchTarget = null;
this._touchState = "";
this._needsBattleRefresh = false;
this._commonEventQueue = [];
this._animationQueue = [];
this._balloonQueue = [];
this._lastActionData = [0, 0, 0, 0, 0, 0];
};

Game_Temp.prototype.isPlaytest = function() {
return this._isPlaytest;
};

Game_Temp.prototype.setDestination = function(x, y) {
this._destinationX = x;
this._destinationY = y;
};

Game_Temp.prototype.clearDestination = function() {
this._destinationX = null;
this._destinationY = null;
};

Game_Temp.prototype.isDestinationValid = function() {
return this._destinationX !== null;
};

Game_Temp.prototype.destinationX = function() {
return this._destinationX;
};

Game_Temp.prototype.destinationY = function() {
return this._destinationY;
};

Game_Temp.prototype.setTouchState = function(target, state) {


this._touchTarget = target;
this._touchState = state;
};

Game_Temp.prototype.clearTouchState = function() {
this._touchTarget = null;
this._touchState = "";
};

Game_Temp.prototype.touchTarget = function() {
return this._touchTarget;
};

Game_Temp.prototype.touchState = function() {
return this._touchState;
};

Game_Temp.prototype.requestBattleRefresh = function() {
if ($gameParty.inBattle()) {
this._needsBattleRefresh = true;
}
};

Game_Temp.prototype.clearBattleRefreshRequest = function() {
this._needsBattleRefresh = false;
};

Game_Temp.prototype.isBattleRefreshRequested = function() {
return this._needsBattleRefresh;
};

Game_Temp.prototype.reserveCommonEvent = function(commonEventId) {
this._commonEventQueue.push(commonEventId);
};

Game_Temp.prototype.retrieveCommonEvent = function() {
return $dataCommonEvents[this._commonEventQueue.shift()];
};

Game_Temp.prototype.clearCommonEventReservation = function() {
this._commonEventQueue.length = 0;
};

Game_Temp.prototype.isCommonEventReserved = function() {
return this._commonEventQueue.length > 0;
};

// prettier-ignore
Game_Temp.prototype.requestAnimation = function(
targets, animationId, mirror = false
) {
if ($dataAnimations[animationId]) {
const request = {
targets: targets,
animationId: animationId,
mirror: mirror
};
this._animationQueue.push(request);
for (const target of targets) {
if (target.startAnimation) {
target.startAnimation();
}
}
}
};
Game_Temp.prototype.retrieveAnimation = function() {
return this._animationQueue.shift();
};

Game_Temp.prototype.requestBalloon = function(target, balloonId) {


const request = { target: target, balloonId: balloonId };
this._balloonQueue.push(request);
if (target.startBalloon) {
target.startBalloon();
}
};

Game_Temp.prototype.retrieveBalloon = function() {
return this._balloonQueue.shift();
};

Game_Temp.prototype.lastActionData = function(type) {
return this._lastActionData[type] || 0;
};

Game_Temp.prototype.setLastActionData = function(type, value) {


this._lastActionData[type] = value;
};

Game_Temp.prototype.setLastUsedSkillId = function(skillID) {
this.setLastActionData(0, skillID);
};

Game_Temp.prototype.setLastUsedItemId = function(itemID) {
this.setLastActionData(1, itemID);
};

Game_Temp.prototype.setLastSubjectActorId = function(actorID) {
this.setLastActionData(2, actorID);
};

Game_Temp.prototype.setLastSubjectEnemyIndex = function(enemyIndex) {
this.setLastActionData(3, enemyIndex);
};

Game_Temp.prototype.setLastTargetActorId = function(actorID) {
this.setLastActionData(4, actorID);
};

Game_Temp.prototype.setLastTargetEnemyIndex = function(enemyIndex) {
this.setLastActionData(5, enemyIndex);
};

//-----------------------------------------------------------------------------
// Game_System
//
// The game object class for the system data.

function Game_System() {
this.initialize(...arguments);
}

Game_System.prototype.initialize = function() {
this._saveEnabled = true;
this._menuEnabled = true;
this._encounterEnabled = true;
this._formationEnabled = true;
this._battleCount = 0;
this._winCount = 0;
this._escapeCount = 0;
this._saveCount = 0;
this._versionId = 0;
this._savefileId = 0;
this._framesOnSave = 0;
this._bgmOnSave = null;
this._bgsOnSave = null;
this._windowTone = null;
this._battleBgm = null;
this._victoryMe = null;
this._defeatMe = null;
this._savedBgm = null;
this._walkingBgm = null;
};

Game_System.prototype.isJapanese = function() {
return $dataSystem.locale.match(/^ja/);
};

Game_System.prototype.isChinese = function() {
return $dataSystem.locale.match(/^zh/);
};

Game_System.prototype.isKorean = function() {
return $dataSystem.locale.match(/^ko/);
};

Game_System.prototype.isCJK = function() {
return $dataSystem.locale.match(/^(ja|zh|ko)/);
};

Game_System.prototype.isRussian = function() {
return $dataSystem.locale.match(/^ru/);
};

Game_System.prototype.isSideView = function() {
return $dataSystem.optSideView;
};

Game_System.prototype.isAutosaveEnabled = function() {
return $dataSystem.optAutosave;
};

Game_System.prototype.isSaveEnabled = function() {
return this._saveEnabled;
};

Game_System.prototype.disableSave = function() {
this._saveEnabled = false;
};

Game_System.prototype.enableSave = function() {
this._saveEnabled = true;
};

Game_System.prototype.isMenuEnabled = function() {
return this._menuEnabled;
};

Game_System.prototype.disableMenu = function() {
this._menuEnabled = false;
};

Game_System.prototype.enableMenu = function() {
this._menuEnabled = true;
};

Game_System.prototype.isEncounterEnabled = function() {
return this._encounterEnabled;
};

Game_System.prototype.disableEncounter = function() {
this._encounterEnabled = false;
};

Game_System.prototype.enableEncounter = function() {
this._encounterEnabled = true;
};

Game_System.prototype.isFormationEnabled = function() {
return this._formationEnabled;
};

Game_System.prototype.disableFormation = function() {
this._formationEnabled = false;
};

Game_System.prototype.enableFormation = function() {
this._formationEnabled = true;
};

Game_System.prototype.battleCount = function() {
return this._battleCount;
};

Game_System.prototype.winCount = function() {
return this._winCount;
};

Game_System.prototype.escapeCount = function() {
return this._escapeCount;
};

Game_System.prototype.saveCount = function() {
return this._saveCount;
};

Game_System.prototype.versionId = function() {
return this._versionId;
};

Game_System.prototype.savefileId = function() {
return this._savefileId || 0;
};

Game_System.prototype.setSavefileId = function(savefileId) {
this._savefileId = savefileId;
};

Game_System.prototype.windowTone = function() {
return this._windowTone || $dataSystem.windowTone;
};

Game_System.prototype.setWindowTone = function(value) {
this._windowTone = value;
};

Game_System.prototype.battleBgm = function() {
return this._battleBgm || $dataSystem.battleBgm;
};

Game_System.prototype.setBattleBgm = function(value) {
this._battleBgm = value;
};

Game_System.prototype.victoryMe = function() {
return this._victoryMe || $dataSystem.victoryMe;
};

Game_System.prototype.setVictoryMe = function(value) {
this._victoryMe = value;
};

Game_System.prototype.defeatMe = function() {
return this._defeatMe || $dataSystem.defeatMe;
};

Game_System.prototype.setDefeatMe = function(value) {
this._defeatMe = value;
};

Game_System.prototype.onBattleStart = function() {
this._battleCount++;
};

Game_System.prototype.onBattleWin = function() {
this._winCount++;
};

Game_System.prototype.onBattleEscape = function() {
this._escapeCount++;
};

Game_System.prototype.onBeforeSave = function() {
this._saveCount++;
this._versionId = $dataSystem.versionId;
this._framesOnSave = Graphics.frameCount;
this._bgmOnSave = AudioManager.saveBgm();
this._bgsOnSave = AudioManager.saveBgs();
};
Game_System.prototype.onAfterLoad = function() {
Graphics.frameCount = this._framesOnSave;
AudioManager.playBgm(this._bgmOnSave);
AudioManager.playBgs(this._bgsOnSave);
};

Game_System.prototype.playtime = function() {
return Math.floor(Graphics.frameCount / 60);
};

Game_System.prototype.playtimeText = function() {
const hour = Math.floor(this.playtime() / 60 / 60);
const min = Math.floor(this.playtime() / 60) % 60;
const sec = this.playtime() % 60;
return hour.padZero(2) + ":" + min.padZero(2) + ":" + sec.padZero(2);
};

Game_System.prototype.saveBgm = function() {
this._savedBgm = AudioManager.saveBgm();
};

Game_System.prototype.replayBgm = function() {
if (this._savedBgm) {
AudioManager.replayBgm(this._savedBgm);
}
};

Game_System.prototype.saveWalkingBgm = function() {
this._walkingBgm = AudioManager.saveBgm();
};

Game_System.prototype.replayWalkingBgm = function() {
if (this._walkingBgm) {
AudioManager.playBgm(this._walkingBgm);
}
};

Game_System.prototype.saveWalkingBgm2 = function() {
this._walkingBgm = $dataMap.bgm;
};

Game_System.prototype.mainFontFace = function() {
return "rmmz-mainfont, " + $dataSystem.advanced.fallbackFonts;
};

Game_System.prototype.numberFontFace = function() {
return "rmmz-numberfont, " + this.mainFontFace();
};

Game_System.prototype.mainFontSize = function() {
return $dataSystem.advanced.fontSize;
};

Game_System.prototype.windowPadding = function() {
return 12;
};

Game_System.prototype.windowOpacity = function() {
return $dataSystem.advanced.windowOpacity;
};

//-----------------------------------------------------------------------------
// Game_Timer
//
// The game object class for the timer.

function Game_Timer() {
this.initialize(...arguments);
}

Game_Timer.prototype.initialize = function() {
this._frames = 0;
this._working = false;
};

Game_Timer.prototype.update = function(sceneActive) {
if (sceneActive && this._working && this._frames > 0) {
this._frames--;
if (this._frames === 0) {
this.onExpire();
}
}
};

Game_Timer.prototype.start = function(count) {
this._frames = count;
this._working = true;
};

Game_Timer.prototype.stop = function() {
this._working = false;
};

Game_Timer.prototype.isWorking = function() {
return this._working;
};

Game_Timer.prototype.seconds = function() {
return Math.floor(this._frames / 60);
};

Game_Timer.prototype.frames = function() {
return this._frames;
};

Game_Timer.prototype.onExpire = function() {
BattleManager.abort();
};

//-----------------------------------------------------------------------------
// Game_Message
//
// The game object class for the state of the message window that displays text
// or selections, etc.

function Game_Message() {
this.initialize(...arguments);
}
Game_Message.prototype.initialize = function() {
this.clear();
};

Game_Message.prototype.clear = function() {
this._texts = [];
this._choices = [];
this._speakerName = "";
this._faceName = "";
this._faceIndex = 0;
this._background = 0;
this._positionType = 2;
this._choiceDefaultType = 0;
this._choiceCancelType = 0;
this._choiceBackground = 0;
this._choicePositionType = 2;
this._numInputVariableId = 0;
this._numInputMaxDigits = 0;
this._itemChoiceVariableId = 0;
this._itemChoiceItypeId = 0;
this._scrollMode = false;
this._scrollSpeed = 2;
this._scrollNoFast = false;
this._choiceCallback = null;
};

Game_Message.prototype.choices = function() {
return this._choices;
};

Game_Message.prototype.speakerName = function() {
return this._speakerName;
};

Game_Message.prototype.faceName = function() {
return this._faceName;
};

Game_Message.prototype.faceIndex = function() {
return this._faceIndex;
};

Game_Message.prototype.background = function() {
return this._background;
};

Game_Message.prototype.positionType = function() {
return this._positionType;
};

Game_Message.prototype.choiceDefaultType = function() {
return this._choiceDefaultType;
};

Game_Message.prototype.choiceCancelType = function() {
return this._choiceCancelType;
};
Game_Message.prototype.choiceBackground = function() {
return this._choiceBackground;
};

Game_Message.prototype.choicePositionType = function() {
return this._choicePositionType;
};

Game_Message.prototype.numInputVariableId = function() {
return this._numInputVariableId;
};

Game_Message.prototype.numInputMaxDigits = function() {
return this._numInputMaxDigits;
};

Game_Message.prototype.itemChoiceVariableId = function() {
return this._itemChoiceVariableId;
};

Game_Message.prototype.itemChoiceItypeId = function() {
return this._itemChoiceItypeId;
};

Game_Message.prototype.scrollMode = function() {
return this._scrollMode;
};

Game_Message.prototype.scrollSpeed = function() {
return this._scrollSpeed;
};

Game_Message.prototype.scrollNoFast = function() {
return this._scrollNoFast;
};

Game_Message.prototype.add = function(text) {
this._texts.push(text);
};

Game_Message.prototype.setSpeakerName = function(speakerName) {
this._speakerName = speakerName ? speakerName : "";
};

Game_Message.prototype.setFaceImage = function(faceName, faceIndex) {


this._faceName = faceName;
this._faceIndex = faceIndex;
};

Game_Message.prototype.setBackground = function(background) {
this._background = background;
};

Game_Message.prototype.setPositionType = function(positionType) {
this._positionType = positionType;
};

Game_Message.prototype.setChoices = function(choices, defaultType, cancelType) {


this._choices = choices;
this._choiceDefaultType = defaultType;
this._choiceCancelType = cancelType;
};

Game_Message.prototype.setChoiceBackground = function(background) {
this._choiceBackground = background;
};

Game_Message.prototype.setChoicePositionType = function(positionType) {
this._choicePositionType = positionType;
};

Game_Message.prototype.setNumberInput = function(variableId, maxDigits) {


this._numInputVariableId = variableId;
this._numInputMaxDigits = maxDigits;
};

Game_Message.prototype.setItemChoice = function(variableId, itemType) {


this._itemChoiceVariableId = variableId;
this._itemChoiceItypeId = itemType;
};

Game_Message.prototype.setScroll = function(speed, noFast) {


this._scrollMode = true;
this._scrollSpeed = speed;
this._scrollNoFast = noFast;
};

Game_Message.prototype.setChoiceCallback = function(callback) {
this._choiceCallback = callback;
};

Game_Message.prototype.onChoice = function(n) {
if (this._choiceCallback) {
this._choiceCallback(n);
this._choiceCallback = null;
}
};

Game_Message.prototype.hasText = function() {
return this._texts.length > 0;
};

Game_Message.prototype.isChoice = function() {
return this._choices.length > 0;
};

Game_Message.prototype.isNumberInput = function() {
return this._numInputVariableId > 0;
};

Game_Message.prototype.isItemChoice = function() {
return this._itemChoiceVariableId > 0;
};

Game_Message.prototype.isBusy = function() {
return (
this.hasText() ||
this.isChoice() ||
this.isNumberInput() ||
this.isItemChoice()
);
};

Game_Message.prototype.newPage = function() {
if (this._texts.length > 0) {
this._texts[this._texts.length - 1] += "\f";
}
};

Game_Message.prototype.allText = function() {
return this._texts.join("\n");
};

Game_Message.prototype.isRTL = function() {
return Utils.containsArabic(this.allText());
};

//-----------------------------------------------------------------------------
// Game_Switches
//
// The game object class for switches.

function Game_Switches() {
this.initialize(...arguments);
}

Game_Switches.prototype.initialize = function() {
this.clear();
};

Game_Switches.prototype.clear = function() {
this._data = [];
};

Game_Switches.prototype.value = function(switchId) {
return !!this._data[switchId];
};

Game_Switches.prototype.setValue = function(switchId, value) {


if (switchId > 0 && switchId < $dataSystem.switches.length) {
this._data[switchId] = value;
this.onChange();
}
};

Game_Switches.prototype.onChange = function() {
$gameMap.requestRefresh();
};

//-----------------------------------------------------------------------------
// Game_Variables
//
// The game object class for variables.

function Game_Variables() {
this.initialize(...arguments);
}
Game_Variables.prototype.initialize = function() {
this.clear();
};

Game_Variables.prototype.clear = function() {
this._data = [];
};

Game_Variables.prototype.value = function(variableId) {
return this._data[variableId] || 0;
};

Game_Variables.prototype.setValue = function(variableId, value) {


if (variableId > 0 && variableId < $dataSystem.variables.length) {
if (typeof value === "number") {
value = Math.floor(value);
}
this._data[variableId] = value;
this.onChange();
}
};

Game_Variables.prototype.onChange = function() {
$gameMap.requestRefresh();
};

//-----------------------------------------------------------------------------
// Game_SelfSwitches
//
// The game object class for self switches.

function Game_SelfSwitches() {
this.initialize(...arguments);
}

Game_SelfSwitches.prototype.initialize = function() {
this.clear();
};

Game_SelfSwitches.prototype.clear = function() {
this._data = {};
};

Game_SelfSwitches.prototype.value = function(key) {
return !!this._data[key];
};

Game_SelfSwitches.prototype.setValue = function(key, value) {


if (value) {
this._data[key] = true;
} else {
delete this._data[key];
}
this.onChange();
};

Game_SelfSwitches.prototype.onChange = function() {
$gameMap.requestRefresh();
};

//-----------------------------------------------------------------------------
// Game_Screen
//
// The game object class for screen effect data, such as changes in color tone
// and flashes.

function Game_Screen() {
this.initialize(...arguments);
}

Game_Screen.prototype.initialize = function() {
this.clear();
};

Game_Screen.prototype.clear = function() {
this.clearFade();
this.clearTone();
this.clearFlash();
this.clearShake();
this.clearZoom();
this.clearWeather();
this.clearPictures();
};

Game_Screen.prototype.onBattleStart = function() {
this.clearFade();
this.clearFlash();
this.clearShake();
this.clearZoom();
this.eraseBattlePictures();
};

Game_Screen.prototype.brightness = function() {
return this._brightness;
};

Game_Screen.prototype.tone = function() {
return this._tone;
};

Game_Screen.prototype.flashColor = function() {
return this._flashColor;
};

Game_Screen.prototype.shake = function() {
return this._shake;
};

Game_Screen.prototype.zoomX = function() {
return this._zoomX;
};

Game_Screen.prototype.zoomY = function() {
return this._zoomY;
};

Game_Screen.prototype.zoomScale = function() {
return this._zoomScale;
};

Game_Screen.prototype.weatherType = function() {
return this._weatherType;
};

Game_Screen.prototype.weatherPower = function() {
return this._weatherPower;
};

Game_Screen.prototype.picture = function(pictureId) {
const realPictureId = this.realPictureId(pictureId);
return this._pictures[realPictureId];
};

Game_Screen.prototype.realPictureId = function(pictureId) {
if ($gameParty.inBattle()) {
return pictureId + this.maxPictures();
} else {
return pictureId;
}
};

Game_Screen.prototype.clearFade = function() {
this._brightness = 255;
this._fadeOutDuration = 0;
this._fadeInDuration = 0;
};

Game_Screen.prototype.clearTone = function() {
this._tone = [0, 0, 0, 0];
this._toneTarget = [0, 0, 0, 0];
this._toneDuration = 0;
};

Game_Screen.prototype.clearFlash = function() {
this._flashColor = [0, 0, 0, 0];
this._flashDuration = 0;
};

Game_Screen.prototype.clearShake = function() {
this._shakePower = 0;
this._shakeSpeed = 0;
this._shakeDuration = 0;
this._shakeDirection = 1;
this._shake = 0;
};

Game_Screen.prototype.clearZoom = function() {
this._zoomX = 0;
this._zoomY = 0;
this._zoomScale = 1;
this._zoomScaleTarget = 1;
this._zoomDuration = 0;
};

Game_Screen.prototype.clearWeather = function() {
this._weatherType = "none";
this._weatherPower = 0;
this._weatherPowerTarget = 0;
this._weatherDuration = 0;
};

Game_Screen.prototype.clearPictures = function() {
this._pictures = [];
};

Game_Screen.prototype.eraseBattlePictures = function() {
this._pictures = this._pictures.slice(0, this.maxPictures() + 1);
};

Game_Screen.prototype.maxPictures = function() {
return 100;
};

Game_Screen.prototype.startFadeOut = function(duration) {
this._fadeOutDuration = duration;
this._fadeInDuration = 0;
};

Game_Screen.prototype.startFadeIn = function(duration) {
this._fadeInDuration = duration;
this._fadeOutDuration = 0;
};

Game_Screen.prototype.startTint = function(tone, duration) {


this._toneTarget = tone.clone();
this._toneDuration = duration;
if (this._toneDuration === 0) {
this._tone = this._toneTarget.clone();
}
};

Game_Screen.prototype.startFlash = function(color, duration) {


this._flashColor = color.clone();
this._flashDuration = duration;
};

Game_Screen.prototype.startShake = function(power, speed, duration) {


this._shakePower = power;
this._shakeSpeed = speed;
this._shakeDuration = duration;
};

Game_Screen.prototype.startZoom = function(x, y, scale, duration) {


this._zoomX = x;
this._zoomY = y;
this._zoomScaleTarget = scale;
this._zoomDuration = duration;
};

Game_Screen.prototype.setZoom = function(x, y, scale) {


this._zoomX = x;
this._zoomY = y;
this._zoomScale = scale;
};
Game_Screen.prototype.changeWeather = function(type, power, duration) {
if (type !== "none" || duration === 0) {
this._weatherType = type;
}
this._weatherPowerTarget = type === "none" ? 0 : power;
this._weatherDuration = duration;
if (duration === 0) {
this._weatherPower = this._weatherPowerTarget;
}
};

Game_Screen.prototype.update = function() {
this.updateFadeOut();
this.updateFadeIn();
this.updateTone();
this.updateFlash();
this.updateShake();
this.updateZoom();
this.updateWeather();
this.updatePictures();
};

Game_Screen.prototype.updateFadeOut = function() {
if (this._fadeOutDuration > 0) {
const d = this._fadeOutDuration;
this._brightness = (this._brightness * (d - 1)) / d;
this._fadeOutDuration--;
}
};

Game_Screen.prototype.updateFadeIn = function() {
if (this._fadeInDuration > 0) {
const d = this._fadeInDuration;
this._brightness = (this._brightness * (d - 1) + 255) / d;
this._fadeInDuration--;
}
};

Game_Screen.prototype.updateTone = function() {
if (this._toneDuration > 0) {
const d = this._toneDuration;
for (let i = 0; i < 4; i++) {
this._tone[i] = (this._tone[i] * (d - 1) + this._toneTarget[i]) / d;
}
this._toneDuration--;
}
};

Game_Screen.prototype.updateFlash = function() {
if (this._flashDuration > 0) {
const d = this._flashDuration;
this._flashColor[3] *= (d - 1) / d;
this._flashDuration--;
}
};

Game_Screen.prototype.updateShake = function() {
if (this._shakeDuration > 0 || this._shake !== 0) {
const delta =
(this._shakePower * this._shakeSpeed * this._shakeDirection) / 10;
if (
this._shakeDuration <= 1 &&
this._shake * (this._shake + delta) < 0
) {
this._shake = 0;
} else {
this._shake += delta;
}
if (this._shake > this._shakePower * 2) {
this._shakeDirection = -1;
}
if (this._shake < -this._shakePower * 2) {
this._shakeDirection = 1;
}
this._shakeDuration--;
}
};

Game_Screen.prototype.updateZoom = function() {
if (this._zoomDuration > 0) {
const d = this._zoomDuration;
const t = this._zoomScaleTarget;
this._zoomScale = (this._zoomScale * (d - 1) + t) / d;
this._zoomDuration--;
}
};

Game_Screen.prototype.updateWeather = function() {
if (this._weatherDuration > 0) {
const d = this._weatherDuration;
const t = this._weatherPowerTarget;
this._weatherPower = (this._weatherPower * (d - 1) + t) / d;
this._weatherDuration--;
if (this._weatherDuration === 0 && this._weatherPowerTarget === 0) {
this._weatherType = "none";
}
}
};

Game_Screen.prototype.updatePictures = function() {
for (const picture of this._pictures) {
if (picture) {
picture.update();
}
}
};

Game_Screen.prototype.startFlashForDamage = function() {
this.startFlash([255, 0, 0, 128], 8);
};

// prettier-ignore
Game_Screen.prototype.showPicture = function(
pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode
) {
const realPictureId = this.realPictureId(pictureId);
const picture = new Game_Picture();
picture.show(name, origin, x, y, scaleX, scaleY, opacity, blendMode);
this._pictures[realPictureId] = picture;
};

// prettier-ignore
Game_Screen.prototype.movePicture = function(
pictureId, origin, x, y, scaleX, scaleY, opacity, blendMode, duration,
easingType
) {
const picture = this.picture(pictureId);
if (picture) {
// prettier-ignore
picture.move(origin, x, y, scaleX, scaleY, opacity, blendMode,
duration, easingType);
}
};

Game_Screen.prototype.rotatePicture = function(pictureId, speed) {


const picture = this.picture(pictureId);
if (picture) {
picture.rotate(speed);
}
};

Game_Screen.prototype.tintPicture = function(pictureId, tone, duration) {


const picture = this.picture(pictureId);
if (picture) {
picture.tint(tone, duration);
}
};

Game_Screen.prototype.erasePicture = function(pictureId) {
const realPictureId = this.realPictureId(pictureId);
this._pictures[realPictureId] = null;
};

//-----------------------------------------------------------------------------
// Game_Picture
//
// The game object class for a picture.

function Game_Picture() {
this.initialize(...arguments);
}

Game_Picture.prototype.initialize = function() {
this.initBasic();
this.initTarget();
this.initTone();
this.initRotation();
};

Game_Picture.prototype.name = function() {
return this._name;
};

Game_Picture.prototype.origin = function() {
return this._origin;
};
Game_Picture.prototype.x = function() {
return this._x;
};

Game_Picture.prototype.y = function() {
return this._y;
};

Game_Picture.prototype.scaleX = function() {
return this._scaleX;
};

Game_Picture.prototype.scaleY = function() {
return this._scaleY;
};

Game_Picture.prototype.opacity = function() {
return this._opacity;
};

Game_Picture.prototype.blendMode = function() {
return this._blendMode;
};

Game_Picture.prototype.tone = function() {
return this._tone;
};

Game_Picture.prototype.angle = function() {
return this._angle;
};

Game_Picture.prototype.initBasic = function() {
this._name = "";
this._origin = 0;
this._x = 0;
this._y = 0;
this._scaleX = 100;
this._scaleY = 100;
this._opacity = 255;
this._blendMode = 0;
};

Game_Picture.prototype.initTarget = function() {
this._targetX = this._x;
this._targetY = this._y;
this._targetScaleX = this._scaleX;
this._targetScaleY = this._scaleY;
this._targetOpacity = this._opacity;
this._duration = 0;
this._wholeDuration = 0;
this._easingType = 0;
this._easingExponent = 0;
};

Game_Picture.prototype.initTone = function() {
this._tone = null;
this._toneTarget = null;
this._toneDuration = 0;
};

Game_Picture.prototype.initRotation = function() {
this._angle = 0;
this._rotationSpeed = 0;
};

// prettier-ignore
Game_Picture.prototype.show = function(
name, origin, x, y, scaleX, scaleY, opacity, blendMode
) {
this._name = name;
this._origin = origin;
this._x = x;
this._y = y;
this._scaleX = scaleX;
this._scaleY = scaleY;
this._opacity = opacity;
this._blendMode = blendMode;
this.initTarget();
this.initTone();
this.initRotation();
};

// prettier-ignore
Game_Picture.prototype.move = function(
origin, x, y, scaleX, scaleY, opacity, blendMode, duration, easingType
) {
this._origin = origin;
this._targetX = x;
this._targetY = y;
this._targetScaleX = scaleX;
this._targetScaleY = scaleY;
this._targetOpacity = opacity;
this._blendMode = blendMode;
this._duration = duration;
this._wholeDuration = duration;
this._easingType = easingType;
this._easingExponent = 2;
};

Game_Picture.prototype.rotate = function(speed) {
this._rotationSpeed = speed;
};

Game_Picture.prototype.tint = function(tone, duration) {


if (!this._tone) {
this._tone = [0, 0, 0, 0];
}
this._toneTarget = tone.clone();
this._toneDuration = duration;
if (this._toneDuration === 0) {
this._tone = this._toneTarget.clone();
}
};

Game_Picture.prototype.update = function() {
this.updateMove();
this.updateTone();
this.updateRotation();
};

Game_Picture.prototype.updateMove = function() {
if (this._duration > 0) {
this._x = this.applyEasing(this._x, this._targetX);
this._y = this.applyEasing(this._y, this._targetY);
this._scaleX = this.applyEasing(this._scaleX, this._targetScaleX);
this._scaleY = this.applyEasing(this._scaleY, this._targetScaleY);
this._opacity = this.applyEasing(this._opacity, this._targetOpacity);
this._duration--;
}
};

Game_Picture.prototype.updateTone = function() {
if (this._toneDuration > 0) {
const d = this._toneDuration;
for (let i = 0; i < 4; i++) {
this._tone[i] = (this._tone[i] * (d - 1) + this._toneTarget[i]) / d;
}
this._toneDuration--;
}
};

Game_Picture.prototype.updateRotation = function() {
if (this._rotationSpeed !== 0) {
this._angle += this._rotationSpeed / 2;
}
};

Game_Picture.prototype.applyEasing = function(current, target) {


const d = this._duration;
const wd = this._wholeDuration;
const lt = this.calcEasing((wd - d) / wd);
const t = this.calcEasing((wd - d + 1) / wd);
const start = (current - target * lt) / (1 - lt);
return start + (target - start) * t;
};

Game_Picture.prototype.calcEasing = function(t) {
const exponent = this._easingExponent;
switch (this._easingType) {
case 1: // Slow start
return this.easeIn(t, exponent);
case 2: // Slow end
return this.easeOut(t, exponent);
case 3: // Slow start and end
return this.easeInOut(t, exponent);
default:
return t;
}
};

Game_Picture.prototype.easeIn = function(t, exponent) {


return Math.pow(t, exponent);
};

Game_Picture.prototype.easeOut = function(t, exponent) {


return 1 - Math.pow(1 - t, exponent);
};

Game_Picture.prototype.easeInOut = function(t, exponent) {


if (t < 0.5) {
return this.easeIn(t * 2, exponent) / 2;
} else {
return this.easeOut(t * 2 - 1, exponent) / 2 + 0.5;
}
};

//-----------------------------------------------------------------------------
// Game_Item
//
// The game object class for handling skills, items, weapons, and armor. It is
// required because save data should not include the database object itself.

function Game_Item() {
this.initialize(...arguments);
}

Game_Item.prototype.initialize = function(item) {
this._dataClass = "";
this._itemId = 0;
if (item) {
this.setObject(item);
}
};

Game_Item.prototype.isSkill = function() {
return this._dataClass === "skill";
};

Game_Item.prototype.isItem = function() {
return this._dataClass === "item";
};

Game_Item.prototype.isUsableItem = function() {
return this.isSkill() || this.isItem();
};

Game_Item.prototype.isWeapon = function() {
return this._dataClass === "weapon";
};

Game_Item.prototype.isArmor = function() {
return this._dataClass === "armor";
};

Game_Item.prototype.isEquipItem = function() {
return this.isWeapon() || this.isArmor();
};

Game_Item.prototype.isNull = function() {
return this._dataClass === "";
};

Game_Item.prototype.itemId = function() {
return this._itemId;
};
Game_Item.prototype.object = function() {
if (this.isSkill()) {
return $dataSkills[this._itemId];
} else if (this.isItem()) {
return $dataItems[this._itemId];
} else if (this.isWeapon()) {
return $dataWeapons[this._itemId];
} else if (this.isArmor()) {
return $dataArmors[this._itemId];
} else {
return null;
}
};

Game_Item.prototype.setObject = function(item) {
if (DataManager.isSkill(item)) {
this._dataClass = "skill";
} else if (DataManager.isItem(item)) {
this._dataClass = "item";
} else if (DataManager.isWeapon(item)) {
this._dataClass = "weapon";
} else if (DataManager.isArmor(item)) {
this._dataClass = "armor";
} else {
this._dataClass = "";
}
this._itemId = item ? item.id : 0;
};

Game_Item.prototype.setEquip = function(isWeapon, itemId) {


this._dataClass = isWeapon ? "weapon" : "armor";
this._itemId = itemId;
};

//-----------------------------------------------------------------------------
// Game_Action
//
// The game object class for a battle action.

function Game_Action() {
this.initialize(...arguments);
}

Game_Action.EFFECT_RECOVER_HP = 11;
Game_Action.EFFECT_RECOVER_MP = 12;
Game_Action.EFFECT_GAIN_TP = 13;
Game_Action.EFFECT_ADD_STATE = 21;
Game_Action.EFFECT_REMOVE_STATE = 22;
Game_Action.EFFECT_ADD_BUFF = 31;
Game_Action.EFFECT_ADD_DEBUFF = 32;
Game_Action.EFFECT_REMOVE_BUFF = 33;
Game_Action.EFFECT_REMOVE_DEBUFF = 34;
Game_Action.EFFECT_SPECIAL = 41;
Game_Action.EFFECT_GROW = 42;
Game_Action.EFFECT_LEARN_SKILL = 43;
Game_Action.EFFECT_COMMON_EVENT = 44;
Game_Action.SPECIAL_EFFECT_ESCAPE = 0;
Game_Action.HITTYPE_CERTAIN = 0;
Game_Action.HITTYPE_PHYSICAL = 1;
Game_Action.HITTYPE_MAGICAL = 2;

Game_Action.prototype.initialize = function(subject, forcing) {


this._subjectActorId = 0;
this._subjectEnemyIndex = -1;
this._forcing = forcing || false;
this.setSubject(subject);
this.clear();
};

Game_Action.prototype.clear = function() {
this._item = new Game_Item();
this._targetIndex = -1;
};

Game_Action.prototype.setSubject = function(subject) {
if (subject.isActor()) {
this._subjectActorId = subject.actorId();
this._subjectEnemyIndex = -1;
} else {
this._subjectEnemyIndex = subject.index();
this._subjectActorId = 0;
}
};

Game_Action.prototype.subject = function() {
if (this._subjectActorId > 0) {
return $gameActors.actor(this._subjectActorId);
} else {
return $gameTroop.members()[this._subjectEnemyIndex];
}
};

Game_Action.prototype.friendsUnit = function() {
return this.subject().friendsUnit();
};

Game_Action.prototype.opponentsUnit = function() {
return this.subject().opponentsUnit();
};

Game_Action.prototype.setEnemyAction = function(action) {
if (action) {
this.setSkill(action.skillId);
} else {
this.clear();
}
};

Game_Action.prototype.setAttack = function() {
this.setSkill(this.subject().attackSkillId());
};

Game_Action.prototype.setGuard = function() {
this.setSkill(this.subject().guardSkillId());
};

Game_Action.prototype.setSkill = function(skillId) {
this._item.setObject($dataSkills[skillId]);
};

Game_Action.prototype.setItem = function(itemId) {
this._item.setObject($dataItems[itemId]);
};

Game_Action.prototype.setItemObject = function(object) {
this._item.setObject(object);
};

Game_Action.prototype.setTarget = function(targetIndex) {
this._targetIndex = targetIndex;
};

Game_Action.prototype.item = function() {
return this._item.object();
};

Game_Action.prototype.isSkill = function() {
return this._item.isSkill();
};

Game_Action.prototype.isItem = function() {
return this._item.isItem();
};

Game_Action.prototype.numRepeats = function() {
let repeats = this.item().repeats;
if (this.isAttack()) {
repeats += this.subject().attackTimesAdd();
}
return Math.floor(repeats);
};

Game_Action.prototype.checkItemScope = function(list) {
return list.includes(this.item().scope);
};

Game_Action.prototype.isForOpponent = function() {
return this.checkItemScope([1, 2, 3, 4, 5, 6, 14]);
};

Game_Action.prototype.isForFriend = function() {
return this.checkItemScope([7, 8, 9, 10, 11, 12, 13, 14]);
};

Game_Action.prototype.isForEveryone = function() {
return this.checkItemScope([14]);
};

Game_Action.prototype.isForAliveFriend = function() {
return this.checkItemScope([7, 8, 11, 14]);
};

Game_Action.prototype.isForDeadFriend = function() {
return this.checkItemScope([9, 10]);
};
Game_Action.prototype.isForUser = function() {
return this.checkItemScope([11]);
};

Game_Action.prototype.isForOne = function() {
return this.checkItemScope([1, 3, 7, 9, 11, 12]);
};

Game_Action.prototype.isForRandom = function() {
return this.checkItemScope([3, 4, 5, 6]);
};

Game_Action.prototype.isForAll = function() {
return this.checkItemScope([2, 8, 10, 13, 14]);
};

Game_Action.prototype.needsSelection = function() {
return this.checkItemScope([1, 7, 9, 12]);
};

Game_Action.prototype.numTargets = function() {
return this.isForRandom() ? this.item().scope - 2 : 0;
};

Game_Action.prototype.checkDamageType = function(list) {
return list.includes(this.item().damage.type);
};

Game_Action.prototype.isHpEffect = function() {
return this.checkDamageType([1, 3, 5]);
};

Game_Action.prototype.isMpEffect = function() {
return this.checkDamageType([2, 4, 6]);
};

Game_Action.prototype.isDamage = function() {
return this.checkDamageType([1, 2]);
};

Game_Action.prototype.isRecover = function() {
return this.checkDamageType([3, 4]);
};

Game_Action.prototype.isDrain = function() {
return this.checkDamageType([5, 6]);
};

Game_Action.prototype.isHpRecover = function() {
return this.checkDamageType([3]);
};

Game_Action.prototype.isMpRecover = function() {
return this.checkDamageType([4]);
};

Game_Action.prototype.isCertainHit = function() {
return this.item().hitType === Game_Action.HITTYPE_CERTAIN;
};
Game_Action.prototype.isPhysical = function() {
return this.item().hitType === Game_Action.HITTYPE_PHYSICAL;
};

Game_Action.prototype.isMagical = function() {
return this.item().hitType === Game_Action.HITTYPE_MAGICAL;
};

Game_Action.prototype.isAttack = function() {
return this.item() === $dataSkills[this.subject().attackSkillId()];
};

Game_Action.prototype.isGuard = function() {
return this.item() === $dataSkills[this.subject().guardSkillId()];
};

Game_Action.prototype.isMagicSkill = function() {
if (this.isSkill()) {
return $dataSystem.magicSkills.includes(this.item().stypeId);
} else {
return false;
}
};

Game_Action.prototype.decideRandomTarget = function() {
let target;
if (this.isForDeadFriend()) {
target = this.friendsUnit().randomDeadTarget();
} else if (this.isForFriend()) {
target = this.friendsUnit().randomTarget();
} else {
target = this.opponentsUnit().randomTarget();
}
if (target) {
this._targetIndex = target.index();
} else {
this.clear();
}
};

Game_Action.prototype.setConfusion = function() {
this.setAttack();
};

Game_Action.prototype.prepare = function() {
if (this.subject().isConfused() && !this._forcing) {
this.setConfusion();
}
};

Game_Action.prototype.isValid = function() {
return (this._forcing && this.item()) || this.subject().canUse(this.item());
};

Game_Action.prototype.speed = function() {
const agi = this.subject().agi;
let speed = agi + Math.randomInt(Math.floor(5 + agi / 4));
if (this.item()) {
speed += this.item().speed;
}
if (this.isAttack()) {
speed += this.subject().attackSpeed();
}
return speed;
};

Game_Action.prototype.makeTargets = function() {
const targets = [];
if (!this._forcing && this.subject().isConfused()) {
targets.push(this.confusionTarget());
} else if (this.isForEveryone()) {
targets.push(...this.targetsForEveryone());
} else if (this.isForOpponent()) {
targets.push(...this.targetsForOpponents());
} else if (this.isForFriend()) {
targets.push(...this.targetsForFriends());
}
return this.repeatTargets(targets);
};

Game_Action.prototype.repeatTargets = function(targets) {
const repeatedTargets = [];
const repeats = this.numRepeats();
for (const target of targets) {
if (target) {
for (let i = 0; i < repeats; i++) {
repeatedTargets.push(target);
}
}
}
return repeatedTargets;
};

Game_Action.prototype.confusionTarget = function() {
switch (this.subject().confusionLevel()) {
case 1:
return this.opponentsUnit().randomTarget();
case 2:
if (Math.randomInt(2) === 0) {
return this.opponentsUnit().randomTarget();
}
return this.friendsUnit().randomTarget();
default:
return this.friendsUnit().randomTarget();
}
};

Game_Action.prototype.targetsForEveryone = function() {
const opponentMembers = this.opponentsUnit().aliveMembers();
const friendMembers = this.friendsUnit().aliveMembers();
return opponentMembers.concat(friendMembers);
};

Game_Action.prototype.targetsForOpponents = function() {
const unit = this.opponentsUnit();
if (this.isForRandom()) {
return this.randomTargets(unit);
} else {
return this.targetsForAlive(unit);
}
};

Game_Action.prototype.targetsForFriends = function() {
const unit = this.friendsUnit();
if (this.isForUser()) {
return [this.subject()];
} else if (this.isForDeadFriend()) {
return this.targetsForDead(unit);
} else if (this.isForAliveFriend()) {
return this.targetsForAlive(unit);
} else {
return this.targetsForDeadAndAlive(unit);
}
};

Game_Action.prototype.randomTargets = function(unit) {
const targets = [];
for (let i = 0; i < this.numTargets(); i++) {
targets.push(unit.randomTarget());
}
return targets;
};

Game_Action.prototype.targetsForDead = function(unit) {
if (this.isForOne()) {
return [unit.smoothDeadTarget(this._targetIndex)];
} else {
return unit.deadMembers();
}
};

Game_Action.prototype.targetsForAlive = function(unit) {
if (this.isForOne()) {
if (this._targetIndex < 0) {
return [unit.randomTarget()];
} else {
return [unit.smoothTarget(this._targetIndex)];
}
} else {
return unit.aliveMembers();
}
};

Game_Action.prototype.targetsForDeadAndAlive = function(unit) {
if (this.isForOne()) {
return [unit.members()[this._targetIndex]];
} else {
return unit.members();
}
};

Game_Action.prototype.evaluate = function() {
let value = 0;
for (const target of this.itemTargetCandidates()) {
const targetValue = this.evaluateWithTarget(target);
if (this.isForAll()) {
value += targetValue;
} else if (targetValue > value) {
value = targetValue;
this._targetIndex = target.index();
}
}
value *= this.numRepeats();
if (value > 0) {
value += Math.random();
}
return value;
};

Game_Action.prototype.itemTargetCandidates = function() {
if (!this.isValid()) {
return [];
} else if (this.isForOpponent()) {
return this.opponentsUnit().aliveMembers();
} else if (this.isForUser()) {
return [this.subject()];
} else if (this.isForDeadFriend()) {
return this.friendsUnit().deadMembers();
} else {
return this.friendsUnit().aliveMembers();
}
};

Game_Action.prototype.evaluateWithTarget = function(target) {
if (this.isHpEffect()) {
const value = this.makeDamageValue(target, false);
if (this.isForOpponent()) {
return value / Math.max(target.hp, 1);
} else {
const recovery = Math.min(-value, target.mhp - target.hp);
return recovery / target.mhp;
}
}
};

Game_Action.prototype.testApply = function(target) {
return (
this.testLifeAndDeath(target) &&
($gameParty.inBattle() ||
(this.isHpRecover() && target.hp < target.mhp) ||
(this.isMpRecover() && target.mp < target.mmp) ||
this.hasItemAnyValidEffects(target))
);
};

Game_Action.prototype.testLifeAndDeath = function(target) {
if (this.isForOpponent() || this.isForAliveFriend()) {
return target.isAlive();
} else if (this.isForDeadFriend()) {
return target.isDead();
} else {
return true;
}
};
Game_Action.prototype.hasItemAnyValidEffects = function(target) {
return this.item().effects.some(effect =>
this.testItemEffect(target, effect)
);
};

Game_Action.prototype.testItemEffect = function(target, effect) {


switch (effect.code) {
case Game_Action.EFFECT_RECOVER_HP:
return (
target.hp < target.mhp || effect.value1 < 0 || effect.value2 < 0
);
case Game_Action.EFFECT_RECOVER_MP:
return (
target.mp < target.mmp || effect.value1 < 0 || effect.value2 < 0
);
case Game_Action.EFFECT_ADD_STATE:
return !target.isStateAffected(effect.dataId);
case Game_Action.EFFECT_REMOVE_STATE:
return target.isStateAffected(effect.dataId);
case Game_Action.EFFECT_ADD_BUFF:
return !target.isMaxBuffAffected(effect.dataId);
case Game_Action.EFFECT_ADD_DEBUFF:
return !target.isMaxDebuffAffected(effect.dataId);
case Game_Action.EFFECT_REMOVE_BUFF:
return target.isBuffAffected(effect.dataId);
case Game_Action.EFFECT_REMOVE_DEBUFF:
return target.isDebuffAffected(effect.dataId);
case Game_Action.EFFECT_LEARN_SKILL:
return target.isActor() && !target.isLearnedSkill(effect.dataId);
default:
return true;
}
};

Game_Action.prototype.itemCnt = function(target) {
if (this.isPhysical() && target.canMove()) {
return target.cnt;
} else {
return 0;
}
};

Game_Action.prototype.itemMrf = function(target) {
if (this.isMagical()) {
return target.mrf;
} else {
return 0;
}
};

Game_Action.prototype.itemHit = function(/*target*/) {
const successRate = this.item().successRate;
if (this.isPhysical()) {
return successRate * 0.01 * this.subject().hit;
} else {
return successRate * 0.01;
}
};
Game_Action.prototype.itemEva = function(target) {
if (this.isPhysical()) {
return target.eva;
} else if (this.isMagical()) {
return target.mev;
} else {
return 0;
}
};

Game_Action.prototype.itemCri = function(target) {
return this.item().damage.critical
? this.subject().cri * (1 - target.cev)
: 0;
};

Game_Action.prototype.apply = function(target) {
const result = target.result();
this.subject().clearResult();
result.clear();
result.used = this.testApply(target);
result.missed = result.used && Math.random() >= this.itemHit(target);
result.evaded = !result.missed && Math.random() < this.itemEva(target);
result.physical = this.isPhysical();
result.drain = this.isDrain();
if (result.isHit()) {
if (this.item().damage.type > 0) {
result.critical = Math.random() < this.itemCri(target);
const value = this.makeDamageValue(target, result.critical);
this.executeDamage(target, value);
}
for (const effect of this.item().effects) {
this.applyItemEffect(target, effect);
}
this.applyItemUserEffect(target);
}
this.updateLastTarget(target);
};

Game_Action.prototype.makeDamageValue = function(target, critical) {


const item = this.item();
const baseValue = this.evalDamageFormula(target);
let value = baseValue * this.calcElementRate(target);
if (this.isPhysical()) {
value *= target.pdr;
}
if (this.isMagical()) {
value *= target.mdr;
}
if (baseValue < 0) {
value *= target.rec;
}
if (critical) {
value = this.applyCritical(value);
}
value = this.applyVariance(value, item.damage.variance);
value = this.applyGuard(value, target);
value = Math.round(value);
return value;
};

Game_Action.prototype.evalDamageFormula = function(target) {
try {
const item = this.item();
const a = this.subject(); // eslint-disable-line no-unused-vars
const b = target; // eslint-disable-line no-unused-vars
const v = $gameVariables._data; // eslint-disable-line no-unused-vars
const sign = [3, 4].includes(item.damage.type) ? -1 : 1;
const value = Math.max(eval(item.damage.formula), 0) * sign;
return isNaN(value) ? 0 : value;
} catch (e) {
return 0;
}
};

Game_Action.prototype.calcElementRate = function(target) {
if (this.item().damage.elementId < 0) {
return this.elementsMaxRate(target, this.subject().attackElements());
} else {
return target.elementRate(this.item().damage.elementId);
}
};

Game_Action.prototype.elementsMaxRate = function(target, elements) {


if (elements.length > 0) {
const rates = elements.map(elementId => target.elementRate(elementId));
return Math.max(...rates);
} else {
return 1;
}
};

Game_Action.prototype.applyCritical = function(damage) {
return damage * 3;
};

Game_Action.prototype.applyVariance = function(damage, variance) {


const amp = Math.floor(Math.max((Math.abs(damage) * variance) / 100, 0));
const v = Math.randomInt(amp + 1) + Math.randomInt(amp + 1) - amp;
return damage >= 0 ? damage + v : damage - v;
};

Game_Action.prototype.applyGuard = function(damage, target) {


return damage / (damage > 0 && target.isGuard() ? 2 * target.grd : 1);
};

Game_Action.prototype.executeDamage = function(target, value) {


const result = target.result();
if (value === 0) {
result.critical = false;
}
if (this.isHpEffect()) {
this.executeHpDamage(target, value);
}
if (this.isMpEffect()) {
this.executeMpDamage(target, value);
}
};

Game_Action.prototype.executeHpDamage = function(target, value) {


if (this.isDrain()) {
value = Math.min(target.hp, value);
}
this.makeSuccess(target);
target.gainHp(-value);
if (value > 0) {
target.onDamage(value);
}
this.gainDrainedHp(value);
};

Game_Action.prototype.executeMpDamage = function(target, value) {


if (!this.isMpRecover()) {
value = Math.min(target.mp, value);
}
if (value !== 0) {
this.makeSuccess(target);
}
target.gainMp(-value);
this.gainDrainedMp(value);
};

Game_Action.prototype.gainDrainedHp = function(value) {
if (this.isDrain()) {
let gainTarget = this.subject();
if (this._reflectionTarget) {
gainTarget = this._reflectionTarget;
}
gainTarget.gainHp(value);
}
};

Game_Action.prototype.gainDrainedMp = function(value) {
if (this.isDrain()) {
let gainTarget = this.subject();
if (this._reflectionTarget) {
gainTarget = this._reflectionTarget;
}
gainTarget.gainMp(value);
}
};

Game_Action.prototype.applyItemEffect = function(target, effect) {


switch (effect.code) {
case Game_Action.EFFECT_RECOVER_HP:
this.itemEffectRecoverHp(target, effect);
break;
case Game_Action.EFFECT_RECOVER_MP:
this.itemEffectRecoverMp(target, effect);
break;
case Game_Action.EFFECT_GAIN_TP:
this.itemEffectGainTp(target, effect);
break;
case Game_Action.EFFECT_ADD_STATE:
this.itemEffectAddState(target, effect);
break;
case Game_Action.EFFECT_REMOVE_STATE:
this.itemEffectRemoveState(target, effect);
break;
case Game_Action.EFFECT_ADD_BUFF:
this.itemEffectAddBuff(target, effect);
break;
case Game_Action.EFFECT_ADD_DEBUFF:
this.itemEffectAddDebuff(target, effect);
break;
case Game_Action.EFFECT_REMOVE_BUFF:
this.itemEffectRemoveBuff(target, effect);
break;
case Game_Action.EFFECT_REMOVE_DEBUFF:
this.itemEffectRemoveDebuff(target, effect);
break;
case Game_Action.EFFECT_SPECIAL:
this.itemEffectSpecial(target, effect);
break;
case Game_Action.EFFECT_GROW:
this.itemEffectGrow(target, effect);
break;
case Game_Action.EFFECT_LEARN_SKILL:
this.itemEffectLearnSkill(target, effect);
break;
case Game_Action.EFFECT_COMMON_EVENT:
this.itemEffectCommonEvent(target, effect);
break;
}
};

Game_Action.prototype.itemEffectRecoverHp = function(target, effect) {


let value = (target.mhp * effect.value1 + effect.value2) * target.rec;
if (this.isItem()) {
value *= this.subject().pha;
}
value = Math.floor(value);
if (value !== 0) {
target.gainHp(value);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectRecoverMp = function(target, effect) {


let value = (target.mmp * effect.value1 + effect.value2) * target.rec;
if (this.isItem()) {
value *= this.subject().pha;
}
value = Math.floor(value);
if (value !== 0) {
target.gainMp(value);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectGainTp = function(target, effect) {


let value = Math.floor(effect.value1);
if (value !== 0) {
target.gainTp(value);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectAddState = function(target, effect) {


if (effect.dataId === 0) {
this.itemEffectAddAttackState(target, effect);
} else {
this.itemEffectAddNormalState(target, effect);
}
};

Game_Action.prototype.itemEffectAddAttackState = function(target, effect) {


for (const stateId of this.subject().attackStates()) {
let chance = effect.value1;
chance *= target.stateRate(stateId);
chance *= this.subject().attackStatesRate(stateId);
chance *= this.lukEffectRate(target);
if (Math.random() < chance) {
target.addState(stateId);
this.makeSuccess(target);
}
}
};

Game_Action.prototype.itemEffectAddNormalState = function(target, effect) {


let chance = effect.value1;
if (!this.isCertainHit()) {
chance *= target.stateRate(effect.dataId);
chance *= this.lukEffectRate(target);
}
if (Math.random() < chance) {
target.addState(effect.dataId);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectRemoveState = function(target, effect) {


let chance = effect.value1;
if (Math.random() < chance) {
target.removeState(effect.dataId);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectAddBuff = function(target, effect) {


target.addBuff(effect.dataId, effect.value1);
this.makeSuccess(target);
};

Game_Action.prototype.itemEffectAddDebuff = function(target, effect) {


let chance = target.debuffRate(effect.dataId) * this.lukEffectRate(target);
if (Math.random() < chance) {
target.addDebuff(effect.dataId, effect.value1);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectRemoveBuff = function(target, effect) {


if (target.isBuffAffected(effect.dataId)) {
target.removeBuff(effect.dataId);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectRemoveDebuff = function(target, effect) {


if (target.isDebuffAffected(effect.dataId)) {
target.removeBuff(effect.dataId);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectSpecial = function(target, effect) {


if (effect.dataId === Game_Action.SPECIAL_EFFECT_ESCAPE) {
target.escape();
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectGrow = function(target, effect) {


target.addParam(effect.dataId, Math.floor(effect.value1));
this.makeSuccess(target);
};

Game_Action.prototype.itemEffectLearnSkill = function(target, effect) {


if (target.isActor()) {
target.learnSkill(effect.dataId);
this.makeSuccess(target);
}
};

Game_Action.prototype.itemEffectCommonEvent = function(/*target, effect*/) {


//
};

Game_Action.prototype.makeSuccess = function(target) {
target.result().success = true;
};

Game_Action.prototype.applyItemUserEffect = function(/*target*/) {
const value = Math.floor(this.item().tpGain * this.subject().tcr);
this.subject().gainSilentTp(value);
};

Game_Action.prototype.lukEffectRate = function(target) {
return Math.max(1.0 + (this.subject().luk - target.luk) * 0.001, 0.0);
};

Game_Action.prototype.applyGlobal = function() {
for (const effect of this.item().effects) {
if (effect.code === Game_Action.EFFECT_COMMON_EVENT) {
$gameTemp.reserveCommonEvent(effect.dataId);
}
}
this.updateLastUsed();
this.updateLastSubject();
};

Game_Action.prototype.updateLastUsed = function() {
const item = this.item();
if (DataManager.isSkill(item)) {
$gameTemp.setLastUsedSkillId(item.id);
} else if (DataManager.isItem(item)) {
$gameTemp.setLastUsedItemId(item.id);
}
};

Game_Action.prototype.updateLastSubject = function() {
const subject = this.subject();
if (subject.isActor()) {
$gameTemp.setLastSubjectActorId(subject.actorId());
} else {
$gameTemp.setLastSubjectEnemyIndex(subject.index() + 1);
}
};

Game_Action.prototype.updateLastTarget = function(target) {
if (target.isActor()) {
$gameTemp.setLastTargetActorId(target.actorId());
} else {
$gameTemp.setLastTargetEnemyIndex(target.index() + 1);
}
};

//-----------------------------------------------------------------------------
// Game_ActionResult
//
// The game object class for a result of a battle action. For convinience, all
// member variables in this class are public.

function Game_ActionResult() {
this.initialize(...arguments);
}

Game_ActionResult.prototype.initialize = function() {
this.clear();
};

Game_ActionResult.prototype.clear = function() {
this.used = false;
this.missed = false;
this.evaded = false;
this.physical = false;
this.drain = false;
this.critical = false;
this.success = false;
this.hpAffected = false;
this.hpDamage = 0;
this.mpDamage = 0;
this.tpDamage = 0;
this.addedStates = [];
this.removedStates = [];
this.addedBuffs = [];
this.addedDebuffs = [];
this.removedBuffs = [];
};

Game_ActionResult.prototype.addedStateObjects = function() {
return this.addedStates.map(id => $dataStates[id]);
};

Game_ActionResult.prototype.removedStateObjects = function() {
return this.removedStates.map(id => $dataStates[id]);
};

Game_ActionResult.prototype.isStatusAffected = function() {
return (
this.addedStates.length > 0 ||
this.removedStates.length > 0 ||
this.addedBuffs.length > 0 ||
this.addedDebuffs.length > 0 ||
this.removedBuffs.length > 0
);
};

Game_ActionResult.prototype.isHit = function() {
return this.used && !this.missed && !this.evaded;
};

Game_ActionResult.prototype.isStateAdded = function(stateId) {
return this.addedStates.includes(stateId);
};

Game_ActionResult.prototype.pushAddedState = function(stateId) {
if (!this.isStateAdded(stateId)) {
this.addedStates.push(stateId);
}
};

Game_ActionResult.prototype.isStateRemoved = function(stateId) {
return this.removedStates.includes(stateId);
};

Game_ActionResult.prototype.pushRemovedState = function(stateId) {
if (!this.isStateRemoved(stateId)) {
this.removedStates.push(stateId);
}
};

Game_ActionResult.prototype.isBuffAdded = function(paramId) {
return this.addedBuffs.includes(paramId);
};

Game_ActionResult.prototype.pushAddedBuff = function(paramId) {
if (!this.isBuffAdded(paramId)) {
this.addedBuffs.push(paramId);
}
};

Game_ActionResult.prototype.isDebuffAdded = function(paramId) {
return this.addedDebuffs.includes(paramId);
};

Game_ActionResult.prototype.pushAddedDebuff = function(paramId) {
if (!this.isDebuffAdded(paramId)) {
this.addedDebuffs.push(paramId);
}
};

Game_ActionResult.prototype.isBuffRemoved = function(paramId) {
return this.removedBuffs.includes(paramId);
};

Game_ActionResult.prototype.pushRemovedBuff = function(paramId) {
if (!this.isBuffRemoved(paramId)) {
this.removedBuffs.push(paramId);
}
};

//-----------------------------------------------------------------------------
// Game_BattlerBase
//
// The superclass of Game_Battler. It mainly contains parameters calculation.

function Game_BattlerBase() {
this.initialize(...arguments);
}

Game_BattlerBase.TRAIT_ELEMENT_RATE = 11;
Game_BattlerBase.TRAIT_DEBUFF_RATE = 12;
Game_BattlerBase.TRAIT_STATE_RATE = 13;
Game_BattlerBase.TRAIT_STATE_RESIST = 14;
Game_BattlerBase.TRAIT_PARAM = 21;
Game_BattlerBase.TRAIT_XPARAM = 22;
Game_BattlerBase.TRAIT_SPARAM = 23;
Game_BattlerBase.TRAIT_ATTACK_ELEMENT = 31;
Game_BattlerBase.TRAIT_ATTACK_STATE = 32;
Game_BattlerBase.TRAIT_ATTACK_SPEED = 33;
Game_BattlerBase.TRAIT_ATTACK_TIMES = 34;
Game_BattlerBase.TRAIT_ATTACK_SKILL = 35;
Game_BattlerBase.TRAIT_STYPE_ADD = 41;
Game_BattlerBase.TRAIT_STYPE_SEAL = 42;
Game_BattlerBase.TRAIT_SKILL_ADD = 43;
Game_BattlerBase.TRAIT_SKILL_SEAL = 44;
Game_BattlerBase.TRAIT_EQUIP_WTYPE = 51;
Game_BattlerBase.TRAIT_EQUIP_ATYPE = 52;
Game_BattlerBase.TRAIT_EQUIP_LOCK = 53;
Game_BattlerBase.TRAIT_EQUIP_SEAL = 54;
Game_BattlerBase.TRAIT_SLOT_TYPE = 55;
Game_BattlerBase.TRAIT_ACTION_PLUS = 61;
Game_BattlerBase.TRAIT_SPECIAL_FLAG = 62;
Game_BattlerBase.TRAIT_COLLAPSE_TYPE = 63;
Game_BattlerBase.TRAIT_PARTY_ABILITY = 64;
Game_BattlerBase.FLAG_ID_AUTO_BATTLE = 0;
Game_BattlerBase.FLAG_ID_GUARD = 1;
Game_BattlerBase.FLAG_ID_SUBSTITUTE = 2;
Game_BattlerBase.FLAG_ID_PRESERVE_TP = 3;
Game_BattlerBase.ICON_BUFF_START = 32;
Game_BattlerBase.ICON_DEBUFF_START = 48;

Object.defineProperties(Game_BattlerBase.prototype, {
// Hit Points
hp: {
get: function() {
return this._hp;
},
configurable: true
},
// Magic Points
mp: {
get: function() {
return this._mp;
},
configurable: true
},
// Tactical Points
tp: {
get: function() {
return this._tp;
},
configurable: true
},
// Maximum Hit Points
mhp: {
get: function() {
return this.param(0);
},
configurable: true
},
// Maximum Magic Points
mmp: {
get: function() {
return this.param(1);
},
configurable: true
},
// ATtacK power
atk: {
get: function() {
return this.param(2);
},
configurable: true
},
// DEFense power
def: {
get: function() {
return this.param(3);
},
configurable: true
},
// Magic ATtack power
mat: {
get: function() {
return this.param(4);
},
configurable: true
},
// Magic DeFense power
mdf: {
get: function() {
return this.param(5);
},
configurable: true
},
// AGIlity
agi: {
get: function() {
return this.param(6);
},
configurable: true
},
// LUcK
luk: {
get: function() {
return this.param(7);
},
configurable: true
},
// HIT rate
hit: {
get: function() {
return this.xparam(0);
},
configurable: true
},
// EVAsion rate
eva: {
get: function() {
return this.xparam(1);
},
configurable: true
},
// CRItical rate
cri: {
get: function() {
return this.xparam(2);
},
configurable: true
},
// Critical EVasion rate
cev: {
get: function() {
return this.xparam(3);
},
configurable: true
},
// Magic EVasion rate
mev: {
get: function() {
return this.xparam(4);
},
configurable: true
},
// Magic ReFlection rate
mrf: {
get: function() {
return this.xparam(5);
},
configurable: true
},
// CouNTer attack rate
cnt: {
get: function() {
return this.xparam(6);
},
configurable: true
},
// Hp ReGeneration rate
hrg: {
get: function() {
return this.xparam(7);
},
configurable: true
},
// Mp ReGeneration rate
mrg: {
get: function() {
return this.xparam(8);
},
configurable: true
},
// Tp ReGeneration rate
trg: {
get: function() {
return this.xparam(9);
},
configurable: true
},
// TarGet Rate
tgr: {
get: function() {
return this.sparam(0);
},
configurable: true
},
// GuaRD effect rate
grd: {
get: function() {
return this.sparam(1);
},
configurable: true
},
// RECovery effect rate
rec: {
get: function() {
return this.sparam(2);
},
configurable: true
},
// PHArmacology
pha: {
get: function() {
return this.sparam(3);
},
configurable: true
},
// Mp Cost Rate
mcr: {
get: function() {
return this.sparam(4);
},
configurable: true
},
// Tp Charge Rate
tcr: {
get: function() {
return this.sparam(5);
},
configurable: true
},
// Physical Damage Rate
pdr: {
get: function() {
return this.sparam(6);
},
configurable: true
},
// Magic Damage Rate
mdr: {
get: function() {
return this.sparam(7);
},
configurable: true
},
// Floor Damage Rate
fdr: {
get: function() {
return this.sparam(8);
},
configurable: true
},
// EXperience Rate
exr: {
get: function() {
return this.sparam(9);
},
configurable: true
}
});

Game_BattlerBase.prototype.initialize = function() {
this.initMembers();
};

Game_BattlerBase.prototype.initMembers = function() {
this._hp = 1;
this._mp = 0;
this._tp = 0;
this._hidden = false;
this.clearParamPlus();
this.clearStates();
this.clearBuffs();
};

Game_BattlerBase.prototype.clearParamPlus = function() {
this._paramPlus = [0, 0, 0, 0, 0, 0, 0, 0];
};

Game_BattlerBase.prototype.clearStates = function() {
this._states = [];
this._stateTurns = {};
};
Game_BattlerBase.prototype.eraseState = function(stateId) {
this._states.remove(stateId);
delete this._stateTurns[stateId];
};

Game_BattlerBase.prototype.isStateAffected = function(stateId) {
return this._states.includes(stateId);
};

Game_BattlerBase.prototype.isDeathStateAffected = function() {
return this.isStateAffected(this.deathStateId());
};

Game_BattlerBase.prototype.deathStateId = function() {
return 1;
};

Game_BattlerBase.prototype.resetStateCounts = function(stateId) {
const state = $dataStates[stateId];
const variance = 1 + Math.max(state.maxTurns - state.minTurns, 0);
this._stateTurns[stateId] = state.minTurns + Math.randomInt(variance);
};

Game_BattlerBase.prototype.isStateExpired = function(stateId) {
return this._stateTurns[stateId] === 0;
};

Game_BattlerBase.prototype.updateStateTurns = function() {
for (const stateId of this._states) {
if (this._stateTurns[stateId] > 0) {
this._stateTurns[stateId]--;
}
}
};

Game_BattlerBase.prototype.clearBuffs = function() {
this._buffs = [0, 0, 0, 0, 0, 0, 0, 0];
this._buffTurns = [0, 0, 0, 0, 0, 0, 0, 0];
};

Game_BattlerBase.prototype.eraseBuff = function(paramId) {
this._buffs[paramId] = 0;
this._buffTurns[paramId] = 0;
};

Game_BattlerBase.prototype.buffLength = function() {
return this._buffs.length;
};

Game_BattlerBase.prototype.buff = function(paramId) {
return this._buffs[paramId];
};

Game_BattlerBase.prototype.isBuffAffected = function(paramId) {
return this._buffs[paramId] > 0;
};

Game_BattlerBase.prototype.isDebuffAffected = function(paramId) {
return this._buffs[paramId] < 0;
};

Game_BattlerBase.prototype.isBuffOrDebuffAffected = function(paramId) {
return this._buffs[paramId] !== 0;
};

Game_BattlerBase.prototype.isMaxBuffAffected = function(paramId) {
return this._buffs[paramId] === 2;
};

Game_BattlerBase.prototype.isMaxDebuffAffected = function(paramId) {
return this._buffs[paramId] === -2;
};

Game_BattlerBase.prototype.increaseBuff = function(paramId) {
if (!this.isMaxBuffAffected(paramId)) {
this._buffs[paramId]++;
}
};

Game_BattlerBase.prototype.decreaseBuff = function(paramId) {
if (!this.isMaxDebuffAffected(paramId)) {
this._buffs[paramId]--;
}
};

Game_BattlerBase.prototype.overwriteBuffTurns = function(paramId, turns) {


if (this._buffTurns[paramId] < turns) {
this._buffTurns[paramId] = turns;
}
};

Game_BattlerBase.prototype.isBuffExpired = function(paramId) {
return this._buffTurns[paramId] === 0;
};

Game_BattlerBase.prototype.updateBuffTurns = function() {
for (let i = 0; i < this._buffTurns.length; i++) {
if (this._buffTurns[i] > 0) {
this._buffTurns[i]--;
}
}
};

Game_BattlerBase.prototype.die = function() {
this._hp = 0;
this.clearStates();
this.clearBuffs();
};

Game_BattlerBase.prototype.revive = function() {
if (this._hp === 0) {
this._hp = 1;
}
};

Game_BattlerBase.prototype.states = function() {
return this._states.map(id => $dataStates[id]);
};

Game_BattlerBase.prototype.stateIcons = function() {
return this.states()
.map(state => state.iconIndex)
.filter(iconIndex => iconIndex > 0);
};

Game_BattlerBase.prototype.buffIcons = function() {
const icons = [];
for (let i = 0; i < this._buffs.length; i++) {
if (this._buffs[i] !== 0) {
icons.push(this.buffIconIndex(this._buffs[i], i));
}
}
return icons;
};

Game_BattlerBase.prototype.buffIconIndex = function(buffLevel, paramId) {


if (buffLevel > 0) {
return Game_BattlerBase.ICON_BUFF_START + (buffLevel - 1) * 8 + paramId;
} else if (buffLevel < 0) {
return (
Game_BattlerBase.ICON_DEBUFF_START + (-buffLevel - 1) * 8 + paramId
);
} else {
return 0;
}
};

Game_BattlerBase.prototype.allIcons = function() {
return this.stateIcons().concat(this.buffIcons());
};

Game_BattlerBase.prototype.traitObjects = function() {
// Returns an array of the all objects having traits. States only here.
return this.states();
};

Game_BattlerBase.prototype.allTraits = function() {
return this.traitObjects().reduce((r, obj) => r.concat(obj.traits), []);
};

Game_BattlerBase.prototype.traits = function(code) {
return this.allTraits().filter(trait => trait.code === code);
};

Game_BattlerBase.prototype.traitsWithId = function(code, id) {


return this.allTraits().filter(
trait => trait.code === code && trait.dataId === id
);
};

Game_BattlerBase.prototype.traitsPi = function(code, id) {


return this.traitsWithId(code, id).reduce((r, trait) => r * trait.value, 1);
};

Game_BattlerBase.prototype.traitsSum = function(code, id) {


return this.traitsWithId(code, id).reduce((r, trait) => r + trait.value, 0);
};

Game_BattlerBase.prototype.traitsSumAll = function(code) {
return this.traits(code).reduce((r, trait) => r + trait.value, 0);
};

Game_BattlerBase.prototype.traitsSet = function(code) {
return this.traits(code).reduce((r, trait) => r.concat(trait.dataId), []);
};

Game_BattlerBase.prototype.paramBase = function(/*paramId*/) {
return 0;
};

Game_BattlerBase.prototype.paramPlus = function(paramId) {
return this._paramPlus[paramId];
};

Game_BattlerBase.prototype.paramBasePlus = function(paramId) {
return Math.max(0, this.paramBase(paramId) + this.paramPlus(paramId));
};

Game_BattlerBase.prototype.paramMin = function(paramId) {
if (paramId === 0) {
return 1; // MHP
} else {
return 0;
}
};

Game_BattlerBase.prototype.paramMax = function(/*paramId*/) {
return Infinity;
};

Game_BattlerBase.prototype.paramRate = function(paramId) {
return this.traitsPi(Game_BattlerBase.TRAIT_PARAM, paramId);
};

Game_BattlerBase.prototype.paramBuffRate = function(paramId) {
return this._buffs[paramId] * 0.25 + 1.0;
};

Game_BattlerBase.prototype.param = function(paramId) {
const value =
this.paramBasePlus(paramId) *
this.paramRate(paramId) *
this.paramBuffRate(paramId);
const maxValue = this.paramMax(paramId);
const minValue = this.paramMin(paramId);
return Math.round(value.clamp(minValue, maxValue));
};

Game_BattlerBase.prototype.xparam = function(xparamId) {
return this.traitsSum(Game_BattlerBase.TRAIT_XPARAM, xparamId);
};

Game_BattlerBase.prototype.sparam = function(sparamId) {
return this.traitsPi(Game_BattlerBase.TRAIT_SPARAM, sparamId);
};
Game_BattlerBase.prototype.elementRate = function(elementId) {
return this.traitsPi(Game_BattlerBase.TRAIT_ELEMENT_RATE, elementId);
};

Game_BattlerBase.prototype.debuffRate = function(paramId) {
return this.traitsPi(Game_BattlerBase.TRAIT_DEBUFF_RATE, paramId);
};

Game_BattlerBase.prototype.stateRate = function(stateId) {
return this.traitsPi(Game_BattlerBase.TRAIT_STATE_RATE, stateId);
};

Game_BattlerBase.prototype.stateResistSet = function() {
return this.traitsSet(Game_BattlerBase.TRAIT_STATE_RESIST);
};

Game_BattlerBase.prototype.isStateResist = function(stateId) {
return this.stateResistSet().includes(stateId);
};

Game_BattlerBase.prototype.attackElements = function() {
return this.traitsSet(Game_BattlerBase.TRAIT_ATTACK_ELEMENT);
};

Game_BattlerBase.prototype.attackStates = function() {
return this.traitsSet(Game_BattlerBase.TRAIT_ATTACK_STATE);
};

Game_BattlerBase.prototype.attackStatesRate = function(stateId) {
return this.traitsSum(Game_BattlerBase.TRAIT_ATTACK_STATE, stateId);
};

Game_BattlerBase.prototype.attackSpeed = function() {
return this.traitsSumAll(Game_BattlerBase.TRAIT_ATTACK_SPEED);
};

Game_BattlerBase.prototype.attackTimesAdd = function() {
return Math.max(this.traitsSumAll(Game_BattlerBase.TRAIT_ATTACK_TIMES), 0);
};

Game_BattlerBase.prototype.attackSkillId = function() {
const set = this.traitsSet(Game_BattlerBase.TRAIT_ATTACK_SKILL);
return set.length > 0 ? Math.max(...set) : 1;
};

Game_BattlerBase.prototype.addedSkillTypes = function() {
return this.traitsSet(Game_BattlerBase.TRAIT_STYPE_ADD);
};

Game_BattlerBase.prototype.isSkillTypeSealed = function(stypeId) {
return this.traitsSet(Game_BattlerBase.TRAIT_STYPE_SEAL).includes(stypeId);
};

Game_BattlerBase.prototype.addedSkills = function() {
return this.traitsSet(Game_BattlerBase.TRAIT_SKILL_ADD);
};

Game_BattlerBase.prototype.isSkillSealed = function(skillId) {
return this.traitsSet(Game_BattlerBase.TRAIT_SKILL_SEAL).includes(skillId);
};

Game_BattlerBase.prototype.isEquipWtypeOk = function(wtypeId) {
return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_WTYPE).includes(wtypeId);
};

Game_BattlerBase.prototype.isEquipAtypeOk = function(atypeId) {
return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_ATYPE).includes(atypeId);
};

Game_BattlerBase.prototype.isEquipTypeLocked = function(etypeId) {
return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_LOCK).includes(etypeId);
};

Game_BattlerBase.prototype.isEquipTypeSealed = function(etypeId) {
return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_SEAL).includes(etypeId);
};

Game_BattlerBase.prototype.slotType = function() {
const set = this.traitsSet(Game_BattlerBase.TRAIT_SLOT_TYPE);
return set.length > 0 ? Math.max(...set) : 0;
};

Game_BattlerBase.prototype.isDualWield = function() {
return this.slotType() === 1;
};

Game_BattlerBase.prototype.actionPlusSet = function() {
return this.traits(Game_BattlerBase.TRAIT_ACTION_PLUS).map(
trait => trait.value
);
};

Game_BattlerBase.prototype.specialFlag = function(flagId) {
return this.traits(Game_BattlerBase.TRAIT_SPECIAL_FLAG).some(
trait => trait.dataId === flagId
);
};

Game_BattlerBase.prototype.collapseType = function() {
const set = this.traitsSet(Game_BattlerBase.TRAIT_COLLAPSE_TYPE);
return set.length > 0 ? Math.max(...set) : 0;
};

Game_BattlerBase.prototype.partyAbility = function(abilityId) {
return this.traits(Game_BattlerBase.TRAIT_PARTY_ABILITY).some(
trait => trait.dataId === abilityId
);
};

Game_BattlerBase.prototype.isAutoBattle = function() {
return this.specialFlag(Game_BattlerBase.FLAG_ID_AUTO_BATTLE);
};

Game_BattlerBase.prototype.isGuard = function() {
return this.specialFlag(Game_BattlerBase.FLAG_ID_GUARD) && this.canMove();
};
Game_BattlerBase.prototype.isSubstitute = function() {
return (
this.specialFlag(Game_BattlerBase.FLAG_ID_SUBSTITUTE) && this.canMove()
);
};

Game_BattlerBase.prototype.isPreserveTp = function() {
return this.specialFlag(Game_BattlerBase.FLAG_ID_PRESERVE_TP);
};

Game_BattlerBase.prototype.addParam = function(paramId, value) {


this._paramPlus[paramId] += value;
this.refresh();
};

Game_BattlerBase.prototype.setHp = function(hp) {
this._hp = hp;
this.refresh();
};

Game_BattlerBase.prototype.setMp = function(mp) {
this._mp = mp;
this.refresh();
};

Game_BattlerBase.prototype.setTp = function(tp) {
this._tp = tp;
this.refresh();
};

Game_BattlerBase.prototype.maxTp = function() {
return 100;
};

Game_BattlerBase.prototype.refresh = function() {
for (const stateId of this.stateResistSet()) {
this.eraseState(stateId);
}
this._hp = this._hp.clamp(0, this.mhp);
this._mp = this._mp.clamp(0, this.mmp);
this._tp = this._tp.clamp(0, this.maxTp());
};

Game_BattlerBase.prototype.recoverAll = function() {
this.clearStates();
this._hp = this.mhp;
this._mp = this.mmp;
};

Game_BattlerBase.prototype.hpRate = function() {
return this.hp / this.mhp;
};

Game_BattlerBase.prototype.mpRate = function() {
return this.mmp > 0 ? this.mp / this.mmp : 0;
};

Game_BattlerBase.prototype.tpRate = function() {
return this.tp / this.maxTp();
};

Game_BattlerBase.prototype.hide = function() {
this._hidden = true;
};

Game_BattlerBase.prototype.appear = function() {
this._hidden = false;
};

Game_BattlerBase.prototype.isHidden = function() {
return this._hidden;
};

Game_BattlerBase.prototype.isAppeared = function() {
return !this.isHidden();
};

Game_BattlerBase.prototype.isDead = function() {
return this.isAppeared() && this.isDeathStateAffected();
};

Game_BattlerBase.prototype.isAlive = function() {
return this.isAppeared() && !this.isDeathStateAffected();
};

Game_BattlerBase.prototype.isDying = function() {
return this.isAlive() && this._hp < this.mhp / 4;
};

Game_BattlerBase.prototype.isRestricted = function() {
return this.isAppeared() && this.restriction() > 0;
};

Game_BattlerBase.prototype.canInput = function() {
// prettier-ignore
return this.isAppeared() && this.isActor() &&
!this.isRestricted() && !this.isAutoBattle();
};

Game_BattlerBase.prototype.canMove = function() {
return this.isAppeared() && this.restriction() < 4;
};

Game_BattlerBase.prototype.isConfused = function() {
return (
this.isAppeared() && this.restriction() >= 1 && this.restriction() <= 3
);
};

Game_BattlerBase.prototype.confusionLevel = function() {
return this.isConfused() ? this.restriction() : 0;
};

Game_BattlerBase.prototype.isActor = function() {
return false;
};

Game_BattlerBase.prototype.isEnemy = function() {
return false;
};

Game_BattlerBase.prototype.sortStates = function() {
this._states.sort((a, b) => {
const p1 = $dataStates[a].priority;
const p2 = $dataStates[b].priority;
if (p1 !== p2) {
return p2 - p1;
}
return a - b;
});
};

Game_BattlerBase.prototype.restriction = function() {
const restrictions = this.states().map(state => state.restriction);
return Math.max(0, ...restrictions);
};

Game_BattlerBase.prototype.addNewState = function(stateId) {
if (stateId === this.deathStateId()) {
this.die();
}
const restricted = this.isRestricted();
this._states.push(stateId);
this.sortStates();
if (!restricted && this.isRestricted()) {
this.onRestrict();
}
};

Game_BattlerBase.prototype.onRestrict = function() {
//
};

Game_BattlerBase.prototype.mostImportantStateText = function() {
for (const state of this.states()) {
if (state.message3) {
return state.message3;
}
}
return "";
};

Game_BattlerBase.prototype.stateMotionIndex = function() {
const states = this.states();
if (states.length > 0) {
return states[0].motion;
} else {
return 0;
}
};

Game_BattlerBase.prototype.stateOverlayIndex = function() {
const states = this.states();
if (states.length > 0) {
return states[0].overlay;
} else {
return 0;
}
};

Game_BattlerBase.prototype.isSkillWtypeOk = function(/*skill*/) {
return true;
};

Game_BattlerBase.prototype.skillMpCost = function(skill) {
return Math.floor(skill.mpCost * this.mcr);
};

Game_BattlerBase.prototype.skillTpCost = function(skill) {
return skill.tpCost;
};

Game_BattlerBase.prototype.canPaySkillCost = function(skill) {
return (
this._tp >= this.skillTpCost(skill) &&
this._mp >= this.skillMpCost(skill)
);
};

Game_BattlerBase.prototype.paySkillCost = function(skill) {
this._mp -= this.skillMpCost(skill);
this._tp -= this.skillTpCost(skill);
};

Game_BattlerBase.prototype.isOccasionOk = function(item) {
if ($gameParty.inBattle()) {
return item.occasion === 0 || item.occasion === 1;
} else {
return item.occasion === 0 || item.occasion === 2;
}
};

Game_BattlerBase.prototype.meetsUsableItemConditions = function(item) {
return this.canMove() && this.isOccasionOk(item);
};

Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
return (
this.meetsUsableItemConditions(skill) &&
this.isSkillWtypeOk(skill) &&
this.canPaySkillCost(skill) &&
!this.isSkillSealed(skill.id) &&
!this.isSkillTypeSealed(skill.stypeId)
);
};

Game_BattlerBase.prototype.meetsItemConditions = function(item) {
return this.meetsUsableItemConditions(item) && $gameParty.hasItem(item);
};

Game_BattlerBase.prototype.canUse = function(item) {
if (!item) {
return false;
} else if (DataManager.isSkill(item)) {
return this.meetsSkillConditions(item);
} else if (DataManager.isItem(item)) {
return this.meetsItemConditions(item);
} else {
return false;
}
};

Game_BattlerBase.prototype.canEquip = function(item) {
if (!item) {
return false;
} else if (DataManager.isWeapon(item)) {
return this.canEquipWeapon(item);
} else if (DataManager.isArmor(item)) {
return this.canEquipArmor(item);
} else {
return false;
}
};

Game_BattlerBase.prototype.canEquipWeapon = function(item) {
return (
this.isEquipWtypeOk(item.wtypeId) &&
!this.isEquipTypeSealed(item.etypeId)
);
};

Game_BattlerBase.prototype.canEquipArmor = function(item) {
return (
this.isEquipAtypeOk(item.atypeId) &&
!this.isEquipTypeSealed(item.etypeId)
);
};

Game_BattlerBase.prototype.guardSkillId = function() {
return 2;
};

Game_BattlerBase.prototype.canAttack = function() {
return this.canUse($dataSkills[this.attackSkillId()]);
};

Game_BattlerBase.prototype.canGuard = function() {
return this.canUse($dataSkills[this.guardSkillId()]);
};

//-----------------------------------------------------------------------------
// Game_Battler
//
// The superclass of Game_Actor and Game_Enemy. It contains methods for sprites
// and actions.

function Game_Battler() {
this.initialize(...arguments);
}

Game_Battler.prototype = Object.create(Game_BattlerBase.prototype);
Game_Battler.prototype.constructor = Game_Battler;

Game_Battler.prototype.initialize = function() {
Game_BattlerBase.prototype.initialize.call(this);
};

Game_Battler.prototype.initMembers = function() {
Game_BattlerBase.prototype.initMembers.call(this);
this._actions = [];
this._speed = 0;
this._result = new Game_ActionResult();
this._actionState = "";
this._lastTargetIndex = 0;
this._damagePopup = false;
this._effectType = null;
this._motionType = null;
this._weaponImageId = 0;
this._motionRefresh = false;
this._selected = false;
this._tpbState = "";
this._tpbChargeTime = 0;
this._tpbCastTime = 0;
this._tpbIdleTime = 0;
this._tpbTurnCount = 0;
this._tpbTurnEnd = false;
};

Game_Battler.prototype.clearDamagePopup = function() {
this._damagePopup = false;
};

Game_Battler.prototype.clearWeaponAnimation = function() {
this._weaponImageId = 0;
};

Game_Battler.prototype.clearEffect = function() {
this._effectType = null;
};

Game_Battler.prototype.clearMotion = function() {
this._motionType = null;
this._motionRefresh = false;
};

Game_Battler.prototype.requestEffect = function(effectType) {
this._effectType = effectType;
};

Game_Battler.prototype.requestMotion = function(motionType) {
this._motionType = motionType;
};

Game_Battler.prototype.requestMotionRefresh = function() {
this._motionRefresh = true;
};

Game_Battler.prototype.cancelMotionRefresh = function() {
this._motionRefresh = false;
};

Game_Battler.prototype.select = function() {
this._selected = true;
};
Game_Battler.prototype.deselect = function() {
this._selected = false;
};

Game_Battler.prototype.isDamagePopupRequested = function() {
return this._damagePopup;
};

Game_Battler.prototype.isEffectRequested = function() {
return !!this._effectType;
};

Game_Battler.prototype.isMotionRequested = function() {
return !!this._motionType;
};

Game_Battler.prototype.isWeaponAnimationRequested = function() {
return this._weaponImageId > 0;
};

Game_Battler.prototype.isMotionRefreshRequested = function() {
return this._motionRefresh;
};

Game_Battler.prototype.isSelected = function() {
return this._selected;
};

Game_Battler.prototype.effectType = function() {
return this._effectType;
};

Game_Battler.prototype.motionType = function() {
return this._motionType;
};

Game_Battler.prototype.weaponImageId = function() {
return this._weaponImageId;
};

Game_Battler.prototype.startDamagePopup = function() {
this._damagePopup = true;
};

Game_Battler.prototype.shouldPopupDamage = function() {
const result = this._result;
return (
result.missed ||
result.evaded ||
result.hpAffected ||
result.mpDamage !== 0
);
};

Game_Battler.prototype.startWeaponAnimation = function(weaponImageId) {
this._weaponImageId = weaponImageId;
};
Game_Battler.prototype.action = function(index) {
return this._actions[index];
};

Game_Battler.prototype.setAction = function(index, action) {


this._actions[index] = action;
};

Game_Battler.prototype.numActions = function() {
return this._actions.length;
};

Game_Battler.prototype.clearActions = function() {
this._actions = [];
};

Game_Battler.prototype.result = function() {
return this._result;
};

Game_Battler.prototype.clearResult = function() {
this._result.clear();
};

Game_Battler.prototype.clearTpbChargeTime = function() {
this._tpbState = "charging";
this._tpbChargeTime = 0;
};

Game_Battler.prototype.applyTpbPenalty = function() {
this._tpbState = "charging";
this._tpbChargeTime -= 1;
};

Game_Battler.prototype.initTpbChargeTime = function(advantageous) {
const speed = this.tpbRelativeSpeed();
this._tpbState = "charging";
this._tpbChargeTime = advantageous ? 1 : speed * Math.random() * 0.5;
if (this.isRestricted()) {
this._tpbChargeTime = 0;
}
};

Game_Battler.prototype.tpbChargeTime = function() {
return this._tpbChargeTime;
};

Game_Battler.prototype.startTpbCasting = function() {
this._tpbState = "casting";
this._tpbCastTime = 0;
};

Game_Battler.prototype.startTpbAction = function() {
this._tpbState = "acting";
};

Game_Battler.prototype.isTpbCharged = function() {
return this._tpbState === "charged";
};
Game_Battler.prototype.isTpbReady = function() {
return this._tpbState === "ready";
};

Game_Battler.prototype.isTpbTimeout = function() {
return this._tpbIdleTime >= 1;
};

Game_Battler.prototype.updateTpb = function() {
if (this.canMove()) {
this.updateTpbChargeTime();
this.updateTpbCastTime();
this.updateTpbAutoBattle();
}
if (this.isAlive()) {
this.updateTpbIdleTime();
}
};

Game_Battler.prototype.updateTpbChargeTime = function() {
if (this._tpbState === "charging") {
this._tpbChargeTime += this.tpbAcceleration();
if (this._tpbChargeTime >= 1) {
this._tpbChargeTime = 1;
this.onTpbCharged();
}
}
};

Game_Battler.prototype.updateTpbCastTime = function() {
if (this._tpbState === "casting") {
this._tpbCastTime += this.tpbAcceleration();
if (this._tpbCastTime >= this.tpbRequiredCastTime()) {
this._tpbCastTime = this.tpbRequiredCastTime();
this._tpbState = "ready";
}
}
};

Game_Battler.prototype.updateTpbAutoBattle = function() {
if (this.isTpbCharged() && !this.isTpbTurnEnd() && this.isAutoBattle()) {
this.makeTpbActions();
}
};

Game_Battler.prototype.updateTpbIdleTime = function() {
if (!this.canMove() || this.isTpbCharged()) {
this._tpbIdleTime += this.tpbAcceleration();
}
};

Game_Battler.prototype.tpbAcceleration = function() {
const speed = this.tpbRelativeSpeed();
const referenceTime = $gameParty.tpbReferenceTime();
return speed / referenceTime;
};

Game_Battler.prototype.tpbRelativeSpeed = function() {
return this.tpbSpeed() / $gameParty.tpbBaseSpeed();
};

Game_Battler.prototype.tpbSpeed = function() {
return Math.sqrt(this.agi) + 1;
};

Game_Battler.prototype.tpbBaseSpeed = function() {
const baseAgility = this.paramBasePlus(6);
return Math.sqrt(baseAgility) + 1;
};

Game_Battler.prototype.tpbRequiredCastTime = function() {
const actions = this._actions.filter(action => action.isValid());
const items = actions.map(action => action.item());
const delay = items.reduce((r, item) => r + Math.max(0, -item.speed), 0);
return Math.sqrt(delay) / this.tpbSpeed();
};

Game_Battler.prototype.onTpbCharged = function() {
if (!this.shouldDelayTpbCharge()) {
this.finishTpbCharge();
}
};

Game_Battler.prototype.shouldDelayTpbCharge = function() {
return !BattleManager.isActiveTpb() && $gameParty.canInput();
};

Game_Battler.prototype.finishTpbCharge = function() {
this._tpbState = "charged";
this._tpbTurnEnd = true;
this._tpbIdleTime = 0;
};

Game_Battler.prototype.isTpbTurnEnd = function() {
return this._tpbTurnEnd;
};

Game_Battler.prototype.initTpbTurn = function() {
this._tpbTurnEnd = false;
this._tpbTurnCount = 0;
this._tpbIdleTime = 0;
};

Game_Battler.prototype.startTpbTurn = function() {
this._tpbTurnEnd = false;
this._tpbTurnCount++;
this._tpbIdleTime = 0;
if (this.numActions() === 0) {
this.makeTpbActions();
}
};

Game_Battler.prototype.makeTpbActions = function() {
this.makeActions();
if (this.canInput()) {
this.setActionState("undecided");
} else {
this.startTpbCasting();
this.setActionState("waiting");
}
};

Game_Battler.prototype.onTpbTimeout = function() {
this.onAllActionsEnd();
this._tpbTurnEnd = true;
this._tpbIdleTime = 0;
};

Game_Battler.prototype.turnCount = function() {
if (BattleManager.isTpb()) {
return this._tpbTurnCount;
} else {
return $gameTroop.turnCount() + 1;
}
};

Game_Battler.prototype.canInput = function() {
if (BattleManager.isTpb() && !this.isTpbCharged()) {
return false;
}
return Game_BattlerBase.prototype.canInput.call(this);
};

Game_Battler.prototype.refresh = function() {
Game_BattlerBase.prototype.refresh.call(this);
if (this.hp === 0) {
this.addState(this.deathStateId());
} else {
this.removeState(this.deathStateId());
}
};

Game_Battler.prototype.addState = function(stateId) {
if (this.isStateAddable(stateId)) {
if (!this.isStateAffected(stateId)) {
this.addNewState(stateId);
this.refresh();
}
this.resetStateCounts(stateId);
this._result.pushAddedState(stateId);
}
};

Game_Battler.prototype.isStateAddable = function(stateId) {
return (
this.isAlive() &&
$dataStates[stateId] &&
!this.isStateResist(stateId) &&
!this.isStateRestrict(stateId)
);
};

Game_Battler.prototype.isStateRestrict = function(stateId) {
return $dataStates[stateId].removeByRestriction && this.isRestricted();
};
Game_Battler.prototype.onRestrict = function() {
Game_BattlerBase.prototype.onRestrict.call(this);
this.clearTpbChargeTime();
this.clearActions();
for (const state of this.states()) {
if (state.removeByRestriction) {
this.removeState(state.id);
}
}
};

Game_Battler.prototype.removeState = function(stateId) {
if (this.isStateAffected(stateId)) {
if (stateId === this.deathStateId()) {
this.revive();
}
this.eraseState(stateId);
this.refresh();
this._result.pushRemovedState(stateId);
}
};

Game_Battler.prototype.escape = function() {
if ($gameParty.inBattle()) {
this.hide();
}
this.clearActions();
this.clearStates();
SoundManager.playEscape();
};

Game_Battler.prototype.addBuff = function(paramId, turns) {


if (this.isAlive()) {
this.increaseBuff(paramId);
if (this.isBuffAffected(paramId)) {
this.overwriteBuffTurns(paramId, turns);
}
this._result.pushAddedBuff(paramId);
this.refresh();
}
};

Game_Battler.prototype.addDebuff = function(paramId, turns) {


if (this.isAlive()) {
this.decreaseBuff(paramId);
if (this.isDebuffAffected(paramId)) {
this.overwriteBuffTurns(paramId, turns);
}
this._result.pushAddedDebuff(paramId);
this.refresh();
}
};

Game_Battler.prototype.removeBuff = function(paramId) {
if (this.isAlive() && this.isBuffOrDebuffAffected(paramId)) {
this.eraseBuff(paramId);
this._result.pushRemovedBuff(paramId);
this.refresh();
}
};

Game_Battler.prototype.removeBattleStates = function() {
for (const state of this.states()) {
if (state.removeAtBattleEnd) {
this.removeState(state.id);
}
}
};

Game_Battler.prototype.removeAllBuffs = function() {
for (let i = 0; i < this.buffLength(); i++) {
this.removeBuff(i);
}
};

Game_Battler.prototype.removeStatesAuto = function(timing) {
for (const state of this.states()) {
if (
this.isStateExpired(state.id) &&
state.autoRemovalTiming === timing
) {
this.removeState(state.id);
}
}
};

Game_Battler.prototype.removeBuffsAuto = function() {
for (let i = 0; i < this.buffLength(); i++) {
if (this.isBuffExpired(i)) {
this.removeBuff(i);
}
}
};

Game_Battler.prototype.removeStatesByDamage = function() {
for (const state of this.states()) {
if (
state.removeByDamage &&
Math.randomInt(100) < state.chanceByDamage
) {
this.removeState(state.id);
}
}
};

Game_Battler.prototype.makeActionTimes = function() {
const actionPlusSet = this.actionPlusSet();
return actionPlusSet.reduce((r, p) => (Math.random() < p ? r + 1 : r), 1);
};

Game_Battler.prototype.makeActions = function() {
this.clearActions();
if (this.canMove()) {
const actionTimes = this.makeActionTimes();
this._actions = [];
for (let i = 0; i < actionTimes; i++) {
this._actions.push(new Game_Action(this));
}
}
};

Game_Battler.prototype.speed = function() {
return this._speed;
};

Game_Battler.prototype.makeSpeed = function() {
this._speed = Math.min(...this._actions.map(action => action.speed())) || 0;
};

Game_Battler.prototype.currentAction = function() {
return this._actions[0];
};

Game_Battler.prototype.removeCurrentAction = function() {
this._actions.shift();
};

Game_Battler.prototype.setLastTarget = function(target) {
this._lastTargetIndex = target ? target.index() : 0;
};

Game_Battler.prototype.forceAction = function(skillId, targetIndex) {


this.clearActions();
const action = new Game_Action(this, true);
action.setSkill(skillId);
if (targetIndex === -2) {
action.setTarget(this._lastTargetIndex);
} else if (targetIndex === -1) {
action.decideRandomTarget();
} else {
action.setTarget(targetIndex);
}
if (action.item()) {
this._actions.push(action);
}
};

Game_Battler.prototype.useItem = function(item) {
if (DataManager.isSkill(item)) {
this.paySkillCost(item);
} else if (DataManager.isItem(item)) {
this.consumeItem(item);
}
};

Game_Battler.prototype.consumeItem = function(item) {
$gameParty.consumeItem(item);
};

Game_Battler.prototype.gainHp = function(value) {
this._result.hpDamage = -value;
this._result.hpAffected = true;
this.setHp(this.hp + value);
};

Game_Battler.prototype.gainMp = function(value) {
this._result.mpDamage = -value;
this.setMp(this.mp + value);
};

Game_Battler.prototype.gainTp = function(value) {
this._result.tpDamage = -value;
this.setTp(this.tp + value);
};

Game_Battler.prototype.gainSilentTp = function(value) {
this.setTp(this.tp + value);
};

Game_Battler.prototype.initTp = function() {
this.setTp(Math.randomInt(25));
};

Game_Battler.prototype.clearTp = function() {
this.setTp(0);
};

Game_Battler.prototype.chargeTpByDamage = function(damageRate) {
const value = Math.floor(50 * damageRate * this.tcr);
this.gainSilentTp(value);
};

Game_Battler.prototype.regenerateHp = function() {
const minRecover = -this.maxSlipDamage();
const value = Math.max(Math.floor(this.mhp * this.hrg), minRecover);
if (value !== 0) {
this.gainHp(value);
}
};

Game_Battler.prototype.maxSlipDamage = function() {
return $dataSystem.optSlipDeath ? this.hp : Math.max(this.hp - 1, 0);
};

Game_Battler.prototype.regenerateMp = function() {
const value = Math.floor(this.mmp * this.mrg);
if (value !== 0) {
this.gainMp(value);
}
};

Game_Battler.prototype.regenerateTp = function() {
const value = Math.floor(100 * this.trg);
this.gainSilentTp(value);
};

Game_Battler.prototype.regenerateAll = function() {
if (this.isAlive()) {
this.regenerateHp();
this.regenerateMp();
this.regenerateTp();
}
};

Game_Battler.prototype.onBattleStart = function(advantageous) {
this.setActionState("undecided");
this.clearMotion();
this.initTpbChargeTime(advantageous);
this.initTpbTurn();
if (!this.isPreserveTp()) {
this.initTp();
}
};

Game_Battler.prototype.onAllActionsEnd = function() {
this.clearResult();
this.removeStatesAuto(1);
this.removeBuffsAuto();
};

Game_Battler.prototype.onTurnEnd = function() {
this.clearResult();
this.regenerateAll();
this.updateStateTurns();
this.updateBuffTurns();
this.removeStatesAuto(2);
};

Game_Battler.prototype.onBattleEnd = function() {
this.clearResult();
this.removeBattleStates();
this.removeAllBuffs();
this.clearActions();
if (!this.isPreserveTp()) {
this.clearTp();
}
this.appear();
};

Game_Battler.prototype.onDamage = function(value) {
this.removeStatesByDamage();
this.chargeTpByDamage(value / this.mhp);
};

Game_Battler.prototype.setActionState = function(actionState) {
this._actionState = actionState;
this.requestMotionRefresh();
};

Game_Battler.prototype.isUndecided = function() {
return this._actionState === "undecided";
};

Game_Battler.prototype.isInputting = function() {
return this._actionState === "inputting";
};

Game_Battler.prototype.isWaiting = function() {
return this._actionState === "waiting";
};

Game_Battler.prototype.isActing = function() {
return this._actionState === "acting";
};
Game_Battler.prototype.isChanting = function() {
if (this.isWaiting()) {
return this._actions.some(action => action.isMagicSkill());
}
return false;
};

Game_Battler.prototype.isGuardWaiting = function() {
if (this.isWaiting()) {
return this._actions.some(action => action.isGuard());
}
return false;
};

Game_Battler.prototype.performActionStart = function(action) {
if (!action.isGuard()) {
this.setActionState("acting");
}
};

Game_Battler.prototype.performAction = function(/*action*/) {
//
};

Game_Battler.prototype.performActionEnd = function() {
//
};

Game_Battler.prototype.performDamage = function() {
//
};

Game_Battler.prototype.performMiss = function() {
SoundManager.playMiss();
};

Game_Battler.prototype.performRecovery = function() {
SoundManager.playRecovery();
};

Game_Battler.prototype.performEvasion = function() {
SoundManager.playEvasion();
};

Game_Battler.prototype.performMagicEvasion = function() {
SoundManager.playMagicEvasion();
};

Game_Battler.prototype.performCounter = function() {
SoundManager.playEvasion();
};

Game_Battler.prototype.performReflection = function() {
SoundManager.playReflection();
};

Game_Battler.prototype.performSubstitute = function(/*target*/) {
//
};
Game_Battler.prototype.performCollapse = function() {
//
};

//-----------------------------------------------------------------------------
// Game_Actor
//
// The game object class for an actor.

function Game_Actor() {
this.initialize(...arguments);
}

Game_Actor.prototype = Object.create(Game_Battler.prototype);
Game_Actor.prototype.constructor = Game_Actor;

Object.defineProperty(Game_Actor.prototype, "level", {
get: function() {
return this._level;
},
configurable: true
});

Game_Actor.prototype.initialize = function(actorId) {
Game_Battler.prototype.initialize.call(this);
this.setup(actorId);
};

Game_Actor.prototype.initMembers = function() {
Game_Battler.prototype.initMembers.call(this);
this._actorId = 0;
this._name = "";
this._nickname = "";
this._classId = 0;
this._level = 0;
this._characterName = "";
this._characterIndex = 0;
this._faceName = "";
this._faceIndex = 0;
this._battlerName = "";
this._exp = {};
this._skills = [];
this._equips = [];
this._actionInputIndex = 0;
this._lastMenuSkill = new Game_Item();
this._lastBattleSkill = new Game_Item();
this._lastCommandSymbol = "";
};

Game_Actor.prototype.setup = function(actorId) {
const actor = $dataActors[actorId];
this._actorId = actorId;
this._name = actor.name;
this._nickname = actor.nickname;
this._profile = actor.profile;
this._classId = actor.classId;
this._level = actor.initialLevel;
this.initImages();
this.initExp();
this.initSkills();
this.initEquips(actor.equips);
this.clearParamPlus();
this.recoverAll();
};

Game_Actor.prototype.actorId = function() {
return this._actorId;
};

Game_Actor.prototype.actor = function() {
return $dataActors[this._actorId];
};

Game_Actor.prototype.name = function() {
return this._name;
};

Game_Actor.prototype.setName = function(name) {
this._name = name;
};

Game_Actor.prototype.nickname = function() {
return this._nickname;
};

Game_Actor.prototype.setNickname = function(nickname) {
this._nickname = nickname;
};

Game_Actor.prototype.profile = function() {
return this._profile;
};

Game_Actor.prototype.setProfile = function(profile) {
this._profile = profile;
};

Game_Actor.prototype.characterName = function() {
return this._characterName;
};

Game_Actor.prototype.characterIndex = function() {
return this._characterIndex;
};

Game_Actor.prototype.faceName = function() {
return this._faceName;
};

Game_Actor.prototype.faceIndex = function() {
return this._faceIndex;
};

Game_Actor.prototype.battlerName = function() {
return this._battlerName;
};
Game_Actor.prototype.clearStates = function() {
Game_Battler.prototype.clearStates.call(this);
this._stateSteps = {};
};

Game_Actor.prototype.eraseState = function(stateId) {
Game_Battler.prototype.eraseState.call(this, stateId);
delete this._stateSteps[stateId];
};

Game_Actor.prototype.resetStateCounts = function(stateId) {
Game_Battler.prototype.resetStateCounts.call(this, stateId);
this._stateSteps[stateId] = $dataStates[stateId].stepsToRemove;
};

Game_Actor.prototype.initImages = function() {
const actor = this.actor();
this._characterName = actor.characterName;
this._characterIndex = actor.characterIndex;
this._faceName = actor.faceName;
this._faceIndex = actor.faceIndex;
this._battlerName = actor.battlerName;
};

Game_Actor.prototype.expForLevel = function(level) {
const c = this.currentClass();
const basis = c.expParams[0];
const extra = c.expParams[1];
const acc_a = c.expParams[2];
const acc_b = c.expParams[3];
return Math.round(
(basis * Math.pow(level - 1, 0.9 + acc_a / 250) * level * (level + 1)) /
(6 + Math.pow(level, 2) / 50 / acc_b) +
(level - 1) * extra
);
};

Game_Actor.prototype.initExp = function() {
this._exp[this._classId] = this.currentLevelExp();
};

Game_Actor.prototype.currentExp = function() {
return this._exp[this._classId];
};

Game_Actor.prototype.currentLevelExp = function() {
return this.expForLevel(this._level);
};

Game_Actor.prototype.nextLevelExp = function() {
return this.expForLevel(this._level + 1);
};

Game_Actor.prototype.nextRequiredExp = function() {
return this.nextLevelExp() - this.currentExp();
};

Game_Actor.prototype.maxLevel = function() {
return this.actor().maxLevel;
};

Game_Actor.prototype.isMaxLevel = function() {
return this._level >= this.maxLevel();
};

Game_Actor.prototype.initSkills = function() {
this._skills = [];
for (const learning of this.currentClass().learnings) {
if (learning.level <= this._level) {
this.learnSkill(learning.skillId);
}
}
};

Game_Actor.prototype.initEquips = function(equips) {
const slots = this.equipSlots();
const maxSlots = slots.length;
this._equips = [];
for (let i = 0; i < maxSlots; i++) {
this._equips[i] = new Game_Item();
}
for (let j = 0; j < equips.length; j++) {
if (j < maxSlots) {
this._equips[j].setEquip(slots[j] === 1, equips[j]);
}
}
this.releaseUnequippableItems(true);
this.refresh();
};

Game_Actor.prototype.equipSlots = function() {
const slots = [];
for (let i = 1; i < $dataSystem.equipTypes.length; i++) {
slots.push(i);
}
if (slots.length >= 2 && this.isDualWield()) {
slots[1] = 1;
}
return slots;
};

Game_Actor.prototype.equips = function() {
return this._equips.map(item => item.object());
};

Game_Actor.prototype.weapons = function() {
return this.equips().filter(item => item && DataManager.isWeapon(item));
};

Game_Actor.prototype.armors = function() {
return this.equips().filter(item => item && DataManager.isArmor(item));
};

Game_Actor.prototype.hasWeapon = function(weapon) {
return this.weapons().includes(weapon);
};

Game_Actor.prototype.hasArmor = function(armor) {
return this.armors().includes(armor);
};

Game_Actor.prototype.isEquipChangeOk = function(slotId) {
return (
!this.isEquipTypeLocked(this.equipSlots()[slotId]) &&
!this.isEquipTypeSealed(this.equipSlots()[slotId])
);
};

Game_Actor.prototype.changeEquip = function(slotId, item) {


if (
this.tradeItemWithParty(item, this.equips()[slotId]) &&
(!item || this.equipSlots()[slotId] === item.etypeId)
) {
this._equips[slotId].setObject(item);
this.refresh();
}
};

Game_Actor.prototype.forceChangeEquip = function(slotId, item) {


this._equips[slotId].setObject(item);
this.releaseUnequippableItems(true);
this.refresh();
};

Game_Actor.prototype.tradeItemWithParty = function(newItem, oldItem) {


if (newItem && !$gameParty.hasItem(newItem)) {
return false;
} else {
$gameParty.gainItem(oldItem, 1);
$gameParty.loseItem(newItem, 1);
return true;
}
};

Game_Actor.prototype.changeEquipById = function(etypeId, itemId) {


const slotId = etypeId - 1;
if (this.equipSlots()[slotId] === 1) {
this.changeEquip(slotId, $dataWeapons[itemId]);
} else {
this.changeEquip(slotId, $dataArmors[itemId]);
}
};

Game_Actor.prototype.isEquipped = function(item) {
return this.equips().includes(item);
};

Game_Actor.prototype.discardEquip = function(item) {
const slotId = this.equips().indexOf(item);
if (slotId >= 0) {
this._equips[slotId].setObject(null);
}
};

Game_Actor.prototype.releaseUnequippableItems = function(forcing) {
for (;;) {
const slots = this.equipSlots();
const equips = this.equips();
let changed = false;
for (let i = 0; i < equips.length; i++) {
const item = equips[i];
if (item && (!this.canEquip(item) || item.etypeId !== slots[i])) {
if (!forcing) {
this.tradeItemWithParty(null, item);
}
this._equips[i].setObject(null);
changed = true;
}
}
if (!changed) {
break;
}
}
};

Game_Actor.prototype.clearEquipments = function() {
const maxSlots = this.equipSlots().length;
for (let i = 0; i < maxSlots; i++) {
if (this.isEquipChangeOk(i)) {
this.changeEquip(i, null);
}
}
};

Game_Actor.prototype.optimizeEquipments = function() {
const maxSlots = this.equipSlots().length;
this.clearEquipments();
for (let i = 0; i < maxSlots; i++) {
if (this.isEquipChangeOk(i)) {
this.changeEquip(i, this.bestEquipItem(i));
}
}
};

Game_Actor.prototype.bestEquipItem = function(slotId) {
const etypeId = this.equipSlots()[slotId];
const items = $gameParty
.equipItems()
.filter(item => item.etypeId === etypeId && this.canEquip(item));
let bestItem = null;
let bestPerformance = -1000;
for (let i = 0; i < items.length; i++) {
const performance = this.calcEquipItemPerformance(items[i]);
if (performance > bestPerformance) {
bestPerformance = performance;
bestItem = items[i];
}
}
return bestItem;
};

Game_Actor.prototype.calcEquipItemPerformance = function(item) {
return item.params.reduce((a, b) => a + b);
};

Game_Actor.prototype.isSkillWtypeOk = function(skill) {
const wtypeId1 = skill.requiredWtypeId1;
const wtypeId2 = skill.requiredWtypeId2;
if (
(wtypeId1 === 0 && wtypeId2 === 0) ||
(wtypeId1 > 0 && this.isWtypeEquipped(wtypeId1)) ||
(wtypeId2 > 0 && this.isWtypeEquipped(wtypeId2))
) {
return true;
} else {
return false;
}
};

Game_Actor.prototype.isWtypeEquipped = function(wtypeId) {
return this.weapons().some(weapon => weapon.wtypeId === wtypeId);
};

Game_Actor.prototype.refresh = function() {
this.releaseUnequippableItems(false);
Game_Battler.prototype.refresh.call(this);
};

Game_Actor.prototype.hide = function() {
Game_Battler.prototype.hide.call(this);
$gameTemp.requestBattleRefresh();
};

Game_Actor.prototype.isActor = function() {
return true;
};

Game_Actor.prototype.friendsUnit = function() {
return $gameParty;
};

Game_Actor.prototype.opponentsUnit = function() {
return $gameTroop;
};

Game_Actor.prototype.index = function() {
return $gameParty.members().indexOf(this);
};

Game_Actor.prototype.isBattleMember = function() {
return $gameParty.battleMembers().includes(this);
};

Game_Actor.prototype.isFormationChangeOk = function() {
return true;
};

Game_Actor.prototype.currentClass = function() {
return $dataClasses[this._classId];
};

Game_Actor.prototype.isClass = function(gameClass) {
return gameClass && this._classId === gameClass.id;
};
Game_Actor.prototype.skillTypes = function() {
const skillTypes = this.addedSkillTypes().sort((a, b) => a - b);
return skillTypes.filter((x, i, self) => self.indexOf(x) === i);
};

Game_Actor.prototype.skills = function() {
const list = [];
for (const id of this._skills.concat(this.addedSkills())) {
if (!list.includes($dataSkills[id])) {
list.push($dataSkills[id]);
}
}
return list;
};

Game_Actor.prototype.usableSkills = function() {
return this.skills().filter(skill => this.canUse(skill));
};

Game_Actor.prototype.traitObjects = function() {
const objects = Game_Battler.prototype.traitObjects.call(this);
objects.push(this.actor(), this.currentClass());
for (const item of this.equips()) {
if (item) {
objects.push(item);
}
}
return objects;
};

Game_Actor.prototype.attackElements = function() {
const set = Game_Battler.prototype.attackElements.call(this);
if (this.hasNoWeapons() && !set.includes(this.bareHandsElementId())) {
set.push(this.bareHandsElementId());
}
return set;
};

Game_Actor.prototype.hasNoWeapons = function() {
return this.weapons().length === 0;
};

Game_Actor.prototype.bareHandsElementId = function() {
return 1;
};

Game_Actor.prototype.paramBase = function(paramId) {
return this.currentClass().params[paramId][this._level];
};

Game_Actor.prototype.paramPlus = function(paramId) {
let value = Game_Battler.prototype.paramPlus.call(this, paramId);
for (const item of this.equips()) {
if (item) {
value += item.params[paramId];
}
}
return value;
};
Game_Actor.prototype.attackAnimationId1 = function() {
if (this.hasNoWeapons()) {
return this.bareHandsAnimationId();
} else {
const weapons = this.weapons();
return weapons[0] ? weapons[0].animationId : 0;
}
};

Game_Actor.prototype.attackAnimationId2 = function() {
const weapons = this.weapons();
return weapons[1] ? weapons[1].animationId : 0;
};

Game_Actor.prototype.bareHandsAnimationId = function() {
return 1;
};

Game_Actor.prototype.changeExp = function(exp, show) {


this._exp[this._classId] = Math.max(exp, 0);
const lastLevel = this._level;
const lastSkills = this.skills();
while (!this.isMaxLevel() && this.currentExp() >= this.nextLevelExp()) {
this.levelUp();
}
while (this.currentExp() < this.currentLevelExp()) {
this.levelDown();
}
if (show && this._level > lastLevel) {
this.displayLevelUp(this.findNewSkills(lastSkills));
}
this.refresh();
};

Game_Actor.prototype.levelUp = function() {
this._level++;
for (const learning of this.currentClass().learnings) {
if (learning.level === this._level) {
this.learnSkill(learning.skillId);
}
}
};

Game_Actor.prototype.levelDown = function() {
this._level--;
};

Game_Actor.prototype.findNewSkills = function(lastSkills) {
const newSkills = this.skills();
for (const lastSkill of lastSkills) {
newSkills.remove(lastSkill);
}
return newSkills;
};

Game_Actor.prototype.displayLevelUp = function(newSkills) {
const text = TextManager.levelUp.format(
this._name,
TextManager.level,
this._level
);
$gameMessage.newPage();
$gameMessage.add(text);
for (const skill of newSkills) {
$gameMessage.add(TextManager.obtainSkill.format(skill.name));
}
};

Game_Actor.prototype.gainExp = function(exp) {
const newExp = this.currentExp() + Math.round(exp * this.finalExpRate());
this.changeExp(newExp, this.shouldDisplayLevelUp());
};

Game_Actor.prototype.finalExpRate = function() {
return this.exr * (this.isBattleMember() ? 1 : this.benchMembersExpRate());
};

Game_Actor.prototype.benchMembersExpRate = function() {
return $dataSystem.optExtraExp ? 1 : 0;
};

Game_Actor.prototype.shouldDisplayLevelUp = function() {
return true;
};

Game_Actor.prototype.changeLevel = function(level, show) {


level = level.clamp(1, this.maxLevel());
this.changeExp(this.expForLevel(level), show);
};

Game_Actor.prototype.learnSkill = function(skillId) {
if (!this.isLearnedSkill(skillId)) {
this._skills.push(skillId);
this._skills.sort((a, b) => a - b);
}
};

Game_Actor.prototype.forgetSkill = function(skillId) {
this._skills.remove(skillId);
};

Game_Actor.prototype.isLearnedSkill = function(skillId) {
return this._skills.includes(skillId);
};

Game_Actor.prototype.hasSkill = function(skillId) {
return this.skills().includes($dataSkills[skillId]);
};

Game_Actor.prototype.changeClass = function(classId, keepExp) {


if (keepExp) {
this._exp[classId] = this.currentExp();
}
this._classId = classId;
this._level = 0;
this.changeExp(this._exp[this._classId] || 0, false);
this.refresh();
};

Game_Actor.prototype.setCharacterImage = function(
characterName,
characterIndex
) {
this._characterName = characterName;
this._characterIndex = characterIndex;
};

Game_Actor.prototype.setFaceImage = function(faceName, faceIndex) {


this._faceName = faceName;
this._faceIndex = faceIndex;
$gameTemp.requestBattleRefresh();
};

Game_Actor.prototype.setBattlerImage = function(battlerName) {
this._battlerName = battlerName;
};

Game_Actor.prototype.isSpriteVisible = function() {
return $gameSystem.isSideView();
};

Game_Actor.prototype.performActionStart = function(action) {
Game_Battler.prototype.performActionStart.call(this, action);
};

Game_Actor.prototype.performAction = function(action) {
Game_Battler.prototype.performAction.call(this, action);
if (action.isAttack()) {
this.performAttack();
} else if (action.isGuard()) {
this.requestMotion("guard");
} else if (action.isMagicSkill()) {
this.requestMotion("spell");
} else if (action.isSkill()) {
this.requestMotion("skill");
} else if (action.isItem()) {
this.requestMotion("item");
}
};

Game_Actor.prototype.performActionEnd = function() {
Game_Battler.prototype.performActionEnd.call(this);
};

Game_Actor.prototype.performAttack = function() {
const weapons = this.weapons();
const wtypeId = weapons[0] ? weapons[0].wtypeId : 0;
const attackMotion = $dataSystem.attackMotions[wtypeId];
if (attackMotion) {
if (attackMotion.type === 0) {
this.requestMotion("thrust");
} else if (attackMotion.type === 1) {
this.requestMotion("swing");
} else if (attackMotion.type === 2) {
this.requestMotion("missile");
}
this.startWeaponAnimation(attackMotion.weaponImageId);
}
};

Game_Actor.prototype.performDamage = function() {
Game_Battler.prototype.performDamage.call(this);
if (this.isSpriteVisible()) {
this.requestMotion("damage");
} else {
$gameScreen.startShake(5, 5, 10);
}
SoundManager.playActorDamage();
};

Game_Actor.prototype.performEvasion = function() {
Game_Battler.prototype.performEvasion.call(this);
this.requestMotion("evade");
};

Game_Actor.prototype.performMagicEvasion = function() {
Game_Battler.prototype.performMagicEvasion.call(this);
this.requestMotion("evade");
};

Game_Actor.prototype.performCounter = function() {
Game_Battler.prototype.performCounter.call(this);
this.performAttack();
};

Game_Actor.prototype.performCollapse = function() {
Game_Battler.prototype.performCollapse.call(this);
if ($gameParty.inBattle()) {
SoundManager.playActorCollapse();
}
};

Game_Actor.prototype.performVictory = function() {
this.setActionState("done");
if (this.canMove()) {
this.requestMotion("victory");
}
};

Game_Actor.prototype.performEscape = function() {
if (this.canMove()) {
this.requestMotion("escape");
}
};

Game_Actor.prototype.makeActionList = function() {
const list = [];
const attackAction = new Game_Action(this);
attackAction.setAttack();
list.push(attackAction);
for (const skill of this.usableSkills()) {
const skillAction = new Game_Action(this);
skillAction.setSkill(skill.id);
list.push(skillAction);
}
return list;
};

Game_Actor.prototype.makeAutoBattleActions = function() {
for (let i = 0; i < this.numActions(); i++) {
const list = this.makeActionList();
let maxValue = -Number.MAX_VALUE;
for (const action of list) {
const value = action.evaluate();
if (value > maxValue) {
maxValue = value;
this.setAction(i, action);
}
}
}
this.setActionState("waiting");
};

Game_Actor.prototype.makeConfusionActions = function() {
for (let i = 0; i < this.numActions(); i++) {
this.action(i).setConfusion();
}
this.setActionState("waiting");
};

Game_Actor.prototype.makeActions = function() {
Game_Battler.prototype.makeActions.call(this);
if (this.numActions() > 0) {
this.setActionState("undecided");
} else {
this.setActionState("waiting");
}
if (this.isAutoBattle()) {
this.makeAutoBattleActions();
} else if (this.isConfused()) {
this.makeConfusionActions();
}
};

Game_Actor.prototype.onPlayerWalk = function() {
this.clearResult();
this.checkFloorEffect();
if ($gamePlayer.isNormal()) {
this.turnEndOnMap();
for (const state of this.states()) {
this.updateStateSteps(state);
}
this.showAddedStates();
this.showRemovedStates();
}
};

Game_Actor.prototype.updateStateSteps = function(state) {
if (state.removeByWalking) {
if (this._stateSteps[state.id] > 0) {
if (--this._stateSteps[state.id] === 0) {
this.removeState(state.id);
}
}
}
};

Game_Actor.prototype.showAddedStates = function() {
for (const state of this.result().addedStateObjects()) {
if (state.message1) {
$gameMessage.add(state.message1.format(this._name));
}
}
};

Game_Actor.prototype.showRemovedStates = function() {
for (const state of this.result().removedStateObjects()) {
if (state.message4) {
$gameMessage.add(state.message4.format(this._name));
}
}
};

Game_Actor.prototype.stepsForTurn = function() {
return 20;
};

Game_Actor.prototype.turnEndOnMap = function() {
if ($gameParty.steps() % this.stepsForTurn() === 0) {
this.onTurnEnd();
if (this.result().hpDamage > 0) {
this.performMapDamage();
}
}
};

Game_Actor.prototype.checkFloorEffect = function() {
if ($gamePlayer.isOnDamageFloor()) {
this.executeFloorDamage();
}
};

Game_Actor.prototype.executeFloorDamage = function() {
const floorDamage = Math.floor(this.basicFloorDamage() * this.fdr);
const realDamage = Math.min(floorDamage, this.maxFloorDamage());
this.gainHp(-realDamage);
if (realDamage > 0) {
this.performMapDamage();
}
};

Game_Actor.prototype.basicFloorDamage = function() {
return 10;
};

Game_Actor.prototype.maxFloorDamage = function() {
return $dataSystem.optFloorDeath ? this.hp : Math.max(this.hp - 1, 0);
};

Game_Actor.prototype.performMapDamage = function() {
if (!$gameParty.inBattle()) {
$gameScreen.startFlashForDamage();
}
};

Game_Actor.prototype.clearActions = function() {
Game_Battler.prototype.clearActions.call(this);
this._actionInputIndex = 0;
};

Game_Actor.prototype.inputtingAction = function() {
return this.action(this._actionInputIndex);
};

Game_Actor.prototype.selectNextCommand = function() {
if (this._actionInputIndex < this.numActions() - 1) {
this._actionInputIndex++;
return true;
} else {
return false;
}
};

Game_Actor.prototype.selectPreviousCommand = function() {
if (this._actionInputIndex > 0) {
this._actionInputIndex--;
return true;
} else {
return false;
}
};

Game_Actor.prototype.lastSkill = function() {
if ($gameParty.inBattle()) {
return this.lastBattleSkill();
} else {
return this.lastMenuSkill();
}
};

Game_Actor.prototype.lastMenuSkill = function() {
return this._lastMenuSkill.object();
};

Game_Actor.prototype.setLastMenuSkill = function(skill) {
this._lastMenuSkill.setObject(skill);
};

Game_Actor.prototype.lastBattleSkill = function() {
return this._lastBattleSkill.object();
};

Game_Actor.prototype.setLastBattleSkill = function(skill) {
this._lastBattleSkill.setObject(skill);
};

Game_Actor.prototype.lastCommandSymbol = function() {
return this._lastCommandSymbol;
};

Game_Actor.prototype.setLastCommandSymbol = function(symbol) {
this._lastCommandSymbol = symbol;
};

Game_Actor.prototype.testEscape = function(item) {
return item.effects.some(
effect => effect && effect.code === Game_Action.EFFECT_SPECIAL
);
};

Game_Actor.prototype.meetsUsableItemConditions = function(item) {
if ($gameParty.inBattle()) {
if (!BattleManager.canEscape() && this.testEscape(item)) {
return false;
}
}
return Game_BattlerBase.prototype.meetsUsableItemConditions.call(
this,
item
);
};

Game_Actor.prototype.onEscapeFailure = function() {
if (BattleManager.isTpb()) {
this.applyTpbPenalty();
}
this.clearActions();
this.requestMotionRefresh();
};

//-----------------------------------------------------------------------------
// Game_Enemy
//
// The game object class for an enemy.

function Game_Enemy() {
this.initialize(...arguments);
}

Game_Enemy.prototype = Object.create(Game_Battler.prototype);
Game_Enemy.prototype.constructor = Game_Enemy;

Game_Enemy.prototype.initialize = function(enemyId, x, y) {
Game_Battler.prototype.initialize.call(this);
this.setup(enemyId, x, y);
};

Game_Enemy.prototype.initMembers = function() {
Game_Battler.prototype.initMembers.call(this);
this._enemyId = 0;
this._letter = "";
this._plural = false;
this._screenX = 0;
this._screenY = 0;
};

Game_Enemy.prototype.setup = function(enemyId, x, y) {
this._enemyId = enemyId;
this._screenX = x;
this._screenY = y;
this.recoverAll();
};

Game_Enemy.prototype.isEnemy = function() {
return true;
};

Game_Enemy.prototype.friendsUnit = function() {
return $gameTroop;
};

Game_Enemy.prototype.opponentsUnit = function() {
return $gameParty;
};

Game_Enemy.prototype.index = function() {
return $gameTroop.members().indexOf(this);
};

Game_Enemy.prototype.isBattleMember = function() {
return this.index() >= 0;
};

Game_Enemy.prototype.enemyId = function() {
return this._enemyId;
};

Game_Enemy.prototype.enemy = function() {
return $dataEnemies[this._enemyId];
};

Game_Enemy.prototype.traitObjects = function() {
return Game_Battler.prototype.traitObjects.call(this).concat(this.enemy());
};

Game_Enemy.prototype.paramBase = function(paramId) {
return this.enemy().params[paramId];
};

Game_Enemy.prototype.exp = function() {
return this.enemy().exp;
};

Game_Enemy.prototype.gold = function() {
return this.enemy().gold;
};

Game_Enemy.prototype.makeDropItems = function() {
const rate = this.dropItemRate();
return this.enemy().dropItems.reduce((r, di) => {
if (di.kind > 0 && Math.random() * di.denominator < rate) {
return r.concat(this.itemObject(di.kind, di.dataId));
} else {
return r;
}
}, []);
};

Game_Enemy.prototype.dropItemRate = function() {
return $gameParty.hasDropItemDouble() ? 2 : 1;
};

Game_Enemy.prototype.itemObject = function(kind, dataId) {


if (kind === 1) {
return $dataItems[dataId];
} else if (kind === 2) {
return $dataWeapons[dataId];
} else if (kind === 3) {
return $dataArmors[dataId];
} else {
return null;
}
};

Game_Enemy.prototype.isSpriteVisible = function() {
return true;
};

Game_Enemy.prototype.screenX = function() {
return this._screenX;
};

Game_Enemy.prototype.screenY = function() {
return this._screenY;
};

Game_Enemy.prototype.battlerName = function() {
return this.enemy().battlerName;
};

Game_Enemy.prototype.battlerHue = function() {
return this.enemy().battlerHue;
};

Game_Enemy.prototype.originalName = function() {
return this.enemy().name;
};

Game_Enemy.prototype.name = function() {
return this.originalName() + (this._plural ? this._letter : "");
};

Game_Enemy.prototype.isLetterEmpty = function() {
return this._letter === "";
};

Game_Enemy.prototype.setLetter = function(letter) {
this._letter = letter;
};

Game_Enemy.prototype.setPlural = function(plural) {
this._plural = plural;
};

Game_Enemy.prototype.performActionStart = function(action) {
Game_Battler.prototype.performActionStart.call(this, action);
this.requestEffect("whiten");
};
Game_Enemy.prototype.performAction = function(action) {
Game_Battler.prototype.performAction.call(this, action);
};

Game_Enemy.prototype.performActionEnd = function() {
Game_Battler.prototype.performActionEnd.call(this);
};

Game_Enemy.prototype.performDamage = function() {
Game_Battler.prototype.performDamage.call(this);
SoundManager.playEnemyDamage();
this.requestEffect("blink");
};

Game_Enemy.prototype.performCollapse = function() {
Game_Battler.prototype.performCollapse.call(this);
switch (this.collapseType()) {
case 0:
this.requestEffect("collapse");
SoundManager.playEnemyCollapse();
break;
case 1:
this.requestEffect("bossCollapse");
SoundManager.playBossCollapse1();
break;
case 2:
this.requestEffect("instantCollapse");
break;
}
};

Game_Enemy.prototype.transform = function(enemyId) {
const name = this.originalName();
this._enemyId = enemyId;
if (this.originalName() !== name) {
this._letter = "";
this._plural = false;
}
this.refresh();
if (this.numActions() > 0) {
this.makeActions();
}
};

Game_Enemy.prototype.meetsCondition = function(action) {
const param1 = action.conditionParam1;
const param2 = action.conditionParam2;
switch (action.conditionType) {
case 1:
return this.meetsTurnCondition(param1, param2);
case 2:
return this.meetsHpCondition(param1, param2);
case 3:
return this.meetsMpCondition(param1, param2);
case 4:
return this.meetsStateCondition(param1);
case 5:
return this.meetsPartyLevelCondition(param1);
case 6:
return this.meetsSwitchCondition(param1);
default:
return true;
}
};

Game_Enemy.prototype.meetsTurnCondition = function(param1, param2) {


const n = this.turnCount();
if (param2 === 0) {
return n === param1;
} else {
return n > 0 && n >= param1 && n % param2 === param1 % param2;
}
};

Game_Enemy.prototype.meetsHpCondition = function(param1, param2) {


return this.hpRate() >= param1 && this.hpRate() <= param2;
};

Game_Enemy.prototype.meetsMpCondition = function(param1, param2) {


return this.mpRate() >= param1 && this.mpRate() <= param2;
};

Game_Enemy.prototype.meetsStateCondition = function(param) {
return this.isStateAffected(param);
};

Game_Enemy.prototype.meetsPartyLevelCondition = function(param) {
return $gameParty.highestLevel() >= param;
};

Game_Enemy.prototype.meetsSwitchCondition = function(param) {
return $gameSwitches.value(param);
};

Game_Enemy.prototype.isActionValid = function(action) {
return (
this.meetsCondition(action) && this.canUse($dataSkills[action.skillId])
);
};

Game_Enemy.prototype.selectAction = function(actionList, ratingZero) {


const sum = actionList.reduce((r, a) => r + a.rating - ratingZero, 0);
if (sum > 0) {
let value = Math.randomInt(sum);
for (const action of actionList) {
value -= action.rating - ratingZero;
if (value < 0) {
return action;
}
}
} else {
return null;
}
};

Game_Enemy.prototype.selectAllActions = function(actionList) {
const ratingMax = Math.max(...actionList.map(a => a.rating));
const ratingZero = ratingMax - 3;
actionList = actionList.filter(a => a.rating > ratingZero);
for (let i = 0; i < this.numActions(); i++) {
this.action(i).setEnemyAction(
this.selectAction(actionList, ratingZero)
);
}
};

Game_Enemy.prototype.makeActions = function() {
Game_Battler.prototype.makeActions.call(this);
if (this.numActions() > 0) {
const actionList = this.enemy().actions.filter(a =>
this.isActionValid(a)
);
if (actionList.length > 0) {
this.selectAllActions(actionList);
}
}
this.setActionState("waiting");
};

//-----------------------------------------------------------------------------
// Game_Actors
//
// The wrapper class for an actor array.

function Game_Actors() {
this.initialize(...arguments);
}

Game_Actors.prototype.initialize = function() {
this._data = [];
};

Game_Actors.prototype.actor = function(actorId) {
if ($dataActors[actorId]) {
if (!this._data[actorId]) {
this._data[actorId] = new Game_Actor(actorId);
}
return this._data[actorId];
}
return null;
};

//-----------------------------------------------------------------------------
// Game_Unit
//
// The superclass of Game_Party and Game_Troop.

function Game_Unit() {
this.initialize(...arguments);
}

Game_Unit.prototype.initialize = function() {
this._inBattle = false;
};

Game_Unit.prototype.inBattle = function() {
return this._inBattle;
};

Game_Unit.prototype.members = function() {
return [];
};

Game_Unit.prototype.aliveMembers = function() {
return this.members().filter(member => member.isAlive());
};

Game_Unit.prototype.deadMembers = function() {
return this.members().filter(member => member.isDead());
};

Game_Unit.prototype.movableMembers = function() {
return this.members().filter(member => member.canMove());
};

Game_Unit.prototype.clearActions = function() {
for (const member of this.members()) {
member.clearActions();
}
};

Game_Unit.prototype.agility = function() {
const members = this.members();
const sum = members.reduce((r, member) => r + member.agi, 0);
return Math.max(1, sum / Math.max(1, members.length));
};

Game_Unit.prototype.tgrSum = function() {
return this.aliveMembers().reduce((r, member) => r + member.tgr, 0);
};

Game_Unit.prototype.randomTarget = function() {
let tgrRand = Math.random() * this.tgrSum();
let target = null;
for (const member of this.aliveMembers()) {
tgrRand -= member.tgr;
if (tgrRand <= 0 && !target) {
target = member;
}
}
return target;
};

Game_Unit.prototype.randomDeadTarget = function() {
const members = this.deadMembers();
return members.length ? members[Math.randomInt(members.length)] : null;
};

Game_Unit.prototype.smoothTarget = function(index) {
const member = this.members()[Math.max(0, index)];
return member && member.isAlive() ? member : this.aliveMembers()[0];
};

Game_Unit.prototype.smoothDeadTarget = function(index) {
const member = this.members()[Math.max(0, index)];
return member && member.isDead() ? member : this.deadMembers()[0];
};

Game_Unit.prototype.clearResults = function() {
for (const member of this.members()) {
member.clearResult();
}
};

Game_Unit.prototype.onBattleStart = function(advantageous) {
for (const member of this.members()) {
member.onBattleStart(advantageous);
}
this._inBattle = true;
};

Game_Unit.prototype.onBattleEnd = function() {
this._inBattle = false;
for (const member of this.members()) {
member.onBattleEnd();
}
};

Game_Unit.prototype.makeActions = function() {
for (const member of this.members()) {
member.makeActions();
}
};

Game_Unit.prototype.select = function(activeMember) {
for (const member of this.members()) {
if (member === activeMember) {
member.select();
} else {
member.deselect();
}
}
};

Game_Unit.prototype.isAllDead = function() {
return this.aliveMembers().length === 0;
};

Game_Unit.prototype.substituteBattler = function() {
for (const member of this.members()) {
if (member.isSubstitute()) {
return member;
}
}
return null;
};

Game_Unit.prototype.tpbBaseSpeed = function() {
const members = this.members();
return Math.max(...members.map(member => member.tpbBaseSpeed()));
};

Game_Unit.prototype.tpbReferenceTime = function() {
return BattleManager.isActiveTpb() ? 240 : 60;
};
Game_Unit.prototype.updateTpb = function() {
for (const member of this.members()) {
member.updateTpb();
}
};

//-----------------------------------------------------------------------------
// Game_Party
//
// The game object class for the party. Information such as gold and items is
// included.

function Game_Party() {
this.initialize(...arguments);
}

Game_Party.prototype = Object.create(Game_Unit.prototype);
Game_Party.prototype.constructor = Game_Party;

Game_Party.ABILITY_ENCOUNTER_HALF = 0;
Game_Party.ABILITY_ENCOUNTER_NONE = 1;
Game_Party.ABILITY_CANCEL_SURPRISE = 2;
Game_Party.ABILITY_RAISE_PREEMPTIVE = 3;
Game_Party.ABILITY_GOLD_DOUBLE = 4;
Game_Party.ABILITY_DROP_ITEM_DOUBLE = 5;

Game_Party.prototype.initialize = function() {
Game_Unit.prototype.initialize.call(this);
this._gold = 0;
this._steps = 0;
this._lastItem = new Game_Item();
this._menuActorId = 0;
this._targetActorId = 0;
this._actors = [];
this.initAllItems();
};

Game_Party.prototype.initAllItems = function() {
this._items = {};
this._weapons = {};
this._armors = {};
};

Game_Party.prototype.exists = function() {
return this._actors.length > 0;
};

Game_Party.prototype.size = function() {
return this.members().length;
};

Game_Party.prototype.isEmpty = function() {
return this.size() === 0;
};

Game_Party.prototype.members = function() {
return this.inBattle() ? this.battleMembers() : this.allMembers();
};
Game_Party.prototype.allMembers = function() {
return this._actors.map(id => $gameActors.actor(id));
};

Game_Party.prototype.battleMembers = function() {
return this.allBattleMembers().filter(actor => actor.isAppeared());
};

Game_Party.prototype.hiddenBattleMembers = function() {
return this.allBattleMembers().filter(actor => actor.isHidden());
};

Game_Party.prototype.allBattleMembers = function() {
return this.allMembers().slice(0, this.maxBattleMembers());
};

Game_Party.prototype.maxBattleMembers = function() {
return 4;
};

Game_Party.prototype.leader = function() {
return this.battleMembers()[0];
};

Game_Party.prototype.removeInvalidMembers = function() {
for (const actorId of this._actors) {
if (!$dataActors[actorId]) {
this._actors.remove(actorId);
}
}
};

Game_Party.prototype.reviveBattleMembers = function() {
for (const actor of this.battleMembers()) {
if (actor.isDead()) {
actor.setHp(1);
}
}
};

Game_Party.prototype.items = function() {
return Object.keys(this._items).map(id => $dataItems[id]);
};

Game_Party.prototype.weapons = function() {
return Object.keys(this._weapons).map(id => $dataWeapons[id]);
};

Game_Party.prototype.armors = function() {
return Object.keys(this._armors).map(id => $dataArmors[id]);
};

Game_Party.prototype.equipItems = function() {
return this.weapons().concat(this.armors());
};

Game_Party.prototype.allItems = function() {
return this.items().concat(this.equipItems());
};

Game_Party.prototype.itemContainer = function(item) {
if (!item) {
return null;
} else if (DataManager.isItem(item)) {
return this._items;
} else if (DataManager.isWeapon(item)) {
return this._weapons;
} else if (DataManager.isArmor(item)) {
return this._armors;
} else {
return null;
}
};

Game_Party.prototype.setupStartingMembers = function() {
this._actors = [];
for (const actorId of $dataSystem.partyMembers) {
if ($gameActors.actor(actorId)) {
this._actors.push(actorId);
}
}
};

Game_Party.prototype.name = function() {
const numBattleMembers = this.battleMembers().length;
if (numBattleMembers === 0) {
return "";
} else if (numBattleMembers === 1) {
return this.leader().name();
} else {
return TextManager.partyName.format(this.leader().name());
}
};

Game_Party.prototype.setupBattleTest = function() {
this.setupBattleTestMembers();
this.setupBattleTestItems();
};

Game_Party.prototype.setupBattleTestMembers = function() {
for (const battler of $dataSystem.testBattlers) {
const actor = $gameActors.actor(battler.actorId);
if (actor) {
actor.changeLevel(battler.level, false);
actor.initEquips(battler.equips);
actor.recoverAll();
this.addActor(battler.actorId);
}
}
};

Game_Party.prototype.setupBattleTestItems = function() {
for (const item of $dataItems) {
if (item && item.name.length > 0) {
this.gainItem(item, this.maxItems(item));
}
}
};

Game_Party.prototype.highestLevel = function() {
return Math.max(...this.members().map(actor => actor.level));
};

Game_Party.prototype.addActor = function(actorId) {
if (!this._actors.includes(actorId)) {
this._actors.push(actorId);
$gamePlayer.refresh();
$gameMap.requestRefresh();
$gameTemp.requestBattleRefresh();
if (this.inBattle()) {
const actor = $gameActors.actor(actorId);
if (this.battleMembers().includes(actor)) {
actor.onBattleStart();
}
}
}
};

Game_Party.prototype.removeActor = function(actorId) {
if (this._actors.includes(actorId)) {
const actor = $gameActors.actor(actorId);
const wasBattleMember = this.battleMembers().includes(actor);
this._actors.remove(actorId);
$gamePlayer.refresh();
$gameMap.requestRefresh();
$gameTemp.requestBattleRefresh();
if (this.inBattle() && wasBattleMember) {
actor.onBattleEnd();
}
}
};

Game_Party.prototype.gold = function() {
return this._gold;
};

Game_Party.prototype.gainGold = function(amount) {
this._gold = (this._gold + amount).clamp(0, this.maxGold());
};

Game_Party.prototype.loseGold = function(amount) {
this.gainGold(-amount);
};

Game_Party.prototype.maxGold = function() {
return 99999999;
};

Game_Party.prototype.steps = function() {
return this._steps;
};

Game_Party.prototype.increaseSteps = function() {
this._steps++;
};
Game_Party.prototype.numItems = function(item) {
const container = this.itemContainer(item);
return container ? container[item.id] || 0 : 0;
};

Game_Party.prototype.maxItems = function(/*item*/) {
return 99;
};

Game_Party.prototype.hasMaxItems = function(item) {
return this.numItems(item) >= this.maxItems(item);
};

Game_Party.prototype.hasItem = function(item, includeEquip) {


if (this.numItems(item) > 0) {
return true;
} else if (includeEquip && this.isAnyMemberEquipped(item)) {
return true;
} else {
return false;
}
};

Game_Party.prototype.isAnyMemberEquipped = function(item) {
return this.members().some(actor => actor.equips().includes(item));
};

Game_Party.prototype.gainItem = function(item, amount, includeEquip) {


const container = this.itemContainer(item);
if (container) {
const lastNumber = this.numItems(item);
const newNumber = lastNumber + amount;
container[item.id] = newNumber.clamp(0, this.maxItems(item));
if (container[item.id] === 0) {
delete container[item.id];
}
if (includeEquip && newNumber < 0) {
this.discardMembersEquip(item, -newNumber);
}
$gameMap.requestRefresh();
}
};

Game_Party.prototype.discardMembersEquip = function(item, amount) {


let n = amount;
for (const actor of this.members()) {
while (n > 0 && actor.isEquipped(item)) {
actor.discardEquip(item);
n--;
}
}
};

Game_Party.prototype.loseItem = function(item, amount, includeEquip) {


this.gainItem(item, -amount, includeEquip);
};

Game_Party.prototype.consumeItem = function(item) {
if (DataManager.isItem(item) && item.consumable) {
this.loseItem(item, 1);
}
};

Game_Party.prototype.canUse = function(item) {
return this.members().some(actor => actor.canUse(item));
};

Game_Party.prototype.canInput = function() {
return this.members().some(actor => actor.canInput());
};

Game_Party.prototype.isAllDead = function() {
if (Game_Unit.prototype.isAllDead.call(this)) {
return this.inBattle() || !this.isEmpty();
} else {
return false;
}
};

Game_Party.prototype.isEscaped = function() {
return this.isAllDead() && this.hiddenBattleMembers().length > 0;
};

Game_Party.prototype.onPlayerWalk = function() {
for (const actor of this.members()) {
actor.onPlayerWalk();
}
};

Game_Party.prototype.menuActor = function() {
let actor = $gameActors.actor(this._menuActorId);
if (!this.members().includes(actor)) {
actor = this.members()[0];
}
return actor;
};

Game_Party.prototype.setMenuActor = function(actor) {
this._menuActorId = actor.actorId();
};

Game_Party.prototype.makeMenuActorNext = function() {
let index = this.members().indexOf(this.menuActor());
if (index >= 0) {
index = (index + 1) % this.members().length;
this.setMenuActor(this.members()[index]);
} else {
this.setMenuActor(this.members()[0]);
}
};

Game_Party.prototype.makeMenuActorPrevious = function() {
let index = this.members().indexOf(this.menuActor());
if (index >= 0) {
index = (index + this.members().length - 1) % this.members().length;
this.setMenuActor(this.members()[index]);
} else {
this.setMenuActor(this.members()[0]);
}
};

Game_Party.prototype.targetActor = function() {
let actor = $gameActors.actor(this._targetActorId);
if (!this.members().includes(actor)) {
actor = this.members()[0];
}
return actor;
};

Game_Party.prototype.setTargetActor = function(actor) {
this._targetActorId = actor.actorId();
};

Game_Party.prototype.lastItem = function() {
return this._lastItem.object();
};

Game_Party.prototype.setLastItem = function(item) {
this._lastItem.setObject(item);
};

Game_Party.prototype.swapOrder = function(index1, index2) {


const temp = this._actors[index1];
this._actors[index1] = this._actors[index2];
this._actors[index2] = temp;
$gamePlayer.refresh();
};

Game_Party.prototype.charactersForSavefile = function() {
return this.battleMembers().map(actor => [
actor.characterName(),
actor.characterIndex()
]);
};

Game_Party.prototype.facesForSavefile = function() {
return this.battleMembers().map(actor => [
actor.faceName(),
actor.faceIndex()
]);
};

Game_Party.prototype.partyAbility = function(abilityId) {
return this.battleMembers().some(actor => actor.partyAbility(abilityId));
};

Game_Party.prototype.hasEncounterHalf = function() {
return this.partyAbility(Game_Party.ABILITY_ENCOUNTER_HALF);
};

Game_Party.prototype.hasEncounterNone = function() {
return this.partyAbility(Game_Party.ABILITY_ENCOUNTER_NONE);
};

Game_Party.prototype.hasCancelSurprise = function() {
return this.partyAbility(Game_Party.ABILITY_CANCEL_SURPRISE);
};
Game_Party.prototype.hasRaisePreemptive = function() {
return this.partyAbility(Game_Party.ABILITY_RAISE_PREEMPTIVE);
};

Game_Party.prototype.hasGoldDouble = function() {
return this.partyAbility(Game_Party.ABILITY_GOLD_DOUBLE);
};

Game_Party.prototype.hasDropItemDouble = function() {
return this.partyAbility(Game_Party.ABILITY_DROP_ITEM_DOUBLE);
};

Game_Party.prototype.ratePreemptive = function(troopAgi) {
let rate = this.agility() >= troopAgi ? 0.05 : 0.03;
if (this.hasRaisePreemptive()) {
rate *= 4;
}
return rate;
};

Game_Party.prototype.rateSurprise = function(troopAgi) {
let rate = this.agility() >= troopAgi ? 0.03 : 0.05;
if (this.hasCancelSurprise()) {
rate = 0;
}
return rate;
};

Game_Party.prototype.performVictory = function() {
for (const actor of this.members()) {
actor.performVictory();
}
};

Game_Party.prototype.performEscape = function() {
for (const actor of this.members()) {
actor.performEscape();
}
};

Game_Party.prototype.removeBattleStates = function() {
for (const actor of this.members()) {
actor.removeBattleStates();
}
};

Game_Party.prototype.requestMotionRefresh = function() {
for (const actor of this.members()) {
actor.requestMotionRefresh();
}
};

Game_Party.prototype.onEscapeFailure = function() {
for (const actor of this.members()) {
actor.onEscapeFailure();
}
};
//-----------------------------------------------------------------------------
// Game_Troop
//
// The game object class for a troop and the battle-related data.

function Game_Troop() {
this.initialize(...arguments);
}

Game_Troop.prototype = Object.create(Game_Unit.prototype);
Game_Troop.prototype.constructor = Game_Troop;

// prettier-ignore
Game_Troop.LETTER_TABLE_HALF = [
" A"," B"," C"," D"," E"," F"," G"," H"," I"," J"," K"," L"," M",
" N"," O"," P"," Q"," R"," S"," T"," U"," V"," W"," X"," Y"," Z"
];
// prettier-ignore
Game_Troop.LETTER_TABLE_FULL = [
"A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
];

Game_Troop.prototype.initialize = function() {
Game_Unit.prototype.initialize.call(this);
this._interpreter = new Game_Interpreter();
this.clear();
};

Game_Troop.prototype.isEventRunning = function() {
return this._interpreter.isRunning();
};

Game_Troop.prototype.updateInterpreter = function() {
this._interpreter.update();
};

Game_Troop.prototype.turnCount = function() {
return this._turnCount;
};

Game_Troop.prototype.members = function() {
return this._enemies;
};

Game_Troop.prototype.clear = function() {
this._interpreter.clear();
this._troopId = 0;
this._eventFlags = {};
this._enemies = [];
this._turnCount = 0;
this._namesCount = {};
};

Game_Troop.prototype.troop = function() {
return $dataTroops[this._troopId];
};

Game_Troop.prototype.setup = function(troopId) {
this.clear();
this._troopId = troopId;
this._enemies = [];
for (const member of this.troop().members) {
if ($dataEnemies[member.enemyId]) {
const enemyId = member.enemyId;
const x = member.x;
const y = member.y;
const enemy = new Game_Enemy(enemyId, x, y);
if (member.hidden) {
enemy.hide();
}
this._enemies.push(enemy);
}
}
this.makeUniqueNames();
};

Game_Troop.prototype.makeUniqueNames = function() {
const table = this.letterTable();
for (const enemy of this.members()) {
if (enemy.isAlive() && enemy.isLetterEmpty()) {
const name = enemy.originalName();
const n = this._namesCount[name] || 0;
enemy.setLetter(table[n % table.length]);
this._namesCount[name] = n + 1;
}
}
this.updatePluralFlags();
};

Game_Troop.prototype.updatePluralFlags = function() {
for (const enemy of this.members()) {
const name = enemy.originalName();
if (this._namesCount[name] >= 2) {
enemy.setPlural(true);
}
}
};

Game_Troop.prototype.letterTable = function() {
return $gameSystem.isCJK()
? Game_Troop.LETTER_TABLE_FULL
: Game_Troop.LETTER_TABLE_HALF;
};

Game_Troop.prototype.enemyNames = function() {
const names = [];
for (const enemy of this.members()) {
const name = enemy.originalName();
if (enemy.isAlive() && !names.includes(name)) {
names.push(name);
}
}
return names;
};

Game_Troop.prototype.meetsConditions = function(page) {
const c = page.conditions;
if (
!c.turnEnding &&
!c.turnValid &&
!c.enemyValid &&
!c.actorValid &&
!c.switchValid
) {
return false; // Conditions not set
}
if (c.turnEnding) {
if (!BattleManager.isTurnEnd()) {
return false;
}
}
if (c.turnValid) {
const n = this._turnCount;
const a = c.turnA;
const b = c.turnB;
if (b === 0 && n !== a) {
return false;
}
if (b > 0 && (n < 1 || n < a || n % b !== a % b)) {
return false;
}
}
if (c.enemyValid) {
const enemy = $gameTroop.members()[c.enemyIndex];
if (!enemy || enemy.hpRate() * 100 > c.enemyHp) {
return false;
}
}
if (c.actorValid) {
const actor = $gameActors.actor(c.actorId);
if (!actor || actor.hpRate() * 100 > c.actorHp) {
return false;
}
}
if (c.switchValid) {
if (!$gameSwitches.value(c.switchId)) {
return false;
}
}
return true;
};

Game_Troop.prototype.setupBattleEvent = function() {
if (!this._interpreter.isRunning()) {
if (this._interpreter.setupReservedCommonEvent()) {
return;
}
const pages = this.troop().pages;
for (let i = 0; i < pages.length; i++) {
const page = pages[i];
if (this.meetsConditions(page) && !this._eventFlags[i]) {
this._interpreter.setup(page.list);
if (page.span <= 1) {
this._eventFlags[i] = true;
}
break;
}
}
}
};

Game_Troop.prototype.increaseTurn = function() {
const pages = this.troop().pages;
for (let i = 0; i < pages.length; i++) {
const page = pages[i];
if (page.span === 1) {
this._eventFlags[i] = false;
}
}
this._turnCount++;
};

Game_Troop.prototype.expTotal = function() {
return this.deadMembers().reduce((r, enemy) => r + enemy.exp(), 0);
};

Game_Troop.prototype.goldTotal = function() {
const members = this.deadMembers();
return members.reduce((r, enemy) => r + enemy.gold(), 0) * this.goldRate();
};

Game_Troop.prototype.goldRate = function() {
return $gameParty.hasGoldDouble() ? 2 : 1;
};

Game_Troop.prototype.makeDropItems = function() {
const members = this.deadMembers();
return members.reduce((r, enemy) => r.concat(enemy.makeDropItems()), []);
};

Game_Troop.prototype.isTpbTurnEnd = function() {
const members = this.members();
const turnMax = Math.max(...members.map(member => member.turnCount()));
return turnMax > this._turnCount;
};

//-----------------------------------------------------------------------------
// Game_Map
//
// The game object class for a map. It contains scrolling and passage
// determination functions.

function Game_Map() {
this.initialize(...arguments);
}

Game_Map.prototype.initialize = function() {
this._interpreter = new Game_Interpreter();
this._mapId = 0;
this._tilesetId = 0;
this._events = [];
this._commonEvents = [];
this._vehicles = [];
this._displayX = 0;
this._displayY = 0;
this._nameDisplay = true;
this._scrollDirection = 2;
this._scrollRest = 0;
this._scrollSpeed = 4;
this._parallaxName = "";
this._parallaxZero = false;
this._parallaxLoopX = false;
this._parallaxLoopY = false;
this._parallaxSx = 0;
this._parallaxSy = 0;
this._parallaxX = 0;
this._parallaxY = 0;
this._battleback1Name = null;
this._battleback2Name = null;
this.createVehicles();
};

Game_Map.prototype.setup = function(mapId) {
if (!$dataMap) {
throw new Error("The map data is not available");
}
this._mapId = mapId;
this._tilesetId = $dataMap.tilesetId;
this._displayX = 0;
this._displayY = 0;
this.refereshVehicles();
this.setupEvents();
this.setupScroll();
this.setupParallax();
this.setupBattleback();
this._needsRefresh = false;
};

Game_Map.prototype.isEventRunning = function() {
return this._interpreter.isRunning() || this.isAnyEventStarting();
};

Game_Map.prototype.tileWidth = function() {
if ("tileSize" in $dataSystem) {
return $dataSystem.tileSize;
} else {
return 48;
}
};

Game_Map.prototype.tileHeight = function() {
return this.tileWidth();
};

Game_Map.prototype.bushDepth = function() {
return this.tileHeight() / 4;
};

Game_Map.prototype.mapId = function() {
return this._mapId;
};

Game_Map.prototype.tilesetId = function() {
return this._tilesetId;
};

Game_Map.prototype.displayX = function() {
return this._displayX;
};

Game_Map.prototype.displayY = function() {
return this._displayY;
};

Game_Map.prototype.parallaxName = function() {
return this._parallaxName;
};

Game_Map.prototype.battleback1Name = function() {
return this._battleback1Name;
};

Game_Map.prototype.battleback2Name = function() {
return this._battleback2Name;
};

Game_Map.prototype.requestRefresh = function() {
this._needsRefresh = true;
};

Game_Map.prototype.isNameDisplayEnabled = function() {
return this._nameDisplay;
};

Game_Map.prototype.disableNameDisplay = function() {
this._nameDisplay = false;
};

Game_Map.prototype.enableNameDisplay = function() {
this._nameDisplay = true;
};

Game_Map.prototype.createVehicles = function() {
this._vehicles = [];
this._vehicles[0] = new Game_Vehicle("boat");
this._vehicles[1] = new Game_Vehicle("ship");
this._vehicles[2] = new Game_Vehicle("airship");
};

Game_Map.prototype.refereshVehicles = function() {
for (const vehicle of this._vehicles) {
vehicle.refresh();
}
};

Game_Map.prototype.vehicles = function() {
return this._vehicles;
};

Game_Map.prototype.vehicle = function(type) {
if (type === 0 || type === "boat") {
return this.boat();
} else if (type === 1 || type === "ship") {
return this.ship();
} else if (type === 2 || type === "airship") {
return this.airship();
} else {
return null;
}
};

Game_Map.prototype.boat = function() {
return this._vehicles[0];
};

Game_Map.prototype.ship = function() {
return this._vehicles[1];
};

Game_Map.prototype.airship = function() {
return this._vehicles[2];
};

Game_Map.prototype.setupEvents = function() {
this._events = [];
this._commonEvents = [];
for (const event of $dataMap.events.filter(event => !!event)) {
this._events[event.id] = new Game_Event(this._mapId, event.id);
}
for (const commonEvent of this.parallelCommonEvents()) {
this._commonEvents.push(new Game_CommonEvent(commonEvent.id));
}
this.refreshTileEvents();
};

Game_Map.prototype.events = function() {
return this._events.filter(event => !!event);
};

Game_Map.prototype.event = function(eventId) {
return this._events[eventId];
};

Game_Map.prototype.eraseEvent = function(eventId) {
this._events[eventId].erase();
};

Game_Map.prototype.autorunCommonEvents = function() {
return $dataCommonEvents.filter(
commonEvent => commonEvent && commonEvent.trigger === 1
);
};

Game_Map.prototype.parallelCommonEvents = function() {
return $dataCommonEvents.filter(
commonEvent => commonEvent && commonEvent.trigger === 2
);
};

Game_Map.prototype.setupScroll = function() {
this._scrollDirection = 2;
this._scrollRest = 0;
this._scrollSpeed = 4;
};

Game_Map.prototype.setupParallax = function() {
this._parallaxName = $dataMap.parallaxName || "";
this._parallaxZero = ImageManager.isZeroParallax(this._parallaxName);
this._parallaxLoopX = $dataMap.parallaxLoopX;
this._parallaxLoopY = $dataMap.parallaxLoopY;
this._parallaxSx = $dataMap.parallaxSx;
this._parallaxSy = $dataMap.parallaxSy;
this._parallaxX = 0;
this._parallaxY = 0;
};

Game_Map.prototype.setupBattleback = function() {
if ($dataMap.specifyBattleback) {
this._battleback1Name = $dataMap.battleback1Name;
this._battleback2Name = $dataMap.battleback2Name;
} else {
this._battleback1Name = null;
this._battleback2Name = null;
}
};

Game_Map.prototype.setDisplayPos = function(x, y) {
if (this.isLoopHorizontal()) {
this._displayX = x.mod(this.width());
this._parallaxX = x;
} else {
const endX = this.width() - this.screenTileX();
this._displayX = endX < 0 ? endX / 2 : x.clamp(0, endX);
this._parallaxX = this._displayX;
}
if (this.isLoopVertical()) {
this._displayY = y.mod(this.height());
this._parallaxY = y;
} else {
const endY = this.height() - this.screenTileY();
this._displayY = endY < 0 ? endY / 2 : y.clamp(0, endY);
this._parallaxY = this._displayY;
}
};

Game_Map.prototype.parallaxOx = function() {
if (this._parallaxZero) {
return this._parallaxX * this.tileWidth();
} else if (this._parallaxLoopX) {
return (this._parallaxX * this.tileWidth()) / 2;
} else {
return 0;
}
};

Game_Map.prototype.parallaxOy = function() {
if (this._parallaxZero) {
return this._parallaxY * this.tileHeight();
} else if (this._parallaxLoopY) {
return (this._parallaxY * this.tileHeight()) / 2;
} else {
return 0;
}
};

Game_Map.prototype.tileset = function() {
return $dataTilesets[this._tilesetId];
};

Game_Map.prototype.tilesetFlags = function() {
const tileset = this.tileset();
if (tileset) {
return tileset.flags;
} else {
return [];
}
};

Game_Map.prototype.displayName = function() {
return $dataMap.displayName;
};

Game_Map.prototype.width = function() {
return $dataMap.width;
};

Game_Map.prototype.height = function() {
return $dataMap.height;
};

Game_Map.prototype.data = function() {
return $dataMap.data;
};

Game_Map.prototype.isLoopHorizontal = function() {
return $dataMap.scrollType === 2 || $dataMap.scrollType === 3;
};

Game_Map.prototype.isLoopVertical = function() {
return $dataMap.scrollType === 1 || $dataMap.scrollType === 3;
};

Game_Map.prototype.isDashDisabled = function() {
return $dataMap.disableDashing;
};

Game_Map.prototype.encounterList = function() {
return $dataMap.encounterList;
};

Game_Map.prototype.encounterStep = function() {
return $dataMap.encounterStep;
};

Game_Map.prototype.isOverworld = function() {
return this.tileset() && this.tileset().mode === 0;
};

Game_Map.prototype.screenTileX = function() {
return Math.round((Graphics.width / this.tileWidth()) * 16) / 16;
};

Game_Map.prototype.screenTileY = function() {
return Math.round((Graphics.height / this.tileHeight()) * 16) / 16;
};

Game_Map.prototype.adjustX = function(x) {
if (
this.isLoopHorizontal() &&
x < this._displayX - (this.width() - this.screenTileX()) / 2
) {
return x - this._displayX + $dataMap.width;
} else {
return x - this._displayX;
}
};

Game_Map.prototype.adjustY = function(y) {
if (
this.isLoopVertical() &&
y < this._displayY - (this.height() - this.screenTileY()) / 2
) {
return y - this._displayY + $dataMap.height;
} else {
return y - this._displayY;
}
};

Game_Map.prototype.roundX = function(x) {
return this.isLoopHorizontal() ? x.mod(this.width()) : x;
};

Game_Map.prototype.roundY = function(y) {
return this.isLoopVertical() ? y.mod(this.height()) : y;
};

Game_Map.prototype.xWithDirection = function(x, d) {
return x + (d === 6 ? 1 : d === 4 ? -1 : 0);
};

Game_Map.prototype.yWithDirection = function(y, d) {
return y + (d === 2 ? 1 : d === 8 ? -1 : 0);
};

Game_Map.prototype.roundXWithDirection = function(x, d) {
return this.roundX(x + (d === 6 ? 1 : d === 4 ? -1 : 0));
};

Game_Map.prototype.roundYWithDirection = function(y, d) {
return this.roundY(y + (d === 2 ? 1 : d === 8 ? -1 : 0));
};

Game_Map.prototype.deltaX = function(x1, x2) {


let result = x1 - x2;
if (this.isLoopHorizontal() && Math.abs(result) > this.width() / 2) {
if (result < 0) {
result += this.width();
} else {
result -= this.width();
}
}
return result;
};

Game_Map.prototype.deltaY = function(y1, y2) {


let result = y1 - y2;
if (this.isLoopVertical() && Math.abs(result) > this.height() / 2) {
if (result < 0) {
result += this.height();
} else {
result -= this.height();
}
}
return result;
};

Game_Map.prototype.distance = function(x1, y1, x2, y2) {


return Math.abs(this.deltaX(x1, x2)) + Math.abs(this.deltaY(y1, y2));
};

Game_Map.prototype.canvasToMapX = function(x) {
const tileWidth = this.tileWidth();
const originX = this._displayX * tileWidth;
const mapX = Math.floor((originX + x) / tileWidth);
return this.roundX(mapX);
};

Game_Map.prototype.canvasToMapY = function(y) {
const tileHeight = this.tileHeight();
const originY = this._displayY * tileHeight;
const mapY = Math.floor((originY + y) / tileHeight);
return this.roundY(mapY);
};

Game_Map.prototype.autoplay = function() {
if ($dataMap.autoplayBgm) {
if ($gamePlayer.isInVehicle()) {
$gameSystem.saveWalkingBgm2();
} else {
AudioManager.playBgm($dataMap.bgm);
}
}
if ($dataMap.autoplayBgs) {
AudioManager.playBgs($dataMap.bgs);
}
};

Game_Map.prototype.refreshIfNeeded = function() {
if (this._needsRefresh) {
this.refresh();
}
};

Game_Map.prototype.refresh = function() {
for (const event of this.events()) {
event.refresh();
}
for (const commonEvent of this._commonEvents) {
commonEvent.refresh();
}
this.refreshTileEvents();
this._needsRefresh = false;
};

Game_Map.prototype.refreshTileEvents = function() {
this._tileEvents = this.events().filter(event => event.isTile());
};

Game_Map.prototype.eventsXy = function(x, y) {
return this.events().filter(event => event.pos(x, y));
};

Game_Map.prototype.eventsXyNt = function(x, y) {
return this.events().filter(event => event.posNt(x, y));
};

Game_Map.prototype.tileEventsXy = function(x, y) {
return this._tileEvents.filter(event => event.posNt(x, y));
};

Game_Map.prototype.eventIdXy = function(x, y) {
const list = this.eventsXy(x, y);
return list.length === 0 ? 0 : list[0].eventId();
};

Game_Map.prototype.scrollDown = function(distance) {
if (this.isLoopVertical()) {
this._displayY += distance;
this._displayY %= $dataMap.height;
if (this._parallaxLoopY) {
this._parallaxY += distance;
}
} else if (this.height() >= this.screenTileY()) {
const lastY = this._displayY;
this._displayY = Math.min(
this._displayY + distance,
this.height() - this.screenTileY()
);
this._parallaxY += this._displayY - lastY;
}
};

Game_Map.prototype.scrollLeft = function(distance) {
if (this.isLoopHorizontal()) {
this._displayX += $dataMap.width - distance;
this._displayX %= $dataMap.width;
if (this._parallaxLoopX) {
this._parallaxX -= distance;
}
} else if (this.width() >= this.screenTileX()) {
const lastX = this._displayX;
this._displayX = Math.max(this._displayX - distance, 0);
this._parallaxX += this._displayX - lastX;
}
};

Game_Map.prototype.scrollRight = function(distance) {
if (this.isLoopHorizontal()) {
this._displayX += distance;
this._displayX %= $dataMap.width;
if (this._parallaxLoopX) {
this._parallaxX += distance;
}
} else if (this.width() >= this.screenTileX()) {
const lastX = this._displayX;
this._displayX = Math.min(
this._displayX + distance,
this.width() - this.screenTileX()
);
this._parallaxX += this._displayX - lastX;
}
};

Game_Map.prototype.scrollUp = function(distance) {
if (this.isLoopVertical()) {
this._displayY += $dataMap.height - distance;
this._displayY %= $dataMap.height;
if (this._parallaxLoopY) {
this._parallaxY -= distance;
}
} else if (this.height() >= this.screenTileY()) {
const lastY = this._displayY;
this._displayY = Math.max(this._displayY - distance, 0);
this._parallaxY += this._displayY - lastY;
}
};

Game_Map.prototype.isValid = function(x, y) {
return x >= 0 && x < this.width() && y >= 0 && y < this.height();
};

Game_Map.prototype.checkPassage = function(x, y, bit) {


const flags = this.tilesetFlags();
const tiles = this.allTiles(x, y);
for (const tile of tiles) {
const flag = flags[tile];
if ((flag & 0x10) !== 0) {
// [*] No effect on passage
continue;
}
if ((flag & bit) === 0) {
// [o] Passable
return true;
}
if ((flag & bit) === bit) {
// [x] Impassable
return false;
}
}
return false;
};

Game_Map.prototype.tileId = function(x, y, z) {
const width = $dataMap.width;
const height = $dataMap.height;
return $dataMap.data[(z * height + y) * width + x] || 0;
};

Game_Map.prototype.layeredTiles = function(x, y) {
const tiles = [];
for (let i = 0; i < 4; i++) {
tiles.push(this.tileId(x, y, 3 - i));
}
return tiles;
};

Game_Map.prototype.allTiles = function(x, y) {
const tiles = this.tileEventsXy(x, y).map(event => event.tileId());
return tiles.concat(this.layeredTiles(x, y));
};

Game_Map.prototype.autotileType = function(x, y, z) {
const tileId = this.tileId(x, y, z);
return tileId >= 2048 ? Math.floor((tileId - 2048) / 48) : -1;
};

Game_Map.prototype.isPassable = function(x, y, d) {
return this.checkPassage(x, y, (1 << (d / 2 - 1)) & 0x0f);
};

Game_Map.prototype.isBoatPassable = function(x, y) {
return this.checkPassage(x, y, 0x0200);
};

Game_Map.prototype.isShipPassable = function(x, y) {
return this.checkPassage(x, y, 0x0400);
};

Game_Map.prototype.isAirshipLandOk = function(x, y) {
return this.checkPassage(x, y, 0x0800) && this.checkPassage(x, y, 0x0f);
};

Game_Map.prototype.checkLayeredTilesFlags = function(x, y, bit) {


const flags = this.tilesetFlags();
return this.layeredTiles(x, y).some(tileId => (flags[tileId] & bit) !== 0);
};

Game_Map.prototype.isLadder = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x20);
};

Game_Map.prototype.isBush = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x40);
};

Game_Map.prototype.isCounter = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x80);
};

Game_Map.prototype.isDamageFloor = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x100);
};

Game_Map.prototype.terrainTag = function(x, y) {
if (this.isValid(x, y)) {
const flags = this.tilesetFlags();
const tiles = this.layeredTiles(x, y);
for (const tile of tiles) {
const tag = flags[tile] >> 12;
if (tag > 0) {
return tag;
}
}
}
return 0;
};

Game_Map.prototype.regionId = function(x, y) {
return this.isValid(x, y) ? this.tileId(x, y, 5) : 0;
};

Game_Map.prototype.startScroll = function(direction, distance, speed) {


this._scrollDirection = direction;
this._scrollRest = distance;
this._scrollSpeed = speed;
};

Game_Map.prototype.isScrolling = function() {
return this._scrollRest > 0;
};

Game_Map.prototype.update = function(sceneActive) {
this.refreshIfNeeded();
if (sceneActive) {
this.updateInterpreter();
}
this.updateScroll();
this.updateEvents();
this.updateVehicles();
this.updateParallax();
};

Game_Map.prototype.updateScroll = function() {
if (this.isScrolling()) {
const lastX = this._displayX;
const lastY = this._displayY;
this.doScroll(this._scrollDirection, this.scrollDistance());
if (this._displayX === lastX && this._displayY === lastY) {
this._scrollRest = 0;
} else {
this._scrollRest -= this.scrollDistance();
}
}
};

Game_Map.prototype.scrollDistance = function() {
return Math.pow(2, this._scrollSpeed) / 256;
};

Game_Map.prototype.doScroll = function(direction, distance) {


switch (direction) {
case 2:
this.scrollDown(distance);
break;
case 4:
this.scrollLeft(distance);
break;
case 6:
this.scrollRight(distance);
break;
case 8:
this.scrollUp(distance);
break;
}
};

Game_Map.prototype.updateEvents = function() {
for (const event of this.events()) {
event.update();
}
for (const commonEvent of this._commonEvents) {
commonEvent.update();
}
};

Game_Map.prototype.updateVehicles = function() {
for (const vehicle of this._vehicles) {
vehicle.update();
}
};

Game_Map.prototype.updateParallax = function() {
if (this._parallaxLoopX) {
this._parallaxX += this._parallaxSx / this.tileWidth() / 2;
}
if (this._parallaxLoopY) {
this._parallaxY += this._parallaxSy / this.tileHeight() / 2;
}
};

Game_Map.prototype.changeTileset = function(tilesetId) {
this._tilesetId = tilesetId;
this.refresh();
};

Game_Map.prototype.changeBattleback = function(
battleback1Name,
battleback2Name
) {
this._battleback1Name = battleback1Name;
this._battleback2Name = battleback2Name;
};

Game_Map.prototype.changeParallax = function(name, loopX, loopY, sx, sy) {


this._parallaxName = name;
this._parallaxZero = ImageManager.isZeroParallax(this._parallaxName);
if (this._parallaxLoopX && !loopX) {
this._parallaxX = 0;
}
if (this._parallaxLoopY && !loopY) {
this._parallaxY = 0;
}
this._parallaxLoopX = loopX;
this._parallaxLoopY = loopY;
this._parallaxSx = sx;
this._parallaxSy = sy;
};

Game_Map.prototype.updateInterpreter = function() {
for (;;) {
this._interpreter.update();
if (this._interpreter.isRunning()) {
return;
}
if (this._interpreter.eventId() > 0) {
this.unlockEvent(this._interpreter.eventId());
this._interpreter.clear();
}
if (!this.setupStartingEvent()) {
return;
}
}
};

Game_Map.prototype.unlockEvent = function(eventId) {
if (this._events[eventId]) {
this._events[eventId].unlock();
}
};

Game_Map.prototype.setupStartingEvent = function() {
this.refreshIfNeeded();
if (this._interpreter.setupReservedCommonEvent()) {
return true;
}
if (this.setupTestEvent()) {
return true;
}
if (this.setupStartingMapEvent()) {
return true;
}
if (this.setupAutorunCommonEvent()) {
return true;
}
return false;
};

Game_Map.prototype.setupTestEvent = function() {
if (window.$testEvent) {
this._interpreter.setup($testEvent, 0);
$testEvent = null;
return true;
}
return false;
};

Game_Map.prototype.setupStartingMapEvent = function() {
for (const event of this.events()) {
if (event.isStarting()) {
event.clearStartingFlag();
this._interpreter.setup(event.list(), event.eventId());
return true;
}
}
return false;
};

Game_Map.prototype.setupAutorunCommonEvent = function() {
for (const commonEvent of this.autorunCommonEvents()) {
if ($gameSwitches.value(commonEvent.switchId)) {
this._interpreter.setup(commonEvent.list);
return true;
}
}
return false;
};

Game_Map.prototype.isAnyEventStarting = function() {
return this.events().some(event => event.isStarting());
};

//-----------------------------------------------------------------------------
// Game_CommonEvent
//
// The game object class for a common event. It contains functionality for
// running parallel process events.

function Game_CommonEvent() {
this.initialize(...arguments);
}

Game_CommonEvent.prototype.initialize = function(commonEventId) {
this._commonEventId = commonEventId;
this.refresh();
};

Game_CommonEvent.prototype.event = function() {
return $dataCommonEvents[this._commonEventId];
};

Game_CommonEvent.prototype.list = function() {
return this.event().list;
};

Game_CommonEvent.prototype.refresh = function() {
if (this.isActive()) {
if (!this._interpreter) {
this._interpreter = new Game_Interpreter();
}
} else {
this._interpreter = null;
}
};

Game_CommonEvent.prototype.isActive = function() {
const event = this.event();
return event.trigger === 2 && $gameSwitches.value(event.switchId);
};

Game_CommonEvent.prototype.update = function() {
if (this._interpreter) {
if (!this._interpreter.isRunning()) {
this._interpreter.setup(this.list());
}
this._interpreter.update();
}
};

//-----------------------------------------------------------------------------
// Game_CharacterBase
//
// The superclass of Game_Character. It handles basic information, such as
// coordinates and images, shared by all characters.

function Game_CharacterBase() {
this.initialize(...arguments);
}

Object.defineProperties(Game_CharacterBase.prototype, {
x: {
get: function() {
return this._x;
},
configurable: true
},
y: {
get: function() {
return this._y;
},
configurable: true
}
});

Game_CharacterBase.prototype.initialize = function() {
this.initMembers();
};

Game_CharacterBase.prototype.initMembers = function() {
this._x = 0;
this._y = 0;
this._realX = 0;
this._realY = 0;
this._moveSpeed = 4;
this._moveFrequency = 6;
this._opacity = 255;
this._blendMode = 0;
this._direction = 2;
this._pattern = 1;
this._priorityType = 1;
this._tileId = 0;
this._characterName = "";
this._characterIndex = 0;
this._isObjectCharacter = false;
this._walkAnime = true;
this._stepAnime = false;
this._directionFix = false;
this._through = false;
this._transparent = false;
this._bushDepth = 0;
this._animationId = 0;
this._balloonId = 0;
this._animationPlaying = false;
this._balloonPlaying = false;
this._animationCount = 0;
this._stopCount = 0;
this._jumpCount = 0;
this._jumpPeak = 0;
this._movementSuccess = true;
};

Game_CharacterBase.prototype.pos = function(x, y) {
return this._x === x && this._y === y;
};

Game_CharacterBase.prototype.posNt = function(x, y) {
// No through
return this.pos(x, y) && !this.isThrough();
};

Game_CharacterBase.prototype.moveSpeed = function() {
return this._moveSpeed;
};

Game_CharacterBase.prototype.setMoveSpeed = function(moveSpeed) {
this._moveSpeed = moveSpeed;
};

Game_CharacterBase.prototype.moveFrequency = function() {
return this._moveFrequency;
};

Game_CharacterBase.prototype.setMoveFrequency = function(moveFrequency) {
this._moveFrequency = moveFrequency;
};

Game_CharacterBase.prototype.opacity = function() {
return this._opacity;
};

Game_CharacterBase.prototype.setOpacity = function(opacity) {
this._opacity = opacity;
};

Game_CharacterBase.prototype.blendMode = function() {
return this._blendMode;
};

Game_CharacterBase.prototype.setBlendMode = function(blendMode) {
this._blendMode = blendMode;
};

Game_CharacterBase.prototype.isNormalPriority = function() {
return this._priorityType === 1;
};

Game_CharacterBase.prototype.setPriorityType = function(priorityType) {
this._priorityType = priorityType;
};
Game_CharacterBase.prototype.isMoving = function() {
return this._realX !== this._x || this._realY !== this._y;
};

Game_CharacterBase.prototype.isJumping = function() {
return this._jumpCount > 0;
};

Game_CharacterBase.prototype.jumpHeight = function() {
return (
(this._jumpPeak * this._jumpPeak -
Math.pow(Math.abs(this._jumpCount - this._jumpPeak), 2)) /
2
);
};

Game_CharacterBase.prototype.isStopping = function() {
return !this.isMoving() && !this.isJumping();
};

Game_CharacterBase.prototype.checkStop = function(threshold) {
return this._stopCount > threshold;
};

Game_CharacterBase.prototype.resetStopCount = function() {
this._stopCount = 0;
};

Game_CharacterBase.prototype.realMoveSpeed = function() {
return this._moveSpeed + (this.isDashing() ? 1 : 0);
};

Game_CharacterBase.prototype.distancePerFrame = function() {
return Math.pow(2, this.realMoveSpeed()) / 256;
};

Game_CharacterBase.prototype.isDashing = function() {
return false;
};

Game_CharacterBase.prototype.isDebugThrough = function() {
return false;
};

Game_CharacterBase.prototype.straighten = function() {
if (this.hasWalkAnime() || this.hasStepAnime()) {
this._pattern = 1;
}
this._animationCount = 0;
};

Game_CharacterBase.prototype.reverseDir = function(d) {
return 10 - d;
};

Game_CharacterBase.prototype.canPass = function(x, y, d) {
const x2 = $gameMap.roundXWithDirection(x, d);
const y2 = $gameMap.roundYWithDirection(y, d);
if (!$gameMap.isValid(x2, y2)) {
return false;
}
if (this.isThrough() || this.isDebugThrough()) {
return true;
}
if (!this.isMapPassable(x, y, d)) {
return false;
}
if (this.isCollidedWithCharacters(x2, y2)) {
return false;
}
return true;
};

Game_CharacterBase.prototype.canPassDiagonally = function(x, y, horz, vert) {


const x2 = $gameMap.roundXWithDirection(x, horz);
const y2 = $gameMap.roundYWithDirection(y, vert);
if (this.canPass(x, y, vert) && this.canPass(x, y2, horz)) {
return true;
}
if (this.canPass(x, y, horz) && this.canPass(x2, y, vert)) {
return true;
}
return false;
};

Game_CharacterBase.prototype.isMapPassable = function(x, y, d) {
const x2 = $gameMap.roundXWithDirection(x, d);
const y2 = $gameMap.roundYWithDirection(y, d);
const d2 = this.reverseDir(d);
return $gameMap.isPassable(x, y, d) && $gameMap.isPassable(x2, y2, d2);
};

Game_CharacterBase.prototype.isCollidedWithCharacters = function(x, y) {
return this.isCollidedWithEvents(x, y) || this.isCollidedWithVehicles(x, y);
};

Game_CharacterBase.prototype.isCollidedWithEvents = function(x, y) {
const events = $gameMap.eventsXyNt(x, y);
return events.some(event => event.isNormalPriority());
};

Game_CharacterBase.prototype.isCollidedWithVehicles = function(x, y) {
return $gameMap.boat().posNt(x, y) || $gameMap.ship().posNt(x, y);
};

Game_CharacterBase.prototype.setPosition = function(x, y) {
this._x = Math.round(x);
this._y = Math.round(y);
this._realX = x;
this._realY = y;
};

Game_CharacterBase.prototype.copyPosition = function(character) {
this._x = character._x;
this._y = character._y;
this._realX = character._realX;
this._realY = character._realY;
this._direction = character._direction;
};

Game_CharacterBase.prototype.locate = function(x, y) {
this.setPosition(x, y);
this.straighten();
this.refreshBushDepth();
};

Game_CharacterBase.prototype.direction = function() {
return this._direction;
};

Game_CharacterBase.prototype.setDirection = function(d) {
if (!this.isDirectionFixed() && d) {
this._direction = d;
}
this.resetStopCount();
};

Game_CharacterBase.prototype.isTile = function() {
return this._tileId > 0 && this._priorityType === 0;
};

Game_CharacterBase.prototype.isObjectCharacter = function() {
return this._isObjectCharacter;
};

Game_CharacterBase.prototype.shiftY = function() {
return this.isObjectCharacter() ? 0 : 6;
};

Game_CharacterBase.prototype.scrolledX = function() {
return $gameMap.adjustX(this._realX);
};

Game_CharacterBase.prototype.scrolledY = function() {
return $gameMap.adjustY(this._realY);
};

Game_CharacterBase.prototype.screenX = function() {
const tw = $gameMap.tileWidth();
return Math.floor(this.scrolledX() * tw + tw / 2);
};

Game_CharacterBase.prototype.screenY = function() {
const th = $gameMap.tileHeight();
return Math.floor(
this.scrolledY() * th + th - this.shiftY() - this.jumpHeight()
);
};

Game_CharacterBase.prototype.screenZ = function() {
return this._priorityType * 2 + 1;
};

Game_CharacterBase.prototype.isNearTheScreen = function() {
const gw = Graphics.width;
const gh = Graphics.height;
const tw = $gameMap.tileWidth();
const th = $gameMap.tileHeight();
const px = this.scrolledX() * tw + tw / 2 - gw / 2;
const py = this.scrolledY() * th + th / 2 - gh / 2;
return px >= -gw && px <= gw && py >= -gh && py <= gh;
};

Game_CharacterBase.prototype.update = function() {
if (this.isStopping()) {
this.updateStop();
}
if (this.isJumping()) {
this.updateJump();
} else if (this.isMoving()) {
this.updateMove();
}
this.updateAnimation();
};

Game_CharacterBase.prototype.updateStop = function() {
this._stopCount++;
};

Game_CharacterBase.prototype.updateJump = function() {
this._jumpCount--;
this._realX =
(this._realX * this._jumpCount + this._x) / (this._jumpCount + 1.0);
this._realY =
(this._realY * this._jumpCount + this._y) / (this._jumpCount + 1.0);
this.refreshBushDepth();
if (this._jumpCount === 0) {
this._realX = this._x = $gameMap.roundX(this._x);
this._realY = this._y = $gameMap.roundY(this._y);
}
};

Game_CharacterBase.prototype.updateMove = function() {
if (this._x < this._realX) {
this._realX = Math.max(this._realX - this.distancePerFrame(), this._x);
}
if (this._x > this._realX) {
this._realX = Math.min(this._realX + this.distancePerFrame(), this._x);
}
if (this._y < this._realY) {
this._realY = Math.max(this._realY - this.distancePerFrame(), this._y);
}
if (this._y > this._realY) {
this._realY = Math.min(this._realY + this.distancePerFrame(), this._y);
}
if (!this.isMoving()) {
this.refreshBushDepth();
}
};

Game_CharacterBase.prototype.updateAnimation = function() {
this.updateAnimationCount();
if (this._animationCount >= this.animationWait()) {
this.updatePattern();
this._animationCount = 0;
}
};

Game_CharacterBase.prototype.animationWait = function() {
return (9 - this.realMoveSpeed()) * 3;
};

Game_CharacterBase.prototype.updateAnimationCount = function() {
if (this.isMoving() && this.hasWalkAnime()) {
this._animationCount += 1.5;
} else if (this.hasStepAnime() || !this.isOriginalPattern()) {
this._animationCount++;
}
};

Game_CharacterBase.prototype.updatePattern = function() {
if (!this.hasStepAnime() && this._stopCount > 0) {
this.resetPattern();
} else {
this._pattern = (this._pattern + 1) % this.maxPattern();
}
};

Game_CharacterBase.prototype.maxPattern = function() {
return 4;
};

Game_CharacterBase.prototype.pattern = function() {
return this._pattern < 3 ? this._pattern : 1;
};

Game_CharacterBase.prototype.setPattern = function(pattern) {
this._pattern = pattern;
};

Game_CharacterBase.prototype.isOriginalPattern = function() {
return this.pattern() === 1;
};

Game_CharacterBase.prototype.resetPattern = function() {
this.setPattern(1);
};

Game_CharacterBase.prototype.refreshBushDepth = function() {
if (
this.isNormalPriority() &&
!this.isObjectCharacter() &&
this.isOnBush() &&
!this.isJumping()
) {
if (!this.isMoving()) {
this._bushDepth = $gameMap.bushDepth();
}
} else {
this._bushDepth = 0;
}
};

Game_CharacterBase.prototype.isOnLadder = function() {
return $gameMap.isLadder(this._x, this._y);
};

Game_CharacterBase.prototype.isOnBush = function() {
return $gameMap.isBush(this._x, this._y);
};

Game_CharacterBase.prototype.terrainTag = function() {
return $gameMap.terrainTag(this._x, this._y);
};

Game_CharacterBase.prototype.regionId = function() {
return $gameMap.regionId(this._x, this._y);
};

Game_CharacterBase.prototype.increaseSteps = function() {
if (this.isOnLadder()) {
this.setDirection(8);
}
this.resetStopCount();
this.refreshBushDepth();
};

Game_CharacterBase.prototype.tileId = function() {
return this._tileId;
};

Game_CharacterBase.prototype.characterName = function() {
return this._characterName;
};

Game_CharacterBase.prototype.characterIndex = function() {
return this._characterIndex;
};

Game_CharacterBase.prototype.setImage = function(
characterName,
characterIndex
) {
this._tileId = 0;
this._characterName = characterName;
this._characterIndex = characterIndex;
this._isObjectCharacter = ImageManager.isObjectCharacter(characterName);
};

Game_CharacterBase.prototype.setTileImage = function(tileId) {
this._tileId = tileId;
this._characterName = "";
this._characterIndex = 0;
this._isObjectCharacter = true;
};

Game_CharacterBase.prototype.checkEventTriggerTouchFront = function(d) {
const x2 = $gameMap.roundXWithDirection(this._x, d);
const y2 = $gameMap.roundYWithDirection(this._y, d);
this.checkEventTriggerTouch(x2, y2);
};

Game_CharacterBase.prototype.checkEventTriggerTouch = function(/*x, y*/) {


return false;
};

Game_CharacterBase.prototype.isMovementSucceeded = function(/*x, y*/) {


return this._movementSuccess;
};

Game_CharacterBase.prototype.setMovementSuccess = function(success) {
this._movementSuccess = success;
};

Game_CharacterBase.prototype.moveStraight = function(d) {
this.setMovementSuccess(this.canPass(this._x, this._y, d));
if (this.isMovementSucceeded()) {
this.setDirection(d);
this._x = $gameMap.roundXWithDirection(this._x, d);
this._y = $gameMap.roundYWithDirection(this._y, d);
this._realX = $gameMap.xWithDirection(this._x, this.reverseDir(d));
this._realY = $gameMap.yWithDirection(this._y, this.reverseDir(d));
this.increaseSteps();
} else {
this.setDirection(d);
this.checkEventTriggerTouchFront(d);
}
};

Game_CharacterBase.prototype.moveDiagonally = function(horz, vert) {


this.setMovementSuccess(
this.canPassDiagonally(this._x, this._y, horz, vert)
);
if (this.isMovementSucceeded()) {
this._x = $gameMap.roundXWithDirection(this._x, horz);
this._y = $gameMap.roundYWithDirection(this._y, vert);
this._realX = $gameMap.xWithDirection(this._x, this.reverseDir(horz));
this._realY = $gameMap.yWithDirection(this._y, this.reverseDir(vert));
this.increaseSteps();
}
if (this._direction === this.reverseDir(horz)) {
this.setDirection(horz);
}
if (this._direction === this.reverseDir(vert)) {
this.setDirection(vert);
}
};

Game_CharacterBase.prototype.jump = function(xPlus, yPlus) {


if (Math.abs(xPlus) > Math.abs(yPlus)) {
if (xPlus !== 0) {
this.setDirection(xPlus < 0 ? 4 : 6);
}
} else {
if (yPlus !== 0) {
this.setDirection(yPlus < 0 ? 8 : 2);
}
}
this._x += xPlus;
this._y += yPlus;
const distance = Math.round(Math.sqrt(xPlus * xPlus + yPlus * yPlus));
this._jumpPeak = 10 + distance - this._moveSpeed;
this._jumpCount = this._jumpPeak * 2;
this.resetStopCount();
this.straighten();
};

Game_CharacterBase.prototype.hasWalkAnime = function() {
return this._walkAnime;
};

Game_CharacterBase.prototype.setWalkAnime = function(walkAnime) {
this._walkAnime = walkAnime;
};

Game_CharacterBase.prototype.hasStepAnime = function() {
return this._stepAnime;
};

Game_CharacterBase.prototype.setStepAnime = function(stepAnime) {
this._stepAnime = stepAnime;
};

Game_CharacterBase.prototype.isDirectionFixed = function() {
return this._directionFix;
};

Game_CharacterBase.prototype.setDirectionFix = function(directionFix) {
this._directionFix = directionFix;
};

Game_CharacterBase.prototype.isThrough = function() {
return this._through;
};

Game_CharacterBase.prototype.setThrough = function(through) {
this._through = through;
};

Game_CharacterBase.prototype.isTransparent = function() {
return this._transparent;
};

Game_CharacterBase.prototype.bushDepth = function() {
return this._bushDepth;
};

Game_CharacterBase.prototype.setTransparent = function(transparent) {
this._transparent = transparent;
};

Game_CharacterBase.prototype.startAnimation = function() {
this._animationPlaying = true;
};

Game_CharacterBase.prototype.startBalloon = function() {
this._balloonPlaying = true;
};

Game_CharacterBase.prototype.isAnimationPlaying = function() {
return this._animationPlaying;
};
Game_CharacterBase.prototype.isBalloonPlaying = function() {
return this._balloonPlaying;
};

Game_CharacterBase.prototype.endAnimation = function() {
this._animationPlaying = false;
};

Game_CharacterBase.prototype.endBalloon = function() {
this._balloonPlaying = false;
};

//-----------------------------------------------------------------------------
// Game_Character
//
// The superclass of Game_Player, Game_Follower, GameVehicle, and Game_Event.

function Game_Character() {
this.initialize(...arguments);
}

Game_Character.prototype = Object.create(Game_CharacterBase.prototype);
Game_Character.prototype.constructor = Game_Character;

Game_Character.ROUTE_END = 0;
Game_Character.ROUTE_MOVE_DOWN = 1;
Game_Character.ROUTE_MOVE_LEFT = 2;
Game_Character.ROUTE_MOVE_RIGHT = 3;
Game_Character.ROUTE_MOVE_UP = 4;
Game_Character.ROUTE_MOVE_LOWER_L = 5;
Game_Character.ROUTE_MOVE_LOWER_R = 6;
Game_Character.ROUTE_MOVE_UPPER_L = 7;
Game_Character.ROUTE_MOVE_UPPER_R = 8;
Game_Character.ROUTE_MOVE_RANDOM = 9;
Game_Character.ROUTE_MOVE_TOWARD = 10;
Game_Character.ROUTE_MOVE_AWAY = 11;
Game_Character.ROUTE_MOVE_FORWARD = 12;
Game_Character.ROUTE_MOVE_BACKWARD = 13;
Game_Character.ROUTE_JUMP = 14;
Game_Character.ROUTE_WAIT = 15;
Game_Character.ROUTE_TURN_DOWN = 16;
Game_Character.ROUTE_TURN_LEFT = 17;
Game_Character.ROUTE_TURN_RIGHT = 18;
Game_Character.ROUTE_TURN_UP = 19;
Game_Character.ROUTE_TURN_90D_R = 20;
Game_Character.ROUTE_TURN_90D_L = 21;
Game_Character.ROUTE_TURN_180D = 22;
Game_Character.ROUTE_TURN_90D_R_L = 23;
Game_Character.ROUTE_TURN_RANDOM = 24;
Game_Character.ROUTE_TURN_TOWARD = 25;
Game_Character.ROUTE_TURN_AWAY = 26;
Game_Character.ROUTE_SWITCH_ON = 27;
Game_Character.ROUTE_SWITCH_OFF = 28;
Game_Character.ROUTE_CHANGE_SPEED = 29;
Game_Character.ROUTE_CHANGE_FREQ = 30;
Game_Character.ROUTE_WALK_ANIME_ON = 31;
Game_Character.ROUTE_WALK_ANIME_OFF = 32;
Game_Character.ROUTE_STEP_ANIME_ON = 33;
Game_Character.ROUTE_STEP_ANIME_OFF = 34;
Game_Character.ROUTE_DIR_FIX_ON = 35;
Game_Character.ROUTE_DIR_FIX_OFF = 36;
Game_Character.ROUTE_THROUGH_ON = 37;
Game_Character.ROUTE_THROUGH_OFF = 38;
Game_Character.ROUTE_TRANSPARENT_ON = 39;
Game_Character.ROUTE_TRANSPARENT_OFF = 40;
Game_Character.ROUTE_CHANGE_IMAGE = 41;
Game_Character.ROUTE_CHANGE_OPACITY = 42;
Game_Character.ROUTE_CHANGE_BLEND_MODE = 43;
Game_Character.ROUTE_PLAY_SE = 44;
Game_Character.ROUTE_SCRIPT = 45;

Game_Character.prototype.initialize = function() {
Game_CharacterBase.prototype.initialize.call(this);
};

Game_Character.prototype.initMembers = function() {
Game_CharacterBase.prototype.initMembers.call(this);
this._moveRouteForcing = false;
this._moveRoute = null;
this._moveRouteIndex = 0;
this._originalMoveRoute = null;
this._originalMoveRouteIndex = 0;
this._waitCount = 0;
};

Game_Character.prototype.memorizeMoveRoute = function() {
this._originalMoveRoute = this._moveRoute;
this._originalMoveRouteIndex = this._moveRouteIndex;
};

Game_Character.prototype.restoreMoveRoute = function() {
this._moveRoute = this._originalMoveRoute;
this._moveRouteIndex = this._originalMoveRouteIndex;
this._originalMoveRoute = null;
};

Game_Character.prototype.isMoveRouteForcing = function() {
return this._moveRouteForcing;
};

Game_Character.prototype.setMoveRoute = function(moveRoute) {
if (this._moveRouteForcing) {
this._originalMoveRoute = moveRoute;
this._originalMoveRouteIndex = 0;
} else {
this._moveRoute = moveRoute;
this._moveRouteIndex = 0;
}
};

Game_Character.prototype.forceMoveRoute = function(moveRoute) {
if (!this._originalMoveRoute) {
this.memorizeMoveRoute();
}
this._moveRoute = moveRoute;
this._moveRouteIndex = 0;
this._moveRouteForcing = true;
this._waitCount = 0;
};

Game_Character.prototype.updateStop = function() {
Game_CharacterBase.prototype.updateStop.call(this);
if (this._moveRouteForcing) {
this.updateRoutineMove();
}
};

Game_Character.prototype.updateRoutineMove = function() {
if (this._waitCount > 0) {
this._waitCount--;
} else {
this.setMovementSuccess(true);
const command = this._moveRoute.list[this._moveRouteIndex];
if (command) {
this.processMoveCommand(command);
this.advanceMoveRouteIndex();
}
}
};

Game_Character.prototype.processMoveCommand = function(command) {
const gc = Game_Character;
const params = command.parameters;
switch (command.code) {
case gc.ROUTE_END:
this.processRouteEnd();
break;
case gc.ROUTE_MOVE_DOWN:
this.moveStraight(2);
break;
case gc.ROUTE_MOVE_LEFT:
this.moveStraight(4);
break;
case gc.ROUTE_MOVE_RIGHT:
this.moveStraight(6);
break;
case gc.ROUTE_MOVE_UP:
this.moveStraight(8);
break;
case gc.ROUTE_MOVE_LOWER_L:
this.moveDiagonally(4, 2);
break;
case gc.ROUTE_MOVE_LOWER_R:
this.moveDiagonally(6, 2);
break;
case gc.ROUTE_MOVE_UPPER_L:
this.moveDiagonally(4, 8);
break;
case gc.ROUTE_MOVE_UPPER_R:
this.moveDiagonally(6, 8);
break;
case gc.ROUTE_MOVE_RANDOM:
this.moveRandom();
break;
case gc.ROUTE_MOVE_TOWARD:
this.moveTowardPlayer();
break;
case gc.ROUTE_MOVE_AWAY:
this.moveAwayFromPlayer();
break;
case gc.ROUTE_MOVE_FORWARD:
this.moveForward();
break;
case gc.ROUTE_MOVE_BACKWARD:
this.moveBackward();
break;
case gc.ROUTE_JUMP:
this.jump(params[0], params[1]);
break;
case gc.ROUTE_WAIT:
this._waitCount = params[0] - 1;
break;
case gc.ROUTE_TURN_DOWN:
this.setDirection(2);
break;
case gc.ROUTE_TURN_LEFT:
this.setDirection(4);
break;
case gc.ROUTE_TURN_RIGHT:
this.setDirection(6);
break;
case gc.ROUTE_TURN_UP:
this.setDirection(8);
break;
case gc.ROUTE_TURN_90D_R:
this.turnRight90();
break;
case gc.ROUTE_TURN_90D_L:
this.turnLeft90();
break;
case gc.ROUTE_TURN_180D:
this.turn180();
break;
case gc.ROUTE_TURN_90D_R_L:
this.turnRightOrLeft90();
break;
case gc.ROUTE_TURN_RANDOM:
this.turnRandom();
break;
case gc.ROUTE_TURN_TOWARD:
this.turnTowardPlayer();
break;
case gc.ROUTE_TURN_AWAY:
this.turnAwayFromPlayer();
break;
case gc.ROUTE_SWITCH_ON:
$gameSwitches.setValue(params[0], true);
break;
case gc.ROUTE_SWITCH_OFF:
$gameSwitches.setValue(params[0], false);
break;
case gc.ROUTE_CHANGE_SPEED:
this.setMoveSpeed(params[0]);
break;
case gc.ROUTE_CHANGE_FREQ:
this.setMoveFrequency(params[0]);
break;
case gc.ROUTE_WALK_ANIME_ON:
this.setWalkAnime(true);
break;
case gc.ROUTE_WALK_ANIME_OFF:
this.setWalkAnime(false);
break;
case gc.ROUTE_STEP_ANIME_ON:
this.setStepAnime(true);
break;
case gc.ROUTE_STEP_ANIME_OFF:
this.setStepAnime(false);
break;
case gc.ROUTE_DIR_FIX_ON:
this.setDirectionFix(true);
break;
case gc.ROUTE_DIR_FIX_OFF:
this.setDirectionFix(false);
break;
case gc.ROUTE_THROUGH_ON:
this.setThrough(true);
break;
case gc.ROUTE_THROUGH_OFF:
this.setThrough(false);
break;
case gc.ROUTE_TRANSPARENT_ON:
this.setTransparent(true);
break;
case gc.ROUTE_TRANSPARENT_OFF:
this.setTransparent(false);
break;
case gc.ROUTE_CHANGE_IMAGE:
this.setImage(params[0], params[1]);
break;
case gc.ROUTE_CHANGE_OPACITY:
this.setOpacity(params[0]);
break;
case gc.ROUTE_CHANGE_BLEND_MODE:
this.setBlendMode(params[0]);
break;
case gc.ROUTE_PLAY_SE:
AudioManager.playSe(params[0]);
break;
case gc.ROUTE_SCRIPT:
eval(params[0]);
break;
}
};

Game_Character.prototype.deltaXFrom = function(x) {
return $gameMap.deltaX(this.x, x);
};

Game_Character.prototype.deltaYFrom = function(y) {
return $gameMap.deltaY(this.y, y);
};

Game_Character.prototype.moveRandom = function() {
const d = 2 + Math.randomInt(4) * 2;
if (this.canPass(this.x, this.y, d)) {
this.moveStraight(d);
}
};

Game_Character.prototype.moveTowardCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.moveStraight(sx > 0 ? 4 : 6);
if (!this.isMovementSucceeded() && sy !== 0) {
this.moveStraight(sy > 0 ? 8 : 2);
}
} else if (sy !== 0) {
this.moveStraight(sy > 0 ? 8 : 2);
if (!this.isMovementSucceeded() && sx !== 0) {
this.moveStraight(sx > 0 ? 4 : 6);
}
}
};

Game_Character.prototype.moveAwayFromCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.moveStraight(sx > 0 ? 6 : 4);
if (!this.isMovementSucceeded() && sy !== 0) {
this.moveStraight(sy > 0 ? 2 : 8);
}
} else if (sy !== 0) {
this.moveStraight(sy > 0 ? 2 : 8);
if (!this.isMovementSucceeded() && sx !== 0) {
this.moveStraight(sx > 0 ? 6 : 4);
}
}
};

Game_Character.prototype.turnTowardCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.setDirection(sx > 0 ? 4 : 6);
} else if (sy !== 0) {
this.setDirection(sy > 0 ? 8 : 2);
}
};

Game_Character.prototype.turnAwayFromCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.setDirection(sx > 0 ? 6 : 4);
} else if (sy !== 0) {
this.setDirection(sy > 0 ? 2 : 8);
}
};

Game_Character.prototype.turnTowardPlayer = function() {
this.turnTowardCharacter($gamePlayer);
};

Game_Character.prototype.turnAwayFromPlayer = function() {
this.turnAwayFromCharacter($gamePlayer);
};

Game_Character.prototype.moveTowardPlayer = function() {
this.moveTowardCharacter($gamePlayer);
};

Game_Character.prototype.moveAwayFromPlayer = function() {
this.moveAwayFromCharacter($gamePlayer);
};

Game_Character.prototype.moveForward = function() {
this.moveStraight(this.direction());
};

Game_Character.prototype.moveBackward = function() {
const lastDirectionFix = this.isDirectionFixed();
this.setDirectionFix(true);
this.moveStraight(this.reverseDir(this.direction()));
this.setDirectionFix(lastDirectionFix);
};

Game_Character.prototype.processRouteEnd = function() {
if (this._moveRoute.repeat) {
this._moveRouteIndex = -1;
} else if (this._moveRouteForcing) {
this._moveRouteForcing = false;
this.restoreMoveRoute();
this.setMovementSuccess(false);
}
};

Game_Character.prototype.advanceMoveRouteIndex = function() {
const moveRoute = this._moveRoute;
if (moveRoute && (this.isMovementSucceeded() || moveRoute.skippable)) {
let numCommands = moveRoute.list.length - 1;
this._moveRouteIndex++;
if (moveRoute.repeat && this._moveRouteIndex >= numCommands) {
this._moveRouteIndex = 0;
}
}
};

Game_Character.prototype.turnRight90 = function() {
switch (this.direction()) {
case 2:
this.setDirection(4);
break;
case 4:
this.setDirection(8);
break;
case 6:
this.setDirection(2);
break;
case 8:
this.setDirection(6);
break;
}
};

Game_Character.prototype.turnLeft90 = function() {
switch (this.direction()) {
case 2:
this.setDirection(6);
break;
case 4:
this.setDirection(2);
break;
case 6:
this.setDirection(8);
break;
case 8:
this.setDirection(4);
break;
}
};

Game_Character.prototype.turn180 = function() {
this.setDirection(this.reverseDir(this.direction()));
};

Game_Character.prototype.turnRightOrLeft90 = function() {
switch (Math.randomInt(2)) {
case 0:
this.turnRight90();
break;
case 1:
this.turnLeft90();
break;
}
};

Game_Character.prototype.turnRandom = function() {
this.setDirection(2 + Math.randomInt(4) * 2);
};

Game_Character.prototype.swap = function(character) {
const newX = character.x;
const newY = character.y;
character.locate(this.x, this.y);
this.locate(newX, newY);
};

Game_Character.prototype.findDirectionTo = function(goalX, goalY) {


const searchLimit = this.searchLimit();
const mapWidth = $gameMap.width();
const nodeList = [];
const openList = [];
const closedList = [];
const start = {};
let best = start;

if (this.x === goalX && this.y === goalY) {


return 0;
}

start.parent = null;
start.x = this.x;
start.y = this.y;
start.g = 0;
start.f = $gameMap.distance(start.x, start.y, goalX, goalY);
nodeList.push(start);
openList.push(start.y * mapWidth + start.x);

while (nodeList.length > 0) {


let bestIndex = 0;
for (let i = 0; i < nodeList.length; i++) {
if (nodeList[i].f < nodeList[bestIndex].f) {
bestIndex = i;
}
}

const current = nodeList[bestIndex];


const x1 = current.x;
const y1 = current.y;
const pos1 = y1 * mapWidth + x1;
const g1 = current.g;

nodeList.splice(bestIndex, 1);
openList.splice(openList.indexOf(pos1), 1);
closedList.push(pos1);

if (current.x === goalX && current.y === goalY) {


best = current;
break;
}

if (g1 >= searchLimit) {


continue;
}

for (let j = 0; j < 4; j++) {


const direction = 2 + j * 2;
const x2 = $gameMap.roundXWithDirection(x1, direction);
const y2 = $gameMap.roundYWithDirection(y1, direction);
const pos2 = y2 * mapWidth + x2;

if (closedList.includes(pos2)) {
continue;
}
if (!this.canPass(x1, y1, direction)) {
continue;
}

const g2 = g1 + 1;
const index2 = openList.indexOf(pos2);

if (index2 < 0 || g2 < nodeList[index2].g) {


let neighbor = {};
if (index2 >= 0) {
neighbor = nodeList[index2];
} else {
nodeList.push(neighbor);
openList.push(pos2);
}
neighbor.parent = current;
neighbor.x = x2;
neighbor.y = y2;
neighbor.g = g2;
neighbor.f = g2 + $gameMap.distance(x2, y2, goalX, goalY);
if (!best || neighbor.f - neighbor.g < best.f - best.g) {
best = neighbor;
}
}
}
}

let node = best;


while (node.parent && node.parent !== start) {
node = node.parent;
}

const deltaX1 = $gameMap.deltaX(node.x, start.x);


const deltaY1 = $gameMap.deltaY(node.y, start.y);
if (deltaY1 > 0) {
return 2;
} else if (deltaX1 < 0) {
return 4;
} else if (deltaX1 > 0) {
return 6;
} else if (deltaY1 < 0) {
return 8;
}

const deltaX2 = this.deltaXFrom(goalX);


const deltaY2 = this.deltaYFrom(goalY);
if (Math.abs(deltaX2) > Math.abs(deltaY2)) {
return deltaX2 > 0 ? 4 : 6;
} else if (deltaY2 !== 0) {
return deltaY2 > 0 ? 8 : 2;
}

return 0;
};

Game_Character.prototype.searchLimit = function() {
return 12;
};

//-----------------------------------------------------------------------------
// Game_Player
//
// The game object class for the player. It contains event starting
// determinants and map scrolling functions.

function Game_Player() {
this.initialize(...arguments);
}

Game_Player.prototype = Object.create(Game_Character.prototype);
Game_Player.prototype.constructor = Game_Player;
Game_Player.prototype.initialize = function() {
Game_Character.prototype.initialize.call(this);
this.setTransparent($dataSystem.optTransparent);
};

Game_Player.prototype.initMembers = function() {
Game_Character.prototype.initMembers.call(this);
this._vehicleType = "walk";
this._vehicleGettingOn = false;
this._vehicleGettingOff = false;
this._dashing = false;
this._needsMapReload = false;
this._transferring = false;
this._newMapId = 0;
this._newX = 0;
this._newY = 0;
this._newDirection = 0;
this._fadeType = 0;
this._followers = new Game_Followers();
this._encounterCount = 0;
};

Game_Player.prototype.clearTransferInfo = function() {
this._transferring = false;
this._newMapId = 0;
this._newX = 0;
this._newY = 0;
this._newDirection = 0;
};

Game_Player.prototype.followers = function() {
return this._followers;
};

Game_Player.prototype.refresh = function() {
const actor = $gameParty.leader();
const characterName = actor ? actor.characterName() : "";
const characterIndex = actor ? actor.characterIndex() : 0;
this.setImage(characterName, characterIndex);
this._followers.refresh();
};

Game_Player.prototype.isStopping = function() {
if (this._vehicleGettingOn || this._vehicleGettingOff) {
return false;
}
return Game_Character.prototype.isStopping.call(this);
};

Game_Player.prototype.reserveTransfer = function(mapId, x, y, d, fadeType) {


this._transferring = true;
this._newMapId = mapId;
this._newX = x;
this._newY = y;
this._newDirection = d;
this._fadeType = fadeType;
};

Game_Player.prototype.setupForNewGame = function() {
const mapId = $dataSystem.startMapId;
const x = $dataSystem.startX;
const y = $dataSystem.startY;
this.reserveTransfer(mapId, x, y, 2, 0);
};

Game_Player.prototype.requestMapReload = function() {
this._needsMapReload = true;
};

Game_Player.prototype.isTransferring = function() {
return this._transferring;
};

Game_Player.prototype.newMapId = function() {
return this._newMapId;
};

Game_Player.prototype.fadeType = function() {
return this._fadeType;
};

Game_Player.prototype.performTransfer = function() {
if (this.isTransferring()) {
this.setDirection(this._newDirection);
if (this._newMapId !== $gameMap.mapId() || this._needsMapReload) {
$gameMap.setup(this._newMapId);
this._needsMapReload = false;
}
this.locate(this._newX, this._newY);
this.refresh();
this.clearTransferInfo();
}
};

Game_Player.prototype.isMapPassable = function(x, y, d) {
const vehicle = this.vehicle();
if (vehicle) {
return vehicle.isMapPassable(x, y, d);
} else {
return Game_Character.prototype.isMapPassable.call(this, x, y, d);
}
};

Game_Player.prototype.vehicle = function() {
return $gameMap.vehicle(this._vehicleType);
};

Game_Player.prototype.isInBoat = function() {
return this._vehicleType === "boat";
};

Game_Player.prototype.isInShip = function() {
return this._vehicleType === "ship";
};

Game_Player.prototype.isInAirship = function() {
return this._vehicleType === "airship";
};
Game_Player.prototype.isInVehicle = function() {
return this.isInBoat() || this.isInShip() || this.isInAirship();
};

Game_Player.prototype.isNormal = function() {
return this._vehicleType === "walk" && !this.isMoveRouteForcing();
};

Game_Player.prototype.isDashing = function() {
return this._dashing;
};

Game_Player.prototype.isDebugThrough = function() {
return Input.isPressed("control") && $gameTemp.isPlaytest();
};

Game_Player.prototype.isCollided = function(x, y) {
if (this.isThrough()) {
return false;
} else {
return this.pos(x, y) || this._followers.isSomeoneCollided(x, y);
}
};

Game_Player.prototype.centerX = function() {
return ($gameMap.screenTileX() - 1) / 2;
};

Game_Player.prototype.centerY = function() {
return ($gameMap.screenTileY() - 1) / 2;
};

Game_Player.prototype.center = function(x, y) {
return $gameMap.setDisplayPos(x - this.centerX(), y - this.centerY());
};

Game_Player.prototype.locate = function(x, y) {
Game_Character.prototype.locate.call(this, x, y);
this.center(x, y);
this.makeEncounterCount();
if (this.isInVehicle()) {
this.vehicle().refresh();
}
this._followers.synchronize(x, y, this.direction());
};

Game_Player.prototype.increaseSteps = function() {
Game_Character.prototype.increaseSteps.call(this);
if (this.isNormal()) {
$gameParty.increaseSteps();
}
};

Game_Player.prototype.makeEncounterCount = function() {
const n = $gameMap.encounterStep();
this._encounterCount = Math.randomInt(n) + Math.randomInt(n) + 1;
};
Game_Player.prototype.makeEncounterTroopId = function() {
const encounterList = [];
let weightSum = 0;
for (const encounter of $gameMap.encounterList()) {
if (this.meetsEncounterConditions(encounter)) {
encounterList.push(encounter);
weightSum += encounter.weight;
}
}
if (weightSum > 0) {
let value = Math.randomInt(weightSum);
for (const encounter of encounterList) {
value -= encounter.weight;
if (value < 0) {
return encounter.troopId;
}
}
}
return 0;
};

Game_Player.prototype.meetsEncounterConditions = function(encounter) {
return (
encounter.regionSet.length === 0 ||
encounter.regionSet.includes(this.regionId())
);
};

Game_Player.prototype.executeEncounter = function() {
if (!$gameMap.isEventRunning() && this._encounterCount <= 0) {
this.makeEncounterCount();
const troopId = this.makeEncounterTroopId();
if ($dataTroops[troopId]) {
BattleManager.setup(troopId, true, false);
BattleManager.onEncounter();
return true;
} else {
return false;
}
} else {
return false;
}
};

Game_Player.prototype.startMapEvent = function(x, y, triggers, normal) {


if (!$gameMap.isEventRunning()) {
for (const event of $gameMap.eventsXy(x, y)) {
if (
event.isTriggerIn(triggers) &&
event.isNormalPriority() === normal
) {
event.start();
}
}
}
};

Game_Player.prototype.moveByInput = function() {
if (!this.isMoving() && this.canMove()) {
let direction = this.getInputDirection();
if (direction > 0) {
$gameTemp.clearDestination();
} else if ($gameTemp.isDestinationValid()) {
const x = $gameTemp.destinationX();
const y = $gameTemp.destinationY();
direction = this.findDirectionTo(x, y);
}
if (direction > 0) {
this.executeMove(direction);
}
}
};

Game_Player.prototype.canMove = function() {
if ($gameMap.isEventRunning() || $gameMessage.isBusy()) {
return false;
}
if (this.isMoveRouteForcing() || this.areFollowersGathering()) {
return false;
}
if (this._vehicleGettingOn || this._vehicleGettingOff) {
return false;
}
if (this.isInVehicle() && !this.vehicle().canMove()) {
return false;
}
return true;
};

Game_Player.prototype.getInputDirection = function() {
return Input.dir4;
};

Game_Player.prototype.executeMove = function(direction) {
this.moveStraight(direction);
};

Game_Player.prototype.update = function(sceneActive) {
const lastScrolledX = this.scrolledX();
const lastScrolledY = this.scrolledY();
const wasMoving = this.isMoving();
this.updateDashing();
if (sceneActive) {
this.moveByInput();
}
Game_Character.prototype.update.call(this);
this.updateScroll(lastScrolledX, lastScrolledY);
this.updateVehicle();
if (!this.isMoving()) {
this.updateNonmoving(wasMoving, sceneActive);
}
this._followers.update();
};

Game_Player.prototype.updateDashing = function() {
if (this.isMoving()) {
return;
}
if (this.canMove() && !this.isInVehicle() && !$gameMap.isDashDisabled()) {
this._dashing =
this.isDashButtonPressed() || $gameTemp.isDestinationValid();
} else {
this._dashing = false;
}
};

Game_Player.prototype.isDashButtonPressed = function() {
const shift = Input.isPressed("shift");
if (ConfigManager.alwaysDash) {
return !shift;
} else {
return shift;
}
};

Game_Player.prototype.updateScroll = function(lastScrolledX, lastScrolledY) {


const x1 = lastScrolledX;
const y1 = lastScrolledY;
const x2 = this.scrolledX();
const y2 = this.scrolledY();
if (y2 > y1 && y2 > this.centerY()) {
$gameMap.scrollDown(y2 - y1);
}
if (x2 < x1 && x2 < this.centerX()) {
$gameMap.scrollLeft(x1 - x2);
}
if (x2 > x1 && x2 > this.centerX()) {
$gameMap.scrollRight(x2 - x1);
}
if (y2 < y1 && y2 < this.centerY()) {
$gameMap.scrollUp(y1 - y2);
}
};

Game_Player.prototype.updateVehicle = function() {
if (this.isInVehicle() && !this.areFollowersGathering()) {
if (this._vehicleGettingOn) {
this.updateVehicleGetOn();
} else if (this._vehicleGettingOff) {
this.updateVehicleGetOff();
} else {
this.vehicle().syncWithPlayer();
}
}
};

Game_Player.prototype.updateVehicleGetOn = function() {
if (!this.areFollowersGathering() && !this.isMoving()) {
this.setDirection(this.vehicle().direction());
this.setMoveSpeed(this.vehicle().moveSpeed());
this._vehicleGettingOn = false;
this.setTransparent(true);
if (this.isInAirship()) {
this.setThrough(true);
}
this.vehicle().getOn();
}
};

Game_Player.prototype.updateVehicleGetOff = function() {
if (!this.areFollowersGathering() && this.vehicle().isLowest()) {
this._vehicleGettingOff = false;
this._vehicleType = "walk";
this.setTransparent(false);
}
};

Game_Player.prototype.updateNonmoving = function(wasMoving, sceneActive) {


if (!$gameMap.isEventRunning()) {
if (wasMoving) {
$gameParty.onPlayerWalk();
this.checkEventTriggerHere([1, 2]);
if ($gameMap.setupStartingEvent()) {
return;
}
}
if (sceneActive && this.triggerAction()) {
return;
}
if (wasMoving) {
this.updateEncounterCount();
} else {
$gameTemp.clearDestination();
}
}
};

Game_Player.prototype.triggerAction = function() {
if (this.canMove()) {
if (this.triggerButtonAction()) {
return true;
}
if (this.triggerTouchAction()) {
return true;
}
}
return false;
};

Game_Player.prototype.triggerButtonAction = function() {
if (Input.isTriggered("ok")) {
if (this.getOnOffVehicle()) {
return true;
}
this.checkEventTriggerHere([0]);
if ($gameMap.setupStartingEvent()) {
return true;
}
this.checkEventTriggerThere([0, 1, 2]);
if ($gameMap.setupStartingEvent()) {
return true;
}
}
return false;
};
Game_Player.prototype.triggerTouchAction = function() {
if ($gameTemp.isDestinationValid()) {
const direction = this.direction();
const x1 = this.x;
const y1 = this.y;
const x2 = $gameMap.roundXWithDirection(x1, direction);
const y2 = $gameMap.roundYWithDirection(y1, direction);
const x3 = $gameMap.roundXWithDirection(x2, direction);
const y3 = $gameMap.roundYWithDirection(y2, direction);
const destX = $gameTemp.destinationX();
const destY = $gameTemp.destinationY();
if (destX === x1 && destY === y1) {
return this.triggerTouchActionD1(x1, y1);
} else if (destX === x2 && destY === y2) {
return this.triggerTouchActionD2(x2, y2);
} else if (destX === x3 && destY === y3) {
return this.triggerTouchActionD3(x2, y2);
}
}
return false;
};

Game_Player.prototype.triggerTouchActionD1 = function(x1, y1) {


if ($gameMap.airship().pos(x1, y1)) {
if (TouchInput.isTriggered() && this.getOnOffVehicle()) {
return true;
}
}
this.checkEventTriggerHere([0]);
return $gameMap.setupStartingEvent();
};

Game_Player.prototype.triggerTouchActionD2 = function(x2, y2) {


if ($gameMap.boat().pos(x2, y2) || $gameMap.ship().pos(x2, y2)) {
if (TouchInput.isTriggered() && this.getOnVehicle()) {
return true;
}
}
if (this.isInBoat() || this.isInShip()) {
if (TouchInput.isTriggered() && this.getOffVehicle()) {
return true;
}
}
this.checkEventTriggerThere([0, 1, 2]);
return $gameMap.setupStartingEvent();
};

Game_Player.prototype.triggerTouchActionD3 = function(x2, y2) {


if ($gameMap.isCounter(x2, y2)) {
this.checkEventTriggerThere([0, 1, 2]);
}
return $gameMap.setupStartingEvent();
};

Game_Player.prototype.updateEncounterCount = function() {
if (this.canEncounter()) {
this._encounterCount -= this.encounterProgressValue();
}
};
Game_Player.prototype.canEncounter = function() {
return (
!$gameParty.hasEncounterNone() &&
$gameSystem.isEncounterEnabled() &&
!this.isInAirship() &&
!this.isMoveRouteForcing() &&
!this.isDebugThrough()
);
};

Game_Player.prototype.encounterProgressValue = function() {
let value = $gameMap.isBush(this.x, this.y) ? 2 : 1;
if ($gameParty.hasEncounterHalf()) {
value *= 0.5;
}
if (this.isInShip()) {
value *= 0.5;
}
return value;
};

Game_Player.prototype.checkEventTriggerHere = function(triggers) {
if (this.canStartLocalEvents()) {
this.startMapEvent(this.x, this.y, triggers, false);
}
};

Game_Player.prototype.checkEventTriggerThere = function(triggers) {
if (this.canStartLocalEvents()) {
const direction = this.direction();
const x1 = this.x;
const y1 = this.y;
const x2 = $gameMap.roundXWithDirection(x1, direction);
const y2 = $gameMap.roundYWithDirection(y1, direction);
this.startMapEvent(x2, y2, triggers, true);
if (!$gameMap.isAnyEventStarting() && $gameMap.isCounter(x2, y2)) {
const x3 = $gameMap.roundXWithDirection(x2, direction);
const y3 = $gameMap.roundYWithDirection(y2, direction);
this.startMapEvent(x3, y3, triggers, true);
}
}
};

Game_Player.prototype.checkEventTriggerTouch = function(x, y) {
if (this.canStartLocalEvents()) {
this.startMapEvent(x, y, [1, 2], true);
}
};

Game_Player.prototype.canStartLocalEvents = function() {
return !this.isInAirship();
};

Game_Player.prototype.getOnOffVehicle = function() {
if (this.isInVehicle()) {
return this.getOffVehicle();
} else {
return this.getOnVehicle();
}
};

Game_Player.prototype.getOnVehicle = function() {
const direction = this.direction();
const x1 = this.x;
const y1 = this.y;
const x2 = $gameMap.roundXWithDirection(x1, direction);
const y2 = $gameMap.roundYWithDirection(y1, direction);
if ($gameMap.airship().pos(x1, y1)) {
this._vehicleType = "airship";
} else if ($gameMap.ship().pos(x2, y2)) {
this._vehicleType = "ship";
} else if ($gameMap.boat().pos(x2, y2)) {
this._vehicleType = "boat";
}
if (this.isInVehicle()) {
this._vehicleGettingOn = true;
if (!this.isInAirship()) {
this.forceMoveForward();
}
this.gatherFollowers();
}
return this._vehicleGettingOn;
};

Game_Player.prototype.getOffVehicle = function() {
if (this.vehicle().isLandOk(this.x, this.y, this.direction())) {
if (this.isInAirship()) {
this.setDirection(2);
}
this._followers.synchronize(this.x, this.y, this.direction());
this.vehicle().getOff();
if (!this.isInAirship()) {
this.forceMoveForward();
this.setTransparent(false);
}
this._vehicleGettingOff = true;
this.setMoveSpeed(4);
this.setThrough(false);
this.makeEncounterCount();
this.gatherFollowers();
}
return this._vehicleGettingOff;
};

Game_Player.prototype.forceMoveForward = function() {
this.setThrough(true);
this.moveForward();
this.setThrough(false);
};

Game_Player.prototype.isOnDamageFloor = function() {
return $gameMap.isDamageFloor(this.x, this.y) && !this.isInAirship();
};

Game_Player.prototype.moveStraight = function(d) {
if (this.canPass(this.x, this.y, d)) {
this._followers.updateMove();
}
Game_Character.prototype.moveStraight.call(this, d);
};

Game_Player.prototype.moveDiagonally = function(horz, vert) {


if (this.canPassDiagonally(this.x, this.y, horz, vert)) {
this._followers.updateMove();
}
Game_Character.prototype.moveDiagonally.call(this, horz, vert);
};

Game_Player.prototype.jump = function(xPlus, yPlus) {


Game_Character.prototype.jump.call(this, xPlus, yPlus);
this._followers.jumpAll();
};

Game_Player.prototype.showFollowers = function() {
this._followers.show();
};

Game_Player.prototype.hideFollowers = function() {
this._followers.hide();
};

Game_Player.prototype.gatherFollowers = function() {
this._followers.gather();
};

Game_Player.prototype.areFollowersGathering = function() {
return this._followers.areGathering();
};

Game_Player.prototype.areFollowersGathered = function() {
return this._followers.areGathered();
};

//-----------------------------------------------------------------------------
// Game_Follower
//
// The game object class for a follower. A follower is an allied character,
// other than the front character, displayed in the party.

function Game_Follower() {
this.initialize(...arguments);
}

Game_Follower.prototype = Object.create(Game_Character.prototype);
Game_Follower.prototype.constructor = Game_Follower;

Game_Follower.prototype.initialize = function(memberIndex) {
Game_Character.prototype.initialize.call(this);
this._memberIndex = memberIndex;
this.setTransparent($dataSystem.optTransparent);
this.setThrough(true);
};

Game_Follower.prototype.refresh = function() {
const characterName = this.isVisible() ? this.actor().characterName() : "";
const characterIndex = this.isVisible() ? this.actor().characterIndex() : 0;
this.setImage(characterName, characterIndex);
};

Game_Follower.prototype.actor = function() {
return $gameParty.battleMembers()[this._memberIndex];
};

Game_Follower.prototype.isVisible = function() {
return this.actor() && $gamePlayer.followers().isVisible();
};

Game_Follower.prototype.isGathered = function() {
return !this.isMoving() && this.pos($gamePlayer.x, $gamePlayer.y);
};

Game_Follower.prototype.update = function() {
Game_Character.prototype.update.call(this);
this.setMoveSpeed($gamePlayer.realMoveSpeed());
this.setOpacity($gamePlayer.opacity());
this.setBlendMode($gamePlayer.blendMode());
this.setWalkAnime($gamePlayer.hasWalkAnime());
this.setStepAnime($gamePlayer.hasStepAnime());
this.setDirectionFix($gamePlayer.isDirectionFixed());
this.setTransparent($gamePlayer.isTransparent());
};

Game_Follower.prototype.chaseCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (sx !== 0 && sy !== 0) {
this.moveDiagonally(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2);
} else if (sx !== 0) {
this.moveStraight(sx > 0 ? 4 : 6);
} else if (sy !== 0) {
this.moveStraight(sy > 0 ? 8 : 2);
}
this.setMoveSpeed($gamePlayer.realMoveSpeed());
};

//-----------------------------------------------------------------------------
// Game_Followers
//
// The wrapper class for a follower array.

function Game_Followers() {
this.initialize(...arguments);
}

Game_Followers.prototype.initialize = function() {
this._visible = $dataSystem.optFollowers;
this._gathering = false;
this._data = [];
this.setup();
};

Game_Followers.prototype.setup = function() {
this._data = [];
for (let i = 1; i < $gameParty.maxBattleMembers(); i++) {
this._data.push(new Game_Follower(i));
}
};

Game_Followers.prototype.isVisible = function() {
return this._visible;
};

Game_Followers.prototype.show = function() {
this._visible = true;
};

Game_Followers.prototype.hide = function() {
this._visible = false;
};

Game_Followers.prototype.data = function() {
return this._data.clone();
};

Game_Followers.prototype.reverseData = function() {
return this._data.clone().reverse();
};

Game_Followers.prototype.follower = function(index) {
return this._data[index];
};

Game_Followers.prototype.refresh = function() {
for (const follower of this._data) {
follower.refresh();
}
};

Game_Followers.prototype.update = function() {
if (this.areGathering()) {
if (!this.areMoving()) {
this.updateMove();
}
if (this.areGathered()) {
this._gathering = false;
}
}
for (const follower of this._data) {
follower.update();
}
};

Game_Followers.prototype.updateMove = function() {
for (let i = this._data.length - 1; i >= 0; i--) {
const precedingCharacter = i > 0 ? this._data[i - 1] : $gamePlayer;
this._data[i].chaseCharacter(precedingCharacter);
}
};

Game_Followers.prototype.jumpAll = function() {
if ($gamePlayer.isJumping()) {
for (const follower of this._data) {
const sx = $gamePlayer.deltaXFrom(follower.x);
const sy = $gamePlayer.deltaYFrom(follower.y);
follower.jump(sx, sy);
}
}
};

Game_Followers.prototype.synchronize = function(x, y, d) {
for (const follower of this._data) {
follower.locate(x, y);
follower.setDirection(d);
}
};

Game_Followers.prototype.gather = function() {
this._gathering = true;
};

Game_Followers.prototype.areGathering = function() {
return this._gathering;
};

Game_Followers.prototype.visibleFollowers = function() {
return this._data.filter(follower => follower.isVisible());
};

Game_Followers.prototype.areMoving = function() {
return this.visibleFollowers().some(follower => follower.isMoving());
};

Game_Followers.prototype.areGathered = function() {
return this.visibleFollowers().every(follower => follower.isGathered());
};

Game_Followers.prototype.isSomeoneCollided = function(x, y) {
return this.visibleFollowers().some(follower => follower.pos(x, y));
};

//-----------------------------------------------------------------------------
// Game_Vehicle
//
// The game object class for a vehicle.

function Game_Vehicle() {
this.initialize(...arguments);
}

Game_Vehicle.prototype = Object.create(Game_Character.prototype);
Game_Vehicle.prototype.constructor = Game_Vehicle;

Game_Vehicle.prototype.initialize = function(type) {
Game_Character.prototype.initialize.call(this);
this._type = type;
this.resetDirection();
this.initMoveSpeed();
this.loadSystemSettings();
};

Game_Vehicle.prototype.initMembers = function() {
Game_Character.prototype.initMembers.call(this);
this._type = "";
this._mapId = 0;
this._altitude = 0;
this._driving = false;
this._bgm = null;
};

Game_Vehicle.prototype.isBoat = function() {
return this._type === "boat";
};

Game_Vehicle.prototype.isShip = function() {
return this._type === "ship";
};

Game_Vehicle.prototype.isAirship = function() {
return this._type === "airship";
};

Game_Vehicle.prototype.resetDirection = function() {
this.setDirection(4);
};

Game_Vehicle.prototype.initMoveSpeed = function() {
if (this.isBoat()) {
this.setMoveSpeed(4);
} else if (this.isShip()) {
this.setMoveSpeed(5);
} else if (this.isAirship()) {
this.setMoveSpeed(6);
}
};

Game_Vehicle.prototype.vehicle = function() {
if (this.isBoat()) {
return $dataSystem.boat;
} else if (this.isShip()) {
return $dataSystem.ship;
} else if (this.isAirship()) {
return $dataSystem.airship;
} else {
return null;
}
};

Game_Vehicle.prototype.loadSystemSettings = function() {
const vehicle = this.vehicle();
this._mapId = vehicle.startMapId;
this.setPosition(vehicle.startX, vehicle.startY);
this.setImage(vehicle.characterName, vehicle.characterIndex);
};

Game_Vehicle.prototype.refresh = function() {
if (this._driving) {
this._mapId = $gameMap.mapId();
this.syncWithPlayer();
} else if (this._mapId === $gameMap.mapId()) {
this.locate(this.x, this.y);
}
if (this.isAirship()) {
this.setPriorityType(this._driving ? 2 : 0);
} else {
this.setPriorityType(1);
}
this.setWalkAnime(this._driving);
this.setStepAnime(this._driving);
this.setTransparent(this._mapId !== $gameMap.mapId());
};

Game_Vehicle.prototype.setLocation = function(mapId, x, y) {
this._mapId = mapId;
this.setPosition(x, y);
this.refresh();
};

Game_Vehicle.prototype.pos = function(x, y) {
if (this._mapId === $gameMap.mapId()) {
return Game_Character.prototype.pos.call(this, x, y);
} else {
return false;
}
};

Game_Vehicle.prototype.isMapPassable = function(x, y, d) {
const x2 = $gameMap.roundXWithDirection(x, d);
const y2 = $gameMap.roundYWithDirection(y, d);
if (this.isBoat()) {
return $gameMap.isBoatPassable(x2, y2);
} else if (this.isShip()) {
return $gameMap.isShipPassable(x2, y2);
} else if (this.isAirship()) {
return true;
} else {
return false;
}
};

Game_Vehicle.prototype.getOn = function() {
this._driving = true;
this.setWalkAnime(true);
this.setStepAnime(true);
$gameSystem.saveWalkingBgm();
this.playBgm();
};

Game_Vehicle.prototype.getOff = function() {
this._driving = false;
this.setWalkAnime(false);
this.setStepAnime(false);
this.resetDirection();
$gameSystem.replayWalkingBgm();
};

Game_Vehicle.prototype.setBgm = function(bgm) {
this._bgm = bgm;
};

Game_Vehicle.prototype.playBgm = function() {
AudioManager.playBgm(this._bgm || this.vehicle().bgm);
};

Game_Vehicle.prototype.syncWithPlayer = function() {
this.copyPosition($gamePlayer);
this.refreshBushDepth();
};

Game_Vehicle.prototype.screenY = function() {
return Game_Character.prototype.screenY.call(this) - this._altitude;
};

Game_Vehicle.prototype.shadowX = function() {
return this.screenX();
};

Game_Vehicle.prototype.shadowY = function() {
return this.screenY() + this._altitude;
};

Game_Vehicle.prototype.shadowOpacity = function() {
return (255 * this._altitude) / this.maxAltitude();
};

Game_Vehicle.prototype.canMove = function() {
if (this.isAirship()) {
return this.isHighest();
} else {
return true;
}
};

Game_Vehicle.prototype.update = function() {
Game_Character.prototype.update.call(this);
if (this.isAirship()) {
this.updateAirship();
}
};

Game_Vehicle.prototype.updateAirship = function() {
this.updateAirshipAltitude();
this.setStepAnime(this.isHighest());
this.setPriorityType(this.isLowest() ? 0 : 2);
};

Game_Vehicle.prototype.updateAirshipAltitude = function() {
if (this._driving && !this.isHighest()) {
this._altitude++;
}
if (!this._driving && !this.isLowest()) {
this._altitude--;
}
};

Game_Vehicle.prototype.maxAltitude = function() {
return 48;
};

Game_Vehicle.prototype.isLowest = function() {
return this._altitude <= 0;
};

Game_Vehicle.prototype.isHighest = function() {
return this._altitude >= this.maxAltitude();
};

Game_Vehicle.prototype.isTakeoffOk = function() {
return $gamePlayer.areFollowersGathered();
};

Game_Vehicle.prototype.isLandOk = function(x, y, d) {
if (this.isAirship()) {
if (!$gameMap.isAirshipLandOk(x, y)) {
return false;
}
if ($gameMap.eventsXy(x, y).length > 0) {
return false;
}
} else {
const x2 = $gameMap.roundXWithDirection(x, d);
const y2 = $gameMap.roundYWithDirection(y, d);
if (!$gameMap.isValid(x2, y2)) {
return false;
}
if (!$gameMap.isPassable(x2, y2, this.reverseDir(d))) {
return false;
}
if (this.isCollidedWithCharacters(x2, y2)) {
return false;
}
}
return true;
};

//-----------------------------------------------------------------------------
// Game_Event
//
// The game object class for an event. It contains functionality for event page
// switching and running parallel process events.

function Game_Event() {
this.initialize(...arguments);
}

Game_Event.prototype = Object.create(Game_Character.prototype);
Game_Event.prototype.constructor = Game_Event;

Game_Event.prototype.initialize = function(mapId, eventId) {


Game_Character.prototype.initialize.call(this);
this._mapId = mapId;
this._eventId = eventId;
this.locate(this.event().x, this.event().y);
this.refresh();
};

Game_Event.prototype.initMembers = function() {
Game_Character.prototype.initMembers.call(this);
this._moveType = 0;
this._trigger = 0;
this._starting = false;
this._erased = false;
this._pageIndex = -2;
this._originalPattern = 1;
this._originalDirection = 2;
this._prelockDirection = 0;
this._locked = false;
};

Game_Event.prototype.eventId = function() {
return this._eventId;
};

Game_Event.prototype.event = function() {
return $dataMap.events[this._eventId];
};

Game_Event.prototype.page = function() {
return this.event().pages[this._pageIndex];
};

Game_Event.prototype.list = function() {
return this.page().list;
};

Game_Event.prototype.isCollidedWithCharacters = function(x, y) {
return (
Game_Character.prototype.isCollidedWithCharacters.call(this, x, y) ||
this.isCollidedWithPlayerCharacters(x, y)
);
};

Game_Event.prototype.isCollidedWithEvents = function(x, y) {
const events = $gameMap.eventsXyNt(x, y);
return events.length > 0;
};

Game_Event.prototype.isCollidedWithPlayerCharacters = function(x, y) {
return this.isNormalPriority() && $gamePlayer.isCollided(x, y);
};

Game_Event.prototype.lock = function() {
if (!this._locked) {
this._prelockDirection = this.direction();
this.turnTowardPlayer();
this._locked = true;
}
};

Game_Event.prototype.unlock = function() {
if (this._locked) {
this._locked = false;
this.setDirection(this._prelockDirection);
}
};

Game_Event.prototype.updateStop = function() {
if (this._locked) {
this.resetStopCount();
}
Game_Character.prototype.updateStop.call(this);
if (!this.isMoveRouteForcing()) {
this.updateSelfMovement();
}
};

Game_Event.prototype.updateSelfMovement = function() {
if (
!this._locked &&
this.isNearTheScreen() &&
this.checkStop(this.stopCountThreshold())
) {
switch (this._moveType) {
case 1:
this.moveTypeRandom();
break;
case 2:
this.moveTypeTowardPlayer();
break;
case 3:
this.moveTypeCustom();
break;
}
}
};

Game_Event.prototype.stopCountThreshold = function() {
return 30 * (5 - this.moveFrequency());
};

Game_Event.prototype.moveTypeRandom = function() {
switch (Math.randomInt(6)) {
case 0:
case 1:
this.moveRandom();
break;
case 2:
case 3:
case 4:
this.moveForward();
break;
case 5:
this.resetStopCount();
break;
}
};

Game_Event.prototype.moveTypeTowardPlayer = function() {
if (this.isNearThePlayer()) {
switch (Math.randomInt(6)) {
case 0:
case 1:
case 2:
case 3:
this.moveTowardPlayer();
break;
case 4:
this.moveRandom();
break;
case 5:
this.moveForward();
break;
}
} else {
this.moveRandom();
}
};

Game_Event.prototype.isNearThePlayer = function() {
const sx = Math.abs(this.deltaXFrom($gamePlayer.x));
const sy = Math.abs(this.deltaYFrom($gamePlayer.y));
return sx + sy < 20;
};

Game_Event.prototype.moveTypeCustom = function() {
this.updateRoutineMove();
};

Game_Event.prototype.isStarting = function() {
return this._starting;
};

Game_Event.prototype.clearStartingFlag = function() {
this._starting = false;
};

Game_Event.prototype.isTriggerIn = function(triggers) {
return triggers.includes(this._trigger);
};

Game_Event.prototype.start = function() {
const list = this.list();
if (list && list.length > 1) {
this._starting = true;
if (this.isTriggerIn([0, 1, 2])) {
this.lock();
}
}
};

Game_Event.prototype.erase = function() {
this._erased = true;
this.refresh();
};

Game_Event.prototype.refresh = function() {
const newPageIndex = this._erased ? -1 : this.findProperPageIndex();
if (this._pageIndex !== newPageIndex) {
this._pageIndex = newPageIndex;
this.setupPage();
}
};

Game_Event.prototype.findProperPageIndex = function() {
const pages = this.event().pages;
for (let i = pages.length - 1; i >= 0; i--) {
const page = pages[i];
if (this.meetsConditions(page)) {
return i;
}
}
return -1;
};

Game_Event.prototype.meetsConditions = function(page) {
const c = page.conditions;
if (c.switch1Valid) {
if (!$gameSwitches.value(c.switch1Id)) {
return false;
}
}
if (c.switch2Valid) {
if (!$gameSwitches.value(c.switch2Id)) {
return false;
}
}
if (c.variableValid) {
if ($gameVariables.value(c.variableId) < c.variableValue) {
return false;
}
}
if (c.selfSwitchValid) {
const key = [this._mapId, this._eventId, c.selfSwitchCh];
if ($gameSelfSwitches.value(key) !== true) {
return false;
}
}
if (c.itemValid) {
const item = $dataItems[c.itemId];
if (!$gameParty.hasItem(item)) {
return false;
}
}
if (c.actorValid) {
const actor = $gameActors.actor(c.actorId);
if (!$gameParty.members().includes(actor)) {
return false;
}
}
return true;
};

Game_Event.prototype.setupPage = function() {
if (this._pageIndex >= 0) {
this.setupPageSettings();
} else {
this.clearPageSettings();
}
this.refreshBushDepth();
this.clearStartingFlag();
this.checkEventTriggerAuto();
};

Game_Event.prototype.clearPageSettings = function() {
this.setImage("", 0);
this._moveType = 0;
this._trigger = null;
this._interpreter = null;
this.setThrough(true);
};

Game_Event.prototype.setupPageSettings = function() {
const page = this.page();
const image = page.image;
if (image.tileId > 0) {
this.setTileImage(image.tileId);
} else {
this.setImage(image.characterName, image.characterIndex);
}
if (this._originalDirection !== image.direction) {
this._originalDirection = image.direction;
this._prelockDirection = 0;
this.setDirectionFix(false);
this.setDirection(image.direction);
}
if (this._originalPattern !== image.pattern) {
this._originalPattern = image.pattern;
this.setPattern(image.pattern);
}
this.setMoveSpeed(page.moveSpeed);
this.setMoveFrequency(page.moveFrequency);
this.setPriorityType(page.priorityType);
this.setWalkAnime(page.walkAnime);
this.setStepAnime(page.stepAnime);
this.setDirectionFix(page.directionFix);
this.setThrough(page.through);
this.setMoveRoute(page.moveRoute);
this._moveType = page.moveType;
this._trigger = page.trigger;
if (this._trigger === 4) {
this._interpreter = new Game_Interpreter();
} else {
this._interpreter = null;
}
};

Game_Event.prototype.isOriginalPattern = function() {
return this.pattern() === this._originalPattern;
};

Game_Event.prototype.resetPattern = function() {
this.setPattern(this._originalPattern);
};

Game_Event.prototype.checkEventTriggerTouch = function(x, y) {
if (!$gameMap.isEventRunning()) {
if (this._trigger === 2 && $gamePlayer.pos(x, y)) {
if (!this.isJumping() && this.isNormalPriority()) {
this.start();
}
}
}
};

Game_Event.prototype.checkEventTriggerAuto = function() {
if (this._trigger === 3) {
this.start();
}
};

Game_Event.prototype.update = function() {
Game_Character.prototype.update.call(this);
this.checkEventTriggerAuto();
this.updateParallel();
};

Game_Event.prototype.updateParallel = function() {
if (this._interpreter) {
if (!this._interpreter.isRunning()) {
this._interpreter.setup(this.list(), this._eventId);
}
this._interpreter.update();
}
};

Game_Event.prototype.locate = function(x, y) {
Game_Character.prototype.locate.call(this, x, y);
this._prelockDirection = 0;
};

Game_Event.prototype.forceMoveRoute = function(moveRoute) {
Game_Character.prototype.forceMoveRoute.call(this, moveRoute);
this._prelockDirection = 0;
};

//-----------------------------------------------------------------------------
// Game_Interpreter
//
// The interpreter for running event commands.

function Game_Interpreter() {
this.initialize(...arguments);
}

Game_Interpreter.prototype.initialize = function(depth) {
this._depth = depth || 0;
this.checkOverflow();
this.clear();
this._branch = {};
this._indent = 0;
this._frameCount = 0;
this._freezeChecker = 0;
};

Game_Interpreter.prototype.checkOverflow = function() {
if (this._depth >= 100) {
throw new Error("Common event calls exceeded the limit");
}
};

Game_Interpreter.prototype.clear = function() {
this._mapId = 0;
this._eventId = 0;
this._list = null;
this._index = 0;
this._waitCount = 0;
this._waitMode = "";
this._comments = "";
this._characterId = 0;
this._childInterpreter = null;
};

Game_Interpreter.prototype.setup = function(list, eventId) {


this.clear();
this._mapId = $gameMap.mapId();
this._eventId = eventId || 0;
this._list = list;
this.loadImages();
};

Game_Interpreter.prototype.loadImages = function() {
// [Note] The certain versions of MV had a more complicated preload scheme.
// However it is usually sufficient to preload face and picture images.
const list = this._list.slice(0, 200);
for (const command of list) {
switch (command.code) {
case 101: // Show Text
ImageManager.loadFace(command.parameters[0]);
break;
case 231: // Show Picture
ImageManager.loadPicture(command.parameters[1]);
break;
}
}
};

Game_Interpreter.prototype.eventId = function() {
return this._eventId;
};

Game_Interpreter.prototype.isOnCurrentMap = function() {
return this._mapId === $gameMap.mapId();
};

Game_Interpreter.prototype.setupReservedCommonEvent = function() {
if ($gameTemp.isCommonEventReserved()) {
const commonEvent = $gameTemp.retrieveCommonEvent();
if (commonEvent) {
this.setup(commonEvent.list);
return true;
}
}
return false;
};

Game_Interpreter.prototype.isRunning = function() {
return !!this._list;
};

Game_Interpreter.prototype.update = function() {
while (this.isRunning()) {
if (this.updateChild() || this.updateWait()) {
break;
}
if (SceneManager.isSceneChanging()) {
break;
}
if (!this.executeCommand()) {
break;
}
if (this.checkFreeze()) {
break;
}
}
};

Game_Interpreter.prototype.updateChild = function() {
if (this._childInterpreter) {
this._childInterpreter.update();
if (this._childInterpreter.isRunning()) {
return true;
} else {
this._childInterpreter = null;
}
}
return false;
};

Game_Interpreter.prototype.updateWait = function() {
return this.updateWaitCount() || this.updateWaitMode();
};

Game_Interpreter.prototype.updateWaitCount = function() {
if (this._waitCount > 0) {
this._waitCount--;
return true;
}
return false;
};

Game_Interpreter.prototype.updateWaitMode = function() {
let character = null;
let waiting = false;
switch (this._waitMode) {
case "message":
waiting = $gameMessage.isBusy();
break;
case "transfer":
waiting = $gamePlayer.isTransferring();
break;
case "scroll":
waiting = $gameMap.isScrolling();
break;
case "route":
character = this.character(this._characterId);
waiting = character && character.isMoveRouteForcing();
break;
case "animation":
character = this.character(this._characterId);
waiting = character && character.isAnimationPlaying();
break;
case "balloon":
character = this.character(this._characterId);
waiting = character && character.isBalloonPlaying();
break;
case "gather":
waiting = $gamePlayer.areFollowersGathering();
break;
case "action":
waiting = BattleManager.isActionForced();
break;
case "video":
waiting = Video.isPlaying();
break;
case "image":
waiting = !ImageManager.isReady();
break;
}
if (!waiting) {
this._waitMode = "";
}
return waiting;
};

Game_Interpreter.prototype.setWaitMode = function(waitMode) {
this._waitMode = waitMode;
};

Game_Interpreter.prototype.wait = function(duration) {
this._waitCount = duration;
};

Game_Interpreter.prototype.fadeSpeed = function() {
return 24;
};

Game_Interpreter.prototype.executeCommand = function() {
const command = this.currentCommand();
if (command) {
this._indent = command.indent;
const methodName = "command" + command.code;
if (typeof this[methodName] === "function") {
if (!this[methodName](command.parameters)) {
return false;
}
}
this._index++;
} else {
this.terminate();
}
return true;
};

Game_Interpreter.prototype.checkFreeze = function() {
if (this._frameCount !== Graphics.frameCount) {
this._frameCount = Graphics.frameCount;
this._freezeChecker = 0;
}
if (this._freezeChecker++ >= 100000) {
return true;
} else {
return false;
}
};

Game_Interpreter.prototype.terminate = function() {
this._list = null;
this._comments = "";
};

Game_Interpreter.prototype.skipBranch = function() {
while (this._list[this._index + 1].indent > this._indent) {
this._index++;
}
};

Game_Interpreter.prototype.currentCommand = function() {
return this._list[this._index];
};

Game_Interpreter.prototype.nextEventCode = function() {
const command = this._list[this._index + 1];
if (command) {
return command.code;
} else {
return 0;
}
};

Game_Interpreter.prototype.iterateActorId = function(param, callback) {


if (param === 0) {
$gameParty.members().forEach(callback);
} else {
const actor = $gameActors.actor(param);
if (actor) {
callback(actor);
}
}
};

Game_Interpreter.prototype.iterateActorEx = function(param1, param2, callback) {


if (param1 === 0) {
this.iterateActorId(param2, callback);
} else {
this.iterateActorId($gameVariables.value(param2), callback);
}
};

Game_Interpreter.prototype.iterateActorIndex = function(param, callback) {


if (param < 0) {
$gameParty.members().forEach(callback);
} else {
const actor = $gameParty.members()[param];
if (actor) {
callback(actor);
}
}
};

Game_Interpreter.prototype.iterateEnemyIndex = function(param, callback) {


if (param < 0) {
$gameTroop.members().forEach(callback);
} else {
const enemy = $gameTroop.members()[param];
if (enemy) {
callback(enemy);
}
}
};

Game_Interpreter.prototype.iterateBattler = function(param1, param2, callback) {


if ($gameParty.inBattle()) {
if (param1 === 0) {
this.iterateEnemyIndex(param2, callback);
} else {
this.iterateActorId(param2, callback);
}
}
};

Game_Interpreter.prototype.character = function(param) {
if ($gameParty.inBattle()) {
return null;
} else if (param < 0) {
return $gamePlayer;
} else if (this.isOnCurrentMap()) {
return $gameMap.event(param > 0 ? param : this._eventId);
} else {
return null;
}
};

// prettier-ignore
Game_Interpreter.prototype.operateValue = function(
operation, operandType, operand
) {
const value = operandType === 0 ? operand : $gameVariables.value(operand);
return operation === 0 ? value : -value;
};

Game_Interpreter.prototype.changeHp = function(target, value, allowDeath) {


if (target.isAlive()) {
if (!allowDeath && target.hp <= -value) {
value = 1 - target.hp;
}
target.gainHp(value);
if (target.isDead()) {
target.performCollapse();
}
}
};

// Show Text
Game_Interpreter.prototype.command101 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
$gameMessage.setFaceImage(params[0], params[1]);
$gameMessage.setBackground(params[2]);
$gameMessage.setPositionType(params[3]);
$gameMessage.setSpeakerName(params[4]);
while (this.nextEventCode() === 401) {
// Text data
this._index++;
$gameMessage.add(this.currentCommand().parameters[0]);
}
switch (this.nextEventCode()) {
case 102: // Show Choices
this._index++;
this.setupChoices(this.currentCommand().parameters);
break;
case 103: // Input Number
this._index++;
this.setupNumInput(this.currentCommand().parameters);
break;
case 104: // Select Item
this._index++;
this.setupItemChoice(this.currentCommand().parameters);
break;
}
this.setWaitMode("message");
return true;
};

// Show Choices
Game_Interpreter.prototype.command102 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
this.setupChoices(params);
this.setWaitMode("message");
return true;
};

Game_Interpreter.prototype.setupChoices = function(params) {
const choices = params[0].clone();
const cancelType = params[1] < choices.length ? params[1] : -2;
const defaultType = params.length > 2 ? params[2] : 0;
const positionType = params.length > 3 ? params[3] : 2;
const background = params.length > 4 ? params[4] : 0;
$gameMessage.setChoices(choices, defaultType, cancelType);
$gameMessage.setChoiceBackground(background);
$gameMessage.setChoicePositionType(positionType);
$gameMessage.setChoiceCallback(n => {
this._branch[this._indent] = n;
});
};

// When [**]
Game_Interpreter.prototype.command402 = function(params) {
if (this._branch[this._indent] !== params[0]) {
this.skipBranch();
}
return true;
};

// When Cancel
Game_Interpreter.prototype.command403 = function() {
if (this._branch[this._indent] >= 0) {
this.skipBranch();
}
return true;
};

// Input Number
Game_Interpreter.prototype.command103 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
this.setupNumInput(params);
this.setWaitMode("message");
return true;
};

Game_Interpreter.prototype.setupNumInput = function(params) {
$gameMessage.setNumberInput(params[0], params[1]);
};

// Select Item
Game_Interpreter.prototype.command104 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
this.setupItemChoice(params);
this.setWaitMode("message");
return true;
};

Game_Interpreter.prototype.setupItemChoice = function(params) {
$gameMessage.setItemChoice(params[0], params[1] || 2);
};

// Show Scrolling Text


Game_Interpreter.prototype.command105 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
$gameMessage.setScroll(params[0], params[1]);
while (this.nextEventCode() === 405) {
this._index++;
$gameMessage.add(this.currentCommand().parameters[0]);
}
this.setWaitMode("message");
return true;
};

// Comment
Game_Interpreter.prototype.command108 = function(params) {
this._comments = [params[0]];
while (this.nextEventCode() === 408) {
this._index++;
this._comments.push(this.currentCommand().parameters[0]);
}
return true;
};

// Skip
Game_Interpreter.prototype.command109 = function() {
this.skipBranch();
return true;
};

// Conditional Branch
Game_Interpreter.prototype.command111 = function(params) {
let result = false;
let value1, value2;
let actor, enemy, character;
switch (params[0]) {
case 0: // Switch
result = $gameSwitches.value(params[1]) === (params[2] === 0);
break;
case 1: // Variable
value1 = $gameVariables.value(params[1]);
if (params[2] === 0) {
value2 = params[3];
} else {
value2 = $gameVariables.value(params[3]);
}
switch (params[4]) {
case 0: // Equal to
result = value1 === value2;
break;
case 1: // Greater than or Equal to
result = value1 >= value2;
break;
case 2: // Less than or Equal to
result = value1 <= value2;
break;
case 3: // Greater than
result = value1 > value2;
break;
case 4: // Less than
result = value1 < value2;
break;
case 5: // Not Equal to
result = value1 !== value2;
break;
}
break;
case 2: // Self Switch
if (this._eventId > 0) {
const key = [this._mapId, this._eventId, params[1]];
result = $gameSelfSwitches.value(key) === (params[2] === 0);
}
break;
case 3: // Timer
if ($gameTimer.isWorking()) {
const sec = $gameTimer.frames() / 60;
if (params[2] === 0) {
result = sec >= params[1];
} else {
result = sec <= params[1];
}
}
break;
case 4: // Actor
actor = $gameActors.actor(params[1]);
if (actor) {
const n = params[3];
switch (params[2]) {
case 0: // In the Party
result = $gameParty.members().includes(actor);
break;
case 1: // Name
result = actor.name() === n;
break;
case 2: // Class
result = actor.isClass($dataClasses[n]);
break;
case 3: // Skill
result = actor.hasSkill(n);
break;
case 4: // Weapon
result = actor.hasWeapon($dataWeapons[n]);
break;
case 5: // Armor
result = actor.hasArmor($dataArmors[n]);
break;
case 6: // State
result = actor.isStateAffected(n);
break;
}
}
break;
case 5: // Enemy
enemy = $gameTroop.members()[params[1]];
if (enemy) {
switch (params[2]) {
case 0: // Appeared
result = enemy.isAlive();
break;
case 1: // State
result = enemy.isStateAffected(params[3]);
break;
}
}
break;
case 6: // Character
character = this.character(params[1]);
if (character) {
result = character.direction() === params[2];
}
break;
case 7: // Gold
switch (params[2]) {
case 0: // Greater than or equal to
result = $gameParty.gold() >= params[1];
break;
case 1: // Less than or equal to
result = $gameParty.gold() <= params[1];
break;
case 2: // Less than
result = $gameParty.gold() < params[1];
break;
}
break;
case 8: // Item
result = $gameParty.hasItem($dataItems[params[1]]);
break;
case 9: // Weapon
result = $gameParty.hasItem($dataWeapons[params[1]], params[2]);
break;
case 10: // Armor
result = $gameParty.hasItem($dataArmors[params[1]], params[2]);
break;
case 11: // Button
switch (params[2] || 0) {
case 0:
result = Input.isPressed(params[1]);
break;
case 1:
result = Input.isTriggered(params[1]);
break;
case 2:
result = Input.isRepeated(params[1]);
break;
}
break;
case 12: // Script
result = !!eval(params[1]);
break;
case 13: // Vehicle
result = $gamePlayer.vehicle() === $gameMap.vehicle(params[1]);
break;
}
this._branch[this._indent] = result;
if (this._branch[this._indent] === false) {
this.skipBranch();
}
return true;
};

// Else
Game_Interpreter.prototype.command411 = function() {
if (this._branch[this._indent] !== false) {
this.skipBranch();
}
return true;
};

// Loop
Game_Interpreter.prototype.command112 = function() {
return true;
};

// Repeat Above
Game_Interpreter.prototype.command413 = function() {
do {
this._index--;
} while (this.currentCommand().indent !== this._indent);
return true;
};

// Break Loop
Game_Interpreter.prototype.command113 = function() {
let depth = 0;
while (this._index < this._list.length - 1) {
this._index++;
const command = this.currentCommand();
if (command.code === 112) {
depth++;
}
if (command.code === 413) {
if (depth > 0) {
depth--;
} else {
break;
}
}
}
return true;
};

// Exit Event Processing


Game_Interpreter.prototype.command115 = function() {
this._index = this._list.length;
return true;
};

// Common Event
Game_Interpreter.prototype.command117 = function(params) {
const commonEvent = $dataCommonEvents[params[0]];
if (commonEvent) {
const eventId = this.isOnCurrentMap() ? this._eventId : 0;
this.setupChild(commonEvent.list, eventId);
}
return true;
};

Game_Interpreter.prototype.setupChild = function(list, eventId) {


this._childInterpreter = new Game_Interpreter(this._depth + 1);
this._childInterpreter.setup(list, eventId);
};

// Label
Game_Interpreter.prototype.command118 = function() {
return true;
};

// Jump to Label
Game_Interpreter.prototype.command119 = function(params) {
const labelName = params[0];
for (let i = 0; i < this._list.length; i++) {
const command = this._list[i];
if (command.code === 118 && command.parameters[0] === labelName) {
this.jumpTo(i);
break;
}
}
return true;
};

Game_Interpreter.prototype.jumpTo = function(index) {
const lastIndex = this._index;
const startIndex = Math.min(index, lastIndex);
const endIndex = Math.max(index, lastIndex);
let indent = this._indent;
for (let i = startIndex; i <= endIndex; i++) {
const newIndent = this._list[i].indent;
if (newIndent !== indent) {
this._branch[indent] = null;
indent = newIndent;
}
}
this._index = index;
};

// Control Switches
Game_Interpreter.prototype.command121 = function(params) {
for (let i = params[0]; i <= params[1]; i++) {
$gameSwitches.setValue(i, params[2] === 0);
}
return true;
};

// Control Variables
Game_Interpreter.prototype.command122 = function(params) {
const startId = params[0];
const endId = params[1];
const operationType = params[2];
const operand = params[3];
let value = 0;
let randomMax = 1;
switch (operand) {
case 0: // Constant
value = params[4];
break;
case 1: // Variable
value = $gameVariables.value(params[4]);
break;
case 2: // Random
value = params[4];
randomMax = params[5] - params[4] + 1;
randomMax = Math.max(randomMax, 1);
break;
case 3: // Game Data
value = this.gameDataOperand(params[4], params[5], params[6]);
break;
case 4: // Script
value = eval(params[4]);
break;
}
for (let i = startId; i <= endId; i++) {
if (typeof value === "number") {
const realValue = value + Math.randomInt(randomMax);
this.operateVariable(i, operationType, realValue);
} else {
this.operateVariable(i, operationType, value);
}
}
return true;
};
Game_Interpreter.prototype.gameDataOperand = function(type, param1, param2) {
let actor, enemy, character;
switch (type) {
case 0: // Item
return $gameParty.numItems($dataItems[param1]);
case 1: // Weapon
return $gameParty.numItems($dataWeapons[param1]);
case 2: // Armor
return $gameParty.numItems($dataArmors[param1]);
case 3: // Actor
actor = $gameActors.actor(param1);
if (actor) {
switch (param2) {
case 0: // Level
return actor.level;
case 1: // EXP
return actor.currentExp();
case 2: // HP
return actor.hp;
case 3: // MP
return actor.mp;
case 12: // TP
return actor.tp;
default:
// Parameter
if (param2 >= 4 && param2 <= 11) {
return actor.param(param2 - 4);
}
}
}
break;
case 4: // Enemy
enemy = $gameTroop.members()[param1];
if (enemy) {
switch (param2) {
case 0: // HP
return enemy.hp;
case 1: // MP
return enemy.mp;
case 10: // TP
return enemy.tp;
default:
// Parameter
if (param2 >= 2 && param2 <= 9) {
return enemy.param(param2 - 2);
}
}
}
break;
case 5: // Character
character = this.character(param1);
if (character) {
switch (param2) {
case 0: // Map X
return character.x;
case 1: // Map Y
return character.y;
case 2: // Direction
return character.direction();
case 3: // Screen X
return character.screenX();
case 4: // Screen Y
return character.screenY();
}
}
break;
case 6: // Party
actor = $gameParty.members()[param1];
return actor ? actor.actorId() : 0;
case 8: // Last
return $gameTemp.lastActionData(param1);
case 7: // Other
switch (param1) {
case 0: // Map ID
return $gameMap.mapId();
case 1: // Party Members
return $gameParty.size();
case 2: // Gold
return $gameParty.gold();
case 3: // Steps
return $gameParty.steps();
case 4: // Play Time
return $gameSystem.playtime();
case 5: // Timer
return $gameTimer.seconds();
case 6: // Save Count
return $gameSystem.saveCount();
case 7: // Battle Count
return $gameSystem.battleCount();
case 8: // Win Count
return $gameSystem.winCount();
case 9: // Escape Count
return $gameSystem.escapeCount();
}
break;
}
return 0;
};

Game_Interpreter.prototype.operateVariable = function(
variableId,
operationType,
value
) {
try {
const oldValue = $gameVariables.value(variableId);
switch (operationType) {
case 0: // Set
$gameVariables.setValue(variableId, value);
break;
case 1: // Add
$gameVariables.setValue(variableId, oldValue + value);
break;
case 2: // Sub
$gameVariables.setValue(variableId, oldValue - value);
break;
case 3: // Mul
$gameVariables.setValue(variableId, oldValue * value);
break;
case 4: // Div
$gameVariables.setValue(variableId, oldValue / value);
break;
case 5: // Mod
$gameVariables.setValue(variableId, oldValue % value);
break;
}
} catch (e) {
$gameVariables.setValue(variableId, 0);
}
};

// Control Self Switch


Game_Interpreter.prototype.command123 = function(params) {
if (this._eventId > 0) {
const key = [this._mapId, this._eventId, params[0]];
$gameSelfSwitches.setValue(key, params[1] === 0);
}
return true;
};

// Control Timer
Game_Interpreter.prototype.command124 = function(params) {
if (params[0] === 0) {
// Start
$gameTimer.start(params[1] * 60);
} else {
// Stop
$gameTimer.stop();
}
return true;
};

// Change Gold
Game_Interpreter.prototype.command125 = function(params) {
const value = this.operateValue(params[0], params[1], params[2]);
$gameParty.gainGold(value);
return true;
};

// Change Items
Game_Interpreter.prototype.command126 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
$gameParty.gainItem($dataItems[params[0]], value);
return true;
};

// Change Weapons
Game_Interpreter.prototype.command127 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
$gameParty.gainItem($dataWeapons[params[0]], value, params[4]);
return true;
};

// Change Armors
Game_Interpreter.prototype.command128 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
$gameParty.gainItem($dataArmors[params[0]], value, params[4]);
return true;
};

// Change Party Member


Game_Interpreter.prototype.command129 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
if (params[1] === 0) {
// Add
if (params[2]) {
// Initialize
$gameActors.actor(params[0]).setup(params[0]);
}
$gameParty.addActor(params[0]);
} else {
// Remove
$gameParty.removeActor(params[0]);
}
}
return true;
};

// Change Battle BGM


Game_Interpreter.prototype.command132 = function(params) {
$gameSystem.setBattleBgm(params[0]);
return true;
};

// Change Victory ME
Game_Interpreter.prototype.command133 = function(params) {
$gameSystem.setVictoryMe(params[0]);
return true;
};

// Change Save Access


Game_Interpreter.prototype.command134 = function(params) {
if (params[0] === 0) {
$gameSystem.disableSave();
} else {
$gameSystem.enableSave();
}
return true;
};

// Change Menu Access


Game_Interpreter.prototype.command135 = function(params) {
if (params[0] === 0) {
$gameSystem.disableMenu();
} else {
$gameSystem.enableMenu();
}
return true;
};

// Change Encounter
Game_Interpreter.prototype.command136 = function(params) {
if (params[0] === 0) {
$gameSystem.disableEncounter();
} else {
$gameSystem.enableEncounter();
}
$gamePlayer.makeEncounterCount();
return true;
};

// Change Formation Access


Game_Interpreter.prototype.command137 = function(params) {
if (params[0] === 0) {
$gameSystem.disableFormation();
} else {
$gameSystem.enableFormation();
}
return true;
};

// Change Window Color


Game_Interpreter.prototype.command138 = function(params) {
$gameSystem.setWindowTone(params[0]);
return true;
};

// Change Defeat ME
Game_Interpreter.prototype.command139 = function(params) {
$gameSystem.setDefeatMe(params[0]);
return true;
};

// Change Vehicle BGM


Game_Interpreter.prototype.command140 = function(params) {
const vehicle = $gameMap.vehicle(params[0]);
if (vehicle) {
vehicle.setBgm(params[1]);
}
return true;
};

// Transfer Player
Game_Interpreter.prototype.command201 = function(params) {
if ($gameParty.inBattle() || $gameMessage.isBusy()) {
return false;
}
let mapId, x, y;
if (params[0] === 0) {
// Direct designation
mapId = params[1];
x = params[2];
y = params[3];
} else {
// Designation with variables
mapId = $gameVariables.value(params[1]);
x = $gameVariables.value(params[2]);
y = $gameVariables.value(params[3]);
}
$gamePlayer.reserveTransfer(mapId, x, y, params[4], params[5]);
this.setWaitMode("transfer");
return true;
};
// Set Vehicle Location
Game_Interpreter.prototype.command202 = function(params) {
let mapId, x, y;
if (params[1] === 0) {
// Direct designation
mapId = params[2];
x = params[3];
y = params[4];
} else {
// Designation with variables
mapId = $gameVariables.value(params[2]);
x = $gameVariables.value(params[3]);
y = $gameVariables.value(params[4]);
}
const vehicle = $gameMap.vehicle(params[0]);
if (vehicle) {
vehicle.setLocation(mapId, x, y);
}
return true;
};

// Set Event Location


Game_Interpreter.prototype.command203 = function(params) {
const character = this.character(params[0]);
if (character) {
if (params[1] === 0) {
// Direct designation
character.locate(params[2], params[3]);
} else if (params[1] === 1) {
// Designation with variables
const x = $gameVariables.value(params[2]);
const y = $gameVariables.value(params[3]);
character.locate(x, y);
} else {
// Exchange with another event
const character2 = this.character(params[2]);
if (character2) {
character.swap(character2);
}
}
if (params[4] > 0) {
character.setDirection(params[4]);
}
}
return true;
};

// Scroll Map
Game_Interpreter.prototype.command204 = function(params) {
if (!$gameParty.inBattle()) {
if ($gameMap.isScrolling()) {
this.setWaitMode("scroll");
return false;
}
$gameMap.startScroll(params[0], params[1], params[2]);
if (params[3]) {
this.setWaitMode("scroll");
}
}
return true;
};

// Set Movement Route


Game_Interpreter.prototype.command205 = function(params) {
$gameMap.refreshIfNeeded();
this._characterId = params[0];
const character = this.character(this._characterId);
if (character) {
character.forceMoveRoute(params[1]);
if (params[1].wait) {
this.setWaitMode("route");
}
}
return true;
};

// Get on/off Vehicle


Game_Interpreter.prototype.command206 = function() {
$gamePlayer.getOnOffVehicle();
return true;
};

// Change Transparency
Game_Interpreter.prototype.command211 = function(params) {
$gamePlayer.setTransparent(params[0] === 0);
return true;
};

// Show Animation
Game_Interpreter.prototype.command212 = function(params) {
this._characterId = params[0];
const character = this.character(this._characterId);
if (character) {
$gameTemp.requestAnimation([character], params[1]);
if (params[2]) {
this.setWaitMode("animation");
}
}
return true;
};

// Show Balloon Icon


Game_Interpreter.prototype.command213 = function(params) {
this._characterId = params[0];
const character = this.character(this._characterId);
if (character) {
$gameTemp.requestBalloon(character, params[1]);
if (params[2]) {
this.setWaitMode("balloon");
}
}
return true;
};

// Erase Event
Game_Interpreter.prototype.command214 = function() {
if (this.isOnCurrentMap() && this._eventId > 0) {
$gameMap.eraseEvent(this._eventId);
}
return true;
};

// Change Player Followers


Game_Interpreter.prototype.command216 = function(params) {
if (params[0] === 0) {
$gamePlayer.showFollowers();
} else {
$gamePlayer.hideFollowers();
}
$gamePlayer.refresh();
return true;
};

// Gather Followers
Game_Interpreter.prototype.command217 = function() {
if (!$gameParty.inBattle()) {
$gamePlayer.gatherFollowers();
this.setWaitMode("gather");
}
return true;
};

// Fadeout Screen
Game_Interpreter.prototype.command221 = function() {
if ($gameMessage.isBusy()) {
return false;
}
$gameScreen.startFadeOut(this.fadeSpeed());
this.wait(this.fadeSpeed());
return true;
};

// Fadein Screen
Game_Interpreter.prototype.command222 = function() {
if ($gameMessage.isBusy()) {
return false;
}
$gameScreen.startFadeIn(this.fadeSpeed());
this.wait(this.fadeSpeed());
return true;
};

// Tint Screen
Game_Interpreter.prototype.command223 = function(params) {
$gameScreen.startTint(params[0], params[1]);
if (params[2]) {
this.wait(params[1]);
}
return true;
};

// Flash Screen
Game_Interpreter.prototype.command224 = function(params) {
$gameScreen.startFlash(params[0], params[1]);
if (params[2]) {
this.wait(params[1]);
}
return true;
};

// Shake Screen
Game_Interpreter.prototype.command225 = function(params) {
$gameScreen.startShake(params[0], params[1], params[2]);
if (params[3]) {
this.wait(params[2]);
}
return true;
};

// Wait
Game_Interpreter.prototype.command230 = function(params) {
this.wait(params[0]);
return true;
};

// Show Picture
Game_Interpreter.prototype.command231 = function(params) {
const point = this.picturePoint(params);
// prettier-ignore
$gameScreen.showPicture(
params[0], params[1], params[2], point.x, point.y,
params[6], params[7], params[8], params[9]
);
return true;
};

// Move Picture
Game_Interpreter.prototype.command232 = function(params) {
const point = this.picturePoint(params);
// prettier-ignore
$gameScreen.movePicture(
params[0], params[2], point.x, point.y, params[6], params[7],
params[8], params[9], params[10], params[12] || 0
);
if (params[11]) {
this.wait(params[10]);
}
return true;
};

Game_Interpreter.prototype.picturePoint = function(params) {
const point = new Point();
if (params[3] === 0) {
// Direct designation
point.x = params[4];
point.y = params[5];
} else {
// Designation with variables
point.x = $gameVariables.value(params[4]);
point.y = $gameVariables.value(params[5]);
}
return point;
};

// Rotate Picture
Game_Interpreter.prototype.command233 = function(params) {
$gameScreen.rotatePicture(params[0], params[1]);
return true;
};

// Tint Picture
Game_Interpreter.prototype.command234 = function(params) {
$gameScreen.tintPicture(params[0], params[1], params[2]);
if (params[3]) {
this.wait(params[2]);
}
return true;
};

// Erase Picture
Game_Interpreter.prototype.command235 = function(params) {
$gameScreen.erasePicture(params[0]);
return true;
};

// Set Weather Effect


Game_Interpreter.prototype.command236 = function(params) {
if (!$gameParty.inBattle()) {
$gameScreen.changeWeather(params[0], params[1], params[2]);
if (params[3]) {
this.wait(params[2]);
}
}
return true;
};

// Play BGM
Game_Interpreter.prototype.command241 = function(params) {
AudioManager.playBgm(params[0]);
return true;
};

// Fadeout BGM
Game_Interpreter.prototype.command242 = function(params) {
AudioManager.fadeOutBgm(params[0]);
return true;
};

// Save BGM
Game_Interpreter.prototype.command243 = function() {
$gameSystem.saveBgm();
return true;
};

// Resume BGM
Game_Interpreter.prototype.command244 = function() {
$gameSystem.replayBgm();
return true;
};

// Play BGS
Game_Interpreter.prototype.command245 = function(params) {
AudioManager.playBgs(params[0]);
return true;
};

// Fadeout BGS
Game_Interpreter.prototype.command246 = function(params) {
AudioManager.fadeOutBgs(params[0]);
return true;
};

// Play ME
Game_Interpreter.prototype.command249 = function(params) {
AudioManager.playMe(params[0]);
return true;
};

// Play SE
Game_Interpreter.prototype.command250 = function(params) {
AudioManager.playSe(params[0]);
return true;
};

// Stop SE
Game_Interpreter.prototype.command251 = function() {
AudioManager.stopSe();
return true;
};

// Play Movie
Game_Interpreter.prototype.command261 = function(params) {
if ($gameMessage.isBusy()) {
return false;
}
const name = params[0];
if (name.length > 0) {
const ext = this.videoFileExt();
Video.play("movies/" + name + ext);
this.setWaitMode("video");
}
return true;
};

Game_Interpreter.prototype.videoFileExt = function() {
if (Utils.canPlayWebm()) {
return ".webm";
} else {
return ".mp4";
}
};

// Change Map Name Display


Game_Interpreter.prototype.command281 = function(params) {
if (params[0] === 0) {
$gameMap.enableNameDisplay();
} else {
$gameMap.disableNameDisplay();
}
return true;
};

// Change Tileset
Game_Interpreter.prototype.command282 = function(params) {
const tileset = $dataTilesets[params[0]];
const allReady = tileset.tilesetNames
.map(tilesetName => ImageManager.loadTileset(tilesetName))
.every(bitmap => bitmap.isReady());
if (allReady) {
$gameMap.changeTileset(params[0]);
return true;
} else {
return false;
}
};

// Change Battle Background


Game_Interpreter.prototype.command283 = function(params) {
$gameMap.changeBattleback(params[0], params[1]);
return true;
};

// Change Parallax
Game_Interpreter.prototype.command284 = function(params) {
// prettier-ignore
$gameMap.changeParallax(
params[0], params[1], params[2], params[3], params[4]
);
return true;
};

// Get Location Info


Game_Interpreter.prototype.command285 = function(params) {
let x, y, value;
if (params[2] === 0) {
// Direct designation
x = params[3];
y = params[4];
} else if (params[2] === 1) {
// Designation with variables
x = $gameVariables.value(params[3]);
y = $gameVariables.value(params[4]);
} else {
// Designation by a character
const character = this.character(params[3]);
x = character.x;
y = character.y;
}
switch (params[1]) {
case 0: // Terrain Tag
value = $gameMap.terrainTag(x, y);
break;
case 1: // Event ID
value = $gameMap.eventIdXy(x, y);
break;
case 2: // Tile ID (Layer 1)
case 3: // Tile ID (Layer 2)
case 4: // Tile ID (Layer 3)
case 5: // Tile ID (Layer 4)
value = $gameMap.tileId(x, y, params[1] - 2);
break;
default:
// Region ID
value = $gameMap.regionId(x, y);
break;
}
$gameVariables.setValue(params[0], value);
return true;
};

// Battle Processing
Game_Interpreter.prototype.command301 = function(params) {
if (!$gameParty.inBattle()) {
let troopId;
if (params[0] === 0) {
// Direct designation
troopId = params[1];
} else if (params[0] === 1) {
// Designation with a variable
troopId = $gameVariables.value(params[1]);
} else {
// Same as Random Encounters
troopId = $gamePlayer.makeEncounterTroopId();
}
if ($dataTroops[troopId]) {
BattleManager.setup(troopId, params[2], params[3]);
BattleManager.setEventCallback(n => {
this._branch[this._indent] = n;
});
$gamePlayer.makeEncounterCount();
SceneManager.push(Scene_Battle);
}
}
return true;
};

// If Win
Game_Interpreter.prototype.command601 = function() {
if (this._branch[this._indent] !== 0) {
this.skipBranch();
}
return true;
};

// If Escape
Game_Interpreter.prototype.command602 = function() {
if (this._branch[this._indent] !== 1) {
this.skipBranch();
}
return true;
};

// If Lose
Game_Interpreter.prototype.command603 = function() {
if (this._branch[this._indent] !== 2) {
this.skipBranch();
}
return true;
};

// Shop Processing
Game_Interpreter.prototype.command302 = function(params) {
if (!$gameParty.inBattle()) {
const goods = [params];
while (this.nextEventCode() === 605) {
this._index++;
goods.push(this.currentCommand().parameters);
}
SceneManager.push(Scene_Shop);
SceneManager.prepareNextScene(goods, params[4]);
}
return true;
};

// Name Input Processing


Game_Interpreter.prototype.command303 = function(params) {
if (!$gameParty.inBattle()) {
if ($dataActors[params[0]]) {
SceneManager.push(Scene_Name);
SceneManager.prepareNextScene(params[0], params[1]);
}
}
return true;
};

// Change HP
Game_Interpreter.prototype.command311 = function(params) {
const value = this.operateValue(params[2], params[3], params[4]);
this.iterateActorEx(params[0], params[1], actor => {
this.changeHp(actor, value, params[5]);
});
return true;
};

// Change MP
Game_Interpreter.prototype.command312 = function(params) {
const value = this.operateValue(params[2], params[3], params[4]);
this.iterateActorEx(params[0], params[1], actor => {
actor.gainMp(value);
});
return true;
};

// Change TP
Game_Interpreter.prototype.command326 = function(params) {
const value = this.operateValue(params[2], params[3], params[4]);
this.iterateActorEx(params[0], params[1], actor => {
actor.gainTp(value);
});
return true;
};

// Change State
Game_Interpreter.prototype.command313 = function(params) {
this.iterateActorEx(params[0], params[1], actor => {
const alreadyDead = actor.isDead();
if (params[2] === 0) {
actor.addState(params[3]);
} else {
actor.removeState(params[3]);
}
if (actor.isDead() && !alreadyDead) {
actor.performCollapse();
}
actor.clearResult();
});
return true;
};

// Recover All
Game_Interpreter.prototype.command314 = function(params) {
this.iterateActorEx(params[0], params[1], actor => {
actor.recoverAll();
});
return true;
};

// Change EXP
Game_Interpreter.prototype.command315 = function(params) {
const value = this.operateValue(params[2], params[3], params[4]);
this.iterateActorEx(params[0], params[1], actor => {
actor.changeExp(actor.currentExp() + value, params[5]);
});
return true;
};

// Change Level
Game_Interpreter.prototype.command316 = function(params) {
const value = this.operateValue(params[2], params[3], params[4]);
this.iterateActorEx(params[0], params[1], actor => {
actor.changeLevel(actor.level + value, params[5]);
});
return true;
};

// Change Parameter
Game_Interpreter.prototype.command317 = function(params) {
const value = this.operateValue(params[3], params[4], params[5]);
this.iterateActorEx(params[0], params[1], actor => {
actor.addParam(params[2], value);
});
return true;
};

// Change Skill
Game_Interpreter.prototype.command318 = function(params) {
this.iterateActorEx(params[0], params[1], actor => {
if (params[2] === 0) {
actor.learnSkill(params[3]);
} else {
actor.forgetSkill(params[3]);
}
});
return true;
};

// Change Equipment
Game_Interpreter.prototype.command319 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
actor.changeEquipById(params[1], params[2]);
}
return true;
};

// Change Name
Game_Interpreter.prototype.command320 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
actor.setName(params[1]);
}
return true;
};

// Change Class
Game_Interpreter.prototype.command321 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor && $dataClasses[params[1]]) {
actor.changeClass(params[1], params[2]);
}
return true;
};

// Change Actor Images


Game_Interpreter.prototype.command322 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
actor.setCharacterImage(params[1], params[2]);
actor.setFaceImage(params[3], params[4]);
actor.setBattlerImage(params[5]);
}
$gamePlayer.refresh();
return true;
};

// Change Vehicle Image


Game_Interpreter.prototype.command323 = function(params) {
const vehicle = $gameMap.vehicle(params[0]);
if (vehicle) {
vehicle.setImage(params[1], params[2]);
}
return true;
};

// Change Nickname
Game_Interpreter.prototype.command324 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
actor.setNickname(params[1]);
}
return true;
};

// Change Profile
Game_Interpreter.prototype.command325 = function(params) {
const actor = $gameActors.actor(params[0]);
if (actor) {
actor.setProfile(params[1]);
}
return true;
};

// Change Enemy HP
Game_Interpreter.prototype.command331 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
this.iterateEnemyIndex(params[0], enemy => {
this.changeHp(enemy, value, params[4]);
});
return true;
};

// Change Enemy MP
Game_Interpreter.prototype.command332 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
this.iterateEnemyIndex(params[0], enemy => {
enemy.gainMp(value);
});
return true;
};

// Change Enemy TP
Game_Interpreter.prototype.command342 = function(params) {
const value = this.operateValue(params[1], params[2], params[3]);
this.iterateEnemyIndex(params[0], enemy => {
enemy.gainTp(value);
});
return true;
};

// Change Enemy State


Game_Interpreter.prototype.command333 = function(params) {
this.iterateEnemyIndex(params[0], enemy => {
const alreadyDead = enemy.isDead();
if (params[1] === 0) {
enemy.addState(params[2]);
} else {
enemy.removeState(params[2]);
}
if (enemy.isDead() && !alreadyDead) {
enemy.performCollapse();
}
enemy.clearResult();
});
return true;
};

// Enemy Recover All


Game_Interpreter.prototype.command334 = function(params) {
this.iterateEnemyIndex(params[0], enemy => {
enemy.recoverAll();
});
return true;
};

// Enemy Appear
Game_Interpreter.prototype.command335 = function(params) {
this.iterateEnemyIndex(params[0], enemy => {
enemy.appear();
$gameTroop.makeUniqueNames();
});
return true;
};

// Enemy Transform
Game_Interpreter.prototype.command336 = function(params) {
this.iterateEnemyIndex(params[0], enemy => {
enemy.transform(params[1]);
$gameTroop.makeUniqueNames();
});
return true;
};

// Show Battle Animation


Game_Interpreter.prototype.command337 = function(params) {
let param = params[0];
if (params[2]) {
param = -1;
}
const targets = [];
this.iterateEnemyIndex(param, enemy => {
if (enemy.isAlive()) {
targets.push(enemy);
}
});
$gameTemp.requestAnimation(targets, params[1]);
return true;
};

// Force Action
Game_Interpreter.prototype.command339 = function(params) {
this.iterateBattler(params[0], params[1], battler => {
if (!battler.isDeathStateAffected()) {
battler.forceAction(params[2], params[3]);
BattleManager.forceAction(battler);
this.setWaitMode("action");
}
});
return true;
};

// Abort Battle
Game_Interpreter.prototype.command340 = function() {
BattleManager.abort();
return true;
};

// Open Menu Screen


Game_Interpreter.prototype.command351 = function() {
if (!$gameParty.inBattle()) {
SceneManager.push(Scene_Menu);
Window_MenuCommand.initCommandPosition();
}
return true;
};

// Open Save Screen


Game_Interpreter.prototype.command352 = function() {
if (!$gameParty.inBattle()) {
SceneManager.push(Scene_Save);
}
return true;
};

// Game Over
Game_Interpreter.prototype.command353 = function() {
SceneManager.goto(Scene_Gameover);
return true;
};

// Return to Title Screen


Game_Interpreter.prototype.command354 = function() {
SceneManager.goto(Scene_Title);
return true;
};

// Script
Game_Interpreter.prototype.command355 = function() {
let script = this.currentCommand().parameters[0] + "\n";
while (this.nextEventCode() === 655) {
this._index++;
script += this.currentCommand().parameters[0] + "\n";
}
eval(script);
return true;
};

// Plugin Command MV (deprecated)


Game_Interpreter.prototype.command356 = function(params) {
const args = params[0].split(" ");
const command = args.shift();
this.pluginCommand(command, args);
return true;
};

Game_Interpreter.prototype.pluginCommand = function() {
// deprecated
};

// Plugin Command
Game_Interpreter.prototype.command357 = function(params) {
const pluginName = Utils.extractFileName(params[0]);
PluginManager.callCommand(this, pluginName, params[1], params[3]);
return true;
};

//-----------------------------------------------------------------------------

You might also like