EmptY

Новичок
Регистрация
2 Авг 2008
Сообщения
3
Репутация
0
Хы...... я забыл про вторую причину: яя попутно копаюсь в скриптах игры......
кста, еще один вопрос: как получить из ou.cls ou.bin?{с этим разобрался}
у мну вопрос по спейсеру: этот скот отказывается репарсить скрипты........ пишет "U-PAR:source file %Путь до *.src файла%\gothic.src not found", хотя все файло на месте.... может на нем сказывается что лежит не в папке с Готикой?..... подскажите что с ним сделать противоестественного :) , чтобы наконец отрепарсил скрипты???
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Вопрос по готической скриптологии:
Функции, представленные в файле IntFuncGothic2_ru.d программы GothicSourcerV3_14 - это все возможные функции?
 

MaGoth

Хранитель форума
Регистрация
30 Авг 2006
Сообщения
2,024
Репутация
0
Адрес
Самара
EmptY
Работай со скриптами при помоши программы GothicSourcer v3_14.
Декомпиляция/компиляция и создание новых скриптов. ;)
Спейсер для скриптинга, это каменный век модостроения. :D

redleha
Функции, представленные в файле IntFuncGothic2_ru.d программы GothicSourcerV3_14 - это все возможные функции?
На сколько я знаю это все функции используемые в скриптах Готики 1 и 2.
- Есть также функции ехе-шника игры, но там они не представлены т.к. не работаюст со скриптами на прямую.
- И есть новые функции созданные модостроителями в модах...

Примерно так. :)
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Еще вопросик возник!
Любые формы изменения скриптов влекут за собой начало новой игры для проверки их работоспособности?
Или в некоторых случаях можно и не начинать?
Например, после добавления простейшего квеста какому-нибудь НПСу нужно начинать заново?
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
Например, после добавления простейшего квеста какому-нибудь НПСу нужно начинать заново?
Да игру нужно начинать заново.
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Вот еще:
1) Как сказал DEDROIT, новую гильдию создать нельзя. Можно заменить ту с именем EMPTY в файле Constants.d
А если изменить значение GUILD_MAX с 66 на 100, что от этого изменится? Можно ли добавить еще гильдий?
Также что будет если НПСу присвоить гильдию нечеловеческую, а например GIL_SCAVENGER - к нему будет отношение как к падальщику?
И еще в файле guilds.d у меня матрица из чисел. Где в ней устанавливаются взаимоотношения между гильдиями?
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
1) Как сказал DEDROIT, новую гильдию создать нельзя. Можно заменить ту с именем EMPTY в файле Constants.d
А если изменить значение GUILD_MAX с 66 на 100, что от этого изменится? Можно ли добавить еще гильдий?
Нет ничего не измениться, количество гильдия зашито в двигу игры.
Также что будет если НПСу присвоить гильдию нечеловеческую, а например GIL_SCAVENGER - к нему будет отношение как к падальщику?
И еще в файле guilds.d у меня матрица из чисел. Где в ней устанавливаются взаимоотношения между гильдиями?
В туторе Vam'a об этом подробно описано ;)
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Marvin, спасибо.
ОБращение-просьба к скриптологам:
Не могли бы вы сделать тутор на примере подробного разбора нескольких скриптов неписей: например Лареса!, Ватраса, Хагена, Пирокара.
Если нет, то не надо. Просто просьба.
----------------------------------------------------
P.S. Я разобрался самостоятельно со скриптом Константино. Просто данные неписи наиболее объемные.
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
redleha
Немного не понятно, именно скрипта НПС, или всех скриптов (диалогов, если торговец), которые относятся к даному НПС.
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
То есть я так понимаю ты хочешь чтобы в этих скриптах откомментировать каждую функцию, что она означает и что к чему?
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Ну да, так в целом именно эти неписи самые объёмные и наиболее содержательные. Просто прокомментировать в скриптах почти все строки квестов. И функции...Если есть варианты других неписей, то я просто за!
 

Beckham

Паладин
Регистрация
9 Ноя 2006
Сообщения
189
Репутация
0
Адрес
Днепропетровск
redleha

Ну не знаю, вспоминая про объемы приведенных тобой файлов, нет в твоей просьбе смысла. Тебе что конкретно не ясно?
Сама структура диалога или тебе нужно разъяснить элементарные основы любого языка программирования (условные операторы, логические выр-я и т.п.) ? Правильно тебе писали, читай тутор ВАМ-а, там есть ответы на многое (хотя я лично когда разбирался в скриптах, его и не открывал, там ведь в скриптах ниче этакого нет, элементарный язык).
Кстати, писать комент на каждую строку кода тебе тоже не поможет, там в тех квестах куча глобальных переменных, хранящихся в др. файлах, не подробно же все это расписывать.
Лучше всего открой файл диалога поменьше какого-нить немногословного НПС с маленьким побочным квестом, почитай, повникай, это лучше всего будет, если надо разобраться с основами написания квестов.
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
redleha
Вот собственно по поводу скриптинга и описания. Вот скрипт я его одному человеку на WOG'e приводил в роли примера, полностью откомментирован, можешь посмотреть может что-то полезное для себя возьмешь.

Код:
/* Условие выхода с диалога*/
instance DIA_MyPers_Fox_EXIT(C_Info)
{
	npc = NONE_66613_Fox;
	nr = 999;
	condition = DIA_MyPers_Fox_EXIT_Condition;
	information = DIA_MyPers_Fox_EXIT_Info;
	permanent = FALSE;
	description = Dialog_Ende;
};


func int DIA_MyPers_Fox_EXIT_Condition()
{	
	return TRUE;	
};

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


/* Теперь диалог ну и квест заодно*/
instance DIA_MyPers_Fox(C_Info)
{
	npc = NONE_66613_Fox;
	nr = 1;
	condition = DIA_MyPers_Fox_Condition;
	information = DIA_MyPers_Fox_Info;
	permanent = FALSE;
	important = TRUE;   /* НПС сам обратится к ГГ*/
};


/* Ниже идет функция условия, то есть в каком случае произойдет диалог.
 * Диалог произойдет только в том случае если глава еще не третяя, и ГГ в 
 * гильдии Наёмников или без гильдии*/
func int DIA_MyPers_Fox_Condition()
{
	if(((hero.guild == GIL_NONE) || (hero.guild == GIL_SLD)) &amp;&amp; (Kapitel < 3)) 
	{
  return TRUE;
	};
};

/* Теперь, собственно, начинается сам диалог!*/
func void DIA_MyPers_Fox_Info()
{
	/* Так теперь проверяем в какой гильдии наш ГГ.*/
	/* Если ГГ без гильдии*/
	if (hero.guild == GIL_NONE)
	{
  AI_Output(self,other,"DIA_MyPers_Fox_pers_00");	//Стой!!! Ага дворняга...Слушай у меня есть для тебя предложение!.
  AI_Output(other,self,"DIA_MyPers_Fox_gg_01");   //(громко) ...я не дворняга!
  AI_Output(self,other,"DIA_MyPers_Fox_pers_02");  //Заткнись и слушай, судя по твоей одежке, тебе не помешают лишние копейки!
  AI_Output(self,other,"DIA_MyPers_Fox_pers_03");	//Так вот, у меня сейчас нет времени, сходи и принеси мне пива, кусок хлеба и окорок.
  AI_Output(self,other,"DIA_MyPers_Fox_pers_04");	//Я тебе за это заплачу, только побыстрее, а то я умираю с голода!
	}
	
	/* Если ГГ Наёмник, то произойдет вот этот диалог!*/
	else if (hero.guild == GIL_SLD)
	{
  AI_Output(self,other,"DIA_MyPers_Fox_pers_05");	//О...стой, ты Наёмник, да? Послушай хочешь заработать, а? У меня есть для тебя работенка по плечу.
  AI_Output(other,self,"DIA_MyPers_Fox_gg_02");	//Я слушаю!
  AI_Output(self,other,"DIA_MyPers_Fox_pers_06");	//Есть один человек, который мне мешает, разберись с ним и я тебе хорошо заплачу!
	};
	
	/* Теперь я думаю будет уместно дать право ГГ выбирать, что собственно сейчас и сделаю*/
	Info_ClearChoices(DIA_MyPers_Fox);
	Info_AddChoice(DIA_MyPers_Fox,"Хорошо я сделаю это с удовольствием!",DIA_MyPers_Fox_OK);
	Info_AddChoice(DIA_MyPers_Fox,"Ты вообще кто такой проваливай, нечего мне делать больше...",DIA_MyPers_Fox_FUCKOFF);
	Info_AddChoice(DIA_MyPers_Fox,"Нет, я спешу!",DIA_MyPers_Fox_NO);
};

