Вводная информация
Привет! 👋
Теперь у тебя важная задача — написать ТЗ на комплексную фичу. Это твой шанс закрепить полученные знания и применить их на практике.
Ты сам выбираешь, какую фичу описывать:
— это может быть что-то для твоей игры
— или для известной игры, но важно, чтобы такой фичи там ещё не было
Главное — выбирай что-то масштабное и интересное. Фича должна быть жирной: со схемами, формулами, переменными, контентом и так далее…
Для вдохновения можешь представить, например:
- Уникальный боевой режим в игре про выживание.
- Мета-механику с кастомизацией персонажей в рогалике.
- Систему социальных взаимодействий с NPC, которая меняет их отношение к игроку.
Но пока сосредоточься на том, что ты уже умеешь:
1. Выбери фичу
2. Напиши Цели и Общее описание фичи.
Это основа, с которой мы будем работать дальше. Задачи и материалы лекций будут добавляться ниже, по мере продвижения по интенсиву. ↓↓↓
Дальше в лекциях мы разберём:
→ как создавать схемы и user flow для контекстных разделов (материалы лекции №5)
→ как делать мокапы и UI-декомпозицию,
→ как запрашивать аналитику, вычитывать документ и обеспечивать связность с ГДД.
Удачи! 💪 Помни, что каждый шаг приближает тебя к профессиональному уровню. 🚀
27.01.25
Добавлен раздел Аналитики и Баланса
Исправлены замечания после разбора
24.01.25
Изменено название фичи: Шкала насыщения → Насыщение
Изменена и дополнена структура UI раздела
20.01.25
Изменено название фичи: Шкала сытости → Шкала насыщения
Изменены названия переменных
Насыщение уменьшается от событий Линка
Добавлен геймплейный цикл
Цель
Усложнить бои, чтобы привлечь хардкорщиков. Добавить стратегичности в процесс потребления пищи. Повысить ценность зелий относительно еды. Побудить чаще использовать пищу. Повысить ценность отдыха в гостиницах.
Краткое описание
Когда Линк потребляет пищу, заполняется шкала насыщения. Если шкала заполнена, больше есть нельзя блюда. Шкала опускается от времени, от событий или после отдыха.
Геймплей
Игрок после приёма пищи ждёт, пока у него упадёт насыщение.
Фича выстраивает игровой цикл вокруг приёма пищи. Она ограничивает прирост здоровья и баффов в бою, а также трату еды. Игрок может отдохнуть, чтобы сбросить насыщение.
Новые параметры
- [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, эффект выбирается заново.
Иконки насыщения
У насыщения отображается 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] можно менять ценность ингредиентов и влиять на частоту их использования
- Дрова и кремень — Будут тратиться чуть больше, так как ценность отдыха увеличилась, а они требуются для разведения костра
- Рупии — Будут тратиться чуть больше, так как ценность отдыха в деревнях увеличилась
- Здоровье — Будет восполняться реже
Фичи
- Интерфейс инвентаря — Отобразить новые элементы. Сместить старые. Блокировать кнопку, если насыщение полное
- Отдых — Сбрасывать насыщение после отдыха
- Потреблении пищи — Добавить ограничения по потреблению. Добавить параметры пище
- Система готовки — Добавить параметры ингредиентам и блюдам для расчёта итогового насыщения
- Система диалогов — Добавить новое условие для выбора реплики
Параметр у объектов с тэгом Пища. Показывает на сколько увеличиться сытость Линка, когда он съест этот объект
Повышение сложности
Цель: оценить влияние фичи на сложность игры
Событие: смерть Линка с полным насыщением. Во время смерти свободных единиц насыщения должно остаться меньше чем среднее [satietyIncrease] у блюд (не ингредиентов).
- Гейм-дизайнеры настраивают в редакторе, какие боевые столкновения фиксируются.
- Если блюд в инвентаре нет, то событие не фиксируется.
Гипотеза
Среднее количество смертей у игрока должно увеличиться приблизительно на 3 по сравнению со сражениями без этой фичи.
Если увеличилось на 5 или больше, то игра стала слишком сложной и нужно увеличить возможность восстановления.
Остальные данные из таблиц нужно использовать для уточнения баланса насыщения. Понимание, сколько здоровья у игрока было в бою и сколько примерно ему не хватило, позволит лучше уточнить баланс.
Отображение в UI
Цель: понять, нужно ли игроку постоянно видеть уровень насыщения
События:
1. Игрок зашёл в инвентарь меньше чем на 2 секунды и ничего там не сделал
2. Игрок зашёл в инвентарь и съел пищу
Гипотеза
Ищется тенденция, при которой игрок часто открывает инвентарь перед поеданием пищи. Если это так, то игрок заходит в инвентарь, чтобы проверить уровень насыщения. Значит нужно вынести шкалу насыщения в HUD.