//=============================================================================
// rpg_scenes.js v1.6.2
//=============================================================================

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

/**
 * The Superclass of all scene within the game.
 *
 * @class Scene_Base
 * @constructor
 * @extends Stage
 */
function Scene_Base() {
  this.initialize.apply(this, arguments);
}

Scene_Base.prototype = Object.create(Stage.prototype);
Scene_Base.prototype.constructor = Scene_Base;

/**
 * Create a instance of Scene_Base.
 *
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.initialize = function () {
  Stage.prototype.initialize.call(this);
  this._active = false;
  this._fadeSign = 0;
  this._fadeDuration = 0;
  this._fadeSprite = null;
  this._imageReservationId = Utils.generateRuntimeId();
};

/**
 * Attach a reservation to the reserve queue.
 *
 * @method attachReservation
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.attachReservation = function () {
  ImageManager.setDefaultReservationId(this._imageReservationId);
};

/**
 * Remove the reservation from the Reserve queue.
 *
 * @method detachReservation
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.detachReservation = function () {
  ImageManager.releaseReservation(this._imageReservationId);
};

/**
 * Create the components and add them to the rendering process.
 *
 * @method create
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.create = function () {};

/**
 * Returns whether the scene is active or not.
 *
 * @method isActive
 * @instance
 * @memberof Scene_Base
 * @return {Boolean} return true if the scene is active
 */
Scene_Base.prototype.isActive = function () {
  return this._active;
};

/**
 * Return whether the scene is ready to start or not.
 *
 * @method isReady
 * @instance
 * @memberof Scene_Base
 * @return {Boolean} Return true if the scene is ready to start
 */
Scene_Base.prototype.isReady = function () {
  return ImageManager.isReady();
};

/**
 * Start the scene processing.
 *
 * @method start
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.start = function () {
  this._active = true;
};

/**
 * Update the scene processing each new frame.
 *
 * @method update
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.update = function () {
  this.updateFade();
  this.updateChildren();
};

/**
 * Stop the scene processing.
 *
 * @method stop
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.stop = function () {
  this._active = false;
};

/**
 * Return whether the scene is busy or not.
 *
 * @method isBusy
 * @instance
 * @memberof Scene_Base
 * @return {Boolean} Return true if the scene is currently busy
 */
Scene_Base.prototype.isBusy = function () {
  return this._fadeDuration > 0;
};

/**
 * Terminate the scene before switching to a another scene.
 *
 * @method terminate
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.terminate = function () {};

/**
 * Create the layer for the windows children
 * and add it to the rendering process.
 *
 * @method createWindowLayer
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.createWindowLayer = function () {
  var width = Graphics.boxWidth;
  var height = Graphics.boxHeight;
  var x = (Graphics.width - width) / 2;
  var y = (Graphics.height - height) / 2;
  this._windowLayer = new WindowLayer();
  this._windowLayer.move(x, y, width, height);
  this.addChild(this._windowLayer);
};

/**
 * Add the children window to the windowLayer processing.
 *
 * @method addWindow
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.addWindow = function (window) {
  this._windowLayer.addChild(window);
};

/**
 * Request a fadeIn screen process.
 *
 * @method startFadeIn
 * @param {Number} [duration=30] The time the process will take for fadeIn the screen
 * @param {Boolean} [white=false] If true the fadein will be process with a white color else it's will be black
 *
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.startFadeIn = function (duration, white) {
  this.createFadeSprite(white);
  this._fadeSign = 1;
  this._fadeDuration = duration || 30;
  this._fadeSprite.opacity = 255;
};

/**
 * Request a fadeOut screen process.
 *
 * @method startFadeOut
 * @param {Number} [duration=30] The time the process will take for fadeOut the screen
 * @param {Boolean} [white=false] If true the fadeOut will be process with a white color else it's will be black
 *
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.startFadeOut = function (duration, white) {
  this.createFadeSprite(white);
  this._fadeSign = -1;
  this._fadeDuration = duration || 30;
  this._fadeSprite.opacity = 0;
};

/**
 * Create a Screen sprite for the fadein and fadeOut purpose and
 * add it to the rendering process.
 *
 * @method createFadeSprite
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.createFadeSprite = function (white) {
  if (!this._fadeSprite) {
    this._fadeSprite = new ScreenSprite();
    this.addChild(this._fadeSprite);
  }
  if (white) {
    this._fadeSprite.setWhite();
  } else {
    this._fadeSprite.setBlack();
  }
};

/**
 * Update the screen fade processing.
 *
 * @method updateFade
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.updateFade = function () {
  if (this._fadeDuration > 0) {
    var d = this._fadeDuration;
    if (this._fadeSign > 0) {
      this._fadeSprite.opacity -= this._fadeSprite.opacity / d;
    } else {
      this._fadeSprite.opacity += (255 - this._fadeSprite.opacity) / d;
    }
    this._fadeDuration--;
  }
};

/**
 * Update the children of the scene EACH frame.
 *
 * @method updateChildren
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.updateChildren = function () {
  this.children.forEach(function (child) {
    if (child.update) {
      child.update();
    }
  });
};

/**
 * Pop the scene from the stack array and switch to the
 * previous scene.
 *
 * @method popScene
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.popScene = function () {
  SceneManager.pop();
};

/**
 * Check whether the game should be triggering a gameover.
 *
 * @method checkGameover
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.checkGameover = function () {
  if ($gameParty.isAllDead()) {
    SceneManager.goto(Scene_Gameover);
  }
};

/**
 * Slowly fade out all the visual and audio of the scene.
 *
 * @method fadeOutAll
 * @instance
 * @memberof Scene_Base
 */
Scene_Base.prototype.fadeOutAll = function () {
  var time = this.slowFadeSpeed() / 60;
  AudioManager.fadeOutBgm(time);
  AudioManager.fadeOutBgs(time);
  AudioManager.fadeOutMe(time);
  this.startFadeOut(this.slowFadeSpeed());
};

/**
 * Return the screen fade speed value.
 *
 * @method fadeSpeed
 * @instance
 * @memberof Scene_Base
 * @return {Number} Return the fade speed
 */
Scene_Base.prototype.fadeSpeed = function () {
  return 24;
};

/**
 * Return a slow screen fade speed value.
 *
 * @method slowFadeSpeed
 * @instance
 * @memberof Scene_Base
 * @return {Number} Return the fade speed
 */
Scene_Base.prototype.slowFadeSpeed = function () {
  return this.fadeSpeed() * 2;
};

//-----------------------------------------------------------------------------
// Scene_Boot
//
// The scene class for initializing the entire game.

function Scene_Boot() {
  this.initialize.apply(this, arguments);
}

Scene_Boot.prototype = Object.create(Scene_Base.prototype);
Scene_Boot.prototype.constructor = Scene_Boot;

Scene_Boot.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
  this._startDate = Date.now();
};

Scene_Boot.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  DataManager.loadDatabase();
  ConfigManager.load();
  this.loadSystemWindowImage();
};

Scene_Boot.prototype.loadSystemWindowImage = function () {
  ImageManager.reserveSystem("Window");
};

Scene_Boot.loadSystemImages = function () {
  ImageManager.reserveSystem("IconSet");
  ImageManager.reserveSystem("Balloon");
  ImageManager.reserveSystem("Shadow1");
  ImageManager.reserveSystem("Shadow2");
  ImageManager.reserveSystem("Damage");
  ImageManager.reserveSystem("States");
  ImageManager.reserveSystem("Weapons1");
  ImageManager.reserveSystem("Weapons2");
  ImageManager.reserveSystem("Weapons3");
  ImageManager.reserveSystem("ButtonSet");
};

Scene_Boot.prototype.isReady = function () {
  if (Scene_Base.prototype.isReady.call(this)) {
    return DataManager.isDatabaseLoaded() && this.isGameFontLoaded();
  } else {
    return false;
  }
};

Scene_Boot.prototype.isGameFontLoaded = function () {
  if (Graphics.isFontLoaded("GameFont")) {
    return true;
  } else if (!Graphics.canUseCssFontLoading()) {
    var elapsed = Date.now() - this._startDate;
    if (elapsed >= 60000) {
      throw new Error("Failed to load GameFont");
    }
  }
};

Scene_Boot.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
  SoundManager.preloadImportantSounds();
  if (DataManager.isBattleTest()) {
    DataManager.setupBattleTest();
    SceneManager.goto(Scene_Battle);
  } else if (DataManager.isEventTest()) {
    DataManager.setupEventTest();
    SceneManager.goto(Scene_Map);
  } else {
    this.checkPlayerLocation();
    DataManager.setupNewGame();
    SceneManager.goto(Scene_Title);
    Window_TitleCommand.initCommandPosition();
  }
  this.updateDocumentTitle();
};

Scene_Boot.prototype.updateDocumentTitle = function () {
  document.title = $dataSystem.gameTitle;
};

Scene_Boot.prototype.checkPlayerLocation = function () {
  if ($dataSystem.startMapId === 0) {
    throw new Error("Player's starting position is not set");
  }
};

//-----------------------------------------------------------------------------
// Scene_Title
//
// The scene class of the title screen.

function Scene_Title() {
  this.initialize.apply(this, arguments);
}

Scene_Title.prototype = Object.create(Scene_Base.prototype);
Scene_Title.prototype.constructor = Scene_Title;

Scene_Title.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
};

Scene_Title.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  this.createBackground();
  this.createForeground();
  this.createWindowLayer();
  this.createCommandWindow();
};

Scene_Title.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
  SceneManager.clearStack();
  this.centerSprite(this._backSprite1);
  this.centerSprite(this._backSprite2);
  this.playTitleMusic();
  this.startFadeIn(this.fadeSpeed(), false);
};

