Как все начиналось
Всем привет, начинаю серию постов о том как мы с товарищем в очередную кукурузу вмотались, ну точнее все-таки занялись геймдевом. Данная серия постов просто будет логом разработчика о том как делали, какие решения принимали и какие технологии использовали.
Немного о себе: Меня зовут Леша, я программный инженер со стажем наверно уже 15+ лет, в компьютерах ковыряюсь с семи лет, учился в красноярском политехе ну и работал наверно курса со второго в ИТ. Прошел всю ветку разраба от стажера до СТО небольшой организации.
Как и многие, я люблю играть в компьютерные игры, раньше даже киберкотлетой был. Мы с товарищем, пусть будет Иван, прилипаем уже некоторое время в TeamfightTactics Duo. Этот сезон нам не сильно зашел и томным вечером в кальянке мы просто решили а давай скопипастим ТФТ и просто посмотрим по силу ли нам это сделать или нет. Ну и слово за слово, понеслось...
Пилить решили все по модному - по вайбкодерски, в целом все у нас при помощи нейронок. Ваня шарпист а я последнее время джавист, в итоге раз он создал репу то и он выбирал стек:
- Бэк пилим на net 8.0
- Фронт на вебе
Для мвп решили что пойдет, ну и что войдет в мвп:
- ФФА на 8 игроков
- Матчмейкинг
- ~60 персонажей на славянскую тематику
- Пве режим на 8 игроков
- Итемизация в целом клон тфт
- Аугментации
- Абилки в ц
- Балансер всего этого дела - тулза которая поможет соблюсти игровой баланс перснажей и предметов
- 2.5d в вебе визуализация
Ну и инженерные задачи уже начались на фазе планирования архитектуры решения. Одна из первых которую предстояло решить это - "А как вообще сделать так чтобы у нас куча боев игралась на клиентах и потом сервер это все собирал в кучу...". Сразу задумались о том что рандом работает везде по разному (ну мы же в будущем хотим в мобилки),и тупо критические удары будут приводить к разным исходам боя в разных местах, а хочется чтобы люди еще и скаутить чужие доски могли, и эта проблема не решается даже при синхронизации сида рандома. Решением стала детерменированность боя, и рассчет всего только на сервере: Сервер рассчитывает бой и передает его на клиенты, которые просто его проигрывают и отображают игроку, на серваке формируется лог боя и просто жсониной по тикам отправляется на клиент, который его проигрывает. Таким образом и с рандомом думать не надо, сервак все посчитает и отдаст, ну и читеров не будет, наверно.
Разобрались с этим ну и вперед, геймсервер парит игроков (пока это все кто заджойнились в матч + недостающие ситы забиваются ботами), и по фазам проигрывает бои и отправляет на клиенты, клиенты смотрят и через команды обновляют стейт сервера, план прост по этому и красив.
Итого проблема: сложность оркестрации различных клиентов и паралельный рассчет боя приводит к несогласованности состояний клиентов и сервера.
Как решили: детерминированный рассчет боя только на сервере и проигрывание реплея боя на клиенте.
Прос: Просто, безопасно с точки зрения читов, поддерживается подобием паттерна CQRS - читаем стейт отправляет комманды с клиента.
Конс: Нагрузка на сеть
Вытекающие: А что делать то если я хочу предмет на персонажа одеть во время боя? А чето тормозит на slow4g или 3g, как то можно побыстрее?
В следующем посту распишу как пилили гейм механики вроде щитов, передвижения персонажей по доске и распределению лута, ну и решали вытекающие.
Если кому-то интересно то сейчас уже можно в веб версию потыкать, тестовый стенд (серт самоподписный пока, не обессудьте) : https://iggq3krru.fvds.ru/









