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

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

Важно Создание нового заклинания

Статус
В этой теме нельзя размещать новые ответы.

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625
Расписывать что и кчему в скрипте эффекта не буду, так как это уже есть тут (PFX система (Эффекты излучаемых частиц)).
И так приступим, создайте новое решение в Готик Сорсере(Далее ГС). И назовите его к примеру VFX_Mgic(Включите в решение файлы ParticleFX.src,VisualFX.src лежат ?:Gothic II->_work->data->Scripts->System).
Далее выбираем проект ParticleFX Проект -> Задать активный проект -> ParticleFX открываем файл PfxInstMagic.d идем в конец этого файла и пишем туда следующее:

Daedalus:
// Внимание! Имя Эффекта должно быть ПОЛНОСТЬЮ идентичным имени в файле Constants.d  **SPL_Новое_заклинание**
//если имя эффекта NewSpell то и константа должна называтся SPL_NewSpell. Если  это условие не соблюдено то
//заклинание работать не будет, а если и будет то не правильно!!!
 
//Инициализация заклинания
INSTANCE MFX_NewSpell_INIT (C_PARTICLEFX)
{
    ppsvalue = 80; // Кол-во создаваемых частиц сделаем 80
    ppsscalekeys_s = "5";
    ppsislooping = 1;
    ppsissmooth = 1;
    ppsfps = 12;
    shptype_s = "SPHERE"; //тип излучения ну скажем Сфера
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
//    shpdistribwalkspeed = 0.100000001;
    shpdim_s = "5"; //Размер поверхности на которой будут "рождаться" частицы поставим 8
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "object";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelevvar = 180;
    velavg = 0.00800000038;
    velvar = 0.0299999993;
    lsppartavg = 300;
    flygravity_s = "0 0 0";
    visname_s = "pfx_abs_03.tga"; //Текстуру я поставлю свою текстуру из моего мода
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 1;
    vistexcolorstart_s = "0 100 255"; //начальный цвет будет синий
    vistexcolorend_s = "0 100 255";  //конечный будет зеленым
    vissizestart_s = "3 3";//Размер частиц при рождении поставим по 4
    vissizeendscale = 5;
    visalphafunc_s = "ADD";
    visalphastart = 255;//Альфа-Функция будет ADD
    useemittersfor = 1;
};
 
