'ne Superklasse kannst du nicht einfach entfernen. Immerhin wird da ja Code ausgeführt, der zum Laden/Speichern ggf. wichtig ist. Wenn du den eigenes Lade/Speicher-Menü machen willst, kannst du da dieses Script verwenden: Code: =begin #=============================================================== Erweitertes Speicher- und Ladesystem #=============================================================== # Author : Kai # Version: 0.1 # Datum : 13.07.2008 #=============================================================== Bietet zusätzliche, flexible Funktionen zum Speichern- und Laden, sowie die Möglichkeit einen eigenen Titelbildschirm zu gestalten. #--------------------------------------------------------------- * Bedienung #--------------------------------------------------------------- Anwendung: Titelbildschirm wird automatisch übersprungen. Folgende Funktionen stehen im "Script..."-Befehl zur Verfügung: load(n) # => lädt n-ten Spielstand save(n) # => speichert n-ten Spielstand delete_savegame(n) # => Löscht n-ten Spielstand loadmenu # => Öffnet das Lademenü savemenu # => Äquivalent zum Call Save Befehl Game_Start.start # => Startet Spiel neu Bei load und save wird nicht überwacht ob die Spielstände bereits existieren. Dies kann also ggf. zur Fehlermeldung führen. Man sollte also vorher mit einem Conditional Branch abfragen ob Spielstände bereits existieren. Dies geschieht über die ConditionalBranch Scriptanweisung saved?(n) die überprüft, ob der n-te Spielstand existiert. #--------------------------------------------------------------- * Anmerkungen für Skripter #--------------------------------------------------------------- Wichtig: Vorgehensweise beim Aliasen Verwendet alias_module_function(neuer_name, alter_name) { def alter_name #neue Methodendefinition end } um Aliasing sowohl für Mixins, als auch für Modulfunktion zu betreiben. Beispiel: Hinzufügen der Variable $diary beim Abspeichern und Laden module Game_Save alias_module_function(:new_saveobjects :saved_objects) { def saved_objects() new_saveobjects << $diary end } alias_module_function(:new_loadobjects :loaded_objects) { def loaded_objects(*args) $diary = args.pop loaded_objects(*args) end } =end #=============================================================== # ** Game_Save (Modul) #--------------------------------------------------------------- # Speichert Spieldaten ab und lädt diese wieder. #=============================================================== module Game_Save FILENAME = "./save" #Dateiname für Spielstand FILE_EXTENSION = ".rxdata" SAVE_DIGITS = 1 #Modul kann in Klassen als mixin eingefügt werden um verschiedene #Save-Klassen (Autosave, Schnellspeichern, ...) zu definieren module_function() #--------------------------------------------------------------- # * save :: (filename :: String || Numeric) # Wird aufgerufen um Spielstand in Datei filename zu speichern #--------------------------------------------------------------- def save(filename=FILENAME+FILE_EXTENSION) filename = make_filename(filename) if filename.kind_of?(Numeric) before_save() File.open(filename, "wb") {|output| saved_objects.each {|obj| Marshal.dump(obj, output) } } after_save() end #--------------------------------------------------------------- # * load :: (filename :: String || Numeric) # Wird aufgerufen um Spielstand in Datei filename zu laden #--------------------------------------------------------------- def load(filename=FILENAME) filename = make_filename(filename) if filename.kind_of?(Numeric) before_load() obj=[] File.open(filename, "rb") {|input| until input.eof? do obj << Marshal.load(input) end } loaded_objects(*obj) after_load() end #--------------------------------------------------------------- # * delete_savegame :: (filename :: String || Numeric) # Wird aufgerufen um Datei filename zu löschen #--------------------------------------------------------------- def delete_savegame(filename=FILENAME) filename = make_filename(filename) if filename.kind_of?(Numeric) File.delete(filename) if File.exist?(filename) end #--------------------------------------------------------------- # * saved_objects :: () -> Array # Enthält eine Liste aller abzuspeichernden Objekte # Alle Elemente müssen per Marshal#dump speicherbar sein # um Liste zu erweitern aliase die Methode und erweitere den Array #--------------------------------------------------------------- def saved_objects() [ $game_party.actors.collect {|a| [a.character_name, a.character_hue]}, Graphics.frame_count, $game_system, $game_switches, $game_variables, $game_self_switches, $game_screen, $game_actors, $game_party, $game_troop, $game_map, $game_player ] end #--------------------------------------------------------------- # * loaded_objects :: (args :: Array) # Enthält eine Zuweisung der geladenen Objekte zu Variablen # Kann per aliasing erweitert werden #--------------------------------------------------------------- def loaded_objects(*args) chars, Graphics.frame_count, $game_system, $game_switches, $game_variables, $game_self_switches, $game_screen, $game_actors, $game_party, $game_troop, $game_map, $game_player = *args end #--------------------------------------------------------------- # * before_save, before_load # Wird aufgerufen, bevor Spielstand gespeichert/geladen wird #--------------------------------------------------------------- def before_save $game_system.magic_number = $data_system.magic_number $game_system.save_count += 1 end def before_load #do nothing end #--------------------------------------------------------------- # * after_save, after_load # Wird aufgerufen, nachdem Spielstand gespeichert/geladen wird #--------------------------------------------------------------- def after_save #do nothing end def after_load #Wenn Map geändert wurde, lade Map neu if $game_system.magic_number != $data_system.magic_number then $game_map.setup($game_map.map_id) $game_player.center($game_player.x, $game_player.y) end #Aktualisiere Spieldaten und starte die Map-Szene $game_party.refresh() $game_map.update $scene = Scene_Map.new() end #--------------------------------------------------------------- # * make_filename :: (n :: Numeric) -> String # erzeugt einen standardmäßigen Dateinamen mit einer Nummer #--------------------------------------------------------------- def make_filename(n) FILENAME + sprintf("%0#{SAVE_DIGITS}d", filename) + FILE_EXTENSION end #--------------------------------------------------------------- # * saved? :: (filename :: String || Numeric) -> Boolean # Gibt true zurück wenn Speicherstand existiert, ansonsten false #--------------------------------------------------------------- def saved?(filename=FILENAME+FILE_EXTENSION) filename = make_filename(filename) if filename.kind_of?(Numeric) File.exist?(filename) end end #=============================================================== # ** Game_Start (Modul) #--------------------------------------------------------------- # Initialisiert Spieldaten #=============================================================== module Game_Start # Alle Methoden dürfen auch als Singletonmethoden ausgeführt werden module_function() #-------------------------------------------------------------------------- # * Öffne alle Dateien aus der Database und speichere ihren Inhalt #-------------------------------------------------------------------------- def load_database $data_actors = load_data("Data/Actors.rxdata") $data_classes = load_data("Data/Classes.rxdata") $data_skills = load_data("Data/Skills.rxdata") $data_items = load_data("Data/Items.rxdata") $data_weapons = load_data("Data/Weapons.rxdata") $data_armors = load_data("Data/Armors.rxdata") $data_enemies = load_data("Data/Enemies.rxdata") $data_troops = load_data("Data/Troops.rxdata") $data_states = load_data("Data/States.rxdata") $data_animations = load_data("Data/Animations.rxdata") $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") end #-------------------------------------------------------------------------- # * Initialisiere die Elemente des Spiels #-------------------------------------------------------------------------- def initialize_global_variables Graphics.frame_count = 0 #Resete Spielzeit # Erstelle die globalen Variablen $game_temp = Game_Temp.new $game_system = Game_System.new $game_switches = Game_Switches.new $game_variables = Game_Variables.new $game_self_switches = Game_SelfSwitches.new $game_screen = Game_Screen.new $game_actors = Game_Actors.new $game_party = Game_Party.new $game_troop = Game_Troop.new $game_map = Game_Map.new $game_player = Game_Player.new end #-------------------------------------------------------------------------- # * Initialisiere die Heldentruppe und starte das Spiel #-------------------------------------------------------------------------- def start_game # Initialisiere die Heldentruppe $game_party.setup_starting_members # Starte die Anfangsmap $game_map.setup($data_system.start_map_id) $game_player.moveto($data_system.start_x, $data_system.start_y) # Starte Spiel $game_player.refresh $game_map.autoplay $game_map.update $scene = Scene_Map.new end #-------------------------------------------------------------------------- # * Wenn per Testkampf gestartet wird, starte Kampf #-------------------------------------------------------------------------- def start_battle #Initialisiere Heldentruppe des Testkampfes $game_party.setup_battle_test_members # Einstellungen des Testkampfes $game_temp.battle_troop_id = $data_system.test_troop_id $game_temp.battle_can_escape = true $game_map.battleback_name = $data_system.battleback_name # Musik abspielen $game_system.se_play($data_system.battle_start_se) $game_system.bgm_play($game_system.battle_bgm) # Starte Kampf $scene = Scene_Battle.new end def start self.load_database self.initialize_global_variables if $BTEST then self.start_battle else self.start_game end end end #=============================================================== # ** Module (Klasse) #--------------------------------------------------------------- # Erweitert die Modul-Klasse um eine neue Alias-Methode #=============================================================== class Module def alias_module_function(oldname, newname) alias_method(oldname, newname) yield() module_function(oldname, newname) end end #=============================================================== # ** Scene_Title (Klasse) #--------------------------------------------------------------- # Überspringt Titel und lädt sofort Spielstand #=============================================================== class << Scene_Title include Game_Start def new() if @started then Scene_Map.new else @started = true start #Gib aktuelle Szene (Map) zurück end end end #=============================================================== # ** Interpreter (Klasse) #--------------------------------------------------------------- # erweitert Interpreter um neue Befehle #=============================================================== class Interpreter include Game_Save #mache alle Game_Save Methoden verfügbar def loadmenu $scene = Scene_Load.new end def savemenu $scene = Scene_Save.new end end //Anm: Wenn der Titel nicht übersprungen werden soll, lässt du einfach den Abschnitt "Überspringt Titel und lädt sofort Spielstand" weg.
=begin #=============================================================== Erweitertes Speicher- und Ladesystem #=============================================================== # Author : Kai # Version: 0.1 # Datum : 13.07.2008 #=============================================================== Bietet zusätzliche, flexible Funktionen zum Speichern- und Laden, sowie die Möglichkeit einen eigenen Titelbildschirm zu gestalten. #--------------------------------------------------------------- * Bedienung #--------------------------------------------------------------- Anwendung: Titelbildschirm wird automatisch übersprungen. Folgende Funktionen stehen im "Script..."-Befehl zur Verfügung: load(n) # => lädt n-ten Spielstand save(n) # => speichert n-ten Spielstand delete_savegame(n) # => Löscht n-ten Spielstand loadmenu # => Öffnet das Lademenü savemenu # => Äquivalent zum Call Save Befehl Game_Start.start # => Startet Spiel neu Bei load und save wird nicht überwacht ob die Spielstände bereits existieren. Dies kann also ggf. zur Fehlermeldung führen. Man sollte also vorher mit einem Conditional Branch abfragen ob Spielstände bereits existieren. Dies geschieht über die ConditionalBranch Scriptanweisung saved?(n) die überprüft, ob der n-te Spielstand existiert. #--------------------------------------------------------------- * Anmerkungen für Skripter #--------------------------------------------------------------- Wichtig: Vorgehensweise beim Aliasen Verwendet alias_module_function(neuer_name, alter_name) { def alter_name #neue Methodendefinition end } um Aliasing sowohl für Mixins, als auch für Modulfunktion zu betreiben. Beispiel: Hinzufügen der Variable $diary beim Abspeichern und Laden module Game_Save alias_module_function(:new_saveobjects :saved_objects) { def saved_objects() new_saveobjects << $diary end } alias_module_function(:new_loadobjects :loaded_objects) { def loaded_objects(*args) $diary = args.pop loaded_objects(*args) end } =end #=============================================================== # ** Game_Save (Modul) #--------------------------------------------------------------- # Speichert Spieldaten ab und lädt diese wieder. #=============================================================== module Game_Save FILENAME = "./save" #Dateiname für Spielstand FILE_EXTENSION = ".rxdata" SAVE_DIGITS = 1 #Modul kann in Klassen als mixin eingefügt werden um verschiedene #Save-Klassen (Autosave, Schnellspeichern, ...) zu definieren module_function() #--------------------------------------------------------------- # * save :: (filename :: String || Numeric) # Wird aufgerufen um Spielstand in Datei filename zu speichern #--------------------------------------------------------------- def save(filename=FILENAME+FILE_EXTENSION) filename = make_filename(filename) if filename.kind_of?(Numeric) before_save() File.open(filename, "wb") {|output| saved_objects.each {|obj| Marshal.dump(obj, output) } } after_save() end #--------------------------------------------------------------- # * load :: (filename :: String || Numeric) # Wird aufgerufen um Spielstand in Datei filename zu laden #--------------------------------------------------------------- def load(filename=FILENAME) filename = make_filename(filename) if filename.kind_of?(Numeric) before_load() obj=[] File.open(filename, "rb") {|input| until input.eof? do obj << Marshal.load(input) end } loaded_objects(*obj) after_load() end #--------------------------------------------------------------- # * delete_savegame :: (filename :: String || Numeric) # Wird aufgerufen um Datei filename zu löschen #--------------------------------------------------------------- def delete_savegame(filename=FILENAME) filename = make_filename(filename) if filename.kind_of?(Numeric) File.delete(filename) if File.exist?(filename) end #--------------------------------------------------------------- # * saved_objects :: () -> Array # Enthält eine Liste aller abzuspeichernden Objekte # Alle Elemente müssen per Marshal#dump speicherbar sein # um Liste zu erweitern aliase die Methode und erweitere den Array #--------------------------------------------------------------- def saved_objects() [ $game_party.actors.collect {|a| [a.character_name, a.character_hue]}, Graphics.frame_count, $game_system, $game_switches, $game_variables, $game_self_switches, $game_screen, $game_actors, $game_party, $game_troop, $game_map, $game_player ] end #--------------------------------------------------------------- # * loaded_objects :: (args :: Array) # Enthält eine Zuweisung der geladenen Objekte zu Variablen # Kann per aliasing erweitert werden #--------------------------------------------------------------- def loaded_objects(*args) chars, Graphics.frame_count, $game_system, $game_switches, $game_variables, $game_self_switches, $game_screen, $game_actors, $game_party, $game_troop, $game_map, $game_player = *args end #--------------------------------------------------------------- # * before_save, before_load # Wird aufgerufen, bevor Spielstand gespeichert/geladen wird #--------------------------------------------------------------- def before_save $game_system.magic_number = $data_system.magic_number $game_system.save_count += 1 end def before_load #do nothing end #--------------------------------------------------------------- # * after_save, after_load # Wird aufgerufen, nachdem Spielstand gespeichert/geladen wird #--------------------------------------------------------------- def after_save #do nothing end def after_load #Wenn Map geändert wurde, lade Map neu if $game_system.magic_number != $data_system.magic_number then $game_map.setup($game_map.map_id) $game_player.center($game_player.x, $game_player.y) end #Aktualisiere Spieldaten und starte die Map-Szene $game_party.refresh() $game_map.update $scene = Scene_Map.new() end #--------------------------------------------------------------- # * make_filename :: (n :: Numeric) -> String # erzeugt einen standardmäßigen Dateinamen mit einer Nummer #--------------------------------------------------------------- def make_filename(n) FILENAME + sprintf("%0#{SAVE_DIGITS}d", filename) + FILE_EXTENSION end #--------------------------------------------------------------- # * saved? :: (filename :: String || Numeric) -> Boolean # Gibt true zurück wenn Speicherstand existiert, ansonsten false #--------------------------------------------------------------- def saved?(filename=FILENAME+FILE_EXTENSION) filename = make_filename(filename) if filename.kind_of?(Numeric) File.exist?(filename) end end #=============================================================== # ** Game_Start (Modul) #--------------------------------------------------------------- # Initialisiert Spieldaten #=============================================================== module Game_Start # Alle Methoden dürfen auch als Singletonmethoden ausgeführt werden module_function() #-------------------------------------------------------------------------- # * Öffne alle Dateien aus der Database und speichere ihren Inhalt #-------------------------------------------------------------------------- def load_database $data_actors = load_data("Data/Actors.rxdata") $data_classes = load_data("Data/Classes.rxdata") $data_skills = load_data("Data/Skills.rxdata") $data_items = load_data("Data/Items.rxdata") $data_weapons = load_data("Data/Weapons.rxdata") $data_armors = load_data("Data/Armors.rxdata") $data_enemies = load_data("Data/Enemies.rxdata") $data_troops = load_data("Data/Troops.rxdata") $data_states = load_data("Data/States.rxdata") $data_animations = load_data("Data/Animations.rxdata") $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") end #-------------------------------------------------------------------------- # * Initialisiere die Elemente des Spiels #-------------------------------------------------------------------------- def initialize_global_variables Graphics.frame_count = 0 #Resete Spielzeit # Erstelle die globalen Variablen $game_temp = Game_Temp.new $game_system = Game_System.new $game_switches = Game_Switches.new $game_variables = Game_Variables.new $game_self_switches = Game_SelfSwitches.new $game_screen = Game_Screen.new $game_actors = Game_Actors.new $game_party = Game_Party.new $game_troop = Game_Troop.new $game_map = Game_Map.new $game_player = Game_Player.new end #-------------------------------------------------------------------------- # * Initialisiere die Heldentruppe und starte das Spiel #-------------------------------------------------------------------------- def start_game # Initialisiere die Heldentruppe $game_party.setup_starting_members # Starte die Anfangsmap $game_map.setup($data_system.start_map_id) $game_player.moveto($data_system.start_x, $data_system.start_y) # Starte Spiel $game_player.refresh $game_map.autoplay $game_map.update $scene = Scene_Map.new end #-------------------------------------------------------------------------- # * Wenn per Testkampf gestartet wird, starte Kampf #-------------------------------------------------------------------------- def start_battle #Initialisiere Heldentruppe des Testkampfes $game_party.setup_battle_test_members # Einstellungen des Testkampfes $game_temp.battle_troop_id = $data_system.test_troop_id $game_temp.battle_can_escape = true $game_map.battleback_name = $data_system.battleback_name # Musik abspielen $game_system.se_play($data_system.battle_start_se) $game_system.bgm_play($game_system.battle_bgm) # Starte Kampf $scene = Scene_Battle.new end def start self.load_database self.initialize_global_variables if $BTEST then self.start_battle else self.start_game end end end #=============================================================== # ** Module (Klasse) #--------------------------------------------------------------- # Erweitert die Modul-Klasse um eine neue Alias-Methode #=============================================================== class Module def alias_module_function(oldname, newname) alias_method(oldname, newname) yield() module_function(oldname, newname) end end #=============================================================== # ** Scene_Title (Klasse) #--------------------------------------------------------------- # Überspringt Titel und lädt sofort Spielstand #=============================================================== class << Scene_Title include Game_Start def new() if @started then Scene_Map.new else @started = true start #Gib aktuelle Szene (Map) zurück end end end #=============================================================== # ** Interpreter (Klasse) #--------------------------------------------------------------- # erweitert Interpreter um neue Befehle #=============================================================== class Interpreter include Game_Save #mache alle Game_Save Methoden verfügbar def loadmenu $scene = Scene_Load.new end def savemenu $scene = Scene_Save.new end end
--Ruby/RGSS-Kurs
Foren-Regeln