• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

Готика ½ Spell_Logic - увеличения урона заклинаний

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
  • Первое сообщение
  • #1
хотелось бы отразить возможность увеличения урона от заклинаний непосредственно в Spell_Logic.

возьмём в качестве примера Spell_Firebolt. у подобных заклинаний используется один уровень заклинания, но совершенного ничего не мешает увеличить кол-во уровней, уменьшив при этом урон за уровень.
Daedalus:
const int SPL_Cost_Firebolt        = 5;
const int SPL_Damage_Firebolt     = 5; // MDK 25

instance Spell_Firebolt (C_Spell_Proto)
{
    time_per_mana            = 0;
    damage_per_level        = SPL_Damage_Firebolt;
    damageType                = DAM_MAGIC;
};
переходим непосредственно к Spell_Logic
Daedalus:
func int Spell_Logic_Firebolt (var int manaInvested)
{
    var C_Item  itm; // для будущих проверок
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero); // ссылка на инстанцию героя

1. сделаем проверку на то есть ли мана на каст. если маны не хватает, то выходим. в моём примере проверка делается один раз при (manaInvested == 0)
Daedalus:
    var int SPL_Cost_mana; 
    if (manaInvested == 0)
    {
        SPL_Cost_mana = SPL_Cost_Firebolt;  // необходимо маны для руны
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_Scroll; };  // необходимо маны для свитка
 
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };
    };

2. в данном примере что бы заклинание наносило 25 ущерба надо использовать 5ый уровень заклинания. Этот уровень я задаю как "базовый", а далее начинаю начислять "бонусные" уровни. "Уровни" я записываю в аивер НПС. Подсчёт "уровней" я делаю на "старте" в Spell_Logic пока (manaInvested == 0).
Daedalus:
        if (manaInvested == 0)
        {
            self.aivar[AIV_SpellLevel] = 5;
            //
            //  Бонусы
            //
            var C_NPC her;     her = Hlp_GetNpc(PC_Hero);

            if (self.guild == GIL_KDF)
            {
                self.aivar[AIV_SpellLevel] += 1;
 
                if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
                && (heroGIL_KDF2 == TRUE)
                {
                    self.aivar[AIV_SpellLevel] += 1;
                };
            };
 
            var C_Item itm; itm = Npc_GetEquippedMeleeWeapon(self);
            if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;
            }
            else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 2;
            };

               if (Npc_HasEquippedArmor(self) == TRUE)
            {
                itm = Npc_GetEquippedArmor(self);
                if (Hlp_IsItem(itm, ITAR_KDF_L) == TRUE)
                {
                    self.aivar[AIV_SpellLevel] += 1;
                }
                else if  (Hlp_IsItem(itm, ITAR_KDF_H) == TRUE)
                {
                    self.aivar[AIV_SpellLevel] += 2;
                };
 
                if (KDF01_Equipped == TRUE)
                && (KDFArmor_Equipped == TRUE)
                {
                    self.aivar[AIV_SpellLevel] += 1;
                };
            };
 
            if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
            {
                if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true)         { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true)  { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Firestorm] == true)        { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true)   { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true)      { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Firerain] == true)         { self.aivar[AIV_SpellLevel] += 1; };
            };
        };
код выше можно вынести в отдельную функцию что бы использовать в разных спелл_логик. в приведённом выше примере есть различные проверки по всему что пришло в голову. после каждой положительной проверки уровень заклинания "поднимался" всё выше и выше, то есть получался "бонус". а там где есть бонусы там могут быть и штрафы ;-) а значит эти условия можно сделать более проработанными и начислять как бонусы так и штрафы. При этом всё таки кол-во уровней должно быть осмысленное и не уходить в бесконечность. Например если "базовый" уровень 5, то максимально возможный лучшей сделать 10. Если уровней будет много(например 100), то каст заклинание может занять значительное время.
upd доп информация по проверкам в посте #2 Готика ½ - Spell_Logic - увеличения урона заклинаний

3. Переходим к непосредственному повышению уровня: определяем текущий уровень заклинания и если он ниже необходимого, то повышаем уровень.
Daedalus:
    var int    SpellLevel; SpellLevel = Npc_GetActiveSpellLevel(self);
    //Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, Spell Lvl = %i", self.name, self.id,manaInvested, SpellLevel));

    if (SpellLevel < self.aivar[AIV_SpellLevel])
    {
        return SPL_NEXTLEVEL;
    };

4. обнуляем аивер и отнимает ману движком.
Daedalus:
    if (self.aivar[AIV_SpellLevel] != 0)
    {
        self.aivar[AIV_SpellLevel] = 0;
        return SPL_FORCEINVEST + Spl_Cost_Mana; // отнимает ману. устанавливаем новое значение manainvested.
    };

5. сам каст
Daedalus:
    return SPL_SENDCAST;
};

в функции каста делается запись в аивер НПС AIV_SelectSpell. В оригинальных скриптах это делается для врагов, что бы они при необходимости могли поменять заклинание. Огненную стрелу использует только герой. тем не менее я на всякий случай оставляю данный счётчик. Ввиду того что ману я отнимаю движком, скриптовое отнимание маны убрано из Spell_Cast_***. Подробнее про то как и зачем отнимать ману движком я написал в посте #5 Готика ½ - Spell_Logic - увеличения урона заклинаний
Daedalus:
func void Spell_Cast_Firebolt()
{
    self.aivar[AIV_SelectSpell] += 1;     // счётчик для НПС (не герой)
};
 

Вложения

  • 17_03_2023_SPL_FireBolt.zip
    1,4 KB · Просмотры: 10
  • 2023_03_18_SPL_FireBolt.zip
    1,5 KB · Просмотры: 5
Последнее редактирование модератором:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
MEG@VOLT, так и есть. плюс еще проверка на то герой ли кастует, иначе ищущие получат бонус ;-)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565
Ну я думал, что то условие, которое я написал, должно попадать внутрь условия if (manaInvested == 0)
))
Туплю, тогда так:
Daedalus:
if (EquipAmulettOfDeath == 1 && NPC_IsPlayer(self))
{
    self.aivar[AIV_SpellLevel] += 1;
}
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
можно конечно попробовать сделать и по науке, в прошлый раз я писал что то подобное про руну:
* получить ссылку на предмет
* проверка на категория ITEM_ACTIVE

Код:
if Npc_GetInvItem(self,ItAm_AmulettOfDeath_Mis) // у НПС есть предмет, получаем на него ссылку
{
    if (item.flags & ITEM_ACTIVE) // предмет экипирован
    {
        self.aivar[AIV_SpellLevel] += 1; // бонус
    };
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
можно конечно попробовать сделать и по науке, в прошлый раз я писал что то подобное про руну:
* получить ссылку на предмет
* проверка на категория ITEM_ACTIVE

Код:
if Npc_GetInvItem(self,ItAm_AmulettOfDeath_Mis) // у НПС есть предмет, получаем на него ссылку
{
    if (item.flags & ITEM_ACTIVE) // предмет экипирован
    {
        self.aivar[AIV_SpellLevel] += 1; // бонус
    };
};
Работает. Благодарю.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
KirTheSeeker, лучше вынеси эти проверки в файл с C_BonusKDFSpellArmor и проверки на экипированное оружие туда же. что бы проверки на экипированные шмотки были в одном месте
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
[TAB=PLAYER_TALENT_RUNES ]
Daedalus:
 if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
            {
                if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true)         { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true)  { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Firestorm] == true)        { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true)   { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true)      { self.aivar[AIV_SpellLevel] += 1; };
                if (PLAYER_TALENT_RUNES [SPL_Firerain] == true)         { self.aivar[AIV_SpellLevel] += 1; };
            };
если герой изучил заклинания огня, то это знание будет увеличивать уровень(ущерб) от спелла
[/TAB]
[/TABS]
Что-то мне не удаётся заставить данный бонус работать на Рокфеллере. Закомментировал Пирокинез, но ситуация не поменялась. Или эти проверки будут работать только для ГГ?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565
KirTheSeeker, А если Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her) заменить на NPC_IsPlayer(self) ?
Правда с рокфеллером тоже может не сканать, т.к. к нему куча всего привязана.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
KirTheSeeker, А если Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her) заменить на NPC_IsPlayer(self) ?
Правда с рокфеллером тоже может не сканать, т.к. к нему куча всего привязана.
Короче, сначала стоит проверить на ГГ, честно прокачав его в мага у помощника?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565
Короче, сначала стоит проверить на ГГ, честно прокачав его в мага у помощника?
конечно)
Но есть еще PC_E3Mage - это тоже PC_Hero:
Daedalus:
instance PC_Hero(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 0;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 0;
    exp_next = 500;
    lp = 0;
    attribute[ATR_STRENGTH] = 10;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 40;
    attribute[ATR_HITPOINTS] = 40;
    Mdl_SetVisual(self,"HUMANS.MDS");
    Mdl_SetVisualBody(self,"hum_body_Naked0",9,0,"Hum_Head_Pony",Face_N_Player,0,NO_ARMOR);
    B_SetFightSkills(self,10);
};

instance PC_L10(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_MIL;
    id = 0;
    voice = 15;
    level = 10;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 500 * ((level + 1) / 2) * (level + 1);
    exp_next = 500 * ((level + 2) / 2) * (level + 1);
    lp = 0;
    attribute[ATR_STRENGTH] = 83;
    attribute[ATR_DEXTERITY] = 32;
    attribute[ATR_MANA_MAX] = 64;
    attribute[ATR_MANA] = 64;
    attribute[ATR_HITPOINTS_MAX] = 148;
    attribute[ATR_HITPOINTS] = 148;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ITAR_Mil_L);
    B_AddFightSkill(self,NPC_TALENT_1H,30);
    B_AddFightSkill(self,NPC_TALENT_2H,10);
    B_AddFightSkill(self,NPC_TALENT_BOW,10);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,ItMi_Gold,500);
    CreateInvItems(self,ItRw_Arrow,100);
    EquipItem(self,ItMw_Nagelkeule2);
    EquipItem(self,ItRw_Bow_L_01);
};

instance PC_L20(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_MIL;
    id = 0;
    voice = 15;
    level = 20;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 500 * ((level + 1) / 2) * (level + 1);
    exp_next = 500 * ((level + 2) / 2) * (level + 1);
    lp = 40;
    attribute[ATR_STRENGTH] = 106;
    attribute[ATR_DEXTERITY] = 54;
    attribute[ATR_MANA_MAX] = 118;
    attribute[ATR_MANA] = 35;
    attribute[ATR_HITPOINTS_MAX] = 280;
    attribute[ATR_HITPOINTS] = 280;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ITAR_RANGER_Addon);
    B_AddFightSkill(self,NPC_TALENT_1H,60);
    B_AddFightSkill(self,NPC_TALENT_2H,30);
    B_AddFightSkill(self,NPC_TALENT_BOW,10);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,ItMi_Gold,1000);
    CreateInvItems(self,ItRw_Arrow,100);
    CreateInvItems(self,ItRw_Bolt,100);
    EquipItem(self,ItMw_Rubinklinge);
    EquipItem(self,ItRw_Crossbow_M_02);
    CreateInvItems(self,ItRu_PalLight,1);
    CreateInvItems(self,ItRu_PalLightHeal,1);
    CreateInvItems(self,ItRu_PalHolyBolt,1);
};

instance PC_L40(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 40;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 500 * ((level + 1) / 2) * (level + 1);
    exp_next = 500 * ((level + 2) / 2) * (level + 1);
    lp = 60;
    attribute[ATR_STRENGTH] = 159;
    attribute[ATR_DEXTERITY] = 76;
    attribute[ATR_MANA_MAX] = 172;
    attribute[ATR_MANA] = 172;
    attribute[ATR_HITPOINTS_MAX] = 520;
    attribute[ATR_HITPOINTS] = 520;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ItAr_PAL_M);
    B_AddFightSkill(self,NPC_TALENT_1H,90);
    B_AddFightSkill(self,NPC_TALENT_2H,60);
    B_AddFightSkill(self,NPC_TALENT_BOW,10);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    CreateInvItems(self,ItMi_Gold,2000);
    CreateInvItems(self,ItRw_Bolt,100);
    EquipItem(self,ItMw_1H_Blessed_02);
    EquipItem(self,ItRw_Crossbow_M_02);
    CreateInvItems(self,ItKE_lockpick,10);
    CreateInvItems(self,ItMi_Flask,2);
    CreateInvItems(self,ItPo_Health_02,10);
    CreateInvItems(self,ItPo_Speed,5);
    CreateInvItems(self,ItLsTorch,50);
    CreateInvItems(self,ItRu_PalLight,1);
    CreateInvItems(self,ItRu_PalLightHeal,1);
    CreateInvItems(self,ItRu_PalHolyBolt,1);
    CreateInvItems(self,ItRu_PalMediumHeal,1);
    CreateInvItems(self,ItRu_PalRepelEvil,1);
};

instance PC_L60(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 60;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 500 * ((level + 1) / 2) * (level + 1);
    exp_next = 500 * ((level + 2) / 2) * (level + 1);
    lp = 60;
    attribute[ATR_STRENGTH] = 228;
    attribute[ATR_DEXTERITY] = 98;
    attribute[ATR_MANA_MAX] = 234;
    attribute[ATR_MANA] = 234;
    attribute[ATR_HITPOINTS_MAX] = 760;
    attribute[ATR_HITPOINTS] = 760;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ItAr_PAl_H);
    B_AddFightSkill(self,NPC_TALENT_1H,90);
    B_AddFightSkill(self,NPC_TALENT_2H,60);
    B_AddFightSkill(self,NPC_TALENT_BOW,10);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
    CreateInvItems(self,ItMi_Gold,3000);
    CreateInvItems(self,ItRw_Bolt,100);
    EquipItem(self,ItMw_1H_Blessed_03);
    EquipItem(self,ItRw_Crossbow_M_02);
    CreateInvItems(self,ItRu_PalLight,1);
    CreateInvItems(self,ItRu_PalLightHeal,1);
    CreateInvItems(self,ItRu_PalHolyBolt,1);
    CreateInvItems(self,ItRu_PalMediumHeal,1);
    CreateInvItems(self,ItRu_PalRepelEvil,1);
    CreateInvItems(self,ItRu_PalFullHeal,1);
    CreateInvItems(self,ItRu_PalDestroyEvil,1);
};

