Морская свинка Семён и пёс Винсент: как с помощью Claude Code и ChatGPT я добавил в «Героев II» замки для себя и дочери

Прокомментировать Просмотры: 0

Город Айванс Касла. Слева у причала — Флагман Семёна, жилище сильнейшего существа

Любите ли вы Heroes of Might and Magic II так же сильно, как я? Подозреваю, многие поклонники старой школы скажут, что третья часть гораздо лучше. Возможно, они и правы, но я познакомился с игрой ещё в седьмом или восьмом классе, в 1997–1998 годах, когда Heroes 3 ещё не существовало. Зато уже были радость побед, прохождение кампаний, чит-коды на чёрных драконов и открытие всей карты, а ещё ссоры с друзьями, подсмотревшими твой ход и использовавшими это против тебя. Эти впечатления остались со мной навсегда. Поэтому я до сих пор играю во вторых «Героев» и даже научил играть свою десятилетнюю дочь Варю.

Видя, на что сегодня способны агенты для написания кода, я не смог удержаться и решил добавить в игру новые расы, чтобы нам с дочкой было ещё интереснее. В этой статье подробно расскажу, что и как получилось. Возможно, мой опыт вдохновит кого-то создать собственные расы для похожих игр.

Роли распределились так: код писал Claude Code, графику создавал агент ChatGPT, музыку сочинял Suno. Я же придумывал идеи, проверял результат и отправлял скриншоты с красными кружочками.

Как всё это выглядит и звучит в игре, можно увидеть в шестиминутном ролике:

С чего всё началось

Вот мой первый промпт — дословно, включая оговорки при диктовке:

“/Applications/fheroes2.app” Я хочу дополнить эту игру двумя новыми героями и двумя новыми мирами. Один будет принадлежать мне, будет Айванс Касл, и другой Варварас Касл. И главные герои в нем будут мой аватар и Варин аватар, сделанный на основе наших фотографий. Также там будут новые прикольные звери или там твари, которые будут принадлежать нашим войскам. У Вари, например, будет Винсент (это наша собака той-пудель), у меня будет Семен (это наша морская свинка Семен Семёныч). […] Давай подумаем, почитай код этой программы и подумай, как дополнить ее двумя новыми героями.

Я отправил его 5 ноября в 19:47, а последний коммит в движок появился 10 ноября. Всего работа шла в три захода: вечером 5-го, утром 6-го с восьми до полудня и утром 10-го с 10:20 до 11:40.

Почему именно fheroes2

fheroes2 — открытый движок «Героев II», написанный на C++ с использованием SDL. Собственной графики и музыки в нём нет: он использует файлы оригинальной игры, в моём случае из версии GOG. Благодаря открытому коду в движок можно добавить новые расы, а созданные ресурсы разместить рядом в отдельном архиве, не изменяя оригинальные файлы.

Первым делом Claude изучил код и принёс неутешительную новость: расы хранятся в движке как битовая маска размером в один байт, причём все восемь битов уже заняты шестью расами, «смешанной» и «случайной». Упоминания расы встречаются в 815 местах в 51 файле. Claude предложил три решения — от косметических изменений до полноценных рас — и рекомендовал двигаться поэтапно. Я выбрал полноценные замки.

Распределение ролей

  • Я предлагал идеи, утверждал и тестировал результат, а также предоставлял фотографии для героев.

  • Claude Code (Opus 5.5) занимался архитектурой, кодом движка, конвейером обработки графики и сборкой. Рядовые задачи он поручал субагентам на Sonnet, Opus и Haiku.

  • Агент ChatGPT работал в той же папке проекта и создал всю графику по техническому заданию Claude.

  • Suno написал музыку по промптам, которые также подготовил Claude.

  • Звуки существ Claude самостоятельно скачал с Pixabay через расширение для Chrome.

Правила работы описаны в CLAUDE.md. Нетри­виальные задачи начинаются с режима планирования, причём для каждой подзадачи в плане указывается модель. План и извлечённые уроки записываются в tasks/todo.md и tasks/lessons.md, а задача считается завершённой только после проверки.

Задание для художника