Scene_Title.prototype.update = function () {
  if (!this.isBusy()) {
    this._commandWindow.open();
  }
  Scene_Base.prototype.update.call(this);
};

Scene_Title.prototype.isBusy = function () {
  return (
    this._commandWindow.isClosing() || Scene_Base.prototype.isBusy.call(this)
  );
};

Scene_Title.prototype.terminate = function () {
  Scene_Base.prototype.terminate.call(this);
  SceneManager.snapForBackground();
};

Scene_Title.prototype.createBackground = function () {
  this._backSprite1 = new Sprite(
    ImageManager.loadTitle1($dataSystem.title1Name)
  );
  this._backSprite2 = new Sprite(
    ImageManager.loadTitle2($dataSystem.title2Name)
  );
  this.addChild(this._backSprite1);
  this.addChild(this._backSprite2);
};

Scene_Title.prototype.createForeground = function () {
  this._gameTitleSprite = new Sprite(
    new Bitmap(Graphics.width, Graphics.height)
  );
  this.addChild(this._gameTitleSprite);
  if ($dataSystem.optDrawTitle) {
    this.drawGameTitle();
  }
};

Scene_Title.prototype.drawGameTitle = function () {
  var x = 20;
  var y = Graphics.height / 4;
  var maxWidth = Graphics.width - x * 2;
  var text = $dataSystem.gameTitle;
  this._gameTitleSprite.bitmap.outlineColor = "black";
  this._gameTitleSprite.bitmap.outlineWidth = 8;
  this._gameTitleSprite.bitmap.fontSize = 72;
  this._gameTitleSprite.bitmap.drawText(text, x, y, maxWidth, 48, "center");
};

Scene_Title.prototype.centerSprite = function (sprite) {
  sprite.x = Graphics.width / 2;
  sprite.y = Graphics.height / 2;
  sprite.anchor.x = 0.5;
  sprite.anchor.y = 0.5;
};

Scene_Title.prototype.createCommandWindow = function () {
  this._commandWindow = new Window_TitleCommand();
  this._commandWindow.setHandler("newGame", this.commandNewGame.bind(this));
  this._commandWindow.setHandler("continue", this.commandContinue.bind(this));
  this._commandWindow.setHandler("options", this.commandOptions.bind(this));
  this.addWindow(this._commandWindow);
};

Scene_Title.prototype.commandNewGame = function () {
  DataManager.setupNewGame();
  this._commandWindow.close();
  this.fadeOutAll();
  SceneManager.goto(Scene_Map);
};

Scene_Title.prototype.commandContinue = function () {
  this._commandWindow.close();
  SceneManager.push(Scene_Load);
};

Scene_Title.prototype.commandOptions = function () {
  this._commandWindow.close();
  SceneManager.push(Scene_Options);
};

Scene_Title.prototype.playTitleMusic = function () {
  AudioManager.playBgm($dataSystem.titleBgm);
  AudioManager.stopBgs();
  AudioManager.stopMe();
};

//-----------------------------------------------------------------------------
// Scene_Map
//
// The scene class of the map screen.

function Scene_Map() {
  this.initialize.apply(this, arguments);
}

Scene_Map.prototype = Object.create(Scene_Base.prototype);
Scene_Map.prototype.constructor = Scene_Map;

Scene_Map.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
  this._waitCount = 0;
  this._encounterEffectDuration = 0;
  this._mapLoaded = false;
  this._touchCount = 0;
};

Scene_Map.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  this._transfer = $gamePlayer.isTransferring();
  var mapId = this._transfer ? $gamePlayer.newMapId() : $gameMap.mapId();
  DataManager.loadMapData(mapId);
};

Scene_Map.prototype.isReady = function () {
  if (!this._mapLoaded && DataManager.isMapLoaded()) {
    this.onMapLoaded();
    this._mapLoaded = true;
  }
  return this._mapLoaded && Scene_Base.prototype.isReady.call(this);
};

Scene_Map.prototype.onMapLoaded = function () {
  if (this._transfer) {
    $gamePlayer.performTransfer();
  }
  this.createDisplayObjects();
};

Scene_Map.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
  SceneManager.clearStack();
  if (this._transfer) {
    this.fadeInForTransfer();
    this._mapNameWindow.open();
    $gameMap.autoplay();
  } else if (this.needsFadeIn()) {
    this.startFadeIn(this.fadeSpeed(), false);
  }
  this.menuCalling = false;
};

Scene_Map.prototype.update = function () {
  this.updateDestination();
  this.updateMainMultiply();
  if (this.isSceneChangeOk()) {
    this.updateScene();
  } else if (SceneManager.isNextScene(Scene_Battle)) {
    this.updateEncounterEffect();
  }
  this.updateWaitCount();
  Scene_Base.prototype.update.call(this);
};

Scene_Map.prototype.updateMainMultiply = function () {
  this.updateMain();
  if (this.isFastForward()) {
    this.updateMain();
  }
};

Scene_Map.prototype.updateMain = function () {
  var active = this.isActive();
  $gameMap.update(active);
  $gamePlayer.update(active);
  $gameTimer.update(active);
  $gameScreen.update();
};

Scene_Map.prototype.isFastForward = function () {
  return (
    $gameMap.isEventRunning() &&
    !SceneManager.isSceneChanging() &&
    (Input.isLongPressed("ok") || TouchInput.isLongPressed())
  );
};

Scene_Map.prototype.stop = function () {
  Scene_Base.prototype.stop.call(this);
  $gamePlayer.straighten();
  this._mapNameWindow.close();
  if (this.needsSlowFadeOut()) {
    this.startFadeOut(this.slowFadeSpeed(), false);
  } else if (SceneManager.isNextScene(Scene_Map)) {
    this.fadeOutForTransfer();
  } else if (SceneManager.isNextScene(Scene_Battle)) {
    this.launchBattle();
  }
};

Scene_Map.prototype.isBusy = function () {
  return (
    (this._messageWindow && this._messageWindow.isClosing()) ||
    this._waitCount > 0 ||
    this._encounterEffectDuration > 0 ||
    Scene_Base.prototype.isBusy.call(this)
  );
};

Scene_Map.prototype.terminate = function () {
  Scene_Base.prototype.terminate.call(this);
  if (!SceneManager.isNextScene(Scene_Battle)) {
    this._spriteset.update();
    this._mapNameWindow.hide();
    SceneManager.snapForBackground();
  } else {
    ImageManager.clearRequest();
  }

  if (SceneManager.isNextScene(Scene_Map)) {
    ImageManager.clearRequest();
  }

  $gameScreen.clearZoom();

  this.removeChild(this._fadeSprite);
  this.removeChild(this._mapNameWindow);
  this.removeChild(this._windowLayer);
  this.removeChild(this._spriteset);
};

Scene_Map.prototype.needsFadeIn = function () {
  return (
    SceneManager.isPreviousScene(Scene_Battle) ||
    SceneManager.isPreviousScene(Scene_Load)
  );
};

Scene_Map.prototype.needsSlowFadeOut = function () {
  return (
    SceneManager.isNextScene(Scene_Title) ||
    SceneManager.isNextScene(Scene_Gameover)
  );
};

Scene_Map.prototype.updateWaitCount = function () {
  if (this._waitCount > 0) {
    this._waitCount--;
    return true;
  }
  return false;
};

Scene_Map.prototype.updateDestination = function () {
  if (this.isMapTouchOk()) {
    this.processMapTouch();
  } else {
    $gameTemp.clearDestination();
    this._touchCount = 0;
  }
};

Scene_Map.prototype.isMapTouchOk = function () {
  return this.isActive() && $gamePlayer.canMove();
};

Scene_Map.prototype.processMapTouch = function () {
  if (TouchInput.isTriggered() || this._touchCount > 0) {
    if (TouchInput.isPressed()) {
      if (this._touchCount === 0 || this._touchCount >= 15) {
        var x = $gameMap.canvasToMapX(TouchInput.x);
        var y = $gameMap.canvasToMapY(TouchInput.y);
        $gameTemp.setDestination(x, y);
      }
      this._touchCount++;
    } else {
      this._touchCount = 0;
    }
  }
};

Scene_Map.prototype.isSceneChangeOk = function () {
  return this.isActive() && !$gameMessage.isBusy();
};

Scene_Map.prototype.updateScene = function () {
  this.checkGameover();
  if (!SceneManager.isSceneChanging()) {
    this.updateTransferPlayer();
  }
  if (!SceneManager.isSceneChanging()) {
    this.updateEncounter();
  }
  if (!SceneManager.isSceneChanging()) {
    this.updateCallMenu();
  }
  if (!SceneManager.isSceneChanging()) {
    this.updateCallDebug();
  }
};

Scene_Map.prototype.createDisplayObjects = function () {
  this.createSpriteset();
  this.createMapNameWindow();
  this.createWindowLayer();
  this.createAllWindows();
};

Scene_Map.prototype.createSpriteset = function () {
  this._spriteset = new Spriteset_Map();
  this.addChild(this._spriteset);
};

Scene_Map.prototype.createAllWindows = function () {
  this.createMessageWindow();
  this.createScrollTextWindow();
};

Scene_Map.prototype.createMapNameWindow = function () {
  this._mapNameWindow = new Window_MapName();
  this.addChild(this._mapNameWindow);
};

Scene_Map.prototype.createMessageWindow = function () {
  this._messageWindow = new Window_Message();
  this.addWindow(this._messageWindow);
  this._messageWindow.subWindows().forEach(function (window) {
    this.addWindow(window);
  }, this);
};

Scene_Map.prototype.createScrollTextWindow = function () {
  this._scrollTextWindow = new Window_ScrollText();
  this.addWindow(this._scrollTextWindow);
};

Scene_Map.prototype.updateTransferPlayer = function () {
  if ($gamePlayer.isTransferring()) {
    SceneManager.goto(Scene_Map);
  }
};