/* Теперь пишем что собственно произойдет когда ГГ выберет один из вариантов ответа*/
/* Если ГГ согласился, то есть первый вариант*/
func void DIA_MyPers_Fox_OK()
{
	/* Снова делаем проверку на принадлежность к гильдии*/
	if (hero.guild == GIL_NONE)
	{
  AI_Output(other,self,"DIA_MyPers_Fox_OK_gg_00");	//Хорошо,я принесу тебе все что ты хочешь.
  AI_Output(self,other,"DIA_MyPers_Fox_OK_pers_01"); //Давай - давай, только побыстрей!
  
  /* Теперь открываем новую миссию и записываем все в дневник!*/
  Find_Food = LOG_Running;                           /*Find_Food надо будет прописать в файл Story_Globals.d в таком виде - var int Find_Food;  */
  Log_CreateTopic(TOPIC_Food,LOG_MISSION);  
  Log_SetTopicStatus(TOPIC_Food,LOG_Running);
  B_LogEntry(TOPIC_Food,"Я должен принести Фоксу один кусок хлеба, один кусок окорока и пляшку пива!");/* То что будет написано в дневнике.*/
  /*Выходим с диалога*/
  AI_StopProcessInfos(self);
	}
	/* Если ГГ Наёмник тогда этот диалог*/
	else if (hero.guild == GIL_SLD)
	{
  AI_Output(other,self,"DIA_MyPers_Fox_OK_gg_01");	//Хорошо, с кем мне нужно "поговорить"?
  AI_Output(self,other,"DIA_MyPers_Fox_OK_pers_02");	//Его зовут Пабло, он в городе, патрулирует окресности.
  
  /* Теперь для интереса проверим, знает ли ГГ кто такой Пабло.*/
  /* сделать это очень просто, мы проверим общался ли ГГ с ним.*/
  /* Если ГГ знает Пабло, то этот диалог*/
  if(Npc_KnowsInfo(other,DIA_Pablo_WANTED))
  {
  	AI_Output(other,self,"DIA_MyPers_Fox_OK_gg_02"); //Аааа...это тот мент, да уж он меня тоже хотел поймать...Ладно я разберусь с ним!
  }
  /* Если нет то отобразится вот этот диалог*/
  else
  {
  	AI_Output(other,self,"DIA_MyPers_Fox_OK_gg_03"); //Пабло!?... Кто это...хм...первый раз о нем слышу.Посмотрим что я смогу сделать!
  };
  
  /* Как обычно пишем все в дневник и запускаем миссию */
  Kill_Pablo = LOG_Running;/*Kill_Pablo надо будет прописать в файл Story_Globals.d в таком виде - var int Kill_Pablo;  */        
  Log_CreateTopic(TOPIC_KillPablo,LOG_MISSION);  
  Log_SetTopicStatus(TOPIC_KillPablo,LOG_Running);
  B_LogEntry(TOPIC_KillPablo,"Я должен разобраться с типом по имени Пабло!");/* То что будет написано в дневнике.*/
  /*Выходим с диалога*/
  AI_StopProcessInfos(self);
	};	
};

