• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 511
Последнее редактирование модератором:

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340
Sumrak74 - судя по твоему распорядку, func void rtn_MIS_001() отличается от func void rtn_start_001() лишь последней строкой.
TA_Stand_WP(23,55,3,0,"NW_FARM2_TO_TAVERNCAVE1_100");
получается, что распорядок изменится, но вот действия будут отличаться только с 23,55. Там он будет стоять на вее до 3 ночи. Вопрос. Что непись будет делать с трех ночи до 8 утра, если этого нет в распорядке?
 

Sumrak74

Участник форума
Регистрация
12 Авг 2010
Сообщения
93
Благодарности
0
Баллы
155
hell9999, не повлияло никак, всё так же. А ответ на вопрос прост - он будет стоять там же, ибо я так уже делал.
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340
hell9999, не повлияло никак, всё так же. А ответ на вопрос прост - он будет стоять там же, ибо я так уже делал.

Ну естественно не повлияло. У Вас расписание по сути дублируется с обычным распорядком дня. Как Вы собираетесь проверять то срабатывание?
Временной промежуток, в котором можно заметить разницу составляет всего три часа. Вы проверяли срабатывание в указанный в новом распорядке промежуток времени?
А вообще, советую изменить расписание №2, чтобы не было путаницы. Что касается неуказанного времени в расписании - то это признак дурного тона.
Нужно расписание составлять четко, с 8.00 по 8.00. Нельзя плодить кривой код, даже если он позволяет сэкономить пару строчек скрипта.
 

Sumrak74

Участник форума
Регистрация
12 Авг 2010
Сообщения
93
Благодарности
0
Баллы
155
Всё сделал
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340
hell9999,

Код:
func void rtn_MIS_001()
{
	TA_Stand_Guarding(3,0,23,55,"NW_TAVERNE_IN_RANGERMEETING");
	TA_Stand_WP(23,55,3,0,"NW_FARM2_TO_TAVERNCAVE1_100");
};
Сделал так - толку-то? Проблема однозначно не в этом, у него остается стартовый распорядок.
В диалоге с ним сделал Npc_ExchangeRoutine(self,"MIS"); - результат тот же - распорядок остался стартовый
Проверил на Орлане - с ним всё нормально.

