Показать сообщение отдельно
Старый 19.04.2005, 12:50   #146
Vam

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

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

// **************************************
// Обработчик состояния Магический сон
// **************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Локальное восприятие повреждения (окончание действия заклинания)
func int B_StopMagicSleep()
{
* *// запретить восприятие повреждений
* *Npc_PercDisable(self,PERC_ASSESSDAMAGE);
* *// жертва говорит агрессору (SVM фраза) "(сам с собою, просыпаясь) Что это было!?" (Примечание: Ошибка слово $WHATWASSTHAT надо заменить на $WHATWASTHAT, а то фраза не будет сказана)
* *B_Say_Overlay(self,other,"$WHATWASSTHAT");
* *// анимация перехода в нормальное состояние
* *AI_PlayAni(self,"T_VICTIM_SLE_2_STAND");
}; * * *

// Локальное восприятие разговора
func void B_AssessMagicSleepTalk()
{
* *// жертва говорит агрессору (SVM фраза) "(просыпаясь) Черт, что случилось?"
* *B_Say(self,other,"$YOUDISTURBEDMYSLUMBER");
* *// жертва переходит в состояние наблюдения за ГГ
* *AI_StartState(self,ZS_ObservePlayer,1,"");
};

// Инициализация состояния
func void ZS_MagicSleep()
{
* *// установить локальное восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Sleep);
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// установить локальное восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessMagic SleepTalk);
* *// Сбросить статус предупреждений охраной
* *self.aivar[AIV_Guardpassage_Status] = GP_NONE;
* *// сбросить счетчик отказа от диалога
* *Npc_SetRefuseTalk(self,0);
* *// установить временное отношение между жертвой и ГГ равное постоянному
* *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));
* *// НПС и ГГ перестают смотреть друг на друга
* *B_StopLookAt(self);
* *// НПС прекращает на что-либо указывать
* *AI_StopPointAt(self);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// проигрывается анимация перехода в Магический сон
* *AI_PlayAniBS(self,"T_STAND_2_VICTIM_SLE",BS_LIE );
};

// Функция цикла состояния
func int ZS_MagicSleep_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_Time_Sleep)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// закончить действие обработчика
* * * *B_StopMagicSleep();
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicSleep_End()
{
};

... ещё файл

// ************************************************** *********
// Обработчик состояния Большой огненной бури
// -----------------------------------------------------------
// В это состояние НПС переводится экзешником, а не скриптами
// ************************************************** *********

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopPyro()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; *

// Инициализация состояния
func void ZS_Pyro()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopPy ro);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self, BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// проиграть анимацию входа в состояние
* * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM");
* *}; *
};

// Функция цикла состояния
func int ZS_Pyro_Loop()
{ *
* *// если прошла 1 секунда
* *if(Npc_GetStateTime(self) >= 1)
* *{
* * * *// сбросить время состояния
* * * *Npc_SetStateTime(self,0);
* * * *// нанести жертве секундный урон
* * * *B_MagicHurtNpc(other,self,SPL_PYRO_DAMAGE_PER_SEC );
* * * *// если жизнь жертвы кончилась
* * * *if(self.attribute[ATR_HITPOINTS] <= 0)
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self); * *
* * * * * *// НПС встает
* * * * * *AI_StandUp(self);
* * * * * *return LOOP_END;
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pyro_End()
{
};

... ещё файл

// ************************************************
// Обработчик состояния реакции на Шаровую молнию
// ************************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopShortZapped()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; * * *

// Инициализация состояния
func void ZS_ShortZapped()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopSh ortZapped);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// проиграть анимацию входа в состояние
* * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM");
* *}; *
};

// Функция цикла состояния
func int ZS_ShortZapped_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) *
* *{
* * * *// закончить действие обработчика
* * * *B_StopShortZapped();
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_ShortZapped_End()
{
};

... ещё файл

// *************************************
// Обработчик состояния Украсть энергию
// *************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

var int Temp_SuckEnergy_DistToPlayer; * // расстояние между жертвой и ГГ

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartSuckEnergy()
{
* *// если последнее примененное заклинание Украсть энергию
* *if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* * * *// анимация состояния
* * * *AI_PlayAni(self,"T_STAND_2_SUCKENERGY_VICTIM");
* *};
};

// Закончить действие заклинания
func void B_StopSuckEnergy()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_SuckEnergy()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSuc kEnergy);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self, "S_SUCKENERGY_VICTIM"); *
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// сброс времени цикла
* *self.aivar[AIV_SuckEnergyStateTime] = 1;
* *// запомнить расстояние между жертвой и ГГ
* *Temp_SuckEnergy_DistToPlayer = Npc_GetDistToPlayer(self);
};

// Функция цикла состояния
func int ZS_SuckEnergy_Loop()
{ *
* *// если время в состоянии > времени действия заклинания или расстояние между ГГ и жертвой увеличилось на более 10м
* *if(Npc_GetStateTime(self) > SPL_TIME_SuckEnergy) ¦¦ (Temp_SuckEnergy_DistToPlayer >= Npc_GetDistToPlayer(self) + 100)
* *{
* * * *// остановить действие заклинания
* * * *B_StopSuckEnergy();
* * * *return LOOP_END;
* *};
* *// если текущее время состояния не равно времени цикла
* *if(Npc_GetStateTime(self) != self.aivar[AIV_SuckEnergyStateTime])
* *{
* * * *// если первая фаза состояния
* * * *if(Npc_GetStateTime(self) == 0) *
* * * *{
* * * * * *// если состояние тела НПС не прерываемо
* * * * * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS))
* * * * * *{
* * * * * * * *// анимация перехода в бессознательное состояние
* * * * * * * *AI_PlayAniBS(self,"T_STAND_2_SUCKENERGY_VICTIM",B S_UNCONSCIOUS);
* * * * * *};
* * * * * *// эффект высасывания энергии
* * * * * *Wld_PlayEffect("spellFX_SuckEnergy_BloodFly",self ,hero,0,0,0,FAL
SE);
* * * *};
* * * *// обновить время цикла
* * * *self.aivar[AIV_SuckEnergyStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба от заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_SuckEnergy_DAMAGE)
* * * *{
* * * * * *// нанести жертве урон
* * * * * *B_MagicHurtNpc(other,self,SPL_SuckEnergy_DAMAGE);
* * * * * *// добавить украденную жизнь агрессору
* * * * * *Npc_ChangeAttribute(other,ATR_HITPOINTS,SPL_SuckE nergy_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// убить жертву
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_SuckEnergy_End()
{
};

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