//Скастованое заклинание(Когда летит в цель)
//Тут уже объяснять не буду делайте по аналогии Инита
INSTANCE MFX_NewSpell_CAST (C_PARTICLEFX)
{
    ppsvalue = 80;
    ppsscalekeys_s = "5";
    ppsislooping = 1;
    ppsissmooth = 1;
    ppsfps = 12;
    shptype_s = "SPHERE";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
//    shpdistribwalkspeed = 0.100000001;
    shpdim_s = "15";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "object";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelevvar = 180;
    velavg = 0.00800000038;
    velvar = 0.0299999993;
    lsppartavg = 300;
    flygravity_s = "0 0 0";
    visname_s = "pfx_abs_03.tga";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 1;
    vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
    vistexcolorend_s = "0 255 56";  //конечный будет зеленым
    vissizestart_s = "4 4";
    vissizeendscale = 10;
    visalphafunc_s = "ADD";
    visalphastart = 255;
    useemittersfor = 1;
};
//И столкновение заклинания с объектом/целью
INSTANCE MFX_NewSpell_COLLIDE (C_PARTICLEFX)
{
    ppsvalue = 20;
    ppsfps = 30;
    shptype_s = "SPHERE";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpisvolume = 1;
    shpdim_s = "8";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2.000000000;
    dirmode_s = "TARGET";
    dirfor_s = "object";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180.000000000;
    dirangleelevvar = 180.000000000;
    velavg = 0.079999998;
    velvar = 0.020000000;
    lsppartavg = 500.000000000;
    flygravity_s = "0 0 0";
    flycolldet_b = 2;
    visname_s = "pfx_abs_03.tg";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18.000000000;
    vistexaniislooping = 1;
    vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
    vistexcolorend_s = "0 255 56";  //конечный будет зеленым
    vissizestart_s = "10 10";
    vissizeendscale = 10.000000000;
    visalphafunc_s = "ADD";
    visalphastart = 255.000000000;
};
//Ну и еще я решил добавить чтобы при попадании разлетались искры
INSTANCE MFX_NewSpell_COLLIDE_SPARKS (C_PARTICLEFX)
{
    ppsvalue = 600.000000000;
    ppsscalekeys_s = "1";
    ppsissmooth = 1;
    ppsfps = 10.000000000;
    shptype_s = "POINT";
    shpfor_s = "OBJECT";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpisvolume = 1;
    shpdim_s = "50";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2.000000000;
    dirmode_s = "RAND";
    dirfor_s = "object";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180.000000000;
    dirangleelevvar = 180.000000000;
    velavg = 0.200000003;
    velvar = 0.050000001;
    lsppartavg = 5000.000000000;
    flygravity_s = "0 -0.0005 0";
    flycolldet_b = 1;
    visname_s = "MFX_SLEEP_STAR.TGA";
    visorientation_s = "NONE";
    vistexisquadpoly = 1;
    vistexanifps = 18.000000000;
    vistexaniislooping = 1;
    vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
    vistexcolorend_s = "0 255 56";  //конечный будет зеленым
    vissizestart_s = "30 30";
    vissizeendscale = 0.100000001;
    visalphafunc_s = "ADD";
    visalphastart = 255.000000000;
    visalphaend = 255.000000000;
};
//Извините за не полное разъяснение
Дальше жмем "Компилирывать" и переходим в проект VisualFX
Вот тут я раскажу по более так как тутора по этому нету
и так тут также действует условии что и в пред-идущем файле имя нада NewSpell. И перейдем к скрипту.
Daedalus:
INSTANCE spellFX_NewSpell    (CFx_Base_Proto)
        {
 
        visname_S                = "MFX_NewSpell_INIT"; //Инициализация заклинания(То что в руке гг)
        emtrjmode_s            = "FIXED";  //???
    emTrjOriginNode        = "ZS_RIGHTHAND"; //Инит в правой руке гг
        emtrjtargetnode        = "BIP01 FIRE";  //Будет лететь в точку BIP01 FIRE
        emtrjloopmode_s        = "NONE";  //???
        emtrjeasefunc_s        = "LINEAR"; //???
        emActionCollStat_S        = "COLLIDE CREATE"; //Будет воспринемать Статичные объкты при стокновении(Будет сталкиваться если убрать то пролетать)
        emActionCollDyn_S        = "COLLIDE CREATEONCE"; //Будет воспринемать Динамические объкты при стокновении(Будет сталкиваться если убрать то пролетать)
    emFXCollStat_S              = "spellFX_NewSpell_COLLIDE"; //Колизия при Стат. Объекте.
    emFXCollDyn_S            = "spellFX_NewSpell_COLLIDEDYNFX"; //Колизия при Дин. Объекте.
    emTrjTargetRange        = 20;  //???
    emTrjTargetElev        = 0;  //???
    emTrjDynUpdateDelay        = 20000;  //???
 
    //visAlpha                = 0;
 
    };
//открытие Ключа иницияализации
    INSTANCE spellFX_NewSpell_KEY_INIT (C_ParticleFXEmitKey)
    {
    visname_S            = "MFX_NewSpell_INIT";      //Эффект Инита
    scaleDuration        = 0.5;
    };
// Открытие ключа кастования
    INSTANCE spellFX_NewSpell_KEY_CAST (C_ParticleFXEmitKey)
    {
    visname_S                = "MFX_NewSpell_CAST";    //Эффект каста
    emtrjmode_s            = "TARGET";              //Должно лететь в цель
        emtrjeasevel            = 1600.;  //???
    sfxid                    = "MFX_Thunderbolt_Cast"; //Звуковой эффект при касте
    emCheckCollision        = 1;
    //emCreateFXID            = "FX_CAST2";
    };
