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

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

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

MaGoth

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

Вложения

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

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.197
Благодарности
3.389
Баллы
485
Подскажите, пожалуйста, как это правильно прописать?

Daedalus:
var int ArmorBlessed; //новая переменная

instance PC_PrayShrine_BlessArmor(C_Info)
{
    npc = PC_Hero;
    nr = 4;
    condition = PC_PrayShrine_BlessArmor_Condition;
    information = PC_PrayShrine_BlessArmor_Info;
    permanent = TRUE; //диалог многоразовый
    description = "Освятить старые доспехи паладина";
};

func int PC_PrayShrine_BlessArmor_Condition()
{
    if(ArmorBlessed == TRUE) //новое условие
    {
        return FALSE;
    };
    if((PLAYER_MOBSI_PRODUCTION == MOBSI_PrayShrine) && (hero.guild == GIL_PAL) && (CurrentLevel == NEWWORLD_ZEN) && (PAL_KnowsAbout_FINAL_BLESSING == TRUE) && ArmorEquipped(hero,ITAR_PAL_Skel))
    {
        if(Npc_GetDistToWP(hero,"NW_MONASTERY_CHAPELL_02") <= 500)
        {
            return TRUE;
        };
    };
};

func void PC_PrayShrine_BlessArmor_Info()
{
    if(Saturas_KlaueInsMeer == TRUE)
    {
        B_RemoveEveryInvItem(hero,ITAR_PAL_Skel);
        CreateInvItem(hero,ITAR_PAL_BEST);
        AI_EquipArmor(hero,ITAR_PAL_BEST);
        Wld_PlayEffect("spellFX_PalHeal_ORIGIN",hero,hero,0,0,0,FALSE);
        Snd_Play("MFX_Heal_Cast");
        B_GivePlayerXP(XP_ArmorBlessed);
        ArmorBlessed = TRUE; //доспехи освящены, блокировать диалог
    }
    else
    {
        PrintScreen("Иннос отвергает Вас!",-1,-1,FONT_Screen,3);
    };
};
 

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
В принципе, тебе уже подсказали, опцию освящения нужно делать многоразовой в этом варианте, иначе она скроется при первом же, даже неудачном использовании (когда Иннос отвергает).
Если доспехи ITAR_PAL_Skel доступны для ГГ в единственном экземпляре, то закрывающая переменная (ArmorBlessed) для освящения в общем-то и не нужна.
(CurrentLevel == NEWWORLD_ZEN) этот кусок тоже не нужен, раз есть привязка к дистанции до конкретного WP

Кстати, напомни, а откуда у тебя ГГ узнаёт о возможность освятить именно доспехи?
Ты прописывал новый диалог или какое-то оповещение или хотя бы на самих доспехах информацию?
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
Приветствую всех.
Подскажите, пожалуйста, как можно через скрипты прописать увеличение урона определенных заклинаний от ATR_MANA (текущей маны)?
 

MW 7


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

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
Ну, навскидку, найти какую-то функцию, которая регулярно вызывается, желательно, перед кастом заклинания.
Можно попробовать Spell_ProcessMana, но, скорее всего, там полезут недочеты, типа обсчета со второго каста, это нужно тестировать.

И в эту функцию прописать новую переменную, которая будет принимать значения в зависимости от маны ГГ.
И эту же переменную тупо прилепить к урону заклинания в instance Spell_, но, опять же, почти гарантировано полезут недоработки, типа расчет со 2 каста.

К текущей мане переменную лучше не привязывать, а вот к максимальной мане - это еще другой разговор.
 

MW 7


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

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.114
Благодарности
581
Баллы
350
А разве не проще в цифру которая указывает урон заменить на что-то типо dmg = 75 + atr_mana? Естественно придется для нужных заклинаний писать, но неужели для элементарной математики в скриптах уже юня нужен?

Upd. А, я понял. При попытке хоть что-нибудь засунуть в виде непостоянных букв в урон заклинаний, игра либо вылетает, либо превращает урон в 1.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
А разве не проще в цифру которая указывает урон заменить на что-то типо dmg = 75 + atr_mana?
в func int Spell_Logic_*** можно менять урон у самой инстанции. что то типа:
Код:
Spell_Firebolt.damage_per_level = (x+y-z);
return SPL_SENDCAST:
на практике это приведёт к тому что у врагов ущерб тоже поменяется ;-) то есть тогда надо делать отдельный спелл под героя или использовать иную схему(меняя не ущерб, а кол-во уровней заклинания) которую я расписывал в отдельном топике. а если просто топорно поменять damage_per_level это недальновидно и последствия будут так или иначе. конечно если ты продвинутый, всё знаешь и понимаешь, чётко знаешь что вылезет и как это обойти и т.д. и т.п. тогда можно. наверное.
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.114
Благодарности
581
Баллы
350
MW 7, я в упор не понимаю, почему попытка использовать в виде переменной атрибуту маны приводит к печальным последствиям. Что в ней такого есть, чего нет в обычных цифрах, помимо того, что они непостоянные
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
еще раз: если ты чётко всё знаешь и понимаешь, то делай. проблем не будет, так как ты всё знаешь и понимаешь.
если ты не понимаешь что есть инстанция и как работает Spell_Logic_*** то менять у инстанции урон чревато последствиями.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
Да прописать обсчет чисто для ГГ вообще не проблема, if(Npc_IsPlayer(self)) в помощь.
Хотелось бы для всех создать равные условия, если возможно.

