fallout.ru

Магия

Ограничение использования телепортации

DisableTeleporting
EnableTeleporting

Функции включают и выключают возможность телепортироваться соответственно. Удобны для того, чтобы эти назойливые маги могли уйти из вашего подземелья только через дверь :). В оригинальной версии игры они использовались только в логове Дагот Ура. Я не буду показывать весь скрипт, так как это было бы спойлером. Вот небольшая его часть:

short teleportDisabled

if ( teleportDisabled == 0 )
            DisableTeleporting
            Set teleportDisabled to 1
endif

Позже возможность вновь включается в скрипте “EndGame”.

Заметьте: после установки Трибунала эта функция перестаёт работать. Один из начальных скриптов включает возможность телепортироваться везде кроме определённого места в Мурнхолде. Я уверен, что эту погрешность можно легко исправить.

Вот тот скрипт:

Begin TribunalMain

;проверка на телепортацию

if ( GetPCCell "Sotha Sil," == 1 )
            DisableTeleporting
else
            EnableTeleporting
endif

;проверка на левитацию

if ( GetPCCell "Sotha Sil," == 1 )
            DisableLevitation
elseif ( GetPCCell "Mournhold" == 1 )
            DisableLevitation
else
            EnableLevitation
endif

end

А вот возможное, однако нетестированное исправление:

Begin TribunalMain

Short switch1
Short switch2

;проверка на телепортацию

if ( GetPCCell "Sotha Sil," == 1 )
            DisableTeleporting
            Set switch1 to 1
Else
            If ( switch1 == 1 )
                        EnableTeleporting
                        Set switch1 to 0
            endif
endif

;проверка на левитацию

if ( GetPCCell "Sotha Sil," == 1 )
            DisableLevitation
            Set switch2 to 1
elseif ( GetPCCell "Mournhold" == 1 )
            DisableLevitation
            Set switch2 to 1
else
            If ( switch2 == 1 )
                        EnableLevitation
                        Set switch2 to 0
            endif
endif

end

Проверка и создание камней душ

HasSoulgem, "ID Существа"

if HasSoulGem, "golden saint"

Функция проверяет, находится ли в инвентаре игрока камень с душой определённого монстра. Практически нигде не используется, однако позволяет создать довольно забавные квесты.

Пример: часть скрипта “StrongSoulCheck”.

if ( Player->HasSoulGem "atronach_storm" > 1 )
            Set counter to ( counter + 2 )
elseif ( Player->HasSoulGem "atronach_storm" > 0 )
            Set counter to ( counter + 1 )
endif

RemoveSoulgem, "ID Существа"

Удаляет из инвентаря камень с душой какого-либо определённого монстра.

Пример: часть скрипта “RemoveStrongSoul”.

if ( counter > 0 )
            if ( Player->HasSoulGem "atronach_storm" > 0 )
                        Player->RemoveSoulGem "atronach_storm" 1
                        Set counter to ( counter - 1 )
            endif
endif

Учтите, что игроку вряд ли понравится, если Вы заберёте у него подобным образом звезду Азуры. Вот возможное решение этой проблемы:

short StarCount ;у игрока может быть больше одной попытки

if ( OnActivate )
            if ( Player->HasSoulGem "Golden Saint" > 0 )
                        set StarCount to ( Player->GetItemCount "Misc_Soulgem_Azura" )
                        Player->RemoveSoulGem "Golden Saint" 1
                        if ( ( Player->GetItemCount "Misc_Soulgem_Azura" ) < StarCount )
                                    Player->AddItem "Misc_Soulgem_Azura" 1
                        endif
                        Player->AddItem Gold_001, 10000
                        MessageBox "Спасибо, приходите ещё."
            else
                        MessageBox "У Вас нет камня с душой Золотой Святой."
            endif
endif

AddSoulGem "ID Существа", "ID Камня"

AddSoulGem "atronach_storm", Misc_Soulgem_Grand

Функция добавляет в инвентарь игрока определённый камень с заданной душой.

DropSoulgem, "ID Существа"

DropSoulGem "atronach_storm"

Я ещё не тестировал эту функция. Возможно, она заставляет персонажа уронить камень с определённой душой.

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

Объект является камнем души и был использован в целях перезарядки или создания зачарованного предмета.

Камни душ бывают следующих типов:

  • Misc_SoulGem_Azura
  • Misc_SoulGem_Grand
  • Misc_SoulGem_Greater
  • Misc_SoulGem_Common
  • Misc_SoulGem_Lesser
  • Misc_SoulGem_Petty

Добавление и удаление заклятий. Проклятья

AddSpell, "ID заклинания"
RemoveSpell, "ID заклинания"

Первая функция применит заклинание к вызываемому объекту. Это может означать две вещи: персонаж запоминает обычные заклинания, в то время как болезни и проклятия влияют на него стандартным образом. То же касается и функции RemoveSpell.

Учтите: Вы не можете удалять расовые возможности.

