Код:
=begin
-- Зрение противника
-- Автор: ну наверное Paranoid. Хотя по сути это просто куча копипаста
-- Доделано: Железный Ворон (персонаж нейросети GIGA CHAT) и чуть-чуть руками
Sleeping Visitor (обновлено до версии 1.1)
-- Версия: 1.1
-- Лицензия: Свободная для коммерческих и некоммерческих проектов.
Только в титрах укажите автора скрипта - Paranoid.
Этот скрипт позволяет ивентам видеть игрока по прямой. Даже если вы используете
пиксельное движение. Его можно настроить в блоке "Смотрит" заменив число
0.75 или 4.75 на любое другое (0.75 было установлено изначально для обычных
тайлов).
на нужное вам или вообще убрав его. Числа 12 и 16 позволяют ивенту смотреть
на расстояние всего экрана 12 клеток по Y и 16 по X. Если хотите уменьшить поле
зрения до определенной длины, то просто измените эти числа.
Ивент так же не может видеть игрока, если он за непроходимыми тайлами.
Так же игрок может прятаться в коробку аля Солид Снейк. За это отвечает свитч
SW_IN_BOX, у меня он 3, можете поменять. Как работает: если вы в коробке (свитч)
включен, то ивент не будет обращать на вас внимание, пока вы не двигаетесь.
Чтобы просто проверить видимость используйте event_see?(event_id), дает true
если игрока видно.
P.S.: скрипт полукопипаста зрения от DeadElf79 с изменением принципа зрения
=end
###########################################################################
################################# Настройки ###############################
###########################################################################
module EnemyEvent
EVENT_NAME = /see/i # Здесь "see" это имя зрячего ивента (/see/имя ивента).
SSW_IF_SEE = 'C' # Свитч, который сработает в случае если героя увидят.
SW_IN_BOX = 3 # Свитч, который позволяет вам быть невидимым
# если вы не двигаетесь.
EVENT_MEMORY_T = 1800 # Сколько кадров враг будет помнить, что видел игрока.
end
###########################################################################
############################# Конец настроек ##############################
###########################################################################
def event_see?(event_id)
$game_map.events[event_id].can_see?($game_player.x,$game_player.y)
end
class Game_Event
def enemy?
self.name =~ EnemyEvent::EVENT_NAME
end
def can_see?(px,py)
# Смотрит
case @direction
when 8
return true if py.between?(self.y-12, self.y) && px.between?(self.x-4.75, self.x+4.75) and for fy in (py.to_i..self.y)
return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
end
when 4
return true if px.between?(self.x-16, self.x) && py.between?(self.y-4.75, self.y+4.75) and for fx in px.to_i..self.x
return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
end
when 6
return true if px.between?(self.x, self.x+16) && py.between?(self.y-4.75, self.y+4.75) and for fx in self.x.to_i..px
return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
end
when 2
return true if py.between?(self.y, self.y+12) && px.between?(self.x-4.75, self.x+4.75) and for fy in self.y.to_i..py
return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
end
end
false
end
end
class Game_Map
attr_accessor :enemies
alias enemy_event_setup setup
def setup(map_id)
enemy_event_setup(map_id)
setup_enemies
end
def setup_enemies
@enemies = []
@events.each_value do |event|
@enemies.push event if event.enemy?
end
end
end
class Scene_Map < Scene_Base
alias enemy_event_update update
def update
enemy_event_update
update_enemies
end
def update_enemies
$game_map.enemies.each do |enemy|
next unless enemy_on_screen?(enemy)
x, y = $game_player.x, $game_player.y
# вот бы сделать, чтобы ивент отключался не сразу, но я не умею :D
see_now = false
if enemy.can_see?(x,y)
if $game_switches[ EnemyEvent::SW_IN_BOX ]
# player is in box
if $game_player.moving?
see_now = true
end
else
# player is not in box
see_now = true
end
end
if see_now
$game_map.events[enemy.id].balloon_id = 1 # это баллон, можно убрать
end
# Реакция на игрока
key = [$game_map.map_id, enemy.id, EnemyEvent::SSW_IF_SEE]
$game_self_switches[key] = see_now
enemy.refresh
end
end
def enemy_on_screen?(event)
stx = $game_map.screen_tile_x
sty = $game_map.screen_tile_y
# Ширина и высота экрана в клетках
width_in_tiles = stx
height_in_tiles = sty
# Границы поля зрения
left_bound = $game_player.x - width_in_tiles / 2
top_bound = $game_player.y - height_in_tiles / 2
right_bound = left_bound + width_in_tiles
bottom_bound = top_bound + height_in_tiles
# Проверка попадания ивента в поле зрения
if event.x.between?(left_bound, right_bound) && event.y.between?(top_bound, bottom_bound)
return true
end
false
end
end
Социальные закладки