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

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

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

// *******************************************
// Выбор НПС оружия соответствующего цели
// *******************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- НПС агрессор
// oth *- НПС цель
// ======================================

func void B_SelectWeapon(var C_NPC slf,var C_NPC oth)
{
* *// если агрессор падает или плывет или ныряет
* *if(C_BodyStateContains(slf,BS_FALL)) ¦¦ (C_BodyStateContains(slf,BS_SWIM)) ¦¦ (C_BodyStateContains(slf,BS_DIVE))
* *{
* * * *return;
* *};
* *// если агрессор выбрал для использования магию
* *if(B_SelectSpell(slf,oth))
* *{
* * * *return;
* *};
* *// если агрессор находится в режиме сражения магией
* *if(Npc_IsInFightMode(slf,FMODE_MAGIC))
* *{
* * * *// если агрессор находится в боевом режиме (Примечание: не мой взгляд этот блок лишний, была проверка, что НПС использует магию)
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия ближнего радиуса поражения к бою
* * * *AI_ReadyMeleeWeapon (slf);
* * * *return;
* *};
* *// если агрессор находится в режиме сражения оружием дальнего радиуса поражения
* *if(Npc_IsInFightMode(slf,FMODE_FAR))
* *{
* * * *// если расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения или агрессор не экипирован оружием ближнего радиуса поражения
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) ¦¦ (!Npc_HasEquippedMeleeWeapon(slf))
* * * *{
* * * * * *return;
* * * *};
* *};
* *// если агрессор находится в режиме сражения оружием ближнего радиуса поражения
* *if(Npc_IsInFightMode(slf,FMODE_MELEE))
* *{
* * * *// если расстояние от агрессора до цели > дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения или агрессор не экипирован оружием дальнего радиуса поражения
* * * *if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) ¦¦ (!Npc_HasEquippedRangedWeapon(slf))
* * * *{
* * * * * *return;
* * * *};
* *};
* *// если агрессор экипирован оружием ближнего радиуса поражения и расстояние от агрессора до цели <= дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения
* *if(Npc_HasEquippedMeleeWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER)
* *{
* * * *// если агрессор находится в боевом режиме
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия ближнего радиуса поражения к бою
* * * *AI_ReadyMeleeWeapon (slf);
* * * *return;
* *};
* *// если агрессор экипирован оружием дальнего радиуса поражения и расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения и причина атаки агрессора - убийство жертвы
* *if(Npc_HasEquippedRangedWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && (C_NpcHasAttackReasonToKill(slf))
* *{
* * * *// если агрессор находится в боевом режиме
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия дальнего радиуса поражения к бою
* * * *AI_ReadyRangedWeapon(slf);
* * * *return;
* *};
* *// если агрессор не в боевом режиме
* *if(Npc_IsInFightMode(slf,FMODE_NONE))
* *{
* * * *// если агрессор экипирован оружием ближнего радиуса поражения
* * * *if(Npc_HasEquippedMeleeWeapon(slf))
* * * *{
* * * * * *// подготовка оружия к бою
* * * * * *AI_ReadyMeleeWeapon(slf);
* * * * * *return;
* * * *};
* * * *// если агрессор экипирован оружием дальнего радиуса поражения
* * * *if(Npc_HasEquippedRangedWeapon(slf))
* * * *{
* * * * * *// подготовка оружия к бою
* * * * * *AI_ReadyRangedWeapon(slf);
* * * * * *return;
* * * *};
* * * *// подготовка к бою кулаками
* * * *AI_ReadyMeleeWeapon(slf);
* * * *return;
* *};
* *return;
};

... еще файл

// *********************************
// Устанавливает отношение НПС к ГГ
// *********************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- НПС
// att *- отношение
// ======================================

func void B_SetAttitude(var C_NPC slf,var int att)
{
* *// установить временное отношение НПС к ГГ
* *Npc_SetAttitude(slf,att);
* *// установить постояное отношение НПС к ГГ
* *Npc_SetTempAttitude(slf,att);
};

... и ещё

// ********************************************
// Инициализация переменной other для НПС self
// ********************************************

func void B_ValidateOther()
{
* *// если other отсутсвует (загрузка игры)
* *if(!Hlp_IsValidNpc(other))
* *{ *
* * * *// other = последней цели НПС
* * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);
* * * *// для НПС установить цель other
* * * *Npc_SetTarget(self,other);
* * * *// установить флаг загрузки игры
* * * *self.aivar[AIV_LOADGAME] = TRUE;
* *}
* *else // иначе (other существует)
* *{ *
* * * *// повторно инициализировать other целью
* * * *Npc_GetTarget(self);
* * * *// сохранить последнюю цель
* * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);
* * * *// сброс флага загрузки игры
* * * *self.aivar[AIV_LOADGAME] = FALSE;
* *};
};



Добавление от 03/26/05, в 09:56:59
Криминал ГГ

// *******************************
// Запоминание новостей
// *******************************

// ======================================
// Аргументы:
// --------------------------------------
// slf  - НПС, запоминающий новость
// taeter  - НПС преступник
// crime - криминальная новость
// ======================================

func void B_MemorizePlayerCrime(var C_NPC slf,var C_NPC taeter,var int crime)
{  
   // если преступник не ГГ
   if(!Npc_IsPlayer(taeter))
   {
       return;
   };
   // если НПС черный маг
   if(slf.guild == GIL_DMT)
   {
       return;
   };
   // если новость более значима чем предыдущие новости
   if(crime > B_GetPlayerCrime(slf))
   {
       // удалить предыдущую новость
       B_DeletePetzCrime(slf);
       // добавить новость
       B_AddPetzCrime(slf,crime);
   };
   // если новость одного порядка с предыдущей новостью (Примечание: можно оставить ==, > было ранее)
   if(crime >= B_GetPlayerCrime(slf))
   {
       // НПС запоминает новость
       slf.aivar[AIV_NpcSawPlayerCommit] = crime;
       // НПС запоминает день преступления
       slf.aivar[AIV_NpcSawPlayerCommitDay] = Wld_GetDay();
       // НПС запоминает уровень криминала ГГ
       slf.aivar[AIV_CrimeAbsolutionLevel] = B_GetCurrentAbsolutionLevel(slf);
   };
};

... и ещё файл

// ************************************************** **********
// Получить последнюю новость, запомненную НПС о криминале ГГ
// ************************************************** **********

// ======================================
// Аргументы:
// --------------------------------------
// slf  - НПС имеющий новость
// --------------------------------------
// Возвращаемое значение: последняя запомненная новость
// ======================================

func int B_GetPlayerCrime(var C_NPC slf)
{
   // если уровень криминала ГГ меньше воровства
   if(slf.aivar[AIV_NpcSawPlayerCommit] <= CRIME_ATTACK)
   {
       // если с момента запоминания новости прошло более двух дней
       if(slf.aivar[AIV_NpcSawPlayerCommitDay] < (Wld_GetDay()-2))
       {
           // криминала не было
           return CRIME_NONE;
       };
   };
   // если уровень криминала, запомненный НПС, < уровня криминала ГГ по локациям
   if(slf.aivar[AIV_CrimeAbsolutionLevel] < B_GetCurrentAbsolutionLevel(slf))
   {
       // криминала не было
       return CRIME_NONE;
   };
   // последний запомненный криминал
   return slf.aivar[AIV_NpcSawPlayerCommit];
};

... и ещё

// **************************************************
// Добавить новость для соответствующей локации
// **************************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС свидетель, проживающий в локации
// crime - криминальная новость
// ======================================

func void B_AddPetzCrime(var C_NPC slf,var int crime)
{
   // если НПС из Миненталя
   if(C_NpcBelongsToOldCamp(slf))
   {
       // если убийство
       if(crime == CRIME_MURDER)
       {
           // увеличить счетчик убийств
           PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder + 1;
       };
       // если воровство
       if(crime == CRIME_THEFT)
       {
           // увеличить счетчик воровства
           PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft + 1;
       };
       // если нападение
       if(crime == CRIME_ATTACK)
       {
           // увеличить счетчик нападений
           PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack + 1;
       };
       // если убийство овец
       if(crime == CRIME_SHEEPKILLER)
       {
           // увеличить счетчик убитых овец
           PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller + 1;
       };
   };
   // если НПС из Хориниса
   if(C_NpcBelongsToCity(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller + 1;
       };
   };
   // если НПС из Монастыря
   if(C_NpcBelongsToMonastery(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller + 1;
       };
   };
   // если НПС с Фермы наемников
   if(C_NpcBelongsToFarm(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller + 1;
       };
   };
   // если НПС из Лагеря бандитов
   if(C_NpcBelongsToBL(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack + 1;
       };
   };
};

... и ещё

// ************************************************** ***********
// Удалить новость для соответствующей локации
// ************************************************** ***********

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС свидетель, проживающий в локации
// ======================================

func void B_DeletePetzCrime(var C_NPC slf)
{
   // если НПС из Миненталя
   if(C_NpcBelongsToOldCamp(slf))
   {
       // если последняя запомненная новость - убийство
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           // уменьшить счетчик убийств
           PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder - 1;
       };
       // если последняя запомненная новость - воровство
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           // уменьшить счетчик воровства
           PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft - 1;
       };
       // если последняя запомненная новость - нападение
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           // уменьшить счетчик нападений
           PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack - 1;
       };
       // если последняя запомненная новость - убийство овец
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           // уменьшить счетчик убитых овец
           PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller - 1;
       };
   };
   // если НПС из Хориниса
   if(C_NpcBelongsToCity(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller - 1;
       };
   };
   // если НПС из Монастыря
   if(C_NpcBelongsToMonastery(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller - 1;
       };
   };
   // если НПС с Фермы наемников
   if(C_NpcBelongsToFarm(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller - 1;
       };
   };
   // если НПС из Лагеря бандитов
   if(C_NpcBelongsToBL(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack - 1;
       };
   };
};



Добавление от 03/26/05, в 10:01:09
2DimaD:
время между склейкой теперь 20 минут
Не вводи народ в заблуждение, новый пост отредактировать не удалось, исправляйте ошибки сами, если найдете.
Предыдущее предложение по вставке разделителей (прослоек) остается. Всем привет!
Ответить с цитированием