KWeatherArea VX
KWeatherArea VXby 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 =
# gm = $game_map
# Example:
# area =
# 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
@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
@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!
本贴来自国际rpgmaker官方论坛作者:kyonides处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/kweatherarea-vx.176484/
页:
[1]