You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

639 lines
23 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Save Core Extension - Autosave
// YEP_X_Autosave.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_Autosave = true;
var Yanfly = Yanfly || {};
Yanfly.Autosave = Yanfly.Autosave || {};
Yanfly.Autosave.version = 1.0;
//=============================================================================
/*:
* @plugindesc v1.00 (Req YEP_SaveCore.js) Adds Autosave functionality to your
* RPG Maker game.
* @author Yanfly Engine Plugins
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin requires YEP_SaveCore. Make sure this plugin is located under
* YEP_SaveCore in the plugin list.
*
* Autosave is a common feature found in standard RPG's nowadays. Games would
* save at certain triggers or upon changing maps so that the player won't lose
* any progress in case they forget to manually save. This plugin adds in an
* Autosave function to your game(s) and lets you control when to Autosave or
* set it to do it automatically under certain conditions.
*
* ============================================================================
* Instructions
* ============================================================================
*
* There are three ways to go about Autosave with this plugin. Please read them
* carefully and decide which one(s) is best suited for your game.
*
* ---
*
* Manual:
* - By default, Autosave does not happen automatically with this plugin. You,
* as the game dev, need to insert the Plugin Command: Autosave at the various
* points you want the Autosave to occur. This one gives you the most control
* over your game.
*
* ---
*
* Autosave on Map Load:
* - This is a Plugin Parameter. When it is set to true, the game will Autosave
* each time the map scene is loaded. This means entering a new map, coming out
* of a menu, or finishing a battle. All three of those conditions causes the
* Autosave function to activate.
*
* ---
*
* Autosave on Main Menu:
* - This is a Plugin Parameter. When it is set to true, the game will Autosave
* each time the player enters the Main Menu from the map scene. Autosave will
* NOT occur any other way regarding the Main Menu, meaning that coming out of
* the Item scene to the Main Menu will not activate Autosave.
*
* ---
*
* Autosaving will not occur if the player disables Autosave. If you don't want
* to give the player the ability to disable Autosave, you can set the Plugin
* Parameter "Show Option" to false.
*
* You can use all three methods of Autosaving together. You can have it done
* manually, Autosave on loading a map, and Autosave on calling the Main Menu
* to get the most coverage.
*
* *NOTE: Although you can use all three methods together, be mindful of your
* players. Sometimes, saving a game could induce a bit of lag depending on how
* big the save files are. Autosaving is no different. This is something that
* cannot be fixed by plugins.
*
* *NOTE: Autosaving will not occur until the player saved manually at least
* once in-game. After that, Autosave will take the slot that was used to save
* and continue saving to it or whichever save slot the player moved to later.
*
* ============================================================================
* Plugin Commands
* ============================================================================
*
* Autosave is manually done by the game developer using plugin commands. There
* are also other plugin commands that can control autosaving, too.
*
* Plugin Commands:
*
* Autosave
* - This will make the game automatically save in the last saved file
* slot used by the player. If the player has started a new game and did
* not save into a slot yet, nothing will happen. If autosave is disabled
* by the player through the Options menu or disabled by the system with
* a plugin command, nothing will happen either.
*
* EnableAutosave
* DisableAutosave
* - This will forcibly enable or disable autosaving done by the game.
* This will not bypass the player's option to disable Autosave if trying
* to enable it. The player's decision to disable Autosaving will take
* priority over the game dev's. If you wish to take this option away from
* the player, please change it in the plugin parameters.
*
* ============================================================================
* Options Core Settings - Adding the New Option
* ============================================================================
*
* If you are using YEP_OptionsCore.js, you can add a new Option using this
* plugin. Here's the following code/parameter settings you can use with it.
*
* ---------
* Settings:
* ---------
*
* Name:
* \i[231]Autosave
*
* Help Description:
* Enables \c[4]Autosaving\c[0] for your game if ON.
* You can still manually save your game.
*
* Symbol:
* autosave
*
* Show/Hide:
* show = Imported.AutosaveShowOpt;
*
* Enable:
* enabled = true;
*
* Ext:
* ext = 0;
*
* ----------
* Functions:
* ----------
*
* Make Option Code:
* this.addCommand(name, symbol, enabled, ext);
*
* Draw Option Code:
* var rect = this.itemRectForText(index);
* var statusWidth = this.statusWidth();
* var titleWidth = rect.width - statusWidth;
* this.resetTextColor();
* this.changePaintOpacity(this.isCommandEnabled(index));
* this.drawOptionsName(index);
* this.drawOptionsOnOff(index);
*
* Process OK Code:
* var index = this.index();
* var symbol = this.commandSymbol(index);
* var value = this.getConfigValue(symbol);
* this.changeValue(symbol, !value);
*
* Cursor Right Code:
* var index = this.index();
* var symbol = this.commandSymbol(index);
* var value = this.getConfigValue(symbol);
* this.changeValue(symbol, true);
*
* Cursor Left Code:
* var index = this.index();
* var symbol = this.commandSymbol(index);
* var value = this.getConfigValue(symbol);
* this.changeValue(symbol, false);
*
* Default Config Code:
* // Empty. Provided by this plugin.
*
* Save Config Code:
* // Empty. Provided by this plugin.
*
* Load Config Code:
* // Empty. Provided by this plugin.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.00:
* - Finished Plugin!
*
* ============================================================================
* End of Helpfile
* ============================================================================
*
* @param ---Automatic---
* @default
*
* @param OnMapLoad
* @text Autosave on Map Load
* @parent ---Automatic---
* @type boolean
* @on YES
* @off NO
* @desc Autosave whenever the map is loaded.
* YES - true NO - false
* @default false
*
* @param OnMainMenu
* @text Autosave on Main Menu
* @parent ---Automatic---
* @type boolean
* @on YES
* @off NO
* @desc Autosave whenever main menu is called.
* YES - true NO - false
* @default false
*
* @param ---Option Menu---
* @default
*
* @param Show Option
* @parent ---Option Menu---
* @type boolean
* @on YES
* @off NO
* @desc Give player the option to enable or disable Autosave?
* YES - true NO - false
* @default true
*
* @param Option Name
* @parent ---Option Menu---
* @desc The option command text used in-game.
* @default Autosave
*
* @param Default
* @text Default Setting
* @parent ---Option Menu---
* @desc Do you want Autosaving to be enabled by default?
* YES - true NO - false
* @default true
*
* @param ---Visual---
* @default
*
* @param ShowAutosave
* @text Show Autosave Message
* @parent ---Visual---
* @type boolean
* @on YES
* @off NO
* @desc Show a message when Autosave happens?
* YES - true NO - false
* @default true
*
* @param AutosaveMsgSave
* @text Autosave Message On Save
* @parent ShowAutosave
* @desc Text used for the auto save message.
* Can use text codes.
* @default \i[83]Autosave Complete!
*
* @param AutosaveMsgLoad
* @text Autosave Message On Load
* @parent ShowAutosave
* @desc Text used for the auto save message.
* Can use text codes.
* @default \i[83]Autosave Loaded!
*
* @param MsgGradient1
* @text Message Gradient 1
* @parent ShowAutosave
* @desc Hex color used for the softer gradient color.
* rgba(0, 0, 0, 0) Reference: Red, Green, Blue, Alpha
* @default rgba(0, 0, 0, 0)
*
* @param MsgGradient2
* @text Message Gradient 2
* @parent ShowAutosave
* @desc Hex color used for the softer gradient color.
* rgba(0, 0, 0, 0) Reference: Red, Green, Blue, Alpha
* @default rgba(0, 0, 0, 0.6)
*
* @param MsgGradientCode
* @text Message Gradient Code
* @parent ShowAutosave
* @type note
* @desc JavaScript code for those who would like to tweak
* how the gradient is drawn.
* @default "var textWidth = this.textWidthEx(this.message());\nvar half = this.textPadding() + Math.ceil(textWidth / 2);\nvar height = this.lineHeight();\nvar color1 = Yanfly.Param.AutosaveMsgColor1;\nvar color2 = Yanfly.Param.AutosaveMsgColor2;\nthis.contents.gradientFillRect(0, 0, half, height, color1, color2);\nthis.contents.gradientFillRect(half, 0, this.width - half, height, color2, color1);"
*
* @param MsgX
* @text Message X
* @parent ShowAutosave
* @desc X position of the message.
* You can use code here.
* @default Graphics.boxWidth - 180
*
* @param MsgY
* @text Message Y
* @parent ShowAutosave
* @desc Y position of the message.
* You can use code here.
* @default Graphics.boxHeight - this.fittingHeight(1) * 2
*
* @param MsgDuration
* @text Message Duration
* @parent ShowAutosave
* @type number
* @desc Duration of the message in frames.
* @default 120
*
* @param FadeSpeed
* @text Message Fade Speed
* @parent ShowAutosave
* @desc Fade speed of the window.
* Lower - slower Higher - faster
* @default 16
*
*/
//=============================================================================
if (Imported.YEP_SaveCore) {
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters("YEP_X_Autosave");
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.AutosaveOnMapLoad = eval(String(Yanfly.Parameters["OnMapLoad"]));
Yanfly.Param.AutosaveOnMainMenu = eval(String(Yanfly.Parameters["OnMainMenu"]));
Yanfly.Param.AutosaveShowOpt = eval(String(Yanfly.Parameters["Show Option"]));
Yanfly.Param.AutosaveOptionCmd = String(Yanfly.Parameters["Option Name"]);
Yanfly.Param.AutosaveDefault = eval(String(Yanfly.Parameters["Default"]));
Yanfly.Param.AutosaveShowMsg = eval(String(Yanfly.Parameters["ShowAutosave"]));
Yanfly.Param.AutosaveMsgSave = String(Yanfly.Parameters["AutosaveMsgSave"]);
Yanfly.Param.AutosaveMsgLoad = String(Yanfly.Parameters["AutosaveMsgLoad"]);
Yanfly.Param.AutosaveMsgColor1 = String(Yanfly.Parameters["MsgGradient1"]);
Yanfly.Param.AutosaveMsgColor2 = String(Yanfly.Parameters["MsgGradient2"]);
Yanfly.Param.AutosaveMsgCode = JSON.parse(Yanfly.Parameters["MsgGradientCode"]);
Yanfly.Param.AutosaveMsgX = String(Yanfly.Parameters["MsgX"]);
Yanfly.Param.AutosaveMsgY = String(Yanfly.Parameters["MsgY"]);
Yanfly.Param.AutosaveMsgDur = Number(Yanfly.Parameters["MsgDuration"]) || 120;
Yanfly.Param.AutosaveMsgFade = Number(Yanfly.Parameters["FadeSpeed"]) || 16;
//=============================================================================
// ConfigManager
//=============================================================================
ConfigManager.autosave = Yanfly.Param.AutosaveDefault;
Yanfly.Autosave.ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
var config = Yanfly.Autosave.ConfigManager_makeData.call(this);
config.autosave = this.autosave;
return config;
};
Yanfly.Autosave.ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
Yanfly.Autosave.ConfigManager_applyData.call(this, config);
this.autosave = config["autosave"] || Yanfly.Param.AutosaveDefault;
};
//=============================================================================
// DataManager
//=============================================================================
Yanfly.Autosave.DataManager_setupNewGame = DataManager.setupNewGame;
DataManager.setupNewGame = function () {
Yanfly.Autosave.DataManager_setupNewGame.call(this);
StorageManager.setCurrentAutosaveSlot(this._lastAccessedId);
$gameTemp._autosaveNewGame = false;
$gameTemp._autosaveLoading = false;
};
Yanfly.Autosave.DataManager_saveGame = DataManager.saveGameWithoutRescue;
DataManager.saveGameWithoutRescue = function (savefileId) {
var value = Yanfly.Autosave.DataManager_saveGame.call(this, savefileId);
$gameTemp._autosaveNewGame = false;
$gameTemp._autosaveLoading = false;
StorageManager.setCurrentAutosaveSlot(savefileId);
return value;
};
Yanfly.Autosave.DataManager_loadGame = DataManager.loadGameWithoutRescue;
DataManager.loadGameWithoutRescue = function (savefileId) {
var value = Yanfly.Autosave.DataManager_loadGame.call(this, savefileId);
$gameTemp._autosaveNewGame = false;
$gameTemp._autosaveLoading = true;
StorageManager.setCurrentAutosaveSlot(savefileId);
return value;
};
//=============================================================================
// StorageManager
//=============================================================================
StorageManager.getCurrentAutosaveSlot = function () {
return this._currentAutosaveSlot;
};
StorageManager.setCurrentAutosaveSlot = function (savefileId) {
this._currentAutosaveSlot = 1;
};
StorageManager.performAutosave = function () {
if ($gameMap.mapId() <= 0) return;
if ($gameTemp._autosaveNewGame) return;
if (!$gameSystem.canAutosave()) return;
SceneManager._scene.performAutosave();
};
//=============================================================================
// Game_System
//=============================================================================
Yanfly.Autosave.Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function () {
Yanfly.Autosave.Game_System_initialize.call(this);
this.initAutosave();
};
Game_System.prototype.initAutosave = function () {
this._allowAutosave = true;
};
Game_System.prototype.canAutosave = function () {
if (this._allowAutosave === undefined) this.initAutosave();
return this._allowAutosave;
};
Game_System.prototype.setAutosave = function (value) {
if (this._allowAutosave === undefined) this.initAutosave();
this._allowAutosave = value;
};
//=============================================================================
// Game_Interpreter
//=============================================================================
Yanfly.Autosave.Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function (command, args) {
Yanfly.Autosave.Game_Interpreter_pluginCommand.call(this, command, args);
if (command.match(/EnableAutosave/i)) {
$gameSystem.setAutosave(true);
} else if (command.match(/DisableAutosave/i)) {
$gameSystem.setAutosave(false);
} else if (command.match(/Autosave/i)) {
StorageManager.performAutosave();
}
};
//=============================================================================
// Window_Options
//=============================================================================
Yanfly.Autosave.Window_Options_addGeneralOptions = Window_Options.prototype.addGeneralOptions;
Window_Options.prototype.addGeneralOptions = function () {
Yanfly.Autosave.Window_Options_addGeneralOptions.call(this);
if (!Imported.YEP_OptionsCore && Yanfly.Param.AutosaveShowOpt) {
this.addCommand(Yanfly.Param.AutosaveOptionCmd, "autosave");
}
};
//=============================================================================
// Window_Autosave
//=============================================================================
function Window_Autosave() {
this.initialize.apply(this, arguments);
}
Window_Autosave.prototype = Object.create(Window_Base.prototype);
Window_Autosave.prototype.constructor = Window_Autosave;
Window_Autosave.prototype.initialize = function () {
var width = this.windowWidth();
var height = this.windowHeight();
var x = eval(Yanfly.Param.AutosaveMsgX);
var y = eval(Yanfly.Param.AutosaveMsgY);
Window_Base.prototype.initialize.call(this, x, y, width, height);
this.opacity = 0;
this.contentsOpacity = 0;
this._showCount = 0;
this.refresh();
if ($gameTemp._autosaveLoading) {
this.reveal();
$gameTemp._autosaveLoading = false;
}
};
Window_Autosave.prototype.standardPadding = function () {
return 0;
};
Window_Autosave.prototype.windowWidth = function () {
return Graphics.boxWidth;
};
Window_Autosave.prototype.windowHeight = function () {
return this.fittingHeight(1);
};
Window_Autosave.prototype.update = function () {
Window_Base.prototype.update.call(this);
if (this._showCount > 0) {
this.updateFadeIn();
this._showCount--;
} else {
this.updateFadeOut();
}
};
Window_Autosave.prototype.updateFadeIn = function () {
this.contentsOpacity += Yanfly.Param.AutosaveMsgFade;
};
Window_Autosave.prototype.updateFadeOut = function () {
this.contentsOpacity -= Yanfly.Param.AutosaveMsgFade;
};
Window_Autosave.prototype.reveal = function () {
if (!Yanfly.Param.AutosaveShowMsg) return;
if (this._showCount > 0) return;
this._showCount = Yanfly.Param.AutosaveMsgDur;
this.refresh();
};
Window_Autosave.prototype.message = function () {
if ($gameTemp._autosaveLoading) {
return Yanfly.Param.AutosaveMsgLoad;
} else {
return Yanfly.Param.AutosaveMsgSave;
}
};
Window_Autosave.prototype.refresh = function () {
this.contents.clear();
this.drawGradient();
this.drawTextEx(this.message(), this.textPadding(), 0);
};
Window_Autosave.prototype.drawGradient = function () {
eval(Yanfly.Param.AutosaveMsgCode);
};
Window_Autosave.prototype.textWidthEx = function (text) {
return this.drawTextEx(text, 0, this.contents.height);
};
//=============================================================================
// Scene_Base
//=============================================================================
Scene_Base.prototype.performAutosave = function () {};
//=============================================================================
// Scene_Map
//=============================================================================
Yanfly.Autosave.Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Scene_Map.prototype.createAllWindows = function () {
Yanfly.Autosave.Scene_Map_createAllWindows.call(this);
this.createAutosaveMessageWindow();
};
Scene_Map.prototype.createAutosaveMessageWindow = function () {
this._autosaveMsgWindow = new Window_Autosave();
this.addChild(this._autosaveMsgWindow);
};
Yanfly.Autosave.Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
Scene_Map.prototype.onMapLoaded = function () {
Yanfly.Autosave.Scene_Map_onMapLoaded.call(this);
if (Yanfly.Param.AutosaveOnMapLoad) StorageManager.performAutosave();
};
Yanfly.Autosave.Scene_Map_callMenu = Scene_Map.prototype.callMenu;
Scene_Map.prototype.callMenu = function () {
Yanfly.Autosave.Scene_Map_callMenu.call(this);
if (Yanfly.Param.AutosaveOnMainMenu) StorageManager.performAutosave();
};
Scene_Map.prototype.performAutosave = function () {
if ($gameMap.mapId() <= 0) return;
if ($gameTemp._autosaveNewGame) return;
if (!$gameSystem.canAutosave()) return;
$gameSystem.onBeforeSave();
DataManager.saveGameWithoutRescue(StorageManager.getCurrentAutosaveSlot());
if (this._autosaveMsgWindow) this._autosaveMsgWindow.reveal();
};
//=============================================================================
// Window_SavefileList
//=============================================================================
Yanfly.Autosave.Window_SavefileList_drawItem = Window_SavefileList.prototype.drawItem;
Window_SavefileList.prototype.drawItem = function (index) {
var id = index + 1;
var valid = DataManager.isThisGameFile(id);
var rect = this.itemRect(index);
this.resetTextColor();
//if (this._mode === 'load') this.changePaintOpacity(valid);
this.changePaintOpacity(valid);
var icon = valid ? Yanfly.Param.SaveIconSaved : Yanfly.Param.SaveIconEmpty;
this.drawIcon(icon, rect.x + 2, rect.y + 2);
if (id === 1) {
//First is AutoSaved
this.drawText("自动存档", rect.x + Window_Base._iconWidth + 4, rect.y, 180);
} else {
this.drawFileId(id - 1, rect.x + Window_Base._iconWidth + 4, rect.y);
}
};
//=============================================================================
// Window_SaveAction
//=============================================================================
Yanfly.Autosave.Window_SaveAction_isSaveEnabled = Window_SaveAction.prototype.isSaveEnabled;
Window_SaveAction.prototype.isSaveEnabled = function () {
if (this._mode !== "save") return false;
if (this._currentFile === 1) return false;
return $gameSystem.isSaveEnabled();
};
//=============================================================================
// Save Core Check
//=============================================================================
} else {
Imported.YEP_X_Autosave = false;
var text = "";
text += "You are getting this error because you are trying to run ";
text += "YEP_X_Autosave without the required plugins. Please visit ";
text += "Yanfly.moe and install the required plugins neede for this plugin ";
text += "found in this plugin's help file before you can use it.";
console.log(text);
require("nw.gui").Window.get().showDevTools();
}
//=============================================================================
// End of File
//=============================================================================