dosinabox / g2nr_unofficial_update

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

Кольцо воды. встреча в таверни #325

Closed Kor-Angar closed 1 year ago

Kor-Angar commented 3 years ago

Сегодня была редкая ситуация. когда герой пришёл на встречу кольца воды в таверну Орлан стоял на улице (в рамках квеста "пей до дна"). в результате корд вставился почти на глазах у Героя :-)

https://youtu.be/vjj9XEnND7w?t=8773

можно будет в следующий раз сделать сейв и присмотреться к подобной ситуации повнимательнее

dosinabox commented 3 years ago

Имеется функция, переводящая членов Кольца в режим ожидания после завершения церемонии принятия ГГ. После получения задания от Ватраса они расходятся по своим делам, но до тех пор ждут в расписании "Parking" в таверне:

func void B_RangerMeetingParking()
{
    if(MIS_Addon_Cavalorn_GetOrnamentFromPAL != FALSE)
    {
        B_StartOtherRoutine(Cavalorn,"Stadt");
    };
    B_StartOtherRoutine(Orlan,"Start");
    B_StartOtherRoutine(Lares,"Parking");
    B_StartOtherRoutine(Cord,"Parking");
    B_StartOtherRoutine(Gaan,"Parking");
    B_StartOtherRoutine(Martin,"Parking");
    Lares_HaltsMaul = TRUE;
};

Все, кроме Орлана и Кавалорна. С Орланом понятно - он работает в таверне и ему нет смысла стоять в дальнем углу, поэтому его отправляют обратно за прилавок. Но впрочем, неиспользуемое расписание "Parking" у него тоже есть.

А с Кавалорном непонятно. На расписание "Parking" его не отправляют, он или остается в расписании церемонии, или уходит в город сидеть на скамейке. А в MDK есть такой комментарий:

B_StartOtherRoutine (Cavalorn,"Stadt"); //Joly:nicht parking. Der plöppt sonst bei Vat vat rein.    

Гугл-перевод ясность не вносит: "Иначе он заглянет на День отца". Есть мысли?

Kor-Angar commented 3 years ago

из "паркинга" их потом массово переводят на расписание "старт"?

Kor-Angar commented 3 years ago

Parking

func VOID B_RangerMeetingParking () // im Lares dialog
{
    if (MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
    {
        B_StartOtherRoutine (Cavalorn,"Stadt"); //Joly:nicht parking. Der plцppt sonst bei Vat vat rein.            
    };

    B_StartOtherRoutine (Orlan,"START");    

    Lares_HaltsMaul = TRUE;
    B_StartOtherRoutine (Lares,"Parking");              

    B_StartOtherRoutine (Cord,"Parking");                   
    if ((Gaan.aivar[AIV_TalkedToPlayer] == FALSE))
    {
        B_StartOtherRoutine (Gaan,"Parking");}else{B_StartOtherRoutine  (Gaan,"Parking");                   
    };
    if (MIS_Addon_Martin_GetRangar == 0)
    {
        B_StartOtherRoutine (Martin,"Parking");}else{B_StartOtherRoutine (Martin,"Parking");
    };
};

Start

func VOID B_SchlussMitRangerMeeting () //im Vatras dialog
{
    if (MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
    {
        B_StartOtherRoutine (Cavalorn,"Stadt");             
    };

    B_StartOtherRoutine (Lares,"Start");                

    B_StartOtherRoutine (Cord,"Start");                 
    if ((Gaan.aivar[AIV_TalkedToPlayer] == FALSE))
    {
        B_StartOtherRoutine (Gaan,"PreStart");}else{B_StartOtherRoutine (Gaan,"Start");                 
    };
    if (MIS_Addon_Martin_GetRangar == 0)
    {
        B_StartOtherRoutine (Martin,"PreStart");}else{B_StartOtherRoutine (Martin,"Start");
    };
    B_StartOtherRoutine (Orlan,"Start");    
    Lares_HaltsMaul = LOG_OBSOLETE;         
};
Kor-Angar commented 3 years ago
FUNC VOID Rtn_Parking_4300 ()
{   
    TA_Stand_ArmsCrossed    (05,00,20,00,"NW_TAVERNE_IN_RANGERMEETING");    
    TA_Stand_ArmsCrossed    (20,00,05,00,"NW_TAVERNE_IN_RANGERMEETING");
};
Kor-Angar commented 3 years ago

Гугл-перевод ясность не вносит: "Иначе он заглянет на День отца". Есть мысли?

понимать следует так: не парковать(nicht parking) при условии MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0

соответственно можно добавить "иначе" и припарковать :-)

    if (MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
    {
        B_StartOtherRoutine (Cavalorn,"Stadt"); //Joly:nicht parking. Der plцppt sonst bei Vat vat rein.            
    }
    else
    {
        B_StartOtherRoutine (Cavalorn,"Parking"); // иначе паркуем.
    };

это чисто скриптовая логика пираней. там такая же история была в Готики 1 про церемонию вызова спящего (конец 2 главы). вот группа лиц у них есть коллективное расписание

сразу непонятно зачем вообще нужно Parking, чем он отличается от RangerMeeting?:-) но именно через Готику 1 становится понятно зачем :) Parking подразумевает что у них может быть другое действие, например два говорят третий сел на стул, чётвертый бухаев но все они находятся там же в режиме "ожидания". это как например в армии есть "внимание" и "вольно".

