dosinabox / g2nr_unofficial_update

Исходники скриптов, релизы, хотфиксы и тестовые версии неофициального обновления для игры "Готика 2: Ночь Ворона".
https://worldofplayers.ru/threads/36817
The Unlicense
13 stars 1 forks source link

Рога мракорисов для Бастера #313

Closed dosinabox closed 3 years ago

dosinabox commented 3 years ago

Ситуация вполне возможная, не так ли?)

вполне возможно.

dosinabox commented 3 years ago
  • убирается аллогичный диалог "-А как нужно потрошить мракориса? - Мой торговец из города передал прощальный привет."
  • пока квест не закрыт, всегда есть диалог у Бастера "Насчет рогов мракорисов..." с диалогом про "Кто этот торговец, о котором ты говоришь?"
  • можно закрыть квест в 5 главе без рогов в лаконичном диалоге "-Кто этот торговец, о котором ты говоришь? - Мой торговец из города передал прощальный привет."

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

Info_AddChoice(DIA_Buster_BringTrophyShadowbeast,"Я вернусь к тебе с рогами.",DIA_Buster_BringTrophyShadowbeast_back);
Kor-Angar commented 3 years ago

а самой фразы озвученной "Насчет рогов мракорисов..." нету?

Kor-Angar commented 3 years ago

а в твоей расширенной версии Миненталя случайно в башне в старом замке нету наверху рогов?

Kor-Angar commented 3 years ago
Info_ClearChoices(DIA_Buster_BringTrophyShadowbeast);
Info_AddChoice(DIA_Buster_BringTrophyShadowbeast,"Я вернусь к тебе с рогами.",DIA_Buster_BringTrophyShadowbeast_back);
Info_AddChoice(DIA_Buster_BringTrophyShadowbeast,B_BuildLearnString("Научи меня.",B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_ShadowHorn)),DIA_Buster_BringTrophyShadowbeast_teach);
Info_ClearChoices   (DIA_Buster_BringTrophyShadowbeast);
Info_AddChoice  (DIA_Buster_BringTrophyShadowbeast, "Ich komm noch darauf zurьck.", DIA_Buster_BringTrophyShadowbeast_back );
Info_AddChoice  (DIA_Buster_BringTrophyShadowbeast, B_BuildLearnString ("Bring es mir bei",B_GetLearnCostTalent (other,NPC_TALENT_TAKEANIMALTROPHY, TROPHY_ShadowHorn)),  DIA_Buster_BringTrophyShadowbeast_teach );

"Я вернусь к тебе с рогами." это корректный перевод? :-)

dosinabox commented 3 years ago

а в твоей расширенной версии Миненталя случайно в башне в старом замке нету наверху рогов?

нет

а самой фразы озвученной "Насчет рогов мракорисов..." нету?

нету

"Я вернусь к тебе с рогами." это корректный перевод? :-)

Получается, нет) Откуда-то рога взялись.

dosinabox commented 3 years ago

В общем, всё это дело у меня уже сделано по другому: https://github.com/dosinabox/g2nr_unofficial_update/blob/work/PrjGOTHIC/Story/Dialoge/DIA_SLD_802_Buster.d

В частности:

Функция подсчета рогов:

func int CountAvailableShadowbeastsHorns()
{
    var int AvailableShadowbeastsHorns;
    AvailableShadowbeastsHorns = 4; //рога в Яркендаре
    if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_ShadowHorn] == TRUE) //если ГГ умеет снимать рога
    {
        if(Wasteland_Seeded == TRUE) //если ГГ посетил расширенный Миненталь
        {
            AvailableShadowbeastsHorns += 1; //мракорис из расширенного Миненталя
        };
        AvailableShadowbeastsHorns += 17; //все существующие мракорисы (Хоринис+Миненталь+Яркендар)
        AvailableShadowbeastsHorns -= ShadowbeastHornsWasted; //минус мракорисы, убитые без навыка снятия
    };
    return AvailableShadowbeastsHorns;
};
dosinabox commented 3 years ago

