|
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); };
|