// Открытие ключа столкновения
    INSTANCE spellFX_NewSpell_KEY_COLLIDE (C_ParticleFXEmitKey)
    {
        pfx_flygravity_s        = "0 0.0002 0";
    emtrjeasevel            = 0.000001;  //???
    emCheckCollision        = 0;    //вроде выбор колизии но трагать не станем
        };
//эффект при столкновении со статикой
        instance spellFX_NewSpell_COLLIDE        (CFx_Base_Proto)
        {
    visname_S        = "MFX_NewSpell_Collide"; //Название эфекта столкновения
    visAlpha        = 1; //чтото связанное с Альфа-каналом
    emtrjmode_s    = "FIXED"; //до конца не врубился
    sfxid            = "Torch_Enlight"; //звуковой эффект при столкновении
        };
//Искры при столкновении со статикой
        INSTANCE spellFX_NewSpell_COLLIDE_KEY_INVEST_1    (C_ParticleFXEmitKey)
        {
    visname_S    = "MFX_NewSpell_COLLIDE_SPARKS";
        };
//эффект при столкновении с динамикой
        instance spellFX_NewSpell_COLLIDEDYNFX        (CFx_Base_Proto)
        {
    visname_S        = "MFX_NewSpell_Collide"; //Название эфекта столкновения
    visAlpha        = 1; //чтото связанное с Альфа-каналом
    emtrjmode_s    = "FIXED"; //до конца не врубился
    sfxid            = "Torch_Enlight"; //звуковой эффект при столкновении
        };
//Искры при столкновении с динамикой
    INSTANCE spellFX_NewSpell_COLLIDEDYNFX_KEY_INVEST_1    (C_ParticleFXEmitKey)
        {
    visname_S    = "MFX_NewSpell_COLLIDE_SPARKS";
};
На этом создание эффекта завершено, теперь переходим к написанию скрипта заклинания.
Открываем файл _intern->Constants.d в нем объявляем константу нашего заклинания
Daedalus:
const int SPL_NewSpell          = 69;  //NewSpell
Также присвоим заклинанию наш Эффект тоже в файле _intern->Constants.d в массиве //spellFxInstanceNames//
Daedalus:
//Заменим Light названием нашего эффекта NewSpell
  "Light",                // 69  SPL_Reserved_69
  "Thunderstorm",        // 70  SPL_Thunderstorm //НЕ трогать дал чисто для того чтобы легче было найти нужную строку
Присвоим анимацию кастования в том-же файле, а именно _intern->Constants.d в массиве //spellFxAniLetters//
Daedalus:
//Заменим ХХХ на FBT вроде анимация каста огненного шара
  "XXX",                  // 69  SPL_Reserved_69
  "STM",                  // 70  SPL_Thunderstorm
Дальше идем в файл AI->Magic->Spell_ProcessMana.d
в нем обрабатываются процесы инвестирования маны и тд
в функции //Spell_ProcessMana//
вписываем это
Daedalus:
if(activeSpell == SPL_NewSpell            )    {    return    Spell_Logic_NewSpell        (manaInvested);    };
Теперь создадим файл, а в нем скрипт непосредственно самого заклинания.
AI->Magic->Spells->Spell_NewSpell.d
ВНИМАНИЕ!!! Файл Spell_NewSpell.d нужно ставить ПЕРЕД файлом Spell_ProcessMana.d ТК в нем объявляется Spell_Logic_NewSpell
Daedalus:
// стоимость заклинания
const int SPL_Cost_NewSpell    = 40;
 
//Повреждение от заклинания
const int SPL_Damage_NewSpell    = 65;
 
 
// объявление заклинания с инициализацией
INSTANCE Spell_NewSpell(C_Spell_Proto)
{
    time_per_mana            = 0;
    damage_per_level        = SPL_Damage_NewSpell;
};
 
