Код:
	=begin
###############################################################################
#                                                                             #
#            	 	Система погодных условий для RPG MAKER VX ACE   			        #
#                                                                             #
###############################################################################
 
Автор: Денис Кузнецов (http://vk.com/id8137201)
Группа ВК: https://vk.com/scriptsrpgmakervxace
Версия: 3.0
Релиз от: 22.07.15
Требуется набор графики в папке Graphics/Game_Weather
 
############# ИНСТРУКЦИЯ #######################################################
 
 Чтобы установить погоду используйте вызов скрипта: 
 
	start_weather(type, power, name, stop_all)
 
	где type - тип отображаемой погоды
	power - сила погоды (кол-во спрайтов также зависит от настройки ниже)
	name - имя графики (например, "Snow")
	stop_all - остановить всю погоду, чтобы на экране была только эта
	stop_all может быть или true, или false (остановить / не останавливать) 
 
	есть следующие типы (type) погоды:
	0 	- диагонально слева направо вниз (обычная скорость)
	1 	- вертикально сверху вниз (обычная скорость)
	2 	- диагонально справа налево вниз (обычная скорость)
	3 	- горизонтально налево (обычная скорость)
	4 	- диагонально справа налево вверх (обычная скорость)
	5 	- вертикально вверх (обычная скорость)
	6 	- диагонально справа налево вверх (обычная скорость)
	7 	- горизонтально направо (обычная скорость)
	8 	- диагонально слева направо вниз (быстрая скорость)
	9 	- вертикально сверху вниз (быстрая скорость)
	10 	- диагонально справа налево вниз (быстрая скорость)
	11 	- горизонтально налево (быстрая скорость)
	12	- диагонально справа налево вверх (быстрая скорость)
	13 	- вертикально вверх (быстрая скорость)
	14 	- диагонально справа налево вверх (быстрая скорость)
	15 	- горизонтально направо (быстрая скорость)
	16	- случайное
 
	Погоду можно ставить на паузу, снимать с паузы (продолжать) и останавливать
	для этого используйте скрипты:
 
	1. stop_all_weather - остановит всю погоду
 
	2. stop_weather(index) - остановит одну погоду с индексом. 
	По умолчанию index = 0. Нумерация всегда с 0.
 
	3. pause_all_weather и continue_all_weather поставят на паузу и продолжат все
	погодные условия соответственно
 
	4. pause_weather(index) - ставит на пазу одну погоду с номером.
 
	5. continue_weather(index) - продолжает одну погоду с номером.
	6. weather_exist?(type, name) - проверка на существование погоды (true или false)
	7. weather_amount - узнать количество погодных условий на экране (вернет -1, если какая-то ошибка)
	8. toggle_weather_in_battle - переключить использование погоды в битве
	9. setup_weather_in_battle(setup) - установить использование погоды в битве (true - вкл., false - выкл.)
 
=end
############# НАТРОЙКА #########################################################
module Game_Weather_Settings
	
	# Количество одновременных погодных условий
	$GAME_WEATHER_LIMIT = 2
	
	# Коэффициент силы. Влияет на количество спрайтов погоды
	$GAME_WEATHER_POWER = 15
	
	# Использовать погоду в битвах ? true/false (да/нет)
	$GAME_WEATHER_IN_BATTLE = false
	
	# Глубина погоды Z
	GAME_WEATHER_Z = 200
	
	# Пользовательские типы погоды. Нумерация при вызове скрипта начинается с 17.
	# [ Направление движения, инвертировать направление (true/false), скорость, вращение (true/false) ]
	
	# Направления движения.
	# 0 - диагонально слева направо вниз
	# 1 - вертикально сверху вниз
	# 2 - диагонально справа налево вниз
	# 3 - горизонтально налево
	
	# Скорость
	# false - обычная
	# true - быстрая
	
	GAME_WEATHER_CUSTOM_TYPES =
	[
		[0, false, false, true],
		[1, true, true, true],
		[2, false, false, true],
		[3, true, true, true]
	]
	
end # module Game_Weather_Settings
############# КОНЕЦ НАСТРОЙКИ ##################################################
############# НИЖЕ НЕ ТРОГАТЬ !!! ##############################################
module Cache
	
	def self.weather(filename)
		load_bitmap("Graphics/Game_Weather/", filename)
	end
	
end # module Cache
class Game_Weather_Functions
	
	include Game_Weather_Settings
	
	def self.weather_type_settings(type)
		case type
		when 0; 													return type_0
		when 1; 													return type_1
		when 2; 													return type_2
		when 3; 													return type_3
		when 4; 													return type_0(true)
		when 5; 													return type_1(true)
		when 6; 													return type_2(true)
		when 7; 													return type_3(true)
		when 8; 													return type_0(false, true)
		when 9; 													return type_1(false, true)
		when 10; 													return type_2(false, true)
		when 11; 													return type_3(false, true)
		when 12; 													return type_0(true, true)
		when 13; 													return type_1(true, true)
		when 14; 													return type_2(true, true)
		when 15; 													return type_3(true, true)
		when 16; 													return random
		when 17..17 + GAME_WEATHER_CUSTOM_TYPES.size; 	return custom_type(GAME_WEATHER_CUSTOM_TYPES[type - 17])
		end
	end
	
	def self.type_0(invert = false, fast = false)
		x = (rand(2) == 0 ? -rand(Graphics.width / 2) : Graphics.width + rand(Graphics.width / 2))
		y = (rand(2) == 0 ? -rand(Graphics.height / 2) : Graphics.height + rand(Graphics.height / 2))
		opacity = 1
		angle = 0
		zoom = (rand(100) + 50) / 100.0
		x_speed = [[rand(15), 5].max, 10].min
		x_speed *= -1 if invert
		x_speed *= 1.5 if fast
		y_speed = [[rand(15), 5].max, 10].min
		y_speed *= -1 if invert
		y_speed *= 1.2 if fast
		opacity_speed = [10, rand(15)].max
		opacity_speed = 20 if fast
		angle_speed = rand(3)
		angle_speed *= 2 if fast
		return x, y, opacity, angle, zoom, x_speed, y_speed, opacity_speed, angle_speed
	end
	
	def self.type_1(invert = false, fast = false)
		x = rand(Graphics.width)
		y = (rand(2) == 0 ? -rand(Graphics.height / 2) : Graphics.height + rand(Graphics.height / 2))
		opacity = 1
		angle = 0
		zoom = (rand(100) + 50) / 100.0
		x_speed = 0
		y_speed = [[rand(10) + 3, 5].max, 15].min + rand(10)
		y_speed *= -1 if invert
		y_speed *= 1.1 if fast
		opacity_speed = [10, rand(15)].max
		opacity_speed = 20 if fast
		angle_speed = 0
		return x, y, opacity, angle, zoom, x_speed, y_speed, opacity_speed, angle_speed
	end
	
	def self.type_2(invert = false, fast = false)
		x = (rand(2) == 0 ? -rand(Graphics.width / 2) : Graphics.width + rand(Graphics.width / 2))
		y = (rand(2) == 0 ? -rand(Graphics.height / 2) : Graphics.height + rand(Graphics.height / 2))
		opacity = 1
		angle = 0
		zoom = (rand(100) + 50) / 100.0
		x_speed = -[[rand(15), 5].max, 10].min
		x_speed *= -1 if invert
		x_speed *= 1.2 if fast
		y_speed = [[rand(15), 5].max, 10].min
		y_speed *= -1 if invert
		y_speed *= 1.2 if fast
		opacity_speed = [10, rand(15)].max
		angle_speed = rand(3)
		angle_speed *= 2 if fast
		return x, y, opacity, angle, zoom, x_speed, y_speed, opacity_speed, angle_speed
	end
	
	def self.type_3(invert = false, fast = false)
		x = (rand(2) == 0 ? -rand(Graphics.width / 2) : Graphics.width + rand(Graphics.width / 2))
		y = rand(Graphics.height)
		opacity = 1
		angle = rand(360)
		zoom = (rand(100) + 50) / 100.0
		x_speed = -[[rand(15), 5].max, 10].min
		x_speed *= -1 if invert
		x_speed *= 1.5 if fast
		y_speed = 0
		opacity_speed = [10, rand(15)].max
		angle_speed = rand(3)
		angle_speed *= 2 if fast
		return x, y, opacity, angle, zoom, x_speed, y_speed, opacity_speed, angle_speed
	end
	
	def self.random
		x = rand(Graphics.width)
		y = rand(Graphics.height)
		opacity = 1
		angle = rand(360)
		zoom = zoom = (rand(100) + 50) / 100.0
		x_speed = [[rand(7), 1].max, 10].min
		y_speed = [[rand(7), 1].max, 10].min
		x_speed *= -1 if rand(2) == 1
		y_speed *= -1 if rand(2) == 1
		opacity_speed = 10
		angle_speed = 0
		return x, y, opacity, angle, zoom, x_speed, y_speed, opacity_speed, angle_speed
	end
	
	def self.custom_type(custom)
		type = custom[0]
		invert = custom[1]
		fast = custom[2]
		settings = eval("type_#{type}(#{invert.to_s}, #{fast.to_s})")
		settings[-1] = rand(3) if custom[4]
		return settings
	end
	
end # class Game_Weather_Functions
$imported = {} if $imported.nil?
$imported["DenKyz_Game_Weather"] = true
class Game_Weather
	
	include Game_Weather_Settings
	
	attr_accessor :weather
	
	def initialize
		@viewport = Viewport.new
		@viewport.z = GAME_WEATHER_Z
		@weather = []
	end
	
	# Создаем новую погоду
	def start_weather(type, power, name, stop_all)
		stop_all_weather if stop_all
		stop_weather(0) if @weather.size == $GAME_WEATHER_LIMIT && !stop_all # останавливаем первую погоду, если лимит превышен
		@weather.push(Game_Weather_Weather.new(@viewport, type, power, name))
	end
	
	# Перезагружаем погоду
	def refresh
		return if @weather == []
		@weather.each do |index|
			index.refresh
		end
	end
	
	# Обновляем погоду
	def update
		return if @weather == []
		check_dispose
		@weather.each do |index|
			index.update
		end
	end
	
	# Удаляем спрайты погоды, но не убираем класс погоды
	def dispose_sprites
		return if @weather == []
		@weather.each do |index|
			index.dispose
		end
	end
	
	# Проверка на удаление погоды
	def check_dispose
		@weather.each do |index|
			return dispose_weather(index) if index.stop_state == 2
		end
	end
	
	# Остановка одной погоды
	def stop_weather(index)
		return if !index.is_a?(Integer) && index.nil?
		return if index.is_a?(Integer) && @weather[index].nil?
		if index.is_a?(Integer)
			@weather[index].stop
		else
			index.stop
		end
	end
	
	# Остановка всей погоды
	def stop_all_weather
		@weather.each do |index|
			stop_weather(index)
		end
	end
	
	# Пауза одной погоды
	def pause_weather(index)
		return if !index.is_a?(Integer) && index.nil?
		return if index.is_a?(Integer) && @weather[index].nil?
		if index.is_a?(Integer)
			@weather[index].pause
		else
			index.pause
		end
	end
	
	# Пауза всей погоды
	def pause_all_weather
		@weather.each do |index|
			pause_weather(index)
		end
	end
	
	# Продолжить одну погоду
	def continue_weather(index)
		return if !index.is_a?(Integer) && index.nil?
		return if index.is_a?(Integer) && @weather[index].nil?
		if index.is_a?(Integer)
			@weather[index].continue
		else
			index.continue
		end
	end
	
	# Продолжить всю погоду
	def continue_all_weather
		@weather.each do |index|
			continue_weather(index)
		end
	end
	
	# Проверка на существование погоды
	def weather_exist?(type, name)
		return false if @weather == []
		@weather.each do |index|
			return true if index.type == type && index.name == name
		end
		return false
	end
	
	# Удалить одну погоду
	def dispose_weather(index)
		return if index.nil?
		index = @weather.index(index)
		@weather[index].dispose
		@weather[index] = nil
		@weather.compact!
	end
	
	# Сохраняем погоду
	def make_save_contents
		content = []
		return content if @weather == []
		@weather.each do |index|
			content.push([index.type, index.power, index.name])
		end
		return content
	end
	
	# Загружаем погоду
	def extract_save_contents(content)
		stop_all_weather
		content.each do |index|
			start_weather(index[0], index[1], index[2], false)
		end
	end
	
end # class Game_Weather
class Game_Weather_Weather
	
	attr_accessor :type
	attr_reader :power
	attr_reader :name
	attr_reader :stop_state
	
	def initialize(viewport, type, power, name)
		@viewport = viewport
		@type = type
		@power = power
		@sprite_power = @power
		@sprite_power = 1 if @power < 1
		@sprite_power = [[@sprite_power * $GAME_WEATHER_POWER + rand(25), @sprite_power].max, 999].min
		@name = name
		@stop_state = 0 # 0 - ничего, 1 - затухание, 2 - можно удалить
		@sprites = []
		setup_weather
	end
	
	def setup_weather
		@sprite_power.times do
			@sprites.push(Game_Weather_Sprite.new(@viewport, @type, @name))
		end
	end
	
	def type=(type)
		@type = type
		@sprites.each do |index|
			index.type = @type
		end
	end
	
	def stop
		@stop_state = 1
		@sprites.each do |index|
			index.stop
		end
	end
	
	def pause
		stop
		@stop_state = 0
	end
	
	def continue
		@sprites.each do |index|
			index.continue
		end
	end
	
	# Проверка на удаление погоды (90% спрайтов имеют 0 прозрачность)
	def check_stop_state
		amount = 0
		@sprites.each do |index|
			amount += 1 if index.sprite.opacity == 0
		end
		@stop_state = 2 if amount >= @sprite_power * 0.9
	end
	
	def refresh
		@sprites.each do |index|
			index.refresh
		end
	end
	
	def update
		check_stop_state if @stop_state == 1
		return if @stop_state == 2
		@sprites.each do |index|
			index.update
		end
	end
	
	def dispose
		@sprites.each do |index|
			index.dispose
		end
	end
	
end # class Game_Weather_Weather
class Game_Weather_Sprite
	
	attr_reader :sprite
	
	def initialize(viewport, type, name)
		@viewport = viewport
		@type = type
		@name = name
		setup_sprite
		setup_position
		setup_variables
		save_sprite_position
	end
	
	def setup_sprite
		@sprite = Sprite.new(@viewport)
		@sprite.bitmap = Cache.weather(@name)
	end
	
	def setup_position
		@sprite_settings = Game_Weather_Functions.weather_type_settings(@type)
		@sprite.x = @sprite_settings[0]
		@sprite.y = @sprite_settings[1]
		@sprite.opacity = @sprite_settings[2]
		@sprite.angle = @sprite_settings[3]
		@sprite.zoom_x = @sprite_settings[4]
		@sprite.zoom_y = @sprite_settings[4]
	end
	
	def setup_variables
		@x_speed = @sprite_settings[5]
		@y_speed = @sprite_settings[6]
		@opacity_speed = @sprite_settings[7]
		@angle_speed = @sprite_settings[8]
	end
	
	def type=(type)
		@type = type
		@sprite_settings = Game_Weather_Functions.weather_type_settings(@type)
		setup_variables
	end
	
	def stop
		@opacity_speed = -10
	end
	
	def continue
		setup_position
		setup_variables
	end
	
	# Проверка позиции спрайта
	def check_position
		setup_position if @sprite.x > Graphics.width * 1.5 || @sprite.x < - Graphics.width / 2 || @sprite.y > Graphics.height * 1.5 || @sprite.y < - Graphics.height / 2
	end
	
	def refresh
		setup_sprite
		@sprite.x = @x_save
		@sprite.y = @y_save
		@sprite.opacity = @opacity_save
		@sprite.angle = @angle_save
		@sprite.zoom_x = @zoom_save
		@sprite.zoom_y = @zoom_save
	end
	
	def update
		@sprite.x += @x_speed
		@sprite.y += @y_speed
		@sprite.opacity += @opacity_speed
		@sprite.angle += @angle_speed
		check_position
	end
	
	def save_sprite_position
		@x_save = @sprite.x
		@y_save = @sprite.y
		@opacity_save = @sprite.opacity
		@angle_save = @sprite.angle
		@zoom_save = @sprite.zoom_x
	end
	
	def dispose
		return if @sprite.nil?
		save_sprite_position
		@sprite.dispose
		@sprite = nil
	end
	
end # class Game_Weather_Sprite
class Game_Interpreter
	
	def start_weather(type, power, name, stop_all = false)
		return if $Game_Weather.nil?
		$Game_Weather.start_weather(type, power, name, stop_all)
	end
	
	def stop_weather(index = 0)
		return if $Game_Weather.nil?
		$Game_Weather.stop_weather(index)
	end
	
	def stop_all_weather
		return if $Game_Weather.nil?
		$Game_Weather.stop_all_weather
	end
	
	def pause_weather(index = 0)
		return if $Game_Weather.nil?
		$Game_Weather.pause_weather(index)
	end
	
	def pause_all_weather
		return if $Game_Weather.nil?
		$Game_Weather.pause_all_weather
	end
	
	def continue_weather(index = 0)
		return if $Game_Weather.nil?
		$Game_Weather.continue_weather(index)
	end
	
	def continue_all_weather
		return if $Game_Weather.nil?
		$Game_Weather.continue_all_weather
	end
	
	def weather_exist?(type, name)
		return false if $Game_Weather.nil?
		$Game_Weather.weather_exist?(type, name)
	end
	
	def weather_amount
		return -1 if $Game_Weather.nil?
		return $Game_Weather.weather.size
	end
	
	def toggle_weather_in_battle
		$GAME_WEATHER_IN_BATTLE = !$GAME_WEATHER_IN_BATTLE
	end
	
	def setup_weather_in_battle(setup)
		$GAME_WEATHER_IN_BATTLE = setup
	end
	
end # class Game_Interpreter
class Spriteset_Map
	
	alias denis_kyznetsov_game_weather_spriteset_map_initialize initialize
	def initialize
		$Game_Weather.refresh if !$Game_Weather.nil?
		denis_kyznetsov_game_weather_spriteset_map_initialize	
	end
	
	alias denis_kyznetsov_game_weather_spriteset_map_dispose dispose
	def dispose
		$Game_Weather.dispose_sprites if !$Game_Weather.nil?
		denis_kyznetsov_game_weather_spriteset_map_dispose
	end
	
	alias denis_kyznetsov_game_weather_spriteset_map_update update
	def update
		$Game_Weather.update if !$Game_Weather.nil?
		denis_kyznetsov_game_weather_spriteset_map_update
	end
	
end # class Spriteset_Map
class Spriteset_Battle
	
	alias denis_kyznetsov_game_weather_spriteset_battle_initialize initialize
	def initialize
		$Game_Weather.refresh if !$Game_Weather.nil? && $GAME_WEATHER_IN_BATTLE
		denis_kyznetsov_game_weather_spriteset_battle_initialize
		
	end
	
	alias denis_kyznetsov_game_weather_spriteset_battle_dispose dispose
	def dispose
		$Game_Weather.dispose_sprites if !$Game_Weather.nil? && $GAME_WEATHER_IN_BATTLE
		denis_kyznetsov_game_weather_spriteset_battle_dispose
	end
	
	alias denis_kyznetsov_game_weather_spriteset_battle_update update
	def update
		$Game_Weather.update if !$Game_Weather.nil? && $GAME_WEATHER_IN_BATTLE
		denis_kyznetsov_game_weather_spriteset_battle_update
	end
	
end # class Spriteset_Battle
module DataManager
	
	class << self
		alias denis_kyznetsov_game_weather_data_manager_create_game_objects create_game_objects
		alias denis_kyznetsov_game_weather_data_manager_make_save_contents make_save_contents
		alias denis_kyznetsov_game_weather_data_manager_extract_save_contents extract_save_contents
	end
	
	def self.create_game_objects
		denis_kyznetsov_game_weather_data_manager_create_game_objects
		$Game_Weather = Game_Weather.new
	end
	
	def self.make_save_contents
		contents = denis_kyznetsov_game_weather_data_manager_make_save_contents
		contents[:Game_Weather_Content] = $Game_Weather.make_save_contents
		contents[:GAME_WEATHER_LIMIT] = $GAME_WEATHER_LIMIT
		contents[:GAME_WEATHER_POWER] = $GAME_WEATHER_POWER
		contents[:GAME_WEATHER_IN_BATTLE] = $GAME_WEATHER_IN_BATTLE
		contents
	end
	
	def self.extract_save_contents(contents)
		denis_kyznetsov_game_weather_data_manager_extract_save_contents(contents)
		$Game_Weather.extract_save_contents(contents[:Game_Weather_Content])
		$GAME_WEATHER_LIMIT = contents[:GAME_WEATHER_LIMIT]
		$GAME_WEATHER_POWER = contents[:GAME_WEATHER_POWER]
		$GAME_WEATHER_IN_BATTLE = contents[:GAME_WEATHER_IN_BATTLE]
	end
	
end # module DataManager
 
Социальные закладки