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

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


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

Garry_Galler,

  Цитата
А действительно никак нельзя переинициализировать диалог вручную - принудительно?

Ведь граф диалога куда то записывается при инициализации диалога

Нельзя.

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

Это хранилище инициализированных диалогов не принадлежит какой-либо конкретной сохранённой игре. Время его жизни - сеанс работы программы.

Относительно графа диалога. Я разумею под ним полный граф, включающий все возможные фразы (игнорируя предусловия). Представьте себе лабиринт с дверями. В какие-то двери войти можно, в какие-то нельзя. Это предусловия. А сам лабиринт - это граф. Граф менять нельзя, а предусловия можно.

 

  Цитата
Кстати, а что полезного дает строковое айди диалога - кроме того, что оно используется при выводе в лог в случае ошибки при построении диалога?

Мы же его указываем в профиле персонажа. Для этого и нужен, чтобы ссылаться на диалог. Или я не понял вопроса?

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus

Окей, насчет инициализации и хранения диалогов понял. (примерно так и думал, что есть какой то движковый storage\ массив для них).

Кстати вот и ответ на мой вопрос про айди диалогов - я имел ввиду, когда мы его получаем как входящий аргумент например из прекондишена или экшена - то какая польза от этого параметра? видимо никакой, но

  Цитата
диалоги ...помещаются в это хранилище, откуда при дальнейших запросах выбираются по ключу (идентификатору диалога)
. То бишь назначение айди диалогов - для внутреннего использования функциями игры. Для модмейкера получается ничего не дает. Изменено пользователем Garry_Galler
Ссылка на комментарий

Garry_Galler,

Всё же самое главное использование идентификаторов для модостроителя - это указание с их помощью диалогов в профилях персонажей.

В указанных функциях их можно использовать тогда, когда одна функция используется для нескольких диалогов. Типа оптимизация. Есть некая функция в одном диалоге и в другом. Очень похожи, но отличаются на пару строк. Объединяем в одну, а разницу реализуем в зависимости от имени диалога. Как-то так.

 

Вообще, чтобы понять задумку разрабов в полной мере надо смотреть их примеры. Обычно сразу становится ясно, за каким им потребовалась та или иная странная фишка. Вот к пример скриптовые диалоги они сами использовали для того, чтобы создавать диалог на базе информации из файла ltx.

Но проблема бывает в том, что фишка могла быть сделана для какого-то билда, который давно ушёл в историю, и примеров использования не сыскать, и не актуально это давным-давно. А мы тут сидим, умные разговоры ведём =)

  Полезный утиль (Показать)
Ссылка на комментарий

Вот это дело!

 

Теперь осталось только ui_events. :)

Кстати, а какая константа обозначает коллбек флажка (checkbutton'а) на снятие/установку. Пробовал CHECK_BUTTON_SET, CHECK_BUTTON_RESET, PROPERTIES_CLICKED - не работают. :( И как сохранить значение флажка?)

Ссылка на комментарий

IQDDD,

насчёт колбеков сейчас точно не могу сказать. Либо что-то не то делаешь, либо они не работают. Можешь ещё попробовать для чекбокса "кнопочные" события типа BUTTON_CLICKED. Насчёт сохранения, пошарь методы для CUICheckButton двумя постами выше =)

  Полезный утиль (Показать)
Ссылка на комментарий

Да я понимаю, что есть check:GetCheck(). но разрабы сохраняют в оригинальных скриптах через некий класс COptionsManager() (см. ui_mm_opt_main)

BUTTON_CLICKED работает. :)

Изменено пользователем IQDDD
Ссылка на комментарий

IQDDD,

  Цитата
разрабы сохраняют в оригинальных скриптах через некий класс COptionsManager()

Этот класс по-моему не имеет прямого отношения к состоянию отдельно взятого контрола. Что-то для работы с настройками.

 

P.S.: Я может вопроса не понял. Сохранить - что означает? Сохранить до следующей игры?

Изменено пользователем malandrinus
  Полезный утиль (Показать)
Ссылка на комментарий

да всё, вопрос исчерпан. Я просто хотел найти способ сохранять настройки мода иным способом, отличным от записи в pstor. в принципе, легче записать в него, чем копать потенциальный класс.

Ссылка на комментарий

В связи с внезапным окончанием бета версии Visio красивая картинка с иерархией оконных классов откладывается =)

 

Так что сейчас разберём общие вопросы, т.е.

  приёмы создания окон (Показать)

 

