Для сложного скриптнига Актеров возможна переменная, в которой хранится значение текущего типа ИИ и от которой зависят действия скрипта.
GetCurrentAIPackage(returns short)
If ( GetCurrentAIPackage == 2 )
[делать что-то]
endif
Возвращаемые значения:
Никакой
-1
Wander (Бродить)
Travel (Идти)
Escort (Эскорт)
Follow (Следовать)
Activate (Активировать)
Pursue (Преследовать)
Заставляем актера красться
ForceSneak
ClearForceSneak
"Actor_ID" -> ForceSneak
GetForceSneak (returns Boolean/short)
If ( "actor_ID" -> GetForceSneak == 1 )
Команда ForceSneak переводит актера в режим скрытности, все движения будут выполняться, как будто он крадется. ClearForceSneak завершает режим ForceSneak. К сожалению, нет соответствующей команды для бега (добавлена в Трибунале). GetForceSneak возвращает 1, если режим ForceSneak для вызывающего актера включен. Смотрите LookoutScript для примера. Вот отрывок:
elseif ( walkstate == 2 )
Fargoth->ForceSneak ; войти в режим скрытности
Fargoth->AiTravel -11468.595,-71511.531,173.728 ;идти к дереву
set walkstate to 3
elseif ( walkstate == 3 )
if ( Fargoth->GetAiPackageDone == 1 )
;Fargoth->Equip "torch_infinite_time_unique"
set walkstate to 4
;MessageBox "ДОЛЖЕН БЫТЬ У ДЕРЕВА"
endif
elseif ( walkstate == 4 )
set timer to timer + GetSecondsPassed
Fargoth->ClearForceSneak ; выйти из режима скрытности
Fargoth->AiWander 0 0 0 0 0 0 0 0 0
if ( timer > 3 )
Fargoth->ForceSneak ; снова вйоти в режим скрытности
Fargoth->AiTravel -11410.590,-72057.188,133.644 ;идти к стене
set walkstate to 5
endif
Заставляем актера бегать и прыгать: Движения в Трибунале
ForceRun
ClearForceRun
GetForceRun(short)
ForceJump
ClearForceJump
GetForceJump(short)
ForceMoveJump
ClearForceMoveJump
GetForceMoveJump(short)
Все эти функции управляют движением указанного NPC. ForceRun заставляет актера всегда бежать при движении, ForceJump заставляет актера постоянно прыгать, ForceMoveJump заставляет актера постоянно прыгать при движении. Версии функций с Get возвращают 1, если NPC был принужден войти в эти режимы, и 0 в противном случае. Функции Clear используются для сброса эти режимов. Каждый NPC может быть только в одном из этих режимов одновременно. Приоритет для этих режимов: Sneak > Running > Jump > MoveJump.
Пример:
Этот скрипт позволяет объекту контролировать тип движения Athlete (Атлет), NPC, который бесконечно движется по квадрату с четырьмя точками-углами.
Begin AthleteControl
short questionAsked
short button
short isrunning
short isjumping
if ( MenuMode )
return
endif
if ( OnActivate == 1 )
set isrunning to ( Athlete->GetForceRun )
set isjumping to ( Athlete->GetForceMoveJump )
if ( questionAsked == 0 )
if ( isrunning )
MessageBox, "Атлет должен прекратить бежать? " "Да" "Нет"
Проверка действий игрока: бежит, прыгает, крадется?
[no fix] GetPCSneaking(short)
[no fix] GetPCRunning(short)
[no fix] GetPCJumping(short)
if ( GetPCRunning )
Эти функции возвращают 1, если игрок выполняет подходящее действие, и 0 – если нет. Поскольку в Морре нет функций прямого тестирования ввода с клавиатуры, это альтернативный способ проверить, что игрок нажал определенную клавишу. Они широко используются в движущихся кораблях, лошадях или в моем моде про скалолазание.
Пример:
Когда этот скрипт помещен на NPC и игрок имеет надетый предмет scissors, появляются сообщения о действиях игрока.
Begin momscript
short warn
if ( player->HasItemEquipped "scissors" )
if ( warn != 1 )
if ( GetPCRunning )
MessageBox "Не бегай с ножницами!"
set warn to 1
endif
endif
if ( warn != 2 )
if ( GetPCJumping )
MessageBox "Не прыгай с ножницами! Ты себе глаз выколешь!"
set warn to 2
endif
endif
if ( warn != 3 )
if ( GetPCSneaking )
MessageBox "Ты не спрячешь ножницы от меня!"
set warn to 3
endif
endif
else
set warn to 0
endif
end
Определение готовности к бою
GetWeaponDrawn(short)
GetSpellReadied(short)
if ( player -> GetWeaponDrawn )
Эти функции могут использоваться для определения, достал ли Актер свое оружие (GetWeaponDrawn) или приготовил заклинание для кастинга[29] (GetSpellReadied).
Пример: Этот глобальный скрипт выдает сообщения о состоянии готовности оружия и заклинаний.
Begin player_notifications
short weapstate
short spelstate
if ( player->GetWeaponDrawn )
if ( weapstate != 1 )
set weapstate to 1
MessageBox "Игрок вытащил оружие."
Endif
else
if ( weapstate != 0 )
set weapstate to 0
MessageBox "Игрок зачехлил оружие."
Endif
endif
if ( player->GetSpellReadied )
if ( spelstate != 1 )
set spelstate to 1
MessageBox "Игрок приготовил заклинание."
Endif
else
if ( spelstate != 0 )
set spelstate to 0
MessageBox "Игрок отложил вызов заклинания."
Endif
endif
end
Заставляем кого-то падать
Fall
Actor -> Fall
Похоже, дает NPC дополнительный толчок вниз, который им необходим, даже когда вы убрали пол у них под ногами. Также спускает вниз летающие существа. Используется на падающем товарище с Полетом Икара. Когда я пытался применить ее на игроке в моем моде про скалолазание, она иногда телепортировала, а не спускала игрока прямо на землю под ним.
Доля в экипировке и другие функции компаньонов
[no fix] companion (is local short)
short companion
Set companion to 1
В Трибунале есть опция для дележа вещей с NPC и монстрами. Что ее включить, объявите локальную переменную типа short с именем companion и установит ее в 1. Установка в 0 отключит возможность дележа.
[no fix] minimumprofit (is local float)
Float minimumprofit
If ( minimumprofit < 0 )
Похоже, еще одна переменная, устанавливаемая игрой, видимо, разница между текущей ценой все вещей и золота минус начальное значение. Если она отрицательна, то наемник может быть заскриптован на уход от игрока.
Пример:Вот важная часть скрипта Калвуса (наемник в Морнхолде). Эта секция оперирует изменением состояния, когда Калвус разрывает контракт, или потому что срок контракта истек, или потому что игрок взял вещи Калвуса. Дележ запускается в диалоге (установкой companion в 1), не в самом скрипте.
if ( GetJournalIndex Merc_Calvus_Quit < 1 ) ;если Калвус уже ушел, не делать этого
if ( Contract_Calvus == 1 ) ;если Калвус не заключил контракт, не делать этого
if ( minimumProfit < 0 ) ;Калвус уходит, так как игрок взял его вещи
AiWander 128 6 0 40 30 20 0 0 0 0 0 0
Set Companion to 0;прекаратить дележ
StopScript Contract_Calvus
Set Contract_Calvus to 0
ForceGreeting
return
else
if ( Contract_Calvus == 0 ) ;управляет Калвусом после истечения срока
AiWander 128 6 0 40 30 20 0 0 0 0 0 0
Set Companion to 0;прекратить дележ
if ( GetJournalIndex Merc_Calvus < 10 )
Journal Merc_Calvus 10 ;первый контракт истек
else
Journal Merc_Calvus 20 ; самый недавний контракт истек
endif
endif
endif
endif
endif
[no fix] StayOutside (is local float)
short StayOutside
set StayOutside to 1
Ценная переменная для использования с компаньонами. Когда используется в скрипте, она заставляет всякого, у кого установлена в 1, автоматически оставаться (и ждать) снаружи любого интерьера, пока игрок не вернется (потом автоматически с ним соединяется). (Информация с форумов / Grumpy)