RMRK is retiring.
Server is paid up for the rest of 2026, but the forum may go after that. See here for more information. Please archive or save anything you would like to keep before 2027.
Main Menu
  • Welcome to The RPG Maker Resource Kit.

Dynamic Weather and Time System

Started by ThallionDarkshine, May 27, 2012, 02:15:32 AM

0 Members and 1 Guest are viewing this topic.

ThallionDarkshine

Dynamic Weather and Time System
Version: 1.0
Author: ThallionDarkshine (no credit needed)
Date: May 25, 2012

Version History




  • <Version 1.0> 2012.5.35 - Original Release

Planned Future Versions


  • <Version 1.1> Support for MAWS (Modified Advanced Weather System)

Description



When the game starts, the weather system picks a random time of day. The screen tone changes as time passes, with each minute taking a certain amount of seconds specified in configuration. After a random amount of time, the weather changes, either to normal, rain, storm, snow, fog, or clouds. The storm includes random lightning as well.

Features


  • Can disable random weather
  • Weather changes dynamically
  • Put (in) in map name to disable weather
  • Change screen tint with time of day

Screenshots



Instructions

To use, place directly under main.
To turn on or off random weather (replace true with false to turn off):
Code (text) Select
$weather.rand_weather = true
$weather.update

To change the varience of weather:
Code (text) Select
$weather.varience =
To change the base time between weather changes:
Code (text) Select
$weather.base =
To change the second equivalent of one minute realtime:
Code (text) Select
$weather.min_equiv =

Script




module Weather_Config
  # Config
 
  WEATHER_VARIENCE = 520
  WEATHER_BASE = 200
  RANDOM_WEATHER = true
  MIN_EQUIV = 1/40
end

class Weather
  attr_accessor :varience
  attr_accessor :base
  attr_accessor :rand_weather
  attr_accessor :min_equiv
 
  def initialize
    @varience = Weather_Config::WEATHER_VARIENCE
    @base = Weather_Config::WEATHER_BASE
    @rand_weather = Weather_Config::RANDOM_WEATHER
    @min_equiv = Weather_Config::MIN_EQUIV
    @counter = [0, 0]
    @time = rand(24) * 60
    @wthr = 0
    hour = @time / 60
    if hour > 13
      change = hour - 14
    else
      change = 12 - hour
    end
    red = change * -9
    green = change * -9
    blue = change * -9
    gray = change * 12
    $game_screen.start_tone_change(Tone.new(red, green, blue, gray), 0)
    @weather_change = rand(@varience) + @base
    @red = red
    @green = green
    @blue = blue
    @s_hour = hour
    @s_wthr = 0
  end
 
  def rand_weather=(bool)
    @rand_weather = bool
    if @rand_weather == false
      $game_screen.weather(0, 0, 0)
      $game_system.bgs_fade(5)
      @wthr = 0
      $game_map.fog_name = ""
    end
  end
 
  def update
    if $game_temp.inside == true
      @counter[1] = nil
      $game_screen.weather(0, 0, 0)
    else
      @counter[1] = 0 if @counter[1] == nil
    end
    @counter[0] += 1
    @counter[1] += 1 if @counter[1] != nil
   
    if @counter[0] > Graphics.frame_rate * @min_equiv
      @time = (@time + 1) % (24 * 60 + 1)
      @counter[0] = 0
      hour = @time / 60
      if hour > 13
        change = hour - 14
      else
        change = 12 - hour
      end
      red = change * -9
      green = change * -9
      blue = change * -9
      gray = change * 12
      if @rand_weather == true
        if @counter[1] != nil and @counter[1] > @weather_change
          @lightning = false
          rnd = rand(8)
          case rnd
            when 0
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
            when 1
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
              $game_screen.weather(1, rand(10), 200)
              bgs = RPG::AudioFile.new("005-Rain01", 80, 100)
              $game_system.bgs_play(bgs)
            when 2
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
              $game_screen.weather(2, rand(10), 200)
              @lightning = true
              bgs = RPG::AudioFile.new("007-Rain03", 100, 100)
              $game_system.bgs_play(bgs)
            when 3
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
              $game_screen.weather(3, rand(10), 200)
            when 4
              unless @wthr == 4
                $game_screen.weather(0, 0, 60)
                $game_system.bgs_fade(10)
                $game_map.fog_name = "001-Fog01"
                $game_map.fog_hue = 0
                @fog_opac = rand(75) + 100
                $game_map.fog_opacity = 0
                $game_map.fog_sx = (rand(5) + 1) * 2
                $game_map.fog_sy = (rand(5) + 1) * 2
              end
            when 5
              unless @wthr == 5
                $game_screen.weather(0, 0, 60)
                $game_system.bgs_fade(10)
                $game_map.fog_name = "002-Clouds01"
                $game_map.fog_hue = 0
                @fog_opac = rand(75) + 50
                $game_map.fog_opacity = 0
                $game_map.fog_sx = (rand(5) + 1) * 4
                $game_map.fog_sy = (rand(5) + 1) * 4
              end
            when 6
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
            when 7
              $game_screen.weather(0, 0, 60)
              $game_system.bgs_fade(10)
          end
          @wthr = rnd
          @weather_change = rand(@varience) + @base
          @counter[1] = 0
        end
        case @wthr
          when 1
            red -= 20
            blue -= 15
            green -= 20
          when 2
            red -= 30
            blue -= 20
            green -= 30
          when 3
            red += 5
            blue += 10
            green += 5
          when 4
            red -= 5
            green -= 5
            gray -= 20
        end
      end
      if @wthr != @s_wthr or hour != @s_hour 
        $game_screen.start_tone_change(Tone.new(red, green, blue, gray), 60)
      end
     
      if (@wthr == 4 or @wthr == 5) and $game_map.fog_opacity != @fog_opac
        $game_map.fog_opacity += 1
      else
        if $game_map.fog_name != ""
          $game_map.fog_opacity -= 1
          if $game_map.fog_opacity == 0
            $game_map.fog_name = ""
            $game_map.fog_sx = 0
            $game_map.fog_sy = 0
          end
        end
      end
     
      if @lightning == true
        if rand(120) == 0
          $game_screen.start_flash(Color.new(255, 255, 255), rand(9) + 1)
        end
      end
    end
  end
end

class Scene_Map
  alias dwt_orig_update update
 
  def update
    $weather.update
    dwt_orig_update
  end
end

class Scene_Title
  alias dwt_orig_command_new_game command_new_game
 
  def command_new_game
    dwt_orig_command_new_game
    $weather = Weather.new
  end
end

class Game_Temp
  attr_accessor :inside
 
  alias dwt_orig_init initialize
 
  def initialize
    dwt_orig_init
    @inside = false
  end
end

class Scene_Save
  alias dwt_orig_write_save_data write_save_data
 
  def write_save_data(file)
    dwt_orig_write_save_data(file)
    Marshal.dump($weather, file)
  end
end

class Scene_Load
  alias dwt_orig_read_save_data read_save_data
 
  def read_save_data(file)
    dwt_orig_read_save_data(file)
    $weather = Marshal.load(file)
  end
end


Credit




  • ThallionDarkshine

Thanks


  • My sister, whom I made this as part of a game for.

Support



Just post any issues here.

Known Compatibility Issues

None that I know of.

Demo



https://rapidshare.com/files/2898565759/Weather_Demo.exe

Author's Notes



Nothing

Terms of Use



Use freely, no credit necessary.