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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295
хотелось бы отразить возможность увеличения урона от заклинаний непосредственно в 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
Последнее редактирование модератором:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295

self.guild EquippedMeleeWeapon EquippedArmor PLAYER_TALENT_RUNES




  • Daedalus:
    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;
                    };
                };
    Проверку на гильдию НПС произносящего заклинание, может увеличивать(или уменьшать) уровень заклинания.
    В данном примере НПС - маг огня +1 уровень, герой высший маг огня +1 доп уровень

  • Daedalus:
    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;
                };
    Экипированные посохи магов огня повышают уровень заклинания. Но а что то вполне может и понизить :)

  • Daedalus:
                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;
                    };
                };
    Роба Мага Огня так же повысила уровень заклинания на 1, тяжелая роба мага огня повысила на 2, а если был одет пояс то еще 1.

  • 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; };
                };
    если герой изучил заклинания огня, то это знание будет увеличивать уровень(ущерб) от спелла

еще больше вариантов проверок можно посмтреть в этом топике.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295
Поступили выкрики из зала, откровенную дичь опущу, на некоторые "замечания" отвечу:
Почему не используешь проверку на (manaInvested) < (self.aivar[AIV_SpellLevel])??
Можно использовать любую проверку, если она работает и не вызывает сбоев. Бывает что «правильные» проверки работает некорректно, а неправильные наоборот корректно. В моей стране уже 30 лет нету ГОСТов, поэтому вопрос «правильности» он субъективный и вырастает как и всё прочее из экономического базиса. в следствие чего "правильно" спроектированный прототип самолёта падает из-за "неправильного" пилота.
Если делать проверку по manaInvested, то нужно учитывать, что manaInvested начинается с нуля. То есть герой может "за инвестировать" 0 маны и сотворить магию (в Готики 1 это отлично видно на примере тоже огненного шара). такая «логика» пираний вредит моей неокрепшей детской психики и я стараюсь её не использовать что бы окончательно не запутаться в немецком фольклоре. Это основная причина, почему я её не использовал.

проверка из примера вышеПроверка по manaInvested могла бы выглядеть примерно так
Daedalus:
        if (self.aivar[AIV_SpellLevel] > 1)
        {
            self.aivar[AIV_SpellLevel] -= 1;
            return SPL_NEXTLEVEL;
        };
Daedalus:
        if ((self.aivar[AIV_SpellLevel]) > (manaInvested + 1))
        {
            return SPL_NEXTLEVEL;
        };

Вторая причина это моё желание иметь у НПС self.aivar[AIV_SpellLevel] с значением 1. То есть мне так субъективно спокойнее если после каста у НПС self.aivar[AIV_SpellLevel] будет равно 1. Это штука из моей головы и связанная с огнестрельным оружием в оффлайне. Вы можете делать любую проверку. Это просто пример того как оно могло бы быть. рабочий и проверенный пример. не путать с потоком абстракции на тему как оно могло бы быть.

Зачем так часто делать Hlp_PrintConsole?
Это называется диагностика и отладка. Меня так учили что должен быть самоконтроль, проверка и дисциплина. В моей системе координат дисциплина важнее мотивации. Перед тем как отдать, что либо кому либо на тест, нужно проверить самому. Скидывание чего то непроверенного "автором" на мой взгляд есть проявления неуважение к коллегам и на производстве за такое могут разбить лицо. Конечно есть обстоятельства, когда автор не может что то проверить сам и такое как правило проговаривается и к этому как правило относятся с пониманием.
Ввиду того что я пишу это в качестве примера или даже "урока", то дисциплину и самоконтроль нужно агрессивно насаждать. Желательно ещё при этом бить. Это самый верный способ.

назачёт! SPL_NEXTLEVEL будет отнимать ману!
На движке НВ ману будут отнимать SPL_RECEIVEINVEST и SPL_FORCEINVEST.
Пираньи в Ночь Ворона утратили эти тайные знания и отнимают ману скриптами в функции Spell_Cast_ через скрипты. Если мана отнимается скриптами, то необходимо иметь как минимум две доп проверки: на то не стала ли мана отрицательная и на то есть ли мана. Если мана отрицательная её надо делать ровной нулю, а если маны нет то заклинания надо «бросать». Если мана будет отниматься движком, то она не станет отрицательной, а в случае её отсутствия движок "бросит" спелл.
см. подробнее топик Готика ½ - Spell_Logic - отнимаем(инвестируем) ману движком :: SPL_RECEIVEINVEST :: SPL_FORCEINVEST
В «пробуждение» меняли урон через плагин. Разве там не проще?
Я обязательно напишу и про то как менять урон от магии через плагин OnDamage_hit. Но перед этим мне надо показать всю «цепочку» событий, то есть
Spell_Logic_xxx --> Spell_Cast_xxx --> C_CanNpcCollideWithSpell --> B_AssessMagic
после этого можно написать и про OnDamage_HIT. спойлер: просто менять ущерб через плагин OnDamage_HIT не проще.

