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

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

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

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
546
Баллы
245
Перевод: Локальные переменные в функциях обрабатываются как глобальные переменные и сохраняют свое значение при выходе из функции. Таким образом, они не генерируются временно, а затем удаляется, как в случае с C ++
А как же тогда локальные переменные при выполнении функций распорядков? Один и тот-же распорядок могут выполнять ОДНОВРЕМЕННО десятки неписей, и у каждого непися будет своё значение какой-нибудь переменной random. Впрочем, движок может, и наверняка так и делает, выполнять функции ИИ разных неписей по очереди, поэтому одноимённые переменные не пересекаются.
С другой стороны, коипилятор будет ругаться, если в функции не объявить используемую в ней локальную переменную, даже если такая-же переменная объявлена уже с десяток раз в других функциях. Так что не всё тут так однозначно. :oops:
Например, для текста
Код:
var int testvar;
func void f1() {var int testvar;};
func void f2() {var int testvar;};
в символах дат-файла генерируется три имени переменных:
Код:
testvar
f1.testvar
f2.testvar
Время жизни у них одинаковое, от начала игры до конца. Хранятся тоже одинаково. Имена, как видим разные. Также вспомним, что это виртуальная стековая машина и стек данных и стек вызовов у нее разные, и никаких стековых кадров с последующим уничтожением, как в с++. Мало того, за стеком вообще никто не следит, от чего может болеть икарусом :) Ну и никаких параллельных вызовов - все последовательно, команда за командой, а значит никаких коллизий.
Собственно, как правило, одно и тоже на разных уровнях абстракции выглядит и работает по разному, поэтому лучше оставаться на своем уровне, для удобства. К примеру, инстанция в скриптах это нечто вроде объекта, а на уровне байт-кода это функция-конструктор.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Интересные у вас диалоги получаются.. :)

Гм, а разве при объявлении переменной ей не присваивается нулевое значение?
Именно так, любой переменной локальной или глобальной присваивается автоматически 0 до ее инициализации. "Пустых" переменных в Готе не бывает..

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

Почему разрабы выбрали этот подход, не скажу. Не знаю. В файле сохранения запоминается куча всего, в том числе, состав и координаты ВСЕХ объектов игрового мира. Почему бы не запоминать ещё немного, ума не приложу.
Скорее тупо забыли/недосмотрели.. ::)
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.910
Баллы
370
Как-то не обращал особого внимания на функцию C_WantItem (в г1), за что она отвечает? По сути, если я правильно понял, она должна выводить информацию на экран при нахождении предметов, но этого не происходит, вписывал функцию PrintScreen, все равно не работало...
 
Последнее редактирование:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
Нет, эта функция возвращает TRUE, если NPC может потребовать от ГГ возврата определённого предмета и используется в состоянии ZS_GetBackItem. Обычно таким предметом является именное оружие.
 

ElderGamer


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

Лебедев

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

ГГ: - Привет.

Штефан: - Привет.

ГГ: - Я слышал ты дубину искал? Зачем?

Штефан: - Это моё дело.

ГГ: - Ну, не хочешь не говори, я просто помочь хотел.

Штефан: - Постой, ты правда хочешь помочь?

ГГ: - Собирался, так что стряслось?

Штефан: - Я недавно услышал разговор двух стражников, которые дежурят над воротами, они собираются ночью украсть и зарезать на жаркое одну из моих овец. А за это мне Альфред голову оторвёт.

ГГ: - Значит ночью? Что ж, их будет ждать большой сюрприз.


Начинается квест Чужая овца


Вариант 1: ГГ дожидается ночи и у загона с овцами встречает стражников после полуночи.

Т.к. стражники должны появиться с полуночи до 3 утра, то пришлось задействовать Trigger-Script (ZEN) т.к. их должно активировать время (по своему обычному распорядку дня они в это время спят)

Получаю три случайных события:
1. Оба стражника прибегают к загону
2. Один стражник прибегает, второй остаётся спать
3. Оба стражника спят

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

