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

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

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

MaGoth

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

Вложения

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

MoranGrimoff

Участник форума
Регистрация
12 Фев 2013
Сообщения
40
Благодарности
2
Баллы
155
А что конкретно по своей сути означает Wld_GetDay()?
"В течении этого дня"?

И сколько будет добавляться часов при, например, "Wld_GetDay() +1", или, скажем, "Wld_GetDay() - 2"?

Спасибо
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Насколько я помню, эта функция возвращает порядковый номер текущих суток. Часы тут вообще не при чем.
 

MoranGrimoff

Участник форума
Регистрация
12 Фев 2013
Сообщения
40
Благодарности
2
Баллы
155
В каком плане "возвращает номер"?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
А что конкретно по своей сути означает Wld_GetDay()?

А что "конкретно" непонятно?
Из тутора ВАМа:
int Wld_GetDay (); - получить текущий день, отсчет дней идет от дня старта (Gamestart) = 0.
 

kraw


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

В прямом. При начале игры выдаст 1. После того, как игровое время (время игрового мира) перейдет через 0 часов, выдаст 2. И т. д. Что тут непонятного? Читаем документацию. Там это написано.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
450
Благодарности
268
Баллы
230
Товарищ Dimmel, не придирайтесь к словам kraw. Ведь сами прекрасно знаете, что в дальнейшем расчёт идёт относительно значения переменной, а не относительно конкретного числа. И не важно сколько там будет - 0, 1, 2 или 102.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Профессионалы и те кто думает что им является, завязываем с флудом в теме, касается всех.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
И не важно сколько там будет - 0, 1, 2 или 102.

Как сказать. В первый день, когда функция Wld_GetDay () возвращает 0, тоже могут произойти некие события, которые потребуют проконтролировать значение переменной, изменяемой с помощью данной функции. А все целочисленные переменные при объявлении принимают нулевое значение. Если не учесть особенность функции, то в первый день нельзя однозначно определить факт изменения переменной. ;)
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
450
Благодарности
268
Баллы
230
Как сказать. В первый день, когда функция Wld_GetDay () возвращает 0, тоже могут произойти некие события, которые потребуют проконтролировать значение переменной, изменяемой с помощью данной функции. А все целочисленные переменные при объявлении принимают нулевое значение. Если не учесть особенность функции, то в первый день нельзя однозначно определить факт изменения переменной.


Тогда в условие, кроме проверки на время нужно добавить ещё и проверку на полученную информацию.
А функция Npc_KnowsInfo(c_npc self, int infoInstance) как раз и поможет в этом деле.
В ней infoInstance - это тот блок информации, где задаётся точка начала отсчёта для данного случая, миссии или задания.
Таким образом, если точка отсчёта была задана, то условие будет работать корректно, не смотря на то, что значение переменной равно нулю.

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

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Конечно. Я, например, использую эту функцию только для сравнения. Перешли мы в новые сутки или нет. Гораздо реже, для проверки, сколько прошло дней после некого диалога. Так, что уважаемый диммель может сколько угодно ехидничать в мой адрес.

Любопытно было бы узнать, для чего можно использовать АБСОЛЮТНОЕ значение номера суток.
 

ElderGamer


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

Вот тебе пример. Переменная, скажем WorkDay, изменяется в диалоге с неписем А:
WorkDay = Wld_GetDay ();

А в диалоге с неписем Б проверяется её значение:
If(WorkDay == Wld_GetDay ())

Скриптер полагает, что, если условие в диалоге с неписем Б истинно, то диалог с неписем А состоялся сегодня. Но вот в первый игровой день это предположение может быть ошибочным, условие в диалоге с неписем Б соблюдается, даже если диалог с неписем А вовсе не состоялся. Для правильной работы нужно кое-что изменить:
WorkDay = Wld_GetDay () + 1;
If(WorkDay == (Wld_GetDay () + 1))
;)
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
450
Благодарности
268
Баллы
230
Jr13San, зачем использовать минуты там, где и дня вполне достаточно?
Для точного расчёта времени.
А что, если точка отсчёта начнётся в 23:50 условно-первого дня? НПС скажет, приходи не раньше, чем через день. А условно-второй день наступит через 10 минут.
Если в этом случае использовать функцию Wld_GetDay(), то день для НПС пролетит за 10 минут.
А если перевести всё время в минуты, то условно-второй день наступит как положено - через 24 часа.


Скриптер полагает, что, если условие в диалоге с неписем Б истинно, то диалог с неписем А состоялся сегодня. Но вот в первый игровой день это предположение может быть ошибочным, условие в диалоге с неписем Б соблюдается, даже если диалог с неписем А вовсе не состоялся.

Вот ответ(я уже писал выше тоже самое):

А в диалоге с неписем Б проверяется её значение:
If ((WorkDay == Wld_GetDay ()) && (Npc_KnowsInfo(hero, infoInstanceНПС-А)))
{
//True-условие
};

Для правильной работы нужно кое-что изменить:
WorkDay = Wld_GetDay () + 1;
If(WorkDay == (Wld_GetDay () + 1))
С этим только запутаешься потом.
 
Последнее редактирование:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Любопытно было бы узнать, для чего можно использовать АБСОЛЮТНОЕ значение номера суток.