***


Возможно ли прописать бонус к урону ВСЕХ рук (созданных/найденных), имеющих определённый тип повреждения (огонь; вода/лёд; молния)? По какому флагу или т.п. их можно было бы объединить? Или снова составлять списки инстанций или т.п.?
забудьте про руны. речь про заклинание. в инстанции руны указана инстанция заклинания. вы можете иметь три руны разной цены и разного цвета которые будет произносить одно и тоже заклинание. проверку на активную руну можно сделать внутри Spell_Logic_*** примерно так:
Daedalus:
    Npc_GetInvItem(self,ItRu_Zap_hero);
    if (item.flags & ITEM_ACTIVE))
    {
        // у НПС особая руна, можно например дополнительно повысить уровень(ущерб) заклинания
    };
для стихийных бонусов и штрафов пираньи используют C_CanNpcCollideWithSpell

По какому флагу или т.п. их можно было бы объединить?
можно указать ID у инстанций рун и по этому айди делать проверку. Но что бы точно понять что с чем объединять лучше все данные внести в таблицу. когда в таблице будут заклинания и система бонусов и штрафов это будет уже достаточно легко как то сгруппировать и на уровне скриптов "маркировать".
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
возьмём в качестве примера Spell_Firebolt. у подобных заклинаний используется один уровень заклинания, но совершенного ничего не мешает увеличить кол-во уровней, уменьшив при этом урон за уровень.
Что такое "уровень заклинания"? Просто множитель "стартового урона"?
Как поменять математику расчёта урона, при изменении уровня? Неужели там доступно только сложение/вычитание статичного значения?

Что это значит?
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Приветствую вновь.
Подскажи, пожалуйста, как в данном коде прописать увеличение уровня заклинания на 1 , за каждые 10 ед. в ATR_MANA_MAX?
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 (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt_Scroll))
    || (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt)
    {   
    
        if (manaInvested == 0)
        {
        
            self.aivar[AIV_SpellLevel] = 10;
            
            //  Бонусы

            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 (self.aivar[AIV_SpellLevel] > 1)
        {
            var string msg;
            msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, self.aivar[AIV_SpellLevel]);
            Hlp_PrintConsole(msg);
            self.aivar[AIV_SpellLevel] -= 1;
            return SPL_NEXTLEVEL;
        };
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};
Насколько понимаю, это должно идти сразу после self.aivar[AIV_SpellLevel] = 10, и перед всеми прочими бонусами. При этом данное усиление должно работать ТОЛЬКО если персонаж кастует заклинание с руны, т.е. необходимо где-то прописать что-то вроде Npc_GetActiveSpellIsScroll(self) = false.
Ключевой вопрос:
- Что нужно убрать из кода, дабы все эти бонусы были актуальны и для NPC? Подозреваю, простым удалением var C_NPC her; и her = Hlp_GetNpc(PC_Hero); не обойтись?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295
Daedalus:
        if (manaInvested == 0)
        {
            self.aivar[AIV_SpellLevel] = 10; // базово 10*5=50 урона
            //  Бонусы
            if (!Npc_GetActiveSpellIsScroll(self)) // руна
            {
                        self.aivar[AIV_SpellLevel]  += (self.attribute[ATR_MANA_MAX] / 50); // + 5 урона за 50 маны
            };
        };
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Daedalus:
        if (manaInvested == 0)
        {
            self.aivar[AIV_SpellLevel] = 10; // базово 10*5=50 урона
            //  Бонусы
            if (!Npc_GetActiveSpellIsScroll(self)) // руна
            {
                        self.aivar[AIV_SpellLevel]  += (self.attribute[ATR_MANA_MAX] / 50); // + 5 урона за 50 маны
            };
        };
