|
Re: Уроки скриптологии
Внимание - неточность!!!
В описании AI констант вместо: const int AIV_ToughGuy * * * * * * * * * * *= 57; * //TRUE, если НПС является крутым парнем ... const int AIV_StoryBandit_Esteban * * * * * = 75; * //Эстебан ... const int FAI_NAILED * * * * * * * * * *= 1; * *//Полуживой
необходимо читать: const int AIV_ToughGuy * * * * * * * * * * *= 57; * //TRUE, если НПС имеет дело с "крутым парнем" ... const int AIV_StoryBandit_Esteban * * * * * = 75; * //НПС является охранником Эстебана ... const int FAI_NAILED * * * * * * * * * *= 1; * *//Тактика сражения охранников крепостных стен
Если модераторам не трудно, то можно поправить эти строки в посте №140, а последнюю константу в посте №141.
// ************************************************** ********** // Функция реакции НПС, наблюдающего сражение двух других НПС // ------------------------------------------------------------ // Вызывается как реакция на пассивное восприятие PERC_ASSESSFIGHTSOUND // ************************************************** **********
func void B_AssessFightSound() { * *// self - свидетель, other - нападающий, victim - жертва * *// если жертва отсутствует * *if(!Hlp_IsValidNpc(victim)) * *{ * * * *return; * *}; * *// если расстояния между (свидетелем и жертвой) и (свидетелем и нападающим) > макс. дальности действия пассивного восприятия * *if(Npc_GetDistToNpc(self,victim) > PERC_DIST_INTERMEDIAT) && (Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) * *{ * * * *// если (свидетель чужеземец или бандит) и (гильдии жертвы и свидетеля одинаковы или гильдии нападающего и свидетеля одинаковы) * * * *if((self.guild == GIL_OUT) ¦¦ (self.guild == GIL_BDT)) && ((victim.guild == self.guild) ¦¦ (other.guild == self.guild)) * * * *{ * * * * * *// продолжение анализа * * * *} * * * *else * * * *{ * * * * * *return; * * * *}; * *}; * *// если свидетель боится воды * *if(self.aivar[AIV_MM_FollowInWater] == FALSE) * *{ * * * *// если нападающий плывет или ныряет или жертва плывет или ныряет * * * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE) * * * *¦¦ C_BodyStateContains(victim,BS_SWIM) ¦¦ C_BodyStateContains(victim,BS_DIVE)) * * * *{ * * * * * *return; * * * *}; * *}; * *// если нападающий или жертва являются охранниками крепостных стен * *if(other.fight_tactic == FAI_NAILED) ¦¦ (victim.fight_tactic == FAI_NAILED) * *{ * * * *return; * *}; * *// если расстояние по высоте между свидетелем и нападающим и свидетелем и жертвой > расстояния реакции по высоте * *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT) && (Npc_GetHeightToNpc(self,victim) > PERC_DIST_HEIGHT) * *{ * * * *return; * *}; * *// если расстояние по высоте между свидетелем и нападающим > 5м и свидетель находится не более чем в 30м от "NW_MONASTERY_PLACE_04" (точка перед входом в главное здание монастыря) * *if(Npc_GetHeightToNpc(self,other) > 500) && (Npc_GetDistToWP(self,"NW_MONASTERY_PLACE_04") <= 3000) * *{ * * * *return; * *}; * *// если жертва наблюдатель или нападающий наблюдатель (мое примечание: если это условие перенести вторым в теле функции, то общее быстродействие увеличится) * *if(Hlp_GetInstanceID(victim) == Hlp_GetInstanceID(self)) ¦¦ (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(self)) * *{ * * * *return; * *}; * *// если жертва овца и она атакована не "крутым парнем" * *if(victim.guild == GIL_SHEEP) && (victim.aivar[AIV_ToughGuy] == FALSE) * *{ * * * *// если есть причина свидетеля атаковать нападающего на овец * * * *if(C_WantToAttackSheepKiller(self,other)) * * * *{ * * * * * *// свидетель атакует нападающего на овец * * * * * *B_Attack(self,other,AR_SheepKiller,0); * * * * * *return; * * * *} * * * *else // в противном случае * * * *{ * * * * * *// если свидетель охранник ворот * * * * * *if(C_NpcIsGateGuard(self)) * * * * * *{ * * * * * * * *// свидетель запоминает новость, что было нападение на овцу * * * * * * * *B_MemorizePlayerCrime(self,other,CRIME_SHEEPKILLE R); * * * * * * * *return; * * * * * *}; * * * *}; * * * *return; * *}; * *// если свидетель охранник ворот * *if(C_NpcIsGateGuard(self)) * *{ * * * *return; * *}; * *// если нападающий и жертва монстры * *if(other.guild > GIL_SEPERATOR_HUM) && (victim.guild > GIL_SEPERATOR_HUM) * *{ * * * *return; * *}; * *// если нападающий монстр и свидетель не враг жертве * *if(other.guild > GIL_SEPERATOR_HUM) && (Npc_GetAttitude(self,victim) != ATT_HOSTILE) * *{ * * * *// свидетель атакует монстра * * * *B_Attack(self,other,AR_MonsterVsHuman,0); * * * *return; * *}; * *// если жертва монстр и свидетель не враг нападающему и жертва жива * *if(victim.guild > GIL_SEPERATOR_HUM) && (Npc_GetAttitude(self,other) != ATT_HOSTILE) && (!Npc_IsDead(victim)) * *{ * * * *// свидетель атакует жертву (помогает нападающему) * * * *B_Attack(self,victim,AR_MonsterVsHuman,0); * * * *return; * *}; * *// если у свидетеля врагов не было * *if(self.aivar[AIV_EnemyOverride] == TRUE) * *{ * * * * *// теперь у свидетеля есть враг * * * *self.aivar[AIV_EnemyOverride] = FALSE; * * * *// свидетелю разрешено воспринимать все объекты в зоне действия восприятия * * * *Npc_PerceiveAll(self); * * * *// поиск свидетелем цели * * * *Npc_GetNextTarget(self); * * * * * *// если нападающий существует и он не бессознателен * * * *if(Hlp_IsValidNpc(other)) && (!C_NpcIsDown(other)) * * * *{ * * * * * *// свидетель атакует нападающего * * * * * *B_Attack(self,other,AR_GuildEnemy,0); * * * * * *return; * * * *}; * * * *return; * *}; * *// -------------------------------------------------- * *// Дальше нападающий и жертва являются только людьми! * *// -------------------------------------------------- * *// если нападающий ГГ является переодетым бандитом или жертва ГГ является переодетым бандитом * *if((C_PlayerIsFakeBandit(self,other) == TRUE) ¦¦ (C_PlayerIsFakeBandit(self,victim) == TRUE)) * *// и (нападающий бандит или жертва бандит) * *&& ((other.guild == GIL_BDT) || (victim.guild == GIL_BDT)) * *{ * * * *// если свидетель бандит * * * *if(self.guild == GIL_BDT) * * * *{ * * * * * *// если свидетель и нападающий являются охранниками Эстебана * * * * * *if(self.aivar[AIV_STORYBANDIT_ESTEBAN] == TRUE) && (other.aivar[AIV_STORYBANDIT_ESTEBAN] == TRUE) * * * * * *{ * * * * * * * *// свидетель атакует жертву * * * * * * * *B_Attack(self,victim,AR_NONE,0); * * * * * * * *return; * * * * * *}; * * * * * *// если свидетель и жертва являются охранниками Эстебана * * * * * *if(self.aivar[AIV_STORYBANDIT_ESTEBAN] == TRUE) && (victim.aivar[AIV_STORYBANDIT_ESTEBAN] == TRUE) * * * * * *{ * * * * * * * *// свидетель атакует нападающего * * * * * * * *B_Attack(self,other,AR_NONE,0); * * * * * * * *return; * * * * * *}; * * * * * *// если нападающий и жертва не имели причины для сражения * * * * * *if(other.aivar[AIV_ATTACKREASON] == AR_NONE) && (victim.aivar[AIV_ATTACKREASON] == AR_NONE) * * * * * *{ * * * * * * * *// очистка очереди состояний свидетеля * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// очистка восприятий свидетеля * * * * * * * *B_ClearPerceptions(self); * * * * * * * *// перевод свидетеля в состояние наблюдения на сражением * * * * * * * *AI_StartState(self,ZS_WatchFight,0,""); * * * * * * * *return; * * * * * *}; * * * * * *// если нападающий или жертва являются свободными (с которыми можно сражаться) бандитами * * * * * *if(other.aivar[AIV_StoryBandit] == TRUE) ¦¦ (victim.aivar[AIV_StoryBandit] == TRUE) * * * * * *{ * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *B_ClearPerceptions(self); * * * * * * * *// перевод свидетеля в состояние наблюдения на сражением * * * * * * * *AI_StartState(self,ZS_WatchFight,0,""); * * * * * * * *return; * * * * * *}; * * * *} * * * *else // иначе (свидетель не бандит) * * * *{ * * * * * *// продолжение анализа * * * *}; * *}; * *// если нападающий имел причину для сражения * *if((other.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) * * // охрана ворот атакует незваного гостя * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate) *// охрана ворот атакует враждебного монстра * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) *// человек убил человека * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) * * * * *// НПС является врагом гильдии * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill)) *// охрана вызвана по факту убийства * *// и свидетель друг нападающему * *&& (Npc_GetAttitude(self,other) == ATT_FRIENDLY) * *{ * * * *// свидетель атакует жертву * * * *B_Attack(self,victim,AR_GuardCalledToKill,0); * * * *return; * *}; * *// тоже самое, что и выше, только свидетель помогает жертве * *if((victim.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill)) * *&& (Npc_GetAttitude(self,victim) == ATT_FRIENDLY) * *{ * * * *B_Attack(self,other,AR_GuardCalledToKill,0); * * * *return; * *}; * *// если нападающий имел причину для сражения * *if((other.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight) * * * *// охрана прекратила атаковать преступника * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_ReactToDamage) * * * // преступник ранил НПС * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)) * * *// преступник не убрал оружие после двукратного предупреждения или пустился в бега * *// свидетель друг нападающему * *&& (Npc_GetAttitude(self,other) == ATT_FRIENDLY) * *{ * * * *// если нападающий ополченец или охотник на драконов или не принадлежит к гильдиям * * * *if((other.guild == GIL_SLD) ¦¦ (other.guild == GIL_DJG) ¦¦ (other.guild == GIL_NONE)) * * * *// и если жертва ополченец или охотник на драконов или не принадлежит к гильдиям * * * *&& ((victim.guild == GIL_SLD) ¦¦ (victim.guild == GIL_DJG) ¦¦ (victim.guild == GIL_NONE)) * * * *{ * * * * * *// продолжение анализа * * * *} * * * *// иначе, если нападающий и жертва не ГГ * * * *else if(!Npc_IsPlayer(other)) && (!Npc_IsPlayer(victim)) * * * *{ * * * * * *// продолжение анализа * * * *} * * * *else // иначе * * * *{ * * * * * *// свидетель атакует жертву * * * * * *B_Attack(self,victim,AR_GuardStopsFight,0); * * * * * *return; * * * *}; * *}; * * *// тоже самое, что и предыдущий if, только свидетель помогает жертве * *if((victim.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_ReactToDamage) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)) * *&& (Npc_GetAttitude(self,victim) == ATT_FRIENDLY) * *{ * * * *if((other.guild == GIL_SLD) ¦¦ (other.guild == GIL_DJG) ¦¦ (other.guild == GIL_NONE)) * * * *&& ((victim.guild == GIL_SLD) ¦¦ (victim.guild == GIL_DJG) ¦¦ (victim.guild == GIL_NONE)) * * * *{ * * * *} * * * *else if(!Npc_IsPlayer(other)) && (!Npc_IsPlayer(victim)) * * * *{ * * * *} * * * *else * * * *{ * * * * * *// свидетель атакует нападающего * * * * * *B_Attack(self,other,AR_GuardStopsFight,0); * * * * * *return; * * * *}; * *}; * *// если нападающий не имел причины к нападению или причиной было убийство НПС ГГ * *if((other.aivar[AIV_ATTACKREASON] == AR_NONE) ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_KILL)) * *// и если жертва не имела причины к нападению или причиной было убийство НПС ГГ * *&& ((victim.aivar[AIV_ATTACKREASON] == AR_NONE) ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_KILL)) * *// и свидетель милиция * *&& (self.guild == GIL_MIL) * *{ * * * *// если свидетель друг нападающему и свидетель не друг жертве * * * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY) && (Npc_GetAttitude(self,victim) != ATT_FRIENDLY) * * * *{ * * * * * *// свидетель атакует жертву * * * * * *B_Attack(self,victim,AR_GuardStopsFight,0); * * * * * *return; * * * *} * * * *// иначе, если свидетель друг жертве и свидетель не друг нападающему * * * *else if(Npc_GetAttitude(self,victim) == ATT_FRIENDLY) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY) * * * *{ * * * * * *// свидетель атакует нападающего * * * * * *B_Attack(self,other,AR_GuardStopsFight,0); * * * * * *return; * * * *} * * * *else // иначе (или оба друга или оба не друга) * * * *{ * * * * * *// если нападающий ГГ * * * * * *if(Npc_IsPlayer(other)) * * * * * *{ * * * * * * * *// свидетель атакует жертву * * * * * * * *B_Attack(self,victim,AR_GuardStopsFight,0); * * * * * * * *return; * * * * * *} * * * * * *// иначе, если жертва ГГ * * * * * *else if(Npc_IsPlayer(victim)) * * * * * *{ * * * * * * * *// свидетель атакует нападающего * * * * * * * *B_Attack(self,other,AR_GuardStopsFight,0); * * * * * * * *return; * * * * * *} * * * * * *else // иначе * * * * * *{ * * * * * * * *// свидетель атакует нападающего * * * * * * * *B_Attack(self,other,AR_GuardStopsFight,0); * * * * * * * *return; * * * * * *}; * * * *}; * *}; * *// ***** помощь нападающему, сражающемуся с вором ***** * *// если нападающий имел причину для сражения * *if((other.aivar[AIV_ATTACKREASON] == AR_UseMob) * * * * * * // использование чужого МОВа * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_Theft) * * * * * // воровство * * * ¦¦ (other.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)) // вход в чужое помещение * *// и свидетель друг нападающему * *&& (Npc_GetAttitude(self,other) == ATT_FRIENDLY) * *{ * * * *// если у свидетеля есть причина атаковать вора жертву * * * *if(C_WantToAttackThief(self,victim)) * * * *{ * * * * * *// свидетель атакует жертву * * * * * *B_Attack(self,victim,AR_GuardCalledToThief,0); * * * *}; * * * *return; * *}; * * *// ***** помощь жертве, сражающейся с вором ***** * *// аналогично предыдущему if * *if((victim.aivar[AIV_ATTACKREASON] == AR_UseMob) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_Theft) * * * ¦¦ (victim.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)) * *&& (Npc_GetAttitude(self,victim) == ATT_FRIENDLY) * *{ * * * *if(C_WantToAttackThief(self,other)) * * * *{ * * * * * *B_Attack(self,other,AR_GuardCalledToThief,0); * * * *}; * * * *return; * *}; * * *// если нападающий имел причину для сражения как защита своего помещения и свидетель друг нападающему * *if(other.aivar[AIV_ATTACKREASON] == AR_ClearRoom) && (Npc_GetAttitude(self,other) == ATT_FRIENDLY) * *{ * * * *// свидетель атакует жертву * * * *B_Attack(self,victim,AR_GuardCalledToRoom,0); * * * *return; * *}; * * *// аналогично предыдущему, только свидетель помогает жертве * *if(victim.aivar[AIV_ATTACKREASON] == AR_ClearRoom) && (Npc_GetAttitude(self,victim) == ATT_FRIENDLY) * *{ * * * *B_Attack(self,other,AR_GuardCalledToRoom,0); * * * *return; * *}; * * *// если расстояния между (свидетелем и жертвой) и (свидетелем и нападающим) > макс. дальности действия пассивного восприятия * *if(Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) && (Npc_GetDistToNpc(self,victim) > PERC_DIST_INTERMEDIAT) * *{ * * * *return; * *}; * *// если свидетель враг нападающему или жертве * *if(Npc_GetAttitude(self,other) == ATT_HOSTILE) ¦¦ (Npc_GetAttitude(self,victim) == ATT_HOSTILE) * *{ * * * *// если свидетель бандит * * * *if(self.guild == GIL_BDT) * * * *{ * * * * * *// продолжение анализа * * * *} * * * *else * * * *{ * * * * * *return; * * * *}; * *}; * *// если свидетель не видит по прямой жертву * *if(!Npc_CanSeeNpcFreeLOS(self,victim)) * *{ * * * * * * *return; * *}; * *// очистка очереди состояний свидетеля * *Npc_ClearAIQueue(self); * *// очистка восприятий свидетеля * *B_ClearPerceptions(self); * *// перевод свидетеля в состояние наблюдения на сражением * *AI_StartState(self,ZS_WatchFight,0,""); * *return; };
|