-
caveman
-
-
Вне сайта
-
Архитектор Миров
-
- Сообщений: 1274
- Спасибо получено: 1307
-
-
|
Для некоторых событий с нестандартной попертой графикой понадобилась более тонкая настройка проходимостей.
К тому же, мне надоело у выступающих частей, типа бутылок на столе, настраивать проходимость сверху в тайлсете.
Поэтому я решил написать небольшой скрипт, похожий на скрипт для Big Events (думаю, что позже я их солью в экстазе), с помощью которого можно настроить в комментах события его проходимость на 4 стороны.
Как оно работает, описано в комментарии к скрипту, ну и для верности можно глянуть приложенную демку.
#===============================================================================
=begin
Event Passability
Скрипт позволяет настроить проходимость в 4 стороны для любых событий
Автор: caveman
История версий:
1.01 - Реализация
Пример использования:
в событии пишем комментарий вида
[pass|0|1|1|0]
[0]
[0] E [1]
[1]
это проставляет проходимость (стрелки) по часовой стрелке, начиная с Up
1 - проходимо, 0 - нет
=end
class Game_Character
attr_accessor :p_up
attr_accessor :p_right
attr_accessor :p_down
attr_accessor :p_left
attr_accessor :pass
alias ev_pass_initialize initialize
def initialize
@p_up=0
@p_right=0
@p_down=0
@p_left=0
@pass=false # это для определения, pass ставили или нет
ev_pass_initialize
end
# считать из комментов
def setup_pass(dispose)
unless dispose && @list.nil?
for command in @list
if command.code == 108 && command.parameters[0].include?("[pass")
command.parameters[0].gsub(/\[[Pp][Aa][Ss][Ss]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
@p_up = $1.to_s.to_i
@p_right = $2.to_s.to_i
@p_down = $3.to_s.to_i
@p_left = $4.to_s.to_i
@pass = true
end
end
end
end
end
# проставить скриптом, вручную
def set_passes(p_up, p_right, p_down, p_left)
@p_up=p_up
@p_right=p_right
@p_down=p_down
@p_left=p_left
@pass=true
return
end
# на будущее для совместимости с Big Events
def event_touch(x, y)
if x == @x && y == @y
return true
end
return false
end
# тут для того, чтобы проверить события без tile_id
def passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if @through
return true
end
unless $game_map.passable?(x, y, d, self)
return false
end
unless $game_map.passable?(new_x, new_y, 10 - d)
return false
end
for event in $game_map.events.values
if event.x == new_x and event.y == new_y
unless event.through
if !event.pass # старый вариант
if self != $game_player
return false
end
if event.character_name != ""
return false
end
else # новый
if d==6 && event.p_left==0
return false
end
if d==4 && event.p_right==0
return false
end
if d==2 && event.p_up==0
return false
end
if d==8 && event.p_down==0
return false
end
end
end
end
# это условие для того, чтобы не проскочить сквозь
if event.x == x and event.y == y
unless event.through
if event.pass # новый
if d==6 && event.p_right==0
return false
end
if d==4 && event.p_left==0
return false
end
if d==2 && event.p_down==0
return false
end
if d==8 && event.p_up==0
return false
end
end
end
end
end
if $game_player.x == new_x and $game_player.y == new_y
unless $game_player.through
if @character_name != ""
return false
end
end
end
return true
end
end
class Game_Map
# тут для того, чтобы проверить события c tile_id
# считаем, что, если есть коммент pass, то он главнее чем проходимость
# тайла в тайлсете
def passable?(x, y, d, self_event = nil)
unless valid?(x, y)
return false
end
bit = (1 << (d / 2 - 1)) & 0x0f
for event in events.values
if event.tile_id >= 0 and event != self_event and
event.x == x and event.y == y and not event.through
if !event.pass
if @passages[event.tile_id] & bit != 0
return false
elsif @passages[event.tile_id] & 0x0f == 0x0f
return false
elsif @priorities[event.tile_id] == 0
return true
end
else
if d==6 && event.p_right==0
return false
end
if d==4 && event.p_left==0
return false
end
if d==2 && event.p_down==0
return false
end
if d==8 && event.p_up==0
return false
end
end
end
end
for i in [2, 1, 0]
tile_id = data[x, y, i]
if tile_id == nil
return false
elsif @passages[tile_id] & bit != 0
return false
elsif @passages[tile_id] & 0x0f == 0x0f
return false
elsif @priorities[tile_id] == 0
return true
end
end
return true
end
def set_passes(ev_id, p_up, p_right, p_down, p_left)
events[ev_id].set_passes(p_up, p_right, p_down, p_left)
return
end
end
class Game_Event
# для расчета при переключении страницы события
# там вполне может быть другая проходимость или вообще не быть
alias ev_pass_refresh refresh
def refresh
ev_pass_refresh
@pass = false
setup_pass(@page.nil?)
end
end
class Game_Player
def check_event_trigger_here(triggers)
result = false
if $game_system.map_interpreter.running?
return result
end
for event in $game_map.events.values
if event.event_touch(@x, @y) and triggers.include?(event.trigger)
if not event.jumping?
# для того, чтобы работало с той же клетки
if event.pass or event.over_trigger?
event.start
result = true
end
end
end
end
return result
end
# этот не трогаем, пусть и с соседней клетки работает
def check_event_trigger_there(triggers)
result = false
if $game_system.map_interpreter.running?
return result
end
new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
for event in $game_map.events.values
if event.event_touch(new_x, new_y) and
triggers.include?(event.trigger)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
if result == false
if $game_map.counter?(new_x, new_y)
new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
for event in $game_map.events.values
if event.event_touch(new_x, new_y) and
triggers.include?(event.trigger)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
end
end
return result
end
def check_event_trigger_touch(x, y)
result = false
if $game_system.map_interpreter.running?
return result
end
for event in $game_map.events.values
if event.event_touch(x, y) and [1,2].include?(event.trigger)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
return result
end
end
Тестовое демо: yadi.sk/d/QfOLBaX47MV6A
|