Kolmogor 5 Опубликовано 8 Января 2010 (изменено) Вот этот залипон со счётчиком времени - это совершенно типичный пример. И ведь игра заведомо создавалась, как шутер с элементами РПГ. Т.е. подразумевалось, что игрок будет исследовать локации, возвращаться на них, чтобы доделать квесты и прочее в этом роде. Учитывая дефолтовое соотношение игрового времени к реальному десять (!) 49 дней с легкостью превращаются всего в 5 дней реального игрового времени. Пять дней?! Для РПГ?! Смешно даже. И что мешало разрабам просто взять и посчитать, на сколько хватит этого счётчика? В движке в классе CTime 64х-разрядный счетчик и считает он нормально. Вообще вокруг этой проблемы слишком много шума. В оригинальной игре я ее не встречал. Видел только в АМК моде, но там использовали функцию level.get_time_days(), которая возвращает день месяца. Отсюда и пошла проблема 1 июня. Когда я заменил на использование CTime, то стало работать и после этой даты(заменил только для выброса, в остальных местах не менял). Изменено 13 Января 2010 пользователем malandrinus Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 12 Июля 2010 (изменено) [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 Изменено 12 Июля 2010 пользователем Kolmogor 1 Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 30 Августа 2010 Что хотелось бы узнать: 1) Как это можно использовать в игровых целях? Обычно порядок другой Есть игровая цель и думается: "Как это можно сделать?" 2) Как можно загрузить в эту таблицу модуль который туда еще не был кэширован (есть мнение, что пока к своему (не дефолтному) файлу(точнее к функции из него) не обратишься, он туда не кешируется, и следовательно автономный вызов функции из этого файла function Func() body end Func() приводит к вылету, так как в _G его еще нет. Если у тебя модуль выполняется - значит он уже загружен и вылета не будет. Вообще с подгрузкой не понял - пишешь модуль_который_не_закеширован.функция() и движок сам загружает файл модуль_который_не_закеширован.script. Ну и какой-нибудь дoполнительный теорбазис обо всем этом тоже не помешал бы. Функциональность модулей реализуется luabind, а в нем с помощью метатаблиц. Грубо говоря ставится коллбек на запрос несуществующей переменной в _G и в коллбеке пытаются подгрузить скрипт с таким именем Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 30 Августа 2010 можно, например, написать скрипт, который при старте игры будет перебирать файлы в папке scripts и у нужных вызывать функцию init или же просто прописать вызов функции из start_game_callback Насчет вызова xml тегов не скажу - не знаю. Знаю что было что-то похожее в вызове функций из файлов логики. Но там причина была совершенно в другом - в скрипте обрабатывающем логику было жестко прописано, что функции должны вызываться из xr_effects.script. В АМК это было исправлено и можно было вызывать функции из любого файла. А скорее всего в файле была ошибка и он просто не загружался Хотя, если есть реальный пример, было бы интересно посмотреть Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 31 Августа 2010 (изменено) И еще - можно чуток поподробнее о функции init ? Заметил, что во всех биндерах есть функция init() или bind() и указывается она в конфиг секциях объектов которые биндятся. Какую функцию ты имел ввиду? Это обычная функция, можно и по-другому назвать. К биндерам отношения не имеет. Просто чтобы эту функцию можно было вызвать. prefetch в этом отношении может даже и лучше Непонятно зачем тебе автономность нужна? Можешь привести пример? В сталкере нет никакого механизма автономности - вызовы функций должны быть где-то прописаны. Есть файл script.ltx, в нем прописыван class_registrator.script, из него подгружаются серверные и клиентские классы Из конфигов секций объектов подгружаются скрипты биндеров. Из них подгружаются по мере необходимости остальные скрипты Можешь сделать такой же механизм. Заведи ltx и прописывай туда скрипты, которые надо автономно запускать, ну и скрипт напиши, обрабатывающий этот ltx и вызывающий prefetch для прописанных скриптов. --------- По поводу вызова функций из xml: проверил на ЗП - прописал в прекондишен свою функцию в своем скрипте - все нормально загружается и вызывается, хотя мой скрипт на момент вызова функции закеширован не был Изменено 31 Августа 2010 пользователем Kolmogor Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 14 Ноября 2010 Проблема понимания сего класса в следующем 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 Лучше скажи, что именно и как именно не получалось. Возможно стоит перейти в ковырялку Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 14 Ноября 2010 Потом, не уверен, что стоит пытаться присоединять к одному диалогу другой. Лучше отдельные контролы. Без скриптового окна не получишь события от своих контролов(по крайней мере у меня не получалось - может и сам накосячил). То есть если нужен только вывод информации, можно напрямую контролы аттачить. Если еще и ввод, то без скриптового окна никак Поделиться этим сообщением Ссылка на сообщение
Kolmogor 5 Опубликовано 19 Января 2011 В ЗП, кстати, есть функция, которая просто возвращает вертекс по координатам Если думать о том, как этот алгоритм может быть реализован, то можно прийти в выводу, что функция эта весьма затратная, поскольку вертексов может быть под миллион и больше. vertex_in_direction возможно ищёт от текущего и на этом экономит, а как работает та функция из ЗП - могу только догадываться. Сложность можно оценить по бардаковским исходникам - в сталкере думаю точно такая же функция используется. Например, функция xr_level_ai::vertex_id в xr_level_ai.cxx. Левел-вертекс ищется двоичным поиском - поэтому на миллионе вертексов итераций будет максимум 20 Причем в самих итерациях только сравнение и все. Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали Поделиться этим сообщением Ссылка на сообщение