Код:
	=begin
-- Зрение противника
-- Автор: ну наверное Paranoid. Хотя по сути это просто куча копипаста
-- Версия: 1.0
-- Лицензия: Свободная для коммерческих и некоммерческих проектов. Только в титрах укажите ник.
 
Этот скрипт позволяет ивентам видеть игрока по прямой. Даже если вы используете
пиксельное движение. Его можно настроить в блоке "Смотрит" заменив число 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" это имя зрячего ивента
  SSW_IF_SEE  = 'A'   # Свитч, который сработает в случае если героя увидят
  SW_IN_BOX = 3       # Свитч, который позволяет вам быть невидимым,
                      # если вы не двигаетесь
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-0.75, self.x+0.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-0.75, self.y+0.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-0.75, self.y+0.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-0.75, self.x+0.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
		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
    sx = $game_map.modw($game_player.x)*stx
    sy = $game_map.modh($game_player.y)*sty
    if (sx..sx+stx).include? event.x
      if (sy..sy+sty).include? event.y
        return true
      end
    end
    false
  end
end
 
Социальные закладки