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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Не стесняюсь спросить....

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Вообще-то, движок позволяет использовать в качестве источника информации не только зрение, но и слух. В Г1 можно использовать ещё и обоняние, не знаю, как в Г2. Другое дело, что в скриптовых функциях ИИ эти возможности не используются, или используются по-минимуму.


Ты не прав. В функциях ИИ стоят ограничители в виде контроля видимости и контроля расстояния. Если стражник начинает атаковать монстра, когда тот приблизится к нему на 7м (цифра с потолка), то это не значит, что стражник не воспринимает монстра, находящегося на расстоянии 15м.


Недостаток в том, что ты не удосужился понять идею, увы.


Организуй в циклическом триггере контроль переменной, отвечающей за стадии квеста, и будет тебе счастье.


О, извиняюсь. Мой стаж не так велик. Пожалуй, это мне нужно у тебя поучиться. *bye*

Спасибо за Вашу помощь. Мною от неё не отказывается (в некоторых вещах более оригинальный подход находите). Сейчас квест с потоплением корабля прописываю (снова из гильдии наёмных убийц).

И вот снова, но уже в Хоринисе. На точках NW_CITY_TO_LIGHTHOUSE_09 и NW_CITY_TO_LIGHTHOUSE_11 люди не могут быть заспавнены. Только монстры. И никто об этом не писал (информации крайне мало у Вас)

Если на точку NW_CITY_SMFOREST_04 добавить появление людей, игра зависает при приближении к этой точке (снова никто не описал). (Это всё творится если прописывать появление людей в TA)
 
Последнее редактирование:

Пидерман

Забанен
Регистрация
25 Сен 2015
Сообщения
2
Благодарности
0
Баллы
150
Спасайте, мне нужны декомпилированые скрипты от акеллы для готики 2 ночь ворона, не можете ссыль дать где скачать? :)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Спасайте, мне нужны декомпилированые скрипты от акеллы для готики 2 ночь ворона, не можете ссыль дать где скачать? :)
Странно, а где это они у меня?
https://yadi.sk/d/_2MQtiU8jKWkZ
https://yadi.sk/d/zBNSs4XPjKWnV
https://yadi.sk/d/Xp2OhPaMjKWoJ
https://yadi.sk/d/tu6pT00GjKWot
Как скачаешь - дай знать. ОБЯЗАТЕЛЬНО!
 

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Люди хелп! В общем такая шняга - если использовать компиляцию скриптов из стартера, то игра становится на немецком, но у нового Sourcer-а проблемы с функцией "func int MEMINT_GetBuf_8K_Sub()" из Икаруса(да-да я знаю что теперь есть AST, но мне арифметика с указателями привычнее). А теперь уважаемые знатоки, вот такой вопрос - немецкие скрипты берутся из GothicGame.mod? И если я удалю его, и из GothicGame.ini удалю строчку "VDF=GothicGame.mod", то и игра не будет "переводится"(сам не тестил т.к не хочется 3-ий раз устанавливать из-за этого)?
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
При компиляции игрой все скрипты (включая меню, звуки и т.д.) берутся из папки _work\Data\Scripts, что там лежит - то и показывает. Исключение - OU.bin, в котором содержатся субтитры к диалогам, перекомпилируется только Спейсером. Подробно процесс компиляции скриптов через игру я описывала здесь.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Люди хелп! В общем такая шняга - если использовать компиляцию скриптов из стартера, то игра становится на немецком, но у нового Sourcer-а проблемы с функцией "func int MEMINT_GetBuf_8K_Sub()" из Икаруса(да-да я знаю что теперь есть AST, но мне арифметика с указателями привычнее). А теперь уважаемые знатоки, вот такой вопрос - немецкие скрипты берутся из GothicGame.mod? И если я удалю его, и из GothicGame.ini удалю строчку "VDF=GothicGame.mod", то и игра не будет "переводится"(сам не тестил т.к не хочется 3-ий раз устанавливать из-за этого)?
Эм.. а что в новом ГС функция авто-вставки файлов убита ?! ::)
 

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Сорри! Это я что-то попутал. Забыл что ГМДК не декомпилирует русские скрипты, а создает немецкие. Но вопрос таков теперь - что насчет русского menu.dat?
Эм.. а что в новом ГС функция авто-вставки файлов убита ?! ::)
Не, авто замена работает, но показывает ошибку при линковке в функции "func int MEMINT_GetBuf_8K_Sub()"(выход за пределы массива). Сама функция выглядит примерно так:
Код:
func int MEMINT_GetBuf_8K_Sub() {
var int buf[2048];
return buf;
};
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Не, авто замена работает, но показывает ошибку при линковке в функции "func int MEMINT_GetBuf_8K_Sub()"(выход за пределы массива). Сама функция выглядит примерно так:
Тогда это баг, с этим в тему Сурсера, ибо на стадии линковки ни каких ошибок быть не должно..
По функции ничего не скажу ибо разбираться с троллейбусами желания никакого нет, здесь или твоя ошибка в скриптах или на уровне компиляции..
 

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Тогда это баг, с этим в тему Сурсера, ибо на стадии линковки ни каких ошибок быть не должно..
По функции ничего не скажу ибо разбираться с троллейбусами желания никакого нет, здесь или твоя ошибка в скриптах или на уровне компиляции..
Ну это скорее баг сурсера, т.к эта функция из самого Икаруса.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Последнее редактирование:

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
cool_er, поставь 2047. В GS должно скомпилироваться без ошибок.

PS:

Не держит.

Если на то дело пошло, то такие вещи движком игры компилировать нужно.
Спасибо! Лучше всё-таки буду игрой компилить(слишком много мороки с сурсером для меня).
эм., .те 2048 не держит, и/или куда единица делась ?!
Скорее всего для массивов установлен лимит (2047 в данном случае, что на байт меньше), но при компиляции игрой лимит игнорируется.

Насчет скриптов - вспомнил что галку рядом с пунктом скриптов не надо ставить (вот что бывает когда долго чего-то не делаешь).
 
Последнее редактирование:

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Спасибо! Лучше всё-таки буду игрой компилить(слишком много мороки с сурсером для меня).
Да не за что. А немецкое меню у тебя из за того, что ты решил пересобрать скпирты:) скрипты. И как раз здесь должны лежать исходники скриптов немецкой версии меню:
"Gothic II\_work\Data\Scripts\System\Menu\".
Я думаю тебе нужно найти русские скрипты меню и заменить ими немецкие. Это уже либо путём декомпиляции, либо спроси у кого-нибудь.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Не, авто замена работает, но показывает ошибку при линковке в функции "func int MEMINT_GetBuf_8K_Sub()"(выход за пределы массива). Сама функция выглядит примерно так:
Была та же проблема.
GS 3.15 не умеет работать с этой функцией, просто закомментируй (/* */) её и будет тебе счастье, она все равно нигде не используется.

/*
func int MEMINT_GetBuf_8K_Sub() {
var int buf[2048];
return buf;
};
func int MEMINT_GetBuf_8K() {
MEMINT_GetBuf_8K_Sub();
MEMINT_StackPopInst();
MEMINT_StackPushInst(zPAR_TOK_PUSHINT);
};
*/
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Скорее всего для массивов установлен лимит (2047 в данном случае, что на байт меньше), но при компиляции игрой лимит игнорируется.
Ну хз, лимит - не лимит, но если даже цифра отдана под размерность массива, то это значение/число для компиллера должно быть проходным, т.е. на нем он спотыкаться не должен.. Что-то тут другое наверное, имхо.

Насчет скриптов - вспомнил что галку рядом с пунктом скриптов не надо ставить (вот что бывает когда долго чего-то не делаешь).
Если ты про установку МДК, то конечно-же с галкой будут установлены оригинальные немецкие скрипты из инсталлера МДК, ибо других там и не предусмотрено, как и версия готик.мод-файла для запуска игры из стартера..


она все равно нигде не используется.
а для чего ее вообще вводили если не используется?
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Добрый вечер. Снова с идиотизмом готики сталкиваюсь. Мне нужно?

Начинается звук дрожания земли и на экране появляется текст и в это время NPC читает свиток.

Snd_Play("Ravens_Earthquake4");
B_LogEntry(TOPIC_KILL7,"Морская всколыхнется гладь,");
Print("Морская всколыхнется гладь,");
AI_UseItemToState(self,Fakescroll,1);
AI_Wait(self,waittime);

Новый звук дрожания земли и на экране появляется новый текст и в это время NPC читает свиток.

Snd_Play("Ravens_Earthquake2");
B_LogEntry(TOPIC_KILL7,"грянет гром и ветра вой,");
Print("грянет гром и ветра вой,");
AI_UseItemToState(self,Fakescroll,1);
AI_Wait(self,waittime);

Начинается дрожание камеры и на экране появляется новый текст и в это время NPC читает свиток.

Wld_PlayEffect("FX_EarthQuake",hero,hero,0,0,0,FALSE);
B_LogEntry(TOPIC_KILL7,"был корабль, но на месте его теперь настал покой.");
Print("был корабль, но на месте его теперь настал покой.");
AI_UseItemToState(self,Fakescroll,1);
AI_Wait(self,waittime);

NPC завершает читать свиток.

AI_UseItemToState(self,Fakescroll,-1);
self.aivar[AIV_PARTYMEMBER] = FALSE;
Npc_ExchangeRoutine(self,"Start");
PRIZO25 = 2;
B_LogEntry(TOPIC_KILL7,"Корабль потоплен.");
Print("Корабль утонул.");
AI_Wait(self,waittime);
Npc_RemoveInvItems(self,Fakescroll,1);

Получаю, NPC мгновенно прочитывает свиток и стоит ничего не делает и после возвращается к старому распорядку дня. В готике возможно Георгием задуманное реализовать?
Кроме AI_Wait - иных команд ожидания в Готике не найдено.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Твоя ошибка заключается в том, что ты рассчитываешь, что команды будут выполняться строго в той последовательности, в какой они перечислены в скрипте. Но это не так. Пора бы уже избавиться от такого заблуждения. ;)

Для поэтапного выполнения команд есть два пути. 1-й путь - это использование циклического триггера. 2-й путь - создание особого персонального распорядка, в циклической функции которого будут прописаны все шаги с разбитием на разные этапы.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Твоя ошибка заключается в том, что ты рассчитываешь, что команды будут выполняться строго в той последовательности, в какой они перечислены в скрипте. Но это не так. Пора бы уже избавиться от такого заблуждения. ;)

Для поэтапного выполнения команд есть два пути. 1-й путь - это использование циклического триггера. 2-й путь - создание особого персонального распорядка, в циклической функции которого будут прописаны все шаги с разбитием на разные этапы.

func void ZS_Lesen()
{
Perception_Set_Normal();
B_ResetAll(self);
AI_SetWalkMode(self,NPC_WALK);
self.aivar[AIV_TAPOSITION1] = NOTINPOS;
randy = Hlp_Random(5);
wait = randy + 5;
waittime = IntToFloat(wait);
if(Npc_HasItems(self,Fakescroll) == 0)
{
CreateInvItem (self,Fakescroll);
};
};

func int ZS_Lesen_Loop()
{
if(self.aivar[AIV_ITEMSTATUS1] == 1)
{
Snd_Play("RAVENS_EARTHQUAKE4");
B_LogEntry(TOPIC_KILL7,"Морская всколыхнется гладь,");
Print("Морская всколыхнется гладь,");
if(self.aivar[AIV_TAPOSITION1] == NOTINPOS)
{
AI_UseItemToState(self,Fakescroll,1);
self.aivar[AIV_TAPOSITION1] = ISINPOS;
AI_Wait(self,waittime);
};
self.aivar[AIV_TAPOSITION1] = NOTINPOS;
}
if(self.aivar[AIV_ITEMSTATUS1] == 3)
{
Snd_Play("RAVENS_EARTHQUAKE3");
B_LogEntry(TOPIC_KILL7,"грянет гром и ветра вой,");
Print("грянет гром и ветра вой,");
if(self.aivar[AIV_TAPOSITION1] == NOTINPOS)
{
AI_UseItemToState(self,Fakescroll,1);
self.aivar[AIV_TAPOSITION1] = ISINPOS;
AI_Wait(self,waittime);
};
self.aivar[AIV_TAPOSITION1] = NOTINPOS;
}
if(self.aivar[AIV_ITEMSTATUS1] == 5)
{
Wld_PlayEffect("FX_EarthQuake",hero,hero,0,0,0,FALSE);
B_LogEntry(TOPIC_KILL7,"был корабль, но на месте его теперь настал покой.");
Print("был корабль, но на месте его теперь настал покой.");
if(self.aivar[AIV_TAPOSITION1] == NOTINPOS)
{
AI_UseItemToState(self,Fakescroll,1);
self.aivar[AIV_TAPOSITION1] = ISINPOS;
AI_Wait(self,waittime);
};
self.aivar[AIV_TAPOSITION1] = NOTINPOS;
}
if(self.aivar[AIV_ITEMSTATUS1] == 7)
{
AI_UseItemToState(self,Fakescroll,-1);
B_StopLookAt(self);
self.aivar[AIV_PARTYMEMBER] = FALSE;
Npc_ExchangeRoutine(self,"Start");
PRIZO25 = 2;
B_LogEntry(TOPIC_KILL7,"Корабль потоплен.");
Print("Корабль утонул.");
AI_Wait(self,waittime);
Npc_RemoveInvItems(self,Fakescroll,1);
};
self.aivar[AIV_ITEMSTATUS1] = self.aivar[AIV_ITEMSTATUS1] + 1;
return LOOP_CONTINUE;
};

