public

Rpg Maker Developers Group

Simple enough for a child, powerful enough for a developer

2 Followers
Preserved forum archive. This topic stores the original first post and locally mirrored RPG Maker Web attachments when available. It is posted by the BMMPlay archive account, not by the original creator.

Original Source

  • Original title: KWeatherArea VX
  • Original author: kyonides
  • Original date: March 23, 2025
  • Source thread: https://forums.rpgmakerweb.com/threads/kweatherarea-vx.176484/
  • Source forum path: Game Development Engines > Ruby Game System (RGSS) Scripts > RGSS2 Scripts (RMVX)

Summary

# Create 2 local variables: Use integers only, i.e. 1, 16 or 25. # W stands for Width or how wide this rectangle is supposed to be. # H stands for Height or how tall this rectangle is supposed to be. # area = [X, Y, W, H]

Archived First Post

KWeatherArea VX

by Kyonides

Introduction

Did you ever want to set a custom weather effect depending on a given area on the current map?
Now you can do it in RMVX!

NOTES
  • This scriptlet uses script calls to make that happen.
  • Here an area is synonymous with a rectangle.
  • You can add and remove areas.
  • These custom areas are NOT related to VX's map areas.
  • Removing an active weather area reverts the effects to the last effect you've set via Set Weather Effects event command.
  • If you change the weather in battle, it will revert it to the current area's weather, if any.
  • Please read the embedded notes to learn how to use it properly.

The Script

Ruby:
# * KWeatherArea VX * #
#   Scripter : Kyonides
#   v1.2.0 - 2025-03-25

# This scriptlet allows you to set regional weather effects on the current map.
# It works as usual. If you enter an area, the rain or snow will soon appear.
# Obviously, it will quickly vanish once you leave that area.

# If you ever remove an active weather area, it will revert the weather to
# the last effect set via weather effects event command if any.

# * Script Call * #

# - Add a Regional Weather Area
# - Step #1
#   Create 2 local variables: Use integers only, i.e. 1, 16 or 25.
#   W stands for Width or how wide this rectangle is supposed to be.
#   H stands for Height or how tall this rectangle is supposed to be.
# area = [X, Y, W, H]
# gm = $game_map

#   Example:
# area = [7, 10, 4, 6]
# gm = $game_map

# - Step #2
#   Use this call now:
#   - AreaID is an integer, 1+.
#   - Type is one of the RM's weather types: 1 being rain, 2 storm & 3 snow.
# gm.add_weather_area(AreaID, Type, area)
#   Example:
# gm.add_weather_area(1, 1, area)

# - Remove a Regional Weather Area (Temporarily?)
#   - AreaID is an integer, 1+.
# $game_map.remove_weather_area(AreaID)

class WeatherArea
  def initialize
    @id = 0
    @type = 0
    @area = Rect.new(0, 0, 0, 0)
  end

  def set_rect(*coords)
    coords = coords.flatten
    @area.x = coords.shift
    @area.y = coords.shift
    @area.width = coords.shift
    @area.height = coords.shift
  end

  def inside?(px, py)
    w = @area.x + @area.width - 1
    h = @area.y + @area.height - 1
    px.between?(@area.x, w) and py.between?(@area.y, h)
  end
  attr_accessor :id, :type, :area
end

class Game_Screen
  def change_weather(type, max)
    @weather_type = type
    @weather_max = (max + 1) * 4.0
    @weather_duration = 0
  end

  def previous_weather
    @weather_type = @weather_type_target
    @weather_max = @weather_max_target
    @weather_duration = 0
  end
end

class Game_Map
  alias :kyon_weather_area_gm_map_init :initialize
  alias :kyon_weather_area_gm_map_stp :setup
  alias :kyon_weather_area_gm_map_up :update
  def initialize
    kyon_weather_area_gm_map_init
    init_weather
  end

  def init_weather
    @weather_map_areas = {}
    @weather_area_id = 0
  end

  def setup(map_id)
    kyon_weather_area_gm_map_stp(map_id)
    load_weather_areas
  end

  def load_weather_areas
    @weather_areas = @weather_map_areas[@map_id] || {}
  end

  def add_weather_area(area_id, new_type, *coords)
    area = WeatherArea.new
    area.id = area_id
    area.type = new_type
    area.set_rect(*coords)
    areas = @weather_map_areas[@map_id] ||= {}
    areas[area_id] = area
    @weather_areas = areas
  end

  def remove_weather_area(area_id)
    @weather_areas.delete(area_id)
    return if @weather_area_id != area_id
    reset_weather
  end

  def reset_weather
    @screen.previous_weather
    @weather_area_id = 0
  end

  def update
    kyon_weather_area_gm_map_up
    update_weather_areas
  end

  def update_weather_areas
    return if @weather_areas.empty?
    px, py = $game_player.xy
    return if @weather_x == px and @weather_y == py
    @weather_x = px
    @weather_y = py
    new_area = @weather_areas.find {|key, val| val.inside?(px, py) }
    unless new_area
      reset_weather
      return
    end
    return if @weather_area_id == new_area[0]
    @weather_area_id, area = new_area
    @screen.change_weather(area.type, 10)
  end

  def aftermath_weather_area
    if @weather_area_id == 0
      reset_weather
    else
      area = @weather_areas[@weather_area_id]
      @screen.change_weather(area.type, 10)
    end
  end
end

class Game_Player
  def xy
    [@x, @y]
  end
end

class Spriteset_Battle
  alias :kyon_weather_area_sprtst_btl_crt_pix :create_pictures
  alias :kyon_weather_area_sprtst_btl_up_pix :update_pictures
  alias :kyon_weather_area_sprtst_btl_disp :dispose
  def create_pictures
    create_weather
    kyon_weather_area_sprtst_btl_crt_pix
  end

  def create_weather
    @weather = Spriteset_Weather.new(@viewport2)
    update_weather
  end

  def update_weather
    @weather.type = $game_map.screen.weather_type
    @weather.max = $game_map.screen.weather_max
    @weather.ox = $game_map.display_x / 8
    @weather.oy = $game_map.display_y / 8
    @weather.update
  end

  def update_pictures
    kyon_weather_area_sprtst_btl_up_pix
    update_weather
  end

  def dispose
    @weather.dispose
    kyon_weather_area_sprtst_btl_disp
  end
end

class Scene_Battle
  alias :kyon_weather_area_scn_btl_end :battle_end
  def battle_end(result)
    $game_map.aftermath_weather_area
    kyon_weather_area_scn_btl_end(result)
  end
end

DOWNLOAD NOW!

Terms & Conditions

Free for use in ANY game.
Please include my nickname in your game credits.
Also mention the forum where you found it.
That's it!

Downloads / Referenced Files

Log in to download

Log in, then follow the RPG Maker Developers Group to see these download links.

Log in to download

License / Terms Note

Please include my nickname in your game credits. Also mention the forum where you found it. That's it!

Creator Claims / Removal

If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.

#039#rgss2#script-archive

Replies (0)

No replies yet.

0 replies 1 view

Log in to reply.

User Avatar