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

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

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

Готика ½ 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
Последнее редактирование модератором:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
KirTheSeeker, А сейчас у тебя код как выглядит?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
KirTheSeeker, А сейчас у тебя код как выглядит?
Daedalus:
const int SPL_Cost_Firebolt = 5;
const int SPL_Cost_Firebolt_Scroll = 1;
const int SPL_Damage_Firebolt = 5;
//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;
};
*/

func int Spell_Logic_Firebolt (var int manaInvested)
{
    if (manaInvested == 0)
    {
        var int SPL_Cost_mana;                    SPL_Cost_mana = SPL_Cost_Firebolt;
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_Firebolt_Scroll; };
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
        
        // Базовый уровень  = 10
        self.aivar[AIV_SpellLevel] = 10;
            
        //  Бонусы от макс. маны для рун
        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            self.aivar[AIV_SpellLevel]  += (self.attribute[ATR_MANA_MAX] / 10); // +1 уровень заклинания за каждые 10 ед. макс. маны
        };

        /*
        //  Бонусы для мага огня   
        if (self.guild == GIL_KDF)
        {
            self.aivar[AIV_SpellLevel] += 1;
            
            var C_NPC her;     her = Hlp_GetNpc(PC_Hero);
            
            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;
            };
        };
        */
            
        // Конец подсчёта бонусов
    };

    var int SpellLevel; SpellLevel = Npc_GetActiveSpellLevel(self);

    if (SpellLevel < self.aivar[AIV_SpellLevel])     
    {
        var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
        return SPL_NEXTLEVEL;
    };

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

И он так же НЕ компилируется из-за msg = Str_Format.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
KirTheSeeker, а непись точно держит в руках
ITMW_ADDON_STAB01 или ITMW_ADDON_STAB04
?
Если да, то подожди в первом случае 10 раз - каст должен сработать. Во втором случае жди 5 раз - каст должен сработать.
Но судя по логу - не держит...
сделай вот так:
Daedalus:
        if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит не супер ножик ITMW_ADDON_STAB01);
            Hlp_PrintConsole(msg);       
            self.aivar[AIV_SpellLevel] += 1;
        }
        else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит супер ножик ITMW_ADDON_STAB04);
            Hlp_PrintConsole(msg);           
            self.aivar[AIV_SpellLevel] += 2;
        };
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
KirTheSeeker, а непись точно держит в руках
ITMW_ADDON_STAB01 или ITMW_ADDON_STAB04
?
Если да, то подожди в первом случае 10 раз - каст должен сработать. Во втором случае жди 5 раз - каст должен сработать.
Но судя по логу - не держит...
сделай вот так:
Daedalus:
        if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит не супер ножик ITMW_ADDON_STAB01);
            Hlp_PrintConsole(msg);      
            self.aivar[AIV_SpellLevel] += 1;
        }
        else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит супер ножик ITMW_ADDON_STAB04);
            Hlp_PrintConsole(msg);          
            self.aivar[AIV_SpellLevel] += 2;
        };
При таком коде игра даже не запустилась.
2.png

Daedalus:
const int SPL_Cost_Firebolt = 5;
const int SPL_Cost_Firebolt_Scroll = 1;
const int SPL_Damage_Firebolt = 5;
//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;
};
*/

func int Spell_Logic_Firebolt (var int manaInvested)
{
    if (manaInvested == 0)
    {
        var int SPL_Cost_mana;                    SPL_Cost_mana = SPL_Cost_Firebolt;
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_Firebolt_Scroll; };
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
        
        // Базовый уровень  = 10
        self.aivar[AIV_SpellLevel] = 10;
            
        //  Бонусы от макс. маны для рун
        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            self.aivar[AIV_SpellLevel]  += (self.attribute[ATR_MANA_MAX] / 10); // +1 уровень заклинания за каждые 10 ед. макс. маны
        };

        /*
        //  Бонусы для мага огня   
        if (self.guild == GIL_KDF)
        {
            self.aivar[AIV_SpellLevel] += 1;
            
            var C_NPC her;     her = Hlp_GetNpc(PC_Hero);
            
            if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
            && (heroGIL_KDF2 == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;
            };
        };
        */
        
        //  Бонусы от посоха
         if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит не супер ножик ITMW_ADDON_STAB01);
            Hlp_PrintConsole(msg);       
            self.aivar[AIV_SpellLevel] += 1;
        }
        else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит супер ножик ITMW_ADDON_STAB04);
            Hlp_PrintConsole(msg);           
            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;
            };
        };
        */
            
        // Конец подсчёта бонусов
    };

    var int SpellLevel; SpellLevel = Npc_GetActiveSpellLevel(self);

    if (SpellLevel < self.aivar[AIV_SpellLevel])     
    {
        var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
        return SPL_NEXTLEVEL;
    };

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