Scene_Map.prototype.updateEncounter = function () {
  if ($gamePlayer.executeEncounter()) {
    SceneManager.push(Scene_Battle);
  }
};

Scene_Map.prototype.updateCallMenu = function () {
  if (this.isMenuEnabled()) {
    if (this.isMenuCalled()) {
      this.menuCalling = true;
    }
    if (this.menuCalling && !$gamePlayer.isMoving()) {
      this.callMenu();
    }
  } else {
    this.menuCalling = false;
  }
};

Scene_Map.prototype.isMenuEnabled = function () {
  return $gameSystem.isMenuEnabled() && !$gameMap.isEventRunning();
};

Scene_Map.prototype.isMenuCalled = function () {
  return Input.isTriggered("menu") || TouchInput.isCancelled();
};

Scene_Map.prototype.callMenu = function () {
  SoundManager.playOk();
  SceneManager.push(Scene_Menu);
  Window_MenuCommand.initCommandPosition();
  $gameTemp.clearDestination();
  this._mapNameWindow.hide();
  this._waitCount = 2;
};

Scene_Map.prototype.updateCallDebug = function () {
  if (this.isDebugCalled()) {
    SceneManager.push(Scene_Debug);
  }
};

Scene_Map.prototype.isDebugCalled = function () {
  return Input.isTriggered("debug") && $gameTemp.isPlaytest();
};

Scene_Map.prototype.fadeInForTransfer = function () {
  var fadeType = $gamePlayer.fadeType();
  switch (fadeType) {
    case 0:
    case 1:
      this.startFadeIn(this.fadeSpeed(), fadeType === 1);
      break;
  }
};

Scene_Map.prototype.fadeOutForTransfer = function () {
  var fadeType = $gamePlayer.fadeType();
  switch (fadeType) {
    case 0:
    case 1:
      this.startFadeOut(this.fadeSpeed(), fadeType === 1);
      break;
  }
};

Scene_Map.prototype.launchBattle = function () {
  BattleManager.saveBgmAndBgs();
  this.stopAudioOnBattleStart();
  SoundManager.playBattleStart();
  this.startEncounterEffect();
  this._mapNameWindow.hide();
};

Scene_Map.prototype.stopAudioOnBattleStart = function () {
  if (!AudioManager.isCurrentBgm($gameSystem.battleBgm())) {
    AudioManager.stopBgm();
  }
  AudioManager.stopBgs();
  AudioManager.stopMe();
  AudioManager.stopSe();
};

Scene_Map.prototype.startEncounterEffect = function () {
  this._spriteset.hideCharacters();
  this._encounterEffectDuration = this.encounterEffectSpeed();
};

Scene_Map.prototype.updateEncounterEffect = function () {
  if (this._encounterEffectDuration > 0) {
    this._encounterEffectDuration--;
    var speed = this.encounterEffectSpeed();
    var n = speed - this._encounterEffectDuration;
    var p = n / speed;
    var q = ((p - 1) * 20 * p + 5) * p + 1;
    var zoomX = $gamePlayer.screenX();
    var zoomY = $gamePlayer.screenY() - 24;
    if (n === 2) {
      $gameScreen.setZoom(zoomX, zoomY, 1);
      this.snapForBattleBackground();
      this.startFlashForEncounter(speed / 2);
    }
    $gameScreen.setZoom(zoomX, zoomY, q);
    if (n === Math.floor(speed / 6)) {
      this.startFlashForEncounter(speed / 2);
    }
    if (n === Math.floor(speed / 2)) {
      BattleManager.playBattleBgm();
      this.startFadeOut(this.fadeSpeed());
    }
  }
};

Scene_Map.prototype.snapForBattleBackground = function () {
  this._windowLayer.visible = false;
  SceneManager.snapForBackground();
  this._windowLayer.visible = true;
};

Scene_Map.prototype.startFlashForEncounter = function (duration) {
  var color = [255, 255, 255, 255];
  $gameScreen.startFlash(color, duration);
};

Scene_Map.prototype.encounterEffectSpeed = function () {
  return 60;
};

//-----------------------------------------------------------------------------
// Scene_MenuBase
//
// The superclass of all the menu-type scenes.

function Scene_MenuBase() {
  this.initialize.apply(this, arguments);
}

Scene_MenuBase.prototype = Object.create(Scene_Base.prototype);
Scene_MenuBase.prototype.constructor = Scene_MenuBase;

Scene_MenuBase.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
};

Scene_MenuBase.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  this.createBackground();
  this.updateActor();
  this.createWindowLayer();
};

Scene_MenuBase.prototype.actor = function () {
  return this._actor;
};

Scene_MenuBase.prototype.updateActor = function () {
  this._actor = $gameParty.menuActor();
};

Scene_MenuBase.prototype.createBackground = function () {
  this._backgroundSprite = new Sprite();
  this._backgroundSprite.bitmap = SceneManager.backgroundBitmap();
  this.addChild(this._backgroundSprite);
};

Scene_MenuBase.prototype.setBackgroundOpacity = function (opacity) {
  this._backgroundSprite.opacity = opacity;
};

Scene_MenuBase.prototype.createHelpWindow = function () {
  this._helpWindow = new Window_Help();
  this.addWindow(this._helpWindow);
};

Scene_MenuBase.prototype.nextActor = function () {
  $gameParty.makeMenuActorNext();
  this.updateActor();
  this.onActorChange();
};

Scene_MenuBase.prototype.previousActor = function () {
  $gameParty.makeMenuActorPrevious();
  this.updateActor();
  this.onActorChange();
};

Scene_MenuBase.prototype.onActorChange = function () {};

//-----------------------------------------------------------------------------
// Scene_Menu
//
// The scene class of the menu screen.

function Scene_Menu() {
  this.initialize.apply(this, arguments);
}

Scene_Menu.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Menu.prototype.constructor = Scene_Menu;

Scene_Menu.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Menu.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createCommandWindow();
  this.createGoldWindow();
  this.createStatusWindow();
};

Scene_Menu.prototype.start = function () {
  Scene_MenuBase.prototype.start.call(this);
  this._statusWindow.refresh();
};

Scene_Menu.prototype.createCommandWindow = function () {
  this._commandWindow = new Window_MenuCommand(0, 0);
  this._commandWindow.setHandler("item", this.commandItem.bind(this));
  this._commandWindow.setHandler("skill", this.commandPersonal.bind(this));
  this._commandWindow.setHandler("equip", this.commandPersonal.bind(this));
  this._commandWindow.setHandler("status", this.commandPersonal.bind(this));
  this._commandWindow.setHandler("formation", this.commandFormation.bind(this));
  this._commandWindow.setHandler("options", this.commandOptions.bind(this));
  this._commandWindow.setHandler("save", this.commandSave.bind(this));
  this._commandWindow.setHandler("gameEnd", this.commandGameEnd.bind(this));
  this._commandWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._commandWindow);
};

Scene_Menu.prototype.createGoldWindow = function () {
  this._goldWindow = new Window_Gold(0, 0);
  this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
  this.addWindow(this._goldWindow);
};

Scene_Menu.prototype.createStatusWindow = function () {
  this._statusWindow = new Window_MenuStatus(this._commandWindow.width, 0);
  this._statusWindow.reserveFaceImages();
  this.addWindow(this._statusWindow);
};

Scene_Menu.prototype.commandItem = function () {
  SceneManager.push(Scene_Item);
};

Scene_Menu.prototype.commandPersonal = function () {
  this._statusWindow.setFormationMode(false);
  this._statusWindow.selectLast();
  this._statusWindow.activate();
  this._statusWindow.setHandler("ok", this.onPersonalOk.bind(this));
  this._statusWindow.setHandler("cancel", this.onPersonalCancel.bind(this));
};

Scene_Menu.prototype.commandFormation = function () {
  this._statusWindow.setFormationMode(true);
  this._statusWindow.selectLast();
  this._statusWindow.activate();
  this._statusWindow.setHandler("ok", this.onFormationOk.bind(this));
  this._statusWindow.setHandler("cancel", this.onFormationCancel.bind(this));
};

Scene_Menu.prototype.commandOptions = function () {
  SceneManager.push(Scene_Options);
};

Scene_Menu.prototype.commandSave = function () {
  SceneManager.push(Scene_Save);
};

Scene_Menu.prototype.commandGameEnd = function () {
  SceneManager.push(Scene_GameEnd);
};

Scene_Menu.prototype.onPersonalOk = function () {
  switch (this._commandWindow.currentSymbol()) {
    case "skill":
      SceneManager.push(Scene_Skill);
      break;
    case "equip":
      SceneManager.push(Scene_Equip);
      break;
    case "status":
      SceneManager.push(Scene_Status);
      break;
  }
};

Scene_Menu.prototype.onPersonalCancel = function () {
  this._statusWindow.deselect();
  this._commandWindow.activate();
};

Scene_Menu.prototype.onFormationOk = function () {
  var index = this._statusWindow.index();
  var actor = $gameParty.members()[index];
  var pendingIndex = this._statusWindow.pendingIndex();
  if (pendingIndex >= 0) {
    $gameParty.swapOrder(index, pendingIndex);
    this._statusWindow.setPendingIndex(-1);
    this._statusWindow.redrawItem(index);
  } else {
    this._statusWindow.setPendingIndex(index);
  }
  this._statusWindow.activate();
};

Scene_Menu.prototype.onFormationCancel = function () {
  if (this._statusWindow.pendingIndex() >= 0) {
    this._statusWindow.setPendingIndex(-1);
    this._statusWindow.activate();
  } else {
    this._statusWindow.deselect();
    this._commandWindow.activate();
  }
};

//-----------------------------------------------------------------------------
// Scene_ItemBase
//
// The superclass of Scene_Item and Scene_Skill.