Колдовство

Cast, “ID заклинания”, "ID цели"

Cast” заставляет персонажа скастовать заклинание, направленное на некую цель. Учтите: раньше считалось, что функция действует только на игрока. Возможно, это не так. В любом случае, в Трибунале с её помощью можно заставлять активатор кастовать заклинание на любого NPC. Возможно, другие комбинации также будут работать.

Пример: последняя функция может быть использована для установки ловушки на контейнер. Здесь обязательно должно стоять одноразовое условие, иначе заклинание будет вновь и вновь накладываться на игрока:

Begin Trap_script

short done

if ( OnActivate == 1 )
             if ( done == 1 ) ;одноразовое условие
                        Activate
                        return
             else
                        Cast, "flame", Player ;урон игроку
                        set done to 1
                        Activate
             endif
endif

End trap_script

Следующий пример иллюстрирует использование функции “AddSpell”:

begin Item_Cast

short OnPCEquip
short CurseAdded
float Timer

if ( CurseAdded )
set Timer to ( Timer + GetSecondsPassed )
             if ( Timer >= 25 ) ; по прошествии 25 секунд убрать заклинание. Сделан урон 25.
                        set Timer to 0
                        Player->RemoveSpell "ItemFlame"
                        set CurseAdded to 0
             endif
endif

if ( OnPCEquip );когда предмет одевается
             if ( MenuMode )
                        return
             elseif ( CurseAdded == 0 )
                        Player->AddSpell "ItemFlame" ; заклинание-проклятье!

                        ;урон огнём 1 за 1 секунду

                        set Timer to 0
                        set CurseAdded to 1
             elseif ( CurseAdded ) ; только один раз
                        Player->RemoveSpell "ItemFlame"
                        set CurseAdded to 0
endif

end Item_Cast

Добавляемое заклинание – проклятье, наносящее урон огнём. Прошу обратить особое внимание на наличие одноразового условия – без него игра «вылетит»! К тому же, если существо было убито проклятьем, то все особи того же вида будут иметь на себе именно это заклинание. Для избежания этого можно использовать функцию “RemoveSpell” в секции, где обрабатывается ситуация смерти существа.

GetSpell, "ID Заклинания" (возвращает Boolean/short)

if ( Player -> GetSpell, "heal companion" == 1 )

Возвращает 1, если объект «знает» необходимое заклинание. Функция, однако, не работает с заклинаниями и возможностями, которые появляются в результате выбора расы и знака зодиака – только с теми, которые находятся в «книге заклинаний».

GetSpellEffects, "ID Заклинания" (возвращает Boolean/short)

Возвращает ИСТИНУ, если заклинание в данный момент воздействует на вызываемый объект.

if ( Player -> GetSpellEffects, "flame" == 1 )
             MessageBox "Вы были опалены магическим огнём"
endif

Возможное использование функции смотрите в примере ниже. Функция, вроде бы, также работает со специальными возможностями и заболеваниями.

Управление эффектами заклинаний

GetEffect, “ID Эффекта” (возвращает Boolean/short)

If ( GetEffect, sEffectRestoreHealth == 1)

Функция возвращает 1, если на вызываемого NPC воздействует определённый эффект заклинания. Отмечу, что эффекты являются лишь частью, из которых состоят заклинания.

RemoveEffects, ID_Эффекта#_числ

Player -> RemoveEffects, 75

Снимает с объекта все заклинания, содержащие необходимый эффект. Учтите, что здесь в качестве аргумента нужен порядковый номер эффекта, в то время как функции GetEffect необходим его ID (Браво, Bethesda!). И то, и другое Вы найдёте в приложении.

Пример: скрипт проверяет, наложено ли заклинания на игрока, знает ли он его, воздействует ли на него его эффект. После этого заклинание снимается. Для тестирования в консоле напишите “StartScript Magictest”.

Begin Magictest

short var_1
short var_2
short var_3

if ( Player -> GetSpell, "hearth heal" )
             set var_1 to 1
else
             set var_1 to 0
endif

if ( Player -> GetSpellEffects, "hearth heal" )
             set var_2 to 1
else
             set var_2 to 0
endif

if ( Player -> GetEffect, sEffectRestoreHealth )
             Player -> RemoveEffects, 75 ;удалите эту строку, чтобы узнать, что происходит обычно
             set var_3 to 1
else
             set var_3 to 0
endif

MessageBox "GetSpell: %.0f GetSpellEffects, %.0f GetEffect: %.0f ", var_1, var_2, var_3

End

Проверка на заражение

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

Обе функции возвращают 1, если объект подцепил моровую или обычную болезнь соответственно. Используются в скриптах, накладывающих на заражённых животных их болезнь.

Пример:

Begin diseaseBlackHeart

DontSaveObject

if ( CellChanged == 0 )
             return
endif

if ( GetBlightDisease == 0 )
             AddSpell "black-heart blight"
endif

End