Генератор для Swords & Wizardry Complete Revised

9 июня 2024 Проекты

Генератор для Swords & Wizardry Complete Revised

Я написал генератор инвентаря для Swords & Wizardry.
В этот раз история не такая драматическая, как с Помощниками Принцессы, я просто взял и очень быстро сколотил прототип на коленке между играми, которые веду на этой системе.

https://swords-and-wizardry.ivlev.blog

Что умеет:

  • Списки снаряги, оружия и брони с весом и стоимостью
  • Инвентарь, подсчёт общего веса, стоимости и скорости
  • Несколько инвентарей, которые можно переименовывать. Например: «Жужа, воровка», «Золтан, наёмник», «Соломон, осёл» и т. д.
  • Быстрые наборы снаряжения, которые можно выбрать и не тратить время при генерёжке нового персонажа
  • Сохраняет инвентарь в хранилище браузера, то есть, выбранные предметы переживут перезагрузку страницы
  • Показывает справку по нагрузке и скорости
  • Конвертирует текст (который можно скопировать из других источников) в снарягу и добавляет в инвентарь
  • Выгружает инвентари в виде JSON, который можно вручную добавить в хранилище браузера (dev tools). Более удобный импорт написать я не успел.

С OD&D генератор конечно несовместим, однако, его можно легко хакнуть и сконвертировать фунты в монеты (и изменить логику расчёта скорости).
Возможно, подойдёт в качестве инвентаря для других клонов с фунтами (быстро проверил Крысы и Двери, расчёт скорости такой же, а веса немного другие).
Могу с этим помочь, пишите.

Есть фантазии ещё добавить полноценный генератор персонажей для S&W, но ближайшие недели времени на это у меня не будет, поэтому выкладываю, как есть. Рассчитываю вернуться к этому позже (Сделано!).

Далее немного технических подробностей.


Кратко: я пушил в main.

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

Чтобы не укатываться в кровавый энтерпрайз, как это случилось с Помощниками, я отпустил вожжи и клепал фичи максимально быстро, не обращая внимания на болото, которое разрастается под капотом. Первые пару сессий до 90 процентов кода я написал с ChatGPT 4o, просто описывая текстом задачи и копируя код в файлы. JSON с информацией о предметах и их стоимости/весах я тоже сгенерил, скармливая чату куски текста из PDF (Ctrl+C, Ctrl+V), нейронка в состоянии понять такие данные, хоть и размазанные по строкам и символам табуляции. Недостающие веса я взял из бесплатного дополнения Equipment Emporium к BFRPG, а наборы сделал на основе платной пдфки S&W Character Reference Sheets (взял не всё, и поправил по вкусу). После все автоматически прочитанные данные сравнил с источниками и исправил ошибки.

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

Я не завёл никаких фреймворков, ни типов (хотелось бы, но время — золото, так что только jsdoc с typedefs), ни JSX (ванильный JS + DOM API), ни менеджера стейта (у нас есть самописный глобальный стейт дома), ни мерзкого css-in-js и styled-components (есть tailwind как css-фреймворк, всё-таки на этой бдсм-вечеринке должно быть стоп-слово). node_modules содержат исключительно пакеты с линтером и форматтером кода.

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

Необходимость стейта напрашивалась сама собой, и в какой-то момент я сгруппировал функции в сервис-синглтон для того, чтобы завернуть всё в сериализацию и сохранять в локальное хранилище браузера. Сначала я планировал всё красиво вложить в Proxy и автоматически сохранять данные при обновлениях, однако идею пришлсь отложить — прокси не применяется ко вложенным полям-объектам, так что сериализация выполняется вручную внутри мутирующих методов. Наверное, можно было дожать прокси-объекты и добавить какую-ту хитрую рекурсию, но обновить 5 методов в час ночи показалось более быстрой задачей. YOLO, этот код затопят океаны.

Данный опыт показал, что в следующий раз хотя бы на библиотеке стейта лучше не экономить, и сразу брать готовое решение. DOM API и ванильный JS при этом воспринимаются без боли, потому что правка динамического HTML просто молниеносная по времени.

Props drilling? Context API? React Hooks? Ты заснул на солнцепёке, пошли писать айфреймы, а потом заруба в Nintendo 64.

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

Пишите калькуляторы.

comments powered by Disqus