Показать сообщение отдельно
Старый 29.01.2005, 11:06   #88
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Уроки скриптологии

4. Инициализация восприятий.

Функции инициализации восприятий описаны в файле ..\AI_Intern\Perception.d

// **************************************************
// Устанавливается дальность действия восприятий НПС
// **************************************************

FUNC VOID InitPerceptions()
{
* *// Дальность действия всех активных восприятий определена константой PERC_DIST_ACTIVE_MAX, которая записывается в поле senses_range производной от класса C_Npc.
* *// PERC_ASSESSPLAYER - восприятие ГГ другими НПС
* *// PERC_ASSESSENEMY - восприятие одного НПС другим НПС, у которого установлен флаг ATT_HOSTILE (враг), если Temp_Att != GilAtt, то возмется Temp_Att.
* *// PERC_ASSESSBODY - восприятие НПС мертвого тела, в настоящее время используется только в Monster-AI функциях.
* *// PERC_ASSESSFIGHTER - восприятие НПС ГГ с поднятым оружием или восприятие НПС всех монстров (они всегда находятся в режиме Fightmode)
* *// PERC_ASSESSITEM - восприятие НПС предметов

* *// *** ВНИМАНИЕ *** Активное восприятие работает только в случае, если у НПС активированы одно или несколько чувств. Зона действия активных восприятий 180° перед НПС по радиусу PERC_DIST_ACTIVE_MAX.

* *// *** ВНИМАНИЕ *** Зона действия пассивных восприятий 360° вокруг НПС на заданное расстояние.

* *// Сражение
* *Perc_SetRange(PERC_ASSESSDAMAGE,9999); * * * * * * * * * * *//Посылается НПС, получившему повреждение. Дальность действия не используется.
* *Perc_SetRange(PERC_ASSESSOTHERSDAMAGE,PERC_DIST_I NTERMEDIAT); * //Посылается всем другим (other) НПС, если НПС получил повреждение
* *Perc_SetRange(PERC_ASSESSDEFEAT,WATCHFIGHT_DIST_M AX); * * * //Посылается всем другим НПС, если НПС находится в бессознательном состоянии
* *Perc_SetRange(PERC_ASSESSMURDER,PERC_DIST_ACTIVE_ MAX); * * *//Посылается всем другим НПС, если НПС умер
* *Perc_SetRange(PERC_ASSESSTHREAT,PERC_DIST_INTERME DIAT); * * //Посылается НПС в течении 2 секунд, если в него целится ГГ
* *Perc_SetRange(PERC_DRAWWEAPON,PERC_DIST_DIALOG); * * * * * *//Посылается всем другим НПС, если ГГ достает оружие

* *// Слух
* *Perc_SetRange(PERC_ASSESSFIGHTSOUND,3000); * * * * * * * * *//Посылается всем другим НПС, если НПС на кого-то нападает с оружием
* *Perc_SetRange(PERC_ASSESSQUIETSOUND,PERC_DIST_INT ERMEDIAT); //Посылается раз в секунду всем другим НПС, если ГГ идет или бежит, а так же, когда выброшен (уронен) какой либо предмет

* *// Воровство
* *Perc_SetRange(PERC_ASSESSTHEFT,PERC_DIST_INTERMED IAT); * * *//Посылается всем другим НПС, если ГГ украл какой-либо предмет. При карманной краже обворованному не посылается. При телекинезе посылается всем.
* *Perc_SetRange(PERC_ASSESSUSEMOB,PERC_DIST_INTERME DIAT); * * //Посылается всем другим НПС, если ГГ использует MOBsi
* *Perc_SetRange(PERC_ASSESSENTERROOM,PERC_DIST_INTE RMEDIAT); *//Посылается всем другим НПС, если ГГ входит в помещение

* *// Магия
* *Perc_SetRange(PERC_ASSESSMAGIC,9999); * * * * * * * * * * * //Посылается НПС, против которого применена магия
* *Perc_SetRange(PERC_ASSESSSTOPMAGIC,9999); * * * * * * * * * //Посылается НПС (жертве), если магия прекращает свое действие

* *// Разговор
* *Perc_SetRange(PERC_ASSESSTALK,PERC_DIST_DIALOG); * * * * * *//Посылается НПС, если у ГГ есть важная информация для разговора

* *// Взаимодействие НПС
* *Perc_SetRange(PERC_ASSESSWARN,PERC_DIST_INTERMEDI AT); * * * //Чисто скриптовое восприятие, кому посылаем, тот и реагирует

* *// Открытие дверей
* *Perc_SetRange(PERC_MOVEMOB,PERC_DIST_DIALOG); * * * * * * * //Посылается всем другим НПС, если ГГ открывает дверь (сундук)

* *// Превращение
* *Perc_SetRange(PERC_ASSESSSURPRISE,FIGHT_DIST_CANC EL); * * * //Посылается всем другим НПС, если ГГ превращается в себя из животного

* *// Не используются!
* *Perc_SetRange(PERC_OBSERVEINTRUDER,100); * * * * * * * * * *//Посылается всем другим НПС, если ГГ останавливается (кроме режима подкрадывания)
* *Perc_SetRange(PERC_ASSESSREMOVEWEAPON,100); * * * * * * * * //Посылается всем другим НПС, если ГГ прячет оружие
* *Perc_SetRange(PERC_CATCHTHIEF,100); * * * * * * * * * * * * //Посылается всем другим НПС, если ГГ пойман на карманной краже
* *Perc_SetRange(PERC_ASSESSCALL,100); * * * * * * * * * * * * //Посылается НПС, если ГГ призывает его к разговору (дальняя дистанция)
* *Perc_SetRange(PERC_MOVENPC,100); * * * * * * * * * * * * * *//Посылается всем другим НПС, если ГГ идет вместе с НПС
* *Perc_SetRange(PERC_ASSESSCASTER,100); * * * * * * * * * * * //Посылается всем другим НПС, если ГГ инвестирует ману
* *Perc_SetRange(PERC_NPCCOMMAND,100); * * * * * * * * * * * * //Чисто скриптовое восприятие, можно использовать по своему усмотрению
* *Perc_SetRange(PERC_OBSERVESUSPECT,100); * * * * * * * * * * //Посылается всем другим НПС, если ГГ подкрадывается (в движении)

* *//Мной не обнаружены упоминания о следующих восприятиях: PERC_ASSESSGIVENITEM, PERC_ASSESSFAKEGUILD
};