instance PC_E3Mage(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_KDF;
    id = 0;
    voice = 15;
    level = 31;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 248000;
    exp_next = 264000;
    lp = 0;
    attribute[ATR_STRENGTH] = 50;
    attribute[ATR_DEXTERITY] = 50;
    attribute[ATR_MANA_MAX] = 200;
    attribute[ATR_MANA] = 200;
    attribute[ATR_HITPOINTS_MAX] = 500;
    attribute[ATR_HITPOINTS] = 500;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ItAr_KDF_H);
    B_AddFightSkill(self,NPC_TALENT_1H,40);
    B_AddFightSkill(self,NPC_TALENT_2H,30);
    B_AddFightSkill(self,NPC_TALENT_BOW,20);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
    Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_RUNES,1);
    Npc_SetTalentSkill(self,NPC_TALENT_ALCHEMY,1);
    Npc_SetTalentSkill(self,NPC_TALENT_TAKEANIMALTROPHY,1);
    PLAYER_TALENT_ALCHEMY[POTION_Health_01] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Health_02] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Health_03] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Mana_01] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Mana_02] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Mana_03] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Speed] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Perm_STR] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Perm_DEX] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Perm_Mana] = TRUE;
    PLAYER_TALENT_ALCHEMY[POTION_Perm_Health] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Teeth] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Fur] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Heart] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_ShadowHorn] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FireTongue] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFWing] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFSting] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Mandibles] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CrawlerPlate] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DrgSnapperHorn] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DragonScale] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DragonBlood] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Light] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Firebolt] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Icebolt] = TRUE;
    PLAYER_TALENT_RUNES[SPL_LightHeal] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SummonGoblinSkeleton] = TRUE;
    PLAYER_TALENT_RUNES[SPL_InstantFireball] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Zap] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SummonWolf] = TRUE;
    PLAYER_TALENT_RUNES[SPL_WindFist] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Sleep] = TRUE;
    PLAYER_TALENT_RUNES[SPL_MediumHeal] = TRUE;
    PLAYER_TALENT_RUNES[SPL_LightningFlash] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ChargeFireball] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SummonSkeleton] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Fear] = TRUE;
    PLAYER_TALENT_RUNES[SPL_IceCube] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ChargeZap] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SummonGolem] = TRUE;
    PLAYER_TALENT_RUNES[SPL_DestroyUndead] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Pyrokinesis] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Firestorm] = TRUE;
    PLAYER_TALENT_RUNES[SPL_IceWave] = TRUE;
    PLAYER_TALENT_RUNES[SPL_SummonDemon] = TRUE;
    PLAYER_TALENT_RUNES[SPL_FullHeal] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Firerain] = TRUE;
    PLAYER_TALENT_RUNES[SPL_BreathOfDeath] = TRUE;
    PLAYER_TALENT_RUNES[SPL_MassDeath] = TRUE;
    PLAYER_TALENT_RUNES[SPL_ArmyOfDarkness] = TRUE;
    PLAYER_TALENT_RUNES[SPL_Shrink] = TRUE;
    EquipItem(self,ItMw_1h_MISC_Sword);
    EquipItem(self,ItAm_Mana_01);
    EquipItem(self,ItRu_Light);
    EquipItem(self,ItRu_InstantFireball);
    EquipItem(self,ItRu_IceCube);
    EquipItem(self,ItRu_FullHeal);
    EquipItem(self,ItRu_Firerain);
    EquipItem(self,ItRu_LightningFlash);
    EquipItem(self,ItRu_Shrink);
    CreateInvItems(self,ItMi_Gold,100);
    CreateInvItems(self,ItRu_MassDeath,1);
    CreateInvItems(self,ItRu_ArmyOfDarkness,1);
    CreateInvItems(self,ItRu_SumGol,1);
    CreateInvItems(self,ItSc_TrfSheep,5);
    CreateInvItems(self,ItSc_TrfWolf,5);
    CreateInvItems(self,ItSc_TrfDragonSnapper,3);
    CreateInvItems(self,ItMi_Flask,10);
    CreateInvItems(self,ItMi_RuneBlank,10);
    CreateInvItems(self,ItMi_Sulfur,10);
    CreateInvItems(self,ItMi_Quartz,10);
    CreateInvItems(self,ItMi_Pitch,10);
    CreateInvItems(self,ItMi_Rockcrystal,10);
    CreateInvItems(self,ItMi_Aquamarine,10);
    CreateInvItems(self,ItMi_HolyWater,10);
    CreateInvItems(self,ItMi_Coal,10);
    CreateInvItems(self,ItMi_DarkPearl,10);
    CreateInvItems(self,ItPl_SwampHerb,10);
    CreateInvItems(self,ItPl_Mana_Herb_01,10);
    CreateInvItems(self,ItPl_Mana_Herb_02,10);
    CreateInvItems(self,ItPl_Mana_Herb_03,10);
    CreateInvItems(self,ItPl_Health_Herb_01,10);
    CreateInvItems(self,ItPl_Health_Herb_02,10);
    CreateInvItems(self,ItPl_Health_Herb_03,10);
    CreateInvItems(self,ItPl_Dex_Herb_01,10);
    CreateInvItems(self,ItPl_Strength_Herb_01,10);
    CreateInvItems(self,ItPl_Speed_Herb_01,10);
    CreateInvItems(self,ItPl_Mushroom_01,10);
    CreateInvItems(self,ItPl_Mushroom_02,10);
    CreateInvItems(self,ItPl_Forestberry,10);
    CreateInvItems(self,ItPl_Blueplant,10);
    CreateInvItems(self,ItPl_Planeberry,10);
    CreateInvItems(self,ItPl_Temp_Herb,10);
    CreateInvItems(self,ItPl_Perm_Herb,10);
    CreateInvItems(self,ItPo_Mana_01,10);
    CreateInvItems(self,ItPo_Mana_02,5);
    CreateInvItems(self,ItPo_Mana_03,1);
    CreateInvItems(self,ItPo_Health_01,10);
    CreateInvItems(self,ItPo_Health_02,5);
    CreateInvItems(self,ItPo_Health_03,1);
    CreateInvItems(self,ItPo_Speed,5);
};

