Перейти к контенту

Справочник по функциям и классам


Рекомендуемые сообщения

Вот этот залипон со счётчиком времени - это совершенно типичный пример. И ведь игра заведомо создавалась, как шутер с элементами РПГ. Т.е. подразумевалось, что игрок будет исследовать локации, возвращаться на них, чтобы доделать квесты и прочее в этом роде. Учитывая дефолтовое соотношение игрового времени к реальному десять (!) 49 дней с легкостью превращаются всего в 5 дней реального игрового времени. Пять дней?! Для РПГ?! Смешно даже. И что мешало разрабам просто взять и посчитать, на сколько хватит этого счётчика?

В движке в классе CTime 64х-разрядный счетчик и считает он нормально. Вообще вокруг этой проблемы слишком много шума. В оригинальной игре я ее не встречал. Видел только в АМК моде, но там использовали функцию level.get_time_days(), которая возвращает день месяца. Отсюда и пошла проблема 1 июня. Когда я заменил на использование CTime, то стало работать и после этой даты(заменил только для выброса, в остальных местах не менял).

 

Изменено пользователем malandrinus

Поделиться этим сообщением


Ссылка на сообщение

[stalker_terrain]
    255,000,255,255
    008,001,255,255;Разрешено ходить по опасным местам на баре
    012,001,255,255;Разрешено ходить по опасным местам на Милитари

У каждого геймвертекса в гейм.графе есть поле type(по GraphViewer), а в stalker_terrain записано что-то вроде маски.

На баре у геймвертексов type бывает 08, 00, 00, 00 и 08, 01, 00, 00

 

Собственно расшифровка чисел в файле game_graphs.ltx

location_0 - первое число, location_1 - второе и так далее

 

В ЧН/ЗП добавили в типы гейм-вертексов еще и привязку к смарттерейнам - как я понимаю, чтобы через вражеские лагеря не ходили.

Также добавились функции: add_location_type, clear_location_types

При переходе из смарта в смартc помощью этих функций НПЦ добавляются новые stalker_terrain

 

 

Кстати, по поводу инфопорций в ЗП: в хмл прописывать их необязательно - можно выдавать абсолютно любую инфопорцию. И теги(типа action, disable) не работают

 

Дополню про money и infinitive, на форуме периодически проскакивают вопросы про это :)

<money min="100" max="500" infinitive="1"/>

Если поставить infinitive = "1", то денег у него все равно будет столько, сколько прописано в max. Просто при начале каждой торговли количество денег будет устанавливаться в max

Изменено пользователем Kolmogor
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
Что хотелось бы узнать:

1) Как это можно использовать в игровых целях?

Обычно порядок другой :) Есть игровая цель и думается: "Как это можно сделать?"

 

2) Как можно загрузить в эту таблицу модуль который туда еще не был кэширован (есть мнение, что пока к своему (не дефолтному) файлу(точнее к функции из него) не обратишься, он туда не кешируется, и следовательно автономный вызов функции из этого файла

function Func() body end

Func()

приводит к вылету, так как в _G его еще нет.

Если у тебя модуль выполняется - значит он уже загружен и вылета не будет.

Вообще с подгрузкой не понял - пишешь модуль_который_не_закеширован.функция() и движок сам загружает файл модуль_который_не_закеширован.script.

 

Ну и какой-нибудь дoполнительный теорбазис обо всем этом тоже не помешал бы.

Функциональность модулей реализуется luabind, а в нем с помощью метатаблиц. Грубо говоря ставится коллбек на запрос несуществующей переменной в _G и в коллбеке пытаются подгрузить скрипт с таким именем

Поделиться этим сообщением


Ссылка на сообщение

можно, например, написать скрипт, который при старте игры будет перебирать файлы в папке scripts и у нужных вызывать функцию init

или же просто прописать вызов функции из start_game_callback

 

Насчет вызова xml тегов не скажу - не знаю. Знаю что было что-то похожее в вызове функций из файлов логики. Но там причина была совершенно в другом - в скрипте обрабатывающем логику было жестко прописано, что функции должны вызываться из xr_effects.script. В АМК это было исправлено и можно было вызывать функции из любого файла.

А скорее всего в файле была ошибка и он просто не загружался :unsure: Хотя, если есть реальный пример, было бы интересно посмотреть

Поделиться этим сообщением


Ссылка на сообщение
И еще - можно чуток поподробнее о функции init :rolleyes: ?

Заметил, что во всех биндерах есть функция init() или bind() и указывается она в конфиг секциях объектов которые биндятся.

Какую функцию ты имел ввиду?

Это обычная функция, можно и по-другому назвать. К биндерам отношения не имеет. Просто чтобы эту функцию можно было вызвать. prefetch в этом отношении может даже и лучше

 

Непонятно зачем тебе автономность нужна? Можешь привести пример?

В сталкере нет никакого механизма автономности - вызовы функций должны быть где-то прописаны.

Есть файл script.ltx, в нем прописыван class_registrator.script, из него подгружаются серверные и клиентские классы

Из конфигов секций объектов подгружаются скрипты биндеров.

Из них подгружаются по мере необходимости остальные скрипты

 

Можешь сделать такой же механизм. Заведи ltx и прописывай туда скрипты, которые надо автономно запускать, ну и скрипт напиши, обрабатывающий этот ltx и вызывающий prefetch для прописанных скриптов.

 

---------

По поводу вызова функций из xml: проверил на ЗП - прописал в прекондишен свою функцию в своем скрипте - все нормально загружается и вызывается, хотя мой скрипт на момент вызова функции закеширован не был

Изменено пользователем Kolmogor

Поделиться этим сообщением


Ссылка на сообщение
Проблема понимания сего класса в следующем

 

local game_difficulty = reader:r_u8()

затем следом

local stored_input_time = reader:r_u8()

 

вот не укладывается у меня в голове - как так 2 разных переменных с разными значениями равны reader:r_u8()

нет-пакеты же ты понимаешь? или нет? :)

Функция r_u8() читает один байт и передвигает текущую позицию на один байт вперед.Повторный вызов r_u8() прочитает следующий байт. Все точно также как с обычными файлами

 

надо для "пробы" вскрытия файлов *.sav

Там все просто - пожаты обычным сталкеровским методом - разжимаешь - там чанки с разным содержимым:

ид чанка:

0x0 - хранится версия alife

0x1 - идет ссылка на all.spаwn, может еще что

0x2 - нет-пакеты спавн-объектов

0x5 - 8! байт время, текущий тайм-фактор, нормал таймфактор

0x9 - инфопоршни, отношение между ГГ и группировками, статьи в пда, лог в пда, метки на карте, задания, статистика

 

Добавлено через 4 мин.:

Возник вопрос: Как правильно присоединить окно класса CuiScriptWnd к инвентарю через функцию level.main_input_receiver()?

А то как ни пробывал, ничего вразумительного не получалось.

Алгоритм простой:

- ждешь пока откроется инвентарь, ловишь ui_inventory в info_callback

- получаешь его окно через level.main_input_receiver()

- аттачишь свое окно AttachChild

 

Лучше скажи, что именно и как именно не получалось.

Возможно стоит перейти в ковырялку

Поделиться этим сообщением


Ссылка на сообщение
Потом, не уверен, что стоит пытаться присоединять к одному диалогу другой. Лучше отдельные контролы.

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

Поделиться этим сообщением


Ссылка на сообщение
В ЗП, кстати, есть функция, которая просто возвращает вертекс по координатам

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

Сложность можно оценить по бардаковским исходникам - в сталкере думаю точно такая же функция используется.

Например, функция xr_level_ai::vertex_id в xr_level_ai.cxx. Левел-вертекс ищется двоичным поиском - поэтому на миллионе вертексов итераций будет максимум 20 :) Причем в самих итерациях только сравнение и все.

Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали :)

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...