Показать сообщение отдельно
Старый 11.02.2005, 10:07   #97
Vam

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

По умолчанию 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;
};

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