Потребовалось мне на одном из этапов игры перемещать эвенты случайным образом. Да не просто перемещать захотелось, а прыжками, для пущей эффектности.
Сделать это эвентами, как я подозреваю, невозможно в принципе - нельзя прыгнуть в случайную точку. Посему - прошу любить и жаловаться
Что умеет скрипт:
- Как уже было сказано - заставлять эвенты на карте с определённой периодичностью прыгать с клетки на клетку. При этом не попадать ни друг на друга, ни на героя.
- При этом не все сразу, а только эвенты из произвольно заданного списка.
- И более того - с периодичностью в N кадров, где N также произвольно.
Запуск скрипта:
Event_Shuffle.start([список-эвентов],период,[список-тэгов])
Где:
- список-эвентов - перечень номеров эвентов, которые должны прыгать
- период - интервал между прыжками в кадрах (60 кадров = 1 секунда)
- список-тэгов - необязательный параметр, задаёт список тэгов, на которых может "приземлиться" эвент. Внимание! Если места с такими тэгами мало или передан пустой список (короче, если для очередного эвента не хватит места) - скрипт зависнет!
Остановка, соответственно:
На нециклической карте эвенты начинают жаться к стенкам и по углам (в ходе теста в один угол забились аж четыре призрака - поручик, молчать!
) - чуть позже это исправлю (уже знаю, как). На циклической всё работает как положено.
Собственно скрипт:
=begin
Скрипт, который случайным образом перебрасывает эвенты по карте
Автор: Cerberus
=end
module Event_Shuffle
@events = nil
@shuffling = false
@x = @y = nil
@x_to = @y_to = nil
@freq = nil
@turns = nil
@tags = []
def self.start(events, frequency, tags=nil)
stop if @shuffling
@shuffling = true
@freq = frequency
@turns = 1
@events = events
@tags = Array.new(64) {|i| i }
@tags = tags unless tags==nil
end
def self.turn
return unless @shuffling
@turns -= 1
return unless @turns==0
@turns = @freq
@events.each do |i|
next if $game_map.events[i].nil?
@correct = false
until @correct do
@correct = true
if $game_map.loop_horizontal?
@x = rand($game_map.width) - $game_map.width / 2
else
@x = rand(2 * [$game_map.events[i].x, $game_map.width - $game_map.events[i].x].min) - [$game_map.events[i].x, $game_map.width - $game_map.events[i].x].min
end
if $game_map.loop_vertical?
@y = rand($game_map.height) - $game_map.height / 2
else
@y = rand(2 * [$game_map.events[i].y, $game_map.height - $game_map.events[i].y].min) - [$game_map.events[i].y, $game_map.height - $game_map.events[i].y].min
end
@x_to = $game_map.events[i].x + @x
@y_to = $game_map.events[i].y + @y
@correct = false unless @tags.include?($game_map.terrain_tag(@x_to, @y_to))
for j in (1..$game_map.events.size) do
next if $game_map.events[j].nil?
correct = false if ($game_map.events[j].x == @x_to && $game_map.events[j].y == @y_to)
end
correct = false if ($game_player.x == @x_to && $game_player.y == @y_to)
end
$game_map.events[i].jump(@x, @y)
end
end
def self.stop
@events = nil
@shuffling = false
@x = @y = nil
@x_to = @y_to = nil
@freq = nil
@turns = nil
@tags = []
end
end
class Scene_Base
alias event_shuffle_update update
def update
Event_Shuffle.turn
event_shuffle_update
end
end
class Scene_Map < Scene_Base
alias event_shuffle_pre_transfer pre_transfer
def pre_transfer
Event_Shuffle.stop
event_shuffle_pre_transfer
end
end