Trigger-Script (ZEN):
if((SHTEFAN2_day == Wld_GetDay()) && (MIS_GOR3 == LOG_Running) && (SHTEFAN3 == 0))
{
Npc_ExchangeRoutine(a_nov_9120,"GOBL");
Npc_ExchangeRoutine(a_nov_9121,"GOBL");
SHTEFAN3 = 1;
};

Вопрос: снова баг мною найден?
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
И в чем баг?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Эта функция изменяет текущий распорядок непися, но не обязывает того немедленно приступить к его выполнению. Используй функцию AI_ContinueRoutine после изменения распорядка.
 

Лебедев

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

Спасибо. Сейчас начала работать как надо.
Но тут странность, если распорядок дня менять через диалог получаем:
достаточно использовать Npc_ExchangeRoutine
Если через Trigger-Script (ZEN) получаем:
нужно использовать
Npc_ExchangeRoutine
AI_ContinueRoutine

Снова правильная последователь была установлена только сейчас и не описана ни в одном из описаний.
Почему? (Trigger-Script (ZEN) уже довольно давно был описан как реализовывается)

Т.к. если брать аналогии, то:
Через диалоги выдаются права администратора
Через Trigger-Script (ZEN) выдаются права гостя
 
Последнее редактирование:

gggg12345678!

Участник форума
Регистрация
6 Янв 2016
Сообщения
415
Благодарности
383
Баллы
220
Возможно ли сделать рандомное оружие у гоблинов?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.635
Баллы
625
Возможно ли сделать рандомное оружие у гоблинов?

а в чем проблема применить обычный рандом?
Код:
var int nRnd; 
nRnd = Hlp_Random(значение);
if(nRnd == 0)
{
    Npc_SetToFightMode(self,оружие);
};
...
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
mxs - минуты во втором таймере
txs - часы во втором таймере
Msan и Tsan - когда должно событие случиться, указывается в минутах и часах

Может кто-то пояснить в чём баг готики:

if((Npc_KnowsInfo(other,DIA_OW_Old10)) && (mxs >= Msan) && (txs >= Tsan))
{
return TRUE;
}; - Срабатывает если текущий диалог DIA_OW_Old101

if((mxs >= Msan) && (txs >= Tsan) && (Npc_KnowsInfo(other,DIA_OW_Old10)))
{
return TRUE;
}; - не срабатывает если текущий диалог DIA_OW_Old10a

Хотя от перемены в каком порядке будет проверять условия не должно влиять или это не так? + названия диалогов в обоих случаях отличаются от того, какой проверяется (был ли разговор) (снова данный случай Вами не описан)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
мне интересны вот эти моменты


а в условии:
(Npc_KnowsInfo(other,DIA_OW_Old10))
Которое указывает, что непись знает даилог DIA_OW_Old10пусто
Чей-то не сходится...

instance DIA_Onar_WorkAsSld(C_Info)
{
npc = Bau_900_Onar;
nr = 2;
condition = DIA_Onar_WorkAsSld_Condition;
information = DIA_Onar_WorkAsSld_Info;
permanent = FALSE;
description = "Я хочу поработать здесь в качестве наемника!";
};


func int DIA_Onar_WorkAsSld_Condition()
{
if((Lee_SendToOnar == FALSE) && (Onar_WegenSldWerden == FALSE) && Npc_KnowsInfo(other,DIA_Onar_Work))
{
return TRUE;
};
};

func void DIA_Onar_WorkAsSld_Info()
{
AI_Output(other,self,"DIA_Onar_WorkAsSld_15_00"); //Я хочу поработать здесь в качестве наемника!
AI_Output(self,other,"DIA_Onar_WorkAsSld_14_01"); //Ты? Наемника? Не смеши меня! Если бы из тебя мог получиться хороший наемник, Ли наверняка рассказал бы мне о тебе.
AI_Output(self,other,"DIA_Onar_WorkAsSld_14_02"); //А теперь убирайся отсюда, и поживее!
Onar_WegenSldWerden = TRUE;
};