Что-то не получается:
3.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 (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt_Scroll))
    || (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt)
    {   
    
        if (manaInvested == 0)
        {
        
            self.aivar[AIV_SpellLevel] = 10;
            
            //  Бонусы

            var C_NPC her;     her = Hlp_GetNpc(PC_Hero);
            
            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;
                
                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 (self.aivar[AIV_SpellLevel] > 1)
        {
            var string msg;
            msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, self.aivar[AIV_SpellLevel]);
            Hlp_PrintConsole(msg);
            self.aivar[AIV_SpellLevel] -= 1;
            return SPL_NEXTLEVEL;
        };
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
закомментируй строчки с Str_Format и Hlp_PrintConsole
Всё равно нет:
3.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 (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt_Scroll))
    || (self.attribute[ATR_MANA] >= SPL_Cost_Firebolt)
    {   
    
        if (manaInvested == 0)
        {
        
            self.aivar[AIV_SpellLevel] = 10;
            
            //  Бонусы

            var C_NPC her;     her = Hlp_GetNpc(PC_Hero);
            
            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;
                
                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 (self.aivar[AIV_SpellLevel] > 1)
        {
            var string msg;
//            msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, self.aivar[AIV_SpellLevel]);
//            Hlp_PrintConsole(msg);
            self.aivar[AIV_SpellLevel] -= 1;
            return SPL_NEXTLEVEL;
        };
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295
у тебя неправильно закомментировано условие про броню.
Пост автоматически объединён:

Daedalus:
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;
            };
        };
        */
            
        // Конец подсчёта бонусов
    };
        
    if (Npc_GetActiveSpellLevel(self) < self.aivar[AIV_SpellLevel])       
    {
        return SPL_NEXTLEVEL;
    };
    
    return SPL_SENDCAST;
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
у тебя неправильно закомментировано условие про броню.
Пост автоматически объединён:

Daedalus:
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;
            };
        };
        */
          
        // Конец подсчёта бонусов
    };
      
    if (Npc_GetActiveSpellLevel(self) < self.aivar[AIV_SpellLevel])     
    {
        return SPL_NEXTLEVEL;
    };
  
    return SPL_SENDCAST;
};
GS 3.16 поругался ещё на бонусы от гильдии, так что пришлось пока закомментировать и их. Тогда код скомпилировался, но теперь заклинание в игре НЕ удаётся скастовать. ГГ замирает с поднятой рукой и подготовленным заклинанием, как раз перед броском, но дальше двигаться отказывается (стоит управление G1). При отпускании W, он просто возвращается в положение перед началом каста. В чём может быть проблема?
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;
            };
        };
        */
           
        // Конец подсчёта бонусов
    };
       
    if (Npc_GetActiveSpellLevel(self) < self.aivar[AIV_SpellLevel])      
    {
        return SPL_NEXTLEVEL;
    };
   
    return SPL_SENDCAST;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
968
Баллы
295
В чём может быть проблема?
нету там проблемы. ты бы лучше использовал отправку информацию в отладчик и смотрел что там у тебя происходит. а в проект GS добавлял уже рабочую версию.

Daedalus:
        // Конец подсчёта бонусов
    };
    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

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
ты бы лучше использовал отправку информацию в отладчик и смотрел что там у тебя происходит. а в проект GS добавлял уже рабочую версию.
Что ты имеешь в виду? Как "отправлять информацию в отладчик"?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Что ты имеешь в виду? Как "отправлять информацию в отладчик"?
в папке system\autorun
создавай D файлы, и в них пиши код.
В SystemPack.ini поставь параметр
ShowDebugWindow в true, т.е. ShowDebugWindow = true
И при запуске готики, будет выходить окно командной строки с разными логами
И благодаря:
Daedalus:
var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
Будешь видеть в этом окне консоли разные выводы информации, т.е.
msg = Str_Format("ТУТ МОЖНО ПИСАТЬ ВСЕ ЧТО УГОДНО");
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Эти строки пришлось закомментировать, поскольку из-за них код не компилился.
Да, я читал))
Сделай как я и MW 7 говорим.
Т.е. код, который еще в релиз не пошел, пиши в D файлах system\autorun
Как все реализуешь, то просто удали эти строки из релизного кода и вставляй их в GS
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
в папке system\autorun
создавай D файлы, и в них пиши код.
В SystemPack.ini поставь параметр
ShowDebugWindow в true, т.е. ShowDebugWindow = true
И при запуске готики, будет выходить окно командной строки с разными логами
И благодаря:
Daedalus:
var string msg;
        msg = Str_Format("manainvested[%i}, Spell Lvl = %i", manaInvested, SpellLevel);
        Hlp_PrintConsole(msg);
Будешь видеть в этом окне консоли разные выводы информации, т.е.
msg = Str_Format("ТУТ МОЖНО ПИСАТЬ ВСЕ ЧТО УГОДНО");
1.png
Насколько я понимаю, уровень заклинания жёстко залочен на 1.
А базовый уровень = 10. Из-за этого и не происходит каст?
 
Сверху Снизу