PDA

Рекламное объявление:(1)

Killer-XXX
21.06.2004, 19:24
Я открыл эту тему, для тех, кто собирается вступить в Гильдию Строителей. Базовый мод самому сделать (хоть это и самые азы) все равно не очень легко. Вот я решил написать и описать то, что смог найти я, и надеюсь, что вы меня поддержите, добавляя сюда посты с информацией, которую ВЫ нашли.

После извлечения MOD Development Kit, вы должны открыть папку gothic, там будут скрипты, модели, и скопировать ВСЕ содержимое этой папки в коренной каталог вашей игры.

1. Создаем мир.

1.1. Мир создается в программе 3d Max 3.1, но у меня это получилось и в версии 4.2.
Подробную информацию можно найти на сайте http://gothic.rpgdot.com/

2. Начинаем работу со Spacer`Ом.

2.1 Наш мир, допустим назовем его Mir.3ds копируем в директорию ..G/_work/data/Meshes/level.
Далее запускаем Spacer, ждем пока он полностью прогрузится, т.е. появится черное окно и 4 дополнительных, жмем File —> Open Mesh —> открываем наш Mir.3ds. Далее жмем World —> Compile world ставим галочку Editormode и переставляем точку с Indoor на Outdoor. Далее смотрим наш мир, жмем World —> Compile light, и сохраняем наш мир поверх прежнего.

2.2 Перегружаем Spacer, нажатием File —> Reset. Опять открываем Mir.3ds, жмем World —> Compile world НЕ ставим галочку Editormode и переставляем точку с Indoor на Outdoor.
Теперь можем преступать непосредственно к самому редактированию.

2.3 Открываем окно Objects, вкладку Create выбираем пункт oCVob (abstract), далее можно выбрать oCNPC (scripted) – вставить НПС, персонажа и oCItem (scripted) – вставить вещь. Выбрав что-нибудь, в главном окне, где отображается мир, правый щелчок и выбираем пункт Insert [oCNPC] или Insert [oCItem], в зависимости, что выбирали в окне Objects. Появится список, в нем выбираем, что вставить.

2.4 Если же выбрать не oCNPC (scripted и не oCItem (scripted), а пункт oCMob —> oCMobinter —> oCMobFire, так же через правую вставить, как и НПС или обьект (*см. выше), во вкладке Modify, выбираем параметр Visual и пишем fire.pfx, жмем Аpply, и получаем огонек.

Урок 2.
Вставка в игру НПС и ошибки.

Что хотелось бы сказать с самого начала, это описать ошибку, которую делал я и уверен сделали и вы: нет смысла ставить НПС через Spacer`а, его нужно ставить скриптово. А в Spacer`е нужно ставить не НПС, а Waypoint`ы для них, в тех местах где вы хотите чтобы они были.
Речь идет не только о людях, но и о монстрах. Объясняю
Как это сделать:
1.Открываем файл-скрипт startup.d (лежит G\_work\data\Scripts\Content\Story\)
2.Начинаем добавлять строки для НАШЕГО мира.

FUNC VOID STARTUP_RAZRAB ()//RAZRAB это название моего мира, у вас оно конечно будет другим, и надо будет вписать сюда ваше. В этом разделе будут объявляться НПС, которых нужно вставить.
{
//------------------НПС-----------------------
Wld_InsertNpc (NPC_999_Gunther,"FIREPLACE");//Смысл строчки таков, Wld_InsertNpc - эта команда отвечает за вставку НПС, в скобках NPC_999_Gunther это имя вашего НПС ( Внимание не название скрипта вашего НПС, а именно НПС, т.е. как в первой строчке скрипта НПС его назовут.), и в кавычках название Waypoint`а по которому будет идти ваш НПС.
Wld_InsertNpc (Scavenger,"1");// Все аналогично, только здесь вставляют не человека, а падальщика.
};

FUNC VOID INIT_RAZRAB ()//А здесь обьекты или что то другое. Я сам не разобрался.
{
//-------------------Fackeln-----------------------------
Wld_SetMobRoutine (00,00, "FIREPLACE", 0);

//-------- Attitьden initialisieren --------
B_InitMonsterAttitudes ();//Без комментариев, я это не трогал, т.к. для БМ это точно не нужно, а уже для создания полноценного мода разберемся, что это и зачем нужно.
B_InitGuildAttitudes();//См. выше, аналогично.
};

3. Сохраняем скрипт. Надеюсь это было понятно. Если нет, то пишите пост, разъясню подробней.

Теперь у нас появится в игровом мире, те НПС которых мы хотели ставить, но человек будет стоять НЕ ДВИГАЯСЬ, не будет отвечать на разговор …

Нужно сделать следующее(не сам догадался, так на писано в руководстве с gothic.rpgdot.com):

1.Копируем этот текст, вставляем его в текстовый файл и сохраняем с именем ZS_GuntherWait.d в папку G\_work\data\Scripts\Content\Story\ZS\pers (прим. автора: По -моему можно этот скрипт будет использовать для любого др НПС)

//****************************************
func void ZS_GuntherWait ()
{
PrintDebugNpc (PD_TA_FRAME, "ZS_GuntherWait");
Npc_PercEnable(self, PERC_ASSESSPLAYER, B_AssessSC);
Npc_PercEnable(self, PERC_ASSESSTALK, B_AssessTalk);
AI_StandUp (self);
AI_SetWalkmode (self, NPC_WALK);
AI_GotoWP (self, self.wp); // НПС идет на стартовый Waypoint
AI_AlignToWP (self);
};
func void ZS_GuntherWait_Loop ()
{
PrintDebugNpc (PD_TA_LOOP, "ZS_GuntherWait_Loop");
AI_GotoWP (self, self.wp); //НПС идет на стартовый Waypoint
AI_Wait (self, 100); //Ждет тут 100 сек.
AI_GotoWP (self, Npc_GetNearestWP (Self)); // Ищет другой Waypoint
AI_PlayAni(self, "T_PEE");
AI_Wait (self, 100); //Ждет 100 сек, прежде чем цикл закончится (прим. автора: "Я понял, что раз цикл закончился, то опять начинается, т.е. будет ходить с одного Waypoint`а на др.)
};
func void ZS_GuntherWait_End ()
{
PrintDebugNpc (PD_TA_FRAME,"ZS_GuntherWait_End");
};
//********************************************
2. Открываем скрипт Ta.d в папке на одну выше, т.е. G\_work\data\Scripts\Content\Story\ZS\, дописываем после текста:

//*****************************
func void TA_GuntherWait (var int start_h,var int start_m,var int stop_h,var int stop_m,var string waypoint)
{TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_GuntherWait, waypoint);};//Как я понял, это описывает движения нашего НПС
//******************************

3. Сохраняем этот скрипт.
4. Открываем скрипт нашего НПС из папки G\_work\data\Scripts\Content\Story\NPC ( у меня это Gunther, хотя в игре его зовут Алекс =))

//*****************************
//Весь скрипт я приводить не буду, т.к. нас волнует его, конец.

daily_routine = Rtn_start_999;//Распорядок дня, Rtn_start_999 название функции, которая будет отвечать за этот распорядок.
};

func void Rtn_Start_999 ()//Начало функции
{
TA_GuntherWait (00,00,24,00,"FIREPLACE");// TA_GuntherWait это название функции которую следует использовать при распорядке дня, помните мы создавали новый файл TA_GuntherWait.d и изменяли Ta.d, это все было нужно, чтобы использовать его здесь. 00,00 это время начальное, т.е. 12 ночи, далее 24,00 это конечное время, т.е. у меня он выполняет это круглосуточно, а в кавычках, как я уже упоминал название Waypoint`а.
};
//**************************************

Вот вроде бы и все, после этого в вашем мире должны появится те НПС которых вы ставили.

И напоследок, чтобы ваши НПС появились, нужно обязательно создать новый Gothic.dat и Ou.csl.

Gothic.dat
Запускаем Spacer и жмем World -> Reparse Scriptfiles, все у вас в папке G\_work\data\Scripts\_compiled появился ваш новый Gothic.dat.

