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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

    Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
    По желанию, аргументировать свой выбор можете в теме обсуждения голосования.

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
  • Первое сообщение
  • #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 · Просмотры: 6
Последнее редактирование модератором:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
так не понятно. добавь для отладчика инфу
Daedalus:
func void Spell_Cast_zFirebolt()
    {
        Hlp_PrintConsole(Str_Format("    Spell_Cast_zFirebolt[%s %i], self.name, self.id));
        // счётчик для НПС (не герой)
        self.aivar[AIV_SelectSpell] += 1;
    };
Что-то не так. Из-за последних двух функций игра отказывается запускаться.
Daedalus:
META
{
  After  = _Spell_Prototypes.d;
  Engine = G2A;
};


const int spellID_Firebolt          = 517;          // должно быть более 500
const int SPL_Cost_ItRu_Firebolt    = 5;
const int SPL_Cost_ItSc_Firebolt    = 1;
const int SPL_BaseDamage_Firebolt     = 15;
const string NAME_zSPL_Firebolt     = "Fire Bolt KirTheSeeker";

//---------------------------------------
//    Spell Item
//---------------------------------------
INSTANCE ItRu_FireBolt(C_Item)
{
    ItRu_FireBolt_old();
    spell   =     spellID_Firebolt;
};

INSTANCE ItSc_Firebolt(C_Item)
{
    ItSc_Firebolt_old();
    spell   =     spellID_Firebolt;
};


instance Spell_Firebolt_data(C_SPELL_DATA)
{
    instName        = "zFirebolt";              // инстанция Spell_zFirebolt
    spellID         = spellID_Firebolt;         // ID. должно быть больше 500
    spellName        = NAME_zSPL_Firebolt;       // отображается на экране при переключение заклинаний
    spellAniName    = "FBT";                    // "STM" "WHI" "MSD" "SLE" "HEA" "FBT" "FIB" "SUM" "TRF" "FEA" "FRZ"
    visualFxName    = "Firebolt";               // spellFX_Firebolt из файла VisualFxInst.d
    damage            = SPL_BaseDamage_Firebolt;  // урон !!!
    cost            = SPL_Cost_ItRu_Firebolt;   // как обрабатывает движок???
    energyType        = ATR_MANA;                 // требует ману
    //  Выбор типа заклинания по области ( как волна смерти) так и выбор типа с осколками ( как малая огненая буря)
    EffectType        = zSPL_DEFAULT;             // zSPL_TRANSFORM zSPL_AREA zSPL_SPREAD zSPL_DEFAULT
};


instance Spell_zFirebolt(C_Spell_Proto_G2NotR)       
{
    // ущерб берётся из C_SPELL_DATA
};

func int Spell_Logic_zFirebolt(var int manaInvested)
{   
    var int SPL_Cost_mana;                          // кол-во маны для каста
    var C_Item  itm;                                // для проверки брони и оружия
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero);  // ссылка на героя
    
    // проверка на наличие маны у НПС для каста
    if (manaInvested == 0)
    {
        SPL_Cost_mana = SPL_Cost_ItRu_Firebolt;  // необходимо маны для руны
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_ItSc_Firebolt; };// необходимо маны для свитка
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
    };   
        
    //
    //  Расчёт уровня заклинания
    //
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 3;     // базовый ущерб 15*3=45
            
    /*    if (self.guild == GIL_KDF)
        {
            self.aivar[AIV_SpellLevel] += 1;    // НПС - маг огня +5
            
            if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
            && (heroGIL_KDF2 == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;    // НПС это герой высший маг огня +5
            };
        };
    */

        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            if      (self.attribute[ATR_MANA] >= 80 * 5)    { self.aivar[AIV_SpellLevel]  += 5; }
            else if (self.attribute[ATR_MANA] >= 80 * 4)    { self.aivar[AIV_SpellLevel]  += 4; }
            else if (self.attribute[ATR_MANA] >= 80 * 3)    { self.aivar[AIV_SpellLevel]  += 3; }
            else if (self.attribute[ATR_MANA] >= 80 * 2)    { self.aivar[AIV_SpellLevel]  += 2; }
            else if (self.attribute[ATR_MANA] >= 80 * 1)    { self.aivar[AIV_SpellLevel]  += 1; };
        };
    
        if (Npc_HasEquippedMeleeWeapon(self) == true)
        {
            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 (KDFBelt_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; };
        };
    */
    
    };
    

    // текущий уровень заклинания
    Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, AIV_SpellLevel = %i", self.name, self.id,manaInvested, self.aivar[AIV_SpellLevel]));

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

    // каст
    return SPL_SENDCAST;
};

    func void Spell_Cast_zFirebolt()
    {
        Hlp_PrintConsole(Str_Format("Spell_Cast_zFirebolt[%s %i], self.name, self.id));
        // счётчик для НПС (не герой)
        self.aivar[AIV_SelectSpell] += 1;
    };

    func int Spell_Collide_517()
    {
        // прописать правила: штрафы и бонусы от огня
        Hlp_PrintConsole(Str_Format("  Spell_Collide_515[%s.%i]  --> return COLL_DOEVERYTHING", self.name, self.id));
        return COLL_DOEVERYTHING;
    };

1.png
Я не понимаю что и где там нужно добавить.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Daedalus:
    func void Spell_Cast_zFirebolt()
    {
        Hlp_PrintConsole(Str_Format("    Spell_Cast_zFirebolt[%s %i]", self.name, self.id));
        // счётчик для НПС (не герой)
        self.aivar[AIV_SelectSpell] += 1;
    };
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
не знаю скомпилирует ли он их в проект. это надо в том топике спрашивать. наверное скомпилирует.
Нет, при текущем коде не хочет компилировать:
1.png

Daedalus:
/*
const int SPL_Cost_Firebolt = 5;
const int SPL_Cost_Firebolt_Scroll = 1;
const int SPL_Damage_Firebolt = 15;
//const int SPL_Damage_Firebolt = 50;


instance Spell_Firebolt(C_Spell_Proto)
{
    time_per_mana = 0;
    damage_per_level = SPL_Damage_Firebolt;           
//    damagetype = DAM_MAGIC;
    damagetype = DAM_FIRE;
};


func int Spell_Logic_Firebolt(var int manaInvested)
{
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt_Scroll))
    {
        return SPL_SENDCAST;
    }
    else if(self.attribute[ATR_MANA] >= SPL_Cost_Firebolt)
    {
        return SPL_SENDCAST;
    };
    return SPL_SENDSTOP;
};


func void Spell_Cast_Firebolt()
{
    if(Npc_GetActiveSpellIsScroll(self))
    {
        self.attribute[ATR_MANA] -= SPL_Cost_Firebolt_Scroll;
    }
    else
    {
        self.attribute[ATR_MANA] -= SPL_Cost_Firebolt;
    };
    self.aivar[AIV_SelectSpell] += 1;
};
*/


const int spellID_Firebolt          = 517;          // должно быть более 500
const int SPL_Cost_ItRu_Firebolt    = 5;
const int SPL_Cost_ItSc_Firebolt    = 1;
const int SPL_BaseDamage_Firebolt     = 15;
const string NAME_zSPL_Firebolt     = "Fire Bolt KirTheSeeker";

//---------------------------------------
//    Spell Item
//---------------------------------------
INSTANCE ItRu_FireBolt_KTS(C_Item)
{
    ItRu_FireBolt();
    spell   =     spellID_Firebolt;
};

INSTANCE ItSc_Firebolt_KTS(C_Item)
{
    ItSc_Firebolt();
    spell   =     spellID_Firebolt;
};


instance Spell_Firebolt_data(C_SPELL_DATA)
{
    instName        = "zFirebolt";              // инстанция Spell_zFirebolt
    spellID         = spellID_Firebolt;         // ID. должно быть больше 500
    spellName        = NAME_zSPL_Firebolt;       // отображается на экране при переключение заклинаний
    spellAniName    = "FBT";                    // "STM" "WHI" "MSD" "SLE" "HEA" "FBT" "FIB" "SUM" "TRF" "FEA" "FRZ"
    visualFxName    = "Firebolt";               // spellFX_Firebolt из файла VisualFxInst.d
    damage            = SPL_BaseDamage_Firebolt;  // урон !!!
    cost            = SPL_Cost_ItRu_Firebolt;   // как обрабатывает движок???
    energyType        = ATR_MANA;                 // требует ману
    //  Выбор типа заклинания по области ( как волна смерти) так и выбор типа с осколками ( как малая огненая буря)
    EffectType        = zSPL_DEFAULT;             // zSPL_TRANSFORM zSPL_AREA zSPL_SPREAD zSPL_DEFAULT
};


instance Spell_zFirebolt(C_Spell_Proto_G2NotR)       
{
    // ущерб берётся из C_SPELL_DATA
};

func int Spell_Logic_zFirebolt(var int manaInvested)
{   
    var int SPL_Cost_mana;                          // кол-во маны для каста
    var C_Item  itm;                                // для проверки брони и оружия
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero);  // ссылка на героя
    
    // проверка на наличие маны у НПС для каста
    if (manaInvested == 0)
    {
        SPL_Cost_mana = SPL_Cost_ItRu_Firebolt;  // необходимо маны для руны
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_ItSc_Firebolt; };// необходимо маны для свитка
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
    };   
        
    //
    //  Расчёт уровня заклинания
    //
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 3;     // базовый ущерб 15*3=45
            
    /*    if (self.guild == GIL_KDF)
        {
            self.aivar[AIV_SpellLevel] += 1;    // НПС - маг огня +5
            
            if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
            && (heroGIL_KDF2 == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;    // НПС это герой высший маг огня +5
            };
        };
    */

        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            if      (self.attribute[ATR_MANA] >= 80 * 6)    { self.aivar[AIV_SpellLevel]  += 6; }
            else if (self.attribute[ATR_MANA] >= 80 * 5)    { self.aivar[AIV_SpellLevel]  += 5; }
            else if (self.attribute[ATR_MANA] >= 80 * 4)    { self.aivar[AIV_SpellLevel]  += 4; }
            else if (self.attribute[ATR_MANA] >= 80 * 3)    { self.aivar[AIV_SpellLevel]  += 3; }
            else if (self.attribute[ATR_MANA] >= 80 * 2)    { self.aivar[AIV_SpellLevel]  += 2; }
            else if (self.attribute[ATR_MANA] >= 80 * 1)    { self.aivar[AIV_SpellLevel]  += 1; };
        };
    
        if (Npc_HasEquippedMeleeWeapon(self) == true)
        {
            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 (KDFBelt_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; };
        };
    */
    
    };
    

    // текущий уровень заклинания
    Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, AIV_SpellLevel = %i", self.name, self.id,manaInvested, self.aivar[AIV_SpellLevel]));

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

    // каст
    return SPL_SENDCAST;
};

     func void Spell_Cast_zFirebolt()
    {
        Hlp_PrintConsole(Str_Format("    Spell_Cast_zFirebolt[%s %i]", self.name, self.id));
        // счётчик для НПС (не герой)
        self.aivar[AIV_SelectSpell] += 1;
    };

    func int Spell_Collide_517()
    {
        // прописать правила: штрафы и бонусы от огня
        Hlp_PrintConsole(Str_Format("  Spell_Collide_515[%s.%i]  --> return COLL_DOEVERYTHING", self.name, self.id));
        return COLL_DOEVERYTHING;
    };
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
KirTheSeeker, в скриптинге, если ты пишешь:
chtototu(); - это означает, что ты запускаешь какую-то функцию, на исполнение.
а ItSc_Firebolt и ItRu_FireBolt это ни каким боком не функция выполнения. Это инстанции, в которых нет каких-то действий...
Следовательно код, который у тебя написан - не правильный.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
KirTheSeeker, в скриптинге, если ты пишешь:
chtototu(); - это означает, что ты запускаешь какую-то функцию, на исполнение.
а ItSc_Firebolt и ItRu_FireBolt это ни каким боком не функция выполнения. Это инстанции, в которых нет каких-то действий...
Следовательно код, который у тебя написан - не правильный.
Но из System/Autorun работал.
Подскажи, пожалуйста, как это можно поправить?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
Но из System/Autorun работал.
Подскажи, пожалуйста, как это можно поправить?
вот сюда
Код:
INSTANCE ItRu_FireBolt_KTS(C_Item)
{
    spell   =     spellID_Firebolt;
};