function Scene_ItemBase() {
  this.initialize.apply(this, arguments);
}

Scene_ItemBase.prototype = Object.create(Scene_MenuBase.prototype);
Scene_ItemBase.prototype.constructor = Scene_ItemBase;

Scene_ItemBase.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_ItemBase.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
};

Scene_ItemBase.prototype.createActorWindow = function () {
  this._actorWindow = new Window_MenuActor();
  this._actorWindow.setHandler("ok", this.onActorOk.bind(this));
  this._actorWindow.setHandler("cancel", this.onActorCancel.bind(this));
  this.addWindow(this._actorWindow);
};

Scene_ItemBase.prototype.item = function () {
  return this._itemWindow.item();
};

Scene_ItemBase.prototype.user = function () {
  return null;
};

Scene_ItemBase.prototype.isCursorLeft = function () {
  return this._itemWindow.index() % 2 === 0;
};

Scene_ItemBase.prototype.showSubWindow = function (window) {
  window.x = this.isCursorLeft() ? Graphics.boxWidth - window.width : 0;
  window.show();
  window.activate();
};

Scene_ItemBase.prototype.hideSubWindow = function (window) {
  window.hide();
  window.deactivate();
  this.activateItemWindow();
};

Scene_ItemBase.prototype.onActorOk = function () {
  if (this.canUse()) {
    this.useItem();
  } else {
    SoundManager.playBuzzer();
  }
};

Scene_ItemBase.prototype.onActorCancel = function () {
  this.hideSubWindow(this._actorWindow);
};

Scene_ItemBase.prototype.determineItem = function () {
  var action = new Game_Action(this.user());
  var item = this.item();
  action.setItemObject(item);
  if (action.isForFriend()) {
    this.showSubWindow(this._actorWindow);
    this._actorWindow.selectForItem(this.item());
  } else {
    this.useItem();
    this.activateItemWindow();
  }
};

Scene_ItemBase.prototype.useItem = function () {
  this.playSeForItem();
  this.user().useItem(this.item());
  this.applyItem();
  this.checkCommonEvent();
  this.checkGameover();
  this._actorWindow.refresh();
};

Scene_ItemBase.prototype.activateItemWindow = function () {
  this._itemWindow.refresh();
  this._itemWindow.activate();
};

Scene_ItemBase.prototype.itemTargetActors = function () {
  var action = new Game_Action(this.user());
  action.setItemObject(this.item());
  if (!action.isForFriend()) {
    return [];
  } else if (action.isForAll()) {
    return $gameParty.members();
  } else {
    return [$gameParty.members()[this._actorWindow.index()]];
  }
};

Scene_ItemBase.prototype.canUse = function () {
  return this.user().canUse(this.item()) && this.isItemEffectsValid();
};

Scene_ItemBase.prototype.isItemEffectsValid = function () {
  var action = new Game_Action(this.user());
  action.setItemObject(this.item());
  return this.itemTargetActors().some(function (target) {
    return action.testApply(target);
  }, this);
};

Scene_ItemBase.prototype.applyItem = function () {
  var action = new Game_Action(this.user());
  action.setItemObject(this.item());
  this.itemTargetActors().forEach(function (target) {
    for (var i = 0; i < action.numRepeats(); i++) {
      action.apply(target);
    }
  }, this);
  action.applyGlobal();
};

Scene_ItemBase.prototype.checkCommonEvent = function () {
  if ($gameTemp.isCommonEventReserved()) {
    SceneManager.goto(Scene_Map);
  }
};

//-----------------------------------------------------------------------------
// Scene_Item
//
// The scene class of the item screen.

function Scene_Item() {
  this.initialize.apply(this, arguments);
}

Scene_Item.prototype = Object.create(Scene_ItemBase.prototype);
Scene_Item.prototype.constructor = Scene_Item;

Scene_Item.prototype.initialize = function () {
  Scene_ItemBase.prototype.initialize.call(this);
};

Scene_Item.prototype.create = function () {
  Scene_ItemBase.prototype.create.call(this);
  this.createHelpWindow();
  this.createCategoryWindow();
  this.createItemWindow();
  this.createActorWindow();
};

Scene_Item.prototype.createCategoryWindow = function () {
  this._categoryWindow = new Window_ItemCategory();
  this._categoryWindow.setHelpWindow(this._helpWindow);
  this._categoryWindow.y = this._helpWindow.height;
  this._categoryWindow.setHandler("ok", this.onCategoryOk.bind(this));
  this._categoryWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._categoryWindow);
};

Scene_Item.prototype.createItemWindow = function () {
  var wy = this._categoryWindow.y + this._categoryWindow.height;
  var wh = Graphics.boxHeight - wy;
  this._itemWindow = new Window_ItemList(0, wy, Graphics.boxWidth, wh);
  this._itemWindow.setHelpWindow(this._helpWindow);
  this._itemWindow.setHandler("ok", this.onItemOk.bind(this));
  this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
  this.addWindow(this._itemWindow);
  this._categoryWindow.setItemWindow(this._itemWindow);
};

Scene_Item.prototype.user = function () {
  var members = $gameParty.movableMembers();
  var bestActor = members[0];
  var bestPha = 0;
  for (var i = 0; i < members.length; i++) {
    if (members[i].pha > bestPha) {
      bestPha = members[i].pha;
      bestActor = members[i];
    }
  }
  return bestActor;
};

Scene_Item.prototype.onCategoryOk = function () {
  this._itemWindow.activate();
  this._itemWindow.selectLast();
};

Scene_Item.prototype.onItemOk = function () {
  $gameParty.setLastItem(this.item());
  this.determineItem();
};

Scene_Item.prototype.onItemCancel = function () {
  this._itemWindow.deselect();
  this._categoryWindow.activate();
};

Scene_Item.prototype.playSeForItem = function () {
  SoundManager.playUseItem();
};

Scene_Item.prototype.useItem = function () {
  Scene_ItemBase.prototype.useItem.call(this);
  this._itemWindow.redrawCurrentItem();
};

//-----------------------------------------------------------------------------
// Scene_Skill
//
// The scene class of the skill screen.

function Scene_Skill() {
  this.initialize.apply(this, arguments);
}

Scene_Skill.prototype = Object.create(Scene_ItemBase.prototype);
Scene_Skill.prototype.constructor = Scene_Skill;

Scene_Skill.prototype.initialize = function () {
  Scene_ItemBase.prototype.initialize.call(this);
};

Scene_Skill.prototype.create = function () {
  Scene_ItemBase.prototype.create.call(this);
  this.createHelpWindow();
  this.createSkillTypeWindow();
  this.createStatusWindow();
  this.createItemWindow();
  this.createActorWindow();
};

Scene_Skill.prototype.start = function () {
  Scene_ItemBase.prototype.start.call(this);
  this.refreshActor();
};

Scene_Skill.prototype.createSkillTypeWindow = function () {
  var wy = this._helpWindow.height;
  this._skillTypeWindow = new Window_SkillType(0, wy);
  this._skillTypeWindow.setHelpWindow(this._helpWindow);
  this._skillTypeWindow.setHandler("skill", this.commandSkill.bind(this));
  this._skillTypeWindow.setHandler("cancel", this.popScene.bind(this));
  this._skillTypeWindow.setHandler("pagedown", this.nextActor.bind(this));
  this._skillTypeWindow.setHandler("pageup", this.previousActor.bind(this));
  this.addWindow(this._skillTypeWindow);
};

Scene_Skill.prototype.createStatusWindow = function () {
  var wx = this._skillTypeWindow.width;
  var wy = this._helpWindow.height;
  var ww = Graphics.boxWidth - wx;
  var wh = this._skillTypeWindow.height;
  this._statusWindow = new Window_SkillStatus(wx, wy, ww, wh);
  this._statusWindow.reserveFaceImages();
  this.addWindow(this._statusWindow);
};

Scene_Skill.prototype.createItemWindow = function () {
  var wx = 0;
  var wy = this._statusWindow.y + this._statusWindow.height;
  var ww = Graphics.boxWidth;
  var wh = Graphics.boxHeight - wy;
  this._itemWindow = new Window_SkillList(wx, wy, ww, wh);
  this._itemWindow.setHelpWindow(this._helpWindow);
  this._itemWindow.setHandler("ok", this.onItemOk.bind(this));
  this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
  this._skillTypeWindow.setSkillWindow(this._itemWindow);
  this.addWindow(this._itemWindow);
};

Scene_Skill.prototype.refreshActor = function () {
  var actor = this.actor();
  this._skillTypeWindow.setActor(actor);
  this._statusWindow.setActor(actor);
  this._itemWindow.setActor(actor);
};

Scene_Skill.prototype.user = function () {
  return this.actor();
};

Scene_Skill.prototype.commandSkill = function () {
  this._itemWindow.activate();
  this._itemWindow.selectLast();
};

Scene_Skill.prototype.onItemOk = function () {
  this.actor().setLastMenuSkill(this.item());
  this.determineItem();
};

Scene_Skill.prototype.onItemCancel = function () {
  this._itemWindow.deselect();
  this._skillTypeWindow.activate();
};

Scene_Skill.prototype.playSeForItem = function () {
  SoundManager.playUseSkill();
};

Scene_Skill.prototype.useItem = function () {
  Scene_ItemBase.prototype.useItem.call(this);
  this._statusWindow.refresh();
  this._itemWindow.refresh();
};

Scene_Skill.prototype.onActorChange = function () {
  this.refreshActor();
  this._skillTypeWindow.activate();
};

//-----------------------------------------------------------------------------
// Scene_Equip
//
// The scene class of the equipment screen.

function Scene_Equip() {
  this.initialize.apply(this, arguments);
}

Scene_Equip.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Equip.prototype.constructor = Scene_Equip;