Ou.csl (и Ou.bin одновременно)
Запускаем Spacer, ничего не нажимаем, оставляем ему «девственное состояние», ищем окошко Output units, жмем кнопку Update, далее кнопку Save, все у вас есть новые Ou.csl и Ou.bin в папке G\_work\data\Scripts\Content\cutscene.

!!!ВНИМАНИЕ!!! Если вы собрались создавать новый Ou.csl и Ou.bin, то ОБЯЗАТЕЛЬНО, повторюсь ОБЯЗАТЕЛЬНО УДАЛЯЙТЕ старые, еще до запуска Spacer`а.

Вот вроде бы я рассмотрел, что необходимо, для того чтобы ваш НПС стоял там где вы его поставили.


Урок 3.

С квестами я сам еще не очень хорошо разобрался, но могу привести пару команд, которые вам могут пригодится.

B_GiveInvItems (other, self,ХХХ , 1);//Дать вещь, определяется кто кому дает, герой НПС или НПС герою так, self на первом месте - НПС герою, и соответственно other на первом месте - герой НПС. Далее ХХХ это наименование предмета, опять же полное, как оно указано в Spacer`е при его вставление, например: ITMI_PLANTS_SWAMPHERB_01, и последний параметр это количество даваемого предмета, например:
B_GiveInvItems (other,self,ItMiNugget,500);//Герою дают 500 кусков руды.

Log_CreateTopic (bolotnik, LOG_MISSION);
Log_SetTopicStatus (bolotnik, LOG_RUNNING);//» строчки означают создать миссию, в скобках bolotnik - название переменной, чтобы миссия у вас появилась нужно добавить в файл Log_Constants.d в папке G\_work\data\Scripts\Content\Story cтрочки:
const string bolotnik = "Просьба";// bolotnik как я уже сказал название переменной, а в кавычках как эта миссия будет обозначатся в меню игры, при просмотре.
B_LogEntry (bolotnik,"ХХХ");//Эта команда обозначает какой текст нужно добавить в какую миссию, вот теперь видите зачем нужна эта переменная bolotnik, т.е. означает в какую миссию добавить, а ХХХ это наш текст, который нужно добавить.
Log_SetTopicStatus (bolotnik,LOG_SUCCESS);//Означает что миссия завершена и следует ее переместить в раздел «Завершенные», bolotnik указывает какую миссию, а LOG_SUCCESS обозначет функцию перемещения в «Завершенные».

Пока это все.
Хотя … могу еще рассказать про одну условную функцию. На примере из моего мода.

FUNC VOID DIA_Gunther_Pl_Info()//Начало функции
{
if (Npc_HasItems(other,ХХХ)>=5)//Проверяет, если у ГГ есть ХХХ (растения, руда и тп) в количестве (в нашем случае) либо больше, либо = 5 то сделать
{
AI_Output (self,other,"DIA_Gunther_Pl_04_13"); // Молодец!!! Ты принес болтник, наконец, с смогу забить сеюе косячок. Ну да ладно, это потом.
AI_Output (self,other,"DIA_Gunther_Pl_04_14"); // Ты свою часть договора выполнил, вот тебе ...
B_GiveInvItems (other, self,ITMI_PLANTS_SWAMPHERB_01, 5); // Болотник дает
B_GiveInvItems (self, other,GRD_armor_M, 1); // Броню дает
B_GiveInvItems (self, other,ItMw_1H_Sword_Bastard_01, 1); //Меч дает
B_LogEntry (bolotnik,"Я принес Алексу болотника, он тоже выполнил свое обещание - дал мне меч и, как обещал, доспехи стражника.");//Добавить запись в дневник
Log_SetTopicStatus (bolotnik,LOG_SUCCESS);//Завершить миссию
}
else//Иначе, т.е. если персонаж не прошел проверку на количство.
{

AI_Output (self,other,"DIA_Gunther_Thank_04_02"); // Но у тебя нет 5 травок болотника!!
AI_Output (other,self,"DIA_Gunther_Thank_15_01"); // Ну ладно, счас принесу.

};
AI_StopProcessInfos(self);//Завершить функцию


ВСЕ!!!! Теперь точно высказал, все что нашел!!!
Если я где -то описался, и написал с не слишком подробно, обращайтесь, всегда помогу.

T-wulf
27.06.2004, 15:05
Как создать броню.

Описание на примере пятого 3Д Макса

качаем отсюда http://wiki.devmode.de/Diverses/n%FCtzliche+Dateien
2 Beispielruestungen и Gothic 1 mod development kit
после распаковки находим там max- файлы
теперь у вас 2 пути:

построение доспеха на базе одного из двух пример-доспехов
или создания доспеха с чистого листа от Hum_Body_Naked0.max
для своего первого доспеха я выбрал первый путь
итак, пока идём по моим стопам

Что я делал:

1. загрузил Hum_TPLS_armor.max
сразу после загрузки можете нажать на кнопку play в нижнем правом углу и увидеть анимацию брони- после внесения изменений советую вам делать это почаще- многие баги становятся видны сразу

2. выбираю функцию SELECT сверху и Modify справа и
там открываю Editable Mesh

3. теперь вам уже нужны знания 3д макса: что такое Вертекс, полигон и т.д.
когда я начинал работу над доспехом я ничего об этом не знал, потому потерял много времени впустую
итак, три вида составляющих, которые вы должны знать
1- вертекс- решётка, на которой располагается полигон- когда выбран пункт- синие точки по объекту
2- полигон- в данном случае треугольной формы частицы, соединённые между собой вертексами и держащиеся на них
3- элемент- крупный подобъект- плечо, нога, кисть и т.д.

учимся двигать составляющие:
выбираем первый попавшийся Вертекс , жмём правую кнопку мыши и Переместить. Можно двигать произвольно, а можно по x- y- или z- линиям. Последнее предпочтительней. Можете поразвлекаться так же и с Элементом.
Когда научитесь передвигать составляющие, можно заняться более сложным делом- СОЗДАНИЕМ полигонов

4- создание полигона
Итак, мы делаем из Тяжёлой Среднюю броню Темплара.
Выбираем элемент, защищающий предплечье (например с правой стороны, между наплечной пласиной и голой рукой) и жмём Delete, подтверждаем Delete Isolated Verticles и видим на месте щитка пустоту, теперь выбираем Polygon и Create внизу справа.
Высвечиваются Вертикалс, их нужно связать полигонами.
Выбираем первый любой Вертекс, тянем от него курсив к ближайшим двум или трём: говорю заранее: ТРЕУГОЛЬНЫЕ ПОЛИГОНЫ ПРЕДПОЧТИТЕЛЬНЕЙ. когда полигон готов, он из позрачного превратится в окрашенный, если это не произошло (он остался прзрачным), переделайте, поменяйте порялок, в котором вы соединяли Вертекс. Таким образом, вы заполните всю пустоту.
Если вы, чтобы упростить себе задачу, отодвинули куда-то наплечник, ОБЯЗАТЕЛЬНО верните его на место.
Теперь вы можете войти в Physique и посмотреть результат. Если получилось что-то несусветное, делайте работу заново.
Если всё в порядке, включите плей и удостоверьтесь в этом ещё раз.
Далее повторяем то же самое с другой рукой.
Не забываем сохранять напр. как TPLM.max или Tutorial.max

5- текстурирование:
подстраиваемся под карту:
на диске D: создаём D:\GFX\3DSMAX3\ARMOR\Backup-Armor\Armor\Hum_TPLS_ARMOR_V0.tga GoMan'ом
Итак, Теперь часть нашего доспеха приобрела достойный вид.
Определимся с материалами: в доспехе учавствуют два материала:
Кожа игрока и Броня. У первого ID 1 у второго- 2.
Снова выбираем Polygon и там Surface Properties. Material ID: 1/2 выбираем, смотрим результат и учимся.

6- привязки. ПРЕДУПРЕЖДЕНИЕ: а вот это уже не для новичков. Пока не научитесь всему, что дано до этого. Сюда не суйтесь !!!

Выбираем Element, правый наплечник (со спины), Detach, Имя: zm_Right. теперь этот элемент идёт оддельно.
Physique, выбираем его двойным кликом, скрыть невыбранное, Раскрыть по имени Bip 01 Spine2
снова выбираем наплечник. Список Модификаторов, Physique, выбирем Attach To Node (чел с красной точкой в брюхе), наводим курсор на Bip 01 Spine2, Vertex Line Assigment: вместо Deformable Riquid, Initialise, появился скелет брони.
Теперь выбираем Раскрыть всё и видим, что наплечник находится не там, где надо, выбираем его, Editable Mesh, Element, Переместить на плечо, Вращать так, чтобы он стал параллельно плечу, Physique, Play смотрим, сохраняемся почаще
ВНИМАНИЕ: перемещать объект только так, иначе будут баги

Далее: как внедрить получившееся в игру: нужен полный G2 MDK
с Rohdaten.
Создаём в папке Anims папку asc_anims , а в ней _complied.
Далее, выбираем броню, которая вам чем-то не угодила, находим её в Anims/_complied, переносим куда- нибудь и удаляем оригинал (MDM файл)
Идём в 3Ds Max , Настройки, Plugin Manager (менеджер расширений) Load New Plugin: zenexp.dle
Сохраняем файл, Экспорт, расширение Asc.
Gothic II\_work\data\Anims\asc_anims\_COMPLIED\имя файла
ВАЖНО: ИМЯ ФАЙЛА ДОЛЖНО ПОЛНОСТЬЮ СООТВЕСТВОВАТЬ ТОМУ ФАЙЛ, КОТОРЫЙ НУЖНО ЗАМЕНИТЬ.
Далее, открываем Gothic2 Starter, Alles Konvertieren и стартуем
Далее вылезет таблица, где нужно будет нажать ОК.
Загружаем игру, смотрим доспех

http://wiki.devmode.de/Tutorials/R%FCstungen+erstellen
также важно прочитать

Добавлено Пн Июн 28, 2004 16:21:

Да, кстати, будет очень полезно, если кто-нибудь расскажет про то, как "совместить" текстуру например с полигоном в 3д максе

NeKr0
06.07.2004, 19:37
3-d max-прога для работы с 3д графикой.
Собрали бы Сноуболловцы все эти киты на диск да продавали. :idea:

Добавлено Ср Июл 07, 2004 19:25:

А как текстуры менять поподробнее, а то я поменял цвета падальщика все запаковал сначала падальщика *.tex а потом в *.vdf, включил готику а она мне типа не найден default.tga как с этим бороться?

Killer-XXX
07.08.2004, 13:45
2Pahan:
Я тут нашёл Maya 5.0 в ней можно что создать (мир или вещь)???
Незнаю, не пробовал, наверное можно, если есть импорт в формат 3ds.

Подскажите когда я загружаю свой Mir.3d в Spacere у меня вылетает ошибка что файл не может загрузиться. Что делать???
А ты уверен, что это ошибка? А может это сообщение о компиляции мира?? Вероятнее всего ...

2Urizzel:
Хотя от туда не качаетсяя кагда я скачал там появилась фигня каторой выбераеч чем открыть фаел обидно
А расширение файла какое? Мне в асю (319110414) постучись...


УБЕДИТЕЛЬНО ПРОШУ, ЭТА ТЕМА, В КОТОРОЙ ПИШУТСЯ ХЕЛПЫ ПО СОЗДАНИЮ БМ, ТАК ЧТО СО ВСЕМИ ВОПРОСАМИ ПИШИТЕ В "ПРИЕМНАЯ ГИЛЬДИИ СТРОИТЕЛЕЙ"

Ral
31.10.2004, 11:02
Есть ли более удобный способ перемещения объектов, чем
Vob -> Move here? И как вставлять на карту объекты,созданные
в 3Dmaxе, например, новый дом?

Killer-XXX
31.10.2004, 19:21
2Ral:
Прошу, прошу не спрашивать тут... ну да ладно:

Vob -> Move here?
Есть, можно нажать на значек (помимо 4х окон, там есть 2 панельки со значками, вот на вертикальной), на какой то кликнуть и ты будешь правлять обьектом и так перемещать)

