BENTELK'S PROFILE

I make games; sometimes I like them.
Dreams About Squash
Made in under 48 hours for TAGJam7... and with all-original graphics!

Search

helper for tracking time (at the speed of plot; RMVXAce)

I'm making a game where I want to track the passage of time, but not in real-time! more like "oh, you traveled to X city? that took 2 days " or "fights just always take 20 minutes" (or maybe I could get fancy and count the turns taken, and multiply by some number, etc).

(and, I suppose, if you REALLY WANTED, you could probably rig up some kind of parallel process common event to automatically make the calls to progress the time.)

anyway, so I want an easy way to track the time: add various increments, slap the current month or whatever into conditionals, and even format it for display in a custom HUD. and doing this through events seemed cumbersome to me, soooooo: I made this script to handle it all for me.

it is incomplete at this time, but once complete, I'd definitely like to post it here, and elsewhere. until then, if it seems like something you'd use, and/or there are any other features you'd like in something like this, lemme know, and I'll see about adding them!

EDIT: added more formatting strings. added saving and loading of $game_date_and_time (oops). fixed some bugs.

=begin

complete method reference

  $game_date_tnd_time.year            # the current year
  $game_date_and_time.month
  $game_date_and_time.day
  $game_date_and_time.hour
  $game_date_and_time.minute

  $game_date_and_time.AddMinute        # adds one minute
  $game_date_and_time.AddMinutes(5)    # adds 5 minutes
  $game_date_and_time.RemoveMinutes(5) # goes BACK IN TIME 5 minutes - whoa
  
  $game_date_and_time.AddHour
  $game_date_and_time.AddHours(5)
  $game_date_and_time.RemoveHours(5)
  
  $game_date_and_time.AddDay
  $game_date_and_time.AddDays(5)
  $game_date_and_time.RemoveDays(5)
  
  $game_date_and_time.AddMonth
  $game_date_and_time.AddMonths(5)
  $game_date_and_time.RemoveMonths(5)
  
  $game_date_and_time.AddYear
  $game_date_and_time.AddYears(5)
  $game_date_and_time.RemoveYears(5)
  
  $game_date_and_time.DaysThisMonth   # returns the number of days this month
  
  $game_date_and_time.LongMonthName   # returns the name of the month
  $game_date_and_time.ShortMonthName  # returns the abbreviated month name
  $game_date_and_time.MonthName       # identical to LongMonthName

  $game_date_and_time.DayOfMonthSuffix # returns "st", "nd", "rd", or "th"

  $game_date_and_time.LeapYear?       # 'true' if current year is a leap year
  
  $game_date_and_time.Format("Y-m-d g:i A")
  
format requires some explanation >_> it returns the current date and time,
formatted according to the string you pass it. you can put anything you want
into the format string, and certain letters will be replaced with specific
date or time information. I do a lot of PHP coding, so I'm using the PHP
standard for date format, if you're familiar. if not, here's a table:

  d       Day of the month, 2 digits with leading zeroes
  D       Short day name (ex: Mon)
  j       Day of the month, without leading zeroes
  l       Full day name (ex: Monday)
  N       Numeric day of the week, from 1 = Monday to 7 = Sunday
  S       Returns "st", "nd", "rd", or "th" as appropriate for the current day
          (use with "j", ex "jS" might return "12th", "3rd", etc)
  w       Numeric day of the week, from 0 = Sunday to 6 = Saturday
  z       not yet implemented
  W       not yet implemented
  F       Full month name (ex: September)
  m       Month of the year, 2 digits with leading zeroes
  M       Short month name (ex: Sep)
  n       Month of the year, without leading zeroes
  t       Number of days in this month
  L       "1" if it's a leap year, "0" otherwise
  Y       Full year (ex: 2013)
  y       Last two digits of year (ex: 13)
  a       "am" or "pm"
  A       "AM" or "PM"
  g       Hour, in 12-hour format, without leading zeroes
  G       Hour, in 24-hour format, without leading zeroes
  h       Hour, in 12-hour format, 2 digits with leading zeroes
  H       Hour, in 24-hour format, 2 digits with leading zeroes
  i       Minutes, 2 digits with leading zeroes

any other characters (ex: "b", "Q", ":", " ") will be left alone.
  
so, for example, $game_date_and_time.Format("Y-m-d g:i A") might return
"2013-02-13 3:21 AM"

if you're familiar with PHP, you may notice that I did not list all the letters
that PHP supports. I do not intend to add support for those letters at this
time.

=end

module DataManager
  #--------------------------------------------------------------------------
  # * Create Game Objects
  #--------------------------------------------------------------------------
  def self.create_game_objects
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_timer         = Game_Timer.new
    $game_message       = Game_Message.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.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
    $game_date_and_time = Game_DateAndTime.new
  end
  #--------------------------------------------------------------------------
  # * Create Save Contents
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    contents[:date_and_time] = $game_date_and_time
    contents
  end
  #--------------------------------------------------------------------------
  # * Extract Save Contents
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    $game_date_and_time = contents[:date_and_time]
  end
