Кирилл — «Написание полного ТЗ»

Вводная информация

Привет! 👋

Теперь у тебя важная задача — написать ТЗ на комплексную фичу. Это твой шанс закрепить полученные знания и применить их на практике.


Ты сам выбираешь, какую фичу описывать:

— это может быть что-то для твоей игры

— или для известной игры, но важно, чтобы такой фичи там ещё не было


Главное — выбирай что-то масштабное и интересное. Фича должна быть жирной: со схемами, формулами, переменными, контентом и так далее…


Для вдохновения можешь представить, например:

  1. Уникальный боевой режим в игре про выживание.
  2. Мета-механику с кастомизацией персонажей в рогалике.
  3. Систему социальных взаимодействий с NPC, которая меняет их отношение к игроку.


Но пока сосредоточься на том, что ты уже умеешь:

1. Выбери фичу

2. Напиши Цели и Общее описание фичи.


Это основа, с которой мы будем работать дальше. Задачи и материалы лекций будут добавляться ниже, по мере продвижения по интенсиву. ↓↓↓


Дальше в лекциях мы разберём:

→ как создавать схемы и user flow для контекстных разделов (материалы лекции №5)

→ как делать мокапы и UI-декомпозицию,

→ как запрашивать аналитику, вычитывать документ и обеспечивать связность с ГДД.


Удачи! 💪 Помни, что каждый шаг приближает тебя к профессиональному уровню. 🚀

Задачи по ТЗ:
Выбрать фичу
Написать Целеполагание
Заполнить «Общее описание»
Расписать контекстные разделы по ТЗ
Добавить не менее 1 Схемы и 1 User Flow по Фиче
Подготовить и добавить мокап и UI Декомпозицию в ТЗ
Добавить контекст запроса аналитики в ТЗ
Добавить контекст плана балансировки в ТЗ
Отдать другому участнику интенсива документ на вычитку
Обновления

27.01.25

Добавлен раздел Аналитики и Баланса

Исправлены замечания после разбора

24.01.25

Изменено название фичи: Шкала насыщения Насыщение

Изменена и дополнена структура UI раздела

20.01.25

Изменено название фичи: Шкала сытости → Шкала насыщения

Изменены названия переменных

Насыщение уменьшается от событий Линка

Добавлен геймплейный цикл

Насыщение (The Legend of Zelda: Breath of the Wild)
satiety

Цель

Усложнить бои, чтобы привлечь хардкорщиков. Добавить стратегичности в процесс потребления пищи. Повысить ценность зелий относительно еды. Побудить чаще использовать пищу. Повысить ценность отдыха в гостиницах.

Краткое описание

Когда Линк потребляет пищу, заполняется шкала насыщения. Если шкала заполнена, больше есть нельзя блюда. Шкала опускается от времени, от событий или после отдыха.

Геймплей

Игрок после приёма пищи ждёт, пока у него упадёт насыщение.

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

Новые параметры

  • [maxSatiety] — максимально возможное значение сытости (int)
  • [currentSatiety] — текущее значение сытости (float)

У каждого предмета с тэгом Пища есть параметр [satietyIncrease](int), который определяет, на сколько пополняется насыщение при потреблении этой пищи.

Приём пищи

Когда игрок потребляет пищу, [currentSatiety] увеличивается на [satietyIncrease].

Уменьшение насыщения

Насыщение уменьшается со временем и пока с Линком происходят разные события

Постепенное уменьшение насыщения

Во время активной игры каждые [satietyDecreasePeriod] секунд [currentSatiety] будет уменьшаться по формуле

currentSatiety ← currentSatiety - (satietyDecreaseSpeed * EventsSatietyDecreaseCoeff * satietyDecreasePeriod)
[satietyDecreaseSpeed] — скорость уменьшения насыщения
[eventsSatietyDecreaseCoeff] — коэффициент уменьшения
[satietyDecreasePeriod] — период срабатывания уменьшения

Длительные события

Эти события определяют коэффициент уменьшения

Пример:
Пока Линк бежит, насыщение уменьшается в 2 раза быстрее
Пока Линк мёрзнет, насыщение уменьшается в 1.5 раза быстрее
Пока Линк мёрзнет и бежит, насыщение уменьшается в 2 раза быстрее

Когда с Линком происходит длительное событие (thisEvent) из словаря [longEventsSatietyDecrease]

1. В словарь [currentEventsSatietyDecrease] добавляется [longEventsSatietyDecrease(thisEvent)]

2. Словарь [currentEventsSatietyDecrease] сортируется по убыванию значений

3. [eventsSatietyDecreaseCoeff] ← [currentEventsSatietyDecrease(0)]

Когда с Линком перестаёт происходить длительное событие (thisEvent) из словаря [longEventsSatietyDecrease]

1. Из словаря [currentEventsSatietyDecrease] удаляется запись с ключом (thisEvent)

2. Если словарь [currentEventsSatietyDecrease] пуст, [eventsSatietyDecreaseCoeff] ← 1

3. Иначе [eventsSatietyDecreaseCoeff] ← [currentEventsSatietyDecrease(0)]

Короткие события

Когда с Линком происходит короткое событие из словаря [shortEventsSatietyDecrease], [currentSatiety] будет уменьшаться на значение, которое разработчики задали для этого события.

Пример: когда Линк атакует, он теряет 0.05 [currentSatiety], а когда прыгает — 0.01

Отдых

Когда игрок перематывает время с помощью вариантов отдыха, [currentSatiety] → 0.

Общие ограничения

[currentSatiety] не может опуститься ниже 0

Сохранение

Когда происходит любое сохранение, игра сохраняет [currentSatiety].

Определение калорийности после готовки

Обновляет систему готовки, она будет определять [satietyIncrease] у приготовленного блюда или зелья.

Вычисление насыщения
Для каждого типа блюда задаётся [mealSatietyIncrease](int) — прибавка к насыщению от типа блюда.
Когда Линк готовит блюдо, для блюда задаётся [satietyIncrease] ← [maxSatietyIncrease]+[mealSatietyIncrease]
[maxSatietyIncrease] — максимальное [satietyIncrease] среди ингредиентов
[satietyIncrease] не может стать ниже 1

Разогрев/заморозка еды
Когда предмет с тэгом Пища меняет своё состояние под действием окружающей среды, это считается готовкой с одним ингридиентом. Новое состояние предмета является типом блюда со своим насыщением.
Удачное приготовление
Когда блюдо получилось счастливым, есть шанс, что его насыщение станет меньше чем обычно.
В список возможных удачных эффектов [luckyBuffs] от счастливого блюда добавляется [cookLuckySatiety].
Если на счастливое блюдо накладывается эффект [cookLuckySatiety], [satietyIncrease] уменьшается на [cookSatietyDecrease], но не ниже 1.
Если насыщение от блюда изначально =1, эффект выбирается заново.


UI интерфейс

Иконки насыщения

У насыщения отображается 2 параметра:

1. [currentAnimationSatiety] — заполненные иконки насыщения, показывает текущее насыщение. Отдельный параметр требуется для анимации.

2. [maxSatiety] — пустые иконки насыщения с контуром

Единица насыщения = ⅓ иконкой насыщения, обрезанная в виде сектора.

Насыщение заполняется слева на право. Сектор иконки заполняется против часовой стрелки.

Шкала насыщения

Шкала насыщения отображается в инвентаре над панелью с описанием предмета в 2 строки. Если максимального насыщения только на одну строчку, то оно отображается на нижней строчке.

Когда открывается инвентарь [currentAnimationSatiety] ← [currentSatiety]

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

Панель пищи

Насыщение отображается на каждой панели с пищей в игре

Насыщение у пищи отображается после здоровья и эффекта от пищи. Иконки пищи располагаются в таком же прямоугольнике, как сердца и эффекты.

Группировка иконок

Если иконок становится слишком много, они группируются аналогично тому, как группируются иконки сердец на панели блюд

Если иконок становится больше 6
1. Берётся максимальное число кратное 5, которое меньше количества иконок
2. Столько иконок группируются в одну
3. У первой иконки появляется цифра, которая показывает сколько иконок она сгруппировала

Пример отображения насыщения с помощью иконок

Предпросмотр пищи

Когда в инвентаре выделен предмет с тэгом Пища

1. К заполненным иконкам добавляются сектора = [satietyIncrease]

2. У новых секторов анимация плавного изменения прозрачности туда-сюда.

Анимация предпросмотра аналогична анимации предпросмотра сердец и выносливости.

Переполнение насыщения

Если выбранная пища приведёт к перезаполнению насыщения →

1. Добавляются только сектора до полного заполнения

2. Шкала насыщения изменит цвет (на усмотрение художника)

3. У шкалы запустится анимация усиления, ослабления подсвечивания

4. Кнопка "Eat" в окне контекстных действий станет неактивной

5.

Изменение шкалы

Шкала изменяется не сразу, а плавно, аналогично заполнению здоровья

Заполнение меняется постепено от старого значения к новому. Паттерн изменения задаётся графиком, где по оси Х — время, по Y — линейная интерполяция от старого значения к новому.

График паттерна такой же как у заполнения здоровья

Таким образом сначала плавно заполняется один сектор против часовой стрелки, затем другой и так далее пока заполнение не завершится.

Если инвентарь закроется до завершения заполнения, заполнение завершается мгновенно.

Обнуление шкалы после отдыха

Если до отдыха [currentSatiety]>1, то когда Линк проснётся, запустится анимация уменьшения насыщения. Она работает аналогично увеличению насыщения.

В момент проигрывания анимации шкала насыщения отображается в HUD в левом нижнем углу. Это единственный момент, когда шкала отображается.

Появление шкалы и её анимация происходит аналогично шкале сердец после отдыха. Когда управление вернётся к игроку, шкала насыщения пропадёт.

Аудио-визуальное подкрепление фичи

В данном разделе описываются звуки, анимации и эффекты, которые будут проигрываться в результате работы фичи

Idle анимация

Добавить в список Idle анимаций [a_ LinkSatietyEmpty]. Эта анимация может проиграться только если [currentSatiety]<[hungryAnimation](int). С этой анимацией проигрывается звук [s_ LinkBellyRumbling].

Сигнал об уменьшение насыщения

Когда [currentSatiety] переходит значение кратное [satietySignalRumbling], у Линка проигрывается звук [s_ LinkBellyRumbling]. Это должно сообщать игроку, что у него освободилось место для еды.

Пример моментов проигрывания звуков

Журчание желудка

Пока [currentSatiety]=0, периодически будет производиться звук [s_ LinkBellyRumbling]. Период определяется каждый раз случайно от

[RumblingDelayMinimum] до [RumblingDelayMaximum].

Анимация сытости

Когда игрок выбирает в инвентаре пищу, которая приводит к перезаполнению насыщения, у Линка запустится анимация [a_LinkSatietyFull]. Эта анимация прерывает другие анимации, но не саму себя.

Нарратив

Насыщение уберёт игровую условность, когда Линк мог съесть сколько угодно блюд за одно мгновение.

Доработка лора

Необходимо вычитать все тексты и проверить все записи о том, где говорилось про аппетит Линка. В текстах аппетит Линка должен быть описан в соответствии с его геймплейными возможностями.

Линк может питаться за троих, но его желудок не бездонный

Добавить в записки в игре ситуацию, когда Линк объелся и больше ничего не мог есть пока не потренировался. После чего он снова съел за троих.

Новый диалоги

Добавить для НПС дополнительное условия для реплик

Когда [currentSatiety]<[hungryTalks](int)

Теперь NPC могут реагировать на голодного Линка. Нужно добавить дополнительные реплики и реакции NPC на голодного Линка.

Например:
1. Обеспокоенность, что Линк голодный
2. Советы по тому, как и где можно найти еду
3. Событие, когда NPC выдаёт Линку еду
Затрагиваемые ресурсы и фичи

Ресурсы

  • Предметы с тегом Пища — Будут тратится в меньшем количестве
  • Ингридиенты — Будут тратиться в меньшем количестве. С помощью изменения [satietyIncrease] можно менять ценность ингредиентов и влиять на частоту их использования
  • Дрова и кремень — Будут тратиться чуть больше, так как ценность отдыха увеличилась, а они требуются для разведения костра
  • Рупии — Будут тратиться чуть больше, так как ценность отдыха в деревнях увеличилась
  • Здоровье — Будет восполняться реже

Фичи

  • Интерфейс инвентаря — Отобразить новые элементы. Сместить старые. Блокировать кнопку, если насыщение полное
  • Отдых — Сбрасывать насыщение после отдыха
  • Потреблении пищи — Добавить ограничения по потреблению. Добавить параметры пище
  • Система готовки — Добавить параметры ингредиентам и блюдам для расчёта итогового насыщения
  • Система диалогов — Добавить новое условие для выбора реплики
Параметры для редактирования — в работе
Название
Тип
Описание
maxSatiety
int
Максимальное насыщение
currentSatiety
float
Текущее насыщение
satietyIncrease
int

