Показать сообщение отдельно
Старый 13.02.2005, 13:34   #99
Vam

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

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

// ************************************************** **
// Функция реакции НПС на важную информацию для разговора
// ----------------------------------------------------
// Вызывается в качестве реакции на пассивное восприятие PERC_ASSESSTALK
// ************************************************** **

func void B_AssessTalk()
{
* *// other - НПС приемник информации (обычно ГГ), self - НПС источник информации

* *// Тестовый кусок (можно выкинуть из скрипта) [не рассматриваю]
* *var C_NPC PCL;
* *// Инспектор уровня
* *PCL = Hlp_GetNpc(PC_Levelinspektor);
* *var C_NPC PCR;
* *// Рокфеллер
* *PCR = Hlp_GetNpc(PC_Rockefeller);
* *// если приемник информации Инспектор уровня или Рокфеллер
* *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL)) ¦¦ (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCR))
* *{
* * * *PrintScreen(ConcatStrings("Stimme: ",IntToString(self.voice)),-1,70,FONT_Screen,2);
* * * *PrintScreen("KEIN HERO!",-1,-1,FONT_Screen,2); *
* * * *PrintScreen(IntToString(self.aivar[AIV_FollowDist]),-1,70,FONT_Screen,2);
* * * *if(C_NpcIsInQuarter(self) == Q_KASERNE)
* * * *{
* * * * * *PrintScreen("Q_KASERNE",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_GALGEN)
* * * *{
* * * * * *PrintScreen("Q_GALGEN",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_MARKT)
* * * *{
* * * * * *PrintScreen("Q_MARKT",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_TEMPEL)
* * * *{
* * * * * *PrintScreen("Q_TEMPEL",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_UNTERSTADT)
* * * *{
* * * * * *PrintScreen("Q_UNTERSTADT",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_HAFEN)
* * * *{
* * * * * *PrintScreen("Q_HAFEN",-1,30,FONT_Screen,2);
* * * *};
* * * *if(C_NpcIsInQuarter(self) == Q_OBERSTADT)
* * * *{
* * * * * *PrintScreen("Q_OBERSTADT",-1,30,FONT_Screen,2);
* * * *};
* * * *return;
* *};
* *
* *// Нормальное начала функции
* *// если источник информации монстр
* *if(self.guild > GIL_SEPERATOR_HUM)
* *{
* * * *// если монстр не имеет важной информации
* * * *if(Npc_CheckInfo(self,1) == FALSE)
* * * *{
* * * * * *// если монстру вообще нечего сказать
* * * * * *if(Npc_CheckInfo(self,0) == FALSE)
* * * * * *{
* * * * * * * *return;
* * * * * *};
* * * *};
* *};
* *// если источник информации человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *
* * * *// если НПС источник информации враг ГГ
* * * *if(B_AssessEnemy())
* * * *{
* * * * * *return;
* * * *};
* * * *// если НПС источник информации знает, что ГГ убийца и у него есть причина атакоывать убийцу
* * * *if(B_GetPlayerCrime(self) == CRIME_MURDER) && (C_WantToAttackMurder(self,other))
* * * *{
* * * * * *// источник информации атакует ГГ убийцу
* * * * * *B_Attack(self,other,AR_HumanMurderedHuman,0); *
* * * * * *return;
* * * *};
* * * *// если ГГ переодетый бандит и источник информации не бандит
* * * *if(C_PlayerIsFakeBandit(self,other) == TRUE) && (self.guild != GIL_BDT)
* * * *{
* * * * * *// источник информации атакует ГГ
* * * * * *B_Attack(self,other,AR_GuildEnemy,0);
* * * * * *return;
* * * *};
* * * *// если ГГ отказался от разговора
* * * *if(C_RefuseTalk(self,other))
* * * *{
* * * * * *// если ГГ член подставной гильдии
* * * * * *ifC_PlayerHasFakeGuild(self,other)
* * * * * *{
* * * * * * * *// очистка очереди AI состояний источника информации
* * * * * * * *Npc_ClearAIQueue(self);
* * * * * * * *// источник информации переходит в конечное состояние комментирования подставной гильдии
* * * * * * * *AI_StartState(self,ZS_CommentFakeGuild,1,"");
* * * * * * * *return;
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// источник информации произносит SVM фразу "Оставь меня в покое!"
* * * * * * * *B_Say(self,other,"$NOTNOW");
* * * * * * * *return;
* * * * * *}; *
* * * *};
* *};
* *// если ГГ еще не говорил с источником информации
* *if(self.aivar[AIV_NpcStartedTalk] == FALSE)
* *{
* * * *// если источник идет или бежит
* * * *if(C_BodyStateContains(self,BS_WALK) ¦¦ C_BodyStateContains(self,BS_RUN))
* * * *{
* * * * * *// ГГ произносит SVM фразу "Подожди!"
* * * * * *B_Say(other,self,"$SC_HEYWAITASECOND");
* * * *}
* * * *// иначе, если источник информации не видит ГГ
* * * *else if(!Npc_CanSeeNpc(self,other))
* * * *{
* * * * * *var int rnd;
* * * * * *// генерация случайного числа от 0 до 99
* * * * * *rnd = Hlp_Random(100);
* * * * * *// ГГ призносит фразу
* * * * * *if(rnd <= 25) * * * { B_Say(other,self,"$SC_HEYTURNAROUND"); * *} * // звучит SVM фраза "Эй ты!"
* * * * * *else if (rnd <= 50) { B_Say(other,self,"$SC_HEYTURNAROUND02"); *} * // звучит SVM фраза "Эй ты!"
* * * * * *else if (rnd <= 75) { B_Say(other,self,"$SC_HEYTURNAROUND03"); *} * // звучит SVM фраза "Эй!"
* * * * * *else if (rnd <= 99) { B_Say(other,self,"$SC_HEYTURNAROUND04"); *}; *// звучит SVM фраза "Эй!"
* * * *};
* *};
* *// очистка очереди AI состояний источника информации
* *Npc_ClearAIQueue(self);
* *// очистка восприятий источника информации
* *B_ClearPerceptions(self); *
* *// если источник информации сидит
* *if(C_BodyStateContains(self,BS_SIT))
* *{
* * * *// если ГГ заговорил с источником информации
* * * *if(self.aivar[AIV_NpcStartedTalk] == TRUE)
* * * *{
* * * * * *// ГГ быстро останавливается
* * * * * *AI_StandUpQuick(other);
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// ГГ останавливается
* * * * * *AI_StandUp(other);
* * * *};
* * * *// если источник информации видит ГГ
* * * *if(Npc_CanSeeNpc(self,other))
* * * *{
* * * * * *// источник информации переходит в состояние разговора, оставаясь сидеть
* * * * * *AI_StartState(self,ZS_Talk,0,"");
* * * *} *
* * * *else // иначе (не видит ГГ)
* * * *{
* * * * * *// если источник информации наблюдал за ГГ
* * * * * *if(Npc_IsInState(self,ZS_ObservePlayer))
* * * * * *{
* * * * * * * *// источник информации встает
* * * * * * * *AI_StandUp(self);
* * * * * *};
* * * * * *// источник информации переходит в состояние разговора
* * * * * *AI_StartState(self,ZS_Talk,1,"");
* * * *};
* * * *return;
* *}
* *else // иначе (не сидит)
* *{
* * * *// если ГГ заговорил с источником информации
* * * *if(self.aivar[AIV_NpcStartedTalk] == TRUE)
* * * *{
* * * * * *// оба быстро останавливаются
* * * * * *AI_StandUpQuick(self);
* * * * * *AI_StandUpQuick(other);
* * * *}
* * * *else
* * * *{
* * * * * *// оба останавливаются
* * * * * *AI_StandUp(self);
* * * * * *AI_StandUp(other);
* * * *};
* * * *// источник информации переходит в состояние разговора
* * * *AI_StartState(self,ZS_Talk,0,"");
* * * *return;
* *};
};


// **************************************
// Функция реакции НПС перемещение МОВа
// --------------------------------------
// Вызывается ядром системы как реакция на пассивное восприятие PERC_MOVEMOB
// **************************************

func void B_MoveMob()
{ *
* *// self - НПС перемещающий МОВ (ГГ)
* *var string door;
* *// получить имя перемещаемого МОВа
* *door = Npc_GetDetectedMob(self);
* *// если МОВ дверь
* *if(Hlp_StrCmp(door,"DOOR"))
* *{
* * * *// если дверь закрыта
* * * *if(Wld_GetMobState(self,door) == 0)
* * * *{
* * * * * *// очистка очереди AI состояний ГГ
* * * * * *Npc_ClearAIQueue (self);
* * * * * *// ГГ открывает дверь
* * * * * *AI_UseMob(self,door,1);
* * * * * *// зафиксировать состояние двери
* * * * * *AI_UseMob(self,door,-1);
* * * *};
* *}
* *else // иначе
* *{
* * * *return;
* *};
* *// ГГ продолжает свои дела
* *AI_ContinueRoutine(self);
};


Конец 5 параграфа.
Вот и все основные восприятия, на которые реагируют люди, есть еще дополнительные восприятия, которые инициализируются в функциях состояний, их мы рассмотрим позже.
Все файлы активных и пассивных восприятий людей находятся в директории ..\AI\Human\B_Human\ и имеют имена эквивалентные функциям восприятий.
Файл восприятия магии находится в директории ..\AI\Magic\

Примечание: Файл ..\AI\Human\B_Human\B_AssessObserveSuspect.d можно удалить из скриптов, по причине его абсолютной бесполезности.
Ответить с цитированием