|
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 можно удалить из скриптов, по причине его абсолютной бесполезности.
|