/* Если ГГ выбрал второй вариант ответа, то есть послал куда подальше этого Фокса=)*/
func void DIA_MyPers_Fox_FUCKOFF()
{
	AI_Output(other,self,"DIA_MyPers_Fox_FUCKOFF_gg_00"); //Ты вообще кто такой, проваливай, пока еще не поздно!
	/* Снова делаем проверку на принадлежность ГГ к гильдии
  * я это делаю ради того, что-бы проверить стоит ли Фоксу проучить ГГ
  * за свой длинный язык!*/
	/** Так вот если ГГ не в гильдии, тогда...*/
	if (hero.guild == GIL_NONE)
	{
  AI_Output(self,other,"DIA_MyPers_Fox_FUCKOFF_pers_01"); //Ах ты щенок, а иди сюда сейчас я тебе покажу!!!
  /* Выходим из диалога*/
  AI_StopProcessInfos(self);
  /* Фокс атакует ГГ */
  B_Attack(self,other,AR_NONE,1);
	}
	/* Но что если ГГ наёмник?*/
	else if (hero.guild == GIL_SLD)
	{
  /* Проверим насколько хорош ГГ =)*/
  /* Здесь я проверяю насколько сильный и ловкий ГГ. Если сила и ловкость ГГ больше-равна 40
   * тогда Фокс его не атакует, а если меньше 40 то ГГ попал.*/
  if ((hero.attribute[ATR_STRENGTH] >= 40) &amp;&amp; (hero.attribute[ATR_DEXTERITY] >= 40))
  {
  	AI_Output(self,other,"DIA_MyPers_Fox_FUCKOFF_pers_02"); //Хм...я вижу ты молодец, не слушаешь кого попало. Так держать!
  	AI_StopProcessInfos(self);
  }
  else
  {
  	AI_Output(self,other,"DIA_MyPers_Fox_FUCKOFF_pers_03"); //Ты думаешь что одев доспехи наёмника ты стал сильнее? А может ты их украл?
  	AI_Output(self,other,"DIA_MyPers_Fox_FUCKOFF_pers_04");	//Хотя нет, такой слабак не мог этого сделать, сейчас я тебя проучу!!!
  	/* Выходим из диалога*/
  	AI_StopProcessInfos(self);
  	/* Фокс атакует ГГ */
  	B_Attack(self,other,AR_NONE,1);
  };
	};
};

/* Если ГГ выбрал третий вариант*/
func void DIA_MyPers_Fox_NO()
{
	AI_Output(other,self,"DIA_MyPers_Fox_NO_gg_00"); //Нет, у меня просто на это нет времени!
	/* Снова проверка*/
	if (hero.guild == GIL_NONE)
	{
  AI_Output(self,other,"DIA_MyPers_Fox_NO_pers_01"); //Тогда ПРОВАЛИВАЙ щенок и не мешай мне!!!
	}
	else if (hero.guild == GIL_SLD)
	{
  AI_Output(self,other,"DIA_MyPers_Fox_NO_pers_02");	//Жаль, а мы могли потом сотрудничать.
	};
	AI_StopProcessInfos(self);
};


/* Далее старанно выполняем возложеную на нас миссию и когда будет все готово приходим к Фоксу*/
instance DIA_MyPers_Fox_Done(C_Info)
{
	npc = NONE_66613_Fox;
	nr = 2;
	condition = DIA_MyPers_Fox_Done_Condition;
	information = DIA_MyPers_Fox_Done_Info;
	permanent = FALSE;
	description = "Вот, я зделал то что ты просил!";
};

func int DIA_MyPers_Fox_Done_Condition()
{
	/* Проверяем условие начала диалога, то есть если условия будут выполнены то ГГ сможет
  * обратиться к Фоксу, а если нет,...то понятно=)*/
	/* Делаем это просто, проверяем взялся ли ГГ выполнять одну из миссий*/
	/* Здесь важная деталь я проверяю какая миссия запущена и + выполнено ли условие миссии.
  * Npc_IsDead(Pablo) проверка жив ли Пабло. Переменная Pablo описана в файле Npc_Globals.d.
  * Еда и другие предметы хранятся в папке Items.*/
	if(((Kill_Pablo == LOG_Running) &amp;&amp; Npc_IsDead(Pablo)) || ((Find_Food == LOG_Running) &amp;&amp; Npc_HasItems(other,ItFo_Bacon) &amp;&amp; Npc_HasItems(other,ItFo_Bread) &amp;&amp; Npc_HasItems(other,ItFo_Beer))) 
	{
  return TRUE;
	};
};

