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

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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
del
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
возможно ли "родными скриптами игры"
Да. Только лучше заранее продумать место откуда она будет вызываться. что бы не вызывать её по сто раз из разных мест. я бы вызывал её из кровати.

Daedalus:
func void B_Hero_SetModelFatness(var C_Npc slf)
{
    if (Npc_IsPlayer(slf) == true)
    {
        var int STR_SetModelFatness;
        var float fatness;
        
        STR_SetModelFatness = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];

        if      (STR_SetModelFatness >= 150)    { fatness = 2;      }
        else if (STR_SetModelFatness >= 135)    { fatness = 1.6 ;   }
        else if (STR_SetModelFatness >= 120)    { fatness = 1.2 ;   }
        else if (STR_SetModelFatness >= 105)    { fatness = 0.8 ;   }
        else if (STR_SetModelFatness >= 90)     { fatness = 0.4 ;   }
        else if (STR_SetModelFatness >= 75)     { fatness = 0   ;   }
        else if (STR_SetModelFatness >= 60)     { fatness = -0.4;   }
        else if (STR_SetModelFatness >= 45)     { fatness = -0.8;   }
        else if (STR_SetModelFatness >= 30)     { fatness = -1.2;   }
        else if (STR_SetModelFatness >= 15)     { fatness = -1.6;   }
        else                                    { fatness = -2  ;   };

        Mdl_SetModelFatness(slf,fatness);       
    };
};

p.s.
по моему в G1 MDK была привязка Mdl_SetModelFatness к силе НПС.
 

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Т.е. когда ГГ взаимодействует с кроватью и спит?
это же твой мод. вот тебе и решать где вызывать эту функцию ;-)
Пост автоматически объединён:

Пожалуй, мне нравится.


Daedalus:
func void PC_Sleep(var int t)
{
    ...
    B_Hero_SetModelFatness(self);
    ...
};
Пост автоматически объединён:

if (STR_SetModelFatness >= 150) { fatness = 2; }
else if (STR_SetModelFatness >= 135) { fatness = 1.6 ; }
else if (STR_SetModelFatness >= 120) { fatness = 1.2 ; }
else if (STR_SetModelFatness >= 105) { fatness = 0.8 ; }
else if (STR_SetModelFatness >= 90) { fatness = 0.4 ; }
else if (STR_SetModelFatness >= 75) { fatness = 0 ; }
else if (STR_SetModelFatness >= 60) { fatness = -0.4; }
else if (STR_SetModelFatness >= 45) { fatness = -0.8; }
else if (STR_SetModelFatness >= 30) { fatness = -1.2; }
else if (STR_SetModelFatness >= 15) { fatness = -1.6; }
else { fatness = -2 ; };

а можно и наверное и так

Код:
fatness = (STR_SetModelFatness - 100) * 2 / 100 ;
if (fatness > 2) { fatness = 2;      } 
else if (fatness < -2) { fatness =  -2;      } ;
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Подскажите, пожалуйста, возможно ли "родными скриптами игры" сделать функцию или т.п. позволяющую внедрить динамичное изменение только для ГГ Mdl_SetModelFatness (толщина персонажа), в зависимости от "родного" показателя силы (sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH])?
Мда, "похудение" до Mdl_SetModelFatness(self,-2) для ГГ противопоказано:
2.png

Есть идеи, как эту прорезь на поясе можно поправить?
Полагаю, можно попробовать скорректировать это через Mdl_SetModelScale, выставив например Mdl_SetModelScale(slf,1,1,0.98); , пока ГГ не достигнет Mdl_SetModelFatness = 0 (на данном значении прорези уже не видно). Подскажите, пожалуйста, как это правильно дописать в B_Hero_SetModelFatness ?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Mdl_SetModelScale(slf,1,1,0.98);
Требует тестирования. В мод-фиксе увеличил одному неписю рост таким вот образом, так он начал подпрыгивать при появлении в кадре. :)

Есть идеи, как эту прорезь на поясе можно поправить?
Можно править модели всех доспехов-тел, доступных ГГ, в которых наблюдается такой вот разрыв. В мод-фиксе правились модели доспехов послушников Братства, у которых подобное наблюдается при нулевой толстости. Но этот путь, надо полагать, "не для всех".
 

KirTheSeeker

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

MW 7


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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
D36 правила модельки доспехов. Используй её архив с моделями.
Подскажи, пожалуйста, где его можно найти? В мастерской Steam я подобного файла не нахожу, как и соответствующей темы на форуме.
Или речь об этом?
 

MW 7


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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех вновь.
это же твой мод. вот тебе и решать где вызывать эту функцию ;-)
Пост автоматически объединён:




Daedalus:
func void PC_Sleep(var int t)
{
    ...
    B_Hero_SetModelFatness(self);
    ...
};
Пост автоматически объединён:



а можно и наверное и так

Код:
fatness = (STR_SetModelFatness - 100) * 2 / 100 ;
if (fatness > 2) { fatness = 2;      }
else if (fatness < -2) { fatness =  -2;      } ;
Благодарю, такой варианта работает.
Но при таком коде почему-то дублируются варианты диалога в кровати (т.е. по два варианта - "до утра", "до утра", "до полудня", "до полудня" и т.д.)
Код:
...

func void PC_Sleep(var int t)
{
    AI_StopProcessInfos(self);
    PLAYER_MOBSI_PRODUCTION = MOBSI_NONE;
    self.aivar[AIV_INVINCIBLE] = FALSE;
    B_Hero_SetModelFatness(self);
    if(Wld_IsTime(0,0,t,0))
    {
        Wld_SetTime(t,0);
    }
    else
    {
        t += 24;
        Wld_SetTime(t,0);
    };
    Wld_StopEffect("DEMENTOR_FX");
    if(SC_IsObsessed == TRUE)
    {
        PrintScreen(PRINT_SleepOverObsessed,-1,-1,FONT_Screen,2);
    }
    else
    {
//        B_Say_Overlay(hero,hero,"$AWAKE");
        PrintScreen(PRINT_SleepOver,-1,-1,FONT_Screen,2);
        BeerDay = 0;
        hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
        hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
    };
    if(Parlan_DontTalkToNovice == LOG_FAILED)
    {
        Parlan_DontTalkToNovice = LOG_Running;
    };
    B_CheckLog();
    B_CoolHotDraw(hero);
    B_ClearFakeItems(hero);
//    PrintGlobals(PD_ITEM_MOBSI);
    Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
};
...
Подскажите, пожалуйста, в чём может быть проблема?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
файл целиком скинь
Daedalus:
func void sleepabit_s1()
{
    if(C_NpcIsHero(self) || C_NpcIsRockefeller(self))
    {
        self.aivar[AIV_INVINCIBLE] = TRUE;
        PLAYER_MOBSI_PRODUCTION = MOBSI_SleepAbit;
        AI_ProcessInfos(self);
        if(SC_IsObsessed == TRUE)
        {
            Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALSE);
        };
    };
};

func void PC_Sleep(var int t)
{
    AI_StopProcessInfos(self);
    PLAYER_MOBSI_PRODUCTION = MOBSI_NONE;
    self.aivar[AIV_INVINCIBLE] = FALSE;
    B_Hero_SetModelFatness(self);
    if(Wld_IsTime(0,0,t,0))
    {
        Wld_SetTime(t,0);
    }
    else
    {
        t += 24;
        Wld_SetTime(t,0);
    };
    Wld_StopEffect("DEMENTOR_FX");
    if(SC_IsObsessed == TRUE)
    {
        PrintScreen(PRINT_SleepOverObsessed,-1,-1,FONT_Screen,2);
    }
    else
    {
//        B_Say_Overlay(hero,hero,"$AWAKE");
        PrintScreen(PRINT_SleepOver,-1,-1,FONT_Screen,2);
        BeerDay = 0;
        hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
        hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
    };
    if(Parlan_DontTalkToNovice == LOG_FAILED)
    {
        Parlan_DontTalkToNovice = LOG_Running;
    };
    B_CheckLog();
    B_CoolHotDraw(hero);
    B_ClearFakeItems(hero);
//    PrintGlobals(PD_ITEM_MOBSI);
    Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
};

instance PC_NoSleep(C_Info)
{
    npc = PC_Hero;
    nr = 999;
    condition = PC_NoSleep_Condition;
    information = PC_NoSleep_Info;
    important = FALSE;
    permanent = TRUE;
    description = Dialog_Ende;
};


func int PC_NoSleep_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_NoSleep_Info()
{
    AI_StopProcessInfos(self);
    Wld_StopEffect("DEMENTOR_FX");
    self.aivar[AIV_INVINCIBLE] = FALSE;
    PLAYER_MOBSI_PRODUCTION = MOBSI_NONE;
};


instance PC_SleepTime_Morning(C_Info)
{
    npc = PC_Hero;
    nr = 1;
    condition = PC_SleepTime_Morning_Condition;
    information = PC_SleepTime_Morning_Info;
    important = FALSE;
    permanent = TRUE;
    description = "—пать до утра";
};


func int PC_SleepTime_Morning_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_SleepTime_Morning_Info()
{
    PC_Sleep(8);
};


instance PC_SleepTime_Noon(C_Info)
{
    npc = PC_Hero;
    nr = 2;
    condition = PC_SleepTime_Noon_Condition;
    information = PC_SleepTime_Noon_Info;
    important = FALSE;
    permanent = TRUE;
    description = "—пать до полудн¤";
};


func int PC_SleepTime_Noon_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_SleepTime_Noon_Info()
{
    PC_Sleep(12);
};


instance PC_SleepTime_Evening(C_Info)
{
    npc = PC_Hero;
    nr = 3;
    condition = PC_SleepTime_Evening_Condition;
    information = PC_SleepTime_Evening_Info;
    important = FALSE;
    permanent = TRUE;
    description = "—пать до вечера";
};


func int PC_SleepTime_Evening_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_SleepTime_Evening_Info()
{
    PC_Sleep(20);
};


instance PC_SleepTime_Midnight(C_Info)
{
    npc = PC_Hero;
    nr = 4;
    condition = PC_SleepTime_Midnight_Condition;
    information = PC_SleepTime_Midnight_Info;
    important = FALSE;
    permanent = TRUE;
    description = "—пать до полуночи";
};


func int PC_SleepTime_Midnight_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_SleepTime_Midnight_Info()
{
    PC_Sleep(0);
};


instance PC_SleepTime_Dawn(C_Info)
{
    npc = PC_Hero;
    nr = 5;
    condition = PC_SleepTime_Dawn_Condition;
    information = PC_SleepTime_Dawn_Info;
    important = FALSE;
    permanent = TRUE;
    description = "—пать до рассвета";
};


func int PC_SleepTime_Dawn_Condition()
{
    if(PLAYER_MOBSI_PRODUCTION == MOBSI_SleepAbit)
    {
        return TRUE;
    };
};

func void PC_SleepTime_Dawn_Info()
{
    PC_Sleep(5);
};
 

Вложения

  • SleepFatness.7z
    1,4 KB · Просмотры: 2

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Но при таком коде почему-то дублируются варианты диалога в кровати (т.е. по два варианта - "до утра", "до утра", "до полудня", "до полудня" и т.д.)
если ты ложишь файл в папку авторан то у тебя в файле должна быть только та функция в которые ты вносишь изменения, то есть функция PC_Sleep
]
Daedalus:
func void PC_Sleep(var int t)
{
    AI_StopProcessInfos(self);
    PLAYER_MOBSI_PRODUCTION = MOBSI_NONE;
    self.aivar[AIV_INVINCIBLE] = FALSE;
    B_Hero_SetModelFatness(self);
    if(Wld_IsTime(0,0,t,0))
    {
        Wld_SetTime(t,0);
    }
    else
    {
        t += 24;
        Wld_SetTime(t,0);
    };
    Wld_StopEffect("DEMENTOR_FX");
    if(SC_IsObsessed == TRUE)
    {
        PrintScreen(PRINT_SleepOverObsessed,-1,-1,FONT_Screen,2);
    }
    else
    {
//        B_Say_Overlay(hero,hero,"$AWAKE");
        PrintScreen(PRINT_SleepOver,-1,-1,FONT_Screen,2);
        BeerDay = 0;
        hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
        hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
    };
    if(Parlan_DontTalkToNovice == LOG_FAILED)
    {
        Parlan_DontTalkToNovice = LOG_Running;
    };
    B_CheckLog();
    B_CoolHotDraw(hero);
    B_ClearFakeItems(hero);
//    PrintGlobals(PD_ITEM_MOBSI);
    Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
};
 

KirTheSeeker

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех вновь. Не получается найти в скриптах неоф. обновления скрижаль одноручки III (ItWr_OneHStonePlate3), но насколько помню она находится в сундуке перед Вороном.
Возможно ли через скрипты редактировать содержание сундуков в игре? Или это можно увидеть и поменять только через Spacer?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Возможно ли через скрипты редактировать содержание сундуков в игре? Или это можно увидеть и поменять только через Spacer?
1. увидеть можно в файле мира открыв его в программе(Spacer, Spacer.NET, блокнот и т.д.)
2. поменять можно отредактировав файл мира в программе(Spacer, Spacer.NET, блокнот и т.д.)
3. добавить / удалить можно через скрипты, если:
* сундук имеет уникальное имя если
* есть понимание как его "определить" через скрипты
* если использовать zParserExtender
 

KirTheSeeker

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

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.224
Благодарности
3.454
Баллы
485
Приветствую всех.
Подскажите, пожалуйста, есть ли в скриптах переменная, которая отслеживает количество приготовленных игроком зелий?
TotalPotionsBrewed в 29 версии неофициального обновления. Если у тебя такой переменной нет, то добавь счетчик TotalPotionsBrewed += 1 в B_BrewPotion.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех. Вопрос по скриптам неоф. обновления Г2НВ:
- Подскажите, пожалуйста, где прописываются требования для изучения зелий? Я имею в виду, например, чтобы соблюдалась последовательность появления диалогов при обучении "эссенция - экстракт - эликсир".
- Для корректного добавления дополнительных требований править нужно B_GetLearnCostTalent.d или B_TeachPlayerTalentAlchemy.d ?
Daedalus:
func int B_GetLearnCostTalent(var C_Npc oth,var int talent,var int skill)
{
    
    if(talent == NPC_TALENT_ALCHEMY)
    {
        if(skill == POTION_Health_01)
        {
            if(ClassicAlchemy == FALSE)
            {
                kosten = 1;
            }
            else
            {
                kosten = 2;
            };
        }
        else if(skill == POTION_Health_02)
        {
            kosten = 4;
        }
        else if(skill == POTION_Health_03)
        {
            kosten = 6;
        }
        else if(skill == POTION_Health_04)
        {
            kosten = 8;
        }
        else if(skill == POTION_Mana_01)
        {
            if(ClassicAlchemy == FALSE)
            {
                kosten = 1;
            }
            else
            {
                kosten = 2;
            };
        }
        else if(skill == POTION_Mana_02)
        {
            kosten = 4;
        }
        else if(skill == POTION_Mana_03)
        {
            kosten = 6;
        }
        else if(skill == POTION_Mana_04)
        {
            kosten = 8;
        }
        else if(skill == POTION_Speed)
        {
            kosten = 4;
        }
        else if(skill == POTION_Perm_STR)
        {
            if(ClassicAlchemy == FALSE)
            {
                kosten = 20;
            }
            else
            {
                kosten = 8;
            };
        }
        else if(skill == POTION_Perm_DEX)
        {
            if(ClassicAlchemy == FALSE)
            {
                kosten = 20;
            }
            else
            {
                kosten = 10;
            };
        }
        else if(skill == POTION_Perm_Mana)
        {
            kosten = 8;
        }
        else if(skill == POTION_Perm_Health)
        {
            kosten = 8;
        }
        else if(skill == POTION_MegaDrink)
        {
            kosten = 5;
        };
    };

    return kosten;
};

