Генератор для 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, я ведь даже тесты не писал — как в санаторий съездил. Я попробовал несколько штук, которые планировал для Помощников и понял, как буду их воплощать в серьёзном проекте.
Пишите калькуляторы.