@KirTheSeeker, а непись точно держит в руках
ITMW_ADDON_STAB01 или ITMW_ADDON_STAB04
?
Нет, я пытаюсь кастануть свиток.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
При таком коде игра даже не запустилась.
дык правильно, яж кавычки закрывающие не поставил))
Daedalus:
        if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит не супер ножик ITMW_ADDON_STAB01");
            Hlp_PrintConsole(msg);       
            self.aivar[AIV_SpellLevel] += 1;
        }
        else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
        {
            var string msg;
            msg = Str_Format("Держит супер ножик ITMW_ADDON_STAB04");
            Hlp_PrintConsole(msg);           
            self.aivar[AIV_SpellLevel] += 2;
        }
        else
        {
            var string msg;
            msg = Str_Format("Держит в руказ зубочистку");
            Hlp_PrintConsole(msg);
        };
Специально тебе без кавычек дал))
отвыкай от копипаста, иногда читай что тебе показывают))
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
KirTheSeeker, Кстати, где:
var C_Item itm; itm = Npc_GetEquippedMeleeWeapon(self);
?
вариант, который в коде, т.е. повышение уровня заклинания, будет срабатывать только в том случае, если на неписе экипированы эти две палки.
 

MW 7


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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
MEG@VOLT, проверь пожалуйста. если всё корректно работает то я обновлю первый пост.

тут:
* бонусы от фракции
* бонусы от брони
* бонусы от посоха
* бонусы от навыка изготавливать руны
* ману отнимает движок
 

Вложения

  • 2023_03_17_SPL_FireBolt.zip
    1,5 KB · Просмотры: 2

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
MW 7, Вроде да, все правильно. Только дебаг строки убери
Daedalus:
    if (SpellLevel < self.aivar[AIV_SpellLevel])     
    {
        var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
        return SPL_NEXTLEVEL;
    };
И файл у тебя в UTF8, а не в ANSI ))
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
MEG@VOLT, Hlp_PrintConsole закомментировал. кодировку поменял. файл в первый пост залил. удали плиз старый файл что бы путаницы не было.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
upd
обновил первый пост. добавил определение уровня спела с помощью Npc_GetActiveSpellLevel и отнимание маны с помощью SPL_FORCEINVEST. поменял какие то слова местами.
Таблицу с проверками вынес в отдельный пост #2 Готика ½ - Spell_Logic - увеличения урона заклинаний
Пост автоматически объединён:

ну и еще раз: я писал всё это не для того что было "скалирование" ущерба от маны. все эти "сканирования" лучше делать движком с помощью плагина юнион.
// лично я считают что макс. мана в готике не должна использоваться для "сканирования" урона от заклинания.
НО данный топик про то как в целом можно повысить урон за счёт каких то доп условий. например навыка "мастер огня" который есть в MDK или за счёт каких то иных навыков, например изучения формул огненных заклинаний. Для поднимание ущерба в 10-100 от базового данный метод может не подойти, так как инвестирование 100 маны занимает ощутимое игровое время ;-)
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
у меня вчера каст происходил. но засчёт бонуса от маны уровень заклинания стал больше 100. соответственно требуется время на инвестирования маны. что бы ускорить каст надо переработать уровни заклинания что бы их было не 100, а например 10. для этого я бы составил табличку, внёс в неё бонусы и определить какой может быть максимальный уровень заклинания и какой при этом будет ущерб.
Что если, например, вот так:
Daedalus:
// ************
// SPL_FireBolt
// ************

const int SPL_Cost_Firebolt = 5;
const int SPL_BaseDamage_Firebolt = 10;

instance Spell_Firebolt (C_Spell_Proto)
{
    time_per_mana            = 0;
    damage_per_level        = SPL_BaseDamage_Firebolt;
    damageType                = DAM_MAGIC;
};

