DSE - Движок симулятора свиданий

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

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

Система статистики (stats.rpy)[править | править код]

Система статистики представляет статистику, как переменные, которые хранят её значения. Переменные регистрируются с использованием функции register_stat. Они могут быть обновлены с помощью обычных операций Python, но функцию normalize_stats необходимо вызвать с целью, чтобы игровые показатели сохранились между их максимальными и минимальными значениями. Функция display_stats отображает статистику на экране.

Функция: register_stat (name, var, default, max):

Её следует вызвать из кода init, чтобы объявить игровой показатель.
name - имя игрового показателя, которое используется для названия, когда он отображается.
var - строка, содержащая название переменной, которая содержит игровой показатель.
default - значение по умолчанию, что статистические данные c.
max - Максимальное значение, которое статистика может принимать.

Функция: normalize_stats ():

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

Функция: display_stats (name=True, bar=True, value=True, max=True):

Функция отображает окно, содержащее все игровые показатели в зарегестрированном порядке. Параметры Name, bar, value и max управляют отображением соответствующих частей статистики.

Структура событий (event_dispatcher.rpy)[править | править код]

Ядро DSE - система управления событиями. Эта система отвечает за вызов кода Ren'Py, который выполняет каждое из событий. Диспетчер событий составляет список событий, которые должны быть запущены в определенный период, и затем отвечает за вызов каждого из этих событий, в свою очередь, пока все события не будут исчерпаны или одно из событий указывает на то, что период должен завершиться.

События (Events)[править | править код]


Событие состоит из блока Ren'Py кода. Название события - имя метки, которая вызывается для выполнения этого события. Существует три способа возвращения из такого события. Простое исполнение оператора 'return' завершит событие и активирует любое последующее событие за тот же период. Прыжок к events_end_period завершит текущий период, полностью игнорируя мероприятия, намеченные на будущее. Прыжок к events_skip_period положит конец текущему периоду и приведет к тому, что следующий период будет пропущен.

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

Функция события принимает один аргумент с ключевым словом, который отдает приоритет этому событию. События с меньшим указателем приоритета рассматриваются до событий с большим приоритетным номеров, с заданным по умолчанию приоритетом 100.

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

Нижеперечисленные функции условия обозреваются, как часть DSE.

Функция: event.once ():

Возвращает значение True до тех пора, пока событие не будет исполнено один раз, и затем возвращает значение False. Она может быть использована, чтобы убедиться в том, что пользователь увидит событие единожды.

Функция: event.solo ():

Возвращает значение True, если не запланировано более приоритетное событие. Используйте это на событии с очень низким приоритетном, которое должно происходить только, если нет первоочередных событий.

Функция: event.only ():

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

Функция: event.happened (*events):

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

Функция: event.depends (*events):

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

Функция: event.random (probability):

Вероятность - это скольжение между 0.0 и 1.0. Возвращает значение True с помощью представленной вероятностью, которая каждый раз оценивается (Каждый период).

Функция: event.choose_one (group, count=1):

Определяет группу, из которой можно выбрать только одно событие. DSE случайным образом выбирает один из элементов группы, так что все другие условия имеют значение True. За один раз событие может быть только в одной группе. (Объекты, возвращенные отсюда, не могут иметь операторов, относящихся к ним.) Подсчёт применяется для определения относительной вероятности события в выбранной группе со значением 10, являющимся в 10 раз более вероятным, чем число 1.

Объекты, которые вернулись из функций условия, могут быть объединены с помощью операторов "and", "or", и "not". Например:

init:
    event('bachelor_party', event.depends('engaged_a') or event.depends('engaged_b'))

Вызов из Main (Call from Main)[править | править код]


Есть несколько точек входа, которые используются в Main для вызова диспетчера событий. Прежде всего, это функция check_skip_period, которая должна быть вызвана, чтобы определить, должен ли период вообще работать. Функцию следует вызвать в начале каждого периода и если она возвращает значение True, то период должен быть полностью пропущен.