instance PC_E3Paladin(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_PAL;
    id = 0;
    voice = 15;
    level = 31;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 248000;
    exp_next = 264000;
    lp = 0;
    attribute[ATR_STRENGTH] = 100;
    attribute[ATR_DEXTERITY] = 100;
    attribute[ATR_MANA_MAX] = 50;
    attribute[ATR_MANA] = 50;
    attribute[ATR_HITPOINTS_MAX] = 500;
    attribute[ATR_HITPOINTS] = 500;
    B_SetNpcVisual(self,MALE,"Hum_Head_Pony",Face_N_Player,BodyTex_N,ItAr_PAl_H);
    B_AddFightSkill(self,NPC_TALENT_1H,100);
    B_AddFightSkill(self,NPC_TALENT_2H,90);
    B_AddFightSkill(self,NPC_TALENT_BOW,80);
    B_AddFightSkill(self,NPC_TALENT_CROSSBOW,70);
    Npc_SetTalentSkill(self,NPC_TALENT_MAGE,0);
    Npc_SetTalentSkill(self,NPC_TALENT_PICKLOCK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,1);
    Npc_SetTalentSkill(self,NPC_TALENT_SMITH,1);
    Npc_SetTalentSkill(self,NPC_TALENT_TAKEANIMALTROPHY,1);
    PLAYER_TALENT_SMITH[WEAPON_Common] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Special_01] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_Special_01] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Special_02] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_Special_02] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Special_03] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_Special_03] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Special_04] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_2H_Special_04] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Teeth] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Fur] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Heart] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_ShadowHorn] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_FireTongue] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFWing] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFSting] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Mandibles] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_CrawlerPlate] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DrgSnapperHorn] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DragonScale] = TRUE;
    PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_DragonBlood] = TRUE;
    EquipItem(self,ItMw_2h_Pal_Sword);
    EquipItem(self,ItRw_Bow_H_01);
    CreateInvItems(self,ItRw_Crossbow_H_01,1);
    CreateInvItems(self,ItRw_Arrow,1000);
    CreateInvItems(self,ItRw_Bolt,1000);
    EquipItem(self,ItAm_Strg_01);
    EquipItem(self,ItRu_PalMediumHeal);
    EquipItem(self,ItRu_PalRepelEvil);
    CreateInvItems(self,ItMi_Gold,100);
    CreateInvItems(self,ItMi_Nugget,50);
    CreateInvItems(self,ItMiSwordraw,10);
    CreateInvItems(self,ItAt_DragonBlood,10);
    CreateInvItems(self,ItSc_InstantFireball,10);
    CreateInvItems(self,ItSc_TrfSheep,5);
    CreateInvItems(self,ItSc_TrfWolf,5);
    CreateInvItems(self,ItSc_TrfDragonSnapper,3);
    CreateInvItems(self,ItMi_Flask,10);
    CreateInvItems(self,ItMi_RuneBlank,10);
    CreateInvItems(self,ItPo_Mana_01,10);
    CreateInvItems(self,ItPo_Mana_02,5);
    CreateInvItems(self,ItPo_Mana_03,1);
    CreateInvItems(self,ItPo_Health_01,10);
    CreateInvItems(self,ItPo_Health_02,5);
    CreateInvItems(self,ItPo_Health_03,1);
    CreateInvItems(self,ItPo_Speed,5);
};

