AGFC
Страница 3 из 8 123 45678

AGFC (http://agfc.ru/index.php)
-   AGFC: Valley of Gothic (http://agfc.ru/forumdisplay.php?f=46)
-   -   М: Уроки скриптологии (http://agfc.ru/showthread.php?t=1098161614)

24.01.2005 11:51

Re: Уроки скриптологии
 
Продолжение...<br><br>// ***************************<br>// AIVAR - Константы для монстров<br>// ***************************<br><br>const int AIV_MM_ThreatenBeforeAttack * * * = 26; * //Монстр угрожает перед атакой<br>const int AIV_MM_FollowTime * * * * * * * * = 27; * //Время преследования монстром в сек.<br>const int * * * FOLLOWTIME_SHORT * * * *= 5; * * * *//Короткое преследование<br>const int * * * FOLLOWTIME_MEDIUM * * * = 10; * * * //Среднее преследование<br>const int * * * FOLLOWTIME_LONG * * * * = 20; * * * //Длительное преследование<br>const int AIV_MM_FollowInWater * * * * * * *= 28; * //Полезет ли монстр за НПС в воду? (относится и к людям)<br>// ----------------------------------------------<br>const int AIV_MM_PRIORITY * * * * * * * * * = 29; * //Приоритет поведения монстра<br>const int * PRIO_EAT * * * * * * * * * *= 0; * * * *//Пожирание падали<br>const int * PRIO_ATTACK * * * * * * * * = 1; * * * *//Нападение на жертву<br>// ----------------------------------------------<br>const int AIV_MM_SleepStart * * * * * * * * = 30; * //Время отхода монстра ко сну (час)<br>const int AIV_MM_SleepEnd * * * * * * * * * = 31; * //Время пробуждения<br>const int AIV_MM_RestStart * * * * * * * * *= 32; * //Время начала отдыха <br>const int AIV_MM_RestEnd * * * * * * * * * *= 33; * //Время окончания отдыха<br>const int AIV_MM_RoamStart * * * * * * * * *= 34; * //Время начала брожения<br>const int AIV_MM_RoamEnd * * * * * * * * * *= 35; * //Время окончания брожения<br>const int AIV_MM_EatGroundStart * * * * * * = 36; * //Время начала кормежки<br>const int AIV_MM_EatGroundEnd * * * * * * * = 37; * //Время окончания кормежки<br>const int AIV_MM_WuselStart * * * * * * * * = 38; * //Время начала активности <br>const int AIV_MM_WuselEnd * * * * * * * * * = 39; * //Время окончания активности<br>const int AIV_MM_OrcSitStart * * * * * * * *= 40; * //Время, когда орк садится<br>const int AIV_MM_OrcSitEnd * * * * * * * * *= 41; * //Время, когда орк встает<br>const int * OnlyRoutine * * * * * * * * = -1; * * * //Время контролируется программой поведения монстра<br>// ----------------------------------------------<br>const int AIV_MM_ShrinkState * * * * * * * *= 42; * //Состояние уменьшения монстра (коэффициент сжатия)<br>// ----------------------------------------------<br>const int AIV_MM_REAL_ID * * * * * * * * * *= 43; * //Идентификатор монстра<br>const int * ID_MEATBUG * * * * * * * * *= 1; * * * *//Мясной жук<br>const int * ID_SHEEP * * * * * * * * * *= 2; * * * *//Овца<br>const int * ID_GOBBO_GREEN * * * * * * *= 3; * * * *//Гоблин<br>const int * ID_GOBBO_BLACK * * * * * * *= 4; * * * *//Черный гоблин<br>const int * ID_GOBBO_SKELETON * * * * * = 5; * * * *//Скелет гоблина<br>const int * ID_SUMMONED_GOBBO_SKELETON *= 6; * * * *//Вызванный Скелет гоблина<br>const int * ID_SCAVENGER * * * * * * * *= 7; * * * *//Падальщик<br>const int * ID_SCAVENGER_DEMON * * * * *= 8; * * * *//Зубастик<br>const int * ID_GIANT_RAT * * * * * * * *= 8; * * * *//Крыса<br>const int * ID_GIANT_BUG * * * * * * * *= 9; * * * *//Полевой жук<br>const int * ID_BLOODFLY * * * * * * * * = 10; * * * //Кровяной шершень<br>const int * ID_WARAN * * * * * * * * * *= 11; * * * //Ящерица<br>const int * ID_FIREWARAN * * * * * * * *= 12; * * * //Огненная ящерица<br>const int * ID_WOLF * * * * * * * * * * = 13; * * * //Волк<br>const int * ID_WARG * * * * * * * * * * = 14; * * * //Варг<br>const int * ID_SUMMONED_WOLF * * * * * *= 15; * * * //Вызванный Волк<br>const int * ID_MINECRAWLER * * * * * * *= 16; * * * //Ползун<br>const int * ID_MINECRAWLERWARRIOR * * * = 17; * * * //Воин ползунов<br>const int * ID_LURKER * * * * * * * * * = 18; * * * //Шныг<br>const int * ID_SKELETON * * * * * * * * = 19; * * * //Скелет<br>const int * ID_SUMMONED_SKELETON * * * *= 20; * * * //Вызванный Скелет<br>const int * ID_SKELETON_MAGE * * * * * *= 21; * * * //Маг скелетов<br>const int * ID_ZOMBIE * * * * * * * * * = 22; * * * //Зомби<br>const int * ID_SNAPPER * * * * * * * * *= 23; * * * //Глорх<br>const int * ID_DRAGONSNAPPER * * * * * *= 24; * * * //Остер<br>const int * ID_SHADOWBEAST * * * * * * *= 25; * * * //Мракорис<br>const int * ID_SHADOWBEAST_SKELETON * * = 26; * * * //Скелет мракориса<br>const int * ID_HARPY * * * * * * * * * *= 27; * * * //Гарпия<br>const int * ID_STONEGOLEM * * * * * * * = 28; * * * //Каменный голем<br>const int * ID_FIREGOLEM * * * * * * * *= 29; * * * //Огненный голем<br>const int * ID_ICEGOLEM * * * * * * * * = 30; * * * //Ледяной голем<br>const int * ID_SUMMONED_GOLEM * * * * * = 31; * * * //Вызванный Голем<br>const int * ID_DEMON * * * * * * * * * *= 32; * * * //Демон<br>const int * ID_SUMMONED_DEMON * * * * * = 33; * * * //Вызванный Демон<br>const int * ID_DEMON_LORD * * * * * * * = 34; * * * //Лорд демонов<br>const int * ID_TROLL * * * * * * * * * *= 35; * * * //Троль<br>const int * ID_TROLL_BLACK * * * * * * *= 36; * * * //Черный троль<br>const int * ID_SWAMPSHARK * * * * * * * = 37; * * * //Болотожор<br>const int * ID_DRAGON_FIRE * * * * * * *= 38; * * * //Огненный дракон<br>const int * ID_DRAGON_ICE * * * * * * * = 39; * * * //Ледяной дракон<br>const int * ID_DRAGON_ROCK * * * * * * *= 40; * * * //Каменный дракон<br>const int * ID_DRAGON_SWAMP * * * * * * = 41; * * * //Болотный дракон<br>const int * ID_DRAGON_UNDEAD * * * * * *= 42; * * * //Дракон нежить<br>const int * ID_MOLERAT * * * * * * * * *= 43; * * * //Кротокрыс<br>const int * ID_ORCWARRIOR * * * * * * * = 44; * * * //Воин орков<br>const int * ID_ORCSHAMAN * * * * * * * *= 45; * * * //Шаман орков<br>const int * ID_ORCELITE * * * * * * * * = 46; * * * //Элитный воин орков<br>const int * ID_UNDEADORCWARRIOR * * * * = 47; * * * //Орк нежить<br>const int * ID_DRACONIAN * * * * * * * *= 48; * * * //Ящер<br>const int * ID_WISP * * * * * * * * * * = 49; * * * //Огонек<br><br>//----- Addon ------<br><br>const int * ID_Alligator * * * * * * * *= 50; * * * //Аллигатор<br>const int * ID_Swampgolem * * * * * * * = 51; * * * //Болотный голем<br>const int * ID_Stoneguardian * * * * * *= 52; * * * //Каменный сторож<br>const int * ID_Gargoyle * * * * * * * * = 53; * * * //Огненный дух мракориса<br>const int * ID_Bloodhound * * * * * * * = 54; * * * //Кровяная собака<br>const int * ID_Icewolf * * * * * * * * *= 55; * * * //Ледяной волк<br>const int * ID_OrcBiter * * * * * * * * = 56; * * * //Зубастик<br>const int * ID_Razor * * * * * * * * * *= 57; * * * //Расчленитель<br>const int * ID_Swarm * * * * * * * * * *= 58; * * * //Рой<br>const int * ID_Swamprat * * * * * * * * = 59; * * * //Болотная крыса<br>const int * ID_BLATTCRAWLER * * * * * * = 60; * * * //Богомол<br>const int * ID_SummonedGuardian * * * * = 61; * * * //Вызванный Каменный страж<br>const int * ID_SummonedZombie * * * * * = 62; * * * //Вызванный Зомби<br>const int * ID_Keiler * * * * * * * * * = 63; * * * //Кабан<br>const int * ID_SWAMPDRONE * * * * * * * = 64; * * * //Болотная вонючка<br><br>// ----------------------------------------------<br>const int AIV_LASTBODY * * * * * * * * * * *= 44; * //Ссылка на последнего сожранного монстра<br><br><br>// **********************<br>// Дальнейшие человеческие AIVARы<br>// **********************<br><br>// ------ Сражение с Альриком -------------------<br>const int AIV_ArenaFight * * * * * * * * * *= 45; * //Параметры сражения<br>const int * AF_NONE * * * * * * * * * * = 0; * * * *//Сражения не было<br>const int * AF_RUNNING * * * * * * * * *= 1; * * * *//В процессе сражения<br>const int * AF_AFTER * * * * * * * * * *= 2; * * * *//После сражения<br>const int * AF_AFTER_PLUS_DAMAGE * * * *= 3; * * * *//ГГ нечестно выиграл сражение<br><br>// ------ Криминал ------------------------------<br>const int AIV_CrimeAbsolutionLevel * * * * *= 46; * //Абсолютный уровень криминальной репутации ГГ<br><br>// ------ Атака ---------------------------------<br>const int AIV_LastPlayerAR * * * * * * * * *= 47; * //Причина последнего нападения ГГ<br><br>// ------ Без сознания --------------------------<br>const int AIV_DuelLost * * * * * * * * * * *= 48; * //TRUE, если НПС из ополчения был побит ГГ<br><br>// ------ Торговля ------------------------------<br>const int AIV_ChapterInv * * * * * * * * * *= 49; * //Отвечает за обновление товаров у торговцев в начале главы<br><br>// ------ Стая монстров -------------------------<br>const int AIV_MM_Packhunter * * * * * * * * = 50; * //TRUE, если монстры одного вида охотятся и атакуют стаей<br><br>// ------ Магия ---------------------------------<br>const int AIV_MagicUser * * * * * * * * * * = 51; * //Использует ли НПС магию<br>const int * MAGIC_NEVER * * * * * * * * = 0; * * * *//Не использует<br>const int * MAGIC_ALWAYS * * * * * * * *= 1; * * * *//Всегда использует<br><br>// ------ Послушники ----------------------------<br>const int AIV_DropDeadAndKill * * * * * * * = 52; * //TRUE, если этого НПС разрешено убить <br><br>// ------ Магия заморозки -----------------------<br>const int AIV_FreezeStateTime * * * * * * * = 53; * //Время начала действия заклинаний заморозки<br><br>// ------ Игнорирование криминала ---------------<br>const int AIV_IGNORE_Murder * * * * * * * * = 54; * //Игнорирование убийства<br>const int AIV_IGNORE_Theft * * * * * * * * *= 55; * //Игнорирование воровства<br>const int AIV_IGNORE_Sheepkiller * * * * * *= 56; * //Игнорирование убийства овцы<br><br>// ------ Крутой парень -------------------------<br>const int AIV_ToughGuy * * * * * * * * * * *= 57; * //TRUE, если НПС является крутым парнем<br><br>// ------ Отвергнутые новости -------------------<br>const int AIV_NewsOverride * * * * * * * * *= 58; * //TRUE, если НПС не знает никаких новостей<br><br>// ------ Атака монстров ------------------------<br>const int AIV_MaxDistToWp * * * * * * * * * = 59; * //Макс. дистанция, на которой монстр начинает атаковать<br>const int AIV_OriginalFightTactic * * * * * = 60; * //Тактика нападения монстра<br><br>// ------ Оценка врага --------------------------<br>const int AIV_EnemyOverride * * * * * * * * = 61; * //TRUE, если врагов у НПС нет<br><br>// ------ Вызванные монстры ---------------------<br>const int AIV_SummonTime * * * * * * * * * *= 62; * //Время от начала вызова монстра<br><br>// ------ Атака ---------------------------------<br>const int AIV_FightDistCancel * * * * * * * = 63; * //Дистанция, на которой прекращается сражение<br>const int AIV_LastFightComment * * * * * * *= 64; * //TRUE, если НПС комментировал последнее сражение<br><br>// ----------------------------------------------<br>const int AIV_LOADGAME * * * * * * * * * * *= 65; * //TRUE, если была загрузка игры (other не инициализирован)<br><br>// ------ Без сознания --------------------------<br>const int AIV_DefeatedByPlayer * * * * * * *= 66; * //TRUE, если НПС побежден ГГ<br><br>// ------ Смерть --------------------------------<br>const int AIV_KilledByPlayer * * * * * * * *= 67; * //TRUE, если НПС убит ГГ<br><br>// ------ Различные функции ---------------------<br>const int AIV_StateTime * * * * * * * * * * = 68; * //Время нахождения НПС в конкретном состоянии<br><br>// ----------------------------------------------<br>const int AIV_Dist * * * * * * * * * * * * *= 69; * //Дистанция между НПС<br>const int AIV_IgnoresFakeGuild * * * * * * *= 70; * //TRUE, если НПС игнорирует поддельную гильдию<br>const int AIV_NoFightParker * * * * * * * * = 71; * //TRUE, если НПС не может атаковать<br>const int AIV_NPCIsRanger * * * * * * * * * = 72; * //TRUE, если НПС принадлежит к &quot;Кольцу Воды&quot;<br>const int AIV_IgnoresArmor * * * * * * * * *= 73; * //НПС не носит броню<br>const int AIV_StoryBandit * * * * * * * * * = 74; * //Бандиты, с которыми можно сражаться<br>const int AIV_StoryBandit_Esteban * * * * * = 75; * //Эстебан<br><br>// ------ Смерч ---------------------------------<br>const int AIV_WhirlwindStateTime * * * * * *= 76; * //Время начала запуска смерча<br><br>// ------ Вздутие -------------------------------<br>const int AIV_InflateStateTime * * * * * * *= 77; * //Время начала запуска вздутия<br><br>// ------ Рой -----------------------------------<br>const int AIV_SwarmStateTime * * * * * * * *= 78; * //Время начала запуска роя<br><br>// ------ Опустошение ---------------------------<br>const int AIV_SuckEnergyStateTime * * * * * = 79; * //Время начала запуска опустошения<br><br>// ------ Пираты --------------------------------<br>const int AIV_FollowDist * * * * * * * * * *= 80; * //Дистанция следования НПС друг за другом<br><br>// ------ Реальные атрибуты НПС -----------------<br>const int REAL_STRENGTH * * * * * * * * * * = 81; * //Сила<br>const int REAL_DEXTERITY * * * * * * * * * *= 82; * //Ловкость<br>const int REAL_MANA_MAX * * * * * * * * * * = 83; * //Мана<br>const int REAL_TALENT_1H * * * * * * * * * *= 84; * //Владение одноручником<br>const int REAL_TALENT_2H * * * * * * * * * *= 85; * //Владение двуручником<br>const int REAL_TALENT_BOW * * * * * * * * * = 86; * //Владение луком<br>const int REAL_TALENT_CROSSBOW * * * * * * *= 87; * //Владение арбалетом<br><br>const int AIV_SpellLevel * * * * * * * * * *= 88; * //Круг магии<br><br><br>

25.01.2005 11:15

Re: Уроки скриптологии
 
Продолжение...<br><br>// ************************************************** *<br>// Глобальные переменные для системы Доносов/Абсолютных уровней/Новостей<br>// ************************************************** *<br><br>// Абсолютные уровни<br>var int ABSOLUTIONLEVEL_OldCamp; * * * * * * * * * *//Миненталь<br>var int ABSOLUTIONLEVEL_City; * * * * * * * * * * * //Хоринис<br>var int ABSOLUTIONLEVEL_Monastery; * * * * * * * * *//Монастырь<br>var int ABSOLUTIONLEVEL_Farm; * * * * * * * * * * * //Поместье Онара<br>var int ABSOLUTIONLEVEL_BL; * * * * * * * * * * * * //Лагерь бандитов<br><br>// Кол-во криминала в Минентале<br>var int PETZCOUNTER_OldCamp_Murder; * * * * * * * * //Убийства<br>var int PETZCOUNTER_OldCamp_Theft; * * * * * * * * *//Воровство<br>var int PETZCOUNTER_OldCamp_Attack; * * * * * * * * //Нападения<br>var int PETZCOUNTER_OldCamp_Sheepkiller; * * * * * *//Убийство овец<br><br>// Кол-во криминала в Хоринисе<br>var int PETZCOUNTER_City_Murder;<br>var int PETZCOUNTER_City_Theft;<br>var int PETZCOUNTER_City_Attack;<br>var int PETZCOUNTER_City_Sheepkiller;<br><br>// Кол-во криминала в Монастыре<br>var int PETZCOUNTER_Monastery_Murder;<br>var int PETZCOUNTER_Monastery_Theft;<br>var int PETZCOUNTER_Monastery_Attack;<br>var int PETZCOUNTER_Monastery_Sheepkiller;<br><br>// Кол-во криминала в Поместье Онара<br>var int PETZCOUNTER_Farm_Murder;<br>var int PETZCOUNTER_Farm_Theft;<br>var int PETZCOUNTER_Farm_Attack;<br>var int PETZCOUNTER_Farm_Sheepkiller;<br><br>// Кол-во криминала в Лагере бандитов<br>var int PETZCOUNTER_BL_Murder;<br>var int PETZCOUNTER_BL_Theft;<br>var int PETZCOUNTER_BL_Attack;<br><br>// *******************************<br>// Константы локаций<br>// *******************************<br><br>const int LOC_NONE * * *= 0; * * * * * * * * * *//Вне локаций<br>const int LOC_OLDCAMP * = 1; * * * * * * * * * *//Миненталь<br>const int LOC_CITY * * *= 2; * * * * * * * * * *//Хоринис<br>const int LOC_MONASTERY = 3; * * * * * * * * * *//Монастырь<br>const int LOC_FARM * * *= 4; * * * * * * * * * *//Поместье Онара<br>const int LOC_BL * * * *= 5; * * * * * * * * * *//Лагерь бандитов<br>const int LOC_ALL * * * = 6; * * * * * * * * * *//Все локации<br><br>// *******************************<br>// Константы Хориниса (кварталы)<br>// *******************************<br><br>const int Q_KASERNE * * = 1; * * * * * * * * * *//Казарма<br>const int Q_GALGEN * * *= 2; * * * * * * * * * *//Виселица<br>const int Q_MARKT * * * = 3; * * * * * * * * * *//Рынок<br>const int Q_TEMPEL * * *= 4; * * * * * * * * * *//Замок<br>const int Q_UNTERSTADT *= 5; * * * * * * * * * *//Нижний город<br>const int Q_HAFEN * * * = 6; * * * * * * * * * *//Гавань<br>const int Q_OBERSTADT * = 7; * * * * * * * * * *//Верхний город<br><br>// ******************************<br>// Активное восприятие монстров<br>// ******************************<br>//---------------------------------------------<br>const int PERC_DIST_SUMMONED_ACTIVE_MAX = 2000; //Макс. дальность действия активного восприятия вызываемых монстров<br>const int PERC_DIST_MONSTER_ACTIVE_MAX *= 1500; //Макс. дальность действия активного восприятия других монстров<br>const int PERC_DIST_ORC_ACTIVE_MAX * * *= 2500; //Макс. дальность действия активного восприятия орков<br>const int PERC_DIST_DRAGON_ACTIVE_MAX * = 3500; //Макс. дальность действия активного восприятия драконов<br>//---------------------------------------------<br>const int FIGHT_DIST_MONSTER_ATTACKRANGE = 700; //Дистанция, с которой монстры начинают атаковать<br>const int FIGHT_DIST_MONSTER_FLEE * * * = 300; *//Дистанция, с которой монстр начинает преследование<br>const int FIGHT_DIST_DRAGON_MAGIC * * * = 700; *//Дистанция применения драконами магии<br>//---------------------------------------------<br>const int MONSTER_THREATEN_TIME * * * * = 4; * *//Кол-во секунд, которые монстр угрожает перед атакой<br>const int MONSTER_SUMMON_TIME * * * * * = 60; * //Время, на которое вызываются монстры<br><br>//************************************<br>// Константы дистанций для человека<br>//************************************<br>// --------------------------------------------<br>const int TA_DIST_SELFWP_MAX * * * * * *= 500; *//Дистанция до объекта, на которой начинают выполняться функции распорядка дня<br>// --------------------------------------------<br>const int PERC_DIST_ACTIVE_MAX * * * * *= 2000; //Макс. дальность действия активного восприятия<br>//---------------------------------------------<br>const int PERC_DIST_INTERMEDIAT * * * * = 1000; //Макс. дальность действия пассивного восприятия<br>const int PERC_DIST_DIALOG * * * * * * *= 500; *//Дистанция начала диалога<br>const int PERC_DIST_HEIGHT * * * * * * *= 1000; //С какой разницы высот НПС не реагируют друг на друга<br>const int PERC_DIST_INDOOR_HEIGHT * * * = 250; *//Дистанция игнорирования через закрытые двери<br>//---------------------------------------------<br>const int FIGHT_DIST_MELEE * * * * * * *= 600; *//Дистанция атаки оружием ближнего радиуса действия<br>const int FIGHT_DIST_RANGED_INNER * * * = 900; *//Дистанция, ближе которой НПС выбирает оружие ближнего радиуса поражения<br>const int FIGHT_DIST_RANGED_OUTER * * * = 1000; //Дистанция, дальше которой НПС выбирает оружие дальнего радиуса поражения<br>const int FIGHT_DIST_CANCEL * * * * * * = 3500; //На этой дистанции НПС перестают преследовать<br>//---------------------------------------------<br>const int WATCHFIGHT_DIST_MIN * * * * * = 300; *//Мин. дистанция наблюдения сражения между двумя НПС другим НПС (не милицией)<br>const int WATCHFIGHT_DIST_MAX * * * * * = 2000; //Мах. дистанция наблюдения сражения между двумя НПС другим НПС (не милицией)<br>//---------------------------------------------<br>const int ZivilAnquatschDist * * * * * *= 400; *//Дистанция, с которой к ГГ начинают обращаться граждане<br>//---------------------------------------------<br>const float RANGED_CHANCE_MINDIST * * * = 1500; //(не используется)<br>const float RANGED_CHANCE_MAXDIST * * * = 4500; //(не используется)<br><br>//*************************************<br>// *Константы времени<br>//*************************************<br>const int NPC_ANGRY_TIME * * * * * * * *= 120; *//(не используется)<br>// -------------------------------------------<br>const int HAI_TIME_UNCONSCIOUS * * * * *= 20; * //Время нахождения в бессознательном состоянии<br>// -------------------------------------------<br>const int NPC_TIME_FOLLOW * * * * * * * = 10; * //Время преследования монстрами<br><br>//*************************************<br>// *Минимальные повреждения<br>//*************************************<br>const int NPC_MINIMAL_DAMAGE * *= 5; * * * * * *//(не используется)<br>const int NPC_MINIMAL_PERCENT * = 10; * * * * * //(не используется)<br><br>//*************************************<br>// AI константы сражения<br>//*************************************<br><br>//Тактика сражения<br>const int FAI_HUMAN_COWARD * * * * * * *= 2; * *//Трус<br>const int FAI_HUMAN_NORMAL * * * * * * *= 42; * //Нормальный<br>const int FAI_HUMAN_STRONG * * * * * * *= 3; * *//Сильный<br>const int FAI_HUMAN_MASTER * * * * * * *= 4; * *//Мастер<br>//-----------------------------------------------<br>const int FAI_MONSTER_COWARD * * * * * *= 10; * //Монстр трус<br>//-----------------------------------------------<br>const int FAI_NAILED * * * * * * * * * *= 1; * *//Полуживой<br>//-----------------------------------------------<br>// Тактика атаки монстрами<br>const int FAI_GOBBO * * * * * * * * * * = 7; * *//Гоблины<br>const int FAI_SCAVENGER * * * * * * * * = 15; * //Падальщики<br>const int FAI_GIANT_RAT * * * * * * * * = 11; * //Крыса<br>const int FAI_GIANT_BUG * * * * * * * * = 31; * //Полевой жук<br>const int FAI_BLOODFLY * * * * * * * * *= 24; * //Кровяной шершень<br>const int FAI_WARAN * * * * * * * * * * = 21; * //Ящерицы<br>const int FAI_WOLF * * * * * * * * * * *= 22; * //Волк<br>const int FAI_MINECRAWLER * * * * * * * = 5; * *//Ползуны<br>const int FAI_LURKER * * * * * * * * * *= 9; * *//Шныг<br>const int FAI_ZOMBIE * * * * * * * * * *= 23; * //Зомби<br>const int FAI_SNAPPER * * * * * * * * * = 18; * //Глорх<br>const int FAI_SHADOWBEAST * * * * * * * = 16; * //Мракорис<br>const int FAI_HARPY * * * * * * * * * * = 36; * //Гарпия<br>const int FAI_STONEGOLEM * * * * * * * *= 8; * *//Големы<br>const int FAI_DEMON * * * * * * * * * * = 6; * *//Демоны<br>const int FAI_TROLL * * * * * * * * * * = 20; * //Троль<br>const int FAI_SWAMPSHARK * * * * * * * *= 19; * //Болотожор<br>const int FAI_DRAGON * * * * * * * * * *= 39; * //Драконы<br>const int FAI_MOLERAT * * * * * * * * * = 40; * //Кротокрыс<br>//-----------------------------------------------<br>const int FAI_ORC * * * * * * * * * * * = 12; * //Орки<br>const int FAI_DRACONIAN * * * * * * * * = 41; * //Ящер<br><br>const int FAI_Alligator * * * * * * * * = 43; * //Аллигатор<br>const int FAI_Gargoyle * * * * * * * * *= 44; * //Огненный дух мракориса<br>const int FAI_Bear * * * * * * * * * * *= 45; * //Медведь<br>const int FAI_Stoneguardian * * * * * * = 46; * //Каменный сторож<br><br>//*************************************<br>// Общие константы<br>//*************************************<br>const int TRUE * * * * * * *= 1; * * * * * * * *//Значение TRUE<br>const int FALSE * * * * * * = 0; * * * * * * * *//Значение FALSE<br><br>const int LOOP_CONTINUE * * = 0; * * * * * * * *//Значение продолжения цикла<br>const int LOOP_END * * * * *= 1; * * * * * * * *//Значение выхода из цикла<br><br>const int DEFAULT * * * * * = 0; * * * * * * * *//Значение по умолчанию<br><br>//*************************************<br>// Константы ГГ<br>//*************************************<br><br>const int LP_PER_LEVEL * * * * * * *= 10; * * * //Кол-во пунктов обучения за уровень<br>const int HP_PER_LEVEL * * * * * * *= 12; * * * //Кол-во пунктов жизни за уровень<br><br>const int XP_PER_VICTORY * * * * * *= 10; * * * //Ко-во экспы за уровень побежденного противника<br><br>//*************************************<br>// Типы НПС<br>//*************************************<br><br>const int NPCTYPE_AMBIENT * * * = 0; * * * * * *//Окружающий народ<br>const int NPCTYPE_MAIN * * * * *= 1; * * * * * *//Значимые НПС<br>const int NPCTYPE_FRIEND * * * *= 2; * * * * * *//Друзья<br>const int NPCTYPE_OCAMBIENT * * = 3; * * * * * *//Окружающий народ в Минентале<br>const int NPCTYPE_OCMAIN * * * *= 4; * * * * * *//Значимые НПС в Минентале<br>const int NPCTYPE_BL_AMBIENT * *= 5; * * * * * *//Окружающий народ в Лагере бандитов<br>const int NPCTYPE_TAL_AMBIENT * = 6; * * * * * *//Окружающий народ в Долине бандитов<br>const int NPCTYPE_BL_MAIN * * * = 7; * * * * * *//Значимые НПС в Лагере бандитов<br><br>//**************************************<br>// *MOBsi константы<br>//**************************************<br><br>cons t int * MOBSI_NONE * * * * * * * * *= 0; * *//Нет<br>const int * MOBSI_SmithWeapon * * * * * = 1; * *//Ковать оружие<br>const int * MOBSI_SleepAbit * * * * * * = 2; * *//Способность спать<br>const int * MOBSI_MakeRune * * * * * * *= 3; * *//Изготовление рун<br>const int * MOBSI_PotionAlchemy * * * * = 4; * *//Алхимия<br>const int * MOBSI_PRAYSHRINE * * * * * *= 5; * *//Молитва<br>const int * MOBSI_GOLDHACKEN * * * * * *= 6; * *//Милостыня<br>const int * MOBSI_PRAYIDOL * * * * * * *= 7; * *//Молитва идолу<br><br>var int * * PLAYER_MOBSI_PRODUCTION; * * * * * *//Переменная для значений MOBsi<br><br>//**************************************<br>// Константы текстур<br>//**************************************<br><br>// Для мужчин и женщин (по 4 штуки)<br>const int BodyTex_P * * * * * * * * * * = 0; * *//Бледнокожий<br>const int BodyTex_N * * * * * * * * * * = 1; * *//Европеец<br>const int BodyTex_L * * * * * * * * * * = 2; * *//Латиноамериканец<br>const int BodyTex_B * * * * * * * * * * = 3; * *//Негр<br>const int BodyTexBabe_P * * * * * * * * = 4; * *//Бледнокожая<br>const int BodyTexBabe_N * * * * * * * * = 5; * *//Европейка <br>const int BodyTexBabe_L * * * * * * * * = 6; * *//Латиноамериканка<br>const int BodyTexBabe_B * * * * * * * * = 7; * *//Негритянка<br>const int BodyTex_Player * * * * * * * *= 8; * *//ГГ<br><br>const int BodyTex_T * * * * * * * * * * = 10; * //Татуированный мужик<br>const int BodyTexBabe_F * * * * * * * * = 11; * //Татуированная женщина<br>const int BodyTexBabe_S * * * * * * * * = 12; * //Чернокожий ребенок<br><br>const int NO_ARMOR * * * * * * * * * * *= -1; * //Без доспехов<br><br>// Лица мужчин<br>const int Face_N_Gomez * * * * * * *= * 0;<br>const int Face_N_Scar * * * * * * * = * 1;<br>const int Face_N_Raven * * * * * * *= * 2;<br>const int Face_N_Bullit * * * * * * = * 3;<br>const int Face_B_Thorus * * * * * * = * 4;<br>const int Face_N_Corristo * * * * * = * 5;<br>const int Face_N_Milten * * * * * * = * 6;<br>const int Face_N_Bloodwyn * * * * * = * 7;<br>const int Face_L_Scatty * * * * * * = * 8;<br>const int Face_N_YBerion * * * * * *= * 9;<br>const int Face_N_CoolPock * * * * * = * 10;<br>const int Face_B_CorAngar * * * * * = * 11;<br>const int Face_B_Saturas * * * * * *= * 12;<br>const int Face_N_Xardas * * * * * * = * 13;<br>const int Face_N_Lares * * * * * * *= * 14;<br>const int Face_L_Ratford * * * * * *= * 15;<br>const int Face_N_Drax * * * * * * * = * 16;<br>const int Face_B_Gorn * * * * * * * = * 17;<br>const int Face_N_Player * * * * * * = * 18;<br>const int Face_P_Lester * * * * * * = * 19;<br>const int Face_N_Lee * * * * * * * *= * 20;<br>const int Face_N_Torlof * * * * * * = * 21;<br>const int Face_N_Mud * * * * * * * *= * 22;<br>const int Face_N_Ricelord * * * * * = * 23;<br>const int Face_N_Horatio * * * * * *= * 24;<br>const int Face_N_Richter * * * * * *= * 25;<br>const int Face_N_Cipher_neu * * * * = * 26;<br>const int Face_N_Homer * * * * * * *= * 27;<br>const int Face_B_Cavalorn * * * * * = * 28;<br>const int Face_L_Ian * * * * * * * *= * 29;<br>const int Face_L_Diego * * * * * * *= * 30;<br>const int Face_N_MadPsi * * * * * * = * 31;<br>const int Face_N_Bartholo * * * * * = * 32;<br>const int Face_N_Snaf * * * * * * * = * 33;<br>const int Face_N_Mordrag * * * * * *= * 34;<br>const int Face_N_Lefty * * * * * * *= * 35;<br>const int Face_N_Wolf * * * * * * * = * 36;<br>const int Face_N_Fingers * * * * * *= * 37;<br>const int Face_N_Whistler * * * * * = * 38;<br>const int Face_P_Gilbert * * * * * *= * 39;<br>const int Face_L_Jackal * * * * * * = * 40;<br><br>// Бледнолицые<br>const int Face_P_ToughBald * * * * *= * 41;<br>const int Face_P_Tough_Drago * * * *= * 42;<br>const int Face_P_Tough_Torrez * * * = * 43;<br>const int Face_P_Tough_Rodriguez * *= * 44;<br>const int Face_P_ToughBald_Nek * * *= * 45;<br>const int Face_P_NormalBald * * * * = * 46;<br>const int Face_P_Normal01 * * * * * = * 47;<br>const int Face_P_Normal02 * * * * * = * 48;<br>const int Face_P_Normal_Fletcher * *= * 49;<br>const int Face_P_Normal03 * * * * * = * 50;<br>const int Face_P_NormalBart01 * * * = * 51;<br>const int Face_P_NormalBart_Cronos *= * 52;<br>const int Face_P_NormalBart_Nefarius= * 53;<br>const int Face_P_NormalBart_Riordian= * 54;<br>const int Face_P_OldMan_Gravo * * * = * 55;<br>const int Face_P_Weak_Cutter * * * *= * 56;<br>const int Face_P_Weak_Ulf_Wohlers * = * 57;<br><br>// Европейцы<br>const int Face_N_Important_Arto * * = * 58;<br>const int Face_N_ImportantGrey * * *= * 59;<br>const int Face_N_ImportantOld * * * = * 60;<br>const int Face_N_Tough_Lee_дhnlich *= * 61;<br>const int Face_N_Tough_Skip * * * * = * 62;<br>const int Face_N_ToughBart01 * * * *= * 63;<br>const int Face_N_Tough_Okyl * * * * = * 64;<br>const int Face_N_Normal01 * * * * * = * 65;<br>const int Face_N_Normal_Cord * * * *= * 66;<br>const int Face_N_Normal_Olli_Kahn * = * 67; <br>const int Face_N_Normal02 * * * * * = * 68;<br>const int Face_N_Normal_Spassvogel *= * 69;<br>const int Face_N_Normal03 * * * * * = * 70;<br>const int Face_N_Normal04 * * * * * = * 71;<br>const int Face_N_Normal05 * * * * * = * 72;<br>const int Face_N_Normal_Stone * * * = * 73;<br>const int Face_N_Normal06 * * * * * = * 74;<br>const int Face_N_Normal_Erpresser * = * 75;<br>const int Face_N_Normal07 * * * * * = * 76;<br>const int Face_N_Normal_Blade * * * = * 77;<br>const int Face_N_Normal08 * * * * * = * 78;<br>const int Face_N_Normal14 * * * * * = * 79;<br>const int Face_N_Normal_Sly * * * * = * 80;<br>const int Face_N_Normal16 * * * * * = * 81;<br>const int Face_N_Normal17 * * * * * = * 82;<br>const int Face_N_Normal18 * * * * * = * 83;<br>const int Face_N_Normal19 * * * * * = * 84;<br>const int Face_N_Normal20 * * * * * = * 85;<br>const int Face_N_NormalBart01 * * * = * 86;<br>const int Face_N_NormalBart02 * * * = * 87;<br>const int Face_N_NormalBart03 * * * = * 88;<br>const int Face_N_NormalBart04 * * * = * 89;<br>const int Face_N_NormalBart05 * * * = * 90;<br>const int Face_N_NormalBart06 * * * = * 91;<br>const int Face_N_NormalBart_Senyan *= * 92;<br>const int Face_N_NormalBart08 * * * = * 93;<br>const int Face_N_NormalBart09 * * * = * 94;<br>const int Face_N_NormalBart10 * * * = * 95;<br>const int Face_N_NormalBart11 * * * = * 96;<br>const int Face_N_NormalBart12 * * * = * 97;<br>const int Face_N_NormalBart_Dexter *= * 98;<br>const int Face_N_NormalBart_Graham *= * 99;<br>const int Face_N_NormalBart_Dusty * = * 100;<br>const int Face_N_NormalBart16 * * * = * 101;<br>const int Face_N_NormalBart17 * * * = * 102;<br>const int Face_N_NormalBart_Huno * *= * 103;<br>const int Face_N_NormalBart_Grim * *= * 104;<br>const int Face_N_NormalBart20 * * * = * 105;<br>const int Face_N_NormalBart21 * * * = * 106;<br>const int Face_N_NormalBart22 * * * = * 107;<br>const int Face_N_OldBald_Jeremiah * = * 108;<br>const int Face_N_Weak_Ulbert * * * *= * 109;<br>const int Face_N_Weak_BaalNetbek * *= * 110;<br>const int Face_N_Weak_Herek * * * * = * 111;<br>const int Face_N_Weak04 * * * * * * = * 112;<br>const int Face_N_Weak05 * * * * * * = * 113;<br>const int Face_N_Weak_Orry * * * * *= * 114;<br>const int Face_N_Weak_Asghan * * * *= * 115;<br>const int Face_N_Weak_Markus_Kark * = * 116;<br>const int Face_N_Weak_Cipher_alt * *= * 117;<br>const int Face_N_NormalBart_Swiney *= * 118;<br>const int Face_N_Weak12 * * * * * * = * 119;<br><br>// Латиноамериканцы<br>const int Face_L_ToughBald01 * * * *= * 120;<br>const int Face_L_Tough01 * * * * * *= * 121;<br>const int Face_L_Tough02 * * * * * *= * 122;<br>const int Face_L_Tough_Santino * * *= * 123;<br>const int Face_L_ToughBart_Quentin *= * 124;<br>const int Face_L_Normal_GorNaBar * *= * 125;<br>const int Face_L_NormalBart01 * * * = * 126;<br>const int Face_L_NormalBart02 * * * = * 127;<br>const int Face_L_NormalBart_Rufus * = * 128;<br><br>// Негры<br>const int Face_B_ToughBald * * * * *= * 129;<br>const int Face_B_Tough_Pacho * * * *= * 130;<br>const int Face_B_Tough_Silas * * * *= * 131;<br>const int Face_B_Normal01 * * * * * = * 132;<br>const int Face_B_Normal_Kirgo * * * = * 133;<br>const int Face_B_Normal_Sharky * * *= * 134;<br>const int Face_B_Normal_Orik * * * *= * 135;<br>const int Face_B_Normal_Kharim * * *= * 136;<br><br>// Лица женщин<br>const int FaceBabe_N_BlackHair * * *= * 137;<br>const int FaceBabe_N_Blondie * * * *= * 138;<br>const int FaceBabe_N_BlondTattoo * *= * 139;<br>const int FaceBabe_N_PinkHair * * * = * 140;<br>const int FaceBabe_L_Charlotte * * *= * 141;<br>const int FaceBabe_B_RedLocks * * * = * 142;<br>const int FaceBabe_N_HairAndCloth * = * 143;<br>const int FaceBabe_N_WhiteCloth * * = * 144;<br>const int FaceBabe_N_GreyCloth * * *= * 145;<br>const int FaceBabe_N_Brown * * * * *= * 146;<br>const int FaceBabe_N_VlkBlonde * * *= * 147;<br>const int FaceBabe_N_BauBlonde * * *= * 148;<br>const int FaceBabe_N_YoungBlonde * *= * 149;<br>const int FaceBabe_N_OldBlonde * * *= * 150;<br>const int FaceBabe_P_MidBlonde * * *= * 151;<br>const int FaceBabe_N_MidBauBlonde * = * 152;<br>const int FaceBabe_N_OldBrown * * * = * 153;<br>const int FaceBabe_N_Lilo * * * * * = * 154;<br>const int FaceBabe_N_Hure * * * * * = * 155;<br>const int FaceBabe_N_Anne * * * * * = * 156;<br>const int FaceBabe_B_RedLocks2 * * *= * 157;<br>const int FaceBabe_L_Charlotte2 * * = * 158;<br><br>// Лицо Фортуно<br>const int Face_N_Fortuno * * * * * *= * 159;<br><br>// Лица пиратов<br>const int Face_P_Greg * * * * * * * = * 160;<br>const int Face_N_Pirat01 * * * * * *= * 161;<br>const int Face_N_ZombieMud * * * * *= * 162;<br><br>

26.01.2005 10:39

Re: Уроки скриптологии
 
2. Состояния тела НПС, фокусы камеры и параметры гильдий.<br><br>Все состояния тела НПС описаны в файле ..\AI_Intern\BodyStates.d, правда многие из них в игре не используются.<br><br>// *************************************************< br>// Состояния тела<br>// *************************************************< br><br>// Флаги прерываний<br>const int BS_FLAG_INTERRUPTABLE * * = * 32768; *//Состояние прерываемо<br>const int BS_FLAG_FREEHANDS * * * * = * 65536; *//Свободные руки<br><br>// ******************************************<br>// Флаги состояние тела<br>// ******************************************<br>cons t int BS_STAND * * * * * * * * *= * 0 | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS; *//Стоит<br>const int BS_WALK * * * * * * * * * = * 1 | BS_FLAG_INTERRUPTABLE; * * *//Идет<br>const int BS_SNEAK * * * * * * * * *= * 2 | BS_FLAG_INTERRUPTABLE; * * *//Подкрадывается<br>const int BS_RUN * * * * * * * * * *= * 3; * * * * * * * * * * * * * * *//Бежит<br>const int BS_SPRINT * * * * * * * * = * 4; * * * * * * * * * * * * * * *//Быстро бежит<br>const int BS_SWIM * * * * * * * * * = * 5; * * * * * * * * * * * * * * *//Плывет<br>const int BS_CRAWL * * * * * * * * *= * 6; * * * * * * * * * * * * * * *//Ползет<br>const int BS_DIVE * * * * * * * * * = * 7; * * * * * * * * * * * * * * *//Ныряет<br>const int BS_JUMP * * * * * * * * * = * 8; * * * * * * * * * * * * * * *//Прыгает<br>const int BS_CLIMB * * * * * * * * *= * 9 | BS_FLAG_INTERRUPTABLE; * * *//Взбирается<br>const int BS_FALL * * * * * * * * * = * 10; * * * * * * * * * * * * * * //Падает<br>const int BS_SIT * * * * * * * * * *= * 11 | BS_FLAG_FREEHANDS; * * * * //Сидит<br>const int BS_LIE * * * * * * * * * *= * 12; * * * * * * * * * * * * * * //Лежит<br>const int BS_INVENTORY * * * * * * *= * 13; * * * * * * * * * * * * * * //Открывает инвентарь<br>const int BS_ITEMINTERACT * * * * * = * 14 | BS_FLAG_INTERRUPTABLE; * * //Действие с предметом<br>const int BS_MOBINTERACT * * * * * *= * 15; * * * * * * * * * * * * * * //Действие с MOBом<br>const int BS_MOBINTERACT_INTERRUPT *= * 16 | BS_FLAG_INTERRUPTABLE; * * //Прерываемое действие с MOBом<br><br>const int BS_TAKEITEM * * * * * * * = * 17; * * * * * * * * * * * * * * //Берет предмет<br>const int BS_DROPITEM * * * * * * * = * 18; * * * * * * * * * * * * * * //Выкидывает предмет<br>const int BS_THROWITEM * * * * * * *= * 19; * * * * * * * * * * * * * * //Бросает предмет<br>const int BS_PICKPOCKET * * * * * * = * 20 | BS_FLAG_INTERRUPTABLE; * * //Карманная кража<br><br>const int BS_STUMBLE * * * * * * * *= * 21; * * * * * * * * * * * * * * //(не используется)<br>const int BS_UNCONSCIOUS * * * * * *= * 22; * * * * * * * * * * * * * * //Без сознания<br>const int BS_DEAD * * * * * * * * * = * 23; * * * * * * * * * * * * * * //Мертвый<br><br>const int BS_AIMNEAR * * * * * * * *= * 24; * * * * * * * * * * * * * * //Близкая цель<br>const int BS_AIMFAR * * * * * * * * = * 25; * * * * * * * * * * * * * * //Далекая цель<br>const int BS_HIT * * * * * * * * * *= * 26 | BS_FLAG_INTERRUPTABLE; * * //Удар<br>const int BS_PARADE * * * * * * * * = * 27; * * * * * * * * * * * * * * //(не используется)<br><br>// Магия<br>const int BS_CASTING * * * * * * * *= * 28; * * * * * * * * * * * * * * //Кастует<br>const int BS_PETRIFIED * * * * * * *= * 29; * * * * * * * * * * * * * * //Ошеломленный<br>const int BS_CONTROLLING * * * * * *= * 30 | BS_FLAG_INTERRUPTABLE; * * //Управляемый<br><br>const int BS_MAX * * * * * * * * * *= * 31; * * * * * * * * * * * * * * //Макс. кол-во состояний тела<br><br>// Модификаторы состояний<br>const int BS_MOD_HIDDEN * * * * * * = * 128; * * * * * * * * * * * * * *//Скрытый<br>const int BS_MOD_DRUNK * * * * * * *= * 256; * * * * * * * * * * * * * *//Пьяный<br>const int BS_MOD_NUTS * * * * * * * = * 512; * * * * * * * * * * * * * *//???<br>const int BS_MOD_BURNING * * * * * *= * 1024; * * * * * * * * * * * * * //Горящий<br>const int BS_MOD_CONTROLLED * * * * = * 2048; * * * * * * * * * * * * * //Управляемый<br>const int BS_MOD_TRANSFORMED * * * *= * 4096; * * * * * * * * * * * * * //Трансформируемый<br><br>// имена MOBов<br>const string MOB_SIT * * * * * * * *= * &quot;BENCH,CHAIR,GROUND,THRONE&quot;;<br>const string MOB_LIE * * * * * * * *= * &quot;BED,BEDHIGH,BEDLOW&quot;;<br>const string MOB_CLIMB * * * * * * *= * &quot;CLIMB,LADDER,RANKE&quot;;<br>const string MOB_NOTINTERRUPTABLE * = * &quot;DOOR,LEVER,TOUCHPLATE,TURNSWITCH,VWHEEL,CHES TBIG,CHESTSMALL,HERB,IDOL,PAN,<br>SMOKE,INNOS&quot ;;<br>// Все другие MOBы, здесь не приведенные, являются прерываемыми, это:<br>// BOOK,BSANVIL,BSCOOL,BSFIRE,BSSHARP,CAULDRON,DRUM,G RAVE,LAB,ORE,REPAIR,RMAKER,BAU<br>MSAEGE,STOVE,SDW (Stein des Wissens)<br><br>В файле ..\AI_Intern\Focus.d описываются фокусы камеры (производные INSTANCE от класса C_Focus) для следующих ситуаций:<br>Focus_Normal - обычный фокус камеры<br>Focus_Melee - фокус камеры при сражении оружием ближнег радиуса поражения<br>Focus_Ranged - фокус камеры при сражении оружием дальнего радиуса поражения<br>Focus_Throw_Item - фокус камеры при броске (метании) предмета<br>Focus_Throw_Mob - фокус камеры при броске (метании) МОВа<br>Focus_Magic - фокус камеры при кастовании заклинания<br><br>В файле ..\AI_Intern\Species.d описывается значение параметров всех гильдий<br>(производная INSTANCE Gil_Values от класса C_GILVALUES)<br><br>С этими двумя файлами разберетесь сами (кому нужно)!<br><br>*********************************** ************************<br>Сделаем небольшой перерывчик. Попрошу критически отозваться о предоставляемом метериале (что не устраивает, стиль изложения, краткость, что хотелось бы). Короче, жду критики!<br>************************************** *********************<br>

28.01.2005 12:57

Re: Уроки скриптологии
 
Замечаний и предложений нет - можно сделать два вывода; либо народ не посещает уроки (что маловероятно), либо всех все устраивает (что более вероятно). Это так информация к размышлению.<br>Продолжим...<br><br>3. Вывод отладочной информации.<br><br>Функции, ответственные за вывод отладочной информации, находятся в файле ..\AI_Intern\PrintDebug.d<br>К сожалению, все эти функции выводят информацию в окно zSpy с идентификатором определенного канала. На мой взгляд их применение очень проблематично и пользы от него мало. В скриптах по понятной причине вызов этих функций отсутствует, поэтому мы их рассматривать не будем.<br>В файле ..\AI_Intern\PrintPlus.d приведена функция вывода на экран строки текста со случайным числом в диапазоне от 0 до 100 в следующем формате: &lt;text&gt; &lt;random value 0-100&gt;. Хоть эта функция и вызывается из одного файла, смысла ее применения я не вижу.<br>Эти файлы можно вообще исключить из компиляции.<br><br>Есть еще один файл ..\AI_Intern\NPC_SetToMad.d, правда он к отладке отношения не имеет, но заслуживает удаления по причине его бесполезности.<br><br>P.S. В скриптах очень много неиспользуемой и ненужной информации, для убыстрения работы игры и минимизации памяти все неиспользуемые функции и переменные можно удалить.<br>ВНИМАНИЕ!!! Нельзя удалять неиспользуемые поля в классах, а также их добавлять, это потребует переделки экзешника!<br><br>

28.01.2005 15:44

Re: Уроки скриптологии
 
2Mitrich:<br>
Цитата:

Опа, кажется приехали... Т.е. написать свой класс НПС не получится?
<br>Имеются в виду только типы данных - класс (СLASS), есть еще другие производные типы от типа класс (PROTOTYPE и INSTANCE), с ними можно делать что угодно, можно создавать новые, можно удалять ненужные, можно менять значения но только в пределах тех полей, которые заданы базовым классом. <br>Базовые классы, их всего несколько C_Npc, C_Item, C_Focus, C_Info, C_Spell, C_SVM и C_GilValues (это все используемые классы), нельзя ни дополнить, ни удалить из них неиспользуемые поля, нельзя создать новый класс, нельзя удалить весь класс.<br><br>CLASS создан в экзешнике и перенесен в скрипты, а PROTOTYPE и INSTANCE реализованы только в скриптах! *;)<br>

28.01.2005 16:59

Re: Уроки скриптологии
 
2Vam:
Цитата:

CLASS создан в экзешнике и перенесен в скрипты, а PROTOTYPE и INSTANCE реализованы только в скриптах!
<br>Спасибо за разъяснение - так действительно понятнее. не мог бы ты поподробнее раскрыть возможности работы с PROTOTYPE и INSTANCE, т.к. вначале ты описывал их только как <br>
Цитата:

Тема первая: Типы переменных.<br>В скриптах используется всего несколько типов переменных:<br>VOID - &quot;пустой&quot; тип<br>INT - целое число<br>FLOAT - число с плавающей точкой<br>STRING - строка текста<br>CLASS - структура с внутренними типами и функциями<br>PROTOTYPE - обычно инициализация класса, но возможно и другое использование<br>INSTANCE - пока сказать нечего.
<br>Можно даже на теории+примере - так всегда достурнее.

28.01.2005 18:07

Re: Уроки скриптологии
 
2Mitrich:<br>
Цитата:

не мог бы ты поподробнее раскрыть возможности работы с PROTOTYPE и INSTANCE
<br>CLASS имеет жесткий набор переменных, в нем ничего нельзя изменить. Последовательность полей и их размер задаются в экзешнике. При загрузке экзешником класса из дат файла производится проверка его размера, и если он не совпадает с заданным в экзешнике, получаем ошибку, &quot;дат файл негодный, выполните компиляцию по-новому&quot;, и программа прекращает свою работу, можешь проверить!<br>PROTOTYPE является производной от класса и инициализирует переменные класса конкретными значениями. Могут быть инициализированы или все переменные или только их часть. Прототипов от класса можно сделать сколь угодно много с разной инициализацией. Например, один прототип от класса C_NPC может описывать общие параметры всех монстров, а другой прототип общие параметры всех людей и т.д.<br>INSTANCE является производной от класса или от прототипа, помимо инициализации переменных класса она выполняет и другие функции. Внутри инстанции могут вызываться многие специальные функции, первым параметром которых является ссылка на на саму инстанцию (self). Эти функции работают с переменными конкретно этой инстанции и никакой другой, если это явно не указано. Инстанций может быть реализовано очень много, например, каждый конкретный НПС и т.д. Если инстанция произведена от прототипа, то в ней нет надобности производить инициализацию тех переменных, которые были инициализированы в прототипе (если, конечно, нет на то необходимости).<br><br>Если кто знает С++, то в реализации классов и их производных в скриптах нет ничего сложного, но по сравнению с С++ немного запутано. В С++ всей этой классовой иерархии скриптов соответствует простой класс с объявленными для него функциями.<br>Надеюсь большинству понятны мои высказывания. *:)

29.01.2005 11:06

Re: Уроки скриптологии
 
4. Инициализация восприятий.<br><br>Функции инициализации восприятий описаны в файле ..\AI_Intern\Perception.d<br><br>// ************************************************** <br>// Устанавливается дальность действия восприятий НПС<br>// ************************************************** <br><br>FUNC VOID InitPerceptions()<br>{<br> * *// Дальность действия всех активных восприятий определена константой PERC_DIST_ACTIVE_MAX, которая записывается в поле senses_range производной от класса C_Npc.<br> * *// PERC_ASSESSPLAYER - восприятие ГГ другими НПС<br> * *// PERC_ASSESSENEMY - восприятие одного НПС другим НПС, у которого установлен флаг ATT_HOSTILE (враг), если Temp_Att != GilAtt, то возмется Temp_Att. <br> * *// PERC_ASSESSBODY - восприятие НПС мертвого тела, в настоящее время используется только в Monster-AI функциях.<br> * *// PERC_ASSESSFIGHTER - восприятие НПС ГГ с поднятым оружием или восприятие НПС всех монстров (они всегда находятся в режиме Fightmode)<br> * *// PERC_ASSESSITEM - восприятие НПС предметов<br><br> * *// *** ВНИМАНИЕ *** Активное восприятие работает только в случае, если у НПС активированы одно или несколько чувств. Зона действия активных восприятий 180° перед НПС по радиусу PERC_DIST_ACTIVE_MAX.<br><br> * *// *** ВНИМАНИЕ *** Зона действия пассивных восприятий 360° вокруг НПС на заданное расстояние.<br><br> * *// Сражение<br> * *Perc_SetRange(PERC_ASSESSDAMAGE,9999); * * * * * * * * * * *//Посылается НПС, получившему повреждение. Дальность действия не используется.<br> * *Perc_SetRange(PERC_ASSESSOTHERSDAMAGE,PERC_DIST_I NTERMEDIAT); * //Посылается всем другим (other) НПС, если НПС получил повреждение<br> * *Perc_SetRange(PERC_ASSESSDEFEAT,WATCHFIGHT_DIST_M AX); * * * //Посылается всем другим НПС, если НПС находится в бессознательном состоянии<br> * *Perc_SetRange(PERC_ASSESSMURDER,PERC_DIST_ACTIVE_ MAX); * * *//Посылается всем другим НПС, если НПС умер<br> * *Perc_SetRange(PERC_ASSESSTHREAT,PERC_DIST_INTERME DIAT); * * //Посылается НПС в течении 2 секунд, если в него целится ГГ<br> * *Perc_SetRange(PERC_DRAWWEAPON,PERC_DIST_DIALOG); * * * * * *//Посылается всем другим НПС, если ГГ достает оружие<br><br> * *// Слух<br> * *Perc_SetRange(PERC_ASSESSFIGHTSOUND,3000); * * * * * * * * *//Посылается всем другим НПС, если НПС на кого-то нападает с оружием<br> * *Perc_SetRange(PERC_ASSESSQUIETSOUND,PERC_DIST_INT ERMEDIAT); //Посылается раз в секунду всем другим НПС, если ГГ идет или бежит, а так же, когда выброшен (уронен) какой либо предмет<br><br> * *// Воровство<br> * *Perc_SetRange(PERC_ASSESSTHEFT,PERC_DIST_INTERMED IAT); * * *//Посылается всем другим НПС, если ГГ украл какой-либо предмет. При карманной краже обворованному не посылается. При телекинезе посылается всем.<br> * *Perc_SetRange(PERC_ASSESSUSEMOB,PERC_DIST_INTERME DIAT); * * //Посылается всем другим НПС, если ГГ использует MOBsi<br> * *Perc_SetRange(PERC_ASSESSENTERROOM,PERC_DIST_INTE RMEDIAT); *//Посылается всем другим НПС, если ГГ входит в помещение<br><br> * *// Магия<br> * *Perc_SetRange(PERC_ASSESSMAGIC,9999); * * * * * * * * * * * //Посылается НПС, против которого применена магия<br> * *Perc_SetRange(PERC_ASSESSSTOPMAGIC,9999); * * * * * * * * * //Посылается НПС (жертве), если магия прекращает свое действие<br><br> * *// Разговор<br> * *Perc_SetRange(PERC_ASSESSTALK,PERC_DIST_DIALOG); * * * * * *//Посылается НПС, если у ГГ есть важная информация для разговора<br><br> * *// Взаимодействие НПС<br> * *Perc_SetRange(PERC_ASSESSWARN,PERC_DIST_INTERMEDI AT); * * * //Чисто скриптовое восприятие, кому посылаем, тот и реагирует<br><br> * *// Открытие дверей<br> * *Perc_SetRange(PERC_MOVEMOB,PERC_DIST_DIALOG); * * * * * * * //Посылается всем другим НПС, если ГГ открывает дверь (сундук)<br><br> * *// Превращение<br> * *Perc_SetRange(PERC_ASSESSSURPRISE,FIGHT_DIST_CANC EL); * * * //Посылается всем другим НПС, если ГГ превращается в себя из животного<br><br> * *// Не используются!<br> * *Perc_SetRange(PERC_OBSERVEINTRUDER,100); * * * * * * * * * *//Посылается всем другим НПС, если ГГ останавливается (кроме режима подкрадывания)<br> * *Perc_SetRange(PERC_ASSESSREMOVEWEAPON,100); * * * * * * * * //Посылается всем другим НПС, если ГГ прячет оружие<br> * *Perc_SetRange(PERC_CATCHTHIEF,100); * * * * * * * * * * * * //Посылается всем другим НПС, если ГГ пойман на карманной краже<br> * *Perc_SetRange(PERC_ASSESSCALL,100); * * * * * * * * * * * * //Посылается НПС, если ГГ призывает его к разговору (дальняя дистанция)<br> * *Perc_SetRange(PERC_MOVENPC,100); * * * * * * * * * * * * * *//Посылается всем другим НПС, если ГГ идет вместе с НПС<br> * *Perc_SetRange(PERC_ASSESSCASTER,100); * * * * * * * * * * * //Посылается всем другим НПС, если ГГ инвестирует ману<br> * *Perc_SetRange(PERC_NPCCOMMAND,100); * * * * * * * * * * * * //Чисто скриптовое восприятие, можно использовать по своему усмотрению<br> * *Perc_SetRange(PERC_OBSERVESUSPECT,100); * * * * * * * * * * //Посылается всем другим НПС, если ГГ подкрадывается (в движении)<br><br> * *//Мной не обнаружены упоминания о следующих восприятиях: PERC_ASSESSGIVENITEM, PERC_ASSESSFAKEGUILD<br>};<br><br>// ************************************************** ***********<br>// Установка функций реакций НПС на нормальный набор восприятий для людей<br>// ************************************************** ***********<br><br>func void Perception_Set_Normal()<br>{<br> * *// Активные чувства при каждом состоянии активизируются по-новому, т.к. они изменяются в функции ZS_Guide_Player<br> * *self.senses * * * * = * SENSE_HEAR ¦ SENSE_SEE;<br> * *self.senses_range * = * PERC_DIST_ACTIVE_MAX;<br><br> * *// Частота проверки активных восприятий<br> * *if(Npc_KnowsInfo(self,1) ¦¦ C_NpcIsGateGuard(self)) * * //НПС имеет важную информацию или НПС охраняет вход<br> * *{<br> * * * *Npc_SetPercTime(self,0.3); * * * * * * * * * * * * *//восприятия проверяются раз в 0.3 секунды<br> * *}<br> * *else<br> * *{<br> * * * *Npc_SetPercTime(self,1); * * * * * * * * * * * * * *//восприятия проверяются раз в секунду<br> * *};<br><br> * *// Активные восприятия (приоритет наивысший)<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER, * * *B_AssessPlayer);<br> * *Npc_PercEnable(self,PERC_ASSESSENEMY, * * * B_AssessEnemy);<br><br> * *// Пассивные восприятия (приоритет задается последовательностью регистрации)<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * B_AssessMagic);<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * *B_AssessDamage);<br> * *Npc_PercEnable(self,PERC_ASSESSMURDER, * * *B_AssessMurder);<br> * *Npc_PercEnable(self,PERC_ASSESSTHEFT, * * * B_AssessTheft);<br> * *Npc_PercEnable(self,PERC_ASSESSUSEMOB, * * *B_AssessUseMob);<br> * *Npc_PercEnable(self,PERC_ASSESSENTERROOM, * B_AssessPortalCollision);<br> * *Npc_PercEnable(self,PERC_ASSESSTHREAT, * * *B_AssessThreat);<br> * *Npc_PercEnable(self,PERC_DRAWWEAPON, * * * *B_AssessDrawWeapon);<br> * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND, *B_AssessFightSound);<br> * *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND, *B_AssessQuietSound);<br> * *Npc_PercEnable(self,PERC_ASSESSWARN, * * * *B_AssessWarn);<br> * *Npc_PercEnable(self,PERC_ASSESSTALK, * * * *B_AssessTalk);<br> * *Npc_PercEnable(self,PERC_MOVEMOB, * * * * * B_MoveMob);<br>};<br><br>// ************************************************** ******************<br>// Установка функций реакций НПС на минимальный набор восприятий для людей (всегда должны быть активны)<br>// ************************************************** ******************<br><br>func void Perception_Set_Minimal()<br>{<br> * *self.senses * * * * = * SENSE_HEAR ¦ SENSE_SEE;<br> * *self.senses_range * = * PERC_DIST_ACTIVE_MAX;<br><br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * B_AssessMagic);<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * *B_AssessDamage);<br> * *Npc_PercEnable(self,PERC_ASSESSMURDER, * * *B_AssessMurder);<br> * *Npc_PercEnable(self,PERC_ASSESSTHEFT, * * * B_AssessTheft);<br> * *Npc_PercEnable(self,PERC_ASSESSUSEMOB, * * *B_AssessUseMob);<br> * *Npc_PercEnable(self,PERC_ASSESSENTERROOM, * B_AssessPortalCollision);<br>};<br><br>// ************************************************** **********<br>// Закрытие реакций НПС slf на восприятия для людей и монстров<br>// ************************************************** **********<br><br>func void B_ClearPerceptions(var C_NPC slf)<br>{<br> * *Npc_PercDisable(slf,PERC_ASSESSPLAYER);<br> * *Npc_PercDisable(slf,PERC_ASSESSENEMY);<br><br> * *Npc_PercDisable(slf,PERC_ASSESSBODY);<br><br> * *Npc_PercDisable(slf,PERC_ASSESSMAGIC);<br> * *Npc_PercDisable(slf,PERC_ASSESSDAMAGE);<br> * *Npc_PercDisable(slf,PERC_ASSESSMURDER);<br> * *Npc_PercDisable(slf,PERC_ASSESSTHEFT);<br> * *Npc_PercDisable(slf,PERC_ASSESSUSEMOB);<br> * *Npc_PercDisable(slf,PERC_ASSESSENTERROOM);<br> * *Npc_PercDisable(slf,PERC_ASSESSTHREAT);<br> * *Npc_PercDisable(slf,PERC_DRAWWEAPON);<br> * *Npc_PercDisable(slf,PERC_ASSESSFIGHTSOUND);<br> * *Npc_PercDisable(slf,PERC_ASSESSQUIETSOUND);<br> * *Npc_PercDisable(slf,PERC_ASSESSWARN);<br> * *Npc_PercDisable(slf,PERC_ASSESSTALK);<br> * *Npc_PercDisable(slf,PERC_MOVEMOB);<br><br> * *Npc_PercDisable(slf,PERC_ASSESSOTHERSDAMAGE);<br> * *Npc_PercDisable(slf,PERC_ASSESSSTOPMAGIC);<br> * *Npc_PercDisable(slf,PERC_ASSESSSURPRISE);<br>};<b r><br>// ************************************************** *******<br>// Установка функций реакций монстров и орков на восприятия<br>// ************************************************** *******<br><br>func void Perception_Set_Monster_Rtn()<br>{<br> * *Npc_SetPercTime(self,1); * * * * * * * *//частота проверки восприятия раз в секунду<br><br> * *Npc_PercEnable(self,PERC_ASSESSENEMY, * * * * * B_MM_AssessEnemy);<br> * *Npc_PercEnable(self,PERC_ASSESSBODY, * * * * * *B_MM_AssessBody);<br><br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC, * * * * * B_AssessMagic);<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE, * * * * *B_MM_AssessDamage);<br> * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE, * *B_MM_AssessOthersDamage);<br> * *Npc_PercEnable(self,PERC_ASSESSMURDER, * * * * *B_MM_AssessOthersDamage);<br> * *Npc_PercEnable(self,PERC_ASSESSWARN, * * * * * *B_MM_AssessWarn);<br>};<br><br>

31.01.2005 13:09

Re: Уроки скриптологии
 
5. Функции обработки восприятий людей.<br><br>Реакция НПС (людей) на ГГ.<br><br>// ************************************************** *****<br>// Функция реакции НПС (людей) на ГГ (обработка активного восприятия PERC_ASSESSPLAYER).<br>// ГГ должен быть в поле зрения НПС (люди не имеют чувства обоняния)<br>// Макс. дистанция реакции на ГГ - PERC_DIST_ACTIVE_MAX.<br>// ************************************************** *****<br><br>func void B_AssessPlayer()<br>{<br> * *// other в функции - ГГ, self - НПС<br> * *// Тестовый режим: Игнорирование Инспектора уровня<br> * *var C_NPC PCL;<br> * *PCL = Hlp_GetNpc(PC_Levelinspektor);<br> * *// Если ГГ является Инспектором уровня<br> * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL))<br> * *{<br> * * * *return;<br> * *};<br> * *// Если ГГ находится в режиме диалога<br> * *if(other.aivar[AIV_INVINCIBLE] == TRUE)<br> * *{<br> * * * *return;<br> * *};<br> * *// Если ГГ мертв, безсознания или в магическом сне<br> * *if(C_NpcIsDown(other))<br> * *{<br> * * * *return;<br> * *};<br> * *// Если ГГ превращен в монстра<br> * *if(other.guild &gt; GIL_SEPERATOR_HUM) <br> * *{<br> * * * *// Если НПС охранник, то он должен задержать любого монстра<br> * * * *if(C_NpcIsGateGuard(self))<br> * * * *{<br> * * * * * *// НПС встает<br> * * * * * *AI_StandUpQuick(self);<br> * * * * * *// вызов функции сражения<br> * * * * * *B_Attack(self,other,AR_MonsterCloseToGate,0);<br> * * * * * *return;<br> * * * *}<br> * * * *// если гильдии ГГ и НПС враждебны<br> * * * *else if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)<br> * * * *{<br> * * * * * *// если НПС не сопровождает ГГ и НПС не является другом ГГ<br> * * * * * *if(self.aivar[AIV_PARTYMEMBER] == FALSE) &amp;&amp; (self.npctype != NPCTYPE_FRIEND)<br> * * * * * *{<br> * * * * * * * *// вызов функции сражения<br> * * * * * * * *B_Attack(self,other,AR_GuildEnemy,0);<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// Если ГГ враг<br> * *if(B_AssessEnemy()) <br> * *{ <br> * * * *return;<br> * *};<br> * *// Если ГГ бандит и НПС не бандит<br> * *if(C_PlayerIsFakeBandit(self,other) &amp;&amp; (self.guild != GIL_BDT))<br> * *{<br> * * * *// вызов функции сражения<br> * * * *B_Attack(self,other,AR_GuildEnemy,0);<br> * *};<br> * *// Если ГГ убийца и НПС должен атаковать убийцу и расстояние между ГГ и НПС &lt;= PERC_DIST_INTERMEDIAT<br> * *if(B_GetPlayerCrime(self) == CRIME_MURDER) &amp;&amp; C_WantToAttackMurder(self,other) &amp;&amp; (Npc_GetDistToNpc(self,other) &lt;= PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *// вызов функции сражения<br> * * * *B_Attack(self,other,AR_HumanMurderedHuman,0); * <br> * * * *return;<br> * *};<br> * *// Если ГГ вошел в помещение, ему не принадлежащее<br> * *if(B_AssessEnterRoom()) <br> * *{<br> * * * *return;<br> * *};<br> * *// Если оружие ГГ обнажено<br> * *if(B_AssessDrawWeapon())<br> * *{<br> * * * *return;<br> * *}<br> * *else // сброс флага комментирования обнаженного оружия<br> * *{<br> * * * *Player_DrawWeaponComment = FALSE;<br> * *};<br> * *// Если ГГ подкрадывается<br> * *if(C_BodyStateContains(other,BS_SNEAK))<br> * *{<br> * * * *// если НПС не наблюдает за ГГ и НПС должен реагировать на крадущегося ГГ<br> * * * *if(!Npc_IsInState(self,ZS_ObservePlayer) &amp;&amp; C_WantToReactToSneaker(self,other))<br> * * * *{<br> * * * * * *// очистка AI команд НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// очистка восприятий НПС<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// перевод НПС в состояние наблюдения за ГГ<br> * * * * * *AI_StartState(self,ZS_ObservePlayer,1,&quot;&quot ;);<br> * * * * * *return;<br> * * * *};<br> * *}<br> * *else // ГГ не подкрадывается<br> * *{<br> * * * *// если ГГ не стоит<br> * * * *if(!C_BodyStateContains(other,BS_STAND))<br> * * * *{<br> * * * * * *// сброс флага комментирования крадущегося ГГ<br> * * * * * *Player_SneakerComment = FALSE;<br> * * * *};<br> * *};<br> * *// Если ГГ не лежит<br> * *if(!C_BodyStateContains(other,BS_LIE))<br> * *{<br> * * * *// сброс флага комментирования, что ГГ лег на чужую кровать<br> * * * *Player_GetOutOfMyBedComment = FALSE;<br> * *};<br> * *// Важная информация для окружающих черных магов (я так понимаю, что это ищущие)<br> * *B_AssignDementorTalk(self);<br> * *// *********** Диалог *************<br> * *// Если расстояние между ГГ и НПС &lt;= дистанции начала разговора и НПС имеет важную информацию<br> * *if(Npc_GetDistToNpc(self,other) &lt;= PERC_DIST_DIALOG) &amp;&amp; (Npc_CheckInfo(self,1))<br> * *{<br> * * * *// Если НПС охраняет ворота<br> * * * *if(C_NpcIsGateGuard(self))<br> * * * *{<br> * * * * * *// установка флага для НПС при обращении с важной информацией к ГГ<br> * * * * * *self.aivar[AIV_NpcStartedTalk] = TRUE;<br> * * * * * *// функция диалога<br> * * * * * *B_AssessTalk();<br> * * * * * *return;<br> * * * *}<br> * * * *else //для других НПС<br> * * * *{<br> * * * * * *// если ГГ не падает и не плывет и не ныряет<br> * * * * * *if(!C_BodyStateContains(other,BS_FALL)) &amp;&amp; (!C_BodyStateContains(other,BS_SWIM)) &amp;&amp; (!C_BodyStateContains(other,BS_DIVE))<br> * * * * * *// и ГГ не занимается криминалом<br> * * * * * *&amp;&amp; (B_GetPlayerCrime(self) == CRIME_NONE)<br> * * * * * *// и ГГ не отказался от разговора с НПС<br> * * * * * *&amp;&amp; (C_RefuseTalk(self,other) == FALSE)<br> * * * * * *// и ГГ не является членом подставной гильдии<br> * * * * * *&amp;&amp; (C_PlayerHasFakeGuild(self,other) == FALSE)<br> * * * * * *{<br> * * * * * * * *// установка флага для НПС при обращении с важной информацией к ГГ<br> * * * * * * * *self.aivar[AIV_NpcStartedTalk] = TRUE;<br> * * * * * * * *// функция диалога<br> * * * * * * * *B_AssessTalk();<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *}; *<br> * *// *********** Приветствие *************<br> * *// если НПС идет и расстояние между ГГ и НПС &lt;= дистанции начала разговора<br> * *if (C_BodyStateContains(self,BS_WALK)) &amp;&amp; (Npc_GetDistToNpc(self,other) &lt;= PERC_DIST_DIALOG)<br> * *// и ГГ не отказался от диалога и НПС не охранник<br> * *&amp;&amp; (Npc_RefuseTalk(other) == FALSE) &amp;&amp; (!C_NpcIsGateGuard(self))<br> * *// и ГГ не является членом подставной гильдии<br> * *&amp;&amp; (C_PlayerHasFakeGuild(self,other) == FALSE) * * * * *<br> * *{ * <br> * * * *// НПС и ГГ смотрят друг на друга<br> * * * *B_LookAtNpc(self,other);<br> * * * *// звучит приветственная фраза<br> * * * *B_Say_GuildGreetings(self,other);<br> * * * *// НПС и ГГ перестают смотреть друг на друга<br> * * * *B_StopLookAt(self);<br> * * * *// отказ ГГ от диалога на 20 секунд<br> * * * *Npc_SetRefuseTalk(other,20);<br> * *};<br> * *// *********** Сброс предупреждений охраной *************<br> * *// если НПС охранник и расстояние между ГГ и НПС &gt; дистанции начала разговора<br> * *if(C_NpcIsGateGuard(self)) &amp;&amp; (Npc_GetDistToNpc(self,other) &gt; PERC_DIST_DIALOG)<br> * *{<br> * * * *// Статус предупреждений охраны = Нет предупреждений<br> * * * *self.aivar[AIV_Guardpassage_Status] = GP_NONE;<br> * *};<br> * *return;<br>};<br><br>

01.02.2005 11:54

Re: Уроки скриптологии
 
Реакция НПС людей на врага.<br><br>// ************************************************** ******************************<br>// Функция реакции НПС (людей) на врага (обработка активного восприятия PERC_ASSESSENEMY).<br>// враг должен быть в поле зрения НПС (люди не имеют чувства обоняния)<br>// Макс. дистанция реакции на врага - PERC_DIST_ACTIVE_MAX.<br>// ************************************************** ******************************<br>// Возвращает TRUE, если реакция НПС на врага закончилась сражением<br>// ************************************************** ******************************<br><br>func int B_AssessEnemy()<br>{<br> * *// other в функции - враг, self - НПС<br> * *// Тестовый режим: Игнорирование Инспектора уровня<br> * *var C_NPC PCL;<br> * *PCL = Hlp_GetNpc(PC_Levelinspektor);<br> * *// Если враг является Инспектором уровня<br> * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Аддон<br> * *// Если (враг не ГГ и враг человек<br> * *if((Hlp_GetInstanceID(other) != Hlp_GetInstanceID(hero)) &amp;&amp; (other.guild &lt; GIL_SEPERATOR_HUM)<br> * *// и (НПС не может атаковать или враг не может атаковать)) <br> * * * *&amp;&amp; ((self.aivar[AIV_NoFightParker] == TRUE) ¦¦ (other.aivar[AIV_NoFightParker] == TRUE)))<br> * *// или (враг монстр и враг не может атаковать)<br> * * * *¦¦ ((other.guild &gt; GIL_SEPERATOR_HUM) &amp;&amp; (other.aivar[AIV_NoFightParker] == TRUE))<br> * *{<br> * * * *return FALSE;<br> * *}; *<br> * *// Аддон<br> * *// Если (враг плывет или враг ныряет) и НПС не хочет лезть в воду<br> * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) &amp;&amp; (self.aivar[AIV_MM_FollowInWater] == FALSE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если расстояние по высоте между НПС и врагом &gt; дистанции реагирования по высоте<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если НПС член партии<br> * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *// если дистанция между НПС и врагом &gt; 1.5 метра<br> * * * *if(Npc_GetDistToNpc(self,other) &gt; 1500)<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * * * *// если НПС не видит врага<br> * * * *if(!Npc_CanSeeNpc(self, other))<br> * * * *{ * <br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// Если враг является переодетым бандитом и НПС бандит<br> * *if(C_PlayerisFakeBandit(self,other)) &amp;&amp; (self.guild == GIL_BDT)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Магический Голем<br> * *var C_NPC MGO; MGO = Hlp_GetNpc(MagicGolem);<br> * *// Ларес<br> * *var C_NPC LAR; LAR = Hlp_GetNpc(VLK_449_Lares);<br> * *// Если НПС есть Ларес и враг есть Магический Голем<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(LAR)) &amp;&amp; (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(MGO))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если (врагов у НПС нет или врагов у врага нет) и враг человек<br> * *if((self.aivar[AIV_EnemyOverride] == TRUE) ¦¦ (other.aivar[AIV_EnemyOverride] == TRUE)) &amp;&amp; (other.guild &lt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если отношения между НПС и врагом не вражеские<br> * *if(Npc_GetAttitude(self,other) != ATT_HOSTILE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если НПС охраняет ворота<br> * *if(C_NpcIsGateGuard(self))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *<br> * *// Если враг есть ГГ и НПС ему друг<br> * *if(Npc_IsPlayer(other) &amp;&amp; (self.npctype == NPCTYPE_FRIEND)) <br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// Если гильдии НПС и врага не враждуют между собой<br> * *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE)<br> * *{<br> * * * *// Если НПС враждебен к врагу [Примечание, далее врагом может быть только ГГ, т.к. прочие НПС не имеют temp_att к другим НПС]<br> * * * *if(Npc_GetAttitude(self,other) == ATT_HOSTILE)<br> * * * *// и (НПС находится в текущем состоянии &gt; 2 секунд или НПС наблюдает за ГГ)<br> * * * *&amp;&amp; ((Npc_GetStateTime(self) &gt; 2) ¦¦ Npc_IsInState(self,ZS_ObservePlayer))<br> * * * *// и дистанция между НПС и ГГ &lt;= дальности действия пассивного восприятия<br> * * * *&amp;&amp; (Npc_GetDistToNpc(self,other) &lt;= PERC_DIST_INTERMEDIAT)<br> * * * *{<br> * * * * * *// вызов функции сражения<br> * * * * * *B_Attack(self, other, self.aivar[AIV_LastPlayerAR], 0);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// В любом другом случае вызов функции сражения<br> * *B_Attack(self,other,AR_GuildEnemy,0);<br> * *return TRUE;<br>};<br><br>

02.02.2005 14:23

Re: Уроки скриптологии
 
Реакция людей и монстров на магию.<br><br>// ************************************************** ****************<br>// Функция реакции НПС (людей и монстров) на магию.<br>// ************************************************** ****************<br><br>func void B_AssessMagic ()<br>{<br> * *// self - жертва заклинания<br> * *// Если применено заклинание нападения<br> * *if(Npc_GetLastHitSpellCat(self) == SPELL_BAD)<br> * *{<br> * * * *// всем другим НПС посылается пассивное восприятие, что на НПС self осуществлено нападение<br> * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * *};<br> * *// Если применено заклинание &quot;Смерч&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Whirlwind)<br> * *{<br> * * * *// очистка AI команд НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// очистка восприятий НПС<br> * * * *B_ClearPerceptions(self);<br> * * * *// вызов функции реакции на заклинание &quot;Смерч&quot;<br> * * * *AI_StartState(self,ZS_Whirlwind,0,&quot;&quot;);< br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Украсть энергию&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *AI_StartState(self,ZS_SuckEnergy,0,&quot;&quot;); <br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Зеленые щупальца&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Greententacle) * *<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *AI_StartState(self,ZS_Greententacle,0,&quot;&quot ;);<br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Рой&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Swarm)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *AI_StartState(self,ZS_Swarm,0,&quot;&quot;);<br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Ледяная глыба&quot; или &quot;Ледяная волна&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_IceCube) ¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceWave)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *AI_StartState(self,ZS_MagicFreeze,0,&quot;&quot;) ;<br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Шаровая молния&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_ChargeZap)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *AI_StartState(self,ZS_ShortZapped,0,&quot;&quot;) ;<br> * * * *return;<br> * *};<br> * *// Если применено заклинание &quot;Страх&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Fear) <br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *Npc_SetTarget(self,other);<br> * * * *// если НПС человек и НПС не Маг огня и НПС не Паладин<br> * * * *if(self.guild &lt; GIL_SEPERATOR_HUM) &amp;&amp; (self.guild != GIL_KDF) &amp;&amp; (self.guild != GIL_PAL)<br> * * * *{<br> * * * * * *AI_StartState(self,ZS_MagicFlee,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *}<br> * * * *// иначе, если НПС монстр и не дракон и не троль и не големы<br> * * * *else if (self.guild &gt; GIL_SEPERATOR_HUM) &amp;&amp; (self.guild != GIL_DRAGON) &amp;&amp; (self.guild != GIL_TROLL)<br> * * * *&amp;&amp; (self.guild != GIL_STONEGOLEM) &amp;&amp; (self.guild != GIL_ICEGOLEM) &amp;&amp; (self.guild != GIL_FIREGOLEM)<br> * * * *{<br> * * * * * *AI_StartState(self,ZS_MM_Flee,0,&quot;&quot;);<br > * * * * * *return;<br> * * * *};<br> * *};<br> * *// Если применено заклинание &quot;Огненный дождь&quot;<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Firerain) * * <br> * *{ * <br> * * * *Npc_ClearAIQueue(self);<br> * * * *AI_StartState(self,ZS_MagicBurnShort,0,&quot;&quo t;);<br> * * * *return;<br> * *};<br>};<br><br>// ************************************************** *<br>// Объявление функции реакции на магию для ГГ<br>// У ГГ восприятие PERC_ASSESSMAGIC всегда активно.<br>// ************************************************** *<br>// Функция PLAYER_PERC_ASSESSMAGIC вызывается только ядром системы<br>// ************************************************** *<br><br>const func PLAYER_PERC_ASSESSMAGIC = B_AssessMagic; * * <br><br>

03.02.2005 11:26

Re: Уроки скриптологии
 
// ************************************************** **************<br>// Функция реакции людей на повреждение<br>// ************************************************** **************<br><br>func void B_AssessDamage()<br>{<br> * *// self - жертва, other - агрессор<br> * *var C_NPC Quarho;<br> * *// Куарходрон<br> * *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);<br> * *var C_NPC Rhadem;<br> * *// Радемес<br> * *Rhadem = Hlp_GetNpc(NONE_ADDON_112_Rhademes);<br> * *// Если жертва Куарходрон или Радемес<br> * *if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho))) ¦¦ ((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rhadem)))<br> * *{<br> * * * *// вызов функции реакции на повреждение для призраков <br> * * * *B_GhostSpecialDamage(other,self);<br> * * * *return;<br> * *};<br> * *// вызов функции реакции на повреждение &quot;Когтем Белиара&quot;<br> * *B_BeliarsWeaponSpecialDamage(other,self);<br> * *// если жертва Альрик получает повреждение после того, как он сдался<br> * *if(self.aivar[AIV_ArenaFight] == AF_AFTER)<br> * *{<br> * * * *// ГГ нечестно выиграл сражение с Альриком<br> * * * *self.aivar[AIV_ArenaFight] = AF_AFTER_PLUS_DAMAGE;<br> * *};<br> * *// если у жертвы врагов не было<br> * *if(self.aivar[AIV_EnemyOverride] == TRUE)<br> * *{<br> * * * *var C_NPC RAV;<br> * * * *// Равен<br> * * * *RAV = Hlp_GetNpc(BDT_1090_Addon_Raven);<br> * * * *// если Равен жертва<br> * * * *if(Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(RAV)))<br> * * * *{<br> * * * * * *// теперь у Равена есть враг<br> * * * * * *self.aivar[AIV_EnemyOverride] = FALSE;<br> * * * *};<br> * *};<br> * *// если жертва находится в состоянии атаки<br> * *if(Npc_IsInState(self,ZS_Attack))<br> * *{<br> * * * *// если ГГ агрессор и жертва друг ГГ (Примечание: защита от нанесения повреждений ГГ своему другу, если они вместе с кем-то сражаются)<br> * * * *if(Npc_IsPlayer(other)) &amp;&amp; (self.npctype == NPCTYPE_FRIEND)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если ГГ агрессор и жертва член партии ГГ<br> * * * *if(Npc_IsPlayer(other)) &amp;&amp; (self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если НПС агрессор не является НПС, атакованным жертвой<br> * * * *if(Hlp_GetInstanceID(other) != self.aivar[AIV_LASTTARGET])<br> * * * *{<br> * * * * * *// если удар жертве нанесен агрессором не первый раз или агрессор не ГГ<br> * * * * * *if(self.aivar[AIV_HitByOtherNpc] == Hlp_GetInstanceID(other)) ¦¦ (Hlp_GetInstanceID(other) != Hlp_GetInstanceID(hero)) <br> * * * * * *{<br> * * * * * * * *// смена цели (жертва будет атаковать агрессора)<br> * * * * * * * *Npc_SetTarget(self,other);<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// при первом ударе жертве записывается ID агрессора<br> * * * * * * * *self.aivar[AIV_HitByOtherNpc] = Hlp_GetInstanceID(other);<br> * * * * * *};<br> * * * *};<br> * * * *return;<br> * *};<br> * *// реакция жертвы на врага<br> * *if(B_AssessEnemy())<br> * *{<br> * * * *return;<br> * *};<br> * *// если НПС агрессор не ГГ и причины нападать у него не было<br> * *if(!Npc_IsPlayer(other)) &amp;&amp; (other.aivar[AIV_ATTACKREASON] == AR_NONE)<br> * *{<br> * * * *// жертва атакует НПС агрессора<br> * * * *B_Attack(self,other,AR_NONE,0);<br> * * * *return;<br> * *};<br> * *// если агрессор нападает с мечом или с кулаками или вышел из режима нападения (спрятал оружие)<br> * *if(Npc_IsInFightMode(other,FMODE_MELEE)) ¦¦ (Npc_IsInFightMode(other,FMODE_FIST)) ¦¦ (Npc_IsInFightMode(other,FMODE_NONE))<br> * *{<br> * * * *// если отношения между агрессором и жертвой дружеские или жертва является другом агрессора ГГ<br> * * * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY) ¦¦ ((self.npctype == NPCTYPE_FRIEND) &amp;&amp; Npc_IsPlayer(other))<br> * * * *{<br> * * * * * *// если жертва не находится в состоянии реакции на повреждение<br> * * * * * *if(!Npc_IsInState(self,ZS_ReactToDamage))<br> * * * * * *{<br> * * * * * * * *// очистка очереди состояний жертвы<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// очистка восприятий жертвы<br> * * * * * * * *B_ClearPerceptions(self);<br> * * * * * * * *// перевод жертвы в состояние реакции на повреждение<br> * * * * * * * *AI_StartState(self,ZS_ReactToDamage,0,&quot;&quot ;);<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// жертва атакует агрессора<br> * *B_Attack(self,other,AR_ReactToDamage,0);<br> * *return;<br>};<br><br><br>

07.02.2005 09:55

Re: Уроки скриптологии
 
// ************************************************** **<br>// Функция реакции людей на убийство<br>// ************************************************** **<br><br>func void B_AssessMurder()<br>{<br> * *// self - свидетель убийства, other - преступник (убийца), victim - жертва (труп)<br> * *// если свидетель убийца<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(other)) <br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояния между (свидетелем и преступником) и (свидетелем и жертвой) &gt; макс. дальности действия восприятия<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_INTERMEDIAT) &amp;&amp; (Npc_GetDistToNpc(self,victim) &gt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояния по высоте между (свидетелем и преступником) и (свидетелем и жертвой) &gt; дальности реакций НПС<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT) &amp;&amp; (Npc_GetHeightToNpc(self,victim) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель не видит преступника и свидетель не видит жертву<br> * *if(!Npc_CanSeeNpcFreeLOS(self,other)) &amp;&amp; (!Npc_CanSeeNpcFreeLOS(self,victim))<br> * *{<br> * * * *return;<br> * *};<br> * *// вызов функции реакции свидетеля на преступника (врага)<br> * *if(B_AssessEnemy()) <br> * *{ <br> * * * *return;<br> * *}; * * * * * * * * *<br> * *// если жертва овца и она убита не &quot;крутым парнем&quot;<br> * *if(victim.guild == GIL_SHEEP) &amp;&amp; (victim.aivar[AIV_ToughGuy] == FALSE)<br> * *{<br> * * * *// если есть причина свидетелю атаковать преступника<br> * * * *if(C_WantToAttackSheepKiller(self,other))<br> * * * *{<br> * * * * * *// вызов функции атаки<br> * * * * * *B_Attack(self,other,AR_SheepKiller,0);<br> * * * * * *return;<br> * * * *}<br> * * * *else // в противном случае<br> * * * *{<br> * * * * * *// если свидетель является охранником ворот<br> * * * * * *if(C_NpcIsGateGuard(self))<br> * * * * * *{<br> * * * * * * * *// свидетель запоминает новость, что преступник убил овцу<br> * * * * * * * *B_MemorizePlayerCrime(self,other,CRIME_SHEEPKILLE R);<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если преступник монстр и жертва монстр<br> * *if(other.guild &gt; GIL_SEPERATOR_HUM) &amp;&amp; (victim.guild &gt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return;<br> * *};<br> * *// если преступник монстр<br> * *if(other.guild &gt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// свидетель атакует монстра<br> * * * *B_Attack(self,other,AR_MonsterMurderedHuman,0);<b r> * * * *return;<br> * *};<br> * *// если жертва монстр<br> * *if(victim.guild &gt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return;<br> * *};<br> * *// если у свидетеля врагов не было<br> * *if(self.aivar[AIV_EnemyOverride] == TRUE)<br> * *{ * <br> * * * *// теперь у свидетеля есть враг<br> * * * *self.aivar[AIV_EnemyOverride] = FALSE;<br> * * * *// свидетелю разрешено воспринимать все объекты в зоне действия восприятия<br> * * * *Npc_PerceiveAll(self);<br> * * * *// поиск свидетелем цели<br> * * * *Npc_GetNextTarget(self);<br> * * * *// если преступник существует и он не бессознателен<br> * * * *if(Hlp_IsValidNpc(other)) &amp;&amp; (!C_NpcIsDown(other))<br> * * * *{<br> * * * * * *// свидетель атакует преступника<br> * * * * * *B_Attack(self,other,AR_GuildEnemy,0);<br> * * * * * *return;<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если (свидетель враждебен к жертве или свидетель зол на жертву)<br> * *if((Npc_GetAttitude(self,victim) == ATT_HOSTILE) ¦¦ (Npc_GetAttitude(self,victim) == ATT_ANGRY))<br> * *// и (свидетель друг преступника или свидетель нейтрален к преступнику)<br> * *&amp;&amp; ((Npc_GetAttitude(self,other) == ATT_FRIENDLY) ¦¦ (Npc_GetAttitude(self,other) == ATT_NEUTRAL))<br> * *{<br> * * * *return;<br> * *};<br> * *// если преступник ГГ и свидетель его друг<br> * *if(Npc_IsPlayer(other) &amp;&amp; (self.npctype == NPCTYPE_FRIEND))<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель не должен реагировать на убийство<br> * *if(!C_WantToAttackMurder(self,other))<br> * *{<br> * * * *// если свидетель является охранником ворот<br> * * * *if(C_NpcIsGateGuard(self))<br> * * * *{<br> * * * * * *// свидетель запоминает новость, что преступник убийца<br> * * * * * *B_MemorizePlayerCrime(self,other,CRIME_MURDER);<b r> * * * *};<br> * * * *return;<br> * *};<br> * *// если преступник и жертва являются НПС, которым разрешено убить друг друга<br> * *if(other.aivar[AIV_DropDeadAndKill] == TRUE) ¦¦ (victim.aivar[AIV_DropDeadAndKill] == TRUE)<br> * *{<br> * * * *return;<br> * *};<br> * *// если жертва черный маг (ищущий) или (жертва бандит и он не из Лагеря бандитов)<br> * *if(victim.guild == GIL_DMT) ¦¦ ((victim.guild == GIL_BDT) &amp;&amp; !C_NpcBelongsToBL(victim))<br> * *{<br> * * * *return;<br> * *};<br> * *// свидетель атакует преступника<br> * *B_Attack(self,other,AR_HumanMurderedHuman,0);<br> * *return;<br>};<br><br>

08.02.2005 11:03

Re: Уроки скриптологии
 
// ************************************************** *********<br>// Функция реакции людей на воровство<br>// ************************************************** *********<br>// Вызывается в качестве реакции на пассивное восприятие PERC_ASSESSTHEFT <br>// в зоне действия PERC_DIST_INTERMEDIAT когда НПС поднимает какой-либо предмет<br>// ************************************************** *********<br><br>func void B_AssessTheft()<br>{<br> * *// other - вор, self - свидетель<br> * *// если вор не ГГ<br> * *if(!Npc_IsPlayer(other)) <br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ находится в доме, принадлежащим любой гильдии, и расстояние между свидетелем и вором &gt; дистанции реакции через закрытые двери<br> * *if(Wld_GetPlayerPortalGuild() &gt;= GIL_NONE) &amp;&amp; (Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_INDOOR_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если гильдии вора и свидетеля дружественны<br> * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY)<br> * *{<br> * * * *// если предмет существует и он принадлежит свидетелю<br> * * * *if(Hlp_IsValidItem(item)) &amp;&amp; (Npc_OwnedByNpc(item,self))<br> * * * *{<br> * * * * * *// продолжаем анализ ситуации дальше<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *}; * * *<br> * *};<br> * *// если предмет принадлежал ГГ ранее<br> * *if(!C_IsTakenItemMyPossession(self,other,item))<b r> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель не видит вора<br> * *if(!Npc_CanSeeNpc(self,other))<br> * *{<br> * * * *// если свидетель и ГГ находится в одном помещении и если (свидетель наблюдает за ГГ или свидетель находится в состоянии &quot;незваного гостя&quot;)<br> * * * *if(Npc_IsInPlayersRoom(self)) &amp;&amp; ((Npc_IsInState(self,ZS_ObservePlayer)) ¦¦ (Npc_IsInState(self,ZS_ClearRoom)))<br> * * * *{<br> * * * * * *// продолжаем анализ ситуации дальше<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если свидетель игнорирует вора<br> * *if(!C_WantToAttackThief(self,other))<br> * *{<br> * * * *// если свидетель является охранником ворот<br> * * * *if(C_NpcIsGateGuard(self))<br> * * * *{<br> * * * * * *// свидетель запоминает новость, что ГГ вор<br> * * * * * *B_MemorizePlayerCrime(self,other,CRIME_THEFT);<br > * * * *};<br> * * * *return;<br> * *};<br> * *// свидетель атакует вора<br> * *B_Attack(self,other,AR_Theft,0);<br> * *return;<br>};<br><br>... и еще одна функция, очень похожая на предыдущую<br><br>// ************************************************** **<br>// Функция реакции людей на использование МОB's<br>// ************************************************** **<br><br>func void B_AssessUseMob()<br>{<br> * *// other - пользователь, self - свидетель<br> * *// если пользователь не ГГ<br> * *if(!Npc_IsPlayer(other)) <br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ находится в доме, принадлежащим любой гильдии<br> * *if(Wld_GetPlayerPortalGuild() &gt;= GIL_NONE)<br> * *{<br> * * * *// если расстояние между свидетелем и пользователем &gt; дистанции реакции через закрытые двери<br> * * * *if (Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_INDOOR_HEIGHT)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если гильдии пользователя и свидетеля дружественны<br> * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY)<br> * *{<br> * * * *// если МОВ принадлежит свидетелю<br> * * * *if(Npc_IsDetectedMobOwnedByNpc(other,self))<br> * * * *{<br> * * * * * *// продолжаем анализ ситуации дальше<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *}; * * *<br> * *};<br> * *// если МОВ принадлежал ГГ ранее<br> * *if(!C_IsUsedMobMyPossession(self,other))<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель не видит пользователя<br> * *if(!Npc_CanSeeNpc(self,other))<br> * *{<br> * * * *// если свидетель и ГГ находятся в одном помещении и если (свидетель наблюдает за ГГ или свидетель находится в состоянии &quot;незваного гостя&quot;)<br> * * * *if(Npc_IsInPlayersRoom(self)) &amp;&amp; ((Npc_IsInState(self,ZS_ObservePlayer)) ¦¦ (Npc_IsInState(self,ZS_ClearRoom)))<br> * * * *{<br> * * * * * *// продолжаем анализ ситуации дальше<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *var string detMob;<br> * *// получить название МОВа, используемого ГГ<br> * *detMob = Npc_GetDetectedMob(other);<br> * *// если МОВ не &quot;Большой сундук&quot; и МОВ не &quot;Маленький сундук&quot;<br> * *if(Hlp_StrCmp(detMob,&quot;CHESTBIG&quot;) == FALSE) &amp;&amp; (Hlp_StrCmp(detMob,&quot;CHESTSMALL&quot;) == FALSE)<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель игнорирует пользователя<br> * *if(!C_WantToAttackThief(self,other))<br> * *{<br> * * * *// если свидетель является охранником ворот<br> * * * *if (C_NpcIsGateGuard(self))<br> * * * *{<br> * * * * * *// свидетель запоминает новость, что ГГ вор<br> * * * * * *B_MemorizePlayerCrime(self,other,CRIME_THEFT);<br > * * * *};<br> * * * *return;<br> * *};<br> * *// свидетель атакует пользователя<br> * *B_Attack(self,other,AR_UseMob,0);<br> * *return;<br>};<br><br>

09.02.2005 10:25

Re: Уроки скриптологии
 
// ************************************************** ******************************<br>// Функция реакции людей на вход НПС в помещение<br>// ----------------------------------------<br>// Возвращает TRUE при реакции на вошедшего или FALSE, когда на вошедшего не реагируют<br>// ************************************************** ******************************<br><br>func int B_AssessEnterRoom()<br>{<br> * *// other - вошедший, self - свидетель<br> * *var int portalguild;<br> * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)<br> * *portalguild = Wld_GetPlayerPortalGuild();<br> * *// если вошедший ГГ и комментарий входа уже был и помещение принадлежит какой-либо гильдии и помещение не публичное<br> * *if(Npc_IsPlayer(other)) &amp;&amp; (Player_LeftRoomComment == TRUE) &amp;&amp; (portalguild &gt; GIL_NONE) &amp;&amp; (portalguild != GIL_PUBLIC)<br> * *{<br> * * * *// сброс комментария входа<br> * * * *Player_LeftRoomComment = FALSE;<br> * *};<br> * *// если расстояние между вошедшим и свидетелем &gt; 10м<br> * *if(Npc_GetDistToNpc(self,other) &gt; 1000)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если свидетель и вошедший (ГГ) находятся не в одном помещении и свидетель находится не снаружи помещения<br> * *if(!Npc_IsInPlayersRoom(self)) &amp;&amp; (!(Npc_GetPortalGuild(self) &lt; GIL_NONE))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если свидетель находится в состоянии атаки<br> * *if(Npc_IsInState(self,ZS_Attack))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если свидетель является охранником ворот<br> * *if(C_NpcIsGateGuard(self))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если вошедший не ГГ<br> * *if(!Npc_IsPlayer(other))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если свидетель друг ГГ<br> * *if(self.npctype == NPCTYPE_FRIEND)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если отношения между свидетелем и ГГ дружеские<br> * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если ГГ крадется или ГГ стоит<br> * *if(C_BodyStateContains(other,BS_SNEAK)) ¦¦ (C_BodyStateContains(other,BS_STAND))<br> * *{<br> * * * *// если свидетель не видит ГГ и свидетель не наблюдает за ГГ<br> * * * *if(!Npc_CanSeeNpc(self,other)) &amp;&amp; (!Npc_IsInState(self,ZS_ObservePlayer))<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если свидетель не принадлежит к гильдии<br> * *if(self.guild == GIL_NONE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если свидетель и ГГ находятся не в одном помещениии и свидетель спит<br> * *if(!Npc_IsInPlayersRoom(self)) &amp;&amp; (Npc_IsInState(self,ZS_Sleep))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если помещение публично и свидетель находится в одном помещении с ГГ<br> * *if(portalguild == GIL_PUBLIC) &amp;&amp; (Npc_IsInPlayersRoom(self))<br> * *{<br> * * * *// если свидетель наблюдает за ГГ<br> * * * *if(Npc_IsInState(self,ZS_ObservePlayer))<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * * * *// если свидетель лежит<br> * * * *if(C_BodyStateContains(self,BS_LIE))<br> * * * *{<br> * * * * * *// свидетель встает (Примечание: мне непонятно как он это делает)<br> * * * * * *B_MM_DeSynchronize();<br> * * * *};<br> * * * *// если свидетель<br> * * * *if(Npc_IsInState(self,ZS_Potion_Alchemy)) * * * // занимается алхимией<br> * * * *¦¦ (Npc_IsInState(self,ZS_Read_Bookstand)) * * *// или читает книгу<br> * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Bench)) * * * * * // или сидит на скамье<br> * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Campfire)) * * * *// или сидит у костра<br> * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Chair)) * * * * * // или сидит на стуле<br> * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Throne)) * * * * *// или сидит на троне<br> * * * *¦¦ (Npc_IsInState(self,ZS_Sleep)) * * * * * * * // или спит<br> * * * *¦¦ (Npc_IsInState(self,ZS_Smalltalk)) * * * * * // или ведет светскую беседу<br> * * * *¦¦ (Npc_IsInState(self,ZS_Smoke_Joint)) * * * * // или курит<br> * * * *¦¦ (Npc_IsInState(self,ZS_Stand_ArmsCrossed)) * // или стоит со скрещенными руками<br> * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Drinking)) * * *// или пьет<br> * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Eating)) * * * *// или ест<br> * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Guarding)) * * *// или охраняет<br> * * * *¦¦ (Npc_IsInState(self,ZS_Stand_WP)) * * * * * *// или стоит на вайпоинте<br> * * * *{<br> * * * * * *// очистка очереди состояний свидетеля<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// очистка восприятий свидетеля<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// если свидетель сидит<br> * * * * * *if(C_BodyStateContains(self,BS_SIT))<br> * * * * * *{<br> * * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ<br> * * * * * * * *AI_StartState(self,ZS_ObservePlayer,0,&quot;&quot ;);<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ (выполняется только функция конца состояния)<br> * * * * * * * *AI_StartState(self,ZS_ObservePlayer,1,&quot;&quot ;);<br> * * * * * *};<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если ГГ находится в частном помещении<br> * *if(C_NpcIsBotheredByPlayerRoomGuild(self))<br> * *{<br> * * * *Npc_ClearAIQueue(self); <br> * * * *B_ClearPerceptions(self);<br> * * * *// перевод свидетеля в состояние &quot;защиты помещения&quot;<br> * * * *AI_StartState(self,ZS_ClearRoom,1,&quot;&quot;);< br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>// ************************************************** ***********<br>// Функция реакции людей на вход НПС в помещение <br>// ------------------------------------------------<br>// Вызывается как реакция на пассивное восприятие PERC_ASSESSENTERROOM<br>// ************************************************** ***********<br><br>func void B_AssessPortalCollision()<br>{<br> * *// other - вошедший, self - свидетель<br> * *var int formerportalguild;<br> * *// получить номер гильдии, которой принадлежит помещение в котором прежде находился ГГ (-1 помещение никому не принадлежит)<br> * *formerportalguild = Wld_GetFormerPlayerPortalGuild();<br> * *// если есть реакция на вошедшего в помещение<br> * *if(B_AssessEnterRoom())<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель не видит вошедшего и (вошедший крадется или вошедший стоит)<br> * *if(!Npc_CanSeeNpc(self,other)) &amp;&amp; (C_BodyStateContains(other,BS_SNEAK) ¦¦ C_BodyStateContains(other,BS_STAND))<br> * *{<br> * * * *return;<br> * *};<br> * *// свидетелю разрешено воспринимать все объекты в зоне действия восприятия<br> * *Npc_PerceiveAll(self);<br> * *// если свидетель находит другого НПС в состоянии &quot;защиты помещения&quot;<br> * *if(Wld_DetectNpcEx(self,-1,ZS_ClearRoom,-1,FALSE))<br> * *{<br> * * * *return; <br> * *};<br> * *// если покинутое ГГ помещение принадлежит гильдии свидетеля или свидетель друг гильдии, которой принадлежит помещение<br> * *if(self.guild == formerportalguild) ¦¦ (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY)<br> * *{<br> * * * *// если отношения между гильдиями ГГ и свидетеля дружеские или (вошедший ГГ и друг свидетеля) <br> * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) ¦¦ (Npc_IsPlayer(other) &amp;&amp; (self.npctype == NPCTYPE_FRIEND))<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если свидетель не принадлежит к гильдии<br> * * * *if(self.guild == GIL_NONE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если (помещение принадлежит милиции или ополчению) и свидетель является другом этих гильдии<br> * * * *if((formerportalguild == GIL_MIL) ¦¦ (formerportalguild == GIL_SLD)) &amp;&amp; (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY)<br> * * * *{<br> * * * * * *// свидетель атакует ГГ<br> * * * * * *B_Attack(self,other,AR_LeftPortalRoom,0);<br> * * * * * *return;<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// свидетель наблюдает за помещением<br> * * * * * *self.aivar[AIV_SeenLeftRoom] = TRUE;<br> * * * * * *// очистка очереди состояний свидетеля<br> * * * * * *Npc_ClearAIQueue(self); <br> * * * * * *// очистка восприятий свидетеля<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// перевод свидетеля в состояние наблюдения за ГГ<br> * * * * * *AI_StartState(self,ZS_ObservePlayer,0,&quot;&quot ;);<br> * * * * * *return;<br> * * * *};<br> * *};<br>};<br><br>

10.02.2005 10:07

Re: Уроки скриптологии
 
// ************************************************** ***************<br>// Функция реакции НПС, когда в него целится ГГ оружием дальнего радиуса поражения<br>// ----------------------------------------------------<br>// Вызывается как реакция на пассивное восприятие PERC_ASSESSTHREAT<br>// ************************************************** ***************<br><br>func void B_AssessThreat()<br>{<br> * *// other - ГГ, self - НПС цель<br> * *// если расстояние между ГГ и целью &gt; макс. дальности действия пассивного восприятия<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если цель не видит ГГ<br> * *if(!Npc_CanSeeNpc(self,other))<br> * *{<br> * * * *return;<br> * *};<br> * *// если оружие, из которого целится ГГ, не может нанести урон цели<br> * *if(!C_NpcIsBotheredByWeapon(self,other))<br> * *{<br> * * * *return;<br> * *};<br> * *// очистка очереди состояний цели<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий цели<br> * *B_ClearPerceptions(self);<br> * *// переход цели в состояние реакции на оружие ГГ<br> * *AI_StartState(self,ZS_ReactToWeapon,0,&quot;&quot ;);<br> * *return;<br>};<br><br><br>Еще один файл с функцией реакции на обнаженное оружие.<br><br>// ************************************************** *************<br>// Функция реакции НПС, когда ГГ достает оружие<br>// ---------------------------------------------------------------<br>// Вызывается как реакция на пассивное восприятие PERC_DRAWWEAPON и в некоторых других функциях<br>// ---------------------------------------------------------------<br>// Возвращает FALSE, если НПС не реагирует на оружие ГГ, в противном случае - TRUE.<br>// ************************************************** *************<br><br>func int B_AssessDrawWeapon()<br>{<br> * *// other - ГГ, self - НПС<br> * *// если ГГ вышел из режима нападения (убрал оружие)<br> * *if(Npc_IsInFightMode(other,FMODE_NONE))<br> * *{<br> * * * *return FALSE;<br> * *}; *<br> * *// если расстояние между ГГ и НПС &gt; дистанции начала диалога<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_DIALOG)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если оружие ГГ не может нанести урон НПС<br> * *if(!C_NpcIsBotheredByWeapon(self,other))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС уже находится в состоянии реакции на оружие ГГ<br> * *if(Npc_IsInState(self,ZS_ReactToWeapon))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС находится в состоянии наблюдения за ГГ и предыдущее состояние НПС было наблюдение за сражением ГГ<br> * *if(Npc_IsInState(self,ZS_ObservePlayer)) &amp;&amp; (Npc_WasInState(self,ZS_WatchFight))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС не видит ГГ<br> * *if(!Npc_CanSeeNpc(self,other))<br> * *{ * <br> * * * *return FALSE;<br> * *};<br> * *// очистка очереди состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий НПС<br> * *B_ClearPerceptions(self);<br> * *// переход НПС в состояние реакции на оружие ГГ<br> * *AI_StartState(self,ZS_ReactToWeapon,0,&quot;&quot ;);<br> * *return TRUE;<br>};<br><br>

11.02.2005 10:07

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

12.02.2005 22:27

Re: Уроки скриптологии
 
// ************************************************** ***************<br>// Функция реакции НПС на звук шагов ГГ или на звук упавшего предмета<br>// -----------------------------------------------------------------<br>// Вызывается в качестве реакции на пассивное восприятие PERC_ASSESSQUIETSOUND <br>// ************************************************** ***************<br><br>func void B_AssessQuietSound()<br>{<br> * *// other - НПС источник шума (ГГ), self - свидетель<br> * *// если источник шума отсутствует<br> * *if(!Hlp_IsValidNpc(other))<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояние по высоте между источником шума и свидетелем &gt; дистанции реагирования по высоте<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ находится в доме, принадлежащим любой гильдии, и расстояние по высоте между свидетелем и ГГ &gt; дистанции реакции через закрытые двери<br> * *if(Wld_GetPlayerPortalGuild() &gt;= GIL_NONE) &amp;&amp; (Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_INDOOR_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если есть реакция на вошедшего в помещение<br> * *if(B_AssessEnterRoom())<br> * *{ <br> * * * *return;<br> * *};<br> * *// если свидетель является охранником ворот<br> * *if(C_NpcIsGateGuard(self))<br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ и свидетель не враги и свидетель не имеет для ГГ важной информации<br> * *if(Npc_GetAttitude(self,other) != ATT_HOSTILE) &amp;&amp; (Npc_CheckInfo(self,1) == FALSE)<br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ и свидетель враги<br> * *if(Npc_GetAttitude(self,other) == ATT_HOSTILE)<br> * *// и (у свидетеля личных врагов не было или (ГГ переодетый бандит и свидетель бандит))<br> * *&amp;&amp; ((self.aivar[AIV_EnemyOverride] == TRUE) ¦¦ (C_PlayerIsFakeBandit(self,other) &amp;&amp; (self.guild == GIL_BDT)))<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель видит источник звука (моё примечание: возможно здесь ошибка, необходимо поменять условие на противоположное???)<br> * *if(Npc_CanSeeSource(self))<br> * *{<br> * * * *return;<br> * *}; *<br> * *// очистка очереди AI команд свидетеля<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий свидетеля<br> * *B_ClearPerceptions(self);<br> * *// перевод свидетеля в состояние наблюдения за ГГ<br> * *AI_StartState(self,ZS_ObservePlayer,1,&quot;&quot ;);<br> * *return;<br>}; *<br><br><br>// ************************************************** ************<br>// Функция реакции НПС на предупреждение<br>// ---------------------------------------<br>// Предупреждение посылается только скриптами (вызов функции Npc_SendPassivePerc), ядром не испоьзуется<br>// ************************************************** ************<br><br>func void B_AssessWarn()<br>{<br> * *// self - свидетель, other - преступник, victim - жертва<br> * *// если свидетель жертва<br> * *if(Hlp_GetInstanceID(victim) == Hlp_GetInstanceID(self))<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель находится в состоянии реакции на обнаженное оружие или наблюдает за ГГ<br> * *if(Npc_IsInState(self,ZS_ReactToWeapon)) ¦¦ (Npc_IsInState(self,ZS_ObservePlayer))<br> * *{<br> * * * *return;<br> * *};<br> * *// если преступник монстр<br> * *if(other.guild &gt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return;<br> * *};<br> * *// если свидетель охранник ворот<br> * *if(C_NpcIsGateGuard(self))<br> * *{<br> * * * *return;<br> * *};<br> * *// очистка очереди AI команд свидетеля<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий свидетеля<br> * *B_ClearPerceptions(self);<br> * *// перевод свидетеля в состояние наблюдения за ГГ<br> * *AI_StartState(self,ZS_ObservePlayer,0,&quot;&quot ;);<br> * *return;<br>};<br><br>

13.02.2005 13:34

Re: Уроки скриптологии
 
// ************************************************** ** <br>// Функция реакции НПС на важную информацию для разговора<br>// ----------------------------------------------------<br>// Вызывается в качестве реакции на пассивное восприятие PERC_ASSESSTALK<br>// ************************************************** **<br><br>func void B_AssessTalk()<br>{<br> * *// other - НПС приемник информации (обычно ГГ), self - НПС источник информации<br><br> * *// Тестовый кусок (можно выкинуть из скрипта) [не рассматриваю]<br> * *var C_NPC PCL;<br> * *// Инспектор уровня<br> * *PCL = Hlp_GetNpc(PC_Levelinspektor);<br> * *var C_NPC PCR;<br> * *// Рокфеллер<br> * *PCR = Hlp_GetNpc(PC_Rockefeller);<br> * *// если приемник информации Инспектор уровня или Рокфеллер<br> * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL)) ¦¦ (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCR))<br> * *{<br> * * * *PrintScreen(ConcatStrings(&quot;Stimme: &quot;,IntToString(self.voice)),-1,70,FONT_Screen,2);<br> * * * *PrintScreen(&quot;KEIN HERO!&quot;,-1,-1,FONT_Screen,2); *<br> * * * *PrintScreen(IntToString(self.aivar[AIV_FollowDist]),-1,70,FONT_Screen,2);<br> * * * *if(C_NpcIsInQuarter(self) == Q_KASERNE)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_KASERNE&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_GALGEN)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_GALGEN&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_MARKT)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_MARKT&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_TEMPEL)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_TEMPEL&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_UNTERSTADT)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_UNTERSTADT&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_HAFEN)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_HAFEN&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *if(C_NpcIsInQuarter(self) == Q_OBERSTADT)<br> * * * *{<br> * * * * * *PrintScreen(&quot;Q_OBERSTADT&quot;,-1,30,FONT_Screen,2);<br> * * * *};<br> * * * *return;<br> * *};<br> * *<br> * *// Нормальное начала функции<br> * *// если источник информации монстр<br> * *if(self.guild &gt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// если монстр не имеет важной информации<br> * * * *if(Npc_CheckInfo(self,1) == FALSE)<br> * * * *{<br> * * * * * *// если монстру вообще нечего сказать<br> * * * * * *if(Npc_CheckInfo(self,0) == FALSE)<br> * * * * * *{<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если источник информации человек<br> * *if(self.guild &lt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *<br> * * * *// если НПС источник информации враг ГГ<br> * * * *if(B_AssessEnemy()) <br> * * * *{ <br> * * * * * *return;<br> * * * *};<br> * * * *// если НПС источник информации знает, что ГГ убийца и у него есть причина атакоывать убийцу<br> * * * *if(B_GetPlayerCrime(self) == CRIME_MURDER) &amp;&amp; (C_WantToAttackMurder(self,other))<br> * * * *{<br> * * * * * *// источник информации атакует ГГ убийцу<br> * * * * * *B_Attack(self,other,AR_HumanMurderedHuman,0); * <br> * * * * * *return;<br> * * * *};<br> * * * *// если ГГ переодетый бандит и источник информации не бандит<br> * * * *if(C_PlayerIsFakeBandit(self,other) == TRUE) &amp;&amp; (self.guild != GIL_BDT)<br> * * * *{<br> * * * * * *// источник информации атакует ГГ<br> * * * * * *B_Attack(self,other,AR_GuildEnemy,0);<br> * * * * * *return;<br> * * * *};<br> * * * *// если ГГ отказался от разговора<br> * * * *if(C_RefuseTalk(self,other))<br> * * * *{<br> * * * * * *// если ГГ член подставной гильдии<br> * * * * * *ifC_PlayerHasFakeGuild(self,other)<br> * * * * * *{<br> * * * * * * * *// очистка очереди AI состояний источника информации<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// источник информации переходит в конечное состояние комментирования подставной гильдии<br> * * * * * * * *AI_StartState(self,ZS_CommentFakeGuild,1,&quot;&q uot;);<br> * * * * * * * *return;<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// источник информации произносит SVM фразу &quot;Оставь меня в покое!&quot;<br> * * * * * * * *B_Say(self,other,&quot;$NOTNOW&quot;);<br> * * * * * * * *return;<br> * * * * * *}; *<br> * * * *};<br> * *};<br> * *// если ГГ еще не говорил с источником информации<br> * *if(self.aivar[AIV_NpcStartedTalk] == FALSE)<br> * *{<br> * * * *// если источник идет или бежит<br> * * * *if(C_BodyStateContains(self,BS_WALK) ¦¦ C_BodyStateContains(self,BS_RUN))<br> * * * *{<br> * * * * * *// ГГ произносит SVM фразу &quot;Подожди!&quot;<br> * * * * * *B_Say(other,self,&quot;$SC_HEYWAITASECOND&quot;); <br> * * * *}<br> * * * *// иначе, если источник информации не видит ГГ<br> * * * *else if(!Npc_CanSeeNpc(self,other))<br> * * * *{<br> * * * * * *var int rnd;<br> * * * * * *// генерация случайного числа от 0 до 99<br> * * * * * *rnd = Hlp_Random(100);<br> * * * * * *// ГГ призносит фразу<br> * * * * * *if(rnd &lt;= 25) * * * { B_Say(other,self,&quot;$SC_HEYTURNAROUND&quot;); * *} * // звучит SVM фраза &quot;Эй ты!&quot;<br> * * * * * *else if (rnd &lt;= 50) { B_Say(other,self,&quot;$SC_HEYTURNAROUND02&quot;); *} * // звучит SVM фраза &quot;Эй ты!&quot;<br> * * * * * *else if (rnd &lt;= 75) { B_Say(other,self,&quot;$SC_HEYTURNAROUND03&quot;); *} * // звучит SVM фраза &quot;Эй!&quot;<br> * * * * * *else if (rnd &lt;= 99) { B_Say(other,self,&quot;$SC_HEYTURNAROUND04&quot;); *}; *// звучит SVM фраза &quot;Эй!&quot;<br> * * * *};<br> * *};<br> * *// очистка очереди AI состояний источника информации<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий источника информации<br> * *B_ClearPerceptions(self); * <br> * *// если источник информации сидит<br> * *if(C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *// если ГГ заговорил с источником информации<br> * * * *if(self.aivar[AIV_NpcStartedTalk] == TRUE)<br> * * * *{<br> * * * * * *// ГГ быстро останавливается<br> * * * * * *AI_StandUpQuick(other);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// ГГ останавливается<br> * * * * * *AI_StandUp(other);<br> * * * *};<br> * * * *// если источник информации видит ГГ<br> * * * *if(Npc_CanSeeNpc(self,other))<br> * * * *{<br> * * * * * *// источник информации переходит в состояние разговора, оставаясь сидеть<br> * * * * * *AI_StartState(self,ZS_Talk,0,&quot;&quot;);<br> * * * *} * <br> * * * *else // иначе (не видит ГГ)<br> * * * *{<br> * * * * * *// если источник информации наблюдал за ГГ<br> * * * * * *if(Npc_IsInState(self,ZS_ObservePlayer))<br> * * * * * *{<br> * * * * * * * *// источник информации встает<br> * * * * * * * *AI_StandUp(self);<br> * * * * * *};<br> * * * * * *// источник информации переходит в состояние разговора<br> * * * * * *AI_StartState(self,ZS_Talk,1,&quot;&quot;);<br> * * * *};<br> * * * *return;<br> * *}<br> * *else // иначе (не сидит)<br> * *{<br> * * * *// если ГГ заговорил с источником информации<br> * * * *if(self.aivar[AIV_NpcStartedTalk] == TRUE)<br> * * * *{<br> * * * * * *// оба быстро останавливаются<br> * * * * * *AI_StandUpQuick(self);<br> * * * * * *AI_StandUpQuick(other);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// оба останавливаются<br> * * * * * *AI_StandUp(self);<br> * * * * * *AI_StandUp(other);<br> * * * *};<br> * * * *// источник информации переходит в состояние разговора<br> * * * *AI_StartState(self,ZS_Talk,0,&quot;&quot;);<br> * * * *return;<br> * *};<br>};<br><br><br>// **************************************<br>// Функция реакции НПС перемещение МОВа<br>// --------------------------------------<br>// Вызывается ядром системы как реакция на пассивное восприятие PERC_MOVEMOB<br>// **************************************<br><br>func void B_MoveMob()<br>{ * <br> * *// self - НПС перемещающий МОВ (ГГ)<br> * *var string door;<br> * *// получить имя перемещаемого МОВа<br> * *door = Npc_GetDetectedMob(self);<br> * *// если МОВ дверь<br> * *if(Hlp_StrCmp(door,&quot;DOOR&quot;))<br> * *{<br> * * * *// если дверь закрыта<br> * * * *if(Wld_GetMobState(self,door) == 0)<br> * * * *{<br> * * * * * *// очистка очереди AI состояний ГГ<br> * * * * * *Npc_ClearAIQueue (self);<br> * * * * * *// ГГ открывает дверь<br> * * * * * *AI_UseMob(self,door,1);<br> * * * * * *// зафиксировать состояние двери<br> * * * * * *AI_UseMob(self,door,-1);<br> * * * *};<br> * *}<br> * *else // иначе<br> * *{<br> * * * *return;<br> * *};<br> * *// ГГ продолжает свои дела<br> * *AI_ContinueRoutine(self);<br>};<br><br><br>Конец 5 параграфа.<br>Вот и все основные восприятия, на которые реагируют люди, есть еще дополнительные восприятия, которые инициализируются в функциях состояний, их мы рассмотрим позже.<br>Все файлы активных и пассивных восприятий людей находятся в директории ..\AI\Human\B_Human\ и имеют имена эквивалентные функциям восприятий.<br>Файл восприятия магии находится в директории ..\AI\Magic\<br><br>Примечание: Файл ..\AI\Human\B_Human\B_AssessObserveSuspect.d можно удалить из скриптов, по причине его абсолютной бесполезности.<br>

14.02.2005 10:48

Re: Уроки скриптологии
 
6. Функции обработки восприятий монстров.<br><br>// ************************************************** <br>// Функция реакции монстров на врага.<br>// --------------------------------------------------<br>// Вызывается ядром системы в качестве реакции на активное восприятие PERC_ASSESSENEMY.<br>// ************************************************** <br><br>func void B_MM_AssessEnemy()<br>{<br> * *// self - НПС монстр, other - враг<br> * *// если монстр дракон и ГГ имеет &quot;Заряженный глаз Инноса&quot;<br> * *if(self.guild == GIL_DRAGON) &amp;&amp; (Npc_HasItems(hero,ItMi_InnosEye_Mis) &gt;= 1)<br> * *{<br> * * * *return;<br> * *}; <br> * *// если монстр или враг не могут атаковать<br> * *if((self.aivar[AIV_NoFightParker] == TRUE) ¦¦ (other.aivar[AIV_NoFightParker] == TRUE))<br> * *{<br> * * * *return;<br> * *};<br> * *// если личных врагов у монстра нет и враг человек<br> * *if(self.aivar[AIV_EnemyOverride] == TRUE) &amp;&amp; (other.guild &lt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return;<br> * *};<br> * *// ------- TESTMODE: Levelinspektor wird ignoriert ------<br> * *var C_NPC PCL;<br> * *// &quot;Инспектор уровня&quot;<br> * *PCL = Hlp_GetNpc(PC_Levelinspektor);<br> * *// если враг &quot;Инспектор уровня&quot;<br> * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL))<br> * *{<br> * * * *return;<br> * *};<br> * *var C_NPC MGO;<br> * *// Магический голем<br> * *MGO = Hlp_GetNpc(MagicGolem);<br> * *var C_NPC LAR;<br> * *// Ларес<br> * *LAR = Hlp_GetNpc(VLK_449_Lares);<br> * *// если враг Ларес и монстр Магический голем<br> * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(LAR)) &amp;&amp; (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MGO))<br> * *{<br> * * * *return;<br> * *};<br> * *// если монстр находится не далее 5м от точки &quot;OC_RAMP_07&quot;<br> * *if(Npc_GetDistToWP(self,&quot;OC_RAMP_07&quot;) &lt;= 500) <br> * *{<br> * * * *return;<br> * *};<br> * *// если враг находится в режиме диалога<br> * *if(other.aivar[AIV_INVINCIBLE] == TRUE)<br> * *{<br> * * * *return;<br> * *};<br> * *// если враг (плывет или ныряет) и монстр не полезет в воду<br> * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) &amp;&amp; (self.aivar[AIV_MM_FollowInWater] == FALSE)<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояние по высоте между монстром и врагом &gt; расстояния реакции по высоте<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ враг и он превращен в монстра<br> * *if(Npc_IsPlayer(other)) &amp;&amp; (other.guild &gt; GIL_SEPERATOR_HUM) <br> * *{<br> * * * *// если гильдии монстра и превращенного ГГ не враждебны<br> * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если дальность обоняния монстра &gt; макс. дальности действия активного восприятия монстров<br> * *if(self.senses_range &gt; PERC_DIST_MONSTER_ACTIVE_MAX)<br> * *{<br> * * * *// если расстояние между монстром и врагом &gt; макс. дальности действия активного восприятия монстров<br> * * * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_MONSTER_ACTIVE_MAX)<br> * * * *{<br> * * * * * *// если монстр не видит врага<br> * * * * * *if(!Npc_CanSeeNpc(self,other))<br> * * * * * *{<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если монстр орк или дружественный орк<br> * *if(self.guild == GIL_ORC) ¦¦ (self.guild == GIL_FRIENDLY_ORC)<br> * *{<br> * * * *// если враг подкрадавается или стоит<br> * * * *if(C_BodyStateContains(other,BS_SNEAK)) ¦¦ (C_BodyStateContains(other,BS_STAND))<br> * * * *{<br> * * * * * *// если монстр не видит врага<br> * * * * * *if(!Npc_CanSeeNpc(self,other))<br> * * * * * *{<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если монстр не видит врага по прямой (например, враг за стеной)<br> * *if(!Npc_CanSeeNpcFreeLOS(self,other))<br> * *{<br> * * * *return;<br> * *};<br> * *// если монстр является членом партии (вызванный)<br> * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *// если враг монстра является другом НПС <br> * * * *if(other.npctype == NPCTYPE_FRIEND)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// очистка очереди AI состояний монстра<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// монстр выбирает цель<br> * * * *Npc_SetTarget(self,other);<br> * * * *// очистка восприятий монстра<br> * * * *B_ClearPerceptions(self);<br> * * * *// переход монстра в состояние атаки<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return;<br> * *};<br> * *// если монстр не угрожает перед атакой (атакует сразу)<br> * *if(self.aivar[AIV_MM_ThreatenBeforeAttack] == FALSE)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *Npc_SetTarget(self,other);<br> * * * *B_ClearPerceptions(self);<br> * * * *// переход монстра в состояние атаки<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return;<br> * *};<br> * *// если монстр находится в состоянии &quot;пожирания падали&quot;<br> * *if(Npc_IsInState(self,ZS_MM_EatBody))<br> * *{<br> * * * *// если расстояние между монстром и врагом &lt;= дистанции атаки монстров<br> * * * *if(Npc_GetDistToNpc(self,other) &lt;= FIGHT_DIST_MONSTER_ATTACKRANGE)<br> * * * *{<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *Npc_SetTarget(self,other);<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// переход монстра в состояние атаки<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *};<br> * * * *return; * * <br> * *};<br> * *// если монстр находится в соостоянии охоты<br> * *if(Npc_IsInState(self,ZS_MM_Hunt))<br> * *{<br> * * * *// если расстояние между монстром и врагом &lt;= дистанции атаки монстров<br> * * * *if(Npc_GetDistToNpc(self,other) &lt;= FIGHT_DIST_MONSTER_ATTACKRANGE)<br> * * * *{<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *Npc_SetTarget(self,other);<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// переход монстра в состояние атаки<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если монстра устраивает добыча в виде врага<br> * *if(C_PredatorFoundPrey(self,other)) * * <br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *Npc_SetTarget(self,other);<br> * * * *B_ClearPerceptions(self);<br> * * * *// переход монстра в состояние охоты на врага<br> * * * *AI_StartState(self,ZS_MM_Hunt,0,&quot;&quot;);<br > * * * *return;<br> * *};<br> * *// если врага устраивает добыча в виде монстра<br> * *if(C_PredatorFoundPrey(other,self))<br> * *{<br> * * * *// если враг находится в соостоянии охоты и если расстояние между монстром и врагом &lt;= дистанции преследования<br> * * * *if(!Npc_IsInState(other,ZS_MM_Hunt)) &amp;&amp; (Npc_GetDistToNpc(self,other) &lt;= FIGHT_DIST_MONSTER_FLEE)<br> * * * *{<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *Npc_SetTarget(self,other);<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// переход монстра в состояние преследования<br> * * * * * *AI_StartState(self,ZS_MM_Flee,0,&quot;&quot;);<br > * * * * * *return;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// очистка очереди AI состояний монстра<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий монстра<br> * *B_ClearPerceptions(self);<br> * *// переход монстра в состояние угрозы<br> * *AI_StartState(self,ZS_MM_ThreatenEnemy,0,&quot;&q uot;);<br> * *return;<br>};<br><br>

14.02.2005 18:13

Re: Уроки скриптологии
 
// ******************************************<br>// Функция реакции монстров на мертвое тело<br>// ------------------------------------------<br>// Вызывается ядром системы в качестве реакции на пассивное восприятие PERC_ASSESSBODY<br>// ******************************************<br><br> func void B_MM_AssessBody()<br>{<br> * *// self - монстр, other - труп<br> * *// если монстр принадлежит к оркам<br> * *if(self.guild &gt; GIL_SEPERATOR_ORC)<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояние по высоте между монстром и трупом &gt; расстояния реакции по высоте<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если приоритетом монстра является нападение<br> * *if(self.aivar[AIV_MM_PRIORITY] == PRIO_ATTACK)<br> * *{<br> * * * *return;<br> * *};<br> * *// если труп не нравится монстру<br> * *if(!C_WantToEat(self,other)) * * * * * * * * * *<br> * *{<br> * * * *return;<br> * *};<br> * *// если монстр находится в состоянии атаки<br> * *if(Npc_IsInState(self,ZS_MM_Attack))<br> * *{<br> * * * *var C_NPC stoerenfried;<br> * * * *// последний атакованный НПС<br> * * * *stoerenfried = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);<br> * * * *// если расстояние между атакованным НПС и трупом &lt;= дистанции атаки монстров<br> * * * *if(Npc_GetDistToNpc(stoerenfried,other) &lt;= FIGHT_DIST_MONSTER_ATTACKRANGE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// очистка очереди AI состояний монстра<br> * *Npc_ClearAIQueue(self);<br> * *// очистка восприятий монстра<br> * *B_ClearPerceptions(self);<br> * *// переход в состояние пожирания трупа<br> * *AI_StartState(self,ZS_MM_EatBody,0,&quot;&quot;); <br> * *return;<br>};<br><br><br>... и еще одна функция<br><br>// ************************************************** ******<br>// Функция реакции монстра на повреждение<br>// --------------------------------------------------------<br>// Вызывается ядром системы в качестве реакции на пассивное восприятие PERC_ASSESSDAMAGE<br>// ************************************************** ******<br><br>func void B_MM_AssessDamage()<br>{<br> * *// self - монстр жертва, other - НПС агрессор<br> * *// установить монстру приоритет на атаку<br> * *self.aivar[AIV_MM_PRIORITY] = PRIO_ATTACK;<br> * *// вызов функции реакции на повреждение &quot;Когтем Белиара&quot;<br> * *B_BeliarsWeaponSpecialDamage(other,self);<br> * *// если агрессор имеет &quot;Святой молот&quot; <br> * *if(Npc_HasItems(other,Holy_Hammer_MIS) &gt; 0)<br> * *{<br> * * * *var C_NPC MagGol;<br> * * * *// Магический голем<br> * * * *MagGol = Hlp_GetNpc(MagicGolem);<br> * * * *// проинициализировать глобальную переменную item &quot;Святым молотом&quot;<br> * * * *Npc_GetInvItem(other,Holy_Hammer_MIS);<br> * * * *var C_ITEM OthWeap;<br> * * * *// оружие, которое агрессор держит в руке<br> * * * *OthWeap = Npc_GetReadiedWeapon(other);<br> * * * *// если жертва Магический голем и оружие у агрессора в руке &quot;Святой молот&quot;<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MagGol)) &amp;&amp; (Hlp_GetInstanceID(OthWeap) == Hlp_GetInstanceID(item))<br> * * * *{<br> * * * * * *// Жизнь Магического голема -= 1000 LP<br> * * * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-1000);<br> * * * * * *return;<br> * * * *};<br> * *}; * * *<br> * *// если жертва Каменный сторож и у него нет врагов<br> * *if(self.guild == GIL_STONEGUARDIAN) &amp;&amp; (self.aivar[AIV_EnemyOverride] == TRUE)<br> * *{<br> * * * *// пробуждение Каменного сторожа <br> * * * *B_AWAKE_STONEGUARDIAN(self);<br> * *}; *<br> * *// если агрессора устраивает добыча в виде жертвы<br> * *if(C_PredatorFoundPrey(other,self))<br> * *{<br> * * * *// очистка очереди AI состояний жертвы<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// установка цели для жертвы<br> * * * *Npc_SetTarget(self,other);<br> * * * *// очистка восприятий жертвы<br> * * * *B_ClearPerceptions(self);<br> * * * *// жертва убегает от агрессора<br> * * * *AI_StartState(self,ZS_MM_Flee,0,&quot;&quot;); * *<br> * * * *return;<br> * *};<br> * *// если жертва находится в состоянии атаки<br> * *if(Npc_IsInState(self,ZS_MM_Attack))<br> * *{<br> * * * *// если агрессор ГГ и жертва член партии<br> * * * *if(Npc_IsPlayer(other)) &amp;&amp; (self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если жертва скелет и агрессор маг скелетов<br> * * * *if(self.aivar[AIV_MM_REAL_ID] == ID_SKELETON) &amp;&amp; (other.aivar[AIV_MM_REAL_ID] == ID_SKELETON_MAGE)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор не является НПС, атакованным жертвой<br> * * * *if(Hlp_GetInstanceID(other) != self.aivar[AIV_LASTTARGET])<br> * * * *{<br> * * * * * *// если удар жертве нанесен агрессором не первый раз<br> * * * * * *if(self.aivar[AIV_HitByOtherNpc] == Hlp_GetInstanceID(other))<br> * * * * * *{<br> * * * * * * * *// смена цели (жертва будет атаковать агрессора)<br> * * * * * * * *Npc_SetTarget(self,other);<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// при первом ударе жертве записывается ID агрессора<br> * * * * * * * *self.aivar[AIV_HitByOtherNpc] = Hlp_GetInstanceID(other);<br> * * * * * *};<br> * * * *};<br> * * * *return;<br> * *};<br> * *// очистка очереди AI состояний жертвы<br> * *Npc_ClearAIQueue(self);<br> * *// установка цели для жертвы<br> * *Npc_SetTarget(self,other);<br> * *// очистка восприятий жертвы<br> * *B_ClearPerceptions(self);<br> * *// жертва атакует агрессора<br> * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * *return;<br>};<br><br>

15.02.2005 09:48

Re: Уроки скриптологии
 
// ************************************************** **************<br>// Функция реакции монстра на убийство и на повреждение других НПС<br>// ----------------------------------------------------------------<br>// Вызывается в качестве реакции на пассивные восприятия PERC_ASSESSOTHERSDAMAGE и PERC_ASSESSMURDER <br>// ************************************************** **************<br><br>func void B_MM_AssessOthersDamage()<br>{<br> * *// self - монстр наблюдатель, other - агрессор, victim - жертва (труп)<br> * *// если расстояния между (наблюдателем и жертвой) и (наблюдателем и агрессором) &gt; макс. дальности действия восприятия<br> * *if(Npc_GetDistToNpc(self,victim) &gt; PERC_DIST_INTERMEDIAT) &amp;&amp; (Npc_GetDistToNpc(self,other) &gt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если наблюдатель не видит жертву<br> * *if(!Npc_CanSeeNpcFreeLOS(self,victim))<br> * *{<br> * * * *return;<br> * *};<br> * *// если наблюдатель член партии<br> * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *// если жертва ГГ<br> * * * *if(Npc_IsPlayer(victim))<br> * * * *{<br> * * * * * *// очистка очереди AI состояний наблюдателя<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// очистка восприятий наблюдателя<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// установка в качестве цели агрессора<br> * * * * * *Npc_SetTarget(self,other);<br> * * * * * *// монстр наблюдатель атакует агрессора<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор ГГ и жертва жива<br> * * * *if(Npc_IsPlayer(other)) &amp;&amp; (!Npc_IsDead(victim))<br> * * * *{<br> * * * * * *// очистка очереди AI состояний наблюдателя<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// очистка восприятий наблюдателя<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// установка в качестве цели жертвы<br> * * * * * *Npc_SetTarget(self,victim);<br> * * * * * *// монстр наблюдатель атакует жертву<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если наблюдатель волк<br> * *if(self.guild == GIL_WOLF)<br> * *{<br> * * * *// если жертва волк и агрессор волк и волк агрессор есть ГГ и жертва убита<br> * * * *if(victim.guild == GIL_WOLF) &amp;&amp; (other.guild == GIL_WOLF) &amp;&amp; Npc_IsPlayer(other) &amp;&amp; Npc_IsDead(victim) <br> * * * *{<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// перевод наблюдателя в состояние вызванного монстра<br> * * * * * *self.start_aistate = ZS_MM_Rtn_Summoned;<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Summoned,0,&quot;&qu ot;);<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если наблюдатель каменный страж и жертва каменный страж и у наблюдателя нет врагов<br> * *if(self.guild == GIL_STONEGUARDIAN) &amp;&amp; (victim.guild == GIL_STONEGUARDIAN) &amp;&amp; (self.aivar[AIV_EnemyOverride] == TRUE)<br> * *{<br> * * * *// пробуждение каменного стража наблюдателя<br> * * * *B_AWAKE_STONEGUARDIAN(self);<br> * *}; *<br> * *// если гильдии наблюдателя и жертвы дружественны и гильдии наблюдателя и агрессора не дружественные<br> * *if(Wld_GetGuildAttitude(self.guild,victim.guild) == ATT_FRIENDLY) &amp;&amp; (Wld_GetGuildAttitude(self.guild,other.guild) != ATT_FRIENDLY)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *Npc_SetTarget(self,other);<br> * * * *// наблюдатель атакует агрессора<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return;<br> * *};<br> * *// если гильдии наблюдателя и агрессора дружественны и гильдии наблюдателя и жертвы не дружественные<br> * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) &amp;&amp; (Wld_GetGuildAttitude(self.guild,victim.guild) != ATT_FRIENDLY)<br> * *// и жертва не мертва<br> * *&amp;&amp; (!Npc_IsDead(victim))<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *B_ClearPerceptions(self);<br> * * * *Npc_SetTarget(self,victim);<br> * * * *// наблюдатель атакует жертву<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return;<br> * *};<br>};<br><br>

16.02.2005 09:11

Re: Уроки скриптологии
 
// ************************************************** ****<br>// Функция реакции монстров на предупреждение<br>// ------------------------------------------------------<br>// Предупреждение посылается только скриптами (вызов функции Npc_SendPassivePerc), ядром не испоьзуется<br>// ************************************************** ****<br><br>func void B_MM_AssessWarn()<br>{<br> * *// self - наблюдатель, other - агрессор, victim - жертва<br> * *// если наблюдатель орк<br> * *if(self.guild &gt; GIL_SEPERATOR_ORC)<br> * *{<br> * * * *// если наблюдатель находится в состоянии атаки<br> * * * *if(Npc_IsInState(self,ZS_MM_Attack))<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если гильдия наблюдателя дружественна гильдии агрессора<br> * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY)<br> * * * *{<br> * * * * * *// очистка очереди AI команд наблюдателя<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// установка жертвы в качестве цели наблюдателю<br> * * * * * *Npc_SetTarget(self,victim);<br> * * * * * *// очистка восприятий наблюдателя<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// наблюдатель атакует жертву<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если агрессор человек<br> * *if(other.guild &lt; GIL_SEPERATOR_HUM)<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояние по высоте между наблюдателем и агрессором &gt; дистанции реагирования по высоте<br> * *if(Npc_GetHeightToNpc(self,other) &gt; PERC_DIST_HEIGHT)<br> * *{<br> * * * *return;<br> * *};<br> * *// если наблюдатель находится в состоянии атаки<br> * *if(Npc_IsInState(self,ZS_MM_Attack))<br> * *{<br> * * * *// если наблюдателя устраивает добыча в виде агрессора и приоритет наблюдателя &quot;пожирание падали&quot;<br> * * * *if(C_PredatorFoundPrey(self,other)) &amp;&amp; (self.aivar[AIV_MM_PRIORITY] == PRIO_EAT)<br> * * * *{<br> * * * * * *// очистка очереди AI команд наблюдателя<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// установка агрессора в качестве цели наблюдателю<br> * * * * * *Npc_SetTarget(self,other);<br> * * * *}<br> * * * *else // иначе цель не меняется<br> * * * *{<br> * * * * * *// возврат цели для наблюдателя (последняя бывшая цель)<br> * * * * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если гильдии наблюдателя и агрессора одинаковы и наблюдатель охотится стаей<br> * *if(self.guild == other.guild) &amp;&amp; (self.aivar[AIV_MM_Packhunter] == TRUE)<br> * *{<br> * * * *// если наблюдатель волк и жертва волк и жертва ГГ (превращенный в волка)<br> * * * *if(self.guild == GIL_WOLF) &amp;&amp; (victim.guild == GIL_WOLF) &amp;&amp; Npc_IsPlayer(victim)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор находится в состоянии атаки<br> * * * *if(Npc_IsInState(other,ZS_MM_Attack))<br> * * * *{<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *Npc_SetTarget(self,victim);<br> * * * * * *B_ClearPerceptions(self);<br> * * * * * *// наблюдатель атакует жертву<br> * * * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор находится в состоянии угрозы врагу<br> * * * *if(Npc_IsInState(other,ZS_MM_ThreatenEnemy))<br> * * * *{<br> * * * * * *// агрессор бежит<br> * * * * * *AI_SetWalkmode(self,NPC_RUN);<br> * * * * * *// к жертве<br> * * * * * *AI_GotoNpc(self,victim);<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *return;<br>};<br><br><br>... и еще одна функция<br><br>// ************************************************** ******<br>// Функция реакции монстров на ГГ<br>// --------------------------------------------------------<br>// Вызывается ядром системы в качестве реакции на активное восприятие PERC_ASSESSPLAYER<br>// Используется только конкретными монстрами<br>// ************************************************** ******<br><br>func void B_MM_AssessPlayer()<br>{<br> * *// other - ГГ, self - монстр<br> * *// если ГГ в состоянии диалога<br> * *if(other.aivar[AIV_INVINCIBLE] == TRUE) <br> * *{<br> * * * *return;<br> * *};<br> * *// если ГГ мертв, безсознания и т.д. (обездвижен)<br> * *if(C_NpcIsDown(other))<br> * *{<br> * * * *return;<br> * *};<br> * *// подготовка разговора ГГ с драконами<br> * *B_AssignDragonTalk(self);<br> * *// если расстояние между ГГ и монстром &lt; 7м и монстр имеет важную информацию<br> * *if(Npc_GetDistToNpc(self,other) &lt;= 700) &amp;&amp; (Npc_CheckInfo(self,1))<br> * *{<br> * * * *// если монстр дракон или (монстр не дракон и расстояние между монстром и ГГ &lt;= дистанции начала диалога)<br> * * * *if(self.guild == GIL_DRAGON) ¦¦ ((self.guild != GIL_DRAGON) &amp;&amp; (Npc_GetDistToNpc(self,other) &lt;= PERC_DIST_DIALOG))<br> * * * *{<br> * * * * * *// если ГГ не падает и не плывет и не ныряет<br> * * * * * *if(!C_BodyStateContains(other,BS_FALL)) &amp;&amp; (!C_BodyStateContains(other,BS_SWIM)) &amp;&amp; (!C_BodyStateContains(other,BS_DIVE))<br> * * * * * *{<br> * * * * * * * *// у монстра устанавливается флаг начала разговора<br> * * * * * * * *self.aivar[AIV_NpcStartedTalk] = TRUE;<br> * * * * * * * *// реакция ГГ на предлагаемый разговор<br> * * * * * * * *B_AssessTalk();<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если монстр член партии ГГ<br> * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *// если расстояние между ГГ и монстром &lt; 5м и монстр не стоит<br> * * * *if(Npc_GetDistToNpc(self,hero) &lt; 500) &amp;&amp; (!C_BodyStateContains(self,BS_STAND))<br> * * * *{<br> * * * * * *// очистка очереди AI состояний монстра<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// монстр останавливается<br> * * * * * *AI_StandUp(self);<br> * * * * * *// и поворачивается к ГГ<br> * * * * * *AI_TurnToNpc(self,hero);<br> * * * *};<br> * *};<br>};<br><br><br>Все файлы активных и пассивных восприятий монстров находятся в директории ..\AI\Monster\B_Monster\ и имеют имена эквивалентные функциям восприятий.<br>

17.02.2005 09:40

Re: Уроки скриптологии
 
7. Описание обработчиков состояний НПС.<br><br>Все имена функций состояний должны начинаться с ZS_.<br>Каждый процесс обработки соответствующего состояния состоит из 3х функций: ZS_xxx, ZS_xxx-Loop, ZS_xxx_End, где ххх - имя соответствующего состояния.<br>Этим функциям соответствуют 3 фазы одного состояния НПС.<br>1 фаза - Begin: инициализация состояния НПС.<br>2 фаза - Loop: цикл выполнения последовательности действий НПС. Функция 2 фазы должна возвращать или LOOP_CONTINUE - продолжение фазы или LOOP_END - конец фазы.<br>3 фаза - End: завершение состояния НПС.<br><br>Системная функция AI_StartState может управлять последовательностью выполнения фаз состояний, за это отвечает параметр stateBehaviour, если он = 0, то выполняются все фазы состояния последовательно, если он = 1, то выполняется только заключительная фаза 3.<br>Эта функция подробно описана в соответствующей теме.<br><br>8. Функции состояний людей.<br><br>Все файлы состояний людей расположены в директории ..AI\Human\ZS_Human<br><br>// ******************************<br>// Состояние атаки<br>// ******************************<br><br>// Функция обработки вспомогательного восприятия PERC_ASSESSSURPRISE<br>// Вызывается ядром системы когда ГГ превращается в человека из животного<br>func void B_AssessSurprise()<br>{<br> * *// self - наблюдатель, other - ГГ<br> * *// целью наблюдателя становится ГГ<br> * *Npc_SetTarget(self,other);<br> * *// причина нападения наблюдателя на ГГ - ГГ враг гильдии<br> * *self.aivar[AIV_ATTACKREASON] = AR_GuildEnemy;<br>};<br><br>// Функция инициализации состояния атаки<br>func void ZS_Attack()<br>{<br> * *// установить минимальный набор восприятий НПС<br> * *Perception_Set_Minimal();<br> * *// установить дополнительное восприятие на превращение<br> * *Npc_PercEnable(self,PERC_ASSESSSURPRISE,B_AssessS urprise);<br> * *// инициализировать переменную other (последняя цель)<br> * *B_ValidateOther();<br> * *// записать НПС id последней цели<br> * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);<br> * *// если НПС должен убегать от цели<br> * *if(C_WantToFlee(self,other)) * * * * * * * * * *<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// очистка восприятий НПС<br> * * * *B_ClearPerceptions(self);<br> * * * *// установка цели для НПС<br> * * * *Npc_SetTarget(self,other);<br> * * * *// НПС убегает от цели<br> * * * *AI_StartState(self,ZS_Flee,0,&quot;&quot;);<br> * * * *return;<br> * *};<br> * *// если загрузки игры во время атаки не было<br> * *if(self.aivar[AIV_LOADGAME] == FALSE)<br> * *{<br> * * * *// НПС называет причину атаки<br> * * * *B_Say_AttackReason();<br> * *};<br> * *// если режим сражения у НПС выключен<br> * *if(Npc_IsInFightMode(self,FMODE_NONE))<br> * *{<br> * * * *// НПС достает лучшее оружие дальнего радиуса поражения<br> * * * *AI_EquipBestRangedWeapon(self);<br> * * * *// НПС достает лучшее оружие ближнего радиуса поражения<br> * * * *AI_EquipBestMeleeWeapon(self);<br> * *};<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// перестает смотреть на других<br> * *B_StopLookAt(self);<br> * *// поворачивается к цели<br> * *B_TurnToNpc(self,other);<br> * *// бежит к цели<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// сброс статуса предупреждений охраной<br> * *self.aivar[AIV_Guardpassage_Status] = GP_NONE;<br> * *// получить репутацию ГГ для конкретной локации<br> * *self.aivar[AIV_LastAbsolutionLevel] = B_GetCurrentAbsolutionLevel(self);<br> * *// сброс флага окончания преследования<br> * *self.aivar[AIV_PursuitEnd] = FALSE;<br> * *// сброс времени нахождения в состоянии<br> * *self.aivar[AIV_StateTime] = 0;<br> * *// сброс переменной вызова охраны (переменная AIV_TAPOSITION переопределена в этом состоянии)<br> * *self.aivar[AIV_TAPOSITION] = 0;<br> * *// сброс флага первого удара<br> * *self.aivar[AIV_HitByOtherNpc] = 0;<br> * *// сброс выбранного заклинания<br> * *self.aivar[AIV_SelectSpell] = 0;<br>};<br><br>// Функция цикла атаки<br>func int ZS_Attack_Loop()<br>{<br> * *// Грег идет к Декстеру<br> * *B_Greg_ComesToDexter();<br> * *// повторно инициализировать other целью<br> * *Npc_GetTarget(self);<br> * *// если расстояние между НПС и целью &gt; дистанции прекращения сражения<br> * *if(Npc_GetDistToNpc(self,other) &gt; self.aivar[AIV_FightDistCancel])<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * * * *// НПС закончил преследование<br> * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * *return LOOP_END;<br> * *};<br> * *// если время преследования превышает допустимое и НПС преследует<br> * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_MM_FollowTime]) &amp;&amp; (self.aivar[AIV_PursuitEnd] == FALSE)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *AI_StandUp(self);<br> * * * *// НПС закончил преследование<br> * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * *// получить дистанцию до цели<br> * * * *self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);<br> * * * *// обновить время состояния НПС<br> * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self); <br> * * * *// если цель человек<br> * * * *if(other.guild &lt; GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// НПС говорит цели &quot;Беги, трус!&quot; (SVM фраза)<br> * * * * * *B_Say(self,other,&quot;$RUNCOWARD&quot;);<br> * * * *};<br> * *};<br> * *// если НПС завершил преследование цели<br> * *if(self.aivar[AIV_PursuitEnd] == TRUE)<br> * *{<br> * * * *// если расстояние между НПС и целью &gt; диапазона чувствительности НПС<br> * * * *if(Npc_GetDistToNpc(self,other) &gt; (self.senses_range))<br> * * * *{<br> * * * * * *return LOOP_END;<br> * * * *};<br> * * * *// если текущее время &gt; предыдущего времени (прошла как минимум секунда)<br> * * * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_StateTime])<br> * * * *{<br> * * * * * *// если расстояние между НПС и целью меньше дистанции, когда НПС прекратил преследование<br> * * * * * *if(Npc_GetDistToNpc(self,other) &lt; self.aivar[AIV_Dist])<br> * * * * * *// или (цель не бежит и не прыгает)<br> * * * * * *¦¦ ((!C_BodyStateContains(other,BS_RUN)) &amp;&amp; (!C_BodyStateContains(other,BS_JUMP)))<br> * * * * * *{<br> * * * * * * * *// сброс флага окончания преследования<br> * * * * * * * *self.aivar[AIV_PursuitEnd] = FALSE;<br> * * * * * * * *// сброс времени нахождения НПС в этом состоянии<br> * * * * * * * *Npc_SetStateTime(self,0);<br> * * * * * * * *// сброс времени нахождения в состоянии<br> * * * * * * * *self.aivar[AIV_StateTime] = 0;<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС поворачивается к цели<br> * * * * * * * *B_TurnToNpc(self,other);<br> * * * * * * * *// получить дистанцию до цели<br> * * * * * * * *self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);<br> * * * * * * * *// обновить время состояния НПС<br> * * * * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);<br> * * * * * *};<br> * * * *};<br> * * * *return LOOP_CONTINUE;<br> * *};<br> * *// если уровень достигнутый ГГ в сражении &gt; первоначального уровня <br> * *if(B_GetCurrentAbsolutionLevel(self) &gt; self.aivar[AIV_LastAbsolutionLevel])<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * * * *// прекращение атаки<br> * * * *return LOOP_END;<br> * *};<br> * *// если (цель плывет или ныряет) и НПС не преследует цель в воде<br> * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) &amp;&amp; (self.aivar[AIV_MM_FollowInWater] == FALSE)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *AI_StandUp(self);<br> * * * *// НПС закончил преследование<br> * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * *return LOOP_END;<br> * *};<br> * *// если НПС выжидает перед атакой<br> * *if(self.aivar[AIV_WaitBeforeAttack] &gt;= 1)<br> * *{<br> * * * *// ожидание 0.8 сек<br> * * * *AI_Wait(self,0.8 );<br> * * * *// сброс флага задержки<br> * * * *self.aivar[AIV_WaitBeforeAttack] = 0;<br> * *};<br> * *// если дистанция атаки &gt; 0<br> * *if(self.aivar[AIV_MaxDistToWp] &gt; 0)<br> * *{<br> * * * *// если расстояние между НПС и вайпоинтом НПС &gt; дистанции атаки и расстояние между целью и вайпоинтом НПС &gt; дистанции акаки<br> * * * *if(Npc_GetDistToWP(self,self.wp) &gt; self.aivar[AIV_MaxDistToWp]) &amp;&amp; (Npc_GetDistToWP(other,self.wp) &gt; self.aivar[AIV_MaxDistToWp])<br> * * * *{<br> * * * * * *// установить НПС тактику защитников крепостных стен<br> * * * * * *self.fight_tactic = FAI_NAILED;<br> * * * *}<br> * * * *else // иначе (если НПС или цель близка к вайпоинту НПС)<br> * * * *{<br> * * * * * *// установить НПС родную тактику сражения<br> * * * * * *self.fight_tactic = self.aivar[AIV_OriginalFightTactic];<br> * * * *};<br> * *};<br> * *// если цель не бежит и не прыгает<br> * *if((!C_BodyStateContains(other,BS_RUN)) &amp;&amp; (!C_BodyStateContains(other,BS_JUMP)))<br> * *{<br> * * * *// сброс времени текущего состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *// если время в состоянии &gt; 2 сек (от последнего сброса) и охрана не вызывалась<br> * *if(Npc_GetStateTime(self) &gt; 2) &amp;&amp; (self.aivar[AIV_TAPOSITION] == 0)<br> * *{<br> * * * *// вызов охраны<br> * * * *B_CallGuards();<br> * * * *// установка следующей фазы вызова охраны<br> * * * *self.aivar[AIV_TAPOSITION] = 1;<br> * *};<br> * *// если время в состоянии &gt; 8 сек и охрана вызывалась<br> * *if(Npc_GetStateTime(self) &gt; 8 ) &amp;&amp; (self.aivar[AIV_TAPOSITION] == 1)<br> * *{<br> * * * *// вызов охраны<br> * * * *B_CallGuards();<br> * * * *// установка следующей фазы вызова охраны (было 2 вызова)<br> * * * *self.aivar[AIV_TAPOSITION] = 2;<br> * *};<br> * *// подготовка НПС боезапаса<br> * *B_CreateAmmo(self);<br> * *// выбор соответствующего цели оружия<br> * *B_SelectWeapon(self,other);<br> * *// если цель существует и не обездвижена<br> * *if((Hlp_IsValidNpc(other)) &amp;&amp; (C_NpcIsDown(other) == FALSE))<br> * *{<br> * * * *// если цель не в состоянии разговора<br> * * * *if(other.aivar[AIV_INVINCIBLE] == FALSE)<br> * * * *{<br> * * * * * *// НПС атакует цель (Примечание: функция AI_Attack работает только когда очередь AI состояний НПС пуста)<br> * * * * * *AI_Attack(self);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * *};<br> * * * *// запись НПС id последней цели<br> * * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *else // иначе (если цель отсутствует или обездвижена)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// если цель существует и цель ГГ и ГГ обездвижен<br> * * * *if(Hlp_IsValidNpc(other)) &amp;&amp; (Npc_IsPlayer(other)) &amp;&amp; (C_NpcIsDown(other))<br> * * * *{<br> * * * * * *// замена временного отношения НПС к ГГ на постоянное<br> * * * * * *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));<br> * * * *};<br> * * * *// если причина атаки НПС не убийство цели<br> * * * *if(self.aivar[AIV_ATTACKREASON] != AR_KILL)<br> * * * *{<br> * * * * * *// НПС разрешено воспринимать все объекты<br> * * * * * *Npc_PerceiveAll(self);<br> * * * * * *// НПС ищет новую цель other<br> * * * * * *Npc_GetNextTarget(self);<br> * * * *};<br> * * * *// если цель существует и она не обездвижена<br> * * * *if(Hlp_IsValidNpc(other)) &amp;&amp; (!C_NpcIsDown(other))<br> * * * *// и (расстояние от НПС до цели &lt; дистанции восприятия или цель ГГ)<br> * * * *&amp;&amp; ((Npc_GetDistToNpc(self,other) &lt; PERC_DIST_INTERMEDIAT) ¦¦ (Npc_IsPlayer(other)))<br> * * * *// и расстояние между НПС и целью по высоте &lt; дистанции восприятия по высоте<br> * * * *&amp;&amp; (Npc_GetHeightToNpc(self,other) &lt; PERC_DIST_HEIGHT)<br> * * * *// и цель не в разговоре<br> * * * *&amp;&amp; (other.aivar[AIV_INVINCIBLE] == FALSE)<br> * * * *// и цель ГГ не является переодетым бандитом и НПС бандит<br> * * * *&amp;&amp; (!(C_PlayerIsFakeBandit(self,other) &amp;&amp; (self.guild == GIL_BDT)))<br> * * * *{<br> * * * * * *// если гильдии НПС и цели враждебны<br> * * * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)<br> * * * * * *{<br> * * * * * * * *// причина атаки - враждебная гильдия<br> * * * * * * * *self.aivar[AIV_ATTACKREASON] = AR_GuildEnemy;<br> * * * * * * * *// если цель ГГ<br> * * * * * * * *if(Npc_IsPlayer(other))<br> * * * * * * * *{<br> * * * * * * * * * *// установить причину последнего нападения на ГГ<br> * * * * * * * * * *self.aivar[AIV_LastPlayerAR] = AR_GuildEnemy;<br> * * * * * * * * * *// параметр последнего сражения с ГГ - прервано<br> * * * * * * * * * *self.aivar[AIV_LastFightAgainstPlayer] = FIGHT_CANCEL;<br> * * * * * * * * * *// сброс комментария сражения<br> * * * * * * * * * *self.aivar[AIV_LastFightComment] = FALSE;<br> * * * * * * * *};<br> * * * * * *}<br> * * * * * *// иначе, если сам НПС является врагом цели<br> * * * * * *else if(Npc_GetAttitude(self,other) == ATT_HOSTILE)<br> * * * * * *{<br> * * * * * * * *// причина атаки = причину последнего нападения на ГГ<br> * * * * * * * *self.aivar[AIV_ATTACKREASON] = self.aivar[AIV_LastPlayerAR];<br> * * * * * *};<br> * * * * * *return LOOP_CONTINUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// если последнее сражение с ГГ прервано и последняя цель не ГГ<br> * * * * * *if(self.aivar[AIV_LastFightAgainstPlayer] == FIGHT_CANCEL) &amp;&amp; (self.aivar[AIV_LASTTARGET] != Hlp_GetInstanceID(hero))<br> * * * * * *{<br> * * * * * * * *// комментировать сражение не нужно<br> * * * * * * * *self.aivar[AIV_LastFightComment] = TRUE;<br> * * * * * *};<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br>};<br><br>//Функция завершения состояния атаки<br>func void ZS_Attack_End()<br>{<br> * *// установить other на последнюю цель<br> * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]); <br> * *// усли преследование было прекращено<br> * *if(self.aivar[AIV_PursuitEnd] == TRUE)<br> * *{ * * * <br> * * * *// если цель существует и цель ГГ и НПС не друг цели<br> * * * *if(Hlp_IsValidNpc(other)) &amp;&amp; (Npc_IsPlayer(other)) &amp;&amp; (self.npctype != NPCTYPE_FRIEND)<br> * * * *{<br> * * * * * *// установить временное отношение НПС к ГГ на враждебное<br> * * * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * * * *};<br> * * * *// если НПС сражался на арене (состояние - в процессе сражения)<br> * * * *if(self.aivar[AIV_ArenaFight] == AF_RUNNING)<br> * * * *{<br> * * * * * *// установить состояние после сражения<br> * * * * * *self.aivar[AIV_ArenaFight] = AF_AFTER;<br> * * * *};<br> * *};<br> * *// если преследования не было<br> * *if(self.aivar[AIV_PursuitEnd] == FALSE)<br> * *{<br> * * * *// если уровень достигнутый ГГ в сражении &gt; первоначального уровня <br> * * * *if(B_GetCurrentAbsolutionLevel(self) &gt; self.aivar[AIV_LastAbsolutionLevel])<br> * * * *{<br> * * * * * *// НПС говорит цели &quot;Умный малый!&quot; (SVM фраза)<br> * * * * * *B_Say(self,other,&quot;$WISEMOVE&quot;);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// обычная фраза завершения атаки<br> * * * * * *B_Say_AttackEnd();<br> * * * *};<br> * *};<br> * *// если цель убита ГГ и отношения гильдий НПС и ГГ не враждебные<br> * *if(other.aivar[AIV_KilledByPlayer] == TRUE) &amp;&amp; (Wld_GetGuildAttitude(self.guild,hero.guild) != ATT_HOSTILE)<br> * *{<br> * * * *// НПС становится другом ГГ<br> * * * *B_SetAttitude(self,ATT_FRIENDLY);<br> * *};<br> * *// если цель находится безсознания и причиной атаки было убийство цели<br> * *if(Npc_IsInState(other,ZS_Unconscious)) &amp;&amp; (C_NpcHasAttackReasonToKill(self))<br> * *{<br> * * * *// НПС добивает цель<br> * * * *B_FinishingMove(self,other);<br> * *};<br> * *// НПС прячет оружие<br> * *AI_RemoveWeapon(self);<br> * *// если цель обездвижена и НПС может обыскать цель и (цель не обыскивалась или должна быть обыскана)<br> * *if(C_NpcIsDown(other)) &amp;&amp; (C_WantToRansack(self)) &amp;&amp; ((other.aivar[AIV_RANSACKED] == FALSE) ¦¦ C_NpcRansacksAlways(self))<br> * *// и расстояние между НПС и целью &lt; дистанции восприятия<br> * *&amp;&amp; (Npc_GetDistToNpc(self,other) &lt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *// установка флага, что цель обыскана<br> * * * *other.aivar[AIV_RANSACKED] = TRUE;<br> * * * *// цель человек<br> * * * *if(other.guild &lt; GIL_SEPERATOR_HUM) <br> * * * *{<br> * * * * * *// переход НПС в состояние грабежа цели<br> * * * * * *AI_StartState(self,ZS_RansackBody,0,&quot;&quot;) ;<br> * * * * * *return;<br> * * * *}<br> * * * *else // (не человек)<br> * * * *{<br> * * * * * *// если НПС &quot;Аллигатор Джек&quot; и цель имеет &quot;Сырое мясо&quot;<br> * * * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(AlligatorJack)) &amp;&amp; (Npc_HasItems(other,ItFoMuttonRaw) &gt; 0)<br> * * * * * *{ * <br> * * * * * * * *// Джек ест мясо<br> * * * * * * * *AI_StartState(self,ZS_GetMeat,0,&quot;&quot;);<br > * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если жизнь НПС меньше половинной<br> * *if(self.attribute[ATR_HITPOINTS] &lt; (self.attribute[ATR_HITPOINTS_MAX]/2))<br> * *{<br> * * * *// НПС лечит себя<br> * * * *AI_StartState(self,ZS_HealSelf,0,&quot;&quot;);<b r> * * * *return;<br> * *};<br>};<br><br>

18.02.2005 09:54

Re: Уроки скриптологии
 
// ************************************************** *****<br>// Состояние защиты своего помещения<br>// ************************************************** *****<br>// Здесь: self - НПС хозяин помещения, other - &quot;незванный гость&quot; (ГГ)<br>// ************************************************** *****<br><br>// Функция обработки восприятия разговора (вызывается когда ГГ обращается к НПС хозяину)<br>func void B_ClearRoomTalk()<br>{<br> * *// если НПС хочет напасть на &quot;гостя&quot;<br> * *if(C_WantToAttackRoomIntruder(self))<br> * *{<br> * * * *// НПС предупреждает &quot;гостя&quot; (SVM фраза &quot;Пошел вон!&quot;)<br> * * * *B_Say(self,other,&quot;$GETOUTOFHERE&quot;);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС спрашивает &quot;гостя&quot; (SVM фраза &quot;Что ты тут ищешь!?&quot;)<br> * * * *B_Say(self,other,&quot;$WHYAREYOUINHERE&quot;);<b r> * *};<br>};<br><br>// Функция обработки восприятия выхода ГГ из помещения<br>// Возвращает TRUE если ГГ покинул помещение, иначе - FALSE<br>func int B_ExitIfRoomLeft()<br>{<br> * *var int portalguild;<br> * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)<br> * *portalguild = Wld_GetPlayerPortalGuild();<br> * *// если ГГ покинул помещение или помещение публичное<br> * *if(!C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (portalguild == GIL_PUBLIC)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * * * *// НПС перестает смотреть на ГГ<br> * * * *B_StopLookAt(self);<br> * * * *// если НПС хочет напасть на &quot;гостя&quot;<br> * * * *if(C_WantToAttackRoomIntruder(self))<br> * * * *{<br> * * * * * *// НПС говорит &quot;гостю&quot; (SVM фраза &quot;Да, иди прочь!&quot;)<br> * * * * * *B_Say(self,other,&quot;$YESGOOUTOFHERE&quot;);<br > * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// НПС говорит &quot;гостю&quot; (SVM фраза &quot;Умный малый!&quot;)<br> * * * * * *B_Say(self,other,&quot;$WISEMOVE&quot;);<br> * * * *};<br> * * * *// НПС продолжает выполнение распорядка дня<br> * * * *AI_ContinueRoutine(self);<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>// Инициализация состояния защиты помещения<br>func void ZS_ClearRoom()<br>{ * <br> * *// установить минимальный набор восприятий НПС<br> * *Perception_Set_Minimal();<br> * *// заменить восприятие входа в помещение на восприятие выхода &quot;гостя&quot; из помещения<br> * *Npc_PercEnable(self,PERC_ASSESSENTERROOM,B_ExitIf RoomLeft);<br> * *// включить восприятие на перемещение МОВа<br> * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);<br> * *// заменить восприятие разговора НПС<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_ClearRoomTa lk);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// НПС смотрит на &quot;гостя&quot;<br> * *B_LookAtNpc(self,other);<br> * *// НПС бежит к &quot;гостю&quot;<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// если НПС находится вне помещения<br> * *if(!Npc_IsInPlayersRoom(self)) *<br> * *{<br> * * * *// НПС бежит в точку, ближайшую к ГГ<br> * * * *AI_GotoWP(self,Npc_GetNearestWP(other));<br> * *};<br> * *// установка признака входа в цикл<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла защиты помещения<br>func int ZS_ClearRoom_Loop()<br>{<br> * *// если осуществен первый вход в цикл<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// НПС поворачивается к &quot;гостю&quot;<br> * * * *B_TurnToNpc(self,other);<br> * * * *// если НПС хочет напасть на &quot;гостя&quot;<br> * * * *if(C_WantToAttackRoomIntruder(self))<br> * * * *{<br> * * * * * *// НПС выбирает соответствующее &quot;гостю&quot; оружие<br> * * * * * *B_SelectWeapon(self,other);<br> * * * * * *// НПС предупреждает &quot;гостя&quot; (SVM фраза &quot;Пошел вон!&quot;)<br> * * * * * *B_Say(self,other,&quot;$GETOUTOFHERE&quot;);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// если НПС не является другом &quot;гостя&quot;<br> * * * * * *if(Npc_GetAttitude(other,self) != ATT_FRIENDLY)<br> * * * * * *{<br> * * * * * * * *// НПС спрашивает &quot;гостя&quot; (SVM фраза &quot;Что ты тут ищешь!?&quot;)<br> * * * * * * * *B_Say(self,other,&quot;$WHYAREYOUINHERE&quot;);<b r> * * * * * *};<br> * * * *};<br> * * * *// сброс времени нахождения НПС в этом состоянии<br> * * * *Npc_SetStateTime(self, 0);<br> * * * *// закрытие первого входа в цикл<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// если ГГ покинул помещение<br> * *if(B_ExitIfRoomLeft())<br> * *{<br> * * * *return LOOP_END;<br> * *};<br> * *// если НПС хочет напасть на &quot;гостя&quot;<br> * *if(C_WantToAttackRoomIntruder(self))<br> * *{<br> * * * *// если с момента входа в помещение прошло &gt; 5 сек<br> * * * *if(Npc_GetStateTime(self) &gt; 5)<br> * * * *{<br> * * * * * *// НПС атакует &quot;гостя&quot;<br> * * * * * *B_Attack(self,other,AR_ClearRoom,0);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *}<br> * *else // НПС не хочет нападать (повторяется каждые две секунды)<br> * *{<br> * * * *// если с момента входа в помещение прошло &gt;= 2 сек<br> * * * *if(Npc_GetStateTime(self) &gt;= 2)<br> * * * *{<br> * * * * * *// если НПС не видит &quot;гостя&quot; по прямой<br> * * * * * *if(!Npc_CanSeeNpcFreeLOS(self,other)) * <br> * * * * * *{<br> * * * * * * * *// НПС бежит в точку, ближайшую к ГГ<br> * * * * * * * *AI_GotoWP(self,Npc_GetNearestWP(other));<br> * * * * * * * *// НПС поворачивается к &quot;гостю&quot;<br> * * * * * * * *B_TurnToNpc(self,other);<br> * * * * * *}<br> * * * * * *// иначе, если НПС вообще не видит &quot;гостя&quot;<br> * * * * * *else if(!Npc_CanSeeNpc(self,other))<br> * * * * * *{ * <br> * * * * * * * *// НПС поворачивается в направлении &quot;гостя&quot;<br> * * * * * * * *B_TurnToNpc(self,other);<br> * * * * * *};<br> * * * * * *// сброс времени состояния<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция выхода из состояния защиты помещения<br>func void ZS_ClearRoom_End()<br>{<br> * *// НПС перестает смотреть на &quot;гостя&quot;<br> * *B_StopLookAt (self);<br>};<br><br>

19.02.2005 15:49

Re: Уроки скриптологии
 
// ************************************************** **<br>// Обработчик состояния когда НПС убегает от агрессора<br>// ----------------------------------------------------<br>// self - убегающий НПС, other - агрессор<br>// ************************************************** **<br><br>// Функция инициализации состояния<br>func void ZS_Flee()<br>{ * <br> * *// разрешить восприятие примененной магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * * * * * *<br> * *// получить other - агрессор<br> * *B_ValidateOther();<br> * *// если загрузки игры не было<br> * *if(self.aivar[AIV_LOADGAME] == FALSE)<br> * *{<br> * * * *// НПС кричит агрессору (SVM фраза &quot;Я сматываюсь!&quot;)<br> * * * *B_Say_Overlay(self,other,&quot;$RUNAWAY&quot;);<b r> * *};<br> * *// НПС прячет оружие<br> * *AI_RemoveWeapon(self);<br> * *// НПС переходит на бег<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// проигрывается анимация убегающего человека<br> * *Mdl_ApplyOverlayMds(self,&quot;HUMANS_FLEE.MDS&qu ot;);<br>};<br><br>// Цикл состояния убегания<br>func int ZS_Flee_Loop()<br>{<br> * *// получить для НПС цель (инициализировать other агрессором)<br> * *Npc_GetTarget(self);<br> * *// если расстояние между НПС и агрессором &gt; дистанции преследования<br> * *if(Npc_GetDistToNpc(self,other) &gt; FIGHT_DIST_CANCEL)<br> * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END; * * * * * * * * * * * * * * * * * *<br> * *};<br> * *// если агрессор обездвижен (мертв, безсознания и т.д.)<br> * *if(C_NpcIsDown(other))<br> * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// НПС продолжает убегать<br> * *AI_Flee(self);<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния убегания<br>func void ZS_Flee_End()<br>{<br> * *// прекратить проигрывание анимации убегающего человека<br> * *Mdl_RemoveOverlayMDS(self,&quot;HUMANS_FLEE.MDS&q uot;);<br> * *// НПС останавливается<br> * *AI_StandUp(self);<br> * *// вызов функции завершения состояния лечения НПС<br> * *AI_StartState(self,ZS_HealSelf,1,&quot;&quot;);<b r> * *return;<br>};<br><br><br>... еще описание одного состояния<br><br>// *********************************<br>// Обработчик состояния лечения НПС<br>// *********************************<br><br>// Инициализация состояния<br>func void ZS_HealSelf()<br>{<br> * *// разрешить НПС минимальный набор восприятий<br> * *Perception_Set_Minimal();<br>};<br><br>// Цикл состояния<br>func int ZS_HealSelf_Loop()<br>{<br> * *// если текущая жизнь НПС равняется максимальной<br> * *if(self.attribute[ATR_HITPOINTS] == self.attribute[ATR_HITPOINTS_MAX])<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если НПС имеет &quot;Лечебный эликсир&quot;<br> * *if(Npc_HasItems(self,ItPo_Health_03) &gt; 0) * * * * * <br> * *{<br> * * * *// НПС пьет &quot;Лечебный эликсир&quot;<br> * * * *AI_UseItem(self,ItPo_Health_03);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *// если НПС имеет &quot;Лечебный экстракт&quot;<br> * *else if(Npc_HasItems(self,ItPo_Health_02) &gt; 0)<br> * *{<br> * * * *// НПС пьет &quot;Лечебный экстракт&quot;<br> * * * *AI_UseItem(self,ItPo_Health_02);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *// если НРС имеет &quot;Лечебную эссенцию&quot;<br> * *else if(Npc_HasItems(self,ItPo_Health_01) &gt; 0)<br> * *{<br> * * * *// НПС пьет &quot;Лечебную эссенцию&quot;<br> * * * *AI_UseItem(self,ItPo_Health_01);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *else //иначе<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br>};<br><br>// Функция завершения состояния лечения<br>func void ZS_HealSelf_End()<br>{<br>};<br><br>

20.02.2005 11:54

Re: Уроки скриптологии
 
// *******************************************<br>// Обработчик состояния наблюдения НПС за ГГ<br>// -------------------------------------------<br>// self - наблюдающий НПС, other - ГГ<br>// *******************************************<br><br >// Инициализация наблюдения<br>func void ZS_ObservePlayer()<br>{ * <br> * *// установить НПС нормальный набор восприятий<br> * *Perception_Set_Normal(); <br> * *// если НПС не сидит<br> * *if(!C_BodystateContains(self,BS_SIT))<br> * *{<br> * * * *// НПС останавливается<br> * * * *AI_StandUp(self);<br> * * * *// НПС смотрит на ГГ<br> * * * *B_LookAtNpc(self,other);<br> * * * *// НПС поворачивается к ГГ<br> * * * *B_TurnToNpc(self,other);<br> * *}<br> * *else // иначе (если НПС сидит)<br> * *{<br> * * * *// НПС смотрит на ГГ<br> * * * *B_LookAtNpc(self,other);<br> * *};<br> * *// если в предудущем состоянии НПС спал<br> * *if(Npc_WasInState(self,ZS_Sleep))<br> * *{<br> * * * *// НПС спрашивает ГГ (SVM фраза &quot;Что случилось?&quot;)<br> * * * *B_Say(self,other,&quot;$YOUDISTURBEDMYSLUMBER&quo t;);<br> * *};<br> * *// если НПС наблюдает за своим помещением и other есть ГГ<br> * *if(self.aivar[AIV_SeenLeftRoom] == TRUE) &amp;&amp; (Npc_IsPlayer(other))<br> * *{<br> * * * *// сброс наблюдения за своим помещением<br> * * * *self.aivar[AIV_SeenLeftRoom] = FALSE;<br> * * * *// если комментария входа в чужое помещение не было<br> * * * *if(Player_LeftRoomComment == FALSE)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза &quot;Чего ты там ищешь?&quot;)<br> * * * * * *B_Say(self,other,&quot;$WHATDIDYOUDOINTHERE&quot; );<br> * * * * * *// установка флага состоявшегося комментария<br> * * * * * *Player_LeftRoomComment = TRUE;<br> * * * *};<br> * *};<br> * *// установить время нахождения НПС в этом состоянии (1 или 2 сек)<br> * *self.aivar[AIV_StateTime] = (Hlp_Random(2) + 1);<br>};<br><br>// Цикл состояния наблюдения<br>func int ZS_ObservePlayer_Loop ()<br>{<br> * *// если ГГ крадется и комментария подкрадывания не было<br> * *if(C_BodyStateContains(other,BS_SNEAK)) &amp;&amp; (Player_SneakerComment == FALSE)<br> * *{ * <br> * * * *// установка флага состоявшегося комментария<br> * * * *Player_SneakerComment = TRUE;<br> * * * *// НПС показывает на ГГ<br> * * * *AI_PointAtNpc(self,other);<br> * * * *// НПС говорит ГГ (SVM фраза &quot;Эй, ты! Что ты там шастаешь?&quot;)<br> * * * *B_Say(self,other,&quot;$WHATSTHISSUPPOSEDTOBE&quo t;);<br> * * * *// НПС перестает указывать на ГГ<br> * * * *AI_StopPointAt(self);<br> * * * *// НПС посылает ГГ предупреждение<br> * * * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,self,oth er);<br> * *};<br> * *// если время нахождения в состоянии &gt; 1 или 2 сек<br> * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_StateTime])<br> * *{<br> * * * *// если НПС не сидит<br> * * * *if(!C_BodystateContains(self,BS_SIT))<br> * * * *{<br> * * * * * *// НПС поворачивается к ГГ<br> * * * * * *B_TurnToNpc(self,other);<br> * * * *};<br> * * * *// установить время нахождения НПС в этом состоянии (1 или 2 сек)<br> * * * *self.aivar[AIV_StateTime] = (Hlp_Random(2) + 1);<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *// если расстояние между НПС и ГГ &gt; дальности действия восприятия<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *// очистка очереди состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *}<br> * *else // [Прим. else здесь лишнее, можно просто: return LOOP_CONTINUE;]<br> * *{<br> * * * *return LOOP_CONTINUE;<br> * *};<br>};<br><br>// Выход из состояния наблюдения<br>func void ZS_ObservePlayer_End ()<br>{<br> * *// НПС перестает смотреть на ГГ<br> * *B_StopLookAt(self);<br>};<br><br>

TycoooN 20.02.2005 13:18

Re: Уроки скриптологии
 
2Vam: <br>
Цитата:

В посте №136 этой темы товарищ TycoooN предложил Вашему вниманию первую часть уроков. Когда выйдет вторая часть, и кто её оформит, пока сказать не могу
<br>Я еще несколько раз обновлял файл. На данный момент в нем не хватает постов 5-6 ::)<br>Еще раз ссылка: http://gothic3.allgothic.ru/filezzz/Vam_tutor.rar