при этом естественно пираньи используют скриптовые болванки с потенциалом, но сами же этот потенциал не вырабатывают. Соответственно их всех можно смело переводить на Parking, а потом в рамках этого эпизода разбивать их на группы и чем то занимать. Например:

или кого то можно вообще отправить спать на второй этаж, например тоже Мартина :-)

Kor-Angar commented 3 years ago

вот так делается

    if ((Gaan.aivar[AIV_TalkedToPlayer] == FALSE))
    {
        B_StartOtherRoutine (Gaan,"Parking");
    }
    else
    {
        B_StartOtherRoutine (Gaan,"Parking");                   
    };

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

Kor-Angar commented 3 years ago

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

dosinabox commented 3 years ago

сразу непонятно зачем вообще нужно Parking, чем он отличается от RangerMeeting?:-)

В Parking нпц находится в состоянии ZS_Stand_ArmsCrossed, в RangerMeeting - в ZS_Stand_RangerMeeting. Разные восприятия, анимации, реакции.

соответственно можно добавить "иначе" и припарковать :-)

Проверка на MIS_Addon_Cavalorn_GetOrnamentFromPAL делается, чтобы Кавалорн мог дать совет ГГ по поиску орнамента у паладинов. При FALSE совет ещё не дан и Кавалорн может стоять у круга камней, ждать ГГ - в таком случае его не трогают и на встречу в таверне он не приходит. И парковать его не следует. А вот причин НЕ парковать его в B_RangerMeetingParking() с существующим условием вместо Stadt (города) я не вижу. Всё равно он уходит на Stadt в B_SchlussMitRangerMeeting() после диалога с Ватрасом.

Kor-Angar commented 3 years ago

проверка на MIS_Addon_Cavalorn_GetOrnamentFromPAL недостаточная.

может быть ситуация что MIS_Addon_Cavalorn_GetOrnamentFromPAL = 0, а орнамент находится у Лареса.

Kor-Angar commented 3 years ago

if (MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)

тоже самое что

if  (MIS_Addon_Cavalorn_GetOrnamentFromPAL == 1) // LOG_Running // Каваларон отправил героя к Хагену
||  (MIS_Addon_Cavalorn_GetOrnamentFromPAL == 2) // LOG_SUCCESS // герой побывал у Хагена и рассказал об этом Каваларону
//||  (MIS_Addon_Cavalorn_GetOrnamentFromPAL == 3) // LOG_FAILED
//||  (MIS_Addon_Cavalorn_GetOrnamentFromPAL == 4) // LOG_OBSOLETE 
{
        B_StartOtherRoutine (Cavalorn,"Stadt"); //Joly:nicht parking. Der plцppt sonst bei Vat vat rein.            
}

в таком случае сюжетно парковка ни на что не влияет

Kor-Angar commented 3 years ago

может быть ситуация что MIS_Addon_Cavalorn_GetOrnamentFromPAL = 0, а орнамент находится у Лареса.

как то так надо реализовывать проверку. что бы одно из другого вытекало и можно было прочитать это однозначно.

func void B_Addon_Orlan_RangersReadyForComing ()
{
        // задание Нефариуса не взято ==> Кавалорон не на круге
    if (MIS_Addon_Nefarius_BringMissingOrnaments == 0)
    {
        B_StartOtherRoutine (Cavalorn,"PreRangerMeeting");
    }
    // задание Нефариуса взято, Кавалорон отправил героя к Хагену
    else if (MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
    {
        B_StartOtherRoutine (Cavalorn,"PreRangerMeeting");
    };
dosinabox commented 3 years ago

Почему просто не заменить Stadt на Parking в B_RangerMeetingParking() для Кавалорна?

Kor-Angar commented 3 years ago

понял. это что бы избежать мгновенного появление Каваларона за спиной ГГ в диалоге с Ватрасом.

то есть идёт диалог DIA_Addon_Vatras_CloseMeeting_Info

и внезапно на заднем фоне появляется Каваларон

dosinabox commented 3 years ago

понял. это что бы избежать мгновенного появление Каваларона за спиной ГГ в диалоге с Ватрасом.

Стало понятнее. С паркингом то же самое. Если собрать всех на церемонию без Кавалорна (при MIS_Addon_Cavalorn_GetOrnamentFromPAL == FALSE), уйти, встретить его у круга камней, получить совет (после чего он уйдет в город), вернуться в таверну и завершить церемонию, то он действительно внезапно появится в таверне. И перевод на английский подсказывает, что это близко к истине) "Otherwise he'll pop in at Father's Day". Значит, не трогаем.