instance PC_Bandit(Npc_Default)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 10;
    npcType = npctype_main;
    bodyStateInterruptableOverride = TRUE;
    exp = 0;
    exp_next = 500;
    lp = 0;
    attribute[ATR_STRENGTH] = 60;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 200;
    attribute[ATR_HITPOINTS] = 200;
    PLAYER_TALENT_SMITH[WEAPON_1H_Harad_01] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Harad_02] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Harad_03] = TRUE;
    PLAYER_TALENT_SMITH[WEAPON_1H_Harad_04] = TRUE;
    Npc_SetTalentSkill(self,NPC_TALENT_PICKPOCKET,1);
    B_AddFightSkill(self,NPC_TALENT_1H,60);
    Mdl_SetVisual(self,"HUMANS.MDS");
    Mdl_SetVisualBody(self,"hum_body_Naked0",9,0,"Hum_Head_Pony",Face_N_Player,0,ITAR_Thorus_Addon);
    EquipItem(self,ItMw_BeliarWeapon_1H_02);
    CreateInvItems(self,ItMi_Gold,1000);
    CreateInvItems(self,ItMi_GoldNugget_Addon,5);
    CreateInvItems(self,ItMw_BeliarWeapon_1H_01,1);
    CreateInvItems(self,ItMw_1h_Vlk_Dagger,1);
    CreateInvItems(self,ItMw_1H_Mace_L_01,1);
    CreateInvItems(self,ItAm_Addon_STR,1);
    CreateInvItems(self,ItRi_Addon_STR_01,1);
    CreateInvItems(self,ItRi_Addon_STR_02,1);
    CreateInvItems(self,ITAR_Leather_L,1);
    CreateInvItems(self,ItAr_Sld_L,1);
    CreateInvItems(self,itar_sld_M,1);
    CreateInvItems(self,ItAr_Sld_H,1);
    CreateInvItems(self,ItAr_MIL_M,1);
    CreateInvItems(self,ItAr_KDF_H,1);
    CreateInvItems(self,ItAr_NOV_L,1);
    CreateInvItems(self,ItBE_Addon_Leather_01,1);
    CreateInvItems(self,ItBE_Addon_SLD_01,1);
    CreateInvItems(self,ItBE_Addon_MIL_01,1);
    CreateInvItems(self,ItBE_Addon_MC,1);
    CreateInvItems(self,ItBE_Addon_KDF_01,1);
    CreateInvItems(self,ItBE_Addon_NOV_01,1);
    CreateInvItems(self,ItMi_Addon_Joint_01,2);
    CreateInvItems(self,ItPo_Addon_Geist_01,2);
    CreateInvItems(self,ItPo_Addon_Geist_02,2);
    CreateInvItems(self,ItWr_Addon_BookXP250,1);
    CreateInvItems(self,ItWr_Addon_BookXP500,1);
    CreateInvItems(self,ItWr_Addon_BookXP1000,1);
    CreateInvItems(self,ItWr_Addon_BookLP2,1);
    CreateInvItems(self,ItWr_Addon_BookLP3,1);
    CreateInvItems(self,ItWr_Addon_BookLP5,1);
    CreateInvItems(self,ItWr_Addon_BookLP8,1);
    CreateInvItems(self,ItFo_Addon_SchlafHammer,1);
    CreateInvItems(self,ItFo_Addon_LousHammer,1);
    CreateInvItems(self,ItFo_Booze,5);
    CreateInvItems(self,ItMw_2H_Axe_L_01,1);
    CreateInvItems(self,ItPl_SwampHerb,10);
    CreateInvItems(self,ItPl_Beet,10);
    CreateInvItems(self,ItAt_SharkTeeth,10);
    CreateInvItems(self,ItFo_Addon_Rum,20);
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Хм, прокачал ГГ так, чтобы Spell Lvl составлял 5 + (бонус за мастерство огня). Отладчик показывает вот что:
Daedalus:
 C_BonusSpellMana[Я.0] = 3 SpellLevel
  C_BonusFireSpellEquipment[Я.0]  --> return FALSE
Spell_Logic_Firebolt[Я 0] // manainvested =0, AIV_SpellLevel = 10
Spell_Logic_Firebolt[Я 0] // manainvested =5, AIV_SpellLevel = 0
    Spell_Cast_zFirebolt[Я 0]
  C_BonusSpellMana[Я.0] = 3 SpellLevel
  C_BonusFireSpellEquipment[Я.0]  --> return FALSE
Spell_Logic_Firebolt[Я 0] // manainvested =0, AIV_SpellLevel = 10
Spell_Logic_Firebolt[Я 0] // manainvested =5, AIV_SpellLevel = 0
    Spell_Cast_zFirebolt[Я 0]
  C_BonusSpellMana[Я.0] = 3 SpellLevel
  C_BonusFireSpellEquipment[Я.0]  --> return FALSE
Spell_Logic_Firebolt[Я 0] // manainvested =0, AIV_SpellLevel = 10
Spell_Logic_Firebolt[Я 0] // manainvested =5, AIV_SpellLevel = 0
  Spell_Collide_517[Гигантская крыса.13703]  --> return COLL_DOEVERYTHING