// ************************************************** ***********
// Установка функций реакций НПС на нормальный набор восприятий для людей
// ************************************************** ***********

func void Perception_Set_Normal()
{
* *// Активные чувства при каждом состоянии активизируются по-новому, т.к. они изменяются в функции ZS_Guide_Player
* *self.senses * * * * = * SENSE_HEAR ¦ SENSE_SEE;
* *self.senses_range * = * PERC_DIST_ACTIVE_MAX;

* *// Частота проверки активных восприятий
* *if(Npc_KnowsInfo(self,1) ¦¦ C_NpcIsGateGuard(self)) * * //НПС имеет важную информацию или НПС охраняет вход
* *{
* * * *Npc_SetPercTime(self,0.3); * * * * * * * * * * * * *//восприятия проверяются раз в 0.3 секунды
* *}
* *else
* *{
* * * *Npc_SetPercTime(self,1); * * * * * * * * * * * * * *//восприятия проверяются раз в секунду
* *};

* *// Активные восприятия (приоритет наивысший)
* *Npc_PercEnable(self,PERC_ASSESSPLAYER, * * *B_AssessPlayer);
* *Npc_PercEnable(self,PERC_ASSESSENEMY, * * * B_AssessEnemy);

* *// Пассивные восприятия (приоритет задается последовательностью регистрации)
* *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * B_AssessMagic);
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * *B_AssessDamage);
* *Npc_PercEnable(self,PERC_ASSESSMURDER, * * *B_AssessMurder);
* *Npc_PercEnable(self,PERC_ASSESSTHEFT, * * * B_AssessTheft);
* *Npc_PercEnable(self,PERC_ASSESSUSEMOB, * * *B_AssessUseMob);
* *Npc_PercEnable(self,PERC_ASSESSENTERROOM, * B_AssessPortalCollision);
* *Npc_PercEnable(self,PERC_ASSESSTHREAT, * * *B_AssessThreat);
* *Npc_PercEnable(self,PERC_DRAWWEAPON, * * * *B_AssessDrawWeapon);
* *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND, *B_AssessFightSound);
* *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND, *B_AssessQuietSound);
* *Npc_PercEnable(self,PERC_ASSESSWARN, * * * *B_AssessWarn);
* *Npc_PercEnable(self,PERC_ASSESSTALK, * * * *B_AssessTalk);
* *Npc_PercEnable(self,PERC_MOVEMOB, * * * * * B_MoveMob);
};