В неохваченном осталась тема о создании окон на основе XML описания. Для этого есть класс CScriptXmlInit. Он сам по себе несложен, но к нему надо ещё и описывать форматы XML файлов для разных окон, а к этому я сейчас морально не готов =)

Также есть ещё достаточно сложная тема о модификации стандартных окон: торговли, PDA и прочего. Здесь на помощь может прийти функция level.main_input_receiver(), которая возвращает текущее активное окно. Приемы работы в этом случае достаточно нетривиальны. Кроме того, в ЗП этой функции нет. Может как-нибудь и дойдут руки...

 

Изменено пользователем Kirgudu
  • Спасибо 1
  Полезный утиль (Показать)
Ссылка на комментарий

В ТЧ и ЧН были глобальные функции GetTextureInfo, GetTextureName и GetTextureRect. Это значит по имени текстуры получить ее файл (вроде как это еще полотном называют) и координаты прямоугольника. Напоминаю, что в таком понимании текстура это то, что обычно указывается в XML описаниях разных окошек. Там как правило прописывается имя, которое ссылается на отдельное описание (в другом XML файле), где уже и задается имя файла и координаты прямоугольника. Эти функции как раз и позволяют получить эту информацию. Особой пользы от этих функций не было, поскольку не было ни одной функции, которая возвращала бы имя текстуры.

И вот в ЧН такая функция появилась! Для онлайновых объектов сталкеров стало возможно получить иконку персонажа с помощью функции character_icon. Это очень нужная функция, поскольку дает информацию о реальном профиле сталкера. Так и что вы думаете! В ЗП разрабы взяли и убрали функции получения информации о текстурах. И какой теперь толк от той функции получения иконки? XML прочитать нельзя, а иначе логическое имя ни о чем не говорит. Нет слов, одни междометья.

  Полезный утиль (Показать)
Ссылка на комментарий

DimOriN,

reader похож на net_packet только без функций записи. net_packet я расписывал здесь. Но на самом-то деле класс ведь примитивный. По именам методов и так ясно, что они делают.

 

А что за задача стоит?

  Полезный утиль (Показать)
Ссылка на комментарий

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

 

local game_difficulty = reader:r_u8()

затем следом

local stored_input_time = reader:r_u8()

 

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

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

Untitled-1.png

Ссылка на комментарий

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

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

Ссылка на комментарий
  DimOriN писал(а):
Проблема понимания сего класса в следующем

 

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 мин.:

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

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

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

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

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

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

 

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

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

Ссылка на комментарий

DimOriN,

  Цитата
local game_difficulty = reader:r_u8()

local stored_input_time = reader:r_u8()

как так 2 разных переменных с разными значениями равны reader:r_u8()

у reader есть некий указатель внутри, который смещается при каждом чтении. Всякий раз читает новое значение и смещается. При следующем чтении читается уже другое значение. Всё-таки почитай про net_packet. Там очень похоже.

 

Real Wolf,

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

Хлопотное это дело. Потом, не уверен, что стоит пытаться присоединять к одному диалогу другой. Лучше отдельные контролы. Безвылетную технологию для этого я описывал здесь.

  Полезный утиль (Показать)
Ссылка на комментарий
  malandrinus писал(а):
Потом, не уверен, что стоит пытаться присоединять к одному диалогу другой. Лучше отдельные контролы.

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

Ссылка на комментарий
  Kolmogor писал(а):
Лучше скажи, что именно и как именно не получалось.

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

 

Нужно к инвентарю приаттачить кнопку, при нажатии, которой происходит действие, соответственно. Вот только у класса кнопки нет действия на нажатие(по крайней мере я не нашёл), поэтому начал делать через класс CuiScriptWnd, вот только он остаётся активным, а инвентарь нет, или инвентарь работает и кнопка, но нет иконок в инвентаре и слотах, иконка ГГ в костюме работает. Описания тоже.

Ссылка на комментарий

Kolmogor,

я понимаю. Скриптовое окно в этом случае надо завести "рядом" и присоединять кнопки на движковй диалог, а колбеки перенаправить в это отдельное окно. Потом не забыть отсоединить кнопки от движкового окна и просединить к скриптовому для корректного удаления. Проблемы начнуться если "забыть" кнопку на движковом окне, поскольку она там останется вплоть до выхода из программы.

 

Real Wolf,

таки прочитай тот старый пост, что я привёл. Там именно твоя проблема и решалась.

Изменено пользователем malandrinus
  Полезный утиль (Показать)
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

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