Daedalus:
func int B_TeachPlayerTalentAlchemy(var C_Npc slf,var C_Npc oth,var int potion)
{
    var int kosten;
    kosten = B_GetLearnCostTalent(oth,NPC_TALENT_ALCHEMY,potion);
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_ScreenSmall,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    oth.lp -= kosten;
    if(Npc_GetTalentSkill(oth,NPC_TALENT_ALCHEMY) == 0)
    {
        Npc_SetTalentSkill(oth,NPC_TALENT_ALCHEMY,1);
        Log_CreateTopic(TOPIC_TalentAlchemy,LOG_NOTE);
        Log_AddEntry(TOPIC_TalentAlchemy,"Чтобы сварить зелье, мне нужна пустая мензурка и необходимые для этого зелья ингредиенты. Из этих ингредиентов я могу приготовить зелье на алхимическом столе.");
    };
    if(potion == POTION_Health_01)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Health_01] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЛЕЧЕБНОЙ ЭССЕНЦИИ': 2 лечебные травы и 1 луговой горец.");
    }
    else if(potion == POTION_Health_02)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Health_02] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЛЕЧЕБНОГО ЭКСТРАКТА': 2 лечебных растения и 1 луговой горец.");
    }
    else if(potion == POTION_Health_03)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Health_03] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЛЕЧЕБНОГО ЭЛИКСИРА': 2 лечебных корня и 1 луговой горец.");
    }
    else if(potion == POTION_Mana_01)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Mana_01] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭССЕНЦИИ МАНЫ': 2 огненных крапивы и 1 луговой горец.");
    }
    else if(potion == POTION_Mana_02)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Mana_02] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭКСТРАКТА МАНЫ': 2 огненных травы и 1 луговой горец.");
    }
    else if(potion == POTION_Mana_03)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Mana_03] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭЛИКСИРА МАНЫ': 2 огненных корня и 1 луговой горец");
    }
    else if(potion == POTION_Speed)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Speed] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЗЕЛЬЯ УСКОРЕНИЯ': 1 снеппер-трава и 1 луговой горец");
    }
    else if(potion == POTION_Perm_STR)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Perm_STR] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭЛИКСИРА СИЛЫ': 1 драконий корень и 1 царский щавель.");
    }
    else if(potion == POTION_Perm_DEX)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Perm_DEX] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭЛИКСИРА ЛОВКОСТИ': 1 гоблинская ягода и 1 царский щавель.");
    }
    else if(potion == POTION_Perm_Mana)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Perm_Mana] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭЛИКСИРА ДУХА': 1 огненный корень и 1 царский щавель.");
    }
    else if(potion == POTION_Perm_Health)
    {
        PLAYER_TALENT_ALCHEMY[POTION_Perm_Health] = TRUE;
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭЛИКСИРА ЖИЗНИ': 1 лечебный корень и 1 царский щавель.");
    };
    if((Opened_LousHammer == TRUE) && (Knows_LousHammer == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'МОЛОТА ЛУ': 1 вода, 2 репы, 1 болотная трава, 1 зуб болотной акулы и 1 ром.");
        Knows_LousHammer = TRUE;
    };
    if((Opened_Schlafhammer == TRUE) && (Knows_Schlafhammer == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для двойного 'МОЛОТА ЛУ': 1 'Молот Лу' и 1 ром.");
        Knows_Schlafhammer = TRUE;
    };
    if((Opened_SchnellerHering == TRUE) && (Knows_SchnellerHering == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'БЫСТРОЙ СЕЛЕДКИ': 1 вода, 1 ром, 1 рыба и 1 снеппер-трава.");
        Knows_SchnellerHering = TRUE;
    };
    if((Opened_MushroomMana == TRUE) && (Knows_MushroomMana == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ГРИБНОГО ЭКСТРАКТА': 50 черных грибов и 1 луговая ягода.");
        Knows_MushroomMana = TRUE;
    };
    if((Opened_AppleSTR == TRUE) && (Knows_AppleSTR == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЯБЛОЧНОГО ЭКСТРАКТА': 25 яблок и 1 лесная ягода.");
        Knows_AppleSTR = TRUE;
    };
    if((Opened_MegaDrink == TRUE) && (PLAYER_TALENT_ALCHEMY[POTION_MegaDrink] == FALSE))
    {
        B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для 'ЭМБАРЛА ФИРГАСТО': 10 драконьих яиц, 1 черная жемчужина и 1 сера.");
        PLAYER_TALENT_ALCHEMY[POTION_MegaDrink] = TRUE;
    };
    PrintScreen(PRINT_LearnAlchemy,-1,-1,FONT_Screen,2);
    return TRUE;
};
 
Сверху Снизу