/
docNemo
/
hex-map-editor
Обзор
Документация
Войти
/
docNemo
/
hex-map-editor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
5
CI/CD
Аналитика
Безопасность
main
src/foundry/settings.ts
133 строки
6 KB
docNemo
feat(units)!: метрические единицы в модели и хранении
03 авг 2026, 14:51
03 авг 2026, 14:51
f1b5073
Код
Авторство
О чём код?
import { ATLAS_SETTING_KEY, DEFAULT_ATLAS_STATE, type SettingsHost } from '@atlas/world'; import { I18N_PREFIX, MODULE_ID } from '@core/constants'; import { logger } from '@core/log'; import { DEFAULT_VISIBILITY, type VisibilitySettings } from '@visibility/settings'; /** * Настройки мира и мост к ним для подсистем. * * Реестр атласа и настройки видимости описаны в своих подсистемах через узкий * интерфейс `SettingsHost` — благодаря этому они проверяются тестами без Foundry. * Здесь этот интерфейс получает единственную настоящую реализацию. * * Обе настройки скрыты из окна настроек Foundry: атлас правится обзором атласа, * а видимость — своей панелью. Показанный там сырой JSON пользы не приносит, * а испорченный руками — ломает мир. */ export const VISIBILITY_SETTING_KEY = 'visibility'; export const HEXCRAWL_SETTING_KEY = 'hexcrawl'; export interface HexcrawlSettings { /** Радиус обзора партии в гексах. */ sightRadius: number; /** Раскрывать ли карту при перемещении токена партии. */ autoReveal: boolean; /** Скорость партии по открытой местности, километров в день. */ kmPerDay: number; } /** * Раскрытие включено по умолчанию, а радиус равен единице. * * Единица — это «видно соседние гексы»: партия, стоящая посреди леса, не должна * узнавать местность на три дня пути вперёд. Ведущий, ведущий кампанию по * известному миру, выключает раскрытие целиком. */ export const DEFAULT_HEXCRAWL: HexcrawlSettings = { sightRadius: 1, autoReveal: true, // Двадцать четыре мили в день — пеший отряд по открытой местности; та же // величина заложена в умолчания расчёта пути. kmPerDay: 40, }; /** Настройки уровня мира поверх API Foundry. */ export class FoundrySettingsHost implements SettingsHost { get(key: string): unknown { return game.settings.get(MODULE_ID, key); } async set(key: string, value: unknown): Promise<void> { await game.settings.set(MODULE_ID, key, value); } } /** * Регистрирует настройки модуля. * * Вызывается в `init`: обращение к незарегистрированной настройке — ошибка, * а хук панели инструментов и загрузка сцены случаются сразу после. */ export function registerSettings(): void { game.settings.register(MODULE_ID, ATLAS_SETTING_KEY, { scope: 'world', config: false, type: Object, default: DEFAULT_ATLAS_STATE, }); game.settings.register(MODULE_ID, VISIBILITY_SETTING_KEY, { scope: 'world', config: false, type: Object, default: DEFAULT_VISIBILITY, }); // В отличие от атласа и видимости, эти настройки правятся штатным окном: // радиус обзора — обычный параметр стола, а не производная от данных карты. game.settings.register(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.autoReveal`, { scope: 'world', config: true, type: Boolean, default: DEFAULT_HEXCRAWL.autoReveal, name: `${I18N_PREFIX}.settings.autoReveal`, hint: `${I18N_PREFIX}.settings.autoRevealHint`, }); game.settings.register(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.sightRadius`, { scope: 'world', config: true, type: Number, default: DEFAULT_HEXCRAWL.sightRadius, range: { min: 0, max: 5, step: 1 }, name: `${I18N_PREFIX}.settings.sightRadius`, hint: `${I18N_PREFIX}.settings.sightRadiusHint`, }); game.settings.register(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.kmPerDay`, { scope: 'world', config: true, type: Number, default: DEFAULT_HEXCRAWL.kmPerDay, range: { min: 5, max: 200, step: 5 }, name: `${I18N_PREFIX}.settings.kmPerDay`, hint: `${I18N_PREFIX}.settings.kmPerDayHint`, }); logger.debug('Настройки мира зарегистрированы'); } /** Настройки hexcrawl-слоя. */ export function readHexcrawlSettings(): HexcrawlSettings { const radius = Number(game.settings.get(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.sightRadius`)); const speed = Number(game.settings.get(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.kmPerDay`)); return { sightRadius: Number.isFinite(radius) ? radius : DEFAULT_HEXCRAWL.sightRadius, autoReveal: game.settings.get(MODULE_ID, `${HEXCRAWL_SETTING_KEY}.autoReveal`) === true, kmPerDay: speed > 0 ? speed : DEFAULT_HEXCRAWL.kmPerDay, }; } /** Текущие настройки дальней видимости с подстановкой умолчаний. */ export function readVisibilitySettings(host: SettingsHost): VisibilitySettings { const raw = host.get(VISIBILITY_SETTING_KEY) as Partial<VisibilitySettings> | undefined; return { ...DEFAULT_VISIBILITY, ...raw }; } export async function writeVisibilitySettings( host: SettingsHost, settings: VisibilitySettings, ): Promise<void> { await host.set(VISIBILITY_SETTING_KEY, settings); }