И как вставлять на карту объекты,созданные
в 3Dmaxе, например, новый дом?
В Спэйсере, когда создал допустим новый MOB, есть строка вузиулизации, там указываешь твой файл 3ds с домом, и он у тебя вставитсч в игру.

Сюда (http://jukebox.nm.ru/Files/), там выберишь архив RusSpacer2.rar, это бета версия перевода Спэйсера, там 2 патча, сначало простой, а потом тот, который с "+"-ом.

Ral
31.10.2004, 20:52
2Killer-XXX: Спасибо, и вот ещё что, у меня тут 2 вопроса созрели(вроде как-никак относятся к созданию БМ).1.Как предмет из Г1 в Г2 перенести(через 3ds max что ли)?2.Для MAXа есть плагин для восприятия 3ds файлов, но он идёт под v.4.2, а у меня 6.Ссылку не подскажешь?

Killer-XXX
31.10.2004, 21:16
2Ral:
1.Как предмет из Г1 в Г2 перенести(через 3ds max что ли)?
Хм, если тебе сам вид,Э то ненадо ничего, просто копируешь из папки GI\_work\data\Meshes\
в папку
GIIa\_work\data\Meshes\
и в Спэйсере так же ставишь визуализацию на него, если ты про полностью предмет, то это надо скрипт перенести из Г1 в Г2а, но не факт что он подойдет, хотя может и подойти :)

2.Для MAXа есть плагин для восприятия 3ds файлов, но он идёт под v.4.2, а у меня 6.Ссылку не подскажешь?
Качай на сайте Нико Бендлина
Качай (http://www.bendlins.de/nico/gothic2/max60-3dsgo.zip)
З.Ы. Если не будет извлекаться, то попробуй поставить WinZip и им извлечь.
Удачи!

Ral
01.11.2004, 21:11
2Killer-XXX: Ещё раз спасибо :)

Добавлено Пн Ноя 01, 2004 21:22:

А как насчёт анимации, т.е. файлы .MDS ? Для них ещё один плагин нужен. Кстати кроме 3ds и mds в Готике есть другие расширения для графики?

Mitrich
28.11.2004, 15:34
Да ёлы-палы, никто не знает чтоль????? :upset:
"Ёлов" не знаю, "палы" - рыцари короля.
З.ы.
Тебе же русским языком написали - папка
Gothic II\_work\data\Scripts\Content\Story\NPC
файл PC_Hero.d

Ral
29.11.2004, 21:40
2Mitrich: Есть 2 варианта: или G2MDK всё же не стоит, или папки были удалены\повреждены.
2Индиго: А вообще попробуй поставить заново, если уже ставил G2MDK 2.6, стандартный вариант 1.7 Gb :idea:

Gothicdark
07.02.2005, 13:11
Прошу помощи!!!!!
К согражданам форума умеющих работать в Спайсере
Из за чего он выдает такую ошибку
-2- 01:44 Fault: 0 M: BSP leaf destroyed, but had still vob(s) in itґs lists. ..<BSP.cpp,1837>
И вообще он почему то не хочет компилировать мир выдает только коричневый
экран .

francisc
27.03.2005, 19:17
А вы работайте в проге Вама и проблем будет меньше.

TycoooN
28.03.2005, 11:22
2Dima534:
Это компилятор\декомпилятор скриптов. Т.е. прога позволяет как получить их скриптов gothic.dat (и другие .dat), так и наоборот - из .dat получить скрипты.
Найти ее можно тут: http://killer-xxx.nm.ru
А со всеми вопросами и за информацией обращайся сюда (http://forums.ag.ru/?board=gothic&action=display&s=0&num=1095241429)
Плюс на этом форуме есть немало тем по модмейкерству, а также Скриптинг в Готике (http://forums.ag.ru/?board=gothic&action=display&s=0&num=1105030050)

Dima534
28.03.2005, 18:53
2 TycoooN,спасибо я почитал , но вот возникла еще одна проблема
вот я Декомпелирую
программой GothicSorucer (Вама) файл Gothic.dat
Все как и должно разорхивируется в папку.../_decompiled
Потом ставлю
C:\ИГРЫ\Gothic\system\GothicSourcerV2_0.exe -zlog:10,s -zfile:gothic -zcomp:1,0
,жму. В Spyloge идет процесс компиляции потом выдается следующая строка 00:13 Fatail:-1 U: PAR Too many errors>25,compilation stopped,... <zParser.cpp,#599>
иногда вместо цифер 00:13 в начале стоит 00:39
Ну из перевода ) я понял что слишком много ошибок(больше 25) , компилирование остановлено, может знаешь в чем дело, подскажи пожалуйста

Killer-XXX
28.03.2005, 20:14
2Dima534:
Это новая версия, она останавливает Компиляцию при 25 ошибка, на данный момент есть уже более новая, которая эти ошибки во внимания помещает, и не останавливает компиляцию.
Выход:
1. Скачать на сайте 1.9 (старую)
2. Скачать последнюю версию, я не выкладывал у себя.
Может TycoooN выложит.

TycoooN
28.03.2005, 23:28
2Dima534:
Для новичков больше подойдет версия 1.9, ее и юзай пока ;)

иногда вместо цифер 00:13 в начале стоит 00:39
Это секундомер :)

З.Ы. Вот тут (http://forums.ag.ru/?board=gothic&action=display&s=0&num=1095241429&start=425#445) я писал небольшой тутор по использованию проги от Vam'a :idea:

Отец Левонтий
29.03.2005, 13:33
Кто знает, подскажите, где еще надо прописывать диалоги кроме файла DIA_*.d?

TycoooN
29.03.2005, 15:46
2Отец Левонтий:
Нигде не надо.
Если у тебя есть НПС NONE_ID_NPC, и ты создашь в папке content/dialoge скрипт DIA_XXX.d, где пропишешь instance DIA_*** (c_info), указав у него в значении переменной npc = NONE_ID_NPC; то у тебя этот диалог уже должен появиться в игре для этого НПС.
Так что
1. Проверь, компилируется ли у тебя твой DIA_XXX.d
2. Проверь, прописано ли в переменной твоего c_info npc = <твой НПС>
3. Если ты делал нового НПС, ему нужно в распорядок дня прописать что-нибудь, иначе он будет стоять как столб и ни на что не реагировать :)

francisc
29.03.2005, 18:59
Обязательно надо удалить gothicgame.mod,2Отец Левонтий: у тебя диалоги в игре появлялись?

Отец Левонтий
29.03.2005, 20:11
gothicgame.mod не удалял... попробую...
Я создал своего НПС, который появился в игре, он ходит с места на место и говорит "конец". :)
Также я создал файл DIA_*.d по образу и подобию квеста Снафа (комбинацией Ctrl-C -> Ctrl-V) :oops: , заменив в этом файле "Vlk_581_Snaf" на "NONE_ID_NPC" моего НПС. Название файла я тоже изменил под своего НПС.
Но при открытии gothic.src в спейсере вылезает куча ошибок :(
Подскажите, в чем моя ошибка?

francisc
29.03.2005, 20:55
Ты не правельно компилируешь,не в ту папку кладешь скрипты.

Отец Левонтий
29.03.2005, 21:58
2francisc:
А куда их надо класть? :?:

TycoooN
29.03.2005, 23:40
2Отец Левонтий:
Напиши здесь текст ошибок, которые выдаёт Спейсер.
И лучше всё же юзай для компиляции прогу от Vam'a ;)

Отец Левонтий
30.03.2005, 13:53
Я с прогой Vam'a еще не совсем разобрался... :oops:
Как разберусь, буду юзать! ;)
Но это попозже...
2TycoooN:
Скажи, я вообще правильно все делаю:
Я создал своего НПС, который появился в игре, он ходит с места на место и говорит "конец".
Также я создал файл DIA_*.d по образу и подобию квеста Снафа (комбинацией Ctrl-C -> Ctrl-V) , заменив в этом файле "Vlk_581_Snaf" на "NONE_ID_NPC" моего НПС. Название файла я тоже изменил под своего НПС.
Файл DIA_*.d кидаю в папку MISSIONS.
А ошибок много, около ста, хотя, говорят, надо исправить только первые, а остальные пропадут сами собой... :upset:
Вот первые пять ошибок:
1. U:PAR: Redefined identifier : DIA_SNAF_EXIT (line 5)
2. U:PAR: Expected ';'(line 6)
3. U:PAR: Syntax error : NPS (line 7)
4. U:PAR: Expected ';'(line 7)
5. U:PAR: Synax error : VLK_581_SNAF (line 7)

TycoooN
30.03.2005, 18:24
2Отец Левонтий:
Про прогу от Vam'a читай тут (http://forums.ag.ru/?board=gothic&action=display&s=0&num=1095241429&start=425#445)

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

Короче, выложи тут сам файл DIA_***.d, а там уж разберёмся :)

Отец Левонтий
30.03.2005, 18:42
Большой пост будет... :idea:
Эх, была не была :)



// **************************************************
// EXIT
// **************************************************

INSTANCE DIA_Snaf_Exit (C_INFO)
{
npc = None_999_Vanya;
nr = 999;
condition = DIA_Snaf_Exit_Condition;
information = DIA_Snaf_Exit_Info;
permanent = 1;
description = DIALOG_ENDE;
};

FUNC INT DIA_Snaf_Exit_Condition()
{
return 1;
};

FUNC VOID DIA_Snaf_Exit_Info()
{
AI_StopProcessInfos ( self );
};

// **************************************************
// Erstes Mal aufkreuzen
// **************************************************

INSTANCE DIA_Snaf_Hello (C_INFO)
{
npc = None_999_Vanya;
nr = 2;
condition = DIA_Snaf_Hello_Condition;
information = DIA_Snaf_Hello_Info;
permanent = 0;
description = "Wie steht's?";
};

FUNC INT DIA_Snaf_Hello_Condition()
{
return 1;
};

FUNC VOID DIA_Snaf_Hello_Info()
{
AI_Output (other, self,"DIA_Snaf_Hello_15_00"); //Wie steht's?
AI_Output (self, other,"DIA_Snaf_Hello_01_01"); //Nicht schlecht. Wenn man gut kochen kann, hat man viele Freunde hier.
AI_Output (self, other,"DIA_Snaf_Hello_01_02"); //Willst du etwas von meinem Reiseintopf? Hier, nimm und lass es dir schmecken.
AI_Output (other, self,"DIA_Snaf_Hello_15_03"); //Danke.
AI_Output (self, other,"DIA_Snaf_Hello_01_04"); //Du kцnntest mir einen Gefallen tun.

CreateInvItem (self,ItFoRice);
B_GiveInvItems(self,other,ItFoRice,1);
};

// **************************************************
// Bring Zutaten
// **************************************************
var int Snaf_Zutaten;
var int Snaf_FreeMBRagout;
// **************************************************

INSTANCE DIA_Snaf_Zutaten (C_INFO)
{
npc = None_999_Vanya;
nr = 2;
condition = DIA_Snaf_Zutaten_Condition;
information = DIA_Snaf_Zutaten_Info;
permanent = 0;
description ="Was kann ich fьr dich tun?";
};

FUNC INT DIA_Snaf_Zutaten_Condition()
{
if (Npc_KnowsInfo(hero,DIA_Snaf_Hello))
{
return 1;
};
};

FUNC VOID DIA_Snaf_Zutaten_Info()
{
AI_Output (other, self,"DIA_Snaf_Zutaten_15_00"); //Was kann ich fьr dich tun?
AI_Output (self, other,"DIA_Snaf_Zutaten_01_01"); //Du bist sicher gutes Essen gewцhnt. Ich hab' da ein neues Rezept: Fleischwanzen-Ragout а la Snaf, mit Reis und Pilzen.
AI_Output (self, other,"DIA_Snaf_Zutaten_01_02"); //Du kannst haben, so viel du willst, aber ich brauche aber noch 3 Fleischwanzen und einige Hцllenpilze - 5 mьssten reichen.

Info_ClearChoices(DIA_Snaf_Zutaten);
Info_AddChoice (DIA_Snaf_Zutaten, "Willst du, dass ich kotze?" ,DIA_Snaf_Zutaten_KOTZ);
Info_AddChoice (DIA_Snaf_Zutaten, "Hцrt sich gut an." ,DIA_Snaf_Zutaten_DoIt);
};

