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

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

По умолчанию 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()
{ *
};

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