じ☆ve冰风 发表于 2026-7-23 15:18:06

KWeatherArea VX

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 =
# 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]
查看完整版本: KWeatherArea VX