Scene_Equip.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Equip.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createHelpWindow();
  this.createStatusWindow();
  this.createCommandWindow();
  this.createSlotWindow();
  this.createItemWindow();
  this.refreshActor();
};

Scene_Equip.prototype.createStatusWindow = function () {
  this._statusWindow = new Window_EquipStatus(0, this._helpWindow.height);
  this.addWindow(this._statusWindow);
};

Scene_Equip.prototype.createCommandWindow = function () {
  var wx = this._statusWindow.width;
  var wy = this._helpWindow.height;
  var ww = Graphics.boxWidth - this._statusWindow.width;
  this._commandWindow = new Window_EquipCommand(wx, wy, ww);
  this._commandWindow.setHelpWindow(this._helpWindow);
  this._commandWindow.setHandler("equip", this.commandEquip.bind(this));
  this._commandWindow.setHandler("optimize", this.commandOptimize.bind(this));
  this._commandWindow.setHandler("clear", this.commandClear.bind(this));
  this._commandWindow.setHandler("cancel", this.popScene.bind(this));
  this._commandWindow.setHandler("pagedown", this.nextActor.bind(this));
  this._commandWindow.setHandler("pageup", this.previousActor.bind(this));
  this.addWindow(this._commandWindow);
};

Scene_Equip.prototype.createSlotWindow = function () {
  var wx = this._statusWindow.width;
  var wy = this._commandWindow.y + this._commandWindow.height;
  var ww = Graphics.boxWidth - this._statusWindow.width;
  var wh = this._statusWindow.height - this._commandWindow.height;
  this._slotWindow = new Window_EquipSlot(wx, wy, ww, wh);
  this._slotWindow.setHelpWindow(this._helpWindow);
  this._slotWindow.setStatusWindow(this._statusWindow);
  this._slotWindow.setHandler("ok", this.onSlotOk.bind(this));
  this._slotWindow.setHandler("cancel", this.onSlotCancel.bind(this));
  this.addWindow(this._slotWindow);
};

Scene_Equip.prototype.createItemWindow = function () {
  var wx = 0;
  var wy = this._statusWindow.y + this._statusWindow.height;
  var ww = Graphics.boxWidth;
  var wh = Graphics.boxHeight - wy;
  this._itemWindow = new Window_EquipItem(wx, wy, ww, wh);
  this._itemWindow.setHelpWindow(this._helpWindow);
  this._itemWindow.setStatusWindow(this._statusWindow);
  this._itemWindow.setHandler("ok", this.onItemOk.bind(this));
  this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
  this._slotWindow.setItemWindow(this._itemWindow);
  this.addWindow(this._itemWindow);
};

Scene_Equip.prototype.refreshActor = function () {
  var actor = this.actor();
  this._statusWindow.setActor(actor);
  this._slotWindow.setActor(actor);
  this._itemWindow.setActor(actor);
};

Scene_Equip.prototype.commandEquip = function () {
  this._slotWindow.activate();
  this._slotWindow.select(0);
};

Scene_Equip.prototype.commandOptimize = function () {
  SoundManager.playEquip();
  this.actor().optimizeEquipments();
  this._statusWindow.refresh();
  this._slotWindow.refresh();
  this._commandWindow.activate();
};

Scene_Equip.prototype.commandClear = function () {
  SoundManager.playEquip();
  this.actor().clearEquipments();
  this._statusWindow.refresh();
  this._slotWindow.refresh();
  this._commandWindow.activate();
};

Scene_Equip.prototype.onSlotOk = function () {
  this._itemWindow.activate();
  this._itemWindow.select(0);
};

Scene_Equip.prototype.onSlotCancel = function () {
  this._slotWindow.deselect();
  this._commandWindow.activate();
};

Scene_Equip.prototype.onItemOk = function () {
  SoundManager.playEquip();
  this.actor().changeEquip(this._slotWindow.index(), this._itemWindow.item());
  this._slotWindow.activate();
  this._slotWindow.refresh();
  this._itemWindow.deselect();
  this._itemWindow.refresh();
  this._statusWindow.refresh();
};

Scene_Equip.prototype.onItemCancel = function () {
  this._slotWindow.activate();
  this._itemWindow.deselect();
};

Scene_Equip.prototype.onActorChange = function () {
  this.refreshActor();
  this._commandWindow.activate();
};

//-----------------------------------------------------------------------------
// Scene_Status
//
// The scene class of the status screen.

function Scene_Status() {
  this.initialize.apply(this, arguments);
}

Scene_Status.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Status.prototype.constructor = Scene_Status;

Scene_Status.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Status.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this._statusWindow = new Window_Status();
  this._statusWindow.setHandler("cancel", this.popScene.bind(this));
  this._statusWindow.setHandler("pagedown", this.nextActor.bind(this));
  this._statusWindow.setHandler("pageup", this.previousActor.bind(this));
  this._statusWindow.reserveFaceImages();
  this.addWindow(this._statusWindow);
};

Scene_Status.prototype.start = function () {
  Scene_MenuBase.prototype.start.call(this);
  this.refreshActor();
};

Scene_Status.prototype.refreshActor = function () {
  var actor = this.actor();
  this._statusWindow.setActor(actor);
};

Scene_Status.prototype.onActorChange = function () {
  this.refreshActor();
  this._statusWindow.activate();
};

//-----------------------------------------------------------------------------
// Scene_Options
//
// The scene class of the options screen.

function Scene_Options() {
  this.initialize.apply(this, arguments);
}

Scene_Options.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Options.prototype.constructor = Scene_Options;

Scene_Options.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Options.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createOptionsWindow();
};

Scene_Options.prototype.terminate = function () {
  Scene_MenuBase.prototype.terminate.call(this);
  ConfigManager.save();
};

Scene_Options.prototype.createOptionsWindow = function () {
  this._optionsWindow = new Window_Options();
  this._optionsWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._optionsWindow);
};

//-----------------------------------------------------------------------------
// Scene_File
//
// The superclass of Scene_Save and Scene_Load.

function Scene_File() {
  this.initialize.apply(this, arguments);
}

Scene_File.prototype = Object.create(Scene_MenuBase.prototype);
Scene_File.prototype.constructor = Scene_File;

Scene_File.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_File.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  DataManager.loadAllSavefileImages();
  this.createHelpWindow();
  this.createListWindow();
};

Scene_File.prototype.start = function () {
  Scene_MenuBase.prototype.start.call(this);
  this._listWindow.refresh();
};

Scene_File.prototype.savefileId = function () {
  return this._listWindow.index() + 1;
};

Scene_File.prototype.createHelpWindow = function () {
  this._helpWindow = new Window_Help(1);
  this._helpWindow.setText(this.helpWindowText());
  this.addWindow(this._helpWindow);
};

Scene_File.prototype.createListWindow = function () {
  var x = 0;
  var y = this._helpWindow.height;
  var width = Graphics.boxWidth;
  var height = Graphics.boxHeight - y;
  this._listWindow = new Window_SavefileList(x, y, width, height);
  this._listWindow.setHandler("ok", this.onSavefileOk.bind(this));
  this._listWindow.setHandler("cancel", this.popScene.bind(this));
  this._listWindow.select(this.firstSavefileIndex());
  this._listWindow.setTopRow(this.firstSavefileIndex() - 2);
  this._listWindow.setMode(this.mode());
  this._listWindow.refresh();
  this.addWindow(this._listWindow);
};

Scene_File.prototype.mode = function () {
  return null;
};

Scene_File.prototype.activateListWindow = function () {
  this._listWindow.activate();
};

Scene_File.prototype.helpWindowText = function () {
  return "";
};

Scene_File.prototype.firstSavefileIndex = function () {
  return 0;
};

Scene_File.prototype.onSavefileOk = function () {};

//-----------------------------------------------------------------------------
// Scene_Save
//
// The scene class of the save screen.

function Scene_Save() {
  this.initialize.apply(this, arguments);
}

Scene_Save.prototype = Object.create(Scene_File.prototype);
Scene_Save.prototype.constructor = Scene_Save;

Scene_Save.prototype.initialize = function () {
  Scene_File.prototype.initialize.call(this);
};

Scene_Save.prototype.mode = function () {
  return "save";
};

Scene_Save.prototype.helpWindowText = function () {
  return TextManager.saveMessage;
};

Scene_Save.prototype.firstSavefileIndex = function () {
  return DataManager.lastAccessedSavefileId() - 1;
};

Scene_Save.prototype.onSavefileOk = function () {
  Scene_File.prototype.onSavefileOk.call(this);
  $gameSystem.onBeforeSave();
  if (DataManager.saveGame(this.savefileId())) {
    this.onSaveSuccess();
  } else {
    this.onSaveFailure();
  }
};

Scene_Save.prototype.onSaveSuccess = function () {
  SoundManager.playSave();
  StorageManager.cleanBackup(this.savefileId());
  this.popScene();
};

Scene_Save.prototype.onSaveFailure = function () {
  SoundManager.playBuzzer();
  this.activateListWindow();
};

//-----------------------------------------------------------------------------
// Scene_Load
//
// The scene class of the load screen.

function Scene_Load() {
  this.initialize.apply(this, arguments);
}

Scene_Load.prototype = Object.create(Scene_File.prototype);
Scene_Load.prototype.constructor = Scene_Load;

Scene_Load.prototype.initialize = function () {
  Scene_File.prototype.initialize.call(this);
  this._loadSuccess = false;
};

Scene_Load.prototype.terminate = function () {
  Scene_File.prototype.terminate.call(this);
  if (this._loadSuccess) {
    $gameSystem.onAfterLoad();
  }
};

Scene_Load.prototype.mode = function () {
  return "load";
};

Scene_Load.prototype.helpWindowText = function () {
  return TextManager.loadMessage;
};

