Код:
=begin
-- Зрение противника
-- Автор: ну наверное Paranoid. Хотя по сути это просто куча копипаста
-- Доделано: Железный Ворон (персонаж нейросети GIGA CHAT) и чуть-чуть руками
Sleeping Visitor (обновлено до версии 1.1 и 1.2)
-- Версия: 1.2 (нуждается в более глубоком тестировании)
- Теперь мы можем поднять тревогу, будучи замеченными, и все ивенты
имеющие "see" и находящиеся в поле зрения игрока (если вы не
включали активность ивентов за пределами поля зрения игрока в
стандартных скриптах) будут "активированы" и начнут суетиться :)
в попытке подойти к игроку (или что вы там им настроили).
- Ивенты могут помнить о том, что увидели игрока.
Некоторое время они продолжают попытки подойти к нему, даже если
игрок пропал из поля зрения. Пока они ищут игрока, лучше убраться
от них подальше, потому что попытки спрятаться от них вблизи -
не помогут. (Но вы можете на ивентах намеренно устанавливать
таймер памяти ивентов на максимум, таким образом в каких-то
уникальных местах игрок сможет всё-таки спрятаться от врагов, т.к.
технически они сразу будут о нём забывать.)
-- Лицензия: Свободная для коммерческих и некоммерческих проектов.
Только в титрах укажите автора скрипта - Paranoid.
Примечание: Основная работа проделана Paranoid, но если пожелаете, можете
указать и меня (Sleeping Visitor) в титрах, а так-же персонажа
нейросети GIGA CHAT - Железный Ворон, как написавших аддон.
Но это не обязательно.
Обновление до версии 1.2 было написано уже без нейросети,
однако её вклад был неоценим в версии 1.1, т.к. именно она
починила скрипт и сделала его вновь рабочим.
В скрипте я старался не трогать описания от автора, потому
манера подачи информации в описании может отличаться,
не судите строго. Всем удачи в использовании, если что непонятно,
то спрашивайте на форуме "Нейтральной Полосы" в теме с этим
скриптом. :)
Этот скрипт позволяет ивентам видеть игрока по прямой. Даже если вы используете
пиксельное движение. Его можно настроить в блоке "Смотрит" заменив число
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 = 18 # Игр. переключатель, который позволяет вам быть
# невидимым если вы не двигаетесь.
EVENT_MEM_T = 12 # Игр. переменная таймера ивентов про то, что увидели
# игрока. (Пока поднята тревога, прибавляет +1 к ней.)
SEE_MEMORY = 11 # Игр. переменная - память ивентов. Когда таймер достигнет
# значения из этой переменной, ивенты забудут об игроке.
EVENT_ALARM = 19 # Игр. переключатель поднятия тревоги, когда игрока
# заметили. (Все враги в пределах зоны видимости об этом
# узнают!)
end
# $game_switches[n] - игровой переключатель, памятка
# $game_variables[var] - игровая переменная, памятка
###########################################################################
############################# Конец настроек ##############################
###########################################################################
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)
# Смотрит (здесь можно поменять значение 4.75 на любое другое в каждой строке)
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
if $game_switches[ EnemyEvent::EVENT_ALARM ]
# проверка памяти ивента, после того как он заметил игрока
if $game_variables[ EnemyEvent::EVENT_MEM_T ] >= $game_variables[ EnemyEvent::SEE_MEMORY]
#see_now = false
$game_variables[ EnemyEvent::EVENT_MEM_T ] = 0
$game_switches[ EnemyEvent::EVENT_ALARM ] = false
else
see_now = true
$game_switches[ EnemyEvent::EVENT_ALARM ] = true
$game_variables[ EnemyEvent::EVENT_MEM_T ] += 1
end
else
see_now = false
end
if enemy.can_see?(x,y)
if $game_switches[ EnemyEvent::SW_IN_BOX ]
# player is in box
if $game_player.moving?
see_now = true
$game_switches[ EnemyEvent::SW_IN_BOX ] = false
$game_switches[ EnemyEvent::EVENT_ALARM ] = true
$game_variables[ EnemyEvent::EVENT_MEM_T ] += 1
end
else
# player is not in box
see_now = true
$game_switches[ EnemyEvent::SW_IN_BOX ] = false
$game_switches[ EnemyEvent::EVENT_ALARM ] = true
$game_variables[ EnemyEvent::EVENT_MEM_T ] += 1
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
Социальные закладки