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

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


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

  Whisper писал(а):
...Как тут поможет разделение и творчество?

Прямо пропорционально.

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

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

Народ, у вас интересное обсуждение, но мне же придётся его потереть как оффтоп. Жалко ведь! Так что идите вы... в ковырялку.

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

Выкладываю небольшой разбор содержимого полей таблицы db.storage, которое относится в NPC.

Делал его некоторое время назад в тестовых целях, до конца так все и не разобрал, но думаю и этого будет достаточно для основных нужд модмейкеров.

ЗЫ: Оформлено все в виде функции, которая содержит таблицу: строковой идентификатор=значения поля и возвращает значения того или иного поля db.storage по его идентификатору в таблице и айди NPC ( вызов примерно такой - GetData(level_object_by_sid(sid), "target_state") ). Там где используется много операторов and - это способ защиты от вылета при обращении к несуществующему полю таблицы. Распечатку таблицы я делал сразу по всем полям, а так как у разных NPC содержание полей было разным, то такие проверки избавляли меня от вылетов.

ЗЗЫ: Данную функцию можно использовать только в тестовых целях, а не для реального применения.

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

Кто-нибудь может нормально объяснить про STATE_Write и STATE_Read, а то как ими нормально пользоваться я не понимаю. К примеру, я через STATE_Write получаю нет-пакет серверного объекта, дописываю туда свои данные, через STATE_Read сохраняю с указанием нового размера пакета. Однако новые данные не сохраняются. Кто-нибудь объяснит почему?

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

Real Wolf

  Цитата
Однако новые данные не сохраняются.

Часом не в онлайне пытался это делать?

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

Real Wolf,

перечитываю твой предыдущий пост и никак не могу понять, что именно ты пытаешься сделать. Какие такие новые данные? Что за новый размер? Такое ощущение, что ты какой-то ересью пытаешься заниматься. Показал бы код что-ли. Только не здесь. Запости вопрос в ковырялке.

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

В связи с моим проигнорированным постом про CScriptXmlInit пришлось этот класс разбирать самому (прошу прощения если кого обидел :)). Некоторые функции неразобраны потому, что для меня сложны в понимании, что они не представляют большого интереса или по каким либо другим причинам :)

  CScriptXmlInit (Показать)
Изменено пользователем Desertir
  • Полезно 1

ТЧ 1.0004. SAP и Trans mod

github

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

Desertir,

а для чего класс то предназначен и что вообще с ним делать? Из поста совершенно не ясно.

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

malandrinus

ИМХО, посты-толковалки типа Desertir приносят больше вреда, чем пользы.

Кроме перечисления и 'типа, чего-то, но не проверял и наверное ...' по сути тавтология.

К примеру:

  Цитата
InitStatic(string, CUIWindow*); --одна из самых распространенных функций, название говорит само за себя
- ну очень "внятно" для тех, кто может даже и может перевести 'static', но ни к чему применить понять это понятие не знает. :-(

 

Не берусь сейчас (или вообще) толковать класс (и со временем напряженка и не осмеливаюсь называться 'толкователем'), но хотя бы банальное на скорую руку может выглядеть хотя бы так:

 

CScriptXmlInit() - класс-конструктор (как всегда доступен в виде глобальной функции). Предназначен для создания окон на базе xml-файлов. Ресультатом функции является объект-заготовка ('userdata').

 

ParseFile(string) --/ метод, распарсивающий (разбирающий) исходный xml-файл (string) в объект класса, что позволяет к полученным элементам объекта применять различные методы.

Элементы результирующего объекта получают названия/имена соответствующие тэгам разобранного xml-файла и все дальнейшие методы применяются к элементам с соответствующими 'тэговыми' именами.

Различные параметры (координаты, расцветка,тексты,шрифты,...), заданные тэгами xml-файла наследуются соответствующими элементами при их инициализации методами класса.

 

InitStatic(string, CUIWindow*) --/ метод, создающий обычную (статичную) область. Параметром является название (стринг) тэга из xml-файла. Применяется, например, для организации различных строк текста/заголовков, отображения текстур/картинок/иконок.

 

InitButton(string, CUIWindow*) --/ метод, создающий область обычной 'кнопки', имещую одно визуальное состояние, т.е. вид кнопки не изменяем.

 

Init3tButton(string, CUIWindow*) --/ метод, создающий область обычной кнопки, имеющую три визуальных состояния (не активна, в фокусе, нажата).

 

InitCheck(string, CUIWindow*) --/ метод, создающий область 'чек-бокс' (кнопка-галочка). Может принимать два фиксированных состояния: отмечена/не отмечена.

 

InitTab(string, CUIWindow*) --/ метод, создающий область (табулятор), которая объединяет несколько вложенных областей. Применяется для создания окна с закладками.

 

InitList(string, CUIWindow*) --/ метод, создающий область (листинг), в котором организуется список из строк, являющихся интерактивными элементами. При большом кол-ве элементов (превышающем размеры выделенной области листинга) используется совместно с методом InitScrollView, отображающем полосу прокрутки (скроллинг).

...

и т.д.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Ну да описание детское, но хоть какое-то, я вот на свой вопрос вообще ответа не получил. Делал описание для себя.

Пожалуйста, malandrinus, редактируй как лучше для понимания обществом ;)