end

class Game_DateAndTime
  attr_reader   :year
  attr_reader   :month
  attr_reader   :day
  attr_reader   :hour
  attr_reader   :minute
  
  # CUSTOMIZE ME!
  # the date and time you set here will be the date and time when a player
  # creates a new game. use 24 hour clock (ex: @hour = 15 means 3PM).
  def initialize
    @year = 2006
    @month = 8
    @day = 2
    @hour = 15
    @minute = 20
  end
  
  def AddMinute
    AddMinutes(1)
  end
  
  def AddMinutes(m)
    if m < 0
      RemoveMinutes(-m)
    else
      @minute += m
      if @minute / 60 > 0
        AddHours(@minute / 60)
        @minute = @minute % 60
      end
    end
  end
  
  def RemoveMinutes(m)
    if m < 0
      AddMinutes(-m)
    else
      @minute -= m
      
      # TODO: replace this while loop with MATH
      while @minute < 0 do
        RemoveHours(1)
        @minute += 60
      end
    end
  end

  def AddHour
    AddHours(1)
  end
  
  def AddHours(h)
    if h < 0
      RemoveHours(-h)
    else
      @hour += h
      if @hour / 24 > 0
        AddDays(@hour / 24)
        @hour = @hour % 24
      end
    end
  end
  
  def RemoveHours(h)
    if h < 0
      AddHours(-h)
    else
      @hour -= h
      
      # TODO: replace this while loop with MATH
      while @hour < 0 do
        RemoveDays(1)
        @hour += 24
      end
    end
  end
  
  def AddDay
    AddDays(1)
  end
  
  def AddDays(d)
    if d < 0
      RemoveDays(-d)
    else
      @day += d
      while @day > self.DaysThisMonth do
        @day -= self.DaysThisMonth
        AddMonth
      end
    end
  end
  
  def RemoveDays(d)
    if d < 0
      AddDays(-d)
    else
      @day -= d
      
      # can't replace this while loop with math, that I know of...
      while @day <= 0 do
        RemoveMonths(1)
        @day += self.DaysThisMonth
      end
    end
  end
  
  def AddMonth
    AddMonths(1)
  end
  
  def AddMonths(m)
    if m < 0
      RemoveMonths(-m)
    else
      @month += m
      if (@month - 1) / 12 > 0
        AddYears((@month - 1) / 12)
        @month = (@month - 1) % 12 + 1
      end
    end
  end
  
  def RemoveMonths(m)
    if m < 0
      AddMonths(-m)
    else
      @month -= m
      
      # TODO: replace this while loop with MATH
      while @month < 1 do
        RemoveYears(1)
        @month += 12
      end
    end
  end
  
  def AddYear
    AddYears(1)
  end
      
  def AddYears(y)
    # EASY PEASY!
    @year += y
  end
  
  def RemoveYears(y)
    # EASY PEASY!
    @year -= y
  end

  # TODO: does this work with negative years? >_> maybe we won't care
  def LeapYear?
    return (@year % 4 == 0 && @year % 100 != 0) || @year % 400 == 0
  end
  
  def DaysThisMonth
    if @month == 1 || @month == 3 || @month == 5 || @month == 7 || @month == 8 || @month == 10 || @month == 12
      31
    elsif @month == 2
      if LeapYear?
        29
      else
        28
      end
    else
      30
    end
  end

  def MonthName
    self.LongMonthName
  end
    
  def LongMonthName
    case @month
    when 1
      "January"
    when 2
      "February"
    when 3
      "March"
    when 4
      "April"
    when 5
      "May"
    when 6
      "June"
    when 7
      "July"
    when 8
      "August"
    when 9
      "September"
    when 10
      "October"
    when 11
      "November"
    when 12
      "December"
    else
      "Invalid"
    end
  end
    
  def ShortMonthName
    self.LongMonthName[0,3]
  end

  def DayName
    self.LongDayName
  end
  
  def LongDayName
    case self.DayOfWeek
    when 0
      "Sunday"
    when 1
      "Monday"
    when 2
      "Tuesday"
    when 3
      "Wednesday"
    when 4
      "Thursday"
    when 5
      "Friday"
    when 6
      "Saturday"
    else
      "Invalid"
    end
  end
  
  def ShortDayName
    self.LongDayName[0, 3]
  end
  
  def DayOfMonthSuffix
    if (@day >= 4 && @day <= 20) or (@day >= 24 && @day <= 30)
      'th'
    else
      return ["st", "nd", "rd"][@day % 10 - 1]
    end
  end
  
  def Format(format)

    hour12 = (@hour == 0) ? 12 : (@hour <= 12 ? @hour : @hour - 12)
    w = self.DayOfWeek

    dict = {
      "d" => "%.2d" % @day,
      "D" => self.ShortDayName,
      "j" => @day,
      "l" => self.LongDayName,
      "N" => w == 0 ? 7 : w,
      "S" => self.DayOfMonthSuffix,
      "w" => w,
      "F" => self.LongMonthName,
      "m" => "%.2d" % @month,
      "M" => self.ShortMonthName,
      "n" => @month,
      "t" => self.DaysThisMonth.to_s,
      "L" => self.LeapYear? ? '1' : '0',
      "Y" => @year,
      "y" => @year.to_s[-2, 2],
      "a" => @hour < 12 || @hour == 24 ? 'am' : 'pm',
      "A" => @hour < 12 || @hour == 24 ? 'AM' : 'PM',
      "g" => hour12,
      "G" => @hour,
      "h" => "%.2d" % hour12,
      "H" => "%.2d" % @hour,
      "i" => "%.2d" % @minute,
    }
    
    format.gsub /[dDjlNSwFmMntLYyaAgGhHi]/ do |match|
      dict[match.to_s]
    end
  end
  
  # returns 0 for Sunday, 1 for Monday, ..., and 6 for Saturday
  # from [url]http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week[/url]
  # SAMPAT MANE's Method
  def DayOfWeek
    d = @day
    m = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5][@month - 1]
    yy = @year.to_s[-2, 2].to_i
    q = yy / 4
    centuryMod = ((@year / 100) * 100) % 400
    
    if centuryMod == 0
      c = 6
    elsif centuryMod == 100
      c = 4
    elsif centuryMod == 200
      c = 2
    else # 300
      c = 0
    end
    
    finalD = d + m + yy + q + c
    
    if ((@month == 1 || @month == 2) && self.LeapYear?)
      finalD -= 1
    end
    
    finalD % 7
  end