func void DIA_Snaf_Zutaten_KOTZ()
{
AI_Output (other, self,"DIA_Snaf_Zutaten_KOTZ_15_00"); //Willst du, dass ich kotze?
AI_Output (self, other,"DIA_Snaf_Zutaten_KOTZ_01_01"); //Du musst es ja nicht essen, aber zumindest probieren solltest du es! Falls du an die Sachen rankommst, denk an mich.
AI_Output (self, other,"DIA_Snaf_Zutaten_KOTZ_01_02"); //Ich hab' schon jemanden geschickt, aber der kommt einfach nicht wieder - ist bestimmt zum Neuen Lager ьbergelaufen.
Snaf_Zutaten = LOG_RUNNING;

Log_CreateTopic(CH1_SnafsRecipe, LOG_MISSION);
Log_SetTopicStatus(CH1_SnafsRecipe, LOG_RUNNING);
B_LogEntry( CH1_SnafsRecipe, "Der Koch Snaf im Aussenring des Alten Lagers hat mich geschickt, ihm 3 Fleischwanzen und 5 Hцllenpilze fьr ein neues Rezept zu besorgen.");

Info_ClearChoices(DIA_Snaf_Zutaten);
};

func void DIA_Snaf_Zutaten_DoIt()
{
AI_Output (other, self,"DIA_Snaf_Zutaten_DoIt_15_00"); //Hцrt sich gut an.
AI_Output (self, other,"DIA_Snaf_Zutaten_DoIt_01_01"); //Dann sieh mal zu, dass du die Sachen besorgst.
AI_Output (self, other,"DIA_Snaf_Zutaten_DoIt_01_02"); //Der Letzte, den ich losgeschickt hab, kommt einfach nicht wieder - ist bestimmt zum Neuen Lager ьbergelaufen.
Snaf_Zutaten = LOG_RUNNING;
Snaf_FreeMBRagout = TRUE;

Log_CreateTopic(CH1_SnafsRecipe, LOG_MISSION);
Log_SetTopicStatus(CH1_SnafsRecipe, LOG_RUNNING);
B_LogEntry( CH1_SnafsRecipe, "Der Koch Snaf im Aussenring des Alten Lagers hat mich geschickt, ihm 3 Fleischwanzen und 5 Hцllenpilze fьr ein neues Rezept zu besorgen. Er gibt mir dann auch was ab.");

Info_ClearChoices(DIA_Snaf_Zutaten);
};

// **************************************************
// SUCCESS
// **************************************************

INSTANCE DIA_Snaf_ZutatenSuccess (C_INFO)
{
npc = None_999_Vanya;
nr = 2;
condition = DIA_Snaf_ZutatenSuccess_Condition;
information = DIA_Snaf_ZutatenSuccess_Info;
permanent = 0;
description = "Ich hab' die Sachen, die du von mir wolltest!";
};

