fallout.ru

Битва

Начало и конец схватки

StartCombat, "ID NPC"
StopCombat

"ID_NPC1" -> StartCombat, "ID_NPC2"
"ID_NPC1" -> StopCombat

Функции заставляют NPC начать битву или сложить оружие соответственно. StartCombat заставит NPC атаковать объект, ID которого передаётся параметром. В то время как StopCombat может быть использована без одноразовых условий, первая функция без них обойтись не может – NPC просто застынет и не будет реагировать даже на атаки, что нежелательно, если Вы, конечно, не хотите создать полнейшего пацифиста.

Как только начинается битва, движок проверяет установки искусственного интеллекта для NPC. Если параметр Flee высок, а Fight низок, то персонаж просто убежит от схватки. Поэтому Вам часто придётся изменять эти параметры вручную:

If (GetDeadCount, "My Friend" > 0 )
            StartCombat, Player
            SetFight, 100
endif

Определение атаки

OnPCHitMe (местная переменная типа short)

Short OnPCHitMe
If (OnPCHitMe == 1)

Это местная переменная, а не функция, поэтому Вам придётся объявлять её в начале Вашего скрипта. Она принимает значение 1, когда игрок атакует NPC. Недостатком является необходимость вручную сбрасывать значение обратно на 0. К тому же, подобный способ немного ограничивает возможности NPC – он сам не сможет атаковать, поэтому Вам самим придётся вызывать функцию StartCombat (смотрите пример ниже). Как только персонаж начинает отвечать на атаку игрока, переменная больше не принимает никаких значений. Однако, существует информация, что если после этого какой-либо другой NPC ударит первого, то переменная вновь сбросится на 0 и будет готова принять значение 1 при следующей атаке игрока.

Пример:

Begin _HB_Adros_GuarDefend

float timer
short attackstate
short OnPCHitMe

if ( OnPCHitMe == 1 )
            set attackstate to 1
            set OnPCHitMe to 0
endif

if (attackstate == 1)
            StartCombat, player
            set timer to ( timer + GetSecondsPassed)
            if ( timer >= 1 )
                        set timer to 0
                        if ( GetLOS, HB_adros_darani == 1)
                                    HB_adros_darani -> StartCombat, Player
                                    set attackstate to 0
                        endif
            endif
endif

End

GetAttacked (возвращает Boolean/short)

Возвращает 0, если NPC никогда не был атакован, и 1, если он был атакован когда-либо до этого.

Пример скрипта: Юупс защищает Йагрума Багарна.

Begin uupse_Bagrum

short doOnce

if ( doOnce == 0 )
            if ( "yagrum bagarn"->GetAttacked == 1 )
                        StartCombat player
                        SetFight 90
                        SetDisposition 0
                        set doOnce to 1
            endif
endif

end uupse_Bagrum

GetTarget, "ID NPC" (возвращает Boolean/short)

If ( GetTarget, Player == 1 )

Возвращает 1, если боевой целью персонажа является “ID NPC”. Можно использовать, чтобы определить, находиться ли NPC в битве с каким-то определённым персонажем.

Пример скрипта: прекрасный пример того, как NPC отказывается биться против своих братьев по оружию. Он состоит в Великом Доме Редоран, а потому не будет помогать игроку в схватке с редоранской стражей.

[…]

if ( GetCurrentAiPackage == 3 )
;если NPC следует за игроком, установить followNow и продолжать...
            set followNow to 1
            SetHello 0
            if ( GetTarget "ordinator wander_hp" == 1 )
                        StopCombat
            endif
            if ( GetPCCell "Vivec, Hlaalu Prison Cells" == 0 )
                        ;если NPC на месте
                        Journal HR_Stronghold 144
                        set followNow to 0
                        AiWander 256 0 0 40 20 20 0 0 0 0 0 0
                        ForceGreeting
                        SetHello 30
            endif

[…]

HitOnMe, "ID Оружия" (returns Boolean/short)
HitAttemptOnMe, "ID Оружия" (returns Boolean/short)

Функция возвращает 1 в тот самый момент, когда игрок успешно атаковал или пытался это сделать с помощью определённого оружия. HitOnMe используется только лишь в скрипте “LorkhanHeart” (изучайте его, только если Вы уже прошли игру или если не боитесь спойлеров). Я полагаю, что эта функция также может оказаться полезной для модов, в которых некого монстра можно убить лишь определённым оружием.

Заметьте: существует информация, что функция HitOnMe принимает значение 1, когда игрок преступил закон на глазах у NPC, к которому применяется функция, если у того достаточно высокий показатель Alarm.

Проверка на убийство и нокаут

OnDeath (возвращает Boolean/short)

If ( OnDeath == 1 )

Возвращает 1 только в тот единственный момент, когда NPC умирает.

OnMurder (возвращает Boolean/short)

If ( OnMurder == 1 )

Возвращает 1 только в тот единственный момент, когда NPC убивают. Действие этой функции не совсем понятно, однако по контексту похоже, что она используется, когда игрок убивает кого-то незаконно и получает сообщение “Your crime has been reported”.

Пример скрипта: устанавливает значение переменной, которая управляет топиком «Гортатор Редорана», в зависимости от того, убил ли игрок консула.

begin RedoranCouncilor

;nolore...

short noLore

;для HT_Monopoly

short mageMonopolyVote

;для диалога Гортатора...

if ( OnDeath == 1 )
            if ( OnMurder == 1 )
                        Set RedoranMurdered to 2
            else
                        Set RedoranMurdered to 1
            endif
endif

End

OnKnockout (возвращает Boolean/short)

Возвращает 1 в тот самый единственный момент, когда персонаж падает без чувств (например, в рукопашной схватке).

GetDeadCount, "ID NPC" (возвращает short?)

If ( GetDeadCount "divayth fyr" > 0)

Функция возвращает, какое количество персонажей типа “ID NPC” игрок уже убил. Полезна для квестов, в которых надо определить, какие NPC ещё живы. Также возможно её использование, например, в следующем случае: если игрок убил 100 крыс, все остальные будут от него убегать. Заметьте, что существует диалоговый аналог этой функции.

Пример скрипта: “GetDeadCount” обычно используется для проверки того, мёртв ли определенный персонаж. Логично использовать для сравнения конструкцию «>0», а не «==1», поскольку какой-либо мод может добавить в игру ещё одного такого же персонажа, что вызовет определённые логические ошибки.

Begin araraUvulasScript

short noLore

if ( CellChanged == 0 )
            return
endif

if ( GetDeadCount "Neloth" > 0 )
            Disable
endif

End