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

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

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

10. Вспомогательные В_ функции.

Директория размещения файлов функций - B_Content

* *1. Функции, связанные с пиратами из лагеря.

Файл B_Addon_PiratesGoHome.d

// Пираты, члены партии ГГ, его покидают и идут в лагерь
func void B_Addon_PiratesGoHome()
{
* *// Скип не является компаньоном ГГ
* *Skip.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Мэтт не является компаньоном ГГ
* *Matt.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Брэндон не является компаньоном ГГ
* *Brandon.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Пират, жарящий мясо (id = 1364), не является компаньоном ГГ
* *RoastPirate.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Сидящий на скамье пират (id = 1363) не является компаньоном ГГ
* *BenchPirate.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Аллигатор Джек не является компаньоном ГГ
* *AlligatorJack.aivar[AIV_PARTYMEMBER] = FALSE;
* *// Пираты продолжают выполнять свой распорядок дня
* *B_StartOtherRoutine(Skip,"START");
* *B_StartOtherRoutine(Matt,"START");
* *B_StartOtherRoutine(Brandon,"START");
* *B_StartOtherRoutine(RoastPirate,"START");
* *B_StartOtherRoutine(BenchPirate,"START");
* *B_StartOtherRoutine(AlligatorJack,"START");
};

// Насколько далеко от лагеря пираты могут сопровождать ГГ
// ------------------------------------------------
// Возвращаемое значение:
// TRUE - пират должен покинуть ГГ, FALSE - пират сопровождает ГГ.
func int C_GregsPiratesTooFar()
{
* *// если расстояние (в см) от ГГ до указанных точек менее заданного
* *if (Npc_GetDistToWP(hero,"ADW_CANYON_MINE1_09") < 3000)
* *¦¦ (Npc_GetDistToWP(hero,"ADW_CANYON_MINE2_04") < 2000)
* *¦¦ (Npc_GetDistToWP(hero,"ADW_CANYON_LIBRARY_04") < 2000)
* *¦¦ (Npc_GetDistToWP(hero,"ADW_CANYON_PATH_TO_BANDITS_ 25") < 6000)
* *¦¦ (Npc_GetDistToWP(hero,"ADW_PIRATECAMP_WAY_16") < 8000)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

// Сколько пиратов сопровождают ГГ
// ------------------------------------------------
// Возвращаемое значение: кол-во пиратов
func int C_HowManyPiratesInParty()
{
* *return
* *(
* * * *Skip.aivar[AIV_PARTYMEMBER]
* * * *+ Matt.aivar[AIV_PARTYMEMBER]
* * * *+ Brandon.aivar[AIV_PARTYMEMBER]
* * * *+ RoastPirate.aivar[AIV_PARTYMEMBER]
* * * *+ BenchPirate.aivar[AIV_PARTYMEMBER]
* * * *+ AlligatorJack.aivar[AIV_PARTYMEMBER]
* *);
};

// Пираты согласны идти с ГГ на зачистку каньона
func void B_Addon_PiratesFollowAgain()
{
* *// если ГГ ближе 40м от берега залива
* *if(Npc_GetDistToWP(hero,"STRAND") < 4000)
* *{
* * * *return;
* *};
* *// если с ГГ уже есть пираты
* *if(C_HowManyPiratesInParty() != 0)
* *{
* * * *return;
* *};
* *// если расстояние между ГГ и Скипом < 20м и Скип живой и self не Скип
* *if(Npc_GetDistToNpc(hero,Skip) <= 2000) && (!Npc_IsDead(Skip)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Skip))
* *{
* * * *// Скип становится членом партии ГГ
* * * *Skip.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *// очистка очереди AI состояний Скипа
* * * *Npc_ClearAIQueue(Skip);
* * * *// Скип следует за ГГ
* * * *B_StartOtherRoutine(Skip,"FOLLOW");
* *};
* *// аналогично и с другими пиратами
* *if(Npc_GetDistToNpc(hero,Matt) <= 2000) && (!Npc_IsDead(Matt)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Matt))
* *{
* * * *Matt.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *Npc_ClearAIQueue(Matt);
* * * *B_StartOtherRoutine(Matt,"FOLLOW");
* *};
* *if(Npc_GetDistToNpc(hero,Brandon) <= 2000) && (!Npc_IsDead(Brandon)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Brandon))
* *{
* * * *Brandon.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *Npc_ClearAIQueue(Brandon);
* * * *B_StartOtherRoutine(Brandon,"FOLLOW");
* *};
* *if(Npc_GetDistToNpc(hero,RoastPirate) <= 2000) && (!Npc_IsDead(RoastPirate)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(RoastPirate))
* *{
* * * *RoastPirate.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *Npc_ClearAIQueue(RoastPirate);
* * * *B_StartOtherRoutine(RoastPirate,"FOLLOW");
* *};
* *if(Npc_GetDistToNpc(hero,BenchPirate) <= 2000) && (!Npc_IsDead(BenchPirate)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(BenchPirate))
* *{
* * * *BenchPirate.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *Npc_ClearAIQueue(BenchPirate);
* * * *B_StartOtherRoutine(BenchPirate,"FOLLOW");
* *};
* *if(Npc_GetDistToNpc(hero,AlligatorJack) <= 2000) && (!Npc_IsDead(AlligatorJack)) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(AlligatorJack))
* *{
* * * *AlligatorJack.aivar[AIV_PARTYMEMBER] = TRUE;
* * * *Npc_ClearAIQueue(AlligatorJack);
* * * *B_StartOtherRoutine(AlligatorJack,"FOLLOW");
* *};
};