Npc_IsEquippedItMwDAG...
Npc_IsEquippedItMwDAG --> return false
Npc_IsEquippedItMwRPR...
Npc_IsEquippedItMwRPR --> return false
Npc_IsEquippedItMw2hSTF...
Npc_IsEquippedItMw2hSTF --> return false
    Spell_Cast_zFirebolt[Я 0]

Что мне нужно поправить в скрипте C_BonusFireSpellEquipment, чтобы он тоже показывал добавляемый Spell Lvl?
Union:
test(!TRUE ) { const int TRUE = 1; };
test(!FALSE ){ const int FALSE = 0; };

test (!ITAR_KDF_M)      {   instance ITAR_KDF_M(C_Item) {}      };
test (!ITAR_KDF_S)      {   instance ITAR_KDF_S(C_Item) {}      };
test (!ITAR_BlackMage)  {   instance ITAR_BlackMage(C_Item) {}  };


func int C_BonusFireSpellEquipment(var C_Npc npc)
{
    if (Npc_HasEquippedArmor(npc) == false)
    {
        Hlp_PrintConsole(Str_Format("  C_BonusFireSpellEquipment[%s.%i]  --> return FALSE", npc.name, npc.id));
        return FALSE;
    };

    var c_item itm;
    itm = Npc_GetEquippedArmor(npc); // получаем ссылку на инстанцию экипированной брони

    if       (Hlp_IsItem(itm, ITAR_KDF_L)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за мантию мага Огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_M)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за лёгкую мантию мага Огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_S)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 2; }   // бонус за тяжёлую мантию мага Огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_H)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 3; }   // бонус за мантию высшего мага Огня
    else if  (Hlp_IsItem(itm, ITAR_Dementor)  == TRUE)  { npc.aivar[AIV_SpellLevel] -= 1; }   // штраф за мантию ищущего
    else if  (Hlp_IsItem(itm, ITAR_BlackMage) == TRUE)  { npc.aivar[AIV_SpellLevel] -= 2; }   // штраф за мантию мага тьмы
    else if  (Hlp_IsItem(itm, ITAR_Xardas)    == TRUE)  { npc.aivar[AIV_SpellLevel] -= 3; };  // штраф за мантию некроманта


    if (Npc_HasEquippedMeleeWeapon(self) == false)
    {
        Hlp_PrintConsole(Str_Format("  C_BonusFireSpellEquipment[%s.%i]  --> return FALSE", npc.name, npc.id));
        return FALSE;
    };
    
    itm = Npc_GetEquippedMeleeWeapon(npc); // получаем ссылку на инстанцию экипированного оружия
    
    if       (Hlp_IsItem(itm, ITMW_ADDON_STAB01)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за посох магов Огня
    else if  (Hlp_IsItem(itm, ITMW_ADDON_STAB04)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 2; };  // бонус за мощный посох магов Огня

    if Npc_GetInvItem(self,ItAm_AmulettOfDeath_Mis) // У НПС есть амулет, получаем на него ссылку.
    {
        if (item.flags & ITEM_ACTIVE) // Амулет экипирован
        {
            self.aivar[AIV_SpellLevel] += 1; // Бонус
        };
    };
    
    Hlp_PrintConsole(Str_Format("  C_BonusFireSpellEquipment[%s.%i]  --> return TRUE", npc.name, npc.id));

    return TRUE; 
};
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565
Что мне нужно поправить в скрипте C_BonusFireSpellEquipment, чтобы он тоже показывал добавляемый Spell Lvl?
мммммм. Гламурненько))
перед return TRUE;
Hlp_PrintConsole(Str_Format(" self.aivar[AIV_SpellLevel] = %s", self.aivar[AIV_SpellLevel]));
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
KirTheSeeker, А если Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her) заменить на NPC_IsPlayer(self) ?
Правда с рокфеллером тоже может не сканать, т.к. к нему куча всего привязана.
Её вопрос:
Подскажите, пожалуйста, как корректно поменять данный код, чтобы добавлялся 1 Spell Lvl, если NPC владеет созданием всех рун школы Огня?
Daedalus:
//  Расчёт уровня заклинания
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 2;         // Базовый урон 20*2 = 40

        C_BonusSpellMana(self);                 // Бонусы от текущей маны до +6
      
        C_BonusFireSpellEquipment(self);        // Бонусы от надетой экипировки Огня от +5 до -5
      
        if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
        {
            // доп урон за умения изгатавливать огненные руны
            if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true)         { self.aivar[AIV_SpellLevel] += 1; };
            if (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true)  { self.aivar[AIV_SpellLevel] += 1; };
            if (PLAYER_TALENT_RUNES [SPL_Firestorm] == true)        { self.aivar[AIV_SpellLevel] += 1; };
            if (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true)   { self.aivar[AIV_SpellLevel] += 1; };
        //  if (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true)      { self.aivar[AIV_SpellLevel] += 1; };
            if (PLAYER_TALENT_RUNES [SPL_Firerain] == true)         { self.aivar[AIV_SpellLevel] += 1; };
        };
  
    };