end

writing a vx ace script where specially-tagged maps show mini characters; having trouble

so the idea is that I want my overworld map to show teeny-tiny characters, instead of their regular sprites. to make this a feature EVERYONE could use, I set out to make my own script, complete with tags an everything. it's my first time making something so extensive from scratch (I've mostly done simple method replacements), and I'm running into trouble...

if anyone else is interested in such a script, or just wants to help out :D, I could really use the help! I feel like I'm very close, but missing something basic or critical.

I've written this script with this thought-process:
* each character keeps track of whether it's in mini mode or not
* a character in mini mode uses a mini character set, instead of their normal graphic set
* when a player switches maps, if the new map has the <minimap> tag, then all party members are put into mini mode; otherwise, they are put into non-mini mode

I've pasted my script below, and inserted a ton of comments to explain what I'm doing... if it doesn't make sense, definitely feel free to ask me!

class Game_Actor
  #--------------------------------------------------------------------------
  # * Initialize Graphics
  #--------------------------------------------------------------------------
  def init_graphics
    @character_name = actor.character_name
    @character_index = actor.character_index
    @face_name = actor.face_name
    @face_index = actor.face_index

    # above is the normal init_graphics
    
    # this is my addition:
    @true_character_name = @character_name
    @true_character_index = @character_index
    @mini = false
  end
  
  #--------------------------------------------------------------------------
  # * Change Graphics
  #--------------------------------------------------------------------------
  def set_graphic(character_name, character_index, face_name, face_index)
    
    # okay: if the character ISN'T mini, we change their graphic
    if !@mini
      @character_name = character_name
      @character_index = character_index
    end
    
    # regardless, we always change their "true" graphic
    @true_character_name = character_name
    @true_character_index = character_index

    # normal code
    @face_name = face_name
    @face_index = face_index
  end
  
  # custom method: if we call mini!(true), then we change the
  # character graphics to be our custom mini graphic. if we call
  # mini!(false), then we set the character graphics to their
  # "true" graphics.
  def mini!(mini)
    if mini
      @character_name = "$player minimap.png"
      @character_index = 0
    else
      @character_name = @true_character_name
      @character_index = @true_character_index
    end
    
    @mini = mini
  end
  
end

class Scene_Map
  #--------------------------------------------------------------------------
  # * Player Transfer Processing
  #--------------------------------------------------------------------------
  def perform_transfer
    pre_transfer
    $game_player.perform_transfer
    
    # inserted this line, to handle minimaps
    do_minimap_transformation
    
    post_transfer
  end
  
  # minimap handler
  # we call mini! on each party member, passing true when the map
  # is a mini map, and false when it's not
  def do_minimap_transformation
    $game_party.members.each { |x|
      x.mini!($game_map.minimap?)
    }
  end

end

class Game_Map

  # minimap? check for maps. if minimap is nil (hasn't been determined yet),
  # then we call check_for_minimap_tag
  def minimap?
    check_for_minimap_tag if @minimap.nil?
    return @minimap
  end
  
  # and here's the tag check, where we mark the map as mini if its
  # note contains "<minimap>"
  def check_for_minimap_tag
    if @map.note.match(/<minimap>/i)
      @minimap = true
    else
      @minimap = false
    end
  end

end
Pages: 1