INSTANCE ItSc_Firebolt_KTS(C_Item)
{
    spell   =     spellID_Firebolt;
};
добавь все, что есть в ItRu_FireBolt() и в ItSc_Firebolt() соответственно.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
добавь все, что есть в ItRu_FireBolt() и в ItSc_Firebolt() соответственно.
Благодарю за наставление, но как-то это всё сложно. В смысле выглядит сильно сложнее прошлой версии, где просто через SpellLogic.
Попробую сначала прошлый вариант, с уменьшенным количеством уровней. Возможно, будет работать приемлемо.

Вопрос немного в сторону:
- Возможно ли через Spell_Logic настроить изменение визуального эффекта заклинания, при достижении определенного Spell Lvl? Я имею в виду, например, чтобы когда FireBolt/IceBolt удаётся разогнать до Spell Lvl = 10 , то визуально они бы менялись на InstantFireBall/IceLance соответственно?
Насколько понимаю, функционал у данных заклинаний абсолютно одинаков, просто вторые представляют из себя усиленные версии первых, БЕЗ дол. эффектов, вроде "поджигающих осколков" и т.п. При этом само количество заклинаний в игре ограничено, и тогда парочку освободившихся "слотов" можно было использовать как-то ещё.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
В смысле выглядит сильно сложнее прошлой версии, где просто через SpellLogic.
там такое же кол-во элементов собранные в один файл. соответственно если ты будешь полноценно править спеллы то в оригинальном коде это надо будет делать сразу в нескольких местах, с соблюдением строгих правил, а какие то вещи в принципе нельзя будет сделать.