func int Spell_Logic_Firebolt (var int manaInvested)
{
    var C_Item  itm; // Для проверок брони и оружия
    var C_NPC   her;     her = Hlp_GetNpc(PC_Hero);
    var int SPL_Cost_mana;  SPL_Cost_mana = SPL_Cost_Firebolt;
    
    // проверка на наличие маны у НПС для каста
    if (manaInvested == 0)
    {
        if (Npc_GetActiveSpellIsScroll(self))   { SPL_Cost_mana = SPL_Cost_Scroll; };
        
        if (self.attribute[ATR_MANA] < SPL_Cost_mana)   { return SPL_SENDSTOP; };   
    };   
        
    //
    //  Расчёт уровня заклинания
    //
    if (manaInvested == 0)
    {
        self.aivar[AIV_SpellLevel] = 4;     // Базовый урон 10*4=40
            
        if (!Npc_GetActiveSpellIsScroll(self)) // Только руна
        {
            self.aivar[AIV_SpellLevel]  += (self.attribute[ATR_MANA] / 80); // + 10 урона за 80 текущей маны
        };
        
        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 (KDF01_Equipped == TRUE)
            //&& (KDFArmor_Equipped == TRUE)
            {
                self.aivar[AIV_SpellLevel] += 1;   // доп урон за сетовый пояс
            };
        };
    };
    
    // текущий уровень заклинания
    var int    SpellLevel; SpellLevel = Npc_GetActiveSpellLevel(self);
    
    // увеличиваем уровень заклинания
    if (SpellLevel < self.aivar[AIV_SpellLevel])     
    {
        var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
        return SPL_NEXTLEVEL;
    };
    
    // отнимает ману и обнуляем аивер
    if (self.aivar[AIV_SpellLevel] != 0)
    {
        self.aivar[AIV_SpellLevel] = 0;
        return SPL_FORCEINVEST + Spl_Cost_Mana; // отнимает ману. устанавливаем новое значение manainvested.   
    };

    // каст
    return SPL_SENDCAST;
};

func void Spell_Cast_Firebolt()
{
    // счётчик для НПС (не герой)
    self.aivar[AIV_SelectSpell] += 1;
};

Spell_FireBoltБазовые значенияБонус от текущей маныБонусы от экипировкиШтрафы от экипировкиМаксимальные значения (при ATR_MANA = 400)
Уровень заклинания4+1 ур. за 80 ед. ATR_MANAРоба мага Огня = +1
Тяжелая роба мага Огня = +2
Посох мага Огня = +1
Мощный посох мага Огня = +2
Пояс мага Огня = +1
Заряженный Глаз Инноса = +1
Коготь Белиара = -2
Роба Ищущего = -1
Роба Тёмного мага = -2
4+6+(400/80) = 15
Урон (SPL_BaseDamage_Firebolt = 10)4*10 = 40+10Роба мага Огня = +10
Тяжелая роба мага Огня = +20
Посох мага Огня = +10
Мощный посох мага Огня = +20
Пояс мага Огня = +10
Заряженный Глаз Инноса = +10
Коготь Белиара = -20
Роба Ищущего = -10
Роба Тёмного мага = -20
40+60+50 = 150
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Максимальные значения (при ATR_MANA = 400)
текущая мана или максимальная мана?
Пост автоматически объединён:

уровень больше 15 может быть?
Пост автоматически объединён:

Пояс мага Огня = +1
в сете или сам по себе?
Пост автоматически объединён:

уровень меньше 4 может быть?
Пост автоматически объединён:

уровеньпримечание
Базовые значения4
бонус маныот 1 до 999плюс 1 уровень за 80 ед. ATR_MANA
Роба мага Огня1
Тяжелая роба мага Огня2
Роба Ищущегоминус 1
Роба Тёмного магаминус 2
Пояс мага Огня1при наличие сетового бонуса?
Посох мага Огня1
Мощный посох мага Огня2
Коготь Белиараминус 2
Заряженный Глаз Инноса1
Аура Инноса?
максимально значение15?
минимальное значение4?
 
Последнее редактирование:

KirTheSeeker

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

уровень больше 15 может быть?
Нет, бонус от маны лучше ограничить 5-ю уровнями, либо ATR_MANA_MAX ограничить.

в сете или сам по себе?
Только в сете.

уровень меньше 4 может быть?
Да, раз есть штрафы. Но не ниже 1, разумеется.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
не понятно, что есть "разумеется". минимальный уровень 1? или 0? или 4? максимальный уровень 15? или 20? или 100? бонус от маны может быть больше 5?
***
проверку на коготь я не знаю как лучше организовать. можно попробовать проверить по имени, может прокатит
Daedalus:
        if (Npc_HasEquippedMeleeWeapon(self) == true)
        {
            itm = Npc_GetEquippedMeleeWeapon(self); // получаем ссылку на инстанцию экипированного оружия 
            ...
            if (Hlp_StrCmp(itm.name,NAME_ADDON_BELIARSWEAPON))
            {
                self.aivar[AIV_SpellLevel] -= 2;
            };
        };