21.02.2005 11:01

Re: Уроки скриптологии
 
// *****************************************<br>// Обработчик состояния грабежа предметов с тел НПС<br>// -----------------------------------------<br>// self - грабитель, other - тело<br>// *****************************************<br><br>// Инициализация состояния<br>func void ZS_RansackBody()<br>{<br> * *// установить грабителю нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// грабитель встает<br> * *AI_StandUp(self);<br> * *// грабитель идет к телу<br> * *AI_GotoNpc(self,other);<br>};<br> * *<br>// Цикл грабежа<br>func int ZS_RansackBody_Loop()<br>{<br> * *return LOOP_END;<br>};<br><br>// Завершающая фаза грабежа<br>func void ZS_RansackBody_End()<br>{ * <br> * *// грабитель поворачивается к телу<br> * *B_TurnToNpc(self,other);<br> * *<br> * *// включить анимацию грабежа<br> * *AI_PlayAni(self,&quot;T_PLUNDER&quot;);<br> * *// если тело имеет &quot;Святой молот&quot; и грабитель &quot;Гарвиг&quot;<br> * *if(Npc_HasItems(other,Holy_Hammer_MIS) &gt; 0) &amp;&amp; (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Garwig))<br> * *{<br> * * * *// создать в инвентаре грабителя &quot;Святой молот&quot;<br> * * * *CreateInvItems(self,Holy_Hammer_MIS,1);<br> * * * *// удалить из инвентаря тела &quot;Святой молот&quot;<br> * * * *Npc_RemoveInvItems(other,Holy_Hammer_MIS,1); * *<br> * *};<br> * *// если тело имеет &quot;Меч Рода&quot; и грабитель &quot;Род&quot;<br> * *if(Npc_HasItems(other,ItMw_2h_Rod) &gt; 0) &amp;&amp; (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rod))<br> * *{<br> * * * *// переместить &quot;Меч Рода&quot; из инвентаря тела в инвентарь грабителя<br> * * * *CreateInvItems(self,ItMw_2h_Rod,1);<br> * * * *Npc_RemoveInvItems(other,ItMw_2h_Rod,1);<br> * * * *// грабитель экипируется лучшим оружием ближнего радиуса поражения<br> * * * *AI_EquipBestMeleeWeapon(self);<br> * *};<br> * *// если тело имеет &quot;Ключ к хибаре капитана Грега&quot; и грабитель &quot;Фрэнсис&quot;<br> * *if(Npc_HasItems(other,ITKE_Greg_ADDON_MIS)) &amp;&amp; (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Francis))<br> * *{<br> * * * *// передать предмет грабителю<br> * * * *CreateInvItems(self,ITKE_Greg_ADDON_MIS,1);<br> * * * *Npc_RemoveInvItems(other,ITKE_Greg_ADDON_MIS,1);< br> * *}; *<br> * *// если тело имеет &quot;Золото&quot;<br> * *if(Npc_HasItems(other,ItMi_Gold) &gt; 0)<br> * *{<br> * * * *var int x;<br> * * * *// кол-во золота у тела<br> * * * *x = Npc_HasItems(other,ItMi_Gold);<br> * * * *// передать все золдото грабителю<br> * * * *CreateInvItems(self,ItMi_Gold,x);<br> * * * *Npc_RemoveInvItems(other,ItMi_Gold,x); * * * * * * *<br> * * * *// грабитель говорит телу (SVM фраза &quot;Спасибо за золото, герой!&quot;)<br> * * * *B_Say(self,other,&quot;$ITOOKYOURGOLD&quot;);<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// грабитель говорит телу (SVM фраза &quot;Ты, жалкое ничтожество, разве у тебя нет золота!&quot;)<br> * * * *B_Say(self,other,&quot;$SHITNOGOLD&quot;);<br> * *};<br> * *// грабителю разрешается воспринимать все объекты в зоне действия восприятий<br> * *Npc_PerceiveAll(self);<br> * *// если грабитель находит оружие ближнего или дальнего радиуса поражения<br> * *if(Wld_DetectItem(self,ITEM_KAT_NF) ¦¦ Wld_DetectItem(self,ITEM_KAT_FF))<br> * *{<br> * * * *// если ссылка на предмет item существует<br> * * * *if(Hlp_IsValidItem(item))<br> * * * *{<br> * * * * * *// если расстояние от грабителя до предмета &lt; 5 метров<br> * * * * * *if(Npc_GetDistToItem(self,item) &lt; 500)<br> * * * * * *{<br> * * * * * * * *// грабитель берет предмет<br> * * * * * * * *AI_TakeItem(self,item);<br> * * * * * * * *// грабитель говорит сам себе (SVM фраза &quot;Твое оружие я возьму с собой.&quot;)<br> * * * * * * * *B_Say(self,self,&quot;$ITAKEYOURWEAPON&quot;); * * * *<br> * * * * * * * *// экипировка лучшим оружием<br> * * * * * * * *AI_EquipBestMeleeWeapon(self);<br> * * * * * * * *AI_EquipBestRangedWeapon(self);<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// если жизнь грабителя &lt; половинной<br> * *if(self.attribute[ATR_HITPOINTS] &lt; (self.attribute[ATR_HITPOINTS_MAX]/2))<br> * *{<br> * * * *// переход в состояние самолечения<br> * * * *AI_StartState(self,ZS_HealSelf,0,&quot;&quot;);<b r> * * * *return;<br> * *};<br>};<br><br><br>// ***********************************************<br >// Обработчик состояния когда Джек забирает сырое мясо у жертвы<br>// -----------------------------------------------<br>// self - НПС Джек, other - тело<br>// ***********************************************<br ><br>// Инициализация состояния<br>func void ZS_GetMeat()<br>{ * <br> * *// разрешить минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// идет к телу<br> * *AI_GotoNpc(self,other);<br> * *// поворачивается к телу<br> * *AI_TurnToNpc(self,other);<br> * *// проигрывание анимации грабежа<br> * *AI_PlayAni(self,&quot;T_PLUNDER&quot;);<br> * *var int x;<br> * *// кол-во &quot;Сырого мяса&quot; у тела<br> * *x = Npc_HasItems(other,ItFoMuttonRaw);<br> * *// передать мясо от тела НПС<br> * *CreateInvItems(self,ItFoMuttonRaw,x);<br> * *Npc_RemoveInvItems(other,ItFoMuttonRaw,x);<br> * *// если жизнь НПС &lt; половинной<br> * *if(self.attribute[ATR_HITPOINTS] &lt; (self.attribute[ATR_HITPOINTS_MAX]/2))<br> * *{<br> * * * *// переход в состояние самолечения<br> * * * *AI_StartState(self,ZS_HealSelf,0,&quot;&quot;);<b r> * * * *return;<br> * *};<br>};<br><br>

