Выложу один из примеров того, как устроен игровой баланс Daily Sensation. Запись довольно сложная. Нужно вникать, так что кладу под кат.
Итак, вопрос, сколько статей делает в сутки автор с минимумом опыта? (они у нас не спят, так что считаем все сутки)
Дано (всё время в секундах):
author_work_sec - время, за которое автор с минимумом опыта делает процент статьи
author_tire_sec – время, за которое автор получает пункт усталости
danger_tire - сколько пунктов усталости ему надо получить, чтобы убежать отдыхать
step_of_rest - за сколько секунд отдыха он убивает единицу усталости
Теперь считаем:
1) author_work_sec * 100 = время на написание всей статьи без учёта отдыха
2) step_of_rest * danger_tire = время на то, чтобы устать работать
3) время на написание всей статьи без учёта отдыха / время на то, чтобы устать работать = сколько раз он успевает целиком устать во время работы над статьёй
4) step_of_rest * danger_tire = время на полный отдых
5) количество отдыхов во время написания статьи * время на полный отдых = сколько времени он отдыхает во время написания статьи
6) время на написание всей статьи без учёта отдыха + сколько времени он отдыхает во время написания статьи = реальное время написания статьи
7) 86400 (секунд в сутках) / реальное время написания статьи = сколько статей он пишет в сутки
Сводим всё вместе и переводим в переменные:
86400 / ((author_work_sec * 100) + ((author_work_sec * 100) / (author_tire_sec * danger_tire) * step_of_rest * danger_tire)) = сколько статей он пишет в сутки
danger_tire сокращается
86400 / ((author_work_sec * 100) + ((author_work_sec * 100) / author_tire_sec * step_of_rest))
и ещё чуть подсократим
864 / author_work_sec * (step_of_rest / author_tire_sec + 1)
Теперь добавим коэффициент опытности автора, потому что профессионал пишет статьи быстрее новичка.
Записываем всё, что получилось ранее в переменную "Statey_v_den".
Statey_v_den = 864 / author_work_sec * (step_of_rest / author_tire_sec + 1)
Теперь у нас есть: author_expa_coefficient означающий, насколько быстрее новичка работает максимально прокачанный автор (сейчас author_expa_coefficient = 2, то есть профессионал пашет в два раза быстрее.)
Теперь есть некий журнал уровня Х. Уровень журнала означает (кроме всего прочего) сколько в этот момент в редакции должно быть сотрудников (если их меньше - то на этом уровне отдел кадров постепенно нанимает новых пока не будет Х, если больше - лишних увольняют). Игрок должен стремиться к тому, чтобы четверть сотрудников была авторами (если их меньше - номер сложнее сдать, если больше - то сложности у других трёх профессий, и это в результате тоже мешает сдать номер). Т.е. в идеале X/4 = это то, сколько у игрока авторов.
Значит если мы скажем ему сдать Statey_v_den * X/4 = то ему будет для этого достаточно авторов-новичков.
А если Statey_v_den * X/4 * author_expa_coefficient - то для того чтобы сдать номер ему нужны будут целиком прокачанные авторы профессионалы.
Теперь высчитаем формулу, чтобы в начале игры игроку было достаточно новичков, а в конце нужны были одни профессионалы. Для этого добавляем коэффициент сложности. Назовём его Difficulty.
Приделываем сложность к формуле:
Сколько статей нужно сдать в номер уровня X
Statey_v_den * X/4 * (1 + (author_expa_coefficient - 1) * Difficulty)
Cтавим Difficulty = 0 для первых номеров и понемногу повышаем до единицы к последним.
Теперь можно как угодно ускорять и замедлять авторов, увеличивать скорость работы и время отдыха, можно делать профессионалов более или менее крутыми - всё равно всё будет считаться правильно.
Но это ещё не всё. Difficulty не обязательно указывать вручную. Можно сделать, чтобы он автоматически равномерно повышался. Минимум в игре может быть 5 сотрудников. Максимум 50. То есть у журнала есть 45 уровней. Один уровень добавляет 1/45 от единицы сложности.
Значит вместо Difficulty пишем (Х - 5)*(1/45).
В результате:
864 / author_work_sec * (step_of_rest / author_tire_sec + 1) * X/4 * (1 + (author_expa_coefficient - 1) * (Х - 5)*(1/45))
Это не учитывает кранча, работы редакторов и многих других мелочей, так что во время тестов формулу скорее всего придётся изменить, чтобы она выдавала результаты чуть поменьше, либо чуть побольше. Но это будет изменение всего одной цифры.