diff --git a/Data/Actors.rxdata b/Data/Actors.rxdata index 41edc8e26..7967a5432 100644 Binary files a/Data/Actors.rxdata and b/Data/Actors.rxdata differ diff --git a/Data/Animations.rxdata b/Data/Animations.rxdata index 065a7e253..d940ad63a 100644 Binary files a/Data/Animations.rxdata and b/Data/Animations.rxdata differ diff --git a/Data/Armors.rxdata b/Data/Armors.rxdata index 901f2bb2b..2249bec14 100644 Binary files a/Data/Armors.rxdata and b/Data/Armors.rxdata differ diff --git a/Data/CommonEvents.rxdata b/Data/CommonEvents.rxdata index 45d43f0e9..68fb7070c 100644 Binary files a/Data/CommonEvents.rxdata and b/Data/CommonEvents.rxdata differ diff --git a/Data/Enemies.rxdata b/Data/Enemies.rxdata index be622f513..004ee903d 100644 Binary files a/Data/Enemies.rxdata and b/Data/Enemies.rxdata differ diff --git a/Data/Items.rxdata b/Data/Items.rxdata index fe767fa0b..3e62ba6d2 100644 Binary files a/Data/Items.rxdata and b/Data/Items.rxdata differ diff --git a/Data/Map144.rxdata b/Data/Map144.rxdata index 5bbb0ede9..6531d8f3e 100644 Binary files a/Data/Map144.rxdata and b/Data/Map144.rxdata differ diff --git a/Data/Map154.rxdata b/Data/Map154.rxdata index 838bd1c18..48848d314 100644 Binary files a/Data/Map154.rxdata and b/Data/Map154.rxdata differ diff --git a/Data/Map198.rxdata b/Data/Map198.rxdata index 41dd4ba6f..33d3a42cf 100644 Binary files a/Data/Map198.rxdata and b/Data/Map198.rxdata differ diff --git a/Data/Map563.rxdata b/Data/Map563.rxdata index b50ec0c9f..184a3c345 100644 Binary files a/Data/Map563.rxdata and b/Data/Map563.rxdata differ diff --git a/Data/Map628.rxdata b/Data/Map628.rxdata index 89eed0e2c..b1f084d23 100644 Binary files a/Data/Map628.rxdata and b/Data/Map628.rxdata differ diff --git a/Data/MapInfos.rxdata b/Data/MapInfos.rxdata index 5c2e955d1..b5d5d5f5f 100644 Binary files a/Data/MapInfos.rxdata and b/Data/MapInfos.rxdata differ diff --git a/Data/Scripts/001_Settings.rb b/Data/Scripts/001_Settings.rb index 351c679d3..443904643 100644 --- a/Data/Scripts/001_Settings.rb +++ b/Data/Scripts/001_Settings.rb @@ -6,7 +6,7 @@ module Settings # The version of your game. It has to adhere to the MAJOR.MINOR.PATCH format. GAME_VERSION = '5.0.0' - GAME_VERSION_NUMBER = "5.0.10 - beta" + GAME_VERSION_NUMBER = "5.0.11 - beta" # FUSION_ICON_SPRITE_OFFSET = 10 diff --git a/Data/Scripts/003_Game processing/002_Scene_Map.rb b/Data/Scripts/003_Game processing/002_Scene_Map.rb index c68ba4413..25fdcdf34 100644 --- a/Data/Scripts/003_Game processing/002_Scene_Map.rb +++ b/Data/Scripts/003_Game processing/002_Scene_Map.rb @@ -196,6 +196,7 @@ class Scene_Map unless $game_system.menu_disabled || $game_player.moving? $game_temp.menu_calling = true $game_temp.menu_beep = true + $scene.spriteset.addUserSprite(LocationWindow.new($game_map.name+ "\n"+ pbGetTimeNow.strftime("%I:%M %p"))) end elsif Input.trigger?(Input::SPECIAL) unless $game_player.moving? diff --git a/Data/Scripts/021_Compiler/001_Compiler.rb b/Data/Scripts/021_Compiler/001_Compiler.rb index c76a94872..9778c106d 100644 --- a/Data/Scripts/021_Compiler/001_Compiler.rb +++ b/Data/Scripts/021_Compiler/001_Compiler.rb @@ -734,7 +734,7 @@ module Compiler end def main - #return + return return if !$DEBUG begin dataFiles = [ diff --git a/Data/Scripts/050_AddOns/Multiple save file.rb b/Data/Scripts/050_AddOns/Multiple save file.rb new file mode 100644 index 000000000..a2e61e482 --- /dev/null +++ b/Data/Scripts/050_AddOns/Multiple save file.rb @@ -0,0 +1,919 @@ +# # Store save file after load save file +# $storenamefilesave = nil +# # Some method for checking save file +# module FileSave +# # Set name of folder +# #DIR_SAVE_GAME = System.data_directory +# DIR_SAVE_GAME = "Save Game" +# # Set name of file for saving: +# # Ex: Game1,Game2,etc +# FILENAME_SAVE_GAME = "Game" +# # Create dir +# def self.createDir(dir = DIR_SAVE_GAME) +# Dir.mkdir(dir) if !safeExists?(dir) +# end +# +# # Return location +# def self.location(dir = DIR_SAVE_GAME) +# self.createDir +# return "#{dir}" +# end +# +# # Array file +# def self.count(arr = false, dir = DIR_SAVE_GAME, file = FILENAME_SAVE_GAME, type = "rxdata") +# self.createDir(dir) +# File.rename("#{dir}/#{file}.#{type}", "#{dir}/#{file}1.#{type}") if File.file?("#{dir}/#{file}.#{type}") +# return arr ? Dir.glob("#{dir}/#{file}*.#{type}") : Dir.glob("#{dir}/#{file}*.#{type}").size +# end +# +# # Rename +# def self.rename(dir = DIR_SAVE_GAME, file = FILENAME_SAVE_GAME, type = "rxdata") +# arr = self.count(true) +# return if arr.size <= 0 +# name = [] +# arr.each { |f| name << (File.basename(f, ".#{type}").gsub(/[^0-9]/, "")) } +# needtorewrite = false +# (0...arr.size).each { |i| +# needtorewrite = true if arr[i] != "#{dir}/#{file}#{name[i]}.#{type}" +# } +# if needtorewrite +# numbername = [] +# name.each { |n| numbername << n.to_i } +# (0...numbername.size).each { |i| +# loop do +# break if i == 0 +# diff = numbername.index(numbername[i]) +# break if diff == i +# numbername[i] += 1 +# end +# Dir.mkdir("#{dir}/#{numbername[i]}") +# File.rename("#{arr[i]}", "#{dir}/#{numbername[i]}/#{file}#{numbername[i]}.#{type}") +# } +# (0...name.size).each { |i| +# name2 = "#{dir}/#{numbername[i]}/#{file}#{numbername[i]}.#{type}" +# File.rename(name2, "#{dir}/#{file}#{numbername[i]}.#{type}") +# Dir.delete("#{dir}/#{numbername[i]}") +# } +# end +# arr.size.times { |i| +# num = 0 +# namef = sprintf("%d", i + 1) +# loop do +# break if File.file?("#{dir}/#{file}#{namef}.#{type}") +# num += 1 +# namef2 = sprintf("%d", i + 1 + num) +# File.rename("#{dir}/#{file}#{namef2}.#{type}", "#{dir}/#{file}#{namef}.#{type}") if File.file?("#{dir}/#{file}#{namef2}.#{type}") +# end +# } +# end +# +# # Save +# def self.name(n = nil, re = true, dir = DIR_SAVE_GAME, file = FILENAME_SAVE_GAME, type = "rxdata") +# self.rename if re +# return "#{dir}/#{file}1.rxdata" if n.nil? +# if !n.is_a?(Numeric) +# p "Set number for file save" +# return +# end +# return "#{dir}/#{file}#{n}.rxdata" +# end +# +# # Old file save +# def self.title +# return System.game_title.gsub(/[^\w ]/, '_') +# end +# +# # Version 19 +# def self.dirv19(dir = DIR_SAVE_GAME, file = FILENAME_SAVE_GAME, type = "rxdata") +# game_title = self.title +# return if !File.directory?(System.data_directory) +# old_file = System.data_directory + '/Game.rxdata' +# return if !File.file?(old_file) +# self.rename +# size = self.count +# File.move(old_file, "#{dir}/#{file}#{size + 1}.#{type}") +# end +# +# # Version 18 +# def self.dirv18(dir = DIR_SAVE_GAME, file = FILENAME_SAVE_GAME, type = "rxdata") +# game_title = self.title +# home = ENV['HOME'] || ENV['HOMEPATH'] +# return if home.nil? +# old_location = File.join(home, 'Saved Games', game_title) +# return if !File.directory?(old_location) +# old_file = File.join(old_location, 'Game.rxdata') +# return if !File.file?(old_file) +# self.rename +# size = self.count +# File.move(old_file, "#{dir}/#{file}#{size + 1}.#{type}") +# end +# end +# #-------------------------# +# # Set for module SaveData # +# #-------------------------# +# module SaveData +# def self.delete_file(file = FILE_PATH) +# File.delete(file) +# File.delete(file + '.bak') if File.file?(file + '.bak') +# end +# +# def self.move_old_windows_save +# FileSave.dirv19 +# FileSave.dirv18 +# end +# +# def self.changeFILEPATH(new = nil) +# return if new.nil? +# const_set(:FILE_PATH, new) +# end +# end +# #---------------------# +# # Set 'set_up_system' # +# #---------------------# +# module Game +# def self.set_up_system +# SaveData.changeFILEPATH($storenamefilesave.nil? ? FileSave.name : $storenamefilesave) +# SaveData.move_old_windows_save if System.platform[/Windows/] +# save_data = (SaveData.exists?) ? SaveData.read_from_file(SaveData::FILE_PATH) : {} +# if save_data.empty? +# SaveData.initialize_bootup_values +# else +# SaveData.load_bootup_values(save_data) +# end +# # Set resize factor +# pbSetResizeFactor([$PokemonSystem.screensize, 4].min) +# # Set language (and choose language if there is no save file) +# if Settings::LANGUAGES.length >= 2 +# $PokemonSystem.language = pbChooseLanguage if save_data.empty? +# pbLoadMessages('Data/' + Settings::LANGUAGES[$PokemonSystem.language][1]) +# end +# end +# end +# #--------------------# +# # Set emergency save # +# #--------------------# +# def pbEmergencySave +# oldscene = $scene +# $scene = nil +# pbMessage(_INTL("The script is taking too long. The game will restart.")) +# return if !$Trainer +# # It will store the last save file when you dont file save +# count = FileSave.count +# SaveData.changeFILEPATH($storenamefilesave.nil? ? FileSave.name : $storenamefilesave) +# if SaveData.exists? +# File.open(SaveData::FILE_PATH, 'rb') do |r| +# File.open(SaveData::FILE_PATH + '.bak', 'wb') do |w| +# while s = r.read(4096) +# w.write s +# end +# end +# end +# end +# if Game.save +# pbMessage(_INTL("\\se[]The game was saved.\\me[GUI save game] The previous save file has been backed up.\\wtnp[30]")) +# else +# pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]")) +# end +# $scene = oldscene +# end +# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# # Save # +# #------------------------------------------------------------------------------# +# # Custom message +# def pbCustomMessageForSave(message, commands, index, &block) +# return pbMessage(message, commands, index, &block) +# end +# +# # Save screen +# class PokemonSaveScreen +# def pbSaveScreen +# ret = false +# # Check for renaming +# FileSave.rename +# # Count save file +# count = FileSave.count +# # Start +# @scene.pbStartScreen +# msg = _INTL("What do you want to do?") +# cmds = [_INTL("Save"), +# _INTL("Save to new file"), +# _INTL("Overwrite another save"), +# _INTL("Cancel") +# ] +# cmd2 = pbCustomMessageForSave(msg, cmds, 3) +# +# # New save file +# case cmd2 +# when 1 +# ret = writeToNewSaveFile(count) +# # Overwrite +# when 2 +# ret = overwriteSaveFile(count) +# when 0 +# ret = overwriteCurrentFile(count) +# end +# +# @scene.pbEndScreen +# return ret +# end +# +# def overwriteCurrentFile(count) +# if !$storenamefilesave.nil? && count > 0 +# SaveData.changeFILEPATH($storenamefilesave) +# if Game.save +# pbMessage(_INTL("\\se[]{1} saved the game.\\me[GUI save game]\\wtnp[30]", $Trainer.name)) +# ret = true +# else +# pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]")) +# ret = false +# end +# +# SaveData.changeFILEPATH(!$storenamefilesave.nil? ? $storenamefilesave : FileSave.name) +# return ret +# else +# return writeToNewSaveFile(count) +# end +# end +# +# def overwriteSaveFile(count) +# if count <= 0 +# pbMessage(_INTL("No save file was found.")) +# else +# pbFadeOutIn { +# file = ScreenChooseFileSave.new(count) +# file.movePanel +# file.endScene +# return file.staymenu +# } +# end +# end +# +# def writeToNewSaveFile(count) +# SaveData.changeFILEPATH(FileSave.name(count + 1)) +# ret = false +# if Game.save +# pbMessage(_INTL("\\se[]{1} saved the game.\\me[GUI save game]\\wtnp[30]", $Trainer.name)) +# ret = true +# else +# pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]")) +# end +# SaveData.changeFILEPATH(!$storenamefilesave.nil? ? $storenamefilesave : FileSave.name) +# return ret +# end +# end +# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# # Load # +# #------------------------------------------------------------------------------# +# class PokemonLoadScreen +# def initialize(scene) +# @scene = scene +# end +# +# def pbStartLoadScreen +# commands = [] +# cmd_continue = -1 +# cmd_new_game = -1 +# cmd_options = -1 +# cmd_debug = -1 +# cmd_quit = -1 +# show_continue = FileSave.count > 0 +# commands[cmd_continue = commands.length] = _INTL('Continue') if show_continue +# commands[cmd_new_game = commands.length] = _INTL('New Game') +# commands[cmd_options = commands.length] = _INTL('Options') +# commands[cmd_delete = commands.length] = _INTL('Delete Save') if show_continue +# commands[cmd_debug = commands.length] = _INTL('Debug') if $DEBUG +# commands[cmd_quit = commands.length] = _INTL('Quit Game') +# @scene.pbStartScene(commands, false, nil, 0, 0) +# @scene.pbStartScene2 +# loop do +# command = @scene.pbChoose(commands) +# pbPlayDecisionSE if command != cmd_quit +# case command +# when cmd_continue +# pbFadeOutIn { +# file = ScreenChooseFileSave.new(FileSave.count) +# file.movePanel(1) +# @scene.pbEndScene if !file.staymenu +# file.endScene +# return if !file.staymenu +# } +# when cmd_new_game +# @scene.pbEndScene +# Game.start_new +# return +# when cmd_options +# pbFadeOutIn do +# scene = PokemonOption_Scene.new +# screen = PokemonOptionScreen.new(scene) +# screen.pbStartScreen(true) +# end +# when cmd_debug +# pbFadeOutIn { pbDebugMenu(false) } +# when cmd_quit +# pbPlayCloseMenuSE +# @scene.pbEndScene +# $scene = nil +# return +# when cmd_delete +# #pbStartDeleteScreen +# deleteFileMenu(FileSave.count) +# else +# pbPlayBuzzerSE +# end +# end +# end +# +# def deleteFileMenu(count) +# if count <= 0 +# pbMessage(_INTL("No save file was found.")) +# else +# pbFadeOutIn { +# file = ScreenChooseFileSave.new(count) +# file.movePanel(2) +# file.endScene +# Graphics.frame_reset if file.deletefile +# } +# # Return menu +# return false +# end +# end +# +# def pbStartDeleteScreen +# @scene.pbStartDeleteScene +# @scene.pbStartScene2 +# count = FileSave.count +# if count < 0 +# pbMessage(_INTL("No save file was found.")) +# else +# msg = _INTL("What do you want to do?") +# cmds = [_INTL("Delete All File Save"), _INTL("Delete Only One File Save"), _INTL("Cancel")] +# cmd = pbCustomMessageForSave(msg, cmds, 3) +# case cmd +# when 0 +# if pbConfirmMessageSerious(_INTL("Delete all saves?")) +# pbMessage(_INTL("Once data has been deleted, there is no way to recover it.\1")) +# if pbConfirmMessageSerious(_INTL("Delete the saved data anyway?")) +# pbMessage(_INTL("Deleting all data. Don't turn off the power.\\wtnp[0]")) +# haserrorwhendelete = false +# count.times { |i| +# name = FileSave.name(i + 1, false) +# begin +# SaveData.delete_file(name) +# rescue +# haserrorwhendelete = true +# end +# } +# pbMessage(_INTL("You have at least one file that cant delete and have error")) if haserrorwhendelete +# Graphics.frame_reset +# pbMessage(_INTL("The save file was deleted.")) +# end +# end +# when 1 +# pbFadeOutIn { +# file = ScreenChooseFileSave.new(count) +# file.movePanel(2) +# file.endScene +# Graphics.frame_reset if file.deletefile +# } +# end +# end +# @scene.pbEndScene +# $scene = pbCallTitle +# end +# end +# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# #------------------------------------------------------------------------------# +# # Scene for save menu, load menu and delete menu # +# #------------------------------------------------------------------------------# +# class ScreenChooseFileSave +# attr_reader :staymenu +# attr_reader :deletefile +# +# def initialize(count) +# @sprites = {} +# @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) +# @viewport.z = 99999 +# # Set value +# # Check quantity +# @count = count +# if @count <= 0 +# pbMessage("No save file was found.") +# return +# end +# # Check still menu +# @staymenu = false +# @deletefile = false +# # Check position +# @position = 0 +# # Check position if count > 7 +# @choose = 0 +# # Set position of panel 'information' +# @posinfor = 0 +# # Quantity of panel in information page +# @qinfor = 0 +# # Check mystery gift +# @mysgif = false +# end +# +# # Set background (used "loadbg") +# def drawBg +# color = Color.new(248, 248, 248) +# addBackgroundOrColoredPlane(@sprites, "background", "loadbg", color, @viewport) +# end +# +# #------------------------------------------------------------------------------- +# # Set Panel +# #------------------------------------------------------------------------------- +# # Draw panel +# def startPanel +# # Check and rename +# FileSave.rename +# # Start +# drawBg +# # Set bar +# num = (@count > 7) ? 7 : @count +# (0...num).each { |i| +# create_sprite("panel #{i}", "loadPanels", @viewport) +# w = 384; h = 46 +# set_src_wh_sprite("panel #{i}", w, h) +# x = 16; y = 444 +# set_src_xy_sprite("panel #{i}", x, y) +# x = 24 * 2; y = 16 * 2 + 48 * i +# set_xy_sprite("panel #{i}", x, y) +# } +# # Set choose bar +# create_sprite("choose panel", "loadPanels", @viewport) +# w = 384; h = 46 +# set_src_wh_sprite("choose panel", w, h) +# x = 16; y = 444 + 46 +# set_src_xy_sprite("choose panel", x, y) +# choosePanel(@choose) +# # Set text +# create_sprite_2("text", @viewport) +# textPanel +# pbFadeInAndShow(@sprites) { update } +# end +# +# def choosePanel(pos = 0) +# x = 24 * 2; y = 16 * 2 + 48 * pos +# set_xy_sprite("choose panel", x, y) +# end +# +# # Draw text panel +# BaseColor = Color.new(252, 252, 252) +# ShadowColor = Color.new(0, 0, 0) +# +# def textPanel(font = nil) +# return if @count <= 0 +# bitmap = @sprites["text"].bitmap +# bitmap.clear +# if @count > 0 && @count < 7 +# namesave = 0; endnum = @count +# else +# namesave = (@position > @count - 7) ? @count - 7 : @position +# endnum = 7 +# end +# textpos = [] +# (0...endnum).each { |i| +# string = _INTL("Save File #{namesave + 1 + i}") +# if i + 1 == getCurrentSaveFileNumber() +# string += " (Current)" +# end +# x = 24 * 2 + 36; y = 16 * 2 + 5 + 48 * i +# textpos << [string, x, y, 0, BaseColor, ShadowColor] +# } +# (font.nil?) ? pbSetSystemFont(bitmap) : bitmap.font.name = font +# pbDrawTextPositions(bitmap, textpos) +# end +# +# def getCurrentSaveFileNumber() +# saveFilePath = $storenamefilesave +# return nil if saveFilePath == nil +# begin +# filename = saveFilePath.split(".")[0] +# return filename[-1].to_i +# rescue nil +# end +# end +# +# # Move panel +# # Type: 0: Save; 1: Load; 2: Delete +# def movePanel(type = 0) +# infor = false; draw = true; loadmenu = false +# @type = type +# loop do +# # Panel Page +# if !loadmenu +# if !infor +# if draw; +# startPanel; draw = false +# else +# # Update +# update_ingame +# if checkInput(Input::UP) +# @position -= 1 +# @choose -= 1 +# if @choose < 0 +# if @position < 0 +# @choose = (@count < 7) ? @count - 1 : 6 +# else +# @choose = 0 +# end +# end +# @position = @count - 1 if @position < 0 +# # Move choose panel +# choosePanel(@choose) +# # Draw text +# textPanel +# end +# if checkInput(Input::DOWN) +# @position += 1 +# @choose += 1 if @position > @count - 7 +# (@choose = 0; @position = 0) if @position >= @count +# # Move choose panel +# choosePanel(@choose) +# # Draw text +# textPanel +# end +# if checkInput(Input::USE) +# dispose +# draw = true +# if self.fileLoad.empty? +# @choose = 0; @position = 0 +# if FileSave.count == 0 +# pbMessage(_INTL('You dont have any save file. Restart game now.')) +# @staymenu = false +# $scene = pbCallTitle if @type == 1 +# break +# end +# else +# infor = true +# end +# end +# if checkInput(Input::BACK) +# @staymenu = true if @type == 1 +# break +# end +# end +# # Information page +# elsif infor +# if draw; +# startPanelInfor(@type); draw = false +# else +# # Update +# update_ingame +# # Load file +# loadmenu = true if @type == 1 +# if checkInput(Input::USE) +# # Save file +# case @type +# when 0 +# SaveData.changeFILEPATH(FileSave.name(@position + 1)) +# if Game.save +# pbMessage(_INTL("\\se[]{1} saved the game.\\me[GUI save game]\\wtnp[30]", $Trainer.name)) +# ret = true +# else +# pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]")) +# ret = false +# end +# SaveData.changeFILEPATH($storenamefilesave.nil? ? FileSave.name : $storenamefilesave) +# break +# # Delete file +# when 2 +# if pbConfirmMessageSerious(_INTL("Delete all saved data?")) +# pbMessage(_INTL("Once data has been deleted, there is no way to recover it.\1")) +# if pbConfirmMessageSerious(_INTL("Delete the saved data anyway?")) +# pbMessage(_INTL("Deleting all data. Don't turn off the power.\\wtnp[0]")) +# # Delete +# self.deleteFile +# @deletefile = true +# end +# end +# break +# end +# end +# (dispose; draw = true; infor = false) if checkInput(Input::BACK) +# end +# end +# else +# # Update +# update_ingame +# # Start +# if @qinfor > 0 +# if checkInput(Input::UP) +# @posinfor -= 1 +# @posinfor = @qinfor if @posinfor < 0 +# choosePanelInfor +# end +# if checkInput(Input::DOWN) +# @posinfor += 1 +# @posinfor = 0 if @posinfor > @qinfor +# choosePanelInfor +# end +# end +# if checkInput(Input::USE) +# # Set up system again +# $storenamefilesave = FileSave.name(@position + 1) +# Game.set_up_system +# if @posinfor == 0 +# Game.load(self.fileLoad) +# @staymenu = false +# break +# # Mystery Gift +# elsif @posinfor == 1 && @mysgif +# pbFadeOutIn { +# pbDownloadMysteryGift(self.fileLoad[:player]) +# @posinfor = 0; @qinfor = 0; @mysgif = false +# dispose; draw = true; loadmenu = false; infor = false +# } +# # Language +# elsif Settings::LANGUAGES.length >= 2 && (@posinfor == 2 || (@posinfor == 1 && !@mysgif)) +# $PokemonSystem.language = pbChooseLanguage +# pbLoadMessages('Data/' + Settings::LANGUAGES[$PokemonSystem.language][1]) +# self.fileLoad[:pokemon_system] = $PokemonSystem +# File.open(FileSave.name(@position + 1), 'wb') { |file| Marshal.dump(self.fileLoad, file) } +# @posinfor = 0; @qinfor = 0; @mysgif = false +# dispose; draw = true; loadmenu = false; infor = false +# end +# end +# if checkInput(Input::BACK) +# @posinfor = 0; @qinfor = 0; @mysgif = false +# dispose; draw = true; loadmenu = false; infor = false +# end +# end +# end +# end +# +# #------------------------------------------------------------------------------- +# # Set information +# #------------------------------------------------------------------------------- +# def startPanelInfor(type) +# # Draw background +# drawBg +# create_sprite("infor panel 0", "loadPanels", @viewport) +# w = 408; h = 222 +# set_src_wh_sprite("infor panel 0", w, h) +# x = 0; y = 0 +# set_src_xy_sprite("infor panel 0", x, y) +# x = 24 * 2; y = 16 * 2 +# set_xy_sprite("infor panel 0", x, y) +# drawInfor(type) +# end +# +# # Color +# TEXTCOLOR = Color.new(232, 232, 232) +# TEXTSHADOWCOLOR = Color.new(136, 136, 136) +# MALETEXTCOLOR = Color.new(56, 160, 248) +# MALETEXTSHADOWCOLOR = Color.new(56, 104, 168) +# FEMALETEXTCOLOR = Color.new(240, 72, 88) +# FEMALETEXTSHADOWCOLOR = Color.new(160, 64, 64) +# +# # Draw information (text) +# def drawInfor(type, font = nil) +# # Set trainer +# trainer = self.fileLoad[:player] +# # Set mystery gift and language +# if type == 1 +# mystery = self.fileLoad[:player].mystery_gift_unlocked +# @mysgif = mystery +# @qinfor += 1 if mystery +# @qinfor += 1 if Settings::LANGUAGES.length >= 2 +# (0...@qinfor).each { |i| +# create_sprite("panel load #{i}", "loadPanels", @viewport) +# w = 384; h = 46 +# set_src_wh_sprite("panel load #{i}", w, h) +# x = 16; y = 444 +# set_src_xy_sprite("panel load #{i}", x, y) +# x = 24 * 2 + 8; y = 16 * 2 + 48 * i + 112 * 2 +# set_xy_sprite("panel load #{i}", x, y) +# } if @qinfor > 0 +# end +# # Move panel (information) +# create_sprite("infor panel 1", "loadPanels", @viewport) +# w = 408; h = 222 +# set_src_wh_sprite("infor panel 1", w, h) +# x = 0; y = 222 +# set_src_xy_sprite("infor panel 1", x, y) +# x = 24 * 2; y = 16 * 2 +# set_xy_sprite("infor panel 1", x, y) +# # Set +# create_sprite_2("text", @viewport) +# framecount = self.fileLoad[:frame_count] +# totalsec = (framecount || 0) / Graphics.frame_rate +# bitmap = @sprites["text"].bitmap +# textpos = [] +# # Text of trainer +# x = 24 * 2; y = 16 * 2 +# title = (type == 0) ? "Save" : (type == 1) ? "Load" : "Delete" +# textpos << [_INTL("#{title}"), 16 * 2 + x, 5 * 2 + y, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# textpos << [_INTL("Badges:"), 16 * 2 + x, 56 * 2 + y, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# textpos << [trainer.badge_count.to_s, 103 * 2 + x, 56 * 2 + y, 1, TEXTCOLOR, TEXTSHADOWCOLOR] +# textpos << [_INTL("Pokédex:"), 16 * 2 + x, 72 * 2 + y, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# textpos << [trainer.pokedex.seen_count.to_s, 103 * 2 + x, 72 * 2 + y, 1, TEXTCOLOR, TEXTSHADOWCOLOR] +# textpos << [_INTL("Time:"), 16 * 2 + x, 88 * 2 + y, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# hour = totalsec / 60 / 60 +# min = totalsec / 60 % 60 +# if hour > 0 +# textpos << [_INTL("{1}h {2}m", hour, min), 103 * 2 + x, 88 * 2 + y, 1, TEXTCOLOR, TEXTSHADOWCOLOR] +# else +# textpos << [_INTL("{1}m", min), 103 * 2 + x, 88 * 2 + y, 1, TEXTCOLOR, TEXTSHADOWCOLOR] +# end +# if trainer.male? +# textpos << [trainer.name, 56 * 2 + x, 32 * 2 + y, 0, MALETEXTCOLOR, MALETEXTSHADOWCOLOR] +# elsif textpos << [trainer.name, 56 * 2 + x, 32 * 2 + y, 0, FEMALETEXTCOLOR, FEMALETEXTSHADOWCOLOR] +# else +# textpos << [trainer.name, 56 * 2 + x, 32 * 2 + y, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# end +# mapid = self.fileLoad[:map_factory].map.map_id +# mapname = pbGetMapNameFromId(mapid) +# mapname.gsub!(/\\PN/, trainer.name) +# textpos << [mapname, 193 * 2 + x, 5 * 2 + y, 1, TEXTCOLOR, TEXTSHADOWCOLOR] +# # Load menu +# if type == 1 +# # Mystery gift / Language +# string = [] +# string << _INTL("Mystery Gift") if mystery +# string << _INTL("Language") if Settings::LANGUAGES.length >= 2 +# if @qinfor > 0 +# (0...@qinfor).each { |i| +# str = string[i] +# x1 = x + 36 + 8 +# y1 = y + 5 + 112 * 2 + 48 * i +# textpos << [str, x1, y1, 0, TEXTCOLOR, TEXTSHADOWCOLOR] +# } +# end +# end +# # Set text +# (font.nil?) ? pbSetSystemFont(bitmap) : bitmap.font.name = font +# pbDrawTextPositions(bitmap, textpos) +# +# # Set trainer (draw) +# if !trainer || !trainer.party +# # Fade +# pbFadeInAndShow(@sprites) { update } +# return +# else +# meta = GameData::Metadata.get_player(trainer.character_ID) +# if meta +# filename = pbGetPlayerCharset(meta, 1, trainer, true) +# @sprites["player"] = TrainerWalkingCharSprite.new(filename, @viewport) +# charwidth = @sprites["player"].bitmap.width +# charheight = @sprites["player"].bitmap.height +# @sprites["player"].x = 56 * 2 - charwidth / 8 +# @sprites["player"].y = 56 * 2 - charheight / 8 +# @sprites["player"].src_rect = Rect.new(0, 0, charwidth / 4, charheight / 4) +# end +# for i in 0...trainer.party.length +# @sprites["party#{i}"] = PokemonIconSprite.new(trainer.party[i], @viewport) +# @sprites["party#{i}"].setOffset(PictureOrigin::Center) +# @sprites["party#{i}"].x = (167 + 33 * (i % 2)) * 2 +# @sprites["party#{i}"].y = (56 + 25 * (i / 2)) * 2 +# @sprites["party#{i}"].z = 99999 +# end +# # Fade +# pbFadeInAndShow(@sprites) { update } +# end +# end +# +# def choosePanelInfor +# if @posinfor == 0 +# w = 408; h = 222 +# set_src_wh_sprite("infor panel 1", w, h) +# x = 0; y = 222 +# set_src_xy_sprite("infor panel 1", x, y) +# x = 24 * 2; y = 16 * 2 +# set_xy_sprite("infor panel 1", x, y) +# else +# w = 384; h = 46 +# set_src_wh_sprite("infor panel 1", w, h) +# x = 16; y = 490 +# set_src_xy_sprite("infor panel 1", x, y) +# x = 24 * 2 + 8 +# y = 16 * 2 + 48 * (@posinfor - 1) + 112 * 2 +# set_xy_sprite("infor panel 1", x, y) +# end +# end +# +# #------------------------------------------------------------------------------- +# # Delete +# #------------------------------------------------------------------------------- +# def deleteFile +# savefile = FileSave.name(@position + 1, false) +# begin +# SaveData.delete_file(savefile) +# pbMessage(_INTL('The saved data was deleted.')) +# rescue SystemCallError +# pbMessage(_INTL('All saved data could not be deleted.')) +# end +# end +# +# #------------------------------------------------------------------------------- +# # Load File +# #------------------------------------------------------------------------------- +# def load_save_file(file_path) +# save_data = SaveData.read_from_file(file_path) +# unless SaveData.valid?(save_data) +# if File.file?(file_path + '.bak') +# pbMessage(_INTL('The save file is corrupt. A backup will be loaded.')) +# save_data = load_save_file(file_path + '.bak') +# else +# self.prompt_save_deletion +# return {} +# end +# end +# return save_data +# end +# +# # Called if all save data is invalid. +# # Prompts the player to delete the save files. +# def prompt_save_deletion +# pbMessage(_INTL('Cant load this save file')) +# pbMessage(_INTL('The save file is corrupt, or is incompatible with this game.')) +# exit unless pbConfirmMessageSerious(_INTL('Do you want to delete this save file?')) +# self.deleteFile +# $game_system = Game_System.new +# $PokemonSystem = PokemonSystem.new +# end +# +# def fileLoad +# return load_save_file(FileSave.name(@position + 1)) +# end +# +# #------------------------------------------------------------------------------- +# # Set SE for input +# #------------------------------------------------------------------------------- +# def checkInput(name) +# if Input.trigger?(name) +# (name == Input::BACK) ? pbPlayCloseMenuSE : pbPlayDecisionSE +# return true +# end +# return false +# end +# +# #------------------------------------------------------------------------------- +# # Set bitmap +# #------------------------------------------------------------------------------- +# # Image +# def create_sprite(spritename, filename, vp, dir = "Pictures") +# @sprites["#{spritename}"] = Sprite.new(vp) +# @sprites["#{spritename}"].bitmap = Bitmap.new("Graphics/#{dir}/#{filename}") +# end +# +# # Set x, y +# def set_xy_sprite(spritename, x, y) +# @sprites["#{spritename}"].x = x +# @sprites["#{spritename}"].y = y +# end +# +# # Set src +# def set_src_wh_sprite(spritename, w, h) +# @sprites["#{spritename}"].src_rect.width = w +# @sprites["#{spritename}"].src_rect.height = h +# end +# +# def set_src_xy_sprite(spritename, x, y) +# @sprites["#{spritename}"].src_rect.x = x +# @sprites["#{spritename}"].src_rect.y = y +# end +# +# #------------------------------------------------------------------------------- +# # Text +# #------------------------------------------------------------------------------- +# # Draw +# def create_sprite_2(spritename, vp) +# @sprites["#{spritename}"] = Sprite.new(vp) +# @sprites["#{spritename}"].bitmap = Bitmap.new(Graphics.width, Graphics.height) +# @sprites["#{spritename}"].bitmap.clear +# end +# +# #------------------------------------------------------------------------------- +# def dispose +# pbDisposeSpriteHash(@sprites) +# end +# +# def update +# pbUpdateSpriteHash(@sprites) +# end +# +# def update_ingame +# Graphics.update +# Input.update +# pbUpdateSpriteHash(@sprites) +# end +# +# def endScene +# dispose +# @viewport.dispose +# end +# end \ No newline at end of file diff --git a/Data/Scripts/050_AddOns/UnrealTime.rb b/Data/Scripts/050_AddOns/UnrealTime.rb new file mode 100644 index 000000000..9369bb52e --- /dev/null +++ b/Data/Scripts/050_AddOns/UnrealTime.rb @@ -0,0 +1,278 @@ +#=============================================================================== +# * Unreal Time System - by FL (Credits will be apreciated) +#=============================================================================== +# +# This script is for Pokémon Essentials. It makes the time in game uses its +# own clock that only pass when you are in game instead of using real time +# (like Minecraft and Zelda: Ocarina of Time). +# +#== INSTALLATION =============================================================== +# +# To this script works, put it above main OR convert into a plugin. +# +#== HOW TO USE ================================================================= +# +# This script automatic works after installed. +# +# If you wish to add/reduce time, there are 3 ways: +# +# 1. EXTRA_SECONDS/EXTRA_DAYS are variables numbers that hold time passage; +# The time in these variable isn't affected by PROPORTION. +# Example: When the player sleeps you wish to the time in game advance +# 8 hours, so put in EXTRA_SECONDS a game variable number and sum +# 28800 (60*60*8) in this variable every time that the players sleeps. +# +# 2. 'UnrealTime.add_seconds(seconds)' and 'UnrealTime.add_days(days)' does the +# same thing, in fact, EXTRA_SECONDS/EXTRA_DAYS call these methods. +# +# 3. 'UnrealTime.advance_to(16,17,18)' advance the time to a fixed time of day, +# 16:17:18 on this example. +# +#== NOTES ====================================================================== +# +# If you wish to some parts still use real time like the Trainer Card start time +# and Pokémon Trainer Memo, just change 'pbGetTimeNow' to 'Time.now' in their +# scripts. +# +# This script uses the Ruby Time class. Before Essentials version 19 (who came +# with 64-bit ruby) it can only have 1901-2038 range. +# +# Some time methods: +# 'pbGetTimeNow.year', 'pbGetTimeNow.mon' (the numbers from 1-12), +# 'pbGetTimeNow.day','pbGetTimeNow.hour', 'pbGetTimeNow.min', +# 'pbGetTimeNow.sec', 'pbGetAbbrevMonthName(pbGetTimeNow.mon)', +# 'pbGetTimeNow.strftime("%A")' (displays weekday name), +# 'pbGetTimeNow.strftime("%I:%M %p")' (displays Hours:Minutes pm/am) +# +#=============================================================================== + +if defined?(PluginManager) && !PluginManager.installed?("Unreal Time System") + PluginManager.register({ + :name => "Unreal Time System", + :version => "1.1", + :link => "https://www.pokecommunity.com/showthread.php?t=285831", + :credits => "FL" + }) +end + +module UnrealTime + # Set false to disable this system (returns Time.now) + ENABLED=true + + # Time proportion here. + # So if it is 100, one second in real time will be 100 seconds in game. + # If it is 60, one second in real time will be one minute in game. + PROPORTION=60 + + # Starting on Essentials v17, the map tone only try to refresh tone each 30 + # real time seconds. + # If this variable number isn't -1, the game use this number instead of 30. + # When time is changed with advance_to or add_seconds, the tone refreshes. + TONE_CHECK_INTERVAL = 10.0 + + # Make this true to time only pass at field (Scene_Map) + # A note to scripters: To make time pass on other scenes, put line + # '$PokemonGlobal.addNewFrameCount' near to line 'Graphics.update' + TIME_STOPS=true + + # Make this true to time pass in battle, during turns and command selection. + # This won't affect the Pokémon and Bag submenus. + # Only works if TIME_STOPS=true. + BATTLE_PASS=true + + # Make this true to time pass when the Dialog box or the main menu are open. + # This won't affect the submenus like Pokémon and Bag. + # Only works if TIME_STOPS=true. + TALK_PASS=true + + # Choose switch number that when true the time won't pass (or -1 to cancel). + # Only works if TIME_STOPS=true. + SWITCH_STOPS=-1 + + # Choose variable(s) number(s) that can hold time passage (or -1 to cancel). + # Look at description for more details. + EXTRA_SECONDS=79 + EXTRA_DAYS=-1 + + # Initial date. In sequence: Year, month, day, hour and minutes. + # Method UnrealTime.reset resets time back to this time. + def self.initial_date + return Time.local(2000,1,1, 12,0) + end + + # Advance to next time. If time already passed, advance + # into the time on the next day. + # Hour is 0..23 + def self.advance_to(hour,min=0,sec=0) + if hour < 0 || hour > 23 + raise RangeError, "hour is #{hour}, should be 0..23" + end + day_seconds = 60*60*24 + seconds_now = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec + target_seconds = hour*60*60+min*60+sec + seconds_added = target_seconds-seconds_now + seconds_added += day_seconds if seconds_added<0 + $PokemonGlobal.newFrameCount+=seconds_added + PBDayNight.sheduleToneRefresh + end + + # Resets time to initial_date. + def self.reset + raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS + $game_variables[EXTRA_SECONDS]=0 if EXTRA_DAYS>0 + $game_variables[EXTRA_DAYS]=0 if EXTRA_DAYS>0 + $PokemonGlobal.newFrameCount=0 + $PokemonGlobal.extraYears=0 + PBDayNight.sheduleToneRefresh + end + + # Does the same thing as EXTRA_SECONDS variable. + def self.add_seconds(seconds) + raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS + $PokemonGlobal.newFrameCount+=(seconds*Graphics.frame_rate)/PROPORTION.to_f + PBDayNight.sheduleToneRefresh + end + + def self.add_days(days) + add_seconds(60*60*24*days) + end + + NEED_32_BIT_FIX = [''].pack('p').size <= 4 +end + +# Essentials V18 and lower compatibility +module Settings + TIME_SHADING = defined?(ENABLESHADING) ? ENABLESHADING : ::TIME_SHADING +end if defined?(TIME_SHADING) || defined?(ENABLESHADING) + +module PBDayNight + class << self + if method_defined?(:getTone) && UnrealTime::TONE_CHECK_INTERVAL > 0 + def getTone + @cachedTone = Tone.new(0,0,0) if !@cachedTone + return @cachedTone if !Settings::TIME_SHADING + toneNeedUpdate = (!@dayNightToneLastUpdate || + Graphics.frame_count-@dayNightToneLastUpdate >= + Graphics.frame_rate*UnrealTime::TONE_CHECK_INTERVAL + ) + if toneNeedUpdate + getToneInternal + @dayNightToneLastUpdate = Graphics.frame_count + end + return @cachedTone + end + end + + # Shedule a tone refresh on the next try (probably next frame) + def sheduleToneRefresh + @dayNightToneLastUpdate = nil + end + end +end + +def pbGetTimeNow + return Time.now if !$PokemonGlobal || !UnrealTime::ENABLED + day_seconds = 60*60*24 + if UnrealTime::TIME_STOPS + # Sum the extra values to newFrameCount + if UnrealTime::EXTRA_SECONDS>0 + UnrealTime.add_seconds(pbGet(UnrealTime::EXTRA_SECONDS)) + $game_variables[UnrealTime::EXTRA_SECONDS]=0 + end + if UnrealTime::EXTRA_DAYS>0 + UnrealTime.add_seconds(day_seconds*pbGet(UnrealTime::EXTRA_DAYS)) + $game_variables[UnrealTime::EXTRA_DAYS]=0 + end + elsif UnrealTime::EXTRA_SECONDS>0 && UnrealTime::EXTRA_DAYS>0 + # Checks to regulate the max/min values at UnrealTime::EXTRA_SECONDS + while pbGet(UnrealTime::EXTRA_SECONDS)>=day_seconds + $game_variables[UnrealTime::EXTRA_SECONDS]-=day_seconds + $game_variables[UnrealTime::EXTRA_DAYS]+=1 + end + while pbGet(UnrealTime::EXTRA_SECONDS)<=-day_seconds + $game_variables[UnrealTime::EXTRA_SECONDS]+=day_seconds + $game_variables[UnrealTime::EXTRA_DAYS]-=1 + end + end + start_time=UnrealTime.initial_date + if UnrealTime::TIME_STOPS + time_played=$PokemonGlobal.newFrameCount + else + time_played=Graphics.frame_count + end + time_played=(time_played*UnrealTime::PROPORTION)/Graphics.frame_rate + time_jumped=0 + if UnrealTime::EXTRA_SECONDS>-1 + time_jumped+=pbGet(UnrealTime::EXTRA_SECONDS) + end + if UnrealTime::EXTRA_DAYS>-1 + time_jumped+=pbGet(UnrealTime::EXTRA_DAYS)*day_seconds + end + time_ret = 0 + # Before Essentials V19, there is a year limit. To prevent crashes due to this + # limit, every time that you reach in year 2036 the system will subtract 6 + # years (to works with leap year) from your date and sum in + # $PokemonGlobal.extraYears. You can sum your actual year with this extraYears + # when displaying years. + loop do + time_fix=0 + if $PokemonGlobal.extraYears!=0 + time_fix = $PokemonGlobal.extraYears*day_seconds*(365*6+1)/6 + end + time_ret=start_time+(time_played+time_jumped-time_fix) + break if !UnrealTime::NEED_32_BIT_FIX || time_ret.year<2036 + $PokemonGlobal.extraYears+=6 + end + return time_ret +end + +if UnrealTime::ENABLED + class PokemonGlobalMetadata + attr_accessor :newFrameCount # Became float when using extra values + attr_accessor :extraYears + + def addNewFrameCount + return if (UnrealTime::SWITCH_STOPS>0 && + $game_switches[UnrealTime::SWITCH_STOPS]) + self.newFrameCount+=1 + end + + def newFrameCount + @newFrameCount=0 if !@newFrameCount + return @newFrameCount + end + + def extraYears + @extraYears=0 if !@extraYears + return @extraYears + end + end + + if UnrealTime::TIME_STOPS + class Scene_Map + alias :updateold :update + def update + $PokemonGlobal.addNewFrameCount + updateold + end + + if UnrealTime::TALK_PASS + alias :miniupdateold :miniupdate + def miniupdate + $PokemonGlobal.addNewFrameCount + miniupdateold + end + end + end + + if UnrealTime::BATTLE_PASS + class PokeBattle_Scene + alias :pbGraphicsUpdateold :pbGraphicsUpdate + def pbGraphicsUpdate + $PokemonGlobal.addNewFrameCount + pbGraphicsUpdateold + end + end + end + end +end \ No newline at end of file diff --git a/Data/Skills.rxdata b/Data/Skills.rxdata index a45219f5e..61cba7ea2 100644 Binary files a/Data/Skills.rxdata and b/Data/Skills.rxdata differ diff --git a/Data/States.rxdata b/Data/States.rxdata index 868d49e59..0f9b4ae5d 100644 Binary files a/Data/States.rxdata and b/Data/States.rxdata differ diff --git a/Data/System.rxdata b/Data/System.rxdata index e14cac62e..fa697f3e3 100644 Binary files a/Data/System.rxdata and b/Data/System.rxdata differ diff --git a/Data/Tilesets.rxdata b/Data/Tilesets.rxdata index 838a3a9d6..e3795ef66 100644 Binary files a/Data/Tilesets.rxdata and b/Data/Tilesets.rxdata differ diff --git a/Data/Weapons.rxdata b/Data/Weapons.rxdata index c7ea19a7a..d9bd35260 100644 Binary files a/Data/Weapons.rxdata and b/Data/Weapons.rxdata differ diff --git a/Data/messages.dat b/Data/messages.dat index 64b185bea..986b43038 100644 Binary files a/Data/messages.dat and b/Data/messages.dat differ diff --git a/changelog.txt b/changelog.txt index a129306fc..176bd8e19 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,29 @@ +5.1 +Many, many bugfixes + +## Re-added features ## +In-game clock +Speed-up button + +#Removals +Removed Trainer House +Removed the Convert Pokemon option from the update menu +Oak no longer gives a Johto starter after beating the league + +##New Stuff +Added Quick Surf option +Added Kin Island Club +Added support for multiple savefiles +Replaced Delibird's hidden ability with Snow Warning +Added overworld sprites for a few important trainers +Added animations for using Rock Smash and Cut in the overworld +Traded Pokémon now become owned by player when fused (so they can be unfused) +Made Oak's Lab look more like the HGSS version +Added egg move tutor in Battle Factory +Battle Factory now gives Factory Points instead of Rare Candies +Updated critical hits to gen 6 mechanics +Added gen 6 status move immunity from certain types + 5.0 ########################## The 5.0 update brings Infinite Fusion to a new engine, which makes the game run better and allows