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

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


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

log & wait

первое не работает, второе кажется имеет особенность класть игру в лог. CoP

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

Из спойлера "Описание класса game_object:" :

  Цитата
...

// функции с memory в имени имеют отношение к "памяти" неписей. Можно получать

// разную информацию о том, что видел, слышал непись и т.п.

...

А можно об этом немножечко поподробнее.

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

self.object:position():distance_to(self.object:memory_position(self.object:best_enemy())) < self.a.radius

как можно наблюдать, тут узнается расстояние.. Сначала объекта, далее, худшего врага.. И сравнивается с радиусом...

self.object:memory_time(self.object:best_enemy())

это уже узнавание времени скорее всего времени нападение худшего врага....

 

Про остальное надо экспериментировать...

 

Примеры взяты из xr_camper.script.

Ссылка на комментарий
  Куфзук писал(а):
А можно об этом немножечко поподробнее.

 

not_yet_visible_objects

memory_visible_objects

memory_sound_objects

memory_hit_objects

 

вроде как эти методы возвращают итераторы для соответствующих объектов. Каких именно, смотри описание game_object. Итератор - это функция, которая при вызове возвращает очередной объект из набора, а под конец возвращает nil. Это позволяет итерировать по набору с циклом for также, как по таблицам (для справки, функция pairs - это тоже итератор).

 

Информация непроверенная, основана на устаревшей документации из билда 1935. Было бы неплохо, если бы кто проверил и привел рабочие примеры.

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

Все именно так и работает.

Вот вам рабочий пример:

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

Небольшое дополнение к ранее описанному здесь классу net_packet. Ранее я писал, что при создании нового объекта этого класса позиции чтения и записи установлены в 0. Оказалось, что в ЗП это не так, и позиция записи и чтения для свежесозданного пакета могут быть попросту случайными числами. При этом в большинстве случаев эти значения всё-таки равны нулю. Полагаю, что в этом и была причина проблем с созданием множества пакетов и вылетом при создании и использовании очередного. Также не подтверждается утверждение о том, что в ЗП нельзя создать много пакетов. Можно, я создал 50 тыс. в одном цикле, и проблем это не вызвало.

 

Резюме:

1. в ЗП нужно перед использованием в обязательном порядке устанавливать как позицию записи, так и позицию чтения вновь созданного пакета. Для позиции чтения есть метод r_seek(<позиция>). Для записи метода нет, надо использовать w_begin(<значение>), который устанавливает позицию записи в ноль, записывает туда двухбайтовое <значение> и смещает позицию на два байта.

2. Исходя из сказанного вовсе нет необходимости создавать пакет заново. В ТЧ это имело смысл по причине простоты (пакет был нормально инициализирован). В ЗП имеет смысл создать один глобальный пакет и везде использовать только его. Всё равно надо будет переустанавливать позиции при каждом использовании. Заодно сэкономим такты и память. Естественно возникнут проблемы с реентерабельностью функций, но это уже другой разговор.

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

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


  Начнём с инфопорций (Показать)


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

Info Portions System (сокращенно принято называть, infoportions, на русском языке кто как пишет...)

 

Система сюжетной информации (ССИ) нужна для обеспечения происхождения и запоминания сюжетных событий в игре.

 

При помощи ССИ можно создавать порции сюжетной информации (info portions).

 

 

Каждая из таких порций имеет/должна иметь уникальный текстовый id и является просто флажком в реестре, который автоматически загружается и сохраняется.

 

К возможностям info_portion относится:

 

запуск функции по отношению к персонажу при получении info_portion (action)

добавления локаций на карту (location)

возможность инициирования диалогов актером (dialog)

возможность инициирования диалогов у актера (при разговоре с персонажем, который имеет info_portion) (actor_dialog)

добавления статей в энциклопедию (article)

добавление заданий и в меню заданий (task)

удаление из реестра уже известных info_portions (disable)

добавление каких-либо данных в секцию "данные"

 

И ещё не совсем уверен, give_info_portion_via_pda(info_id, who) - получить информацию по идентификатору от указанного объекта

 

Поправь, у себя дополни, и удали мой пост. )) Моя копеишный вклад. Вроде где-то видел реализацию отлова отключения инфов, а добавление актеру инфов - легко отлавливается, как впрочем у нпс,

 

Некоторые комментарии (malandrinus):

- Добавление локаций (тег location) и тег actor_dialog по всей видимости были в ранних билдах. В релизе их нет.

- вроде как можно косвенно инициировать простановку метки на карте через выдачу задания.

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

- Что такое "добавление в секцию 'данные' ", не совсем представляю. Возможно тоже что-то из старых билдов.

- Функция give_info_portion_via_pda опять же была в билде 1935. В релизе такой нет. Могу только предположить, что она имела отношение к полносимуляционной игре, когда сталкеры были равноправными игроками наравне с актором. Возможно, с ними можно было как-то общаться через PDA. Но сейчас это уже из области фантазий.

 

Вводные слова добавлю, спасибо.

 

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

  Список (Показать)
Изменено пользователем Unnamed Black Wolf
  • Нравится 1
Ссылка на комментарий

Не думал что ты будешь упоминать рабочие/системны инфопорции, я расписал что знал.

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

На ЗП не надо мучиться с action, достаточно открыть actor_menu и вписать функцию или вызов в нужном действие. У нпс есть аналогичный скрипт, но действие мной не проверялось. (Не замечено работоспособность с моей стороны.)

Изменено пользователем Unnamed Black Wolf
  • Нравится 1
Ссылка на комментарий

Продолжим. На очереди система профилей сталкеров, включая систему генерации имён.


  Профили (Показать)


  Алгоритм генерации имён (Показать)


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

[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
Ссылка на комментарий

биография в ТЧ отображалась, и в ЗП кажется тоже. Это что написано про сталкера. Посмотри примеры на квестовых нпс.

Если не путаю ничего.

Кст, где нашел npc_config?

Чтение такого тега есть в той-же функции, где и чтение остальных тегов (CSpecificCharacter__load_shared). В IDA в отладочном билде это хорошо видно. Но в игре этот тег никак не задействован, возможно и не используется вовсе. Самое странное, что он читается и в ЗП и так же никак не используется. Вот глядя на это просто удивляюсь, убивать полезный функционал у GSC времени хватает, а вот этот явно никак не используемый мусор почистить - это видимо религия не позволяет.

(Malandrinus)

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

Kolmogor,

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

Да, в самом деле. С одной стороны ненужность предварительной регистрации вроде удобна. С другой стороны урезание тегов огорчает. И вообще, только было подумал: "а как же теперь статьи в энциклопедии выдавать?", а потом дошло, что ведь вовсе нет энциклопедии в ЗП. Вырезали с концами.

 

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

Внесу все правки позже, а пока продолжим основной цикл статей. На очереди диалоги в двух трёх частях.

 

  Диалоги. Часть 1. (Показать)

 

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

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

<!-- id - уникальный в пределах диалога номер фразы --> 
<phrase id="6"> 

<!-- текстовое представление фразы --> 

<text>Sorry, but I have to go.</text> 

<!-- или скриптовая функция которая возвращает строку текста --> 

<script_text>info_test1.test_text</script_text> 

<!-- минимальный уровень благосклонности персонажа, чтоб он смог сказать фразу --> 

<goodwill>60</goodwill> 

<!-- cкриптовые предикаты, если они все вернут true то фраза станет доступной --> 

<precondition>info_test1.test_action</precondition> 

<precondition>info_test1.test_action1</precondition> 

<!-- особые предикаты проверяют наличие/отсутствие порций информации у того кто говорит фразу --> 

<has_info>info_name1</has_info> 

<dont_has_info>info_name1</dont_has_info> 

<!-- cписок тех id фраз которые станут доступны собеседнику после того как будет сказана эта фраза --> 

<next>7</next> 

<next>5</next> 

<!-- cкриптовые функции, которые могут быть вызваны --> 

<action>info_test1.test_action</action> 

<action>info_test1.test_action1</action> 

<!-- особые функции, которые дают/убирают порции информации тому кто говорит фразу --> 

<give_info>info_name1</give_info> 

<disable_info>info_name1</disable_info> 

</phrase>

Все вызываемые скриптовые функции (как action так и precondition) задаются своим ПОЛНЫМ именем: NAMESPACE.FUNC_NAME, NAMESPACE - обычно просто имя файла скрипта с функцией.

 

Все скриптовые функции получают на вход 2 параметра: собеседник1 и собеседник2. Эти параметры представляют собой объекты персонажей ведущих диалог (актер, сталкеры, торговцы). Причем первым параметром идет тот, кто говорит фразу. (Я не ловил диалога ид, ты уверен в диалоге ида? )

 

pda="1"/"0" - аттрибут указывающий на то что диалого будет использоваться исключительно при связи по PDA (модеррам билдов. В оффе нету такого.)

priority="-1" - целое число (может быть отрицательным), чем меньше число тем ниже диалог появится при выборе из меню актера

 

Особой фразой является "пустышка" - фраза в которой отсутствует тег <text>. Фразы - пустышки, полезны, если мы хотим пропустить очередь говорить одного из собеседников. Также с помощью пустышек можно делать стартовые "развилки", то есть нужно сделать возможность начинать диалог не с одной, а со списка различных фраз (в таком случае делается 2 пустышки с id 0 и 1).

 

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

 

P.S. Поправь, раскидай, покритикуй (но не сильно бей головой об стену). (Мог что-то повторить)

Изменено пользователем Unnamed Black Wolf
  • Полезно 2
Ссылка на комментарий

 Все правки уже написанного сделаю позже, а пока...

 

  Диалоги. Часть вторая - скриптовые диалоги. (Показать)

 

По диалогам ещё не всё. Остались неохваченными много функций и методов, имеющих отношение к диалогам. Так что будет третья часть.

To be continued...

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

 

Изменено пользователем Kirgudu
  Полезный утиль (Показать)
Ссылка на комментарий
  Цитата
ок, отвлечёмся немного от диалогов =)

Ладно... :) Мне-же этот класс в связи с диалогами и понадобился.

А даты-время, этот класс, обслуживает в пределах с 2000.1.1.0.0.0.0 по 2029.12.31.23.59.59.999

И функция sub() вроде криво работает, ещё раз перепроверюсь - отпишусь про неё.

А ещё - не нашёл способа вычислять даты прибавляя время, например: дата + дни (часы, ...).

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

всё легко

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

local dt = game.CTime()
local year, month, day, hour, minutes, seconds, ms = dt:get()
dt:set(year, month, day+1, hour+3, minutes, second, ms)
dt:add(game.get_game_time():get())

Не очень уверен, первое в голову пришло...

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

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

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

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

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

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

Войти

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

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

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

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