// ************************************************** ******************
// Установка функций реакций НПС на минимальный набор восприятий для людей (всегда должны быть активны)
// ************************************************** ******************

func void Perception_Set_Minimal()
{
* *self.senses * * * * = * SENSE_HEAR ¦ SENSE_SEE;
* *self.senses_range * = * PERC_DIST_ACTIVE_MAX;

* *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * B_AssessMagic);
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * *B_AssessDamage);
* *Npc_PercEnable(self,PERC_ASSESSMURDER, * * *B_AssessMurder);
* *Npc_PercEnable(self,PERC_ASSESSTHEFT, * * * B_AssessTheft);
* *Npc_PercEnable(self,PERC_ASSESSUSEMOB, * * *B_AssessUseMob);
* *Npc_PercEnable(self,PERC_ASSESSENTERROOM, * B_AssessPortalCollision);
};

// ************************************************** **********
// Закрытие реакций НПС slf на восприятия для людей и монстров
// ************************************************** **********

func void B_ClearPerceptions(var C_NPC slf)
{
* *Npc_PercDisable(slf,PERC_ASSESSPLAYER);
* *Npc_PercDisable(slf,PERC_ASSESSENEMY);

* *Npc_PercDisable(slf,PERC_ASSESSBODY);

* *Npc_PercDisable(slf,PERC_ASSESSMAGIC);
* *Npc_PercDisable(slf,PERC_ASSESSDAMAGE);
* *Npc_PercDisable(slf,PERC_ASSESSMURDER);
* *Npc_PercDisable(slf,PERC_ASSESSTHEFT);
* *Npc_PercDisable(slf,PERC_ASSESSUSEMOB);
* *Npc_PercDisable(slf,PERC_ASSESSENTERROOM);
* *Npc_PercDisable(slf,PERC_ASSESSTHREAT);
* *Npc_PercDisable(slf,PERC_DRAWWEAPON);
* *Npc_PercDisable(slf,PERC_ASSESSFIGHTSOUND);
* *Npc_PercDisable(slf,PERC_ASSESSQUIETSOUND);
* *Npc_PercDisable(slf,PERC_ASSESSWARN);
* *Npc_PercDisable(slf,PERC_ASSESSTALK);
* *Npc_PercDisable(slf,PERC_MOVEMOB);

* *Npc_PercDisable(slf,PERC_ASSESSOTHERSDAMAGE);
* *Npc_PercDisable(slf,PERC_ASSESSSTOPMAGIC);
* *Npc_PercDisable(slf,PERC_ASSESSSURPRISE);
};

// ************************************************** *******
// Установка функций реакций монстров и орков на восприятия
// ************************************************** *******

func void Perception_Set_Monster_Rtn()
{
* *Npc_SetPercTime(self,1); * * * * * * * *//частота проверки восприятия раз в секунду

* *Npc_PercEnable(self,PERC_ASSESSENEMY, * * * * * B_MM_AssessEnemy);
* *Npc_PercEnable(self,PERC_ASSESSBODY, * * * * * *B_MM_AssessBody);

* *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * * * B_AssessMagic);
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * * * *B_MM_AssessDamage);
* *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE, * *B_MM_AssessOthersDamage);
* *Npc_PercEnable(self,PERC_ASSESSMURDER, * * * * *B_MM_AssessOthersDamage);
* *Npc_PercEnable(self,PERC_ASSESSWARN, * * * * * *B_MM_AssessWarn);
};

Ответить с цитированием