21.02.2005 17:51

Re: Уроки скриптологии
 
// ************************************************** **********<br>// Обработчик состояния реакции НПС на повреждение<br>// ------------------------------------------------------------<br>// self - НПС, получивший повреждение, other - агрессор<br>// ************************************************** **********<br><br>// Инициализация состояния<br>func void ZS_ReactToDamage()<br>{ * <br> * *// разрешить НПС нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// НПС смотрит на агрессора<br> * *B_LookAtNpc(self,other);<br> * *// НПС выбирает оружие для поражения агрессора<br> * *B_SelectWeapon(self,other);<br> * *// НПС поворачивается к агрессору<br> * *B_TurnToNpc(self,other);<br> * *// НПС говорит агрессору (SVM фраза &quot;Парень, никогда так больше не делай!&quot;)<br> * *B_Say (self, other, &quot;$WHATAREYOUDOING&quot;);<br> * *// очистка счетчика секунд<br> * *self.aivar[AIV_StateTime] = 0;<br>};<br><br>// Цикл состояния<br>func int ZS_ReactToDamage_Loop()<br>{<br> * *// если прошла одна секунда<br> * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_StateTime])<br> * *{<br> * * * *// если НПС не видит агрессора<br> * * * *if(!Npc_CanSeeNpc(self,other))<br> * * * *{ * <br> * * * * * *// НПС поворачивается к агрессору<br> * * * * * *AI_TurnToNpc(self,other);<br> * * * *};<br> * * * *// счетчик секунд ++<br> * * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;<br> * *};<br> * *// если прошло более 10 секунд<br> * *if(Npc_GetStateTime (self) &gt; 10) <br> * *{<br> * * * *return LOOP_END;<br> * *}<br> * *else // [Примечание: else можно убрать, просто - return LOOP_CONTINUE;]<br> * *{<br> * * * *return LOOP_CONTINUE;<br> * *};<br>};<br><br>// Завершения состояния<br>func void ZS_ReactToDamage_End()<br>{<br> * *// НПС убирает оружие<br> * *AI_RemoveWeapon(self);<br> * *// перестает смотреть на агрессора<br> * *B_StopLookAt(self);<br>};<br><br><br>... и еще один файл<br><br>// ********************************************<br>// Обработчик состояния реакции НПС на оружие<br>// --------------------------------------------<br>// self - реагирующий НПС, other - агрессор<br>// ********************************************<br><b r>// Инициализация состояния<br>func void ZS_ReactToWeapon()<br>{ * <br> * *// разрешить НПС минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// разрешить НПС восприятие сражения двух других НПС<br> * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound);<br> * *// реакция НПС на врага агрессора<br> * *if(B_AssessEnemy())<br> * *{<br> * * * *return;<br> * *};<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// смотрит на агрессора<br> * *B_LookAtNpc(self,other);<br> * *// выбирает оружие<br> * *B_SelectWeapon(self,other);<br> * *// поворачивается к агрессору<br> * *B_TurnToNpc(self,other);<br> * *// если НПС выиграл последнее сражение с ГГ и была причина сражения с ГГ и агрессор ГГ<br> * *if(self.aivar[AIV_LastFightAgainstPlayer] == FIGHT_WON) &amp;&amp; (self.aivar[AIV_LastPlayerAR] != AR_NONE) &amp;&amp; (Npc_IsPlayer(other))<br> * *{<br> * * * *// НПС говорит ГГ (SVM фраза &quot;Хочешь еще получить?&quot;)<br> * * * *B_Say(self,other,&quot;$LOOKINGFORTROUBLEAGAIN&qu ot;);<br> * *}<br> * *// иначе, если комментария обнаженного оружия не было<br> * *else if(Player_DrawWeaponComment == FALSE)<br> * *{<br> * * * *// если агрессор хочет применить магию<br> * * * *if(Npc_IsInFightMode(other,FMODE_MAGIC))<br> * * * *{<br> * * * * * *// НПС говорит агрессору (SVM фраза &quot;Перестань колдовать!&quot;)<br> * * * * * *B_Say(self,other,&quot;$STOPMAGIC&quot;);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// НПС говорит агрессору (SVM фраза &quot;Убери оружие!&quot;)<br> * * * * * *B_Say(self,other,&quot;$WEAPONDOWN&quot;);<br> * * * *};<br> * * * *// установка флага состоявшегося комментария<br> * * * *Player_DrawWeaponComment = TRUE;<br> * *};<br> * *// НПС посылает предупреждение агрессору<br> * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,self,oth er);<br> * *// сброс флага второго предупреждения<br> * *self.aivar[AIV_TAPOSITION] = FALSE;<br> * *// сброс счетчика времени<br> * *self.aivar[AIV_StateTime] = 0;<br>};<br><br>// Цикл состояния<br>func int ZS_ReactToWeapon_Loop()<br>{ * <br> * *// если расстояние между НПС и агрессором &gt; дистанции действия восприятия<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС убирает оружие<br> * * * *AI_RemoveWeapon(self);<br> * * * *// перестает смотреть на агрессора<br> * * * *B_StopLookAt(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если агрессор убрал оружие<br> * *if(Npc_IsInFightMode(other,FMODE_NONE))<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС говорит агрессору (SVM фраза &quot;Умный малый!&quot;)<br> * * * *B_Say(self,other,&quot;$WISEMOVE&quot;);<br> * * * *// НПС убирает оружие<br> * * * *AI_RemoveWeapon(self);<br> * * * *// перестает смотреть на агрессора<br> * * * *B_StopLookAt (self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если прошла одна секунда<br> * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_StateTime])<br> * *{<br> * * * *// если НПС не видит агрессора<br> * * * *if(!Npc_CanSeeNpc(self,other))<br> * * * *{ * <br> * * * * * *// НПС поворачивается к агрессору<br> * * * * * *B_TurnToNpc(self,other);<br> * * * *};<br> * * * *// счетчик времени ++<br> * * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;<br> * *};<br> * *// если второго предупреждения не было и время в состоянии &gt; 5 сек<br> * *if(self.aivar[AIV_TAPOSITION] == FALSE) &amp;&amp; (Npc_GetStateTime(self) &gt; 5)<br> * *{ * <br> * * * *// если агрессор хочет применить магию<br> * * * *if(Npc_IsInFightMode(other,FMODE_MAGIC))<br> * * * *{<br> * * * * * *// НПС говорит агрессору (SVM фраза &quot;Убери свою магию! Ты что, оглох!?&quot;)<br> * * * * * *B_Say(self,other,&quot;$ISAIDSTOPMAGIC&quot;);<br > * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// НПС говорит агрессору (SVM фраза &quot;Да убери же чертово оружие!&quot;)<br> * * * * * *B_Say(self,other,&quot;$ISAIDWEAPONDOWN&quot;);<b r> * * * *};<br> * * * *// установить флаг второго предупреждения<br> * * * *self.aivar[AIV_TAPOSITION] = TRUE;<br> * *};<br> * *// если время в состоянии &gt; 10 сек<br> * *if(Npc_GetStateTime(self) &gt; 10) * * * * * * * * * * * * * * * * * * * * <br> * *{<br> * * * *// НПС атакует агрессора<br> * * * *B_Attack(self,other,AR_ReactToWeapon,0);<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_ReactToWeapon_End()<br>{ * <br> * *// НПС перестает смотреть на агрессора<br> * *B_StopLookAt(self);<br> * *// НПС переходит в заключительную фазу состояния наблюдения за ГГ<br> * *AI_StartState(self,ZS_ObservePlayer,1,&quot;&quot ;);<br>};<br><br>