мракорисы, убитые без навыка снятия

B_GiveDeathInv:

if((PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_ShadowHorn] == FALSE) && (slf.aivar[AIV_MM_REAL_ID] == ID_SHADOWBEAST))
{
    ShadowbeastHornsWasted += 1;
};
dosinabox commented 3 years ago

Занятно, что разработчики считали общее количество принесенных рогов, но никак не использовали это значение. Теперь оно будет показываться в книге статистики и учитываться в 5 главе для начисления опыта.

Kor-Angar commented 3 years ago

обучение вынесено в отдельный диалог и доступно после начала квеста независимо от его статуса

а почему MIS_Buster_KillShadowbeasts_DJG != FALSE ведь логичнее MIS_Buster_KillShadowbeasts_DJG == LOG_Running ?

Бастер сам обратится к ГГ в пятой главе, если все рога собраны (новый диалог DIA_Buster_DealerIsDead)

а если собраны не все рога? тогда герой в 5 главе скажет вот тебе рог, а Бастер скажет а он мне нафиг не нужен? :-)

dosinabox commented 3 years ago

а почему MIS_Buster_KillShadowbeasts_DJG != FALSE ведь логичнее MIS_Buster_KillShadowbeasts_DJG == LOG_Running ?

Потому что после завершения квеста MIS_Buster_KillShadowbeasts_DJG станет LOG_SUCCESS и возможность обучения пропадет.

а если собраны не все рога? тогда герой в 5 главе скажет вот тебе рог, а Бастер скажет а он мне нафиг не нужен? :-)

Да, и ГГ получит опыт. Точно как в оригинале. Предлагаешь просто всегда обращаться к ГГ в 5 главе и закрывать квест без реплик ГГ?

Kor-Angar commented 3 years ago

Потому что после завершения квеста MIS_Buster_KillShadowbeasts_DJG станет LOG_SUCCESS и возможность обучения пропадет.

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

Предлагаешь просто всегда обращаться к ГГ в 5 главе и закрывать квест без реплик ГГ?

вот так можно сделать с репликами:

instance DIA_Buster_DealerIsDead(C_Info)
{
    npc = SLD_802_Buster;
    nr = 5;
    condition = DIA_Buster_DealerIsDead_Condition;
    information = DIA_Buster_DealerIsDead_Info;
    important = TRUE;
};

func int DIA_Buster_DealerIsDead_Condition()
{
    if  (MIS_Buster_KillShadowbeasts_DJG == LOG_Running) 
    &&  (Kapitel >= 5)
    &&  (Npc_IsInState(self,ZS_Talk)
    //&&    (BusterTrophyCounter >= CountAvailableShadowbeastsHorns())
    {
        return TRUE;
    };
};

func void DIA_Buster_DealerIsDead_Info()
{
    if(Npc_HasItems(other,ItAt_ShadowHorn) == 1)
    {
        AI_Output(other,self,"DIA_Buster_BringTrophyShadowbeast_15_05");    //Я принес тебе рог мракориса.
    }
    else if(Npc_HasItems(other,ItAt_ShadowHorn) > 1)
    {
        AI_Output(other,self,"DIA_Buster_BringTrophyShadowbeast_15_06");    //Я принес рога мракорисов для твоего торговца.
    }
    else
    {
        AI_Output(other,self,"DIA_Buster_SHADOWBEASTS_wer_15_00");  //Кто этот торговец, о котором ты говоришь?
    };
    AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_13_00");    //Мой торговец из города передал прощальный привет.
    AI_Output(other,self,"DIA_Buster_BringTrophyShadowbeast_15_01");    //Что это значит?
    AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_13_02");    //Он мертв. Можешь оставить эти рога себе. Теперь я все равно не знаю, что с ними делать.
    MIS_Buster_KillShadowbeasts_DJG = LOG_SUCCESS;
    if((BusterTrophyCounter > 0) || Npc_HasItems(other,ItAt_ShadowHorn))
    {
        B_GivePlayerXP(XP_AmbientKap5);
    }
    else
    {
        B_CheckLog();
    };
    AI_StopProcessInfos(self);
};

а то на выход на разговор про мертвого торговца из диалога про обучение, это прям совсем вырви мозг :-)