FUNC INT DIA_Snaf_ZutatenSuccess_Condition()
{
if ( (Snaf_Zutaten==LOG_RUNNING) && (Npc_HasItems(other,ItFo_Plants_Mushroom_01)>=5) && (Npc_HasItems(other,ItAt_Meatbug_01)>=3) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_ZutatenSuccess_Info()
{
AI_Output (other, self,"DIA_Snaf_ZutatenSuccess_15_00"); //Ich hab' die Sachen, die du von mir wolltest!
AI_Output (self, other,"DIA_Snaf_ZutatenSuccess_01_01"); //Gut, ich brauch sie nur noch dazuzugeben, dann ist der Eintopf fertig ... warte ...

CreateInvItems(other, ItFo_Plants_Mushroom_01, 3);
B_GiveInvItems(other,self,ItFo_Plants_Mushroom_01,8);//Notwendig zur Anzeige 8 Items ьbergeben, wird sofort angepasst

Npc_RemoveInvItems(self, ItFo_Plants_Mushroom_01, 8);//Alle Zutaten weg
Npc_RemoveInvItems(other, ItAt_MeatBug_01, 3);

CreateInvItems(self, ItFoMeatbugragout,3);
B_GiveInvItems(self, other,ItFoMeatbugragout,3);

Snaf_Zutaten = LOG_SUCCESS;

Log_SetTopicStatus (CH1_SnafsRecipe, LOG_SUCCESS);
B_LogEntry (CH1_SnafsRecipe, "Snaf war sehr zufrieden, als ich ihm die Zutaten ьbergab.");

if Snaf_FreeMBRagout==TRUE
{
B_LogEntry( CH1_SnafsRecipe, "Ab jetzt kann ich jeden Tag Fleischwanzen-Ragout bei ihm essen.");
};

B_GiveXP(100);

AI_StopProcessInfos (self);
};

// **************************************************
// AFTER SUCCESS
// **************************************************
var int Snaf_RagoutDay;
// **************************************************

INSTANCE DIA_Snaf_AfterSuccess (C_INFO)
{
npc = None_999_Vanya;
nr = 2;
condition = DIA_Snaf_AfterSuccess_Condition;
information = DIA_Snaf_AfterSuccess_Info;
permanent = 1;
description = "Du hast gesagt, ich kann soviel von dem Eintopf haben, wie ich will...";
};

FUNC INT DIA_Snaf_AfterSuccess_Condition()
{
if ( (Snaf_Zutaten==LOG_SUCCESS) && (Snaf_FreeMBRagout==TRUE) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_AfterSuccess_Info()
{
AI_Output (other, self,"DIA_Snaf_AfterSuccess_15_00"); //Du hast gesagt, ich kann so viel von den Eintopf haben, wie ich will ...

if (Snaf_RagoutDay!=Wld_GetDay())
{
AI_Output (self, other,"DIA_Snaf_AfterSuccess_01_01"); //Und das stimmt auch. Hier, nimm 3 Portionen!
CreateInvItems(self, ItFoMeatbugragout,3);
B_GiveInvItems(self, other,ItFoMeatbugragout,3);
Snaf_RagoutDay = Wld_GetDay();
}
else
{
AI_Output (self, other,"DIA_Snaf_AfterSuccess_01_02"); //Klar! Heute ist aber alles schon auf. Komm morgen wieder!
};
};

// **************************************************
// Wo Fleischwanzen
// **************************************************

INSTANCE DIA_Snaf_WhereMeatbugs (C_INFO)
{
npc = None_999_Vanya;
nr = 3;
condition = DIA_Snaf_WhereMeatbugs_Condition;
information = DIA_Snaf_WhereMeatbugs_Info;
permanent = 0;
description = "Wo finde ich Fleischwanzen?";
};

FUNC INT DIA_Snaf_WhereMeatbugs_Condition()
{
if ( (Snaf_Zutaten==LOG_RUNNING) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_WhereMeatbugs_Info()
{
AI_Output (other, self,"DIA_Snaf_WhereMeatbugs_15_00"); //Wo finde ich Fleischwanzen?
AI_Output (self, other,"DIA_Snaf_WhereMeatbugs_01_01"); //Ьberall da, wo Mьll rumliegt. An der Burgmauer gibt es einige verlassene Hьtten, da solltest du welche finden.
AI_Output (self, other,"DIA_Snaf_WhereMeatbugs_01_02"); //Lass dich von ihrem fiesen Aussehen nicht tдuschen. Gekocht sind sie lecker.

B_LogEntry( CH1_SnafsRecipe, "Fleischwanzen gibt es bei den verlassenen Hьtten an der Burgmauer.");
};

// **************************************************
// Where Mushrooms
// **************************************************

INSTANCE DIA_Snaf_WhereMushrooms (C_INFO)
{
npc = None_999_Vanya;
nr = 4;
condition = DIA_Snaf_WhereMushrooms_Condition;
information = DIA_Snaf_WhereMushrooms_Info;
permanent = 0;
description = "Wo finde ich Hцllenpilze?";
};

FUNC INT DIA_Snaf_WhereMushrooms_Condition()
{
if ( (Snaf_Zutaten==LOG_RUNNING) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_WhereMushrooms_Info()
{
AI_Output (other, self,"DIA_Snaf_WhereMushrooms_15_00"); //Wo finde ich Hцllenpilze?
AI_Output (self, other,"DIA_Snaf_WhereMushrooms_01_01"); //Wenn du aus dem Sьdtor rausgehst - das ist der umgestьrzte Turm - findest du direkt vor dir eine Ebene, auf der Pilze wachsen.

B_LogEntry( CH1_SnafsRecipe, "Hцllenpilze gibt es auf der Ebene vor dem umgestьrzten Turm, dem Sьdtor.");
};

// **************************************************
// Where Nek
// **************************************************

INSTANCE DIA_Snaf_WhereNek (C_INFO)
{
npc = None_999_Vanya;
nr = 5;
condition = DIA_Snaf_WhereNek_Condition;
information = DIA_Snaf_WhereNek_Info;
permanent = 0;
description = "Wer war der Typ, den du vor mir losgeschickt hast?";
};

FUNC INT DIA_Snaf_WhereNek_Condition()
{
if ( (Snaf_Zutaten==LOG_RUNNING) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_WhereNek_Info()
{
AI_Output (other, self,"DIA_Snaf_WhereNek_15_00"); //Wer war der Typ, den du vor mir losgeschickt hast?
AI_Output (self, other,"DIA_Snaf_WhereNek_01_01"); //Sein Name war Nek. Er war ziemlich unzufrieden hier - ich denke, er ist jetzt im Neuen Lager.
AI_Output (self, other,"DIA_Snaf_WhereNek_01_02"); //Hab ihn Pilze suchen geschickt - aber er kam nicht wieder ...

if (Sly_LostNek != LOG_SUCCESS)
&& (Npc_GetTrueGuild(hero) == GIL_NONE)
{
Log_CreateTopic (CH1_LostNek, LOG_MISSION);
Log_SetTopicStatus (CH1_LostNek, LOG_RUNNING);
};
B_LogEntry (CH1_LostNek, "Der Koch Snaf hat Nek zum letzten Mal gesehen, als er Pilze pflьcken ging.");
};
:shock:

TycoooN
30.03.2005, 19:11
2Отец Левонтий:
Мда... умнО :)

У тебя все функции называются так же, как у Снафа, а это недопустимо - каждая функция должна иметь УНИКАЛЬНОЕ название.
Так что удали пока все кроме
[code:1]
// **************************************************
// EXIT
// **************************************************

INSTANCE DIA_Snaf_Exit (C_INFO)
{
npc = None_999_Vanya;
nr = 999;
condition = DIA_Snaf_Exit_Condition;
information = DIA_Snaf_Exit_Info;
permanent = 1;
description = DIALOG_ENDE;
};

FUNC INT DIA_Snaf_Exit_Condition()
{
return 1;
};

FUNC VOID DIA_Snaf_Exit_Info()
{
AI_StopProcessInfos ( self );
};

// **************************************************
// Erstes Mal aufkreuzen
// **************************************************

INSTANCE DIA_Snaf_Hello (C_INFO)
{
npc = None_999_Vanya;
nr = 2;
condition = DIA_Snaf_Hello_Condition;
information = DIA_Snaf_Hello_Info;
permanent = 0;
description = "Wie steht's?";
};

FUNC INT DIA_Snaf_Hello_Condition()
{
return 1;
};

FUNC VOID DIA_Snaf_Hello_Info()
{
AI_Output (other, self,"DIA_Snaf_Hello_15_00"); //Wie steht's?
AI_Output (self, other,"DIA_Snaf_Hello_01_01"); //Nicht schlecht. Wenn man gut kochen kann, hat man viele Freunde hier.
AI_Output (self, other,"DIA_Snaf_Hello_01_02"); //Willst du etwas von meinem Reiseintopf? Hier, nimm und lass es dir schmecken.
AI_Output (other, self,"DIA_Snaf_Hello_15_03"); //Danke.
AI_Output (self, other,"DIA_Snaf_Hello_01_04"); //Du kцnntest mir einen Gefallen tun.

CreateInvItem (self,ItFoRice);
B_GiveInvItems(self,other,ItFoRice,1);
};
[/code:1]

И меняй везде DIA_Snaf*** на DIA_Vanya*** :idea:

Отец Левонтий
30.03.2005, 20:41
УРА! ЗАРАБОТАЛО!
СПАСИБО TycoooN!!! :pivo:
Как только 100 постов нафулдю "+" гарантирую! (а может и два :) )
Теперь бы хотелось сделать что-нибудь свое :rolleyes:
Текст, который говорит НПС, например: "Хороший сегодня денек!", где надо прописывать?
И еще вопросик :rolleyes:
Почему после компиляции Гота становится немецкой?
Как с этим бороться?
СПАСИБО еще раз! :)

francisc
30.03.2005, 22:37
2Отец Левонтий:
Текст, который говорит НПС
тут AI_Output (other, self,"DIA_Snaf_Hello_15_00"); //Wie steht's?
Почему после компиляции Гота становится немецкой?
Скрипты немецкие,поэтому и на немецком.[quote]

TycoooN
30.03.2005, 22:41
2Отец Левонтий:
Почему после компиляции Гота становится немецкой?
Все зависит от того, какие скрипты ты компилируешь. Ты компилировал немецкие, соответственно и GOTHIC.DAT вышел немецкий.
Чтобы получить русские скрипты, нужно декомпилировать существующий русский датник прогой от Вама.

Текст, который говорит НПС, например: "Хороший сегодня денек!", где надо прописывать?
За произношение каждой реплики при диалоге отвечает функция AI_Output (см. Уроки скриптологии (http://gothic3.allgothic.ru/filezzz/Vam_tutor.rar))
А текст, выводимый на экран в субтитры, прописывается сразу после вызова функции в комментариях. При компиляции скриптов все тексты, стоящие в комментариях после AI_Output записываются в файлы OU.CSL и OU.BIN

Короче. чтобы ГГ сказал твоему None_999_Vanya; "Хороший сегодня денек!"

нужно написать:
AI_Output(other,self,"DIA_***_15_??"); //Хороший сегодня денек!

Zombieorc
31.03.2005, 08:49
2TycoooN: AI_Output(other,self,"DIA_***_15_??"); //Хороший сегодня денек!
А где это прописывать? Так ты мне не ответил, можно выложить ваш туториал по скриптам? :)

TycoooN
31.03.2005, 13:04
2Zombi_ork:
Прописывать это в скрипте диалога.
Если ты потратишь пять минут на изучение скриптов а папке scripts\content\story\dialoge\ и у тебя есть голова на плечах - ты сам поймешь структуру диалогов и квестов.

Так ты мне не ответил, можно выложить ваш туториал по скриптам?
Отвечаю уже второй раз: можно дать ссылку на файл.
Выкладывать же сами уроки на сайте, или еще где-нибудь, нельзя :dont.:

Отец Левонтий
31.03.2005, 15:44
2TycoooN:
Почему у меня не работает озвучка моих диалогов? :upset:
Файлы назвал также как в скриптах:
DIA_Vanya_Hello_15_00 и т.п.
и поместил их в Speech.
Как добавить еще вариант ответа и/или вопроса в меню ГГ (ну это текст внизу экрана, где еще "Конец" иногда :) )?

TycoooN
31.03.2005, 16:14
2Отец Левонтий:
Почему у меня не работает озвучка моих диалогов?
Хм, не знаю даже... А в игре субтитры нормально отображаются?

Как добавить еще вариант ответа и/или вопроса в меню ГГ (ну это текст внизу экрана, где еще "Конец" иногда )?
Прописать еще один (другой) instance DIA_Vanya_*** (c_info) в скрипт :rolleyes:

TycoooN
31.03.2005, 19:39
2Отец Левонтий:
А ты в каком формате звук записывал? Скорее всего, формат неправильный :idea:

2francisc:
А ты сам-то попробуй найти, ты же писал все-таки :)

Отец Левонтий
31.03.2005, 21:20
Формат правильный - WAV :idea:
Виндоузовской звукозаписью писал :)

TycoooN
31.03.2005, 21:54
2Отец Левонтий:
Формат правильный - WAV
Виндоузовской звукозаписью писал
Не факт. Готика поддерживает только какой-то особый .WAV, я в этом честно говоря не разбираюсь, но уверен, что формат неправильный :)

Отец Левонтий
31.03.2005, 22:03
А гле же тогда правильный взять?

TycoooN
31.03.2005, 22:14
2Отец Левонтий:
Нужно юзать профессиональные программы для работы со звуком, а не виндосовскую звукозапись :)
Для Готики нужен формат WAV, IMA IDPCM 44100 177kbit, mono

Арсений
31.03.2005, 22:17
2Отец Левонтий: По этому вопросу можно у _Jeka_ спросить :idea:

Killer-XXX
31.03.2005, 23:05
2TycoooN:
Дык как раз, писать надо через проф. программы, но переживать нужно через виндовую звукозапись. :)
Но проконсультироваться с Jeka лучше. :)

Отец Левонтий
01.04.2005, 08:49
Создал в OLDCAMP.zen варпоинт, но НПС не хочет на нем стоять! :(
А на других, созданных пираньями, стоит :idea:
Вроде в скриптах все правильно пишу, а в игре не появляется...
Прошу вашей помощи! :rolleyes:

Отец Левонтий
01.04.2005, 16:39
Как сделать, чтобы варианты ответа и/или вопроса в меню ГГ при диалоге появлялись в зависимости от выбора ответа, т.е. например, если сказать НПСу "хороший денек!", то он ответит "ага" и больше ничего не произойдет...
А вот если сказать НПСу "У тебя есть для меня работа?" и он ответит "угу", то появятся еще два варианта ответа "Хорошо, я сделаю" и "Я не буду это делать", которые раньше не отображались.
Так вот... Как сделать, чтобы сначала варианты ответа и/или вопроса в меню ГГ были как бы скрытыми, а потом появлялись при выборе нужного варианта ответа?
Я думаю надо использовать функции IF и ELSE, хотя точно не знаю...
Подскажите :rolleyes:

TycoooN
01.04.2005, 17:20
2Отец Левонтий:
Чтобы "скрыть" опцию диалога нужно прописать какое-либо условие в ее condition-функцию.
В общем, вот тут мини-тутор, если что непонятно - спрашивай :)

[code:1]
instance DIA_1000_TycoooN_Hi (c_info)
{
npc = DIA_1000_TycoooN_Hi; //НПС
nr = 1; //Чем меньше nr, тем выше будет находится данная опция в списке опций
condition = DIA_1000_TycoooN_Hi_Condition; //condition-функция опции, имеет тип int, должна быть прописана дальше
information = DIA_1000_TycoooN_Hi_Info; //information-функия опции, имеет тип void, должна быть прописана дальше
important = FALSE; //Если TRUE, НПС сам обратится к ГГ при приближении последнего
permanent = FALSE; //Если TRUE, опция не исчезнет после выбора, ее можно выбирать не один раз
trade = FALSE; //Нужно указывать TRUE, если по окончании диалога НПС будет торговать
description = "Хороший денек!"; //Тут все понятно, отображение опции в игре
//important, permanent и trade, если FALSE, прописывать необязательно
};

func int DIA_1000_TycoooN_Hi_Condition() //condition-функция показывает, когда опция будет отображаться
{
return TRUE; //Никаких условий нет, следовательно опция отображается ВСЕГДА
};

func void DIA_1000_TycoooN_Hi_Info() //information-функия показывает, какие действия последуют при выборе опции
{
AI_Output(other,self,"DIA_1000_TycoooN_Hi_15_00"); //Хороший денек!
AI_Output(self,other,"DIA_1000_TycoooN_Hi_01_01"); //Ага.
};

/***************************************************************/
instance DIA_1000_TycoooN_Job (c_info)
{
npc = DIA_1000_TycoooN_Hi;
nr = 1;
condition = DIA_1000_TycoooN_Job_Condition;
information = DIA_1000_TycoooN_Job_Info;
description = "У тебя есть для меня работа?";
};

func int DIA_1000_TycoooN_Job_Condition() //На этот раз будет условие: ГГ говорил "Хороший денек!", т.е. опция ОБЯЗАТЕЛЬНО следует за предыдущей
{
if (Npc_KnowsInfo(other,DIA_1000_TycoooN_Hi))
{
return TRUE;
};
};

func void DIA_1000_TycoooN_Job_Info()
{
AI_Output(other,self,"DIA_1000_TycoooN_Job_15_00"); //У тебя есть для меня работа?
AI_Output(self,other,"DIA_1000_TycoooN_Job_01_01"); //Угу. Принеси мне 100 рублей.

//Так делаются развилки, см. описание функций в Уроках Скриптологии by Vam
Info_ClearChoices(DIA_1000_TycoooN_Job);
Info_AddChoice(DIA_1000_TycoooN_Job,"Я не буду это делать.",DIA_1000_TycoooN_Job_No);
Info_AddChoice(DIA_1000_TycoooN_Job,"Хорошо, я сделаю.",DIA_1000_TycoooN_Job_Ok);
};

func void DIA_1000_TycoooN_Job_No()
{
AI_Output(other,self,"DIA_1000_TycoooN_Job_No_15_00"); //Я не буду это делать.
AI_StopProcessInfos(self); //ГГ "выбрасывает из диалога с НПС, типа он обиделся.
};

func void DIA_1000_TycoooN_Job_Ok()
{
AI_Output(other,self,"DIA_1000_TycoooN_Job_Ok_15_00"); //Хорошо, я сделаю.
//Далее типичные действия при получении нового квеста:
Log_CreateTopic(TOPIC_MyQuest,LOG_MISSION);
Log_SetTopicStatus(TOPIC_MyQuest,LOG_RUNNING);
MIS_MyQuest = LOG_RUNNING;
Info_ClearChoices(DIA_1000_TycoooN_Job); //иначе опция "Я не буду это делать." не уберется
};
[/code:1]

Отец Левонтий
01.04.2005, 21:21
2TycoooN:
Спасибо, все подробно и понятно написано!
Здесь вопросов нет! :)
А здесь есть... :rolleyes:
1. Не могу декомпилировать Gothic.dat, для получения русских скриптов(используется прога Вама). Все сделал по тутору:
Gothic.dat поместил в папку _compiled;
в свойствах ярлыка написал "C:\Dekompilyator\system\GothicSourcerV1_9.exe -zlog:8,s -zfile:gothic -zcomp:0,0 -zgame:1";
А zSpy выдает это красным шрифтом " 00:00 Fatal:-1 U: PAR: Dat-File is not compatible (Classoffset changed) ! Please reparse ! .... <zParser.cpp,#599>" и еще много чего зеленым...
И скрипты в папке C:\Dekompilyator.... не появляются. Что делать? :?:
2. Почему после того как я раздразню моего НПС и он нападет на ГГ и вырубит его, не получается обратиться ни к одному НПС, нет подписей над людьми и предметами? В скриптах прописал :"Npc_SetTarget(self,other);
AI_StartState(self,ZS_ATTACK,1,"");
};"
З.Ы. Функцию ататки позаимствовал у Кирго :confus:
Вроде пока вопросов больше нет... :)
З.З.Ы.TycoooN, Огромная благодарность тебе от меня! Побольше бы таких людей! :idea:

TycoooN
01.04.2005, 23:32
2Отец Левонтий:
У тебя, как я понял первая Готика?
Тогда передалай ярлык на
"C:\Dekompilyator\system\GothicSourcerV1_9.exe" -zlog:8,s -zfile:gothic -zcomp:0,0 -zgame:0

Почему после того как я раздразню моего НПС и он нападет на ГГ и вырубит его, не получается обратиться ни к одному НПС, нет подписей над людьми и предметами?
Хм, я по первой Готике не знаток (да и по второй тоже :) ), но ты прописывал перед AI_StartState(self,ZS_ATTACK,1,"");
AI_StopProcessInfos();
?
Так нужно делать во второй... :)
Попробуй, в общем :)

TycoooN, Огромная благодарность тебе от меня! Побольше бы таких людей!
Всегда рад помочь начинающему скриптеру, особенно если у него есть голова на плечах :)

Отец Левонтий
01.04.2005, 23:37
Так нужно делать во второй...
Я это брал из первой :idea:

TycoooN
01.04.2005, 23:44
2Отец Левонтий:
В первой тоже скорее всего надо.

Zombieorc
02.04.2005, 08:20
2TycoooN: да, это хорошо помогать, и давайте делайте мод, вроде Killer-XXX говорил что что-то вы делаете. так что удачи!!!:)
НУ и конечно + кармы сейчас тебе, и + завтра кармы 2Отец Левонтий