22.02.2005 10:01

Re: Уроки скриптологии
 
// *****************************************<br>// Обработчик состояния разговора между НПС<br>// -----------------------------------------<br>// self - НПС источник информации, other - слушатель (всегда ГГ)<br>// *****************************************<br><br>v ar int zsTalkBugfix; * // флаг выхода из разговора<br><br>// Инициализация состояния разговора<br>func void ZS_Talk()<br>{<br> * *// если ГГ уже с кем-то разговаривает<br> * *if(other.aivar[AIV_INVINCIBLE] == TRUE)<br> * *{<br> * * * *return; * * * * * * <br> * *};<br> * *// установка флагов начала разговора (для обоих участников)<br> * *self.aivar[AIV_INVINCIBLE] = TRUE;<br> * *other.aivar[AIV_INVINCIBLE] = TRUE;<br> * *// если НПС человек<br> * *if(self.guild &lt; GIL_SEPERATOR_HUM)<br> * *{ * * * <br> * * * *// если НПС сидит<br> * * * *if(C_BodyStateContains(self,BS_SIT))<br> * * * *{<br> * * * * * *var C_NPC target;<br> * * * * * *// инициализация глобальной переменной target ссылкой на НПС, на которого смотрит источник информации<br> * * * * * *target = Npc_GetLookAtTarget(self);<br> * * * * * *// если target не существует<br> * * * * * *if(!Hlp_IsValidNpc(target))<br> * * * * * *{<br> * * * * * * * *// НПС смотрит на ГГ<br> * * * * * * * *AI_LookAtNpc(self,other);<br> * * * * * *};<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// НПС смотрит на ГГ<br> * * * * * *B_LookAtNpc(self,other);<br> * * * *};<br> * * * *// НПС прячет оружие<br> * * * *AI_RemoveWeapon(self);<br> * *};<br> * *// если НПС не сидит<br> * *if(!C_BodystateContains(self,BS_SIT))<br> * *{ * <br> * * * *// НПС поворачивается к ГГ<br> * * * *B_TurnToNpc(self,other);<br> * *};<br> * *// если ГГ не сидит<br> * *if(!C_BodystateContains(other,BS_SIT))<br> * *{ * <br> * * * *// ГГ поворачивается к НПС<br> * * * *B_TurnToNpc(other,self);<br> * * * *// если расстояние между ГГ и НПС &lt; 80 см<br> * * * *if(Npc_GetDistToNpc(other,self) &lt; 80) <br> * * * *{<br> * * * * * *// ГГ отспупает назад<br> * * * * * *AI_Dodge(other);<br> * * * *};<br> * *};<br> * *// если НПС человек<br> * *if(self.guild &lt; GIL_SEPERATOR_HUM)<br> * *{ * <br> * * * *// если НПС сердит на ГГ или НПС враг ГГ<br> * * * *if(Npc_GetAttitude(self,other) == ATT_ANGRY) ¦¦ (Npc_GetAttitude(self,other) == ATT_HOSTILE)<br> * * * *{<br> * * * * * *// если ГГ не переодет в бандита или НПС не бандит<br> * * * * * *if(!C_PlayerIsFakeBandit(self,other)) ¦¦ (self.guild != GIL_BDT)<br> * * * * * *{<br> * * * * * * * *// включить &quot;злую&quot; анимацию лица НПС<br> * * * * * * * *Mdl_StartFaceAni(self,&quot;S_ANGRY&quot;,1,-1);<br> * * * * * *};<br> * * * *};<br> * * * *// если НПС принадлежит к окружающему народу<br> * * * *if(self.npctype == NPCTYPE_AMBIENT) * * * * // общему<br> * * * *¦¦ (self.npctype == NPCTYPE_OCAMBIENT) * * *// или из Миненталя<br> * * * *¦¦ (self.npctype == NPCTYPE_BL_AMBIENT) * * // или из Лагеря бандитов<br> * * * *¦¦ (self.npctype == NPCTYPE_TAL_AMBIENT) * *// или из Долины бандитов<br> * * * *{<br> * * * * * *// инициализация диалога НПС об окружающей информации (сплетни)<br> * * * * * *B_AssignAmbientInfos(self);<br> * * * * * *// если НПС принадлежит городу<br> * * * * * *if(C_NpcBelongsToCity(self))<br> * * * * * *{<br> * * * * * * * *// инициализация диалога НПС о городской жизни<br> * * * * * * * *B_AssignCityGuide(self);<br> * * * * * *};<br> * * * *};<br> * * * *// если НПС является членом партии ГГ и<br> * * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * * * *&amp;&amp; (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff)) * * * * // НПС не Бифф<br> * * * *&amp;&amp; (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_NW)) * * *// и НПС не Бифф в Новом мире<br> * * * *&amp;&amp; (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_DI)) * * *// и НПС не Бифф на Острове драконов<br> * * * *&amp;&amp; (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos)) * * * // и НПС не Пардос<br> * * * *&amp;&amp; (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos_NW)) * *// и НПС не Пардос в Новом мире<br> * * * *{<br> * * * * * *// ГГ дает НПС напиток лечения<br> * * * * * *B_Addon_GivePotion(self);<br> * * * *};<br> * * * *// если НПС имеет дело с &quot;крутым парнем&quot; и НПС не имеет новостей о &quot;крутом парне&quot;<br> * * * *if(C_NpcIsToughGuy(self)) &amp;&amp; (self.aivar[AIV_ToughGuyNewsOverride] == FALSE)<br> * * * *{<br> * * * * * *// инициализация диалога НПС о &quot;крутом парне&quot;<br> * * * * * *B_AssignToughGuyNEWS(self);<br> * * * *};<br> * * * *// если НПС имеет новости об окружающей жизни<br> * * * *if(C_NpcHasAmbientNews(self))<br> * * * *{<br> * * * * * *// инициализация диалога НПС об окружающих новостях<br> * * * * * *B_AssignAmbientNEWS(self);<br> * * * *};<br> * *}; * * *<br> * *// если НПС дракон<br> * *if (self.guild == GIL_DRAGON)<br> * *{<br> * * * *// проиграть анимацию дракона T_STAND_2_TALK<br> * * * *AI_PlayAni(self,&quot;T_STAND_2_TALK&quot;);<br> * *};<br> * *// начать выбранный диалог<br> * *AI_ProcessInfos(self);<br> * *// сброс флага выхода из разговора<br> * *zsTalkBugfix = FALSE;<br>};<br><br>// Цикл состояния разговора<br>func INT ZS_Talk_Loop ()<br>{<br> * *// если диалог закончен и флаг выхода установлен<br> * *if(InfoManager_HasFinished()) &amp;&amp; (zsTalkBugfix == TRUE)<br> * *{<br> * * * *// сброс флагов разговора для обоих участников<br> * * * *self.aivar[AIV_INVINCIBLE] = FALSE;<br> * * * *other.aivar[AIV_INVINCIBLE] = FALSE;<br> * * * *// сброс флага важной информации<br> * * * *self.aivar[AIV_NpcStartedTalk] = FALSE;<br> * * * *// установка флага, что НПС говорил с ГГ<br> * * * *self.aivar[AIV_TalkedToPlayer] = TRUE;<br> * * * *// если НПС человек<br> * * * *if(self.guild &lt; GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// НПС перестает смотреть на ГГ<br> * * * * * *B_StopLookAt(self);<br> * * * * * *// сменить выражение лица НПС на обычное<br> * * * * * *Mdl_StartFaceAni(self,&quot;S_NEUTRAL&quot;,1,-1);<br> * * * *}; *<br> * * * *// если НПС дракон<br> * * * *if(self.guild == GIL_DRAGON)<br> * * * *{<br> * * * * * *// запустить обычную анимацию стоящего дракона<br> * * * * * *AI_PlayAni(self,&quot;T_TALK_2_STAND&quot;);<br> * * * *};<br> * * * *return LOOP_END;<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// установить флаг выхода из разговора (нельзя завершить цикл разговора при первом вхождении)<br> * * * *zsTalkBugfix = TRUE;<br> * * * *return LOOP_CONTINUE;<br> * *};<br>};<br><br>// Окончание состояния разговора<br>func void ZS_Talk_End()<br>{<br> * *// отказ ГГ от других диалогов на 20 сек<br> * *Npc_SetRefuseTalk(other,20);<br> * *// когда НПС находится в своем помещении или (помещение публично и НПС не друг ГГ<br> * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ ((Wld_GetPlayerPortalGuild() == GIL_PUBLIC) &amp;&amp; (Npc_GetAttitude(self,other) != ATT_FRIENDLY))<br> * *{<br> * * * *// НПС переходит в состояние наблюдения за ГГ<br> * * * *AI_StartState(self,ZS_ObservePlayer,0,&quot;&quot ;);<br> * *}<br> * *else * *// [лишнее, можно удалить]<br> * *{<br><br> * *};<br>};<br><br>