// оффтоп кстати твоя система с новыми репликами Беннетом о новых мечах работали некорректно в игре. я их потом отдельно тестил, через раз срабатывали.


можно кстати один рог мракориса вставить в амуницию элитному орку появляющемуся в минентале при открытие ворот замка(5 глава) или предводителю орков который появляется в 4 главе в хориносе.

Kor-Angar commented 3 years ago

Получается, нет) Откуда-то рога взялись.

тогда может заменить на другую более подходящую по смыслу реплику? :-)

dosinabox commented 3 years ago

вот так можно сделать с репликами

А зачем здесь реплики ГГ? Пусть Бастер сам объявит что торговцу кирдык и сразу закроет квест. Если при этом у ГГ есть рог (или если приносил ранее), то дать опыт XP_AmbientKap5. И не надо мудрить и выходить на эту инфу из диалогов сдачи рогов или обучения. И не надо считать доступные рога.

Kor-Angar commented 3 years ago

оно вот когда так

(Npc_IsInState(self,ZS_Talk)

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

а вот с (Npc_IsInState(self,ZS_Talk) очень всё стабильно. но (Npc_IsInState(self,ZS_Talk) без начальной реплики героя при использование диалоги получаются иногда куции(пожалуй за исключением диалогов Пирокара с послушником и Ксардаса с ГГ, но там прям накал страстей идёт, когда герою рот затыкают).

опять же если у героя будут рога, то по сути диалог в таком случае будет 100% оригинальный, полный и смотреться будет лучше.

я могу у себя потестить.

dosinabox commented 3 years ago

Проверка Npc_IsInState(self,ZS_Talk) для important диалогов нужна, чтобы персонаж не окликал ГГ - такой диалог произойдет автоматически только если ГГ начнет разговор первым. Но если ГГ начнет important диалог первым, то он произойдет даже без проверки Npc_IsInState(self,ZS_Talk).

так как бывает что герой успевает раньше обратится к НПС чем НПС начнёт говорит с героем :-)

В этом случае: important + Npc_IsInState - диалог произойдет important без Npc_IsInState - диалог всё равно произойдет

или НПС подвис или НПС кого атаковал

В этом случае: important + Npc_IsInState - диалог не произойдет, пока ГГ его не начнет important без Npc_IsInState - диалог всё равно произойдет

dosinabox commented 3 years ago

Я к тому, что здесь не нужны ни реплики ГГ, ни проверка Npc_IsInState. У Бастера есть новость и он сам сообщает её ГГ при встрече.

тогда может заменить на другую более подходящую по смыслу реплику? :-)

Тогда эта пропадет)

Kor-Angar commented 3 years ago

Тогда эта пропадет)

так это реплика несет другой смысл.

important без Npc_IsInState - диалог всё равно произойдет

в теории должен происходить. а на практике такие диалоги не происходят. может дело в nr = 5; или ещё чем то.

Я к тому, что здесь не нужны ни реплики ГГ, ни проверка Npc_IsInState.

может и не нужны ;-) резюмируя: изначально закрытие диалога происходило через диалог с Бастером "Wegen den Hцrnern der Schattenlдufer..." ("Насчет рогов мракорисов...") в рамках одной инстанции. ввиду отсутствия этой общей фразы начались пляски с изменением DIA_BusterBringTrophyShadowbeast.description и как следствие "закрывашка" происходила через "псевдосдачу" рогов. Сегодня всё это было переписано с нуля. Вынесено обучение в отдельную инстанцию и закрывашка в отдельную. Ты хочешь это сделать "новостью". ввиду того что реплики "Насчет рогов мракорисов..."_ нету, то любой вариант будет новоделом и вопросом вкуса. мне кажется на такую прям "новость" что бы Бастер останавливал героя это не тянет и предлагал использовать Npc_IsInState с первоначальной лепликой героя. ну это мне так кажется. может для Бастера это действительно важная новость которой надо поделится с героем :-)

