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

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

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

// ************************************************** *********
// Обработчик состояния наблюдения за сражением
// -----------------------------------------------------------
// self - НПС наблюдатель, other - агрессор, victim - жертва
// ************************************************** *********

// Функция реакции НПС наблюдателя когда другой НПС получает повреждение
func void B_CheerFight()
{
* *// если время нахождения наблюдателя в этом состоянии <= 2 сек
* *if(Npc_GetStateTime(self) <= 2) * * * * * *
* *{
* * * *return;
* *};
* *// если агрессор монстр или жертва монстр
* *if((other.guild > GIL_SEPERATOR_HUM) ¦¦ (victim.guild > GIL_SEPERATOR_HUM))
* *{
* * * *return;
* *};
* *// сброс времени нахождения в состоянии
* *Npc_SetStateTime(self,0);
* *// если наблюдатель имеет дело с "крутым парнем"
* *if(C_NpcIsToughGuy(self))
* *{
* * * *var int zufall;
* * * *// случайное число
* * * *zufall = Hlp_Random(3);
* * * *// если наблюдатель друг жертвы и наблюдатель не друг агрессору
* * * *if(Npc_GetAttitude(self,victim) == ATT_FRIENDLY) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY)
* * * *{
* * * * * *// наблюдатель говорит сам себе (SVM фраза)
* * * * * *if(zufall == 0) { B_Say_Overlay(self,self,"$OOH01"); }; // "Смотри, не делай так!"
* * * * * *if(zufall == 1) { B_Say_Overlay(self,self,"$OOH02"); }; // "Вот тогда ты еще успеешь это сделать!"
* * * * * *if(zufall == 2) { B_Say_Overlay(self,self,"$OOH03"); }; // "Ох! Это же больно!"
* * * * * *// проиграть анимацию
* * * * * *AI_PlayAni(self,"T_WATCHFIGHT_OHNO");
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// наблюдатель говорит сам себе (SVM фраза)
* * * * * *if(zufall == 0) { B_Say_Overlay(self,self,"$CHEERFRIEND01"); }; // "Да, это хорошо!"
* * * * * *if(zufall == 1) { B_Say_Overlay(self,self,"$CHEERFRIEND02"); }; // "Ну, сделай уже!"
* * * * * *if(zufall == 2) { B_Say_Overlay(self,self,"$CHEERFRIEND03"); }; // "Все просто здорово!"
* * * * * *// проиграть анимацию
* * * * * *AI_PlayAni(self,"T_WATCHFIGHT_YEAH");
* * * *};
* *};
};

// Функция реакции НПС наблюдателя когда другой НПС падает безсознания
func void B_AssessDefeat()
{
* *// очистка очереди AI состояний наблюдателя
* *Npc_ClearAIQueue(self);
* *// если наблюдатель имеет дело с "крутым парнем" или (агрессор ГГ и наблюдатель друг ГГ)
* *if(C_NpcIsToughGuy(self)) ¦¦ (Npc_IsPlayer(other) && (self.npctype == NPCTYPE_FRIEND))
* *{
* * * *// если наблюдатель друг ГГ
* * * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY)
* * * *{
* * * * * *// наблюдатель говорит ГГ (SVM фраза "Ну и показал же ты ему!")
* * * * * *B_Say(self,other,"$GOODVICTORY");
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// наблюдатель говорит ГГ (SVM фраза "Неплохо...")
* * * * * *B_Say(self,other,"$NOTBAD");
* * * *};
* *}
* *else // иначе
* *{
* * * *// если у жертвы не было причины сражаться
* * * *if(victim.aivar[AIV_ATTACKREASON] != AR_NONE)
* * * *{
* * * * * *// наблюдатель говорит агрессору (SVM фраза "Боже мой! Какая жестокость...")
* * * * * *B_Say(self,other,"$OHMYGODHESDOWN");
* * * * * *// наблюдатель запоминает новость, что агрессор сражался с НПС жертвой
* * * * * *B_MemorizePlayerCrime(self,other,CRIME_ATTACK);
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// наблюдатель говорит агрессору (SVM фраза "Неплохо...")
* * * * * *B_Say(self,other,"$NOTBAD");
* * * *};
* *};
};

// Инициализация состояния наблюдения за сражением
func void ZS_WatchFight ()
{
* *// разрешить наблюдателю локальное восприятие бессознательного состояния НПС
* *Npc_PercEnable(self,PERC_ASSESSDEFEAT,B_AssessDef eat);
* *// разрешить наблюдателю локальное восприятие если НПС получил повреждение
* *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_Che erFight);
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// наблюдатель встает
* *AI_StandUp(self);
* *// поворачивается к жертве
* *B_TurnToNpc(self,victim);
* *// прячет оружие
* *AI_RemoveWeapon(self); * * * * *
* *// если (расстояние между наблюдателем и агрессором или наблюдателем и жертвой < дистанции действия восприятия)
* *if((Npc_GetDistToNpc(self,other) < PERC_DIST_INTERMEDIAT) ¦¦ (Npc_GetDistToNpc(self,victim) < PERC_DIST_INTERMEDIAT))
* *// и агрессор и жертва не безсознания
* *&& (!Npc_IsInState(other,ZS_Unconscious)) && (!Npc_IsInState(victim,ZS_Unconscious))
* *// и агрессор и жертва люди
* *&& ((other.guild < GIL_SEPERATOR_HUM) && (victim.guild < GIL_SEPERATOR_HUM))
* *{
* * * *// если наблюдатель имеет дело с "крутым парнем""
* * * *if(C_NpcIsToughGuy(self))
* * * *{
* * * * * *// наблюдатель говорит агрессору (SVM фраза "Ух ты, это же битва!")
* * * * * *B_Say(self,other,"$THERESAFIGHT");
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// наблюдатель говорит агрессору (SVM фраза "Боже мой, вот это битва!")
* * * * * *B_Say(self,other,"$OHMYGODITSAFIGHT");
* * * *};
* *};
* *// сброс флага выхода из цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* *// очистить счетчик времени
* *self.aivar[AIV_StateTime] = 0;
};

