//============================================================================= // 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 //=============================================================================