- 累计送礼:
- 0 个
- 累计收礼:
- 1 个
TA的每日心情 | 开心 2026-7-12 04:10 |
|---|
签到天数: 209 天 连续签到: 2 天 [LV.7]常住居民III

管理员
  
- VIP
- 7
- 卡币
- 29097
- OK点
- 16
- 推广点
- 0
- 同能卷
- 50
- 积分
- 37536


|
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
复制代码
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/ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|