Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Realtime Script System

Script Title:
Realtime System
Detailed Description:
I really need a Realtime Script, so that I can make something happen, every Monday or whatever. So like a real month/day/week system. It's hard to explain.
Screen shots:
Monday.PNG

Other Scripts I am using (in order):
Code:
Pocill's Message System

Caterpillar System - (I forget who)
 
Try this one:
Code:
#==============================================================================

# Time System Script v. 1.02

# by Caldaron (22.12.2006)

#==============================================================================

SDK.log("Caldaron's Time", 'Caldaron', 1.02, '2006-12-22')

if SDK.state("Caldaron's Time")

#==============================================================================

class Time_System

  #--------------------------------------------------------------------------

  attr_accessor :area

  attr_reader   :current_weather

  attr_accessor :freeze_time

  attr_accessor :freeze_tone

  attr_accessor :thunder

  attr_accessor :time_count

  #--------------------------------------------------------------------------

  def initialize

    @second_length = 60

    @minute_length = 60

    @hour_length = 24

    @day_length = 30

    @week_length = 7

    @month_length = 12

    @last_minute = nil

    @last_second = [0,0]

    @freeze_time = false

    @freeze_tone = false

    @current_weather = [0, false]

    @last_map = 0

    @last_area = 0

    @thunder = false

    @speed = 1.00

    @time_count = [0, 0]

    @time_overlap = true

    @frozen = 0

    @timer = 1

    #==============================================================================

    # DATE NAMES

    #==============================================================================

    @day_name = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",

    "Sunday"]

    @month_name = ["January", "February", "March", "April", "May", "June",

    "July", "August", "September", "October", "November", "December"]

    #==============================================================================

    # START DATE

    #==============================================================================

    @start_time = [58, 56, 11, 25, 3, 619]

    create_areas

  end

  #==============================================================================

  # AREA DEFINITIONS

  #==============================================================================

  def create_areas

    #--------------------------------------------------------------------------

    # Areas

    #--------------------------------------------------------------------------

    @area = []

 

    @area[0] = Area.new(0)

 

    @area[1] = Area.new(1)

 

    @area[2] = Area.new(2)

 

    @area[3] = Area.new(3)

    #--------------------------------------------------------------------------

    # Area Name

    #--------------------------------------------------------------------------

    @area[0].name = "Outside"

 

    @area[1].name = "Inside"

 

    @area[2].name = "Cave"

 

    @area[3].name = "Snow Field"

    #--------------------------------------------------------------------------

    # Weather in this Area?

    #--------------------------------------------------------------------------

    @area[0].weather = true

 

    @area[1].weather = false

 

    @area[2].weather = false

 

    @area[3].weather = true

    #--------------------------------------------------------------------------

    # Speed of Time in this Area?

    # the higher the Value, the faster the Time

    #--------------------------------------------------------------------------

    @area[0].time_speed = 1.00

 

    @area[1].time_speed = 0.50

 

    @area[2].time_speed = 1.25

 

    @area[3].time_speed = 2.00

    #--------------------------------------------------------------------------

    # Time overlaps?

    # true:  Different Times with different Speed of Time in different Areas

    # false: Same Time but different Speed of Time in different Areas

    #--------------------------------------------------------------------------

    @area[0].time_overlap = true

 

    @area[1].time_overlap = true

 

    @area[2].time_overlap = true

 

    @area[3].time_overlap = true

    #--------------------------------------------------------------------------

    # Propabilities of the Weathertypes:

    # Weather at Position

    #    1 - rain

    #    2 - storm

    #    3 - snow

    #    4 - hail

    #    5 - rain with thunder and lightning

    #    6 - falling leaves (autumn)

    #    7 - blowing leaves (autumn)

    #    8 - swirling leaves (autumn)

    #    9 - falling leaves (green)

    #   10 - cherry blossom (sakura) petals

    #   11 - rose petals

    #   12 - feathers

    #   13 - blood rain

    #   14 - sparkles

    #   15 - user defined

    #   16 - blowing snow

    #   17 - meteor shower

    #   18 - falling ash

    #   19 - bubbles

    # Rest of the Percentage will be Sunshine

    #--------------------------------------------------------------------------

    for i in [email=0...@area.size]0...@area.size[/email]

      @area[i].weather_prop = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    end

    # Outside                         

    @area[0].weather_prop[0] = 20 # rain

    @area[0].weather_prop[1] = 10 # storm

    @area[0].weather_prop[4] = 10 # thunder

    # Inside                          

    @area[1].weather_prop = @area[0].weather_prop

    # when @area.weather = false and @area.weather_prop is the same as the last map

    # (which is in an other area) only the sound will be played

    # Cave

    # @area[2].weather_prop needs no editing, because there is no weather ;)

    # Snow Field

    @area[3].weather_prop[2] = 20

    @area[3].weather_prop[3] = 10

    @area[3].weather_prop[15] = 10

    #--------------------------------------------------------------------------

    # Months influence Propability?

    #--------------------------------------------------------------------------

    @area[0].prop_influence = true

 

    @area[1].prop_influence = true

 

    @area[2].prop_influence = false

 

    @area[3].prop_influence = false

    #--------------------------------------------------------------------------

    # Volume of the Weather

    #--------------------------------------------------------------------------

    @area[0].weather_volume = 100

 

    @area[1].weather_volume = 80

 

    @area[2].weather_volume = 0

 

    @area[3].weather_volume = 100

    #--------------------------------------------------------------------------

    # Thunder light in this Area?

    #--------------------------------------------------------------------------

    @area[0].thunder = true

 

    @area[1].thunder = false

    @area[2].thunder = false

    @area[2].thunder = false

    #--------------------------------------------------------------------------

    # Maps included in this Area

    # Example: @area[6].maps = [6, 13, 19]

    #--------------------------------------------------------------------------

    @area[0].maps = [1, 2]

 

    @area[1].maps = [3]

 

    @area[2].maps = [4]

    @area[3].maps = [5]

    #--------------------------------------------------------------------------

    # Day Period

    # must be Range: (x..y)

    # must include all hours from 0 to @hours_length-1

    #--------------------------------------------------------------------------

    @area[0].day_period[0] = (0..3)

    @area[0].day_period[1] = (4..7)

    @area[0].day_period[2] = (8..11)

    @area[0].day_period[3] = (12..15)

    @area[0].day_period[4] = (16..19)

    @area[0].day_period[5] = (20..23)

 

    @area[1].day_period[0] = (0..23)

    @area[2].day_period[0] = (0..23)

 

    @area[3].day_period = @area[0].day_period

    #--------------------------------------------------------------------------

    # Months influence Tint?

    #--------------------------------------------------------------------------

    @area[0].tint_influence = true

 

    @area[1].tint_influence = true

    @area[2].tint_influence = false

    @area[3].tint_influence = false

  end

  #--------------------------------------------------------------------------

  # minutes_to(Area ID, Tint ID)

  # Max Distance is 1

  # Example:

  # minutes_to(0, 0) * 25

  # Value slowly grows from 0 to 25, by dividing the max reachable with the

  # current minutes in this day period

  #--------------------------------------------------------------------------

  def refresh_tints # initialize_tints

    # tints must be equal the day_period.size

    @area[0].tint[0] = [-200 + minutes_to( 0, 0) * 25, -175 + minutes_to( 0, 0) * 25,

                        -100, 32]

 

    @area[0].tint[1] = [-175 + minutes_to( 0, 1) * 75, -150 + minutes_to( 0, 1) * 75,

                        -100 + minutes_to( 0, 1) * 50,   32 - minutes_to( 0, 1) * 16]

 

    @area[0].tint[2] = [-100 + minutes_to( 0, 2) * 85,  -75 + minutes_to( 0, 2) * 60,

                         -50 + minutes_to( 0, 2) * 35,   16 - minutes_to( 0, 2) * 16]

 

    @area[0].tint[3] = [ -15 - minutes_to( 0, 3) * 20,  -15 - minutes_to( 0, 3) * 35,

                         -15 - minutes_to( 0, 3) * 60,    0 + minutes_to( 0, 3) *  8]

 

    @area[0].tint[4] = [ -35 - minutes_to( 0, 4) * 75,  -50 - minutes_to( 0, 4) * 50,

                         -75 - minutes_to( 0, 4) * 25,    8 + minutes_to( 0, 4) *  8]

 

    @area[0].tint[5] = [-110 - minutes_to( 0, 5) * 90, -100 - minutes_to( 0, 5) * 75,

                        -100, 16 + minutes_to( 0, 5) * 16]

 

    @area[1].tint[0] = [0, 0, 0, 0]

 

    @area[2].tint[0] = [-20, -40, -60, 0]

 

    @area[3].tint = @area[0].tint

    for i in 0...@area[0].tint.size

      @area[3].tint[i][2] = @area[0].tint[i][2]-20

    end

  end

  #--------------------------------------------------------------------------

  # tone[0] = red / tone[1] = green / tone[2] = blue / tone[3] = gray

  #--------------------------------------------------------------------------

  def month_tint(tone, i)

    tona = []

    if @area[i].tint_influence

      case months

      when 1

        tona.push(tone[0]-10, tone[1]-10, tone[2], tone[3] + 8)

      else

        tona.push(tone[0], tone[1], tone[2], tone[3])

      end

    else

      tona.push(tone[0], tone[1], tone[2], tone[3])

    end

    return tona

  end

  #--------------------------------------------------------------------------

  def month_weather(prop, i)

    #    0 - rain

    #    1 - storm

    #    2 - snow

    #    3 - hail

    #    4 - rain with thunder and lightning

    #    5 - falling leaves (autumn)

    #    6 - blowing leaves (autumn)

    #    7 - swirling leaves (autumn)

    #    8 - falling leaves (green)

    #    9 - cherry blossom (sakura) petals

    #   10 - rose petals

    #   11 - feathers

    #   12 - blood rain

    #   13 - sparkles

    #   14 - user defined

    #   15 - blowing snow

    #   16 - meteor shower

    #   17 - falling ash

    #   18 - bubbles

    if @area[i].prop_influence

      case months

      when 1, 2, 12

        prop[0]  = 0

        prop[1]  = 0

        prop[2]  += @area[i].weather_prop[0]

        prop[3]  += @area[i].weather_prop[4]

        prop[4]  = 0

        prop[15] += @area[i].weather_prop[1]

      when 3..5

        prop[0]  /= 2

        prop[1]  /= 2

        prop[9]  += @area[i].weather_prop[0]/2

        prop[10] += @area[i].weather_prop[1]/2

      when 6..8

        # is the standard definition of weather_prop

      when 9..11

        prop[0] /= 2

        prop[1] /= 2

        prop[4] /= 2

        prop[5] += @area[i].weather_prop[0]/2

        prop[6] += @area[i].weather_prop[1]/2

        prop[7] += @area[i].weather_prop[4]/2

      end

    end

    return prop

  end

  #--------------------------------------------------------------------------

  # NO MORE TO EDIT

  #--------------------------------------------------------------------------

  def tone_change

    for i in [email=0...@area.size]0...@area.size[/email]

      next unless @area[i].maps.include?($game_map.map_id)

      weather_control(i) unless @last_map == $game_map.map_id

      for j in 0...@area[i].day_period.size

        next unless @area[i].day_period[j].include?(hours)

        @last_map = $game_map.map_id

        @last_area = i

        @speed = @area[i].time_speed if @area[i].time_speed != 0

        @freeze_time = true if @area[i].time_speed == 0

        @time_overlap = @area[i].time_overlap

        unless @freeze_time or @freeze_tone

          refresh_tints 

          tone = month_tint(@area[i].tint[j], i)

          $game_screen.start_tone_change(Tone.new(tone[0], tone[1], tone[2], tone[3]), 0)

        end

      end

    end

  end

  #--------------------------------------------------------------------------

  def weather_control(id)

    @thunder = @area[id].thunder

    weather = []

    weather = month_weather(@area[id].weather_prop.clone, id)

    if @last_area != id and weather[@current_weather[0]-1] == 0

      change_weather 

    else

      $game_screen.weather(0, 0, 0) unless @area[id].weather

      play_weather_sound(@current_weather[0], @area[id].weather_volume)

      if $game_screen.weather_type == 0 and @area[id].weather and @current_weather[1] 

        $game_screen.weather(@current_weather[0], rand(50)+1, 0)

      end

    end

  end

  #--------------------------------------------------------------------------

  def change_weather

    for i in [email=0...@area.size]0...@area.size[/email]

      next unless @area[i].maps.include?($game_map.map_id)

      weather = []

      weather = month_weather(@area[i].weather_prop.clone, i)

      id = i

      for j in 0...weather.size

        if weather[j] >= rand(100)+1

          if @area[i].weather

            $game_screen.weather(j+1, rand(50)+1, 500)

            @current_weather = [j+1, true]

          end

          play_weather_sound(j+1, @area[i].weather_volume)

          return

        end

      end

    end

    if @area[id].weather

      $game_screen.weather(0, 0, 500)

      play_weather_sound(0, 0)

      @current_weather = [0, false]

    else

      $game_screen.weather(0, 0, 0)

      play_weather_sound(0, 0)

    end

  end

  #--------------------------------------------------------------------------

  def play_weather_sound(type, volume)

    @type = type

    bgs = BGS.new

    bgs.volume = volume

    bgs.pitch = 100

    @type = 0 if volume == 0

    case @type

    when 1

      bgs.name = "005-Rain01"

      $game_system.bgs_play(bgs)

    when 2

      bgs.name = "006-Rain02"

      $game_system.bgs_play(bgs)

    when 4, 5

      bgs.name = "007-Rain03"

      $game_system.bgs_play(bgs)

    when 6

      bgs.name = "001-Wind01"

      $game_system.bgs_play(bgs)

    when 7

      bgs.name = "002-Wind02"

      $game_system.bgs_play(bgs)

    when 8

      bgs.name = "003-Wind03"

      $game_system.bgs_play(bgs)

    when 12

      bgs.name = "005-Rain01"

      $game_system.bgs_play(bgs)

    when 15

      bgs.name = "004-Wind04"

      $game_system.bgs_play(bgs)

    else

      $game_system.bgs_fade(0) unless $game_map.map.autoplay_bgs

      $game_system.bgs_play($game_map.map.bgs) if $game_map.map.autoplay_bgs

    end

  end

  #--------------------------------------------------------------------------

  def minutes_to(id, period)

    return 0 unless @area[id].day_period[period].include?(hours)

    @minutes = minutes

    @hours = hours

    area = @area[id].day_period[period]

    @minutes += (@hours - area.min) * @minute_length

    @minutes /= (((area.max - area.min) * @minute_length) + @minute_length - 1.00)

    return @minutes

  end

  #==============================================================================

  # TIME DEFINITIONS

  #==============================================================================

  def seconds(total = false)

    unless @freeze_time

      @time_count[0] = Graphics.frame_count - @frozen

      @time_count[1] += 0.12

      @timer = @time_count[0] * @speed if @time_overlap

      @timer = @time_count[1] * @speed unless @time_overlap

      @last_second[0] = @timer + @start_time[0]

      @last_second[1] = (@timer + @start_time[0]) % @second_length

      return Integer(@timer + @start_time[0]) if total

      return Integer(@timer + @start_time[0]) % @second_length

    else

      @frozen = Graphics.frame_count - @time_count[0]

      return Integer(@last_second[0]) if total

      return Integer(@last_second[1])

    end

  end

  #--------------------------------------------------------------------------

  def minutes(total = false)

    return Integer(seconds(true)/@second_length + @start_time[1]) if total

    return Integer(seconds(true)/@second_length + @start_time[1]) % @minute_length

  end

  #--------------------------------------------------------------------------

  def hours(total = false)

    return Integer(minutes(true)/@minute_length + @start_time[2]) if total

    return Integer(minutes(true)/@minute_length + @start_time[2]) % @hour_length

  end

  #--------------------------------------------------------------------------

  def days(total = false)

    return Integer(hours(true)/@hour_length + @start_time[3]-1) if total

    return Integer(hours(true)/@hour_length + @start_time[3] - 1) % @day_length + 1

  end

  #--------------------------------------------------------------------------

  def months(total = false)

    return Integer(days(true)/@day_length + @start_time[4]) if total

    return Integer(days(true)/@day_length + @start_time[4]) % @month_length

  end

  #--------------------------------------------------------------------------

  def years

    return Integer(months(true)/@month_length + @start_time[5])

  end

  #==============================================================================

  # TIME NAMES

  #==============================================================================

  def day_name

    return @day_name[(days % @week_length)-1]

  end

  #--------------------------------------------------------------------------

  def month_name

    return @month_name[(months % @month_length)-1]

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