Погоняйте, может все еще элементарнее.
Благодарю за пример, я попробую.
Пост автоматически объединён:

А разве не проще в цифру которая указывает урон заменить на что-то типо dmg = 75 + atr_mana? Естественно придется для нужных заклинаний писать, но неужели для элементарной математики в скриптах уже юня нужен?
Я тоже на это надеялся, но увы. :confused:
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.237
Баллы
525
я в упор не понимаю, почему попытка использовать в виде переменной атрибуту маны приводит к печальным последствиям.
Видимо, дело тут в моментах времени выполнения функций. На момент чтения данных из инстанции заклинания движок может ещё не иметь под рукой других необходимых данных. Это при загрузке игры.
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
А как называется тот скрипт что отвечает за урон? А то не понял почему у меня ГГ в начале игры с коротким луком не ваншотает молодых волков, наносит 15 урона когда у них 20 хп. Походу опять где то накосячил
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
А как называется тот скрипт что отвечает за урон?
движок.

не ваншотает молодых волков, наносит 15 урона когда у них 20 хп.
проверь инстанции. там два или три "молодых волка" с разным значением ХП и защиты. те что у Пепе будут сильнее чем те что в начале.
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
проверь инстанции. там два или три "молодых волка" с разным значением ХП и защиты. те что у Пепе будут сильнее чем те что в начале.
Цифры у волчар не менял, мл.волков Пепе я не трогал, я про тех что в начале перед башней и внизу в долине около Лестера (их цифры тоже не трогал)

UPD: епрст, говорю что не менял, но "поменял" убрал все строки защиты со значением 0, щас вернул и теперь ваншотаю молодого как должно быть
 
Последнее редактирование:

MW 7


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

damage_per_level = SPL_Damage_Firebolt + GG_MP; //напрямую тут
он не будет динамичным. то есть если ты будешь кидать шары подряд они будут иметь одинаковый ущерб, несмотря на то что значение маны у героя будет падать. эти цифры надо менять из spell logic
в первой итерации (manainvested == 0)
Daedalus:
func int Spell_Logic_IceBolt(var int manaInvested)
{
    ...
    if (manainvested == 0)
    {
        B_Give_GG_MP(self);  // считает какой будет доп урон
        Spell_IceBolt.damage_per_level = SPL_Damage_IceBolt + GG_MP; // записывает новый урон для инстанции спела
    };
    ...
};
и это решение плохое по той причине которое я писал выше трижды. то есть если этот спелл использует одновременно один НПС, то норм. если будет дуэль на таких спелах то она будет нечестной, так как это будет работать некорректно.
upd
доп урон GG_MP надо хранить в MEMORY Aivars. что бы у каждого НПС он был свой. это позволит исключить возможность получения бонуса ущерба НПС 1 от маны НПС 2. перезаписывая damage_per_level инстанции прям перед кастом:
Код:
func int Spell_Logic_IceBolt(var int manaInvested)
{
    ...
    if (manainvested == 0)
    {
        B_Give_GG_MP(self);  // определяет какой будет доп урон
    };
    ...
    ...
    ...
    Spell_IceBolt.damage_per_level = SPL_Damage_IceBolt + self.aivar[AIV_GG_MP];  // записывает новый урон для инстанции спела
    return SPL_SENDCAST;
    ...
};

Хотелось бы для всех создать равные условия, если возможно.
практически у тебя не получится сделать это, так как для это придётся дописывать писать с чистого листа "ИИ". начиная с прототипов НПС, заканчивая индивидуальной логикой для каждой группы врагов магов: ищущие,скелеты маги, орки, драконы. а это может сделать только тот у кого есть накопленный опыт в этом. Например ElderGamer или D36. Замечу что речь идёт именно про опыт. В твоём же случае свои правки надо "вписывать" в имеющиеся парадигму. Если ты хочешь что бы с каждым кастом, заклинание становилось слабее(так как падает кол-во текущей маны у НПС), то у врагов для решение подобной задачи есть счетчик AIV_SelectSpell с ним и надо работать.
Пост автоматически объединён:
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
var C_ITEM gold; gold = Wld_FindVob("ITMI_GOLD");
а есть подобная функция позволяющая получить ссылку на предмет в рюкзаке героя? :) я так понимаю что Wld_FindVob ищет что нибудь именно в мире.. :)
Пост автоматически объединён:

Прошу сведущих людей сделать плагин, который сразу после запроса ГГ на обучение (после обращения к NPC-тренеру) будет затемнять экран, проматывать игровое время на 90 минут, и лишь затем запускать ответную реплику тренера (там где "теперь ты можешь бла-бла")?
Если такое реализуемо, то прошу сделать временные затраты в 90 минут для навыков и атрибутов в 5% или 5 ед., и 20 минут для обучения на 1% и 1 ед.
это можно делать в функции изменяющей атрибут. в неоф обновление это B_TeachAttributePoints.
Daedalus:
    oth.lp -= kosten;
    B_RaiseAttributeByTraining(oth,attrib,points);
    // вот тут делай вызов функции меняющей время в игре на + минут в зависимости от значения points
    return TRUE;
 
Последнее редактирование:
Сверху Снизу