PS: это мое первое описание класса, надо же с чего-нибудь начинать :) любая критика это хорошо, в другой раз (если будет) буду описывать как предложил Artos.

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

ТЧ 1.0004. SAP и Trans mod

github

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

Desertir

  Раскрывающийся текст (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Garry_Galler,

  Цитата
Выкладываю небольшой разбор содержимого полей таблицы db.storage

спасибо за вклад в тему! Очень полезная информация. Описание только движковых классов/функций, хоть и не закончено, но постепенно себя исчерпывает. Между тем остаётся немерянный пласт скриптовых наслоений, которые в сущности являются частью движка, поскольку используются уже поколениями модостроителей практически без изменений. Вот как минимум механизмы логики относятся к этому разряду. Их тоже можно было бы описать здесь.

 

 

Artos,

по мне так лучше, если бы писали здесь статьи хоть как-то, пусть и криво. Почистить и упорядочить в конечном счёте можно, если есть что чистить и упорядочивать. А последнее время вижу только смесь стола заказов и отделения ковырялки.

 

Разумеется, крайне желательно придерживаться примерно такого шаблона изложения (применительно к классам):

1. Общее назначение класса. В объёме одного абзаца или даже предложения объяснить, зачем вообще нужен данный класс. Какой объект он описывает или что можно сделать с его помощью. В случае с CScriptXmlInit это могло бы выглядеть таким образом.

 

Класс CScriptXmlInit предназначен для создания объектов окон (или объектов пользовательского интерфейса) на основе описания, заданного XML. Выгод от использования данного класса может быть несколько:

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

- возможность задать свойства окон, недоступные для изменения скриптом. К примеру, так можно задать перенос текста в текстовых полях.

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

 

2. Формальное описание. Примеров таких описаний я наплодил достаточно много. Я предпочитаю некий псевдо C++. В данном случае может выглядеть так.

 

class CScriptXmlInit {
    CScriptXmlInit (); // конструктор, как и для большинства других классов соответствует глобальной функции CScriptXmlInit 

    void ParseFile(string <имя XML файла>); // прочитать файл с описанием окна
    // инициализировать (не создать) окно базового типа, родительское не задано
    bool InitWindow(string <имя тега с описанием>, int index, CUIWindow* <окно для инициализации>);
    // создать окно типа CUIStatic, статический элемент
    CUIStatic* InitStatic(string <имя тега с описанием>, CUIWindow* <родительское окно>); 
     // создать поле для редактирования текста
    CUIEditBox* InitEditBox(string <имя тега с описанием>, CUIWindow* <родительское окно>)
    // и т.д.
}

 

3. Общие комментарии к описанию.

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

- Только один метод работает не так. Это метод InitWindow, который предназначен для инициализации самого родительского окна. Обращаю внимание, что этот метод не создаёт окно, а только задаёт его параметры (к примеру размеры). Ссылка на уже существующее окно, требующее инициализации, передаётся третьим параметром.

- Все методы принимают аргумент - имя тега, содержащего описание окна. Формат тега, дополнительные теги внутри него и атрибуты тега зависят от создаваемого окна. Их полное описание выходит за рамки данной статьи =(

 

4. Примеры использования. Например так.

    local xml             = CScriptXmlInit()
    xml:ParseFile        ("ui_game_over.xml")
    xml:InitWindow        ("main",0,self) -- здесь self - это ссылка на экземпляр диалога - окна верхнего уровня (не имеющего родителя)
     
    local st             = xml:InitStatic("background", self) -- создать на диалоге статический элемент на основе описания из тега "background"
    self.scroll_view     = xml:InitScrollView("scroll", st) -- создать на диалоге выпадающий список, описанный тегом "scroll"

 

К сожалению для класса CScriptXmlInit этого будет недостаточно, поскольку за каждым методом стоит ещё и описание всех сопутствующих тегов и атрибутов тегов, коих могут быть десятки. В целом же класс самоочевиден. Именно поэтому я его не описывал.

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

malandrinus

Т.к. топик, по моему мнению, все же не подразумевает полемику, да и сам ты пишешь о 'смеси стола заказов и отделения ковырялки', вероятно не стОит затевать обмен мнениями. Но все же пару моментов прокомментирую.

 

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

Наиболее удобной (ИМХО) формой подобного топика было бы его разделение на два: собственно справочник с готовыми и статьями/разделами и топик с черновиками, вопросами, пояснениями-трактовками, полемикой, ...

 

2.

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

'Правильность' - понятие все же относительное, тем более в подобном вопросе (какой метод правильнее применять). Можно назвать немало ситуаций, когда применение скриптового метода будет 'не менее, и даже более правильным'. :-)

Мало кто уделяет дизайну должное внимание но ... если принять во внимание, что метод XML расчитан в основном на разрешение 4:3, и еще позволяется 16:10 дублированием уже имеющегося, то для немало уже появившихся ноутбучных экранов с их 16:9, 15x9 или 5x4 применение XML метода становится похоже на "взять болванку и обработать топором и рашпилем".

 

Исходно, скриптовой метод - вариант низкоуровневого применения и более гибок по отношению к XML методу, хотя и имеет недостатки, обусловленные закрытыми в движке дополнительными возможностями для XML. Правильнее применять оптимальный метод к 'месту и по контексту' в зависимости от конкретных целей и задач.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
  Artos писал(а):
2. Не считаю себя знатоком всех возможностей XML, но все же чего-то знаю. Тем не менее, последнее время стал предпочитать именно вариант 'без XML'.

'Правильность' - понятие все же относительное, тем более в подобном вопросе (какой метод правильнее применять). Можно назвать немало ситуаций, когда применение скриптового метода будет 'не менее, и даже более правильным'. :-)

