Показать сообщение отдельно
Старый 21.02.2005, 17:51   #110
Vam

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

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

// ************************************************** **********
// Обработчик состояния реакции НПС на повреждение
// ------------------------------------------------------------
// self - НПС, получивший повреждение, other - агрессор
// ************************************************** **********

// Инициализация состояния
func void ZS_ReactToDamage()
{ *
* *// разрешить НПС нормальный набор восприятий
* *Perception_Set_Normal();
* *// НПС смотрит на агрессора
* *B_LookAtNpc(self,other);
* *// НПС выбирает оружие для поражения агрессора
* *B_SelectWeapon(self,other);
* *// НПС поворачивается к агрессору
* *B_TurnToNpc(self,other);
* *// НПС говорит агрессору (SVM фраза "Парень, никогда так больше не делай!")
* *B_Say (self, other, "$WHATAREYOUDOING");
* *// очистка счетчика секунд
* *self.aivar[AIV_StateTime] = 0;
};

// Цикл состояния
func int ZS_ReactToDamage_Loop()
{
* *// если прошла одна секунда
* *if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime])
* *{
* * * *// если НПС не видит агрессора
* * * *if(!Npc_CanSeeNpc(self,other))
* * * *{ *
* * * * * *// НПС поворачивается к агрессору
* * * * * *AI_TurnToNpc(self,other);
* * * *};
* * * *// счетчик секунд ++
* * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;
* *};
* *// если прошло более 10 секунд
* *if(Npc_GetStateTime (self) > 10)
* *{
* * * *return LOOP_END;
* *}
* *else // [Примечание: else можно убрать, просто - return LOOP_CONTINUE;]
* *{
* * * *return LOOP_CONTINUE;
* *};
};

// Завершения состояния
func void ZS_ReactToDamage_End()
{
* *// НПС убирает оружие
* *AI_RemoveWeapon(self);
* *// перестает смотреть на агрессора
* *B_StopLookAt(self);
};


... и еще один файл

// ********************************************
// Обработчик состояния реакции НПС на оружие
// --------------------------------------------
// self - реагирующий НПС, other - агрессор
// ********************************************

// Инициализация состояния
func void ZS_ReactToWeapon()
{ *
* *// разрешить НПС минимальный набор восприятий
* *Perception_Set_Minimal();
* *// разрешить НПС восприятие сражения двух других НПС
* *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound);
* *// реакция НПС на врага агрессора
* *if(B_AssessEnemy())
* *{
* * * *return;
* *};
* *// НПС встает
* *AI_StandUp(self);
* *// смотрит на агрессора
* *B_LookAtNpc(self,other);
* *// выбирает оружие
* *B_SelectWeapon(self,other);
* *// поворачивается к агрессору
* *B_TurnToNpc(self,other);
* *// если НПС выиграл последнее сражение с ГГ и была причина сражения с ГГ и агрессор ГГ
* *if(self.aivar[AIV_LastFightAgainstPlayer] == FIGHT_WON) && (self.aivar[AIV_LastPlayerAR] != AR_NONE) && (Npc_IsPlayer(other))
* *{
* * * *// НПС говорит ГГ (SVM фраза "Хочешь еще получить?")
* * * *B_Say(self,other,"$LOOKINGFORTROUBLEAGAIN");
* *}
* *// иначе, если комментария обнаженного оружия не было
* *else if(Player_DrawWeaponComment == FALSE)
* *{
* * * *// если агрессор хочет применить магию
* * * *if(Npc_IsInFightMode(other,FMODE_MAGIC))
* * * *{
* * * * * *// НПС говорит агрессору (SVM фраза "Перестань колдовать!")
* * * * * *B_Say(self,other,"$STOPMAGIC");
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// НПС говорит агрессору (SVM фраза "Убери оружие!")
* * * * * *B_Say(self,other,"$WEAPONDOWN");
* * * *};
* * * *// установка флага состоявшегося комментария
* * * *Player_DrawWeaponComment = TRUE;
* *};
* *// НПС посылает предупреждение агрессору
* *Npc_SendPassivePerc(self,PERC_ASSESSWARN,self,oth er);
* *// сброс флага второго предупреждения
* *self.aivar[AIV_TAPOSITION] = FALSE;
* *// сброс счетчика времени
* *self.aivar[AIV_StateTime] = 0;
};

// Цикл состояния
func int ZS_ReactToWeapon_Loop()
{ *
* *// если расстояние между НПС и агрессором > дистанции действия восприятия
* *if(Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT)
* *{
* * * *// очистка очереди AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// НПС убирает оружие
* * * *AI_RemoveWeapon(self);
* * * *// перестает смотреть на агрессора
* * * *B_StopLookAt(self);
* * * *return LOOP_END;
* *};
* *// если агрессор убрал оружие
* *if(Npc_IsInFightMode(other,FMODE_NONE))
* *{
* * * *// очистка очереди AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// НПС говорит агрессору (SVM фраза "Умный малый!")
* * * *B_Say(self,other,"$WISEMOVE");
* * * *// НПС убирает оружие
* * * *AI_RemoveWeapon(self);
* * * *// перестает смотреть на агрессора
* * * *B_StopLookAt (self);
* * * *return LOOP_END;
* *};
* *// если прошла одна секунда
* *if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime])
* *{
* * * *// если НПС не видит агрессора
* * * *if(!Npc_CanSeeNpc(self,other))
* * * *{ *
* * * * * *// НПС поворачивается к агрессору
* * * * * *B_TurnToNpc(self,other);
* * * *};
* * * *// счетчик времени ++
* * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;
* *};
* *// если второго предупреждения не было и время в состоянии > 5 сек
* *if(self.aivar[AIV_TAPOSITION] == FALSE) && (Npc_GetStateTime(self) > 5)
* *{ *
* * * *// если агрессор хочет применить магию
* * * *if(Npc_IsInFightMode(other,FMODE_MAGIC))
* * * *{
* * * * * *// НПС говорит агрессору (SVM фраза "Убери свою магию! Ты что, оглох!?")
* * * * * *B_Say(self,other,"$ISAIDSTOPMAGIC");
* * * *}
* * * *else
* * * *{
* * * * * *// НПС говорит агрессору (SVM фраза "Да убери же чертово оружие!")
* * * * * *B_Say(self,other,"$ISAIDWEAPONDOWN");
* * * *};
* * * *// установить флаг второго предупреждения
* * * *self.aivar[AIV_TAPOSITION] = TRUE;
* *};
* *// если время в состоянии > 10 сек
* *if(Npc_GetStateTime(self) > 10) * * * * * * * * * * * * * * * * * * * *
* *{
* * * *// НПС атакует агрессора
* * * *B_Attack(self,other,AR_ReactToWeapon,0);
* *}; *
* *return LOOP_CONTINUE;
};

// Завершение состояния
func void ZS_ReactToWeapon_End()
{ *
* *// НПС перестает смотреть на агрессора
* *B_StopLookAt(self);
* *// НПС переходит в заключительную фазу состояния наблюдения за ГГ
* *AI_StartState(self,ZS_ObservePlayer,1,"");
};

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