//-----------------------------------------------------------------------------
// Scene_Map
//
// The scene class of the map screen.
/**
* The scene class of the map screen.
*
* @class
* @extends Scene_Message
*/
function Scene_Map() {
this.initialize(...arguments);
}
Scene_Map.prototype = Object.create(Scene_Message.prototype);
Scene_Map.prototype.constructor = Scene_Map;
Scene_Map.prototype.initialize = function() {
Scene_Message.prototype.initialize.call(this);
this._waitCount = 0;
this._encounterEffectDuration = 0;
this._mapLoaded = false;
this._touchCount = 0;
this._menuEnabled = false;
};
Scene_Map.prototype.create = function() {
Scene_Message.prototype.create.call(this);
this._transfer = $gamePlayer.isTransferring();
this._lastMapWasNull = !$dataMap;
if (this._transfer) {
DataManager.loadMapData($gamePlayer.newMapId());
this.onTransfer();
} else {
DataManager.loadMapData($gameMap.mapId());
}
};
Scene_Map.prototype.isReady = function() {
if (!this._mapLoaded && DataManager.isMapLoaded()) {
this.onMapLoaded();
this._mapLoaded = true;
}
return this._mapLoaded && Scene_Message.prototype.isReady.call(this);
};
/**
* Processing for when the map is done loading
*/
Scene_Map.prototype.onMapLoaded = function() {
if (this._transfer) {
$gamePlayer.performTransfer();
}
this.createDisplayObjects();
};
/**
* Processing for when there is a map transfer
*/
Scene_Map.prototype.onTransfer = function() {
ImageManager.clear();
EffectManager.clear();
};
Scene_Map.prototype.start = function() {
Scene_Message.prototype.start.call(this);
SceneManager.clearStack();
if (this._transfer) {
this.fadeInForTransfer();
this.onTransferEnd();
} else if (this.needsFadeIn()) {
this.startFadeIn(this.fadeSpeed(), false);
}
this.menuCalling = false;
};
/**
* Processing for when a map transfer is done
*/
Scene_Map.prototype.onTransferEnd = function() {
this._mapNameWindow.open();
$gameMap.autoplay();
if (this.shouldAutosave()) {
this.requestAutosave();
}
};
/**
* Check if the game should autosave
*
* @return {boolean} False if the last map was null
*/
Scene_Map.prototype.shouldAutosave = function() {
return !this._lastMapWasNull;
};
Scene_Map.prototype.update = function() {
Scene_Message.prototype.update.call(this);
this.updateDestination();
this.updateMenuButton();
this.updateMapNameWindow();
this.updateMainMultiply();
if (this.isSceneChangeOk()) {
this.updateScene();
} else if (SceneManager.isNextScene(Scene_Battle)) {
this.updateEncounterEffect();
}
this.updateWaitCount();
};
/**
* Will update main multiple times if fast forwarding
*/
Scene_Map.prototype.updateMainMultiply = function() {
if (this.isFastForward()) {
this.updateMain();
}
this.updateMain();
};
/**
* Update the main elements of the map scene
*/
Scene_Map.prototype.updateMain = function() {
$gameMap.update(this.isActive());
$gamePlayer.update(this.isPlayerActive());
$gameTimer.update(this.isActive());
$gameScreen.update();
};
/**
* Check if the player is active
*
* @return {boolean} True if active and not fading
*/
Scene_Map.prototype.isPlayerActive = function() {
return this.isActive() && !this.isFading();
};
/**
* Check if the game is in fast forward mode
*
* @return {boolean} True if event is being fast forwarded
*/
Scene_Map.prototype.isFastForward = function() {
return (
$gameMap.isEventRunning() &&
!SceneManager.isSceneChanging() &&
(Input.isLongPressed("ok") || TouchInput.isLongPressed())
);
};
Scene_Map.prototype.stop = function() {
Scene_Message.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.isMessageWindowClosing() ||
this._waitCount > 0 ||
this._encounterEffectDuration > 0 ||
Scene_Message.prototype.isBusy.call(this)
);
};
Scene_Map.prototype.terminate = function() {
Scene_Message.prototype.terminate.call(this);
if (!SceneManager.isNextScene(Scene_Battle)) {
this._spriteset.update();
this._mapNameWindow.hide();
this.hideMenuButton();
SceneManager.snapForBackground();
}
$gameScreen.clearZoom();
};
/**
* Check if the map scene should fade in
*
* @return {boolean} True if last scene was battle or load
*/
Scene_Map.prototype.needsFadeIn = function() {
return (
SceneManager.isPreviousScene(Scene_Battle) ||
SceneManager.isPreviousScene(Scene_Load)
);
};
/**
* Check if the map scene should slowly fade out
*
* @return {boolean} True if the next scene is title or gameover
*/
Scene_Map.prototype.needsSlowFadeOut = function() {
return (
SceneManager.isNextScene(Scene_Title) ||
SceneManager.isNextScene(Scene_Gameover)
);
};
/**
* Updates the wait count
*
* @return {boolean} True if the wait count was updated
*/
Scene_Map.prototype.updateWaitCount = function() {
if (this._waitCount > 0) {
this._waitCount--;
return true;
}
return false;
};
/**
* Updates the destination the player wants to go
*/
Scene_Map.prototype.updateDestination = function() {
if (this.isMapTouchOk()) {
this.processMapTouch();
} else {
$gameTemp.clearDestination();
this._touchCount = 0;
}
};
/**
* Updates the menu Touch UI button
*/
Scene_Map.prototype.updateMenuButton = function() {
if (this._menuButton) {
const menuEnabled = this.isMenuEnabled();
if (menuEnabled === this._menuEnabled) {
this._menuButton.visible = this._menuEnabled;
} else {
this._menuEnabled = menuEnabled;
}
}
};
/**
* Hides the menu Touch UI button
*/
Scene_Map.prototype.hideMenuButton = function() {
if (this._menuButton) {
this._menuButton.visible = false;
this._menuEnabled = false;
}
};
/**
* Updates the map name window
*/
Scene_Map.prototype.updateMapNameWindow = function() {
if ($gameMessage.isBusy()) {
this._mapNameWindow.close();
}
};
/**
* Check if the player can open the main menu
*
* @return {boolean} True if the main menu can be opened
*/
Scene_Map.prototype.isMenuEnabled = function() {
return $gameSystem.isMenuEnabled() && !$gameMap.isEventRunning();
};
/**
* Check if the player can set a new destination for movement
*
* @return {boolean} True if the player can move
*/
Scene_Map.prototype.isMapTouchOk = function() {
return this.isActive() && $gamePlayer.canMove();
};
/**
* Processing for when the map is touched
*/
Scene_Map.prototype.processMapTouch = function() {
if (TouchInput.isTriggered() || this._touchCount > 0) {
if (TouchInput.isPressed() && !this.isAnyButtonPressed()) {
if (this._touchCount === 0 || this._touchCount >= 15) {
this.onMapTouch();
}
this._touchCount++;
} else {
this._touchCount = 0;
}
}
};
/**
* Check if the player has touched any of the touch UI buttons
*
* @return {boolean} True if a button is pressed
*/
Scene_Map.prototype.isAnyButtonPressed = function() {
return this._menuButton && this._menuButton.isPressed();
};
/**
* Handles the new destination when the map is touched
*/
Scene_Map.prototype.onMapTouch = function() {
const x = $gameMap.canvasToMapX(TouchInput.x);
const y = $gameMap.canvasToMapY(TouchInput.y);
$gameTemp.setDestination(x, y);
};
/**
* Check if the scene can be changed
*
* @return {boolean} True if the scene can be changed
*/
Scene_Map.prototype.isSceneChangeOk = function() {
return this.isActive() && !$gameMessage.isBusy();
};
/**
* Updates the map scene
*/
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();
}
};
/**
* Create the objects that are displayed in the map scene
*/
Scene_Map.prototype.createDisplayObjects = function() {
this.createSpriteset();
this.createWindowLayer();
this.createAllWindows();
this.createButtons();
};
/**
* Create the map's spriteset
*/
Scene_Map.prototype.createSpriteset = function() {
this._spriteset = new Spriteset_Map();
this.addChild(this._spriteset);
this._spriteset.update();
};
Scene_Map.prototype.createAllWindows = function() {
this.createMapNameWindow();
Scene_Message.prototype.createAllWindows.call(this);
};
/**
* Creates the map name window
*/
Scene_Map.prototype.createMapNameWindow = function() {
const rect = this.mapNameWindowRect();
this._mapNameWindow = new Window_MapName(rect);
this.addWindow(this._mapNameWindow);
};
/**
* Get the rectangle object that represents the map name window's x/y/width/height
*
* @return {Rectangle} The rectangle that represents the map name window
*/
Scene_Map.prototype.mapNameWindowRect = function() {
const wx = 0;
const wy = 0;
const ww = 360;
const wh = this.calcWindowHeight(1, false);
return new Rectangle(wx, wy, ww, wh);
};
/**
* Create the Touch UI buttons
*/
Scene_Map.prototype.createButtons = function() {
if (ConfigManager.touchUI) {
this.createMenuButton();
}
};
/**
* Creates the menu Touch UI button
*/
Scene_Map.prototype.createMenuButton = function() {
this._menuButton = new Sprite_Button("menu");
this._menuButton.x = Graphics.boxWidth - this._menuButton.width - 4;
this._menuButton.y = this.buttonY();
this._menuButton.visible = false;
this.addWindow(this._menuButton);
};
/**
* Update for when player is being transferred
*/
Scene_Map.prototype.updateTransferPlayer = function() {
if ($gamePlayer.isTransferring()) {
SceneManager.goto(Scene_Map);
}
};
/**
* Update for encounters
*/
Scene_Map.prototype.updateEncounter = function() {
if ($gamePlayer.executeEncounter()) {
SceneManager.push(Scene_Battle);
}
};
/**
* Update for when the menu is being called
*/
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;
}
};
/**
* Check if the menu is being called
*
* @return {boolean} True if the main menu is being called
*/
Scene_Map.prototype.isMenuCalled = function() {
return Input.isTriggered("menu") || TouchInput.isCancelled();
};
/**
* Calls the main menu
*/
Scene_Map.prototype.callMenu = function() {
SoundManager.playOk();
SceneManager.push(Scene_Menu);
Window_MenuCommand.initCommandPosition();
$gameTemp.clearDestination();
this._mapNameWindow.hide();
this._waitCount = 2;
};
/**
* Update for calling the debug scene
*/
Scene_Map.prototype.updateCallDebug = function() {
if (this.isDebugCalled()) {
SceneManager.push(Scene_Debug);
}
};
/**
* Check if the debug scene is being called
*
* @return {boolean} True if the debug scene is being called
*/
Scene_Map.prototype.isDebugCalled = function() {
return Input.isTriggered("debug") && $gameTemp.isPlaytest();
};
/**
* Fades the map scene in after a transfer
*/
Scene_Map.prototype.fadeInForTransfer = function() {
const fadeType = $gamePlayer.fadeType();
switch (fadeType) {
case 0:
case 1:
this.startFadeIn(this.fadeSpeed(), fadeType === 1);
break;
}
};
/**
* Fades the map scene out before a transfer
*/
Scene_Map.prototype.fadeOutForTransfer = function() {
const fadeType = $gamePlayer.fadeType();
switch (fadeType) {
case 0:
case 1:
this.startFadeOut(this.fadeSpeed(), fadeType === 1);
break;
}
};
/**
* Launches a battle
*/
Scene_Map.prototype.launchBattle = function() {
BattleManager.saveBgmAndBgs();
this.stopAudioOnBattleStart();
SoundManager.playBattleStart();
this.startEncounterEffect();
this._mapNameWindow.hide();
};
/**
* Stops audio for battle start
*/
Scene_Map.prototype.stopAudioOnBattleStart = function() {
if (!AudioManager.isCurrentBgm($gameSystem.battleBgm())) {
AudioManager.stopBgm();
}
AudioManager.stopBgs();
AudioManager.stopMe();
AudioManager.stopSe();
};
/**
* Starts the encounter effect for battle transition
*/
Scene_Map.prototype.startEncounterEffect = function() {
this._spriteset.hideCharacters();
this._encounterEffectDuration = this.encounterEffectSpeed();
};
/**
* Updates the encounter effect
*/
Scene_Map.prototype.updateEncounterEffect = function() {
if (this._encounterEffectDuration > 0) {
this._encounterEffectDuration--;
const speed = this.encounterEffectSpeed();
const n = speed - this._encounterEffectDuration;
const p = n / speed;
const q = ((p - 1) * 20 * p + 5) * p + 1;
const zoomX = $gamePlayer.screenX();
const 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());
}
}
};
/**
* Snaps an image of the map scene for a battle background
*/
Scene_Map.prototype.snapForBattleBackground = function() {
this._windowLayer.visible = false;
SceneManager.snapForBackground();
this._windowLayer.visible = true;
};
/**
* Starts a screen flash for an encounter
*
* @param {number} duration - The duration of the screen flash in frames
*/
Scene_Map.prototype.startFlashForEncounter = function(duration) {
const color = [255, 255, 255, 255];
$gameScreen.startFlash(color, duration);
};
/**
* Get the desired encounter effect speed
*
* @return {number} The speed of the encounter effect
*/
Scene_Map.prototype.encounterEffectSpeed = function() {
return 60;
};