настроить изменение визуального эффекта заклинания, при достижении определенного Spell Lvl
возможно, но это сложно и не будет решать той задачи которую ты обозначил.
Пост автоматически объединён:

При этом само количество заклинаний в игре ограничено, и тогда парочку освободившихся "слотов" можно было использовать как-то ещё.
эту проблему решает zSpells.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Ты считаешь более актуальным набить скрипты по каждому спеллу в AutoRun? Т.е. даже не пытаться переносить их в GS и компилировать?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Ты считаешь более актуальным набить скрипты по каждому спеллу в AutoRun? Т.е. даже не пытаться переносить их в GS и компилировать?
пока не будет понимание что работа по спелам сделана на 90% то да. ты можешь их собрать в отдельный том vdf, и туда же положить dll файл.
это позволит:
* тестить заклинания на оригинальной игре
* посылать информацию в отладчик
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех вновь. Подскажите, пожалуйста, а как корректно прописать штрафы, т.е. снижение уровня заклинания от роб ищущих и темных магов?
Daedalus:
META
{
  After  = _Spell_Prototypes.d;
  Engine = G2A;
};


const int spellID_Firebolt        = 517;          // должно быть более 500
const int SPL_Cost_ItRu_Firebolt  = 5;
const int SPL_Cost_ItSc_Firebolt  = 1;
const int SPL_BaseDamage_Firebolt = 15;
const string NAME_zSPL_Firebolt   = "Fire Bolt KirTheSeeker";

