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

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 574
Последнее редактирование модератором:

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
KirTheSeeker, есть обсуждения. а есть вопрос, то есть: я решил вот так хочу сделать вот так. делаю вот это не получается вот то.

у нас в данном случае что происходит? :)
Пост автоматически объединён:

Есть, например, меч Альрика, который, как мне кажется намерено введён в игру именно как оружие со сравнительно низкими требованиями и хорошим бонусом.
он введён был в Готика 2 классик это было единственное оружие которое давало бонус к 1р.
Пост автоматически объединён:

  • Герой без ловкости с низким 1р будет получать бонус от оружия.
  • Герой без ловкости с высоким навыком 1р не будет получать бонус от оружия.
так ты хочешь что бы оно работало ?
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
  • Герой без ловкости с низким 1р будет получать бонус от оружия.
  • Герой без ловкости с высоким навыком 1р не будет получать бонус от оружия.
так ты хочешь что бы оно работало ?
Пожалуй, да. Основная цель этих правок в том, чтобы не получалось схалявить с переходом на следующую ступень мастерства, не прокачивая соответствующих атрибутов.

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
Основная цель этих правок в том, чтобы не получалось схалявить с переходом на следующую ступень мастерства,
это делается очень просто в скриптах D36. в скриптпатче есть UpdateTalent и UpdateTalent_Hero в которой переключаются уровень таланта и оверлеи и там можно переключать их без учёта перманентных бонусов и/ или бонусов от оружия. . и можно например написать UpdateTalent_Hero по образу UpdateTalent беря при этом не npc.HitChance[***], а TAL_Training[***]
[CODE]//npc.HitChance[NPC_TALENT_1H] = value; // было
TAL_Training[NPC_TALENT_1H]= value; // стало
[/CODE]
Пост автоматически объединён:

p.s.
если я там что то перепутал то надеюсь меня D36 поправить так как я не знаю как у неё это сочетается с оригинальной функцией B_AddFightSkill.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
это делается очень просто и не так. есть функция B_AddFightSkill в которой переключаются оверлеи и там можно переключать их без учёта перманентных бонусов и/ или бонусов от оружия.
Daedalus:
func void B_AddFightSkill(var C_Npc slf,var int talent,var int percent)
{
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        };
        if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMds(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMds(slf,"humans_1hST2.MDS");
        };
    };
    ...
Ты имеешь в виду дописать здесь что-то типа:
if(slf.HitChance[NPC_TALENT_1H] - TS_TempBonus >= 60)
?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Код:
//npc.HitChance[NPC_TALENT_1H] = value; // было
TAL_Training[NPC_TALENT_1H]= value; // стало
Типа поменять
Daedalus:
func void UpdateTalent(var C_Npc npc,var int talent,var int value)
{
    var int oldSkill;
    var int newSkill;
    
    if(talent == NPC_TALENT_1H)
    {
        npc.HitChance[NPC_TALENT_1H] = value;
        oldSkill = Npc_GetTalentSkill(npc,NPC_TALENT_1H);
        newSkill = GetMin(npc.HitChance[NPC_TALENT_1H] / 30, 2);
        Npc_SetTalentSkill(npc,talent,newSkill);
        UpdateOverlay(npc,oldSkill,newSkill,"humans_1hST1.MDS","humans_1hST2.MDS");
    }
    ...
на
Код:
func void UpdateTalent(var C_Npc npc,var int talent,var int value)
{
    var int oldSkill;
    var int newSkill;
    
    if(talent == NPC_TALENT_1H)
    {
        npc.HitChance[NPC_TALENT_1H] = value;
        oldSkill = Npc_GetTalentSkill(npc,TAL_Training[NPC_TALENT_1H] + TAL_PermBonus[NPC_TALENT_1H]);
        newSkill = GetMin(npc.TAL_Training[NPC_TALENT_1H] + TAL_PermBonus[NPC_TALENT_1H] / 30, 2);
        Npc_SetTalentSkill(npc,talent,newSkill);
        UpdateOverlay(npc,oldSkill,newSkill,"humans_1hST1.MDS","humans_1hST2.MDS");
    }
?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
наверное надо сделать проверку

- не геройnewSkill = GetMin(npc.HitChance[NPC_TALENT_1H] / 30, 2);
- геройnewSkill = GetMin( (TAL_Training[NPC_TALENT_1H] + TAL_PermBonus[NPC_TALENT_1H]) / 30, 2);
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
это делается очень просто в скриптах D36. в скриптпатче есть UpdateTalent и UpdateTalent_Hero
А возможно ли просто в UpdateTalent добавить проверку по атрибутам, чтобы овер-лей просто не переключался?
Типа
Daedalus:
if(talent == NPC_TALENT_1H)
|| sPerm_STR_KTS > 39;
|| sPerm_DEX_KTS > 39;
    {
        npc.HitChance[NPC_TALENT_1H] = value;
        oldSkill = Npc_GetTalentSkill(npc,NPC_TALENT_1H); 
        newSkill = GetMin(npc.HitChance[NPC_TALENT_1H] / 30, 2);
        Npc_SetTalentSkill(npc,talent,newSkill);
        UpdateOverlay(npc,oldSkill,newSkill,"humans_1hST1.MDS","humans_1hST2.MDS");
    }
...
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
KirTheSeeker, надо передавать newSkill и talent на проверку в какую то функцию. если проверка проходит, то менять уровень таланта и переключать оверлей. если не проходит то этого не делать.

навыкуровеньтребования силатребования ловкость
NPC_TALENT_1H
1​
20​
20​
NPC_TALENT_1H
2​
40​
40​

так?

p.s.
я тебе последовательно и поступательно несколько месяцев писал что сначала надо описать(желательно в таблице) что ты хочешь, а потом делать. если весь вопрос сводится к смене уровня навыка и переключением оверлея, то вообще не понятно зачем делался весь космос ранее ;-)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
TalentSkill levelATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH]ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY]
NPC_TALENT_1H12525
NPC_TALENT_1H25050
NPC_TALENT_2H14015
NPC_TALENT_2H28030
NPC_TALENT_BOW11540
NPC_TALENT_BOW23080
NPC_TALENT_CROSSBOW12020
NPC_TALENT_CROSSBOW24040
Пост автоматически объединён:

если весь вопрос сводится к смене уровня навыка и переключением оверлея, то вообще не понятно зачем делался весь космос ранее ;-)
Нет, вопрос в том, чтобы нормально интегрировать привязку навыков к атрибутам. И текущая реализация мне очень нравится. *reverence*
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
в тот файл где твои проверки лежат
Daedalus:
var int sPerm_STR_KTS;
var int sPerm_DEX_KTS;

func void b_sPerm_Attr_KTS_Hero()
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
};