instance vlk_666_blablabla(Npc_Default)
{
name[0] = "blablabla";
guild = GIL_NONE;
id = 001; - Это что за айдишник такой? Может стоит вместо него 666 написать?
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
Вопрос: Как добавить в Г2А возможность воровать как в Г1 - подкрадываясь сзади.(Может, уже и раньше этот вопрос задовался, но прочитывать 1500 постов ранее было-бы очень трудно (особенно, если нужного я бы так и не нашел)
ЗЫ. Раньше и сам умел, но потом долго этим не занимался и забыл:-\
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340
Вопрос: Как добавить в Г2А возможность воровать как в Г1 - подкрадываясь сзади.(Может, уже и раньше этот вопрос задовался, но прочитывать 1500 постов ранее было-бы очень трудно (особенно, если нужного я бы так и не нашел)
ЗЫ. Раньше и сам умел, но потом долго этим не занимался и забыл:-\

Насколько мне известно, стандартными средствами Дедалуса никак.
Сатурас делал на основе Г2экста, можешь спросить у него.
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
Hell9999, ясно... лад, попытаюсь спросить
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
В скриптпатче для НВ я разблокировал диалог у Беннета, в котором он отправляет за картой пещер Хориниса к городскому картографу Ибрагиму (Story\Dialoge\DIA_SLD_809_Bennet.d):
Код:
func void DIA_Bennet_DRACHENEIER_ok()
{
	AI_Output(other,self,"DIA_Bennet_DRACHENEIER_ok_15_00");	//Договорились.
	AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_01");	//Отлично.
	AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_02");	//Если найдешь еще, неси их сюда.
	if(BennetsDragonEggOffer != 350)
	{
		BennetsDragonEggOffer = 300;
	};
	CreateInvItems(self,ItMi_Gold,BennetsDragonEggOffer);
	B_GiveInvItems(self,other,ItMi_Gold,BennetsDragonEggOffer);
	AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_03");	//Эээ. Ты сказал, что забрал их у людей-ящеров?
	AI_Output(other,self,"DIA_Bennet_DRACHENEIER_ok_15_04");	//Точно.
	AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_05");	//Насколько я знаю, люди-ящеры обычно обитают в пещерах.
	AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_06");	//Я не удивлюсь, если тебе удастся найти еще яйца в пещерах неподалеку.
	B_LogEntry(TOPIC_DRACHENEIER,"Беннет полагает, что мне стоит поискать яйца в пещерах Хориниса. Во многих из них, по слухам, видели человекоящеров.");
	if(Npc_HasItems(other,ItWr_Map_Caves_MIS) == FALSE)
	{
		if([B]Npc_HasItems(Brahim,ItWr_Map_Caves_MIS)[/B] && (Npc_IsDead(Brahim) == FALSE))
		{
			AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_08");	//Но сначала ты должен взять карту пещер у картографа в городе. Будет жаль, если ты найдешь не все яйца.
			B_LogEntry(TOPIC_DRACHENEIER,"Я должен купить карту пещер у картографа в городе, чтобы быть уверенным, что я не пропущу часть яиц.");
		}
		else
		{
			AI_Output(self,other,"DIA_Bennet_DRACHENEIER_ok_06_07");	//Вот. Возьми эту карту. Она поможет тебе найти пещеры.
			CreateInvItems(self,ItWr_Map_Caves_MIS,1);
			B_GiveInvItems(self,other,ItWr_Map_Caves_MIS,1);
			B_LogEntry(TOPIC_DRACHENEIER,"Он дал мне карту пещер, возможно, она поможет мне.");
		};
	};
	Info_ClearChoices(DIA_Bennet_DRACHENEIER);
};
Но оказалось, что условие "у Ибрагима есть карта пещер Хориниса" не срабатывает до тех пор, пока ГГ не попросит картографа показать свои товары и поэтому Беннет почти всегда сам даёт эту карту. Та же самая ситуация наблюдается у Ультара, когда вместо совета купить карту священных алтарей у Горакса он сам даёт эту карту (Story\Dialoge\DIA_KDF_502_Ulthar.d):
Код:
func void DIA_Ulthar_SCHREINEVERGIFTET_Info()
{
	if((hero.guild == GIL_MIL) || (hero.guild == GIL_PAL))
	{
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_00");	//Еще одно. Некоторые придорожные алтари, посвященные Инносу, были осквернены врагом. Они потеряли свои магические свойства.
		AI_Output(other,self,"DIA_Ulthar_SCHREINEVERGIFTET_15_01");	//Понимаю, и что теперь?
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_02");	//Ты должен очистить эти алтари, чтобы ситуация не усугубилась.
		CreateInvItems(self,ItMi_UltharsHolyWater_Mis,1);
		B_GiveInvItems(self,other,ItMi_UltharsHolyWater_Mis,1);
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_03");	//Возьми эту святую воду и окропи ей основания алтаря.
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_04");	//Со святыми словами очищения к алтарю вернется его былая сила.
		if(Npc_HasItems(other,ItWr_Map_Shrine_MIS) == FALSE)
		{
			if([B]Npc_HasItems(Gorax,ItWr_Map_Shrine_MIS)[/B] && (Npc_IsDead(Gorax) == FALSE))
			{
				AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_05");	//Горакс может продать тебе карту, на которой помечены наши алтари.
			}
			else
			{
				AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_06");	//Вот карта. На ней отмечены алтари, построенные нами.
				CreateInvItems(self,ItWr_Map_Shrine_MIS,1);
				B_GiveInvItems(self,other,ItWr_Map_Shrine_MIS,1);
			};
		};
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_07");	//Теперь иди и выполняй свои поручения.
		MIS_Ulthar_HeileSchreine_PAL = LOG_Running;
		Log_CreateTopic(TOPIC_Ulthar_HeileSchreine_PAL,LOG_MISSION);
		Log_SetTopicStatus(TOPIC_Ulthar_HeileSchreine_PAL,LOG_Running);
		B_LogEntry(TOPIC_Ulthar_HeileSchreine_PAL,"Ультар дал мне задание очистить при помощи святой воды все алтари, оскверненные врагом.");
		AI_StopProcessInfos(self);
	}
	else
	{
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_08");	//Еще одно. Держись подальше от придорожных алтарей. Мы слышали, что некоторые из них были осквернены.
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_09");	//Никто не знает, как теперь они действуют.
		AI_Output(self,other,"DIA_Ulthar_SCHREINEVERGIFTET_05_10");	//Тебя не должна волновать эта проблема. О ней позаботятся паладины.
		AI_StopProcessInfos(self);
	};
};
Поэтому я считаю, что нужно убрать из этих скриптов условия "у Ибрагима есть карта пещер Хориниса" и "у Горакса есть карта священных алтарей" (выделены жирным шрифтом).
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Dimus, бывает такой косяк, что инициализированные глобальные переменные C_NPC не срабатывают, поэтому, замени их на названия инстанций НПС. Я уже сталкивался с таким, правда, не в диалогах.
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
...Поэтому я считаю, что нужно убрать из этих скриптов условия "у Ибрагима есть карта пещер Хориниса" и "у Горакса есть карта священных алтарей" (выделены жирным шрифтом).
Я думаю будет луше если добавить эти карты изначально в инвентарь непеся, как это сделанно, например, с ключами от городских башень. Считаю так будет правильнее...
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
@ redleha:
ОК, попробую.

@ Ilot:
Зачем? Ведь указанные выше предметы в начале главы добавляются в инвентарь этих торговцев в функциях вида B_GiveTradeInv_<npc>().
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Ilot:
Зачем? Ведь указанные выше предметы в начале главы добавляются в инвентарь этих торговцев в функциях вида B_GiveTradeInv_<npc>().

Не а. Эта функция добавляет предметы после того как ГГ активизрует соответствующую ветку диалога. А в скриптах написанно если в инвентаре непеся есть карта и он не мертв выводится первый блок условия. Но так как если ГГ еще не говорил с Брахимом, например, у Брахима карты в инвентаре нет;)!
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
@ Ilot:
Понятно. Следовательно, дополнительная проверка инвентаря торговца на наличие нужной карты всё-таки идёт лесом. Поэтому в итоге я оставил только проверку Ибрагима и Горакса на жив / мёртв.
 

Жан-Жак Грущу

Участник форума
Регистрация
8 Авг 2012
Сообщения
55
Благодарности
4
Баллы
155
Помогите решить проблему: распаковал мод, отредактировал файл "gothic.dat" в соусе, изменил буквально одно слово - польское стёр, в замен ему написал по-русски. Больше никаких изменений, ни в этом файле, ни в любом другом. Сохраняю я его, запаковывываю том мода целиком, с заменой старой версии, но мод отказывается работать. Прям наотрез. Т.е. захожу в стартер, запускаю, меню почему-то остается старое, а при начале новой игры шкала загрузки доходит до позиции запуска ролика, ролик я пропускаю - а дальше вылет.

В чем может быть причина? Ошибки вдфс? Ошибки соуса? Или всё-таки мои?
 

Ur-tRall

Участник форума
Регистрация
16 Май 2009
Сообщения
4.102
Благодарности
2.122
Баллы
475
Точное изменение по моду не скажу, но одна из ошибок бросилась в глаза. Необходимо обязательно при сохранении в режиме Буилдер в одной из первых строк сохранить с другим названием. И кстати, прописывал *.* в строчку file (masc) to search, затем +?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Жан-Жак Грущу, Твои.
Порядок такой:
1. распаковка мод файла
2. декомпиляция Готик.дат и оушника
3. перевод
4. компиляция Готик дат и оушника
5. сборка мод файла
6. копироание его в каталог игры + инишку для русской версии.
7. тестинг в игре.
 

Жан-Жак Грущу

Участник форума
Регистрация
8 Авг 2012
Сообщения
55
Благодарности
4
Баллы
155
Ur-tRall, маску тыкал, а вот "сохранить с другим названием" - это как я понимаю, если оригинал файла назывался "A.mod", то его измененную версию нужно запаковывать под именем "B.mod" ?

MaGoth, если ou.bin не нужен, его ведь не нужно трогать (?). Можно подробней по *.ini? Какая разница где храниться информация о инициализации? Если создавать этот файл специально для переведеной версии, то он не будет отличаться от оригинала, ведь информация будет идентична ему. А если я правильно понял Ur-tRall'a, то нужно будет просто изменить название *.mod файла в оригинальном *.ini...
 

Ur-tRall

Участник форума
Регистрация
16 Май 2009
Сообщения
4.102
Благодарности
2.122
Баллы
475
Насчёт первого высказывания, всё верно, поэтому переводы часто носят названия A.mod, а не A_RUS.mod. Если ты хочешь запустить свой изменённый мод, то для этого да, необходимо ещё создать твой ини файл с названием имени мода, допустим A_RUS. ini. Заходишь туда и через два пробела там где расписаны тома, которые запускает мод ставишь свой собственный мод A_RUS. Взгляни на ини файл Диккурика:
[INFO]
title="Диккурик" (без анимации природы)
description=В покинутых землях на границе королевства Беренгар собирает свою армию, чтобы свергнуть короля. Вам предстоит разобраться в ситуации.
authors=TAGMT
version=1.1с
webpage=http://www.tagmt.de.vu
[FILES]
; Dont attach file-extensions to these files.
game=content\gothic
fightai=content\fight
menu=system\menu
camera=system\camera
music=system\music
soundeffects=system\sfx
particleseffects=system\particlefx
visualeffects=system\visualfx
outputunits=content\cutscene\ou
; List of vdf-files which have been added to the original gothic
; [separate them by spaces, include their extension ".mod"]
vdf=diccuric.mod dic_speech.mod dic_nonatureanis.mod
[SETTINGS]
world=diccuric.zen
player=PC_HERO
[OPTIONS]
force_parameters=
force_subtitles=0
show_info=0
Как видишь он использует целых 3 тома и все из них расставлены через 2 пробела. Но это не самый удачный пример, так как русик в данном случае уже вшит и через пробел ставиться озвучка и версия без анимации. Обычно это выглядит примерно так: vdf =Sarkeras.mod Sarceras_RUS.mod. Насчёт первых строк думаю разобрался, что это название отображения мода в Готик Стартере и его описание. Обычно описание мода отсутствует или опирается на rtf файл.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Жан-Жак Грущу,
если ou.bin не нужен, его ведь не нужно трогать (?).
В смысле не нужен, это как? Датник и Оушник это параллельные процессы компиляции одного проекта - скриптов Готики.

Можно подробней по *.ini?
Подробнее о чем?
Название ини-файла должно быть идентичным названию мод-файла.
Мод-файл в нем должен быть прописан в строке VDF= (если их несколько, названия разделены 2-мя пробелами).

Какая разница где храниться информация о инициализации?
Не совсем понял о какой инициализации речь, точнее, инициализации чего, скриптов? Она в сейвах хранится.

Если создавать этот файл специально для переведеной версии, то он не будет отличаться от оригинала, ведь информация будет идентична ему.
Будет, двиг читает его по штаму времени создания файла и грузит самый свежий.

то нужно будет просто изменить название *.mod файла в оригинальном *.ini...
Его в любом случае обязательно менять, если делается патч перевода к моду, а не полная русскоязычная версия мода.


Зы, + при тестинге дампы мода сносить нужно из корня игры.
 
Сверху Снизу