PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicher Script zeigt nicht letzten Spielstand



Ascare
12.04.2012, 21:06
Also ich benutze folgendes Speicherscript, welches mehr Speicherstände erlaubt (hier 99):



#==============================================================================
# ** Unlimited Save Files V1.0
# UnlimitedSaveFiles.rb von RPG Advocate (28.07.2008)
#------------------------------------------------------------------------------
# http://www.rpg-studio.de/scriptdb/node/7
# http://www.rpg-studio.de/forum/index.php?page=Thread&threadID=31205
# http://www.phylomortis.com/resource/script/scr039.html
# http://www.phylomortis.com
#==============================================================================

#============================================================
# Unlimited Save Files V1.0
# by RPG Advocate (26.06.08)
#------------------------------------------------------------
# http://itzamna.rmxp.de/itzamna/node/63
#============================================================

class Scene_File
SAVEFILE_MAX = 99
# -------------------
def initialize(help_text)
@help_text = help_text
end
# -------------------
def main
@help_window = Window_Help.new
@help_window.set_text(@help_text)
@savefile_windows = []
@cursor_displace = 0
for i in 0..3
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i), i))
end
@file_index = 0
@savefile_windows[@file_index].selected = true
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@help_window.dispose
for i in @savefile_windows
i.dispose
end
end
# -------------------
def update
@help_window.update
for i in @savefile_windows
i.update
end
if Input.trigger?(Input::C)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
if Input.trigger?(Input::B)
on_cancel
return
end
if Input.repeat?(Input::DOWN)
if Input.trigger?(Input::DOWN) or @file_index < SAVEFILE_MAX - 1
if @file_index == SAVEFILE_MAX - 1
$game_system.se_play($data_system.buzzer_se)
return
end
@cursor_displace += 1
if @cursor_displace == 4
@cursor_displace = 3
for i in @savefile_windows
i.dispose
end
@savefile_windows = []
for i in 0..3
f = i - 2 + @file_index
name = make_filename(f)
@savefile_windows.push(Window_SaveFile.new(f, name, i))
@savefile_windows[i].selected = false
end
end
$game_system.se_play($data_system.cursor_se)
@file_index = (@file_index + 1)
if @file_index == SAVEFILE_MAX
@file_index = SAVEFILE_MAX - 1
end
for i in 0..3
@savefile_windows[i].selected = false
end
@savefile_windows[@cursor_displace].selected = true
return
end
end
if Input.repeat?(Input::UP)
if Input.trigger?(Input::UP) or @file_index > 0
if @file_index == 0
$game_system.se_play($data_system.buzzer_se)
return
end
@cursor_displace -= 1
if @cursor_displace == -1
@cursor_displace = 0
for i in @savefile_windows
i.dispose
end
@savefile_windows = []
for i in 0..3
f = i - 1 + @file_index
name = make_filename(f)
@savefile_windows.push(Window_SaveFile.new(f, name, i))
@savefile_windows[i].selected = false
end
end
$game_system.se_play($data_system.cursor_se)
@file_index = (@file_index - 1)
if @file_index == -1
@file_index = 0
end
for i in 0..3
@savefile_windows[i].selected = false
end
@savefile_windows[@cursor_displace].selected = true
return
end
end
end
# -------------------
def make_filename(file_index)
return "Save#{file_index + 1}.rxdata"
end
# -------------------
end


class Window_SaveFile < Window_Base
# -------------------
def initialize(file_index, filename, position)
y = 64 + position * 104
super(0, y, 640, 104)
self.contents = Bitmap.new(width - 32, height - 32)
@file_index = file_index
@filename = "Save#{@file_index + 1}.rxdata"
@time_stamp = Time.at(0)
@file_exist = FileTest.exist?(@filename)
if @file_exist
file = File.open(@filename, "r")
@time_stamp = file.mtime
@characters = Marshal.load(file)
@frame_count = Marshal.load(file)
@game_system = Marshal.load(file)
@game_switches = Marshal.load(file)
@game_variables = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
end
refresh
@selected = false
end
end



Normalerweise ist das ja so das man auf einen Stand speichert, und wenn man auf dem Titelbildschirm wieder
das Spiel laden will, springt der Cursor automatisch zum zuletzt gespeicherten Spiel. Mit diesem Script funzt das aber nicht.
Es zeigt immer den ersten Speicherslot an... :-/
Hab ein bisschen rumprobiert, aber kam nicht voran. Jemand Ideen?

Kelven
12.04.2012, 23:04
Im Original-Script sieht es ja so aus:


# Select last file to be operated
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true

Das wurde beim neuen Script gegen das hier ausgetauscht:


@file_index = 0
@savefile_windows[@file_index].selected = true

Stellt sich die Frage warum. Klappt das mit der Originalversion nicht?

Cornix
13.04.2012, 07:17
Warum begrenzt man das bei dem Script auf 99 und nicht einfach auf unendlich?
Es sollte garkein Problem sein, ehrlich.

Außerdem sollte was Kelven geschrieben hat ebenfalls funktionieren.

Ascare
14.04.2012, 01:26
Im Original-Script sieht es ja so aus:


# Select last file to be operated
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true

Das wurde beim neuen Script gegen das hier ausgetauscht:


@file_index = 0
@savefile_windows[@file_index].selected = true

Stellt sich die Frage warum. Klappt das mit der Originalversion nicht?

Das hatte ich auch schon versucht, aber das funktioniert nicht wirklich. Denn dieses last file index bezieht sich auf eine Variable die wie im Standard von 0-3 vergeben wird, also nur 4 Slots.

Kelven
14.04.2012, 08:25
Hm, das ist komisch. Oben im Script steht ja sogar noch:



if Input.trigger?(Input::C)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end

MagicMagor
15.04.2012, 05:45
Ich weiß zwar nicht woran das Problem liegt (vermutlich an $game_temp), aber im neueren Maker (Ace) wird der Index des letzten Saves so berechnet:


def self.latest_savefile_index
savefile_max.times.max_by {|i| savefile_time_stamp(i) }
end

def self.savefile_time_stamp(index)
File.mtime(make_filename(index)) rescue Time.at(0)
end

Bin mir sicher, diese Vorgehensweise würde auch im XP funktionieren.

-KD-
15.04.2012, 15:07
Nö, weil Ruby 1.8 noch keine Enumeratoren-Unterstützung hat. Daher muss es so heißen:

def self.latest_savefile_index
(1..99).sort_by {|i| savefile_time_stamp(i) }.max
end

def self.savefile_time_stamp(index)
File.mtime(make_filename(index)) rescue Time.at(0)
end

Ascare
15.04.2012, 17:07
Ok, aber wo muss ich das Ganze denn einfügen damit das funktioniert?