Scene_Load.prototype.firstSavefileIndex = function () {
  return DataManager.latestSavefileId() - 1;
};

Scene_Load.prototype.onSavefileOk = function () {
  Scene_File.prototype.onSavefileOk.call(this);
  if (DataManager.loadGame(this.savefileId())) {
    this.onLoadSuccess();
  } else {
    this.onLoadFailure();
  }
};

Scene_Load.prototype.onLoadSuccess = function () {
  SoundManager.playLoad();
  this.fadeOutAll();
  this.reloadMapIfUpdated();
  SceneManager.goto(Scene_Map);
  this._loadSuccess = true;
};

Scene_Load.prototype.onLoadFailure = function () {
  SoundManager.playBuzzer();
  this.activateListWindow();
};

Scene_Load.prototype.reloadMapIfUpdated = function () {
  if ($gameSystem.versionId() !== $dataSystem.versionId) {
    $gamePlayer.reserveTransfer($gameMap.mapId(), $gamePlayer.x, $gamePlayer.y);
    $gamePlayer.requestMapReload();
  }
};

//-----------------------------------------------------------------------------
// Scene_GameEnd
//
// The scene class of the game end screen.

function Scene_GameEnd() {
  this.initialize.apply(this, arguments);
}

Scene_GameEnd.prototype = Object.create(Scene_MenuBase.prototype);
Scene_GameEnd.prototype.constructor = Scene_GameEnd;

Scene_GameEnd.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_GameEnd.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createCommandWindow();
};

Scene_GameEnd.prototype.stop = function () {
  Scene_MenuBase.prototype.stop.call(this);
  this._commandWindow.close();
};

Scene_GameEnd.prototype.createBackground = function () {
  Scene_MenuBase.prototype.createBackground.call(this);
  this.setBackgroundOpacity(128);
};

Scene_GameEnd.prototype.createCommandWindow = function () {
  this._commandWindow = new Window_GameEnd();
  this._commandWindow.setHandler("toTitle", this.commandToTitle.bind(this));
  this._commandWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._commandWindow);
};

Scene_GameEnd.prototype.commandToTitle = function () {
  this.fadeOutAll();
  SceneManager.goto(Scene_Title);
};

//-----------------------------------------------------------------------------
// Scene_Shop
//
// The scene class of the shop screen.

function Scene_Shop() {
  this.initialize.apply(this, arguments);
}

Scene_Shop.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Shop.prototype.constructor = Scene_Shop;

Scene_Shop.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Shop.prototype.prepare = function (goods, purchaseOnly) {
  this._goods = goods;
  this._purchaseOnly = purchaseOnly;
  this._item = null;
};

Scene_Shop.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createHelpWindow();
  this.createGoldWindow();
  this.createCommandWindow();
  this.createDummyWindow();
  this.createNumberWindow();
  this.createStatusWindow();
  this.createBuyWindow();
  this.createCategoryWindow();
  this.createSellWindow();
};

Scene_Shop.prototype.createGoldWindow = function () {
  this._goldWindow = new Window_Gold(0, this._helpWindow.height);
  this._goldWindow.x = Graphics.boxWidth - this._goldWindow.width;
  this.addWindow(this._goldWindow);
};

Scene_Shop.prototype.createCommandWindow = function () {
  this._commandWindow = new Window_ShopCommand(
    this._goldWindow.x,
    this._purchaseOnly
  );
  this._commandWindow.y = this._helpWindow.height;
  this._commandWindow.setHandler("buy", this.commandBuy.bind(this));
  this._commandWindow.setHandler("sell", this.commandSell.bind(this));
  this._commandWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._commandWindow);
};

Scene_Shop.prototype.createDummyWindow = function () {
  var wy = this._commandWindow.y + this._commandWindow.height;
  var wh = Graphics.boxHeight - wy;
  this._dummyWindow = new Window_Base(0, wy, Graphics.boxWidth, wh);
  this.addWindow(this._dummyWindow);
};

Scene_Shop.prototype.createNumberWindow = function () {
  var wy = this._dummyWindow.y;
  var wh = this._dummyWindow.height;
  this._numberWindow = new Window_ShopNumber(0, wy, wh);
  this._numberWindow.hide();
  this._numberWindow.setHandler("ok", this.onNumberOk.bind(this));
  this._numberWindow.setHandler("cancel", this.onNumberCancel.bind(this));
  this.addWindow(this._numberWindow);
};

Scene_Shop.prototype.createStatusWindow = function () {
  var wx = this._numberWindow.width;
  var wy = this._dummyWindow.y;
  var ww = Graphics.boxWidth - wx;
  var wh = this._dummyWindow.height;
  this._statusWindow = new Window_ShopStatus(wx, wy, ww, wh);
  this._statusWindow.hide();
  this.addWindow(this._statusWindow);
};

Scene_Shop.prototype.createBuyWindow = function () {
  var wy = this._dummyWindow.y;
  var wh = this._dummyWindow.height;
  this._buyWindow = new Window_ShopBuy(0, wy, wh, this._goods);
  this._buyWindow.setHelpWindow(this._helpWindow);
  this._buyWindow.setStatusWindow(this._statusWindow);
  this._buyWindow.hide();
  this._buyWindow.setHandler("ok", this.onBuyOk.bind(this));
  this._buyWindow.setHandler("cancel", this.onBuyCancel.bind(this));
  this.addWindow(this._buyWindow);
};

Scene_Shop.prototype.createCategoryWindow = function () {
  this._categoryWindow = new Window_ItemCategory();
  this._categoryWindow.setHelpWindow(this._helpWindow);
  this._categoryWindow.y = this._dummyWindow.y;
  this._categoryWindow.hide();
  this._categoryWindow.deactivate();
  this._categoryWindow.setHandler("ok", this.onCategoryOk.bind(this));
  this._categoryWindow.setHandler("cancel", this.onCategoryCancel.bind(this));
  this.addWindow(this._categoryWindow);
};

Scene_Shop.prototype.createSellWindow = function () {
  var wy = this._categoryWindow.y + this._categoryWindow.height;
  var wh = Graphics.boxHeight - wy;
  this._sellWindow = new Window_ShopSell(0, wy, Graphics.boxWidth, wh);
  this._sellWindow.setHelpWindow(this._helpWindow);
  this._sellWindow.hide();
  this._sellWindow.setHandler("ok", this.onSellOk.bind(this));
  this._sellWindow.setHandler("cancel", this.onSellCancel.bind(this));
  this._categoryWindow.setItemWindow(this._sellWindow);
  this.addWindow(this._sellWindow);
};

Scene_Shop.prototype.activateBuyWindow = function () {
  this._buyWindow.setMoney(this.money());
  this._buyWindow.show();
  this._buyWindow.activate();
  this._statusWindow.show();
};

Scene_Shop.prototype.activateSellWindow = function () {
  this._categoryWindow.show();
  this._sellWindow.refresh();
  this._sellWindow.show();
  this._sellWindow.activate();
  this._statusWindow.hide();
};

Scene_Shop.prototype.commandBuy = function () {
  this._dummyWindow.hide();
  this.activateBuyWindow();
};

Scene_Shop.prototype.commandSell = function () {
  this._dummyWindow.hide();
  this._categoryWindow.show();
  this._categoryWindow.activate();
  this._sellWindow.show();
  this._sellWindow.deselect();
  this._sellWindow.refresh();
};

Scene_Shop.prototype.onBuyOk = function () {
  this._item = this._buyWindow.item();
  this._buyWindow.hide();
  this._numberWindow.setup(this._item, this.maxBuy(), this.buyingPrice());
  this._numberWindow.setCurrencyUnit(this.currencyUnit());
  this._numberWindow.show();
  this._numberWindow.activate();
};

Scene_Shop.prototype.onBuyCancel = function () {
  this._commandWindow.activate();
  this._dummyWindow.show();
  this._buyWindow.hide();
  this._statusWindow.hide();
  this._statusWindow.setItem(null);
  this._helpWindow.clear();
};

Scene_Shop.prototype.onCategoryOk = function () {
  this.activateSellWindow();
  this._sellWindow.select(0);
};

Scene_Shop.prototype.onCategoryCancel = function () {
  this._commandWindow.activate();
  this._dummyWindow.show();
  this._categoryWindow.hide();
  this._sellWindow.hide();
};

Scene_Shop.prototype.onSellOk = function () {
  this._item = this._sellWindow.item();
  this._categoryWindow.hide();
  this._sellWindow.hide();
  this._numberWindow.setup(this._item, this.maxSell(), this.sellingPrice());
  this._numberWindow.setCurrencyUnit(this.currencyUnit());
  this._numberWindow.show();
  this._numberWindow.activate();
  this._statusWindow.setItem(this._item);
  this._statusWindow.show();
};

Scene_Shop.prototype.onSellCancel = function () {
  this._sellWindow.deselect();
  this._categoryWindow.activate();
  this._statusWindow.setItem(null);
  this._helpWindow.clear();
};

Scene_Shop.prototype.onNumberOk = function () {
  SoundManager.playShop();
  switch (this._commandWindow.currentSymbol()) {
    case "buy":
      this.doBuy(this._numberWindow.number());
      break;
    case "sell":
      this.doSell(this._numberWindow.number());
      break;
  }
  this.endNumberInput();
  this._goldWindow.refresh();
  this._statusWindow.refresh();
};

Scene_Shop.prototype.onNumberCancel = function () {
  SoundManager.playCancel();
  this.endNumberInput();
};

Scene_Shop.prototype.doBuy = function (number) {
  $gameParty.loseGold(number * this.buyingPrice());
  $gameParty.gainItem(this._item, number);
};

Scene_Shop.prototype.doSell = function (number) {
  $gameParty.gainGold(number * this.sellingPrice());
  $gameParty.loseItem(this._item, number);
};

