Показано с 1 по 10 из 17

Тема: Зрение ивента по прямой

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #17

    По умолчанию Обновление скрипта до версии 1.2 (нуждается в более глубоком тестировании)

    Спойлер Версия 1.2 - Event See:

    Код:
    =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


    Доделал этот скрипт для себя, добавив частично то, что хотел, но добавил как смог ибо мои познания в скриптинге низки.
    Тестировал скрипт в своём проекте, пока багов не было обнаружено, но указываю на то, что нужно провести более глубокое тестирование скрипта.
    Если вдруг обнаружили ошибку или баг - напишите мне в этой же теме, если мне будет по силам и будет время и желание, я постараюсь исправить.
    Надеюсь этот обновлённый скрипт вам сослужит хорошую службу. Проектов без багов вам, товарищи!

    P.S. Я закомментил "баллон", уберите # в строке с ним, если вдруг он вам нужен, чтобы он заработал. Мне он мешал.
    Последний раз редактировалось Sleeping Visitor; 20.09.2025 в 11:38.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Зрение ивента по прямой