Save-Point
Map name as save file name - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Games Development (https://www.save-point.org/forum-4.html)
+--- Forum: Code Support (https://www.save-point.org/forum-20.html)
+--- Thread: Map name as save file name (/thread-7695.html)



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.

[Image: EiD1G8R.png]

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. Winking 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? Laughing + Tongue sticking out


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)

[Image: p6tCvdF.png]

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.... Detective Realization... Thinking Recognition... Plan

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... Doug Marcaida 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 ;)