23.02.2005 10:37

Re: Уроки скриптологии
 
// ************************************************** *********<br>// Обработчик состояния наблюдения за сражением<br>// -----------------------------------------------------------<br>// self - НПС наблюдатель, other - агрессор, victim - жертва<br>// ************************************************** *********<br><br>// Функция реакции НПС наблюдателя когда другой НПС получает повреждение <br>func void B_CheerFight()<br>{<br> * *// если время нахождения наблюдателя в этом состоянии &lt;= 2 сек<br> * *if(Npc_GetStateTime(self) &lt;= 2) * * * * * * <br> * *{<br> * * * *return;<br> * *};<br> * *// если агрессор монстр или жертва монстр<br> * *if((other.guild &gt; GIL_SEPERATOR_HUM) ¦¦ (victim.guild &gt; GIL_SEPERATOR_HUM))<br> * *{<br> * * * *return;<br> * *};<br> * *// сброс времени нахождения в состоянии<br> * *Npc_SetStateTime(self,0);<br> * *// если наблюдатель имеет дело с &quot;крутым парнем&quot;<br> * *if(C_NpcIsToughGuy(self))<br> * *{<br> * * * *var int zufall;<br> * * * *// случайное число<br> * * * *zufall = Hlp_Random(3);<br> * * * *// если наблюдатель друг жертвы и наблюдатель не друг агрессору<br> * * * *if(Npc_GetAttitude(self,victim) == ATT_FRIENDLY) &amp;&amp; (Npc_GetAttitude(self,other) != ATT_FRIENDLY)<br> * * * *{<br> * * * * * *// наблюдатель говорит сам себе (SVM фраза)<br> * * * * * *if(zufall == 0) { B_Say_Overlay(self,self,&quot;$OOH01&quot;); }; // &quot;Смотри, не делай так!&quot;<br> * * * * * *if(zufall == 1) { B_Say_Overlay(self,self,&quot;$OOH02&quot;); }; // &quot;Вот тогда ты еще успеешь это сделать!&quot;<br> * * * * * *if(zufall == 2) { B_Say_Overlay(self,self,&quot;$OOH03&quot;); }; // &quot;Ох! Это же больно!&quot;<br> * * * * * *// проиграть анимацию<br> * * * * * *AI_PlayAni(self,&quot;T_WATCHFIGHT_OHNO&quot;);<b r> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// наблюдатель говорит сам себе (SVM фраза)<br> * * * * * *if(zufall == 0) { B_Say_Overlay(self,self,&quot;$CHEERFRIEND01&quot; ); }; // &quot;Да, это хорошо!&quot;<br> * * * * * *if(zufall == 1) { B_Say_Overlay(self,self,&quot;$CHEERFRIEND02&quot; ); }; // &quot;Ну, сделай уже!&quot;<br> * * * * * *if(zufall == 2) { B_Say_Overlay(self,self,&quot;$CHEERFRIEND03&quot; ); }; // &quot;Все просто здорово!&quot;<br> * * * * * *// проиграть анимацию<br> * * * * * *AI_PlayAni(self,&quot;T_WATCHFIGHT_YEAH&quot;);<b r> * * * *};<br> * *};<br>};<br><br>// Функция реакции НПС наблюдателя когда другой НПС падает безсознания<br>func void B_AssessDefeat()<br>{<br> * *// очистка очереди AI состояний наблюдателя<br> * *Npc_ClearAIQueue(self);<br> * *// если наблюдатель имеет дело с &quot;крутым парнем&quot; или (агрессор ГГ и наблюдатель друг ГГ)<br> * *if(C_NpcIsToughGuy(self)) ¦¦ (Npc_IsPlayer(other) &amp;&amp; (self.npctype == NPCTYPE_FRIEND))<br> * *{<br> * * * *// если наблюдатель друг ГГ<br> * * * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY)<br> * * * *{<br> * * * * * *// наблюдатель говорит ГГ (SVM фраза &quot;Ну и показал же ты ему!&quot;)<br> * * * * * *B_Say(self,other,&quot;$GOODVICTORY&quot;);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// наблюдатель говорит ГГ (SVM фраза &quot;Неплохо...&quot;)<br> * * * * * *B_Say(self,other,&quot;$NOTBAD&quot;);<br> * * * *};<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// если у жертвы не было причины сражаться<br> * * * *if(victim.aivar[AIV_ATTACKREASON] != AR_NONE)<br> * * * *{<br> * * * * * *// наблюдатель говорит агрессору (SVM фраза &quot;Боже мой! Какая жестокость...&quot;)<br> * * * * * *B_Say(self,other,&quot;$OHMYGODHESDOWN&quot;);<br > * * * * * *// наблюдатель запоминает новость, что агрессор сражался с НПС жертвой<br> * * * * * *B_MemorizePlayerCrime(self,other,CRIME_ATTACK);<b r> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// наблюдатель говорит агрессору (SVM фраза &quot;Неплохо...&quot;)<br> * * * * * *B_Say(self,other,&quot;$NOTBAD&quot;);<br> * * * *};<br> * *};<br>};<br><br>// Инициализация состояния наблюдения за сражением<br>func void ZS_WatchFight ()<br>{<br> * *// разрешить наблюдателю локальное восприятие бессознательного состояния НПС<br> * *Npc_PercEnable(self,PERC_ASSESSDEFEAT,B_AssessDef eat);<br> * *// разрешить наблюдателю локальное восприятие если НПС получил повреждение<br> * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_Che erFight);<br> * *// разрешить минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// наблюдатель встает<br> * *AI_StandUp(self);<br> * *// поворачивается к жертве<br> * *B_TurnToNpc(self,victim);<br> * *// прячет оружие<br> * *AI_RemoveWeapon(self); * * * * *<br> * *// если (расстояние между наблюдателем и агрессором или наблюдателем и жертвой &lt; дистанции действия восприятия)<br> * *if((Npc_GetDistToNpc(self,other) &lt; PERC_DIST_INTERMEDIAT) ¦¦ (Npc_GetDistToNpc(self,victim) &lt; PERC_DIST_INTERMEDIAT))<br> * *// и агрессор и жертва не безсознания<br> * *&amp;&amp; (!Npc_IsInState(other,ZS_Unconscious)) &amp;&amp; (!Npc_IsInState(victim,ZS_Unconscious))<br> * *// и агрессор и жертва люди<br> * *&amp;&amp; ((other.guild &lt; GIL_SEPERATOR_HUM) &amp;&amp; (victim.guild &lt; GIL_SEPERATOR_HUM))<br> * *{<br> * * * *// если наблюдатель имеет дело с &quot;крутым парнем&quot;&quot;<br> * * * *if(C_NpcIsToughGuy(self))<br> * * * *{<br> * * * * * *// наблюдатель говорит агрессору (SVM фраза &quot;Ух ты, это же битва!&quot;)<br> * * * * * *B_Say(self,other,&quot;$THERESAFIGHT&quot;);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// наблюдатель говорит агрессору (SVM фраза &quot;Боже мой, вот это битва!&quot;)<br> * * * * * *B_Say(self,other,&quot;$OHMYGODITSAFIGHT&quot;);< br> * * * *};<br> * *};<br> * *// сброс флага выхода из цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * *// очистить счетчик времени<br> * *self.aivar[AIV_StateTime] = 0;<br>};<br><br>// Цикл состояния наблюдения за сражением<br>func int ZS_WatchFight_Loop()<br>{<br> * *// если расстояние между наблюдателем и агрессором и наблюдателем и жертвой &gt; дистанции наблюдения сражения<br> * *if(Npc_GetDistToNpc(self,other) &gt; WATCHFIGHT_DIST_MAX) &amp;&amp; (Npc_GetDistToNpc(self,victim) &gt; WATCHFIGHT_DIST_MAX)<br> * *{<br> * * * *// очистка очереди AI состояний наблюдателя<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если (агрессор не атакует или не реагирует на повреждение)<br> * *if(!(Npc_IsInState(other,ZS_Attack) ¦¦ Npc_IsInState(other,ZS_ReactToDamage)))<br> * *// и (жертва не атакует или не реагирует на повреждение)<br> * *&amp;&amp; (!(Npc_IsInState(victim,ZS_Attack) ¦¦ Npc_IsInState(victim,ZS_ReactToDamage)))<br> * *// и время в состоянии &gt; 0<br> * *&amp;&amp; (Npc_GetStateTime(self) &gt; 0)<br> * *{<br> * * * *// если агрессор или жертва безсознания<br> * * * *if(Npc_IsInState(other,ZS_Unconscious)) ¦¦ (Npc_IsInState(victim,ZS_Unconscious))<br> * * * *// или агрессор или жертва мертвы<br> * * * *¦¦ (Npc_IsInState(other,ZS_Dead)) ¦¦ (Npc_IsInState(victim,ZS_Dead))<br> * * * *{<br> * * * * * *// если флаг выхода из цикла сброшен<br> * * * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * * * * * *{<br> * * * * * * * *// установить флаг<br> * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * * * * * * * *return LOOP_CONTINUE;<br> * * * * * *}<br> * * * * * *else // иначе, флаг выхода из цикла установлен<br> * * * * * *{<br> * * * * * * * *// очистка очереди AI состояний наблюдателя<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// выход из цикла выполняется после второго прохода, если кто-либо из сражающихся мертв или безсознания (чтобы сработало соответствующее восприятие)<br> * * * * * * * *return LOOP_END;<br> * * * * * *};<br> * * * *}<br> * * * *else<br> * * * *{ * * * <br> * * * * * *// очистка очереди AI состояний наблюдателя<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br> * *// если наблюдатель имеет дело с &quot;крутым парнем&quot;<br> * *if(C_NpcIsToughGuy(self))<br> * *{<br> * * * *// анимация удалена!!!<br> * * * *//AI_PlayAni(self,&quot;T_STAND_2_WATCHFIGHT&quot;); <br> * *};<br> * *// если расстояние между наблюдателем и агрессором или наблюдателем и жертвой &lt;= мин. дистанции наблюдения сражения<br> * *if(Npc_GetDistToNpc(self,other) *&lt;= WATCHFIGHT_DIST_MIN) ¦¦ (Npc_GetDistToNpc(self,victim) &lt;= WATCHFIGHT_DIST_MIN)<br> * *{<br> * * * *// очистка очереди AI состояний наблюдателя<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// если расстояние между наблюдателем и агрессором &lt;= расстояния между наблюдателем и жертвой<br> * * * *if(Npc_GetDistToNpc(self,other) &lt;= Npc_GetDistToNpc(self,victim))<br> * * * *{<br> * * * * * *// наблюдатель поворачивается к жертве<br> * * * * * *B_TurnToNpc(self,victim);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// наблюдатель поворачивается к агрессору<br> * * * * * *B_TurnToNpc(self,other);<br> * * * *};<br> * * * *// наблюдатель делает шаг назад<br> * * * *AI_Dodge(self);<br> * *}<br> * *else // иначе (расстояние нормальное для наблюдения)<br> * *{<br> * * * *// если прошла секунда<br> * * * *if(Npc_GetStateTime(self) != self.aivar[AIV_StateTime])<br> * * * *{<br> * * * * * *// если если расстояние между наблюдателем и агрессором &lt;= расстояния между наблюдателем и жертвой<br> * * * * * *if(Npc_GetDistToNpc(self,other) &lt;= Npc_GetDistToNpc(self,victim))<br> * * * * * *{<br> * * * * * * * *// наблюдатель поворачивается к агрессору<br> * * * * * * * *B_TurnToNpc(self,other);<br> * * * * * *}<br> * * * * * *else // иначе<br> * * * * * *{<br> * * * * * * * *// наблюдатель поворачивается к жертве<br> * * * * * * * *B_TurnToNpc(self,victim);<br> * * * * * *};<br> * * * * * *// запись в счетчик текущего времени цикла<br> * * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_WatchFight_End()<br>{<br> * *// анимация удалена!!!<br> * *//AI_PlayAni(self,&quot;T_WATCHFIGHT_2_STAND&quot;); <br>};<br><br>