func void ZS_Lesen_End()
{
};

Клинит на втором этапе, трижды запускается этап и далее движений нет.
Менялось AIV_TAPOSITION1, эффекта не дало.
return LOOP_CONTINUE; - требует компилятор, иначе ошибка значение должно возвращаться
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Во-первых, для вставки в пост кода, обычно, следует использовать тег CODE (в квадратных скобках). Там сохраняется видимость табуляции, что облегчает чтение. Во-вторых, функция AI_UseItemToState заставляет непися взять в руки предмет и выполнить анимацию взаимодействия с ним до определённого состояния. Не имеет смысла несколько раз подряд использовать перевод предмета в одно и то же состояние. Действие будет выполнено только один раз. В-третьих, удалять фейковый свиток дополнительной функцией не нужно, он сам исчезнет по ходу выполнения анимации. В-четвёртых, переменная, отвечающая за смену этапов, должна изменяться, только после завершения предыдущего этапа. То есть, ты должен зафиксировать не только начало этапа, но и его окончание, чтобы перейти к следующему этапу.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Во-первых, для вставки в пост кода, обычно, следует использовать тег CODE (в квадратных скобках). Там сохраняется видимость табуляции, что облегчает чтение. Во-вторых, функция AI_UseItemToState заставляет непися взять в руки предмет и выполнить анимацию взаимодействия с ним до определённого состояния. Не имеет смысла несколько раз подряд использовать перевод предмета в одно и то же состояние. Действие будет выполнено только один раз. В-третьих, удалять фейковый свиток дополнительной функцией не нужно, он сам исчезнет по ходу выполнения анимации. В-четвёртых, переменная, отвечающая за смену этапов, должна изменяться, только после завершения предыдущего этапа. То есть, ты должен зафиксировать не только начало этапа, но и его окончание, чтобы перейти к следующему этапу.

func void ZS_Lesen()
{
Perception_Set_Normal();
B_ResetAll(self);
AI_SetWalkMode(self,NPC_WALK);
randy = Hlp_Random(5);
wait = randy + 5;
waittime = IntToFloat(wait);
if(Npc_HasItems(self,Fakescroll) == 0)
{
CreateInvItem (self,Fakescroll);
};
};

func int ZS_Lesen_Loop()
{
if(self.aivar[AIV_ITEMSTATUS1] == 1)
{
Snd_Play("RAVENS_EARTHQUAKE4");
B_LogEntry(TOPIC_KILL7,"Морская всколыхнется гладь,");
Print("Морская всколыхнется гладь,");
AI_UseItemToState(self,Fakescroll,1);
AI_Wait(self,waittime);
}
if(self.aivar[AIV_ITEMSTATUS1] == 3)
{
Snd_Play("RAVENS_EARTHQUAKE2");
B_LogEntry(TOPIC_KILL7,"грянет гром и ветра вой,");
Print("грянет гром и ветра вой,");
AI_Wait(self,waittime);
}
if(self.aivar[AIV_ITEMSTATUS1] == 5)
{
Wld_PlayEffect("FX_EarthQuake",hero,hero,0,0,0,FALSE);
B_LogEntry(TOPIC_KILL7,"был корабль, но на месте его теперь настал покой.");
Print("был корабль, но на месте его теперь настал покой.");
AI_Wait(self,waittime);
}
if(self.aivar[AIV_ITEMSTATUS1] == 7)
{
AI_UseItemToState(self,Fakescroll,-1);
self.aivar[AIV_PARTYMEMBER] = FALSE;
Npc_ExchangeRoutine(self,"Start");
PRIZO25 = 2;
B_LogEntry(TOPIC_KILL7,"Корабль потоплен.");
Print("Корабль утонул.");
};
self.aivar[AIV_ITEMSTATUS1] = self.aivar[AIV_ITEMSTATUS1] + 1;
return LOOP_CONTINUE;
};

func void ZS_Lesen_End()
{
};

Всё срабатывает, кроме перехода на старый распорядок дня т.к. из-за return LOOP_CONTINUE; не выходит из этой функции. А компилятор 3.14 требует, иначе ошибку пишет (вот за это 3.14 уже сильно "люблю")

Главное не пойму, зачем возвращать значение, когда оно мною не прописано (чтобы требовалось)...
 
Последнее редактирование:
Сверху Снизу