Отделение данных(читай описание интерфейса) от кода всегда правильно. Код пишет скриптер, интерфейс рисует дизайнер. Вроде бы нет сомнений, что данные надо выносить в лтх, хотя можно спокойно закодить их в скрипте. Также и с интерфейсом.

 

  Цитата
Мало кто уделяет дизайну должное внимание но ... если принять во внимание, что метод XML расчитан в основном на разрешение 4:3, и еще позволяется 16:10 дублированием уже имеющегося, то для немало уже появившихся ноутбучных экранов с их 16:9, 15x9 или 5x4 применение XML метода становится похоже на "взять болванку и обработать топором и рашпилем".

Проблема с разными разрешениями при работе с хмл надуманная. В работе с хмл нет завязки на разрешение 4:3. Что мешает сделать несколько хмл с разными именами и загружать нужный для данного разрешения.

 

А с учетом нижесказанного, так и вообще.

 

  Цитата
Исходно, скриптовой метод - вариант низкоуровневого применения и более гибок по отношению к XML методу, хотя и имеет недостатки, обусловленные закрытыми в движке дополнительными возможностями для XML. Правильнее применять оптимальный метод к 'месту и по контексту' в зависимости от конкретных целей и задач.

Собственно да, хочешь тот же многострочный статик - только хмл

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

abramcumner

Все же стОит снимать шоры и не считать свое мнение самым правильным ....

  Раскрывающийся текст (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos

  Цитата
твоя фраза: "... по мне так лучше, если бы писали здесь статьи хоть как-то, пусть и криво" аукается потом не раз ... т.к. многие принимают "хоть как-то, пусть и криво" как руководство к действию, а не осмыслению.

Правда?! Нет, в самом деле? Так это обнадёживает. Я то был искренне уверен, что всем глубоко по барабану.

 

  Цитата
Наиболее удобной (ИМХО) формой подобного топика было бы его разделение на два: собственно справочник с готовыми и статьями/разделами и топик с черновиками, вопросами, пояснениями-трактовками, полемикой, ...

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

 

По поводу XML. Я написал:

  Цитата
Полностью же скриптовое создание окон используется модостроителями почти всегда только лишь по причине незнания возможностей XML.

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

 

  Цитата
Не проще ли порой, не штамповать кучку XML'ек, а в самом скрипте динамически подстроить именно так, как нарисовал дизайнер?

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

 

  Цитата
Иль ты считаешь, что на 1024x768 (это те же 4:3) задуманное будет тем же, что и на 1600x1200, хотя бы с выбором шрифтов?

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

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

Полтергейст,

этот колбек (callback.zone_enter) работает только для одного класса ce_script_zone. Движковый сет для этого класса имеет имя SCRPTZN, имеется готовая секция с именем "script_zone". Из всех трёх игр этот объект используется только для ТЧ для Арены. Собственно там и можно посмотреть пример использования этого колбека. Это файл xr_zones.script

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

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

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

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

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

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

Войти

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

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

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

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