Scene_Shop.prototype.endNumberInput = function () {
  this._numberWindow.hide();
  switch (this._commandWindow.currentSymbol()) {
    case "buy":
      this.activateBuyWindow();
      break;
    case "sell":
      this.activateSellWindow();
      break;
  }
};

Scene_Shop.prototype.maxBuy = function () {
  var max = $gameParty.maxItems(this._item) - $gameParty.numItems(this._item);
  var price = this.buyingPrice();
  if (price > 0) {
    return Math.min(max, Math.floor(this.money() / price));
  } else {
    return max;
  }
};

Scene_Shop.prototype.maxSell = function () {
  return $gameParty.numItems(this._item);
};

Scene_Shop.prototype.money = function () {
  return this._goldWindow.value();
};

Scene_Shop.prototype.currencyUnit = function () {
  return this._goldWindow.currencyUnit();
};

Scene_Shop.prototype.buyingPrice = function () {
  return this._buyWindow.price(this._item);
};

Scene_Shop.prototype.sellingPrice = function () {
  return Math.floor(this._item.price / 2);
};

//-----------------------------------------------------------------------------
// Scene_Name
//
// The scene class of the name input screen.

function Scene_Name() {
  this.initialize.apply(this, arguments);
}

Scene_Name.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Name.prototype.constructor = Scene_Name;

Scene_Name.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Name.prototype.prepare = function (actorId, maxLength) {
  this._actorId = actorId;
  this._maxLength = maxLength;
};

Scene_Name.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this._actor = $gameActors.actor(this._actorId);
  this.createEditWindow();
  this.createInputWindow();
};

Scene_Name.prototype.start = function () {
  Scene_MenuBase.prototype.start.call(this);
  this._editWindow.refresh();
};

Scene_Name.prototype.createEditWindow = function () {
  this._editWindow = new Window_NameEdit(this._actor, this._maxLength);
  this.addWindow(this._editWindow);
};

Scene_Name.prototype.createInputWindow = function () {
  this._inputWindow = new Window_NameInput(this._editWindow);
  this._inputWindow.setHandler("ok", this.onInputOk.bind(this));
  this.addWindow(this._inputWindow);
};

Scene_Name.prototype.onInputOk = function () {
  this._actor.setName(this._editWindow.name());
  this.popScene();
};

//-----------------------------------------------------------------------------
// Scene_Debug
//
// The scene class of the debug screen.

function Scene_Debug() {
  this.initialize.apply(this, arguments);
}

Scene_Debug.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Debug.prototype.constructor = Scene_Debug;

Scene_Debug.prototype.initialize = function () {
  Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Debug.prototype.create = function () {
  Scene_MenuBase.prototype.create.call(this);
  this.createRangeWindow();
  this.createEditWindow();
  this.createDebugHelpWindow();
};

Scene_Debug.prototype.createRangeWindow = function () {
  this._rangeWindow = new Window_DebugRange(0, 0);
  this._rangeWindow.setHandler("ok", this.onRangeOk.bind(this));
  this._rangeWindow.setHandler("cancel", this.popScene.bind(this));
  this.addWindow(this._rangeWindow);
};

Scene_Debug.prototype.createEditWindow = function () {
  var wx = this._rangeWindow.width;
  var ww = Graphics.boxWidth - wx;
  this._editWindow = new Window_DebugEdit(wx, 0, ww);
  this._editWindow.setHandler("cancel", this.onEditCancel.bind(this));
  this._rangeWindow.setEditWindow(this._editWindow);
  this.addWindow(this._editWindow);
};

Scene_Debug.prototype.createDebugHelpWindow = function () {
  var wx = this._editWindow.x;
  var wy = this._editWindow.height;
  var ww = this._editWindow.width;
  var wh = Graphics.boxHeight - wy;
  this._debugHelpWindow = new Window_Base(wx, wy, ww, wh);
  this.addWindow(this._debugHelpWindow);
};

Scene_Debug.prototype.onRangeOk = function () {
  this._editWindow.activate();
  this._editWindow.select(0);
  this.refreshHelpWindow();
};

Scene_Debug.prototype.onEditCancel = function () {
  this._rangeWindow.activate();
  this._editWindow.deselect();
  this.refreshHelpWindow();
};

Scene_Debug.prototype.refreshHelpWindow = function () {
  this._debugHelpWindow.contents.clear();
  if (this._editWindow.active) {
    this._debugHelpWindow.drawTextEx(this.helpText(), 4, 0);
  }
};

Scene_Debug.prototype.helpText = function () {
  if (this._rangeWindow.mode() === "switch") {
    return "Enter : ON / OFF";
  } else {
    return (
      "Left     :  -1\n" +
      "Right    :  +1\n" +
      "Pageup   : -10\n" +
      "Pagedown : +10"
    );
  }
};

//-----------------------------------------------------------------------------
// Scene_Battle
//
// The scene class of the battle screen.

function Scene_Battle() {
  this.initialize.apply(this, arguments);
}

Scene_Battle.prototype = Object.create(Scene_Base.prototype);
Scene_Battle.prototype.constructor = Scene_Battle;

Scene_Battle.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
};

Scene_Battle.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  this.createDisplayObjects();
};

Scene_Battle.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
  this.startFadeIn(this.fadeSpeed(), false);
  BattleManager.playBattleBgm();
  BattleManager.startBattle();
};

Scene_Battle.prototype.update = function () {
  var active = this.isActive();
  $gameTimer.update(active);
  $gameScreen.update();
  this.updateStatusWindow();
  this.updateWindowPositions();
  if (active && !this.isBusy()) {
    this.updateBattleProcess();
  }
  Scene_Base.prototype.update.call(this);
};

Scene_Battle.prototype.updateBattleProcess = function () {
  if (
    !this.isAnyInputWindowActive() ||
    BattleManager.isAborting() ||
    BattleManager.isBattleEnd()
  ) {
    BattleManager.update();
    this.changeInputWindow();
  }
};

Scene_Battle.prototype.isAnyInputWindowActive = function () {
  return (
    this._partyCommandWindow.active ||
    this._actorCommandWindow.active ||
    this._skillWindow.active ||
    this._itemWindow.active ||
    this._actorWindow.active ||
    this._enemyWindow.active
  );
};

Scene_Battle.prototype.changeInputWindow = function () {
  if (BattleManager.isInputting()) {
    if (BattleManager.actor()) {
      this.startActorCommandSelection();
    } else {
      this.startPartyCommandSelection();
    }
  } else {
    this.endCommandSelection();
  }
};

Scene_Battle.prototype.stop = function () {
  Scene_Base.prototype.stop.call(this);
  if (this.needsSlowFadeOut()) {
    this.startFadeOut(this.slowFadeSpeed(), false);
  } else {
    this.startFadeOut(this.fadeSpeed(), false);
  }
  this._statusWindow.close();
  this._partyCommandWindow.close();
  this._actorCommandWindow.close();
};

Scene_Battle.prototype.terminate = function () {
  Scene_Base.prototype.terminate.call(this);
  $gameParty.onBattleEnd();
  $gameTroop.onBattleEnd();
  AudioManager.stopMe();

  ImageManager.clearRequest();
};

Scene_Battle.prototype.needsSlowFadeOut = function () {
  return (
    SceneManager.isNextScene(Scene_Title) ||
    SceneManager.isNextScene(Scene_Gameover)
  );
};

Scene_Battle.prototype.updateStatusWindow = function () {
  if ($gameMessage.isBusy()) {
    this._statusWindow.close();
    this._partyCommandWindow.close();
    this._actorCommandWindow.close();
  } else if (this.isActive() && !this._messageWindow.isClosing()) {
    this._statusWindow.open();
  }
};

Scene_Battle.prototype.updateWindowPositions = function () {
  var statusX = 0;
  if (BattleManager.isInputting()) {
    statusX = this._partyCommandWindow.width;
  } else {
    statusX = this._partyCommandWindow.width / 2;
  }
  if (this._statusWindow.x < statusX) {
    this._statusWindow.x += 16;
    if (this._statusWindow.x > statusX) {
      this._statusWindow.x = statusX;
    }
  }
  if (this._statusWindow.x > statusX) {
    this._statusWindow.x -= 16;
    if (this._statusWindow.x < statusX) {
      this._statusWindow.x = statusX;
    }
  }
};

Scene_Battle.prototype.createDisplayObjects = function () {
  this.createSpriteset();
  this.createWindowLayer();
  this.createAllWindows();
  BattleManager.setLogWindow(this._logWindow);
  BattleManager.setStatusWindow(this._statusWindow);
  BattleManager.setSpriteset(this._spriteset);
  this._logWindow.setSpriteset(this._spriteset);
};

Scene_Battle.prototype.createSpriteset = function () {
  this._spriteset = new Spriteset_Battle();
  this.addChild(this._spriteset);
};

Scene_Battle.prototype.createAllWindows = function () {
  this.createLogWindow();
  this.createStatusWindow();
  this.createPartyCommandWindow();
  this.createActorCommandWindow();
  this.createHelpWindow();
  this.createSkillWindow();
  this.createItemWindow();
  this.createActorWindow();
  this.createEnemyWindow();
  this.createMessageWindow();
  this.createScrollTextWindow();
};

Scene_Battle.prototype.createLogWindow = function () {
  this._logWindow = new Window_BattleLog();
  this.addWindow(this._logWindow);
};

Scene_Battle.prototype.createStatusWindow = function () {
  this._statusWindow = new Window_BattleStatus();
  this.addWindow(this._statusWindow);
};

Scene_Battle.prototype.createPartyCommandWindow = function () {
  this._partyCommandWindow = new Window_PartyCommand();
  this._partyCommandWindow.setHandler("fight", this.commandFight.bind(this));
  this._partyCommandWindow.setHandler("escape", this.commandEscape.bind(this));
  this._partyCommandWindow.deselect();
  this.addWindow(this._partyCommandWindow);
};