Оригинал. Какое пусто и от чего пусто - можно пояснить...
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625
instance DIA_Onar_WorkAsSld(C_Info)
{
npc = Bau_900_Onar;
nr = 2;
condition = DIA_Onar_WorkAsSld_Condition;
information = DIA_Onar_WorkAsSld_Info;
permanent = FALSE;
description = "Я хочу поработать здесь в качестве наемника!";
};


func int DIA_Onar_WorkAsSld_Condition()
{
if((Lee_SendToOnar == FALSE) && (Onar_WegenSldWerden == FALSE) && Npc_KnowsInfo(other,DIA_Onar_Work))
{
return TRUE;
};
};

func void DIA_Onar_WorkAsSld_Info()
{
AI_Output(other,self,"DIA_Onar_WorkAsSld_15_00"); //Я хочу поработать здесь в качестве наемника!
AI_Output(self,other,"DIA_Onar_WorkAsSld_14_01"); //Ты? Наемника? Не смеши меня! Если бы из тебя мог получиться хороший наемник, Ли наверняка рассказал бы мне о тебе.
AI_Output(self,other,"DIA_Onar_WorkAsSld_14_02"); //А теперь убирайся отсюда, и поживее!
Onar_WegenSldWerden = TRUE;
};

Оригинал. Какое пусто и от чего пусто - можно пояснить...
Здесь все нормально, ни каких проблем не вижу. Все правильно.
По поводу пусто - ты то что написал, я то и выдал. Прочитай внимательно свой пост, который ты написал выше.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Наверное он имел ввиду что эти диалоги:
DIA_OW_Old101 и DIA_OW_Old10а
Должны быть прописаны в скриптах и активированы в игре ?!

Всё было давно прописано и проверено. Ещё в начале написания первых квестов.

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

Npc_KnowsInfo - отдельно работает.
Npc_KnowsInfo и проверка любой переменной работает
Npc_KnowsInfo и проверка двух переменных может и не сработать - что мешает не знаю (движок вне моей зоны зрения)
А если ставить Npc_KnowsInfo в середине или в конце проверки - Npc_KnowsInfo игнорируется.

Что-то в движке напортачили похоже.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Всё было давно прописано и проверено. Ещё в начале написания первых квестов.
Весь код используемых функций диалога покажи(в спойлерах)..

Глюки в виде не срабатывания условия Npc_KnowsInfo если его смешивать с проверкой других переменных. Из-за этого приходится почти всюду ставить свои переменные (что довольно утомительно).
Не помню чтобы ее глючило..

Что-то в движке напортачили похоже.
Маловероятно..
 

Лебедев

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

Выпущу мод и можно будет увидеть - сейчас светить готовыми квестами, чтобы уже заранее всё знали = это спойлерство.

Чтобы унифицировать названия квестов в Минентале у каждого квеста свой номер (Old 1.2.3.4.5....). Но и тут странности начались:

имеем диалог:
instance DIA_9112_Old5(C_Info)
instance DIA_9112_Old5a(C_Info)

Чтобы правильно всё прописалось приходится у Old5 ставить номера с 14, у Old5a с 15:
AI_Output(other,self,"DIA_9112_Old5_14_00"); //Ну как? Все еще много работы?

AI_Output(self,other,"DIA_9112_Old5a_15_00"); //Готово! Эх и здорово же вышло, один в один!

Иначе компилятор смешивает в один диалог (если в обоих DIA_9112_Old5 и DIA_9112_Old5a будут 14_00) - чья ошибка Вам разбираться.
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625
все, понял... тут да, косяк движка....
т.е. диалог DIA_9112_Old5_14_00 будет нормально работать.
а диалог DIA_9112_Old5а_14_00 работать не будет...
Вот хоть убей - не знаю почему...
 
Сверху Снизу