|
Re: Уроки скриптологии
2Jeene:
Подскажи пожалуйста, нужны ли файлы в папке GII\_Work\Data\Scripts\Content\Story\Missions, помоему это всё для первой готики...
|
Такой папки в скриптах Готики 2 нет, она есть только в Готике 1.
И ещё, если не сложно, напиши, какие файлы в папке Scripts совершенно не нужны?
|
Это сделать сложно, разбираюсь по ходу уроков, папку AI почти полностью рассмотрел, рекомендации по ней в Уроках. ---------------------------------------------------------- // ************************************************** ** // Обработчик состояния Короткого магического горения // ************************************************** **
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
const int SPL_MAGICBURNSHORT_DAMAGE_PER_SEC = 1; * *// ущерб в сек от заклинания
// Закончить действие заклинания func void B_StopMagicBurnShort() { * * *// возвратить общую функцию состояния реакции на магию * *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_RestartBurnShort() { * *// если последнее примененное заклинание * *if (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball) *// Большой огненный шар * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_Firestorm) * * * // или Малая огненная буря * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *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_MagicBurnShort() { * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopMa gicBurnShort); * *// если состояние тела НПС не прерываемо * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * *{ * * * *// НПС встает * * * *AI_StandUp (self); * *} * *else * *{ * * * *// НПС быстро встает * * * *AI_StandUpQuick (self); * *}; * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// анимация горения * * * *Npc_PlayAni(self,"S_FIRE_VICTIM"); * *}; };
// Функция цикла состояния func int ZS_MagicBurnShort_Loop() { * * *// разрешить локальное восприятие на воздействие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartBur nShort); * *// если прошла 1 секунда * *if(Npc_GetStateTime(self) == 1) * *{ * * * *// сбросить время состояния * * * *Npc_SetStateTime(self,0); * * * *// нанести жертве секундный урон * * * *B_MagicHurtNpc(other,self,SPL_MAGICBURNSHORT_DAMA GE_PER_SEC); * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * * * *// НПС встает * * * *AI_StandUp(self); * * * *return LOOP_END; * *}; * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// анимация горения * * * *Npc_PlayAni(self,"S_FIRE_VICTIM"); * *}; * *// если жизнь жертвы кончилась * *if(self.attribute[ATR_HITPOINTS] <= 0) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * * * *// НПС встает * * * *AI_StandUp(self); * * * *return LOOP_END; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicBurnShort_End() { * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); };
... ещё файл // ************************************** // Обработчик состояния страха // **************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Закончить действие заклинания func void B_StopMagicFlee() { * *// запретить восприятие повреждений * *Npc_PercDisable(self,PERC_ASSESSDAMAGE); * *// восстановить other на агрессора * *Npc_SetTarget(self,other); * *// переход в состояние убегания от агрессора * *AI_StartState(self,ZS_Flee,0,""); }; * * *
// Инициализация состояния func void ZS_MagicFlee () { * *// если жертва Дракон * *if(self.guild == GIL_DRAGON) * *{ * * * *// продолжить распорядок дня НПС (нет реакции на магию) * * * *AI_ContinueRoutine(self); * *}; * *var int randy; * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Flee); * *// разрешить восприятие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// сбросить статус предупреждений охраны * *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); * *}; * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *randy = Hlp_Random (3); * * * *// проигрывается анимация * * * *if(randy == 0) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM1",BS_STAN D); }; * * * *if(randy == 1) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM2",BS_STAN D); }; * * * *if(randy == 2) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM3",BS_STAN D); }; * *}; };
// Функция цикла состояния func int ZS_MagicFlee_Loop() { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_Time_Fear) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// закончить действие обработчика * * * *B_StopMagicFlee(); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicFlee_End() { };
... ещё файл // ******************************************* // Обработчик состояния Магической заморозки // *******************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Функция реакции на локальное восприятие магии (заклинания) func void B_RestartFreeze() { * *// если последнее примененное заклинание * *if (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * // Ледяная глыба * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * // или Ледяная волна * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * *}; };
// Закончить действие заклинания func void B_StopMagicFreeze() { * * *// возвратить общую функцию состояния реакции на магию * *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_MagicFreeze() { * *// разрешить локальное восприятие на воздействие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartFre eze); * *// прекратить анимацию * *Npc_StopAni(self,"S_FIRE_VICTIM"); * *// если состояние тела НПС не прерываемо * *if(!C_BodyStateContains(self,BS_UNCONSCIOUS)) * *{ * * * *// анимация заморозки * * * *AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",BS_UN CONSCIOUS); * *}; * *// сброс времени заморозки * *self.aivar[AIV_FreezeStateTime] = 0; };
// Функция цикла состояния func int ZS_MagicFreeze_Loop() { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_FREEZE) * *{ * * * *// закончить действие обработчика * * * *B_StopMagicFreeze(); * * * *return LOOP_END; * *}; * *// если время в состоянии не равно времени заморозки * *if(Npc_GetStateTime(self) != self.aivar[AIV_FreezeStateTime]) * *{ * * * *// время заморозки = времени состояния * * * *self.aivar[AIV_FreezeStateTime] = Npc_GetStateTime(self); * * * *// если жизнь жертвы > ущерба от заклинания * * * *if(self.attribute[ATR_HITPOINTS] > (self.attribute[ATR_HITPOINTS] - SPL_FREEZE_DAMAGE)) * * * *{ * * * * * *// если жертва Огненный голем или * * * * * *if (self.guild == GIL_FIREGOLEM) * * * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] *== *ID_FIREWARAN) * * * // Огненная ящерица * * * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] *== *ID_DRAGON_FIRE) * * // или Огненный дракон * * * * * *{ * * * * * * * *// нанести удвоенное повреждение в сек * * * * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE*2); * * * * * * * *return LOOP_CONTINUE; * * * * * *}; * * * * * *// если жертва Ледяной голем или Ледяной дракон * * * * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * * * * * *{ * * * * * * * *// нанести половинное порреждение в сек * * * * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE/2); * * * * * * * *return LOOP_CONTINUE; * * * * * *}; * * * * * *// нанести обычное повреждение в сек * * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicFreeze_End() { };
... ещё файл // *************************************** // Обработчик состояния Уменьшить монстра // ***************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Инициализация состояния func void ZS_MagicShrink() { * *// если состояние тела НПС не прерываемо * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * *{ * * * *// НПС встает * * * *AI_StandUp(self); * *} * *else * *{ * * * *// НПС быстро встает * * * *AI_StandUpQuick(self); * *}; * *// сброс времени уменьшения * *self.aivar[AIV_MM_ShrinkState] = 0; };
// Функция цикла состояния func int ZS_MagicShrink_Loop() { * *// за 13 секунд плавно уменьшить жертву * *if * * (self.aivar[AIV_MM_ShrinkState] == 0) * *{ Mdl_SetModelScale(self,0.90,0.90,0.90); self.aivar[AIV_MM_ShrinkState] = 1; } * *else if(self.aivar[AIV_MM_ShrinkState] == 1) * *{ Mdl_SetModelScale(self,0.85,0.85,0.85); self.aivar[AIV_MM_ShrinkState] = 2; } * *else if(self.aivar[AIV_MM_ShrinkState] == 2) * *{ Mdl_SetModelScale(self,0.80,0.80,0.80); self.aivar[AIV_MM_ShrinkState] = 3; } * *else if(self.aivar[AIV_MM_ShrinkState] == 3) * *{ Mdl_SetModelScale(self,0.75,0.75,0.75); self.aivar[AIV_MM_ShrinkState] = 4; } * *else if(self.aivar[AIV_MM_ShrinkState] == 4) * *{ Mdl_SetModelScale(self,0.70,0.70,0.70); self.aivar[AIV_MM_ShrinkState] = 5; } * *else if(self.aivar[AIV_MM_ShrinkState] == 5) * *{ Mdl_SetModelScale(self,0.65,0.65,0.65); self.aivar[AIV_MM_ShrinkState] = 6; } * *else if(self.aivar[AIV_MM_ShrinkState] == 6) * *{ Mdl_SetModelScale(self,0.60,0.60,0.60); self.aivar[AIV_MM_ShrinkState] = 7; } * *else if(self.aivar[AIV_MM_ShrinkState] == 7) * *{ Mdl_SetModelScale(self,0.55,0.55,0.55); self.aivar[AIV_MM_ShrinkState] = 8; } * *else if(self.aivar[AIV_MM_ShrinkState] == 8 ) * *{ Mdl_SetModelScale(self,0.50,0.50,0.50); self.aivar[AIV_MM_ShrinkState] = 9; } * *else if(self.aivar[AIV_MM_ShrinkState] == 9) * *{ Mdl_SetModelScale(self,0.45,0.45,0.45); self.aivar[AIV_MM_ShrinkState] = 10;} * *else if(self.aivar[AIV_MM_ShrinkState] == 10) * { Mdl_SetModelScale(self,0.40,0.40,0.40); self.aivar[AIV_MM_ShrinkState] = 11;} * *else if(self.aivar[AIV_MM_ShrinkState] == 11) * { Mdl_SetModelScale(self,0.35,0.35,0.35); self.aivar[AIV_MM_ShrinkState] = 12;} * *else if(self.aivar[AIV_MM_ShrinkState] == 12) * { Mdl_SetModelScale(self,0.30,0.30,0.30); self.aivar[AIV_MM_ShrinkState] = 13;} * *// если жертва уменьшена * *else if (self.aivar[AIV_MM_ShrinkState] == 13) * * *{ * * * *// уменьшить жизнь жертвы * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-((self.attribute[ATR_HITPOINTS]*9) /10)); * * * *// уменьшить макс. жизнь жертвы * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS_MAX,-((self.attribute[ATR_HITPOINTS_MAX]*9)/10)); * * * *// уменьшить силу жертвы * * * *Npc_ChangeAttribute(self,ATR_STRENGTH,-((self.attribute[ATR_STRENGTH]*9)/1 0)); * * * *// уменьшить защиту от тупого оружия * * * *self.protection[PROT_BLUNT] = self.protection[PROT_BLUNT]/10; * * * * * * *// уменьшить защиту от острого оружия * * * *self.protection[PROT_EDGE] = self.protection[PROT_EDGE]/10; * * * *// уменьшить защиту от огня * * * *self.protection[PROT_FIRE] = self.protection[PROT_FIRE]/10; * * * *// защита от нокаута = 0 * * * *self.protection[PROT_FLY] = 0; * * * * *// уменьшить защиту от магии * * * *self.protection[PROT_MAGIC] = self.protection[PROT_MAGIC]/10; * * * *// уменьшить защиту от тотечного оружия * * * *self.protection[PROT_POINT] = self.protection[PROT_POINT]/10; * * * *// переход на следующую фазу состояния * * * *self.aivar[AIV_MM_ShrinkState] = 14; * *} * *// если достигнута последняя фаза состояния * *else if(self.aivar[AIV_MM_ShrinkState] == 14) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// установить обработчик поведения в уменьшенном состоянии * * * *self.start_aistate = ZS_MagicShrunk; * * * *// переход в новый обработчик * * * *AI_StartState(self,ZS_MagicShrunk,1,""); * * * *return LOOP_END; * *}; * *// задержка перед последней фазой состояния * *AI_Wait(self,0.38 ); * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicShrink_End() { };
// ******************************************** // Обработчик поведения уменьшенного монстра // ********************************************
// Инициализация состояния func void ZS_MagicShrunk() { * * *// установить целью ГГ * *Npc_SetTarget(self,hero); };
// Функция цикла состояния func int ZS_MagicShrunk_Loop() { * *// монстр убегает от ГГ * *AI_Flee(self); * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicShrunk_End() { * };
|