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

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

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

// *****************************************
// Обработчик состояния разговора между НПС
// -----------------------------------------
// self - НПС источник информации, other - слушатель (всегда ГГ)
// *****************************************

var int zsTalkBugfix; * // флаг выхода из разговора

// Инициализация состояния разговора
func void ZS_Talk()
{
* *// если ГГ уже с кем-то разговаривает
* *if(other.aivar[AIV_INVINCIBLE] == TRUE)
* *{
* * * *return; * * * * * *
* *};
* *// установка флагов начала разговора (для обоих участников)
* *self.aivar[AIV_INVINCIBLE] = TRUE;
* *other.aivar[AIV_INVINCIBLE] = TRUE;
* *// если НПС человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{ * * *
* * * *// если НПС сидит
* * * *if(C_BodyStateContains(self,BS_SIT))
* * * *{
* * * * * *var C_NPC target;
* * * * * *// инициализация глобальной переменной target ссылкой на НПС, на которого смотрит источник информации
* * * * * *target = Npc_GetLookAtTarget(self);
* * * * * *// если target не существует
* * * * * *if(!Hlp_IsValidNpc(target))
* * * * * *{
* * * * * * * *// НПС смотрит на ГГ
* * * * * * * *AI_LookAtNpc(self,other);
* * * * * *};
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// НПС смотрит на ГГ
* * * * * *B_LookAtNpc(self,other);
* * * *};
* * * *// НПС прячет оружие
* * * *AI_RemoveWeapon(self);
* *};
* *// если НПС не сидит
* *if(!C_BodystateContains(self,BS_SIT))
* *{ *
* * * *// НПС поворачивается к ГГ
* * * *B_TurnToNpc(self,other);
* *};
* *// если ГГ не сидит
* *if(!C_BodystateContains(other,BS_SIT))
* *{ *
* * * *// ГГ поворачивается к НПС
* * * *B_TurnToNpc(other,self);
* * * *// если расстояние между ГГ и НПС < 80 см
* * * *if(Npc_GetDistToNpc(other,self) < 80)
* * * *{
* * * * * *// ГГ отспупает назад
* * * * * *AI_Dodge(other);
* * * *};
* *};
* *// если НПС человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{ *
* * * *// если НПС сердит на ГГ или НПС враг ГГ
* * * *if(Npc_GetAttitude(self,other) == ATT_ANGRY) ¦¦ (Npc_GetAttitude(self,other) == ATT_HOSTILE)
* * * *{
* * * * * *// если ГГ не переодет в бандита или НПС не бандит
* * * * * *if(!C_PlayerIsFakeBandit(self,other)) ¦¦ (self.guild != GIL_BDT)
* * * * * *{
* * * * * * * *// включить "злую" анимацию лица НПС
* * * * * * * *Mdl_StartFaceAni(self,"S_ANGRY",1,-1);
* * * * * *};
* * * *};
* * * *// если НПС принадлежит к окружающему народу
* * * *if(self.npctype == NPCTYPE_AMBIENT) * * * * // общему
* * * *¦¦ (self.npctype == NPCTYPE_OCAMBIENT) * * *// или из Миненталя
* * * *¦¦ (self.npctype == NPCTYPE_BL_AMBIENT) * * // или из Лагеря бандитов
* * * *¦¦ (self.npctype == NPCTYPE_TAL_AMBIENT) * *// или из Долины бандитов
* * * *{
* * * * * *// инициализация диалога НПС об окружающей информации (сплетни)
* * * * * *B_AssignAmbientInfos(self);
* * * * * *// если НПС принадлежит городу
* * * * * *if(C_NpcBelongsToCity(self))
* * * * * *{
* * * * * * * *// инициализация диалога НПС о городской жизни
* * * * * * * *B_AssignCityGuide(self);
* * * * * *};
* * * *};
* * * *// если НПС является членом партии ГГ и
* * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)
* * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff)) * * * * // НПС не Бифф
* * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_NW)) * * *// и НПС не Бифф в Новом мире
* * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_DI)) * * *// и НПС не Бифф на Острове драконов
* * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos)) * * * // и НПС не Пардос
* * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos_NW)) * *// и НПС не Пардос в Новом мире
* * * *{
* * * * * *// ГГ дает НПС напиток лечения
* * * * * *B_Addon_GivePotion(self);
* * * *};
* * * *// если НПС имеет дело с "крутым парнем" и НПС не имеет новостей о "крутом парне"
* * * *if(C_NpcIsToughGuy(self)) && (self.aivar[AIV_ToughGuyNewsOverride] == FALSE)
* * * *{
* * * * * *// инициализация диалога НПС о "крутом парне"
* * * * * *B_AssignToughGuyNEWS(self);
* * * *};
* * * *// если НПС имеет новости об окружающей жизни
* * * *if(C_NpcHasAmbientNews(self))
* * * *{
* * * * * *// инициализация диалога НПС об окружающих новостях
* * * * * *B_AssignAmbientNEWS(self);
* * * *};
* *}; * * *
* *// если НПС дракон
* *if (self.guild == GIL_DRAGON)
* *{
* * * *// проиграть анимацию дракона T_STAND_2_TALK
* * * *AI_PlayAni(self,"T_STAND_2_TALK");
* *};
* *// начать выбранный диалог
* *AI_ProcessInfos(self);
* *// сброс флага выхода из разговора
* *zsTalkBugfix = FALSE;
};

// Цикл состояния разговора
func INT ZS_Talk_Loop ()
{
* *// если диалог закончен и флаг выхода установлен
* *if(InfoManager_HasFinished()) && (zsTalkBugfix == TRUE)
* *{
* * * *// сброс флагов разговора для обоих участников
* * * *self.aivar[AIV_INVINCIBLE] = FALSE;
* * * *other.aivar[AIV_INVINCIBLE] = FALSE;
* * * *// сброс флага важной информации
* * * *self.aivar[AIV_NpcStartedTalk] = FALSE;
* * * *// установка флага, что НПС говорил с ГГ
* * * *self.aivar[AIV_TalkedToPlayer] = TRUE;
* * * *// если НПС человек
* * * *if(self.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// НПС перестает смотреть на ГГ
* * * * * *B_StopLookAt(self);
* * * * * *// сменить выражение лица НПС на обычное
* * * * * *Mdl_StartFaceAni(self,"S_NEUTRAL",1,-1);
* * * *}; *
* * * *// если НПС дракон
* * * *if(self.guild == GIL_DRAGON)
* * * *{
* * * * * *// запустить обычную анимацию стоящего дракона
* * * * * *AI_PlayAni(self,"T_TALK_2_STAND");
* * * *};
* * * *return LOOP_END;
* *}
* *else // иначе
* *{
* * * *// установить флаг выхода из разговора (нельзя завершить цикл разговора при первом вхождении)
* * * *zsTalkBugfix = TRUE;
* * * *return LOOP_CONTINUE;
* *};
};

// Окончание состояния разговора
func void ZS_Talk_End()
{
* *// отказ ГГ от других диалогов на 20 сек
* *Npc_SetRefuseTalk(other,20);
* *// когда НПС находится в своем помещении или (помещение публично и НПС не друг ГГ
* *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ ((Wld_GetPlayerPortalGuild() == GIL_PUBLIC) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY))
* *{
* * * *// НПС переходит в состояние наблюдения за ГГ
* * * *AI_StartState(self,ZS_ObservePlayer,0,"");
* *}
* *else * *// [лишнее, можно удалить]
* *{

* *};
};

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