func void DIA_MyPers_Fox_Done_Info()
{
	/* Теперь проверяем какую именно миссию дали ГГ */
	if (Kill_Pablo == LOG_Running)
	{
  AI_Output(other,self,"DIA_MyPers_Fox_Done_gg_00"); //Я позаботился о Пабло. Больше он нас не потревожит!
  AI_Output(self,other,"DIA_MyPers_Fox_Done_pers_02"); //Очень хорошо, держи свое вознаграждение!
  /* Начисляем опыт ГГ*/
  B_GivePlayerXP(500);
  /* Даем ГГ золото*/
  B_GiveInvItems(self,other,ItMi_Gold,300);
  /* Записываем в дневник*/
  B_LogEntry(TOPIC_KillPablo,"Я разобрался с Пабло, теперь он больше никого не потревожит.");
  /* Закрываем топик*/
  Log_SetTopicStatus(TOPIC_KillPablo,LOG_SUCCESS);
	}
	else if (Find_Food == LOG_Running)
	{
  AI_Output(other,self,"DIA_MyPers_Fox_Done_gg_01"); //Я принес все что ты просил.
  AI_Output(self,other,"DIA_MyPers_Fox_Done_pers_03"); //Отлично давай сюда, давно пора.
  /* Отдаем Фоксу еду*/
  B_GiveInvItems(other,self,ItFo_Beer,1);
  B_GiveInvItems(other,self,ItFo_Bread,1);
  B_GiveInvItems(other,self,ItFo_Bacon,1);
  /* Начисляем опыт ГГ*/
  B_GivePlayerXP(150);
  /* Даем ГГ золото*/
  B_GiveInvItems(self,other,ItMi_Gold,35);
  /* Записываем в дневник*/
  B_LogEntry(TOPIC_Food,"Я принес все что просил Фокс.");
  /* Закрываем топик*/
  Log_SetTopicStatus(TOPIC_Food,LOG_SUCCESS);    
	}; 
};


/* ТЕПЕРЬ НЕКОТОРЫЕ ПРИМЕЧАНИЯ. Итак для полного счастья нужно в файл LOG_Constants_Yoly.d
 * который находится в папке Log_Entries дописать следующее: 
 * const string TOPIC_Food = "Вещи для Фокса";
 * const string TOPIC_KillPablo = "Убить Пабло";
 * это заголовки тем в дневнике.
 * Ну и конечно самое главное, это добавить такого НПС как Фокс, то есть создать 
 * файл с именем NONE_66613_Fox.d и написать нашего НПС. Потом следует прописать
 * нашего НПС и файл диалога куда нужно и скомпилить.Вот в принципе и все.
 * Желаю Удачи.*/

P.S. ему писал и тебе напишу. Скрипт не проверял, так как у меня сейчас нет Готики 2 + он сильно сырой, недоделаный, возможно и не рабочий :P . Это всего лишь пример!!!
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Спасибо, Marvin, что отозвался. Хотя данный пример простой, но всё равно Спасибо.
Я почему сложных НПСов просил, потому что они наиболее разнообразны во взаимодействии с ГГ.
В принципе уже с половиной скриптов Акеллы разобрался. Осталось вторая половина - сложновывернутые квесты попробовать реализовать со всевозможными ответвлениями...
 

Marvin

Ополченец
Регистрация
13 Фев 2008
Сообщения
96
Репутация
1
Адрес
Ukraine
redleha
Там тоже нет ничего сложного ;) , просто в подобных квестах, что ты писал, как уже говорил Beckham есть переменные которые хранятся в других файлах, и получается некое ветвление, что немного, поначалу, запутывает.
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,492
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
- Есть также функции ехе-шника игры, но там они не представлены т.к. не работают со скриптами напрямую.
А можно конкретные примеры привести...?
 
Сверху Снизу