24.02.2005 09:52

Re: Уроки скриптологии
 
// ************************************************** ***<br>// Обработчик состояния когда НПС находится безсознания<br>// Примечание: НПС в это состояние переводит ядро системы, когда у НПС кончается жизнь, а не скрипты!<br>// -----------------------------------------------------<br>// self - НПС безсознания, other - агрессор<br>// ************************************************** ***<br><br>// Инициализация состояния<br>func void ZS_Unconscious()<br>{ * <br> * *// разрешить НПС воспринимать магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// если НПС плыл или нырял<br> * *if(C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// очистка всех восприятий<br> * * * *B_ClearPerceptions(self);<br> * * * *// переход НПС в состояние трупа (смерть)<br> * * * *AI_StartState(self,ZS_Dead,0,&quot;&quot;);<br> * * * *return;<br> * *};<br> * *// сброс статуса предупреждения охраной<br> * *self.aivar[AIV_Guardpassage_Status] = GP_NONE;<br> * *// сброс счетчика отказа от диалога<br> * *Npc_SetRefuseTalk(self,0);<br> * *// сброс временного отношения НПС к ГГ (устанавливается равным постоянному отношению)<br> * *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));<br> * *// НПС перестает смотреть на кого-либо<br> * *B_StopLookAt(self);<br> * *// НПС прекращает на что-либо указывать<br> * *AI_StopPointAt(self);<br> * *// если НПС человек и агрессор ГГ<br> * *if(self.guild &lt; GIL_SEPERATOR_HUM) &amp;&amp; (Npc_IsPlayer(other)) * * * * * * * * * * * * * * <br> * *{<br> * * * *// установить флаг, что НПС побежден ГГ<br> * * * *self.aivar[AIV_DefeatedByPlayer] = TRUE;<br> * * * *// установить, что НПС проиграл сражение с ГГ<br> * * * *self.aivar[AIV_LastFightAgainstPlayer] = FIGHT_LOST;<br> * * * *// если причины у НПС нападать на ГГ не было и ГГ этого НПС из наемников еще не бил и НПС наемник<br> * * * *if(self.aivar[AIV_LastPlayerAR] == AR_NONE) &amp;&amp; (self.aivar[AIV_DuelLost] == FALSE) &amp;&amp; (self.guild == GIL_SLD)<br> * * * *{<br> * * * * * *// увеличить счетчик для задания Торлофа (побить &gt; 3 наемников)<br> * * * * * *Sld_Duelle_gewonnen = Sld_Duelle_gewonnen + 1;<br> * * * * * *// установить флаг, что наемник побит ГГ<br> * * * * * *self.aivar[AIV_DuelLost] = TRUE;<br> * * * *};<br> * * * *// *если НПС сражался на арене с Альриком<br> * * * *if(self.aivar[AIV_ArenaFight] == AF_RUNNING)<br> * * * *{<br> * * * * * *// запись следующей фазы сражения на арене НПС<br> * * * * * *self.aivar[AIV_ArenaFight] = AF_AFTER;<br> * * * *};<br> * *};<br> * *// если НПС безсознания ГГ<br> * *if(Npc_IsPlayer(self))<br> * *{<br> * * * *// установить, что агрессор выиграл сражение с ГГ<br> * * * *other.aivar[AIV_LastFightAgainstPlayer] = FIGHT_WON;<br> * * * *// если ГГ сражался на арене с Альриком<br> * * * *if(other.aivar[AIV_ArenaFight] == AF_RUNNING)<br> * * * *{<br> * * * * * *// запись следующей фазы сражения на арене Альрику<br> * * * * * *other.aivar[AIV_ArenaFight] = AF_AFTER;<br> * * * *};<br> * *};<br> * *// удаление продаваемых предметов у торговцев<br> * *B_GiveTradeInv(self);<br> * *// удаление рун у НПС<br> * *B_ClearRuneInv(self);<br> * *// если (агрессор ГГ или агрессор член партии ГГ) и начисления экспы ГГ за победу над НПС не было<br> * *if(Npc_IsPlayer(other) ¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE)) &amp;&amp; (self.aivar[AIV_VictoryXPGiven] == FALSE)<br> * *{<br> * * * *// начисление ГГ экспы (уровень НПС * 10)<br> * * * *B_GivePlayerXP(self.level * XP_PER_VICTORY);<br> * * * *// установить НПС флаг начисления экспы<br> * * * *self.aivar[AIV_VictoryXPGiven] = TRUE;<br> * *};<br> * *// убрать оружие экипированное НПС<br> * *AI_UnequipWeapons(self);<br> * *// если НПС &quot;Дар&quot; и агрессор &quot;Сайфер&quot;<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Dar)) &amp;&amp; (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Cipher))<br> * *{<br> * * * *// установка флага для квеста с пакетом болотника<br> * * * *Dar_LostAgainstCipher = TRUE;<br> * *};<br>};<br> * *<br>// Цикл состояния<br>func int ZS_Unconscious_Loop()<br>{<br> * *// если время цикла &lt; времени нахождения в бессознательном состоянии<br> * *if(Npc_GetStateTime(self) &lt; HAI_TIME_UNCONSCIOUS)<br> * *{<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *else // иначе<br> * *{<br> * * * *return LOOP_END;<br> * *};<br>};<br><br>// Завершение состояния<br>func void ZS_Unconscious_End()<br>{ * <br> * *// сброс флага, что тело обыскивалось<br> * *self.aivar[AIV_RANSACKED] = FALSE;<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если НПС ГГ<br> * *if(Npc_IsPlayer(self))<br> * *{<br> * * * *return;<br> * *};<br> * *// если НПС &quot;Равен&quot;<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Raven))<br> * *{<br> * * * *// установка флага, что НПС всегда использует магию<br> * * * *self.aivar[AIV_MagicUser] = MAGIC_ALWAYS;<br> * * * *// Равен атакует ГГ<br> * * * *B_Attack(self,hero,AR_GuildEnemy,0);<br> * * * *return;<br> * *};<br> * *// если НПС видит агрессора по прямой и расстояние между НПС и агрессором &lt; дистанции действия восприятия<br> * *if(Npc_CanSeeNpcFreeLOS(self,other)) &amp;&amp; (Npc_GetDistToNpc(self,other) &lt; PERC_DIST_INTERMEDIAT)<br> * *{<br> * * * *// НПС поворачивается к агрессору<br> * * * *B_TurnToNpc (self,other);<br> * * * *// если НПС имел дело с &quot;крутым парнем&quot; и НПС не враг агрессору и НПС не друг ГГ<br> * * * *if(C_NpcIsToughGuy(self)) &amp;&amp; (Npc_GetPermAttitude(self,other) != ATT_HOSTILE) &amp;&amp; (self.npctype != NPCTYPE_FRIEND)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза &quot;В следующий раз мы это увидим...&quot;)<br> * * * * * *B_Say(self,other,&quot;$NEXTTIMEYOUREINFORIT&quot ;);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза &quot;О, мой череп...&quot;)<br> * * * * * *B_Say(self,other,&quot;$OHMYHEAD&quot;);<br> * * * *};<br> * *};<br> * *// разрешить НПС воспринимать все объекты в зоне действия восприятия<br> * *Npc_PerceiveAll(self);<br> * *// если НПС находит оружие ближнего или дальнего радиуса поражения<br> * *if(Wld_DetectItem(self,ITEM_KAT_NF)) ¦¦ (Wld_DetectItem(self,ITEM_KAT_FF))<br> * *{<br> * * * *// если ссылка на предмет item существует<br> * * * *if(Hlp_IsValidItem(item))<br> * * * *{<br> * * * * * *// если расстояние от НПС до предмета &lt; 5 метров<br> * * * * * *if(Npc_GetDistToItem(self,item) &lt;= 500)<br> * * * * * *{<br> * * * * * * * *// НПС берет предмет<br> * * * * * * * *AI_TakeItem(self,item);<br> * * * * * *};<br> * * * *};<br> * *};<br> * *// экипировка лучшим оружием<br> * *AI_EquipBestMeleeWeapon(self);<br> * *AI_EquipBestRangedWeapon(self);<br> * *// переход НПС в состояние самолечения<br> * *AI_StartState(self,ZS_HealSelf,0,&quot;&quot;);<b r> * *return;<br>};<br><br>