// Освобождена ли башня около Лагеря пиратов от бандитов
// ------------------------------------------------
// Возвращаемое значение: TRUE - да, FALSE - нет
func int C_TowerBanditsDead()
{
* *// получить ссылки на бандитов в башне
* *var C_NPC TowerBandit1;
* *Towerbandit1 = Hlp_GetNpc(BDT_10100_Addon_Towerbandit);
* *var C_NPC TowerBandit2;
* *Towerbandit2 = Hlp_GetNpc(BDT_10101_Addon_Towerbandit);
* *var C_NPC TowerBandit3;
* *Towerbandit3 = Hlp_GetNpc(BDT_10102_Addon_Towerbandit);
* *// если все три бандита мертвы
* *if(Npc_IsDead(TowerBandit1) && Npc_IsDead(TowerBandit2) && Npc_IsDead(TowerBandit3))
* *{
* * * *return TRUE;
* * * *// башня освобождена от бандитов (Внимание ОШИБКА: данную строку необходимо перенести на одну вверх, иначе топик по освобождению башни не будет закрыт)
* * * *TowerBanditsDead = TRUE;
* *}
* *else
* *{
* * * *return FALSE;
* *};
};


* *2. Функции, связанные с карманной кражей.

Файл B_Beclauen.d

// other - ГГ, self - НПС

