Как мы возвращаем Ксин к жизни: восстанавливаем боёвку по архивам и собираем бестиарий с помощью Wayback Machine
В середине нулевых в рунете существовал Ксин — браузерный MUD без единого изображения, построенный на тексте, HTML-формах и таблицах характеристик. Спустя несколько лет проект закрылся: сервер отключили, исходный код был утрачен, а на память остались лишь форумные обсуждения механик и сохранённые страницы в Wayback Machine. Мы воссоздаём игру с нуля — не делаем проект «по мотивам», а стремимся к максимально точной реконструкции с теми же формулами, монстрами и предметами.
Это не презентация и не анонс, а рассказ о технической стороне работы: где искать данные, почему архивным материалам нельзя доверять без проверки и к чему однажды привела такая ошибка.
Где мы ищем данные
Основных источников три, и противоречия между ними встречаются чаще, чем хотелось бы.
Wayback Machine. У оригинального Ксина не было ни API, ни дампа базы данных. Сохранились только HTML-страницы, которые когда-то посещали пользователи и которые успел заархивировать archive.org. С помощью CDX API Wayback можно получить список всех сохранённых URL за время существования сайта, а затем вручную изучить страницы и собрать сведения, доступные через интерфейс. Но в архив попало далеко не всё: страницы игрового мира недоступны, а часть данных приходится искать в обсуждениях на форуме, где игроки сами рассчитывали урон по боевым логам.
Архив форума. Сам форум закрылся вместе с проектом, однако некоторые ветки сохранились в кэше и на сторонних зеркалах фанатских сообществ. Это не документация, а живые разговоры игроков: одни жаловались, что критический удар снимает четверть здоровья, другие спорили о формуле защиты. Из таких сообщений можно извлечь пригодные для работы значения, но каждое число должно иметь два независимых подтверждения. Без них это лишь предположение, а не установленный факт.
CSS и вёрстка. Как ни странно, одним из самых надёжных источников оказался сохранившийся файл xin.css с оригинальными стилями страниц. Он помогает обнаружить детали, которые больше нигде напрямую не описаны.
Боевая система: реконструкция по фрагментам

Боевые формулы — пожалуй, самая ценная часть реконструкции: целиком их нигде не публиковали, поэтому восстанавливать их приходится по косвенным признакам.
Некоторые механики удалось подтвердить однозначно: HP персонажа = Выносливость × 5, смерть в бою отнимает 2,5% опыта, а действия обеих сторон в раунде рассчитываются одновременно, а не по очереди. Последнее особенно важно, поскольку порядок ходов полностью меняет баланс. Всё это подтверждается как сообщениями на форуме, так и логикой сохранившихся страниц боя.
Другие детали остаются предметом споров, и мы так их и обозначаем, не выдавая за факты. Например, пока неизвестен точный делитель «силы заряда» магических жезлов. На одной архивной странице предмета мы нашли упоминание шкалы 1/2/4/8, но среди почти тысячи форумных сообщений не встретили ни одного обсуждения этой механики игроками.
Бестиарий: когда два архива расходятся
Сведения о монстрах мы берём из двух независимых источников: подробного текстового бестиария, вручную составленного по архивным страницам, и отдельной таблицы характеристик по зонам, которую вели параллельно. Проблема в том, что данные не совпадают. Один и тот же монстр в одном источнике обитает у Пасеки, а в другом — в Крепости; количество опыта за победу над ним тоже различается.
При таких расхождениях худшее, что можно сделать, — выбрать источник на глаз и забыть о противоречии. Поэтому для каждого спорного монстра мы записываем, какие именно данные различаются и какому источнику в итоге отдали предпочтение. Если через полгода кто-то снова обнаружит другую цифру, будет сразу видно, что вопрос уже разбирали и почему приняли именно такое решение.
Пока достоверно откалибровать весь бестиарий не удалось. Подробно выверены около 40 монстров в восьми зонах: кубики урона, вероятности критического и фатального ударов построчно сверены с архивными данными, а не перенесены из прежних случайных значений в базе. У остальных монстров всё ещё используются старые временные числа. Это явно отмечено в документации проекта, чтобы при следующей проверке не спутать подтверждённые данные с непроверенными.
Как мы однажды сломали прод, доверившись собственным расчётам
Об этой истории неловко рассказывать, но именно она нас многому научила.
Мы переработали формулу урона оружием и магией и одновременно пересчитали баланс монстров в одиннадцати игровых зонах, опираясь на новые формулы, которые казались ближе к архивным. Код прошёл тесты, расчёты на бумаге выглядели убедительно. Мы выкатили изменения на прод.
Уже в течение следующего часа стало ясно, что в реальных боях баланс нарушился: где-то монстры стали непропорционально быстро расправляться с персонажами, а где-то ситуация оказалась обратной. Причиной была не одна конкретная ошибка. Новую формулу урона и новые характеристики монстров рассчитывали с оглядкой друг на друга, но до релиза не проверили вместе на настоящем боевом движке. В результате между формулой и конкретными значениями монстров обнаружилось расхождение, незаметное в бумажных расчётах.
Правильное решение было только одно, хотя и неприятное: в тот же день мы полностью откатили изменения к состоянию до релиза. Переработка осталась в dev-ветке, где её можно спокойно дорабатывать и проверять, не затрагивая действующих игроков.
С тех пор действует правило: любое изменение боевой формулы сначала проверяется в симуляции реальных боёв. Для этого мы проводим несколько тысяч смоделированных сражений на копии продовой базы. И только когда результаты тестового прогона сходятся, можно задумываться о релизе.
Техническая сторона
Бэкенд построен на Python 3.11, FastAPI, SQLAlchemy в синхронном режиме и PostgreSQL. Фронтенд рендерится на сервере с помощью Jinja2, без единого JavaScript-фреймворка. Это может звучать старомодно, но для MUD-игры такой подход вполне уместен: он продолжает стиль оригинала, который тоже состоял из простых HTML-форм.
Поверх Alembic работает собственная система патчей: каждое изменение схемы или данных монстров оформляется отдельным пронумерованным файлом с apply(db). Такой патч применяется один раз, а отметка о его выполнении сохраняется в таблице базы данных. Для проекта с большим количеством точечных изменений баланса это оказалось удобнее крупных ревизий Alembic: историю боевых правок проще изучать отдельно от структурных изменений.
На каком этапе проект сейчас
Игра работает, и зайти в неё можно уже сейчас по адресу xin.org.ru. Часть контента ещё не сверена с архивом и помечена как временная; некоторые зоны уже созданы, но пока не подключены к карте и ждут своей очереди. Реконструкция продолжается постепенно, зона за зоной, по прежнему правилу: если сведения не подтверждены двумя независимыми источниками, они не попадают в код и остаются в заметках в качестве гипотезы.
Дизайн персонажей The Expanse: Osiris Reborn от Owlcat вызвал удивление
Никита Буянов сообщил о предстоящем анонсе консольной версии Escape from Tarkov
Геймдиректор Overwatch об анонсе второй части на BlizzCon 2019: «Вы же *** идиоты»
225 ГБ+: для Grand Theft Auto VI вышел первый патч
Microsoft расширила программу обратной совместимости на 21 игру с оригинальной Xbox
Книжный фестиваль Black Library Live для поклонников Warhammer пройдет 12 декабря
Инвесторы опасаются, что уход Дженсена Хуанга может обрушить весь рынок ИИ
Microsoft анонсировала Wolfenstein 3 с возвращением Би-Джея Бласковица