- Illimité, vous pouvez choisir max sauvegarde - Beaucoup d'options de configuration - Vous pouvez utiliser l'image de la map de fond - Choisissez le nom des sauvegardes - Le dossier où elles seront stocké - Montrer seulement les renseignements que vous voulez - le texte est éditable pour les renseignements - les events sur la carte sont maintenant présents. - Choisir avec la possibilité de ne montrer que le nom. - Confirmation de sauvegarde
Démo du script: http://www.mediafire.com/?m3mu83x5czaku9l Le script:
Spoiler:
Code:
#========================================================================== # â— [VX] â—¦ Neo Save System V â—¦ â–¡ #--------------------------------------------------------------------------- # â—¦ Author: Woratana [woratana@hotmail.com] # â—¦ Thaiware RPG Maker Community # â—¦ Last Updated: # â—¦ Version: 3.0 -> 5.0 # â—¦ Continued support by Helladen # â—¦ (Screen Shot credit Wortana, Andreas21, and Cybersam) #--------------------------------------------------------------------------- # â—¦ Log V: # - Screenshot support for those who want tone/weather/sprites and # unlike NSS 1.0 the screen is now centered. # - Added an option to stay in save screen after you save the game #--------------------------------------------------------------------------- # â—¦ Log IV: # - New addition for hiding map names. You can control the switch to # allow MAP_NO_NAME_LIST to work or not. # - Revised some of the settings and script organization. # - Added an option to disable the vocab::Gold text right of the number. # - Added an option to use default opacity or not. # - Swap tile compatibility support. #--------------------------------------------------------------------------- # â—¦ Log III: # - Change back to draw tile map as screenshot. Don't need any image. # - For drawing tile map, the characters won't show on the tile map. #--------------------------------------------------------------------------- # â—¦ Log II: # - Screenshot DLL is not work with Vista Aero, so I remove it # and use image for each map instead of screenshot. # - Actor's level in last version (V.1) is incorrect. #--------------------------------------------------------------------------- # â—¦ Features: # - Unlimited save slots, you can choose max save slot # - Many configuration options # - Swap tile support # - You can use image for scene's background # - Choose your save file's name, and folder to store save files # - Choose to show only information you want # - Editable text for information's title # - Draw tile map for map that player is currently on. # - Remove text you don't want from map's name (e.g. tags for special script) # - Choose map that you don't want to show the name on # - Include save confirmation window before overwrite old save #===========================================================================
module Wora_NSS Wora_NSS #========================================================================== # * START NEO SAVE SYSTEM - SETUP #-------------------------------------------------------------------------- OPACITY_DEFAULT = true # This will use the default opacity for windows # Please note that this will affect both opacitys below NSS_WINDOW_OPACITY = 255 # All windows' opacity (Lowest 0 - 255 Highest) # You can change this to 0 in case you want to use image for background NSS_IMAGE_BG = '' # Background image file name, it must be in folder Picture # use '' for no background NSS_IMAGE_BG_OPACITY = 255 # Opacity for background image
# If you use the screen shot method this does not matter SWAP_TILE = false # Make this false if you don't use the swap_tile script SWAP_TILE_SWITCH = 84 # The switch needs to be the same as your swap tile # switch, but if SWAP_TILE is false it does not matter
# If this is true it will screen shot the map, if false it will draw it SCREENSHOT_IMAGE = true # Drawing the map is good because it doesn't require # a .DLL or images for the screen shot, but it has sprites, tone, and # weather. You need to turn on swap tile if you have this as false.
IMAGE_FILETYPE = '.png' # Image type for screenshot # '.bmp', or '.jpg', or '.png'
# If this is true then the scene will not change when you save the game SCENE_CHANGE = true # Changes Scene to map if true
MAX_SAVE_SLOT = 20 # Max save slots SLOT_NAME = 'SLOT {id}' # Name of the slot (show in save slots list), use {id} for slot ID SAVE_FILE_NAME = 'Save {id}.rvdata' # Save file name, you can also change its file type from .rvdata to other
# Use {id} for save slot ID SAVE_PATH = '' # Path to store save file, e.g. 'Save/' or '' (for game folder) SAVED_SLOT_ICON = 133 # Icon Index for saved slot
EMPTY_SLOT_ICON = 141 # Icon Index for empty slot EMPTY_SLOT_TEXT = 'Vide' # Text to show for empty slot's data
DRAW_GOLD = true # Draw Gold DRAW_PLAYTIME = true # Draw Playtime DRAW_LOCATION = true # Draw location DRAW_FACE = true # Draw Actor's face DRAW_LEVEL = true # Draw Actor's level DRAW_NAME = true # Draw Actor's name DRAW_TEXT_GOLD = false # Draw the vocab::Gold text to the right of the number
MAP_NAME_TEXT_SUB = %w{} # Text that you want to remove from map name, # e.g. %w{[LN] [DA]} will remove text '[LN]' and '[DA]' from map name MAP_NO_NAME_LIST = [2] # ID of Map that will not show map name, e.g. [1,2,3] MAP_NO_NAME = '???' # What you will use to call the map in the no name list
# This is a switch that can activate or deactivate maps from being displayed as # MAP_NO_NAME. If it is off then maps will return back to normal. MAP_NO_NAME_SWITCH = 95 # This switch has to be on for MAP_NO_NAME_LIST to work
MAP_BORDER = Color.new(0,0,0,200) # Map image border color (R,G,B,Opacity) FACE_BORDER = Color.new(0,0,0,200) # Face border color
# Save confirmation window SFC_Text_Confirm = 'Confirmer' # Text to confirm to save file SFC_Text_Cancel = 'Annuler' # Text to cancel to save SFC_Window_Width = 200 # Width of Confirmation Window SFC_Window_X_Offset = 0 # Move Confirmation Window horizontally SFC_Window_Y_Offset = 0 # Move Confirmation Window vertically
#------------------------------------------------------------------------- # END NEO SAVE SYSTEM - SETUP (Edit below at your own risk) #=========================================================================
#------------------------------------------------------------- # Screenshot V2 by Andreas21 and Cybersam #------------------------------------------------------------- @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), '' @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l' @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' module_function def self.shot(file_name) case IMAGE_FILETYPE when '.bmp'; typid = 0 when '.jpg'; typid = 1 when '.png'; typid = 2 end # Get Screenshot filename = file_name + IMAGE_FILETYPE @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel, typid) end def self.handel game_name = "\0" * 256 @readini.call('Game','Title','',game_name,255,".\\Game.ini") game_name.delete!("\0") return @findwindow.call('RGSS Player',game_name) end
end
class Scene_File < Scene_Base include Wora_NSS attr_reader :window_slotdetail #------------------------------------------------------------------------- # * Start processing #------------------------------------------------------------------------- def start super create_menu_background if NSS_IMAGE_BG != '' @bg = Sprite.new @bg.bitmap = Cache.picture(NSS_IMAGE_BG) @bg.opacity = NSS_IMAGE_BG_OPACITY end @help_window = Window_Help.new command = [] (1..MAX_SAVE_SLOT).each do |i| command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i.to_s } end @window_slotdetail = Window_NSS_SlotDetail.new @window_slotlist = Window_SlotList.new(160, command) @window_slotlist.y = @help_window.height @window_slotlist.height = Graphics.height - @help_window.height if OPACITY_DEFAULT == false @help_window.opacity = NSS_WINDOW_OPACITY @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY end
# Create Folder for Save file if SAVE_PATH != '' Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH) end if @saving @index = $game_temp.last_file_index @help_window.set_text(Vocab::SaveMessage) else @index = self.latest_file_index @help_window.set_text(Vocab::LoadMessage) (1..MAX_SAVE_SLOT).each do |i| @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i) end end @window_slotlist.index = @index # Draw Information @last_slot_index = @window_slotlist.index @window_slotdetail.draw_data(@last_slot_index + 1) end #-------------------------------------------------------------------------- # * Termination Processing #-------------------------------------------------------------------------- def terminate super dispose_menu_background unless @bg.nil? @bg.bitmap.dispose @bg.dispose end @window_slotlist.dispose @window_slotdetail.dispose @help_window.dispose end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super if !@confirm_window.nil? @confirm_window.update if Input.trigger?(Input::C) if @confirm_window.index == 0 determine_savefile @confirm_window.dispose @confirm_window = nil else Sound.play_cancel @confirm_window.dispose @confirm_window = nil end elsif Input.trigger?(Input::B) Sound.play_cancel @confirm_window.dispose @confirm_window = nil end else update_menu_background @window_slotlist.update if @window_slotlist.index != @last_slot_index @last_slot_index = @window_slotlist.index @window_slotdetail.draw_data(@last_slot_index + 1) end @help_window.update update_savefile_selection end end #-------------------------------------------------------------------------- # * Update Save File Selection #-------------------------------------------------------------------------- def update_savefile_selection if Input.trigger?(Input::C) if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1) Sound.play_decision text1 = SFC_Text_Confirm text2 = SFC_Text_Cancel @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2]) @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset else determine_savefile end elsif Input.trigger?(Input::B) Sound.play_cancel return_scene end end
#-------------------------------------------------------------------------- # * Execute Save #-------------------------------------------------------------------------- def do_save if SCREENSHOT_IMAGE File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE, make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE) end file = File.open(make_filename(@last_slot_index), "wb") write_save_data(file) file.close if SCENE_CHANGE $scene = Scene_Map.new else $scene = Scene_File.new(true, false, false) end end #-------------------------------------------------------------------------- # * Execute Load #-------------------------------------------------------------------------- def do_load file = File.open(make_filename(@last_slot_index), "rb") read_save_data(file) file.close $scene = Scene_Map.new RPG::BGM.fade(1500) Graphics.fadeout(60) Graphics.wait(40) @last_bgm.play @last_bgs.play end #-------------------------------------------------------------------------- # * Confirm Save File #-------------------------------------------------------------------------- def determine_savefile if @saving Sound.play_save do_save else if @window_slotdetail.file_exist?(@last_slot_index + 1) Sound.play_load do_load else Sound.play_buzzer return end end $game_temp.last_file_index = @last_slot_index end #-------------------------------------------------------------------------- # * Create Filename # file_index : save file index (0-3) #-------------------------------------------------------------------------- def make_filename(file_index) return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s } end #-------------------------------------------------------------------------- # * Select File With Newest Timestamp #-------------------------------------------------------------------------- def latest_file_index latest_index = 0 latest_time = Time.at(0) (1..MAX_SAVE_SLOT).each do |i| file_name = make_filename(i - 1) next if !@window_slotdetail.file_exist?(i) file_time = File.mtime(file_name) if file_time > latest_time latest_time = file_time latest_index = i - 1 end end return latest_index end
def make_filename(file_index) return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s } end
def file_exist?(slot_id) return @exist_list[slot_id] if !@exist_list[slot_id].nil? @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id)) return @exist_list[slot_id] end
def get_bitmap(path) if !@bitmap_list.include?(path) @bitmap_list[path] = Bitmap.new(path) end return @bitmap_list[path] end
def get_mapname(map_id) if @map_data.nil? @map_data = load_data("Data/MapInfos.rvdata") end if @map_name[map_id].nil? if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH] @map_name[map_id] = MAP_NO_NAME else @map_name[map_id] = @map_data[map_id].name end MAP_NAME_TEXT_SUB.each_index do |i| @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '') @mapname = @map_name[map_id] end end return @map_name[map_id] end
if $tileA1 != nil @tilemap.bitmaps[0] = tile1 else @tilemap.bitmaps[0] = Cache.system("TileA1") end
if $tileA2 != nil @tilemap.bitmaps[1] = tile2 else @tilemap.bitmaps[1] = Cache.system("TileA2") end
if $tileA3 != nil @tilemap.bitmaps[2] = tile3 else @tilemap.bitmaps[2] = Cache.system("TileA3") end
if $tileA4 != nil @tilemap.bitmaps[3] = tile4 else @tilemap.bitmaps[3] = Cache.system("TileA4") end
if $tileA5 != nil @tilemap.bitmaps[4] = tile5 else @tilemap.bitmaps[4] = Cache.system("TileA5") end
if $tileB != nil @tilemap.bitmaps[5] = tile6 else @tilemap.bitmaps[5] = Cache.system("TileB") end
if $tileC != nil @tilemap.bitmaps[6] = tile7 else @tilemap.bitmaps[6] = Cache.system("TileC") end
if $tileD != nil @tilemap.bitmaps[7] = tile8 else @tilemap.bitmaps[7] = Cache.system("TileD") end
if $tileE != nil @tilemap.bitmaps[8] = tile9 else @tilemap.bitmaps[8] = Cache.system("TileE") end
@tilemap.map_data = map_data @tilemap.ox = ox / 8 + 99 @tilemap.oy = oy / 8 + 90 end
def dispose_tilemap unless @tilemap.nil? @tilemap.dispose @tilemap = nil end end end end
class Scene_Title < Scene_Base def check_continue file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' } @continue_enabled = (Dir.glob(file_name).size > 0) end end
class Scene_Map < Scene_Base alias wora_nss_scemap_ter terminate def terminate Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'temp') wora_nss_scemap_ter end end #====================================================================== # END - NEO SAVE SYSTEM by Woratana #======================================================================
Loup-blanc
Poulet trizo Lv.3
Age : 28 Inscrit le : 04/02/2011 Messages : 47
Sujet: Re: [VX] Neo Save System V Dim 10 Avr 2011 - 10:17
Wow ! Même si ça n'est pas toi qui a fait ce script, merci du partage !
TaZ
Age : 30 Inscrit le : 22/11/2008 Messages : 3382
Sujet: Re: [VX] Neo Save System V Sam 15 Oct 2011 - 17:27
Tiens, je UP, j'aurais une question et un conseil pour tous ceux qui utilisent ce script. Il possède deux bugs. Le premier, S4suk3 m'a fait un petit patch pour le régler. Le bug, c'est que si on sauvegardait deux fois de suite sur un même emplacement sans quitter le menu, ça plantait. Z'avez juste à coller ce bout de code en dessous du script du NSS: (Neo Save System)
Code:
# Patch de modification du NeoSaveMachin de Wortanouille # Par Sasuke (http://funkywork.blogspot.com) class Scene_File < Scene_Base #-------------------------------------------------------------------------- # * Execute Save #-------------------------------------------------------------------------- def do_save if SCREENSHOT_IMAGE File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE, make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE) end file = File.open(make_filename(@last_slot_index), "wb") write_save_data(file) file.close $scene = Scene_Map.new end end
Le second bug, et là je n'affirme rien car je ne sais pas si ça vient de moi ou si c'est général, est une erreur au moment de la prise de screen. Quelques fois, au lieu de screener le jeu In Game, ça screene le coin haut-gauche de mon écran. Ça le fait relativement rarement mais ça fait pas du tout pro. Bref, si jamais vous avez le même problème, hésitez pas à le dire, et si quelqu'un pense pouvoir débugger le script, qu'il ne se gène pas ^^'
Garruk
Aventurier Lv.16
Age : 40 Inscrit le : 03/09/2009 Messages : 1503
Sujet: Re: [VX] Neo Save System V Sam 22 Oct 2011 - 17:45
Pour le screen ça m'est déjà arrivé aussi. D'ailleurs ça le fait en mode éditeur et pas à partir du Game, enfin chez moi donc je ne savais pas trop à l'époque si ça venait de moi ou pas. Merci de cette précision et pour le patch. =)
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [VX] Neo Save System V Dim 23 Oct 2011 - 9:02
Ca me l'a aussi fait quand je testais un jeu. Je suis quasiment sur que ça vient de screenshot.dll
TaZ
Age : 30 Inscrit le : 22/11/2008 Messages : 3382
Sujet: Re: [VX] Neo Save System V Mar 25 Oct 2011 - 12:47
Citation :
D'ailleurs ça le fait en mode éditeur et pas à partir du Game
Ah, si ça fait ça, c'est pas très grave alors.
LittleGamer
Poulet carnivore Lv.2
Inscrit le : 03/12/2011 Messages : 28
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 19:03
Désolé de faire un petit up, mais ça me marque un message d'erreur lorsque je tente de tester le script, il est marqué: script 'main' line 128: RuntimeError occured. LoadLibrary: screenshot
Si quelqu'un peut m'aider, ce serait sympa, j'aimerais bien inclure ce script a mon projet... A noter que j'utilise aussi un autre script qui sert a afficher un rapport de combat (je sais pas si ça peut influencer le problème mais je le dis quand meme)
Merci d'avance
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 19:31
Surement que tu n'as pas ajouté Screenshot.dll Si tu ne l'as pas, trouve la et ajoute la.
LittleGamer
Poulet carnivore Lv.2
Inscrit le : 03/12/2011 Messages : 28
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 19:42
Qu'est ce que c'est? ça se trouve plutôt ou? dans quelle section? désolé de mes nombreuses questions mais il faut vraiment que mon projet dispose de plein de sauvegardes (la rejouabilité sera assez importante)
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 19:50
Ah non, il n'y a pas besoin de cette dll.
Tu es sous quel OS ?
LittleGamer
Poulet carnivore Lv.2
Inscrit le : 03/12/2011 Messages : 28
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 19:55
Je suis sous Window XP
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 20:00
Essaye de voir si tu ne t'en sors pas avec un autre script de sauvegarde, a moins que ce soit celui là que tu souhaites absolument.
LittleGamer
Poulet carnivore Lv.2
Inscrit le : 03/12/2011 Messages : 28
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 20:04
Bon je vais en rechercher quelques autres... Apres tout on ne peut tout avoir
Pouet
Ex-Grand Œil des projets
Age : 39 Inscrit le : 10/06/2009 Messages : 1137
Sujet: Re: [VX] Neo Save System V Sam 3 Déc 2011 - 20:29
Up inapproprié (ce genre de question se pose dans la partie Problèmes) et 4 post sans présentation ! LittleGamer tu es prié de faire tout de suite un tour vers la partie "Présentation" et ensuite d'aller lire les règles du forum. Avant d'entrer chez les gens on frappe ! c'est la moindre des choses. Attention à toi la prochaine fois c'est l'avertissement.
TaZ> Baheuh non, quand on a un bug lié avec le script du topic, on en parle sur ce dernier, pour que tout le monde puisse prendre connaissance des solutions relatives à ce problème. Le up est donc approprié.
LittleGamer
Poulet carnivore Lv.2
Inscrit le : 03/12/2011 Messages : 28
Sujet: Re: [VX] Neo Save System V Lun 19 Déc 2011 - 20:22
Bon maintenant que je me suis présenté et que le up est approprié, je voudrais dire que j'ai réussi a le mettre correctement mais une précision a ceux qui veulent l'utiliser: Vos anciennes sauvegardes ne seront plus utilisable! Vous devrez donc rejouer votre jeu depuis le début (mais comme c'est le votre ça devrait aller vite )