// Проверяется возможность карманной кражи у НПС
// ------------------------------------------------
// Аргумент: TheftDex - требуемая ловкость для открытия диалога воровства, TheftGold - сколько денег можно украсть
// Возвращаемое значение: TRUE - кража возможна, FALSE - нет
func int C_Beklauen(var int TheftDex,var int TheftGold)
{ *
* *// если ГГ обучен карманной краже
* *if (Npc_GetTalentSkill(other,NPC_TALENT_PICKPOCKET) == TRUE)
* *// и НПС не обворован ГГ
* *&& (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
* *// и ГГ имеет требуемую ловкость (ловкость ГГ должна быть более (TheftDex-10))
* *&& (other.attribute[ATR_DEXTERITY] >= (TheftDex - Theftdiff))
* *// и НПС не одержим
* *&& (NpcObsessedByDMT == FALSE)
* *{
* * * *// если НПС в состоянии диалога
* * * *if(Npc_IsInState(self,ZS_Talk))
* * * *{
* * * * * *// задать уровень ловкости, требуемый для успешного воровства
* * * * * *if(TheftDex <= 20)
* * * * * *{
* * * * * * * *TheftDexGlob = 10;
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *TheftDexGlob = TheftDex;
* * * * * *};
* * * * * *// задать кол-во украденных денег
* * * * * *TheftGoldGlob = TheftGold;
* * * *};
* * * *return TRUE;
* *};
* *return FALSE; * // Добавлено мной для исключения возможной ошибки.
}; *
* *
// Функция карманной кражи
func void B_Beklauen()
{ *
* *// если ГГ имеет требуемую ловкость
* *if(other.attribute[ATR_DEXTERITY] >= TheftDexGlob)
* *{
* * * *// ГГ получет заданное кол-во денег
* * * *B_GiveInvItems(self,other,ItMi_Gold,TheftGoldGlob );
* * * *// установка флага, что НПС обворован ГГ
* * * *self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
* * * *// получение экспы за воровство
* * * *B_GiveThiefXP();
* * * *// звуковое сопровождение
* * * *Snd_Play("Geldbeutel");
* *}
* *else
* *{
* * * *// фиксация неудачной кражи
* * * *B_ResetThiefLevel();
* * * *// прекратить диалог (т.е. кражу)
* * * *AI_StopProcessInfos(self);
* * * *// НПС атакует вора
* * * *B_Attack(self,other,AR_Theft,1);
* *};
}; *


* *3. Функция реакции на повреждение "Когтем Белиара".

Файл B_BeliarsWeaponSpecialDamage.d

// ************************************************** **************
// Функция реакции на повреждение "Когтем Белиара"
// ************************************************** **************
// Аргументы: oth - нападающий, slf - жертва

var int RavenBlitz; // кол-во молний, созданных Равеном

func void B_BeliarsWeaponSpecialDamage(var C_NPC oth,var C_NPC slf)
{
* *// если Равен жертва
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven))
* *{
* * * *// эффект "Гнев Белиара" исходит от Равена
* * * *Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE",slf, slf,0,0,0,FALSE);
* * * *// если молний не было
* * * *if(RavenBlitz <= 0)
* * * *{
* * * * * *// эффект "Гнев Белиара" падает на ГГ
* * * * * *Wld_PlayEffect("spellFX_BELIARSRAGE",oth,oth,0,0, 0,FALSE);
* * * * * *// магическое повреждение ГГ на 50 пунктов
* * * * * *B_MagicHurtNpc(slf,oth,50);
* * * * * *// кол-во молний ++
* * * * * *RavenBlitz += 1;
* * * *}
* * * *// если ударов молнией >= 3
* * * *else if(RavenBlitz >= 3)
* * * *{
* * * * * *var int RavenRandy;
* * * * * *RavenRandy = Hlp_Random(3);
* * * * * *// Примечание: непонятное условие, будет выполняться всегда
* * * * * *if(RavenRandy <= 50)
* * * * * *{
* * * * * * * *// сброс на 0
* * * * * * * *RavenBlitz = 0;
* * * * * *};
* * * *}
* * * *else
* * * *{
* * * * * *RavenBlitz += 1;
* * * *};
* * * *// результат такой, каждая третья молния, созданная Равеном, поражает ГГ
* *}
* *// если нападающий ГГ
* *else if(Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(hero))
* *{
* * * *var int DamageRandy;
* * * *// вероятность дополнительного повреждения
* * * *DamageRandy = Hlp_Random(100);
* * * *// если ГГ вооружен "Когтем Белиара" и вероятность <= шанса доп. повреждения
* * * *if(C_ScHasReadiedBeliarsWeapon()) && (DamageRandy <= BeliarDamageChance)
* * * *{
* * * * * *// если жертва Дракон нежить
* * * * * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD)
* * * * * *{
* * * * * * * *// эффект "Гнев Белиара" падает на ГГ
* * * * * * * *Wld_PlayEffect("spellFX_BELIARSRAGE",oth,oth,0,0, 0,FALSE);
* * * * * * * *// ГГ получает 100 пунктов урона
* * * * * * * *B_MagicHurtNpc(slf,oth,100);
* * * * * *}
* * * * * *// если жертва уязвима
* * * * * *else if(slf.flags != NPC_FLAG_IMMORTAL)
* * * * * *{
* * * * * * * *// эффект "Гнев Белиара" падает на жертву
* * * * * * * *Wld_PlayEffect("spellFX_BELIARSRAGE",slf,slf,0,0, 0,FALSE);
* * * * * * * *// жертва получает 100 пунктов урона
* * * * * * * *B_MagicHurtNpc(oth,slf,100); * * * * * *
* * * * * *};
* * * * * *// эффект "Гнев Белиара" исходит от ГГ
* * * * * *Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE",hero ,hero,0,0,0,FALSE);
* * * *};
* * * *// если ГГ вооружен "Когтем Белиара" и вероятность <= 50 (удар без повреждения)
* * * *if(C_ScHasReadiedBeliarsWeapon()) && (DamageRandy <= 50)
* * * *{
* * * * * *// эффект "Гнев Белиара" исходит от ГГ
* * * * * *Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE",hero ,hero,0,0,0,FALSE);
* * * *};
* *};
};

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