Ren'Py метку events_run_period следует вызвать для запуска одного периода. Наконец, Ren'Py метка events_end_day должна быть вызвана в конце дня. Завершение дня прекращает пропускать периоды и также изменения событий, которые считаются выполненными event.depends.

Планировщик дня (day_planner.rpy)[править | править код]

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

Определения (Definitions)[править | править код]


Функции dp_period и dp_choice используются для определения периодов и, соответственно, выборов. Эту функцию следует вызвать изнутри блока init, как правило в качестве блока init python.

Функция: dp_period (name, var):

Определяет новый период с заданным именем и переменной. Последующие вызовы dp_choice добавят выборы к этому периоду.

Функция: dp_choice (name, value=..., enable="True", show="True"):

Определяет новый выбор в пределах периода. Name - имя, которое показывается пользователю. Value - значение, которое будет присвоено переменной, если это выбранный вариант. Enable и Show - выражения, которые определяют будет ли выбор задействован или, соответственно, показан. (Если выражение принимает значение False, то выбор недоступен).

Переменная: dp_done_title = "Done Planning"

Переменная управляет названием кнопки "Закончить планирование".

Вызов Планировщика дня (Calling the Day Planner)[править | править код]


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

Если метка dp_callback существует, то она будет вызываться каждый раз, как планировщик дня отображается на экране. Это можно использовать, чтобы добавить статистику на экран, вызвав display_stats().

Примеры (Examples)[править | править код]

Оставшиеся файлы формы распространения DSE в качестве примера игры.

  • main.rpy - основной цикл в DSE игре. Каждый день он вызывает планировщик для для планирования дня, затем вызывает функции событий для оценки события за каждый период.
  • events.rpy содержит игровые события.
  • styles.rpy содержит стили для конкретных DSE элементов.
  • options.rpy содержит параметры, управляющие RenPy.

Концептуальный пример (Conceptual Example)[править | править код]


Это наглядный пример того, как реализовать переменные для периодов класса:

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

$ weekday = "Monday"

Это срока, содержащая день недели. "Weekday" представляет собой контейнер, содержимое которого изменяется.

if weekday == "Monday":
    "Today is %(weekday)s."

В целях этого примера, период времени, начиная с 12 AM, рассматривается, как период 0. Переменная с целым числом содержит фактический период, который отслеживает время.

Таким образом, если это - 5:00 AM, тогда фактический период может быть 10. Если игрок выполняет действие, это продвигает фактический срок издержек за отчётный период действия и уменьшает энергию игроков таким же количеством.

$ actual_period = 10
$ player_energy = 48

Здесь, 5:00 AM, и игрок просыпается с полной энергией.

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

if action == "Sleep In":
    $ rest = True
    $ period_cost = 4

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

if rest == True:
#Выполнить действие и рассчитать его пользу, как показано ниже.
"Я чувствую себя выспавшимся! {w=.5}Но теперь я опаздываю на урок... "
$ intelligence -= 1
$ player_energy += 32
$ miapoints += 1
$ eileenpoints -= 2
elif rest == False: 
    #Это не действие отдыха, так что давайте проверим, если игрок упадет в обморок.
    if energy - period_cost <= 0: 
    #Если скажем, ваша текущая энергия 2 и период стоит 3, 
    #это условие будет иметь значение True
        action = "Passed Out" 
        #И таким образом, ваше следующее настоящее действие - упасть в обморок. Если Вы не хотите 
        #сделать комбинированное действие.
        #Запустите эту функцию снова, за исключением учетных данных падения в обморок,
        #т.е. rest = True, period_cost = 20, восстановление энергии.
    elif energy - period_cost > 0: 
        #Здесь достаточно энергии для выполнения действия.
        energy -= period_cost 
        #Вычесть period_cost из энергии игрока.    
        #Выполнить действие, рассчитать его преимущества
        actual_period += period_cost
        #И это функция, которая проверяет продление срока периода.

Источник[править | править код]

Статья "DSE - Dating Sim Engine" на английском языке


Фреймворки Книга рецептов Ren'Py Вернуться к началу статьи