Scene_Battle.prototype.createActorCommandWindow = function () {
  this._actorCommandWindow = new Window_ActorCommand();
  this._actorCommandWindow.setHandler("attack", this.commandAttack.bind(this));
  this._actorCommandWindow.setHandler("skill", this.commandSkill.bind(this));
  this._actorCommandWindow.setHandler("guard", this.commandGuard.bind(this));
  this._actorCommandWindow.setHandler("item", this.commandItem.bind(this));
  this._actorCommandWindow.setHandler(
    "cancel",
    this.selectPreviousCommand.bind(this)
  );
  this.addWindow(this._actorCommandWindow);
};

Scene_Battle.prototype.createHelpWindow = function () {
  this._helpWindow = new Window_Help();
  this._helpWindow.visible = false;
  this.addWindow(this._helpWindow);
};

Scene_Battle.prototype.createSkillWindow = function () {
  var wy = this._helpWindow.y + this._helpWindow.height;
  var wh = this._statusWindow.y - wy;
  this._skillWindow = new Window_BattleSkill(0, wy, Graphics.boxWidth, wh);
  this._skillWindow.setHelpWindow(this._helpWindow);
  this._skillWindow.setHandler("ok", this.onSkillOk.bind(this));
  this._skillWindow.setHandler("cancel", this.onSkillCancel.bind(this));
  this.addWindow(this._skillWindow);
};

Scene_Battle.prototype.createItemWindow = function () {
  var wy = this._helpWindow.y + this._helpWindow.height;
  var wh = this._statusWindow.y - wy;
  this._itemWindow = new Window_BattleItem(0, wy, Graphics.boxWidth, wh);
  this._itemWindow.setHelpWindow(this._helpWindow);
  this._itemWindow.setHandler("ok", this.onItemOk.bind(this));
  this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
  this.addWindow(this._itemWindow);
};

Scene_Battle.prototype.createActorWindow = function () {
  this._actorWindow = new Window_BattleActor(0, this._statusWindow.y);
  this._actorWindow.setHandler("ok", this.onActorOk.bind(this));
  this._actorWindow.setHandler("cancel", this.onActorCancel.bind(this));
  this.addWindow(this._actorWindow);
};

Scene_Battle.prototype.createEnemyWindow = function () {
  this._enemyWindow = new Window_BattleEnemy(0, this._statusWindow.y);
  this._enemyWindow.x = Graphics.boxWidth - this._enemyWindow.width;
  this._enemyWindow.setHandler("ok", this.onEnemyOk.bind(this));
  this._enemyWindow.setHandler("cancel", this.onEnemyCancel.bind(this));
  this.addWindow(this._enemyWindow);
};

Scene_Battle.prototype.createMessageWindow = function () {
  this._messageWindow = new Window_Message();
  this.addWindow(this._messageWindow);
  this._messageWindow.subWindows().forEach(function (window) {
    this.addWindow(window);
  }, this);
};

Scene_Battle.prototype.createScrollTextWindow = function () {
  this._scrollTextWindow = new Window_ScrollText();
  this.addWindow(this._scrollTextWindow);
};

Scene_Battle.prototype.refreshStatus = function () {
  this._statusWindow.refresh();
};

Scene_Battle.prototype.startPartyCommandSelection = function () {
  this.refreshStatus();
  this._statusWindow.deselect();
  this._statusWindow.open();
  this._actorCommandWindow.close();
  this._partyCommandWindow.setup();
};

Scene_Battle.prototype.commandFight = function () {
  this.selectNextCommand();
};

Scene_Battle.prototype.commandEscape = function () {
  BattleManager.processEscape();
  this.changeInputWindow();
};

Scene_Battle.prototype.startActorCommandSelection = function () {
  this._statusWindow.select(BattleManager.actor().index());
  this._partyCommandWindow.close();
  this._actorCommandWindow.setup(BattleManager.actor());
};

Scene_Battle.prototype.commandAttack = function () {
  BattleManager.inputtingAction().setAttack();
  this.selectEnemySelection();
};

Scene_Battle.prototype.commandSkill = function () {
  this._skillWindow.setActor(BattleManager.actor());
  this._skillWindow.setStypeId(this._actorCommandWindow.currentExt());
  this._skillWindow.refresh();
  this._skillWindow.show();
  this._skillWindow.activate();
};

Scene_Battle.prototype.commandGuard = function () {
  BattleManager.inputtingAction().setGuard();
  this.selectNextCommand();
};

Scene_Battle.prototype.commandItem = function () {
  this._itemWindow.refresh();
  this._itemWindow.show();
  this._itemWindow.activate();
};

Scene_Battle.prototype.selectNextCommand = function () {
  BattleManager.selectNextCommand();
  this.changeInputWindow();
};

Scene_Battle.prototype.selectPreviousCommand = function () {
  BattleManager.selectPreviousCommand();
  this.changeInputWindow();
};

Scene_Battle.prototype.selectActorSelection = function () {
  this._actorWindow.refresh();
  this._actorWindow.show();
  this._actorWindow.activate();
};

Scene_Battle.prototype.onActorOk = function () {
  var action = BattleManager.inputtingAction();
  action.setTarget(this._actorWindow.index());
  this._actorWindow.hide();
  this._skillWindow.hide();
  this._itemWindow.hide();
  this.selectNextCommand();
};

Scene_Battle.prototype.onActorCancel = function () {
  this._actorWindow.hide();
  switch (this._actorCommandWindow.currentSymbol()) {
    case "skill":
      this._skillWindow.show();
      this._skillWindow.activate();
      break;
    case "item":
      this._itemWindow.show();
      this._itemWindow.activate();
      break;
  }
};

Scene_Battle.prototype.selectEnemySelection = function () {
  this._enemyWindow.refresh();
  this._enemyWindow.show();
  this._enemyWindow.select(0);
  this._enemyWindow.activate();
};

Scene_Battle.prototype.onEnemyOk = function () {
  var action = BattleManager.inputtingAction();
  action.setTarget(this._enemyWindow.enemyIndex());
  this._enemyWindow.hide();
  this._skillWindow.hide();
  this._itemWindow.hide();
  this.selectNextCommand();
};

Scene_Battle.prototype.onEnemyCancel = function () {
  this._enemyWindow.hide();
  switch (this._actorCommandWindow.currentSymbol()) {
    case "attack":
      this._actorCommandWindow.activate();
      break;
    case "skill":
      this._skillWindow.show();
      this._skillWindow.activate();
      break;
    case "item":
      this._itemWindow.show();
      this._itemWindow.activate();
      break;
  }
};

Scene_Battle.prototype.onSkillOk = function () {
  var skill = this._skillWindow.item();
  var action = BattleManager.inputtingAction();
  action.setSkill(skill.id);
  BattleManager.actor().setLastBattleSkill(skill);
  this.onSelectAction();
};

Scene_Battle.prototype.onSkillCancel = function () {
  this._skillWindow.hide();
  this._actorCommandWindow.activate();
};

Scene_Battle.prototype.onItemOk = function () {
  var item = this._itemWindow.item();
  var action = BattleManager.inputtingAction();
  action.setItem(item.id);
  $gameParty.setLastItem(item);
  this.onSelectAction();
};

Scene_Battle.prototype.onItemCancel = function () {
  this._itemWindow.hide();
  this._actorCommandWindow.activate();
};

Scene_Battle.prototype.onSelectAction = function () {
  var action = BattleManager.inputtingAction();
  this._skillWindow.hide();
  this._itemWindow.hide();
  if (!action.needsSelection()) {
    this.selectNextCommand();
  } else if (action.isForOpponent()) {
    this.selectEnemySelection();
  } else {
    this.selectActorSelection();
  }
};

Scene_Battle.prototype.endCommandSelection = function () {
  this._partyCommandWindow.close();
  this._actorCommandWindow.close();
  this._statusWindow.deselect();
};

//-----------------------------------------------------------------------------
// Scene_Gameover
//
// The scene class of the game over screen.

function Scene_Gameover() {
  this.initialize.apply(this, arguments);
}

Scene_Gameover.prototype = Object.create(Scene_Base.prototype);
Scene_Gameover.prototype.constructor = Scene_Gameover;

Scene_Gameover.prototype.initialize = function () {
  Scene_Base.prototype.initialize.call(this);
};

Scene_Gameover.prototype.create = function () {
  Scene_Base.prototype.create.call(this);
  this.playGameoverMusic();
  this.createBackground();
};

Scene_Gameover.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
  this.startFadeIn(this.slowFadeSpeed(), false);
};

Scene_Gameover.prototype.update = function () {
  if (this.isActive() && !this.isBusy() && this.isTriggered()) {
    this.gotoTitle();
  }
  Scene_Base.prototype.update.call(this);
};

Scene_Gameover.prototype.stop = function () {
  Scene_Base.prototype.stop.call(this);
  this.fadeOutAll();
};

Scene_Gameover.prototype.terminate = function () {
  Scene_Base.prototype.terminate.call(this);
  AudioManager.stopAll();
};

Scene_Gameover.prototype.playGameoverMusic = function () {
  AudioManager.stopBgm();
  AudioManager.stopBgs();
  AudioManager.playMe($dataSystem.gameoverMe);
};

Scene_Gameover.prototype.createBackground = function () {
  this._backSprite = new Sprite();
  this._backSprite.bitmap = ImageManager.loadSystem("GameOver");
  this.addChild(this._backSprite);
};

Scene_Gameover.prototype.isTriggered = function () {
  return Input.isTriggered("ok") || TouchInput.isTriggered();
};

Scene_Gameover.prototype.gotoTitle = function () {
  SceneManager.goto(Scene_Title);
};