Во втором сообщении я попросил Claude не заниматься рисованием самостоятельно, а подготовить структуру папок и задание для ChatGPT. Заодно предложил идею: размещать несколько кадров на одном большом листе, а затем разрезать его, вместо того чтобы создавать каждую картинку отдельно.

Claude извлёк из архива оригинальной игры образцы спрайтов для сравнения, написал инструмент для нарезки листов и составил почти шестисотстрочное техническое задание ART_BRIEF_FOR_CHATGPT.md. В нём одиннадцать разделов: структура папок, единый стиль, правила оформления листов, описание мира и персонажей, перечень ресурсов с размерами, шаблоны промптов, этапы работы и приёмочный чек-лист.

Стиль описан единым блоком, который повторяется в каждом промпте:

STYLE LOCK: hand-painted 1990s 256-colour fantasy strategy-game pixel art,
crisp 1-pixel dark outline (#1E140C), 3–4 flat tones per material with
hard-edged shading, light from the upper left, warm saturated colours slightly
muted like an old CRT screen, chunky readable silhouette, cheerful storybook
mood, no gradients, no soft blur.

Правила оформления листов заранее исключают сетку, номера и подписи:

1. Канвас делится на равные невидимые ячейки (сетка C колонок × R рядов).
2. В каждой ячейке ровно одна фигура целиком, с полями вокруг.
   Ничто не пересекает границы ячеек.
3. Во всех ячейках один и тот же масштаб и одна точка опоры: ноги стоят
   на воображаемой линии…
…
5. Не рисуй линии сетки, номера, подписи и рамки.

Стандартный лист представляет собой сетку 4×3 на двенадцать кадров. Ячейка для маленького существа имеет размер 448×384 пикселя, а в игре превращается в кадр 112×96. На одного персонажа уходит три-четыре листа: стойка и ходьба, атаки в трёх направлениях, ранение и обморок; для стрелков добавляются кадры выстрела. Вот лист Семёна, который подготовил ChatGPT:

Лист анимации Семёна от ChatGPT
Лист анимации Семёна, созданный ChatGPT

Мир в техническом задании получился добрым: в бою существа не погибают, а забавно падают в обморок со звёздочками. В разделе запретов есть и такое указание:

Не пиши в промптах оценочные слова вроде «stunning, epic, masterpiece»:
они ухудшают результат GPT Image. Описывай конкретные цвета, формы и материалы.

Первая правка: тематика замков

Первоначальный набор существ Claude придумал самостоятельно: гусь, ёжик-стрелок, бобр-прораб, медведь-лесоруб, филин-волхв и баня в городе Ивана. Я уточнил задумку: мой замок должен быть технорыбацким, с пирсом, маяком и эхолотами, а Варин — девичьим и розовым. Claude полностью переработал задание, а в tasks/lessons.md записал правило: до составления технического задания спрашивать о теме и настроении фракции, самостоятельно придумывая лишь детали в заданных рамках.

Работа ChatGPT

Процесс был разбит на этапы: сначала 16 концептов и четыре портрета, затем пауза до моего одобрения и только после этого — производство остальных ресурсов.

Концепты существ Айванс Касла
Концепты существ Айванс Касла
Концепты существ Варварас Касла
Концепты существ Варварас Касла

На каком-то этапе «Семён, свинка» превратился в кабана: в задании он значился кабаном-рыцарем в рыбацких латах. Однако ChatGPT посмотрел фотографию, увидел морскую свинку с чёрной головой и белой полосой на мордочке и нарисовал именно её. В отчёте он отдельно отметил, что предпочёл внешность с фотографии текстовому описанию.

Семён: фото, концепт, игровой спрайт
Семён: фотография, концепт и игровой спрайт
Винсент: фото, концепт, игровой спрайт
Винсент: фотография, концепт и игровой спрайт

От меня потребовалось лишь утвердить концепты. К утру 6 ноября агент подготовил 567 игровых PNG и 115 GIF-превью анимаций: 12 существ с полным набором движений, Ивана и Варю на карте и в бою, портреты, по 29 построек для каждого города, городские фоны, замки на карте и гербы.

Иван на Семёне и Варя на Винсенте, концепты
Концепты Ивана на Семёне и Вари на Винсенте

Обитатели замков

Ур.

Айванс Касл

Варварас Касл

1

Карасики-матросы

Котёнок-шалун

2

Рак-спиннингист → Рак-снайпер

Белка-орехометчица → Белка-снайпер

3

Бобр-лодочник → Бобр-капитан

Лиса-плутовка → Лиса-иллюзионистка

4

Щука-торпеда → Щука-торпедоносец

Шмель-рыцарь → Шмель-паладин

5

Робо-чайка → Чайка-разведчик

Кот-учёный → Кот-архимаг

6

Семён → Семён Великолепный

Винсент → Винсент Великий

Всего получилось 22 существа: 12 базовых и 10 улучшенных. Последних отдельно не рисовали — сборщик создаёт их, перекрашивая исходные изображения. У Семёна 55 очков здоровья, у Семёна Великолепного — 70, причём он атакует дважды. Рак-снайпер тоже стреляет два раза за ход.

Постройки соответствуют тематике замков. В моём городе гильдия магов расположена в маяке, таверна называется «Уха у Семёна», а особое здание — «Эхолотная башня». У Вари есть Чайная, Цветочный рынок, Радужный сад и Дворец Винсента.

Айванс Касл полностью отстроенный
Полностью отстроенный Айванс Касл
Варварас Касл полностью отстроенный
Полностью отстроенный Варварас Касл

Как графика попадает в игру

Движок не умеет читать PNG. У «Героев II» собственные форматы, которые пришлось воспроизвести по исходному коду движка:

  • ICN — кадры спрайтов в формате RLE с данными о прозрачности и тенях;

  • BIN — анимация существа: 821 байт, 34 типа анимации, смещения, скорость и точка вылета снаряда;

  • 82M — звук в виде сырого PCM: 22 050 Гц, 8 бит, моно;

  • AGG — архив с таблицей хешей;

  • в игре используется одна палитра из 256 цветов.

С палитрой есть тонкость: некоторые индексы в игре циклически меняются, обеспечивая анимацию воды и лавы. Если использовать такой цвет для плаща героя, он начнёт переливаться. Поэтому при квантовании эти индексы исключаются:

# Palette indices that cycle in-game; never emit them.
FORBIDDEN_INDICES = frozenset(list(range(214, 222)) + list(range(231, 236)) + list(range(238, 242)))

Цвета подбираются в пространстве CIELAB с дизерингом Флойда — Стейнберга. Весь конвейер устроен так:

art/*.png (RGBA от ChatGPT)
  → масштаб под габариты оригинальных спрайтов
  → квантование в палитру игры (CIELAB + Floyd–Steinberg, без «мигающих» индексов)
  → ICN / BIN / 82M
  → FAMILY.AGG (сейчас 205 файлов, 4,6 МБ)
  → движок ищет файл сначала в family.agg, потом в оригинальных архивах

Кроме того, сборщик генерирует фрагмент C++ с областями нажатия на здания, порядком их отрисовки и размещением домиков на карте. В tools/ накопилось около 3 400 строк скриптов. Проверяли их на оригинальных данных: 18 тестов используют архив игры как эталон, кодировщик пересобирает 46 исходных BIN-файлов с точностью до байта, а ICN после распаковки и повторной упаковки совпадает с оригиналом до пикселя.

День разработки

Утром 6 ноября я передал Claude отчёт ChatGPT: картинки готовы, можно расставлять. Сначала пять субагентов на Sonnet параллельно изучили движок: расы, монстров, замки, героев, форматы и сборку. Затем Claude составил план, а отдельный субагент на Opus провёл ревью и обнаружил четыре серьёзные ошибки. Одна незаметно нарушила бы работу игры, другая привела бы к падению при запуске.

Ошибка на единицу. Монстр на карте хранится в одном байте как номер кадра id - 1. По плану новые существа должны были получить номера начиная с 71, но 71 уже занят «случайным монстром 4-го уровня». Из-за смещения существа на картах без предупреждения превращались бы в соседние по списку виды. Правильный диапазон — 72–93.

Таблицы с нулевым заполнением. Характеристики монстров хранятся в обычных C-массивах на MONSTER_COUNT элементов. Если пропустить строку, существо получит 0 HP и пустое имя файла, после чего игра упадёт. Массивы заменили на std::array с проверкой размера через static_assert.

Новые расы получили значения, выходящие за пределы одного байта:

// Additional races of this fork (see family/family.h). They do not fit into 8 bits.
IVAN = 0x100,
VARV = 0x200,

Это потребовало изменений в сохранениях и формате карт. В заголовке карты раса игрока находится в несжатой части, которую список карт считывает ещё до проверки версии. Поэтому новые поля добавили в конец, а версию карт обозначили отдельным битом — 0x4000 | 14, чтобы избежать конфликта с возможной будущей версией 14 от разработчиков движка.

С сохранениями возникла похожая ситуация. Сначала Claude выбрал следующий свободный номер версии — 10033, но при ревью выяснилось, что его уже использует версия 1.1.15 оригинального fheroes2. Наша игра ошибочно принимала бы её сохранения за собственные. Теперь у форка отдельная нумерация: 0x7F01, а после добавления героев — 0x7F02.

Ещё одна мера защиты связана с архивом графики. Новые расы доступны только при наличии рядом файла family.agg, а в кампаниях они не появляются вовсе. Без этого архива движок работает как обычный fheroes2.

Музыка

Однажды я отклонил план, потому что в нём не было музыки. Я попросил подготовить промпты для Suno: ренессанс с технологическими мотивами для Ивана и романтичный ренессанс для Вари — темы героя, осады и капитана. Через две минуты план был утверждён, а ещё через минуту промпты появились в SUNO_PROMPTS.md. В lessons.md записали второй урок: содержание фракции должно сразу включать графику, звуки, музыку и тексты.

Треки в Suno я генерировал сам, используя по три варианта стиля для каждой из шести композиций. Вот один из вариантов темы Ивана:

🎛 ВЕРСИЯ 1 — «Пирс на рассвете»
STYLE: Renaissance pavane, stately slow tempo, lute and recorder consort,
viola da gamba drone, soft analog synth arpeggios beneath, D dorian,
calm dawn over a lake
EXCLUDE: vocals, choir, modern drum kit

В музыке Ивана лютня и блок-флейта звучат на фоне аналоговых синтезаторов и сигналов эхолота; у Вари — арфа и клавесин, гальярды и паваны. Claude обрезал тишину в конце композиций, чтобы они повторялись без пауз, и подключил их вместо MIDI-тем оригинальных замков.

Тринадцать коммитов

С 09:29 до 11:50 в ветке появилось 13 коммитов: ядро рас, 22 существа, герои, города, карта и редактор, перевод, звуки и музыка. Ядро и формат карт разрабатывал субагент на Opus, существ и города — Sonnet, базовую сборку подготовил Haiku.

Чтобы не затронуть мою обычную игру, «семейная» версия устанавливается как отдельное приложение fheroes2 Family.app со своими настройками и сохранениями, используя оригинальные данные из общей папки. После каждой установки Claude проверял, что подпись исходного приложения осталась неизменной.

Первый запуск

Первая сборка сразу завершилась с ошибкой. Выяснилось, что SDL2 из Homebrew на самом деле является прослойкой, которая во время работы загружает SDL3, а SDL3 в пакете отсутствовала. Затем macOS принудительно завершила процесс из-за неподписанной библиотеки. Когда игра наконец запустилась, бой закончился мгновенно: в новой копии настроек было включено автоматическое разрешение всех сражений. Пришлось перенести мои настройки.

После этого Claude с моего разрешения получил управление экраном и самостоятельно проверил основной сценарий: новую игру за Рыболова, город, строительство, найм, героя на карте, сохранение и загрузку, а также бой Ивана против Вари. Подключив расширение Chrome, он за минуту скачал с Pixabay 39 звуков для атак, ранений, обмороков и выстрелов. Рак стреляет под звук катушки спиннинга, а Винсент скулит при ранении. По пути обнаружилась небольшая ошибка: переменная цикла в скрипте скачивания называлась path, а в zsh она связана с PATH, поэтому curl и ls неожиданно стали выдавать «not found».

Новая игра: в «Классе» Рыболов и Чародейка
Новая игра: среди классов появились Рыболов и Чародейка

Ещё 16 героев

При найме второго героя в таверне игрок получал персонажа из чужого замка: у наших рас были только Иван и Варя. Claude составил для ChatGPT второе задание, EXTRA_HEROES_BRIEF.md, на восемь героев каждой расы, по четыре портрета на листе 2×2. Примерно через десять минут портреты были готовы, а ещё через десять появились в игре.

Дополнительные герои Ивана
Дополнительные герои Ивана
Дополнительные герои Вари
Дополнительные герои Вари

На моей стороне служат Боцман Кузьмич, Инженер Лада, Сонарщик Тимофей, Рыбнадзор Степан и Атаманша Белуга, на Вариной — Фея Зефирка, Гадалка Сирень, Кондитерша Карамель и Бабушка Пелагея. Теперь в каждом замке по девять героев, как и у оригинальных классов.

Плейтест и красные кружочки

Затем я начал играть самостоятельно и отправлять скриншоты с замечаниями. В первом раунде набралось три правки.

Было: щиты вместо лиц
До исправления: щиты вместо лиц
  1. На экране новой игры наши классы отображались гербами со щитами, тогда как оригинальные — портретами. Мне хотелось видеть наши лица. Claude сделал значки из изображений Ивана и Вари. В первом варианте в кадр попала удочка соседней фигуры, во втором у Вари оказался обрезан подбородок, а третий подошёл.

  2. Стартовым героем игрока за Ивана должен быть Иван, а за Варю — Варя. Остальные персонажи появляются в таверне по обычным правилам, как свои, так и чужие.

  3. Семён и Винсент передвигались по карте без звука. Я попросил: «Сам прими решение, что лучше, но звуки должны появиться». Claude собрал шаги из записей Pixabay: топот маленького зверька, у Семёна с писком, у Винсента — со звоном жетонов на ошейнике. Громкость он привёл к уровню оригинальных звуков шагов.

После этого я написал: «все работает! супер!». Второй раунд состоялся через четыре дня, 10 ноября: пять правок и четыре скриншота.

Было: существа вылезают за ячейки армии
До исправления: существа выходят за границы ячеек армии
Было: в бою существа Вари наслаиваются друг на друга
До исправления: существа Вари в бою перекрывают друг друга
Было: Варя висит над землёй
До исправления: Варя висит над землёй
Было: мусор на иконке левой башни
До исправления: артефакты на значке левой башни

Claude сопоставил размеры и точки опоры наших спрайтов с оригинальными. Почти все проблемы сводились к одному: новую графику вовремя не сравнили с исходной.

Проблема

Причина

Решение

Существа выходят за границы ячеек армии в городе

Изображения больше ячейки размером 82×93

Изображения вписываются в 76×88 и выравниваются по нижнему краю

Существа перекрывают друг друга в бою

Наши спрайты почти вдвое шире оригинальных: те занимают 34–49 px на одну клетку и 70–76 px на две

Ограничения 54×76 и 90×95, масштабирование до 0,61–0,79

Варя висит над землёй

Героя выравнивали по верхушке посоха, куда игра помещает флаг игрока

Выравнивание по линии ног рыцаря, посох удлинён до точки размещения флага

Артефакты на значке левой башни после окна покупки

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

Фрагмент ограничен размерами фона, а сборщик проверяет отсутствие прозрачных пикселей

Я также попросил добавить верфь со стандартным кораблём: в наших замках её совсем не было. Субагент на Sonnet включил верфь в движке, а Claude тем временем нарисовал причал в стиле каждого замка. Корабль взяли из оригинальной игры — тот самый, который продаёт верфь. Субагент забыл о верфи Вари, но Claude заметил это и дописал её самостоятельно.

По итогам этого раунда в lessons.md добавили правило: каждый новый спрайт нужно сравнивать с оригиналом того же назначения по ширине, высоте, точке опоры и размеру ячейки.

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

Стало: город Вари, армия в своих ячейках
После исправления: город Вари, армия размещается в своих ячейках
Стало: Варя на Винсенте и её армия против гномов
После исправления: Варя на Винсенте и её армия сражаются с гномами
Стало: меню постройки Ивана. Левая башня без мусора, у верфи свой причал. Здесь она перечёркнута, потому что у этого замка нет выхода к воде
После исправления: меню строительства Ивана. На левой башне нет артефактов, у верфи появился свой причал. Она перечёркнута, потому что у этого замка нет выхода к воде

Домик белочек

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

Такого домика не оказалось. Сначала мы обсуждали, стоит ли заказывать ChatGPT новые изображения, но я предложил использовать жилища из наших городов. Claude уменьшил все 12 городских жилищ до размеров объектов карты, добавил тени и показал превью. Я ответил: «Да, из городских».

Двенадцать домиков существ на карте
Двенадцать жилищ существ для карты

Жилища первого и второго уровня действуют как нора хоббитов: существа присоединяются бесплатно. Постройки с третьего по шестой уровень работают как лагерь фургонов — там существ нанимают за золото. Каждую неделю их запас пополняется. ИИ тоже знает об этих жилищах, а в редакторе карт они доступны в соответствующем списке.

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

Поначалу замена затрагивала лишь 3–4% жилищ. Claude спросил, сколько объектов следует заменять, и я выбрал вариант «все подходящие, но не больше 35%». На стенде без интерфейса проверили 103 карты, по три прогона каждую. Из 2 325 подходящих жилищ заменилось 226 на 64 картах. На Beltway не заменилось ни одного: жилища там зажаты между горами, и наши домики не помещаются.

Как всё выглядит сейчас

В окне колодца отображаются все существа замка и их еженедельный прирост:

Колодец Ивана
Колодец Ивана
Колодец Вари
Колодец Вари

Иван верхом на Семёне возле своего замка:

Иван на Семёне у своего замка
Иван на Семёне возле своего замка

Найм существ в городе Вари:

Найм белок-орехометчиц
Найм белок-орехометчиц

Битва Ивана на болоте. Сам герой сидит верхом на Семёне, а в его войске ещё два Семёна, раки-снайперы, бобры-лодочники, щуки-торпеды и одна робо-чайка.

Бой Ивана против горгулий, грифонов и кентавров
Иван сражается с горгульями, грифонами и кентаврами

Что осталось доработать

В окне колодца Семён слишком велик и перекрывает собственные характеристики. Окна гильдий магов в городах выглядят мелковато. Удлинённое удилище Ивана в двух кадрах колдовства отстаёт от руки. Длинные имена героев в списке редактора, возможно, обрезаются, но это ещё предстоит проверить.

Проект в цифрах

  • 19 коммитов в движок: 77 файлов, +3 616 и −213 строк.

  • Около 3 400 строк скриптов в конвейере обработки ресурсов.

  • 567 игровых PNG от ChatGPT на первом этапе и 16 портретов на втором.

  • 22 существа, 18 героев, по 29 зданий на город, верфь и 12 жилищ на карте.

  • 42 звука с Pixabay и 6 композиций из Suno.

  • 32 запуска субагентов. Для 25 из них модель указана явно: Sonnet — 17 раз, Opus — 7, Haiku — 1.

  • Лично я отправил в чат около дюжины сообщений, не считая ответов на вопросы.

Какие выводы я сделал

Техническое задание для ChatGPT составил Claude, и это оказалось эффективнее, чем если бы я писал его сам. Он знал, какие размеры нужны движку и где должна находиться точка опоры спрайта, а также заранее предусмотрел, что тени, зеркальные кадры и улучшенные версии создаст сборщик. Художнику осталось сосредоточиться на персонажах и зданиях.

Скриншот с красным кружком оказался отличным баг-репортом. Мне не потребовалось объяснять, что такое ячейка армии или точка размещения флага: Claude самостоятельно обнаружил общую причину по четырём изображениям.

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

Режим планирования из CLAUDE.md позволил мне отклонить план без музыки ещё до написания кода. А ревью отдельного субагента выявило смещение номеров монстров и уже занятую версию сохранений. Сам я вряд ли заметил бы обе ошибки: игра не обязательно упала бы, но работала бы неправильно.

Позже я выложу код на GitHub. Для запуска, как и в случае обычного fheroes2, понадобятся оригинальные данные «Героев II».

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов