KWeatherArea XP
#1
KWeatherArea XP

by Kyonides

Introduction

Thinking 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 RMXP! Grinning

NOTES
  • This scriptlet uses script calls to make that happen. Winking
  • Here an area is synonymous with a rectangle.
  • You can add and remove 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 Book read the embedded notes to learn how to use it properly.

The Script

Code:
# * KWeatherArea XP * #
#   Scripter : Kyonides
#   v1.1.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
    $game_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
    $game_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]
      $game_screen.change_weather(area.type, 10)
    end
  end
end

class Game_Player
  def xy
    [@x, @y]
  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

Supported Engines

RMXP and HiddenChest! Two Thumbs Up! 


Terms & Conditions

Free for use in ANY game. Gamer 
Please include my nickname in your game credits.
Also mention the forum where you found it. Winking
That's it! Tongue sticking out
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9

Maranatha!

The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.

[Image: SP1-Scripter.png]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: SP1-Reporter.png]

My Original Stories (available in English and Spanish)

List of Compiled Binary Executables I have published...
HiddenChest & Roole

Give me a free copy of your completed game if you include at least 3 of my scripts! Laughing + Tongue sticking out

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Reply
#2
Script Upgrade!

This unexpected release Happy with a sweat offers you 2 bug fixes and 1 new feature.

Bug Fixes

The scriptlet didn't let you set a weather effect manually at some point because one of Game_Screen's variables was set to a minimum level. Oops! Oops!
Now it's totally possible to set any of the available effects via event commands or script calls.

The script call passed a nested array to the WeatherArea's set_rect method causing the vanilla RMXP engine to crash.
Now the custom class flattens the coordinates array before altering its area variable (a Rect object).

New Feature

If you ever delete the currently active weather area, it will revert the weather to the last weather effect set via event command, if any.
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9

Maranatha!

The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.

[Image: SP1-Scripter.png]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: SP1-Reporter.png]

My Original Stories (available in English and Spanish)

List of Compiled Binary Executables I have published...
HiddenChest & Roole

Give me a free copy of your completed game if you include at least 3 of my scripts! Laughing + Tongue sticking out

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Reply
#3
Another Script Upgrade!

Version 1.1.0 Has a New Feature!

Once the current battle has finished, the script will revert any changes you might have made to the weather effects in battle to the local area's weather settings, if there's any.
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9

Maranatha!

The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.

[Image: SP1-Scripter.png]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: SP1-Reporter.png]

My Original Stories (available in English and Spanish)

List of Compiled Binary Executables I have published...
HiddenChest & Roole

Give me a free copy of your completed game if you include at least 3 of my scripts! Laughing + Tongue sticking out

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Reply




Users browsing this thread: 1 Guest(s)