Например для запуска/остановки квестов/ивентов - Дарон для примера будет нахалявку лечить до 5-го игрового дня (можно и легкого рандомчика добавить чтобы сложнее просчитать было), после 5-го дня начнет давать махХП, после 10 - ЛП. Но не ранее. Или для обновления инвентаря торговцев - не сразу давать все плюшки/фишки, и не по глпвам (как заведено). Для запуска сюжеток - не сразу все диалоги в кучу сваливать при старте игры, и не привязывать к каким-то другим квестам/главам - а запустить как важный диалог напр. после 12 игрового дня. И т.д., вариантов много, и это только разнообразит игру.
Номер игрового дня - точно такой же фильтр как и глава и может использоваться в АБСОЛЮТНЫХ значениях. И желательно понимать что если игровой день 5-й, то функция вернет 4. :)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Jr13San, зачем использовать минуты там, где и дня вполне достаточно? Понятное дело, что, если учесть описанную выше особенность функции Wld_GetDay (), то всё будет работать корректно. Но о ней нужно знать, и её нужно учесть.

Вот тебе пример. Переменная, скажем WorkDay, изменяется в диалоге с неписем А:
WorkDay = Wld_GetDay ();

А в диалоге с неписем Б проверяется её значение:
If(WorkDay == Wld_GetDay ())

Скриптер полагает, что, если условие в диалоге с неписем Б истинно, то диалог с неписем А состоялся сегодня. Но вот в первый игровой день это предположение может быть ошибочным, условие в диалоге с неписем Б соблюдается, даже если диалог с неписем А вовсе не состоялся. Для правильной работы нужно кое-что изменить:
WorkDay = Wld_GetDay () + 1;
If(WorkDay == (Wld_GetDay () + 1))
;)

Я сохраняю для каждого персонажа. Например, для того, чтобы не повторять некоторые диалоги в тот же день.

self.aivar[AIV_PrevImpDialDay]=Wld_GetDay();

И в диалоге сравниваю эти величины.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Например для запуска/остановки квестов/ивентов - Дарон для примера будет нахалявку лечить до 5-го игрового дня (можно и легкого рандомчика добавить чтобы сложнее просчитать было), после 5-го дня начнет давать махХП, после 10 - ЛП. Но не ранее. Или для обновления инвентаря торговцев - не сразу давать все плюшки/фишки, и не по глпвам (как заведено). Для запуска сюжеток - не сразу все диалоги в кучу сваливать при старте игры, и не привязывать к каким-то другим квестам/главам - а запустить как важный диалог напр. после 12 игрового дня. И т.д., вариантов много, и это только разнообразит игру.
Номер игрового дня - точно такой же фильтр как и глава и может использоваться в АБСОЛЮТНЫХ значениях. И желательно понимать что если игровой день 5-й, то функция вернет 4. :)
И как, например, сформулировать это условие в игре (не в скриптах, а в игровой реальности)?

"на пятый день, как ты появился в этом мире, я буду тебя лечить"

Так, что ли?

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

ElderGamer


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

Если бы я занимался созданием мода, то мне было бы интересно ввести дни недели, вычисляемые на основе номера текущего дня и, с помощью циклической функции, динамически изменять распорядки неписей. Например, крестьянин работает в поле, но по выходным идёт в город в кабак, где, напившись, может "сболтнуть что-то лишнее" или затеять драку.

Также интересно было бы организовать события, которые происходили бы вне зависимости от действий игрока. Традиционно события происходят только тогда, когда ГГ выполнил всё, что для этого нужно, но почему что-то не может произойти помимо его участия? Почему Старая Шахта не может обрушиться раньше, чем Безымянный соберёт все юниторы? Почему орки не могут проломить ворота замка в Минентале без участия ГГ? Замешкался Безымянный, занялся чем-то другим, а событие - вот оно, произошло само собой.
;)
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
self.aivar[AIV_PrevImpDialDay]=Wld_GetDay();

Непозволительная роскошь. Количество аиваров ограничено 100, и для них можно найти более полезное применение.

И как, например, сформулировать это условие в игре (не в скриптах, а в игровой реальности)?

Кроме перпендикуляров есть еще и параллели... :D
А как можно "сформулировать" появление диалога в определенной главе?
Никак не формулировть - это событие (условие, до 5-го дня, во 2-й главе), а не диалог. А диалог появится (или не появится) в зависимости от даты (главы, события и т.д.).
Легкий пример применения абсолютных значений без заморачивания с аиварами с сохранением даты диалога и т.п.:
делаю хардкорный мод, но не хочу сделать его харддротным. Получение по квестам оружия/брони/плюшек - так надо и противников делать пропорциональным награде (т.е. сильными), обычный средний игрок их вытянуть сможет через маты и С/Л, но я могу спокойно облегчить жизнь игрокам например добавив на 20-й (+-3дня) день в игре (но только в 1-й главе) более сильную броню/свитки/оружие в продажу (она будет сильнее общедоступной, но не имбой и чуть-чуть слабее доступной в следующей главе), и т.д. И мне не надо привязывать к каким-то абсолютным значениям выполненных квестов и манипулировать разностью в датах. Вы используете линейную прокачку по квестам, я могу использовать прокачку по времени в игре и не зависимо от главы и выполненных квестов.
PS. я надеюсь понятно изложил мысль?
 
Последнее редактирование:
Сверху Снизу