Показать сообщение отдельно
Старый 09.07.2005, 12:46   #536
Vendiga

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Короче устроил я вчера исследовательскую работу по теме триггеры и вот к чему это привело:

Для начала я изучил одну камеру из Диккурика(ту которая падальщиков призывает в самом начале игры) и её свойства.
Начиналось всё из рук вон плохо - только замучился открывать зен диккурика - забыл содержимое модфайла перекинуть в каталог игры, а он блин и не хочет открываться!
Камера та называлась CAMERA_HOCHSTAND(zCCSCamera). Долгим экспериментальным путём я нашол два триггера, прикреплённых к этой камере.
Экскурс для тех кто не знает: каждый триггер несёт в себе какую-то скриптовую функцию, которая должна быть расписана в *d. файле. Т.е. scriptFUNC по-научному(занимаеет последнее место по порядку, но первое по важности в свойствах триггера).
Так вот, первым триггером был TS_HOCHSTAND(oCTriggerScript) c scriptFunc  HOCHSTANDWOELFE. Визуально выглядит как "коробочка" из красных линий(когда отсутствует 3дс файл обычно такое бывает - это пример, тут совершенно не к месту) на всю площадь поверхности башни(на которой должен стоять ГГ в момент включения камеры.
Второй триггер выглядет так: TS_CAMERA_HOCHSTAND(oCTriggerScript) со скриптфунцией START_CAMERA_HOCHSTAND. Прикреплён к камере как кейфрейм, но совсем близко, можно сказать на неё.

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

instance SCAVHORN(C_Item)
{
     name = "mysteriцses Horn";\\Загадочный рог
     mainflag = ITEM_KAT_NONE;
     flags = ITEM_MULTI;
     value = 0;
     visual = "ItMi_Alarmhorn_01.3DS";
     material = MAT_WOOD;
     scemeName = "HORN";\\Рог
     on_state[0] = use_scavhorn;\\Функция использования
     description = name;
     text[5] = NAME_Value;
     count[5] = value;
};


func void use_scavhorn()\\Описание функции использования
{
     if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED)\\если ГГ стоит на расстоянии <= 1000 от варпоинта и вроде на башне, то....

     {
           Wld_SetGuildAttitude(GIL_WOLF,ATT_ANGRY,GIL_SCAVE NGER);\\Волки вдруг стали врагами падальщиков
           Wld_InsertNpc(v_scav1,"SEE_VOR_STADT_06");\\Появл яются сами падальщики
           Wld_InsertNpc(v_scav2,"SEE_VOR_STADT_06");
           Wld_InsertNpc(v_scav3,"SEE_VOR_STADT_06");
           Wld_InsertNpc(v_scav4,"SEE_VOR_STADT_06");
           SCAVHORNUSED = TRUE;\\Не нашол где эта функция декларирована
           Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\Подключа ется камера
     }
     else
     {
           PrintScreen("Nichts passiert...",-1,-1,"font_old_20_white.tga",3);\\Вывод текста "Ничего не произошло"
     };
};

Привожу с комментариями на том уровне, на котором могу. Сам файл scavhorn.d нашолся по адресу _Work\Data\Scripts\Content\_misc_
В эту же папку разрабы диккурика скидывали все триггеры. А в оссобенности в файл schrank_a_nah.d. Там я и нашол скриптфункции триггеров камеры CAMERA_HOCHSTAND.

func void hochstandwoelfe()
{
     if(HOCHSTANDAKTIVIERT == 0)\\??? Вроде условие если камера включена...
     {
           HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1;\\Вопросы, кругом вопросы ::)
           if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))\\ если дистанция до варпоинта меньше 800
           {
                 Npc_ExchangeRoutine(sld_b,"RALF");\\Убежали неписи, которые ГГ подставили
                 Npc_ExchangeRoutine(sld_a,"RAL");
                 AI_ContinueRoutine(sld_b);
                 AI_ContinueRoutine(sld_a);
           };
           AI_OutputSVM_Overlay(hero,hero,"TurmGefangen_15_0 0");");//Это реплика Ардарика, когда приходят волки. «Откуда взялись эти волки...» говорит он
           AI_StandupQuick(hero);\\Перевод ГГ в стоячее состояние
           Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\Опят ь камера
           bh_wolfspawn();\\Функция такая. Приведена в отдельном одноимённом файле
     };
};

bh_wolfspawn.d:

func void bh_wolfspawn()
{
     Wld_InsertNpc(v_wolf1,"SEE_VOR_STADT_06");\\Появл яются четыре волка
     Wld_InsertNpc(v_wolf2,"SEE_VOR_STADT_06");
     Wld_InsertNpc(v_wolf3,"SEE_VOR_STADT_06");
     Wld_InsertNpc(v_wolf4,"SEE_VOR_STADT_06");
};

И для триггера TS_CAMERA_HOCHSTAND(oCTriggerScript) скрипт нашолся:

func void start_camera_hochstand()
{
     Wld_SendTrigger("CAMERA_HOCHSTAND");\\Просто опять включает камеру. Они что перестраховывались чтоли три раза писали? lol...
};

И ещё одна вещь. В своём посте с вопросами, некоторые из которых уже сам разобрал, я спрашивал возможно ли включить камеру с самого начала игры и как, ведь в таком случае невозможно включить триггер скриптово!
Тему такую замутить можно. Те кто играл в Диккурик, вспомните - там в самом начале вокруг Ардарика, когда тот говорит крутится камера. Причём крутится по кругу, циклично! Я проверял, кейфремы там не замкнуты! Камера называется CAMERA_GAME_START. И триггеров к ней действительно НЕТ! Я всё облазил, но не нашол ни одного. В свойствах от камеры CAMERA_HOCHSTAND она отличается только одним параметром. Что за параметр и на что он влияет я не знаю. Если кому интересно какой, спрашивайте, щас нет желания смотреть - может и не нужен он вовсе...
Однако скрипт с этой камерой всё же есть. Это тот самый разговор Ардарика, но запихнут он почему-то всё в тот же файл schrank_a_nah.d, а не в диалоги ГГ.

func void vor_hochstand()
{
     if(STARTDIALOGGESPROCHEN == 0)\\Опять какая-то малопонятная функция
     {
           IntroduceChapter("Kapitel 1","Ardarics Leben","chapter.tga","levelup.wav",6000);\\Окно первой главы "Жизнь Ардарика" с файлом заставки chapter.tga и звуковым файлом levelup.wav на время 6000
           AI_Standup(self);\\Перевод ГГ в стоячее положение
           Wld_SendTrigger("CAMERA_GAME_START");\\Наша камера!
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_00");\\Бл а, бла, бла и всё такое... ::)
           AI_Wait(hero,1);\\Чего ждать?
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_01");      
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_02");      
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_03");      
           AI_TurnAway(hero,sld_b);
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_04");      
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_05");      
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_06");      
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_07");      
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_08");      
           AI_Output(hero,hero,"DIA_DIC_Monolog_15_09");      
           AI_Wait(hero,1);
           AI_StandupQuick(hero);
           AI_GotoNpc(hero,sld_a);\\Ардарик идёт к Солдатику.
           AI_GotoNpc(sld_b,sld_a);\\К другому солдатику.
           STARTDIALOGGESPROCHEN = 1;\\Опять неизвестно где декларированная функция...
     };
};

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

1. С какой целью к камере приязали два триггера, одним из которых ещё заключили стоящего на вышке ГГ в "кубик"?
2. Зачем второй триггер "прилипили" прямо на камеру?
3. Где декларированны все эти функции: SCAVHORNUSED = TRUE; if(HOCHSTANDAKTIVIERT == 0); HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1; if(STARTDIALOGGESPROCHEN == 0); STARTDIALOGGESPROCHEN = 1; и что они все означают?
4. Зачем задавать подобного типа условия: if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED); if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))???
5. Почему нельзя было все эти скрипты соединить в один? Зачем разбрасывать по файлам?
6. Если я не ошибаюсь, триггер Wld_SendTrigger("CAMERA_HOCHSTAND") включает функционирование камеры. Зачем его писать три раза  разных скриптах? Ведь они все выполняются одновременно!
7. Как Amatheur Gothic Mod Team(кажется так они называются) врубили камеру без триггера? Откуда скрипт vor_hochstand? Или я что-то просмотрел? Но в списке триггеров на камеру CAMERA_GAME_START точно ничего нет!
8. Как разрабы зациклили камеру CAMERA_GAME_START?

Надеюсь на сильных мира сего. Модостроительством занимаюсь около двух месяцев, думаю тут у многих опыта больше, поэтому ПАМАГИТЕ ::)

Спешиал сэнкс камраду Отцу Левонтию за помощь в столь трудном деле :)

Ответить с цитированием