26.02.2005 10:57

Re: Уроки скриптологии
 
// *****************************************<br>// Обработчик состояния смерти НПС<br>// Примечание: НПС в это состояние переводит также и ядро системы, когда НПС добивают!<br>// -----------------------------------------<br>// self - мертвый НПС, other - убийца<br>// *****************************************<br><br>// Инициализация состояния смерти<br>func void ZS_Dead()<br>{ * <br> * *// сброс флага, что тело обыскивалось<br> * *self.aivar[AIV_RANSACKED] = FALSE;<br> * *// сброс флага, что НПС член партии<br> * *self.aivar[AIV_PARTYMEMBER] = FALSE;<br> * *// НПС перестает смотреть на кого-либо<br> * *B_StopLookAt(self);<br> * *// НПС прекращает на что-либо указывать<br> * *AI_StopPointAt(self);<br> * *// если (убийца ГГ или убийца член партии ГГ) и начисления экспы ГГ за убийство НПС не было<br> * *if(Npc_IsPlayer(other) ¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE)) &amp;&amp; (self.aivar[AIV_VictoryXPGiven] == FALSE)<br> * *{<br> * * * *// начисление ГГ экспы (уровень НПС * 10)<br> * * * *B_GivePlayerXP (self.level * XP_PER_VICTORY);<br> * * * *// установить НПС флаг начисления экспы<br> * * * *self.aivar[AIV_VictoryXPGiven] = TRUE;<br> * *};<br> * *// если убит &quot;Расчленитель&quot; в каньоне<br> * *if(C_IAmCanyonRazor(self) == TRUE)<br> * *{<br> * * * *// счетчик убитых расчленителей ++<br> * * * *CanyonRazorBodyCount = CanyonRazorBodyCount + 1;<br> * * * *// если квест Грега об очистке каньона в стадии выполнения<br> * * * *if(MIS_Addon_Greg_ClearCanyon == LOG_RUNNING)<br> * * * *{<br> * * * * * *// выдача на экран информации об убитых расчленителях<br> * * * * * *B_CountCanyonRazor();<br> * * * *};<br> * *};<br> * *// если убита &quot;Болотная вонючка&quot;<br> * *if(self.aivar[AIV_MM_REAL_ID] == ID_SWAMPDRONE)<br> * *{<br> * * * *// если расстояние между НПС и убийцей &lt; 3 метров<br> * * * *if(Npc_GetDistToNpc(self,other) &lt; 300)<br> * * * *{<br> * * * * * *// жизнь убийцы уменьшается на 50 пунктов<br> * * * * * *other.attribute[ATR_HITPOINTS] -= 50;<br> * * * *};<br> * *};<br> * *// если Диего убит в Рудниковой долине<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))<br> * *{<br> * * * *// установить флаг &quot;воскрешения&quot; Диего в Хоринисе<br> * * * *Diego_IsDead = TRUE;<br> * *};<br> * *// если убийца ГГ<br> * *if(Npc_IsPlayer(other))<br> * *{<br> * * * *// установить флаг, что НПС убит ГГ<br> * * * *self.aivar[AIV_KilledByPlayer] = TRUE;<br> * * * *// если этого НПС не разрешалось убивать<br> * * * *if(C_DropUnconscious())<br> * * * *{<br> * * * * * *// счетчик невинно убитых ++<br> * * * * * *MadKillerCount = (MadKillerCount + 1); <br> * * * *}; * * *<br> * * * *// если убит &quot;Полевой жук&quot; и квест Фестера в стадии выполнения<br> * * * *if(self.guild == GIL_GIANT_BUG) &amp;&amp; (MIS_Fester_KillBugs == LOG_RUNNING)<br> * * * *{<br> * * * * * *// увеличить счетчик убитых Полевых жуков<br> * * * * * *Festers_Giant_Bug_Killed = Festers_Giant_Bug_Killed + 1;<br> * * * *};<br> * * * *// если убита &quot;Болотная крыса&quot; и квест охоты с Аллигатором Джеком в стадии выполнения<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Swamprat)) &amp;&amp; (MIS_KrokoJagd == LOG_Running)<br> * * * *{<br> * * * * * *// увеличить счетчик убитых Болотных крыс<br> * * * * * *AlligatorJack_KrokosKilled = AlligatorJack_KrokosKilled + 1;<br> * * * *};<br> * * * *// если убит &quot;Рамон&quot;<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Ramon))<br> * * * *{<br> * * * * * *// установка флага, что ГГ может разговаривать с бандитами<br> * * * * * *Player_HasTalkedToBanditCamp = TRUE;<br> * * * *};<br> * * * *// если убит &quot;Франко&quot;<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Franco))<br> * * * *{<br> * * * * * *// если квест &quot;Охота на болотожоров с Логаном&quot; в стадии выполнения<br> * * * * * *if(MIS_HlpLogan == LOG_RUNNING)<br> * * * * * *{<br> * * * * * * * *// квест завершается<br> * * * * * * * *MIS_HlpLogan = LOG_OBSOLETE;<br> * * * * * *}; <br> * * * * * *// если квест &quot;Найти Эдгора с каменной плиткой&quot; в стадии выполнения<br> * * * * * *if(MIS_HlpEdgor == LOG_RUNNING)<br> * * * * * *{<br> * * * * * * * *// квест завершается<br> * * * * * * * *MIS_HlpEdgor = LOG_OBSOLETE;<br> * * * * * *};<br> * * * *};<br> * * * *// если убит &quot;Фортуно&quot;<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Fortuno))<br> * * * *{<br> * * * * * *// квест по &quot;Поиску зеленого послушника&quot; завершается<br> * * * * * *Log_SetTopicStatus(Topic_Addon_Fortuno,LOG_OBSOLE TE);<br> * * * *};<br> * *};<br> * *// если убит &quot;Ползун&quot; в пещере (где должен появиться Блудвин)<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Goldminecrawler))<br> * *{<br> * * * *// если убито более 8 ползунов и Блудвина нет <br> * * * *if(Minecrawler_Killed &gt;= 9) &amp;&amp; (Bloodwyn_Spawn == FALSE)<br> * * * *{ * <br> * * * * * *// Блудвин появляется в точке ADW_MINE_TO_MC_03<br> * * * * * *AI_Teleport(Bloodwyn,&quot;ADW_MINE_TO_MC_03&quot ;);<br> * * * * * *// установить Блудвину распорядок дня<br> * * * * * *B_StartOtherRoutine(Bloodwyn,&quot;MINE&quot;);<b r> * * * * * *// начислить ГГ 500 экспы<br> * * * * * *B_GivePlayerXP(XP_Addon_Bloodywyn);<br> * * * * * *// установить флаг появления Блудвина<br> * * * * * *Bloodwyn_Spawn = TRUE;<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// счетчик убитых ползунов ++<br> * * * * * *Minecrawler_Killed = (Minecrawler_Killed + 1);<br> * * * *};<br> * *};<br> * *// удаление продаваемых предметов у торговцев<br> * *B_GiveTradeInv(self);<br> * *// создать в инвентаре монстров добываемые предметы (в зависимости от способностей ГГ)<br> * *B_GiveDeathInv(self);<br> * *// удаление рун у НПС<br> * *B_ClearRuneInv(self);<br> * *// оставить счетчики криминала ГГ по локациям в старом состоянии<br> * *B_DeletePetzCrime(self);<br> * *// сброс флага криминала у НПС<br> * *self.aivar[AIV_NpcSawPlayerCommit] = CRIME_NONE;<br> * *// убрать оружие<br> * *AI_UnequipWeapons(self);<br> * *// сброс флага показа видео<br> * *self.aivar[AIV_TAPOSITION] = FALSE;<br>};<br><br>// Цикл смерти (выхода из него нет)<br>func int ZS_Dead_loop()<br>{<br> * *// если показа видео не было<br> * *if(self.aivar[AIV_TAPOSITION] == FALSE)<br> * *{<br> * * * *// показать видео соответствующее смерти НПС<br> * * * *B_DragonKillCounter(self);<br> * * * *// установить флаг показа видео<br> * * * *self.aivar[AIV_TAPOSITION] = TRUE;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br><br><br>Добавление от 26 февраля 2005, 10:57 <hr class="hr_agfc">9. Функции состояний монстров.<br><br>Все обработчики основных состояний монстров находятся в директории ..\AI\Monster\ZS_Monster\<br>Имена файлов соответствуют именам обработчиков.<br><br>// **************************************<br>// Обработчик состояния атаки<br>// --------------------------------------<br>// self - НПС агрессор, other - НПС цель<br>// **************************************<br><br>// Функция обработки вспомогательного восприятия PERC_ASSESSSURPRISE<br>// Вызывается ядром системы когда ГГ превращается в человека из животного<br>func void B_MM_AssessSurprise()<br>{<br> * *// целью агрессора становится ГГ<br> * *Npc_SetTarget(self,other);<br>};<br><br>// Мнициализация состояния атаки<br>func void ZS_MM_Attack()<br>{<br> * *// установка времени реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1); <br> * *// разрешить восприятие мертвого тела<br> * *Npc_PercEnable(self,PERC_ASSESSBODY,B_MM_AssessBo dy);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage);<br> * *// разрешить восприятие предупреждения<br> * *Npc_PercEnable(self,PERC_ASSESSWARN,B_MM_AssessWa rn);<br> * *// разрешить вспомогательное восприятие превращения<br> * *Npc_PercEnable(self,PERC_ASSESSSURPRISE,B_MM_Asse ssSurprise);<br> * *// инициализировать переменную other (последняя цель)<br> * *B_ValidateOther();<br> * *// если агрессор овца<br> * *if(self.guild == GIL_SHEEP)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// очистка восприятий<br> * * * *B_ClearPerceptions(self);<br> * * * *// установка цели<br> * * * *Npc_SetTarget(self,other);<br> * * * *// НПС убегает от цели<br> * * * *AI_StartState(self,ZS_MM_Flee,0,&quot;&quot;);<br > * * * *return; <br> * *};<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// включается режим передвижения - бег<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// агрессору посылается предупреждение от цели<br> * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);<br> * *// сброс флага окончания преследования<br> * *self.aivar[AIV_PursuitEnd] = FALSE;<br> * *// сброс счетчика времени нахождения в состоянии<br> * *self.aivar[AIV_StateTime] = 0;<br> * *// сброс флага первого удара<br> * *self.aivar[AIV_HitByOtherNpc] = 0;<br> * *// сброс выбранного заклинания<br> * *self.aivar[AIV_SelectSpell] = 0;<br> * *// сброс счетчика регенерации<br> * *self.aivar[AIV_TAPOSITION] = 0;<br>};<br><br>// Цикл состояния атаки<br>func int ZS_MM_Attack_Loop()<br>{<br> * *// повторно инициализировать other целью<br> * *Npc_GetTarget(self);<br> * *// если НПС дракон<br> * *if(self.guild == GIL_DRAGON)<br> * *{<br> * * * *// счетчик регенерации ++<br> * * * *self.aivar[AIV_TAPOSITION] += 1;<br> * * * *// если жизнь НПС &lt; максимальной и счетчик регенерации &gt;= 2 cек<br> * * * *if (self.attribute[ATR_HITPOINTS] &lt; self.attribute[ATR_HITPOINTS_MAX]) &amp;&amp; (self.aivar[AIV_TAPOSITION] &gt;= 2)<br> * * * *{<br> * * * * * *// жизнь ++<br> * * * * * *self.attribute[ATR_HITPOINTS] += 1;<br> * * * * * *// сброс счетчика<br> * * * * * *self.aivar[AIV_TAPOSITION] = 0;<br> * * * *};<br> * *};<br> * *// если Равен убит и агрессор Каменный сторож<br> * *if(RavenIsDead == TRUE) &amp;&amp; (self.guild == GIL_STONEGUARDIAN)<br> * *{ * <br> * * * *// агрессор умирает<br> * * * *B_KillNpc(self);<br> * *};<br> * *// если текущий уровень - Миненталь<br> * *if(CurrentLevel == OLDWORLD_ZEN)<br> * *{<br> * * * *// если расстояние от агрессора до точки OC_RAMP_07 &lt;= 5 метров<br> * * * *if(Npc_GetDistToWP(self,&quot;OC_RAMP_07&quot;) &lt;= 500) <br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *// проигрывается анимация T_WARN<br> * * * * * *AI_PlayAni(self,&quot;T_WARN&quot;);<br> * * * * * *// установка флага окончания преследования<br> * * * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *}; * * *<br> * *// если расстояние между НПС и целью &gt; дистанции сражения<br> * *if(Npc_GetDistToNpc(self,other) &gt; FIGHT_DIST_CANCEL)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * * * *// установка флага окончания преследования<br> * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * *return LOOP_END;<br> * *};<br> * *// если время преследования превышает допустимое и НПС преследует цель<br> * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_MM_FollowTime]) &amp;&amp; (self.aivar[AIV_PursuitEnd] == FALSE)<br> * *{<br> * * * *Npc_ClearAIQueue(self);<br> * * * *AI_StandUp(self);<br> * * * *// НПС закончил преследование<br> * * * *self.aivar[AIV_PursuitEnd] = TRUE;<br> * * * *// получить дистанцию до цели<br> * * * *self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);<br> * * * *// обновить время состояния НПС<br> * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);<br> * * * *// проиграть анимацию T_WARN<br> * * * *AI_PlayAni(self,&quot;T_WARN&quot;);<br> * *};<br> * *// если НПС завершил преследование цели<br> * *if(self.aivar[AIV_PursuitEnd] == TRUE)<br> * *{<br> * * * *// если расстояние между НПС и целью &gt; диапазона чувствительности НПС<br> * * * *if(Npc_GetDistToNpc(self,other) &gt; self.senses_range)<br> * * * *{<br> * * * * * *return LOOP_END;<br> * * * *};<br> * * * *// если текущее время &gt; предыдущего времени (прошла как минимум секунда)<br> * * * *if (Npc_GetStateTime (self) &gt; self.aivar[AIV_StateTime])<br> * * * *{<br> * * * * * *// если расстояние между НПС и целью меньше дистанции, когда НПС прекратил преследование<br> * * * * * *if(Npc_GetDistToNpc(self,other) &lt; self.aivar[AIV_Dist])<br> * * * * * *// или (цель не бежит и не прыгает)<br> * * * * * *¦¦ ((!C_BodyStateContains(other,BS_RUN)) &amp;&amp; (!C_BodyStateContains(other,BS_JUMP)))<br> * * * * * *{<br> * * * * * * * *// сброс флага окончания преследования<br> * * * * * * * *self.aivar[AIV_PursuitEnd] = FALSE;<br> * * * * * * * *// сброс времени нахождения НПС в этом состоянии<br> * * * * * * * *Npc_SetStateTime(self,0);<br> * * * * * * * *// сброс счетчика времени нахождения в состоянии<br> * * * * * * * *self.aivar[AIV_StateTime] = 0;<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС поворачивается к цели<br> * * * * * * * *AI_TurnToNpc(self,other);<br> * * * * * * * *// получить дистанцию до цели<br> * * * * * * * *self.aivar[AIV_Dist] = Npc_GetDistToNpc(self,other);<br> * * * * * * * *// обновить время состояния НПС<br> * * * * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);<br> * * * * * *};<br> * * * *};<br> * * * *return LOOP_CONTINUE;<br> * *};<br> * *// если (цель плывет или ныряет) и НПС не преследует цель в воде<br> * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) &amp;&amp; (self.aivar[AIV_MM_FollowInWater] == FALSE)<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если НПС выжидает перед атакой<br> * *if(self.aivar[AIV_WaitBeforeAttack] == 1)<br> * *{<br> * * * *// ожидание 0.8 сек<br> * * * *AI_Wait(self,0.8 );<br> * * * *// сброс флага задержки<br> * * * *self.aivar[AIV_WaitBeforeAttack] = 0;<br> * *};<br> * *// если уровень НПС == 0 (вызванный монстр)<br> * *if(self.level == 0)<br> * *{<br> * * * *// если текущее время &gt; предыдущего времени (прошла как минимум секунда)<br> * * * *if(Npc_GetStateTime(self) &gt; self.aivar[AIV_StateTime])<br> * * * *{<br> * * * * * *// время от начала вызова монстра ++<br> * * * * * *self.aivar[AIV_SummonTime] = (self.aivar[AIV_SummonTime] + 1);<br> * * * * * *// запомнить текущее время<br> * * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);<br> * * * *};<br> * * * *// если время от начала вызова монстра &gt;= времени жизни вызванных монстров<br> * * * *if(self.aivar[AIV_SummonTime] &gt;= MONSTER_SUMMON_TIME)<br> * * * *{<br> * * * * * *// вызванный монстр умирает<br> * * * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-self.attribute[ATR_HITPOINTS_MAX]);<br> * * * *};<br> * *};<br> * *// если цель не бежит и не прыгает и время в состоянии &gt; 0<br> * *if((!C_BodyStateContains(other,BS_RUN)) &amp;&amp; (!C_BodyStateContains(other,BS_JUMP))) &amp;&amp; (Npc_GetStateTime(self) &gt; 0)<br> * *{<br> * * * *// сброс времени текущего состояния<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// сброс счетчика времени нахождения в состоянии<br> * * * *self.aivar[AIV_StateTime] = 0;<br> * *};<br> * *// если дистанция атаки &gt; 0<br> * *if(self.aivar[AIV_MaxDistToWp] &gt; 0)<br> * *{<br> * * * *// если расстояние между НПС и вайпоинтом НПС &gt; дистанции атаки и расстояние между целью и вайпоинтом НПС &gt; дистанции акаки<br> * * * *if(Npc_GetDistToWP(self,self.wp) &gt; self.aivar[AIV_MaxDistToWp]) &amp;&amp; (Npc_GetDistToWP(other,self.wp) &gt; self.aivar[AIV_MaxDistToWp])<br> * * * *{<br> * * * * * *// установить НПС тактику защитников крепостных стен<br> * * * * * *self.fight_tactic = FAI_NAILED;<br> * * * *}<br> * * * *else // иначе (если НПС или цель близка к вайпоинту НПС)<br> * * * *{<br> * * * * * *// установить НПС родную тактику сражения<br> * * * * * *self.fight_tactic = self.aivar[AIV_OriginalFightTactic];<br> * * * *};<br> * *};<br> * *// если агрессор маг или<br> * *if(C_NpcIsMonsterMage(self))<br> * *¦¦ (self.guild == GIL_SKELETON) * * * * * * // скелет<br> * *¦¦ (self.guild == GIL_SUMMONED_SKELETON) * *// или вызванный скелет<br> * *¦¦ (self.guild &gt; GIL_SEPERATOR_ORC) * * * * // или орк<br> * *{<br> * * * *// создать боеприпасы<br> * * * *B_CreateAmmo(self);<br> * * * *// установить полную ману<br> * * * *Npc_ChangeAttribute(self,ATR_MANA,ATR_MANA_MAX);< br> * * * *// выбрать оружие, сответствующее цели<br> * * * *B_SelectWeapon(self,other);<br> * *};<br> * *// если цель существует и не обездвижена<br> * *if(Hlp_IsValidNpc(other)) &amp;&amp; (!C_NpcIsDown(other))<br> * *{<br> * * * *// если цель не в состоянии разговора<br> * * * *if(other.aivar[AIV_INVINCIBLE] == FALSE)<br> * * * *{<br> * * * * * *// НПС атакует цель (Примечание: функция AI_Attack работает только когда очередь AI состояний НПС пуста)<br> * * * * * *AI_Attack(self);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * *};<br> * * * *// запись НПС id последней цели<br> * * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *else // иначе (если цель отсутствует или обездвижена)<br> * *{<br> * * * *// если приоритет агрессора на пожирание падали и агрессор может есть цель<br> * * * *if(self.aivar[AIV_MM_PRIORITY] == PRIO_EAT) &amp;&amp; (C_WantToEat(self,other))<br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * * * *// разрешение воспринимать все объекты в зоне действия восприятий<br> * * * *Npc_PerceiveAll(self);<br> * * * *// поиск новой цели<br> * * * *Npc_GetNextTarget(self);<br> * * * *// если цель найдена и она не обездвижена<br> * * * *if(Hlp_IsValidNpc(other)) &amp;&amp; (!C_NpcIsDown(other))<br> * * * *// и (расстояние между НПС и целью &lt; дистанции действия восприятий или цель ГГ)<br> * * * *&amp;&amp; ((Npc_GetDistToNpc(self,other) &lt; PERC_DIST_INTERMEDIAT) ¦¦ (Npc_IsPlayer(other)))<br> * * * *// и цель не в состоянии разговора<br> * * * *&amp;&amp; (other.aivar[AIV_INVINCIBLE] == FALSE)<br> * * * *{<br> * * * * * *// запись НПС id последней цели<br> * * * * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);<br> * * * * * *return LOOP_CONTINUE;<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// очистка очереди AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br>};<br><br>// Завершение состояния атаки<br>func void ZS_MM_Attack_End()<br>{<br> * *// установить other на последнюю цель<br> * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);<br> * *// если агрессор маг или<br> * *if(C_NpcIsMonsterMage(self))<br> * *¦¦ (self.guild == GIL_SKELETON) * * * * * * // скелет<br> * *¦¦ (self.guild == GIL_SUMMONED_SKELETON) * *// или вызванный скелет<br> * *¦¦ (self.guild &gt; GIL_SEPERATOR_ORC) * * * * // или орк<br> * *{<br> * * * *// НПС убирает оружие<br> * * * *AI_RemoveWeapon(self);<br> * *};<br> * *// если цель убита и агрессор может пожирать цель<br> * *if(Npc_IsDead(other)) &amp;&amp; (C_WantToEat(self,other)) * * * * * * * * *<br> * *{<br> * * * *// очистка очереди AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// переход в состояние пожирания добычи<br> * * * *AI_StartState(self,ZS_MM_EatBody,0,&quot;&quot;); <br> * * * *return;<br> * *};<br>};<br><br>

28.02.2005 12:19

Re: Уроки скриптологии
 
// *************************************************< br>// Обработчик состояния когда монстр поедает добычу<br>// -------------------------------------------------<br>// self - НПС монстр, other - добыча (труп)<br>// *************************************************< br><br>// Инициализация состояния<br>func void ZS_MM_EatBody()<br>{<br> * *// установка времени реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage);<br> * *// разрешить восприятие повреждения, нанесенного другому НПС<br> * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_MM_ AssessOthersDamage);<br> * *// разрешить восприятие смерти<br> * *Npc_PercEnable(self,PERC_ASSESSMURDER,B_MM_Assess OthersDamage); <br> * *// монстр идет к телу<br> * *AI_GotoNpc(self,other);<br> * *// монстр поворачивается к добыче<br> * *AI_TurnToNpc(self,other);<br> * *// проигрывается анимация поедания<br> * *AI_PlayAni(self,&quot;T_STAND_2_EAT&quot;);<br> * *// установить приоритет на поедание<br> * *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT;<br> * *// ссылка на последнее съеденное тело<br> * *self.aivar[AIV_LASTBODY] = Hlp_GetInstanceID(other);<br> * *// сброс флага восприятия врага<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Цикл состояния<br>func int ZS_MM_EatBody_loop()<br>{<br> * *// если восприятие врага выключено<br> * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// разрешить восприятие врага<br> * * * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_MM_AssessE nemy);<br> * * * *// установить флаг разрешения восприятия<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// если добыча съедена<br> * *if(!Hlp_IsValidNpc(other))<br> * *{<br> * * * *// очистка очереди AI состояний монстра<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_EatBody_end()<br>{<br> * *// прекратить анимацию поедания<br> * *AI_PlayAni(self,&quot;T_EAT_2_STAND&quot;);<br>}; <br><br>... еще один файл<br><br>//************************************************** **<br>// Обработчик состояния когда монстр убегает от врага<br>//----------------------------------------------------<br>// self - монстр, other - враг<br>//************************************************** **<br><br>// Инициализация состояния<br>func void ZS_MM_Flee()<br>{<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *<br> * *// инициализировать переменную other врагом<br> * *B_ValidateOther();<br> * *// монстр встает<br> * *AI_StandUp(self);<br> * *// монстр переходит в режим бега<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// монстру посылается предупреждение от врага<br> * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);<br> * *// рассинхронизация [Примечание: мне непонятно зачем?]<br> * *B_MM_DeSynchronize();<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Flee_Loop()<br>{<br> * *// обновить ссылку на врага<br> * *Npc_GetTarget(self);<br> * *// если расстояние между монстром и врагом &lt; 20 метров<br> * *if(Npc_GetDistToNpc(self,other) &lt; 2000)<br> * *{ * <br> * * * *// если прошла одна секунда<br> * * * *if(Npc_GetStateTime(self) &gt; 0)<br> * * * *{<br> * * * * * *// враг посылает монстру предупреждение<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);<br> * * * * * *// сброс времени состояния<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * * * *// монстр убегает от врага<br> * * * *AI_Flee(self);<br> * * * *return LOOP_CONTINUE;<br> * *}<br> * *else<br> * *{ * <br> * * * *// очистка очереди AI состояний монстра<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END; * * * * * * * * * * * * * * * * * * * * * * * * * *<br> * *};<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Flee_End()<br>{<br>};<br><br>... и еще файл<br>// ********************************************<br>// Обработчик состояния охоты монстра<br>// --------------------------------------------<br>// self - монстр, other - жертва<br>// ********************************************<br><b r>// Инициализация состояния охоты<br>func void ZS_MM_Hunt()<br>{<br> * *// разрешить базовые восприятия монстров<br> * *Perception_Set_Monster_Rtn();<br> * *// монстр встает<br> * *AI_StandUp(self);<br> * *// поворачивается к жертве<br> * *AI_TurnToNpc(self,other);<br> * *// переходит на шаг<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// идет к жертве<br> * *AI_GotoNpc(self,other);<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Hunt_Loop()<br>{<br> * *return LOOP_END;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Hunt_End()<br>{<br>};<br><br>... и еще файл<br>// ************************************************** <br>// Обработчик состояния когда монстр угрожает врагу<br>// --------------------------------------------------<br>// self - монстр, other - враг<br>// ************************************************** <br><br>// Инициализация состояния угрозы<br>func void ZS_MM_ThreatenEnemy()<br>{<br> * *// установка времени реакции на восприятия 2 сек<br> * *Npc_SetPercTime(self,2);<br> * *// разрешить восприятие мертвого тела<br> * *Npc_PercEnable(self,PERC_ASSESSBODY,B_MM_AssessBo dy);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage); * * * <br> * *// разрешить восприятие повреждения, нанесенного другому НПС<br> * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_MM_ AssessOthersDamage);<br> * *// разрешить восприятие смерти<br> * *Npc_PercEnable(self,PERC_ASSESSMURDER,B_MM_Assess OthersDamage); <br> * *// монстр встает<br> * *AI_StandUp(self); <br> * *// враг посылает монстру предупреждение<br> * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);<br>};<br><br>// Цикл состояния угрозы<br>func int ZS_MM_ThreatenEnemy_loop()<br>{<br> * *// если расстояние между монстром и врагом &gt; дистанции действия активных восприятий<br> * *if(Npc_GetDistToNpc(self,other) &gt; PERC_DIST_MONSTER_ACTIVE_MAX)<br> * *{<br> * * * *// очистка очереди AI состояний монстра<br> * * * *Npc_ClearAIQueue(self);<br> * * * *return LOOP_END;<br> * *};<br> * *// если расстояние между монстром и врагом &lt;= дистанции начала атаки<br> * *if(Npc_GetDistToNpc(self,other) &lt;= FIGHT_DIST_MONSTER_ATTACKRANGE)<br> * *{<br> * * * *// очистка очереди AI состояний монстра<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// установка цели для монстра<br> * * * *Npc_SetTarget(self, other);<br> * * * *// переход в состояние атаки<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return LOOP_END;<br> * *};<br> * *// если время в состоянии &gt;= времени угрозы<br> * *if(Npc_GetStateTime(self) &gt;= MONSTER_THREATEN_TIME)<br> * *{ * <br> * * * *Npc_ClearAIQueue(self);<br> * * * *Npc_SetTarget(self,other);<br> * * * *// переход в состояние атаки<br> * * * *AI_StartState(self,ZS_MM_Attack,0,&quot;&quot;);< br> * * * *return LOOP_END;<br> * *};<br> * *// монстр поворачивается к врагу<br> * *AI_TurnToNpc(self,other);<br> * *// играется анимация угрозы<br> * *AI_PlayAni(self,&quot;T_WARN&quot;);<br> * *return LOOP_CONTINUE;<br>}; *<br><br>// Завершение состояния угрозы<br>func void ZS_MM_ThreatenEnemy_end()<br>{ <br>};<br><br><br><br>Добавление от 02/28/05, в 11:39:03 <hr class="hr_agfc"><br>Системная функция AI_StartState может управлять последовательностью выполнения фаз состояний, за это отвечает параметр stateBehaviour, если он = 0, то сразу выполняется переход в указанное состояние, если он = 1, то переход в новое состояние выполнится только после полного завершения текущего состояния.<br>

28.02.2005 13:56

Re: Уроки скриптологии
 
2Mitrich:<br>
Цитата:

Если это все еще актуально
<br>Пока еще актуально.<br><br>В добавлении к предыдущему посту №198 приведено правильное описание параметра stateBehaviour функции AI_StartState. Предыдущие трактовки этого параметра ошибочны. Извиняюсь, что сразу в этом не разобрался.<br><br>10. Функции распорядка дня людей.<br><br>Все функции распорядка дня людей регистрируются в файле ..\AI\Human\TA.d<br>Шаблон регистрации любой функции:<br><br>func void TA_name(var int start_h,var int start_m,var int stop_h,var int stop_m,var string waypoint)<br>{<br> * * *// регистрация обработчика состояния ZS_name с временами начала и конца работы в точке waypoint<br> * * *TA_Min(self,start_h,start_m,stop_h,stop_m,ZS_name ,waypoint);<br>};<br><br>где:<br> * * *name - имя выполняемой функции,<br> * * *start_h - час начала выполнения,<br> * * *start_m - минута начала выполнения,<br> * * *stop_h - час окончания выполнения,<br> * * *stop_m - минута окончания выполнения,<br> * * *waypoint - имя WP точки выполнения функции<br><br><br>Сами обработчики состояний функций распорядка дня людей находятся в директории ..\AI\Human\TA_Human\<br>Понятно, что вызов всех обработчиков состояний производится ядром системы в заданном интервале времени.<br>Обработчики состояний функций распорядка дня я рассматривать не буду, но если кому-то интересны некоторые обработчики, можно сделать заказ на их рассмотрение.<br>

01.03.2005 09:23

Re: Уроки скриптологии
 
11. Функции распорядка дня монстров.<br><br>Как таковой (по сравнению с людьми) распорядок дня у монстров отсутствует, есть функция планировщика суточного цикла монстров ZS_MM_AllScheduler, которая вызывает обработчики конкретных состояний.<br>Все файлы обработчиков суточных состояний монстров расположены в директории ..\AI\Monster\RTN_Monster<br><br>// **************************************<br>// Планировщик суточного цикла монстров<br>// **************************************<br><br>func void ZS_MM_AllScheduler()<br>{<br> * * *// установить приоритет на питание вместо атаки<br> * * *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT;<br> * * *// если НПС Каменный страж и Равен убит<br> * * *if(self.guild == GIL_STONEGUARDIAN) &amp;&amp; (RavenIsDead == TRUE)<br> * * *{ * * *<br> * * * * * *// убить Каменного стража<br> * * * * * *B_KillNpc(self);<br> * * *};<br> * * *// если наступило время сна монстра или время контролируется программой поведения монстра<br> * * *if(Wld_IsTime(self.aivar[AIV_MM_SleepStart],00,self.aivar[AIV_MM_SleepEnd]<br>,00) ¦¦ (self.aivar[AIV_MM_SleepStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти в состояние сна (обратить внимание на параметр stateBehaviour = 1, переход в состояние сна возможен только после полного завершения текущего состояния)<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Sleep,1,&quot;&quot; );<br> * * *}<br> * * *// иначе, если наступило время отдыха монстра или время контролируется программой поведения монстра<br> * * *else if(Wld_IsTime(self.aivar[AIV_MM_RestStart],00,self.aivar[AIV_MM_RestEnd],00) ¦¦ (self.aivar[AIV_MM_RestStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти в состояние отдыха<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Rest,1,&quot;&quot;) ;<br> * * *}<br> * * *// иначе, если наступило время брожения монстра или время контролируется программой поведения монстра<br> * * *else if(Wld_IsTime(self.aivar[AIV_MM_RoamStart],00,self.aivar[AIV_MM_RoamEnd],00) ¦¦ (self.aivar[AIV_MM_RoamStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти в состояние брожения<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Roam,1,&quot;&quot;) ;<br> * * *}<br> * * *// иначе, если наступило время кормежки монстра или время контролируется программой поведения монстра<br> * * *else if(Wld_IsTime(self.aivar[AIV_MM_EatGroundStart],00,self.aivar[AIV_MM_EatGroundEnd],00) ¦¦ (self.aivar[AIV_MM_EatGroundStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти в состояние кормежки<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_EatGround,1,&quot;&q uot;);<br> * * *}<br> * * *// иначе, если наступило время резвости монстра или время контролируется программой поведения монстра<br> * * *else if(Wld_IsTime(self.aivar[AIV_MM_WuselStart],00,self.aivar[AIV_MM_WuselEnd],00) ¦¦ (self.aivar[AIV_MM_WuselStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти в состояние резвости<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Wusel,1,&quot;&quot; );<br> * * *}<br> * * *// иначе, если наступило время посидеть орку или время контролируется программой поведения монстра<br> * * *else if(Wld_IsTime(self.aivar[AIV_MM_OrcSitStart],00,self.aivar[AIV_MM_OrcSitEnd],00) ¦¦ (self.aivar[AIV_MM_OrcSitStart] == OnlyRoutine))<br> * * *{<br> * * * * * *// перейти орку в сидячее состояние<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_OrcSit,1,&quot;&quot ;);<br> * * *}<br> * * *else // иначе (по умолчанию)<br> * * *{<br> * * * * * *// перейти в состояние отдыха<br> * * * * * *AI_StartState(self,ZS_MM_Rtn_Rest,1,&quot;&quot;) ;<br> * * *};<br>};<br><br>... еще один файл<br><br>// *********************************<br>// Обработчик состояния сна монстра<br>// *********************************<br><br>// Функция обработки локального восприятия тихих звуков во время сна<br>func void B_MM_AssessQuietSound_Sleep()<br>{<br> * * *// если спящий монстр услышал врага<br> * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)<br> * * *{<br> * * * * * *// реакция монстра на врага<br> * * * * * *B_MM_AssessEnemy();<br> * * *};<br>};<br><br>// Инициализация состояния сна<br>func void ZS_MM_Rtn_Sleep()<br>{<br> * * *// разрешить восприятие магии<br> * * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * * *// разрешить восприятие повреждения<br> * * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage); ** * * * * *<br> * * *// разрешить восприятие повреждения, нанесенного другому НПС<br> * * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_MM_ AssessOthersDamage); ** * *<br> * * *// разрешить восприятие смерти<br> * * *Npc_PercEnable(self,PERC_ASSESSMURDER,B_MM_Assess OthersDamage); <br> * * *// разрешить восприятие предупреждения<br> * * *Npc_PercEnable(self,PERC_ASSESSWARN,B_MM_AssessWa rn); <br> * * *// разрешить восприятие тихих звуков (шаги, звон падающего предмета)<br> * * *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND,B_MM_As sessQuietSound_Sleep);<br> * * *// установить режим передвижения шагом<br> * * *AI_SetWalkmode ** * *(self, NPC_WALK);<br> * * *B_MM_DeSynchronize();<br> * * *// если монстр не находится в заданной точке<br> * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * * *{<br> * * * * * *// монстр идет в заданную точку<br> * * * * * *AI_GotoWP(self,self.WP);<br> * * *};<br> * * *// если есть свободная точка с именем &quot;FP_ROAM&quot;<br> * * *if(Wld_IsFPAvailable(self,&quot;FP_ROAM&quot;))<b r> * * *{<br> * * * * * *// монстр идет в эту точку<br> * * * * * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br> * * *};<br> * * *// анимация &quot;T_PERCEPTION&quot;<br> * * *AI_PlayAni(self,&quot;T_PERCEPTION&quot;);<br> * * *// анимация перехода ко сну<br> * * *AI_PlayAniBS(self,&quot;T_STAND_2_SLEEP&quot;,BS_ LIE);<br>};<br><br>// Цикл состояния сна<br>func int ZS_MM_Rtn_Sleep_loop()<br>{<br> * * *// если время сна истекло или время не контролируется программой поведения монстра<br> * * *if((!Wld_IsTime(self.aivar[AIV_MM_SleepStart],00,self.aivar[AIV_MM_SleepEnd],00)) &amp;&amp; (self.aivar[AIV_MM_SleepStart] != OnlyRoutine))<br> * * *{<br> * * * * * *// переход в планировщик суточного цикла<br> * * * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * * * *return LOOP_END;<br> * * *};<br> * * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния сна<br>func void ZS_MM_Rtn_Sleep_end()<br>{<br> * * *// анимация пробуждения<br> * * *AI_PlayAniBS(self,&quot;T_SLEEP_2_STAND&quot;,BS_ STAND);<br>};<br><br>... и еще файл<br><br>// *************************************<br>// Обработчик состояния отдыха монстров<br>// *************************************<br><br>// Инициализация состояния отдыха<br>func void ZS_MM_Rtn_Rest()<br>{<br> * * *// разрешить нормальный набор восприятий<br> * * *Perception_Set_Monster_Rtn();<br> * * *// режим пережвижения шагом<br> * * *AI_SetWalkmode(self,NPC_WALK);<br> * * *B_MM_DeSynchronize();<br> * * *// если монстр не находится в заданной точке<br> * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * * *{<br> * * * * * *// монстр идет в заданную точку<br> * * * * * *AI_GotoWP(self,self.WP);<br> * * *};<br> * * *// сброс флага достижения точки отдыха<br> * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Цикл состояния отдыха<br>func int ZS_MM_Rtn_Rest_Loop()<br>{<br> * * *// если НПС Каменный страж и Равен убит<br> * * *if(self.guild == GIL_STONEGUARDIAN) &amp;&amp; (RavenIsDead == TRUE)<br> * * *{ * * *<br> * * * * * *// убить Каменного стража<br> * * * * * *B_KillNpc(self);<br> * * *};<br> * * *// если время отдыха истекло или время не контролируется программой поведения монстра<br> * * *if((!Wld_IsTime(self.aivar[AIV_MM_RestStart],00,self.aivar[AIV_MM_RestEnd]<br>,00)) &amp;&amp; (self.aivar[AIV_MM_RestStart] != OnlyRoutine))<br> * * *{<br> * * * * * *// переход в планировщик суточного цикла<br> * * * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * * * *return LOOP_END;<br> * * *};<br> * * *// если точка отдыха не достигнута<br> * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * * *{<br> * * *// если есть свободная точка с именем &quot;FP_ROAM&quot;<br> * * * * * *if(Wld_IsFPAvailable(self,&quot;FP_ROAM&quot;))<b r> * * * * * *{<br> * * * * * * * * *// монстр идет в эту точку<br> * * * * * * * * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br> * * * * * *};<br> * * * * * *// если монстр дошел до точки<br> * * * * * *if(Npc_IsOnFP(self,&quot;FP_ROAM&quot;))<br> * * * * * *{<br> * * * * * * * * *// установить флаг достижения точки отдыха<br> * * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * * * * * *};<br> * * *}<br> * * *else // иначе (монстр находится в точке отдыха)<br> * * *{<br> * * * * * *// с вероятностью 0,005 менять анимацию монстра<br> * * * * * *if(Hlp_Random(1000) &lt;= 5)<br> * * * * * *{<br> * * * * * * * * *var int randomMove;<br> * * * * * * * * *randomMove = Hlp_Random(3);<br> * * * * * * * * *if(randomMove == 0) { AI_PlayAni(self,&quot;R_ROAM1&quot;); };<br> * * * * * * * * *if(randomMove == 1) { AI_PlayAni(self,&quot;R_ROAM2&quot;); };<br> * * * * * * * * *if(randomMove == 2) { AI_PlayAni(self,&quot;R_ROAM3&quot;); };<br> * * * * * *};<br> * * *};<br> * * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния отдыха<br>func void ZS_MM_Rtn_Rest_End()<br>{<br>};<br><br>

02.03.2005 09:30

Re: Уроки скриптологии
 
// **************************************<br>// Обработчик состояния брожения монстра<br>// **************************************<br><br>// Инициализация состояния<br>func void ZS_MM_Rtn_Roam()<br>{<br> * *// разрешить нормальный набор восприятий<br> * *Perception_Set_Monster_Rtn();<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *B_MM_DeSynchronize();<br> * *// если монстр не находится в заданной точке<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// монстр идет в заданную точку<br> * * * *AI_GotoWP(self,self.WP);<br> * *}; *<br> * *// сброс флага чередования циклов (стоит или бродит)<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Цикл состояния брожения<br>func int ZS_MM_Rtn_Roam_loop()<br>{<br> * *// если время брожения истекло и время не контролируется программой поведения монстра<br> * *if((!Wld_IsTime(self.aivar[AIV_MM_RoamStart],00,self.aivar[AIV_MM_RoamEnd]<br>,00)) &amp;&amp; (self.aivar[AIV_MM_RoamStart] != OnlyRoutine))<br> * *{<br> * * * *// переход в планировщик суточного цикла<br> * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * *return LOOP_END;<br> * *};<br> * *// фаза передвижения завершена<br> * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *var int wanderTime;<br> * * * *// время стояния<br> * * * *wanderTime = Hlp_Random(5);<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// установить флаг стояния<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// если время стояния закончилось<br> * *if(Npc_GetStateTime(self) &gt; wanderTime)<br> * *{<br> * * * *// если есть свободная точка &quot;FP_ROAM&quot;<br> * * * *if(Wld_IsNextFPAvailable(self,&quot;FP_ROAM&quot; ))<br> * * * *{<br> * * * * * *// монстр идет в эту мочку<br> * * * * * *AI_GotoNextFP(self,&quot;FP_ROAM&quot;);<br> * * * *};<br> * * * *// сброс флага стояния<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * *}<br> * *else // иначе (стояние)<br> * *{<br> * * * *// с вероятностью 0,005 менять анимацию монстра<br> * * * *if(Hlp_Random(1000) &lt;= 5)<br> * * * *{<br> * * * * * *var int randomMove;<br> * * * * * *randomMove = Hlp_Random(3);<br> * * * * * *if(randomMove == 0) { AI_PlayAni(self,&quot;R_ROAM1&quot;); };<br> * * * * * *if(randomMove == 1) { AI_PlayAni(self,&quot;R_ROAM2&quot;); };<br> * * * * * *if(randomMove == 2) { AI_PlayAni(self,&quot;R_ROAM3&quot;); };<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_Roam_end()<br>{<br>};<br><br>... еще файл<br><br>// **************************************<br>// Обработчик состояния кормежки монстра<br>// **************************************<br><br>// Инициализация состояния кормежки<br>func void ZS_MM_Rtn_EatGround()<br>{<br> * *// разрешить нормальный набор восприятий<br> * *Perception_Set_Monster_Rtn();<br> * *// режим пережвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *B_MM_DeSynchronize();<br> * *// если монстр не находится в заданной точке<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// монстр идет в заданную точку<br> * * * *AI_GotoWP(self,self.WP);<br> * *};<br> * *// если есть свободная точка с именем &quot;FP_ROAM&quot;<br> * *if(Wld_IsFPAvailable(self,&quot;FP_ROAM&quot;)) * <br> * *{<br> * * * *// монстр идет в эту точку<br> * * * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br> * *};<br> * *// анимация перехода в состояние кормежки<br> * *AI_PlayAni(self,&quot;T_STAND_2_EAT&quot;);<br> * *// анимация кормежки<br> * *Mdl_ApplyRandomAni(self,&quot;S_EAT&quot;,&quot;R _ROAM1&quot;);<br> * *Mdl_ApplyRandomAni(self,&quot;S_EAT&quot;,&quot;R _ROAM2&quot;);<br> * *Mdl_ApplyRandomAni(self,&quot;S_EAT&quot;,&quot;R _ROAM3&quot;);<br> * *Mdl_ApplyRandomAniFreq(self,&quot;S_EAT&quot;,8.0 );<br>};<br><br>// Цткл состояния кормежки<br>func int ZS_MM_Rtn_EatGround_Loop()<br>{<br> * *// если время кормежки истекло и время не контролируется программой поведения монстра<br> * *if((!Wld_IsTime(self.aivar[AIV_MM_EatGroundStart],00,self.aivar[AIV_MM_EatGroundEnd],00)) &amp;&amp; (self.aivar[AIV_MM_EatGroundStart] != OnlyRoutine))<br> * *{<br> * * * *// переход в планировщик суточного цикла<br> * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * *return LOOP_END;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния кормежки<br>func void ZS_MM_Rtn_EatGround_End()<br>{<br> * *// анимация выхода из состояния кормежки<br> * *AI_PlayAni(self,&quot;T_EAT_2_STAND&quot;);<br>}; <br><br>... еще файл<br><br>// **************************************<br>// Обработчик состояния резвости монстра<br>// **************************************<br><br>// Инициализация состояния резвости<br>func void ZS_MM_Rtn_Wusel()<br>{<br> * *// разрешить нормальный набор восприятий<br> * *Perception_Set_Monster_Rtn();<br> * *// режим пережвижения бегом<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// если монстр не находится в заданной точке<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// монстр бежит в заданную точку<br> * * * *AI_GotoWP(self,self.WP);<br> * *};<br> * *// монстр бежит на свободную точку &quot;FP_ROAM&quot;<br> * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br>};<br><br >// Цикл состояния резвости<br>func int ZS_MM_Rtn_Wusel_loop()<br>{<br> * *// если время резвости истекло и время не контролируется программой поведения монстра<br> * *if((!Wld_IsTime(self.aivar[AIV_MM_WuselStart],00,self.aivar[AIV_MM_WuselEnd],00)) &amp;&amp; (self.aivar[AIV_MM_WuselStart] != OnlyRoutine))<br> * *{<br> * * * *// переход в планировщик суточного цикла<br> * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * *return LOOP_END;<br> * *};<br> * *// если монстр находится в этом состоянии &gt;= 1 сек<br> * *if(Npc_GetStateTime (self) &gt;= 1)<br> * *{<br> * * * *// если монстр находится в точке &quot;FP_ROAM&quot;<br> * * * *if(Npc_IsOnFP(self,&quot;FP_ROAM&quot;))<br> * * * *{<br> * * * * * *// поиск следующей свободной точки<br> * * * * * *if(Wld_IsNextFPAvailable(self,&quot;FP_ROAM&quot; ))<br> * * * * * *{<br> * * * * * * * *// очистка очереди AI состояний монстра<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// переход на новую свободную точку<br> * * * * * * * *AI_GotoNextFP(self,&quot;FP_ROAM&quot;);<br> * * * * * *};<br> * * * *}<br> * * * *else // если не дошел до точки<br> * * * *{<br> * * * * * *// если монстр не идет и не бежит<br> * * * * * *if(!C_BodyStateContains(self,BS_WALK)) &amp;&amp; (!C_BodyStateContains(self,BS_RUN))<br> * * * * * *{<br> * * * * * * * *// переход в свободную точку<br> * * * * * * * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br> * * * * * *};<br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// здесь лишний (можно удалить)<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния резвости<br>func void ZS_MM_Rtn_Wusel_end()<br>{<br>};<br><br>... и еще файл<br><br>// ************************************<br>// Обработчик сидячего состояния орков<br>// ************************************<br><br>// Инициализация состояния<br>func void ZS_MM_Rtn_OrcSit() <br>{<br> * *// разрешить нормальный набор восприятий<br> * *Perception_Set_Monster_Rtn();<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *B_MM_DeSynchronize();<br> * *// если монстр не находится в заданной точке<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// монстр идет в заданную точку<br> * * * *AI_GotoWP(self,self.WP);<br> * *};<br> * *// сброс флага достижения точки сидения<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Rtn_OrcSit_loop()<br>{<br> * *// если время сидения истекло и время не контролируется программой поведения монстра<br> * *if((!Wld_IsTime(self.aivar[AIV_MM_OrcSitStart],00,self.aivar[AIV_MM_OrcSitEnd],00)) &amp;&amp; (self.aivar[AIV_MM_OrcSitStart] != OnlyRoutine))<br> * *{<br> * * * *// переход в планировщик суточного цикла<br> * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * *return LOOP_END;<br> * *};<br> * *// если точка сидения не достигнута<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// если есть свободная точка &quot;FP_CAMPFIRE&quot;<br> * * * *if(Wld_IsFPAvailable(self,&quot;FP_CAMPFIRE&quot; ))<br> * * * *{<br> * * * * * *// монстр идет в эту точку<br> * * * * * *AI_GotoFP(self,&quot;FP_CAMPFIRE&quot;);<br> * * * *};<br> * * * *// если монстр находится в точке &quot;FP_CAMPFIRE&quot;<br> * * * *if(Npc_IsOnFP(self,&quot;FP_CAMPFIRE&quot;))<br> * * * *{<br> * * * * * *// анимация сидящего орка<br> * * * * * *AI_PlayAniBS(self,&quot;T_STAND_2_GUARDSLEEP&quot ;,BS_SIT);<br> * * * * * *// установка флага достижения точки<br> * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * * * *};<br> * *}<br> * *else // лишнее, можно удалить!<br> * *{<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_OrcSit_end()<br>{<br> * *// анимация выхода из сидячего положения<br> * *AI_PlayAniBS(self,&quot;T_GUARDSLEEP_2_STAND&quot ;,BS_STAND);<br>};<br><br>

03.03.2005 09:30

Re: Уроки скриптологии
 
Несколько обработчиков состояний для некоторых типов монстров.<br><br>// ************************************<br>// Обработчик состояния отдыха дракона<br>// ************************************<br><br>// Инициализация состояния<br>func void ZS_MM_Rtn_DragonRest() *<br>{<br> * *// установить время реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// приоритет на питание<br> * *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT;<br> * *// если дракон не тестовый (строки программы, отмеченные в конце //*** можно удалить)<br> * *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Dragon_Testmodell)) //***<br> * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //***<br> * * * *// разрешить нормальный набор восприятий<br> * * * *Perception_Set_Monster_Rtn();<br> * * * *// разрешить восприятие ГГ<br> * * * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player);<br> * *}; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//***<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *B_MM_DeSynchronize();<br> * *// если монстр не находится в заданной точке<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// монстр идет в заданную точку<br> * * * *AI_GotoWP(self,self.WP);<br> * *};<br> * *// если есть свободная точка с именем &quot;FP_ROAM&quot;<br> * *if(Wld_IsFPAvailable(self,&quot;FP_ROAM&quot;)) * <br> * *{<br> * * * *// монстр идет в эту точку<br> * * * *AI_GotoFP(self,&quot;FP_ROAM&quot;);<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// выравнивание в точке<br> * * * *AI_AlignToWP(self);<br> * *};<br> * *// сброс счетчика цикла регенерации<br> * *self.aivar[AIV_TAPOSITION] = 0;<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Rtn_DragonRest_Loop()<br>{<br> * *// если время отдыха истекло и время не контролируется программой поведения монстра<br> * *if((!Wld_IsTime(self.aivar[AIV_MM_RestStart],00,self.aivar[AIV_MM_RestEnd],00)) &amp;&amp; (self.aivar[AIV_MM_RestStart] != OnlyRoutine))<br> * *{<br> * * * *// переход в планировщик суточного цикла<br> * * * *AI_StartState(self,ZS_MM_AllScheduler,1,&quot;&qu ot;);<br> * * * *return LOOP_END;<br> * *};<br> * *// если НПС дракон<br> * *if(self.guild == GIL_DRAGON)<br> * *{<br> * * * *// счетчик цикла регенерации ++<br> * * * *self.aivar[AIV_TAPOSITION] += 1;<br> * * * *// если жизнь дракона &lt; максимальной и прошло не менее 2 сек<br> * * * *if(self.attribute[ATR_HITPOINTS] &lt; self.attribute[ATR_HITPOINTS_MAX]) &amp;&amp; (self.aivar[AIV_TAPOSITION] &gt;= 2)<br> * * * *{<br> * * * * * *// жизнь дракона ++<br> * * * * * *self.attribute[ATR_HITPOINTS] += 1;<br> * * * * * *// сброс счетчика цикла регенерации<br> * * * * * *self.aivar[AIV_TAPOSITION] = 0;<br> * * * *};<br> * *};<br> * *// с вероятностью 0,005 менять анимацию монстра<br> * *if(Hlp_Random(1000) &lt;= 5)<br> * *{<br> * * * *var int randomMove;<br> * * * *randomMove = Hlp_Random(3);<br> * * * *AI_StandUp(self);<br> * * * *if(randomMove == 0) { AI_PlayAni(self,&quot;R_ROAM1&quot;); };<br> * * * *if(randomMove == 1) { AI_PlayAni(self,&quot;R_ROAM2&quot;); };<br> * * * *if(randomMove == 2) { AI_PlayAni(self,&quot;R_ROAM3&quot;); };<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_DragonRest_End()<br>{<br> * *// анимация выхода из отдыха<br> * *AI_PlayAni(self,&quot;T_REST_2_STAND&quot;);<br>} ;<br><br>... еще файл<br><br>// *******************************************<br>// Обработчик состояния когда овца идет за ГГ<br>// *******************************************<br><br >// Инициализация состояния<br>func void ZS_MM_Rtn_Follow_Sheep()<br>{<br> * *// установить время реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// разрешить восприятие ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player);<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Rtn_Follow_Sheep_Loop()<br>{<br> * *// если НПС член партии ГГ<br> * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *// если расстояние между НПС и ГГ &gt; 5 метров<br> * * * *if(Npc_GetDistToNpc(self,hero) &gt; 500)<br> * * * *{<br> * * * * * *// если НПС не плывет<br> * * * * * *if(!C_BodyStateContains(self,BS_SWIM))<br> * * * * * *{ * <br> * * * * * * * *// НПС переходит на бег<br> * * * * * * * *AI_SetWalkmode(self,NPC_RUN);<br> * * * * * *};<br> * * * * * *// НПС движется к ГГ<br> * * * * * *AI_GotoNpc(self,hero);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// НПС поворачивается к ГГ<br> * * * * * *AI_TurnToNpc(self,hero);<br> * * * * * *// установить для НПС ближайшую свободную точку<br> * * * * * *self.wp = Npc_GetNearestWP(self); <br> * * * *};<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// анимация<br> * * * *var int randomMove;<br> * * * *randomMove = Hlp_Random(3);<br> * * * *if(randomMove == 0) { AI_PlayAni(self,&quot;R_ROAM1&quot;); };<br> * * * *if(randomMove == 1) { AI_PlayAni(self,&quot;R_ROAM2&quot;); };<br> * * * *if(randomMove == 2) { AI_PlayAni(self,&quot;R_ROAM3&quot;); };<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_Follow_Sheep_End()<br>{<br>};<br><br>// ************************************************** **<br>// Обработчик состояния когда овца идет за Бальтасаром<br>// ************************************************** **<br><br>// Инициализация состояния<br>func void ZS_MM_Rtn_Follow_Sheep_Balthasar()<br>{<br> * *// установить время реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// разрешить восприятие ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player);<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Rtn_Follow_Sheep_Balthasar_Loop()<br>{<br> * *// если расстояние между Бальтасаром и точкой &quot;NW_BIGMILL_FARM3_BALTHASAR&quot; &gt; 5 м<br> * *if(Npc_GetDistToWP(Balthasar,&quot;NW_BIGMILL_FAR M3_BALTHASAR&quot;) &gt; 500)<br> * *{<br> * * * *// если расстояние между НПС и Бальтасаром &gt; 5 метров<br> * * * *if(Npc_GetDistToNpc(self,Balthasar) &gt; 500)<br> * * * *{<br> * * * * * *// если НПС не плывет<br> * * * * * *if(!C_BodyStateContains(self,BS_SWIM))<br> * * * * * *{ * <br> * * * * * * * *// НПС переходит на бег<br> * * * * * * * *AI_SetWalkmode(self,NPC_RUN);<br> * * * * * *};<br> * * * * * *// НПС движется к Бальтасару<br> * * * * * *AI_GotoNpc(self,Balthasar);<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// НПС поворачивается к Бальтасару<br> * * * * * *AI_TurnToNpc(self,Balthasar);<br> * * * * * *// установить для НПС ближайшую свободную точку<br> * * * * * *self.WP = Npc_GetNearestWP(self); <br> * * * *};<br> * *}<br> * *else // иначе (когда пришли)<br> * *{<br> * * * *// переход НПС в состояние брожения около точки &quot;NW_BIGMILL_FARM3_BALTHASAR&quot;<br> * * * *AI_StartState(self,ZS_MM_Rtn_Roam,1,&quot;NW_BIGM ILL_FARM3_BALTHASAR&quot;<br>);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_Follow_Sheep_Balthasar_End ()<br>{<br>};<br><br>... и еще файл<br><br>// ****************************************<br>// Обработчик поведения вызванного монстра<br>// ****************************************<br><br>// Локальное восприятие разговора с ГГ<br>func void B_SummonedAssessTalk()<br>{<br> * *// вызванный монстр умирает (жизнь = 0)<br> * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-self.attribute[ATR_HITPOINTS_MAX])<br>;<br>};<br><br>// Инициализация состояния<br>func void ZS_MM_Rtn_Summoned()<br>{<br> * *// установить время реакции на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// разрешить восприятие ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player);<br> * *// разрешить восприятие врага<br> * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_MM_AssessE nemy);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage);<br> * *// разрешить восприятие сражения двух других НПС<br> * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_MM_As sessOthersDamage);<br> * *// если вызванный НПС Огонек<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector))<br> * *{<br> * * * *// разрешить восприятие разговора<br> * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *}<br> * *else // иначе (если монстр)<br> * *{<br> * * * *// разрешить локальное восприятие разговора<br> * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_SummonedAss essTalk);<br> * *};<br> * *// установить дружеское отношение к ГГ<br> * *B_SetAttitude(self,ATT_FRIENDLY);<br> * *// НПС член партии ГГ<br> * *self.aivar[AIV_PARTYMEMBER] = TRUE;<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// режим передвижения - бег<br> * *AI_SetWalkmode(self,NPC_RUN);<br>};<br><br>// Цикл состояния<br>func int ZS_MM_Rtn_Summoned_Loop()<br>{<br> * *// Выполнение Огоньком заданий<br> * *B_MM_WispDetect();<br> * *// если расстояние между НПС и ГГ &gt; 5 метров<br> * *if(Npc_GetDistToNpc (self, hero) &gt; 500)<br> * *{<br> * * * *// НПС бежит к ГГ<br> * * * *AI_GotoNpc(self,hero);<br> * *}<br> * *else //иначе<br> * *{<br> * * * *// если прошла секунда<br> * * * *if(Npc_GetStateTime(self) &gt;= 1)<br> * * * *{<br> * * * * * *// если НПС не видит ГГ<br> * * * * * *if(!Npc_CanSeeNpc(self,hero))<br> * * * * * *{<br> * * * * * * * *// НПС поворачивается к ГГ<br> * * * * * * * *AI_TurnToNpc(self,hero);<br> * * * * * *};<br> * * * * * *// увеличение времени вызова монстра<br> * * * * * *self.aivar[AIV_SummonTime] = (self.aivar[AIV_SummonTime] + Npc_GetStateTime(self));<br> * * * * * *// если время вызова монстра превысило время жизни<br> * * * * * *if(self.aivar[AIV_SummonTime] &gt;= MONSTER_SUMMON_TIME)<br> * * * * * *{<br> * * * * * * * *// вызванный монстр умирает (жизнь = 0)<br> * * * * * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-self.attribute[ATR_HITPOINTS_MAX])<br>;<br> * * * * * *};<br> * * * * * *// сброс времени состояния<br> * * * * * *Npc_SetStateTime (self, 0);<br> * * * *};<br> * *};<br> * *// установить для НПС ближайшую свободную точку<br> * *self.wp = Npc_GetNearestWP(self);<br> * *return LOOP_CONTINUE;<br>};<br><br>// Завершение состояния<br>func void ZS_MM_Rtn_Summoned_End()<br>{<br>};<br><br>

04.03.2005 09:40

Re: Уроки скриптологии
 
12. Вспомогательные В_ функции для людей.<br><br>Все В_ функции расположены в директории ..\AI\Human\B_Human\<br><br>// ************************************************** ******<br>// Функция переводящая НПС в состояние атаки<br>// ************************************************** ******<br> * *<br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf * * * * * * *- атакующий НПС (далее - агрессор)<br>// oth * * * * * * *- атакуемый НПС (далее - жертва)<br>// attack_reason * *- причина атаки<br>// wait * * * * * * - время выжидания перед атакой<br>// ======================================<br><br>func void B_Attack(var C_NPC slf,var C_NPC oth,var int attack_reason,var int wait)<br>{<br> * *// установить агрессору время задержки перед атакой<br> * *slf.aivar[AIV_WaitBeforeAttack] = wait;<br> * *// если агрессор должен атаковать немедленно<br> * *if(attack_reason == AR_SuddenEnemyInferno)<br> * *{<br> * * * *// установить агрессору флаг наличия врага<br> * * * *slf.aivar[AIV_EnemyOverride] = FALSE;<br> * * * *// послать жертве восприятие нападения<br> * * * *Npc_SendPassivePerc(slf,PERC_ASSESSFIGHTSOUND,slf ,oth);<br> * *};<br> * *// если агрессор находится в состоянии разговора<br> * *if(Npc_IsInState(slf,ZS_Talk))<br> * *{<br> * * * *// закончить разговор агрессору<br> * * * *slf.aivar[AIV_INVINCIBLE] = FALSE;<br> * * * *// закончить разговор жертве<br> * * * *oth.aivar[AIV_INVINCIBLE] = FALSE;<br> * *};<br> * *// если агрессор находится в состоянии атаки и жертва есть последняя цель агрессора<br> * *if(Npc_IsInState(slf,ZS_Attack)) &amp;&amp; (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])<br> * *{<br> * * * *// если причина атаки агрессора не убийство жертвы и новая причина атаки приоритетней существующей причины атаки<br> * * * *if(!C_NpcHasAttackReasonToKill(slf)) &amp;&amp; (attack_reason &gt; slf.aivar[AIV_ATTACKREASON])<br> * * * *{<br> * * * * * *// установить агрессору новую причину атаки<br> * * * * * *slf.aivar[AIV_ATTACKREASON] = attack_reason;<br> * * * * * *// если жертва ГГ<br> * * * * * *if(Npc_IsPlayer(oth))<br> * * * * * *{<br> * * * * * * * *// установить агрессору причину атаки ГГ<br> * * * * * * * *slf.aivar[AIV_LastPlayerAR] = attack_reason;<br> * * * * * *};<br> * * * *};<br> * *}<br> * *else // иначе<br> * *{ * <br> * * * *// установить агрессору новую причину атаки<br> * * * *slf.aivar[AIV_ATTACKREASON] = attack_reason;<br> * * * *// если жертва ГГ<br> * * * *if (Npc_IsPlayer(oth))<br> * * * *{<br> * * * * * *// установить агрессору причину атаки ГГ<br> * * * * * *slf.aivar[AIV_LastPlayerAR] = attack_reason;<br> * * * *};<br> * *};<br> * *// если агрессор атакует убийцу овец<br> * *if(slf.aivar[AIV_ATTACKREASON] == AR_SheepKiller)<br> * *{<br> * * * *// запоминается новость, что жертва убила овцу<br> * * * *B_MemorizePlayerCrime(slf,oth,CRIME_SHEEPKILLER); <br> * *};<br> * *// если причина атаки вызвана повреждением агрессора или является реакцией на обнаженное оружие<br> * *if(slf.aivar[AIV_ATTACKREASON] == AR_ReactToDamage) ¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)<br> * *{<br> * * * *// если агрессор имеет дело не с &quot;крутым парнем&quot; и (жертва не ГГ и не друг агрессору)<br> * * * *if(!C_NpcIsToughGuy(slf)) &amp;&amp; (!(Npc_IsPlayer(oth) &amp;&amp; (slf.npctype == NPCTYPE_FRIEND)))<br> * * * *{<br> * * * * * *// запоминается новость, что ГГ сражался с НПС<br> * * * * * *B_MemorizePlayerCrime(slf,oth,CRIME_ATTACK);<br> * * * *};<br> * *};<br> * *// если причина атаки воровство или использование МОВа<br> * *if(slf.aivar[AIV_ATTACKREASON] == AR_Theft) ¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_UseMob)<br> * *{<br> * * * *// запоминается новость, что ГГ воровал<br> * * * *B_MemorizePlayerCrime(slf,oth,CRIME_THEFT);<br> * *};<br> * *// если причина атаки убийство человека<br> * *if(slf.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)<br> * *{<br> * * * *// запоминается новость, что ГГ совершил убийство<br> * * * *B_MemorizePlayerCrime(slf,oth,CRIME_MURDER);<br> * *};<br> * *// если агрессор уже в состоянии атаки<br> * *if(Npc_IsInState(slf,ZS_Attack))<br> * *{<br> * * * *return;<br> * *};<br> * *// если причина атаки убийство<br> * *if (slf.aivar[AIV_ATTACKREASON] == AR_KILL)<br> * *{<br> * * * *// установить враждебное отношение агрессора к ГГ<br> * * * *B_SetAttitude(slf,ATT_HOSTILE);<br> * *};<br> * *// если ГГ жертва<br> * *if(Npc_IsPlayer(oth))<br> * *{<br> * * * *// параметр последнего сражения с ГГ - прервано<br> * * * *slf.aivar[AIV_LastFightAgainstPlayer] = FIGHT_CANCEL;<br> * * * *// последнее сражение не комментировалось<br> * * * *slf.aivar[AIV_LastFightComment] = FALSE;<br> * *};<br> * *// если агрессор не в состоянии разговора<br> * *if(!Npc_IsInState(slf,ZS_Talk))<br> * *{<br> * * * *// очистить очередь AI состояний агрессора<br> * * * *Npc_ClearAIQueue(slf); <br> * *};<br> * *// запретить агрессору восприятия<br> * *B_ClearPerceptions(slf);<br> * *// установить в качестве цели жертву<br> * *Npc_SetTarget(slf,oth);<br> * *// если агрессор лежит<br> * *if(C_BodyStateContains(slf,BS_LIE))<br> * *{<br> * * * *// переход в состояние атаки с завершением предыдущего состояния<br> * * * *AI_StartState(slf,ZS_Attack,1,&quot;&quot;);<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// немедленный переход в состояние атаки<br> * * * *AI_StartState(slf,ZS_Attack,0,&quot;&quot;);<br> * *};<br> * *return;<br>};<br><br>... еще один файл<br><br>// **************************************<br>// Функция вызова охраны<br>// --------------------------------------<br>// self - НПС агрессор, other - НПС жертва<br>// **************************************<br><br>// Функция проверки, может ли НПС вызвать охрану<br>// ================================================== =========<br>// Аргумент: slf - НПС вызывающий охрану<br>// -----------------------------------------------------------<br>// Возвращает: TRUE - охрана может быть вызвана, иначе - FALSE.<br>// ================================================== =========<br>func int C_WantToCallGuards(var C_NPC slf)<br>{<br> * *// если агрессор не является членом партии ГГ<br> * *if(self.aivar[AIV_PARTYMEMBER] == FALSE)<br> * *{<br> * * * *// если НПС принадлежит к<br> * * * *if(slf.guild == GIL_PAL) * *// паладинам<br> * * * *¦¦ (slf.guild == GIL_MIL) * // или милиции<br> * * * *¦¦ (slf.guild == GIL_VLK) * // или горожанам<br> * * * *¦¦ (slf.guild == GIL_SLD) * // или наемникам<br> * * * *¦¦ (slf.guild == GIL_BAU) * // или крестьянам<br> * * * *{<br> * * * * * *// охрана может быть вызвана<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *// охрану вызвать нельзя<br> * *return FALSE;<br>};<br><br>// Вызов охраны<br>func void B_CallGuards()<br>{<br> * *// если агрессор не может вызвать охрану<br> * *if(!C_WantToCallGuards(self))<br> * *{<br> * * * *return;<br> * *};<br> * *// если причина атаки<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill) * *// вызвана охрана по факту убийства<br> * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight) * * // или охрана прекратила атаковать преступника <br> * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief) *// или охрана вызвана по факту воровства<br> * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom) * // или охрана вызвана для защиты помещения<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза &quot;ТРЕВОГА!&quot;)<br> * * * *B_Say_Overlay(self,other,&quot;$ALARM&quot;);<br> * * * *return;<br> * *}; * * *<br> * *// если причина атаки - нападение на врага или убийство человека<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)<br> * *{<br> * * * *// если агрессор милиционер или паладин или наемник<br> * * * *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ТРЕВОГА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$ALARM&quot;);<br> * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор имеет дело не с &quot;крутым парнем&quot;<br> * * * *if(!C_NpcIsToughGuy(self))<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ОХРАНА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$GUARDS&quot;);<br > * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *return;<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если охрана ворот атакует незваного гостя<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза &quot;ТРЕВОГА!&quot;)<br> * * * *B_Say_Overlay(self,other,&quot;$ALARM&quot;);<br> * * * *// агрессор посылает восприятие нападения<br> * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *return;<br> * *};<br> * *// если причина атаки воровство или использование чужого МОВа<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_Theft) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_UseMob)<br> * *{<br> * * * *// если агрессор имеет дело не с &quot;крутым парнем&quot;<br> * * * *if(!C_NpcIsToughGuy(self))<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ОХРАНА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$GUARDS&quot;);<br > * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если причина нападения - реакция на обнаженное оружие<br> * *if (self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)<br> * *{<br> * * * *// если агрессор имеет дело не с &quot;крутым парнем&quot;<br> * * * *if(!C_NpcIsToughGuy(self))<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ОХРАНА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$GUARDS&quot;);<br > * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если причина нападения - посягательство на чужое помещение<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom)<br> * *{<br> * * * *// если агрессор милиционер или паладин или наемник<br> * * * *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ТРЕВОГА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$ALARM&quot;);<br> * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *return; <br> * * * *};<br> * * * *// если агрессор имеет дело не с &quot;крутым парнем&quot;<br> * * * *if(!C_NpcIsToughGuy(self))<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза &quot;ОХРАНА!&quot;)<br> * * * * * *B_Say_Overlay(self,other,&quot;$GUARDS&quot;);<br > * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *return; <br> * * * *};<br> * * * *return;<br> * *};<br> * *return;<br>}; *<br><br>


Текущее время: 22:28. Часовой пояс GMT +4.
Страница 3 из 8 123 45678

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot

AGFC: Valley of Gothic © 2004-2022