Параметр у объектов с тэгом Пища. Показывает на сколько увеличиться сытость Линка, когда он съест этот объект

satietyDecreasePeriod
float
Период постоянного снижения насыщения. Увеличивать для снижения нагрузки на игру
satietyDecreaseSpeed
float
Скорость снижения насыщения
eventsSatietyDecreaseCoeff
float
Коэффициент уменьшения насыщения. Изменяется под длительными событиями
longEventsSatietyDecrease
Словарь (Событие, float)
Список продолжительных событий, которые влияют на коэффициент уменьшения насыщения. В значение указывается коэффициент.
currentEventsSatietyDecrease
Словарь (Событие, float)
Список продолжительных событий, которые происходят с Линком в данный момент.
shortEventsSatietyDecrease
Словарь (Событие, float)
Список коротких событий, которые уменьшают насыщения.
currentAnimationSatiety
float
Параметр для анимации изменения шкалы насыщения.
hungryAnimation
int
Если насыщение меньше этого значения, то у Линка может проигрывать анимация голодания
satietySignalRumbling
int
Когда насыщение кратно этому числу, проигрывается звук журчания
RumblingDelayMinimum,
float
Минимальный период звучания журчания в животе
RumblingDelayMaximum
float
Максимальный период звучания журчания в животе
Рекомендации к балансу
Когда у Линка примерно 15 сердец (максимально), он должен иметь возможность почти полностью исцелиться примерно 3 раза за бой, без учёта снижения насыщения. За половину боя с сильными противниками насыщение должно освободить место под 1 большое блюдо. Полное насыщение должно падать до 0 примерно за день ходьбы.
Аналитика

Повышение сложности

Цель: оценить влияние фичи на сложность игры

Событие: смерть Линка с полным насыщением. Во время смерти свободных единиц насыщения должно остаться меньше чем среднее [satietyIncrease] у блюд (не ингредиентов).

  • Гейм-дизайнеры настраивают в редакторе, какие боевые столкновения фиксируются.
  • Если блюд в инвентаре нет, то событие не фиксируется.

Фиксируемые данные

Гипотеза

Среднее количество смертей у игрока должно увеличиться приблизительно на 3 по сравнению со сражениями без этой фичи.

Если увеличилось на 5 или больше, то игра стала слишком сложной и нужно увеличить возможность восстановления.

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

Отображение в UI

Цель: понять, нужно ли игроку постоянно видеть уровень насыщения

События:

1. Игрок зашёл в инвентарь меньше чем на 2 секунды и ничего там не сделал

2. Игрок зашёл в инвентарь и съел пищу

Фиксируемые данные

Гипотеза

Ищется тенденция, при которой игрок часто открывает инвентарь перед поеданием пищи. Если это так, то игрок заходит в инвентарь, чтобы проверить уровень насыщения. Значит нужно вынести шкалу насыщения в HUD.

Возможные улучшения
1. Добавить прокачку максимального насыщения 2. Добавить эффекты, которые влияют на скорость снижения насыщения
ОСветить вопросы
Сколько желудочков
Как отобразить в UI
Int Или float
Что делать, если еда переполняет шкалу
Еда одинаково шкалу заполняет или по-разному? От чего будет зависеть?
Как на сытость влияет особый эффект блюда?
Геймплейный цикл
Указать возможность дальнейшей прокачки.
Когда сохранять статус желудка
Отобразить в загрузке
Ассет сытости
превью заполнения желудка
как иконки реагируют на сытость
Как работает шкала во время приёма пищи
Как она уменьшается
Как на это влияет отдых
Вынести ли желудки в игру?
Анимация и звуки при голоде
Уведомление о желудке
Какие действия ускоряют голодание?
Как шкала уменьшается
Игровая экономика
Аналитика, что считаем и зачем?
Нарратив
Добавить реакцию ygc на голодающего линка
Контент
Список анимации
Список звуков
Баланс
Как проверяется тестирование
Отобразить насыщение в UI
Разогрев еды
Округлять насыщение на 3. 3 отдельный параметр
Усложнить бои, чтобы привлечь хардкорщиков.
Добавить стратегичности в процесс потребления пищи.
Повысить ценность зелий относительно еды.
Побудить чаще использовать пищу.
Повысить ценность отдыха в гостиницах.
Раскрашивать формулы