И еще 2TycoooN заходи по чаще ко мен на форум, там тоже иногда нужна помощь;)

Отец Левонтий
03.04.2005, 14:09
Почему при декомпиляции Gothic.dat не переписываются подписи за коментариями в файлах диалогов? Декомпилировал как из Г1 так и из Г2.

Отец Левонтий
03.04.2005, 14:27
Где хранится информация о рычагах и выключателях, что и где надо прописать, чтобы выключатель работал, поднимал, опускал решетку и т. п.

TycoooN
03.04.2005, 16:03
2Отец Левонтий:
Почему при декомпиляции Gothic.dat не переписываются подписи за коментариями в файлах диалогов? Декомпилировал как из Г1 так и из Г2.
Эти подписи находятся в файле OU.BIN, а не в GOTHIC.DAT
Чтобы они подписывались, нужно перед декомпиляцией положить файл OU.BIN в папку декомпилятора _work\data\scripts\content\cutscene
Я просто об этом забыл написать в мини-туторе на АГФЦ :)

Где хранится информация о рычагах и выключателях, что и где надо прописать, чтобы выключатель работал, поднимал, опускал решетку и т. п.
Эта информация хранится в файле мира, .ZEN, за это отвечают триггеры.
Я сам с этим еще до конца не разобрался :?:

Отец Левонтий
03.04.2005, 16:26
Что такое триггеры? :lamer:
Я сам с этим еще до конца не разобрался
расскажи, что знаешь :)

Отец Левонтий
03.04.2005, 21:39
Где изменять время задержки субтитра при разговоре?

TycoooN
03.04.2005, 23:20
2Отец Левонтий:
Триггеры - это как бы виртуальные рычаги... их можно ставить в Спейсере и настраивать на запуск определенных функций при определенных действиях НПС :?:

Где изменять время задержки субтитра при разговоре?
Хм, так вроде бы нигде, но есть такая вот глобальная константа:
const float VIEW_TIME_PER_CHAR = 550;
(см. Уроки скриптологии ;) )

Отец Левонтий
05.04.2005, 18:45
Как связать рычаг oCMobInter с oCTriggerScript? :?:

Dima534
08.04.2005, 14:22
Всем привет). Вот проблема такая возникла, подскажите пожалуйста :
instance DIA_Mud_Exit(C_Info)
{
npc = VLK_574_Mud;
nr = 999;
condition = DIA_mud_Exit_Condition;
information = DIA_mud_Exit_Info;
permanent = 1;
description = DIALOG_ENDE;
};


func int DIA_mud_Exit_Condition()
{
return 1;
};

func void DIA_mud_Exit_Info()
{
AI_StopProcessInfos(self);
};



instance DIA_Mud_FirstExit(C_Info)
{
npc = VLK_574_Mud;
nr = 1;
condition = DIA_Mud_FirstExit_Condition;
information = DIA_Mud_FirstExit_Info;
permanent = 1;
important=0;
Description="Дай мне мечи на продажу";
};

func int DIA_Mud_FirstExit_Condition()
{
return 1;
};

func void DIA_Mud_FirstExit_Info()
{
print("Хорошо , как продашь все , приходи ко мне");
createinvItems(self,innos_zorn,50);
B_GiveInvItems (hero, self,Innos_zorn, 50);

};


instance DIA_Mud_XIT(C_Info)
{
npc = VLK_574_Mud;
nr = 10;
condition = DIA_Mud_XIT_Condition;
information = DIA_Mud_XIT_Info;
permanent = 1;
Description="Я достал еще меч, продам его всего за 100 кусков руды";
};


func int DIA_Mud_XIT_Condition()
{
return 1;
};

func void DIA_Mud_XIT_Info()
{
createinvItems(self,ItMiNugget,100);
B_GiveInvItems (hero, self,ItMiNugget,100);
};

Проблема заключается в том что в меню диалога отображаеться только "дай мне мечи на продажу" и не как не хочет отображатьься "я достал еще мечи..." , подскажите что не так со скриптами,а еще когда я беру у него 50 Инносов))) , написано -"отдано 50 предметов" а у меня в инвентаре этих гНЕВОВ ИННОСА НЕ появляется)),Помогите пожалуйста, а то я :lamer:

TycoooN
08.04.2005, 20:21
2Dima534:
B_GiveInvItems (hero, self,Innos_zorn, 50);
Здесь неправильно.
Надо
B_GiveInvItems(other,self,Innos_Zorn,50);

А почему не отображается вторая опция, даже не знаю :?: :?:

francisc
09.04.2005, 13:15
Так вот я нашел ,как писать миссии
[code:1]Миссии

INSTANCE DIA_Alex_MIS(C_INFO)
{
npc = bau_999_Alex;Код нпс, который будет доватьь миссию
nr = 2;Важность,месть положение в меню
condition = DIA_Alex_MIS_Condition;** название переменной
information = DIA_Alex_MIS_Info;** название переменной
permanent = FALSE;** то что диалог повторяется бесконечно, если = TRUE, если =False, то один раз
important = TRUE; ** нпс начинает говорить первым =TRUE, если =False, то нечего не происходит
description = "ХХХ"; ** здесь то о чём будет написанно в меню
};

FUNC INT DIA_Mager_MIS_Condition() **функция переменной, которая записана выше
{
if () **Тут записывается условие,условия можно посмотреть в других миссиях
{
return TRUE;
};
};
FUNC VOID DIA_Alex_MIS_Info() **функция переменной которая записана выше

{
AI_Output (other, self, "DIA_Alex_MIS_15_00");// **Тут идет диалог отображается в субтитрах,если (other, self) , то начинает ГГ к НПС, если наоборот, то НПС к ГГ
AI_Output (self, other, "DIA_Alex_MIS_04_01");//
AI_Output (self, other, "DIA_Alex_MIS_04_02");//
AI_Output (self, other, "DIA_Alex_MIS_04_03");//
AI_Output (self, other, "DIA_Alex_MIS_04_04");//
AI_Output (self, other, "DIA_Alex_MIS_04_05");//
AI_Output (other, self, "DIA_Alex_MIS_15_06");//

Log_CreateTopic (Topic_Alex,LOG_MISSION); **создаётся запись в дневнике, в теме активных заданий......(Topic_Alex) создаёшь в (Gothic II\_work\data\Scripts\Content\Story\Log_Entries)в (LOG_Constants_Mattes)
Log_SetTopicStatus (Topic_Alex,LOG_RUNNING);** миссия НАЧАЛАСЬ
B_LogEntry (Topic_Alex,"ХХХ."); **То, что написано в дневнике

};

сохраняем в (Gothic II\_work\data\Scripts\Content\Story\Dialoge)[/code:1]
Может не так подробно как у 2TycoooN: Кстати,ты можешь рассказать как вводить новую переменную,лучше с примером.

TycoooN
09.04.2005, 14:45
2francisc:
Кстати,ты можешь рассказать как вводить новую переменную,лучше с примером.
var int Novaya_Peremennaya;

francisc
09.04.2005, 16:04
Не,это понятно.Ее надо где-нибудь еще прописывать?И как ее можно использовать?Просто когда я вводил почему-то диалог не появлялся.

Rasmus
07.12.2005, 11:16
Подскажите пожалуйсто как редактировать мир.

Dannic
07.12.2005, 11:28
2Rasmus: Вот это прочитай,много полезного:

http://www.allgothic.ru/forum/showthread.php?t=738

Impertor
07.12.2005, 13:10
«Летописи строителей» (создание модов) (http://www.allgothic.ru/forum/showthread.php?t=1002)

Модостроение (http://www.allgothic.ru/forum/showthread.php?t=738)

Форум Строителей (http://modteam.allgothic.ru/forum/)


http://www.postcard.ru/pic/iuser/1129637072_zacr.jpg