// Функция инвестирования маны.
func int Spell_Logic_NewSpell(var int manaInvested)
{
    // если активное заклинание свиток и есть требуемое кол-во маны
    if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
    {
        // старт заклинания
        return SPL_SENDCAST;
    }
    // иначе, если руна и есть требуемое кол-во маны
    else if(self.attribute[ATR_MANA] >= SPL_Cost_NewSpell)
    {  
        // старт заклинания
        return SPL_SENDCAST;
    }
    else // мало маны
    {
        // отмена заклинания
        return SPL_SENDSTOP;
    };
return SPL_SENDSTOP;
};
 
// Вызов заклинания
func void Spell_Cast_NewSpell()
{
    // если свиток
    if(Npc_GetActiveSpellIsScroll(self))
    {
        // уменьшение маны на стоимость свитков
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
    }
    else // руна
    {
        // уменьшение маны на фактическую стоимость заклинания
        self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_NewSpell;
    };
    // изменить случайное число выбора заклинаний
    self.aivar[AIV_SelectSpell] += 1;
};
Все заклинание готово осталось внести последние штрихи, а именно создать Руну и свиток с данным заклинанием идем в файл ItemsIT_Runen.d или ItemsIT_Runes.d у кого как у меня IT_Runen.d
и пишем в нем следующий скрипт:
Daedalus:
//Создадим Руну
INSTANCE ItRu_NewSpell (C_Item)
{
    name                =    NAME_Rune; //Имя из файла Text.d "Руна"
    mainflag            =    ITEM_KAT_RUNE; //тип Руна
    flags                =    0;
    value                =    100; //Цена
    visual                =    "ItRu_Water04.3DS"; //Визуальный 3DS объект
    material            =    MAT_STONE;  //Материал Камень
    spell                =    SPL_NewSpell;  //наше заклинание
    mag_circle            =    2; //Круг магии можно убрать
    wear                =    WEAR_EFFECT;
    effect                =    "SPELLFX_WEAKGLIMMER_BLUE"; //синее свечение руны
    description            =    NAME_SPL_NewSpell; //Название нашего заклинания в файле Text.d
    TEXT    [0]            =    NAME_Mag_Circle;      
    COUNT    [0]            =    mag_circle; //Круг
    TEXT    [1]            =    NAME_Manakosten;          
    COUNT    [1]            =    SPL_Cost_NewSpell; //Стоит маны
    TEXT    [2]            =    NAME_Damage;          
    COUNT    [2]            =    SPL_DAMAGE_NewSpell; //повреждение
    TEXT    [5]            =    NAME_Value;                  
    COUNT    [5]            =    value;  //цена
};
//Теперь создадим свиток заклинания
INSTANCE ItSc_NewSpell (C_Item)
{
    name                =    "Свиток";
    mainflag            =    ITEM_KAT_RUNE;
    flags                =    ITEM_MULTI;
    value                =    100; //цена
    visual                =    "ItSc_Water02.3DS";
    material            =    MAT_LEATHER;
    spell                =    SPL_NewSpell; //наше заклинание
    cond_atr[2]                  =    ATR_MANA_MAX;
    cond_value[2]                  =    SPL_Cost_Scroll; //стоимость свитка
    wear                =    WEAR_EFFECT;
    effect                =    "SPELLFX_WEAKGLIMMER";
    description            =    NAME_SPL_NewSpell; //Заклинание магов Воды
    TEXT    [0]            =    Name_MageScroll;
    TEXT    [1]            =    NAME_Mana_needed;          
    COUNT    [1]            =    SPL_Cost_Scroll; //нада маны
    TEXT    [5]            =    NAME_Value;                  
    COUNT    [5]            =    value; //цена
};
Чуть не забыл надо еще прописать имяя заклинанию в файле Text.d
в массиве TXT_SPELLS
пишем на месте "TXT_SPL_RESERVED_69" Пишем "Заклинание Мага Воды"
далее в том-же файле ищем строку NAME_SPL_Reserved_69 = "NAME_SPL_RESERVED_69";
и заменяем ее NAME_SPL_NewSpell = "Заклинание Мага Воды";
Вот и все наше заклинание готово!

Всем пока, до новых встреч! ;-)
Автор статьи - Saturas.
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу