|
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); * * * *}; * *}; };
|