опять же если у героя будут рога, то по сути диалог в таком случае будет 100% оригинальный, полный и смотреться будет лучше.

тут я ошибся. извиняюсь. забыл заглянуть в оригинальный немецкий код. это не оригинальное, а очень удачная твоя(?) импровизация.

dosinabox commented 3 years ago

так это реплика несет другой смысл.

Нужно послушать саму реплику на немецком. Текст может и не совпадать.

Kor-Angar commented 3 years ago

DIA_Buster_BringTrophyShadowbeast_back_15_00

DIA_BUSTER_BRINGTROPHYSHADOWBEAST_BACK_15_00.zip

dosinabox commented 3 years ago

Получилось и поправить перевод, и сохранить реплику:

func void DIA_Buster_TeachTrophyShadowbeast_Info()
{
    AI_Output(other,self,"DIA_Buster_ANIMALTROPHYSHADOWBEAST_15_03");   //А как нужно потрошить мракориса?
    AI_Output(self,other,"DIA_Buster_ANIMALTROPHYSHADOWBEAST_13_04");   //Ты этого не знаешь? Ох, парень, я думал о тебе лучше.
    if(Buster_TrophyTeacher == FALSE)
    {
        Log_CreateTopic(TOPIC_SoldierTeacher,LOG_NOTE);
        B_LogEntry(TOPIC_SoldierTeacher,"Бастер может показать мне, как правильно вырезать рога мракорисов.");
        Buster_TrophyTeacher = TRUE;
    };
    Info_ClearChoices(DIA_Buster_TeachTrophyShadowbeast);
    Info_AddChoice(DIA_Buster_TeachTrophyShadowbeast,"Вернемся к этому позже.",DIA_Buster_TeachTrophyShadowbeast_back);
    Info_AddChoice(DIA_Buster_TeachTrophyShadowbeast,B_BuildLearnString("Научи меня.",B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_ShadowHorn)),DIA_Buster_TeachTrophyShadowbeast_teach);
};

func void DIA_Buster_TeachTrophyShadowbeast_teach()
{
    AI_Output(other,self,"DIA_Buster_BringTrophyShadowbeast_teach_15_00");  //Научи меня.
    if(B_TeachPlayerTalentTakeAnimalTrophy(self,other,TROPHY_ShadowHorn))
    {
        AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_teach_13_01");  //Ладно, слушай. Убиваешь мракориса, и как можно крепче берешь его рог правой рукой.
        AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_teach_13_02");  //Затем приставляешь нож к его лбу и делаешь глубокий разрез вокруг рога.
        AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_teach_13_03");  //Ну, а потом просто поддеваешь рог ножом, используя его как рычаг, и кладешь рог себе в карман.
        if(MIS_Buster_KillShadowbeasts_DJG == LOG_Running)
        {
            AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_teach_13_04");  //И приносишь его мне. Я думаю, у тебя получится.
            AI_Output(other,self,"DIA_Buster_BringTrophyShadowbeast_back_15_00");   //Я вернусь к тебе с рогами.
        };
    };
    Info_ClearChoices(DIA_Buster_TeachTrophyShadowbeast);
};

func void DIA_Buster_TeachTrophyShadowbeast_back()
{
    AI_Output(other,self,"DIA_Opolos_rezept_15_06");    //Вернемся к этому позже.
    if(MIS_Buster_KillShadowbeasts_DJG == LOG_Running)
    {
        AI_Output(self,other,"DIA_Buster_BringTrophyShadowbeast_back_13_01");   //Надеюсь.
    };
    Info_ClearChoices(DIA_Buster_TeachTrophyShadowbeast);
};
Kor-Angar commented 3 years ago
if(MIS_Buster_KillShadowbeasts_DJG == LOG_Running)

:-D