***
уровеньпримечаниекод
Базовые значения4
бонус маны0 - 5плюс 1 уровень за 80 ед. ATR_MANA. Не больше 5?
Роба мага Огня1
Тяжелая роба мага Огня2
Роба Ищущегоминус 1штраф
Роба Тёмного магаминус 2штраф
Пояс мага Огня1в сете
Посох мага Огня1
Мощный посох мага Огня2
Коготь Белиараминус 2хз как лучше организовать проверкуif (Hlp_StrCmp(itm.name,NAME_ADDON_BELIARSWEAPON))
{
self.aivar[AIV_SpellLevel] -= 2;
};
Заряженный Глаз Инноса1
Аура Инноса?
минимальный уровень1if (self.aivar[AIV_SpellLevel] < 1)
{
self.aivar[AIV_SpellLevel] = 1;
};
минимальный уровень15if (self.aivar[AIV_SpellLevel] > 15)
{
self.aivar[AIV_SpellLevel] = 15;
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
не понятно, что есть "разумеется". минимальный уровень 1? или 0? или 4? максимальный уровень 15? или 20? или 100?
Минимальный уровень = 1;
Базовый уровень = 4;
Максимальный уровень = 15;

бонус от маны может быть больше 5?
Нет. Максимальный бонус от текущей маны = +5 уровней.

проверку на коготь я не знаю как лучше организовать. можно попробовать проверить по имени, может прокатит
А можно ли проверку на экипированную руну организовать иначе, чем через if (!Npc_GetActiveSpellIsScroll(self)) ?
Насколько понимаю, это значит, что NPC экипирован НЕ свитком, а значит заклинания, накладываемые оружием (через OnDamage_Hit), тоже будут получать бонус? Такого быть не должно. Те заклинания "кастует" оружие и от бонусов владельца они не должны усиливаться, как я считаю.
Пост автоматически объединён:

Я не понял как можно скопировать таблицу из другого сообщения, и как регулировать ширину столбцов, так что попробую просто повторить:
Уровень заклинанияПримечанияКод
Базовый уровень заклинания4
Минимальный уровень заклинания1

if (self.aivar[AIV_SpellLevel] < 1) {
self.aivar[AIV_SpellLevel] = 1;
};
Максимальный уровень заклинания15

if (self.aivar[AIV_SpellLevel] > 15) {
self.aivar[AIV_SpellLevel] = 15;
};
Бонус от текущей маны0-5+1 уровень за 80 ед. ATR_MANA. Не больше 5 уровней в целом.
Роба мага Огня+1
Тяжелая роба мага Огня+2
Роба Ищущего-1Штраф
Роба мага Тьмы-2Штраф
Пояс мага Огня+1Бонус при ношении сета
Посох мага Огня+1
Мощный посох мага Огня+2
Заряженный Глаз Инноса+1
Аура Инноса+1
Коготь Белиара-2Штраф, если меч не сдан Сатурасуif(Saturas_KlaueInsMeer == FALSE)
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
if(Saturas_KlaueInsMeer == FALSE)
это условие будет действовать на всех НПС? или ты имеешь ввиду только героя? или при этом ещё и Равен должен быть убить? :)
Пост автоматически объединён:

Насколько понимаю, это значит, что NPC экипирован НЕ свитком, а значит заклинания, накладываемые оружием (через OnDamage_Hit), тоже будут получать бонус? Такого быть не должно. Те заклинания "кастует" оружие и от бонусов владельца они не должны усиливаться, как я считаю.
у тебя отладчик есть. смотри в отладчик вызывает ли оружие "спел_логик". и подобные вопросы появляться не будут.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
это условие будет действовать на всех НПС? или ты имеешь ввиду только героя? или при этом ещё и Равен должен быть убить? :)
Не подумал. Да, только для ГГ, и да, только после убийства Равена.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
+1 уровень за 80 ед. ATR_MANA. Не больше 5 уровней в целом.

Daedalus:
        //  Бонусы от макс. маны
        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; };
        };

Не подумал. Да, только для ГГ, и да, только после убийства Равена.
сам сможешь условие написать?
 
Сверху Снизу