//---------------------------------------
//    Spell Item
//---------------------------------------
INSTANCE ItRu_FireBolt(C_Item)
{
    ItRu_FireBolt_old();
    spell   =     spellID_Firebolt;
};

INSTANCE ItSc_Firebolt(C_Item)
{
    ItSc_Firebolt_old();
    spell   =     spellID_Firebolt;
};


instance Spell_Firebolt_data(C_SPELL_DATA)
{
    instName        = "zFirebolt";              // инстанция Spell_zFirebolt
    spellID         = spellID_Firebolt;         // ID. должно быть больше 500
    spellName        = NAME_zSPL_Firebolt;       // отображается на экране при переключение заклинаний
    spellAniName    = "FBT";                    // "STM" "WHI" "MSD" "SLE" "HEA" "FBT" "FIB" "SUM" "TRF" "FEA" "FRZ"
    visualFxName    = "Firebolt";               // spellFX_Firebolt из файла VisualFxInst.d
    damage            = SPL_BaseDamage_Firebolt;  // урон !!!
    cost            = SPL_Cost_ItRu_Firebolt;   // как обрабатывает движок???
    energyType        = ATR_MANA;                 // требует ману
    //  Выбор типа заклинания по области ( как волна смерти) так и выбор типа с осколками ( как малая огненая буря)
    EffectType        = zSPL_DEFAULT;             // zSPL_TRANSFORM zSPL_AREA zSPL_SPREAD zSPL_DEFAULT
};


instance Spell_zFirebolt(C_Spell_Proto_G2NotR)      
{
    // ущерб берётся из C_SPELL_DATA
};