func int sPerm_Attr_KTS_Hero_talentLVL(var int talent, var int talentLVL)
{
    b_sPerm_Attr_KTS_Hero();
  
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (talentLVL == 2)
        {
            if (sPerm_STR_KTS < 50) { return ATR_STRENGTH;  };
            if (sPerm_DEX_KTS < 50) { return ATR_DEXTERITY; };

            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (talentLVL == 1)
        {
            if (sPerm_STR_KTS < 25) {   return ATR_STRENGTH;    };
            if (sPerm_DEX_KTS < 25) {   return ATR_DEXTERITY;   };
            // Сила и ловкость ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        return TRUE;   
    };
  
    if (talent == NPC_TALENT_2H)
    {
 
    };
  
    if (talent == NPC_TALENT_BOW)
    {
 
    };
  
    if (talent == NPC_TALENT_CROSSBOW)
    {
 
    };
  
    return 666;
};

и в UpdateTalent может быть так
Daedalus:
func void UpdateTalent(var C_Npc npc,var int talent,var int value)
{
    var int oldSkill;
    var int newSkill;
  
    if(talent == NPC_TALENT_1H)
    {
        npc.HitChance[NPC_TALENT_1H] = value;
        oldSkill = Npc_GetTalentSkill(npc,NPC_TALENT_1H);
        newSkill = GetMin(npc.HitChance[NPC_TALENT_1H] / 30, 2);
        if C_NpcIsHero(hero)
        {
            // проверка на атрибуты
            if sPerm_Attr_KTS_Hero_talentLVL(talent,newSkill) != true
            {
                // проверка не прошла, уровень навыка и оверлей остаются старые
                newSkill = oldSkill;
            };
        };
        Npc_SetTalentSkill(npc,talent,newSkill);
        UpdateOverlay(npc,oldSkill,newSkill,"humans_1hST1.MDS","humans_1hST2.MDS");
    }
Пост автоматически объединён:

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

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
Что касается скрижалей, то я это вижу таким образом.:
- Имеется ГГ жиробас, потягивающий пивко с рыбкой и разминающийся прогулкой до пивнушки.
- Ему даётся пошаговая "магически-анимированная" инструкция по выполнению сальто-мортале.
- Сможет ли ГГ выполнить данный приём, НЕ обладая соответствующей подготовкой?
исходя из твоих правок не вижу связи между переключением уровня навыка с изменением оверлея и процентом владением навыком.

чисто гипотетически к ловкостному оружию при его экипировки можно вообще сделать изменения навыка на мастер, при этом у героя будет оставаться низкий процент. то есть вот эти пороги что указали пираньи в 30 и 60, они условны и вытекают из готики 1, а в классик еще и завязаны на прокачку двух оружий параллельно, таким образом на 90% 1р происходит "переключение" 2р на мастер. в НВ отказавшись от этой механики получилась дыра, так как после 60% не происходит ничего кроме роста процента навыка, которое к тому же в ряде случаев происходит ещё за счёт бонусов;-)

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
таким образом резюмируя: в рамках твоей концепции не понятно почему герой с низкой силой или ловкостью не может повысить шанс на полный урон.
ГГ может повысить шанс на полный урон, но ровно настолько, насколько позволяют те кривые удары, которые он может выполнить при текущем уровне навыка, т.е. до 29/59/89%.
Стойка, из которой можно совершать более точные удары требует обладания определенными кондициями (например, как некоторые удары в боксе).
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
ты же сам выше пишешь что магические кольца и оружия могут повышать шанс, не меня оверлей, а вот магические таблички не могут :) вот у тебя прямое противоречие в рамках твоей концепции.

Стойка, из которой можно совершать более точные удары требует обладания определенными кондициями (например, как некоторые удары в боксе).
зачем нам бокс? приводи пример их фехтования. расскажи про стойки и прочее при фехтованием тяжёлым молотом или топором. о том как вес оружия вообще никак не влияет на скорость выполнения в фехтование и т.д. и т.п.

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

цифра с потолка. у тебя на 90% нет переключения оверлея.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
ты же сам выше пишешь что магические кольца и оружия могут повышать шанс, не меня оверлей, а вот магические таблички не могут :) вот у тебя прямое противоречие в рамках твоей концепции.
Так это внешний бонус от конкретной вещи.
Например, вместо условной обычной сабли, сделанной на скорую руку, ГГ в руки попадает прекрасно сбалансированный клинок, идеально ложащийся в руку. С таким оружием наносить полу-кривые удары ему будет удобнее, даже при текущих своих физических показателях (раз уж он может её поднять), но возврат к обычной сабле вернёт и обычные промахи.

цифра с потолка. у тебя на 90% нет переключения оверлея.
Пока нет.
Пост автоматически объединён:

и в UpdateTalent может быть так
undefined
Я забыл, что B_NewTalentSystem.d загружается перед B_Perm_Attr_KTS_FightTalent.d
1.png
Тогда func int sPerm_Attr_KTS_Hero_talentLVL стоит перенести в B_NewTalentSystem.d ?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.001
Благодарности
971
Баллы
295
Сверху Снизу