Файл B_Functions.d
/************************************************************************************/
/* Файл: C_Functions.d */
/* -------------------------------------------------------------------------------- */
/* Описание: Вспомогательные B-функции для Npc */
/* Содержит небольшие универсальные функции для AI */
/* Функция B_GotoWPNextToNpc() */
/* Функция B_CantSeeTurn() */
/* Функция C_LookAtNpc() */
/* Функция C_StopLookAt() */
/* Функция B_SmartTurnToNpc() */
/* Функция B_Say() */
/* Функция B_SayOverlay() */
/* Функция B_StandUp() */
/* Функция B_CallComrades() */
/* Функция B_CallGuards() */
/* Функция B_IntruderAlert() */
/* Функция B_FullStop() */
/* Функция B_ResetTempAttitude() */
/* Функция B_WhirlAround() */
/* Функция B_DropWeapon() */
/* Функция B_RegainDroppedWeapon() */
/* Функция B_RegainDroppedArmor() */
/* Функция B_GotoFP() */
/* Функция B_StopGotoHero() */
/* Функция B_SetAttackReason() */
/* Функция B_KillNpc() */
/* Функция B_UseFakeScroll() */
/* Функция B_ChangeGuild() */
/* Функция B_ExchangeRoutine() */
/* Функция B_SetPermAttitude() */
/* Функция B_LogEntry() */
/* Функция B_ClearImmortal() */
/* Функция B_SetNpcType() */
/* Функция B_GiveInvItems() */
/* Функция B_CheckForImportantInfo() */
/* Функция B_InitGuildAttitudes() */
/* Функция B_PracticeCombat() */
/* Функция B_PrintGuildCondition() */
/* -------------------------------------------------------------------------------- */
/* Заметки: */
/* [NUS] - Не используется */
/* */
/************************************************************************************/
/* -------------------------------------------------------------------------------- */
/* B_GotoWPNextToNpc() [NUS] */
/* -------------------------------------------------------------------------------- */
/* Функция заставляет Npc 'slf' переместится к Npc 'oth'. */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен переместиться */
/* oth - Целевой Npc */
/* -------------------------------------------------------------------------------- */
func void B_GotoWPNextToNpc (var C_Npc slf, var C_Npc oth)
{
// Вывести в zSpy строку "B_GotoWPNextToNpc"
PrintDebugNpc (PD_ZS_DETAIL, "B_GotoWPNextToNpc" );
// Локальная переменная для сохранения имени WP
var string waypoint;
// Получаем имя близжайшего к Npc 'oth' - Waypoint
waypoint = Npc_GetNextWP(oth);
// Npc 'slf' перемещается в WP
AI_GotoWP (slf, waypoint);
};
/* -------------------------------------------------------------------------------- */
/* B_CantSeeTurn() [NUS] */
/* -------------------------------------------------------------------------------- */
/* Функция поворота Npc лицом к другому Npc, даже если он его не видит */
/* -------------------------------------------------------------------------------- */
/* self - Npc который поворачивается */
/* other - Npc к которому поворачиваются */
/* -------------------------------------------------------------------------------- */
func void B_CantSeeTurn ()
{
// Вывести в zSpy строку "B_CantSeeTurn"
PrintDebugNpc (PD_ZS_DETAIL, "B_CantSeeTurn" );
// Если Npc 'self' не сидит И Npc 'self' не видит 'other'
if ((!C_BodyStateContains(self, BS_SIT)) && !Npc_CanSeeNpc (self,other))
{
// Вывести в zSpy строку "B_CantSeeTurn If"
PrintDebugNpc (PD_ZS_CHECK, "B_CantSeeTurn If");
// Npc 'self' поворачивается лицом к Npc 'other'
AI_TurnToNpc (self, other);
};
};
/* -------------------------------------------------------------------------------- */
/* C_LookAtNpc() */
/* -------------------------------------------------------------------------------- */
/* Функция заставляет одного Npc посмотреть на другого Npc */
/* -------------------------------------------------------------------------------- */
/* slf - Смотрящий Npc */
/* oth - Npc на которого смотрят */
/* -------------------------------------------------------------------------------- */
/* Возвращаемые значения: */
/* True - Npc 'slf' посмотрел на Npc 'oth' */
/* -------------------------------------------------------------------------------- */
// Вызывается команда AI_LookAtNpc, если переменная AIV_ISLOOKING не установлена
// 19.09.00: ВНИМАНИЕ: Я закомментировал AIV по двум причинам
// a) Вызывал проблемы
// b) После исправления ошибки необходимость в переменной отпала. Проверенно работает!!!
func int C_LookAtNpc(var C_Npc slf, var C_Npc oth)
{
// Если Npc 'slf' не смотрел на Npc 'oth'
// if ( ! slf.aivar[ AIV_ISLOOKING ] )
// {
// Npc 'slf' смотрит на Npc 'oth'
AI_LookAtNpc(slf, oth);
// Вывести в zSpy строку "C_LookAtNpc"
PrintDebugNpc(PD_ZS_DETAIL,"C_LookAtNpc");
// Установить, что Npc 'slf' смотрел на Npc 'oth'
// slf.aivar[AIV_ISLOOKING] = 1;
// Npc 'slf' посмотрел на Npc 'oth'
return 1;
// };
// Npc 'slf' уже смотрел на Npc 'oth'
// return 0;
};
/* -------------------------------------------------------------------------------- */
/* C_StopLookAt() */
/* -------------------------------------------------------------------------------- */
/* Функция заставляет Npc перестать смотреть на другого Npc или объект */
/* -------------------------------------------------------------------------------- */
/* slf - Смотрящий Npc */
/* -------------------------------------------------------------------------------- */
/* Возвращаемые значения: */
/* True - Npc 'slf' не смотрит на другого Npc */
/* -------------------------------------------------------------------------------- */
func int C_StopLookAt(var C_Npc slf)
{
// Если на Npc уже смотрели
// if (slf.aivar[AIV_ISLOOKING])
// {
// Npc прекращает смотреть на другого Npc
AI_StopLookAt(slf);
// Вывести в zSpy строку "C_StopLookAt"
PrintDebugNpc(PD_ZS_DETAIL,"C_StopLookAt");
// На Npc не смотрели
// slf.aivar[AIV_ISLOOKING] = 0;
// Npc 'slf' не смотрит на другого Npc
return 1;
// };
// Npc 'slf' еще не смотрел на другого Npc
// return 0;
};
/* -------------------------------------------------------------------------------- */
/* B_SmartTurnToNpc() */
/* -------------------------------------------------------------------------------- */
/* Функция поворота к Npc с учетом положения собеседника спереди или сзади. */
/* -------------------------------------------------------------------------------- */
/* slf - Смотрящий Npc */
/* oth - Собеседник */
/* -------------------------------------------------------------------------------- */
func void B_SmartTurnToNpc (var C_Npc slf, var C_Npc oth)
{
// Вывести в zSpy строку "B_SmartTurnToNpc"
PrintDebugNpc (PD_ZS_DETAIL, "B_SmartTurnToNpc");
// Если Npc 'slf' не сидит ИЛИ
if (! (C_BodyStateContains(slf, BS_SIT)
// не использует предмет инвентаря ИЛИ
|| C_BodyStateContains(slf, BS_ITEMINTERACT)
// не использует MOB ИЛИ
|| C_BodyStateContains(slf, BS_MOBINTERACT)
// прерывает использование MOB
|| C_BodyStateContains(slf, BS_MOBINTERACT_INTERRUPT)))
{
// Вывести в zSpy строку "не сидит и не использует MOBsi"
PrintDebugNpc (PD_ZS_DETAIL, "...not sit and does not use MOBsi");
// Если Npc 'slf' не видит Npc 'oth'
if (!Npc_CanSeeNpc (slf, oth))
{
// Вывести в zSpy строку "Не может видеть цель"
PrintDebugNpc (PD_ZS_DETAIL, "...can not see target!");
// Npc 'slf' поворачивается лицом к Npc 'oth'
AI_TurnToNpc (slf, oth);
}
// Иначе
else
{
// Npc 'slf' смотрит на Npc 'oth'
C_LookAtNpc (slf, oth);
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_Say() */
/* -------------------------------------------------------------------------------- */
/* Npc произносит SVM фразу. */
/* -------------------------------------------------------------------------------- */
/* slf - Говорящий Npc */
/* oth - Слушающий Npc */
/* text - Имя переменной SVM класса, которая содержит произносимую фразу */
/* Должна начинаться с символа $ */
/* -------------------------------------------------------------------------------- */
func void B_Say(var C_Npc slf, var C_Npc oth, var string text)
{
// Локальная переменная для zSpy
var string pipe;
// Объединяем строки "B_Say: " и имя SVM переменной
pipe = ConcatStrings("B_Say: ", text);
// Вывести в zSpy полученную строку
PrintDebugNpc (PD_ZS_FRAME, pipe);
// В зависимости от положения собеседника Npc 'slf' либо оборачивается, либо смотрит
B_SmartTurnToNpc (slf, oth);
// Npc 'slf' произносит SVM фразу
AI_OutputSVM (slf, oth , text);
};
/* -------------------------------------------------------------------------------- */
/* B_SayOverlay() */
/* -------------------------------------------------------------------------------- */
/* Npc произносит SVM фразу не задерживая выполнение последующих AI команд */
/* -------------------------------------------------------------------------------- */
/* slf - Говорящий Npc */
/* oth - Слушающий Npc */
/* text - Имя переменной SVM класса, которая содержит произносимую фразу */
/* Должна начинаться с символа $ */
/* -------------------------------------------------------------------------------- */
func void B_SayOverlay(var C_Npc slf, var C_Npc oth, var string text)
{
// Локальная переменная для zSpy
var string pipe;
// Объединяем строки "B_Say: " и имя SVM переменной
pipe = ConcatStrings("B_SayOverlay: ", text);
// Вывести в zSpy полученную строку
PrintDebugNpc (PD_ZS_FRAME, pipe );
// В зависимости от положения собеседника Npc 'slf' либо оборачивается, либо смотрит
B_SmartTurnToNpc (slf, oth);
// Npc 'slf' произносит SVM фразу не задерживая выполнение последующих AI команд
AI_OutputSVM_Overlay (slf, oth, text);
};
/* -------------------------------------------------------------------------------- */
/* B_StandUp() */
/* -------------------------------------------------------------------------------- */
/* Npc встает с любого места на котором сидит */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен встать */
/* -------------------------------------------------------------------------------- */
func void B_StandUp (var C_Npc slf)
{
// Вывести в zSpy строку "B_StandUp"
PrintDebugNpc (PD_ZS_DETAIL, "B_StandUp" );
// Если Npc сидит
if C_BodyStateContains(slf,BS_SIT)
{
// Если Npc 'slf' сидит
if (slf.aivar[AIV_HangAroundStatus] == 1)
{
// Npc встает
AI_PlayAni (slf, "T_SIT_2_STAND");
// Npc нигде не сидит
slf.aivar[AIV_HangAroundStatus] = 0;
}
// Иначе если Npc сидит на Троне
else if (slf.aivar[AIV_HangAroundStatus] == 4)
{
// Встаем с трона
AI_UseMob (slf,"SMALL THRONE",-1);
// Npc нигде не сидит
slf.aivar[AIV_HangAroundStatus] = 0;
}
// Иначе если Npc сидит на лавке
else if (slf.aivar[AIV_HangAroundStatus] == 2)
{
// Встаем с лавки
AI_UseMob (slf,"BENCH",-1);
// Npc нигде не сидит
slf.aivar[AIV_HangAroundStatus] = 0;
}
// Иначе если Npc сидит на кресле
else if (slf.aivar[AIV_HangAroundStatus] == 3)
{
// Встаем с кресла
AI_UseMob (slf,"CHAIR",-1);
// Npc нигде не сидит
slf.aivar[AIV_HangAroundStatus] = 0;
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_CallComrades() [NUS] */
/* -------------------------------------------------------------------------------- */
/* Npc зовет друзей на помощь */
/* -------------------------------------------------------------------------------- */
/* self - Npc который зовет на помощь */
/* other - Npc преступник */
/* -------------------------------------------------------------------------------- */
func void B_CallComrades()
{
// Вывести в zSpy строку "B_CallComrades"
PrintDebugNpc (PD_ZS_DETAIL, "B_CallComrades");
// Произнести SVM фразу $COMRADESHELP (Нет такой фразы)
B_SayOverlay (self, NULL, "$COMRADESHELP");
// Посылаем пассивное восприятие "Предупреждение"
Npc_SendPassivePerc (self, PERC_ASSESSWARN, self, other);
};
/* -------------------------------------------------------------------------------- */
/* B_CallGuards() */
/* -------------------------------------------------------------------------------- */
/* Npc зовет на помощь охрану */
/* -------------------------------------------------------------------------------- */
/* self - Npc который зовет охрану */
/* other - Npc преступник */
/* -------------------------------------------------------------------------------- */
func void B_CallGuards()
{
// Вывести в zSpy строку "B_CallGuards"
PrintDebugNpc (PD_ZS_DETAIL, "B_CallGuards");
// Произнести SVM фразу с криками о помощи
B_SayOverlay (self, NULL, "$HELP");
// Посылаем пассивное восприятие "Предупреждение"
Npc_SendPassivePerc (self, PERC_ASSESSWARN, self, other);
};
/* -------------------------------------------------------------------------------- */
/* B_IntruderAlert() */
/* -------------------------------------------------------------------------------- */
/* Npc slf поднимает тревогу при проникновении Npc oth в запретные места */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который поднял тревогу */
/* oth - Npc преступник */
/* -------------------------------------------------------------------------------- */
func void B_IntruderAlert(var C_Npc slf, var C_Npc oth)
{
// Вывести в zSpy строку "B_IntruderAlert"
PrintDebugNpc (PD_ZS_DETAIL, "B_IntruderAlert");
// Сказать SVM фразу "$IntruderAlert"
B_SayOverlay (slf, NULL, "$IntruderAlert");
// Посылаем пассивное восприятие "Предупреждение"
Npc_SendPassivePerc (slf, PERC_ASSESSWARN, slf, oth);
};
/* -------------------------------------------------------------------------------- */
/* B_FullStop() */
/* -------------------------------------------------------------------------------- */
/* Npc slf прерывает любую анимацию. */
/* Ранее использовалась команда AI_StandUp(). */
/* Однако в некоторых ситуациях эта команда была слишком медленной. */
/* Поэтому команда была заменена на AI_StandUpQuick(). */
/* -------------------------------------------------------------------------------- */
/* npc - Npc чью анимацию необходимо остановить */
/* -------------------------------------------------------------------------------- */
func void B_FullStop(var C_Npc npc)
{
// Вывести в zSpy строку "B_FullStop"
PrintDebugNpc (PD_ZS_DETAIL, "B_FullStop");
// Удаляем все AI команды из очереди
Npc_ClearAIQueue (npc);
// Перевести Npc в рабочую стойку без анимации
AI_StandUpQuick (npc);
};
/* -------------------------------------------------------------------------------- */
/* B_ResetTempAttitude() */
/* -------------------------------------------------------------------------------- */
/* Функция сброса временного отношения к Npc на постоянное */
/* -------------------------------------------------------------------------------- */
/* slf - Npc для которого сбрасывают отношение */
/* -------------------------------------------------------------------------------- */
func void B_ResetTempAttitude(var C_Npc slf)
{
// Выводим в zSpy строку "B_ResetTempAttitude"
PrintDebugNpc (PD_ZS_DETAIL, "B_ResetTempAttitude");
// Устанавливаем временное отношение Npc равным постоянному отношению
Npc_SetTempAttitude(slf, Npc_GetPermAttitude(slf,hero));
};
/* -------------------------------------------------------------------------------- */
/* B_WhirlAround() */
/* -------------------------------------------------------------------------------- */
/* Функция вращения Npc 'slf' если он не может найти Npc 'oth' */
/* -------------------------------------------------------------------------------- */
/* slf - Поворачивающийся Npc */
/* oth - Npc оппонент */
/* -------------------------------------------------------------------------------- */
func void B_WhirlAround(var C_Npc slf, var C_Npc oth)
{
// Вывести в zSpy строку "B_WhirlAround"
PrintDebugNpc (PD_ZS_DETAIL, "B_WhirlAround");
// Если Npc 'slf' видит Npc 'oth'
if (Npc_CanSeeNpc(slf,oth))
{
// Вывести в zSpy строку "Может видеть цель"
PrintDebugNpc (PD_ZS_DETAIL, "...can see target!");
// Поворачивается к Npc
AI_TurnToNpc (slf, oth);
}
// Иначе
else
{
// Вывести в zSpy строку "Не может увидеть цель"
PrintDebugNpc (PD_ZS_DETAIL, "...can not see target!");
// Оборачивается к Npc 'oth'
AI_WhirlAround (slf, oth);
};
};
/* -------------------------------------------------------------------------------- */
/* B_DropWeapon() [NUS] */
/* -------------------------------------------------------------------------------- */
/* Функция выбрасывания оружия которое Npc slf держит в руках */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен выбросить оружие */
/* itm - Выбрасываемое оружие */
/* -------------------------------------------------------------------------------- */
func void B_DropWeapon(var C_Npc slf)
{
// Вывести в zSpy строку "B_DropWeapon"
PrintDebugNpc (PD_ZS_DETAIL, "B_DropWeapon");
// Локальная переменная для предмета инвентаря
var C_Item itm;
// Локальная переменная для сохранения ID предмета инвентаря
var int itemid;
// Получаем инстанцию оружия в руках Npc 'slf'
itm = Npc_GetReadiedWeapon(slf);
// Если у Npc было в руках оружие
if (Hlp_IsValidItem(itm))
{
// Получаем ID оружия
itemid = Hlp_GetInstanceID(itm);
// Вывести в zSpy имя предмета
PrintDebugNpc (PD_ZS_DETAIL, itm.name);
// Npc бросает оружие на землю
AI_DropItem (slf, itemid);
};
};
/* -------------------------------------------------------------------------------- */
/* B_RegainDroppedWeapon() */
/* -------------------------------------------------------------------------------- */
/* Функция заставляющая Npc подобрать брошенное оружие */
/* Примечание: Удаляется глобальная переменная item */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен подобрать оружие */
/* -------------------------------------------------------------------------------- */
func void B_RegainDroppedWeapon(var C_Npc slf)
{
// Npc воспринимает все объекты в зоне действия восприятия
Npc_PerceiveAll (slf);
// Выполняем поиск оружия ближнего боя ИЛИ оружия дальнего боя
if (Wld_DetectItem (slf, ITEM_KAT_NF) || Wld_DetectItem (slf, ITEM_KAT_FF))
{
// Если Npc 'slf' не ГГ И Npc видит оружие
if (!Npc_IsPlayer(slf) && Npc_CanSeeItem(slf,item))
{
// Вывести в zSpy строку "Npc поднимает оружие снова"
PrintDebugNpc (PD_ZS_CHECK, "...NPC picks up his weapon again!" );
// Npc подбирает оружие
AI_TakeItem (slf, item);
// Npc 'slf' экипирует лучшее оружие ближнего боя
AI_EquipBestMeleeWeapon(slf);
// Npc 'slf' экипирует лучшее оружие дальнего боя
AI_EquipBestRangedWeapon(slf);
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_RegainDroppedArmor() */
/* -------------------------------------------------------------------------------- */
/* Функция заставляющая Npc подобрать брошенную броню */
/* Примечание: Удаляется глобальная переменная item */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен подобрать броню */
/* -------------------------------------------------------------------------------- */
func void B_RegainDroppedArmor(var C_Npc slf)
{
//Npc воспринимает все объекты в зоне действия восприятия
Npc_PerceiveAll (slf);
// Выполняем поиск доспехов
if (Wld_DetectItem(slf, ITEM_KAT_ARMOR))
{
// Если Npc не ГГ
if (!Npc_IsPlayer(slf))
{
// Вывести в zSpy строку "...Npc picks up his armor again!"
PrintDebugNpc(PD_ZS_CHECK, "...Npc picks up his armor again!" );
// Npc 'slf' подбирает доспехи
AI_TakeItem (slf, item);
// Npc 'slf' экипирует лучшие доспехи
AI_EquipBestArmor(slf);
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_GotoFP() */
/* -------------------------------------------------------------------------------- */
/* Функция перехода Npc к следующему свободному Freepoint */
/* -------------------------------------------------------------------------------- */
/* slf - Npc который должен перейти к Freepoint */
/* fp - Имя Freepoint */
/* -------------------------------------------------------------------------------- */
func void B_GotoFP (var C_Npc slf, var string fp)
{
// Вывести в zSpy строку "B_GotoFP"
PrintDebugNpc (PD_TA_LOOP, "B_GotoFP");
// Если Npc еще не находится на указанном Freepoint
if !(Npc_IsOnFP(self,fp))
{
// Вывести в zSpy строку "... не на указанном Freepoint"
PrintDebugString (PD_TA_CHECK, "...not on the specified Freepoint", fp);
// Если в радиусе 20 метров имеется доступный Freepoint с указанным именем
if (Wld_IsNextFPAvailable(self,fp))
{
// Вывести в zSpy строку "Перейти к Freepoint"
PrintDebugString(PD_TA_CHECK, "Go to Freepoint ", fp);
// Установить режим перемещения: Ходьба
AI_SetWalkmode (self, NPC_WALK);
// Npc перемещается в следующий указанный Freepoint
AI_GotoNextFP (self, fp);
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_StopGotoHero() */
/* -------------------------------------------------------------------------------- */
/* Функция преждевременного прерывания перемещения Npc к ГГ */
/* Используется для восприятия PERC_MOVENPC и функции AI_GotoNpc(self, hero) */
/* Используйте только self и hero */
/* -------------------------------------------------------------------------------- */
/* self - Npc который должен перейти к ГГ */
/* other - ГГ */
/* -------------------------------------------------------------------------------- */
func void B_StopGotoHero ()
{
// Вывести в zSpy строку "B_StopGotoHero"
PrintDebugNpc(PD_ZS_FRAME, "B_StopGotoHero");
// Если Npc 'other' это ГГ
if (Npc_IsPlayer(other))
{
// Вывести в zSpy строку "Столкновение с игроком!"
PrintDebugNpc (PD_ZS_DETAIL, "...Collision with player!");
// Отключаем у Npc восприятие перемещения Npc
Npc_PercDisable (self, PERC_MOVENPC);
// Останавливаем Npc 'self'
B_FullStop (self);
};
};
/* -------------------------------------------------------------------------------- */
/* B_SetAttackReason() */
/* -------------------------------------------------------------------------------- */
/* Функция позволяющая установить причину атаки Npc */
/* Константы можно найти в файле AI_CONSTANTS.D */
/* -------------------------------------------------------------------------------- */
/* slf - Npc для которого устанавливают причину нападения */
/* reason - Причина по которой Npc напал на другого Npc */
/* -------------------------------------------------------------------------------- */
func void B_SetAttackReason(var C_Npc slf, var int reason)
{
// Вывести в zSpy строку "B_SetAttackReason"
PrintDebugNpc (PD_ZS_DETAIL, "B_SetAttackReason");
// Установить причину атаки Npc
slf.aivar[AIV_ATTACKREASON] = reason;
};
/* -------------------------------------------------------------------------------- */
/* B_KillNpc() */
/* -------------------------------------------------------------------------------- */
/* Установить очки здоровья указанного Npc равными 0. */
/* -------------------------------------------------------------------------------- */
/* slf - Npc для которого устанавливают причину нападения */
/* reason - Причина по которой Npc напал на другого Npc */
/* -------------------------------------------------------------------------------- */
func void B_KillNpc(var int npcInstance)
{
// Вывести в zSpy строку "B_KillNpc"
PrintDebugNpc (PD_ZS_DETAIL, "B_KillNpc");
// Объявляем локальную переменную C_Npc
var C_Npc npc;
// Получаем инстанцию нашего Npc
npc = Hlp_GetNpc(npcInstance);
// Объявляем локальную переменную для сохранения оружия Npc
var int itemInstance;
// Сбрасываем все флаги Npc 'slf'
npc.flags = 0;
// Создаем в инвентаре вспомогательный предмет "Монета", чтобы Npc не удалился из игрового мира
CreateInvItem (npc,ItMi_Stuff_OldCoin_02);
// Обнуляем значение очков жизни у Npc 'slf'
Npc_ChangeAttribute (npc, ATR_HITPOINTS, -npc.attribute[ATR_HITPOINTS_MAX]);
// Если в первом слоте инвентаря есть оружие
if (Npc_GetInvItemBySlot(npc,INV_WEAPON,1))
{
// Вывести в zSpy строку "Оружие найдено в Слоте 1!"
PrintDebugNpc (PD_ZS_DETAIL, "...Weapon fount in Slot 1!");
// Сохраняем ID оружия в локальную переменную
itemInstance = Hlp_GetInstanceID(item);
// Удаляем оружие из инвентаря Npc
Npc_RemoveInvItem (npc, itemInstance);
};
// Если во втором слоте инвентаря есть оружие
if (Npc_GetInvItemBySlot(npc,INV_WEAPON,2))
{
// Вывести в zSpy строку "Оружие найдено в Слоте 2!"
PrintDebugNpc (PD_ZS_DETAIL, "...Weapon fount in Slot 2!");
// Сохраняем ID оружия в локальную переменную
itemInstance = Hlp_GetInstanceID(item);
// Удаляем оружие из инвентаря Npc
Npc_RemoveInvItem (npc, itemInstance);
};
};
/* -------------------------------------------------------------------------------- */
/* B_UseFakeScroll() */
/* -------------------------------------------------------------------------------- */
/* Функция визуализации чтения куска пергамента */
/* -------------------------------------------------------------------------------- */
/* self - Npc который читает пергамент */
/* hero - Главный герой */
/* -------------------------------------------------------------------------------- */
func void B_UseFakeScroll ()
{
// Если Npc 'self' сидит
if (C_BodystateContains(self, BS_SIT))
{
// Npc встает
AI_StandUp (self);
// Npc поворачивается к ГГ
AI_TurnToNpc (self, hero);
};
// Создаем в инвентаре Npc объект "Письмо"
CreateInvItem (self, Fakescroll);
// Npc 'self' достает письмо и читает
AI_UseItemToState (self, Fakescroll, 1);
// Npc ожидает 3 секунды
AI_Wait (self, 3);
// Npc 'self' прячет письмо
AI_UseItemToState (self, Fakescroll, -1);
};
/* -------------------------------------------------------------------------------- */
/* B_ChangeGuild() */
/* -------------------------------------------------------------------------------- */
/* Функция смены гильдии Npc */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Истанция Npc которому изменяют гильдию */
/* newGuild - Гильдия */
/* -------------------------------------------------------------------------------- */
func void B_ChangeGuild(var int npcInstance, var int newGuild)
{
// Вывести в zSpy строку "B_ChangeGuild"
PrintDebugNpc (PD_ZS_DETAIL, "B_ChangeGuild");
// Создаем локальную переменную для Npc
var C_Npc npc;
// Получаем Npc
npc = Hlp_GetNpc(npcInstance);
// Устанавливаем гильдию для Npc в движке
Npc_SetTrueGuild(npc,newGuild);
// Устанавливаем гильдию для Npc в скриптах
npc.guild = newGuild;
};
/* -------------------------------------------------------------------------------- */
/* B_ExchangeRoutine() */
/* -------------------------------------------------------------------------------- */
/* Сменить распорядок дня Npc */
/* Не использовать в функции глобальную переменную "self", так как функция */
/* AI_ContinueRoutine() ее заблокирует */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Истанция Npc которому изменяют гильдию */
/* newGuild - Гильдия */
/* -------------------------------------------------------------------------------- */
func void B_ExchangeRoutine(var int npcInstance, var string newRoutine)
{
// Вывести в zSpy строку "B_ExchangeRoutine"
PrintDebugNpc (PD_ZS_DETAIL, "B_ExchangeRoutine");
// Создаем локальную переменную на C_Npc
var C_Npc npc;
// Получаем Npc
npc = Hlp_GetNpc(npcInstance);
// Меняем распорядок дня Npc
Npc_ExchangeRoutine(npc, newRoutine);
// Начинаем выполнение нового распорядка дня
AI_ContinueRoutine (npc);
};
/* -------------------------------------------------------------------------------- */
/* B_SetPermAttitude() */
/* -------------------------------------------------------------------------------- */
/* Функция смены постоянного отношения Npc к ГГ */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Истанция Npc для которого изменяют постоянное отношение */
/* newAttitude - Отношение */
/* -------------------------------------------------------------------------------- */
func void B_SetPermAttitude(var int npcInstance, var int newAttitude)
{
// Вывести в zSpy строку "B_SetPermAttitude"
PrintDebugNpc (PD_ZS_DETAIL, "B_SetPermAttitude");
// Создаем локальную переменную на C_Npc
var C_Npc npc;
// Получаем Npc
npc = Hlp_GetNpc(npcInstance);
// Устанавливаем постоянное отношение
Npc_SetAttitude (npc, newAttitude);
// Устанавливаем временное отношение
Npc_SetTempAttitude (npc, newAttitude);
};
/* -------------------------------------------------------------------------------- */
/* B_LogEntry() */
/* -------------------------------------------------------------------------------- */
/* Функция новой записи в журнале с выводом сообщения на экран */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Истанция Npc для которого изменяют постоянное отношение */
/* newAttitude - Отношение */
/* -------------------------------------------------------------------------------- */
func void B_LogEntry(var string topic, var string entry)
{
// Вывести в zSpy строку "B_LogEntry"
PrintDebugNpc (PD_ZS_DETAIL, "B_LogEntry");
// Сделать в теме "topic" новую запись "entry"
Log_AddEntry (topic, entry);
// Вывести на экран сообщение "Новая запись в дневнике"
PrintScreen (NAME_NewLogEntry, -1,_YPOS_MESSAGE_LOGENTRY,"font_old_10_white.tga",_TIME_MESSAGE_LOGENTRY);
// Проиграть музыку записи в дневнике
Snd_Play ("LogEntry");
};
/* -------------------------------------------------------------------------------- */
/* B_ClearImmortal() */
/* -------------------------------------------------------------------------------- */
/* Функция снимает с Npc флаг бессмертия */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Истанция Npc для которого изменяют постоянное отношение */
/* -------------------------------------------------------------------------------- */
func void B_ClearImmortal(var int npcInstance)
{
// Вывести в zSpy строку "B_ClearImmortal"
PrintDebugNpc (PD_ZS_DETAIL, "B_ClearImmortal");
// Создаем локальную переменную C_Npc
var C_Npc npc;
// Получаем Npc
npc = Hlp_GetNpc(npcInstance);
// Снимаем все флаги
npc.flags = 0;
};
/* -------------------------------------------------------------------------------- */
/* B_SetNpcType() */
/* -------------------------------------------------------------------------------- */
/* Функция установки типа Npc */
/* -------------------------------------------------------------------------------- */
/* npcInstance - Инстанция Npc для которого меняют тип */
/* newNpctype - Тип Npc */
/* -------------------------------------------------------------------------------- */
func void B_SetNpcType(var int npcInstance, var int newNpctype)
{
// Вывести в zSpy строку "B_SetNpcType"
PrintDebugNpc (PD_ZS_DETAIL, "B_SetNpcType");
// Создаем локальную переменную C_Npc
var C_Npc npc;
// Получаем Npc
npc = Hlp_GetNpc(npcInstance);
// Устанавливаем новый тип Npc
npc.npctype = newNpctype;
};
/* -------------------------------------------------------------------------------- */
/* B_GiveInvItems() */
/* -------------------------------------------------------------------------------- */
/* Функция передачи объекта от одного Npc другому */
/* -------------------------------------------------------------------------------- */
/* giver - Дающий Npc */
/* taker - Берущий Npc */
/* itemInstance - Передаваемый объект */
/* amount - Количество */
/* -------------------------------------------------------------------------------- */
func void B_GiveInvItems(var C_Npc giver, var C_Npc taker, var int itemInstance, var int amount)
{
// Вывести в zSpy строку "B_GiveInvItems"
PrintDebugNpc (PD_ZS_DETAIL, "B_GiveInvItems");
// Удалить у дающего Npc предмет инвентаря
Npc_RemoveInvItems (giver, itemInstance, amount);
// Создать в инвентаре Npc предмет инвентаря
CreateInvItems (taker, itemInstance, amount);
// Создаем локальную переменную для сообщения
var string msg;
// Если Npc giver - ГГ
if Npc_IsPlayer(giver)
{
// Если предмет - "Руда"
if (itemInstance == ItMiNugget)
{
// Создаем строку с указанием количества отданной руды
msg = ConcatStrings(IntToString(amount), _STR_MESSAGE_ORE_GIVEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_GIVEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
}
// Иначе
else
{
// Если передается 1 предмет и это не руда
if amount == 1
{
// Создаем строку "Отдан 1 предмет"
msg = ConcatStrings(IntToString(amount), _STR_MESSAGE_ITEM_GIVEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_GIVEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
}
// Иначе
else
{
// Создаем строку "Отдано предметов: [Amount]"
msg = ConcatStrings(IntToString(amount),_STR_MESSAGE_ITEMS_GIVEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_GIVEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};
}
// Иначе если Npc 'taker' - ГГ
else if Npc_IsPlayer(taker)
{
// Если предмет - Руда
if (itemInstance == ItMiNugget)
{
// Создаем строку с указанием количества полученной руды
msg = ConcatStrings(IntToString(amount), _STR_MESSAGE_ORE_TAKEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_TAKEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_TAKEN);
}
// Иначе
else
{
// Если получается 1 предмет и это не руда
if amount == 1
{
// Создаем строку "Получен 1 предмет"
msg = ConcatStrings(IntToString(amount), _STR_MESSAGE_ITEM_TAKEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_TAKEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_TAKEN);
}
// Иначе
else
{
// Создаем строку "Получено предметов: [Amount]"
msg = ConcatStrings(IntToString(amount),_STR_MESSAGE_ITEMS_TAKEN);
// Выводим строку на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_TAKEN,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_TAKEN);
};
};
};
};
/* -------------------------------------------------------------------------------- */
/* B_CheckForImportantInfo() */
/* -------------------------------------------------------------------------------- */
/* Функция проверки Npc на готовность к диалогу */
/* - У Npc есть информация */
/* - ГГ не находится в неподходящем состоянии тела */
/* - ГГ является человеком */
/* - ГГ в данный момент не разговаривает */
/* -------------------------------------------------------------------------------- */
/* slf - Npc с диалогом */
/* oth - ГГ */
/* -------------------------------------------------------------------------------- */
/* Возвращаемые значения: */
/* True - Npc готов к диалогу */
/* False - Npc не готов к диалогу */
/* -------------------------------------------------------------------------------- */
func int B_CheckForImportantInfo (var C_Npc slf, var C_Npc oth)
{
// Вывести в zSpy строку "B_CheckForImportantInfo"
PrintDebugNpc (PD_ZS_FRAME, "B_CheckForImportantInfo");
// Если Npc в данный момент не разговаривает с другим Npc И Npc является человеком
if ((oth.aivar[AIV_INVINCIBLE] == FALSE) && C_NpcIsHuman(oth))
{
// ГГ не находится в состоянии разговора
PrintDebugNpc (PD_ZS_CHECK, "...PC does not speak!");
// Создаем локальную переменную C_Npc для ГГ
var C_Npc her;
// Получаем ГГ
her = Hlp_GetNpc(PC_Hero);
// Создаем локальную переменную C_Npc для Рокфеллера
var C_Npc rock;
// Получаем Npc Рокфеллера
rock = Hlp_GetNpc(PC_Rockefeller);
// Если Npc 'her' не является ГГ И Npc 'rock' не является ГГ
if ((Hlp_GetInstanceID(her)!=Hlp_GetInstanceID(Hero))&&(Hlp_GetInstanceID(rock)!=Hlp_GetInstanceID(Hero)) )
{
// Npc не готов к диалогу
return False;
};
// Если у Npc есть информация
if Npc_CheckInfo(slf,1)
{
// Выводим в zSpy строку "Выдать важную информацию"
PrintDebugNpc (PD_ZS_CHECK, "...give important info!");
// Если ГГ НЕ находится в прыжке ИЛИ Npc находится в состоянии охраны прохода ИЛИ Npc находился в состоянии охраны прохода
//if (!C_BodyStateContains(oth,BS_JUMP)) || Npc_IsInState(slf, ZS_GuardPassage) || Npc_WasInState(slf,ZS_GuardPassage)
//{
// Вывести в zSpy сообщение "ГГ не прыгает или НПС охранник"
PrintDebugNpc (PD_ZS_CHECK, "...PC does not jump or NPC is guard gear!");
// Если Npc 'oth' не находится в состоянии падения
if (!C_BodyStateContains(oth,BS_FALL))
{
// Вывести в zSpy сообщение "...не летает"
PrintDebugNpc (PD_ZS_CHECK, "...don't fly!");
// Если Npc 'oth' не находится в состоянии "Плавания"
if (!C_BodyStateContains(oth,BS_SWIM))
{
// Вывести в zSpy сообщение "...не плавает"
PrintDebugNpc (PD_ZS_CHECK, "...does not swim!");
// Если Npc 'oth' не находится в состоянии "Подводного плавания"
if (!C_BodyStateContains(oth,BS_DIVE))
{
// Вывести в zSpy сообщение "...не плавает под водой"
PrintDebugNpc (PD_ZS_CHECK, "...does not dive!");
// Диалог выполняется на основе информации со свойством Important
hero.aivar [AIV_IMPORTANT] = True;
// Останавливаем движение Npc 'oth'
B_FullStop (oth);
// Если Npc 'slf' сидит ИЛИ не видит ГГ
if (C_BodystateContains(slf, BS_SIT)) || (!Npc_CanSeeNpc(self, hero))
{
// Очистить очередь AI команд
Npc_ClearAIQueue(slf);
// Npc 'slf' встает
AI_StandUp(slf);
}
// Иначе
else
{
// Прерываем всю проигрываемую анимацию Npc 'slf'
B_FullStop (slf);
};
// Переводим Npc 'slf' в состояние разговора
AI_StartState (slf, ZS_Talk, 0, "");
// Отключаем восприятие "Восприятие в сражении"
Npc_PercDisable (slf, PERC_ASSESSFIGHTER);
// Npc готов к диалогу
return True;
};
};
};
//};
};
};
// Npc не готов к диалогу
return False;
};
/* -------------------------------------------------------------------------------- */
/* B_InitGuildAttitudes() */
/* -------------------------------------------------------------------------------- */
/* Функция смены или сброса таблицы отношений между гильдиями */
/* -------------------------------------------------------------------------------- */
func void B_InitGuildAttitudes ()
{
// Вывести в zSpy строку "B_InitGuildAttitudes"
PrintDebugNpc (PD_ZS_FRAME, "B_InitGuildAttitudes");
// Если глава меньше или равна 3
if (Kapitel <= 3)
{
// Установить стандартные отношения гильдий
Wld_ExchangeGuildAttitudes ("GIL_ATTITUDES");
}
// Иначе
else
{
// Установить отношения между гильдиями для 4-ой главый
Wld_ExchangeGuildAttitudes ("GIL_ATTITUDES_FMTAKEN");
};
};
/* -------------------------------------------------------------------------------- */
/* B_PracticeCombat() */
/* -------------------------------------------------------------------------------- */
/* Воспроизвести обучающую анимацию в указанной WP */
/* -------------------------------------------------------------------------------- */
/* hero - Обучающийся персонаж ГГ */
/* self - Npc учитель */
/* waypoint - Целевой Waypoint на котором проводится обучение */
/* -------------------------------------------------------------------------------- */
func void B_PracticeCombat (var string waypoint)
{
// Вывести в zSpy строку "B_PracticeCombat"
PrintDebugNpc (PD_ZS_FRAME, "B_PracticeCombat");
// Игровая камера постоянно направленна на учитилея и теряет из поля зрения ГГ! Очень запутанно, так что лучше не использовать.
/*
// Если расстояние между Npc 'self' и Waypoint меньше 10 метров
if (Npc_GetDistToWP(self, waypoint) < 1000)
{
// Переводим Npc hero в режим "Ходьба"
AI_SetWalkmode (hero, NPC_WALK);
// ГГ идет на указанный Waypoint
AI_GotoWP (hero, waypoint);
// Учитель поворачивается к ГГ
AI_TurnToNpc (self, hero);
// ГГ экипирует лучшее оружие
AI_EquipBestMeleeWeapon (hero);
// ГГ достает лучшее оружие
AI_DrawWeapon (hero);
// ГГ проигрывает анимацию "Тренировка с мечом"
AI_PlayAni (hero, "T_1HSFREE");
// ГГ прячет оружие
AI_RemoveWeapon (hero);
// ГГ переходит в режим перемещения "Ходьба"
AI_SetWalkmode (hero, NPC_WALK);
// ГГ подходит к Учителю
AI_GotoNpc (hero, self);
// Учитель поворачивается к ГГ
AI_TurnToNpc (self, hero);
};
*/
};
/* -------------------------------------------------------------------------------- */
/* B_PrintGuildCondition() */
/* -------------------------------------------------------------------------------- */
/* Функция вывода сообщения о том, какого уровня должен быть ГГ чтобы его приняли */
/* в какую-либо гильдию */
/* -------------------------------------------------------------------------------- */
/* level - Необходимый уровень для обучения */
/* -------------------------------------------------------------------------------- */
func void B_PrintGuildCondition (var int level)
{
// Вывести в zSpy строку "B_PrintGuildCondition"
PrintDebugNpc (PD_ZS_FRAME, "B_PrintGuildCondition");
// Создаем локальную переменную для хранения сообщений
var string msg;
// Создаем сообщение "Условие принятия: [level] уровень"
msg = ConcatStrings(_STR_MESSAGE_Joincamp, IntToString(level));
// Выводим сообщение на экран
PrintScreen (msg, -1,_YPOS_MESSAGE_Joincamp,"font_old_10_white.tga",_TIME_MESSAGE_Joincamp);
};
Информационное окноx