func int Spell_Logic_zFirebolt(var int manaInvested)
{  
    var int SPL_Cost_mana;                          // кол-во маны для каста
    var C_Item  itm;                                // для проверки брони и оружия
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero);  // ссылка на героя
   
    // проверка на наличие маны у НПС для каста
    if (manaInvested == 0)
    {
        SPL_Cost_mana = SPL_Cost_ItRu_Firebolt;  // необходимо маны для руны
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_ItSc_Firebolt; };// необходимо маны для свитка
       
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };  
    };  

    //  Расчёт уровня заклинания
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 3;     // Базовый урон 15*3 = 45

        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            if      (self.attribute[ATR_MANA] >= 80 * 5)    { self.aivar[AIV_SpellLevel]  += 5; }
            else if (self.attribute[ATR_MANA] >= 80 * 4)    { self.aivar[AIV_SpellLevel]  += 4; }
            else if (self.attribute[ATR_MANA] >= 80 * 3)    { self.aivar[AIV_SpellLevel]  += 3; }
            else if (self.attribute[ATR_MANA] >= 80 * 2)    { self.aivar[AIV_SpellLevel]  += 2; }
            else if (self.attribute[ATR_MANA] >= 80 * 1)    { self.aivar[AIV_SpellLevel]  += 1; };
        };
   
        if (Npc_HasEquippedMeleeWeapon(self) == true)
        {
            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_M) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;    // доп урон за старую мантию мага огня
            }
            else if  (Hlp_IsItem(itm, ITAR_KDF_H) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 2;    // доп урон за мантию высшего мага огня
            }
            else if  (Hlp_IsItem(itm, ITAR_KDF_S) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 2;    // доп урон за старую мантию высшего мага огня
            }
            else if  (Hlp_IsItem(itm, ITAR_Dementor) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += -1;    // штраф за мантию ищущего
            }
            else if  (Hlp_IsItem(itm, ITAR_BlackMage) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += -2;    // штраф за мантию мага тьмы
            }
            else if  (Hlp_IsItem(itm, ITAR_Xardas) == TRUE)
            {
                self.aivar[AIV_SpellLevel] += -3;    // штраф за мантию некроманта
            };
           
        };
       
        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; };
        };
   
    };  

    // текущий уровень заклинания
    Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, AIV_SpellLevel = %i", self.name, self.id,manaInvested, self.aivar[AIV_SpellLevel]));

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

    // каст
    return SPL_SENDCAST;
};


func void Spell_Cast_zFirebolt()
{
    Hlp_PrintConsole(Str_Format("    Spell_Cast_zFirebolt[%s %i]", self.name, self.id));
    // счётчик для НПС (не герой)
    self.aivar[AIV_SelectSpell] += 1;
};


func int Spell_Collide_517()
{
    // прописать правила: штрафы и бонусы от огня
    Hlp_PrintConsole(Str_Format("  Spell_Collide_515[%s.%i]  --> return COLL_DOEVERYTHING", self.name, self.id));
    return COLL_DOEVERYTHING;
};

Такой вариант не срабатывает.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
вынеси проверку на доспех в отдельный файл
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_BonusKDFSpellArmor(var C_Npc npc)
{
    if (Npc_HasEquippedArmor(npc) == fasle)
    {
        Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%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_H) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }    // доп урон за мантию высшего мага огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_S) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }   // доп урон за старую мантию высшего мага огня
    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; };   // штраф за мантию некроманта

// сюда же бонус пояса

     Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%s.%i]  --> return TRUE", npc.name, npc.id));


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

в основном файле
Daedalus:
func int Spell_Logic_zFirebolt(var int manaInvested)
{
    ...
    C_BonusKDFSpellArmor(self); // подсчёт бонусов от брони от +3 до -3
    ...
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
вынеси проверку на доспех в отдельный файл
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_BonusKDFSpellArmor(var C_Npc npc)
{
    if (Npc_HasEquippedArmor(npc) == fasle)
    {
        Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%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_H) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }    // доп урон за мантию высшего мага огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_S) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }   // доп урон за старую мантию высшего мага огня
    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; };   // штраф за мантию некроманта

// сюда же бонус пояса

     Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%s.%i]  --> return TRUE", npc.name, npc.id));


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

в основном файле
Daedalus:
func int Spell_Logic_zFirebolt(var int manaInvested)
{
    ...
    C_BonusKDFSpellArmor(self); // подсчёт бонусов от брони от +3 до -3
    ...
};
Закинул C_BonusKDFSpellArmor.d в System/Autorun, но при запуске вылезает ошибка:
3.png
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
добавь в начале файле

test(!TRUE ) { const int TRUE = 1; };
test(!FALSE ){ const int FALSE = 0; };
Не помогло. Выходит та же ошибка. Сейчас коды выглядят так:
Daedalus:
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_BonusKDFSpellArmor(var C_Npc npc)
{
    if (Npc_HasEquippedArmor(npc) == fasle)
    {
        Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%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_H) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }    // бонус за мантию высшего мага огня
    else if  (Hlp_IsItem(itm, ITAR_KDF_S) == TRUE)      { npc.aivar[AIV_SpellLevel] += 2;  }   // бонус за старую мантию высшего мага огня
    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; };   // штраф за мантию некроманта

// сюда же бонус пояса

    Hlp_PrintConsole(Str_Format("  C_BonusKDFSpellArmor[%s.%i]  --> return TRUE", npc.name, npc.id));

    return TRUE;
};

Daedalus:
META
{
  After  = _Spell_Prototypes.d;
  Engine = G2A;
};


const int spellID_Firebolt        = 517;          // должно быть более 500
const int SPL_Cost_ItRu_Firebolt  = 5;
const int SPL_Cost_ItSc_Firebolt  = 1;
const int SPL_BaseDamage_Firebolt = 15;
const string NAME_zSPL_Firebolt   = "Fire Bolt KirTheSeeker";

//---------------------------------------
//    Spell Item
//---------------------------------------
INSTANCE ItRu_FireBolt(C_Item)
{
    ItRu_FireBolt_old();
    spell   =     spellID_Firebolt;
};

INSTANCE ItSc_Firebolt(C_Item)
{
    ItSc_Firebolt_old();
    spell   =     spellID_Firebolt;
};


instance Spell_Firebolt_data(C_SPELL_DATA)
{
    instName        = "zFirebolt";              // инстанция Spell_zFirebolt
    spellID         = spellID_Firebolt;         // ID. должно быть больше 500
    spellName        = NAME_zSPL_Firebolt;       // отображается на экране при переключение заклинаний
    spellAniName    = "FBT";                    // "STM" "WHI" "MSD" "SLE" "HEA" "FBT" "FIB" "SUM" "TRF" "FEA" "FRZ"
    visualFxName    = "Firebolt";               // spellFX_Firebolt из файла VisualFxInst.d
    damage            = SPL_BaseDamage_Firebolt;  // урон !!!
    cost            = SPL_Cost_ItRu_Firebolt;   // как обрабатывает движок???
    energyType        = ATR_MANA;                 // требует ману
    //  Выбор типа заклинания по области ( как волна смерти) так и выбор типа с осколками ( как малая огненая буря)
    EffectType        = zSPL_DEFAULT;             // zSPL_TRANSFORM zSPL_AREA zSPL_SPREAD zSPL_DEFAULT
};


instance Spell_zFirebolt(C_Spell_Proto_G2NotR)       
{
    // ущерб берётся из C_SPELL_DATA
};

func int Spell_Logic_zFirebolt(var int manaInvested)
{   
    var int SPL_Cost_mana;                          // кол-во маны для каста
    var C_Item  itm;                                // для проверки брони и оружия
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero);  // ссылка на героя
    
    // проверка на наличие маны у НПС для каста
    if (manaInvested == 0)
    {
        SPL_Cost_mana = SPL_Cost_ItRu_Firebolt;  // необходимо маны для руны
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_ItSc_Firebolt; };// необходимо маны для свитка
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
    };   

    //  Расчёт уровня заклинания
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 3;     // Базовый урон 15*3 = 45

        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            if      (self.attribute[ATR_MANA] >= 80 * 5)    { self.aivar[AIV_SpellLevel]  += 5; }
            else if (self.attribute[ATR_MANA] >= 80 * 4)    { self.aivar[AIV_SpellLevel]  += 4; }
            else if (self.attribute[ATR_MANA] >= 80 * 3)    { self.aivar[AIV_SpellLevel]  += 3; }
            else if (self.attribute[ATR_MANA] >= 80 * 2)    { self.aivar[AIV_SpellLevel]  += 2; }
            else if (self.attribute[ATR_MANA] >= 80 * 1)    { self.aivar[AIV_SpellLevel]  += 1; };
        };
    
        if (Npc_HasEquippedMeleeWeapon(self) == true)
        {
            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;    // доп урон за мощный посох магов огня
            };   
        };   

        C_BonusKDFSpellArmor(self); // подсчёт бонусов от брони от +3 до -3
        
        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; };
        };
    
    };   

    // текущий уровень заклинания
    Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, AIV_SpellLevel = %i", self.name, self.id,manaInvested, self.aivar[AIV_SpellLevel]));

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

    // каст
    return SPL_SENDCAST;
};


func void Spell_Cast_zFirebolt()
{
    Hlp_PrintConsole(Str_Format("    Spell_Cast_zFirebolt[%s %i]", self.name, self.id));
    // счётчик для НПС (не герой)
    self.aivar[AIV_SelectSpell] += 1;
};


func int Spell_Collide_517()
{
    // прописать правила: штрафы и бонусы от огня
    Hlp_PrintConsole(Str_Format("  Spell_Collide_515[%s.%i]  --> return COLL_DOEVERYTHING", self.name, self.id));
    return COLL_DOEVERYTHING;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
это тоже выноси в отдельный файл

Daedalus:
func int C_BonusSpellMana(var C_Npc npc)
{
    var int manalvl;    manalvl = 80;

    if (Npc_GetActiveSpellIsScroll(npc) == true)    // свиток
    || (npc.attribute[ATR_MANA] < manalvl)          // мало маны
    {
        Hlp_PrintConsole(Str_Format("  C_BonusSpellMana[%s.%i]  --> return FALSE", npc.name, npc.id));
        return FALSE;   
    };

    var int BonusSpellMana;

    if      (npc.attribute[ATR_MANA] >= manalvl * 5)    { BonusSpellMana    = 5; }
    else if (npc.attribute[ATR_MANA] >= manalvl * 4)    { BonusSpellMana    = 4; }
    else if (npc.attribute[ATR_MANA] >= manalvl * 3)    { BonusSpellMana    = 3; }
    else if (npc.attribute[ATR_MANA] >= manalvl * 2)    { BonusSpellMana    = 2; }
    else if (npc.attribute[ATR_MANA] >= manalvl * 1)    { BonusSpellMana    = 1; };

    npc.aivar[AIV_SpellLevel]  += BonusSpellMana;

    Hlp_PrintConsole(Str_Format("  C_BonusSpellMana[%s.%i] = %i SpellLevel", npc.name, npc.id, BonusSpellMana));
    return true;   
};
Пост автоматически объединён:

KirTheSeeker, имей ввиду что всё что касается магии в Готики 2 НВ сделано не так как тебе кажется и враги будут всегда получать макс. бонус от маны ;-)
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
@KirTheSeeker, имей ввиду что всё что касается магии в Готики 2 НВ сделано не так как тебе кажется и враги будут всегда получать макс. бонус от маны ;-)
Меня это устраивает, поскольку кастуют в Г2НВ, насколько помню, только шаманы орков и ищущие. И особых проблем я не припоминаю ни от одних, ни от вторых, хотя они должны быть.
Почему всегда максимум? Характеристики ATR_MANA вроде бы вполне правится у всех NPC.
Пост автоматически объединён:

Мне стыдно. :oops:
Не стоит пытаться выполнять 3 дела сразу.
Пост автоматически объединён:

if (Npc_GetActiveSpellIsScroll(npc) == true) // свиток
Разве тут не должно быть FALSE?
А, понял, это условия несрабатывания.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех вновь.
Подскажите, пожалуйста, как корректно дописать бонусы к Spell Lvl от амулетов?
В случае с FireBolt речь идёт лишь о "Божественной ауре Инноса" - ItAm_AmulettOfDeath_Mis
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
KirTheSeeker, Даров.
Добавляешь какую-нить переменную в функцию Equip_ItAm_AmulettOfDeath_Mis()
типа EquipAmulettOfDeath = 1
и в UnEquip_ItAm_AmulettOfDeath_Mis()
EquipAmulettOfDeath = 0
соответственно.
А в коде заклиания:

Daedalus:
if (EquipAmulettOfDeath == 1)
{
    self.aivar[AIV_SpellLevel] += 1;
}
 
Сверху Снизу