Closed Kor-Angar closed 1 year 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.
Гугл-перевод ясность не вносит: "Иначе он заглянет на День отца". Есть мысли?
из "паркинга" их потом массово переводят на расписание "старт"?
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;
};
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");
};
Гугл-перевод ясность не вносит: "Иначе он заглянет на День отца". Есть мысли?
понимать следует так: не парковать(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, а потом в рамках этого эпизода разбивать их на группы и чем то занимать. Например:
или кого то можно вообще отправить спать на второй этаж, например тоже Мартина :-)
вот так делается
if ((Gaan.aivar[AIV_TalkedToPlayer] == FALSE))
{
B_StartOtherRoutine (Gaan,"Parking");
}
else
{
B_StartOtherRoutine (Gaan,"Parking");
};
что бы мы видели какая есть "связь" у нпс с героем. это хорошо, так как читая код в этом месте ты понимаешь что могло быть, а могло быть вот так :-)
то есть это тоже из области "потенциала" заложены проверки на то выполнял ли квест герой Мартина и потенциал на разветвление событий, если выполнял то так, а если не выполнял то эдак. например если квест выполнен, то мартин знает что у него в порту всё ок и может тусить в таверне лишний час. а если квест не выполнен, то у него в порту тавары пропадают и ему нужно спешить назад на службу в порт.
сразу непонятно зачем вообще нужно Parking, чем он отличается от RangerMeeting?:-)
В Parking нпц находится в состоянии ZS_Stand_ArmsCrossed, в RangerMeeting - в ZS_Stand_RangerMeeting. Разные восприятия, анимации, реакции.
соответственно можно добавить "иначе" и припарковать :-)
Проверка на MIS_Addon_Cavalorn_GetOrnamentFromPAL делается, чтобы Кавалорн мог дать совет ГГ по поиску орнамента у паладинов. При FALSE совет ещё не дан и Кавалорн может стоять у круга камней, ждать ГГ - в таком случае его не трогают и на встречу в таверне он не приходит. И парковать его не следует. А вот причин НЕ парковать его в B_RangerMeetingParking() с существующим условием вместо Stadt (города) я не вижу. Всё равно он уходит на Stadt в B_SchlussMitRangerMeeting() после диалога с Ватрасом.
проверка на MIS_Addon_Cavalorn_GetOrnamentFromPAL недостаточная.
может быть ситуация что MIS_Addon_Cavalorn_GetOrnamentFromPAL = 0, а орнамент находится у Лареса.
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.
}
в таком случае сюжетно парковка ни на что не влияет
может быть ситуация что 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");
};
Почему просто не заменить Stadt на Parking в B_RangerMeetingParking() для Кавалорна?
понял. это что бы избежать мгновенного появление Каваларона за спиной ГГ в диалоге с Ватрасом.
то есть идёт диалог DIA_Addon_Vatras_CloseMeeting_Info
и внезапно на заднем фоне появляется Каваларон
понял. это что бы избежать мгновенного появление Каваларона за спиной ГГ в диалоге с Ватрасом.
Стало понятнее. С паркингом то же самое. Если собрать всех на церемонию без Кавалорна (при MIS_Addon_Cavalorn_GetOrnamentFromPAL == FALSE), уйти, встретить его у круга камней, получить совет (после чего он уйдет в город), вернуться в таверну и завершить церемонию, то он действительно внезапно появится в таверне. И перевод на английский подсказывает, что это близко к истине) "Otherwise he'll pop in at Father's Day". Значит, не трогаем.
Сегодня была редкая ситуация. когда герой пришёл на встречу кольца воды в таверну Орлан стоял на улице (в рамках квеста "пей до дна"). в результате корд вставился почти на глазах у Героя :-)
https://youtu.be/vjj9XEnND7w?t=8773
можно будет в следующий раз сделать сейв и присмотреться к подобной ситуации повнимательнее