class Time_System

  #==============================================================================

  class Area

    #--------------------------------------------------------------------------

    attr_accessor :id

    attr_accessor :name

    attr_accessor :weather

    attr_accessor :weather_prop

    attr_accessor :prop_influence

    attr_accessor :weather_volume

    attr_accessor :thunder

    attr_accessor :maps

    attr_accessor :day_period

    attr_accessor :tint

    attr_accessor :tint_influence

    attr_accessor :time_speed

    attr_accessor :time_overlap

    #--------------------------------------------------------------------------

    def initialize(id)

      @id = id

      @name = ""

      @weather = false

      @weather_prop = []

      @prop_influence = false

      @weather_volume = 100

      @thunder = false

      @maps = []

      @day_period = []

      @tint = []

      @tint_influence = false

      @time_speed = 1.00

      @time_overlap = false

    end

    #--------------------------------------------------------------------------

  end

  #==============================================================================

end

#==============================================================================

class Scene_Title

  #--------------------------------------------------------------------------

  alias caldaron_time_title_data main_database

  #--------------------------------------------------------------------------

  def main_database

    caldaron_time_title_data

    $time = Time_System.new

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

class Game_Map

  #--------------------------------------------------------------------------

  attr_reader   :map

  #--------------------------------------------------------------------------

  alias caldaron_time_map_init initialize

  def initialize

    @weather_wait = 0

    caldaron_time_map_init

  end

  #--------------------------------------------------------------------------

  alias caldaron_time_map_update update

  def update

    if $scene.is_a?(Scene_Map)

      $time.tone_change 

      @weather_wait -= 1 if @weather_wait > 0

      if @weather_wait == 0

        $time.change_weather

        @weather_wait = rand(4000) + 2000

      end

    end

    caldaron_time_map_update

  end

  #--------------------------------------------------------------------------

  def autoplay

    if @map.autoplay_bgm

      $game_system.bgm_play(@map.bgm)

    end

    if @map.autoplay_bgs and $time.current_weather[0] == 0

      $game_system.bgs_play(@map.bgs)

    end

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

