Advertisement
deadelf79

parapara

Jun 15th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 5.58 KB | None | 0 0
  1. =begin
  2. -- Зрение противника
  3. -- Автор: ну наверное Paranoid. Хотя по сути это просто куча копипаста
  4. -- Версия: 1.0
  5. -- Лицензия: Свободная для коммерческих и некоммерческих проектов. Только в титрах укажите ник.
  6.  
  7. Этот скрипт позволяет ивентам видеть игрока по прямой. Даже если вы используете
  8. пиксельное движение. Его можно настроить в блоке "Смотрит" заменив число 0.75
  9. на нужное вам или вообще убрав его. Числа 12 и 16 позволяют ивенту смотреть
  10. на расстояние всего экрана 12 клеток по Y и 16 по X. Если хотите уменьшить поле
  11. зрения до определеной длинны, то просто измените эти числа.
  12.  
  13. Ивент так же не может видеть игрока, если он за непроходимыми тайлами.
  14.  
  15. Так же игрок может прятаться в коробку аля Солид Снейк. За это отвечает свитч
  16. SW_IN_BOX, у меня он 3, можете поменять. Как работает: если вы в коробке (свитч)
  17. включен, то ивент не будет обращать на вас внимание, пока вы не двигаетесь.
  18.  
  19. Чтобы просто проверить видимость используйте event_see?(event_id), дает true
  20. если игрока видно.
  21.  
  22. P.S.: скрипт полукопипаста зрения от DeadElf79 с изменением принципа зрения
  23. =end
  24. ###########################################################################
  25. ################################# Настройки ###############################
  26. ###########################################################################
  27. module EnemyEvent
  28.   EVENT_NAME = /see/i # Здесь "see" это имя зрячего ивента
  29.   SSW_IF_SEE  = 'A'   # Свитч, который сработает в случае если героя увидят
  30.   SW_IN_BOX = 3       # Свитч, который позволяет вам быть невидимым,
  31.                       # если вы не двигаетесь
  32. end
  33. ###########################################################################
  34. ############################# Конец настроек ##############################
  35. ###########################################################################
  36.  
  37. def event_see?(event_id)
  38. $game_map.events[event_id].can_see?($game_player.x,$game_player.y)
  39. end
  40.  
  41. class Game_Event
  42.     def enemy?
  43.         self.name =~ EnemyEvent::EVENT_NAME
  44.     end
  45.  
  46.   def set_seen
  47.     @seen_once = true
  48.   end
  49.  
  50.   def seen_once?
  51.     @seen_once
  52.   end
  53.  
  54.   def can_see?(px,py)
  55.    # Смотрит
  56.    case @direction
  57.     when 8
  58.      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)
  59.      return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
  60.      end
  61.     when 4
  62.       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
  63.       return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
  64.       end
  65.     when 6
  66.       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
  67.       return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
  68.       end
  69.     when 2
  70.       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
  71.       return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
  72.       end
  73.     end
  74.     false
  75.    end
  76. end
  77.   class Game_Map
  78.   attr_accessor :enemies
  79.  
  80.   alias enemy_event_setup setup
  81.   def setup(map_id)
  82.     enemy_event_setup(map_id)
  83.     setup_enemies
  84.   end
  85.  
  86.   def setup_enemies
  87.     @enemies = []
  88.     @events.each_value do |event|
  89.       @enemies.push event if event.enemy?
  90.     end
  91.   end
  92. end
  93.  
  94. class Scene_Map < Scene_Base
  95.   alias enemy_event_update update
  96.   def update
  97.     enemy_event_update
  98.     update_enemies
  99.   end
  100.  
  101.   def update_enemies
  102.     $game_map.enemies.each do |enemy|
  103.         next unless enemy_on_screen?(enemy)
  104.         x, y = $game_player.x, $game_player.y
  105.         see_now = false
  106.         if enemy.can_see?(x,y)
  107.             if $game_switches[ EnemyEvent::SW_IN_BOX ]
  108.                 # player is in box
  109.                 if $game_player.moving?
  110.                     see_now = true
  111.                 end
  112.             else
  113.                 # player is not in box
  114.                 see_now = true
  115.             end
  116.         end
  117.         if see_now
  118.             $game_map.events[enemy.id].balloon_id = 1
  119.         end
  120.     # Видел ли хотя бы раз?
  121.     if see_now
  122.       enemy.set_seen
  123.     else
  124.       if enemy.seen_once?
  125.         see_now = true
  126.       end
  127.     end
  128.  
  129.         # Реакция на игрока
  130.         key = [$game_map.map_id, enemy.id, EnemyEvent::SSW_IF_SEE]
  131.         $game_self_switches[key] = see_now
  132.         enemy.refresh
  133.     end
  134.   end
  135.  
  136.   def enemy_on_screen?(event)
  137.     stx = $game_map.screen_tile_x
  138.     sty = $game_map.screen_tile_y
  139.     sx = $game_map.modw($game_player.x)*stx
  140.     sy = $game_map.modh($game_player.y)*sty
  141.     if (sx..sx+stx).include? event.x
  142.       if (sy..sy+sty).include? event.y
  143.         return true
  144.       end
  145.     end
  146.     false
  147.   end
  148. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement