Map name as save file name - Whisper - 04-29-2020
Hey guys, its me again. (BTW is that forum almost dead? I don't see many new threats; at least in this section)
Well, now I would like to have map name included in save file name. To clarify — not when I pick a save file, but as ins name in the load screen. For example:
1 Sacred Forest 29-04-2020 16:13
2 Temple of Random God 29-04-2020 16:13
3 Test map234finalxx 29-04-2020 16:13
Right now its "Wstaw nazwę lokacji" which basically means "Insert location name". I set this up like that after few hours of futile attempts to make it by myself. Well... my Ruby knowledge is pretty poor, I'm able to modify only simple things so far.
Here is link to project with scripts I'm using.
https://drive.google.com/open?id=1D6SR701GGMdmA3qawwiL4R4hTeEFKpoT
Any help is really appreciated. I assure you guys that before I'll ask for help I'm spending 4-8 hours trying to do it myself. I don't want you to feel that I'm lazy and abusing your good will...
RE: Map name as save file name - DerVVulfman - 04-30-2020
Hrm... thinking thinking.... lotta projects in my mind (and others that I get suckered into...)
At first thought, I figured you would need to have the SaveFile change its design from saving files like Save1.rxdata, Save2.rxdata... and so on.
Instead, I was thinking something else.... When the default system shows the 'SaveFile' windows, it shows the party members as chararactersets in each window. This means, you can access the game data for each save file.
Now the default system only loads but so much data, and not the name of the game map. BUT that can be fixed... and I did. It just meant adding in a tried and true method of getting the map name, and performing a few edits to the Window_SaveFile class....
Code: #==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# This class handles the map. It includes scrolling and passable determining
# functions. Refer to "$game_map" for the instance of this class.
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# * Get Map Name
#--------------------------------------------------------------------------
def map_name
@mapinfo = load_data("Data/MapInfos.rxdata") if @mapinfo == nil
return @mapinfo[@map_id].name
end
end
#==============================================================================
# ** Window_SaveFile
#------------------------------------------------------------------------------
# This window displays save files on the save and load screens.
#==============================================================================
class Window_SaveFile < Window_Base
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :filename # file name
attr_reader :selected # selected
#--------------------------------------------------------------------------
# * Object Initialization
# file_index : save file index (0-3)
# filename : file name
#--------------------------------------------------------------------------
def initialize(file_index, filename)
super(0, 64 + file_index % 4 * 104, 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)
# ==================================================
# -- This skips through other pieces of data until
# We get to the game map section
t = Marshal.load(file) # Self Switches
t = Marshal.load(file) # Screen
t = Marshal.load(file) # Actors
t = Marshal.load(file) # Party
t = Marshal.load(file) # Troop
# ==================================================
@game_map = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
end
refresh
@selected = false
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# If save file exists
if @file_exist
# Draw file number
self.contents.font.color = normal_color
name = "File#{@file_index + 1}: " + @game_map.map_name
self.contents.draw_text(4, 0, 600, 32, name)
@name_width = contents.text_size(name).width
# Draw character
for i in 0...@characters.size
bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
cw = bitmap.rect.width / 4
ch = bitmap.rect.height / 4
src_rect = Rect.new(0, 0, cw, ch)
x = 300 - @characters.size * 32 + i * 64 - cw / 2
self.contents.blt(x, 68 - ch, bitmap, src_rect)
end
# Draw play time
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text(4, 8, 600, 32, time_string, 2)
# Draw timestamp
self.contents.font.color = normal_color
time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
self.contents.draw_text(4, 40, 600, 32, time_string, 2)
else
# Draw file number
self.contents.font.color = normal_color
name = "File#{@file_index + 1}"
self.contents.draw_text(4, 0, 600, 32, name)
@name_width = contents.text_size(name).width
end
end
end
Enjoy.
RE: Map name as save file name - kyonides - 04-30-2020
I found this scriptlet has 2 flaws. First of all, it doesn't apply a filter to map names that include codes that are not supposed to be displayed on screen. And on the other hand, you knew you can load chunks of loaded files without assigning them to any variable at all if you don't need to process them, right?
RE: Map name as save file name - DerVVulfman - 04-30-2020
First of all, I have no idea if he is using anything that alters the map name. This would be up to him to address. And second, yes, I could just type Load_Marshal by itself. But I was keeping with standards. AND gave notation/comments to explain the reason behind them.
RE: Map name as save file name - Whisper - 04-30-2020
Script works good in "plain" project, but I don't know how to implement the solution to my game. Apparently script that I'm using utilizes class Window_File < Window_Selectable to display save details. When I try transfer solution to that script I'm getting error message. I'm using modified 1-Scene Custom Menu System 1.17b by LegACy. (Line 1715 probably)
I'm also using Kylock's Time System, so some maps has
[*] in their name, but script seems to skip that part, so its fine.
"Demo" project that include all scripts I'm using you can find in the first post :)
https://drive.google.com/open?id=1D6SR701GGMdmA3qawwiL4R4hTeEFKpoT
RE: Map name as save file name - kyonides - 04-30-2020
If you're talking about the load game scene the default game or the projects that still use a very similar system, it shouldn't work. At the moment you try to load the data to display it, $game_map as a global variable doesn't. Probably that happens because the game usually creates it AFTER you have picked a saved game data file.
How do you fix it?
Create it yourself. Add the line
$game_map ||= Game_Map.new
Where do you place it?
It could be either in Scene_Title if you use it or in the initialize method of Window_SaveFile.
RE: Map name as save file name - Whisper - 04-30-2020
(04-30-2020, 08:56 PM)kyonides Wrote: If you're talking about the load game scene the default game or the projects that still use a very similar system, it shouldn't work. At the moment you try to load the data to display it, $game_map as a global variable doesn't. Probably that happens because the game usually creates it AFTER you have picked a saved game data file.
How do you fix it?
Create it yourself. Add the line
$game_map ||= Game_Map.new
Where do you place it?
It could be either in Scene_Title if you use it or in the initialize method of Window_SaveFile.
I followed the instruction, then replaced @game_map with $game_map, and there is no error now, but... it doesn't work. It does show map name in save file name, but its ALWAYS THE NAME OF THE CURRENT MAP. So I can save on map "Testy" but when I teleport to map "Location 2", all savegames will be named "Location 2", even though it was saved on map "Testy".
RE: Map name as save file name - kyonides - 05-01-2020
I never told you to replace @game_map with $game_map because they are different
RE: Map name as save file name - DerVVulfman - 05-01-2020
Investigation.... Realization... Recognition...
You're using Legacy's menu. Good thing I didn't delete your old project, right?
Paste THIS directly below Legacy's Menu instead:
Code: #==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# This class handles the map. It includes scrolling and passable determining
# functions. Refer to "$game_map" for the instance of this class.
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# * Get Map Name
#--------------------------------------------------------------------------
def map_name
@mapinfo = load_data("Data/MapInfos.rxdata") if @mapinfo == nil
return @mapinfo[@map_id].name
end
end
#==============================================================================
# ** Window_File
#------------------------------------------------------------------------------
# This window displays files on the save and load screens.
#==============================================================================
class Window_File < Window_Selectable
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
time_stamp = Time.at(0)
for i in 0...LegACy::SAVE_NUMBER
filename = "Save#{i + 1}.rxdata"
self.contents.draw_text(1, i * 32, 32, 32, (i + 1).to_s, 1)
if FileTest.exist?(filename)
#===================================================================
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)
# ==================================================
# -- This skips through other pieces of data until
# We get to the game map section
t = Marshal.load(file) # Self Switches
t = Marshal.load(file) # Screen
t = Marshal.load(file) # Actors
t = Marshal.load(file) # Party
t = Marshal.load(file) # Troop
# ==================================================
@game_map = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
#===================================================================
=begin
size = File.size(filename)
if size.between?(1000, 999999)
size /= 1000
size_str = "#{size} KB"
elsif size > 999999
size /= 1000000
size_str = "#{size} MB"
else
size_str = size.to_s
end
time_stamp = File.open(filename, "r").mtime
date = time_stamp.strftime("%m/%d/%Y")
time = time_stamp.strftime("%H:%M")
self.contents.font.size = 18 #20
self.contents.font.bold = true
self.contents.draw_text(38, i * 32, 120, 32, date)
self.contents.draw_text(160, i * 32, 100, 32, time)
self.contents.draw_text(0, i * 32, 284, 32, size_str, 2)
=end
#===================================================================
# HERE is where you edit!!!!!
time_stamp = File.open(filename, "r").mtime
date = time_stamp.strftime("%m/%d/%Y")
name = @game_map.map_name
self.contents.draw_text (38, (i-1) * 32, 320, 32, name)
self.contents.draw_text(160, (i-1) * 32, 120, 32, date)
#===================================================================
end
end
end
end
Note the area between thick lines that you may edit.
And as Doug would say... It will kill...
RE: Map name as save file name - Whisper - 05-01-2020
Yaaaaaaaassss! That works perfect.
Thank you guys, you're THE BEST. How can I return the favor?
PS DerVVulfman — I linked project with all scripts I'm using and mentioned it twice, so you didn't require my old project ;)
|