class Scene_Save < Scene_File

  #--------------------------------------------------------------------------

  alias caldaron_time_save_write write_data

  def write_data(file)

    caldaron_time_save_write(file)

    Marshal.dump($time, file)

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

class Scene_Load < Scene_File

  #--------------------------------------------------------------------------

  alias caldaron_time_load_read read_data

  def read_data(file)

    caldaron_time_load_read(file)

    $time = Marshal.load(file)

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

class BGS

  #--------------------------------------------------------------------------

  attr_accessor :name

  attr_accessor :volume

  attr_accessor :pitch

  #--------------------------------------------------------------------------

  def initialize

    @name = ""

    @volume = 80

    @pitch = 100

  end

  #--------------------------------------------------------------------------

end

#==============================================================================

end
 
Thanks alot, but when I use it I get this error when I load a previou save file I get this error:

"Script 'Time_System' line 554: NoMethodError occured

undefined method `tone_change' for "":String"
 
Ok, thanks! And, one other thing, when I use it and start a new game, it starts indoors and the indoors is tinted. How do I change that so it's only outside that is tinted?

EDIT: Oh, and how can I make it possible so that I can create a Conditional Branch if it's Monday then something happens if it's not then...yeah.
 
And, one other thing, when I use it and start a new game, it starts indoors and the indoors is tinted. How do I change that so it's only outside that is tinted?
Code:
#     #--------------------------------------------------------------------------

#     # Months influence Tint?

#     #--------------------------------------------------------------------------

#     @area[0].tint_influence = true

#  

#     @area[1].tint_influence = true

#     @area[2].tint_influence = false

#     @area[3].tint_influence = false
Oh, and how can I make it possible so that I can create a Conditional Branch if it's Monday then something happens if it's not then...yeah.
You have to make a script CB (last page of the CB)
Try this code:
Code:
$time.days == X
X has to be replaced with any number. Monday should be 0 or maybe 1, I am not sure.
 
Ok thanks, I knew that the CB had to be a script CB I just didn't know what script to use.

How would I make it so that one of the NPCs could say "It's 'Hour' o' clock"

I have looked through the script and I need to find out how to change the weather so that it isn't raining all of the time.
 
To make an NPC say something like that you have to save the value (hours in this example) in a variable. (with call script):
Code:
$game_variables[ID_OF_THE_VARIABLE] = $time.hours
I have looked through the script and I need to find out how to change the weather so that it isn't raining all of the time.
Just look at the script options. You can define weather for each area.
 
Okay, I have done that and it works fine, but why is it that when I add a new weather probability to the script, it doesn't display anything? Here is what I have:
Code:
    for i in [email=0...@area.size]0...@area.size[/email]

      @area[i].weather_prop = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    end

    # Outside                        

    @area[0].weather_prop[0] = 5 # rain

    @area[0].weather_prop[6] = 90

Oh and the Script CB's don't work.
 
Okay, I have done that and it works fine, but why is it that when I add a new weather probability to the script, it doesn't display anything?
Oh, I forgot to mention that you need the Advanced Weather script.
Here, I found a demo: Link
Oh and the Script CB's don't work.
Try this:
Code:
X == ($time.days%$time.instance_variable_get(:@week_length)-1)
0 for X means Monday, 1 means Tuesday and so on
 
I was wondering if it was possible to change how fast time flows on this script if so that would save a lot of lag on my game. What I am after is 1 second real time is one minute game time. Thanks.
 
Code:
     @second_length = 60

     @minute_length = 60

     @hour_length = 24

     @day_length = 30

     @week_length = 7

     @month_length = 12
Change @second_length to 40 (it needs 40 frames then to pass one minute)
 
You could also use my script KyoWatch for in game time keeping.

Whenever you want to setup the time you can do it like this from an event...

Edit...

You can now set the time with my script from any event. I give some examples...

[rgss]$game_kyowatch.set_time( { :hour => 16,
:min => 45 } )
#or
$game_kyowatch.set_time( { :month => 9,
:year => 2050 } )
[/rgss]

I coded it like that just in case you find the script call window width too narrow for writing it down in a single line.

You can still use this old method if you like...

[rgss]$game_kyowatch.kyoclock[2] = new_day
$game_kyowatch.kyoclock[3] = new_hour # in 24 hour format
$game_kyowatch.kyoclock[4] = minutes
$game_kyowatch.frame_count = Graphics.frame_count
[/rgss]

The script is compatible with old saved games and the name of the day is updated automatically.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top