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

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

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

2Нифариус:
Подскажите, как с помощью скрипта создать эффект одержимости (расплывающийся красный экран во время разговора).
Вызвать вот эти эффекты:
* * *Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALS E);
* * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE);

----------------------------------------------------------------------

17. Обработчики состояний заклинаний.

Все обработчики расположены в директории скриптов ..\AI\Magic\ZS_Magic в одноименных файлах.


//************************************************** **
// Обработчик состояния заклинания Зеленые щупальца
//************************************************** **

// ----------------------------------------------------
// self - жертва заклинания
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartGreententacle()
{
* *// если последнее примененное заклинание Зеленые щупальца
* *if(Npc_GetLastHitSpellID(self) == SPL_Greententacle)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopGreententacle()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *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_Greententacle()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartGre ententacle);
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// остановить проигрывание файлов анимации заклинания
* *Npc_StopAni(self,"s_GreententacleA_Victim");
* *Npc_StopAni(self,"s_GreententacleB_Victim");
* *Npc_StopAni(self,"s_GreententacleC_Victim");
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp * * *(self);
* *// если НПС находится не в бессознательном состоянии
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// если жертва человек
* * * *if(self.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *var int randy;
* * * * * *//randy = Hlp_Random(3);
* * * * * *// проигрывается анимация бессознательного состояния (Примечание: т.к. предыдущая строка в скрипте закрыта, то randy всегда имеет значение 0)
* * * * * *if(randy == 0) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEA_VICTIM ",BS_UNCONSCIOUS); };
* * * * * *if(randy == 1) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEB_VICTIM ",BS_UNCONSCIOUS); };
* * * * * *if(randy == 2) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEC_VICTIM ",BS_UNCONSCIOUS); };
* * * *}
* * * *else
* * * *{
* * * * * *// анимация бессознательного состояния
* * * * * *AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",BS_UN CONSCIOUS);
* * * *};
* *};
};

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

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

... ещё файл

// ****************************************
// Обработчик состояния заклинания Раздуть
// ****************************************

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

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

// Закончить действие заклинания
func void B_StopInflate()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *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_Inflate()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartInf late);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self,"S_INFLATE_VICTIM");
* *// если НПС находится не в бессознательном состоянии
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// анимация бессознательного состояния
* * * *AI_PlayAniBS(self,"T_STAND_2_INFLATE_VICTIM",BS_U NCONSCIOUS);
* *};
* *// сброс времени цикла
* *self.aivar[AIV_InflateStateTime] = 0;
};

// Функция цикла состояния
func int ZS_Inflate_Loop ()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_Inflate)
* *{
* * * *// остановить действие заклинания
* * * *B_StopInflate();
* * * *return LOOP_END;
* *};
* *// если текущее время состояния не равно времени цикла
* *if(Npc_GetStateTime(self) != self.aivar[AIV_InflateStateTime])
* *{
* * * *// в зависимости от времени состояния установить жирность (объем) фигуры жертвы
* * * *// как видим по коэффициентам объема сначала идет раздутие фигуры, а затем возвращение к нормальному состоянию
* * * *if(Npc_GetStateTime(self) == 1) * * * { *Mdl_SetModelFatness(self,1); * }
* * * *else if(Npc_GetStateTime(self) == 2) *{ *Mdl_SetModelFatness(self,3); * }
* * * *else if(Npc_GetStateTime(self) == 3) *{ *Mdl_SetModelFatness(self,8 ); * }
* * * *else if(Npc_GetStateTime(self) == 4) *{ *Mdl_SetModelFatness(self,12); *}
* * * *else if(Npc_GetStateTime(self) == 5)
* * * *{ *
* * * * * *Mdl_SetModelFatness(self,9);
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_1");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 6) *{ *Mdl_SetModelFatness (self,15); }
* * * *else if(Npc_GetStateTime(self) == 7) *{ *Mdl_SetModelFatness (self,18 ); }
* * * *else if(Npc_GetStateTime(self) == 8 )
* * * *{
* * * * * *Mdl_SetModelFatness(self,11); *
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say (self, other, "$Aargh_2");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 9) *{ *Mdl_SetModelFatness(self,15); *}
* * * *else if(Npc_GetStateTime(self) == 10) { *Mdl_SetModelFatness(self,13); *}
* * * *else if(Npc_GetStateTime(self) == 11) { *Mdl_SetModelFatness(self,12); *}
* * * *else if(Npc_GetStateTime(self) == 12) { *Mdl_SetModelFatness(self,10); *}
* * * *else if(Npc_GetStateTime(self) == 13) { *Mdl_SetModelFatness(self,8 ); * }
* * * *else if(Npc_GetStateTime(self) == 14)
* * * *{
* * * * * *Mdl_SetModelFatness(self,5);
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_3");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 15) *{ *Mdl_SetModelFatness(self,6); *}
* * * *else if(Npc_GetStateTime(self) == 16) *{ *Mdl_SetModelFatness(self,4); *}
* * * *else if(Npc_GetStateTime(self) == 17) *{ *Mdl_SetModelFatness(self,2); *}
* * * *else if(Npc_GetStateTime(self) == 18 ) *{ *Mdl_SetModelFatness(self,1); *}
* * * *else if(Npc_GetStateTime(self) == 19) *{ *Mdl_SetModelFatness(self,1); *};
* * * *// установить время уикла на текущее время
* * * *self.aivar[AIV_InflateStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_Inflate_DAMAGE)
* * * *{
* * * * * *// нанести ужерб жертве
* * * * * *B_MagicHurtNpc(other,self,SPL_Inflate_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// нанести полный ужерб жертве (смерть)
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

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

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

const int SPL_MAGICBURN_DAMAGE_PER_SEC = 1; // ущерб в сек от заклинания

// Закончить действие заклинания
func void B_StopMagicBurn()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *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 B_RestartBurn()
{
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_Firerain) * * * * * *// Огненный дождь
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball) * * *// или Большой огненный шар
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_InstantFireball) * * // или Огненный шар
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_Firebolt) * * * * * *// или Огненная стрела
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* * * *return;
* *};
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * * * * * // Ледяная волна
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * * * * * // или Ледяная глыба
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// очистить восприятия
* * * *B_ClearPerceptions(self);
* * * *// перевести жертву в состояние Магической заморозки
* * * *AI_StartState(self,ZS_MagicFreeze,0,"");
* *};
};

// Инициализация состояния
func void ZS_MagicBurn()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopMa gicBurn);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
};

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

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


ЗЫ: Каким-то странным образом включается жирный шрифт, а отменить его нельзя, раньше тоже это наблюдал, но реже и удавалось убрать переформатированием текста.
ЗЫЫЫ: Оказывается это видно только в редакторе!
Ответить с цитированием