// Цикл состояния наблюдения за сражением
func int ZS_WatchFight_Loop()
{
* *// если расстояние между наблюдателем и агрессором и наблюдателем и жертвой > дистанции наблюдения сражения
* *if(Npc_GetDistToNpc(self,other) > WATCHFIGHT_DIST_MAX) && (Npc_GetDistToNpc(self,victim) > WATCHFIGHT_DIST_MAX)
* *{
* * * *// очистка очереди AI состояний наблюдателя
* * * *Npc_ClearAIQueue(self);
* * * *return LOOP_END;
* *};
* *// если (агрессор не атакует или не реагирует на повреждение)
* *if(!(Npc_IsInState(other,ZS_Attack) ¦¦ Npc_IsInState(other,ZS_ReactToDamage)))
* *// и (жертва не атакует или не реагирует на повреждение)
* *&& (!(Npc_IsInState(victim,ZS_Attack) ¦¦ Npc_IsInState(victim,ZS_ReactToDamage)))
* *// и время в состоянии > 0
* *&& (Npc_GetStateTime(self) > 0)
* *{
* * * *// если агрессор или жертва безсознания
* * * *if(Npc_IsInState(other,ZS_Unconscious)) ¦¦ (Npc_IsInState(victim,ZS_Unconscious))
* * * *// или агрессор или жертва мертвы
* * * *¦¦ (Npc_IsInState(other,ZS_Dead)) ¦¦ (Npc_IsInState(victim,ZS_Dead))
* * * *{
* * * * * *// если флаг выхода из цикла сброшен
* * * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* * * * * *{
* * * * * * * *// установить флаг
* * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* * * * * * * *return LOOP_CONTINUE;
* * * * * *}
* * * * * *else // иначе, флаг выхода из цикла установлен
* * * * * *{
* * * * * * * *// очистка очереди AI состояний наблюдателя
* * * * * * * *Npc_ClearAIQueue(self);
* * * * * * * *// выход из цикла выполняется после второго прохода, если кто-либо из сражающихся мертв или безсознания (чтобы сработало соответствующее восприятие)
* * * * * * * *return LOOP_END;
* * * * * *};
* * * *}
* * * *else
* * * *{ * * *
* * * * * *// очистка очереди AI состояний наблюдателя
* * * * * *Npc_ClearAIQueue(self);
* * * * * *return LOOP_END;
* * * *};
* *};
* *// если наблюдатель имеет дело с "крутым парнем"
* *if(C_NpcIsToughGuy(self))
* *{
* * * *// анимация удалена!!!
* * * *//AI_PlayAni(self,"T_STAND_2_WATCHFIGHT");
* *};
* *// если расстояние между наблюдателем и агрессором или наблюдателем и жертвой <= мин. дистанции наблюдения сражения
* *if(Npc_GetDistToNpc(self,other) *<= WATCHFIGHT_DIST_MIN) ¦¦ (Npc_GetDistToNpc(self,victim) <= WATCHFIGHT_DIST_MIN)
* *{
* * * *// очистка очереди AI состояний наблюдателя
* * * *Npc_ClearAIQueue(self);
* * * *// если расстояние между наблюдателем и агрессором <= расстояния между наблюдателем и жертвой
* * * *if(Npc_GetDistToNpc(self,other) <= Npc_GetDistToNpc(self,victim))
* * * *{
* * * * * *// наблюдатель поворачивается к жертве
* * * * * *B_TurnToNpc(self,victim);
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// наблюдатель поворачивается к агрессору
* * * * * *B_TurnToNpc(self,other);
* * * *};
* * * *// наблюдатель делает шаг назад
* * * *AI_Dodge(self);
* *}
* *else // иначе (расстояние нормальное для наблюдения)
* *{
* * * *// если прошла секунда
* * * *if(Npc_GetStateTime(self) != self.aivar[AIV_StateTime])
* * * *{
* * * * * *// если если расстояние между наблюдателем и агрессором <= расстояния между наблюдателем и жертвой
* * * * * *if(Npc_GetDistToNpc(self,other) <= Npc_GetDistToNpc(self,victim))
* * * * * *{
* * * * * * * *// наблюдатель поворачивается к агрессору
* * * * * * * *B_TurnToNpc(self,other);
* * * * * *}
* * * * * *else // иначе
* * * * * *{
* * * * * * * *// наблюдатель поворачивается к жертве
* * * * * * * *B_TurnToNpc(self,victim);
* * * * * *};
* * * * * *// запись в счетчик текущего времени цикла
* * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Завершение состояния
func void ZS_WatchFight_End()
{
* *// анимация удалена!!!
* *//AI_PlayAni(self,"T_WATCHFIGHT_2_STAND");
};

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