В данном коде, насколько я понял, добавляется 1 Spell Lvl за изучение создания КАЖДОЙ из указанных рун, а это уже перебор.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.156
Баллы
1.565

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.845
Благодарности
1.209
Баллы
380
Подскажите, пожалуйста, как корректно поменять данный код, чтобы добавлялся 1 Spell Lvl, если NPC владеет созданием всех рун школы Огня?
Одно условие, плюс логические операции "И".
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Т.е. добавить только в том случае, если все ищучены?
Именно.

логические операции "И".
Т.е. вместо if поставить во всех строках после первой "||"?
Попробую...
А, стоп, или вы предлагаете прописать все требуемые заклинания одной строкой через &&?
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Или так?
Daedalus:
 if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
        {
            // доп урон за умения изгатавливать огненные руны
            if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true) && (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true) && (PLAYER_TALENT_RUNES [SPL_Firestorm] == true) && (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true) && (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true) && (PLAYER_TALENT_RUNES [SPL_Firerain] == true)     { self.aivar[AIV_SpellLevel] += 1; };
        };
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.923
Благодарности
926
Баллы
275
Такое тоже лучше вынести в отдельную функцию.
Daedalus:
if C_IsNpc(self,pc_hero)
|| C_IsNpc(self,PC_Rockefeller)
|| C_IsNpc(self,PC_MageTest)
{
    if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true) // руна первого круга
    && (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true) // руна 2 круга
    && (PLAYER_TALENT_RUNES [SPL_Firestorm] == true) // руна 3 круга
    && (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true) // руна 4 круга
    && (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true) // руна пятого круга
    && (PLAYER_TALENT_RUNES [SPL_Firerain] == true)
    {
        // доп урон за умения изгатавливать огненные руны
        self.aivar[AIV_SpellLevel] += 1;
    };
};
Пост автоматически объединён:

внутри C_BonusFireSpellEquipment вместо self пиши npc. и return false надо убрать, то есть
Daedalus:
test (!ITAR_KDF_M)      {   instance ITAR_KDF_M(C_Item) {}      };
test (!ITAR_KDF_S)      {   instance ITAR_KDF_S(C_Item) {}      };
test (!ITAR_BlackMage)  {   instance ITAR_BlackMage(C_Item) {}  };


func int C_BonusFireSpellEquipment(var C_Npc npc)
{
    if (Npc_HasEquippedArmor(npc) == true)
    {
        var c_item itm;
        itm = Npc_GetEquippedArmor(npc); // получаем ссылку на инстанцию экипированной брони

        if       (Hlp_IsItem(itm, ITAR_KDF_L)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за мантию мага Огня
        else if  (Hlp_IsItem(itm, ITAR_KDF_M)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за лёгкую мантию мага Огня
        else if  (Hlp_IsItem(itm, ITAR_KDF_S)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 2; }   // бонус за тяжёлую мантию мага Огня
        else if  (Hlp_IsItem(itm, ITAR_KDF_H)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 3; }   // бонус за мантию высшего мага Огня
        else if  (Hlp_IsItem(itm, ITAR_Dementor)  == TRUE)  { npc.aivar[AIV_SpellLevel] -= 1; }   // штраф за мантию ищущего
        else if  (Hlp_IsItem(itm, ITAR_BlackMage) == TRUE)  { npc.aivar[AIV_SpellLevel] -= 2; }   // штраф за мантию мага тьмы
        else if  (Hlp_IsItem(itm, ITAR_Xardas)    == TRUE)  { npc.aivar[AIV_SpellLevel] -= 3; };  // штраф за мантию некроманта
    };

    if (Npc_HasEquippedMeleeWeapon(npc) == true)
    {
        itm = Npc_GetEquippedMeleeWeapon(npc); // получаем ссылку на инстанцию экипированного оружия
 
        if       (Hlp_IsItem(itm, ITMW_ADDON_STAB01)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 1; }   // бонус за посох магов Огня
        else if  (Hlp_IsItem(itm, ITMW_ADDON_STAB04)     == TRUE)  { npc.aivar[AIV_SpellLevel] += 2; };  // бонус за мощный посох магов Огня
    };
 
    if Npc_GetInvItem(npc,ItAm_AmulettOfDeath_Mis) // У НПС есть амулет, получаем на него ссылку.
    {
        if (item.flags & ITEM_ACTIVE) // Амулет экипирован
        {
            npc.aivar[AIV_SpellLevel] += 1; // Бонус
        };
    };
    // проверка для Глаза Инноса??
 
    Hlp_PrintConsole(Str_Format("  C_BonusFireSpellEquipment[%s.%i]  --> return TRUE", npc.name, npc.id));

    return TRUE;
};
Пост автоматически объединён:

***

а вообще знание магической формулы заклинания(умение изготавливать руну), это то что должно давать максимальный бонус. а у тебя получается что это самый слабый бонус.
 
Последнее редактирование:
Сверху Снизу