@kitten-science/kitten-scientists 2.0.0-beta.11-dev.20250520130803 → 2.0.0-beta.11-dev.20250520152327

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kitten-scientists-0.0.0-ci.min.user.js","sources":["../node_modules/@oliversalzburg/js-utils/errors/console.js","../node_modules/@oliversalzburg/js-utils/data/nil.js","../node_modules/@oliversalzburg/js-utils/errors/AbstractError.js","../node_modules/@oliversalzburg/js-utils/errors/InvalidOperationError.js","../node_modules/semver/internal/debug.js","../node_modules/semver/internal/constants.js","../node_modules/semver/internal/re.js","../node_modules/semver/internal/parse-options.js","../node_modules/semver/internal/identifiers.js","../node_modules/semver/classes/semver.js","../node_modules/semver/functions/compare.js","../node_modules/semver/functions/gt.js","../node_modules/@oliversalzburg/js-utils/errors/InternalError.js","../node_modules/@oliversalzburg/js-utils/errors/UnknownError.js","../node_modules/@oliversalzburg/js-utils/errors/error-serializer.js","../node_modules/@oliversalzburg/js-utils/measurement/performance.js","../node_modules/@oliversalzburg/js-utils/data/array.js","../source/tools/Log.ts","../source/tools/Entries.ts","../source/tools/Format.ts","../source/helper/BulkPurchaseHelper.ts","../source/types/index.ts","../source/settings/Settings.ts","../source/settings/BuildingUpgradeSettings.ts","../source/settings/BonfireSettings.ts","../source/TabManager.ts","../source/BonfireManager.ts","../source/helper/ActivitySummary.ts","../source/settings/ReligionSettings.ts","../source/ReligionManager.ts","../source/settings/PolicySettings.ts","../source/settings/TechSettings.ts","../source/settings/ScienceSettings.ts","../source/UpgradeManager.ts","../node_modules/@oliversalzburg/js-utils/async/async.js","../source/UserScriptLoader.ts","../source/ScienceManager.ts","../source/settings/MissionSettings.ts","../source/settings/SpaceSettings.ts","../source/SpaceManager.ts","../source/settings/LogFilterSettings.ts","../source/settings/UpgradeSettings.ts","../source/settings/WorkshopSettings.ts","../source/WorkshopManager.ts","../source/settings/ResourcesSettings.ts","../source/settings/StateSettings.ts","../source/settings/EngineSettings.ts","../source/settings/ResetBonfireSettings.ts","../source/settings/ResetReligionSettings.ts","../source/settings/ResetResourcesSettings.ts","../source/settings/ResetSpaceSettings.ts","../source/settings/ResetTimeSettings.ts","../source/settings/ResetUpgradeSettings.ts","../source/settings/ResetSettings.ts","../source/settings/TimeSkipHeatSettings.ts","../source/settings/TimeSkipSettings.ts","../source/settings/TimeControlSettings.ts","../source/settings/TimeSettings.ts","../source/settings/EmbassySettings.ts","../source/settings/TradeSettings.ts","../source/settings/ElectLeaderSettings.ts","../source/settings/VillageSettings.ts","../source/TimeControlManager.ts","../source/TimeManager.ts","../source/TradeManager.ts","../source/helper/MaterialsCache.ts","../source/VillageManager.ts","../source/Engine.ts","../node_modules/@oliversalzburg/js-utils/format/milliseconds.js","../source/images/Icons.ts","../source/ui/components/UiComponent.ts","../source/ui/components/Container.ts","../source/ui/components/ListItem.ts","../source/ui/components/LabelListItem.ts","../source/ui/components/SettingListItem.ts","../source/ui/components/IconButton.ts","../source/ui/components/SettingsList.ts","../source/ui/components/buttons/ExpandoButton.ts","../source/ui/components/CollapsiblePanel.ts","../source/ui/components/SettingsPanel.ts","../source/ui/BuildingUpgradeSettingsUi.ts","../source/ui/components/Button.ts","../source/ui/components/Delimiter.ts","../source/ui/components/HeaderListItem.ts","../source/ui/components/Input.ts","../source/ui/components/Paragraph.ts","../source/ui/components/Dialog.ts","../source/ui/components/buttons/MaxButton.ts","../source/ui/components/buttons/TriggerButton.ts","../source/ui/components/SettingMaxTriggerListItem.ts","../source/ui/BuildSectionTools.ts","../source/ui/components/SettingTriggerListItem.ts","../source/ui/BonfireSettingsUi.ts","../source/ui/EngineSettingsUi.ts","../source/ui/components/ButtonListItem.ts","../source/ui/components/Fieldset.ts","../source/ui/components/RadioItem.ts","../source/ui/components/OptionsListItem.ts","../source/ui/components/TextButton.ts","../source/ui/InternalsUi.ts","../source/ui/components/ExplainerListItem.ts","../source/ui/LogFilterSettingsUi.ts","../source/ui/ReligionSettingsUi.ts","../source/ui/components/buttons/ConsumeButton.ts","../source/ui/components/buttons/StockButton.ts","../source/ui/ResourcesSettingsUi.ts","../source/ui/PolicySettingsUi.ts","../source/ui/TechSettingsUi.ts","../source/ui/ScienceSettingsUi.ts","../source/ui/MissionSettingsUi.ts","../source/ui/SpaceSettingsUi.ts","../node_modules/@oliversalzburg/js-utils/errors/InvalidArgumentError.js","../node_modules/date-fns/constants.js","../node_modules/date-fns/constructFrom.js","../node_modules/date-fns/constructNow.js","../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/date-fns/locale/en-US.js","../node_modules/date-fns/_lib/defaultOptions.js","../node_modules/date-fns/toDate.js","../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/date-fns/_lib/normalizeDates.js","../node_modules/date-fns/compareAsc.js","../node_modules/date-fns/differenceInCalendarMonths.js","../node_modules/date-fns/endOfDay.js","../node_modules/date-fns/endOfMonth.js","../node_modules/date-fns/isLastDayOfMonth.js","../node_modules/date-fns/differenceInMonths.js","../node_modules/date-fns/_lib/getRoundingMethod.js","../node_modules/date-fns/differenceInMilliseconds.js","../node_modules/date-fns/differenceInSeconds.js","../node_modules/date-fns/formatDistance.js","../node_modules/date-fns/formatDistanceToNow.js","../node_modules/date-fns/startOfWeek.js","../node_modules/date-fns/isSameWeek.js","../node_modules/date-fns/locale/de/_lib/formatDistance.js","../node_modules/date-fns/locale/de/_lib/formatLong.js","../node_modules/date-fns/locale/de/_lib/formatRelative.js","../node_modules/date-fns/locale/de/_lib/localize.js","../node_modules/date-fns/locale/de/_lib/match.js","../node_modules/date-fns/locale/de.js","../node_modules/date-fns/locale/he/_lib/formatDistance.js","../node_modules/date-fns/locale/he/_lib/formatLong.js","../node_modules/date-fns/locale/he/_lib/formatRelative.js","../node_modules/date-fns/locale/he/_lib/localize.js","../node_modules/date-fns/locale/he/_lib/match.js","../node_modules/date-fns/locale/he.js","../node_modules/date-fns/locale/zh-CN/_lib/formatDistance.js","../node_modules/date-fns/locale/zh-CN/_lib/formatLong.js","../node_modules/date-fns/locale/zh-CN/_lib/formatRelative.js","../node_modules/date-fns/locale/zh-CN/_lib/localize.js","../node_modules/date-fns/locale/zh-CN/_lib/match.js","../node_modules/date-fns/locale/zh-CN.js","../source/tools/SavegameLoader.ts","../source/ui/components/ToolbarListItem.ts","../source/ui/StateManagementUi.ts","../source/ui/components/IconSettingsPanel.ts","../source/ui/ResetBonfireSettingsUi.ts","../source/ui/ResetReligionSettingsUi.ts","../source/ui/ResetResourcesSettingsUi.ts","../source/ui/ResetSpaceSettingsUi.ts","../source/ui/ResetTimeSettingsUi.ts","../source/ui/ResetUpgradesSettingsUi.ts","../source/ui/ResetSettingsUi.ts","../source/ui/components/CyclesList.ts","../source/ui/components/SeasonsList.ts","../source/ui/TimeSkipHeatSettingsUi.ts","../source/ui/TimeSkipSettingsUi.ts","../source/ui/TimeControlSettingsUi.ts","../source/ui/TimeSettingsUi.ts","../source/ui/components/buttons-text/BuyButton.ts","../source/ui/components/buttons-text/SellButton.ts","../source/ui/components/buttons/LimitedButton.ts","../source/ui/components/SettingLimitedListItem.ts","../source/ui/components/SettingLimitedTriggerListItem.ts","../source/ui/components/SettingMaxListItem.ts","../source/ui/EmbassySettingsUi.ts","../source/ui/TradeSettingsUi.ts","../source/ui/VillageSettingsUi.ts","../source/ui/components/WorkshopCraftListItem.ts","../source/ui/UpgradeSettingsUi.ts","../source/ui/WorkshopSettingsUi.ts","../source/ui/UserInterface.ts","../source/KittenScientists.ts","../source/entrypoint-userscript.ts"],"sourcesContent":["/**\n * Returns a function that will receive errors (or anything else that was `throw`n)\n * and prints it to a {@linkcode !console}.\n * @param console - The console to print errors to.\n * @returns A function that will print errors to the console.\n */\nexport const redirectErrorsToConsole = (console) => {\n const printErrorsToConsole = (error) => {\n console.error(error);\n };\n return printErrorsToConsole;\n};\n//# sourceMappingURL=console.js.map","/**\n * Check if something is nil.\n * Can be used as a typeguard.\n * @param subject - The subject that could be nil.\n * @typeParam TSubject - The type of the subject.\n * @returns `true` if the subject is nil, `false` otherwise.\n */\nexport function isNil(subject) {\n return subject === null || subject === undefined;\n}\n/**\n * Check if something is a concrete value of the given type.\n * Can be used as a typeguard.\n * @param subject - The subject that could be nil.\n * @param Prototype - The prototype to check against.\n * @typeParam TSubject - The type to check against.\n * @returns `true` if the input element matches the given type,\n * `false` otherwise.\n */\nexport function is(subject, Prototype) {\n return !isNil(subject) && subject instanceof Prototype;\n}\n/**\n * Thrown when an unexpected nil value was encountered.\n */\nexport class UnexpectedNilError extends Error {\n /**\n * Constructs a new {@linkcode UnexpectedNilError}.\n * @param message - The error message.\n */\n constructor(message = \"unexpected nil value\") {\n super(message);\n }\n}\n/**\n * Ensure that the passed subject is not nil; throw otherwise.\n * @param subject - A subject that is possibly nil.\n * @param errorMessage - An optional error message to throw when the subject is nil.\n * @typeParam TSubject - The type of the subject.\n * @returns The subject, if it isn't nil.\n * @throws {@linkcode UnexpectedNilError} When the subject is nil.\n */\nexport function mustExist(subject, errorMessage) {\n if (isNil(subject)) {\n throw new UnexpectedNilError(errorMessage);\n }\n return subject;\n}\n/**\n * Ensure that all passed subjects are not nil; throw otherwise.\n * @param subjects - The subjects that are possibly nil.\n * @param errorMessage - An optional error message to throw when a subject is nil.\n * @typeParam TSubject - The type a the subject.\n * @returns The subjects, if they aren't nil.\n * @throws {@linkcode UnexpectedNilError} When a subject is nil.\n */\nexport function mustExistAll(subjects, errorMessage) {\n for (const subject of subjects) {\n if (isNil(subject)) {\n throw new UnexpectedNilError(errorMessage);\n }\n }\n return subjects;\n}\n/**\n * Ensure that the passed subject is not nil; throw otherwise.\n * @param subject - A subject that is possibly nil.\n * @typeParam TSubject - The type of the subject.\n * @throws {@linkcode UnexpectedNilError} When the subject is nil.\n */\nexport function assertExists(subject) {\n if (isNil(subject)) {\n throw new UnexpectedNilError();\n }\n}\n/**\n * Ensure that the passed subjects are not nil; throw otherwise.\n * @param subjects - Subjects that are possibly nil.\n * @typeParam TSubject - The type of a subject.\n * @throws {@linkcode UnexpectedNilError} When a subject is nil.\n */\nexport function assertExistsAll(subjects) {\n for (const subject of subjects) {\n if (isNil(subject)) {\n throw new UnexpectedNilError();\n }\n }\n}\n/**\n * Convert a nilable into a real value, if it is nil.\n * @param nilable - The subject to convert to an optional.\n * @param to - The value to coalese to.\n * @returns The input value, if it wasn't nil, or the value to coalesce to.\n */\nexport function coalesce(nilable, to) {\n if (isNil(nilable)) {\n return to;\n }\n return nilable;\n}\n/**\n * Drop all nil values from an array, or replaces them with another value.\n * @param nilables - The subject to convert.\n * @param to - The value to coalese to.\n * @returns An array with where all values are not nil.\n */\nexport function coalesceArray(nilables, to) {\n const result = new Array();\n for (const nilable of nilables) {\n if (!isNil(nilable)) {\n result.push(nilable);\n }\n else if (!isNil(to)) {\n result.push(to);\n }\n }\n return result;\n}\n/**\n * Convert a nilable into an optional argument.\n * This means `null` is normalized to `undefined`.\n * @param nilable - The subject to convert to an optional.\n * @returns The value, normalized to `undefined`, if it was nil.\n */\nexport function toOptional(nilable) {\n if (isNil(nilable)) {\n return undefined;\n }\n return nilable;\n}\n//# sourceMappingURL=nil.js.map","/**\n * Base class for all errors.\n */\nexport class AbstractError extends Error {\n /**\n * The HTTP status code to associate with this error.\n */\n status;\n /**\n * An application-unique, readable error code.\n */\n code;\n /**\n * Constructs a new {@linkcode AbstractError}.\n * @param code - The main identification code for the error.\n * @param message - The main error message.\n * @param status - The HTTP status code to return.\n */\n constructor(code, message, status) {\n super(message);\n this.code = code;\n this.name = \"AbstractError\";\n this.status = status;\n if (typeof Error.captureStackTrace !== \"undefined\") {\n // Capture a new stacktrace, otherwise it will include our base-class constructor instead of the code\n // location we're actually interested in.\n Error.captureStackTrace(this, AbstractError);\n }\n }\n /**\n * Checks if an object is an instance of {@linkcode AbstractError}, or one of its subclasses.\n * @param error - The object to check.\n * @param allowForeignModule - Only check for similar looking error codes.\n * You're going to want to use this if you're dealing with a setup where\n * multiple versions of js-utils are loaded.\n * @returns `true` if the object is an {@linkcode AbstractError}, `false` otherwise.\n */\n static isAbstractError(error, allowForeignModule = true) {\n if (error instanceof AbstractError) {\n return true;\n }\n // When multiple versions of js-utils are loaded at runtime, the\n // prototypes of errors don't align. In that case, we just analyze the\n // error code.\n if (allowForeignModule) {\n const errorRecord = error;\n if (Object(error) === error &&\n \"code\" in errorRecord &&\n typeof errorRecord.code === \"string\") {\n const codedError = error;\n if (codedError.code.match(/^ERR_OS_/)) {\n return true;\n }\n }\n }\n return false;\n }\n}\n//# sourceMappingURL=AbstractError.js.map","import { AbstractError } from \"./AbstractError.js\";\n/**\n * Used when an operation was attempted that can not be completed in the current\n * context.\n */\nexport class InvalidOperationError extends AbstractError {\n /**\n * Constructs a new {@linkcode InvalidOperationError}.\n * @param message - The main error message.\n * @param status - The HTTP status code to return.\n */\n constructor(message, status = 400) {\n super(\"ERR_OS_INVALID_OPERATION\", message, status);\n this.name = \"InvalidOperationError\";\n if (typeof Error.captureStackTrace !== \"undefined\") {\n // Capture a new stacktrace, otherwise it will include our base-class\n // constructor instead of the code location we're actually interested in.\n Error.captureStackTrace(this, InvalidOperationError);\n }\n }\n}\n//# sourceMappingURL=InvalidOperationError.js.map","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","import { AbstractError } from \"./AbstractError.js\";\n/**\n * Used when an {@linkcode !Error}-like object was caught and converted into an\n * implementation of {@linkcode AbstractError} for further processing.\n */\nexport class InternalError extends AbstractError {\n /**\n * Constructs a new {@linkcode InternalError}.\n * @param message - The main error message.\n * @param status - The HTTP status code to return.\n */\n constructor(message, status = 500) {\n super(\"ERR_OS_INTERNAL\", message, status);\n this.name = \"InternalError\";\n if (typeof Error.captureStackTrace !== \"undefined\") {\n // Capture a new stacktrace, otherwise it will include our base-class\n // constructor instead of the code location we're actually interested in.\n Error.captureStackTrace(this, InternalError);\n }\n }\n /**\n * Converts an error into an {@linkcode InternalError}.\n * @param error - The error to convert.\n * @returns An {@linkcode InternalError} that represents the given error.\n */\n static fromError(error) {\n // Create a _real_ `InternalError` instance, which we will return later.\n const internalError = new InternalError(error.message);\n // Assign the error to it, to inherit all the fields in the error.\n // Then assign another `InternalError` to replace key fields, like:\n // name, code, status, ...\n Object.assign(internalError, error, new InternalError(error.message));\n // Inherit the original error stack again.\n internalError.stack = error.stack;\n return internalError;\n }\n}\n//# sourceMappingURL=InternalError.js.map","import { AbstractError } from \"./AbstractError.js\";\n/**\n * Used when an unknown, non-{@linkcode !Error}-like object was caught and converted into a\n * real {@linkcode !Error} instance.\n * Like when you catch a `throw \"boom\"`, we will convert the caught `\"boom\"`\n * into an {@linkcode UnknownError}.\n * To enrich an {@linkcode !Error}-like object that was caught, use the {@linkcode InternalError}.\n */\nexport class UnknownError extends AbstractError {\n /**\n * Constructs a new {@linkcode UnknownError}.\n * @param message - The main error message.\n * @param status - The HTTP status code to return.\n */\n constructor(message, status = 500) {\n super(\"ERR_OS_UNKNOWN\", message, status);\n this.name = \"UnknownError\";\n if (typeof Error.captureStackTrace !== \"undefined\") {\n // Capture a new stacktrace, otherwise it will include our base-class\n // constructor instead of the code location we're actually interested in.\n Error.captureStackTrace(this, UnknownError);\n }\n }\n}\n//# sourceMappingURL=UnknownError.js.map","import { isNil } from \"../data/nil.js\";\nimport { AbstractError } from \"./AbstractError.js\";\nimport { InternalError } from \"./InternalError.js\";\nimport { UnknownError } from \"./UnknownError.js\";\n/**\n * Determine if the given unknown subject is an {@linkcode !Error} instance.\n * @param subject - The object to inspect.\n * @returns `true` if the subject is an {@linkcode !Error}, `false` otherwise.\n */\nexport const isError = (subject) => {\n return subject instanceof Error || Object.prototype.toString.call(subject) === \"[object Error]\";\n};\n/**\n * Returns an {@linkcode AbstractError} that best represents the passed subject.\n * If the passed subject is already an {@linkcode AbstractError}, it is returned as-is.\n * Otherwise, it will be converted into an appropriate error type.\n * @param subject - The subject to inspect\n * @returns An {@linkcode AbstractError} instance.\n */\nexport const unknownToError = (subject) => {\n if (AbstractError.isAbstractError(subject)) {\n return subject;\n }\n if (isError(subject)) {\n return InternalError.fromError(subject);\n }\n return new UnknownError(String(subject));\n};\n/**\n * Serializes an error into a string.\n * @param error - The error to stringify.\n * @returns A string representing the error.\n */\nexport const errorToString = (error) => {\n return isNil(error.toString) ? Object.prototype.toString.call(error) : error.toString();\n};\n/**\n * Serializes an error into a JSON string.\n * @param error - The error to stringify.\n * @returns A JSON string representing the error.\n */\nexport const errorToJSON = (error) => {\n return JSON.stringify(error, Object.getOwnPropertyNames(error));\n};\n/**\n * Converts an error into a regular hash.\n * @param error - The error to convert.\n * @returns A new object that contains all the properties of the error.\n */\nexport const errorToRecord = (error) => {\n const record = {};\n for (const propertyName of Object.getOwnPropertyNames(error)) {\n record[propertyName] = error[propertyName];\n }\n return record;\n};\n/**\n * Serializes an error into a simpler shape.\n * @param error - The error to serialize.\n * @returns A simple representation of the error.\n */\nexport const errorToSimpleSerializable = (error) => {\n const serialized = {\n code: error.code,\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n return serialized;\n};\n//# sourceMappingURL=error-serializer.js.map","/**\n * Executes the given function and measures how long the execution takes.\n * @param context - The function of which the execution speed should be measured.\n * @returns A tuple with the result of the function, and the execution time in milliseconds.\n */\nexport const measure = (context) => {\n const entry = performance.now();\n return [context(), performance.now() - entry];\n};\n/**\n * Executes the given async function and measures how long the execution takes.\n * @param context - The async function of which the execution speed should be measured.\n * @returns A tuple with the result of the function, and the execution time in milliseconds.\n */\nexport const measureAsync = async (context) => {\n const entry = performance.now();\n return [await context(), performance.now() - entry];\n};\n//# sourceMappingURL=performance.js.map","import { is } from \"./nil.js\";\n/**\n * Places the items in the array in random order.\n * The array is shuffled in-place, no copy is created. The returned array is exactly the passed array.\n * @param array - The array to shuffle.\n * @typeParam TElements - The type of the elements in the array.\n * @returns The passed array in random order.\n */\nexport const shuffleArray = (array) => {\n for (let index = array.length - 1; index > 0; index--) {\n const targetIndex = Math.trunc(Math.random() * (index + 1));\n const temp = array[index];\n array[index] = array[targetIndex];\n array[targetIndex] = temp;\n }\n return array;\n};\n/**\n * Returns an array that holds all items that appear in both\n * passed arrays.\n * @param a - The first array.\n * @param b - The second array.\n * @typeParam TElements - The type of the elements in the array.\n * @returns A new array which holds the items that appear in\n * both passed arrays.\n */\nexport const intersect = (a, b) => {\n return a.filter(x => b.includes(x));\n};\n/**\n * Returns an array that holds all items that only appear in `a`.\n * @param a - The first array.\n * @param b - The second array.\n * @typeParam TElements - The type of the elements in the array.\n * @returns A new array which holds the items that ony appear in `a`.\n */\nexport const difference = (a, b) => {\n return a.filter(x => !b.includes(x));\n};\n/**\n * From an array with unknown contents, retrieve all the elements\n * that are of a certain type and return them as a new array.\n * @param array - The array to filter.\n * @param InstanceType - The type to search for.\n * @typeParam TElements - The type of the elements in the array.\n * @returns A new array with the filtered items.\n */\nexport const filterType = (array, InstanceType) => array.filter(element => is(element, InstanceType));\n/**\n * From an iterable with unknown contents, yield arrays that contain items from\n * the iterable up to a given limit.\n * @param iterable - The iterable to retrieve items from.\n * @param limit - The amount of items in each chunk.\n * @typeParam TElements - The type of the elements in the iterable.\n * @yields Chunks from the provided iterable.\n */\nexport const chunkify = function* (iterable, limit) {\n let chunk = [];\n for (const element of iterable) {\n chunk.push(element);\n if (chunk.length === limit) {\n yield chunk;\n chunk = [];\n }\n }\n if (chunk.length) {\n yield chunk;\n }\n};\n//# sourceMappingURL=array.js.map","import { is, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\n\nexport const cl = <T extends Array<unknown>>(...args: T): Array<string | T[number]> => [\n \"👩‍🔬\",\n ...args\n .filter(arg => arg !== \"\")\n .flatMap((maybeError: Maybe<Error> | unknown) => {\n if (is(maybeError, Error)) {\n const error = maybeError;\n return [error.name, error.message, error.stack];\n }\n return maybeError;\n }),\n];\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { cl } from \"./Log.js\";\n\nexport const deepMergeLeft = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n): Record<string, unknown> => {\n const subject: Record<string, unknown> = { ...a };\n for (const [key, value] of Object.entries(b)) {\n if (typeof value === \"object\") {\n subject[key] = deepMergeLeft(\n // @ts-expect-error This is just naughty business.\n key in a ? a[key] : {},\n b[key],\n );\n continue;\n }\n subject[key] = b[key] ?? a[key];\n }\n return subject;\n};\n\n/**\n * Provides type-safe means to iterate over the entries\n * in a partially filled structure with typed keys.\n *\n * @param subject Some object.\n * @returns An array of key-value tuples.\n */\nexport function objectEntries<TKeys extends string, TValues>(\n subject: Partial<Record<TKeys, TValues>>,\n): Array<[TKeys, TValues]> {\n return Object.entries(subject) as Array<[TKeys, TValues]>;\n}\n\n/**\n * Given a `subject` object schema, consume all known values from the\n * `source` into the schema object.\n *\n * @param subject An object that should consume values from the source.\n * @param source An object that is similar to the `subject` from which to copy values.\n * @param consumer A function that receives each `subject` and `source` value pair.\n * @returns The `subject` after processing.\n */\nexport function consumeEntries<TKeys extends string, TValues>(\n subject: Partial<Record<TKeys, TValues>>,\n source: Partial<Record<TKeys, TValues>> | undefined,\n consumer: (subjectKey: TValues, sourceKey: TValues | undefined) => unknown,\n): Partial<Record<TKeys, TValues>> {\n if (isNil(source)) {\n return subject;\n }\n\n for (const [key, value] of objectEntries(subject)) {\n consumer(value, source[key]);\n }\n return subject;\n}\n\n/**\n * Given a `subject` object schema, consume all known values from the\n * `source` into the schema object.\n *\n * Additionally, log a message when the `source` was missing a value expected\n * by the `subject` schema and log a warning when the `source` supplied a\n * value that was not expected by the `subject` schema.\n *\n * @param subject An object that should consume values from the source.\n * @param source An object that is similar to the `subject` from which to copy values.\n * @param consumer A function that receives each `subject` and `source` value pair.\n * @returns The `subject` after processing.\n */\nexport function consumeEntriesPedantic<TKeys extends string, TValues>(\n subject: Partial<Record<TKeys, TValues>>,\n source: Partial<Record<TKeys, TValues>> | undefined,\n consumer: (subjectKey: TValues, sourceKey: TValues | undefined) => unknown,\n): Partial<Record<TKeys, TValues>> {\n if (isNil(source)) {\n console.warn(...cl(\"No source data was provided.\"));\n return subject;\n }\n\n for (const [key, value] of objectEntries(subject)) {\n if (!(key in source)) {\n console.info(...cl(`Entry '${key}' is missing in source. Using default value.`));\n }\n consumer(value, source[key]);\n }\n\n for (const [key] of objectEntries(source)) {\n if (!(key in subject)) {\n console.warn(\n ...cl(\n `Entry '${key}' was found in source, but it is not expected by the subject schema. This entry will be ignored.`,\n ),\n );\n }\n }\n return subject;\n}\n\n/**\n * Unique wraps an object to prevent accidental sharing of references by\n * returning cloned versions instead.\n */\nexport class Unique<T> {\n private _elem: T;\n\n constructor(elem: T) {\n this._elem = structuredClone(elem);\n }\n\n unwrap() {\n return structuredClone(this._elem);\n }\n\n replace(elem: T) {\n this._elem = structuredClone(elem);\n }\n\n toJSON() {\n return this.unwrap();\n }\n}\n","/**\n * Returns the given string with the first letter in upper case.\n *\n * @param input The string to convert.\n */\nexport function ucfirst(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n * Rounds the given number to two decimals.\n *\n * @param input The number to round.\n */\nexport function roundToTwo(input: number): number {\n return Math.round(input * 100) / 100;\n}\n\nexport function negativeOneToInfinity(value: number): number {\n return value === -1 ? Number.POSITIVE_INFINITY : value;\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { Engine } from \"../Engine.js\";\nimport type { KittenScientists } from \"../KittenScientists.js\";\nimport type { BonfireItem } from \"../settings/BonfireSettings.js\";\nimport { objectEntries } from \"../tools/Entries.js\";\nimport { negativeOneToInfinity } from \"../tools/Format.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type {\n UnsafeBuilding,\n UnsafeStagingBldButtonOptions,\n UnsafeUnstagedBuildingButtonOptions,\n} from \"../types/buildings.js\";\nimport type {\n BuildingStackableBtnController,\n UnsafeBuildingBtnModernModel,\n UnsafeBuildingStackableBtnModel,\n} from \"../types/core.js\";\nimport type {\n AllBuildings,\n Building,\n Price,\n Resource,\n TabId,\n TimeItemVariant,\n UnicornItemVariant,\n Unlocks,\n} from \"../types/index.js\";\nimport type {\n UnsafeReligionBtnModel,\n UnsafeReligionButtonOptions,\n UnsafeReligionUpgrade,\n UnsafeTranscendenceBtnModel,\n UnsafeTranscendenceButtonOptions,\n UnsafeTranscendenceUpgrade,\n UnsafeZigguratBtnModel,\n UnsafeZigguratButtonOptions,\n UnsafeZigguratUpgrade,\n} from \"../types/religion.js\";\nimport type {\n UnsafePlanetBuildingButtonOptions,\n UnsafeSpaceBuilding,\n UnsafeSpaceProgramButtonOptions,\n} from \"../types/space.js\";\nimport type {\n UnsafeChronoForgeUpgrade,\n UnsafeChronoforgeUpgradeButtonOptions,\n UnsafeVoidSpaceUpgrade,\n UnsafeVoidSpaceUpgradeButtonOptions,\n} from \"../types/time.js\";\nimport type { WorkshopManager } from \"../WorkshopManager.js\";\n\nexport type BulkBuildListItem = {\n count: number;\n id: AllBuildings;\n label?: string;\n name?: AllBuildings;\n stage?: number;\n variant?: TimeItemVariant | UnicornItemVariant;\n};\n\ntype BuildRequest = {\n id: AllBuildings;\n prices: Array<Price>;\n priceRatio: number;\n source: TabId;\n limit: number;\n val: number;\n};\n\ntype PotentialBuild = {\n id: AllBuildings;\n label?: string;\n name?: AllBuildings;\n spot: number;\n count: number;\n prices: Array<Price>;\n priceRatio: number;\n source: TabId;\n limit: number;\n val: number;\n variant?: TimeItemVariant | UnicornItemVariant;\n};\n\nexport class BulkPurchaseHelper {\n private readonly _host: KittenScientists;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(host: KittenScientists, workshopManager: WorkshopManager) {\n this._host = host;\n this._workshopManager = workshopManager;\n }\n\n /**\n * Take a hash of potential builds and determine how many of them can be built.\n *\n * @param builds - All potential builds.\n * @param metaData - The metadata for the potential builds.\n * @param sectionTrigger - The configured trigger threshold for the section of these builds.\n * @param sourceTab - The tab these builds originate from.\n * @returns All the possible builds.\n */\n bulk(\n builds: Partial<\n Record<\n AllBuildings,\n {\n enabled: boolean;\n label?: string;\n max?: number;\n baseBuilding?: Building;\n building?: AllBuildings | BonfireItem;\n stage?: number;\n trigger: number;\n variant?: TimeItemVariant | UnicornItemVariant;\n }\n >\n >,\n metaData: Partial<\n Record<\n AllBuildings,\n Required<\n | UnsafeBuilding\n | UnsafeChronoForgeUpgrade\n | UnsafeReligionUpgrade\n | UnsafeSpaceBuilding\n | UnsafeTranscendenceUpgrade\n | UnsafeVoidSpaceUpgrade\n | UnsafeZigguratUpgrade\n >\n >\n >,\n sectionTrigger: number,\n sourceTab: TabId,\n ): Array<BulkBuildListItem> {\n const potentialBuilds: Array<PotentialBuild> = [];\n\n // How many builds are on the list.\n let counter = 0;\n\n for (const [name, build] of objectEntries(builds)) {\n const trigger = Engine.evaluateSubSectionTrigger(sectionTrigger, build.trigger);\n const buildMetaData = mustExist(metaData[name]);\n\n // If the build is disabled, skip it.\n if (!build.enabled || trigger < 0) {\n continue;\n }\n\n // tHidden is a flag that is manually set to exclude time buildings from the process.\n if (\"tHidden\" in buildMetaData && buildMetaData.tHidden === true) {\n continue;\n }\n // rHidden is a flag that is manually set to exclude religion buildings from the process.\n if (\"rHidden\" in buildMetaData && buildMetaData.rHidden === true) {\n continue;\n }\n // If the building isn't unlocked, skip it.\n if (buildMetaData.unlocked === false) {\n continue;\n }\n\n // If the max allowed buildings have already been built, there is no need to check them.\n if (!isNil(build.max) && -1 < build.max && build.max <= buildMetaData.val) {\n continue;\n }\n\n // For cryochambers, if there are used cryochambers, don't build new ones.\n // Also, don't build more cryochambers than you have chronospheres, as they'll stay unused.\n if (\n name === \"cryochambers\" &&\n (mustExist(this._host.game.time.getVSU(\"usedCryochambers\")).val > 0 ||\n this._host.game.bld.getBuildingExt(\"chronosphere\").meta.val <= buildMetaData.val)\n ) {\n continue;\n }\n\n // TODO: This should be generalized to match all builds that have a `limitBuild` property.\n if (name === \"ressourceRetrieval\" && buildMetaData.val >= 100) {\n continue;\n }\n\n // Get the prices and the price ratio of this build.\n const prices = mustExist(\n this._isStagedBuild(buildMetaData)\n ? buildMetaData.stages[buildMetaData.stage].prices\n : buildMetaData.prices,\n );\n const priceRatio = this.getPriceRatio(buildMetaData, sourceTab);\n\n // Check if we can build this item.\n if (!this.singleBuildPossible(buildMetaData, prices, priceRatio, sourceTab)) {\n continue;\n }\n\n // Check the requirements for this build.\n // We want a list of all resources that are required for this build, which have a capacity.\n const requiredMaterials = prices\n .map(price => this._workshopManager.getResource(price.name))\n .filter(material => 0 < material.maxValue);\n const allMaterialsAboveTrigger =\n requiredMaterials.filter(material => material.value / material.maxValue < trigger)\n .length === 0;\n\n if (allMaterialsAboveTrigger) {\n // If the build is for a stage that the building isn't currently at, skip it.\n if (\n this._isStagedBuild(buildMetaData) &&\n typeof build.stage !== \"undefined\" &&\n build.stage !== buildMetaData.stage\n ) {\n continue;\n }\n\n const itemPrices = [];\n\n // Get cost reduction modifier.\n const pricesDiscount = this._host.game.getLimitedDR(\n this._host.game.getEffect(`${name}CostReduction` as const),\n 1,\n );\n const priceModifier = 1 - pricesDiscount;\n\n // Determine the actual prices for this building.\n for (const price of prices) {\n const resPriceDiscount = this._host.game.getLimitedDR(\n this._host.game.getEffect(`${price.name}CostReduction` as const),\n 1,\n );\n const resPriceModifier = 1 - resPriceDiscount;\n itemPrices.push({\n name: price.name,\n val: price.val * priceModifier * resPriceModifier,\n });\n }\n\n // Create an entry in the cache list for the bulk processing.\n potentialBuilds.push({\n count: 0,\n id: name,\n label: build.label,\n limit: build.max || 0,\n name: (build.baseBuilding ?? build.building) as Building,\n priceRatio: priceRatio,\n prices: itemPrices,\n source: sourceTab,\n spot: counter,\n val: buildMetaData.val,\n variant: build.variant,\n });\n\n counter++;\n }\n }\n\n if (potentialBuilds.length === 0) {\n return [];\n }\n\n // Create a copy of the currently available resources.\n // We need a copy, because `_getPossibleBuildCount` modifies this data.\n const currentResourcePool: Record<Resource, number> = {} as Record<Resource, number>;\n for (const res of this._host.game.resPool.resources) {\n currentResourcePool[res.name] = this._workshopManager.getValueAvailable(res.name);\n }\n\n let iterations = 0;\n const buildsCommitted = new Array<PotentialBuild>();\n while (iterations < 1e5) {\n const candidatesThisIteration = difference(potentialBuilds, buildsCommitted);\n\n let buildThisIteration = 0;\n const committedThisIteration = [];\n let tempPool = { ...currentResourcePool };\n // Pay already committed builds from the temp pool.\n for (const committedBuild of buildsCommitted) {\n const possibleInstances = this._precalculateBuilds(\n {\n ...committedBuild,\n limit: committedBuild.val + committedBuild.count,\n },\n metaData,\n tempPool,\n );\n tempPool = possibleInstances.remainingResources;\n }\n\n // Now see what we can do with the rest of the pool.\n for (const potentialBuild of candidatesThisIteration) {\n const targetInstanceCount = potentialBuild.count + 1;\n const possibleInstances = this._precalculateBuilds(\n {\n ...potentialBuild,\n limit: Math.min(\n negativeOneToInfinity(potentialBuild.limit),\n potentialBuild.val + targetInstanceCount,\n ),\n },\n metaData,\n tempPool,\n );\n\n if (possibleInstances.count < targetInstanceCount) {\n committedThisIteration.push(potentialBuild);\n continue;\n }\n\n potentialBuild.count = targetInstanceCount;\n tempPool = possibleInstances.remainingResources;\n\n buildThisIteration++;\n }\n\n buildsCommitted.push(...committedThisIteration);\n\n iterations++;\n\n if (buildThisIteration === 0) {\n break;\n }\n }\n\n console.debug(...cl(`Took '${iterations}' iterations to evaluate bulk build request.`));\n\n return buildsCommitted;\n }\n\n /**\n * Calculate how many of a given build item build be built with the given resources.\n *\n * @param buildCacheItem The item to build.\n * @param buildCacheItem.id ?\n * @param buildCacheItem.name ?\n * @param buildCacheItem.count ?\n * @param buildCacheItem.spot ?\n * @param buildCacheItem.prices ?\n * @param buildCacheItem.priceRatio ?\n * @param buildCacheItem.source ?\n * @param buildCacheItem.limit ?\n * @param buildCacheItem.val ?\n * @param metaData The metadata for the potential builds.\n * @param resources The currently available resources.\n * @returns The number of items that could be built. If this is non-zero, the `resources` will have been adjusted\n * to reflect the number of builds made.\n */\n private _precalculateBuilds(\n buildCacheItem: BuildRequest,\n metaData: Partial<\n Record<\n AllBuildings,\n Required<\n | UnsafeBuilding\n | UnsafeChronoForgeUpgrade\n | UnsafeReligionUpgrade\n | UnsafeSpaceBuilding\n | UnsafeTranscendenceUpgrade\n | UnsafeVoidSpaceUpgrade\n | UnsafeZigguratUpgrade\n >\n >\n >,\n resources: Record<Resource, number> = {} as Record<Resource, number>,\n ): {\n count: number;\n remainingResources: Record<Resource, number>;\n } {\n let buildsPossible = 0;\n\n const tempPool = Object.assign({}, resources);\n\n // The KG metadata associated with the build.\n const buildMetaData = mustExist(metaData[buildCacheItem.id]);\n const prices = buildCacheItem.prices;\n const priceRatio = buildCacheItem.priceRatio;\n const source = buildCacheItem.source;\n let maxItemsBuilt = false;\n\n if (prices.length === 0) {\n return { count: 0, remainingResources: tempPool };\n }\n\n // There is actually no strong guarantee that `maxItemsBuilt` changes in the loops below.\n // This could end up being an infinite loop under unexpected conditions.\n while (!maxItemsBuilt) {\n // Go through the prices for this build.\n for (let priceIndex = 0; priceIndex < prices.length; priceIndex++) {\n // Is this an oil cost for a build on the space tab?\n let spaceOil = false;\n // Is this a karma cost for building cryochambers?\n let cryoKarma = false;\n // The actual, discounted oil price for the build.\n let oilPrice = Number.POSITIVE_INFINITY;\n // The actual, discounted karma price for the build.\n let karmaPrice = Number.POSITIVE_INFINITY;\n\n // Determine the new state of the flags above.\n if (source === \"Space\" && prices[priceIndex].name === \"oil\") {\n spaceOil = true;\n\n const oilReductionRatio = this._host.game.getEffect(\"oilReductionRatio\");\n oilPrice =\n prices[priceIndex].val * (1 - this._host.game.getLimitedDR(oilReductionRatio, 0.75));\n } else if (buildCacheItem.id === \"cryochambers\" && prices[priceIndex].name === \"karma\") {\n cryoKarma = true;\n\n const burnedParagonRatio = this._host.game.prestige.getBurnedParagonRatio();\n karmaPrice =\n prices[priceIndex].val *\n (1 - this._host.game.getLimitedDR(0.01 * burnedParagonRatio, 1.0));\n }\n\n if (spaceOil) {\n maxItemsBuilt = tempPool.oil < oilPrice * 1.05 ** (buildsPossible + buildMetaData.val);\n } else if (cryoKarma) {\n maxItemsBuilt =\n tempPool.karma < karmaPrice * priceRatio ** (buildsPossible + buildMetaData.val);\n } else {\n maxItemsBuilt =\n tempPool[prices[priceIndex].name] <\n prices[priceIndex].val * priceRatio ** (buildsPossible + buildMetaData.val);\n }\n\n // Check if any special builds have reached their reasonable limit of units to build.\n // In which case we update our temporary resources cache. Not sure why.\n if (\n maxItemsBuilt ||\n // Is this a non-stackable build?\n // Space missions and religion upgrades (before transcendence is unlocked)\n // are example of non-stackable builds.\n (\"noStackable\" in buildMetaData &&\n buildMetaData.noStackable &&\n buildsPossible + buildMetaData.val >= 1) ||\n // Is this the resource retrieval build? This one is limited to 100 units.\n (buildCacheItem.id === \"ressourceRetrieval\" &&\n buildsPossible + buildMetaData.val >= 100) ||\n (buildCacheItem.id === \"cryochambers\" &&\n this._host.game.bld.getBuildingExt(\"chronosphere\").meta.val <=\n buildsPossible + buildMetaData.val)\n ) {\n // Go through all prices that we have already checked.\n for (let priceIndex2 = 0; priceIndex2 < priceIndex; priceIndex2++) {\n // TODO: This seems to just be `spaceOil`.\n // TODO: A lot of this code seems to be a duplication from a few lines above.\n if (source === \"Space\" && prices[priceIndex2].name === \"oil\") {\n const oilReductionRatio = this._host.game.getEffect(\"oilReductionRatio\");\n const oilPriceRefund =\n prices[priceIndex2].val *\n (1 - this._host.game.getLimitedDR(oilReductionRatio, 0.75));\n\n tempPool.oil += oilPriceRefund * 1.05 ** (buildsPossible + buildMetaData.val);\n\n // TODO: This seems to just be `cryoKarma`.\n } else if (\n buildCacheItem.id === \"cryochambers\" &&\n prices[priceIndex2].name === \"karma\"\n ) {\n const burnedParagonRatio = this._host.game.prestige.getBurnedParagonRatio();\n const karmaPriceRefund =\n prices[priceIndex2].val *\n (1 - this._host.game.getLimitedDR(0.01 * burnedParagonRatio, 1.0));\n\n tempPool.karma +=\n karmaPriceRefund * priceRatio ** (buildsPossible + buildMetaData.val);\n } else {\n const refundVal =\n prices[priceIndex2].val * priceRatio ** (buildsPossible + buildMetaData.val);\n tempPool[prices[priceIndex2].name] +=\n prices[priceIndex2].name === \"void\" ? Math.ceil(refundVal) : refundVal;\n }\n }\n\n // Is this a limited build? If so, don't build more than the limit.\n if (buildCacheItem.limit && buildCacheItem.limit !== -1) {\n buildsPossible = Math.max(\n 0,\n Math.min(buildsPossible, buildCacheItem.limit - buildCacheItem.val),\n );\n }\n\n return { count: buildsPossible, remainingResources: tempPool };\n }\n\n // Deduct the cost of this price from the temporary resource cache.\n if (spaceOil) {\n tempPool.oil -= oilPrice * 1.05 ** (buildsPossible + buildMetaData.val);\n } else if (cryoKarma) {\n tempPool.karma -= karmaPrice * priceRatio ** (buildsPossible + buildMetaData.val);\n } else {\n const newPriceValue =\n prices[priceIndex].val * priceRatio ** (buildsPossible + buildMetaData.val);\n tempPool[prices[priceIndex].name] -=\n prices[priceIndex].name === \"void\" ? Math.ceil(newPriceValue) : newPriceValue;\n }\n\n // Check the next price...\n }\n\n ++buildsPossible;\n }\n\n return { count: buildsPossible, remainingResources: tempPool };\n }\n\n /**\n * Try to trigger the build for a given button.\n *\n * @param model The model associated with the button.\n * @param button The build button.\n * @param amount How many items to build.\n * @returns How many items were built.\n */\n construct<\n TModel extends\n | UnsafeBuildingBtnModernModel<UnsafeStagingBldButtonOptions>\n | UnsafeBuildingBtnModernModel<UnsafeUnstagedBuildingButtonOptions>\n | UnsafeBuildingStackableBtnModel<UnsafeChronoforgeUpgradeButtonOptions>\n | UnsafeBuildingStackableBtnModel<UnsafePlanetBuildingButtonOptions>\n | UnsafeBuildingStackableBtnModel<UnsafeSpaceProgramButtonOptions>\n | UnsafeBuildingStackableBtnModel<UnsafeVoidSpaceUpgradeButtonOptions>\n | UnsafeReligionBtnModel<UnsafeReligionButtonOptions>\n | UnsafeTranscendenceBtnModel<UnsafeTranscendenceButtonOptions>\n | UnsafeZigguratBtnModel<UnsafeZigguratButtonOptions>,\n TController extends BuildingStackableBtnController<TModel>,\n >(model: TModel, controller: TController, amount: number): number {\n if (\"name\" in model === false) {\n return 0;\n }\n if (\"controller\" in model.options === false) {\n return 0;\n }\n if (\"getMetadata\" in model.options.controller === false) {\n return 0;\n }\n\n const meta = model.metadata;\n let counter = 0;\n let amountCalculated = amount;\n\n // For limited builds, only construct up to the max.\n const vsMeta = meta as Required<UnsafeVoidSpaceUpgrade>;\n if (!isNil(vsMeta.limitBuild) && vsMeta.limitBuild - vsMeta.val < amountCalculated) {\n amountCalculated = vsMeta.limitBuild - vsMeta.val;\n }\n\n if ((model.enabled && controller.hasResources(model)) || this._host.game.devMode) {\n while (controller.hasResources(model) && amountCalculated > 0) {\n model.prices = controller.getPrices(model);\n controller.payPrice(model);\n controller.incrementValue(model);\n counter++;\n amountCalculated--;\n }\n if (vsMeta.breakIronWill) {\n this._host.game.ironWill = false;\n }\n if (!isNil(meta)) {\n if (\"unlocks\" in meta && !isNil(meta.unlocks)) {\n this._host.game.unlock(meta.unlocks as Partial<Unlocks>);\n }\n if (\"upgrades\" in meta && !isNil(meta.upgrades)) {\n this._host.game.upgrade(meta.upgrades as Partial<Unlocks>);\n }\n }\n }\n return counter;\n }\n\n private _isStagedBuild(\n // biome-ignore lint/suspicious/noExplicitAny: This is currently too hard to work around.\n data: any,\n ): data is {\n stage: number;\n stages: Array<{\n priceRatio: number;\n prices?: Array<Price>;\n }>;\n } {\n return \"stage\" in data && \"stages\" in data && !isNil(data.stage) && !isNil(data.stages);\n }\n\n /**\n * Determine the price modifier for the given building.\n *\n * @param data The building metadata.\n * @param source The tab the building belongs to.\n * @returns The price modifier for this building.\n * @see `getPriceRatioWithAccessor`@`buildings.js`\n */\n getPriceRatio(\n data:\n | UnsafeBuilding\n | UnsafeChronoForgeUpgrade\n | UnsafeReligionUpgrade\n | UnsafeSpaceBuilding\n | UnsafeTranscendenceUpgrade\n | UnsafeVoidSpaceUpgrade\n | UnsafeZigguratUpgrade,\n source?: TabId,\n ): number {\n // If the building has stages, use the ratio for the current stage.\n const ratio =\n // TODO: This seems weird. Why not take the price ratio of the stage as the default?\n this._isStagedBuild(data)\n ? data.priceRatio || data.stages[data.stage].priceRatio\n : (data.priceRatio ?? 0);\n\n let ratioDiff = 0;\n if (source && source === \"Bonfire\") {\n ratioDiff =\n this._host.game.getEffect(`${data.name}PriceRatio` as const) +\n this._host.game.getEffect(\"priceRatio\") +\n this._host.game.getEffect(\"mapPriceReduction\");\n\n ratioDiff = this._host.game.getLimitedDR(ratioDiff, ratio - 1);\n }\n\n return ratio + ratioDiff;\n }\n\n /**\n * Check if a given build could be performed.\n *\n * @param build The build that should be checked.\n * @param build.name The name of the build.\n * @param build.val Probably how many items should be built in total.\n * TODO: Why is this relevant if we only care about a single build being possible?\n * @param prices The current prices for the build.\n * @param priceRatio The global price ratio modifier.\n * @param source What tab did the build originate from?\n * @returns `true` if the build is possible; `false` otherwise.\n */\n singleBuildPossible(\n build: { name: AllBuildings; val: number },\n prices: Array<Price>,\n priceRatio: number,\n source?: TabId,\n ): boolean {\n // Determine price reduction on this build.\n const pricesDiscount = this._host.game.getLimitedDR(\n this._host.game.getEffect(`${build.name}CostReduction` as const),\n 1,\n );\n const priceModifier = 1 - pricesDiscount;\n\n // Check if we can't afford any of the prices for this build.\n // Return `false` if we can't afford something, otherwise `true` is\n // returned by default.\n for (const price of prices) {\n const resourcePriceDiscount = this._host.game.getLimitedDR(\n this._host.game.getEffect(`${price.name}CostReduction` as const),\n 1,\n );\n const resourcePriceModifier = 1 - resourcePriceDiscount;\n const finalResourcePrice = price.val * priceModifier * resourcePriceModifier;\n\n // For space builds that consume oil, take the oil price reduction into account.\n // This is caused by space elevators.\n if (source && source === \"Space\" && price.name === \"oil\") {\n const oilModifier = this._host.game.getLimitedDR(\n this._host.game.getEffect(\"oilReductionRatio\"),\n 0.75,\n );\n const oilPrice = finalResourcePrice * (1 - oilModifier);\n if (this._workshopManager.getValueAvailable(\"oil\") < oilPrice * 1.05 ** build.val) {\n return false;\n }\n\n // For cryochambers, take burned paragon into account for the karma cost.\n } else if (build.name === \"cryochambers\" && price.name === \"karma\") {\n const karmaModifier = this._host.game.getLimitedDR(\n 0.01 * this._host.game.prestige.getBurnedParagonRatio(),\n 1.0,\n );\n const karmaPrice = finalResourcePrice * (1 - karmaModifier);\n if (\n this._workshopManager.getValueAvailable(\"karma\") <\n karmaPrice * priceRatio ** build.val\n ) {\n return false;\n }\n } else {\n if (\n this._workshopManager.getValueAvailable(price.name) <\n finalResourcePrice * priceRatio ** build.val\n ) {\n return false;\n }\n }\n }\n\n // We can afford this build.\n return true;\n }\n}\n","import type { Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type JQuery from \"jquery\";\nimport \"dojo\";\nimport type { KittenScientists } from \"../KittenScientists.js\";\nimport type { Achievements, AchievementsPanel, AchTab, BadgesPanel } from \"./achievements.js\";\nimport type {\n BuildingBtnModernController,\n BuildingMeta,\n BuildingsManager,\n BuildingsModern,\n GatherCatnipButtonController,\n Metadata,\n RefineCatnipButton,\n RefineCatnipButtonController,\n StagingBldBtn,\n StagingBldBtnController,\n UnsafeBuilding,\n} from \"./buildings.js\";\nimport type { Calendar, Event } from \"./calendar.js\";\nimport type {\n ChallengeBtnController,\n ChallengeEffectsPanel,\n ChallengePanel,\n ChallengesManager,\n ChallengesTab,\n ReserveMan,\n ReservesPanel,\n UnsafeChallenge,\n} from \"./challenges.js\";\nimport type { KGConfig } from \"./config.js\";\nimport type {\n AllBuildingBtnOptions,\n AllBuildingResearchBtnOptions,\n AllBuildingStackableBtnOptions,\n AllButtonModernOptions,\n AllButtonOptions,\n BuildingBtn,\n BuildingBtnController,\n BuildingNotStackableBtnController,\n BuildingResearchBtn,\n BuildingStackableBtn,\n BuildingStackableBtnController,\n Button,\n ButtonController,\n ButtonModern,\n ButtonModernController,\n Console,\n ContentRowRenderer,\n Control,\n IChildrenAware,\n IGameAware,\n Panel,\n Spacer,\n Tab,\n TabManager,\n UnsafeBuildingBtnModel,\n} from \"./core.js\";\nimport type {\n AutoPinnedButton,\n AutoPinnedButtonController,\n CrashBcoinButtonController,\n Diplomacy,\n DiplomacyManager,\n EldersPanel,\n EmbassyButton,\n EmbassyButtonController,\n RacePanel,\n SendExplorersButton,\n SendExplorersButtonController,\n TradeButton,\n TradeButtonController,\n} from \"./diplomacy.js\";\nimport type {\n EffectsManager,\n GamePage,\n IDataStorageAware,\n Server,\n Telemetry,\n Timer,\n UndoChange,\n} from \"./game.js\";\nimport type { Math as KGMath } from \"./math.js\";\nimport type {\n BurnParagonBtnController,\n PrestigeBtnController,\n PrestigeManager,\n PrestigePanel,\n TurnHGOffButtonController,\n UnsafePerk,\n} from \"./prestige.js\";\nimport type {\n AllMultiLinkBtnOptions,\n CryptotheologyPanel,\n CryptotheologyWGT,\n MultiLinkBtn,\n PactsBtnController,\n PactsManager,\n PactsPanel,\n PactsWGT,\n PraiseBtnController,\n RefineBtn,\n RefineTearsBtnController,\n ReligionBtnController,\n ReligionManager,\n ReligionTab,\n ResetFaithBtnController,\n TranscendBtnController,\n TranscendenceBtnController,\n TransformBtnController,\n UnsafePact,\n UnsafeReligionUpgrade,\n UnsafeTranscendenceUpgrade,\n UnsafeZigguratUpgrade,\n ZigguratBtnController,\n} from \"./religion.js\";\nimport type { ResourceManager } from \"./resources.js\";\nimport type {\n Library,\n PolicyBtnController,\n PolicyPanel,\n ScienceManager,\n TechButtonController,\n UnsafePolicy,\n UnsafeTech,\n} from \"./science.js\";\nimport type {\n FurthestRingPanel,\n PlanetBuildingBtnController,\n PlanetPanel,\n SpaceManager,\n SpaceProgramBtnController,\n SpaceTab,\n UnsafePlanet,\n UnsafeSpaceBuilding,\n} from \"./space.js\";\nimport type { StatsManager, StatsTab } from \"./stats.js\";\nimport type {\n AccelerateTimeBtn,\n AccelerateTimeBtnController,\n ChronoforgeBtnController,\n ChronoforgeWgt,\n FixCryochamberBtnController,\n Manager,\n QueueTab,\n ResetWgt,\n ShatterTCBtn,\n ShatterTCBtnController,\n TimeControlWgt,\n TimeManager,\n TimeTab,\n UnsafeChronoForgeUpgrade,\n UnsafeVoidSpaceUpgrade,\n VoidSpaceBtnController,\n VoidSpaceWgt,\n} from \"./time.js\";\nimport type {\n Toolbar,\n ToolbarEnergy,\n ToolbarHappiness,\n ToolbarIcon,\n ToolbarMOTD,\n} from \"./toolbar.js\";\nimport type { DesktopUI, IReactAware, UISystem } from \"./ui.js\";\nimport type {\n BiomeBtn,\n BiomeBtnController,\n Census,\n CensusPanel,\n FestivalButton,\n FestivalButtonController,\n JobButton,\n JobButtonController,\n Kitten,\n KittenSim,\n Loadout,\n LoadoutButton,\n LoadoutButtonController,\n LoadoutController,\n MapOverviewWgt,\n UnsafeBiome,\n UnsafeJob,\n UpgradeExplorersController,\n UpgradeHQController,\n Village,\n VillageButtonController,\n VillageManager,\n} from \"./village.js\";\nimport type { RorshachWgt, VoidManager } from \"./void.js\";\nimport type {\n CraftButton,\n CraftButtonController,\n UnsafeCraft,\n UnsafeUpgrade,\n UpgradeButtonController,\n Workshop,\n WorkshopManager,\n ZebraUpgradeButtonController,\n} from \"./workshop.js\";\n\nexport const BuyItemResultReasons = [\n \"already-bought\",\n \"cannot-afford\",\n \"dev-mode\",\n \"item-is-free\",\n \"not-enabled\",\n \"not-unlocked\",\n \"paid-for\",\n \"player-denied\",\n \"require-confirmation\",\n] as const;\nexport type BuyItemResultReason = (typeof BuyItemResultReasons)[number];\n\nexport type UnsafeBuyItemResult = {\n itemBought: boolean;\n reason: BuyItemResultReason;\n};\nexport type UnsafeBuyItemResultDeferred = {\n itemBought: boolean;\n reason: \"require-confirmation\";\n def: dojo.Deferred & {\n then: (callable: (result: UnsafeBuyItemResult) => void) => void;\n };\n};\n\nexport const Buildings = [\n \"academy\",\n \"accelerator\",\n \"aiCore\",\n \"amphitheatre\",\n \"aqueduct\",\n \"barn\",\n \"biolab\",\n \"brewery\",\n \"calciner\",\n \"chapel\",\n \"chronosphere\",\n \"factory\",\n \"field\",\n \"harbor\",\n \"hut\",\n \"library\",\n \"logHouse\",\n \"lumberMill\",\n \"magneto\",\n \"mansion\",\n \"mine\",\n \"mint\",\n \"observatory\",\n \"oilWell\",\n \"pasture\",\n \"quarry\",\n \"reactor\",\n \"smelter\",\n \"steamworks\",\n \"temple\",\n \"tradepost\",\n \"unicornPasture\",\n \"warehouse\",\n \"workshop\",\n \"zebraForge\",\n \"zebraOutpost\",\n \"zebraWorkshop\",\n \"ziggurat\",\n] as const;\nexport type Building = (typeof Buildings)[number];\n\nexport const StagedBuildings = [\n \"broadcasttower\",\n \"dataCenter\",\n \"hydroplant\",\n \"solarfarm\",\n \"spaceport\",\n] as const;\nexport type StagedBuilding = (typeof StagedBuildings)[number];\n\nexport const BuildingEffects = [\n // from game.bld\n \"academyMeteorBonus\",\n \"aiLevel\",\n \"alicornPerTickCon\",\n \"bloodstoneRatio\",\n \"cathPollutionPerTickCon\",\n \"cathPollutionPerTickProd\",\n \"catnipDemandRatio\",\n \"catnipMax\",\n \"catnipPerTickBase\",\n \"catnipPerTickCon\",\n \"catnipRatio\",\n \"coalMax\",\n \"coalPerTickAutoprod\",\n \"coalPerTickBase\",\n \"coalPerTickCon\",\n \"coalRatioGlobal\",\n \"craftRatio\",\n \"cultureMax\",\n \"cultureMaxRatio\",\n \"culturePerTickBase\",\n \"energyConsumption\",\n \"energyProduction\",\n \"faithMax\",\n \"faithPerTickBase\",\n \"festivalArrivalRatio\",\n \"festivalRatio\",\n \"fursDemandRatio\",\n \"fursPerTickProd\",\n \"gflopsPerTickBase\",\n \"goldMax\",\n \"goldPerTickAutoprod\",\n \"goldPerTickCon\",\n \"happiness\",\n \"hunterRatio\",\n \"ironMax\",\n \"ironPerTickAutoprod\",\n \"ironPerTickCon\",\n \"ivoryDemandRatio\",\n \"ivoryPerTickCon\",\n \"ivoryPerTickProd\",\n \"magnetoBoostRatio\",\n \"magnetoRatio\",\n \"manpowerMax\",\n \"manpowerPerTickCon\",\n \"manuscriptPerTickProd\",\n \"maxKittens\",\n \"mineralsMax\",\n \"mineralsPerTickCon\",\n \"mineralsPerTickProd\",\n \"mineralsRatio\",\n \"oilMax\",\n \"oilPerTick\",\n \"oilPerTickBase\",\n \"oilPerTickCon\",\n \"oilPerTickProd\",\n \"productionRatio\",\n \"refineRatio\",\n \"resStasisRatio\",\n \"scienceMax\",\n \"scienceRatio\",\n \"skillXP\",\n \"spiceDemandRatio\",\n \"spicePerTickCon\",\n \"standingRatio\",\n \"starAutoSuccessChance\",\n \"starEventChance\",\n \"steelPerTickProd\",\n \"tMythrilCraftRatio\",\n \"tMythrilPerTick\",\n \"temporalFluxProduction\",\n \"thoriumPerTick\",\n \"titaniumMax\",\n \"titaniumPerTickAutoprod\",\n \"titaniumPerTickCon\",\n \"tradeRatio\",\n \"unhappinessRatio\",\n \"unicornsPerTickBase\",\n \"uraniumMax\",\n \"uraniumPerTick\",\n \"uraniumPerTickAutoprod\",\n \"uraniumPerTickBase\",\n \"woodMax\",\n \"woodPerTickCon\",\n \"woodRatio\",\n \"zebraPreparations\",\n\n // from game.religion\n \"activeHG\",\n \"alicornChance\",\n \"alicornPerTick\",\n \"blackLibraryBonus\",\n \"blsCorruptionRatio\",\n \"blsLimit\",\n \"compendiaTTBoostRatio\",\n \"corruptionBoostRatio\",\n \"corruptionRatio\",\n \"cultureMaxRatioBonus\",\n \"deficitRecoveryRatio\",\n \"energyProductionRatio\",\n \"faithRatioReligion\",\n \"globalResourceRatio\",\n \"goldMaxRatio\",\n \"ivoryMeteorChance\",\n \"ivoryMeteorRatio\",\n \"maxKittensRatio\",\n \"necrocornPerDay\",\n \"pactBlackLibraryBoost\",\n \"pactDeficitRecoveryRatio\",\n \"pactFaithRatio\",\n \"pactGlobalProductionRatio\",\n \"pactGlobalResourceRatio\",\n \"pactSpaceCompendiumRatio\",\n \"pactsAvailable\",\n \"pyramidFaithRatio\",\n \"pyramidGlobalProductionRatio\",\n \"pyramidGlobalResourceRatio\",\n \"pyramidRecoveryRatio\",\n \"pyramidSpaceCompendiumRatio\",\n \"relicRefineRatio\",\n \"riftChance\",\n \"rrRatio\",\n \"simScalingRatio\",\n \"solarRevolutionLimit\",\n \"solarRevolutionRatio\",\n \"tcRefineRatio\",\n \"timeRatio\",\n \"unicornsRatioReligion\",\n\n // from game.workshop.upgrades\n \"acceleratorRatio\",\n \"barnRatio\",\n \"beaconRelicsPerDay\",\n \"biofuelRatio\",\n \"broadcastTowerRatio\",\n \"cadBlueprintCraftRatio\",\n \"calcinerRatio\",\n \"calcinerSteelCraftRatio\",\n \"calcinerSteelRatio\",\n \"calcinerSteelReactorBonus\",\n \"catnipDemandWorkerRatioGlobal\",\n \"catnipJobRatio\",\n \"catnipMaxRatio\",\n \"coalRatioGlobalReduction\",\n \"coalSuperRatio\",\n \"crackerRatio\",\n \"dataCenterAIRatio\",\n \"eludiumAutomationBonus\",\n \"factoryRefineRatio\",\n \"harborCoalRatio\",\n \"harborRatio\",\n \"hutPriceRatio\",\n \"hydroPlantRatio\",\n \"libraryRatio\",\n \"lumberMillRatio\",\n \"lunarOutpostRatio\",\n \"manpowerJobRatio\",\n \"oilWellRatio\",\n \"queueCap\",\n \"reactorEnergyRatio\",\n \"reactorThoriumPerTick\",\n \"routeSpeed\",\n \"satnavRatio\",\n \"shipLimit\",\n \"skillMultiplier\",\n \"smelterRatio\",\n \"solarFarmRatio\",\n \"solarFarmSeasonRatio\",\n \"spaceScienceRatio\",\n \"starchartGlobalRatio\",\n \"t1CraftRatio\",\n \"t2CraftRatio\",\n \"t3CraftRatio\",\n \"t4CraftRatio\",\n \"t5CraftRatio\",\n \"temporalFluxProductionChronosphere\",\n \"temporalParadoxDayBonus\",\n \"unicornsGlobalRatio\",\n \"uplinkDCRatio\",\n \"uplinkLabRatio\",\n \"uraniumRatio\",\n \"warehouseRatio\",\n \"woodJobRatio\",\n\n // other tabs\n \"goldPriceRatio\",\n \"happinessKittenProductionRatio\",\n \"heatMax\",\n \"heatPerTick\",\n \"observatoryRatio\",\n \"starchartPerTickBaseSpace\",\n \"temporalFluxMax\",\n \"unobtainiumPerTickSpace\",\n \"uraniumPerTickCon\",\n] as const;\nexport type BuildingEffect = (typeof BuildingEffects)[number];\n\nexport const Seasons = [\"autumn\", \"spring\", \"summer\", \"winter\"] as const;\nexport type Season = (typeof Seasons)[number];\n\nexport const Cycles = [\n \"charon\",\n \"umbra\",\n \"yarn\",\n \"helios\",\n \"cath\",\n \"redmoon\",\n \"dune\",\n \"piscine\",\n \"terminus\",\n \"kairo\",\n] as const;\nexport type Cycle = (typeof Cycles)[number];\n\nexport const ResourcesCraftable = [\n \"alloy\",\n \"beam\",\n \"bloodstone\",\n \"blueprint\",\n \"compedium\",\n \"concrate\",\n \"eludium\",\n \"gear\",\n \"kerosene\",\n \"manuscript\",\n \"megalith\",\n \"parchment\",\n \"plate\",\n \"scaffold\",\n \"ship\",\n \"slab\",\n \"steel\",\n \"tanker\",\n \"tMythril\",\n \"thorium\",\n \"wood\",\n] as const;\nexport type ResourceCraftable = (typeof ResourcesCraftable)[number];\n\nexport const Resources = [\n ...ResourcesCraftable,\n \"alicorn\",\n \"antimatter\",\n \"blackcoin\",\n \"burnedParagon\",\n \"catnip\",\n \"coal\",\n \"culture\",\n \"elderBox\",\n \"faith\",\n \"furs\",\n \"gflops\",\n \"gold\",\n \"hashrates\",\n \"iron\",\n \"ivory\",\n \"karma\",\n \"kittens\",\n \"manpower\",\n \"minerals\",\n \"necrocorn\",\n \"oil\",\n \"paragon\",\n \"relic\",\n \"science\",\n \"sorrow\",\n \"spice\",\n \"starchart\",\n \"tears\",\n \"temporalFlux\",\n \"timeCrystal\",\n \"titanium\",\n \"unicorns\",\n \"unobtainium\",\n \"uranium\",\n \"void\",\n \"wrappingPaper\",\n \"zebras\",\n] as const;\nexport type Resource = (typeof Resources)[number];\n\nexport const TabIds = [\n \"Bonfire\",\n \"Religion\",\n \"Science\",\n \"Space\",\n \"Time\",\n \"Trade\",\n \"Village\",\n \"Workshop\",\n] as const;\nexport type TabId = (typeof TabIds)[number];\n\nexport const Jobs = [\n \"any\",\n \"engineer\",\n \"farmer\",\n \"geologist\",\n \"hunter\",\n \"miner\",\n \"priest\",\n \"scholar\",\n \"woodcutter\",\n] as const;\nexport type Job = (typeof Jobs)[number];\n\nexport const Traits = [\n \"chemist\",\n \"engineer\",\n \"manager\",\n \"metallurgist\",\n \"merchant\",\n \"none\",\n \"scientist\",\n \"wise\",\n] as const;\nexport type Trait = (typeof Traits)[number];\n\nexport enum UnicornItemVariant {\n Cryptotheology = \"c\",\n OrderOfTheSun = \"s\",\n Ziggurat = \"z\",\n UnicornPasture = \"zp\",\n}\n\nexport const ReligionUpgrades = [\n \"apocripha\",\n \"basilica\",\n \"goldenSpire\",\n \"scholasticism\",\n \"solarRevolution\",\n \"solarchant\",\n \"stainedGlass\",\n \"sunAltar\",\n \"templars\",\n \"transcendence\",\n] as const;\nexport type ReligionUpgrade = (typeof ReligionUpgrades)[number];\n\nexport const TranscendenceUpgrades = [\n \"blackCore\",\n \"blackLibrary\",\n \"blackNexus\",\n \"blackObelisk\",\n \"blackRadiance\",\n \"blazar\",\n \"darkNova\",\n \"holyGenocide\",\n \"mausoleum\",\n \"singularity\",\n] as const;\nexport type TranscendenceUpgrade = (typeof TranscendenceUpgrades)[number];\n\nexport const ZigguratUpgrades = [\n \"blackPyramid\",\n \"ivoryCitadel\",\n \"ivoryTower\",\n \"marker\",\n \"skyPalace\",\n \"sunspire\",\n \"unicornGraveyard\",\n \"unicornNecropolis\",\n \"unicornTomb\",\n \"unicornUtopia\",\n] as const;\nexport type ZigguratUpgrade = (typeof ZigguratUpgrades)[number];\n\nexport const Pacts = [\n \"fractured\",\n \"pactOfCleansing\",\n \"pactOfDestruction\",\n \"pactOfExtermination\",\n \"pactOfPurity\",\n \"payDebt\",\n] as const;\nexport type Pact = (typeof Pacts)[number];\n\nexport type AllBuildings =\n | Building\n | ChronoForgeUpgrade\n | ReligionUpgrade\n | SpaceBuilding\n | TranscendenceUpgrade\n | VoidSpaceUpgrade\n | ZigguratUpgrade;\n\nexport const Races = [\n \"dragons\",\n \"griffins\",\n \"nagas\",\n \"leviathans\",\n \"lizards\",\n \"sharks\",\n \"spiders\",\n \"zebras\",\n] as const;\nexport type Race = (typeof Races)[number];\n\nexport const Policies = [\n \"authocracy\",\n \"bigStickPolicy\",\n \"carnivale\",\n \"cityOnAHill\",\n \"clearCutting\",\n \"communism\",\n \"conservation\",\n \"cryochamberExtraction\",\n \"culturalExchange\",\n \"diplomacy\",\n \"dragonRelationsAstrologers\",\n \"dragonRelationsDynamicists\",\n \"dragonRelationsPhysicists\",\n \"environmentalism\",\n \"epicurianism\",\n \"expansionism\",\n \"extravagance\",\n \"fascism\",\n \"frugality\",\n \"fullIndustrialization\",\n \"griffinRelationsMachinists\",\n \"griffinRelationsMetallurgists\",\n \"griffinRelationsScouts\",\n \"isolationism\",\n \"knowledgeSharing\",\n \"liberalism\",\n \"liberty\",\n \"lizardRelationsDiplomats\",\n \"lizardRelationsEcologists\",\n \"lizardRelationsPriests\",\n \"militarizeSpace\",\n \"monarchy\",\n \"mysticism\",\n \"nagaRelationsArchitects\",\n \"nagaRelationsCultists\",\n \"nagaRelationsMasons\",\n \"necrocracy\",\n \"openWoodlands\",\n \"outerSpaceTreaty\",\n \"radicalXenophobia\",\n \"rationality\",\n \"rationing\",\n \"republic\",\n \"scientificCommunism\",\n \"sharkRelationsBotanists\",\n \"sharkRelationsMerchants\",\n \"sharkRelationsScribes\",\n \"siphoning\",\n \"socialism\",\n \"spiderRelationsChemists\",\n \"spiderRelationsGeologists\",\n \"spiderRelationsPaleontologists\",\n \"stoicism\",\n \"stripMining\",\n \"sustainability\",\n \"technocracy\",\n \"terraformingInsight\",\n \"theocracy\",\n \"tradition\",\n \"transkittenism\",\n \"zebraRelationsAppeasement\",\n \"zebraRelationsBellicosity\",\n] as const;\nexport type Policy = (typeof Policies)[number];\n\nexport const TechnologiesIgnored = [\"brewery\"] as const;\nexport type TechnologyIgnored = (typeof TechnologiesIgnored)[number];\n\nexport const Technologies = [\n \"acoustics\",\n \"advExogeology\",\n \"agriculture\",\n \"ai\",\n \"animal\",\n \"antimatter\",\n \"archeology\",\n \"archery\",\n \"architecture\",\n \"artificialGravity\",\n \"astronomy\",\n \"biochemistry\",\n \"biology\",\n \"blackchain\",\n \"calendar\",\n \"chemistry\",\n \"chronophysics\",\n \"civil\",\n \"combustion\",\n \"construction\",\n \"cryptotheology\",\n \"currency\",\n \"dimensionalPhysics\",\n \"drama\",\n \"ecology\",\n \"electricity\",\n \"electronics\",\n \"engineering\",\n \"exogeology\",\n \"exogeophysics\",\n \"genetics\",\n \"hydroponics\",\n \"industrialization\",\n \"machinery\",\n \"math\",\n \"mechanization\",\n \"metal\",\n \"metalurgy\",\n \"metaphysics\",\n \"mining\",\n \"nanotechnology\",\n \"navigation\",\n \"nuclearFission\",\n \"oilProcessing\",\n \"orbitalEngineering\",\n \"paradoxalKnowledge\",\n \"particlePhysics\",\n \"philosophy\",\n \"physics\",\n \"quantumCryptography\",\n \"robotics\",\n \"rocketry\",\n \"sattelites\",\n \"steel\",\n \"superconductors\",\n \"tachyonTheory\",\n \"terraformation\",\n \"theology\",\n \"thorium\",\n \"voidSpace\",\n \"writing\",\n] as const;\nexport type Technology = (typeof Technologies)[number];\n\nexport const Missions = [\n \"centaurusSystemMission\",\n \"charonMission\",\n \"duneMission\",\n \"furthestRingMission\",\n \"heliosMission\",\n \"kairoMission\",\n \"moonMission\",\n \"orbitalLaunch\",\n \"piscineMission\",\n \"rorschachMission\",\n \"terminusMission\",\n \"umbraMission\",\n \"yarnMission\",\n] as const;\nexport type Mission = (typeof Missions)[number];\n\nexport const Planets = [\n \"cath\",\n \"centaurusSystem\",\n \"charon\",\n \"dune\",\n \"furthestRing\",\n \"helios\",\n \"kairo\",\n \"moon\",\n \"piscine\",\n \"terminus\",\n \"umbra\",\n \"yarn\",\n] as const;\nexport type Planet = (typeof Planets)[number];\n\nexport const SpaceBuildings = [\n \"containmentChamber\",\n \"cryostation\",\n \"entangler\",\n \"heatsink\",\n \"hrHarvester\",\n \"hydrofracturer\",\n \"hydroponics\",\n \"moltenCore\",\n \"moonBase\",\n \"moonOutpost\",\n \"orbitalArray\",\n \"planetCracker\",\n \"researchVessel\",\n \"sattelite\",\n \"spaceBeacon\",\n \"spaceElevator\",\n \"spaceStation\",\n \"spiceRefinery\",\n \"sunforge\",\n \"sunlifter\",\n \"tectonic\",\n \"terraformingStation\",\n] as const;\nexport type SpaceBuilding = (typeof SpaceBuildings)[number];\n\nexport const Stats = [\n \"averageKittens\",\n \"buildingsConstructed\",\n \"eventsObserved\",\n \"kittensDead\",\n \"timePlayed\",\n \"totalChallengesCompleted\",\n \"totalClicks\",\n \"totalCrafts\",\n \"totalKittens\",\n \"totalParagon\",\n \"totalResets\",\n \"totalTrades\",\n \"totalYears\",\n \"transcendenceTier\",\n \"unicornsSacrificed\",\n] as const;\nexport type Stat = (typeof Stats)[number];\n\nexport const ChronoForgeUpgrades = [\n \"blastFurnace\",\n \"ressourceRetrieval\",\n \"temporalAccelerator\",\n \"temporalBattery\",\n \"temporalImpedance\",\n \"temporalPress\",\n \"timeBoiler\",\n] as const;\nexport type ChronoForgeUpgrade = (typeof ChronoForgeUpgrades)[number];\n\nexport const VoidSpaceUpgrades = [\n \"cryochambers\",\n \"usedCryochambers\",\n \"voidHoover\",\n \"voidRift\",\n \"chronocontrol\",\n \"voidResonator\",\n] as const;\nexport type VoidSpaceUpgrade = (typeof VoidSpaceUpgrades)[number];\n\nexport const Upgrades = [\n \"advancedAutomation\",\n \"advancedRefinement\",\n \"aiBases\",\n \"aiEngineers\",\n \"alloyArmor\",\n \"alloyAxe\",\n \"alloyBarns\",\n \"alloySaw\",\n \"alloyWarehouses\",\n \"amBases\",\n \"amDrive\",\n \"amFission\",\n \"amReactors\",\n \"amReactorsMK2\",\n \"assistance\",\n \"astrolabe\",\n \"astrophysicists\",\n \"augumentation\",\n \"automatedPlants\",\n \"barges\",\n \"biofuel\",\n \"bolas\",\n \"cadSystems\",\n \"caravanserai\",\n \"carbonSequestration\",\n \"cargoShips\",\n \"celestialMechanics\",\n \"chronoEngineers\",\n \"chronoforge\",\n \"coalFurnace\",\n \"coldFusion\",\n \"combustionEngine\",\n \"compositeBow\",\n \"concreteBarns\",\n \"concreteHuts\",\n \"concreteWarehouses\",\n \"crossbow\",\n \"cryocomputing\",\n \"darkEnergy\",\n \"deepMining\",\n \"distorsion\",\n \"electrolyticSmelting\",\n \"eludiumCracker\",\n \"eludiumHuts\",\n \"eludiumReflectors\",\n \"energyRifts\",\n \"enrichedThorium\",\n \"enrichedUranium\",\n \"factoryAutomation\",\n \"factoryLogistics\",\n \"factoryOptimization\",\n \"factoryProcessing\",\n \"factoryRobotics\",\n \"fluidizedReactors\",\n \"fluxCondensator\",\n \"fuelInjectors\",\n \"geodesy\",\n \"gmo\",\n \"goldOre\",\n \"hubbleTelescope\",\n \"huntingArmor\",\n \"hydroPlantTurbines\",\n \"internet\",\n \"invisibleBlackHand\",\n \"ironAxes\",\n \"ironHoes\",\n \"ironwood\",\n \"lhc\",\n \"logistics\",\n \"longRangeSpaceships\",\n \"machineLearning\",\n \"mineralAxes\",\n \"mineralHoes\",\n \"miningDrill\",\n \"mWReactor\",\n \"nanosuits\",\n \"neuralNetworks\",\n \"nuclearPlants\",\n \"nuclearSmelters\",\n \"offsetPress\",\n \"oilDistillation\",\n \"oilRefinery\",\n \"orbitalGeodesy\",\n \"oxidation\",\n \"photolithography\",\n \"photovoltaic\",\n \"pneumaticPress\",\n \"printingPress\",\n \"pumpjack\",\n \"pyrolysis\",\n \"qdot\",\n \"railgun\",\n \"reactorVessel\",\n \"refrigeration\",\n \"register\",\n \"reinforcedBarns\",\n \"reinforcedSaw\",\n \"reinforcedWarehouses\",\n \"relicStation\",\n \"rotaryKiln\",\n \"satelliteRadio\",\n \"satnav\",\n \"seti\",\n \"silos\",\n \"solarSatellites\",\n \"spaceEngineers\",\n \"spaceManufacturing\",\n \"spiceNavigation\",\n \"starlink\",\n \"stasisChambers\",\n \"steelArmor\",\n \"steelAxe\",\n \"steelPlants\",\n \"steelSaw\",\n \"stoneBarns\",\n \"storageBunkers\",\n \"strenghtenBuild\",\n \"tachyonAccelerators\",\n \"thinFilm\",\n \"thoriumEngine\",\n \"thoriumReactors\",\n \"titaniumAxe\",\n \"titaniumBarns\",\n \"titaniumMirrors\",\n \"titaniumSaw\",\n \"titaniumWarehouses\",\n \"turnSmoothly\",\n \"unicornSelection\",\n \"unobtainiumAxe\",\n \"unobtainiumDrill\",\n \"unobtainiumHuts\",\n \"unobtainiumReflectors\",\n \"unobtainiumSaw\",\n \"uplink\",\n \"voidAspiration\",\n \"voidEnergy\",\n \"voidReactors\",\n] as const;\nexport type Upgrade = (typeof Upgrades)[number];\n\nexport const ZebraUpgrades = [\n \"bloodstoneInstitute\",\n \"darkBrew\",\n \"darkRevolution\",\n \"minerologyDepartment\",\n \"whispers\",\n] as const;\nexport type ZebraUpgrade = (typeof ZebraUpgrades)[number];\n\nexport enum TimeItemVariant {\n Chronoforge = \"chrono\",\n VoidSpace = \"void\",\n}\n\nexport type FaithItem = Exclude<ReligionItem, UnicornItem>;\n\nexport const UnicornItems = [\n \"ivoryCitadel\",\n \"ivoryTower\",\n \"skyPalace\",\n \"sunspire\",\n \"unicornPasture\",\n \"unicornTomb\",\n \"unicornUtopia\",\n] as const;\nexport type UnicornItem = (typeof UnicornItems)[number];\n\nexport type ReligionItem = ReligionUpgrade | TranscendenceUpgrade | ZigguratUpgrade;\nexport type ReligionAdditionItem = \"adore\" | \"autoPraise\" | \"bestUnicornBuilding\" | \"transcend\";\n\nexport const ReligionOptions = [\n \"sacrificeUnicorns\",\n \"sacrificeAlicorns\",\n \"refineTears\",\n \"refineTimeCrystals\",\n \"transcend\",\n \"adore\",\n \"autoPraise\",\n] as const;\nexport type ReligionOption = (typeof ReligionOptions)[number];\n\nexport const Biomes = [\n \"bloodDesert\",\n \"boneForest\",\n \"desert\",\n \"forest\",\n \"hills\",\n \"mountain\",\n \"plains\",\n \"rainForest\",\n \"swamp\",\n \"village\",\n \"volcano\",\n] as const;\nexport type Biome = (typeof Biomes)[number];\n\nexport type Unlocks = {\n buildings: Array<Building>;\n challenges: Array<Challenge>;\n chronoforge: Array<ChronoForgeUpgrade>;\n crafts: Array<ResourceCraftable>;\n jobs: Array<Job>;\n policies: Array<Policy>;\n stages: Array<StagedBuilding>;\n tabs: Array<TabId>;\n tech: Array<Technology>;\n upgrades: Array<Upgrade>;\n voidSpace: Array<VoidSpaceUpgrade>;\n zebraUpgrades: Array<unknown>;\n};\n\nexport const Perks = [\n \"adjustmentBureau\",\n \"anachronomancy\",\n \"ascoh\",\n \"astromancy\",\n \"binah\",\n \"blackCodex\",\n \"carnivals\",\n \"chesed\",\n \"chokhmah\",\n \"chronomancy\",\n \"codexAgrum\",\n \"codexLeviathanianus\",\n \"codexLogos\",\n \"codexVox\",\n \"diplomacy\",\n \"divineProportion\",\n \"engeneering\",\n \"gevurah\",\n \"goldenRatio\",\n \"hod\",\n \"keter\",\n \"malkuth\",\n \"megalomania\",\n \"navigationDiplomacy\",\n \"netzach\",\n \"numerology\",\n \"numeromancy\",\n \"pawgan\",\n \"renaissance\",\n \"tiferet\",\n \"unicornmancy\",\n \"vitruvianFeline\",\n \"voidOrder\",\n \"willenfluff\",\n \"yesod\",\n \"zebraCovenant\",\n \"zebraDiplomacy\",\n] as const;\nexport type Perk = (typeof Perks)[number];\n\nexport const ColorSchemes = [\n \"anthracite\",\n \"arctic\",\n \"black\",\n \"bluish\",\n \"catnip\",\n \"chocolate\",\n \"computer\",\n \"cyber\",\n \"dark\",\n \"default\",\n \"dune\",\n \"factory\",\n \"fluid\",\n \"gold\",\n \"grassy\",\n \"grayish\",\n \"greenish\",\n \"minimalist\",\n \"oil\",\n \"school\",\n \"sleek\",\n \"space\",\n \"spooky\",\n \"tombstone\",\n \"unicorn\",\n \"vessel\",\n \"vintage\",\n \"wood\",\n] as const;\nexport type ColorScheme = (typeof ColorSchemes)[number];\n\nexport const Locales = [\n \"be\",\n \"br\",\n \"cz\",\n \"de\",\n \"en\",\n \"es\",\n \"esl\",\n \"fr\",\n \"it\",\n \"ja\",\n \"ko\",\n \"pl\",\n \"ru\",\n \"uk\",\n \"zh\",\n \"zht\",\n] as const;\nexport type Locale = (typeof Locales)[number];\n\nexport const Notations = [\"si\", \"e\", \"sie\"] as const;\nexport type Notation = (typeof Notations)[number];\n\nexport type CycleEffects = {\n \"cryostation-coalMax\": number;\n \"cryostation-ironMax\": number;\n \"cryostation-mineralsMax\": number;\n \"cryostation-oilMax\": number;\n \"cryostation-titaniumMax\": number;\n \"cryostation-unobtainiumMax\": number;\n \"cryostation-uraniumMax\": number;\n \"cryostation-woodMax\": number;\n \"entangler-gflopsConsumption\": number;\n \"hrHarvester-energyProduction\": number;\n \"hydrofracturer-oilPerTickAutoprodSpace\": number;\n \"hydroponics-catnipRatio\": number;\n \"moonOutpost-unobtainiumPerTickSpace\": number;\n \"planetCracker-uraniumPerTickSpace\": number;\n \"researchVessel-starchartPerTickBaseSpace\": number;\n \"sattelite-observatoryRatio\": number;\n \"sattelite-starchartPerTickBaseSpace\": number;\n \"spaceBeacon-starchartPerTickBaseSpace\": number;\n \"spaceElevator-prodTransferBonus\": number;\n \"spaceStation-scienceRatio\": number;\n \"sunlifter-energyProduction\": number;\n};\n\nexport type FestivalEffects = {\n catnip: number;\n coal: number;\n culture: number;\n faith: number;\n gold: number;\n iron: number;\n manpower: number;\n minerals: number;\n oil: number;\n science: number;\n starchart: number;\n titanium: number;\n unicorns: number;\n unobtainium: number;\n uranium: number;\n wood: number;\n};\n\nexport type UnlockTypeMap = {\n biomes: UnsafeBiome;\n buildings: UnsafeBuilding;\n challenges: UnsafeChallenge;\n chronoforge: UnsafeChronoForgeUpgrade;\n crafts: UnsafeCraft;\n jobs: UnsafeJob;\n pacts: UnsafePact;\n perks: UnsafePerk;\n planet: UnsafePlanet;\n policies: UnsafePolicy;\n religion: UnsafeReligionUpgrade;\n schemes: unknown;\n spaceBuilding: UnsafeSpaceBuilding;\n spaceMission: UnsafePlanet;\n stages: UnsafeBuilding;\n tabs: Tab;\n tech: UnsafeTech;\n transcendenceUpgrades: UnsafeTranscendenceUpgrade;\n upgrades: UnsafeUpgrade;\n voidSpace: UnsafeVoidSpaceUpgrade;\n zebraUpgrades: UnsafeUpgrade;\n zigguratUpgrades: UnsafeZigguratUpgrade;\n};\nexport type Unlock = keyof UnlockTypeMap;\n\n/**\n * A combination of a resource and an amount.\n */\nexport type Price = { name: Resource; val: number };\n\nexport const Challenges = [\n \"1000Years\",\n \"anarchy\",\n \"atheism\",\n \"energy\",\n \"ironWill\",\n \"pacifism\",\n \"postApocalypse\",\n \"winterIsComing\",\n] as const;\nexport type Challenge = (typeof Challenges)[number];\n\nexport type Link = {\n visible: boolean;\n title: string;\n tooltip: string;\n getDisplayValueExt: () => string;\n handler: (event: Event, callback: (success: boolean) => void) => void;\n};\n\nexport type ClassList = {\n BuildingMeta: BuildingMeta;\n diplomacy: {\n ui: {\n autoPinnedButtonController: AutoPinnedButtonController;\n autoPinnedButton: AutoPinnedButton;\n EldersPanel: EldersPanel;\n EmbassyButtonController: EmbassyButtonController;\n EmbassyButton: EmbassyButton;\n RacePanel: RacePanel;\n };\n };\n game: {\n Server: Server;\n Telemetry: Telemetry;\n Timer: Timer;\n ui: {\n GatherCatnipButtonController: GatherCatnipButtonController;\n RefineCatnipButton: RefineCatnipButton;\n RefineCatnipButtonController: RefineCatnipButtonController;\n };\n UndoChange: UndoChange;\n };\n KGConfig: KGConfig;\n managers: {\n Achievements: Achievements;\n BuildingsManager: BuildingsManager;\n ChallengesManager: ChallengesManager;\n DiplomacyManager: DiplomacyManager;\n PrestigeManager: PrestigeManager;\n ReligionManager: ReligionManager;\n ResourceManager: ResourceManager;\n ScienceManager: ScienceManager;\n SpaceManager: SpaceManager;\n StatsManager: StatsManager;\n TimeManager: TimeManager;\n VillageManager: VillageManager;\n VoidManager: VoidManager;\n WorkshopManager: WorkshopManager;\n };\n Metadata: Metadata;\n queue: {\n manager: Manager;\n };\n religion: {\n pactsManager: PactsManager;\n };\n reserveMan: ReserveMan;\n tab: {\n ChallengesTab: ChallengesTab;\n QueueTab: QueueTab;\n StatsTab: StatsTab;\n TimeTab: TimeTab;\n };\n trade: {\n ui: {\n SendExplorersButtonController: SendExplorersButtonController;\n SendExplorersButton: SendExplorersButton;\n };\n };\n ui: {\n AchievementsPanel: AchievementsPanel;\n BadgesPanel: BadgesPanel;\n btn: {\n BuildingBtnModernController: BuildingBtnModernController;\n StagingBldBtnController: StagingBldBtnController;\n StagingBldBtn: StagingBldBtn;\n };\n BuildingBtnController: BuildingBtnController;\n BurnParagonBtnController: BurnParagonBtnController;\n ButtonController: ButtonController;\n ButtonModernController: ButtonModernController;\n BuildingStackableBtnController: BuildingStackableBtnController;\n ChallengeBtnController: ChallengeBtnController;\n ChallengeEffectsPanel: ChallengeEffectsPanel;\n ChallengePanel: ChallengePanel;\n ChronoforgeWgt: ChronoforgeWgt;\n CryptotheologyPanel: CryptotheologyPanel;\n CryptotheologyWGT: CryptotheologyWGT;\n DesktopUI: DesktopUI;\n PactsPanel: PactsPanel;\n PactsWGT: PactsWGT;\n PolicyBtnController: PolicyBtnController;\n PolicyPanel: PolicyPanel;\n PrestigeBtnController: PrestigeBtnController;\n PrestigePanel: PrestigePanel;\n RorshachWgt: RorshachWgt;\n religion: {\n MultiLinkBtn: MultiLinkBtn<AllMultiLinkBtnOptions>;\n RefineBtn: RefineBtn;\n RefineTearsBtnController: RefineTearsBtnController;\n TransformBtnController: TransformBtnController;\n };\n ReservesPanel: ReservesPanel;\n ResetWgt: ResetWgt;\n space: {\n FurthestRingPanel: FurthestRingPanel;\n PlanetBuildingBtnController: PlanetBuildingBtnController;\n PlanetPanel: PlanetPanel;\n };\n time: {\n AccelerateTimeBtn: AccelerateTimeBtn;\n AccelerateTimeBtnController: AccelerateTimeBtnController;\n ChronoforgeBtnController: ChronoforgeBtnController;\n FixCryochamberBtnController: FixCryochamberBtnController;\n ShatterTCBtn: ShatterTCBtn;\n ShatterTCBtnController: ShatterTCBtnController;\n VoidSpaceBtnController: VoidSpaceBtnController;\n };\n TimeControlWgt: TimeControlWgt;\n toolbar: {\n ToolbarEnergy: ToolbarEnergy;\n ToolbarHappiness: ToolbarHappiness;\n ToolbarMOTD: ToolbarMOTD;\n };\n Toolbar: Toolbar;\n ToolbarIcon: ToolbarIcon;\n TranscendenceBtnController: TranscendenceBtnController;\n turnHGOffButtonController: TurnHGOffButtonController;\n UISystem: UISystem;\n village: {\n BiomeBtn: BiomeBtn;\n BiomeBtnController: BiomeBtnController;\n Census: Census;\n };\n VoidSpaceWgt: VoidSpaceWgt;\n };\n village: {\n KittenSim: KittenSim;\n LoadoutController: LoadoutController;\n ui: {\n FestivalButton: FestivalButton;\n FestivalButtonController: FestivalButtonController;\n map: {\n UpgradeExplorersController: UpgradeExplorersController;\n UpgradeHQController: UpgradeHQController;\n };\n MapOverviewWgt: MapOverviewWgt;\n VillageButtonController: VillageButtonController;\n };\n };\n};\n\nexport type ComInterface = {\n nuclearunicorn: {\n core: {\n Control: Control;\n TabManager: TabManager;\n };\n game: {\n Calendar: Calendar;\n calendar: {\n Event: Event;\n };\n EffectsManager: EffectsManager;\n log: {\n Console: Console;\n };\n Math: KGMath;\n ui: {\n BuildingBtn: BuildingBtn<AllBuildingBtnOptions>;\n BuildingBtnController: BuildingBtnController;\n BuildingNotStackableBtnController: BuildingNotStackableBtnController;\n BuildingResearchBtn: BuildingResearchBtn<AllBuildingResearchBtnOptions>;\n BuildingStackableBtn: BuildingStackableBtn<AllBuildingStackableBtnOptions>;\n BuildingStackableBtnController: BuildingStackableBtnController;\n Button: Button<AllButtonOptions>;\n ButtonController: ButtonController;\n ButtonModern: ButtonModern<AllButtonModernOptions>;\n ButtonModernController: ButtonModernController;\n CensusPanel: CensusPanel;\n ContentRowRenderer: ContentRowRenderer;\n CraftButton: CraftButton;\n CraftButtonController: CraftButtonController;\n CrashBcoinButtonController: CrashBcoinButtonController;\n GamePage: GamePage;\n JobButton: JobButton;\n JobButtonController: JobButtonController;\n LoadoutButton: LoadoutButton;\n LoadoutButtonController: LoadoutButtonController;\n PactsBtnController: PactsBtnController;\n Panel: Panel;\n PraiseBtnController: PraiseBtnController;\n ReligionBtnController: ReligionBtnController;\n ResetFaithBtnController: ResetFaithBtnController;\n SpaceProgramBtnController: SpaceProgramBtnController<UnsafeBuildingBtnModel>;\n Spacer: Spacer;\n tab: Tab & {\n AchTab: AchTab;\n BuildingsModern: BuildingsModern;\n Diplomacy: Diplomacy;\n Library: Library;\n ReligionTab: ReligionTab;\n SpaceTab: SpaceTab;\n Village: Village;\n Workshop: Workshop;\n };\n TechButtonController: TechButtonController;\n TradeButton: TradeButton;\n TradeButtonController: TradeButtonController;\n TranscendBtnController: TranscendBtnController;\n UpgradeButtonController: UpgradeButtonController;\n ZebraUpgradeButtonController: ZebraUpgradeButtonController;\n ZigguratBtnController: ZigguratBtnController;\n };\n village: {\n Kitten: Kitten;\n Loadout: Loadout;\n };\n };\n };\n};\n\nexport type MixinInterface = {\n IChildrenAware: IChildrenAware;\n IDataStorageAware: IDataStorageAware;\n IGameAware: IGameAware;\n IReactAware: IReactAware;\n};\n\nexport type I18nEngine = (key: string, args?: Array<number | string>) => string;\n\ndeclare global {\n const classes: ClassList;\n const com: ComInterface;\n const game: GamePage;\n let unsafeWindow: Window | undefined;\n interface Window {\n $: JQuery;\n $I?: Maybe<I18nEngine>;\n dojo: {\n clone: <T>(subject: T) => T;\n subscribe: <TEvent extends string>(\n event: TEvent,\n // biome-ignore lint/suspicious/noExplicitAny: Not our type.\n handler: (...args: Array<any>) => void,\n ) => [TEvent, number];\n unsubscribe: (handle: [string, number]) => void;\n };\n game?: Maybe<GamePage>;\n gamePage?: Maybe<GamePage>;\n kittenScientists?: KittenScientists;\n LZString: {\n compressToBase64: (input: string) => string;\n compressToUTF16: (input: string) => string;\n decompressFromBase64: (input: string) => string;\n decompressFromUTF16: (input: string) => string;\n };\n }\n}\n\nexport * from \"./_releases.js\";\nexport * from \"./_save.js\";\nexport * from \"./achievements.js\";\nexport * from \"./buildings.js\";\nexport * from \"./calendar.js\";\nexport * from \"./challenges.js\";\nexport * from \"./core.js\";\nexport * from \"./diplomacy.js\";\nexport * from \"./game.js\";\nexport * from \"./math.js\";\nexport * from \"./prestige.js\";\nexport * from \"./religion.js\";\nexport * from \"./resources.js\";\nexport * from \"./science.js\";\nexport * from \"./space.js\";\nexport * from \"./time.js\";\nexport * from \"./toolbar.js\";\nexport * from \"./ui.js\";\nexport * from \"./village.js\";\nexport * from \"./void.js\";\nexport * from \"./workshop.js\";\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { ReligionItem, Resource, SpaceBuilding } from \"../types/index.js\";\nimport type { BonfireItem } from \"./BonfireSettings.js\";\nimport type { TimeItem } from \"./TimeSettings.js\";\n\nexport type Requirement = Resource | false;\n\n/**\n * The type names of all supported buildings.\n */\nexport type AllItems = BonfireItem | ReligionItem | SpaceBuilding | TimeItem;\n\nexport class Setting {\n enabled: boolean;\n\n constructor(enabled = false) {\n this.enabled = enabled;\n }\n\n load(setting: Maybe<Partial<Setting>>) {\n if (isNil(setting)) {\n return;\n }\n\n this.enabled = setting.enabled ?? this.enabled;\n }\n\n serialize() {\n return this;\n }\n}\n\nexport class SettingLimited extends Setting {\n limited: boolean;\n\n constructor(enabled = false, limited = false) {\n super(enabled);\n this.limited = limited;\n }\n\n load(setting: Maybe<Partial<SettingLimited>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.limited = setting.limited ?? this.limited;\n }\n}\n\n/**\n * A setting that also includes a trigger value.\n * Trigger values range from 0 to 1. They reflect a percentage.\n */\nexport class SettingTrigger extends Setting {\n trigger: number;\n\n constructor(enabled = false, trigger = -1) {\n super(enabled);\n this.trigger = trigger;\n }\n\n load(setting: Maybe<Partial<SettingTrigger>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.trigger = setting.trigger ?? this.trigger;\n }\n}\n\n/**\n * A setting that also includes an absolute value trigger.\n * Trigger values range from 0 to Infinity, while -1 designates Infinity explicitly.\n */\nexport class SettingThreshold extends Setting {\n trigger: number;\n\n constructor(enabled = false, threshold = 1) {\n super(enabled);\n this.trigger = threshold;\n }\n\n load(setting: Maybe<Partial<SettingThreshold>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.trigger = setting.trigger ?? this.trigger;\n }\n}\n\nexport class SettingMax extends Setting {\n max: number;\n\n constructor(enabled = false, max = 0) {\n super(enabled);\n this.max = max;\n }\n\n load(setting: Maybe<Partial<SettingMax>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.max = setting.max ?? this.max;\n }\n}\n\nexport class SettingLimitedMax extends SettingLimited implements SettingMax {\n max: number;\n\n constructor(enabled = false, limited = false, max = 0) {\n super(enabled, limited);\n this.max = max;\n }\n\n load(setting: Maybe<Partial<SettingLimitedMax>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.max = setting.max ?? this.max;\n }\n}\n\nexport class SettingLimitedMaxTrigger extends SettingLimitedMax implements SettingTrigger {\n trigger: number;\n\n constructor(enabled = false, limited = false, max = 0, trigger = -1) {\n super(enabled, limited, max);\n this.trigger = trigger;\n }\n\n load(setting: Maybe<Partial<SettingLimitedMaxTrigger>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.trigger = setting.trigger ?? this.trigger;\n }\n}\n\nexport class SettingLimitedTrigger extends SettingLimited implements SettingTrigger {\n trigger: number;\n\n constructor(enabled = false, limited = false, trigger = -1) {\n super(enabled, limited);\n this.trigger = trigger;\n }\n\n load(setting: Maybe<Partial<SettingLimitedTrigger>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.trigger = setting.trigger ?? this.trigger;\n }\n}\n\nexport class SettingTriggerMax extends SettingTrigger implements SettingMax {\n max: number;\n\n constructor(enabled = false, trigger = -1, max = 0) {\n super(enabled, trigger);\n this.max = max;\n }\n\n load(setting: Maybe<Partial<SettingTriggerMax>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.max = setting.max ?? this.max;\n }\n}\n\nexport class SettingThresholdMax extends SettingThreshold implements SettingMax {\n max: number;\n\n constructor(enabled = false, trigger = 1, max = 0) {\n super(enabled, trigger);\n this.max = max;\n }\n\n load(setting: Maybe<Partial<SettingTriggerMax>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.max = setting.max ?? this.max;\n }\n}\n\nexport class SettingOptions<T = string> {\n readonly #options: Array<{ label: string; value: T }>;\n selected: T;\n\n get options() {\n return this.#options;\n }\n\n constructor(selected: T, options = new Array<{ label: string; value: T }>()) {\n // Make sure the provided selected value exists in options.\n if (isNil(options.find(option => option.value === selected))) {\n throw new Error(\"Provided selected value is not in provided options.\");\n }\n\n this.selected = selected;\n this.#options = options;\n }\n\n load(setting: Maybe<Partial<SettingOptions<T>>>) {\n if (isNil(setting)) {\n return;\n }\n\n this.selected = setting.selected ?? this.selected;\n }\n}\n\nexport class SettingBuy extends Setting {\n buy: number;\n\n constructor(enabled = false, buy = -1) {\n super(enabled);\n this.buy = buy;\n }\n\n load(setting: Maybe<Partial<SettingBuy>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.buy = setting.buy ?? this.buy;\n }\n}\n\nexport class SettingSell extends Setting {\n sell: number;\n\n constructor(enabled = false, sell = -1) {\n super(enabled);\n this.sell = sell;\n }\n\n load(setting: Maybe<Partial<SettingSell>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.sell = setting.sell ?? this.sell;\n }\n}\n\nexport class SettingBuySellThreshold extends SettingThreshold implements SettingBuy, SettingSell {\n buy: number;\n sell: number;\n\n constructor(enabled = false, buy = 950.0, sell = 1000.0, trigger = 1) {\n super(enabled, trigger);\n this.buy = buy;\n this.sell = sell;\n }\n\n load(setting: Maybe<Partial<SettingBuySellThreshold>>) {\n if (isNil(setting)) {\n return;\n }\n\n super.load(setting);\n this.buy = setting.buy ?? this.buy;\n this.sell = setting.sell ?? this.sell;\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type StagedBuilding, StagedBuildings } from \"../types/index.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class BuildingUpgradeSetting extends Setting {\n readonly #upgrade: StagedBuilding;\n\n get upgrade() {\n return this.#upgrade;\n }\n\n constructor(upgrade: StagedBuilding, enabled = false) {\n super(enabled);\n this.#upgrade = upgrade;\n }\n}\n\nexport type BuildingUpdateBuildingSettings = Record<StagedBuilding, BuildingUpgradeSetting>;\n\nexport class BuildingUpgradeSettings extends Setting {\n buildings: BuildingUpdateBuildingSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.buildings = this.initBuildings();\n }\n\n private initBuildings(): BuildingUpdateBuildingSettings {\n const items = {} as BuildingUpdateBuildingSettings;\n for (const item of StagedBuildings) {\n items[item] = new BuildingUpgradeSetting(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<BuildingUpgradeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Building, Buildings, type StagedBuilding, StagedBuildings } from \"../types/index.js\";\nimport { BuildingUpgradeSettings } from \"./BuildingUpgradeSettings.js\";\nimport { Setting, SettingTrigger, SettingTriggerMax } from \"./Settings.js\";\n\n/**\n * One of the building options in the KS menu.\n * These are not identical to `Building`!\n * `Building` is IDs of buildings as defined by KG. KS defines upgrade stages as well.\n */\nexport type BonfireItem = Building | StagedBuilding;\n\nexport class BonfireBuildingSetting extends SettingTriggerMax {\n /**\n * In case this is an upgrade of another building, this is the name of the\n * base building.\n */\n readonly #baseBuilding: Building | undefined = undefined;\n get baseBuilding() {\n return this.#baseBuilding;\n }\n\n readonly #building: BonfireItem;\n get building() {\n return this.#building;\n }\n\n /**\n * In case this is an upgradable building, this indicates the level of\n * the stage.\n */\n readonly #stage: number = 0;\n get stage() {\n return this.#stage;\n }\n\n constructor(\n building: BonfireItem,\n enabled = false,\n trigger = -1,\n max = 0,\n baseStage?: Building | false,\n ) {\n super(enabled, trigger, max);\n\n this.#building = building;\n if (baseStage) {\n this.#stage = 1;\n this.#baseBuilding = baseStage;\n }\n }\n}\n\nexport type BonfireBuildingSettings = Record<\n Exclude<BonfireItem, \"unicornPasture\">,\n BonfireBuildingSetting\n>;\n\nexport class BonfireSettings extends SettingTrigger {\n buildings: BonfireBuildingSettings;\n\n gatherCatnip: Setting;\n turnOnMagnetos: Setting;\n turnOnSteamworks: Setting;\n turnOnReactors: Setting;\n upgradeBuildings: BuildingUpgradeSettings;\n\n constructor(\n enabled = false,\n trigger = -1,\n gatherCatnip = new Setting(),\n turnOnSteamworks = new Setting(),\n turnOnMagnetos = new Setting(),\n turnOnReactors = new Setting(),\n upgradeBuildings = new BuildingUpgradeSettings(),\n ) {\n super(enabled, trigger);\n this.buildings = this.initBuildings();\n this.gatherCatnip = gatherCatnip;\n this.turnOnSteamworks = turnOnSteamworks;\n this.turnOnMagnetos = turnOnMagnetos;\n this.turnOnReactors = turnOnReactors;\n this.upgradeBuildings = upgradeBuildings;\n }\n\n private initBuildings(): BonfireBuildingSettings {\n const baseStage: Partial<Record<StagedBuilding, Building>> = {\n broadcasttower: \"amphitheatre\",\n dataCenter: \"library\",\n hydroplant: \"aqueduct\",\n solarfarm: \"pasture\",\n spaceport: \"warehouse\",\n };\n\n const items = {} as BonfireBuildingSettings;\n for (const item of Buildings) {\n if (item === \"unicornPasture\") {\n continue;\n }\n items[item] = new BonfireBuildingSetting(item);\n }\n for (const item of StagedBuildings) {\n items[item] = new BonfireBuildingSetting(item, false, -1, 0, baseStage[item]);\n }\n\n return items;\n }\n\n load(settings: Maybe<Partial<BonfireSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.max = item?.max ?? building.max;\n building.trigger = item?.trigger ?? building.trigger;\n });\n\n this.gatherCatnip.enabled = settings.gatherCatnip?.enabled ?? this.gatherCatnip.enabled;\n this.turnOnSteamworks.enabled =\n settings.turnOnSteamworks?.enabled ?? this.turnOnSteamworks.enabled;\n this.turnOnMagnetos.enabled = settings.turnOnMagnetos?.enabled ?? this.turnOnMagnetos.enabled;\n this.turnOnReactors.enabled = settings.turnOnReactors?.enabled ?? this.turnOnReactors.enabled;\n this.upgradeBuildings.load(settings.upgradeBuildings);\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport type { Tab } from \"./types/core.js\";\nimport type { TabId } from \"./types/index.js\";\n\nexport class TabManager<TTab extends Tab = Tab> {\n private readonly _host: KittenScientists;\n tab: TTab;\n\n constructor(host: KittenScientists, name: TabId) {\n this._host = host;\n\n const tab = this._host.game.tabs.find(subject => subject.tabId === name) as TTab;\n if (isNil(tab)) {\n throw new Error(`Unable to find tab ${name}`);\n }\n\n this.tab = tab;\n this.render();\n }\n\n render(): this {\n if (this._host.game.ui.activeTabId !== this.tab.tabId) {\n this.tab.render();\n }\n\n return this;\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { Automation, FrameContext } from \"./Engine.js\";\nimport { BulkPurchaseHelper } from \"./helper/BulkPurchaseHelper.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport {\n type BonfireBuildingSetting,\n type BonfireItem,\n BonfireSettings,\n} from \"./settings/BonfireSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type {\n BuildingBtnModernController,\n BuildingMeta,\n BuildingsModern,\n GatherCatnipButtonController,\n StagingBldBtnController,\n UnsafeBuilding,\n UnsafeStagingBldButtonOptions,\n UnsafeUnstagedBuildingButtonOptions,\n} from \"./types/buildings.js\";\nimport type { UnsafeBuildingBtnModernModel } from \"./types/core.js\";\nimport type { Building } from \"./types/index.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class BonfireManager implements Automation {\n private readonly _host: KittenScientists;\n readonly settings: BonfireSettings;\n readonly manager: TabManager<BuildingsModern>;\n private readonly _bulkManager: BulkPurchaseHelper;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new BonfireSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager<BuildingsModern>(this._host, \"Bonfire\");\n\n this._workshopManager = workshopManager;\n this._bulkManager = new BulkPurchaseHelper(this._host, this._workshopManager);\n }\n\n tick(context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n // We must call `.render()` here, because evaluation of availability of our options\n // is only performed when the game renders the contents of that tab.\n this.manager.render();\n\n this.autoBuild(context);\n this.autoMisc(context);\n }\n\n /**\n * Try to build as many of the passed buildings as possible.\n * Usually, this is called at each iteration of the automation engine to\n * handle the building of items on the Bonfire tab.\n *\n * @param builds The buildings to build.\n */\n autoBuild(\n context: FrameContext,\n builds: Partial<Record<BonfireItem, BonfireBuildingSetting>> = this.settings.buildings,\n ) {\n const bulkManager = this._bulkManager;\n\n // Get the current metadata for all the referenced buildings.\n const metaData: Partial<Record<BonfireItem, Required<UnsafeBuilding>>> = {};\n for (const build of Object.values(builds)) {\n metaData[build.building] = this.getBuild(\n (build.baseBuilding ?? build.building) as Building,\n ).meta;\n }\n const sectionTrigger = this.settings.trigger;\n\n // Let the bulkmanager determine the builds we can make.\n const buildList = bulkManager.bulk(builds, metaData, sectionTrigger, \"Bonfire\");\n\n // Build all entries in the build list, where we can build any items.\n for (const build of buildList.filter(item => 0 < item.count)) {\n this.build((build.name || build.id) as Building, build.stage, build.count);\n context.requestGameUiRefresh = true;\n }\n }\n\n autoUpgrade(context: FrameContext) {\n // Get current count of pastures.\n const pastures =\n this._host.game.bld.getBuildingExt(\"pasture\").meta.stage === 0\n ? this._host.game.bld.getBuildingExt(\"pasture\").meta.val\n : 0;\n // Get current count of aqueducts.\n const aqueducts =\n this._host.game.bld.getBuildingExt(\"aqueduct\").meta.stage === 0\n ? this._host.game.bld.getBuildingExt(\"aqueduct\").meta.val\n : 0;\n\n const pastureMeta = this._host.game.bld.getBuildingExt(\"pasture\").meta;\n // If pastures haven't been upgraded to solar farms yet...\n if (\n this.settings.upgradeBuildings.buildings.solarfarm.enabled &&\n pastureMeta.unlocked &&\n pastureMeta.stage === 0 &&\n mustExist(pastureMeta.stages)[1].stageUnlocked\n ) {\n // If we would reduce our pastures to 0, by upgrading them, would we lose any catnip?\n if (this._workshopManager.getPotentialCatnip(true, 0, aqueducts) > 0) {\n const prices = mustExist(pastureMeta.stages)[1].prices;\n if (this._bulkManager.singleBuildPossible(pastureMeta, prices, 1)) {\n const button = this.getBuildButton(\"pasture\", 0);\n if (!isNil(button?.model)) {\n // We need to perform the process like this to avoid UI confirmations\n // for selling items.\n // Sell all pastures (to regain the resources).\n button.controller.sellInternal(button.model, 0, false);\n // Manually update the metadata, as we bypassed the full selling logic.\n pastureMeta.on = 0;\n pastureMeta.val = 0;\n pastureMeta.stage = 1;\n\n this._host.engine.iactivity(\"upgrade.building.pasture\", [], \"ks-upgrade\");\n\n // Upgrade the pasture.\n this._host.game.ui?.render();\n this.build(\"pasture\", 1, 1);\n context.requestGameUiRefresh = true;\n }\n }\n }\n }\n\n const aqueductMeta = this._host.game.bld.getBuildingExt(\"aqueduct\").meta;\n // If aqueducts haven't been upgraded to hydro plants yet...\n if (\n this.settings.upgradeBuildings.buildings.hydroplant.enabled &&\n aqueductMeta.unlocked &&\n aqueductMeta.stage === 0 &&\n mustExist(aqueductMeta.stages)[1].stageUnlocked\n ) {\n // If we would reduce our aqueducts to 0, by upgrading them, would we lose any catnip?\n if (this._workshopManager.getPotentialCatnip(true, pastures, 0) > 0) {\n const prices = mustExist(aqueductMeta.stages)[1].prices;\n if (this._bulkManager.singleBuildPossible(aqueductMeta, prices, 1)) {\n const button = this.getBuildButton(\"aqueduct\", 0);\n if (!isNil(button?.model)) {\n button.controller.sellInternal(button.model, 0, false);\n aqueductMeta.on = 0;\n aqueductMeta.val = 0;\n aqueductMeta.stage = 1;\n\n // TODO: Why do we do this for the aqueduct and not for the pasture?\n aqueductMeta.calculateEffects?.(aqueductMeta, this._host.game);\n\n this._host.engine.iactivity(\"upgrade.building.aqueduct\", [], \"ks-upgrade\");\n\n this._host.game.ui?.render();\n this.build(\"aqueduct\", 1, 1);\n context.requestGameUiRefresh = true;\n }\n }\n }\n }\n\n const libraryMeta = this._host.game.bld.getBuildingExt(\"library\").meta;\n if (\n this.settings.upgradeBuildings.buildings.dataCenter.enabled &&\n libraryMeta.unlocked &&\n libraryMeta.stage === 0 &&\n mustExist(libraryMeta.stages)[1].stageUnlocked\n ) {\n let energyConsumptionRate = this._host.game.workshop.get(\"cryocomputing\").researched ? 1 : 2;\n if (this._host.game.challenges.currentChallenge === \"energy\") {\n energyConsumptionRate *= 2;\n }\n\n // This indicates how valuable a data center is, compared to a single library.\n // We check for possible upgrades, that would make them more valuable.\n let libToDat = 3;\n if (this._host.game.workshop.get(\"uplink\").researched) {\n libToDat *=\n 1 +\n this._host.game.bld.getBuildingExt(\"biolab\").meta.val *\n this._host.game.getEffect(\"uplinkDCRatio\");\n }\n if (this._host.game.workshop.get(\"machineLearning\").researched) {\n libToDat *=\n 1 +\n this._host.game.bld.getBuildingExt(\"aiCore\").meta.on *\n this._host.game.getEffect(\"dataCenterAIRatio\");\n }\n\n // We now have the energy consumption of data centers and the value of data centers.\n // Assuming, we would upgrade to data centers and buy as many as we need to have value\n // equal to our current libraries, and that wouldn't cap our energy, upgrade them.\n if (\n this._host.game.resPool.energyProd >=\n this._host.game.resPool.energyCons + (energyConsumptionRate * libraryMeta.val) / libToDat\n ) {\n const prices = mustExist(libraryMeta.stages)[1].prices;\n if (this._bulkManager.singleBuildPossible(libraryMeta, prices, 1)) {\n const button = mustExist(this.getBuildButton(\"library\", 0));\n if (isNil(button.model)) {\n return;\n }\n\n button.controller.sellInternal(button.model, 0, false);\n libraryMeta.on = 0;\n libraryMeta.val = 0;\n libraryMeta.stage = 1;\n libraryMeta.calculateEffects?.(libraryMeta, this._host.game);\n this._host.engine.iactivity(\"upgrade.building.library\", [], \"ks-upgrade\");\n this._host.game.ui?.render();\n this.build(\"library\", 1, 1);\n context.requestGameUiRefresh = true;\n return;\n }\n }\n }\n\n const warehouseMeta = this._host.game.bld.getBuildingExt(\"warehouse\").meta;\n if (\n this.settings.upgradeBuildings.buildings.spaceport.enabled &&\n warehouseMeta.unlocked &&\n warehouseMeta.stage === 0 &&\n mustExist(warehouseMeta.stages)[1].stageUnlocked\n ) {\n const prices = mustExist(warehouseMeta.stages)[1].prices;\n if (this._bulkManager.singleBuildPossible(warehouseMeta, prices, 1)) {\n const button = this.getBuildButton(\"warehouse\", 0);\n if (!isNil(button?.model)) {\n button.controller.sellInternal(button.model, 0, false);\n warehouseMeta.on = 0;\n warehouseMeta.val = 0;\n warehouseMeta.stage = 1;\n\n this._host.engine.iactivity(\"upgrade.building.warehouse\", [], \"ks-upgrade\");\n\n this._host.game.ui?.render();\n this.build(\"warehouse\", 1, 1);\n context.requestGameUiRefresh = true;\n\n return;\n }\n }\n }\n\n const amphitheatreMeta = this._host.game.bld.getBuildingExt(\"amphitheatre\").meta;\n // If amphitheathres haven't been upgraded to broadcast towers yet...\n // This seems to be identical to the pasture upgrade.\n if (\n this.settings.upgradeBuildings.buildings.broadcasttower.enabled &&\n amphitheatreMeta.unlocked &&\n amphitheatreMeta.stage === 0 &&\n mustExist(amphitheatreMeta.stages)[1].stageUnlocked\n ) {\n // TODO: This is problematic. Upgrading from 50 amphitheatres to 1 broadcast tower sucks\n // if you don't have enough resources to build several more.\n const prices = mustExist(amphitheatreMeta.stages)[1].prices;\n if (this._bulkManager.singleBuildPossible(amphitheatreMeta, prices, 1)) {\n const button = this.getBuildButton(\"amphitheatre\", 0);\n if (!isNil(button?.model)) {\n button.controller.sellInternal(button.model, 0, false);\n amphitheatreMeta.on = 0;\n amphitheatreMeta.val = 0;\n amphitheatreMeta.stage = 1;\n\n this._host.engine.iactivity(\"upgrade.building.amphitheatre\", [], \"ks-upgrade\");\n\n this._host.game.ui?.render();\n this.build(\"amphitheatre\", 1, 1);\n context.requestGameUiRefresh = true;\n }\n }\n }\n }\n\n autoMisc(context: FrameContext) {\n // Auto turn on steamworks\n if (this.settings.turnOnSteamworks.enabled) {\n const steamworks = this._host.game.bld.getBuildingExt(\"steamworks\");\n if (steamworks.meta.val && steamworks.meta.on === 0) {\n const button = mustExist(this.getBuildButton(\"steamworks\"));\n if (isNil(button.model)) {\n return;\n }\n\n button.controller.onAll(button.model);\n }\n }\n\n // Auto turn on magnetos\n if (this.settings.turnOnMagnetos.enabled) {\n const magnetos = this._host.game.bld.getBuildingExt(\"magneto\");\n if (magnetos.meta.val && magnetos.meta.on < magnetos.meta.val) {\n const button = mustExist(this.getBuildButton(\"magneto\"));\n if (isNil(button.model)) {\n return;\n }\n\n button.controller.onAll(button.model);\n }\n }\n\n // Auto turn on reactors\n if (this.settings.turnOnReactors.enabled) {\n const reactors = this._host.game.bld.getBuildingExt(\"reactor\");\n if (reactors.meta.val && reactors.meta.on < reactors.meta.val) {\n const button = mustExist(this.getBuildButton(\"reactor\"));\n if (isNil(button.model)) {\n return;\n }\n\n button.controller.onAll(button.model);\n }\n }\n\n // If buildings (upgrades of bonfire items) are enabled...\n if (this.settings.upgradeBuildings.enabled) {\n this.autoUpgrade(context);\n }\n\n if (this.settings.gatherCatnip.enabled) {\n this.autoGather();\n }\n }\n\n autoGather(): void {\n const controller = new classes.game.ui.GatherCatnipButtonController(\n this._host.game,\n ) as GatherCatnipButtonController;\n for (let clicks = 0; clicks < Math.floor(this._host.engine.settings.interval / 20); ++clicks) {\n controller.buyItem(undefined, null);\n }\n }\n\n build(name: Building, _stage: number | undefined, amount: number): void {\n let amountCalculated = amount;\n const amountTemp = amountCalculated;\n let label: string;\n const itemMetaRaw = game.getUnlockByName(name, \"buildings\");\n const meta = new classes.BuildingMeta(itemMetaRaw).getMeta();\n if (\"stages\" in meta) {\n const controller = new classes.ui.btn.StagingBldBtnController(\n this._host.game,\n ) as StagingBldBtnController<UnsafeBuildingBtnModernModel<UnsafeStagingBldButtonOptions>>;\n const model = controller.fetchModel({\n building: name,\n controller,\n description: mustExist(meta.description),\n name: mustExist(meta.label),\n twoRow: false,\n });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = meta.label ?? \"\";\n } else {\n const controller = new classes.ui.btn.BuildingBtnModernController(\n this._host.game,\n ) as BuildingBtnModernController<\n UnsafeBuildingBtnModernModel<UnsafeUnstagedBuildingButtonOptions>\n >;\n const model = controller.fetchModel({\n building: name,\n controller,\n description: mustExist(meta.description),\n name: mustExist(meta.label),\n twoRow: false,\n });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = meta.label ?? \"\";\n }\n\n if (amountCalculated !== amountTemp) {\n console.warn(\n ...cl(`${label} Amount ordered: ${amountTemp} Amount Constructed: ${amountCalculated}`),\n );\n // Bail out to not flood the log with garbage.\n if (amountCalculated === 0) {\n return;\n }\n }\n this._host.engine.storeForSummary(label, amountCalculated, \"build\");\n\n if (amountCalculated === 1) {\n this._host.engine.iactivity(\"act.build\", [label], \"ks-build\");\n } else {\n this._host.engine.iactivity(\n \"act.builds\",\n [label, this._host.renderAbsolute(amountCalculated)],\n \"ks-build\",\n );\n }\n }\n\n private _getBuildLabel(meta: UnsafeBuilding, stage?: number): string {\n return meta.stages && !isNil(stage) ? meta.stages[stage].label : mustExist(meta.label);\n }\n\n getBuild(name: Building): BuildingMeta<Required<UnsafeBuilding>> {\n return this._host.game.bld.getBuildingExt(name) as BuildingMeta<Required<UnsafeBuilding>>;\n }\n\n getBuildButton(name: Building, stage = 0) {\n const metaRaw = game.bld.get(name);\n const buildingMeta = (\n new classes.BuildingMeta(metaRaw) as BuildingMeta<UnsafeBuilding>\n ).getMeta();\n const meta = !isNil(buildingMeta.stages) ? buildingMeta.stages[stage] : metaRaw;\n const controller =\n \"stages\" in meta\n ? (new classes.ui.btn.StagingBldBtnController(\n this._host.game,\n ) as StagingBldBtnController<UnsafeBuildingBtnModernModel>)\n : (new classes.ui.btn.BuildingBtnModernController(\n this._host.game,\n ) as BuildingBtnModernController<UnsafeBuildingBtnModernModel>);\n const model = controller.fetchModel({\n building: name,\n description: meta.description,\n key: name,\n name: meta.label,\n });\n return { controller, model };\n }\n}\n","import { mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { KittenScientists } from \"../KittenScientists.js\";\nimport { roundToTwo, ucfirst } from \"../tools/Format.js\";\n\n/**\n * The different sections of the summary.\n */\nexport type ActivitySummarySection =\n | \"build\"\n | \"craft\"\n | \"faith\"\n | \"other\"\n | \"refine\"\n | \"research\"\n | \"trade\"\n | \"upgrade\";\n\n/**\n * Activities that are logged in the \"other\" section.\n */\nexport type ActivitySectionOther =\n | \"accelerate\"\n | \"adore\"\n | \"distribute\"\n | \"embassy\"\n | \"feed\"\n | \"festival\"\n | \"fix.cry\"\n | \"hunt\"\n | \"praise\"\n | \"promote\"\n | \"stars\"\n | \"transcend\";\n\nexport type Activity =\n | \"accelerate\"\n | \"adore\"\n | \"build\"\n | \"craft\"\n | \"distribute\"\n | \"faith\"\n | \"festival\"\n | \"fixCry\"\n | \"hunt\"\n | \"praise\"\n | \"promote\"\n | \"research\"\n | \"star\"\n | \"timeSkip\"\n | \"trade\"\n | \"transcend\"\n | \"upgrade\";\nexport type ActivityClass = `ks-${Activity}`;\nexport type ActivityTypeClass = `type_${ActivityClass}`;\n\nexport class ActivitySummary {\n private readonly _host: KittenScientists;\n\n /**\n * The day at which the activity summary was last reset.\n */\n private _lastday: number | undefined;\n\n /**\n * The year at which the activity summary was last reset.\n */\n private _lastyear: number | undefined;\n\n /**\n * The individual sections/categories of the activity summary.\n */\n private _sections = new Map<ActivitySummarySection, Map<string, number>>();\n\n constructor(host: KittenScientists) {\n this._host = host;\n this.resetActivity();\n }\n\n resetActivity(): void {\n this._sections = new Map<ActivitySummarySection, Map<string, number>>();\n this._lastday = this._host.game.calendar.day;\n this._lastyear = this._host.game.calendar.year;\n }\n\n storeActivity(name: string, amount = 1, section: ActivitySummarySection = \"other\"): void {\n if (!this._sections.has(section)) {\n this._sections.set(section, new Map<ActivitySectionOther, number>());\n }\n const summarySection = mustExist(this._sections.get(section));\n\n if (!summarySection.has(name)) {\n summarySection.set(name, 0);\n }\n summarySection.set(name, mustExist(summarySection.get(name)) + amount);\n }\n\n renderSummary(): Array<string> {\n const summary = new Array<string>();\n\n // Uncategorized items.\n if (this._sections.has(\"other\")) {\n const section = mustExist(this._sections.get(\"other\")) as Map<ActivitySectionOther, number>;\n section.forEach((amount, name) =>\n summary.push(\n this._host.engine.i18n(`summary.${name}` as const, [\n this._host.game.getDisplayValueExt(amount),\n ]),\n ),\n );\n }\n\n // Technologies.\n if (this._sections.has(\"research\")) {\n const section = mustExist(this._sections.get(\"research\"));\n section.forEach((_amount, name) => {\n summary.push(this._host.engine.i18n(\"summary.tech\", [ucfirst(name)]));\n });\n }\n\n // Upgrades.\n if (this._sections.has(\"upgrade\")) {\n const section = mustExist(this._sections.get(\"upgrade\"));\n section.forEach((_amount, name) => {\n summary.push(this._host.engine.i18n(\"summary.upgrade\", [ucfirst(name)]));\n });\n }\n\n // Upgrades.\n if (this._sections.has(\"build\")) {\n const section = mustExist(this._sections.get(\"build\"));\n section.forEach((amount, name) => {\n summary.push(\n this._host.engine.i18n(\"summary.building\", [\n this._host.game.getDisplayValueExt(amount),\n ucfirst(name),\n ]),\n );\n });\n }\n\n // Ziggurats\n if (this._sections.has(\"refine\")) {\n const section = mustExist(this._sections.get(\"refine\"));\n section.forEach((amount, name) => {\n summary.push(\n this._host.engine.i18n(\"summary.refine\", [\n this._host.game.getDisplayValueExt(amount),\n ucfirst(name),\n ]),\n );\n });\n }\n // Order of the sun.\n if (this._sections.has(\"faith\")) {\n const section = mustExist(this._sections.get(\"faith\"));\n section.forEach((amount, name) => {\n summary.push(\n this._host.engine.i18n(\"summary.sun\", [\n this._host.game.getDisplayValueExt(amount),\n ucfirst(name),\n ]),\n );\n });\n }\n\n // Crafts.\n if (this._sections.has(\"craft\")) {\n const section = mustExist(this._sections.get(\"craft\"));\n section.forEach((amount, name) => {\n summary.push(\n this._host.engine.i18n(\"summary.craft\", [\n this._host.game.getDisplayValueExt(amount),\n ucfirst(name),\n ]),\n );\n });\n }\n\n // Trades.\n if (this._sections.has(\"trade\")) {\n const section = mustExist(this._sections.get(\"trade\"));\n section.forEach((amount, name) => {\n summary.push(\n this._host.engine.i18n(\"summary.trade\", [\n this._host.game.getDisplayValueExt(amount),\n ucfirst(name),\n ]),\n );\n });\n }\n\n if (this._lastday && this._lastyear) {\n let years = this._host.game.calendar.year - this._lastyear;\n let days = this._host.game.calendar.day - this._lastday;\n\n if (days < 0) {\n years -= 1;\n days += 400;\n }\n\n let duration = \"\";\n if (years > 0) {\n duration += `${years} `;\n duration +=\n years === 1\n ? this._host.engine.i18n(\"summary.year\")\n : this._host.engine.i18n(\"summary.years\");\n }\n\n if (days >= 0) {\n if (years > 0) duration += this._host.engine.i18n(\"summary.separator\");\n duration += `${roundToTwo(days)} `;\n duration +=\n days === 1\n ? this._host.engine.i18n(\"summary.day\")\n : this._host.engine.i18n(\"summary.days\");\n }\n\n summary.push(this._host.engine.i18n(\"summary.head\", [duration]));\n }\n\n return summary;\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport {\n type FaithItem,\n ReligionUpgrades,\n TranscendenceUpgrades,\n type UnicornItem,\n UnicornItemVariant,\n type ZigguratUpgrade,\n ZigguratUpgrades,\n} from \"../types/index.js\";\nimport { Setting, SettingThreshold, SettingTrigger, SettingTriggerMax } from \"./Settings.js\";\n\nexport class ReligionSettingsItem extends SettingTriggerMax {\n readonly #building: FaithItem | UnicornItem;\n readonly #variant: UnicornItemVariant;\n\n get building() {\n return this.#building;\n }\n get variant() {\n return this.#variant;\n }\n\n constructor(building: FaithItem | UnicornItem, variant: UnicornItemVariant, enabled = false) {\n super(enabled);\n this.#building = building;\n this.#variant = variant;\n }\n}\n\nexport type ReligionSettingsItems = Record<FaithItem | UnicornItem, ReligionSettingsItem>;\n\nexport class ReligionSettings extends SettingTrigger {\n buildings: ReligionSettingsItems;\n\n /**\n * Build best unicorn building first.\n */\n bestUnicornBuilding: Setting;\n\n bestUnicornBuildingCurrent: ZigguratUpgrade | \"unicornPasture\" | null;\n\n /**\n * Sacrifice alicorns for time crystals.\n */\n sacrificeAlicorns: SettingThreshold;\n\n /**\n * Sacrifice unicorns for tears.\n */\n sacrificeUnicorns: SettingThreshold;\n\n /**\n * Refine tears into BLS.\n */\n refineTears: SettingThreshold;\n\n /**\n * Refine time crystals into relics.\n */\n refineTimeCrystals: SettingThreshold;\n\n /**\n * Praise the sun.\n */\n autoPraise: SettingTrigger;\n\n /**\n * Adore the galaxy.\n */\n adore: SettingTrigger;\n\n /**\n * Transcend.\n */\n transcend: Setting;\n\n constructor(\n enabled = false,\n trigger = -1,\n bestUnicornBuilding = new Setting(),\n sacrificeAlicorns = new SettingThreshold(false, -1),\n sacrificeUnicorns = new SettingThreshold(false, -1),\n refineTears = new SettingThreshold(false, -1),\n refineTimeCrystals = new SettingThreshold(false, -1),\n autoPraise = new SettingTrigger(false, 1),\n adore = new SettingTrigger(false, 1),\n transcend = new Setting(),\n ) {\n super(enabled, trigger);\n this.buildings = this.initBuildings();\n this.bestUnicornBuilding = bestUnicornBuilding;\n this.sacrificeAlicorns = sacrificeAlicorns;\n this.sacrificeUnicorns = sacrificeUnicorns;\n this.refineTears = refineTears;\n this.refineTimeCrystals = refineTimeCrystals;\n this.autoPraise = autoPraise;\n this.adore = adore;\n this.transcend = transcend;\n this.bestUnicornBuildingCurrent = null;\n }\n\n private initBuildings(): ReligionSettingsItems {\n const items = {} as ReligionSettingsItems;\n for (const item of ReligionUpgrades) {\n items[item] = new ReligionSettingsItem(item, UnicornItemVariant.OrderOfTheSun);\n }\n for (const item of TranscendenceUpgrades) {\n items[item] = new ReligionSettingsItem(item, UnicornItemVariant.Cryptotheology);\n }\n for (const item of ZigguratUpgrades) {\n items[item] = new ReligionSettingsItem(item, UnicornItemVariant.Ziggurat);\n }\n items.unicornPasture = new ReligionSettingsItem(\n \"unicornPasture\",\n UnicornItemVariant.UnicornPasture,\n );\n return items;\n }\n\n load(settings: Maybe<Partial<ReligionSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.max = item?.max ?? building.max;\n building.trigger = item?.trigger ?? building.trigger;\n });\n\n this.bestUnicornBuilding.load(settings.bestUnicornBuilding);\n this.sacrificeAlicorns.load(settings.sacrificeAlicorns);\n this.sacrificeUnicorns.load(settings.sacrificeUnicorns);\n this.refineTears.load(settings.refineTears);\n this.refineTimeCrystals.load(settings.refineTimeCrystals);\n this.autoPraise.load(settings.autoPraise);\n this.adore.load(settings.adore);\n this.transcend.load(settings.transcend);\n this.bestUnicornBuildingCurrent =\n settings.bestUnicornBuildingCurrent ?? this.bestUnicornBuildingCurrent;\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { InvalidOperationError } from \"@oliversalzburg/js-utils/errors/InvalidOperationError.js\";\nimport type { BonfireManager } from \"./BonfireManager.js\";\nimport type { Automation, FrameContext } from \"./Engine.js\";\nimport { BulkPurchaseHelper } from \"./helper/BulkPurchaseHelper.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { BonfireBuildingSetting } from \"./settings/BonfireSettings.js\";\nimport { ReligionSettings, type ReligionSettingsItem } from \"./settings/ReligionSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { negativeOneToInfinity } from \"./tools/Format.js\";\nimport { cl } from \"./tools/Log.js\";\nimport {\n type FaithItem,\n type ReligionItem,\n type ReligionUpgrade,\n type TranscendenceUpgrade,\n type UnicornItem,\n UnicornItems,\n UnicornItemVariant,\n type ZigguratUpgrade,\n} from \"./types/index.js\";\nimport type {\n CryptotheologyPanel,\n CryptotheologyWGT,\n ReligionBtnController,\n ReligionTab,\n TranscendenceBtnController,\n TransformBtnController,\n UnsafeReligionUpgrade,\n UnsafeTranscendenceBtnModel,\n UnsafeTranscendenceButtonOptions,\n UnsafeTranscendenceUpgrade,\n UnsafeTransformBtnModel,\n UnsafeZigguratUpgrade,\n ZigguratBtnController,\n} from \"./types/religion.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class ReligionManager implements Automation {\n private readonly _host: KittenScientists;\n readonly settings: ReligionSettings;\n readonly manager: TabManager<ReligionTab>;\n private readonly _bulkManager: BulkPurchaseHelper;\n private readonly _bonfireManager: BonfireManager;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n bonfireManager: BonfireManager,\n workshopManager: WorkshopManager,\n settings = new ReligionSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Religion\");\n this._workshopManager = workshopManager;\n this._bulkManager = new BulkPurchaseHelper(this._host, this._workshopManager);\n this._bonfireManager = bonfireManager;\n }\n\n async tick(context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n // We must call `.render()` here, because evaluation of availability of our options\n // is only performed when the game renders the contents of that tab.\n this.manager.render();\n\n this._autoBuild(context);\n\n if (this.settings.sacrificeUnicorns.enabled) {\n await this._autoSacrificeUnicorns();\n }\n\n if (this.settings.sacrificeAlicorns.enabled) {\n await this._autoSacrificeAlicorns(context);\n }\n\n if (this.settings.refineTears.enabled) {\n this._autoTears(context);\n }\n\n if (this.settings.refineTimeCrystals.enabled) {\n await this._autoTCs(context);\n }\n\n this._autoTAP();\n }\n\n private _autoBuild(context: FrameContext) {\n if (this.settings.bestUnicornBuilding.enabled) {\n this._buildBestUnicornBuilding();\n this._buildNonUnicornBuildings(context);\n } else {\n // Create the list of builds, excluding the unicorn pasture.\n // The unicorn pasture requires a special build path, because it's really\n // a bonfire building.\n const builds = Object.fromEntries(\n Object.entries(this.settings.buildings).filter(\n ([, building]) => building.variant !== UnicornItemVariant.UnicornPasture,\n ),\n );\n // Build a unicorn pasture if possible.\n const maxPastures = negativeOneToInfinity(this.settings.buildings.unicornPasture.max);\n const meta = this._host.game.bld.getBuildingExt(\"unicornPasture\").meta;\n if (this.settings.buildings.unicornPasture.enabled && meta.val < maxPastures) {\n this._bonfireManager.autoBuild(context, {\n unicornPasture: new BonfireBuildingSetting(\n \"unicornPasture\",\n this.settings.buildings.unicornPasture.enabled,\n this.settings.buildings.unicornPasture.trigger,\n this.settings.buildings.unicornPasture.max,\n ),\n });\n }\n // And then we build all other possible religion buildings.\n this._buildReligionBuildings(context, builds);\n }\n }\n\n private _buildBestUnicornBuilding() {\n const bestUnicornBuilding = this.getBestUnicornBuilding();\n if (this.settings.bestUnicornBuildingCurrent !== bestUnicornBuilding) {\n this.settings.bestUnicornBuildingCurrent = bestUnicornBuilding;\n this._host.refreshEntireUserInterface();\n }\n\n if (this.settings.bestUnicornBuildingCurrent === null) {\n return;\n }\n\n const sectionTrigger = this.settings.trigger;\n\n if (this.settings.bestUnicornBuildingCurrent === \"unicornPasture\") {\n this._bonfireManager.build(this.settings.bestUnicornBuildingCurrent, 0, 1);\n } else {\n const buildingButton = this._getBuildButton(\n this.settings.bestUnicornBuildingCurrent,\n UnicornItemVariant.Ziggurat,\n );\n if (isNil(buildingButton?.model)) {\n return;\n }\n\n let tearsNeeded = 0;\n const priceTears = mustExist(buildingButton.model.prices).find(\n subject => subject.name === \"tears\",\n );\n if (!isNil(priceTears)) {\n tearsNeeded = priceTears.val;\n }\n\n const tearsAvailableForUse =\n this._workshopManager.getValue(\"tears\") - this._workshopManager.getStock(\"tears\");\n\n if (!isNil(this._host.game.religionTab.sacrificeBtn) && tearsAvailableForUse < tearsNeeded) {\n // if no ziggurat, getBestUnicornBuilding will return unicornPasture\n // TODO: ☝ Yeah. So?\n\n // How many times can we sacrifice unicorns to make tears?\n const maxSacrifice = Math.floor(\n (this._workshopManager.getValue(\"unicorns\") -\n this._workshopManager.getStock(\"unicorns\")) /\n 2500,\n );\n\n // How many sacrifices would we need, so we'd end up with enough tears.\n const needSacrifice = Math.ceil(\n (tearsNeeded - tearsAvailableForUse) /\n this._host.game.bld.getBuildingExt(\"ziggurat\").meta.on,\n );\n\n // Sacrifice some unicorns to get the tears to buy the building.\n if (\n needSacrifice < maxSacrifice &&\n !isNil(this._host.game.religionTab.sacrificeBtn.model)\n ) {\n this._host.game.religionTab.sacrificeBtn?.controller?._transform(\n this._host.game.religionTab.sacrificeBtn.model,\n needSacrifice,\n );\n // iactivity?\n // TODO: ☝ Yeah, seems like a good idea.\n } else {\n // Not enough unicorns to sacrifice to make enough tears.\n return;\n }\n }\n\n // Let the BulkManager figure out if the build can be made.\n const buildRequest = {\n [this.settings.bestUnicornBuildingCurrent]:\n this.settings.buildings[this.settings.bestUnicornBuildingCurrent],\n };\n const build = this._bulkManager.bulk(\n buildRequest,\n this.getBuildMetaData(buildRequest),\n sectionTrigger,\n \"Religion\",\n );\n if (0 < build.length && 0 < build[0].count) {\n // We force only building 1 of the best unicorn building, because\n // afterwards the best unicorn building is likely going to change.\n this.build(this.settings.bestUnicornBuildingCurrent, UnicornItemVariant.Ziggurat, 1);\n }\n }\n }\n private _buildNonUnicornBuildings(context: FrameContext) {\n const alreadyHandled: Array<FaithItem | UnicornItem> = [...UnicornItems];\n const builds = Object.fromEntries(\n Object.entries(this.settings.buildings).filter(\n ([, building]) => !alreadyHandled.includes(building.building),\n ),\n );\n this._buildReligionBuildings(context, builds);\n }\n\n private _buildReligionBuildings(\n context: FrameContext,\n builds: Partial<Record<FaithItem, ReligionSettingsItem>>,\n ): void {\n // Render the tab to make sure that the buttons actually exist in the DOM. Otherwise we can't click them.\n this.manager.render();\n\n const metaData: Partial<\n Record<\n FaithItem,\n Required<UnsafeReligionUpgrade | UnsafeTranscendenceUpgrade | UnsafeZigguratUpgrade>\n >\n > = this.getBuildMetaData(builds);\n const sectionTrigger = this.settings.trigger;\n\n // Let the bulk manager figure out which of the builds to actually build.\n const buildList = this._bulkManager.bulk(builds, metaData, sectionTrigger, \"Religion\");\n\n for (const build of buildList) {\n if (0 < build.count) {\n this.build(\n build.id as ReligionItem | \"unicornPasture\",\n mustExist(build.variant) as UnicornItemVariant,\n build.count,\n );\n context.requestGameUiRefresh = true;\n }\n }\n }\n\n /**\n * Determine the best unicorn-related building to buy next.\n * This is the building where the cost is in the best proportion to the\n * unicorn production bonus it generates.\n *\n * @see https://github.com/Bioniclegenius/NummonCalc/blob/112f716e2fde9956dfe520021b0400cba7b7113e/NummonCalc.js#L490\n * @returns The best unicorn building.\n */\n getBestUnicornBuilding(): ZigguratUpgrade | \"unicornPasture\" | null {\n const pastureButton = this._bonfireManager.getBuildButton(\"unicornPasture\");\n if (pastureButton === null) {\n return null;\n }\n\n const validBuildings: Array<ZigguratUpgrade | \"unicornPasture\"> = [...UnicornItems].filter(\n item => item !== \"unicornPasture\",\n );\n\n // How many unicorns are produced per second.\n const unicornsPerSecondBase =\n this._host.game.getEffect(\"unicornsPerTickBase\") * this._host.game.getTicksPerSecondUI();\n // Unicorn ratio modifier. For example, through \"unicorn selection\".\n const globalRatio = this._host.game.getEffect(\"unicornsGlobalRatio\") + 1;\n // The unicorn ratio modifier through religion buildings.\n const religionRatio = this._host.game.getEffect(\"unicornsRatioReligion\") + 1;\n // The ratio modifier through paragon.\n const paragonRatio = this._host.game.prestige.getParagonProductionRatio() + 1;\n // Bonus from collected faith.\n const faithBonus = this._host.game.religion.getSolarRevolutionRatio() + 1;\n\n const currentCycleIndex = this._host.game.calendar.cycle;\n const currentCycle = this._host.game.calendar.cycles[currentCycleIndex];\n\n // The modifier applied by the current cycle and holding a festival.\n let cycleBonus = 1;\n // If the current cycle has an effect on unicorn production during festivals\n // TODO: Simplify\n if (currentCycle.festivalEffects.unicorns !== undefined) {\n // Numeromancy is the metaphysics upgrade that grants bonuses based on cycles.\n if (\n this._host.game.prestige.getPerk(\"numeromancy\").researched &&\n this._host.game.calendar.festivalDays\n ) {\n cycleBonus = currentCycle.festivalEffects.unicorns;\n }\n }\n\n const unicornsPerSecond =\n unicornsPerSecondBase * globalRatio * religionRatio * paragonRatio * faithBonus * cycleBonus;\n\n // Based on how many ziggurats we have.\n const zigguratRatio = Math.max(this._host.game.bld.getBuildingExt(\"ziggurat\").meta.on, 1);\n // How many unicorns do we receive in a unicorn rift?\n const baseUnicornsPerRift =\n 500 * (1 + this._host.game.getEffect(\"unicornsRatioReligion\") * 0.1);\n\n // How likely are unicorn rifts to happen? The unicornmancy metaphysics upgrade increases this chance.\n let riftChanceRatio = 1;\n if (this._host.game.prestige.getPerk(\"unicornmancy\").researched) {\n riftChanceRatio *= 1.1;\n }\n // ?\n const unicornRiftChange =\n ((this._host.game.getEffect(\"riftChance\") * riftChanceRatio) / (10000 * 2)) *\n baseUnicornsPerRift;\n\n // We now want to determine how quickly the cost of given building is neutralized\n // by its effect on production of unicorns.\n\n let bestAmortization = Number.POSITIVE_INFINITY;\n let bestBuilding: ZigguratUpgrade | \"unicornPasture\" | null = null;\n const unicornsPerTickBase = mustExist(\n this._host.game.bld.getBuildingExt(\"unicornPasture\").meta.effects?.unicornsPerTickBase,\n );\n const pastureProduction =\n unicornsPerTickBase *\n this._host.game.getTicksPerSecondUI() *\n globalRatio *\n religionRatio *\n paragonRatio *\n faithBonus *\n cycleBonus;\n\n // If the unicorn pasture amortizes itself in less than infinity ticks,\n // set it as the default. This is likely to protect against cases where\n // production of unicorns is 0.\n const pastureAmortization = mustExist(pastureButton.model?.prices)[0].val / pastureProduction;\n if (pastureAmortization < bestAmortization) {\n bestAmortization = pastureAmortization;\n bestBuilding = \"unicornPasture\";\n }\n\n // For all ziggurat upgrade buttons...\n for (const button of this.manager.tab.zgUpgradeButtons) {\n // ...that are in the \"valid\" buildings (are unicorn-related) and visible (unlocked)...\n if (validBuildings.includes(button.id) && button.model.visible) {\n // Determine a price value for this building.\n let unicornPrice = 0;\n for (const price of mustExist(button.model.prices)) {\n // Add the amount of unicorns the building costs (if any).\n if (price.name === \"unicorns\") {\n unicornPrice += price.val;\n }\n // Tears result from unicorn sacrifices, so factor that into the price proportionally.\n if (price.name === \"tears\") {\n unicornPrice += (price.val * 2500) / zigguratRatio;\n }\n }\n\n // Determine the effect the building will have on unicorn production and unicorn rifts.\n const buildingInfo = mustExist(this._host.game.religion.getZU(button.id));\n let religionBonus = religionRatio;\n let riftChance = this._host.game.getEffect(\"riftChance\");\n for (const effect in buildingInfo.effects) {\n if (effect === \"unicornsRatioReligion\") {\n religionBonus += mustExist(buildingInfo.effects.unicornsRatioReligion);\n }\n if (effect === \"riftChance\") {\n riftChance += mustExist(buildingInfo.effects.riftChance);\n }\n }\n\n // The rest should be straight forward.\n const unicornsPerRift = 500 * ((religionBonus - 1) * 0.1 + 1);\n let riftBonus = ((riftChance * riftChanceRatio) / (10000 * 2)) * unicornsPerRift;\n riftBonus -= unicornRiftChange;\n let buildingProduction =\n unicornsPerSecondBase *\n globalRatio *\n religionBonus *\n paragonRatio *\n faithBonus *\n cycleBonus;\n buildingProduction -= unicornsPerSecond;\n buildingProduction += riftBonus;\n const amortization = unicornPrice / buildingProduction;\n\n if (amortization < bestAmortization) {\n if (0 < riftBonus || (religionRatio < religionBonus && 0 < unicornPrice)) {\n bestAmortization = amortization;\n bestBuilding = button.id;\n }\n }\n }\n }\n return bestBuilding;\n }\n\n build(name: ReligionItem | \"unicornPasture\", variant: UnicornItemVariant, amount: number): void {\n let amountCalculated = amount;\n const amountTemp = amountCalculated;\n let label: string;\n if (variant === UnicornItemVariant.Cryptotheology) {\n const itemMetaRaw = game.getUnlockByName(name, \"transcendenceUpgrades\");\n const controller = new classes.ui.TranscendenceBtnController(\n this._host.game,\n ) as TranscendenceBtnController<\n UnsafeTranscendenceBtnModel<UnsafeTranscendenceButtonOptions>\n >;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n } else if (variant === UnicornItemVariant.OrderOfTheSun) {\n const itemMetaRaw = game.getUnlockByName(name, \"religion\");\n const controller = new com.nuclearunicorn.game.ui.ReligionBtnController(\n this._host.game,\n ) as ReligionBtnController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n } else if (variant === UnicornItemVariant.Ziggurat) {\n const itemMetaRaw = game.getUnlockByName(name, \"zigguratUpgrades\");\n const controller = new com.nuclearunicorn.game.ui.ZigguratBtnController(\n this._host.game,\n ) as ZigguratBtnController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n } else {\n throw new InvalidOperationError(\"unsupported\");\n }\n\n if (amountCalculated !== amountTemp) {\n console.warn(\n ...cl(`${label} Amount ordered: ${amountTemp} Amount Constructed: ${amountCalculated}`),\n );\n // Bail out to not flood the log with garbage.\n if (amountCalculated === 0) {\n return;\n }\n }\n\n if (variant === UnicornItemVariant.OrderOfTheSun) {\n this._host.engine.storeForSummary(label, amountCalculated, \"faith\");\n if (amountCalculated === 1) {\n this._host.engine.iactivity(\"act.sun.discover\", [label], \"ks-faith\");\n } else {\n this._host.engine.iactivity(\n \"act.sun.discovers\",\n [label, this._host.renderAbsolute(amountCalculated)],\n \"ks-faith\",\n );\n }\n } else {\n this._host.engine.storeForSummary(label, amountCalculated, \"build\");\n if (amountCalculated === 1) {\n this._host.engine.iactivity(\"act.build\", [label], \"ks-build\");\n } else {\n this._host.engine.iactivity(\n \"act.builds\",\n [label, this._host.renderAbsolute(amountCalculated)],\n \"ks-build\",\n );\n }\n }\n }\n\n getBuildMetaData(builds: Partial<Record<FaithItem, ReligionSettingsItem>>) {\n const metaData: Partial<\n Record<\n FaithItem,\n Required<UnsafeReligionUpgrade | UnsafeTranscendenceUpgrade | UnsafeZigguratUpgrade>\n >\n > = {};\n for (const build of Object.values(builds)) {\n const buildInfo = this.getBuild(build.building, build.variant);\n if (buildInfo === null) {\n continue;\n }\n metaData[build.building as FaithItem] = buildInfo;\n const buildMetaData = mustExist(metaData[build.building as FaithItem]);\n\n // If an item is marked as `rHidden`, it wouldn't be build.\n // TODO: Why not remove it from the `builds` then?\n if (!this._getBuildButton(build.building, build.variant)) {\n buildMetaData.rHidden = true;\n } else {\n const model = mustExist(this._getBuildButton(build.building, build.variant)).model;\n const panel =\n build.variant === UnicornItemVariant.Cryptotheology\n ? this._host.game.science.get(\"cryptotheology\").researched\n : true;\n buildMetaData.rHidden = !(model?.visible && model.enabled && panel);\n }\n }\n\n return metaData;\n }\n\n /**\n * Retrieve information about an upgrade.\n *\n * @param name The name of the upgrade.\n * @param variant The variant of the upgrade.\n * @returns The build information for the upgrade.\n */\n getBuild(name: ReligionItem | \"unicornPasture\", variant: UnicornItemVariant) {\n switch (variant) {\n case UnicornItemVariant.Ziggurat:\n return this._host.game.religion.getZU(name as ZigguratUpgrade) ?? null;\n case UnicornItemVariant.OrderOfTheSun:\n return this._host.game.religion.getRU(name as ReligionUpgrade) ?? null;\n case UnicornItemVariant.Cryptotheology:\n return this._host.game.religion.getTU(name as TranscendenceUpgrade) ?? null;\n }\n throw new Error(`Unknown build: ${name} (${variant})`);\n }\n\n /**\n * Find the button that allows purchasing a given upgrade.\n *\n * @param name The name of the upgrade.\n * @param variant The variant of the upgrade.\n * @returns The button to buy the upgrade, or `null`.\n */\n private _getBuildButton(name: ReligionItem | \"unicornPasture\", variant: UnicornItemVariant) {\n let buttons:\n | typeof this.manager.tab.zgUpgradeButtons\n | typeof this.manager.tab.rUpgradeButtons\n | CryptotheologyWGT[\"children\"];\n switch (variant) {\n case UnicornItemVariant.Ziggurat:\n buttons = this.manager.tab.zgUpgradeButtons;\n break;\n case UnicornItemVariant.OrderOfTheSun:\n buttons = this.manager.tab.rUpgradeButtons;\n break;\n case UnicornItemVariant.Cryptotheology:\n buttons = (this.manager.tab.children[0] as CryptotheologyPanel).children[0].children;\n break;\n default:\n throw new Error(`Invalid variant '${variant}'`);\n }\n\n if (buttons.length === 0) {\n // Series of upgrades is not unlocked yet.\n return null;\n }\n\n const button = buttons.find(button => button.id === name) ?? null;\n\n if (button === null) {\n console.debug(...cl(`Couldn't find button for ${name}! This will likely create problems.`));\n }\n\n return button;\n }\n\n private _transformBtnSacrificeHelper<TModel extends UnsafeTransformBtnModel>(\n available: number,\n total: number,\n controller: TransformBtnController<TModel>,\n model: TModel,\n ) {\n const conversionPercentage = available / total;\n const percentageInverse = 1 / conversionPercentage;\n\n const customController = new classes.ui.religion.TransformBtnController(\n game,\n controller.controllerOpts,\n ) as TransformBtnController<TModel, Record<string, unknown>>;\n\n const link = customController._newLink(model, percentageInverse);\n return new Promise<boolean>(resolve => {\n link.handler(new Event(\"decoy\"), resolve);\n });\n }\n\n private async _autoSacrificeUnicorns() {\n const unicorns = this._workshopManager.getResource(\"unicorns\");\n const available = this._workshopManager.getValueAvailable(\"unicorns\");\n\n if (\n !isNil(this._host.game.religionTab.sacrificeBtn) &&\n negativeOneToInfinity(this.settings.sacrificeUnicorns.trigger) <= available &&\n negativeOneToInfinity(this.settings.sacrificeUnicorns.trigger) <= unicorns.value\n ) {\n const controller = this._host.game.religionTab.sacrificeBtn.controller;\n const model = this._host.game.religionTab.sacrificeBtn.model;\n\n if (isNil(model)) {\n return;\n }\n\n await this._transformBtnSacrificeHelper(available, unicorns.value, controller, model);\n\n const availableNow = this._workshopManager.getValueAvailable(\"unicorns\");\n const cost = available - availableNow;\n\n this._host.engine.iactivity(\n \"act.sacrificeUnicorns\",\n [this._host.game.getDisplayValueExt(cost)],\n \"ks-faith\",\n );\n this._host.engine.storeForSummary(\n this._host.engine.i18n(\"$resources.unicorns.title\"),\n cost,\n \"refine\",\n );\n }\n }\n\n private async _autoSacrificeAlicorns(context: FrameContext) {\n const alicorns = this._workshopManager.getResource(\"alicorn\");\n const available = this._workshopManager.getValueAvailable(\"alicorn\");\n if (\n !isNil(this._host.game.religionTab.sacrificeAlicornsBtn) &&\n negativeOneToInfinity(this.settings.sacrificeAlicorns.trigger) <= available &&\n negativeOneToInfinity(this.settings.sacrificeAlicorns.trigger) <= alicorns.value\n ) {\n this._host.game.religionTab.sacrificeAlicornsBtn.render();\n const controller = this._host.game.religionTab.sacrificeAlicornsBtn.controller;\n const model = this._host.game.religionTab.sacrificeAlicornsBtn.model;\n\n if (isNil(model)) {\n context.requestGameUiRefresh = true;\n return;\n }\n\n await this._transformBtnSacrificeHelper(available, alicorns.value, controller, model);\n\n const availableNow = this._workshopManager.getValueAvailable(\"alicorn\");\n const cost = available - availableNow;\n\n this._host.engine.iactivity(\n \"act.sacrificeAlicorns\",\n [this._host.game.getDisplayValueExt(cost)],\n \"ks-faith\",\n );\n this._host.engine.storeForSummary(\n this._host.engine.i18n(\"$resources.alicorn.title\"),\n cost,\n \"refine\",\n );\n }\n }\n\n private _autoTears(context: FrameContext) {\n const tears = this._workshopManager.getResource(\"tears\");\n const available = this._workshopManager.getValueAvailable(\"tears\");\n const sorrow = this._workshopManager.getResource(\"sorrow\");\n if (\n !isNil(this._host.game.religionTab.refineBtn) &&\n negativeOneToInfinity(this.settings.refineTears.trigger) <= available &&\n negativeOneToInfinity(this.settings.refineTears.trigger) <= tears.value &&\n sorrow.value < sorrow.maxValue\n ) {\n const availableForConversion = available - this.settings.refineTears.trigger;\n\n if (availableForConversion < 10000) {\n return;\n }\n\n const controller = this._host.game.religionTab.refineBtn.controller;\n const model = this._host.game.religionTab.refineBtn.model;\n\n if (isNil(model)) {\n context.requestGameUiRefresh = true;\n return;\n }\n\n controller.buyItem(model, new Event(\"decoy\"), availableForConversion);\n\n const availableNow = this._workshopManager.getValueAvailable(\"tears\");\n const cost = available - availableNow;\n\n this._host.engine.iactivity(\n \"act.refineTears\",\n [this._host.game.getDisplayValueExt(cost)],\n \"ks-faith\",\n );\n this._host.engine.storeForSummary(\n this._host.engine.i18n(\"$resources.tears.title\"),\n cost,\n \"refine\",\n );\n }\n }\n\n private async _autoTCs(context: FrameContext) {\n const timeCrystals = this._workshopManager.getResource(\"timeCrystal\");\n const available = this._workshopManager.getValueAvailable(\"timeCrystal\");\n if (\n !isNil(this._host.game.religionTab.refineTCBtn) &&\n negativeOneToInfinity(this.settings.refineTimeCrystals.trigger) <= available &&\n negativeOneToInfinity(this.settings.refineTimeCrystals.trigger) <= timeCrystals.value\n ) {\n const controller = this._host.game.religionTab.refineTCBtn.controller;\n const model = this._host.game.religionTab.refineTCBtn.model;\n\n if (isNil(model)) {\n context.requestGameUiRefresh = true;\n return;\n }\n\n await this._transformBtnSacrificeHelper(available, timeCrystals.value, controller, model);\n\n const availableNow = this._workshopManager.getValueAvailable(\"timeCrystal\");\n const cost = available - availableNow;\n\n this._host.engine.iactivity(\n \"act.refineTCs\",\n [this._host.game.getDisplayValueExt(cost)],\n \"ks-faith\",\n );\n this._host.engine.storeForSummary(\n this._host.engine.i18n(\"$resources.timeCrystal.title\"),\n cost,\n \"refine\",\n );\n }\n }\n\n private _autoTAP() {\n const faith = this._workshopManager.getResource(\"faith\");\n const faithLevel = faith.value / faith.maxValue;\n // enough faith, and then TAP (transcend, adore, praise)\n if (this.settings.transcend.enabled && this.settings.autoPraise.trigger - 0.02 <= faithLevel) {\n this._autoTranscend();\n }\n\n // Praise (faith → worship)\n if (this.settings.autoPraise.trigger <= faithLevel) {\n // Adore the galaxy (worship → epiphany)\n if (\n this.settings.adore.enabled &&\n mustExist(this._host.game.religion.getRU(\"apocripha\")).on\n ) {\n this._autoAdore(this.settings.adore.trigger);\n }\n\n if (this.settings.autoPraise.enabled) {\n this._autoPraise();\n }\n }\n }\n\n private _autoAdore(trigger: number) {\n const faith = this._workshopManager.getResource(\"faith\");\n\n const worship = this._host.game.religion.faith;\n const epiphany = this._host.game.religion.faithRatio;\n const transcendenceReached = mustExist(this._host.game.religion.getRU(\"transcendence\")).on;\n const transcendenceTierCurrent = transcendenceReached\n ? this._host.game.religion.transcendenceTier\n : 0;\n // game version: 1.4.8.1\n // solarRevolutionLimit is increased by black obelisks.\n const maxSolarRevolution = 10 + this._host.game.getEffect(\"solarRevolutionLimit\");\n // The absolute value at which to trigger adoring the galaxy.\n const triggerSolarRevolution = maxSolarRevolution * trigger;\n // How much epiphany we'll get from converting our worship.\n const epiphanyIncrease =\n (worship / 1000000) * transcendenceTierCurrent * transcendenceTierCurrent * 1.01;\n // How much epiphany we'll have after adoring.\n const epiphanyAfterAdore = epiphany + epiphanyIncrease;\n // How much worship we'll have after adoring.\n const worshipAfterAdore =\n 0.01 + faith.value * (1 + this._host.game.getUnlimitedDR(epiphanyAfterAdore, 0.1) * 0.1);\n // How much solar revolution bonus we'll have after adoring.\n const solarRevolutionAfterAdore = this._host.game.getLimitedDR(\n this._host.game.getUnlimitedDR(worshipAfterAdore, 1000) / 100,\n maxSolarRevolution,\n );\n // After adoring the galaxy, we want a single praise to be able to reach the trigger\n // level of solar revolution bonus.\n if (triggerSolarRevolution <= solarRevolutionAfterAdore) {\n // Perform the actual adoration.\n this._host.game.religion._resetFaithInternal(1.01);\n\n // Log the action.\n this._host.engine.iactivity(\n \"act.adore\",\n [\n this._host.game.getDisplayValueExt(worship),\n this._host.game.getDisplayValueExt(epiphanyIncrease),\n ],\n \"ks-adore\",\n );\n this._host.engine.storeForSummary(\"adore\", epiphanyIncrease);\n }\n }\n\n private _autoTranscend() {\n let epiphany = this._host.game.religion.faithRatio;\n const transcendenceReached = mustExist(this._host.game.religion.getRU(\"transcendence\")).on;\n let transcendenceTierCurrent = transcendenceReached\n ? this._host.game.religion.transcendenceTier\n : 0;\n\n // Transcend\n if (transcendenceReached) {\n // How much our adoration ratio increases from transcending.\n const adoreIncreaseRatio =\n ((transcendenceTierCurrent + 2) / (transcendenceTierCurrent + 1)) ** 2;\n // The amount of worship needed to upgrade to the next level.\n const needNextLevel =\n this._host.game.religion._getTranscendTotalPrice(transcendenceTierCurrent + 1) -\n this._host.game.religion._getTranscendTotalPrice(transcendenceTierCurrent);\n\n // We want to determine the ideal value for when to transcend.\n // TODO: How exactly this works isn't understood yet.\n const x = needNextLevel;\n const k = adoreIncreaseRatio;\n const epiphanyRecommend =\n ((1 - k + Math.sqrt(80 * (k * k - 1) * x + (k - 1) * (k - 1))) * k) /\n (40 * (k + 1) * (k + 1) * (k - 1)) +\n x +\n x / (k * k - 1);\n\n if (epiphanyRecommend <= epiphany) {\n // code copy from kittens game's religion.js: this._host.game.religion.transcend()\n // this._host.game.religion.transcend() need confirm by player\n // game version: 1.4.8.1\n // ========================================================================================================\n // DO TRANSCEND START\n // ========================================================================================================\n this._host.game.religion.faithRatio -= needNextLevel;\n this._host.game.religion.tcratio += needNextLevel;\n this._host.game.religion.transcendenceTier += 1;\n\n const atheism = mustExist(this._host.game.challenges.getChallenge(\"atheism\"));\n atheism.calculateEffects?.(atheism, this._host.game);\n const blackObelisk = mustExist(this._host.game.religion.getTU(\"blackObelisk\"));\n blackObelisk.calculateEffects?.(blackObelisk, this._host.game);\n\n this._host.game.msg(\n this._host.engine.i18n(\"$religion.transcend.msg.success\", [\n this._host.game.religion.transcendenceTier,\n ]),\n );\n // ========================================================================================================\n // DO TRANSCEND END\n // ========================================================================================================\n\n epiphany = this._host.game.religion.faithRatio;\n transcendenceTierCurrent = this._host.game.religion.transcendenceTier;\n this._host.engine.iactivity(\n \"act.transcend\",\n [this._host.game.getDisplayValueExt(needNextLevel), transcendenceTierCurrent],\n \"ks-transcend\",\n );\n this._host.engine.storeForSummary(\"transcend\", 1);\n }\n }\n }\n\n private _autoPraise() {\n const faith = this._workshopManager.getResource(\"faith\");\n const apocryphaBonus = this._host.game.religion.getApocryphaBonus();\n\n // Determine how much worship we'll gain and log it.\n const worshipIncrease = faith.value * (1 + apocryphaBonus);\n this._host.engine.storeForSummary(\"praise\", worshipIncrease);\n this._host.engine.iactivity(\n \"act.praise\",\n [\n this._host.game.getDisplayValueExt(faith.value),\n this._host.game.getDisplayValueExt(worshipIncrease),\n ],\n \"ks-praise\",\n );\n\n // Now finally praise the sun.\n this._host.game.religion.praise();\n }\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { Policies, type Policy } from \"../types/index.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class PolicySetting extends Setting {\n readonly #policy: Policy;\n\n get policy() {\n return this.#policy;\n }\n\n constructor(policy: Policy, enabled = false) {\n super(enabled);\n this.#policy = policy;\n }\n}\n\nexport type PolicyPolicySettings = Record<Policy, PolicySetting>;\n\nexport class PolicySettings extends Setting {\n policies: PolicyPolicySettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.policies = this.initPolicies();\n }\n\n private initPolicies(): PolicyPolicySettings {\n const items = {} as PolicyPolicySettings;\n for (const item of Policies) {\n items[item] = new PolicySetting(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: PolicySettings) {\n const inSettings = Object.keys(settings.policies);\n const inGame = game.science.policies.map(policy => policy.name);\n\n const missingInSettings = difference(inGame, inSettings);\n const redundantInSettings = difference(inSettings, inGame);\n\n for (const policy of missingInSettings) {\n console.warn(...cl(`The policy '${policy}' is not tracked in Kitten Scientists!`));\n }\n for (const policy of redundantInSettings) {\n console.warn(...cl(`The policy '${policy}' is not a policy in Kittens Game!`));\n }\n }\n\n load(settings: Maybe<Partial<PolicySettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.policies, settings.policies, (policy, item) => {\n policy.enabled = item?.enabled ?? policy.enabled;\n });\n }\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport {\n Technologies,\n TechnologiesIgnored,\n type Technology,\n type TechnologyIgnored,\n} from \"../types/index.js\";\nimport { SettingTrigger } from \"./Settings.js\";\n\ntype AnyTechnology = Technology | TechnologyIgnored;\n\nexport class TechSetting extends SettingTrigger {\n readonly #tech: Technology;\n\n get tech() {\n return this.#tech;\n }\n\n constructor(tech: Technology, enabled = false) {\n super(enabled, -1);\n this.#tech = tech;\n }\n}\n\nexport type TechTechSettings = Record<Technology, TechSetting>;\n\nexport class TechSettings extends SettingTrigger {\n techs: TechTechSettings;\n\n constructor(enabled = false) {\n super(enabled, -1);\n this.techs = this.initTechs();\n }\n\n private initTechs(): TechTechSettings {\n const items = {} as TechTechSettings;\n for (const item of Technologies) {\n items[item] = new TechSetting(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: TechSettings) {\n const inSettings = Object.keys(settings.techs);\n const inGame = game.science.techs.map(tech => tech.name);\n\n const missingInSettings = difference(inGame, inSettings) as Array<AnyTechnology>;\n const redundantInSettings = difference(inSettings, inGame) as Array<AnyTechnology>;\n\n for (const tech of missingInSettings) {\n if (TechnologiesIgnored.includes(tech as TechnologyIgnored)) {\n continue;\n }\n\n console.warn(...cl(`The technology '${tech}' is not tracked in Kitten Scientists!`));\n }\n for (const tech of redundantInSettings) {\n if (TechnologiesIgnored.includes(tech as TechnologyIgnored)) {\n console.info(\n ...cl(\n `The technology '${tech}' is a technology in Kittens Game, but it's no longer used.`,\n ),\n );\n continue;\n }\n\n console.warn(...cl(`The technology '${tech}' is not a technology in Kittens Game!`));\n }\n }\n\n load(settings: Maybe<Partial<TechSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.techs, settings.techs, (tech, item) => {\n tech.enabled = item?.enabled ?? tech.enabled;\n tech.trigger = item?.trigger ?? tech.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { PolicySettings } from \"./PolicySettings.js\";\nimport { Setting } from \"./Settings.js\";\nimport { TechSettings } from \"./TechSettings.js\";\n\nexport type ScienceItem = \"policies\" | \"techs\";\nexport type ScienceSettingsItem = TechSettings | PolicySettings;\n\nexport class ScienceSettings extends Setting {\n policies: PolicySettings;\n techs: TechSettings;\n observe: Setting;\n\n constructor(\n enabled = false,\n policies = new PolicySettings(),\n techs = new TechSettings(),\n observe = new Setting(),\n ) {\n super(enabled);\n this.policies = policies;\n this.techs = techs;\n this.observe = observe;\n }\n\n static validateGame(game: GamePage, settings: ScienceSettings) {\n PolicySettings.validateGame(game, settings.policies);\n TechSettings.validateGame(game, settings.techs);\n }\n\n load(settings: Maybe<Partial<ScienceSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n this.policies.load(settings.policies);\n this.techs.load(settings.techs);\n\n this.observe.enabled = settings.observe?.enabled ?? this.observe.enabled;\n }\n}\n","import type { KittenScientists } from \"./KittenScientists.js\";\nimport type { TabManager } from \"./TabManager.js\";\nimport type { Policy, Technology, Upgrade } from \"./types/index.js\";\nimport type { PolicyBtnController, TechButtonController } from \"./types/science.js\";\nimport type { UpgradeButtonController } from \"./types/workshop.js\";\n\nexport abstract class UpgradeManager {\n protected readonly _host: KittenScientists;\n abstract manager: TabManager;\n\n constructor(host: KittenScientists) {\n this._host = host;\n }\n\n upgrade(\n upgrade: { label: string; name: Policy | Upgrade | Technology },\n variant: \"policy\" | \"science\" | \"workshop\",\n ): boolean {\n let success = false;\n if (variant === \"policy\") {\n const itemMetaRaw = game.getUnlockByName(upgrade.name, \"policies\");\n const controller = new classes.ui.PolicyBtnController(this._host.game) as PolicyBtnController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n success = UpgradeManager.skipConfirm(() => controller.buyItem(model)).itemBought;\n } else if (variant === \"science\") {\n const itemMetaRaw = game.getUnlockByName(upgrade.name, \"tech\");\n const controller = new com.nuclearunicorn.game.ui.TechButtonController(\n this._host.game,\n ) as TechButtonController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n success = UpgradeManager.skipConfirm(() => controller.buyItem(model)).itemBought;\n } else {\n const itemMetaRaw = game.getUnlockByName(upgrade.name, \"upgrades\");\n const controller = new com.nuclearunicorn.game.ui.UpgradeButtonController(\n this._host.game,\n ) as UpgradeButtonController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n success = UpgradeManager.skipConfirm(() => controller.buyItem(model)).itemBought;\n }\n\n if (!success) {\n return false;\n }\n\n const label = upgrade.label;\n\n if (variant === \"workshop\") {\n this._host.engine.storeForSummary(label, 1, \"upgrade\");\n this._host.engine.iactivity(\"upgrade.upgrade\", [label], \"ks-upgrade\");\n } else if (variant === \"policy\") {\n this._host.engine.iactivity(\"upgrade.policy\", [label]);\n } else if (variant === \"science\") {\n this._host.engine.storeForSummary(label, 1, \"research\");\n this._host.engine.iactivity(\"upgrade.tech\", [label], \"ks-research\");\n }\n\n return true;\n }\n\n /**\n * Run a piece of code that might invoke UI confirmation and\n * skip that UI confirmation.\n *\n * @param action The function to run without UI confirmation.\n * @returns Whatever `action` returns.\n */\n static async skipConfirmAsync<T>(action: () => Promise<T>): Promise<T> {\n const originalConfirm = game.ui.confirm;\n try {\n game.ui.confirm = () => true;\n return await action();\n } finally {\n game.ui.confirm = originalConfirm;\n }\n }\n static skipConfirm<T>(action: () => T): T {\n const originalConfirm = game.ui.confirm;\n try {\n game.ui.confirm = () => true;\n return action();\n } finally {\n game.ui.confirm = originalConfirm;\n }\n }\n}\n","import { redirectErrorsToConsole } from \"../errors/console.js\";\n/**\n * Wraps the given asynchronous function in a new function that will ignore any outcome of\n * the context as it resolves.\n *\n * This can be useful when providing asynchonous event handler to `.addEventlistener()`,\n * which only expects synchronous functions.\n * @param context - The asynchronous function to execute.\n * @returns A function returning nothing.\n */\nexport const prepareAsyncContext = (context) => {\n return (\n /**\n * The arguments that our new function was called with.\n */\n ...args) => {\n void context(...args)\n .then(() => undefined)\n .catch(redirectErrorsToConsole(console));\n };\n};\n/**\n * Executes an asynchronous function and resolves with an alternative result\n * in case the function failed.\n * @param executable - The asynchronous function to execute.\n * @param to - The result we want to return when the function errors.\n * @param filter - An {@linkcode !Error} subclass. If defined, only errors of\n * this type will be coalesced.\n * @typeParam TExecutableReturn - The return type of the function.\n * @typeParam TCoalesce - The type of the object to coalesce to.\n * @typeParam TFilter - The type of the error filter.\n * @returns Whatever the function resolved to, or the provided replacement,\n * in case the function failed.\n */\nexport const coalesceOnRejection = async (executable, to, filter) => {\n try {\n return await executable();\n }\n catch (error) {\n if ((filter !== undefined && error instanceof filter) || !filter) {\n return to;\n }\n throw error;\n }\n};\n/**\n * Wait a given period before continuing execution.\n * @param duration - How many milliseconds to wait.\n * @returns Nothing\n */\nexport const sleep = (duration) => {\n return new Promise(resolve => setTimeout(resolve, duration));\n};\n/**\n * Executes an asynchronous function and retries the execution if it rejects.\n * @param executable - The asynchronous function to execute.\n * @param retryDelay - The duration to wait after a failed execution.\n * @param retryCount - How often should the execution be retried?\n * @typeParam TExecutableReturn - The return type of the function.\n * @returns Whatever the function resolved to.\n */\nexport const retry = async (executable, retryDelay = 0, retryCount = 0) => {\n try {\n return await executable();\n }\n catch (error) {\n if (0 < retryCount) {\n if (0 < retryDelay) {\n await sleep(retryDelay);\n }\n return retry(executable, retryDelay, --retryCount);\n }\n throw error;\n }\n};\n//# sourceMappingURL=async.js.map","import { sleep } from \"@oliversalzburg/js-utils/async/async.js\";\nimport type { ConstructorOf } from \"@oliversalzburg/js-utils/core.js\";\nimport { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { EngineState, SupportedLocale } from \"./Engine.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { Locale } from \"./types/index.js\";\n\nexport const FallbackLocale: SupportedLocale = \"en-US\";\n\n// How long to wait for KG to load, in milliseconds.\nconst TIMEOUT_DEFAULT = 2 * 60 * 1000;\n\n// Allows the user to define a timeout override in their browser's web storage.\n// This allows users to extend the timeout period, in case their local configuration\n// requires it.\nconst TIMEOUT_OVERRIDE =\n \"localStorage\" in globalThis && !isNil(localStorage[\"ks.timeout\"])\n ? Number(localStorage[\"ks.timeout\"])\n : undefined;\n\nexport class UserScriptLoader {\n /**\n * Stores if we caught the `game/start` signal from the game.\n */\n private _gameStartSignal: Promise<boolean> | undefined;\n private _gameStartSignalResolver: undefined | ((value: boolean) => void);\n\n private _possibleEngineState: unknown;\n\n static tryEngineStateFromSaveData(saveDataKey: string, saveData: unknown): unknown {\n const saveDataProxy = saveData as Record<string, unknown>;\n if (!(saveDataKey in saveDataProxy)) {\n console.debug(...cl(`Failed: \\`${saveDataKey}\\` not found in save data.`));\n return undefined;\n }\n\n const ksData = saveDataProxy.ks as { state?: Array<EngineState> };\n if (!(\"state\" in ksData)) {\n console.debug(...cl(`Failed: \\`${saveDataKey}.state\\` not found in save data.`));\n return undefined;\n }\n\n const state = ksData.state;\n if (!Array.isArray(state)) {\n console.debug(...cl(`Failed: \\`${saveDataKey}.state\\` not \\`Array\\`.`));\n return undefined;\n }\n\n return state[0];\n }\n\n async waitForGame<TUserScript>(\n UserScript: ConstructorOf<TUserScript>,\n saveDataKey?: string,\n timeout = TIMEOUT_OVERRIDE ?? TIMEOUT_DEFAULT,\n ): Promise<TUserScript> {\n if (UserScriptLoader._isGameLoaded()) {\n const game = mustExist(UserScriptLoader.window.game);\n const i18nEngine = mustExist(UserScriptLoader.window.$I);\n const gameLanguage = localStorage[\"com.nuclearunicorn.kittengame.language\"] as\n | Locale\n | undefined;\n\n return new UserScript(game, i18nEngine, gameLanguage, this._possibleEngineState);\n }\n\n const signals: Array<Promise<unknown>> = [sleep(2000)];\n\n if (isNil(this._gameStartSignal) && typeof UserScriptLoader.window.dojo !== \"undefined\") {\n this._gameStartSignal = new Promise(resolve => {\n this._gameStartSignalResolver = resolve;\n });\n\n const subGameStart = UserScriptLoader.window.dojo.subscribe(\"game/start\", () => {\n console.debug(\n ...cl(`'game/start' signal caught. Fast-tracking script load for '${saveDataKey}'...`),\n );\n mustExist(this._gameStartSignalResolver)(true);\n UserScriptLoader.window.dojo.unsubscribe(subGameStart);\n });\n\n if (saveDataKey !== undefined) {\n const subServerLoad = UserScriptLoader.window.dojo.subscribe(\n \"server/load\",\n (saveData: unknown) => {\n console.info(\n ...cl(\n `'server/load' signal caught. Looking for script state with key '${saveDataKey}' in save data...`,\n ),\n );\n\n const state = UserScriptLoader.tryEngineStateFromSaveData(saveDataKey, saveData);\n\n if (!state) {\n console.info(\n ...cl(\n `The Kittens Game save data did not contain a script state for '${saveDataKey}'.`,\n ),\n );\n return;\n }\n\n console.info(\n ...cl(\n `Found key '${saveDataKey}'! Provided save data will be used as seed for next script instance.`,\n ),\n );\n this._possibleEngineState = state;\n UserScriptLoader.window.dojo.unsubscribe(subServerLoad);\n },\n );\n }\n }\n\n if (!isNil(this._gameStartSignal)) {\n signals.push(this._gameStartSignal);\n }\n\n if (timeout < 0) {\n throw new Error(\n \"Unable to find game. Giving up. Maybe the game is not exported at `window.game`?\",\n );\n }\n\n console.debug(...cl(`Waiting for game... (timeout: ${Math.round(timeout / 1000)}s)`));\n\n await Promise.race(signals);\n return this.waitForGame(UserScript, saveDataKey, timeout - 2000);\n }\n\n private static _isGameLoaded(): boolean {\n return (\n !isNil(UserScriptLoader.window.game) &&\n (UserScriptLoader.window.document.getElementById(\"game\")?.checkVisibility() ?? false) &&\n !isNil(UserScriptLoader.window.$I)\n );\n }\n\n static get window(): Window {\n try {\n return mustExist(unsafeWindow);\n } catch (_error) {\n return window;\n }\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { Engine, type FrameContext } from \"./Engine.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { ScienceSettings } from \"./settings/ScienceSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { Library, UnsafePolicy, UnsafeTech } from \"./types/science.js\";\nimport { UpgradeManager } from \"./UpgradeManager.js\";\nimport { UserScriptLoader } from \"./UserScriptLoader.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class ScienceManager extends UpgradeManager {\n readonly manager: TabManager<Library>;\n readonly settings: ScienceSettings;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new ScienceSettings(),\n ) {\n super(host);\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Science\");\n this._workshopManager = workshopManager;\n }\n\n async tick(_context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n // We must call `.render()` here, because evaluation of availability of our options\n // is only performed when the game renders the contents of that tab.\n this.manager.render();\n\n // If techs (science items) are enabled...\n if (this.settings.techs.enabled && this._host.game.tabs[2].visible) {\n await this.autoUnlock();\n }\n\n if (this.settings.policies.enabled && this._host.game.tabs[2].visible) {\n await this.autoPolicy();\n }\n\n // Observe astronomical events.\n if (this.settings.observe.enabled) {\n this.observeStars();\n }\n }\n\n async autoUnlock() {\n const techs = this._host.game.science.techs;\n const toUnlock = new Array<UnsafeTech>();\n\n workLoop: for (const setting of Object.values(this.settings.techs.techs)) {\n if (!setting.enabled) {\n continue;\n }\n\n const tech = techs.find(subject => subject.name === setting.tech);\n if (isNil(tech)) {\n console.error(...cl(`Tech '${setting.tech}' not found in game!`));\n continue;\n }\n\n if (tech.researched || !tech.unlocked) {\n continue;\n }\n\n let prices = UserScriptLoader.window.dojo.clone(tech.prices);\n prices = this._host.game.village.getEffectLeader(\"scientist\", prices);\n for (const price of prices) {\n const available = this._workshopManager.getValueAvailable(price.name);\n const resource = this._workshopManager.getResource(price.name);\n const trigger = Engine.evaluateSubSectionTrigger(\n this.settings.techs.trigger,\n setting.trigger,\n );\n if (trigger < 0 || available < resource.maxValue * trigger || available < price.val) {\n continue workLoop;\n }\n }\n\n toUnlock.push(tech);\n }\n\n for (const item of toUnlock) {\n await this.upgrade(item, \"science\");\n }\n }\n\n async autoPolicy() {\n const policies = this._host.game.science.policies;\n const toUnlock = new Array<UnsafePolicy>();\n\n for (const setting of Object.values(this.settings.policies.policies)) {\n if (!setting.enabled) {\n continue;\n }\n\n const targetPolicy = policies.find(subject => subject.name === setting.policy);\n if (isNil(targetPolicy)) {\n console.error(...cl(`Policy '${setting.policy}' not found in game!`));\n continue;\n }\n\n if (!targetPolicy.researched && !targetPolicy.blocked && targetPolicy.unlocked) {\n if (\n targetPolicy.requiredLeaderJob === undefined ||\n (this._host.game.village.leader !== null &&\n this._host.game.village.leader.job === targetPolicy.requiredLeaderJob)\n ) {\n toUnlock.push(targetPolicy);\n }\n }\n }\n\n for (const item of toUnlock) {\n await this.upgrade(item, \"policy\");\n }\n }\n\n /**\n * If there is currently an astronomical event, observe it.\n */\n observeStars(): void {\n if (this._host.game.calendar.observeBtn !== null) {\n this._host.game.calendar.observeHandler();\n this._host.engine.iactivity(\"act.observe\", [], \"ks-star\");\n this._host.engine.storeForSummary(\"stars\", 1);\n }\n }\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { type Mission, Missions } from \"../types/index.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class MissionSetting extends Setting {\n readonly #mission: Mission;\n\n get mission() {\n return this.#mission;\n }\n\n constructor(mission: Mission, enabled = false) {\n super(enabled);\n this.#mission = mission;\n }\n}\n\nexport type MissionMissionSettings = Record<Mission, MissionSetting>;\n\nexport class MissionSettings extends Setting {\n missions: MissionMissionSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.missions = this.initMissions();\n }\n\n private initMissions(): MissionMissionSettings {\n const items = {} as MissionMissionSettings;\n for (const item of Missions) {\n items[item] = new MissionSetting(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: MissionSettings) {\n const inSettings = Object.keys(settings.missions);\n const inGame = game.space.programs.map(program => program.name);\n\n const missingInSettings = difference(inGame, inSettings);\n const redundantInSettings = difference(inSettings, inGame);\n\n for (const mission of missingInSettings) {\n console.warn(...cl(`The space mission '${mission}' is not tracked in Kitten Scientists!`));\n }\n for (const mission of redundantInSettings) {\n console.warn(...cl(`The space mission '${mission}' is not a space mission in Kittens Game!`));\n }\n }\n\n load(settings: Maybe<Partial<MissionSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.missions, settings.missions, (mission, item) => {\n mission.enabled = item?.enabled ?? mission.enabled;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { type SpaceBuilding, SpaceBuildings } from \"../types/index.js\";\nimport { MissionSettings } from \"./MissionSettings.js\";\nimport { SettingTrigger, SettingTriggerMax } from \"./Settings.js\";\n\nexport class SpaceBuildingSetting extends SettingTriggerMax {\n readonly #building: SpaceBuilding;\n\n get building() {\n return this.#building;\n }\n\n constructor(building: SpaceBuilding) {\n super(false, -1, 0);\n this.#building = building;\n }\n}\n\nexport type SpaceBuildingSettings = Record<SpaceBuilding, SpaceBuildingSetting>;\n\nexport class SpaceSettings extends SettingTrigger {\n buildings: SpaceBuildingSettings;\n\n unlockMissions: MissionSettings;\n\n constructor(enabled = false, trigger = -1, unlockMissions = new MissionSettings()) {\n super(enabled, trigger);\n this.buildings = this.initBuildings();\n this.unlockMissions = unlockMissions;\n }\n\n private initBuildings(): SpaceBuildingSettings {\n const items = {} as SpaceBuildingSettings;\n for (const item of SpaceBuildings) {\n items[item] = new SpaceBuildingSetting(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: SpaceSettings) {\n MissionSettings.validateGame(game, settings.unlockMissions);\n }\n\n load(settings: Maybe<Partial<SpaceSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.max = item?.max ?? building.max;\n building.trigger = item?.trigger ?? building.trigger;\n });\n\n this.unlockMissions.load(settings.unlockMissions);\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { Automation, FrameContext } from \"./Engine.js\";\nimport { BulkPurchaseHelper } from \"./helper/BulkPurchaseHelper.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { type SpaceBuildingSetting, SpaceSettings } from \"./settings/SpaceSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { BuildingStackableBtn, UnsafeBuildingStackableBtnModel } from \"./types/core.js\";\nimport type { Mission, SpaceBuilding } from \"./types/index.js\";\nimport type {\n PlanetBuildingBtnController,\n SpaceTab,\n UnsafePlanet,\n UnsafePlanetBuildingButtonOptions,\n UnsafeSpaceBuilding,\n UnsafeSpaceProgram,\n UnsafeSpaceProgramButtonOptions,\n} from \"./types/space.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class SpaceManager implements Automation {\n private readonly _host: KittenScientists;\n readonly settings: SpaceSettings;\n readonly manager: TabManager<SpaceTab>;\n private readonly _bulkManager: BulkPurchaseHelper;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new SpaceSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Space\");\n\n this._workshopManager = workshopManager;\n this._bulkManager = new BulkPurchaseHelper(this._host, this._workshopManager);\n }\n\n tick(context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n // We must call `.render()` here, because evaluation of availability of our options\n // is only performed when the game renders the contents of that tab.\n this.manager.render();\n\n this.autoBuild(context);\n\n if (this.settings.unlockMissions.enabled) {\n this.autoUnlock(context);\n }\n }\n\n /**\n * Try to build as many of the passed buildings as possible.\n * Usually, this is called at each iteration of the automation engine to\n * handle the building of items on the Space tab.\n *\n * @param builds The buildings to build.\n */\n autoBuild(\n context: FrameContext,\n builds: Partial<Record<SpaceBuilding, SpaceBuildingSetting>> = this.settings.buildings,\n ) {\n const bulkManager = this._bulkManager;\n const sectionTrigger = this.settings.trigger;\n\n // Get the current metadata for all the referenced buildings.\n const metaData: Partial<Record<SpaceBuilding, Required<UnsafeSpaceBuilding>>> = {};\n for (const build of Object.values(builds)) {\n metaData[build.building] = this.getBuild(build.building);\n }\n\n // Let the bulkmanager determine the builds we can make.\n const buildList = bulkManager.bulk(builds, metaData, sectionTrigger, \"Space\");\n\n // Build all entries in the build list, where we can build any items.\n for (const build of buildList) {\n if (build.count <= 0) {\n continue;\n }\n if (0 === this.build(build.id as SpaceBuilding, build.count)) {\n continue;\n }\n context.requestGameUiRefresh = true;\n }\n }\n\n autoUnlock(context: FrameContext) {\n if (!this._host.game.tabs[6].visible) {\n return;\n }\n\n const missions = this._host.game.space.meta[0].meta as Array<Required<UnsafeSpaceProgram>>;\n missionLoop: for (let i = 0; i < missions.length; i++) {\n // If the mission is already purchased or not available yet, continue with the next one.\n if (\n 0 < missions[i].val ||\n !missions[i].unlocked ||\n !this.settings.unlockMissions.missions[missions[i].name as Mission].enabled\n ) {\n continue;\n }\n\n const model = this.manager.tab.GCPanel?.children[i];\n if (isNil(model)) {\n return;\n }\n\n const prices = mustExist(model.model?.prices);\n for (const resource of prices) {\n // If we can't afford this resource price, continue with the next mission.\n if (this._workshopManager.getValueAvailable(resource.name) < resource.val) {\n continue missionLoop;\n }\n }\n\n // Start the mission by clicking the button.\n // TODO: Move this into the SpaceManager?\n model.domNode.click();\n context.requestGameUiRefresh = true;\n if (i === 7 || i === 12) {\n this._host.engine.iactivity(\"upgrade.space.mission\", [missions[i].label], \"ks-upgrade\");\n } else {\n this._host.engine.iactivity(\"upgrade.space\", [missions[i].label], \"ks-upgrade\");\n }\n }\n }\n\n build(name: SpaceBuilding, amount: number): number {\n let amountCalculated = amount;\n const amountTemp = amountCalculated;\n let label: string;\n const itemMetaRaw = game.getUnlockByName(name, \"spaceBuilding\");\n const controller = new classes.ui.space.PlanetBuildingBtnController(\n this._host.game,\n ) as PlanetBuildingBtnController<\n UnsafeBuildingStackableBtnModel<UnsafePlanetBuildingButtonOptions>\n >;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n\n if (amountCalculated !== amountTemp) {\n console.warn(\n ...cl(`${label} Amount ordered: ${amountTemp} Amount Constructed: ${amountCalculated}`),\n );\n // Bail out to not flood the log with garbage.\n if (amountCalculated === 0) {\n return 0;\n }\n }\n this._host.engine.storeForSummary(label, amountCalculated, \"build\");\n\n if (amountCalculated === 1) {\n this._host.engine.iactivity(\"act.build\", [label], \"ks-build\");\n } else {\n this._host.engine.iactivity(\n \"act.builds\",\n [label, this._host.renderAbsolute(amountCalculated)],\n \"ks-build\",\n );\n }\n\n return amountCalculated;\n }\n\n getBuild(name: SpaceBuilding): Required<UnsafeSpaceBuilding> {\n return this._host.game.space.getBuilding(name);\n }\n\n private _getBuildButton(id: string) {\n const panels = this.manager.tab.planetPanels;\n\n if (isNil(panels)) {\n return null;\n }\n\n let button: BuildingStackableBtn<{\n id: SpaceBuilding;\n planet: UnsafePlanet;\n controller: PlanetBuildingBtnController<\n UnsafeBuildingStackableBtnModel<UnsafeSpaceProgramButtonOptions>\n >;\n }> | null = null;\n for (const panel of panels) {\n button = panel.children.find(child => child.id === id) ?? null;\n\n if (!isNil(button)) {\n return button;\n }\n }\n\n if (button === null) {\n throw new Error(`Couldn't find button for ${id}!`);\n }\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport enum LogFilterItemVariant {\n build = \"ks-activity type_ks-build\",\n craft = \"ks-activity type_ks-craft\",\n upgrade = \"ks-activity type_ks-upgrade\",\n research = \"ks-activity type_ks-research\",\n trade = \"ks-activity type_ks-trade\",\n hunt = \"ks-activity type_ks-hunt\",\n praise = \"ks-activity type_ks-praise\",\n adore = \"ks-activity type_ks-adore\",\n transcend = \"ks-activity type_ks-transcend\",\n faith = \"ks-activity type_ks-faith\",\n accelerate = \"ks-activity type_ks-accelerate\",\n timeSkip = \"ks-activity type_ks-timeSkip\",\n festival = \"ks-activity type_ks-festival\",\n star = \"ks-activity type_ks-star\",\n distribute = \"ks-activity type_ks-distribute\",\n promote = \"ks-activity type_ks-promote\",\n misc = \"ks-activity\",\n}\n\nexport const FilterItems = [\n \"accelerate\",\n \"adore\",\n \"build\",\n \"craft\",\n \"distribute\",\n \"faith\",\n \"festival\",\n \"hunt\",\n \"misc\",\n \"praise\",\n \"promote\",\n \"research\",\n \"star\",\n \"timeSkip\",\n \"trade\",\n \"transcend\",\n \"upgrade\",\n] as const;\nexport type FilterItem = (typeof FilterItems)[number];\n\nexport class LogFilterSettingsItem extends Setting {\n readonly #variant: LogFilterItemVariant;\n\n get variant() {\n return this.#variant;\n }\n\n constructor(variant: LogFilterItemVariant) {\n super(true);\n this.#variant = variant;\n }\n}\n\nexport type LogFilterSettingsItems = Record<FilterItem, LogFilterSettingsItem>;\n\nexport class LogFilterSettings extends Setting {\n filters: LogFilterSettingsItems;\n disableKGLog: Setting;\n\n constructor(enabled = false, disableKGLog = new Setting(true)) {\n super(enabled);\n this.filters = this.initFilters();\n this.disableKGLog = disableKGLog;\n }\n\n private initFilters(): LogFilterSettingsItems {\n const items = {} as LogFilterSettingsItems;\n for (const item of FilterItems) {\n items[item] = new LogFilterSettingsItem(LogFilterItemVariant[item]);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<LogFilterSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.filters, settings.filters, (filter, item) => {\n filter.enabled = item?.enabled ?? filter.enabled;\n });\n this.disableKGLog.enabled = settings.disableKGLog?.enabled ?? this.disableKGLog.enabled;\n }\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { type Upgrade, Upgrades } from \"../types/index.js\";\nimport { SettingTrigger } from \"./Settings.js\";\n\nexport class UpgradeSettingsItem extends SettingTrigger {\n readonly #upgrade: Upgrade;\n\n get upgrade() {\n return this.#upgrade;\n }\n\n constructor(upgrade: Upgrade, enabled = false) {\n super(enabled, -1);\n this.#upgrade = upgrade;\n }\n}\n\nexport type UpgradeSettingsItems = Record<Upgrade, UpgradeSettingsItem>;\n\nexport class UpgradeSettings extends SettingTrigger {\n readonly upgrades: UpgradeSettingsItems;\n\n constructor(enabled = false) {\n super(enabled, -1);\n this.upgrades = this.initUpgrades();\n }\n\n private initUpgrades(): UpgradeSettingsItems {\n const items = {} as UpgradeSettingsItems;\n for (const item of Upgrades) {\n items[item] = new UpgradeSettingsItem(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: UpgradeSettings) {\n const inSettings = Object.keys(settings.upgrades);\n const inGame = game.workshop.upgrades.map(upgrade => upgrade.name);\n\n const missingInSettings = difference(inGame, inSettings);\n const redundantInSettings = difference(inSettings, inGame);\n\n for (const upgrade of missingInSettings) {\n console.warn(...cl(`The workshop upgrade '${upgrade}' is not tracked in Kitten Scientists!`));\n }\n for (const upgrade of redundantInSettings) {\n console.warn(...cl(`The workshop upgrade '${upgrade}' is not an upgrade in Kittens Game!`));\n }\n }\n\n load(settings: Maybe<Partial<UpgradeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.upgrades, settings.upgrades, (upgrade, item) => {\n upgrade.enabled = item?.enabled ?? upgrade.enabled;\n upgrade.trigger = item?.trigger ?? upgrade.trigger;\n });\n }\n}\n","import { difference } from \"@oliversalzburg/js-utils/data/array.js\";\nimport { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { GamePage } from \"../types/game.js\";\nimport { type ResourceCraftable, ResourcesCraftable } from \"../types/index.js\";\nimport { Setting, SettingLimitedMaxTrigger, SettingTrigger } from \"./Settings.js\";\nimport { UpgradeSettings } from \"./UpgradeSettings.js\";\n\nexport class CraftSettingsItem extends SettingLimitedMaxTrigger {\n readonly #resource: ResourceCraftable;\n\n get resource() {\n return this.#resource;\n }\n\n constructor(resource: ResourceCraftable, enabled = false, limited = true) {\n super(enabled, limited);\n this.#resource = resource;\n }\n}\n\nexport type WorkshopResourceSettings = Record<ResourceCraftable, CraftSettingsItem>;\n\nexport class WorkshopSettings extends SettingTrigger {\n resources: WorkshopResourceSettings;\n\n shipOverride: Setting;\n unlockUpgrades: UpgradeSettings;\n\n constructor(\n enabled = false,\n trigger = -1,\n unlockUpgrades = new UpgradeSettings(),\n shipOverride = new Setting(),\n ) {\n super(enabled, trigger);\n this.resources = this.initResources();\n this.shipOverride = shipOverride;\n this.unlockUpgrades = unlockUpgrades;\n }\n\n private initResources(): WorkshopResourceSettings {\n const items = {} as WorkshopResourceSettings;\n for (const item of ResourcesCraftable) {\n items[item] = new CraftSettingsItem(item);\n }\n return items;\n }\n\n static validateGame(game: GamePage, settings: WorkshopSettings) {\n const inSettings = Object.keys(settings.resources);\n const inGame = game.workshop.crafts.map(craft => craft.name);\n\n const missingInSettings = difference(inGame, inSettings);\n const redundantInSettings = difference(inSettings, inGame);\n\n for (const craft of missingInSettings) {\n console.warn(...cl(`The workshop craft '${craft}' is not tracked in Kitten Scientists!`));\n }\n for (const craft of redundantInSettings) {\n console.warn(...cl(`The workshop craft '${craft}' is not an upgrade in Kittens Game!`));\n }\n\n UpgradeSettings.validateGame(game, settings.unlockUpgrades);\n }\n\n load(settings: Maybe<Partial<WorkshopSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.resources, settings.resources, (resource, item) => {\n resource.enabled = item?.enabled ?? resource.enabled;\n resource.limited = item?.limited ?? resource.limited;\n resource.max = item?.max ?? resource.max;\n resource.trigger = item?.trigger ?? resource.trigger;\n });\n\n this.unlockUpgrades.load(settings.unlockUpgrades);\n\n this.shipOverride.enabled = settings.shipOverride?.enabled ?? this.shipOverride.enabled;\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { type Automation, Engine, type FrameContext } from \"./Engine.js\";\nimport type { MaterialsCache } from \"./helper/MaterialsCache.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { type CraftSettingsItem, WorkshopSettings } from \"./settings/WorkshopSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { objectEntries } from \"./tools/Entries.js\";\nimport { negativeOneToInfinity } from \"./tools/Format.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { Resource, ResourceCraftable } from \"./types/index.js\";\nimport type { ResourceManager, UnsafeResource } from \"./types/resources.js\";\nimport type { Village } from \"./types/village.js\";\nimport type { UnsafeCraft, UnsafeUpgrade } from \"./types/workshop.js\";\nimport { UpgradeManager } from \"./UpgradeManager.js\";\nimport { UserScriptLoader } from \"./UserScriptLoader.js\";\n\nexport class WorkshopManager extends UpgradeManager implements Automation {\n readonly settings: WorkshopSettings;\n readonly manager: TabManager<Village>;\n\n static readonly DEFAULT_CONSUME_RATE = 1;\n\n constructor(host: KittenScientists, settings = new WorkshopSettings()) {\n super(host);\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Workshop\");\n }\n\n tick(_context: FrameContext) {\n if (!this.settings.enabled) {\n return Promise.resolve();\n }\n\n this.autoCraft();\n this.refreshStock();\n\n if (this.settings.unlockUpgrades.enabled) {\n this.manager.render();\n return this.autoUnlock();\n }\n\n return Promise.resolve();\n }\n\n async autoUnlock() {\n if (!this._host.game.workshopTab.visible) {\n return;\n }\n\n const upgrades = this._host.game.workshop.upgrades;\n const toUnlock = new Array<UnsafeUpgrade>();\n\n workLoop: for (const setting of Object.values(this.settings.unlockUpgrades.upgrades)) {\n if (!setting.enabled) {\n continue;\n }\n\n const upgrade = upgrades.find(subject => subject.name === setting.upgrade);\n if (isNil(upgrade)) {\n console.error(...cl(`Upgrade '${setting.upgrade}' not found in game!`));\n continue;\n }\n\n if (upgrade.researched || !upgrade.unlocked) {\n continue;\n }\n\n // Create a copy of the prices for this upgrade, so that we can apply effects to it.\n let prices = UserScriptLoader.window.dojo.clone(upgrade.prices);\n prices = this._host.game.village.getEffectLeader(\"scientist\", prices);\n for (const price of prices) {\n const available = this.getValueAvailable(price.name);\n const resource = this.getResource(price.name);\n const trigger = Engine.evaluateSubSectionTrigger(\n this.settings.unlockUpgrades.trigger,\n setting.trigger,\n );\n if (\n trigger < 0 ||\n (0 < trigger && available < resource.maxValue * trigger) ||\n available < price.val\n ) {\n continue workLoop;\n }\n }\n\n toUnlock.push(upgrade);\n }\n\n for (const item of toUnlock) {\n await this.upgrade(item, \"workshop\");\n }\n }\n\n /**\n * Try to craft as many of the passed resources as possible.\n * Usually, this is called at each iteration of the automation engine to\n * handle the crafting of items on the Workshop tab.\n *\n * @param crafts The resources to build.\n */\n autoCraft(\n crafts: Partial<Record<ResourceCraftable, CraftSettingsItem>> = this.settings.resources,\n ) {\n const craftRequests = new Map<\n CraftSettingsItem,\n {\n countRequested: number;\n materials: Array<{\n resource: Resource;\n consume: number;\n }>;\n }\n >();\n const sectionTrigger = this.settings.trigger;\n\n // Find all resources we would want to craft.\n // For crafts that require resources with a capacity, those resources must\n // be at or above the trigger for them to be considered to be crafted.\n for (const craft of Object.values(crafts)) {\n const trigger = Engine.evaluateSubSectionTrigger(sectionTrigger, craft.trigger);\n if (trigger < 0 || !craft.enabled) {\n continue;\n }\n\n const current = !craft.max ? false : this.getResource(craft.resource);\n const max = negativeOneToInfinity(craft.max);\n if (current && max < current.value) {\n continue;\n }\n\n // If we can't even craft a single item of the resource, skip it.\n if (!this.singleCraftPossible(craft.resource)) {\n continue;\n }\n\n const materials = Object.keys(this.getMaterials(craft.resource)) as Array<Resource>;\n // The resource information for the requirement of this craft which have a capacity.\n const requiredMaterials = materials\n .map(material => this.getResource(material))\n .filter(material => 0 < material.maxValue);\n\n const allMaterialsAboveTrigger =\n requiredMaterials.filter(material => material.value / material.maxValue < trigger)\n .length === 0;\n\n if (!allMaterialsAboveTrigger) {\n continue;\n }\n\n craftRequests.set(craft, {\n countRequested: 1,\n materials: materials.map(material => ({\n consume: 0,\n resource: material,\n })),\n });\n }\n\n if (craftRequests.size < 1) {\n return;\n }\n\n // For all crafts under consideration, find the crafts that share resources in their requirements.\n // We will use this to split crafts evenly among the available stock of that resource.\n const billOfMaterials = new Map<Resource, Array<ResourceCraftable>>();\n for (const [craft, request] of craftRequests) {\n for (const material of request.materials) {\n if (!billOfMaterials.has(material.resource)) {\n billOfMaterials.set(material.resource, new Array<ResourceCraftable>());\n }\n const consumers = mustExist(billOfMaterials.get(material.resource));\n consumers.push(craft.resource);\n }\n }\n\n // Determine how much of each resource we want to spend on each craft.\n for (const [, request] of craftRequests) {\n for (const material of request.materials) {\n const available = this.getValueAvailable(material.resource);\n material.consume = available / mustExist(billOfMaterials.get(material.resource)).length;\n }\n }\n\n // Determine how much of each craft we want to perform, given our resource allocations.\n for (const [craft, request] of craftRequests) {\n const materials = this.getMaterials(craft.resource);\n let amount = Number.MAX_VALUE;\n for (const material of request.materials) {\n // How much of the material is needed to craft 1 new resource.\n const materialAmount = mustExist(materials[material.resource]);\n\n const materialResource = this.getResource(material.resource);\n\n if (\n // For unlimited crafts, assign all resources.\n !craft.limited ||\n // Handle the ship override.\n (craft.resource === \"ship\" &&\n this.settings.shipOverride.enabled &&\n this.getResource(\"ship\").value < 243)\n ) {\n amount = Math.min(amount, material.consume / materialAmount);\n continue;\n }\n\n const ratio = this._host.game.getResCraftRatio(craft.resource);\n\n // Quantity of source and target resource currently available.\n const availableSource =\n this.getValueAvailable(material.resource) /\n mustExist(billOfMaterials.get(material.resource)).length;\n const availableTarget = this.getValueAvailable(craft.resource);\n\n // How much source resource is consumed and target resource is crafted per craft operation.\n const recipeRequires = materialAmount;\n const recipeProduces = 1 + ratio;\n\n // How many crafts could we do given the amount of source resource available.\n const craftsPossible = availableSource / recipeRequires;\n\n // How many crafts were hypothetically done to produce the current amount of target resource.\n const craftsDone = availableTarget / recipeProduces;\n // The \"order of magnitude\" (how many powers of 10) of the existing target resource.\n const orderDone = Math.max(0, Math.floor(Math.log(craftsDone) / Math.LN10 + 0.000000001));\n\n // Crafting gets progressively more expensive as the amount of the target increases.\n // This heuristic gives other, cheaper, targets a chance to get built from the same source resource.\n amount = Math.min(\n // Whatever was previously assumed as the best amount.\n amount,\n // We want to craft the lowest amount of these values, as we're in the \"limited\" mode.\n Math.min(\n // We take the possible crafts as the baseline\n craftsPossible -\n // If the source material is one that has a storage capacity, and the storage is full,\n // then we want to allow all possible crafts to be crafted. So we subtract 0.\n (0 < materialResource.maxValue && materialResource.maxValue <= materialResource.value\n ? 0\n : // If the resource is not capped, we subtract the crafts we have already done.\n craftsDone),\n // The safe limit is to buy the next higher order of magnitude of items, to not\n // waste all resources if the target resource is very low, like after a reset with chronospheres.\n 10 ** (orderDone + 1),\n ),\n // The amount of resources we could craft, based on our consume rate.\n material.consume / materialAmount,\n );\n }\n\n const availableTarget = this.getValueAvailable(craft.resource);\n const recipeProduces = 1 + this._host.game.getResCraftRatio(craft.resource);\n\n // In any case, autoCraft amount should not exceed Number.MAX_VALUE\n const craftsMaxLimit = Number.MAX_VALUE / recipeProduces - availableTarget / recipeProduces;\n amount = Math.min(amount, craftsMaxLimit);\n\n request.countRequested = Math.max(\n 0,\n craft.max === -1\n ? amount\n : Math.min(amount, (craft.max - availableTarget) / recipeProduces),\n );\n }\n\n for (const [craft, request] of craftRequests) {\n if (request.countRequested < 1) {\n continue;\n }\n this.craft(craft.resource, request.countRequested);\n }\n }\n\n /**\n * Craft a certain amount of items.\n *\n * @param name The resource to craft.\n * @param amount How many items of the resource to craft.\n */\n craft(name: ResourceCraftable, amount: number): void {\n let amountCalculated = Math.floor(amount);\n\n if (amountCalculated < 1) {\n return;\n }\n if (!this._canCraft(name, amountCalculated)) {\n return;\n }\n\n const craft = this.getCraft(name);\n const ratio = this._host.game.getResCraftRatio(craft.name);\n\n this._host.game.craft(craft.name, amountCalculated);\n\n const resourceName = mustExist(this._host.game.resPool.get(name)).title;\n\n // Determine actual amount after crafting upgrades\n amountCalculated = Number.parseFloat((amountCalculated * (1 + ratio)).toFixed(2));\n\n this._host.engine.storeForSummary(resourceName, amountCalculated, \"craft\");\n this._host.engine.iactivity(\n \"act.craft\",\n [this._host.game.getDisplayValueExt(amountCalculated), resourceName],\n \"ks-craft\",\n );\n }\n\n private _canCraft(name: ResourceCraftable, amount: number): boolean {\n // Can't craft anything but wood until workshop is unlocked.\n if (!this._host.game.workshopTab.visible && name !== \"wood\") {\n return false;\n }\n\n const craft = this.getCraft(name);\n const enabled = mustExist(this.settings.resources[name]).enabled;\n let result = false;\n\n if (craft.unlocked && enabled) {\n result = true;\n\n const prices = this._host.game.workshop.getCraftPrice(craft);\n for (const price of prices) {\n const value = this.getValueAvailable(price.name);\n\n if (value < price.val * amount) {\n result = false;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Retrieve the resource information object from the game.\n *\n * @param name The name of the craftable resource.\n * @returns The information object for the resource.\n */\n getCraft(name: ResourceCraftable): UnsafeCraft {\n const craft = this._host.game.workshop.getCraft(name);\n if (!craft) {\n throw new Error(`Unable to find craft '${name}'`);\n }\n return craft;\n }\n\n /**\n * Check if we have enough resources to craft a single craftable resource.\n *\n * @param name The name of the resource.\n * @returns `true` if the build is possible; `false` otherwise.\n */\n singleCraftPossible(name: ResourceCraftable): boolean {\n // Can't craft anything but wood until workshop is unlocked.\n if (!this._host.game.workshopTab.visible && name !== \"wood\") {\n return false;\n }\n\n const materials = this.getMaterials(name);\n for (const [material, amount] of objectEntries(materials)) {\n if (this.getValueAvailable(material) < amount) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Returns a hash of the required source resources and their\n * amount to craft the given resource.\n *\n * @param name The resource to craft.\n * @returns The source resources you need and how many.\n */\n getMaterials(name: ResourceCraftable): Partial<Record<Resource, number>> {\n const materials: Partial<Record<Resource, number>> = {};\n const craft = this.getCraft(name);\n\n const prices = this._host.game.workshop.getCraftPrice(craft);\n\n for (const price of prices) {\n materials[price.name] = price.val;\n }\n\n return materials;\n }\n\n /**\n * Determine how much of a resource is produced per tick. For craftable resources,\n * this also includes how many of them we *could* craft this tick.\n *\n * @param resource The resource to retrieve the production for.\n * @param cacheManager A `CacheManager` to use in the process.\n * @param preTrade ?\n * @returns The amount of resources produced per tick, adjusted arbitrarily.\n */\n getTickVal(\n resource: UnsafeResource,\n cacheManager?: MaterialsCache,\n preTrade: boolean | undefined = undefined,\n ): number | \"ignore\" {\n let production = this._host.game.getResourcePerTick(resource.name, true);\n\n // For craftable resources, we also want to take into account how much of them\n // we *could* craft.\n if (resource.craftable) {\n let minProd = Number.MAX_VALUE;\n const materials = this.getMaterials(resource.name as ResourceCraftable);\n for (const [mat, amount] of objectEntries<Resource, number>(materials)) {\n const rat =\n (1 + this._host.game.getResCraftRatio(resource.name as ResourceCraftable)) / amount;\n // Currently preTrade is only true for the festival stuff, so including furs from hunting is ideal.\n const addProd = this.getTickVal(this.getResource(mat));\n if (addProd === \"ignore\") {\n continue;\n }\n minProd = Math.min(addProd * rat, minProd);\n }\n production += minProd !== Number.MAX_VALUE ? minProd : 0;\n }\n\n // If we have negative production (or none), and we're looking at either spice or\n // blueprints, return \"ignore\".\n // TODO: This special case seems to revolve around trading. As trading results in\n // spice and blueprints.\n if (production <= 0 && (resource.name === \"spice\" || resource.name === \"blueprint\")) {\n return \"ignore\";\n }\n\n // If \"preTrade\" was set, increase the production. The \"resValue\" stored in the cache\n // makes no sense.\n // TODO: The only time this is used is for holding festivals.\n // It's unclear why this would be necessary.\n if (!preTrade && !isNil(cacheManager)) {\n production += cacheManager.getResValue(resource.name);\n }\n return production;\n }\n\n /**\n * Determine the resources and their amount that would usually result from a hunt.\n *\n * @returns The amounts of resources usually gained from hunting.\n */\n getAverageHunt(): Partial<Record<Resource, number>> {\n const output: Partial<Record<Resource, number>> = {};\n const hunterRatio =\n this._host.game.getEffect(\"hunterRatio\") +\n this._host.game.village.getEffectLeader(\"manager\", 0);\n\n output.furs = 40 + 32.5 * hunterRatio;\n\n output.ivory =\n 50 * Math.min(0.225 + 0.01 * hunterRatio, 0.5) +\n 40 * hunterRatio * Math.min(0.225 + 0.01 * hunterRatio, 0.5);\n\n output.unicorns = 0.05;\n\n if (this.getValue(\"zebras\") >= 10) {\n output.bloodstone = this.getValue(\"bloodstone\") === 0 ? 0.05 : 0.0005;\n }\n\n if (this._host.game.ironWill && this._host.game.workshop.get(\"goldOre\").researched) {\n output.gold = 0.625 + 0.625 * hunterRatio;\n }\n\n return output;\n }\n\n /**\n * Retrieve the information object for a resource.\n *\n * @param name The resource to retrieve info for.\n * @returns The information object for the resource.\n */\n getResource(name: Resource): ReturnType<ResourceManager[\"get\"]> {\n const res = this._host.game.resPool.get(name);\n if (isNil(res)) {\n throw new Error(`Unable to find resource ${name}`);\n }\n return res;\n }\n\n /**\n * Determine how many items of a resource are currently available.\n *\n * @param name The resource.\n * @returns How many items are currently available.\n */\n getValue(name: Resource): number {\n return this.getResource(name).value ?? 0;\n }\n\n /**\n * Determine how many items of the resource to always keep in stock.\n *\n * @param name The resource.\n * @returns How many items of the resource to always keep in stock.\n */\n getStock(name: Resource): number {\n const resource = this._host.engine.settings.resources.resources[name];\n const stock = resource.enabled ? resource.stock : 0;\n\n return stock;\n }\n\n /**\n * Retrieve the consume rate for a resource.\n *\n * @param name - The resource.\n * @returns The consume rate for the resource.\n */\n getConsume(name: Resource): number {\n const resource = this._host.engine.settings.resources.resources[name];\n const consume = resource.enabled ? resource.consume : 1;\n\n return consume;\n }\n\n /**\n * Determine how much of a resource is available for a certain operation\n * to use.\n *\n * @param name The resource to check.\n * @returns The available amount of the resource.\n */\n getValueAvailable(name: Resource): number {\n // How many items to keep in stock.\n let stock = this.getStock(name);\n\n // If the resource is catnip, ensure to not use so much that we can't satisfy\n // consumption by kittens.\n if (\"catnip\" === name) {\n const pastureMeta = this._host.game.bld.getBuildingExt(\"pasture\").meta;\n const aqueductMeta = this._host.game.bld.getBuildingExt(\"aqueduct\").meta;\n const pastures = pastureMeta.stage === 0 ? pastureMeta.val : 0;\n const aqueducts = aqueductMeta.stage === 0 ? aqueductMeta.val : 0;\n // How many catnip per tick do we have available? This can be negative.\n const resPerTick = this.getPotentialCatnip(true, pastures, aqueducts);\n\n // If our stock is currently decreasing. Ensure we work with the value\n // where it should be in 5 ticks.\n // TODO: I'm assuming 202 is the catnip consumption per tick and the 5 are a\n // magic value that just made sense, or the script assumes it runs every\n // 5 ticks. Which would mean it probably ignores the `interval` setting.\n if (resPerTick < 0) {\n stock -= resPerTick * 202 * 5;\n }\n }\n\n // How many items are currently available.\n let value = this.getValue(name);\n // Subtract the amount to keep in stock.\n value = Math.max(value - stock, 0);\n\n // Determine the consume rate.\n const consume = this.getConsume(name);\n\n return value * consume;\n }\n\n /**\n * Determine how much catnip we have available to \"work with\" per tick.\n *\n * @param worstWeather Should the worst weather be assumed for this calculation?\n * @param pastures How many pastures to take into account.\n * @param aqueducts How many aqueducts to take into account\n * @returns The potential catnip per tick.\n */\n getPotentialCatnip(worstWeather: boolean, pastures: number, aqueducts: number): number {\n // Start of by checking how much catnip we produce per tick at base level.\n let productionField = this._host.game.getEffect(\"catnipPerTickBase\");\n\n if (worstWeather) {\n // Assume fields run at -90%\n productionField *= 0.1;\n // Factor in cold harshness.\n productionField *=\n 1 + this._host.game.getLimitedDR(this._host.game.getEffect(\"coldHarshness\"), 1);\n } else {\n productionField *=\n this._host.game.calendar.getWeatherMod({ name: \"catnip\" }) +\n this._host.game.calendar.getCurSeason().modifiers.catnip;\n }\n\n // When the communism policy is active,\n if (this._host.game.science.getPolicy(\"communism\").researched) {\n productionField = 0;\n }\n\n // Get base production values for jobs.\n const resourceProduction = this._host.game.village.getResProduction();\n // Check how much catnip we're producing through kitten jobs.\n const productionVillager = resourceProduction.catnip\n ? resourceProduction.catnip * (1 + this._host.game.getEffect(\"catnipJobRatio\"))\n : 0;\n\n // Base production is catnip fields + farmers.\n let baseProd = productionField + productionVillager;\n\n // Determine the effect of other buildings on the production value.\n let hydroponics = this._host.game.space.getBuilding(\"hydroponics\").val;\n // Index 21 is the \"pawgan rituals\" metaphysics upgrade. This makes no sense.\n // This likely wants index 22, which is \"numeromancy\", which has effects on\n // catnip production in cycles at index 2 and 7.\n // TODO: Fix this so the upgrade is properly taken into account.\n if (this._host.game.prestige.meta[0].meta[21].researched) {\n if (this._host.game.calendar.cycle === 2) {\n hydroponics *= 2;\n }\n if (this._host.game.calendar.cycle === 7) {\n hydroponics *= 0.5;\n }\n }\n\n // Our base production value is boosted by our aqueducts and hydroponics accordingly.\n baseProd *= 1 + 0.03 * aqueducts + 0.025 * hydroponics;\n\n // Apply paragon bonus, except during the \"winter is coming\" challenge.\n const isWinterComing = this._host.game.challenges.currentChallenge === \"winterIsComing\";\n const paragonBonus = isWinterComing ? 0 : this._host.game.prestige.getParagonProductionRatio();\n baseProd *= 1 + paragonBonus;\n\n // Apply faith bonus.\n baseProd *= 1 + this._host.game.religion.getSolarRevolutionRatio();\n\n // Unless the user disabled the \"global donate bonus\", apply it.\n if (!this._host.game.opts.disableCMBR) {\n baseProd *= 1 + this._host.game.getCMBRBonus();\n }\n\n // Apply the effects of possibly running festival.\n baseProd = mustExist(\n this._host.game.calendar.cycleEffectsFestival({ catnip: baseProd }).catnip,\n );\n\n // Determine our demand for catnip. This is usually a negative value.\n let baseDemand = this._host.game.village.getResConsumption().catnip;\n // Pastures and unicron pastures reduce catnip demand. Factor that in.\n const unicornPastures = this._host.game.bld.getBuildingExt(\"unicornPasture\").meta.val;\n baseDemand *=\n 1 + this._host.game.getLimitedDR(pastures * -0.005 + unicornPastures * -0.0015, 1.0);\n\n // If we have any kittens and happiness over 100%.\n if (this._host.game.village.sim.kittens.length > 0 && this._host.game.village.happiness > 1) {\n // How happy beyond 100% are we?\n const happyCon = this._host.game.village.happiness - 1;\n const catnipDemandWorkerRatioGlobal = this._host.game.getEffect(\n \"catnipDemandWorkerRatioGlobal\",\n );\n\n // Determine the effect of kittens without jobs.\n if (this._host.game.challenges.currentChallenge === \"anarchy\") {\n // During anarchy, they have no effect. They eat all the catnip.\n baseDemand *= 1 + happyCon * (1 + catnipDemandWorkerRatioGlobal);\n } else {\n // During normal operation, reduce the demand proportionally.\n // TODO: This should probably be split up into 2 steps.\n baseDemand *=\n 1 +\n happyCon *\n (1 + catnipDemandWorkerRatioGlobal) *\n (1 -\n this._host.game.village.getFreeKittens() /\n this._host.game.village.sim.kittens.length);\n }\n }\n\n // Subtract the demand from the production. Demand is negative.\n baseProd += baseDemand;\n\n // Subtract possible catnip consumers, like breweries.\n baseProd += this._host.game.getResourcePerTickConvertion(\"catnip\");\n\n // Might need to eventually factor in time acceleration using this._host.gamePage.timeAccelerationRatio().\n return baseProd;\n }\n\n /**\n * Maintains the CSS classes in the resource indicators in the game UI to\n * reflect if the amount of resource in stock is below or above the desired\n * total amount to keep in stock.\n * The user can configure this in the Workshop automation section.\n */\n refreshStock() {\n for (const [name, resource] of objectEntries(this._host.engine.settings.resources.resources)) {\n const resourceCells = [\n // Resource table on the top.\n ...$(`#game .res-row.resource_${name} .res-cell.resAmount`),\n // Craft table on the bottom.\n ...$(`#game .res-row.resource_${name} .res-cell.resource-value`),\n ];\n\n if (!resource.enabled || resource.stock === 0) {\n for (const resourceCell of resourceCells) {\n resourceCell.classList.remove(\"ks-stock-above\", \"ks-stock-below\");\n }\n continue;\n }\n\n const isBelow = this._host.game.resPool.get(name).value < resource.stock;\n\n for (const resourceCell of resourceCells) {\n resourceCell.classList.add(isBelow ? \"ks-stock-below\" : \"ks-stock-above\");\n resourceCell.classList.remove(isBelow ? \"ks-stock-above\" : \"ks-stock-below\");\n }\n }\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Resource, Resources } from \"../types/index.js\";\nimport { WorkshopManager } from \"../WorkshopManager.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class ResourcesSettingsItem extends Setting {\n readonly #resource: Resource;\n consume: number;\n stock = 0;\n\n get resource() {\n return this.#resource;\n }\n\n constructor(\n resource: Resource,\n enabled = false,\n consume = WorkshopManager.DEFAULT_CONSUME_RATE,\n stock = 0,\n ) {\n super(enabled);\n this.#resource = resource;\n this.consume = consume;\n this.stock = stock;\n }\n}\n\nexport type ResourcesResourceSettings = Record<Resource, ResourcesSettingsItem>;\n\nexport class ResourcesSettings extends Setting {\n resources: ResourcesResourceSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.resources = this.initResources();\n }\n\n private initResources(): ResourcesResourceSettings {\n const items = {} as ResourcesResourceSettings;\n for (const item of Resources) {\n items[item] = new ResourcesSettingsItem(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<ResourcesSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.resources, settings.resources, (resource, item) => {\n resource.enabled = item?.enabled ?? resource.enabled;\n resource.consume = item?.consume ?? resource.consume;\n resource.stock = item?.stock ?? resource.stock;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class StateSettings extends Setting {\n readonly noConfirm: Setting;\n readonly compress: Setting;\n\n constructor(noConfirm = new Setting(), compress = new Setting(true)) {\n super(true);\n this.noConfirm = noConfirm;\n this.compress = compress;\n }\n\n load(settings: Maybe<Partial<StateSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n this.noConfirm.load(settings.noConfirm);\n this.compress.load(settings.compress);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { FallbackLocale } from \"../UserScriptLoader.js\";\nimport { LogFilterSettings } from \"./LogFilterSettings.js\";\nimport { ResourcesSettings } from \"./ResourcesSettings.js\";\nimport { Setting, SettingOptions } from \"./Settings.js\";\nimport { StateSettings } from \"./StateSettings.js\";\n\nexport class EngineSettings extends Setting {\n /**\n * The interval at which the internal processing loop is run, in milliseconds.\n */\n interval = 2000;\n\n /**\n * The currently selected language.\n */\n locale: SettingOptions<SupportedLocale>;\n\n /**\n * Use a dedicated column in the UI for KS.\n */\n ksColumn: Setting;\n\n filters: LogFilterSettings;\n resources: ResourcesSettings;\n readonly states: StateSettings;\n\n constructor(\n enabled = false,\n filters = new LogFilterSettings(),\n resources = new ResourcesSettings(),\n states = new StateSettings(),\n language = FallbackLocale,\n ksColumn = new Setting(),\n ) {\n super(enabled);\n this.filters = filters;\n this.resources = resources;\n this.states = states;\n this.locale = new SettingOptions<SupportedLocale>(language, [\n { label: \"Deutsch\", value: \"de-DE\" },\n { label: \"English\", value: \"en-US\" },\n { label: \"עִברִית\", value: \"he-IL\" },\n { label: \"中文\", value: \"zh-CN\" },\n ]);\n this.ksColumn = ksColumn;\n }\n\n load(settings: Maybe<Partial<EngineSettings>>, retainMetaBehavior = false) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n if (!retainMetaBehavior) {\n this.interval = settings.interval ?? this.interval;\n this.states.load(settings.states);\n this.locale.load(settings.locale);\n this.ksColumn.load(settings.ksColumn);\n }\n\n this.filters.load(settings.filters);\n this.resources.load(settings.resources);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Building, Buildings, type StagedBuilding, StagedBuildings } from \"../types/index.js\";\nimport type { BonfireItem } from \"./BonfireSettings.js\";\nimport { Setting, SettingThreshold } from \"./Settings.js\";\n\nexport class ResetBonfireBuildingSetting extends SettingThreshold {\n /**\n * In case this is an upgrade of another building, this is the name of the\n * base building.\n */\n readonly #baseBuilding: Building | undefined = undefined;\n get baseBuilding() {\n return this.#baseBuilding;\n }\n\n readonly #building: BonfireItem;\n\n get building() {\n return this.#building;\n }\n\n /**\n * In case this is an upgradable building, this indicates the level of\n * the stage.\n */\n readonly #stage: number = 0;\n get stage() {\n return this.#stage;\n }\n\n constructor(\n building: BonfireItem,\n enabled = false,\n threshold = -1,\n baseStage?: Building | false,\n ) {\n super(enabled, threshold);\n\n this.#building = building;\n if (baseStage) {\n this.#stage = 1;\n this.#baseBuilding = baseStage;\n }\n }\n}\n\n// unicornPasture is handled in the Religion section.\nexport type ResetBonfireBuildingSettings = Record<\n Exclude<BonfireItem, \"unicornPasture\">,\n ResetBonfireBuildingSetting\n>;\n\nexport class ResetBonfireSettings extends Setting {\n readonly buildings: ResetBonfireBuildingSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.buildings = this.initBuildings();\n }\n\n private initBuildings(): ResetBonfireBuildingSettings {\n const baseStage: Partial<Record<StagedBuilding, Building>> = {\n broadcasttower: \"amphitheatre\",\n dataCenter: \"library\",\n hydroplant: \"aqueduct\",\n solarfarm: \"pasture\",\n spaceport: \"warehouse\",\n };\n\n const items = {} as ResetBonfireBuildingSettings;\n for (const item of Buildings) {\n if (item === \"unicornPasture\") {\n continue;\n }\n items[item] = new ResetBonfireBuildingSetting(item);\n }\n for (const item of StagedBuildings) {\n items[item] = new ResetBonfireBuildingSetting(item, false, -1, baseStage[item]);\n }\n\n return items;\n }\n\n load(settings: Maybe<Partial<ResetBonfireSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.trigger = item?.trigger ?? building.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport {\n type FaithItem,\n ReligionUpgrades,\n TranscendenceUpgrades,\n type UnicornItem,\n UnicornItemVariant,\n ZigguratUpgrades,\n} from \"../types/index.js\";\nimport { Setting, SettingThreshold } from \"./Settings.js\";\n\nexport class ResetReligionBuildingSetting extends SettingThreshold {\n readonly #building: FaithItem | UnicornItem;\n readonly #variant: UnicornItemVariant;\n\n get building() {\n return this.#building;\n }\n get variant() {\n return this.#variant;\n }\n\n constructor(\n building: FaithItem | UnicornItem,\n variant: UnicornItemVariant,\n enabled = false,\n threshold = -1,\n ) {\n super(enabled, threshold);\n this.#building = building;\n this.#variant = variant;\n }\n}\n\nexport type ResetReligionBuildingSettings = Record<\n FaithItem | UnicornItem,\n ResetReligionBuildingSetting\n>;\n\nexport class ResetReligionSettings extends Setting {\n readonly buildings: ResetReligionBuildingSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.buildings = this.initBuildings();\n }\n\n private initBuildings(): ResetReligionBuildingSettings {\n const items = {} as ResetReligionBuildingSettings;\n for (const item of ReligionUpgrades) {\n items[item] = new ResetReligionBuildingSetting(item, UnicornItemVariant.OrderOfTheSun);\n }\n for (const item of TranscendenceUpgrades) {\n items[item] = new ResetReligionBuildingSetting(item, UnicornItemVariant.Cryptotheology);\n }\n for (const item of ZigguratUpgrades) {\n items[item] = new ResetReligionBuildingSetting(item, UnicornItemVariant.Ziggurat);\n }\n items.unicornPasture = new ResetReligionBuildingSetting(\n \"unicornPasture\",\n UnicornItemVariant.UnicornPasture,\n );\n return items;\n }\n\n load(settings: Maybe<Partial<ResetReligionSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.trigger = item?.trigger ?? building.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Resource, Resources } from \"../types/index.js\";\nimport { Setting, SettingThreshold } from \"./Settings.js\";\n\nexport class ResetResourcesSettingsItem extends SettingThreshold {\n readonly #resource: Resource;\n\n get resource() {\n return this.#resource;\n }\n\n constructor(resource: Resource, enabled = false, threshold = -1) {\n super(enabled, threshold);\n this.#resource = resource;\n }\n}\n\nexport type ResetResourcesResourceSettings = Record<Resource, ResetResourcesSettingsItem>;\n\nexport class ResetResourcesSettings extends Setting {\n resources: ResetResourcesResourceSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.resources = this.initResources();\n }\n\n private initResources(): ResetResourcesResourceSettings {\n const items = {} as ResetResourcesResourceSettings;\n for (const item of Resources) {\n items[item] = new ResetResourcesSettingsItem(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<ResetResourcesSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.resources, settings.resources, (resource, item) => {\n resource.enabled = item?.enabled ?? resource.enabled;\n resource.trigger = item?.trigger ?? resource.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type SpaceBuilding, SpaceBuildings } from \"../types/index.js\";\nimport { Setting, SettingThreshold } from \"./Settings.js\";\n\nexport class ResetSpaceBuildingSetting extends SettingThreshold {\n readonly #building: SpaceBuilding;\n\n get building() {\n return this.#building;\n }\n\n constructor(building: SpaceBuilding, enabled = false, threshold = -1) {\n super(enabled, threshold);\n this.#building = building;\n }\n}\n\nexport type ResetSpaceBuildingSettings = Record<SpaceBuilding, SettingThreshold>;\n\nexport class ResetSpaceSettings extends Setting {\n readonly buildings: ResetSpaceBuildingSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.buildings = this.initBuildings();\n }\n\n private initBuildings(): ResetSpaceBuildingSettings {\n const items = {} as ResetSpaceBuildingSettings;\n for (const item of SpaceBuildings) {\n items[item] = new ResetSpaceBuildingSetting(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<ResetSpaceSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.trigger = item?.trigger ?? building.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { ChronoForgeUpgrades, TimeItemVariant, VoidSpaceUpgrades } from \"../types/index.js\";\nimport { Setting, SettingThreshold } from \"./Settings.js\";\nimport type { TimeItem } from \"./TimeSettings.js\";\n\nexport class ResetTimeBuildingSetting extends SettingThreshold {\n readonly #building: TimeItem;\n readonly #variant: TimeItemVariant;\n\n get building() {\n return this.#building;\n }\n get variant() {\n return this.#variant;\n }\n\n constructor(id: TimeItem, variant: TimeItemVariant, enabled = false, threshold = -1) {\n super(enabled, threshold);\n this.#building = id;\n this.#variant = variant;\n }\n}\n\nexport type ResetTimeBuildingSettings = Record<TimeItem, ResetTimeBuildingSetting>;\n\nexport class ResetTimeSettings extends Setting {\n readonly buildings: ResetTimeBuildingSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.buildings = this.initBuildings();\n }\n\n private initBuildings(): ResetTimeBuildingSettings {\n const items = {} as ResetTimeBuildingSettings;\n for (const item of ChronoForgeUpgrades) {\n items[item] = new ResetTimeBuildingSetting(item, TimeItemVariant.Chronoforge);\n }\n for (const item of VoidSpaceUpgrades) {\n if (item === \"usedCryochambers\") {\n continue;\n }\n items[item] = new ResetTimeBuildingSetting(item, TimeItemVariant.VoidSpace);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<ResetTimeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.trigger = item?.trigger ?? building.trigger;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Upgrade, Upgrades } from \"../types/index.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class ResetUpgradeSettingsItem extends Setting {\n readonly #upgrade: Upgrade;\n\n get upgrade() {\n return this.#upgrade;\n }\n\n constructor(upgrade: Upgrade, enabled = false) {\n super(enabled);\n this.#upgrade = upgrade;\n }\n}\n\nexport type ResetUpgradeSettingsItems = Record<Upgrade, ResetUpgradeSettingsItem>;\n\nexport class ResetUpgradeSettings extends Setting {\n readonly upgrades: ResetUpgradeSettingsItems;\n\n constructor(enabled = false) {\n super(enabled);\n this.upgrades = this.initUpgrades();\n }\n\n private initUpgrades(): ResetUpgradeSettingsItems {\n const items = {} as ResetUpgradeSettingsItems;\n for (const item of Upgrades) {\n items[item] = new ResetUpgradeSettingsItem(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<ResetUpgradeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.upgrades, settings.upgrades, (upgrade, item) => {\n upgrade.enabled = item?.enabled ?? upgrade.enabled;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { ResetBonfireSettings } from \"./ResetBonfireSettings.js\";\nimport { ResetReligionSettings } from \"./ResetReligionSettings.js\";\nimport { ResetResourcesSettings } from \"./ResetResourcesSettings.js\";\nimport { ResetSpaceSettings } from \"./ResetSpaceSettings.js\";\nimport { ResetTimeSettings } from \"./ResetTimeSettings.js\";\nimport { ResetUpgradeSettings } from \"./ResetUpgradeSettings.js\";\nimport { Setting } from \"./Settings.js\";\n\nexport class ResetSettings extends Setting {\n bonfire: ResetBonfireSettings;\n religion: ResetReligionSettings;\n resources: ResetResourcesSettings;\n space: ResetSpaceSettings;\n time: ResetTimeSettings;\n upgrades: ResetUpgradeSettings;\n\n constructor(\n enabled = false,\n bonfire = new ResetBonfireSettings(),\n religion = new ResetReligionSettings(),\n resources = new ResetResourcesSettings(),\n space = new ResetSpaceSettings(),\n time = new ResetTimeSettings(),\n upgrades = new ResetUpgradeSettings(),\n ) {\n super(enabled);\n this.bonfire = bonfire;\n this.religion = religion;\n this.resources = resources;\n this.space = space;\n this.time = time;\n this.upgrades = upgrades;\n }\n\n load(settings: Maybe<Partial<ResetSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n this.bonfire.load(settings.bonfire);\n this.religion.load(settings.religion);\n this.resources.load(settings.resources);\n this.space.load(settings.space);\n this.time.load(settings.time);\n this.upgrades.load(settings.upgrades);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { Cycles } from \"../types/index.js\";\nimport { Setting, SettingTrigger } from \"./Settings.js\";\nimport type { CyclesSettings } from \"./TimeSkipSettings.js\";\n\nexport class TimeSkipHeatSettings extends SettingTrigger {\n readonly cycles: CyclesSettings;\n readonly activeHeatTransferStatus: Setting;\n\n constructor(activeHeatTransferStatus = new Setting()) {\n super(false, 1);\n this.cycles = this.initCycles();\n this.activeHeatTransferStatus = activeHeatTransferStatus;\n }\n\n private initCycles(): CyclesSettings {\n const items = {} as CyclesSettings;\n for (const item of Cycles) {\n items[item] = new Setting();\n }\n return items;\n }\n\n load(settings: Maybe<Partial<TimeSkipHeatSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.cycles, settings.cycles, (cycle, item) => {\n cycle.enabled = item?.enabled ?? cycle.enabled;\n });\n this.activeHeatTransferStatus.load(settings.activeHeatTransferStatus);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { TimeSkipHeatSettings } from \"../settings/TimeSkipHeatSettings.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Cycle, Cycles, type Season, Seasons } from \"../types/index.js\";\nimport { Setting, SettingThresholdMax } from \"./Settings.js\";\n\nexport type CyclesSettings = Record<Cycle, Setting>;\nexport type SeasonsSettings = Record<Season, Setting>;\n\nexport class TimeSkipSettings extends SettingThresholdMax {\n readonly cycles: CyclesSettings;\n readonly seasons: SeasonsSettings;\n readonly activeHeatTransfer: TimeSkipHeatSettings;\n readonly ignoreOverheat: Setting;\n\n constructor(ignoreOverheat = new Setting(), activeHeatTransfer = new TimeSkipHeatSettings()) {\n super(false, 5);\n this.cycles = this.initCycles();\n this.seasons = this.initSeason();\n this.activeHeatTransfer = activeHeatTransfer;\n this.ignoreOverheat = ignoreOverheat;\n }\n\n private initCycles(): CyclesSettings {\n const items = {} as CyclesSettings;\n for (const item of Cycles) {\n items[item] = new Setting();\n }\n return items;\n }\n\n private initSeason(): SeasonsSettings {\n const items = {} as SeasonsSettings;\n for (const item of Seasons) {\n items[item] = new Setting();\n }\n return items;\n }\n\n load(settings: Maybe<Partial<TimeSkipSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.cycles, settings.cycles, (cycle, item) => {\n cycle.enabled = item?.enabled ?? cycle.enabled;\n });\n consumeEntriesPedantic(this.seasons, settings.seasons, (season, item) => {\n season.enabled = item?.enabled ?? season.enabled;\n });\n this.ignoreOverheat.load(settings.ignoreOverheat);\n this.activeHeatTransfer.load(settings.activeHeatTransfer);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { ResetSettings } from \"./ResetSettings.js\";\nimport { Setting, SettingTrigger } from \"./Settings.js\";\nimport { TimeSkipSettings } from \"./TimeSkipSettings.js\";\n\nexport type CycleIndices = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\nexport type TimeControlItem = \"accelerateTime\" | \"reset\" | \"timeSkip\";\n\nexport class TimeControlSettings extends Setting {\n accelerateTime: SettingTrigger;\n timeSkip: TimeSkipSettings;\n reset: ResetSettings;\n\n constructor(\n enabled = false,\n accelerateTime = new SettingTrigger(false, 1),\n reset = new ResetSettings(),\n timeSkip = new TimeSkipSettings(),\n ) {\n super(enabled);\n this.accelerateTime = accelerateTime;\n this.reset = reset;\n this.timeSkip = timeSkip;\n }\n\n load(settings: Maybe<Partial<TimeControlSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n this.accelerateTime.load(settings.accelerateTime);\n this.reset.load(settings.reset);\n this.timeSkip.load(settings.timeSkip);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport {\n type ChronoForgeUpgrade,\n ChronoForgeUpgrades,\n TimeItemVariant,\n type VoidSpaceUpgrade,\n VoidSpaceUpgrades,\n} from \"../types/index.js\";\nimport { Setting, SettingTrigger, SettingTriggerMax } from \"./Settings.js\";\n\n/**\n * The upgrades on the Time tab that we have options for.\n */\nexport type TimeItem = Exclude<ChronoForgeUpgrade | VoidSpaceUpgrade, \"usedCryochambers\">;\n\nexport class TimeSettingsItem extends SettingTriggerMax {\n readonly #building: TimeItem;\n readonly #variant: TimeItemVariant;\n\n get building() {\n return this.#building;\n }\n get variant() {\n return this.#variant;\n }\n\n constructor(building: TimeItem, variant: TimeItemVariant, enabled = false) {\n super(enabled, -1, 0);\n this.#building = building;\n this.#variant = variant;\n }\n}\n\nexport type TimeBuildingsSettings = Record<TimeItem, TimeSettingsItem>;\n\nexport class TimeSettings extends SettingTrigger {\n buildings: TimeBuildingsSettings;\n\n fixCryochambers: Setting;\n\n constructor(enabled = false, trigger = -1, fixCryochambers = new Setting()) {\n super(enabled, trigger);\n this.buildings = this.initBuildings();\n this.fixCryochambers = fixCryochambers;\n }\n\n private initBuildings(): TimeBuildingsSettings {\n const items = {} as TimeBuildingsSettings;\n for (const item of ChronoForgeUpgrades) {\n items[item] = new TimeSettingsItem(item, TimeItemVariant.Chronoforge);\n }\n for (const item of VoidSpaceUpgrades) {\n if (item === \"usedCryochambers\") {\n continue;\n }\n items[item] = new TimeSettingsItem(item, TimeItemVariant.VoidSpace);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<TimeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.buildings, settings.buildings, (building, item) => {\n building.enabled = item?.enabled ?? building.enabled;\n building.max = item?.max ?? building.max;\n building.trigger = item?.trigger ?? building.trigger;\n });\n\n this.fixCryochambers.load(settings.fixCryochambers);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Race, Races } from \"../types/index.js\";\nimport { SettingMax, SettingTrigger } from \"./Settings.js\";\n\nexport class EmbassySetting extends SettingMax {\n readonly #race: Race;\n\n get race() {\n return this.#race;\n }\n\n constructor(race: Race, enabled = false) {\n super(enabled);\n this.#race = race;\n }\n}\n\nexport type EmbassyRaceSettings = Record<Race, SettingMax>;\n\nexport class EmbassySettings extends SettingTrigger {\n races: EmbassyRaceSettings;\n\n constructor(enabled = false) {\n super(enabled);\n this.races = this.initRaces();\n }\n\n private initRaces(): EmbassyRaceSettings {\n const items = {} as EmbassyRaceSettings;\n for (const item of Races) {\n // Leviathans have no embassies.\n if (item === \"leviathans\") {\n continue;\n }\n items[item] = new EmbassySetting(item);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<EmbassySettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.races, settings.races, (race, item) => {\n race.enabled = item?.enabled ?? race.enabled;\n race.max = item?.max ?? race.max;\n });\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Race, Races, type Season } from \"../types/index.js\";\nimport { EmbassySettings } from \"./EmbassySettings.js\";\nimport {\n type Requirement,\n Setting,\n SettingBuySellThreshold,\n SettingLimitedTrigger,\n SettingTrigger,\n} from \"./Settings.js\";\n\nexport class TradeSettingsItem extends SettingLimitedTrigger {\n readonly #race: Race;\n readonly seasons: Record<Season, Setting>;\n\n /**\n * A resource that is required to trade with the race.\n */\n readonly #require: Requirement;\n\n get race() {\n return this.#race;\n }\n get require() {\n return this.#require;\n }\n\n constructor(\n race: Race,\n enabled: boolean,\n limited: boolean,\n summer: boolean,\n autumn: boolean,\n winter: boolean,\n spring: boolean,\n require: Requirement = false,\n ) {\n super(enabled, limited);\n this.#race = race;\n this.seasons = {\n autumn: new Setting(autumn),\n spring: new Setting(spring),\n summer: new Setting(summer),\n winter: new Setting(winter),\n };\n this.#require = require;\n }\n}\n\nexport type TradeSettingsItems = Record<Race, TradeSettingsItem>;\n\nexport class TradeSettings extends SettingTrigger {\n races: TradeSettingsItems;\n\n feedLeviathans: Setting;\n buildEmbassies: EmbassySettings;\n tradeBlackcoin: SettingBuySellThreshold;\n unlockRaces: Setting;\n\n constructor(\n enabled = false,\n trigger = -1,\n buildEmbassies = new EmbassySettings(),\n feedLeviathans = new Setting(),\n tradeBlackcoin = new SettingBuySellThreshold(false, 1090.0, 1095.0, 10000),\n unlockRaces = new Setting(),\n ) {\n super(enabled, trigger);\n this.races = this.initRaces();\n this.buildEmbassies = buildEmbassies;\n this.feedLeviathans = feedLeviathans;\n this.tradeBlackcoin = tradeBlackcoin;\n this.unlockRaces = unlockRaces;\n }\n\n private initRaces(): TradeSettingsItems {\n const defaultRequire: Partial<Record<Race, Requirement>> = {\n dragons: \"titanium\",\n griffins: \"wood\",\n leviathans: \"unobtainium\",\n lizards: \"minerals\",\n sharks: \"iron\",\n };\n const items = {} as TradeSettingsItems;\n for (const item of Races) {\n const require = defaultRequire[item] ?? false;\n items[item] = new TradeSettingsItem(item, false, false, false, false, false, false, require);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<TradeSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.races, settings.races, (race, item) => {\n race.enabled = item?.enabled ?? race.enabled;\n race.limited = item?.limited ?? race.limited;\n race.trigger = item?.trigger ?? race.trigger;\n race.seasons.autumn.enabled = item?.seasons.autumn.enabled ?? race.seasons.autumn.enabled;\n race.seasons.spring.enabled = item?.seasons.spring.enabled ?? race.seasons.spring.enabled;\n race.seasons.summer.enabled = item?.seasons.summer.enabled ?? race.seasons.summer.enabled;\n race.seasons.winter.enabled = item?.seasons.winter.enabled ?? race.seasons.winter.enabled;\n });\n\n this.buildEmbassies.load(settings.buildEmbassies);\n this.feedLeviathans.load(settings.feedLeviathans);\n this.tradeBlackcoin.load(settings.tradeBlackcoin);\n this.unlockRaces.load(settings.unlockRaces);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { type Job, Jobs, type Trait, Traits } from \"../types/index.js\";\nimport { Setting, SettingOptions } from \"./Settings.js\";\n\nexport class ElectLeaderSettings extends Setting {\n readonly job: SettingOptions<Job>;\n readonly trait: SettingOptions<Trait>;\n\n constructor(\n enabled = false,\n job = new SettingOptions<Job>(\n \"any\",\n Jobs.map(item => {\n return { label: \"\", value: item };\n }),\n ),\n trait = new SettingOptions<Trait>(\n \"none\",\n Traits.map(item => {\n return { label: \"\", value: item };\n }),\n ),\n ) {\n super(enabled);\n this.job = job;\n this.trait = trait;\n }\n\n load(settings: Maybe<Partial<ElectLeaderSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n this.job.load(settings.job);\n this.trait.load(settings.trait);\n }\n}\n","import { isNil, type Maybe } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { consumeEntriesPedantic } from \"../tools/Entries.js\";\nimport { type Job, Jobs } from \"../types/index.js\";\nimport { ElectLeaderSettings } from \"./ElectLeaderSettings.js\";\nimport { Setting, SettingMax, SettingTrigger } from \"./Settings.js\";\n\nexport type VillageJobSettings = Record<Job, SettingMax>;\n\nexport class VillageSettings extends Setting {\n jobs: VillageJobSettings;\n\n holdFestivals: Setting;\n hunt: SettingTrigger;\n promoteKittens: SettingTrigger;\n promoteLeader: Setting;\n electLeader: ElectLeaderSettings;\n\n constructor(\n enabled = false,\n holdFestivals = new Setting(),\n hunt = new SettingTrigger(false, 0.98),\n promoteKittens = new SettingTrigger(false, 1),\n promoteLeader = new Setting(),\n electLeader = new ElectLeaderSettings(),\n ) {\n super(enabled);\n this.jobs = this.initJobs();\n this.holdFestivals = holdFestivals;\n this.hunt = hunt;\n this.promoteKittens = promoteKittens;\n this.promoteLeader = promoteLeader;\n this.electLeader = electLeader;\n }\n\n private initJobs(): VillageJobSettings {\n const items = {} as VillageJobSettings;\n for (const item of Jobs) {\n items[item] = new SettingMax(false, 0);\n }\n return items;\n }\n\n load(settings: Maybe<Partial<VillageSettings>>) {\n if (isNil(settings)) {\n return;\n }\n\n super.load(settings);\n\n consumeEntriesPedantic(this.jobs, settings.jobs, (job, item) => {\n job.enabled = item?.enabled ?? job.enabled;\n job.max = item?.max ?? job.max;\n });\n\n this.holdFestivals.enabled = settings.holdFestivals?.enabled ?? this.holdFestivals.enabled;\n this.hunt.load(settings.hunt);\n this.promoteKittens.enabled = settings.promoteKittens?.enabled ?? this.promoteKittens.enabled;\n this.promoteLeader.enabled = settings.promoteLeader?.enabled ?? this.promoteLeader.enabled;\n this.electLeader.load(settings.electLeader);\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { BonfireManager } from \"./BonfireManager.js\";\nimport type { Engine, FrameContext } from \"./Engine.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport type { ReligionManager } from \"./ReligionManager.js\";\nimport type { SpaceManager } from \"./SpaceManager.js\";\nimport { type CycleIndices, TimeControlSettings } from \"./settings/TimeControlSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { objectEntries } from \"./tools/Entries.js\";\nimport { negativeOneToInfinity } from \"./tools/Format.js\";\nimport type {\n BuildingMeta,\n UnsafeBuilding,\n UnsafeUnstagedBuildingButtonOptions,\n} from \"./types/buildings.js\";\nimport type { BuildingBtn, UnsafeBuildingBtnModel } from \"./types/core.js\";\nimport {\n type ChronoForgeUpgrade,\n Cycles,\n type Price,\n TimeItemVariant,\n type VoidSpaceUpgrade,\n} from \"./types/index.js\";\nimport type { ShatterTCBtn, ShatterTCBtnController, TimeTab } from \"./types/time.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class TimeControlManager {\n private readonly _host: KittenScientists;\n readonly settings: TimeControlSettings;\n readonly manager: TabManager<TimeTab>;\n private readonly _bonfireManager: BonfireManager;\n private readonly _religionManager: ReligionManager;\n private readonly _spaceManager: SpaceManager;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n bonfireManager: BonfireManager,\n religionManager: ReligionManager,\n spaceManager: SpaceManager,\n workshopManager: WorkshopManager,\n settings = new TimeControlSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Time\");\n\n this._bonfireManager = bonfireManager;\n this._religionManager = religionManager;\n this._spaceManager = spaceManager;\n this._workshopManager = workshopManager;\n }\n\n async tick(_context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n if (this.settings.accelerateTime.enabled) {\n this.accelerateTime();\n }\n if (this.settings.timeSkip.enabled) {\n this.timeSkip();\n }\n if (this.settings.reset.enabled) {\n await this.autoReset(this._host.engine);\n }\n }\n\n async autoReset(engine: Engine) {\n // Don't reset if there's a challenge running.\n if (this._host.game.challenges.currentChallenge) {\n return;\n }\n\n const checkedList: Array<{ name: string; trigger: number; val: number }> = [];\n const checkList: Array<string> = [];\n\n // This function allows us to quickly check a list of items for our\n // ability to buy them.\n // The idea is that, if we don't have a given building yet, we put\n // it on the `checkList`. This function will then check the provided\n // buttons and see if the item appears on the checklist.\n // If we don't have a given item, but we *could* buy it, then we act\n // as if we already had it.\n const check = <\n T extends BuildingBtn<UnsafeBuildingBtnModel<UnsafeUnstagedBuildingButtonOptions>>,\n >(\n buttons: Array<T>,\n ) => {\n if (checkList.length !== 0) {\n for (const button of buttons) {\n if (isNil(button.model)) {\n continue;\n }\n\n const model = button.model as { metadata: { name: string }; prices: Array<Price> };\n\n const name = model.metadata.name;\n const index = checkList.indexOf(name);\n if (index !== -1) {\n checkList.splice(index, 1);\n if (this._host.game.resPool.hasRes(mustExist(model.prices))) {\n return true;\n }\n }\n }\n }\n return false;\n };\n\n // check building\n for (const [name, entry] of objectEntries(this.settings.reset.bonfire.buildings)) {\n if (!entry.enabled) {\n continue;\n }\n\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (entry.trigger < 0) {\n return;\n }\n\n // TODO: Obvious error here. For upgraded buildings, it needs special handling.\n let bld: BuildingMeta<UnsafeBuilding> | null;\n try {\n // @ts-expect-error Obvious error here. For upgraded buildings, it needs special handling.\n bld = this._host.game.bld.getBuildingExt(name);\n } catch (_error) {\n bld = null;\n }\n if (isNil(bld)) {\n continue;\n }\n\n checkedList.push({\n name: bld.meta.label ?? mustExist(bld.meta.stages)[mustExist(bld.meta.stage)].label,\n trigger: entry.trigger,\n val: bld.meta.val,\n });\n if (0 < entry.trigger) {\n // If the required amount of buildings hasn't been built yet, bail out.\n if (bld.meta.val < entry.trigger) {\n return;\n }\n } else {\n checkList.push(name);\n }\n }\n\n // unicornPasture\n // Special handling for unicorn pasture. As it's listed under religion, but is\n // actually a bonfire item.\n const unicornPasture = this.settings.reset.religion.buildings.unicornPasture;\n if (unicornPasture.enabled) {\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (unicornPasture.trigger < 0) {\n return;\n }\n\n const bld = this._host.game.bld.getBuildingExt(\"unicornPasture\");\n checkedList.push({\n name: mustExist(bld.meta.label),\n trigger: unicornPasture.trigger,\n val: bld.meta.val,\n });\n if (0 < unicornPasture.trigger) {\n if (bld.meta.val < unicornPasture.trigger) {\n return;\n }\n } else {\n checkList.push(\"unicornPasture\");\n }\n }\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n if (check(this._bonfireManager.manager.tab.children) || checkList.length) {\n return;\n }\n\n // check space\n // This is identical to regular buildings.\n for (const [name, entry] of objectEntries(this.settings.reset.space.buildings)) {\n if (!entry.enabled) {\n continue;\n }\n\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (entry.trigger < 0) {\n return;\n }\n\n const bld = this._host.game.space.getBuilding(name);\n checkedList.push({ name: bld.label, trigger: entry.trigger, val: bld.val });\n if (0 < entry.trigger) {\n if (bld.val < entry.trigger) {\n return;\n }\n } else {\n checkList.push(name);\n }\n }\n\n if (checkList.length === 0) {\n const panels = mustExist(this._spaceManager.manager.tab.planetPanels);\n for (const panel of panels) {\n for (const panelButton of panel.children) {\n const model = mustExist(panelButton.model);\n const name = model.metadata.name;\n const index = checkList.indexOf(name);\n if (index !== -1) {\n checkList.splice(index, 1);\n if (this._host.game.resPool.hasRes(mustExist(model.prices))) {\n break;\n }\n }\n }\n }\n }\n if (checkList.length) {\n return;\n }\n\n // check religion\n for (const [name, entry] of objectEntries(this.settings.reset.religion.buildings)) {\n if (!entry.enabled) {\n continue;\n }\n\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (entry.trigger < 0) {\n return;\n }\n\n const bld = mustExist(this._religionManager.getBuild(name, entry.variant));\n checkedList.push({ name: bld.label, trigger: entry.trigger, val: bld.val });\n if (0 < entry.trigger) {\n if (bld.val < entry.trigger) {\n return;\n }\n } else {\n checkList.push(name);\n }\n }\n\n if (\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n check(this._religionManager.manager.tab.zgUpgradeButtons) ||\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n check(this._religionManager.manager.tab.rUpgradeButtons) ||\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n check(this._religionManager.manager.tab.ctPanel.children[0].children) ||\n checkList.length\n ) {\n return;\n }\n\n // check time\n for (const [name, entry] of objectEntries(this.settings.reset.time.buildings)) {\n if (!entry.enabled) {\n continue;\n }\n\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (entry.trigger < 0) {\n return;\n }\n\n const bld = mustExist(this.getBuild(name, entry.variant));\n checkedList.push({ name: bld.label, trigger: entry.trigger, val: bld.val });\n if (0 < entry.trigger) {\n if (bld.val < entry.trigger) {\n return;\n }\n } else {\n checkList.push(name);\n }\n }\n\n if (\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n check(this.manager.tab.cfPanel.children[0].children) ||\n // @ts-expect-error The `check()` calls are unsafe and need to be rewritten.\n check(this.manager.tab.vsPanel.children[0].children) ||\n checkList.length\n ) {\n return;\n }\n\n // check resources\n for (const [name, entry] of objectEntries(this.settings.reset.resources.resources)) {\n if (!entry.enabled) {\n continue;\n }\n\n // If the trigger for an item is set to infinity, it basically disables the entire feature.\n if (entry.trigger < 0) {\n return;\n }\n\n const res = mustExist(this._host.game.resPool.get(name));\n checkedList.push({\n name: this._host.engine.i18n(`$resources.${entry.resource}.title`),\n trigger: entry.trigger,\n val: res.value,\n });\n if (res.value < entry.trigger) {\n return;\n }\n }\n\n // Check Workshop upgrades\n for (const [, entry] of objectEntries(this.settings.reset.upgrades.upgrades)) {\n if (entry.enabled) {\n const upgrade = mustExist(\n this._host.game.workshop.upgrades.find(subject => subject.name === entry.upgrade),\n );\n checkedList.push({ name: upgrade.label, trigger: 1, val: upgrade.researched ? 1 : 0 });\n if (!upgrade.researched) {\n return;\n }\n }\n }\n\n // We have now determined that we either have all items or could buy all items.\n\n // stop!\n engine.stop(false);\n\n const sleep = async (time = 1500) => {\n return new Promise((resolve, reject) => {\n if (!this._host.engine.settings.enabled) {\n reject(new Error(\"canceled by player\"));\n return;\n }\n setTimeout(resolve, time);\n });\n };\n\n try {\n for (const checked of checkedList) {\n await sleep(500);\n this._host.engine.imessage(\"reset.check\", [\n checked.name,\n this._host.game.getDisplayValueExt(checked.trigger),\n this._host.game.getDisplayValueExt(checked.val),\n ]);\n }\n\n await sleep(0);\n this._host.engine.imessage(\"reset.checked\");\n await sleep();\n this._host.engine.iactivity(\"reset.tip\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.10\");\n await sleep(2000);\n this._host.engine.imessage(\"reset.countdown.9\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.8\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.7\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.6\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.5\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.4\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.3\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.2\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.1\");\n await sleep();\n this._host.engine.imessage(\"reset.countdown.0\");\n await sleep();\n this._host.engine.iactivity(\"reset.last.message\");\n await sleep();\n } catch (_error) {\n this._host.engine.imessage(\"reset.cancel.message\");\n this._host.engine.iactivity(\"reset.cancel.activity\");\n return;\n }\n\n //=============================================================\n for (\n let challengeIndex = 0;\n challengeIndex < this._host.game.challenges.challenges.length;\n challengeIndex++\n ) {\n this._host.game.challenges.challenges[challengeIndex].pending = false;\n }\n this._host.game.resetAutomatic();\n //=============================================================\n }\n\n accelerateTime() {\n const temporalFluxAvailable = this._workshopManager.getValueAvailable(\"temporalFlux\");\n\n // If there's no available flux (we went below the limit)\n if (temporalFluxAvailable <= 0) {\n if (this._host.game.time.isAccelerated) {\n // Stop the acceleration\n this._host.game.time.isAccelerated = false;\n }\n return;\n }\n\n if (this._host.game.time.isAccelerated) {\n return;\n }\n\n const temporalFlux = this._host.game.resPool.get(\"temporalFlux\");\n\n if (temporalFlux.maxValue * this.settings.accelerateTime.trigger <= temporalFlux.value) {\n this._host.game.time.isAccelerated = true;\n this._host.engine.iactivity(\"act.accelerate\", [], \"ks-accelerate\");\n this._host.engine.storeForSummary(\"accelerate\", 1);\n }\n }\n\n timeSkip() {\n if (!this._host.game.workshop.get(\"chronoforge\").researched) {\n return;\n }\n\n // Don't time skip while we're in a temporal paradox.\n if (this._host.game.calendar.day < 0) {\n return;\n }\n\n // If we have less time crystals than our required trigger value, bail out.\n const shatterCostIncreaseChallenge = this._host.game.getEffect(\"shatterCostIncreaseChallenge\");\n const timeCrystalsAvailable = this._workshopManager.getValueAvailable(\"timeCrystal\");\n if (\n timeCrystalsAvailable < this.settings.timeSkip.trigger ||\n timeCrystalsAvailable < 1 + shatterCostIncreaseChallenge\n ) {\n return;\n }\n\n const shatterVoidCost = this._host.game.getEffect(\"shatterVoidCost\");\n const voidAvailable = this._workshopManager.getValueAvailable(\"void\");\n if (voidAvailable < shatterVoidCost) {\n return;\n }\n\n // If skipping during this season was disabled, bail out.\n const season = this._host.game.calendar.season;\n if (!this.settings.timeSkip.seasons[this._host.game.calendar.seasons[season].name].enabled) {\n return;\n }\n\n // If skipping during this cycle was disabled, bail out.\n const currentCycle = this._host.game.calendar.cycle;\n if (!this.settings.timeSkip.cycles[Cycles[currentCycle]].enabled) {\n return;\n }\n\n // If we have too much stored heat, wait for it to cool down.\n const heatMax = this._host.game.getEffect(\"heatMax\");\n const heatNow = this._host.game.time.heat;\n if (!this.settings.timeSkip.ignoreOverheat.enabled) {\n if (heatMax <= heatNow) {\n return;\n }\n }\n\n const factor = this._host.game.challenges.getChallenge(\"1000Years\").researched ? 5 : 10;\n let maxSkipsActiveHeatTransfer = Number.POSITIVE_INFINITY;\n // Active Heat Transfer\n if (\n !this.settings.timeSkip.ignoreOverheat.enabled &&\n this.settings.timeSkip.activeHeatTransfer.enabled\n ) {\n const heatPerTick = this._host.game.getEffect(\"heatPerTick\");\n const ticksPerSecond = this._host.game.ticksPerSecond;\n if (this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled) {\n // Heat Transfer to specified value\n if (heatNow <= heatMax * this.settings.timeSkip.activeHeatTransfer.trigger) {\n this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled = false;\n this._host.refreshEntireUserInterface();\n this._host.engine.iactivity(\"act.time.activeHeatTransferEnd\", [], \"ks-timeSkip\");\n }\n // Get temporalFlux\n // TODO: More judgment(e.g. determining crystal cost)? Or should the players decide for themselves(Add options)?\n const temporalFluxProduction = this._host.game.getEffect(\"temporalFluxProduction\");\n const daysPerYear =\n (this._host.game.calendar.daysPerSeason +\n 10 +\n this._host.game.getEffect(\"temporalParadoxDay\")) *\n this._host.game.calendar.seasonsPerYear;\n const ticksPerDay = this._host.game.calendar.ticksPerDay;\n const daysPerTicks = (1 + this._host.game.timeAccelerationRatio()) / ticksPerDay;\n const ticksPerYear = daysPerYear / daysPerTicks;\n const temporalFlux = this._host.game.resPool.get(\"temporalFlux\");\n const fluxEnabled = temporalFlux.maxValue > ticksPerYear;\n const flux = temporalFlux.value < ticksPerYear;\n if (\n !season &&\n this._host.game.calendar.day < 10 &&\n temporalFluxProduction > factor / heatPerTick &&\n this.settings.accelerateTime.enabled &&\n fluxEnabled &&\n flux\n ) {\n maxSkipsActiveHeatTransfer = Math.ceil(\n (ticksPerYear + ticksPerDay * 10 - temporalFlux.value) / temporalFluxProduction,\n );\n this._host.engine.iactivity(\"act.time.getTemporalFlux\", [], \"ks-timeSkip\");\n this._host.engine.storeForSummary(\"time.getTemporalFlux\", 1);\n } else if (this.settings.timeSkip.activeHeatTransfer.cycles[Cycles[currentCycle]].enabled) {\n // Heat Transfer during selected cycles\n return;\n } else {\n maxSkipsActiveHeatTransfer =\n this._host.game.calendar.yearsPerCycle - this._host.game.calendar.cycleYear;\n }\n } else if (heatNow >= heatMax - heatPerTick * ticksPerSecond * 10) {\n this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled = true;\n this._host.refreshEntireUserInterface();\n this._host.engine.iactivity(\"act.time.activeHeatTransferStart\", [], \"ks-timeSkip\");\n this._host.engine.storeForSummary(\"time.activeHeatTransferStart\", 1);\n }\n }\n\n // The maximum years to skip, based on the user configuration.\n const maxSkips = negativeOneToInfinity(this.settings.timeSkip.max);\n\n // The amount of skips we can perform.\n let canSkip = Math.floor(\n Math.min(\n this.settings.timeSkip.ignoreOverheat.enabled\n ? Number.POSITIVE_INFINITY\n : (heatMax - heatNow) / factor,\n maxSkips,\n maxSkipsActiveHeatTransfer,\n timeCrystalsAvailable / (1 + shatterCostIncreaseChallenge),\n 0 < shatterVoidCost ? voidAvailable / shatterVoidCost : Number.POSITIVE_INFINITY,\n ),\n );\n\n // The amount of skips to perform.\n let willSkip = 0;\n\n const yearsPerCycle = this._host.game.calendar.yearsPerCycle;\n const remainingYearsCurrentCycle = yearsPerCycle - this._host.game.calendar.cycleYear;\n const cyclesPerEra = this._host.game.calendar.cyclesPerEra;\n // If the cycle has more years remaining than we can even skip, skip all of them.\n // I guess the idea here is to not skip through years of another cycle, if that\n // cycle may not be enabled for skipping.\n if (canSkip < remainingYearsCurrentCycle) {\n willSkip = canSkip;\n } else {\n willSkip += remainingYearsCurrentCycle;\n canSkip -= remainingYearsCurrentCycle;\n let skipCycles = 1;\n while (\n yearsPerCycle < canSkip &&\n this.settings.timeSkip.cycles[\n Cycles[((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices]\n ].enabled\n ) {\n willSkip += yearsPerCycle;\n canSkip -= yearsPerCycle;\n skipCycles += 1;\n }\n if (\n this.settings.timeSkip.cycles[\n Cycles[((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices]\n ].enabled &&\n 0 < canSkip\n ) {\n willSkip += canSkip;\n }\n }\n // If we found we can skip any years, do so now.\n if (0 < willSkip) {\n const shatter = this._host.game.timeTab.cfPanel.children[0].children[0] as ShatterTCBtn; // check?\n if (isNil(shatter.model)) {\n return;\n }\n this._host.engine.iactivity(\"act.time.skip\", [willSkip], \"ks-timeSkip\");\n (shatter.controller as ShatterTCBtnController).doShatterAmt(shatter.model, willSkip);\n this._host.engine.storeForSummary(\"time.skip\", willSkip);\n }\n }\n\n getBuild(name: ChronoForgeUpgrade | VoidSpaceUpgrade, variant: TimeItemVariant) {\n if (variant === TimeItemVariant.Chronoforge) {\n return this._host.game.time.getCFU(name as ChronoForgeUpgrade);\n }\n return this._host.game.time.getVSU(name as VoidSpaceUpgrade);\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { FrameContext } from \"./Engine.js\";\nimport { BulkPurchaseHelper } from \"./helper/BulkPurchaseHelper.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { type TimeItem, TimeSettings, type TimeSettingsItem } from \"./settings/TimeSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { BuildingStackableBtn, ButtonModern } from \"./types/core.js\";\nimport { type ChronoForgeUpgrade, TimeItemVariant, type VoidSpaceUpgrade } from \"./types/index.js\";\nimport type {\n ChronoforgeBtnController,\n TimeTab,\n UnsafeChronoForgeUpgrade,\n UnsafeChronoforgeUpgradeButtonOptions,\n UnsafeFixCryochamberButtonOptions,\n UnsafeVoidSpaceUpgrade,\n UnsafeVoidSpaceUpgradeButtonOptions,\n VoidSpaceBtnController,\n} from \"./types/time.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class TimeManager {\n private readonly _host: KittenScientists;\n readonly settings: TimeSettings;\n readonly manager: TabManager<TimeTab>;\n private readonly _bulkManager: BulkPurchaseHelper;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new TimeSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Time\");\n this._bulkManager = new BulkPurchaseHelper(this._host, workshopManager);\n this._workshopManager = workshopManager;\n }\n\n tick(context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n // Render the tab to make sure that the buttons actually exist in the DOM.\n // TODO: Is this really required?\n this.manager.render();\n\n this.autoBuild(context);\n\n if (this.settings.fixCryochambers.enabled) {\n this.fixCryochambers();\n }\n }\n\n /**\n * Try to build as many of the passed buildings as possible.\n * Usually, this is called at each iteration of the automation engine to\n * handle the building of items on the Time tab.\n *\n * @param builds The buildings to build.\n */\n autoBuild(\n context: FrameContext,\n builds: Partial<Record<TimeItem, TimeSettingsItem>> = this.settings.buildings,\n ) {\n const bulkManager = this._bulkManager;\n const sectionTrigger = this.settings.trigger;\n\n // Get the current metadata for all the referenced buildings.\n const metaData: Partial<\n Record<TimeItem, Required<UnsafeChronoForgeUpgrade | UnsafeVoidSpaceUpgrade>>\n > = {};\n for (const build of Object.values(builds)) {\n const buildMeta = this.getBuild(build.building, build.variant);\n metaData[build.building] = mustExist(buildMeta);\n\n const buildButton =\n build.variant === TimeItemVariant.Chronoforge\n ? this._getBuildButtonCF(build.building as ChronoForgeUpgrade)\n : this._getBuildButtonVS(build.building as VoidSpaceUpgrade);\n if (isNil(buildButton)) {\n // Not available in this build of KG.\n continue;\n }\n const model = buildButton.model;\n const panel =\n build.variant === TimeItemVariant.Chronoforge\n ? this.manager.tab.cfPanel\n : this.manager.tab.vsPanel;\n\n const buildingMetaData = mustExist(metaData[build.building]);\n buildingMetaData.tHidden = !model?.visible || !model.enabled || !panel.visible;\n }\n\n // Let the bulkmanager determine the builds we can make.\n const buildList = bulkManager.bulk(builds, metaData, sectionTrigger, \"Time\");\n\n for (const build of buildList) {\n if (build.count > 0) {\n this.build(\n build.id as ChronoForgeUpgrade | VoidSpaceUpgrade,\n build.variant as TimeItemVariant,\n build.count,\n );\n context.requestGameUiRefresh = true;\n }\n }\n }\n\n build(\n name: ChronoForgeUpgrade | VoidSpaceUpgrade,\n variant: TimeItemVariant,\n amount: number,\n ): void {\n let amountCalculated = amount;\n let label: string;\n const amountTemp = amountCalculated;\n if (variant === TimeItemVariant.Chronoforge) {\n const itemMetaRaw = game.getUnlockByName(name, \"chronoforge\");\n const controller = new classes.ui.time.ChronoforgeBtnController(\n this._host.game,\n ) as ChronoforgeBtnController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n } else {\n const itemMetaRaw = game.getUnlockByName(name, \"voidSpace\");\n const controller = new classes.ui.time.VoidSpaceBtnController(\n this._host.game,\n ) as VoidSpaceBtnController;\n const model = controller.fetchModel({ controller, id: itemMetaRaw.name });\n amountCalculated = this._bulkManager.construct(model, controller, amountCalculated);\n label = itemMetaRaw.label;\n }\n\n if (amountCalculated !== amountTemp) {\n console.warn(\n ...cl(`${label} Amount ordered: ${amountTemp} Amount Constructed: ${amountCalculated}`),\n );\n // Bail out to not flood the log with garbage.\n if (amountCalculated === 0) {\n return;\n }\n }\n this._host.engine.storeForSummary(label, amountCalculated, \"build\");\n\n if (amountCalculated === 1) {\n this._host.engine.iactivity(\"act.build\", [label], \"ks-build\");\n } else {\n this._host.engine.iactivity(\n \"act.builds\",\n [label, this._host.renderAbsolute(amountCalculated)],\n \"ks-build\",\n );\n }\n }\n\n getBuild(name: ChronoForgeUpgrade | VoidSpaceUpgrade, variant: TimeItemVariant) {\n if (variant === TimeItemVariant.Chronoforge) {\n return this._host.game.time.getCFU(name as ChronoForgeUpgrade);\n }\n return this._host.game.time.getVSU(name as VoidSpaceUpgrade);\n }\n\n private _getBuildButtonCF(name: ChronoForgeUpgrade) {\n return (this.manager.tab.children[2].children[0].children.find(button => button.id === name) ??\n null) as BuildingStackableBtn<UnsafeChronoforgeUpgradeButtonOptions>;\n }\n private _getBuildButtonVS(name: VoidSpaceUpgrade) {\n return (this.manager.tab.children[3].children[0].children.find(button => button.id === name) ??\n null) as BuildingStackableBtn<UnsafeVoidSpaceUpgradeButtonOptions>;\n }\n\n fixCryochambers() {\n if (this._host.game.time.getVSU(\"usedCryochambers\").val < 1) {\n return;\n }\n\n const prices = mustExist(this._host.game.time.getVSU(\"usedCryochambers\").fixPrices);\n for (const price of prices) {\n const available = this._workshopManager.getValueAvailable(price.name);\n if (available < price.val) {\n return;\n }\n }\n\n const btn = this.manager.tab.vsPanel.children[0]\n .children[0] as ButtonModern<UnsafeFixCryochamberButtonOptions>;\n\n let fixed = 0;\n let fixHappened: boolean;\n do {\n fixHappened = false;\n const buyResult = btn.controller.buyItem(mustExist(btn.model), new MouseEvent(\"click\"));\n fixHappened = buyResult.itemBought;\n fixed += fixHappened ? 1 : 0;\n } while (fixHappened);\n\n if (0 < fixed) {\n this._host.engine.iactivity(\"act.fix.cry\", [this._host.renderAbsolute(fixed)], \"ks-fixCry\");\n this._host.engine.storeForSummary(\"fix.cry\", fixed);\n }\n }\n}\n","import { isNil, type Maybe, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { type Automation, Engine, type FrameContext } from \"./Engine.js\";\nimport type { MaterialsCache } from \"./helper/MaterialsCache.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { TradeSettings, type TradeSettingsItem } from \"./settings/TradeSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { objectEntries } from \"./tools/Entries.js\";\nimport { negativeOneToInfinity, ucfirst } from \"./tools/Format.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { Diplomacy, UnsafeRace, UnsafeTradeSellOffer } from \"./types/diplomacy.js\";\nimport type { Race, Resource } from \"./types/index.js\";\nimport type { UnsafeResource } from \"./types/resources.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class TradeManager implements Automation {\n private readonly _host: KittenScientists;\n readonly settings: TradeSettings;\n readonly manager: TabManager<Diplomacy>;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new TradeSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Trade\");\n this._workshopManager = workshopManager;\n }\n\n tick(context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n this.manager.render();\n\n this.autoTrade();\n\n if (this.settings.unlockRaces.enabled) {\n this.autoUnlock(context);\n }\n if (this.settings.buildEmbassies.enabled) {\n this.autoBuildEmbassies(context);\n }\n if (this.settings.feedLeviathans.enabled) {\n this.autoFeedElders();\n }\n if (this.settings.tradeBlackcoin.enabled) {\n this.autoTradeBlackcoin();\n }\n }\n\n autoTrade(cacheManager?: MaterialsCache) {\n const catpower = this._workshopManager.getResource(\"manpower\");\n const gold = this._workshopManager.getResource(\"gold\");\n const sectionTrigger = this.settings.trigger;\n\n // The races we might want to trade with during this frame.\n const trades: Array<Race> = [];\n\n const season = this._host.game.calendar.getCurSeason().name;\n\n // Determine how many races we will trade with this cycle.\n for (const trade of Object.values(this.settings.races)) {\n const race = this.getRace(trade.race);\n const trigger = Engine.evaluateSubSectionTrigger(sectionTrigger, trade.trigger);\n\n // Check if the race is enabled, in season, unlocked, and we can actually afford it.\n if (\n trigger < 0 ||\n !trade.enabled ||\n !trade.seasons[season].enabled ||\n !race.unlocked ||\n !this.singleTradePossible(sectionTrigger, catpower, gold, trade)\n ) {\n continue;\n }\n\n // Additionally, we now check if the trade button is enabled, which kinda makes all previous\n // checks moot, but whatever :D\n const button = this.getTradeButton(race.name);\n if (!button?.model?.enabled) {\n continue;\n }\n\n // Determine which resource the race requires for trading, if any.\n const require = trade.require ? this._workshopManager.getResource(trade.require) : false;\n\n // Check if this trade would be profitable.\n const profitable = this.getProfitability(trade.race);\n // If the trade is set to be limited and profitable, make this trade.\n if (trade.limited && profitable) {\n trades.push(trade.race);\n } else if (\n // If this trade is not limited, it must either not require anything, or\n // the required resource must be over the trigger value.\n // Additionally, gold must also be over the trigger value.\n !require ||\n trigger <= require.value / require.maxValue\n ) {\n trades.push(trade.race);\n }\n }\n\n // If no possible trades were found, bail out.\n if (trades.length === 0) {\n return;\n }\n\n // Figure out how much we can currently trade\n let maxTrades = this.getLowestTradeAmount(null, true, false);\n\n // If no trades are possible, bail out.\n if (maxTrades < 1) {\n return;\n }\n\n // Distribute max trades without starving any race.\n\n // This array should hold the amount of trades possible with each race.\n // The indices between this array and `trades` align.\n const maxByRace: Array<number> = [];\n // For all races we consider trading with, perform a more thorough check\n // if we actually can trade with them and how many times we could trade\n // with them.\n for (let tradeIndex = 0; tradeIndex < trades.length; tradeIndex++) {\n const race = trades[tradeIndex];\n const tradeSettings = this.settings.races[race];\n\n // Does this trade require a certain resource?\n const require = !tradeSettings.require\n ? false\n : this._workshopManager.getResource(tradeSettings.require);\n\n // Have the trigger conditions for this trade been met?\n const trigger = Engine.evaluateSubSectionTrigger(sectionTrigger, tradeSettings.trigger);\n const trigConditions =\n (!require || trigger <= require.value / require.maxValue) &&\n trigger <= gold.value / gold.maxValue;\n\n // How many trades could we do?\n const tradePos = this.getLowestTradeAmount(race, tradeSettings.limited, trigConditions);\n\n // If no trades are possible, remove the race.\n if (tradePos < 1) {\n trades.splice(tradeIndex, 1);\n tradeIndex--;\n continue;\n }\n\n maxByRace.push(tradePos);\n }\n\n // If no trades are left over after this check, bail out.\n if (trades.length === 0) {\n return;\n }\n\n // Now let's do some trades.\n\n // This keeps track of how many trades we've done with each race.\n const tradesDone: Partial<Record<Race, number>> = {};\n // While we have races left to trade with, and enough resources to trade (this\n // is indicated by `maxTrades`)...\n while (0 < trades.length && 1 <= maxTrades) {\n // If we can make fewer trades than we have resources available for...\n if (maxTrades < trades.length) {\n // ...find a random race to trade with\n const randomRaceIndex = Math.floor(Math.random() * trades.length);\n const tradeIndex = trades[randomRaceIndex];\n // Init the counter if necessary.\n if (isNil(tradesDone[tradeIndex])) {\n tradesDone[tradeIndex] = 0;\n }\n tradesDone[tradeIndex] += 1;\n maxTrades -= 1;\n\n // As we are constrained on resources, don't trade with this race again.\n // We want to distribute the few resources we have between races.\n trades.splice(randomRaceIndex, 1);\n maxByRace.splice(randomRaceIndex, 1);\n continue;\n }\n\n // We now want to determine which race we can trade with the least amount\n // of times.\n // This likely to determine the \"best\" trades to perform.\n // The result is that we trade first with the races that we can make the\n // least amount of trades with, then continue to make trades with the\n // races we can make more trades with (although that amount could be reduced\n // by the time we get to them).\n let minTrades = Math.floor(maxTrades / trades.length);\n let minTradeIndex = 0;\n const tradeIndex = trades[minTradeIndex];\n for (let tradeIndex = 0; tradeIndex < trades.length; ++tradeIndex) {\n if (maxByRace[tradeIndex] < minTrades) {\n minTrades = maxByRace[tradeIndex];\n minTradeIndex = tradeIndex;\n }\n }\n\n // Store this trade in the trades we've \"done\".\n if (isNil(tradesDone[tradeIndex])) {\n tradesDone[tradeIndex] = 0;\n }\n tradesDone[tradeIndex] += minTrades;\n maxTrades -= minTrades;\n trades.splice(minTradeIndex, 1);\n maxByRace.splice(minTradeIndex, 1);\n }\n\n // If we found no trades to do, bail out.\n if (Object.values(tradesDone).length === 0) {\n return;\n }\n\n // Calculate how much we will spend and earn from trades.\n // This is straight forward.\n const tradeNet: Partial<Record<Resource, number>> = {};\n for (const [name, amount] of objectEntries(tradesDone)) {\n const race = this.getRace(name);\n\n const materials = this.getMaterials(name);\n for (const [mat, matAmount] of objectEntries(materials)) {\n if (!tradeNet[mat]) {\n tradeNet[mat] = 0;\n }\n tradeNet[mat] -= matAmount * amount;\n }\n\n const meanOutput = this.getAverageTrade(race);\n for (const [out, outValue] of objectEntries(meanOutput)) {\n const res = this._workshopManager.getResource(out);\n if (!tradeNet[out]) {\n tradeNet[out] = 0;\n }\n tradeNet[out] +=\n res.maxValue > 0\n ? Math.min(\n mustExist(meanOutput[out]) * mustExist(tradesDone[name]),\n Math.max(res.maxValue - res.value, 0),\n )\n : outValue * mustExist(tradesDone[name]);\n }\n }\n\n // Update the cache with the changes produced from the trades.\n if (!isNil(cacheManager)) {\n cacheManager.pushToCache({\n materials: tradeNet,\n timeStamp: this._host.game.timer.ticksTotal,\n });\n }\n\n // Now actually perform the calculated trades.\n for (const [name, count] of objectEntries(tradesDone)) {\n // TODO: This check should be redundant. If no trades were possible,\n // the entry shouldn't even exist.\n if (0 < count) {\n this.trade(name, count);\n }\n }\n }\n\n autoBuildEmbassies(context: FrameContext) {\n if (!this._host.game.diplomacy.races[0].embassyPrices) {\n return;\n }\n\n // Tries to calculate how many embassies for which races it can buy,\n // then it buys them. Code should be straight-forward.\n\n const culture = this._workshopManager.getResource(\"culture\");\n let cultureVal = 0;\n const trigger = this.settings.buildEmbassies.trigger;\n if (culture.value / culture.maxValue < negativeOneToInfinity(trigger)) {\n return;\n }\n\n const racePanels = this._host.game.diplomacyTab.racePanels;\n cultureVal = this._workshopManager.getValueAvailable(\"culture\");\n\n const embassyBulk: Partial<\n Record<\n Race,\n {\n val: number;\n max: number;\n basePrice: number;\n currentEm: number;\n priceSum: number;\n race: UnsafeRace;\n }\n >\n > = {};\n const bulkTracker: Array<Race> = [];\n\n for (let panelIndex = 0; panelIndex < racePanels.length; panelIndex++) {\n if (!racePanels[panelIndex].embassyButton) {\n continue;\n }\n\n const name = racePanels[panelIndex].race.name;\n const race = this._host.game.diplomacy.get(name);\n const max = negativeOneToInfinity(this.settings.buildEmbassies.races[name].max);\n\n if (\n !this.settings.buildEmbassies.races[name].enabled ||\n max <= race.embassyLevel ||\n !race.unlocked\n ) {\n continue;\n }\n\n embassyBulk[name] = {\n basePrice: mustExist(race.embassyPrices?.[0]).val,\n currentEm: race.embassyLevel,\n max,\n priceSum: 0,\n race: race,\n val: 0,\n };\n bulkTracker.push(name);\n }\n\n if (bulkTracker.length === 0) {\n return;\n }\n\n while (bulkTracker.length > 0) {\n for (let raceIndex = 0; raceIndex < bulkTracker.length; raceIndex++) {\n const name = bulkTracker[raceIndex];\n const emBulk = mustExist(embassyBulk[name]);\n\n if (emBulk.max <= emBulk.currentEm + emBulk.val) {\n bulkTracker.splice(raceIndex, 1);\n --raceIndex;\n continue;\n }\n\n const nextPrice = emBulk.basePrice * 1.15 ** (emBulk.currentEm + emBulk.val);\n if (nextPrice <= cultureVal) {\n cultureVal -= nextPrice;\n emBulk.priceSum += nextPrice;\n emBulk.val += 1;\n context.requestGameUiRefresh = true;\n } else {\n bulkTracker.splice(raceIndex, 1);\n --raceIndex;\n }\n }\n }\n\n for (const [, emBulk] of objectEntries(embassyBulk)) {\n if (emBulk.val === 0) {\n continue;\n }\n cultureVal = this._workshopManager.getValueAvailable(\"culture\");\n if (cultureVal < emBulk.priceSum) {\n console.warn(...cl(\"Something has gone horribly wrong.\", emBulk.priceSum, cultureVal));\n }\n // We don't want to invoke the embassy build action multiple times, as\n // that would cause lots of log messages.\n // Instead, we replicate the behavior of the game here and purchase in bulk.\n this._workshopManager.getResource(\"culture\").value -= emBulk.priceSum;\n emBulk.race.embassyLevel += emBulk.val;\n\n this._host.engine.storeForSummary(\"embassy\", emBulk.val);\n if (emBulk.val !== 1) {\n this._host.engine.iactivity(\"build.embassies\", [emBulk.val, emBulk.race.title], \"ks-build\");\n } else {\n this._host.engine.iactivity(\"build.embassy\", [emBulk.val, emBulk.race.title], \"ks-build\");\n }\n }\n }\n\n autoFeedElders() {\n const leviathanInfo = this._host.game.diplomacy.get(\"leviathans\");\n const necrocorns = this._host.game.resPool.get(\"necrocorn\");\n\n if (!leviathanInfo.unlocked || necrocorns.value === 0) {\n return;\n }\n\n if (1 <= necrocorns.value) {\n // If feeding the elders would increase their energy level towards the\n // cap, do it.\n if (leviathanInfo.energy < this._host.game.diplomacy.getMarkerCap()) {\n this._host.game.diplomacy.feedElders();\n this._host.engine.iactivity(\"act.feed\");\n this._host.engine.storeForSummary(\"feed\", 1);\n }\n } else {\n // We can reach this branch if we have partial necrocorns from resets.\n // The partial necrocorns will then be feed to the elders to bring us back\n // to even zero.\n if (0.25 * (1 + this._host.game.getEffect(\"corruptionBoostRatio\")) < 1) {\n this._host.engine.storeForSummary(\"feed\", necrocorns.value);\n this._host.game.diplomacy.feedElders();\n this._host.engine.iactivity(\"dispose.necrocorn\");\n }\n }\n }\n\n autoUnlock(context: FrameContext) {\n if (!this._host.game.tabs[4].visible) {\n return;\n }\n\n // Check how many races we could reasonably unlock at this point.\n const maxRaces = this._host.game.diplomacy.get(\"leviathans\").unlocked ? 8 : 7;\n // If we haven't unlocked that many races yet...\n if (this._host.game.diplomacyTab.racePanels.length < maxRaces) {\n // Get the currently available catpower.\n let manpower = this._workshopManager.getValueAvailable(\"manpower\");\n // TODO: These should be checked in reverse order. Otherwise the check for lizards\n // can cause the zebras to be discovered at later stages in the game. Then it\n // gets to the check for the zebras and doesn't explore again, as they're\n // already unlocked. Then it takes another iteration to unlock the other race.\n // Send explorers if we haven't discovered the lizards yet.\n if (!this._host.game.diplomacy.get(\"lizards\").unlocked) {\n if (manpower >= 1000) {\n this._host.game.resPool.get(\"manpower\").value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // Do exactly the same for the sharks.\n if (!this._host.game.diplomacy.get(\"sharks\").unlocked) {\n if (manpower >= 1000) {\n this._host.game.resPool.get(\"manpower\").value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // Do exactly the same for the griffins.\n if (!this._host.game.diplomacy.get(\"griffins\").unlocked) {\n if (manpower >= 1000) {\n this._host.game.resPool.get(\"manpower\").value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // For nagas, we additionally need enough culture.\n if (\n !this._host.game.diplomacy.get(\"nagas\").unlocked &&\n this._host.game.resPool.get(\"culture\").value >= 1500\n ) {\n if (manpower >= 1000) {\n this._host.game.resPool.get(\"manpower\").value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // Zebras require us to have a ship.\n if (\n !this._host.game.diplomacy.get(\"zebras\").unlocked &&\n this._host.game.resPool.get(\"ship\").value >= 1\n ) {\n if (manpower >= 1000) {\n this._host.game.resPool.get(\"manpower\").value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // For spiders, we need 100 ships and 125000 science.\n if (\n !this._host.game.diplomacy.get(\"spiders\").unlocked &&\n mustExist(this._host.game.resPool.get(\"ship\")).value >= 100 &&\n mustExist(this._host.game.resPool.get(\"science\")).maxValue > 125000\n ) {\n if (manpower >= 1000) {\n mustExist(this._host.game.resPool.get(\"manpower\")).value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n\n // Dragons require nuclear fission to be researched.\n if (\n !this._host.game.diplomacy.get(\"dragons\").unlocked &&\n this._host.game.science.get(\"nuclearFission\").researched\n ) {\n if (manpower >= 1000) {\n mustExist(this._host.game.resPool.get(\"manpower\")).value -= 1000;\n const unlockedRace = mustExist(this._host.game.diplomacy.unlockRandomRace());\n this._host.engine.iactivity(\"upgrade.race\", [unlockedRace.title], \"ks-upgrade\");\n manpower -= 1000;\n context.requestGameUiRefresh = true;\n }\n }\n }\n }\n\n autoTradeBlackcoin() {\n const coinPrice = this._host.game.calendar.cryptoPrice;\n const relicsInitial = this._host.game.resPool.get(\"relic\").value;\n const coinsInitial = this._host.game.resPool.get(\"blackcoin\").value;\n let coinsExchanged = 0.0;\n let relicsExchanged = 0.0;\n\n // All of this code is straight-forward. Buy low, sell high.\n\n // Exchanges up to a certain threshold, in order to keep a good exchange rate, then waits\n // for a higher threshold before exchanging for relics.\n if (\n coinPrice < this.settings.tradeBlackcoin.buy &&\n this.settings.tradeBlackcoin.trigger < relicsInitial\n ) {\n this._host.game.diplomacy.buyBcoin();\n\n const currentCoin = this._host.game.resPool.get(\"blackcoin\").value;\n coinsExchanged = Math.round(currentCoin - coinsInitial);\n this._host.engine.iactivity(\"act.blackcoin.buy\", [this._host.renderAbsolute(coinsExchanged)]);\n } else if (\n coinPrice > this.settings.tradeBlackcoin.sell &&\n 0 < this._host.game.resPool.get(\"blackcoin\").value\n ) {\n this._host.game.diplomacy.sellBcoin();\n\n const relicsCurrent = mustExist(this._host.game.resPool.get(\"relic\")).value;\n relicsExchanged = Math.round(relicsCurrent - relicsInitial);\n\n this._host.engine.iactivity(\"act.blackcoin.sell\", [\n this._host.renderAbsolute(relicsExchanged),\n ]);\n }\n }\n\n /**\n * Trade with the given race.\n *\n * @param name The race to trade with.\n * @param amount How often to trade with the race.\n */\n trade(name: Race, amount: number): void {\n const race = this.getRace(name);\n const button = this.getTradeButton(race.name);\n\n if (!button?.model?.enabled || !this.settings.races[name].enabled) {\n console.warn(\n ...cl(\n \"KS trade checks are not functioning properly, please create an issue on the github page.\",\n ),\n );\n }\n\n this._host.game.diplomacy.tradeMultiple(race, amount);\n this._host.engine.storeForSummary(race.title, amount, \"trade\");\n this._host.engine.iactivity(\n \"act.trade\",\n [this._host.renderAbsolute(amount), ucfirst(race.title)],\n \"ks-trade\",\n );\n }\n\n /**\n * Determine if a trade with the given race would be considered profitable.\n *\n * @param name The race to trade with.\n * @returns `true` if the trade is profitable; `false` otherwise.\n */\n getProfitability(name: Race): boolean {\n const race = this.getRace(name);\n\n // This will keep track of how much we have to spend on a given trade.\n // Higher values are worse.\n let cost = 0;\n // Get materials required to trade with the race.\n const materials = this.getMaterials(name);\n // For each material required to trade with the race...\n for (const [mat, amount] of objectEntries(materials)) {\n // ...determine how much of the resource is produced each tick.\n const tick = this._workshopManager.getTickVal(this._workshopManager.getResource(mat));\n // If we're not producing any of this resource, it's spice, or blueprints,\n // don't consider it in the calculation.\n if (tick === \"ignore\") {\n continue;\n }\n // If we're consuming this resource instead of producing it,\n // instantly consider this trade not profitable.\n if (tick <= 0) {\n return false;\n }\n\n // Add to the cost.\n // We consider all resources to be equal in the profitability calculation.\n // We just add the cost of the resource, divided by how much of it we're\n // producing. So resources that we produce a lot of, don't \"cost\" as much.\n cost += amount / tick;\n }\n\n // This will keep track of how much we receive from a given trade.\n let profit = 0;\n // Get resources returned from trade.\n const output = this.getAverageTrade(race);\n // For each material resulting from a trade with the race...\n for (const [prod, amount] of objectEntries(output)) {\n const resource = this._workshopManager.getResource(prod);\n // ...determine how much of the resource is produced each tick.\n const tick = this._workshopManager.getTickVal(resource);\n // If we're not producing any of this resource, it's spice, or blueprints,\n // don't consider it in the calculation.\n if (tick === \"ignore\") {\n continue;\n }\n // If we're consuming this resource instead of producing it,\n // instantly consider this trade profitable.\n if (tick <= 0) {\n return true;\n }\n\n profit +=\n // For capped resources...\n 0 < resource.maxValue\n ? // ... only add as much to the profit as we can store.\n Math.min(amount, Math.max(resource.maxValue - resource.value, 0)) / tick\n : // For uncapped resources, add all of it.\n amount / tick;\n }\n\n // If the profit is higher than the cost, consider this profitable.\n return cost <= profit;\n }\n\n /**\n * Determine which resources and how much of them a trade with the given race results in.\n *\n * @param race The race to check.\n * @returns The resources returned from an average trade and their amount.\n */\n getAverageTrade(race: UnsafeRace): Partial<Record<Resource, number>> {\n // TODO: This is a lot of magic. It's possible some of it was copied directly from the game.\n const standingRatio =\n this._host.game.getEffect(\"standingRatio\") +\n this._host.game.diplomacy.calculateStandingFromPolicies(race.name, this._host.game);\n\n const raceRatio = 1 + race.energy * 0.02;\n\n const tradeRatio =\n 1 +\n this._host.game.diplomacy.getTradeRatio() +\n this._host.game.diplomacy.calculateTradeBonusFromPolicies(race.name, this._host.game);\n\n const failedRatio = race.standing < 0 ? race.standing + standingRatio : 0;\n const successRatio = 0 < failedRatio ? 1 + failedRatio : 1;\n const bonusRatio = 0 < race.standing ? Math.min(race.standing + standingRatio / 2, 1) : 0;\n\n const output: Partial<Record<Resource, number>> = {};\n for (const item of race.sells) {\n if (!this._isValidTrade(item, race)) {\n // Still put invalid trades into the result to not cause missing keys.\n output[item.name] = 0;\n continue;\n }\n\n let mean = 0;\n const tradeChance = race.embassyPrices\n ? item.chance * (1 + this._host.game.getLimitedDR(0.01 * race.embassyLevel, 0.75))\n : item.chance;\n if (race.name === \"zebras\" && item.name === \"titanium\") {\n const shipCount = this._host.game.resPool.get(\"ship\").value;\n const titaniumProbability = Math.min(0.15 + shipCount * 0.0035, 1);\n const titaniumRatio = 1 + shipCount / 50;\n mean = 1.5 * titaniumRatio * (successRatio * titaniumProbability);\n } else {\n const seasionRatio = !item.seasons\n ? 1\n : 1 + item.seasons[this._host.game.calendar.getCurSeason().name];\n const normBought = (successRatio - bonusRatio) * Math.min(tradeChance / 100, 1);\n const normBonus = bonusRatio * Math.min(tradeChance / 100, 1);\n mean = (normBought + 1.25 * normBonus) * item.value * raceRatio * seasionRatio * tradeRatio;\n }\n output[item.name] = mean;\n }\n\n const spiceChance = race.embassyPrices ? 0.35 * (1 + 0.01 * race.embassyLevel) : 0.35;\n const spiceTradeAmount = successRatio * Math.min(spiceChance, 1);\n output.spice = 25 * spiceTradeAmount + (50 * spiceTradeAmount * tradeRatio) / 2;\n output.blueprint = 0.1 * successRatio;\n\n return output;\n }\n\n /**\n * Determine if this trade is valid.\n *\n * @param item The tradeable item.\n * @param race The race to trade with.\n * @returns `true` if the trade is valid; `false` otherwise.\n */\n private _isValidTrade(item: UnsafeTradeSellOffer, race: UnsafeRace): boolean {\n return (\n // Do we have enough embassies to receive the item?\n !(item.minLevel && race.embassyLevel < item.minLevel) &&\n // TODO: These seem a bit too magical.\n (this._host.game.resPool.get(item.name).unlocked ||\n item.name === \"titanium\" ||\n item.name === \"uranium\" ||\n race.name === \"leviathans\")\n );\n }\n\n /**\n * Determine how many trades are at least possible.\n *\n * @param name The race to trade with.\n * @param _limited Is the race set to be limited.\n * @param _trigConditions Ignored\n * @returns The lowest number of trades possible with this race.\n */\n getLowestTradeAmount(name: Race | null, _limited: boolean, _trigConditions: unknown): number {\n let amount: number | undefined;\n const materials = this.getMaterials(name);\n\n let total: number | undefined;\n for (const [resource, required] of objectEntries(materials)) {\n if (resource === \"manpower\") {\n let manpowerCost = required;\n if (this._host.game.challenges.isActive(\"postApocalypse\")) {\n manpowerCost = required * (1 + this._host.game.bld.getPollutionLevel());\n }\n total = this._workshopManager.getValueAvailable(resource) / manpowerCost;\n } else if (resource === \"gold\") {\n let goldCost = required;\n if (this._host.game.challenges.isActive(\"postApocalypse\")) {\n goldCost = required * (1 + this._host.game.bld.getPollutionLevel());\n }\n total = this._workshopManager.getValueAvailable(resource) / goldCost;\n } else {\n total = this._workshopManager.getValueAvailable(resource) / required;\n }\n\n // Set the amount to the lowest amount of possible trades seen yet.\n amount = amount === undefined || total < amount ? total : amount;\n }\n\n // Round the amount down and normalize to 0.\n amount = Math.floor(amount ?? 0);\n\n // If the lowest amount is 0, return 0.\n if (amount === 0) {\n return 0;\n }\n\n // If no race was specified, or this is trading with leviathans, return the\n // currently known, lowest amount.\n // The special case for leviathans indicates that the following code is buggy or\n // problematic, as leviathans are the last race.\n if (name === null || name === \"leviathans\") {\n return amount;\n }\n\n const race = this.getRace(name);\n\n // Loop through the items obtained by the race, and determine\n // which resource has the most space left. Once we've determined this,\n // reduce the amount by this capacity. This ensures that we continue to trade\n // as long as at least one resource has capacity, and we never over-trade.\n\n let highestCapacity = 0;\n const tradeOutput = this.getAverageTrade(race);\n for (const item of race.sells) {\n const resource = this._workshopManager.getResource(item.name);\n let max = 0;\n\n // No need to process resources that don't cap\n if (!resource.maxValue) {\n continue;\n }\n\n max = mustExist(tradeOutput[item.name]);\n\n const capacity = Math.max((resource.maxValue - resource.value) / max, 0);\n\n highestCapacity = capacity < highestCapacity ? highestCapacity : capacity;\n }\n\n // We must take the ceiling of capacity so that we will trade as long\n // as there is any room, even if it doesn't have exact space. Otherwise\n // we seem to starve trading altogether.\n highestCapacity = Math.ceil(highestCapacity);\n\n // If any of the resources resulting from a trade are already capped, we\n // don't want to trade with this race.\n if (highestCapacity === 0) {\n return 0;\n }\n\n // Now that we know the most we *should* trade for, check to ensure that\n // we trade for our max cost, or our max capacity, whichever is lower.\n // This helps us prevent trading for resources we can't store. Note that we\n // essentially ignore blueprints here.\n\n amount = highestCapacity < amount ? Math.max(highestCapacity - 1, 1) : amount;\n\n return Math.floor(amount);\n }\n\n /**\n * Determine the resources required to trade with the given race.\n *\n * @param race The race to check. If not specified the resources for any\n * trade will be returned.\n * @returns The resources need to trade with the race.\n */\n getMaterials(race: Maybe<Race> = null): Partial<Record<Resource, number>> {\n const materials: Partial<Record<Resource, number>> = {\n gold: 15 - this._host.game.getEffect(\"tradeGoldDiscount\"),\n manpower: 50 - this._host.game.getEffect(\"tradeCatpowerDiscount\"),\n };\n\n if (isNil(race)) {\n return materials;\n }\n\n const prices = this.getRace(race).buys;\n\n for (const price of prices) {\n materials[price.name] = price.val;\n }\n\n return materials;\n }\n\n /**\n * Retrieve information about the given race from the game.\n *\n * @param name The race to get the information object for.\n * @returns The information object for the given race.\n */\n getRace(name: Race): UnsafeRace {\n const raceInfo = this._host.game.diplomacy.get(name);\n if (isNil(raceInfo)) {\n throw new Error(`Unable to retrieve race '${name}'`);\n }\n return raceInfo;\n }\n\n /**\n * Retrieve a reference to the trade button for the given race from the game.\n *\n * @param race The race to get the button reference for.\n * @returns The reference to the trade button.\n */\n getTradeButton(race: string) {\n const panel = this.manager.tab.racePanels.find(subject => subject.race.name === race);\n return panel?.tradeBtn ?? null;\n }\n\n /**\n * Determine if at least a single trade can be made.\n *\n * @param trade - The trade option to check. If not specified, all races are checked.\n * @returns If the requested trade is possible.\n */\n singleTradePossible(\n sectionTrigger: number,\n catpower: Required<UnsafeResource>,\n gold: Required<UnsafeResource>,\n trade?: TradeSettingsItem,\n ): boolean {\n const trigger = trade\n ? Engine.evaluateSubSectionTrigger(sectionTrigger, trade.trigger)\n : sectionTrigger;\n\n if (trigger < 0 && trade === undefined) {\n // We will have to check all potential trades individually.\n return true;\n }\n\n if (trigger < 0 && trade !== undefined) {\n // This will never trigger.\n return false;\n }\n\n // We should only trade if catpower and gold hit the trigger value.\n // Trades can additionally require specific resources. We will check for those later.\n if (catpower.value / catpower.maxValue < trigger || gold.value / gold.maxValue < trigger) {\n return false;\n }\n\n // Get the materials required to trade with the race.\n const materials = this.getMaterials(trade?.race);\n for (const [resource, amount] of objectEntries<Resource, number>(materials)) {\n // Check if we have a sufficient amount of that resource in storage.\n if (this._workshopManager.getValueAvailable(resource) < amount) {\n return false;\n }\n }\n return true;\n }\n}\n","import type { KittenScientists } from \"../KittenScientists.js\";\nimport { objectEntries } from \"../tools/Entries.js\";\nimport type { Resource } from \"../types/index.js\";\n\n/**\n * The `CacheManager` apparently stores a state of resources in stock.\n * Components can push individual resource sets into the cache to update\n * the overall stock cache.\n */\nexport class MaterialsCache {\n private readonly _host: KittenScientists;\n\n private readonly _cache = new Array<{\n materials: Partial<Record<Resource, number>>;\n timeStamp: number;\n }>();\n private readonly _cacheSum: Partial<Record<Resource, number>> = {};\n\n constructor(host: KittenScientists) {\n this._host = host;\n }\n\n /**\n * Store a set of materials in the cache.\n * This is usually done *after* hunting and trading.\n * TODO: This is indicative of the desire to know the resource state at the beginning of\n * a frame. This is likely required to make different automations play nice together.\n *\n * @param data The materials to store in the cache.\n * @param data.materials The materials themselves.\n * @param data.timeStamp The current time.\n */\n pushToCache(data: { materials: Partial<Record<Resource, number>>; timeStamp: number }): void {\n // Store this entry in the cache.\n this._cache.push(data);\n\n // Update the cached sums for the passed materials.\n for (const [mat, amount] of objectEntries(data.materials)) {\n if (!this._cacheSum[mat]) {\n this._cacheSum[mat] = 0;\n }\n this._cacheSum[mat] += amount;\n }\n\n // Iterate over all entries in the cache.\n // TODO: This seems to be completely pointless, as the cache is never accessed.\n // Beyond that, it seems to be a cleanup procedure that is very poorly\n // implemented.\n for (let cacheIndex = 0; cacheIndex < this._cache.length; ++cacheIndex) {\n const oldData = this._cache[cacheIndex];\n if (this._cache.length > 10000) {\n const oldMaterials = oldData.materials;\n for (const [mat, amount] of objectEntries(oldMaterials)) {\n if (!this._cacheSum[mat]) {\n this._cacheSum[mat] = 0;\n }\n this._cacheSum[mat] -= amount;\n }\n this._cache.shift();\n cacheIndex--;\n } else {\n return;\n }\n }\n }\n\n /**\n * Retrieve the resource amount that is stored in the cache.\n *\n * @param resource The resource to check.\n * @returns The cached resource amount, divided by how long it has been cached.\n */\n getResValue(resource: Resource): number {\n // If the cache is empty, or no sum was stored yet, return 0.\n if (this._cache.length === 0 || !this._cacheSum[resource]) {\n return 0;\n }\n\n const currentTick = this._host.game.timer.ticksTotal;\n const startingTick = this._cache[0].timeStamp;\n\n // Adjust the cached value by the amount of ticks that have passed\n // since the last time the cache was updated.\n // TODO: Why? This seems arbitrary, just like this entire cache manager.\n return this._cacheSum[resource] / (currentTick - startingTick);\n }\n}\n","import { isNil, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { Automation, FrameContext } from \"./Engine.js\";\nimport { MaterialsCache } from \"./helper/MaterialsCache.js\";\nimport type { KittenScientists } from \"./KittenScientists.js\";\nimport { VillageSettings } from \"./settings/VillageSettings.js\";\nimport { TabManager } from \"./TabManager.js\";\nimport { objectEntries } from \"./tools/Entries.js\";\nimport { negativeOneToInfinity } from \"./tools/Format.js\";\nimport type { Resource } from \"./types/index.js\";\nimport type { UnsafeJob, Village } from \"./types/village.js\";\nimport type { WorkshopManager } from \"./WorkshopManager.js\";\n\nexport class VillageManager implements Automation {\n private readonly _host: KittenScientists;\n readonly settings: VillageSettings;\n readonly manager: TabManager<Village>;\n private readonly _cacheManager: MaterialsCache;\n private readonly _workshopManager: WorkshopManager;\n\n constructor(\n host: KittenScientists,\n workshopManager: WorkshopManager,\n settings = new VillageSettings(),\n ) {\n this._host = host;\n this.settings = settings;\n this.manager = new TabManager(this._host, \"Village\");\n this._cacheManager = new MaterialsCache(this._host);\n this._workshopManager = workshopManager;\n }\n\n tick(_context: FrameContext) {\n if (!this.settings.enabled) {\n return;\n }\n\n this.autoDistributeKittens();\n\n if (this.settings.hunt.enabled) {\n this.autoHunt(this._cacheManager);\n }\n\n if (this.settings.holdFestivals.enabled) {\n this.autoFestival(this._cacheManager);\n }\n\n if (this.settings.electLeader.enabled) {\n this.autoElect();\n }\n\n if (this.settings.promoteLeader.enabled) {\n this.autoPromoteLeader();\n }\n\n if (this.settings.promoteKittens.enabled) {\n this.autoPromoteKittens();\n }\n }\n\n autoDistributeKittens() {\n const freeKittens = this._host.game.village.getFreeKittens();\n if (!freeKittens) {\n return;\n }\n\n for (let assignedKitten = 0; assignedKitten < freeKittens; ++assignedKitten) {\n // Find all jobs where we haven't assigned the maximum desired kittens yet.\n const jobsNotCapped = new Array<{ job: UnsafeJob; count: number; toCap: number }>();\n for (const job of this._host.game.village.jobs) {\n // Skip disabled jobs and those that haven't been unlocked;\n const enabled = this.settings.jobs[job.name].enabled;\n const unlocked = job.unlocked;\n if (!enabled || !unlocked) {\n continue;\n }\n\n const maxKittensInJob = this._host.game.village.getJobLimit(job.name);\n const maxKittensToAssign = negativeOneToInfinity(this.settings.jobs[job.name].max);\n const kittensInJob = job.value;\n if (kittensInJob < maxKittensInJob && kittensInJob < maxKittensToAssign) {\n jobsNotCapped.push({ count: kittensInJob, job, toCap: maxKittensInJob - kittensInJob });\n }\n }\n\n if (!jobsNotCapped.length) {\n return;\n }\n\n // Check if we _could_ assign farmers _and_ currently don't have any assigned.\n // The idea here is, don't assign any kittens into jobs without having filled\n // that single open farmer position first. This might prevent kitten death in\n // certain scenarios.\n const noFarmersAssigned = !isNil(\n jobsNotCapped.find(job => job.job.name === \"farmer\" && job.count === 0),\n );\n\n // Find the job with the least kittens assigned and assign a kitten to that job.\n jobsNotCapped.sort((a, b) => a.count - b.count);\n const jobName = noFarmersAssigned ? \"farmer\" : jobsNotCapped[0].job.name;\n\n this._host.game.village.assignJob(this._host.game.village.getJob(jobName), 1);\n this.manager.render();\n this._host.engine.iactivity(\n \"act.distribute\",\n [this._host.engine.i18n(`$village.job.${jobName}` as const)],\n \"ks-distribute\",\n );\n }\n this._host.engine.storeForSummary(\"distribute\", freeKittens);\n }\n\n autoElect(): void {\n // We can't assign a leader in the Anarchy challenge.\n if (this._host.game.challenges.isActive(\"anarchy\")) {\n return;\n }\n\n const kittens = this._host.game.village.sim.kittens;\n const leader = this._host.game.village.leader;\n const job = this.settings.electLeader.job.selected;\n const trait = this.settings.electLeader.trait.selected;\n\n const leaderCandidates = kittens.filter(\n kitten => (kitten.job === job || job === \"any\") && kitten.trait.name === trait,\n );\n\n if (leaderCandidates.length === 0) {\n return;\n }\n\n leaderCandidates.sort((a, b) => b.rank - a.rank);\n const bestLeader = leaderCandidates[0];\n if (!isNil(leader)) {\n if (\n leader.trait.name === trait &&\n (leader.job === job || job === \"any\") &&\n bestLeader.rank <= leader.rank\n ) {\n return;\n }\n }\n\n this._host.game.village.makeLeader(bestLeader);\n this._host.engine.iactivity(\"act.elect\");\n }\n\n autoPromoteKittens(): void {\n const gold = this._workshopManager.getResource(\"gold\");\n if (this.settings.promoteKittens.trigger < gold.value / gold.maxValue) {\n return;\n }\n\n for (\n let kittenIndex = 0;\n kittenIndex < this._host.game.village.sim.kittens.length;\n kittenIndex++\n ) {\n let tier = -1;\n const engineerSpeciality =\n this._host.game.village.sim.kittens[kittenIndex].engineerSpeciality;\n // If this kitten has no engineer specialty, skip it.\n if (isNil(engineerSpeciality)) {\n continue;\n }\n\n // Check which rank would be ideal for their craft.\n tier = mustExist(this._host.game.workshop.getCraft(engineerSpeciality)).tier;\n // If the rank has already been reached, check next kitten.\n if (tier <= this._host.game.village.sim.kittens[kittenIndex].rank) {\n continue;\n }\n\n // We have found an engineer that isn't at their ideal rank.\n // No need to look further.\n this._host.game.village.promoteKittens();\n return;\n }\n }\n\n autoPromoteLeader(): void {\n // If we have Civil Service unlocked and a leader elected.\n if (\n this._host.game.science.get(\"civil\").researched &&\n this._host.game.village.leader !== null\n ) {\n const leader = this._host.game.village.leader;\n const rank = leader.rank;\n const gold = this._workshopManager.getResource(\"gold\");\n const goldStock = this._workshopManager.getStock(\"gold\");\n\n // this._host.game.village.sim.goldToPromote will check gold\n // this._host.game.village.sim.promote check both gold and exp\n if (\n this._host.game.village.sim.goldToPromote(rank, rank + 1, gold.value - goldStock)[0] &&\n this._host.game.village.sim.promote(leader, rank + 1) === 1\n ) {\n this._host.engine.iactivity(\"act.promote\", [rank + 1], \"ks-promote\");\n this._host.game.villageTab.censusPanel?.census.renderGovernment(\n this._host.game.villageTab.censusPanel.census.container,\n );\n this._host.game.villageTab.censusPanel?.census.update();\n this._host.engine.storeForSummary(\"promote\", 1);\n }\n }\n }\n\n autoHunt(cacheManager?: MaterialsCache) {\n const manpower = this._workshopManager.getResource(\"manpower\");\n const trigger = this.settings.hunt.trigger;\n\n if (manpower.value < 100 || this._host.game.challenges.isActive(\"pacifism\")) {\n return;\n }\n\n if (trigger <= manpower.value / manpower.maxValue && 100 <= manpower.value) {\n // Determine how many hunts are being performed.\n const huntCount = Math.floor(manpower.value / 100);\n this._host.engine.storeForSummary(\"hunt\", huntCount);\n this._host.engine.iactivity(\"act.hunt\", [this._host.renderAbsolute(huntCount)], \"ks-hunt\");\n\n const averageOutput = this._workshopManager.getAverageHunt();\n const trueOutput: Partial<Record<Resource, number>> = {};\n\n for (const [out, outValue] of objectEntries(averageOutput)) {\n const res = this._workshopManager.getResource(out);\n trueOutput[out] =\n // If this is a capped resource...\n 0 < res.maxValue\n ? // multiply the amount of times we hunted with the result of an average hunt.\n // Capping at the max value and 0 bounds.\n Math.min(outValue * huntCount, Math.max(res.maxValue - res.value, 0))\n : // Otherwise, just multiply unbounded\n outValue * huntCount;\n }\n\n // Store the hunted resources in the cache. Why? No idea.\n if (!isNil(cacheManager)) {\n cacheManager.pushToCache({\n materials: trueOutput,\n timeStamp: this._host.game.timer.ticksTotal,\n });\n }\n\n // Now actually perform the hunts.\n this._host.game.village.huntAll();\n }\n }\n\n autoFestival(cacheManager?: MaterialsCache) {\n // If we haven't researched festivals yet, or still have more than 400 days left on one,\n // don't hold (another) one.\n if (\n !this._host.game.science.get(\"drama\").researched ||\n 400 < this._host.game.calendar.festivalDays\n ) {\n return;\n }\n\n // If we don't have stacked festivals researched yet, and we still have days left on one,\n // don't hold one.\n if (\n !this._host.game.prestige.getPerk(\"carnivals\").researched &&\n 0 < this._host.game.calendar.festivalDays\n ) {\n return;\n }\n\n // Check if we can afford a festival.\n const craftManager = this._workshopManager;\n if (\n craftManager.getValueAvailable(\"manpower\") < 1500 ||\n craftManager.getValueAvailable(\"culture\") < 5000 ||\n craftManager.getValueAvailable(\"parchment\") < 2500\n ) {\n return;\n }\n\n // Check if the festival would even be profitable for any resource production.\n const catpowProfitable =\n 4000 *\n (craftManager.getTickVal(\n craftManager.getResource(\"manpower\"),\n cacheManager,\n true,\n ) as number) >\n 1500;\n const cultureProfitable =\n 4000 *\n (craftManager.getTickVal(\n craftManager.getResource(\"culture\"),\n cacheManager,\n true,\n ) as number) >\n 5000;\n const parchProfitable =\n 4000 *\n (craftManager.getTickVal(\n craftManager.getResource(\"parchment\"),\n cacheManager,\n true,\n ) as number) >\n 2500;\n\n if (!catpowProfitable && !cultureProfitable && !parchProfitable) {\n return;\n }\n\n // Render the tab to make sure that the buttons actually exist in the DOM. Otherwise we can't click them.\n this.manager.render();\n\n // Now we hold the festival.\n if (this._host.game.villageTab.festivalBtn.model.enabled) {\n const beforeDays = this._host.game.calendar.festivalDays;\n this._host.game.villageTab.festivalBtn.onClick();\n this._host.engine.storeForSummary(\"festival\");\n if (beforeDays > 0) {\n this._host.engine.iactivity(\"festival.extend\", [], \"ks-festival\");\n } else {\n this._host.engine.iactivity(\"festival.hold\", [], \"ks-festival\");\n }\n }\n }\n}\n","import { isNil, type Maybe, mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { unknownToError } from \"@oliversalzburg/js-utils/errors/error-serializer.js\";\nimport { measure, measureAsync } from \"@oliversalzburg/js-utils/measurement/performance.js\";\nimport { BonfireManager } from \"./BonfireManager.js\";\nimport {\n type ActivityClass,\n ActivitySummary,\n type ActivitySummarySection,\n type ActivityTypeClass,\n} from \"./helper/ActivitySummary.js\";\nimport enUS from \"./i18n/en-US.json\" with { type: \"json\" };\nimport deDE from \"./i18n/translations/de-DE.json\" with { type: \"json\" };\nimport heIL from \"./i18n/translations/he-IL.json\" with { type: \"json\" };\nimport zhCN from \"./i18n/translations/zh-CN.json\" with { type: \"json\" };\nimport { type KittenScientists, ksVersion } from \"./KittenScientists.js\";\nimport { ReligionManager } from \"./ReligionManager.js\";\nimport { ScienceManager } from \"./ScienceManager.js\";\nimport { SpaceManager } from \"./SpaceManager.js\";\nimport { BonfireSettings } from \"./settings/BonfireSettings.js\";\nimport { EngineSettings } from \"./settings/EngineSettings.js\";\nimport { ReligionSettings } from \"./settings/ReligionSettings.js\";\nimport { ScienceSettings } from \"./settings/ScienceSettings.js\";\nimport { SpaceSettings } from \"./settings/SpaceSettings.js\";\nimport { TimeControlSettings } from \"./settings/TimeControlSettings.js\";\nimport { TimeSettings } from \"./settings/TimeSettings.js\";\nimport { TradeSettings } from \"./settings/TradeSettings.js\";\nimport { VillageSettings } from \"./settings/VillageSettings.js\";\nimport { WorkshopSettings } from \"./settings/WorkshopSettings.js\";\nimport { TimeControlManager } from \"./TimeControlManager.js\";\nimport { TimeManager } from \"./TimeManager.js\";\nimport { TradeManager } from \"./TradeManager.js\";\nimport { cl } from \"./tools/Log.js\";\nimport { type Cycle, Cycles, type Locale, type Planet } from \"./types/index.js\";\nimport { FallbackLocale, UserScriptLoader } from \"./UserScriptLoader.js\";\nimport { VillageManager } from \"./VillageManager.js\";\nimport { WorkshopManager } from \"./WorkshopManager.js\";\n\nconst i18nData = { \"de-DE\": deDE, \"en-US\": enUS, \"he-IL\": heIL, \"zh-CN\": zhCN };\n\nexport type FrameContext = {\n requestGameUiRefresh: boolean;\n\n entry: number;\n exit: number;\n measurements: Record<string, number | undefined>;\n};\nexport type Automation = {\n tick(context: FrameContext): void | Promise<void>;\n};\nexport type EngineState = {\n v: string;\n engine: EngineSettings;\n bonfire: BonfireSettings;\n religion: ReligionSettings;\n science: ScienceSettings;\n space: SpaceSettings;\n timeControl: TimeControlSettings;\n time: TimeSettings;\n trade: TradeSettings;\n village: VillageSettings;\n workshop: WorkshopSettings;\n};\n\nexport type SupportedLocale = \"de-DE\" | \"en-US\" | \"he-IL\" | \"zh-CN\";\n\nexport type TranslatedString<TKittenGameLiteral extends `$${string}`> =\n | keyof (typeof i18nData)[\"en-US\"]\n | TKittenGameLiteral;\n\nexport class Engine {\n /**\n * All i18n literals of the userscript.\n */\n private readonly _i18nData: typeof i18nData;\n\n /**\n * Was any state loaded into this engine at any point in time?\n */\n private _isLoaded = false;\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n readonly _host: KittenScientists;\n readonly settings: EngineSettings;\n readonly bonfireManager: BonfireManager;\n readonly religionManager: ReligionManager;\n readonly scienceManager: ScienceManager;\n readonly spaceManager: SpaceManager;\n readonly timeControlManager: TimeControlManager;\n readonly timeManager: TimeManager;\n readonly tradeManager: TradeManager;\n readonly villageManager: VillageManager;\n readonly workshopManager: WorkshopManager;\n\n private _activitySummary: ActivitySummary;\n private _timeoutMainLoop: number | undefined = undefined;\n\n constructor(host: KittenScientists, gameLanguage: Locale) {\n this.settings = new EngineSettings();\n\n this._i18nData = i18nData;\n this.setLanguage(gameLanguage, false);\n\n this._host = host;\n this._activitySummary = new ActivitySummary(this._host);\n\n this.workshopManager = new WorkshopManager(this._host);\n\n this.bonfireManager = new BonfireManager(this._host, this.workshopManager);\n this.religionManager = new ReligionManager(\n this._host,\n this.bonfireManager,\n this.workshopManager,\n );\n this.scienceManager = new ScienceManager(this._host, this.workshopManager);\n this.spaceManager = new SpaceManager(this._host, this.workshopManager);\n this.timeControlManager = new TimeControlManager(\n this._host,\n this.bonfireManager,\n this.religionManager,\n this.spaceManager,\n this.workshopManager,\n );\n this.timeManager = new TimeManager(this._host, this.workshopManager);\n this.tradeManager = new TradeManager(this._host, this.workshopManager);\n this.villageManager = new VillageManager(this._host, this.workshopManager);\n }\n\n isLanguageSupported(language: string): boolean {\n return Object.keys(this._i18nData).some(locale => locale.startsWith(`${language}-`));\n }\n\n isLocaleSupported(locale: string): boolean {\n return locale in this._i18nData;\n }\n\n localeSupportsFirstLetterSplits(locale = this.settings.locale.selected): boolean {\n return locale !== \"zh-CN\";\n }\n\n localeForLanguage(language: string): SupportedLocale | undefined {\n return (Object.keys(this._i18nData) as ReadonlyArray<SupportedLocale>).find(locale =>\n locale.startsWith(`${language}-`),\n );\n }\n\n setLanguage(language: Locale, rebuildUI = true) {\n const previousLocale = this.settings.locale.selected;\n if (!this.isLanguageSupported(language)) {\n console.warn(\n ...cl(\n `Requested language '${language}' is not available. Falling back to '${FallbackLocale}'.`,\n ),\n );\n this.settings.locale.selected = FallbackLocale;\n } else {\n const locale = mustExist(this.localeForLanguage(language));\n console.info(...cl(`Selecting language '${locale}'.`));\n this.settings.locale.selected = locale;\n }\n\n if (previousLocale !== this.settings.locale.selected && rebuildUI) {\n this._host.rebuildUi();\n }\n }\n\n setLocale(locale: SupportedLocale, rebuildUI = true) {\n const previousLocale = this.settings.locale.selected;\n if (!this.isLocaleSupported(locale)) {\n console.warn(\n ...cl(\n `Requested language '${locale}' is not available. Falling back to '${FallbackLocale}'.`,\n ),\n );\n this.settings.locale.selected = FallbackLocale;\n } else {\n console.info(...cl(`Selecting language '${locale}'.`));\n this.settings.locale.selected = locale;\n }\n\n if (previousLocale !== this.settings.locale.selected && rebuildUI) {\n this._host.rebuildUi();\n }\n }\n\n /**\n * Loads a new state into the engine.\n *\n * @param settings The engine state to load.\n * @param retainMetaBehavior When set to `true`, the engine will not be stopped or started, if the engine\n * state would require that. The settings for state management are also not loaded from the engine state.\n * This is intended to make loading of previous settings snapshots more intuitive.\n */\n stateLoad(settings: EngineState, retainMetaBehavior = false) {\n this._isLoaded = true;\n\n this.stop(false);\n\n // For now, we only log a warning on mismatching tags.\n // Ideally, we would perform semver comparison, but that is\n // excessive at this point in time. The goal should be a stable\n // state import of most versions anyway.\n const version = ksVersion();\n if (settings.v !== version) {\n console.warn(\n ...cl(\n `Attempting to load engine state with version tag '${settings.v}' when engine is at version '${version}'!`,\n ),\n );\n }\n\n // Perform the load of each sub settings section in a try-catch to\n // allow us to still load the other sections if there were schema\n // changes.\n const attemptLoad = (loader: () => unknown, errorMessage: string) => {\n try {\n loader();\n } catch (error) {\n console.error(...cl(`Failed load of ${errorMessage} settings.`, error));\n }\n };\n\n attemptLoad(() => {\n this.settings.load(settings.engine, retainMetaBehavior);\n }, \"engine\");\n attemptLoad(() => {\n this.bonfireManager.settings.load(settings.bonfire);\n }, \"bonfire\");\n attemptLoad(() => {\n this.religionManager.settings.load(settings.religion);\n }, \"religion\");\n attemptLoad(() => {\n this.scienceManager.settings.load(settings.science);\n }, \"science\");\n attemptLoad(() => {\n this.spaceManager.settings.load(settings.space);\n }, \"space\");\n attemptLoad(() => {\n this.timeControlManager.settings.load(settings.timeControl);\n }, \"time control\");\n attemptLoad(() => {\n this.timeManager.settings.load(settings.time);\n }, \"time\");\n attemptLoad(() => {\n this.tradeManager.settings.load(settings.trade);\n }, \"trade\");\n attemptLoad(() => {\n this.villageManager.settings.load(settings.village);\n }, \"village\");\n attemptLoad(() => {\n this.workshopManager.settings.load(settings.workshop);\n }, \"workshop\");\n\n this.setLocale(this.settings.locale.selected);\n\n // Ensure the main engine setting is respected.\n if (this.settings.enabled) {\n this.start(false);\n } else {\n this.stop(false);\n }\n }\n\n static get DEFAULT_STATE() {\n return {\n bonfire: new BonfireSettings(),\n engine: new EngineSettings(),\n religion: new ReligionSettings(),\n science: new ScienceSettings(),\n space: new SpaceSettings(),\n time: new TimeSettings(),\n timeControl: new TimeControlSettings(),\n trade: new TradeSettings(),\n v: ksVersion(),\n village: new VillageSettings(),\n workshop: new WorkshopSettings(),\n };\n }\n\n stateReset() {\n this.stateLoad(Engine.DEFAULT_STATE);\n }\n\n /**\n * Serializes all settings in the engine.\n *\n * @returns A snapshot of the current engine settings state.\n */\n stateSerialize(): EngineState {\n return {\n bonfire: this.bonfireManager.settings,\n engine: this.settings,\n religion: this.religionManager.settings,\n science: this.scienceManager.settings,\n space: this.spaceManager.settings,\n time: this.timeManager.settings,\n timeControl: this.timeControlManager.settings,\n trade: this.tradeManager.settings,\n v: ksVersion(),\n village: this.villageManager.settings,\n workshop: this.workshopManager.settings,\n };\n }\n\n /**\n * Start the Kitten Scientists engine.\n *\n * @param msg Should we print to the log that the engine was started?\n */\n start(msg = true): void {\n if (this._timeoutMainLoop) {\n return;\n }\n\n const loop = () => {\n const context: FrameContext = {\n entry: Date.now(),\n exit: 0,\n measurements: {},\n requestGameUiRefresh: false,\n };\n\n this._iterate(context)\n .then(() => {\n context.exit = Date.now();\n const timeTaken = context.exit - context.entry;\n\n document.dispatchEvent(\n new CustomEvent<typeof context>(\"ks.reportFrame\", { detail: context }),\n );\n\n // Check if the main loop was terminated during\n // the last iteration.\n if (this._timeoutMainLoop === undefined) {\n return;\n }\n\n this._timeoutMainLoop = UserScriptLoader.window.setTimeout(\n loop,\n Math.max(10, this._host.engine.settings.interval - timeTaken),\n );\n })\n .catch((error: unknown) => {\n console.warn(...cl(unknownToError(error)));\n });\n };\n this._timeoutMainLoop = UserScriptLoader.window.setTimeout(\n loop,\n this._host.engine.settings.interval,\n );\n\n if (msg) {\n this._host.engine.imessage(\"status.ks.enable\");\n }\n }\n\n /**\n * Stop the Kitten Scientists engine.\n *\n * @param msg Should we print to the log that the engine was stopped?\n */\n stop(msg = true): void {\n if (!this._timeoutMainLoop) {\n return;\n }\n\n clearTimeout(this._timeoutMainLoop);\n this._timeoutMainLoop = undefined;\n\n if (msg) {\n this._host.engine.imessage(\"status.ks.disable\");\n }\n }\n\n /**\n * The main loop of the automation script.\n */\n private async _iterate(context: FrameContext): Promise<void> {\n // The logic here is inverted, because _disabled_ items are hidden from the log.\n if (!this.settings.filters.disableKGLog.enabled) {\n this._maintainKGLogFilters();\n }\n\n // The order in which these actions are performed is probably\n // semi-intentional and should be preserved or improved.\n let [, duration] = await measureAsync(() => this.scienceManager.tick(context));\n context.measurements.scienceManager = duration;\n\n [, duration] = measure(() => {\n this.bonfireManager.tick(context);\n });\n context.measurements.bonfireManager = duration;\n\n [, duration] = measure(() => {\n this.spaceManager.tick(context);\n });\n context.measurements.spaceManager = duration;\n\n [, duration] = await measureAsync(() => this.workshopManager.tick(context));\n context.measurements.workshopManager = duration;\n\n [, duration] = measure(() => {\n this.tradeManager.tick(context);\n });\n context.measurements.tradeManager = duration;\n\n [, duration] = await measureAsync(() => this.religionManager.tick(context));\n context.measurements.religionManager = duration;\n\n [, duration] = measure(() => {\n this.timeManager.tick(context);\n });\n context.measurements.timeManager = duration;\n\n [, duration] = measure(() => {\n this.villageManager.tick(context);\n });\n context.measurements.villageManager = duration;\n\n [, duration] = await measureAsync(() => this.timeControlManager.tick(context));\n context.measurements.timeControlManager = duration;\n\n [, duration] = measure(() => {\n if (context.requestGameUiRefresh) {\n this._host.game.ui.render();\n }\n });\n context.measurements.gameUiRefresh = duration;\n }\n\n /**\n * Ensures all log filters in KG are unchecked. This means the events will not be logged.\n */\n private _maintainKGLogFilters(): void {\n for (const filter of Object.values(this._host.game.console.filters)) {\n filter.enabled = false;\n }\n\n const filterCheckboxes = UserScriptLoader.window.document.querySelectorAll(\"[id^=filter-]\");\n for (const checkbox of filterCheckboxes) {\n (checkbox as HTMLInputElement).checked = false;\n }\n }\n\n symbolForCycle(cycle: Cycle): string {\n return this._host.game.calendar.cycles.find(entry => entry.name === cycle)?.uglyph ?? \"\";\n }\n\n labelForCycle(cycle: Cycle): string {\n const symbol = this.symbolForCycle(cycle);\n const label = this._host.engine.i18n(\n `$space.planet.${cycle === \"redmoon\" ? \"moon\" : cycle}.label`,\n );\n return `${symbol} ${label}`;\n }\n\n labelForPlanet(planet: Planet): string {\n const cycleCandidate: string = planet === \"moon\" ? (\"redmoon\" as Cycle) : planet;\n const cycle: Cycle | undefined = Cycles.includes(cycleCandidate as Cycle)\n ? (cycleCandidate as Cycle)\n : undefined;\n const label = this._host.engine.i18n(`$space.planet.${planet}.label`);\n return cycle === undefined ? label : `${this.symbolForCycle(cycle)} ${label}`;\n }\n\n /**\n * Retrieve an internationalized string literal.\n *\n * @param key The key to retrieve from the translation table.\n * @param args Variable arguments to render into the string.\n * @returns The translated string.\n */\n i18n<TKittenGameLiteral extends `$${string}`>(\n key: TranslatedString<TKittenGameLiteral>,\n args: Array<number | string> = [],\n ): string {\n let value: string | undefined;\n\n // Key is to be translated through KG engine.\n if (key.startsWith(\"$\")) {\n value = this._host.i18nEngine(key.slice(1));\n }\n\n value =\n value ??\n this._i18nData[this.settings.locale.selected][\n key as keyof (typeof i18nData)[SupportedLocale]\n ];\n\n const check: Maybe<string> = value;\n\n if (isNil(check)) {\n value = i18nData[FallbackLocale][key as keyof (typeof i18nData)[SupportedLocale]];\n if (!value) {\n console.warn(...cl(`i18n key '${key}' not found in default language.`));\n return `$${key}`;\n }\n console.warn(...cl(`i18n key '${key}' not found in selected language.`));\n }\n for (let argIndex = 0; argIndex < args.length; ++argIndex) {\n value = value.replace(`{${argIndex}}`, `${args[argIndex]}`);\n }\n return value;\n }\n\n iactivity(\n i18nLiteral: keyof (typeof i18nData)[\"en-US\"],\n i18nArgs: Array<number | string> = [],\n logStyle?: ActivityClass,\n ): void {\n const text = this.i18n(i18nLiteral, i18nArgs);\n if (logStyle) {\n const activityClass: ActivityTypeClass = `type_${logStyle}` as const;\n this._printOutput(`ks-activity ${activityClass}` as const, \"#e65C00\", text);\n } else {\n this._printOutput(\"ks-activity\", \"#e65C00\", text);\n }\n }\n\n imessage(\n i18nLiteral: keyof (typeof i18nData)[\"en-US\"],\n i18nArgs: Array<number | string> = [],\n ): void {\n this._printOutput(\"ks-default\", \"#aa50fe\", this.i18n(i18nLiteral, i18nArgs));\n }\n\n storeForSummary(name: string, amount = 1, section: ActivitySummarySection = \"other\"): void {\n this._activitySummary.storeActivity(name, amount, section);\n }\n\n getSummary() {\n return this._activitySummary.renderSummary();\n }\n\n displayActivitySummary(): void {\n const summary = this.getSummary();\n for (const summaryLine of summary) {\n this._printOutput(\"ks-summary\", \"#009933\", summaryLine);\n }\n\n // Clear out the old activity\n this.resetActivitySummary();\n }\n\n resetActivitySummary(): void {\n this._activitySummary.resetActivity();\n }\n\n private _printOutput(\n cssClasses: \"ks-activity\" | `ks-activity ${ActivityTypeClass}` | \"ks-default\" | \"ks-summary\",\n color: string,\n message: string,\n ): void {\n if (this.settings.filters.enabled) {\n for (const filterItem of Object.values(this.settings.filters.filters)) {\n if (filterItem.variant === cssClasses && !filterItem.enabled) {\n return;\n }\n }\n }\n\n // update the color of the message immediately after adding\n const msg = this._host.game.msg(message, cssClasses);\n $(msg.span).css(\"color\", color);\n\n console.debug(...cl(message));\n }\n\n static evaluateSubSectionTrigger(sectionTrigger: number, subSectionTrigger: number): number {\n return sectionTrigger < 0\n ? subSectionTrigger\n : subSectionTrigger < 0\n ? sectionTrigger\n : subSectionTrigger;\n }\n}\n","/**\n * This code was derived from https://github.com/sindresorhus/parse-ms/tree/a18636bb609793326a1bd8d541aad49f715f0a40\n * and https://github.com/sindresorhus/pretty-ms/tree/763fe075d8a62aa8d9ee603bfad2f3107c3a9f02.\n * It is available under the MIT license.\n */\nconst toZeroIfInfinity = (value) => (Number.isFinite(value) ? value : 0);\nconst parseNumber = (milliseconds) => {\n return {\n days: Math.trunc(milliseconds / 86_400_000),\n hours: Math.trunc((milliseconds / 3_600_000) % 24),\n minutes: Math.trunc((milliseconds / 60_000) % 60),\n seconds: Math.trunc((milliseconds / 1000) % 60),\n milliseconds: Math.trunc(milliseconds % 1000),\n microseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1000) % 1000),\n nanoseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1e6) % 1000),\n };\n};\nconst parseBigint = (milliseconds) => {\n return {\n days: milliseconds / 86400000n,\n hours: (milliseconds / 3600000n) % 24n,\n minutes: (milliseconds / 60000n) % 60n,\n seconds: (milliseconds / 1000n) % 60n,\n milliseconds: milliseconds % 1000n,\n microseconds: 0n,\n nanoseconds: 0n,\n };\n};\nconst parseMilliseconds = (milliseconds) => {\n switch (typeof milliseconds) {\n case \"number\": {\n if (Number.isFinite(milliseconds)) {\n return parseNumber(milliseconds);\n }\n break;\n }\n case \"bigint\": {\n return parseBigint(milliseconds);\n }\n // No default\n }\n throw new TypeError(\"Expected a finite number or bigint\");\n};\nconst isZero = (value) => value === 0 || value === 0n;\nconst pluralize = (word, count) => count === 1 || count === 1n ? word : `${word}s`;\nconst SECOND_ROUNDING_EPSILON = 0.000_000_1;\nconst ONE_DAY_IN_MILLISECONDS = 24n * 60n * 60n * 1000n;\n/**\n * Convert milliseconds to a human readable string: `1337000000` → `15d 11h 23m 20s`.\n * @param milliseconds - Milliseconds to humanize.\n * @param options - Options for humanizing the milliseconds.\n * @returns The humanized string.\n * @example\n * ```\n * import formatMilliseconds from '@oliversalzburg/js-utils/format/milliseconds.js';\n *\n * formatMilliseconds(1337000000);\n * //=> '15d 11h 23m 20s'\n *\n * formatMilliseconds(1337);\n * //=> '1.3s'\n *\n * formatMilliseconds(133);\n * //=> '133ms'\n *\n * // `compact` option\n * formatMilliseconds(1337, {compact: true});\n * //=> '1s'\n *\n * // `verbose` option\n * formatMilliseconds(1335669000, {verbose: true});\n * //=> '15 days 11 hours 1 minute 9 seconds'\n *\n * // `colonNotation` option\n * formatMilliseconds(95500, {colonNotation: true});\n * //=> '1:35.5'\n *\n * // `formatSubMilliseconds` option\n * formatMilliseconds(100.400080, {formatSubMilliseconds: true})\n * //=> '100ms 400µs 80ns'\n *\n * // Can be useful for time durations\n * formatMilliseconds(new Date(2014, 0, 1, 10, 40) - new Date(2014, 0, 1, 10, 5))\n * //=> '35m'\n * ```\n */\nexport const formatMilliseconds = (milliseconds, options = {\n colonNotation: false,\n compact: false,\n formatSubMilliseconds: false,\n keepDecimalsOnWholeSeconds: false,\n millisecondsDecimalDigits: 0,\n secondsDecimalDigits: 1,\n separateMilliseconds: false,\n unitCount: Infinity,\n verbose: false,\n}) => {\n const isBigInt = typeof milliseconds === \"bigint\";\n if (!isBigInt && !Number.isFinite(milliseconds)) {\n throw new TypeError(\"Expected a finite number or bigint\");\n }\n const optionsAdjusted = { ...options };\n if (optionsAdjusted.colonNotation) {\n optionsAdjusted.compact = false;\n optionsAdjusted.formatSubMilliseconds = false;\n optionsAdjusted.separateMilliseconds = false;\n optionsAdjusted.verbose = false;\n }\n if (optionsAdjusted.compact) {\n optionsAdjusted.unitCount = 1;\n optionsAdjusted.secondsDecimalDigits = 0;\n optionsAdjusted.millisecondsDecimalDigits = 0;\n }\n let result = [];\n const floorDecimals = (value, decimalDigits) => {\n const flooredInterimValue = Math.floor(value * 10 ** decimalDigits + SECOND_ROUNDING_EPSILON);\n const flooredValue = Math.round(flooredInterimValue) / 10 ** decimalDigits;\n return flooredValue.toFixed(decimalDigits);\n };\n const add = (value, long, short, valueString) => {\n if ((result.length === 0 || !optionsAdjusted.colonNotation) &&\n isZero(value) &&\n !(optionsAdjusted.colonNotation && short === \"m\")) {\n return;\n }\n valueString ??= String(value);\n if (optionsAdjusted.colonNotation) {\n const wholeDigits = valueString.includes(\".\")\n ? valueString.split(\".\")[0].length\n : valueString.length;\n const minLength = result.length > 0 ? 2 : 1;\n valueString = \"0\".repeat(Math.max(0, minLength - wholeDigits)) + valueString;\n }\n else {\n valueString += optionsAdjusted.verbose ? \" \" + pluralize(long, value) : short;\n }\n result.push(valueString);\n };\n const parsed = parseMilliseconds(milliseconds);\n const days = BigInt(parsed.days);\n add(days / 365n, \"year\", \"y\");\n add(days % 365n, \"day\", \"d\");\n add(Number(parsed.hours), \"hour\", \"h\");\n add(Number(parsed.minutes), \"minute\", \"m\");\n if (optionsAdjusted.separateMilliseconds ||\n optionsAdjusted.formatSubMilliseconds ||\n (!optionsAdjusted.colonNotation && milliseconds < 1000)) {\n const seconds = Number(parsed.seconds);\n const milliseconds = Number(parsed.milliseconds);\n const microseconds = Number(parsed.microseconds);\n const nanoseconds = Number(parsed.nanoseconds);\n add(seconds, \"second\", \"s\");\n if (optionsAdjusted.formatSubMilliseconds) {\n add(milliseconds, \"millisecond\", \"ms\");\n add(microseconds, \"microsecond\", \"µs\");\n add(nanoseconds, \"nanosecond\", \"ns\");\n }\n else {\n const millisecondsAndBelow = milliseconds + microseconds / 1000 + nanoseconds / 1e6;\n const millisecondsDecimalDigits = typeof optionsAdjusted.millisecondsDecimalDigits === \"number\"\n ? optionsAdjusted.millisecondsDecimalDigits\n : 0;\n const roundedMilliseconds = millisecondsAndBelow >= 1\n ? Math.round(millisecondsAndBelow)\n : Math.ceil(millisecondsAndBelow);\n const millisecondsString = millisecondsDecimalDigits\n ? millisecondsAndBelow.toFixed(millisecondsDecimalDigits)\n : roundedMilliseconds.toString();\n add(Number.parseFloat(millisecondsString), \"millisecond\", \"ms\", millisecondsString);\n }\n }\n else {\n const seconds = ((isBigInt ? Number(milliseconds % ONE_DAY_IN_MILLISECONDS) : milliseconds) / 1000) % 60;\n const secondsDecimalDigits = typeof optionsAdjusted.secondsDecimalDigits === \"number\"\n ? optionsAdjusted.secondsDecimalDigits\n : 1;\n const secondsFixed = floorDecimals(seconds, secondsDecimalDigits);\n const secondsString = optionsAdjusted.keepDecimalsOnWholeSeconds\n ? secondsFixed\n : secondsFixed.replace(/\\.0+$/, \"\");\n add(Number.parseFloat(secondsString), \"second\", \"s\", secondsString);\n }\n if (result.length === 0) {\n return \"0\" + (optionsAdjusted.verbose ? \" milliseconds\" : \"ms\");\n }\n const separator = optionsAdjusted.colonNotation ? \":\" : \" \";\n if (typeof optionsAdjusted.unitCount === \"number\") {\n result = result.slice(0, Math.max(optionsAdjusted.unitCount, 1));\n }\n return result.join(separator);\n};\n//# sourceMappingURL=milliseconds.js.map","export const Icons = {\n /**\n * camping_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Bonfire:\n \"M80-80v-183l363-491-67-90 49-35 55 75 56-75 48 35-66 90 362 491v183H80Zm400-623L140-243v103h145l195-273 195 273h145v-103L480-703ZM359-140h242L480-310 359-140Zm121-273 195 273-195-273-195 273 195-273Z\",\n\n /**\n * check_box_48dp__FILL0_wght400_GRAD0_opsz48\n */\n CheckboxCheck:\n \"m419-321 289-289-43-43-246 246-119-119-43 43 162 162ZM120-120v-720h720v720H120Zm60-60h600v-600H180v600Zm0 0v-600 600Z\",\n\n /**\n * check_box_outline_blank_48dp__FILL0_wght400_GRAD0_opsz48\n */\n CheckboxUnCheck: \"M120-120v-720h720v720H120Zm60-60h600v-600H180v600Z\",\n\n /**\n * content_copy_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Copy: \"M240-200v-680h560v680H240Zm60-60h440v-560H300v560ZM120-80v-680h60v620h500v60H120Zm180-180v-560 560Z\",\n\n /**\n * event_repeat_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Cycles:\n \"M120-80v-740h125v-60h65v60h340v-60h65v60h125v360h-60v-110H180v430h324v60H120ZM760 0q-73 0-127.5-45.5T564-160h62q13 44 49.5 72T760-60q58 0 99-41t41-99q0-58-41-99t-99-41q-29 0-54 10.5T662-300h58v60H560v-160h60v57q27-26 63-41.5t77-15.5q83 0 141.5 58.5T960-200q0 83-58.5 141.5T760 0ZM180-630h600v-130H180v130Zm0 0v-130 130Z\",\n\n /**\n * data_usage_48dp__FILL0_wght400_GRAD0_opsz48\n */\n DataUsage:\n \"M480-80q-82 0-155-31.5T197.5-197q-54.5-54-86-127T80-479q0-158 106.5-272T451-877v102q-115 11-192 95.5T182-479q0 124 87 210.5T480-182q72 0 136-32.5T725-306l88 51q-58 83-145.5 129T480-80Zm362-229-88-49q12-31 18-61.5t6-60.5q0-116-76.5-201T511-776v-102q157 11 263 124.5T880-484q0 45-9.5 88.5T842-309Z\",\n\n /**\n * delete_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Delete:\n \"M201-120v-630h-41v-60h188v-30h264v30h188v60h-41v630H201Zm60-60h438v-570H261v570Zm106-86h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z\",\n\n /**\n * draft_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Draft:\n \"M160-80v-800h421l219 219v581H160Zm391-554v-186H220v680h520v-494H551ZM220-820v186-186 680-680Z\",\n\n /**\n * eco_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Eco: \"M213-175q-43.59-45-68.3-104Q120-338 120-400q0-73 25.5-133.5T222-645q35-35 87-59t122.5-37.5Q502-755 591-758.5t198 3.5q8 108 5.5 197.5t-16 160.75q-13.5 71.25-38 124.56Q716-218.87 680-183q-51 51-110 77T444-80q-69 0-126.5-23.5T213-175Zm103 0q25 17 58 26t69.92 9Q497-140 547-162t91-64q27-27 46-70.5t31-103Q727-459 731-534t0-165q-94-2-168.5 2.5T431-680q-57 12-98 30.5T266-604q-42 43-64 91t-22 98q0 48 20.5 100.5T251-230q53-98 127-176t157-123q-87 75-141 162.5T316-175Zm0 0Zm0 0Z\",\n\n /**\n * edit_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Edit: \"M180-180h44l472-471-44-44-472 471v44Zm-60 60v-128l617-616 128 128-617 616H120Zm659-617-41-41 41 41Zm-105 64-22-22 44 44-22-22Z\",\n\n /**\n * expand_circle_down_48dp__FILL0_wght400_GRAD0_opsz48\n */\n ExpandCircleDown:\n \"m480-351 173-173-43-42-130 130-130-130-43 42 173 173Zm0 271q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-156t86-127Q252-817 325-848.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 82-31.5 155T763-197.5q-54 54.5-127 86T480-80Zm0-60q142 0 241-99.5T820-480q0-142-99-241t-241-99q-141 0-240.5 99T140-480q0 141 99.5 240.5T480-140Zm0-340Z\",\n\n /**\n * expand_circle_up_48dp__FILL0_wght400_GRAD0_opsz48\n */\n ExpandCircleUp:\n \"m350-394 130-130 130 130 43-42-173-173-173 173 43 42ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-155.5t85.5-127q54-54.5 127-86T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 83-31.5 156t-86 127q-54.5 54-127 85.5T480-80Zm0-60q141 0 240.5-99T820-480q0-141-99.5-240.5T480-820q-142 0-241 99.5T140-480q0 142 99 241t241 99Zm0-340Z\",\n\n /**\n * publish_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Import:\n \"M450-160v-371L330-411l-43-43 193-193 193 193-43 43-120-120v371h-60ZM160-597v-203h640v203h-60v-143H220v143h-60Z\",\n\n /**\n * inventory_2_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Inventory2:\n \"M120-80v-540H80v-260h800v260h-40v540H120Zm60-60h600v-480H180v480Zm-40-540h680v-140H140v140Zm220 260h240v-60H360v60Zm120 40Z\",\n\n /**\n * content_paste_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Paste:\n \"M120-120v-720h262q7-35 34.5-57.5T480-920q36 0 63.5 22.5T578-840h262v720H120Zm60-60h600v-600h-60v90H240v-90h-60v600Zm300-600q17 0 28.5-11.5T520-820q0-17-11.5-28.5T480-860q-17 0-28.5 11.5T440-820q0 17 11.5 28.5T480-780Z\",\n\n /**\n * synagogue_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Religion:\n \"M40-120v-560q0-45.83 32.12-77.92 32.12-32.08 78-32.08T228-757.92q32 32.09 32 77.92v31l220-191 220 191v-31q0-45.83 32.12-77.92 32.12-32.08 78-32.08T888-757.92q32 32.09 32 77.92v560H530v-250H430v250H40Zm720-510h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q760-701.25 760-680v50Zm-660 0h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q100-701.25 100-680v50Zm0 450h100v-390H100v390Zm160 0h110v-250h220v250h110v-390L480-761 260-570v390Zm500 0h100v-390H760v390ZM479.94-505Q457-505 441-521.06q-16-16.06-16-39T441.06-599q16.06-16 39-16T519-598.94q16 16.06 16 39T518.94-521q-16.06 16-39 16Z\",\n\n /**\n * refresh_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Reset:\n \"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z\",\n\n /**\n * shelves_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Resources:\n \"M120-40v-880h60v80h600v-80h60v880h-60v-80H180v80h-60Zm60-469h110v-160h220v160h270v-271H180v271Zm0 329h270v-160h220v160h110v-269H180v269Zm170-329h100v-100H350v100Zm160 329h100v-100H510v100ZM350-509h100-100Zm160 329h100-100Z\",\n\n /**\n * save_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Save: \"M840-683v563H120v-720h563l157 157Zm-60 27L656-780H180v600h600v-476ZM479.76-245q43.24 0 73.74-30.26 30.5-30.27 30.5-73.5 0-43.24-30.26-73.74-30.27-30.5-73.5-30.5-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.26 73.74 30.27 30.5 73.5 30.5ZM233-584h358v-143H233v143Zm-53-72v476-600 124Z\",\n\n /**\n * save_as_48dp__FILL0_wght400_GRAD0_opsz48\n */\n SaveAs:\n \"M120-120v-720h563l157 157v117l-60 60v-150L656-780H180v600h280v60H120Zm60-660v600-600ZM520-40v-123l263-262 122 122L643-40H520Zm300-263-37-37 37 37ZM580-100h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19ZM233-584h358v-143H233v143Zm247 339q14 0 27-3t24-10l39-40q7-11 10.5-24t3.5-27q0-43.33-30.26-73.67Q523.47-453 480.24-453q-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.33 73.74Q436.67-245 480-245Z\",\n\n /**\n * date_range_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Seasons:\n \"M306-394q-17 0-28.5-11.5T266-434q0-17 11.5-28.5T306-474q17 0 28.5 11.5T346-434q0 17-11.5 28.5T306-394Zm177 0q-17 0-28.5-11.5T443-434q0-17 11.5-28.5T483-474q17 0 28.5 11.5T523-434q0 17-11.5 28.5T483-394Zm170 0q-17 0-28.5-11.5T613-434q0-17 11.5-28.5T653-474q17 0 28.5 11.5T693-434q0 17-11.5 28.5T653-394ZM120-80v-740h125v-60h65v60h340v-60h65v60h125v740H120Zm60-60h600v-430H180v430Zm0-490h600v-130H180v130Zm0 0v-130 130Z\",\n\n /**\n * settings_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Settings:\n \"m388-80-20-126q-19-7-40-19t-37-25l-118 54-93-164 108-79q-2-9-2.5-20.5T185-480q0-9 .5-20.5T188-521L80-600l93-164 118 54q16-13 37-25t40-18l20-127h184l20 126q19 7 40.5 18.5T669-710l118-54 93 164-108 77q2 10 2.5 21.5t.5 21.5q0 10-.5 21t-2.5 21l108 78-93 164-118-54q-16 13-36.5 25.5T592-206L572-80H388Zm48-60h88l14-112q33-8 62.5-25t53.5-41l106 46 40-72-94-69q4-17 6.5-33.5T715-480q0-17-2-33.5t-7-33.5l94-69-40-72-106 46q-23-26-52-43.5T538-708l-14-112h-88l-14 112q-34 7-63.5 24T306-642l-106-46-40 72 94 69q-4 17-6.5 33.5T245-480q0 17 2.5 33.5T254-413l-94 69 40 72 106-46q24 24 53.5 41t62.5 25l14 112Zm44-210q54 0 92-38t38-92q0-54-38-92t-92-38q-54 0-92 38t-38 92q0 54 38 92t92 38Zm0-130Z\",\n\n /**\n * rocket_launch_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Space:\n \"m187-551 106 45q18-36 38.5-71t43.5-67l-79-16-109 109Zm154 81 133 133q57-26 107-59t81-64q81-81 119-166t41-192q-107 3-192 41T464-658q-31 31-64 81t-59 107Zm229-96q-20-20-20-49.5t20-49.5q20-20 49.5-20t49.5 20q20 20 20 49.5T669-566q-20 20-49.5 20T570-566Zm-15 383 109-109-16-79q-32 23-67 43.5T510-289l45 106Zm326-694q9 136-34 248T705-418l-2 2-2 2 22 110q3 15-1.5 29T706-250L535-78l-85-198-170-170-198-85 172-171q11-11 25-15.5t29-1.5l110 22q1-1 2-1.5t2-1.5q99-99 211-142.5T881-877ZM149-325q35-35 85.5-35.5T320-326q35 35 34.5 85.5T319-155q-26 26-80.5 43T75-80q15-109 31.5-164t42.5-81Zm42 43q-14 15-25 47t-19 82q50-8 82-19t47-25q19-17 19.5-42.5T278-284q-19-18-44.5-17.5T191-282Z\",\n\n /**\n * keyboard_tab_48dp__FILL0_wght400_GRAD0_opsz48\n */\n State: \"M820-240v-480h60v480h-60Zm-340 1-43-42 169-169H80v-60h526L438-679l42-42 241 241-241 241Z\",\n\n /**\n * summarize_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Summary:\n \"M279-621h60v-60h-60v60Zm0 171h60v-60h-60v60Zm0 171h60v-60h-60v60ZM120-120v-720h522l198 198v522H120Zm60-60h600v-429H609v-171H180v600Zm0-600v171.43V-780v600-600Z\",\n\n /**\n * sync_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Sync: \"M167-160v-60h130l-15-12q-64-51-93-111t-29-134q0-106 62.5-190.5T387-784v62q-75 29-121 96.5T220-477q0 63 23.5 109.5T307-287l30 21v-124h60v230H167Zm407-15v-63q76-29 121-96.5T740-483q0-48-23.5-97.5T655-668l-29-26v124h-60v-230h230v60H665l15 14q60 56 90 120t30 123q0 106-62 191T574-175Z\",\n\n /**\n * schedule_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Time: \"m627-287 45-45-159-160v-201h-60v225l174 181ZM480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-82 31.5-155t86-127.5Q252-817 325-848.5T480-880q82 0 155 31.5t127.5 86Q817-708 848.5-635T880-480q0 82-31.5 155t-86 127.5Q708-143 635-111.5T480-80Zm0-400Zm0 340q140 0 240-100t100-240q0-140-100-240T480-820q-140 0-240 100T140-480q0 140 100 240t240 100Z\",\n\n /**\n * bolt_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Trigger:\n \"m393-165 279-335H492l36-286-253 366h154l-36 255Zm-73 85 40-280H160l360-520h80l-40 320h240L400-80h-80Zm154-396Z\",\n\n /**\n * construction_48dp__FILL0_wght400_GRAD0_opsz48\n */\n Workshop:\n \"M768-120 517-371l57-57 251 251-57 57Zm-581 0-57-57 290-290-107-107-23 23-44-44v85l-24 24-122-122 24-24h86l-48-48 131-131q17-17 37-23t44-6q24 0 44 8.5t37 25.5L348-699l48 48-24 24 104 104 122-122q-8-13-12.5-30t-4.5-36q0-53 38.5-91.5T711-841q15 0 25.5 3t17.5 8l-85 85 75 75 85-85q5 8 8.5 19.5T841-709q0 53-38.5 91.5T711-579q-18 0-31-2.5t-24-7.5L187-120Z\",\n};\n","import { mustExist } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { KittenScientists } from \"../../KittenScientists.js\";\nimport { cl } from \"../../tools/Log.js\";\n\nexport type UiComponentInterface = {\n readonly children: Iterable<UiComponentInterface>;\n parent: UiComponentInterface | null;\n get element(): JQuery<HTMLElement>;\n requestRefresh(withChildren?: boolean, depth?: number, trace?: boolean): void;\n refresh(force?: boolean, depth?: number): void;\n};\n\nexport type UiComponentOptions = {\n length?: never;\n readonly onRefresh?: () => void;\n readonly onRefreshRequest?: () => void;\n};\n\nexport abstract class UiComponent<TElement extends HTMLElement = HTMLElement>\n implements UiComponentInterface\n{\n private static nextComponentId = 0;\n readonly componentId: number;\n\n /**\n * A reference to the host itself.\n */\n readonly host: KittenScientists;\n parent: UiComponentInterface | null;\n\n readonly options: UiComponentOptions | undefined;\n\n /**\n * The main DOM element for this component, in a JQuery wrapper.\n */\n protected _element: JQuery<TElement> | undefined;\n\n protected set element(value: JQuery<TElement>) {\n this._element = value;\n this._element[0].id = `KS${Object.getPrototypeOf(this).constructor.name}#${this.componentId}`;\n }\n get element(): JQuery<TElement> {\n return mustExist(this._element);\n }\n\n /**\n * NOTE: It is intentional that all children are of the most fundamental base type.\n * If a more specifically typed reference for a child is required, it should be stored\n * on construction.\n * The 'children' set is intended only for inter-component orchestration.\n */\n readonly children = new Set<UiComponentInterface>();\n\n /**\n * Constructs the base `UiComponent`.\n * Subclasses MUST add children from options when `this.element` is constructed.\n *\n * @param host A reference to the host.\n * @param options The options for this component.\n */\n constructor(parent: UiComponent | { host: KittenScientists }, options?: UiComponentOptions) {\n this.componentId = UiComponent.nextComponentId++;\n\n this.host = parent.host;\n this.options = options;\n this.parent = parent instanceof UiComponent ? parent : null;\n this._needsRefresh = false;\n }\n\n abstract toString(): string;\n\n protected _needsRefresh;\n requestRefresh(withChildren = false, depth = 0, trace = false) {\n if (trace) {\n console.debug(\n ...cl(\n depth < 0 ? \"⤒\".repeat(depth * -1) : \" \".repeat(depth),\n this.toString(),\n \"requestRefresh()\",\n ),\n );\n }\n\n this.options?.onRefreshRequest?.call(this);\n\n if (this.parent !== this && !withChildren) {\n this.parent?.requestRefresh(false, depth - 1, trace);\n }\n\n if (this._needsRefresh) {\n if (trace) {\n console.debug(\n ...cl(\n depth < 0 ? \"⤒\".repeat(depth * -1) : \" \".repeat(depth),\n this.toString(),\n \"requestRefresh() <already pending>\",\n ),\n );\n }\n }\n\n this._needsRefresh = true;\n\n if (withChildren) {\n if (trace) {\n console.debug(\n ...cl(\n depth < 0 ? \"⤒\".repeat(depth * -1) : \" \".repeat(depth),\n this.toString(),\n \"requestRefresh()\",\n `+ ${this.children.size} children`,\n ),\n );\n }\n for (const child of this.children) {\n child.requestRefresh(true, depth + 1, trace);\n }\n } else {\n if (trace) {\n console.debug(\n ...cl(\n depth < 0 ? \"⤒\".repeat(depth * -1) : \" \".repeat(depth),\n this.toString(),\n \"requestRefresh()\",\n \"<queued>\",\n ),\n );\n }\n }\n }\n\n refresh(force = false, depth = 0) {\n if (!force && !this._needsRefresh) {\n if (depth === 0) {\n console.debug(...cl(this.toString(), \"refresh() received and ignored.\"));\n }\n return;\n }\n\n // WARNING: Enable this section only during refresh logic debugging!\n // When this was implemented, a full refresh logged 16K messages.\n // Even when these are filtered from the JS console, there are\n // noticeable performance issues. DO NOT ENABLE THIS UNLESS YOU NEED TO.\n /*\n if (!force) {\n console.debug(\n ...cl(\n depth < 0 ? \"⤒\".repeat(depth * -1) : \" \".repeat(depth),\n this.toString(),\n \"refresh\",\n typeof this.options?.onRefresh !== \"undefined\" ? \"with onRefresh()\" : \"\",\n ),\n );\n }\n */\n\n this.options?.onRefresh?.call(this);\n for (const child of this.children) {\n child.refresh(force, depth + 1);\n }\n\n this._needsRefresh = false;\n }\n\n addChild(child: UiComponentInterface): this {\n child.parent = this;\n this.children.add(child);\n this.element.append(child.element);\n return this;\n }\n addChildren(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.addChild(child);\n }\n return this;\n }\n\n removeChild(child: UiComponentInterface) {\n if (!this.children.has(child)) {\n return;\n }\n\n child.element.remove();\n this.children.delete(child);\n }\n removeChildren(children: Iterable<UiComponentInterface>) {\n for (const child of children) {\n this.removeChild(child);\n }\n }\n}\n","import { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type ContainerOptions = ThisType<Container> &\n UiComponentOptions & {\n readonly classes?: Array<string>;\n };\n\nexport class Container extends UiComponent {\n declare readonly options: ContainerOptions;\n\n /**\n * Constructs a simple container element without any special properties.\n *\n * @param host A reference to the host.\n * @param options Options for the container.\n */\n constructor(parent: UiComponent, options?: ContainerOptions) {\n super(parent, { ...options });\n\n this.element = $(\"<div/>\");\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n }\n\n toString(): string {\n return `[${Container.name}#${this.componentId}]`;\n }\n}\n","import stylesDelimiter from \"./Delimiter.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type ListItemOptions = ThisType<ListItem> &\n UiComponentOptions & {\n /**\n * Should there be additional padding below this element?\n */\n readonly delimiter?: boolean;\n readonly classes?: Array<string>;\n };\n\nexport class ListItem extends UiComponent {\n declare readonly options: ListItemOptions;\n\n /**\n * Construct a new simple list item with only a container element.\n *\n * @param host The userscript instance.\n * @param options Options for the list item.\n */\n constructor(parent: UiComponent, options?: ListItemOptions) {\n super(parent, { ...options });\n\n this.element = $(\"<li/>\");\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n\n if (options?.delimiter === true) {\n this.element.addClass(stylesDelimiter.delimiter);\n }\n }\n\n toString(): string {\n return `[${ListItem.name}#${this.componentId}]`;\n }\n}\n","import { Container } from \"./Container.js\";\nimport styles from \"./LabelListItem.module.css\";\nimport { ListItem, type ListItemOptions } from \"./ListItem.js\";\nimport stylesListItem from \"./ListItem.module.css\";\nimport type { UiComponent, UiComponentInterface } from \"./UiComponent.js\";\n\nexport type LabelListItemOptions = ThisType<LabelListItem> &\n ListItemOptions & {\n /**\n * When set to an SVG path, will be used as an icon on the label.\n */\n readonly icon?: string;\n\n /**\n * Should an indicator be rendered in front of the element,\n * to indicate that this is an upgrade of a prior setting?\n */\n readonly upgradeIndicator?: boolean;\n };\n\nexport class LabelListItem extends ListItem {\n declare readonly options: LabelListItemOptions;\n readonly head: Container;\n readonly elementLabel: JQuery;\n\n /**\n * Construct a new label list item.\n *\n * @param host The userscript instance.\n * @param label The label on the setting element.\n * @param options Options for the list item.\n */\n constructor(parent: UiComponent, label: string, options?: LabelListItemOptions) {\n super(parent, options);\n\n this.head = new Container(parent);\n this.head.element.addClass(stylesListItem.head);\n this.addChild(this.head);\n\n this.elementLabel = $(\"<label/>\", {\n text: `${options?.upgradeIndicator === true ? \"⮤ \" : \"\"}${label}`,\n })\n .addClass(styles.label)\n .addClass(stylesListItem.label);\n this.head.element.append(this.elementLabel);\n\n if (options?.icon) {\n const iconElement = $(\"<div/>\", {\n html: `<svg style=\"width: 15px; height: 15px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"${options.icon}\"/></svg>`,\n }).addClass(styles.iconLabel);\n this.elementLabel.prepend(iconElement);\n }\n }\n\n toString(): string {\n return `[${LabelListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n\n addChildHead(child: UiComponentInterface): this {\n this.head.addChild(child);\n return this;\n }\n addChildrenHead(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.head.addChild(child);\n }\n return this;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport type { Setting } from \"../../settings/Settings.js\";\nimport { LabelListItem, type LabelListItemOptions } from \"./LabelListItem.js\";\nimport { default as styles, default as stylesSettingListItem } from \"./SettingListItem.module.css\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingListItemOptions = ThisType<SettingListItem> &\n LabelListItemOptions & {\n /**\n * Will be invoked when the user checks the checkbox.\n */\n readonly onCheck?: (isBatchProcess?: boolean) => void | Promise<void>;\n\n /**\n * Will be invoked when the user unchecks the checkbox.\n */\n readonly onUnCheck?: (isBatchProcess?: boolean) => void | Promise<void>;\n\n /**\n * Should the user be prevented from changing the value of the input?\n */\n readonly readOnly?: boolean;\n };\n\nexport class SettingListItem<TSetting extends Setting = Setting> extends LabelListItem {\n declare readonly options: SettingListItemOptions;\n readonly setting: TSetting;\n readonly checkbox?: JQuery;\n\n readOnly: boolean;\n\n /**\n * Construct a new setting element.\n * This is a simple checkbox with a label.\n *\n * @param host The userscript instance.\n * @param label The label on the setting element.\n * @param setting The setting this element is linked to.\n * @param options Options for this list item.\n */\n constructor(\n parent: UiComponent,\n setting: TSetting,\n label: string,\n options?: SettingListItemOptions,\n ) {\n super(parent, label, {\n ...options,\n onRefresh: () => {\n if (this.setting.enabled) {\n this.element.addClass(styles.checked);\n } else {\n this.element.removeClass(styles.checked);\n }\n\n if (this.readOnly) {\n this.element.addClass(stylesSettingListItem.readonly);\n } else {\n this.element.removeClass(stylesSettingListItem.readonly);\n }\n\n if (!isNil(this.checkbox)) {\n this.checkbox.prop(\"checked\", this.setting.enabled);\n this.checkbox.prop(\"disabled\", this.readOnly);\n }\n\n options?.onRefresh?.();\n },\n });\n\n this.element.addClass(styles.setting);\n\n const id = `ks-setting${this.componentId}`;\n const checkbox = $(\"<input/>\", {\n id,\n type: \"checkbox\",\n }).addClass(styles.checkbox);\n\n this.readOnly = options?.readOnly ?? false;\n checkbox.prop(\"disabled\", this.readOnly);\n\n checkbox.on(\"change\", (_event: JQuery.ChangeEvent) => {\n if (checkbox.is(\":checked\") && !setting.enabled) {\n this.check().catch(redirectErrorsToConsole(console));\n } else if (!checkbox.is(\":checked\") && setting.enabled) {\n this.uncheck().catch(redirectErrorsToConsole(console));\n }\n });\n\n this.elementLabel.before(checkbox);\n this.elementLabel.prop(\"for\", id);\n\n this.checkbox = checkbox;\n this.setting = setting;\n }\n\n toString(): string {\n return `[${SettingListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n\n async check(isBatchProcess = false) {\n this.setting.enabled = true;\n await this.options?.onCheck?.call(isBatchProcess);\n this.requestRefresh();\n }\n\n async uncheck(isBatchProcess = false) {\n this.setting.enabled = false;\n await this.options.onUnCheck?.call(isBatchProcess);\n this.requestRefresh();\n }\n}\n","import { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport stylesButton from \"./Button.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type IconButtonOptions = ThisType<IconButton> &\n UiComponentOptions & {\n readonly readOnly?: boolean;\n readonly inactive?: boolean;\n readonly onClick: (event?: MouseEvent) => void | Promise<void>;\n };\n\n/**\n * A button that is visually represented through an SVG element.\n */\nexport class IconButton extends UiComponent {\n declare readonly options: IconButtonOptions;\n readOnly: boolean;\n inactive: boolean;\n\n /**\n * Constructs an `IconButton`.\n *\n * @param host A reference to the host.\n * @param pathData The SVG path data of the icon.\n * @param title The `title` of the element.\n * @param options Options for the icon button.\n */\n constructor(parent: UiComponent, pathData: string, title: string, options?: IconButtonOptions) {\n super(parent, {\n ...options,\n onRefresh: () => {\n if (this.readOnly) {\n this.element.addClass(stylesButton.readonly);\n } else {\n this.element.removeClass(stylesButton.readonly);\n }\n\n if (this.inactive) {\n this.element.addClass(stylesButton.inactive);\n } else {\n this.element.removeClass(stylesButton.inactive);\n }\n\n options?.onRefresh?.();\n },\n });\n\n this.element = $(\"<div/>\", {\n html: `<svg style=\"width: 18px; height: 18px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"${pathData}\"/></svg>`,\n title,\n }).addClass(stylesButton.iconButton);\n\n this.readOnly = options?.readOnly ?? false;\n this.inactive = options?.inactive ?? false;\n\n this.element.on(\"click\", () => {\n if (this.readOnly) {\n return;\n }\n\n this.click().catch(redirectErrorsToConsole(console));\n });\n }\n\n toString(): string {\n return `[${IconButton.name}#${this.componentId}]`;\n }\n\n async click() {\n if (this.readOnly) {\n return;\n }\n\n await this.options?.onClick?.call(this);\n\n this.requestRefresh();\n }\n}\n","import { is, isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { Icons } from \"../../images/Icons.js\";\nimport { Container } from \"./Container.js\";\nimport { IconButton } from \"./IconButton.js\";\nimport { SettingListItem } from \"./SettingListItem.js\";\nimport styles from \"./SettingsList.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type SettingsListOptions = ThisType<SettingsList> &\n UiComponentOptions & {\n readonly hasEnableAll?: boolean;\n readonly hasDisableAll?: boolean;\n readonly onEnableAll?: () => void;\n readonly onDisableAll?: () => void;\n readonly onReset?: () => void;\n };\n\n/**\n * The `SettingsList` is a `<ul>` designed to host `SettingListItem` instances.\n *\n * It has enable/disable buttons to check/uncheck all settings contained in it.\n * Most commonly, it is used as part of the `SettingsPanel`.\n *\n * This construct is also sometimes referred to as an \"items list\" for historic reasons.\n */\nexport class SettingsList extends UiComponent {\n declare readonly options: SettingsListOptions;\n readonly list: JQuery;\n\n readonly disableAllButton: IconButton | undefined;\n readonly enableAllButton: IconButton | undefined;\n readonly resetButton: IconButton | undefined;\n\n /**\n * Constructs a `SettingsList`.\n *\n * @param host A reference to the host.\n * @param options Which tools should be available on the list?\n */\n constructor(parent: UiComponent, options?: SettingsListOptions) {\n super(parent, { ...options });\n\n const toolOptions = {\n hasDisableAll: true,\n hasEnableAll: true,\n ...options,\n };\n const hasTools =\n toolOptions.hasDisableAll || toolOptions.hasEnableAll || !isNil(toolOptions.onReset);\n\n this.element = $(\"<div/>\").addClass(styles.listContainer);\n\n this.list = $(\"<ul/>\").addClass(styles.list).addClass(styles.itemsList);\n\n this.element.append(this.list);\n\n if (hasTools) {\n const tools = new Container(this, { classes: [styles.listTools] });\n\n if (toolOptions.hasEnableAll) {\n this.enableAllButton = new IconButton(\n parent,\n Icons.CheckboxCheck,\n parent.host.engine.i18n(\"ui.enable.all\"),\n {\n onClick: async () => {\n const event = new Event(\"enableAll\", { cancelable: true });\n this.element[0].dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n\n for (const child of this.children) {\n if (is(child, SettingListItem)) {\n await child.check(true);\n }\n }\n\n options?.onEnableAll?.call(this);\n },\n },\n );\n tools.addChild(this.enableAllButton);\n }\n\n if (toolOptions.hasDisableAll) {\n this.disableAllButton = new IconButton(\n parent,\n Icons.CheckboxUnCheck,\n parent.host.engine.i18n(\"ui.disable.all\"),\n {\n onClick: async () => {\n const event = new Event(\"disableAll\", { cancelable: true });\n this.element[0].dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n\n for (const child of this.children) {\n if (is(child, SettingListItem)) {\n await child.uncheck(true);\n }\n }\n\n options?.onDisableAll?.call(this);\n },\n },\n );\n tools.addChild(this.disableAllButton);\n }\n\n const onReset = toolOptions.onReset;\n if (!isNil(onReset)) {\n this.resetButton = new IconButton(\n parent,\n Icons.Reset,\n parent.host.engine.i18n(\"ui.reset\"),\n {\n onClick: () => {\n onReset();\n },\n },\n );\n tools.addChild(this.resetButton);\n }\n\n super.addChild(tools);\n }\n }\n\n toString(): string {\n return `[${SettingsList.name}#${this.componentId}]`;\n }\n\n override addChild(child: UiComponent): this {\n child.parent = this;\n this.children.add(child);\n this.list.append(child.element);\n return this;\n }\n}\n","import { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport { Icons } from \"../../../images/Icons.js\";\nimport stylesButton from \"../Button.module.css\";\nimport type { IconButtonOptions } from \"../IconButton.js\";\nimport { UiComponent } from \"../UiComponent.js\";\nimport styles from \"./ExpandoButton.module.css\";\n\nexport type ExpandoButtonOptions = ThisType<ExpandoButton> & IconButtonOptions;\n\nexport class ExpandoButton extends UiComponent {\n declare readonly options: ExpandoButtonOptions;\n readOnly: boolean;\n inactive: boolean;\n ineffective: boolean;\n\n /**\n * Constructs an expando element that is commonly used to expand and\n * collapses a section of the UI.\n *\n * @param host A reference to the host.\n * @param options Options for this expando.\n */\n constructor(parent: UiComponent, options?: ExpandoButtonOptions) {\n super(parent, {\n ...options,\n onRefresh: () => {\n if (this.ineffective) {\n this.element.addClass(stylesButton.ineffective);\n } else {\n this.element.removeClass(stylesButton.ineffective);\n }\n options?.onRefresh?.();\n },\n });\n\n this.element = $(\"<div/>\", {\n html: `\n <svg style=\"width: 18px; height: 18px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" class=\"${styles.down}\"><path d=\"${Icons.ExpandCircleDown}\"/></svg>\n <svg style=\"width: 18px; height: 18px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" class=\"${styles.up}\"><path d=\"${Icons.ExpandCircleUp}\"/></svg>\n `,\n title: parent.host.engine.i18n(\"ui.itemsShow\"),\n })\n .addClass(stylesButton.iconButton)\n .addClass(styles.expandoButton);\n\n this.element.on(\"click\", () => {\n if (this.readOnly) {\n return;\n }\n\n this.click().catch(redirectErrorsToConsole(console));\n });\n\n this.readOnly = options?.readOnly ?? false;\n this.inactive = options?.inactive ?? false;\n this.ineffective = false;\n }\n\n toString(): string {\n return `[${ExpandoButton.name}#${this.componentId}]`;\n }\n\n setCollapsed() {\n this.element.removeClass(styles.expanded);\n this.element.prop(\"title\", this.host.engine.i18n(\"ui.itemsShow\"));\n }\n setExpanded() {\n this.element.addClass(styles.expanded);\n this.element.prop(\"title\", this.host.engine.i18n(\"ui.itemsHide\"));\n }\n\n async click() {\n if (this.readOnly) {\n return;\n }\n\n await this.options?.onClick?.call(this);\n\n this.requestRefresh();\n }\n}\n","import { is } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { ExpandoButton } from \"./buttons/ExpandoButton.js\";\nimport { Container } from \"./Container.js\";\nimport type { LabelListItem } from \"./LabelListItem.js\";\nimport stylesSettingListItem from \"./SettingListItem.module.css\";\nimport { UiComponent, type UiComponentInterface, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type CollapsiblePanelOptions = ThisType<CollapsiblePanel> &\n UiComponentOptions & {\n /**\n * Should the main child be expanded right away?\n */\n readonly initiallyExpanded?: boolean;\n };\n\n/**\n * A `Panel` is a section of the UI that can be expanded and collapsed\n * through an expando button.\n * The panel also has a head element, which is extended to create the panel\n * behavior.\n */\nexport class CollapsiblePanel<THead extends LabelListItem = LabelListItem> extends UiComponent {\n declare readonly options: CollapsiblePanelOptions;\n protected readonly container: UiComponent;\n readonly expando: ExpandoButton;\n readonly head: THead;\n protected _mainChildVisible: boolean;\n\n get isExpanded() {\n return this._mainChildVisible;\n }\n\n /**\n * Constructs a settings panel that is used to contain a single child element.\n *\n * @param host A reference to the host.\n * @param head Another component to host in the head of the panel.\n * @param options Options for this panel.\n */\n constructor(parent: UiComponent, head: THead, options?: CollapsiblePanelOptions) {\n super(parent, options);\n\n this.head = head;\n this.container = new Container(this);\n this.container.element.addClass(stylesSettingListItem.panelContent);\n\n // The expando button for this panel.\n const expando = new ExpandoButton(parent, {\n onClick: () => this.toggle(),\n });\n head.head.addChild(expando);\n\n head.element.append(this.container.element);\n\n if (options?.initiallyExpanded) {\n this.container.element.removeClass(stylesSettingListItem.hidden);\n expando.setExpanded();\n } else {\n this.container.element.addClass(stylesSettingListItem.hidden);\n }\n\n this._mainChildVisible = options?.initiallyExpanded ?? false;\n this.element = head.element;\n this.expando = expando;\n\n this.addChildren([this.head, this.container]);\n }\n\n toString(): string {\n return `[${CollapsiblePanel.name}#${this.componentId}]`;\n }\n\n addChildHead(child: UiComponentInterface): this {\n this.head.addChild(child);\n return this;\n }\n addChildrenHead(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.head.addChild(child);\n }\n return this;\n }\n\n addChildContent(child: UiComponent): this {\n this.container.addChild(child);\n return this;\n }\n addChildrenContent(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.container.addChild(child);\n }\n return this;\n }\n\n /**\n * Control the visibility of the panel's contents.\n *\n * @param expand Should the panel be expanded? If not set, the panel is toggled.\n * @param toggleNested Also toggle all panels inside this panel?\n */\n toggle(expand: boolean | undefined = undefined, toggleNested = false) {\n const visible = expand !== undefined ? expand : !this._mainChildVisible;\n if (visible !== this._mainChildVisible) {\n this._mainChildVisible = visible;\n if (this._mainChildVisible) {\n // Refresh panel UI on expand.\n this.container.requestRefresh(true);\n // Show the DOM element.\n this.container.element.removeClass(stylesSettingListItem.hidden);\n // Reflect expanded state on expando.\n this.expando.setExpanded();\n // Reflect expanded state for CSS.\n this.head.element.addClass(stylesSettingListItem.expanded);\n // This is NOT a DOM event! It can only be caught by listening on this panel directly.\n this.element[0].dispatchEvent(new CustomEvent(\"panelShown\"));\n } else {\n this.container.element.addClass(stylesSettingListItem.hidden);\n this.expando.setCollapsed();\n this.head.element.removeClass(stylesSettingListItem.expanded);\n this.element[0].dispatchEvent(new CustomEvent(\"panelHidden\"));\n }\n }\n\n if (toggleNested) {\n const toggleChildren = (children: Iterable<UiComponentInterface>) => {\n for (const child of children) {\n if (is<CollapsiblePanel>(child, CollapsiblePanel)) {\n child.toggle(expand, toggleNested);\n } else {\n toggleChildren(child.children);\n }\n }\n };\n\n toggleChildren(this.children);\n }\n }\n}\n","import type { Setting } from \"../../settings/Settings.js\";\nimport { CollapsiblePanel, type CollapsiblePanelOptions } from \"./CollapsiblePanel.js\";\nimport type { LabelListItem } from \"./LabelListItem.js\";\nimport type { SettingListItem } from \"./SettingListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingsPanelOptions<TListItem extends LabelListItem = LabelListItem> =\n ThisType<SettingsPanel> &\n CollapsiblePanelOptions & {\n readonly settingItem?: TListItem;\n };\n\nexport class SettingsPanel<\n TSetting extends Setting = Setting,\n TListItem extends LabelListItem = LabelListItem,\n >\n extends CollapsiblePanel\n implements SettingListItem\n{\n declare readonly options: SettingsPanelOptions<TListItem>;\n readonly setting: TSetting;\n readonly settingItem: TListItem;\n\n get isExpanded() {\n return this._mainChildVisible;\n }\n\n // SettingListItem interface\n get elementLabel() {\n return this.head.element;\n }\n\n get readOnly() {\n return true;\n }\n set readOnly(_value: boolean) {\n /* noop */\n }\n\n async check() {\n this.setting.enabled = true;\n this.requestRefresh();\n }\n\n async uncheck() {\n this.setting.enabled = false;\n this.requestRefresh();\n }\n\n /**\n * Constructs a settings panel that is used to contain a major section of the UI.\n *\n * @param host - A reference to the host.\n * @param settingItem - The UI element to be placed in the head of the panel.\n * @param setting - An setting for which this is the settings panel.\n * @param options - Options for this panel.\n */\n constructor(\n parent: UiComponent,\n setting: TSetting,\n settingItem: TListItem,\n options?: SettingsPanelOptions<TListItem>,\n ) {\n super(parent, settingItem, options);\n\n this.element = settingItem.element;\n this.settingItem = settingItem;\n this.setting = setting;\n }\n\n toString(): string {\n return `[${SettingsPanel.name}#${this.componentId}]: '${this.settingItem.elementLabel.text()}'`;\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { BonfireSettings } from \"../settings/BonfireSettings.js\";\nimport type { BuildingUpgradeSettings } from \"../settings/BuildingUpgradeSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class BuildingUpgradeSettingsUi extends SettingsPanel<BuildingUpgradeSettings> {\n constructor(\n parent: UiComponent,\n settings: BuildingUpgradeSettings,\n _locale: SettingOptions<SupportedLocale>,\n sectionSetting: BonfireSettings,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrade.buildings\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefreshRequest: () => {\n this.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.buildings).some(building => building.enabled);\n },\n },\n );\n\n const items = [];\n for (const setting of Object.values(this.setting.buildings)) {\n const label = this.host.engine.i18n(`$buildings.${setting.upgrade}.label`);\n const button = new SettingListItem(this, setting, label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [label]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n });\n\n items.push({ button: button, label: label });\n }\n // Ensure buttons are added into UI with their labels alphabetized.\n items.sort((a, b) => a.label.localeCompare(b.label));\n const itemsList = new SettingsList(this);\n for (const button of items) {\n itemsList.addChild(button.button);\n }\n this.addChildContent(itemsList);\n }\n}\n","import { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport styles from \"./Button.module.css\";\nimport type { IconButtonOptions } from \"./IconButton.js\";\nimport { UiComponent } from \"./UiComponent.js\";\n\nexport type ButtonOptions = ThisType<Button> &\n IconButtonOptions & {\n readonly border?: boolean;\n readonly alignment?: \"left\" | \"right\";\n readonly title?: string;\n readonly classes?: Array<string>;\n };\n\n/**\n * A button that has a label and can optionally have an SVG icon.\n */\nexport class Button extends UiComponent {\n declare readonly options: ButtonOptions;\n protected readonly _iconElement: JQuery | undefined;\n readOnly: boolean;\n inactive: boolean;\n ineffective: boolean;\n\n /**\n * Constructs a `Button`.\n *\n * @param host - A reference to the host.\n * @param label - The text to display on the button.\n * @param pathData - The SVG path data of the icon.\n * @param options - Options for the icon button.\n */\n constructor(\n parent: UiComponent,\n label: string,\n pathData: string | null = null,\n options?: ButtonOptions,\n ) {\n super(parent, {\n ...options,\n onRefresh: () => {\n if (this.readOnly) {\n this.element.addClass(styles.readonly);\n } else {\n this.element.removeClass(styles.readonly);\n }\n\n if (this.inactive) {\n this.element.addClass(styles.inactive);\n } else {\n this.element.removeClass(styles.inactive);\n }\n\n if (this.ineffective) {\n this.element.addClass(styles.ineffective);\n } else {\n this.element.removeClass(styles.ineffective);\n }\n\n options?.onRefresh?.();\n },\n });\n\n this.element = $(\"<div/>\", { title: options?.title }).addClass(styles.button).text(label);\n\n if (options?.border !== false) {\n this.element.addClass(styles.bordered);\n }\n\n if (options?.alignment === \"right\") {\n this.element.addClass(styles.alignRight);\n }\n\n if (pathData !== null) {\n this._iconElement = $(\n `<svg class=\"${styles.buttonIcon}\" style=\"width: 18px; height: 18px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"${pathData}\"/></svg>`,\n );\n if (options?.alignment === \"right\") {\n this.element.append(this._iconElement);\n } else {\n this.element.prepend(this._iconElement);\n }\n }\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n\n this.element.on(\"click\", () => {\n if (this.readOnly) {\n return;\n }\n\n this.click().catch(redirectErrorsToConsole(console));\n });\n\n this.readOnly = options?.readOnly ?? false;\n this.inactive = options?.inactive ?? false;\n this.ineffective = false;\n }\n\n toString(): string {\n return `[${Button.name}#${this.componentId}]`;\n }\n\n updateLabel(label: string) {\n this.element.text(label);\n if (this._iconElement !== undefined) {\n if (this.options.alignment === \"right\") {\n this.element.append(this._iconElement);\n } else {\n this.element.prepend(this._iconElement);\n }\n }\n }\n updateTitle(title: string) {\n this.element.prop(\"title\", title);\n }\n\n async click() {\n if (this.readOnly) {\n return;\n }\n\n await this.options?.onClick?.call(this);\n\n this.requestRefresh();\n }\n}\n","import styles from \"./Delimiter.module.css\";\nimport { UiComponent } from \"./UiComponent.js\";\n\nexport class Delimiter extends UiComponent {\n /**\n * Constructs a `Delimiter`.\n *\n * @param host A reference to the host.\n * @param label The label on the fieldset.\n * @param options Options for the fieldset.\n */\n constructor(parent: UiComponent) {\n super(parent, {});\n this.element = $(\"<div/>\").addClass(styles.delimiter);\n }\n\n toString(): string {\n return `[${Delimiter.name}#${this.componentId}]`;\n }\n}\n","import styles from \"./HeaderListItem.module.css\";\nimport type { ListItem, ListItemOptions } from \"./ListItem.js\";\nimport { UiComponent } from \"./UiComponent.js\";\n\nexport type HeaderListItemOptions = ThisType<HeaderListItem> & ListItemOptions;\n\nexport class HeaderListItem extends UiComponent implements ListItem {\n declare readonly options: ListItemOptions;\n\n get elementLabel() {\n return this.element;\n }\n\n /**\n * Construct an informational text item.\n * This is purely for cosmetic/informational value in the UI.\n *\n * @param host A reference to the host.\n * @param text The text to appear on the header element.\n * @param options Options for the header.\n */\n constructor(parent: UiComponent, text: string, options?: ListItemOptions) {\n super(parent, { ...options });\n\n this.element = $(\"<li/>\", { text }).addClass(styles.header);\n }\n\n toString(): string {\n return `[${HeaderListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type InputOptions = ThisType<Input> &\n UiComponentOptions & {\n readonly onChange?: (value: string) => void;\n readonly onEnter?: (currentValue: string) => void;\n readonly onEscape?: (currentValue: string) => void;\n readonly selected?: boolean;\n readonly value?: string;\n readonly classes?: Array<string>;\n };\n\nexport class Input extends UiComponent<HTMLInputElement> {\n declare readonly options: InputOptions;\n\n /**\n * Constructs an input field.\n *\n * @param host - A reference to the host.\n * @param label - The label on the input element.\n * @param options - Options for the UI element.\n */\n constructor(parent: UiComponent, options?: InputOptions) {\n super(parent, { ...options });\n\n this.element = $<HTMLInputElement>('<input type=\"text\"/>').addClass(\"ks-input\");\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n\n if (options?.onChange) {\n this.element.on(\"change\", () => options.onChange?.(this.element[0].value));\n }\n\n if (options?.value) {\n this.element[0].value = options.value;\n }\n\n if (options?.selected) {\n this.element[0].selectionStart = 0;\n this.element[0].selectionEnd = -1;\n }\n\n this.element.on(\"keyup\", (event: JQuery.KeyUpEvent) => {\n switch (event.key) {\n case \"Enter\":\n options?.onEnter?.(this.element[0].value);\n break;\n case \"Escape\":\n options?.onEscape?.(this.element[0].value);\n break;\n }\n });\n }\n\n toString(): string {\n return `[${Input.name}#${this.componentId}]`;\n }\n}\n","import { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type ParagraphOptions = ThisType<Paragraph> &\n UiComponentOptions & {\n readonly classes?: Array<string>;\n };\n\nexport class Paragraph extends UiComponent {\n declare readonly options: ParagraphOptions;\n\n /**\n * Constructs a paragraph.\n *\n * @param host - A reference to the host.\n * @param text - The text inside the paragraph.\n * @param options - Options for the UI element.\n */\n constructor(parent: UiComponent, text: string, options?: ParagraphOptions) {\n super(parent, { ...options });\n\n this.element = $<HTMLParagraphElement>(\"<p/>\").text(text);\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n }\n\n toString(): string {\n return `[${Paragraph.name}#${this.componentId}]`;\n }\n}\n","import { coalesceArray } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { Button } from \"./Button.js\";\nimport stylesButton from \"./Button.module.css\";\nimport { Container } from \"./Container.js\";\nimport { Delimiter } from \"./Delimiter.js\";\nimport styles from \"./Dialog.module.css\";\nimport stylesExplainer from \"./ExplainerLiteItem.module.css\";\nimport { HeaderListItem } from \"./HeaderListItem.js\";\nimport { Input } from \"./Input.js\";\nimport { Paragraph } from \"./Paragraph.js\";\nimport stylesToolbarListItem from \"./ToolbarListItem.module.css\";\nimport { UiComponent, type UiComponentInterface, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type DialogOptions = ThisType<Dialog> &\n UiComponentOptions & {\n readonly hasCancel?: boolean;\n readonly hasClose?: boolean;\n readonly onCancel?: () => void;\n readonly onConfirm?: (result: string) => void;\n readonly prompt?: boolean;\n readonly promptValue?: string;\n };\n\nexport class Dialog extends UiComponent<HTMLDialogElement> {\n declare readonly options: DialogOptions;\n readonly container: Container;\n readonly head: Container;\n returnValue: string;\n\n /**\n * Constructs a dialog.\n *\n * @param host - A reference to the host.\n * @param options - Options for the dialog.\n */\n constructor(parent: UiComponent, options?: DialogOptions) {\n super(parent, { ...options });\n\n this.element = $<HTMLDialogElement>(\"<dialog/>\")\n .addClass(\"dialog\")\n .addClass(\"help\")\n .addClass(styles.dialog);\n\n if (options?.hasClose !== false) {\n this.addChild(\n new Button(parent, \"close\", null, {\n classes: [styles.close],\n onClick: () => {\n this.close();\n options?.onCancel?.();\n },\n }),\n );\n }\n\n this.returnValue = options?.promptValue ?? \"\";\n\n this.head = new Container(parent);\n this.container = new Container(parent);\n\n this.addChildren(\n coalesceArray([\n this.head,\n options?.prompt\n ? new Input(parent, {\n onChange: (value: string) => {\n this.returnValue = value;\n },\n onEnter: (value: string) => {\n this.returnValue = value;\n this.close();\n options.onConfirm?.(this.returnValue);\n },\n onEscape: (_value: string) => {\n this.close();\n options.onCancel?.();\n },\n selected: true,\n value: options.promptValue,\n })\n : undefined,\n this.container,\n new Delimiter(parent),\n new Container(parent, {\n classes: [stylesToolbarListItem.toolbar],\n }).addChildren(\n coalesceArray([\n new Button(parent, \"OK\", null, {\n classes: [stylesButton.large],\n onClick: () => {\n this.close();\n options?.onConfirm?.(this.returnValue);\n },\n }),\n options?.hasCancel\n ? new Button(parent, \"Cancel\", null, {\n classes: [stylesButton.large],\n onClick: () => {\n this.close();\n options.onCancel?.();\n },\n })\n : undefined,\n ]),\n ),\n ]),\n );\n }\n\n toString(): string {\n return `[${Dialog.name}#${this.componentId}]`;\n }\n\n addChildHead(child: UiComponentInterface): this {\n this.head.addChild(child);\n return this;\n }\n addChildrenHead(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.head.addChild(child);\n }\n return this;\n }\n\n addChildContent(child: UiComponent): this {\n this.container.addChild(child);\n return this;\n }\n addChildrenContent(children?: Iterable<UiComponentInterface>): this {\n for (const child of children ?? []) {\n this.container.addChild(child);\n }\n return this;\n }\n\n show() {\n $(\"#gamePageContainer\").append(this.element);\n this.element[0].show();\n }\n showModal() {\n $(\"#gamePageContainer\").append(this.element);\n this.element[0].showModal();\n }\n close() {\n this.element[0].close();\n this.element.remove();\n }\n\n static async prompt(\n parent: UiComponent,\n text: string,\n title?: string,\n initialValue?: string,\n explainer?: string,\n ): Promise<string | undefined> {\n return new Promise(resolve => {\n new Dialog(parent, {\n hasCancel: true,\n hasClose: false,\n onCancel: () => {\n resolve(undefined);\n },\n onConfirm: (result: string) => {\n resolve(result);\n },\n prompt: true,\n promptValue: initialValue,\n })\n .addChildrenHead(\n coalesceArray([\n title ? new HeaderListItem(parent, title) : undefined,\n new Paragraph(parent, text),\n ]),\n )\n .addChildrenContent(\n explainer\n ? [\n new Container(parent, {\n classes: [stylesExplainer.explainer],\n }).addChildren([new Paragraph(parent, explainer)]),\n ]\n : [],\n )\n .showModal();\n });\n }\n}\n","import type { SettingMax } from \"../../../settings/Settings.js\";\nimport { Button, type ButtonOptions } from \"../Button.js\";\nimport type { UiComponent } from \"../UiComponent.js\";\nimport styles from \"./MaxButton.module.css\";\n\nexport type MaxButtonOptions = ThisType<MaxButton> & ButtonOptions;\n\nexport class MaxButton extends Button {\n declare readonly options: MaxButtonOptions;\n readonly setting: SettingMax;\n\n constructor(parent: UiComponent, setting: SettingMax, options: MaxButtonOptions) {\n super(parent, \"\", null, {\n ...options,\n classes: [styles.maxButton, ...(options?.classes ?? [])],\n });\n\n this.setting = setting;\n }\n\n toString(): string {\n return `[${MaxButton.name}#${this.componentId}]`;\n }\n}\n","import type { SupportedLocale } from \"../../../Engine.js\";\nimport { Icons } from \"../../../images/Icons.js\";\nimport {\n type SettingOptions,\n type SettingThreshold,\n SettingTrigger,\n} from \"../../../settings/Settings.js\";\nimport { Button, type ButtonOptions } from \"../Button.js\";\nimport stylesButton from \"../Button.module.css\";\nimport type { UiComponent } from \"../UiComponent.js\";\n\nexport type TriggerButtonBehavior = \"integer\" | \"percentage\";\n\nexport type TriggerButtonOptions = ThisType<TriggerButton> &\n ButtonOptions & {\n readonly renderLabel?: boolean;\n };\n\nexport class TriggerButton extends Button {\n declare readonly options: TriggerButtonOptions;\n readonly behavior: TriggerButtonBehavior;\n readonly setting: SettingTrigger | SettingThreshold;\n\n constructor(\n parent: UiComponent,\n setting: SettingTrigger | SettingThreshold,\n _locale: SettingOptions<SupportedLocale>,\n options: TriggerButtonOptions,\n ) {\n super(parent, \"\", Icons.Trigger, {\n ...options,\n onRefresh: () => {\n const triggerValue =\n this.behavior === \"integer\"\n ? this.host.renderAbsolute(this.setting.trigger, \"invariant\")\n : this.host.renderPercentage(this.setting.trigger, \"invariant\", true);\n\n this.updateTitle(this.host.engine.i18n(\"ui.trigger\", [triggerValue]));\n if (this.options?.renderLabel ?? true) {\n this.updateLabel(triggerValue);\n }\n\n if (!this.inactive) {\n this.element.removeClass(stylesButton.inactive);\n } else {\n this.element.addClass(stylesButton.inactive);\n }\n\n options?.onRefresh?.call(this);\n },\n });\n\n this.behavior = setting instanceof SettingTrigger ? \"percentage\" : \"integer\";\n\n this.setting = setting;\n }\n\n toString(): string {\n return `[${TriggerButton.name}#${this.componentId}]`;\n }\n}\n","import type { SupportedLocale } from \"../../Engine.js\";\nimport type { SettingOptions, SettingTriggerMax } from \"../../settings/Settings.js\";\nimport stylesButton from \"./Button.module.css\";\nimport { MaxButton } from \"./buttons/MaxButton.js\";\nimport { TriggerButton } from \"./buttons/TriggerButton.js\";\nimport { Container } from \"./Container.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport { SettingListItem, type SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { SettingMaxListItemOptions } from \"./SettingMaxListItem.js\";\nimport type { SettingTriggerListItemOptions } from \"./SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingMaxTriggerListItemOptions = ThisType<SettingMaxTriggerListItem> &\n SettingListItemOptions &\n SettingMaxListItemOptions &\n SettingTriggerListItemOptions & {\n readonly renderLabelTrigger?: boolean;\n };\n\nexport class SettingMaxTriggerListItem extends SettingListItem<SettingTriggerMax> {\n declare readonly options: SettingMaxTriggerListItemOptions;\n readonly maxButton: MaxButton;\n readonly triggerButton: TriggerButton;\n\n constructor(\n parent: UiComponent,\n setting: SettingTriggerMax,\n locale: SettingOptions<SupportedLocale>,\n label: string,\n options: SettingMaxTriggerListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.maxButton = new MaxButton(parent, setting, {\n alignment: \"right\",\n border: false,\n classes: [stylesButton.headAction],\n onClick: async () => {\n await options.onSetMax.call(this);\n },\n onRefresh: options?.onRefreshMax ? () => options.onRefreshMax?.call(this) : undefined,\n });\n this.triggerButton = new TriggerButton(parent, setting, locale, {\n border: false,\n classes: [stylesButton.lastHeadAction],\n onClick: async () => {\n await options.onSetTrigger.call(this);\n },\n onRefresh: options?.onRefreshTrigger ? () => options.onRefreshTrigger?.call(this) : undefined,\n renderLabel: options?.renderLabelTrigger ?? true,\n });\n\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.maxButton,\n this.triggerButton,\n ]);\n }\n\n toString(): string {\n return `[${SettingMaxTriggerListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions, SettingTrigger, SettingTriggerMax } from \"../settings/Settings.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport {\n SettingMaxTriggerListItem,\n type SettingMaxTriggerListItemOptions,\n} from \"./components/SettingMaxTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport const BuildSectionTools = {\n getBuildOption: (\n parent: UiComponent,\n option: SettingTriggerMax,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: SettingTrigger,\n label: string,\n sectionLabel: string,\n options?: Partial<SettingMaxTriggerListItemOptions>,\n ) => {\n const onSetMax = async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.max.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.max.build.prompt\", [\n label,\n parent.host.renderAbsolute(option.max, locale.selected),\n ]),\n parent.host.renderAbsolute(option.max),\n parent.host.engine.i18n(\"ui.max.build.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.max = -1;\n return;\n }\n\n if (value === \"0\") {\n option.enabled = false;\n }\n\n option.max = parent.host.parseAbsolute(value) ?? option.max;\n };\n\n const element = new SettingMaxTriggerListItem(parent, option, locale, label, {\n delimiter: options?.delimiter,\n onCheck: async (isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.sub.enable\", [label]);\n if (option.max === 0 && !isBatchProcess) {\n await onSetMax();\n }\n await options?.onCheck?.(isBatchProcess);\n },\n onRefreshMax: () => {\n element.maxButton.updateLabel(parent.host.renderAbsolute(option.max));\n element.maxButton.element[0].title =\n option.max < 0\n ? parent.host.engine.i18n(\"ui.max.build.titleInfinite\", [label])\n : option.max === 0\n ? parent.host.engine.i18n(\"ui.max.build.titleZero\", [label])\n : parent.host.engine.i18n(\"ui.max.build.title\", [\n parent.host.renderAbsolute(option.max),\n label,\n ]);\n },\n onRefreshRequest: () => {\n element.maxButton.inactive = !option.enabled || option.max === -1;\n element.maxButton.ineffective =\n sectionSetting.enabled && option.enabled && option.max === 0;\n\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled &&\n option.enabled &&\n sectionSetting.trigger === -1 &&\n option.trigger === -1;\n },\n onRefreshTrigger: () => {\n element.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger\", [\n option.trigger < 0\n ? sectionSetting.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.build.blocked\", [sectionLabel])\n : `${parent.host.renderPercentage(sectionSetting.trigger, locale.selected, true)} (${parent.host.engine.i18n(\"ui.trigger.build.inherited\")})`\n : parent.host.renderPercentage(option.trigger, locale.selected, true),\n ]);\n },\n onSetMax,\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderPercentage(option.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.trigger.build.inherited\"),\n ]),\n option.trigger !== -1 ? parent.host.renderPercentage(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.build.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n return;\n }\n\n option.trigger = parent.host.parsePercentage(value);\n await options?.onSetTrigger?.call(this);\n },\n onUnCheck: (isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.sub.disable\", [label]);\n options?.onUnCheck?.(isBatchProcess);\n },\n renderLabelTrigger: options?.renderLabelTrigger,\n upgradeIndicator: options?.upgradeIndicator,\n });\n return element;\n },\n};\n","import type { SupportedLocale } from \"../../Engine.js\";\nimport type { SettingOptions, SettingThreshold, SettingTrigger } from \"../../settings/Settings.js\";\nimport { TriggerButton } from \"./buttons/TriggerButton.js\";\nimport { Container } from \"./Container.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport { SettingListItem, type SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingTriggerListItemOptions = ThisType<SettingTriggerListItem> &\n SettingListItemOptions & {\n readonly onRefreshTrigger?: () => void | Promise<void>;\n readonly onSetTrigger: () => void | Promise<void>;\n readonly renderLabelTrigger?: boolean;\n };\n\nexport class SettingTriggerListItem<\n TSetting extends SettingTrigger | SettingThreshold = SettingTrigger | SettingThreshold,\n> extends SettingListItem<TSetting> {\n declare readonly options: SettingTriggerListItemOptions;\n readonly triggerButton: TriggerButton;\n\n constructor(\n parent: UiComponent,\n setting: TSetting,\n locale: SettingOptions<SupportedLocale>,\n label: string,\n options: SettingTriggerListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.triggerButton = new TriggerButton(parent, setting, locale, {\n alignment: \"right\",\n border: false,\n onClick: async () => {\n await options.onSetTrigger.call(this);\n },\n onRefresh: options?.onRefreshTrigger ? () => options.onRefreshTrigger?.call(this) : undefined,\n renderLabel: options?.renderLabelTrigger ?? true,\n });\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.triggerButton,\n ]);\n }\n\n toString(): string {\n return `[${SettingTriggerListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import { coalesceArray, isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { BonfireSettings } from \"../settings/BonfireSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { Building, StagedBuilding } from \"../types/index.js\";\nimport { BuildingUpgradeSettingsUi } from \"./BuildingUpgradeSettingsUi.js\";\nimport { BuildSectionTools } from \"./BuildSectionTools.js\";\nimport { Delimiter } from \"./components/Delimiter.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class BonfireSettingsUi extends SettingsPanel<BonfireSettings, SettingTriggerListItem> {\n constructor(\n parent: UiComponent,\n settings: BonfireSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${BonfireSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.build\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger: () => {\n this.settingItem.triggerButton.element[0].title = parent.host.engine.i18n(\n \"ui.trigger.section\",\n [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ],\n );\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger < 0;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.buildings).some(_ => _.enabled && 0 < _.max && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(\n _ => _.enabled && (0 === _.max || (_.trigger < 0 && settings.trigger < 0)),\n );\n },\n },\n );\n\n // Post-super() child insertion, so we can use this._getBuildOptions().\n // We want the ability to use `this` in our callbacks, to construct more complex\n // usage scenarios where we need access to the entire UI section.\n this.addChildrenContent([\n new SettingsList(this, {\n onReset: () => {\n this.setting.load({ buildings: new BonfireSettings().buildings });\n },\n }).addChildren(\n coalesceArray(\n this.host.game.bld.buildingGroups.flatMap(buildingGroup => [\n new HeaderListItem(this, buildingGroup.title),\n ...buildingGroup.buildings.flatMap(building =>\n this._getBuildOptions(this, settings, locale, label, building),\n ),\n buildingGroup !==\n this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length - 1]\n ? new Delimiter(this)\n : undefined,\n ]),\n ),\n ),\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")),\n new SettingListItem(this, settings.gatherCatnip, this.host.engine.i18n(\"option.catnip\"), {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.catnip\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.catnip\"),\n ]);\n },\n }),\n new SettingListItem(\n this,\n settings.turnOnSteamworks,\n this.host.engine.i18n(\"option.steamworks\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.steamworks\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.steamworks\"),\n ]);\n },\n },\n ),\n new SettingListItem(\n this,\n settings.turnOnMagnetos,\n this.host.engine.i18n(\"option.magnetos\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.magnetos\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.magnetos\"),\n ]);\n },\n },\n ),\n new SettingListItem(\n this,\n settings.turnOnReactors,\n this.host.engine.i18n(\"option.reactors\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.reactors\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.reactors\"),\n ]);\n },\n },\n ),\n new BuildingUpgradeSettingsUi(this, settings.upgradeBuildings, locale, settings),\n ]),\n ]);\n }\n\n private _getBuildOptions(\n parent: UiComponent,\n settings: BonfireSettings,\n locale: SettingOptions<SupportedLocale>,\n sectionLabel: string,\n building: Building,\n ) {\n if (building === \"unicornPasture\" || isNil(settings.buildings[building])) {\n return [];\n }\n\n const meta = parent.host.game.bld.getBuildingExt(building).meta;\n if (!isNil(meta.stages)) {\n const name = Object.values(settings.buildings).find(item => item.baseBuilding === building)\n ?.building as StagedBuilding;\n return [\n BuildSectionTools.getBuildOption(\n parent,\n settings.buildings[building],\n locale,\n settings,\n meta.stages[0].label,\n sectionLabel,\n { renderLabelTrigger: false },\n ),\n BuildSectionTools.getBuildOption(\n parent,\n settings.buildings[name],\n locale,\n settings,\n meta.stages[1].label,\n sectionLabel,\n {\n renderLabelTrigger: false,\n upgradeIndicator: true,\n },\n ),\n ];\n }\n if (!isNil(meta.label)) {\n return [\n BuildSectionTools.getBuildOption(\n parent,\n settings.buildings[building],\n locale,\n settings,\n meta.label,\n sectionLabel,\n { renderLabelTrigger: false },\n ),\n ];\n }\n\n return [];\n }\n}\n","import type { EngineSettings } from \"../settings/EngineSettings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport { ExpandoButton } from \"./components/buttons/ExpandoButton.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class EngineSettingsUi extends SettingListItem {\n readonly expando: ExpandoButton;\n\n constructor(parent: UiComponent, settings: EngineSettings) {\n const label = ucfirst(parent.host.engine.i18n(\"ui.engine\"));\n super(parent, settings, label, {\n onCheck: () => {\n parent.host.engine.start(true);\n },\n onUnCheck: () => {\n parent.host.engine.stop(true);\n },\n });\n\n this.expando = new ExpandoButton(this);\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.expando,\n ]);\n }\n}\n","import { ListItem, type ListItemOptions } from \"./ListItem.js\";\nimport stylesListItem from \"./ListItem.module.css\";\nimport type { TextButton } from \"./TextButton.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type ButtonListItemOptions = ThisType<ButtonListItem> & ListItemOptions;\n\nexport class ButtonListItem extends ListItem {\n declare readonly options: ButtonListItemOptions;\n readonly button: TextButton;\n\n constructor(parent: UiComponent, button: TextButton, options?: ButtonListItemOptions) {\n super(parent, { ...options });\n\n this.button = button;\n\n this.element.addClass(stylesListItem.head);\n this.element.append(button.element);\n }\n}\n","import stylesDelimiter from \"./Delimiter.module.css\";\nimport styles from \"./Fieldset.module.css\";\nimport stylesLabel from \"./LabelListItem.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type FieldsetOptions = ThisType<Fieldset> &\n UiComponentOptions & {\n readonly delimiter?: boolean;\n };\n\nexport class Fieldset extends UiComponent {\n declare readonly options: FieldsetOptions;\n\n /**\n * Constructs a `Fieldset`.\n *\n * @param host A reference to the host.\n * @param label The label on the fieldset.\n * @param options Options for the fieldset.\n */\n constructor(parent: UiComponent, label: string, options?: FieldsetOptions) {\n super(parent, { ...options });\n\n this.element = $(\"<fieldset/>\").addClass(styles.fieldset);\n if (options?.delimiter) {\n this.element.addClass(stylesDelimiter.delimiter);\n }\n const legend = $(\"<legend/>\").text(label).addClass(stylesLabel.label);\n this.element.append(legend);\n }\n\n toString(): string {\n return `[${Fieldset.name}#${this.componentId}]`;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SettingOptions } from \"../../settings/Settings.js\";\nimport stylesDelimiter from \"./Delimiter.module.css\";\nimport stylesLabel from \"./LabelListItem.module.css\";\nimport stylesSettingListItem from \"./SettingListItem.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type RadioItemOptions = ThisType<RadioItem> &\n UiComponentOptions & {\n /**\n * Will be invoked when the user selects this radio item.\n */\n onCheck?: (isBatchProcess?: boolean) => void;\n\n /**\n * Should there be additional padding below this element?\n */\n delimiter?: boolean;\n\n /**\n * Should an indicator be rendered in front of the element,\n * to indicate that this is an upgrade of a prior setting?\n */\n upgradeIndicator?: boolean;\n\n /**\n * Should the user be prevented from changing the value of the input?\n */\n readOnly?: boolean;\n };\n\nexport class RadioItem<TSetting extends SettingOptions = SettingOptions> extends UiComponent {\n declare readonly options: RadioItemOptions;\n readonly setting: TSetting;\n readonly option: TSetting[\"options\"][0];\n readonly elementLabel: JQuery<HTMLLabelElement>;\n readonly input: JQuery;\n\n readOnly: boolean;\n\n /**\n * Construct a new radio setting element.\n * This is a radio input that is expected to be hosted in a `Fieldset`.\n *\n * @param host The userscript instance.\n * @param setting The setting this element is linked to.\n * @param option The specific option out of the setting that this radio item represents.\n * @param groupKey A unique name for the group of radio items this one belongs to.\n * @param options Options for this radio item.\n */\n constructor(\n parent: UiComponent,\n setting: TSetting,\n option: TSetting[\"options\"][0],\n groupKey: string,\n options?: RadioItemOptions,\n ) {\n super(parent, {\n ...options,\n onRefresh: () => {\n this.input.prop(\"disabled\", this.readOnly);\n },\n });\n\n this.element = $(\"<div/>\");\n this.element.addClass(stylesSettingListItem.setting);\n\n if (options?.delimiter === true) {\n this.element.addClass(stylesDelimiter.delimiter);\n }\n\n this.elementLabel = $<HTMLLabelElement>(\"<label/>\", {\n text: `${options?.upgradeIndicator ? \"⮤ \" : \"\"}${option.label}`,\n }).addClass(stylesLabel.label);\n\n const input = $(\"<input/>\", {\n name: groupKey,\n type: \"radio\",\n }).addClass(\"ks-radio\");\n\n this.readOnly = options?.readOnly ?? false;\n\n input.on(\"change\", () => {\n this.setting.selected = option.value;\n if (!isNil(options?.onCheck)) {\n options.onCheck();\n }\n });\n\n this.elementLabel.prepend(input);\n this.element.append(this.elementLabel);\n\n this.input = input;\n this.setting = setting;\n this.option = option;\n }\n\n toString(): string {\n return `[${RadioItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import type { SettingOptions } from \"../../settings/Settings.js\";\nimport { Fieldset } from \"./Fieldset.js\";\nimport { RadioItem } from \"./RadioItem.js\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type OptionsListItemOptions = ThisType<OptionsListItem> &\n UiComponentOptions & {\n readonly onCheck?: (isBatchProcess?: boolean) => void;\n readonly readOnly?: boolean;\n };\n\nexport class OptionsListItem<TSetting extends SettingOptions = SettingOptions> extends UiComponent {\n declare readonly options: OptionsListItemOptions;\n readonly fieldset: Fieldset;\n readonly setting: TSetting;\n readonly _items: Array<RadioItem>;\n\n /**\n * Construct a new options setting element.\n * This is a list of options, where the selected option will be put into the setting.\n *\n * @param host The userscript instance.\n * @param label The label on the setting element.\n * @param setting The setting this element is linked to.\n * @param options Options for the list item.\n */\n constructor(\n parent: UiComponent,\n label: string,\n setting: TSetting,\n options?: OptionsListItemOptions,\n ) {\n super(parent, {\n ...options,\n onRefresh: () => {\n for (const option of this._items) {\n if (option.option.value === this.setting.selected) {\n option.input.prop(\"checked\", true);\n break;\n }\n }\n options?.onRefresh?.();\n },\n });\n\n this.element = $(\"<li/>\");\n\n this.fieldset = new Fieldset(parent, label);\n this.addChild(this.fieldset);\n\n this._items = new Array<RadioItem>();\n for (const option of setting.options) {\n this._items.push(\n new RadioItem(parent, setting, option, label, {\n onCheck: options?.onCheck,\n readOnly: options?.readOnly,\n }),\n );\n }\n this.fieldset.addChildren(this._items);\n\n this.setting = setting;\n }\n\n toString(): string {\n return `[${OptionsListItem.name}#${this.componentId}]`;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport stylesButton from \"./Button.module.css\";\nimport styles from \"./TextButton.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type TextButtonOptions = ThisType<TextButton> &\n UiComponentOptions & {\n readonly title?: string;\n readonly onClick?: (event?: MouseEvent) => void | Promise<void>;\n };\n\nexport class TextButton extends UiComponent {\n declare readonly options: TextButtonOptions;\n readOnly: boolean;\n\n constructor(parent: UiComponent, label?: string, options?: TextButtonOptions) {\n super(parent, {\n ...options,\n onRefresh: () => {\n if (this.readOnly) {\n this.element.addClass(stylesButton.readonly);\n } else {\n this.element.removeClass(stylesButton.readonly);\n }\n\n options?.onRefresh?.call(this);\n },\n });\n\n this.element = $(\"<div/>\").addClass(styles.textButton);\n if (label !== undefined) {\n this.element.text(label);\n }\n\n const title = options?.title;\n if (!isNil(title)) {\n this.element.prop(\"title\", title);\n }\n\n this.readOnly = false;\n\n this.element.on(\"click\", () => {\n if (this.readOnly) {\n return;\n }\n\n this.click().catch(redirectErrorsToConsole(console));\n });\n }\n\n toString(): string {\n return `[${TextButton.name}#${this.componentId}]`;\n }\n\n async click() {\n if (this.readOnly) {\n return;\n }\n\n await this.options?.onClick?.call(this);\n\n this.requestRefresh();\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport { ksVersion } from \"../KittenScientists.js\";\nimport type { EngineSettings } from \"../settings/EngineSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { ButtonListItem } from \"./components/ButtonListItem.js\";\nimport { Container } from \"./components/Container.js\";\nimport { Delimiter } from \"./components/Delimiter.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { LabelListItem } from \"./components/LabelListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { OptionsListItem } from \"./components/OptionsListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport stylesSettingListItem from \"./components/SettingListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { TextButton } from \"./components/TextButton.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class InternalsUi extends SettingsPanel<EngineSettings> {\n constructor(\n parent: UiComponent,\n settings: EngineSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${InternalsUi.name}`));\n\n super(\n parent,\n settings,\n new LabelListItem(parent, parent.host.engine.i18n(\"ui.internals\"), {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: Icons.Settings,\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n );\n\n this.addChildrenContent([\n new SettingsList(parent, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new ButtonListItem(\n parent,\n new TextButton(\n parent,\n parent.host.engine.i18n(\"ui.internals.interval\", [settings.interval]),\n {\n onClick: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.internals.interval.prompt\"),\n parent.host.engine.i18n(\"ui.internals.interval.promptTitle\", [\n parent.host.renderAbsolute(settings.interval, locale.selected),\n ]),\n parent.host.renderAbsolute(settings.interval),\n parent.host.engine.i18n(\"ui.internals.interval.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n if (value === \"0\") {\n settings.enabled = false;\n }\n\n settings.interval = parent.host.parseAbsolute(value) ?? settings.interval;\n },\n onRefresh() {\n this.element.text(\n parent.host.engine.i18n(\"ui.internals.interval\", [settings.interval]),\n );\n },\n },\n ),\n ),\n new Delimiter(parent),\n\n new SettingListItem(parent, settings.ksColumn, parent.host.engine.i18n(\"ui.ksColumn\"), {\n onCheck: () => {\n parent.host.rebuildUi();\n },\n onUnCheck: () => {\n parent.host.rebuildUi();\n },\n }),\n new Delimiter(parent),\n\n new OptionsListItem(parent, parent.host.engine.i18n(\"ui.language\"), settings.locale, {\n onCheck: () => {\n parent.host.rebuildUi();\n },\n }),\n new Delimiter(parent),\n\n new LabelListItem(parent, `Kitten Scientists ${ksVersion(\"v\")}`),\n ]),\n ]);\n }\n}\n","import type { TranslatedString } from \"../../Engine.js\";\nimport styles from \"./ExplainerLiteItem.module.css\";\nimport { UiComponent, type UiComponentOptions } from \"./UiComponent.js\";\n\nexport type ExplainerListItemOptions<TKittenGameLiteral extends `$${string}`> = UiComponentOptions &\n ThisType<ExplainerListItem<TKittenGameLiteral>>;\n\nexport class ExplainerListItem<TKittenGameLiteral extends `$${string}`> extends UiComponent {\n declare readonly options: ExplainerListItemOptions<TKittenGameLiteral>;\n\n /**\n * Construct an element to explain an area of the UI.\n * This is purely for cosmetic/informational value in the UI.\n *\n * @param host - A reference to the host.\n * @param key - The i18n key for the text to appear on the element.\n * @param options - Options for this explainer.\n */\n constructor(\n parent: UiComponent,\n key: TranslatedString<TKittenGameLiteral>,\n options?: ExplainerListItemOptions<TKittenGameLiteral>,\n ) {\n super(parent, { ...options });\n\n this.element = $(\"<li/>\", { text: parent.host.engine.i18n(key) }).addClass(styles.explainer);\n }\n\n toString(): string {\n return `[${ExplainerListItem.name}#${this.componentId}]`;\n }\n}\n","import { FilterItems, type LogFilterSettings } from \"../settings/LogFilterSettings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { Container } from \"./components/Container.js\";\nimport { ExplainerListItem } from \"./components/ExplainerListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class LogFiltersSettingsUi extends SettingsPanel<LogFilterSettings> {\n constructor(parent: UiComponent, settings: LogFilterSettings) {\n console.debug(...cl(`Constructing ${LogFiltersSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.filter\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n );\n\n this.addChildContent(\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new SettingListItem(this, settings.disableKGLog, this.host.engine.i18n(\"filter.allKG\")),\n ]),\n );\n\n const listFilters = new SettingsList(this).addChildren(\n FilterItems.map(item => {\n return { label: this.host.engine.i18n(`filter.${item}`), name: item };\n })\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(\n item =>\n new SettingListItem(this, this.setting.filters[item.name], item.label, {\n onCheck: () => {\n this.host.engine.imessage(\"filter.enable\", [item.label]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"filter.disable\", [item.label]);\n },\n }),\n ),\n );\n this.addChildContent(listFilters);\n\n this.addChildContent(new ExplainerListItem(this, \"filter.explainer\"));\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { ReligionSettings } from \"../settings/ReligionSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { ReligionOptions, UnicornItems, type ZigguratUpgrade } from \"../types/index.js\";\nimport { BuildSectionTools } from \"./BuildSectionTools.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Delimiter } from \"./components/Delimiter.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport type { SettingMaxTriggerListItem } from \"./components/SettingMaxTriggerListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport stylesTimeSkipHeatSettings from \"./TimeSkipHeatSettingsUi.module.css\";\n\nexport class ReligionSettingsUi extends SettingsPanel<ReligionSettings, SettingTriggerListItem> {\n private readonly _unicornBuildings: Map<\n ZigguratUpgrade | \"unicornPasture\",\n SettingMaxTriggerListItem\n >;\n private readonly _bestUnicornBuilding: SettingListItem;\n\n constructor(\n parent: UiComponent,\n settings: ReligionSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${ReligionSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.faith\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger.section\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefresh: () => {\n for (const [buildingName, building] of this._unicornBuildings.entries()) {\n building.elementLabel.attr(\"data-ks-active-from\", \"❊\");\n building.elementLabel.attr(\"data-ks-active-to\", \"✮\");\n\n if (\n this.setting.bestUnicornBuilding.enabled &&\n this.setting.bestUnicornBuildingCurrent === buildingName\n ) {\n building.elementLabel.addClass(stylesTimeSkipHeatSettings.active);\n } else {\n building.elementLabel.removeClass(stylesTimeSkipHeatSettings.active);\n }\n }\n },\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.buildings).some(_ => _.enabled && 0 < _.max && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(\n _ => _.enabled && (0 === _.max || (_.trigger < 0 && settings.trigger < 0)),\n );\n\n for (const [_, building] of this._unicornBuildings.entries()) {\n building.readOnly = this._bestUnicornBuilding.setting.enabled;\n building.maxButton.readOnly = this._bestUnicornBuilding.setting.enabled;\n building.triggerButton.readOnly = this._bestUnicornBuilding.setting.enabled;\n }\n },\n },\n );\n\n const unicornsArray: Array<ZigguratUpgrade | \"unicornPasture\"> = [...UnicornItems];\n\n this._unicornBuildings = new Map([\n [\n \"unicornPasture\",\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings.unicornPasture,\n locale,\n this.setting,\n this.host.engine.i18n(\"$buildings.unicornPasture.label\"),\n label,\n { renderLabelTrigger: false },\n ),\n ],\n ...this.host.game.religion.zigguratUpgrades\n .filter(\n item => unicornsArray.includes(item.name) && !isNil(this.setting.buildings[item.name]),\n )\n .map(\n zigguratUpgrade =>\n [\n zigguratUpgrade.name,\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[zigguratUpgrade.name],\n locale,\n this.setting,\n zigguratUpgrade.label,\n label,\n { renderLabelTrigger: false },\n ),\n ] as [ZigguratUpgrade | \"unicornPasture\", SettingMaxTriggerListItem],\n ),\n ]);\n\n this._bestUnicornBuilding = new SettingListItem(\n this,\n this.setting.bestUnicornBuilding,\n this.host.engine.i18n(\"option.faith.best.unicorn\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.faith.best.unicorn\"),\n ]);\n for (const building of this._unicornBuildings.values()) {\n building.setting.enabled = true;\n building.setting.max = -1;\n building.setting.trigger = -1;\n }\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.faith.best.unicorn\"),\n ]);\n },\n upgradeIndicator: true,\n },\n );\n\n this.addChildrenContent([\n new SettingsList(this, {\n onReset: () => {\n const defaults = new ReligionSettings();\n this.setting.load({\n bestUnicornBuilding: defaults.bestUnicornBuilding,\n buildings: defaults.buildings,\n });\n },\n }).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.ziggurat.label\")),\n ...this._unicornBuildings.values(),\n this._bestUnicornBuilding,\n new Delimiter(this),\n\n ...this.host.game.religion.zigguratUpgrades\n .filter(\n item => !unicornsArray.includes(item.name) && !isNil(this.setting.buildings[item.name]),\n )\n .map(upgrade =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n this.setting,\n upgrade.label,\n label,\n { renderLabelTrigger: false },\n ),\n ),\n new Delimiter(this),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.orderOfTheSun.label\")),\n ...this.host.game.religion.religionUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(upgrade =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n this.setting,\n upgrade.label,\n label,\n {\n delimiter: upgrade.name === this.host.game.religion.religionUpgrades.at(-1)?.name,\n renderLabelTrigger: false,\n },\n ),\n ),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.cryptotheology.label\")),\n ...this.host.game.religion.transcendenceUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(upgrade =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n this.setting,\n upgrade.label,\n label,\n { renderLabelTrigger: false },\n ),\n ),\n ]),\n\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")),\n ...ReligionOptions.map(item => {\n const label = this.host.engine.i18n(`option.faith.${item}`);\n if (item === \"transcend\") {\n return new SettingListItem(this, this.setting[item], label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [label]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n });\n }\n\n const element = new SettingTriggerListItem(this, this.setting[item], locale, label, {\n classes: [stylesButton.lastHeadAction],\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [label]);\n },\n onRefresh: () => {\n element.triggerButton.inactive =\n !this.setting[item].enabled || this.setting[item].trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\n element.triggerButton.behavior === \"integer\"\n ? \"ui.trigger.setinteger\"\n : \"ui.trigger.setpercentage\",\n [label],\n ),\n this.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n element.triggerButton.behavior === \"integer\"\n ? this.host.renderAbsolute(this.setting[item].trigger, locale.selected)\n : this.host.renderPercentage(this.setting[item].trigger, locale.selected, true),\n ]),\n element.triggerButton.behavior === \"integer\"\n ? this.host.renderAbsolute(this.setting[item].trigger)\n : this.host.renderPercentage(this.setting[item].trigger),\n this.host.engine.i18n(\n element.triggerButton.behavior === \"integer\"\n ? \"ui.trigger.setinteger.promptExplainer\"\n : \"ui.trigger.setpercentage.promptExplainer\",\n ),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n this.setting[item].trigger =\n (element.triggerButton.behavior === \"integer\"\n ? this.host.parseAbsolute(value)\n : this.host.parsePercentage(value)) ?? this.setting[item].trigger;\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }),\n ]),\n ]);\n }\n}\n","import type { SupportedLocale } from \"../../../Engine.js\";\nimport { Icons } from \"../../../images/Icons.js\";\nimport type { ResourcesSettingsItem } from \"../../../settings/ResourcesSettings.js\";\nimport type { SettingOptions } from \"../../../settings/Settings.js\";\nimport { Button, type ButtonOptions } from \"../Button.js\";\nimport stylesButton from \"../Button.module.css\";\nimport { Dialog } from \"../Dialog.js\";\nimport type { UiComponent } from \"../UiComponent.js\";\n\nexport type ConsumeButtonOptions = ThisType<ConsumeButton> & ButtonOptions;\n\nexport class ConsumeButton extends Button {\n declare readonly options: ConsumeButtonOptions;\n readonly setting: ResourcesSettingsItem;\n readonly resourceName: string;\n\n constructor(\n parent: UiComponent,\n setting: ResourcesSettingsItem,\n locale: SettingOptions<SupportedLocale>,\n resourceName: string,\n options: Omit<ConsumeButtonOptions, \"onClick\">,\n ) {\n super(parent, \"\", Icons.DataUsage, {\n ...options,\n onClick: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"resources.consume.prompt\"),\n parent.host.engine.i18n(\"resources.consume.promptTitle\", [\n resourceName,\n parent.host.renderPercentage(setting.consume, locale.selected, true),\n ]),\n parent.host.renderPercentage(setting.consume),\n parent.host.engine.i18n(\"resources.consume.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n setting.consume = parent.host.parsePercentage(value);\n },\n onRefresh: () => {\n const consumeValue = this.host.renderPercentage(\n this.setting.consume,\n this.host.engine.settings.locale.selected,\n true,\n );\n const title =\n this.setting.consume === 0\n ? this.host.engine.i18n(\"resources.consume.titleZero\", [this.resourceName])\n : this.host.engine.i18n(\"resources.consume.title\", [consumeValue, this.resourceName]);\n this.updateTitle(title);\n\n options?.onRefresh?.();\n },\n });\n\n this.element.addClass(stylesButton.consumeButton);\n\n this.resourceName = resourceName;\n this.setting = setting;\n }\n\n toString(): string {\n return `[${ConsumeButton.name}#${this.componentId}]`;\n }\n}\n","import type { SupportedLocale } from \"../../../Engine.js\";\nimport type { ResourcesSettingsItem } from \"../../../settings/ResourcesSettings.js\";\nimport type { SettingOptions } from \"../../../settings/Settings.js\";\nimport { Button, type ButtonOptions } from \"../Button.js\";\nimport stylesButton from \"../Button.module.css\";\nimport { Dialog } from \"../Dialog.js\";\nimport type { UiComponent } from \"../UiComponent.js\";\n\nexport type StockButtonOptions = ThisType<StockButton> & ButtonOptions;\n\nexport class StockButton extends Button {\n declare readonly options: StockButtonOptions;\n readonly setting: ResourcesSettingsItem;\n readonly resourceName: string;\n\n constructor(\n parent: UiComponent,\n setting: ResourcesSettingsItem,\n locale: SettingOptions<SupportedLocale>,\n resourceName: string,\n options: Omit<StockButtonOptions, \"onClick\">,\n ) {\n super(parent, \"\", null, {\n ...options,\n onClick: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"resources.stock.prompt\"),\n parent.host.engine.i18n(\"resources.stock.promptTitle\", [\n resourceName,\n parent.host.renderAbsolute(setting.stock, locale.selected),\n ]),\n parent.host.renderAbsolute(setting.stock),\n parent.host.engine.i18n(\"resources.stock.promptExplainer\"),\n );\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n setting.stock = -1;\n return;\n }\n\n if (value === \"0\") {\n setting.enabled = false;\n }\n\n setting.stock = parent.host.parseAbsolute(value) ?? setting.stock;\n },\n onRefresh: () => {\n const stockValue = this.host.renderAbsolute(this.setting.stock);\n const title =\n this.setting.stock < 0\n ? this.host.engine.i18n(\"resources.stock.titleInfinite\", [this.resourceName])\n : this.setting.stock === 0\n ? this.host.engine.i18n(\"resources.stock.titleZero\", [this.resourceName])\n : this.host.engine.i18n(\"resources.stock.title\", [\n this.host.renderAbsolute(this.setting.stock),\n this.resourceName,\n ]);\n this.updateTitle(title);\n this.updateLabel(stockValue);\n },\n });\n\n this.element.addClass(stylesButton.stockButton);\n\n this.resourceName = resourceName;\n this.setting = setting;\n }\n\n toString(): string {\n return `[${StockButton.name}#${this.componentId}]`;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResourcesSettings, ResourcesSettingsItem } from \"../settings/ResourcesSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { Resource } from \"../types/index.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { ConsumeButton } from \"./components/buttons/ConsumeButton.js\";\nimport { StockButton } from \"./components/buttons/StockButton.js\";\nimport { Container } from \"./components/Container.js\";\nimport { LabelListItem } from \"./components/LabelListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport stylesSettingListItem from \"./components/SettingListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResourcesSettingsUi extends SettingsPanel<ResourcesSettings> {\n constructor(\n parent: UiComponent,\n settings: ResourcesSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${ResourcesSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.resources\");\n super(\n parent,\n settings,\n new LabelListItem(parent, label, {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: Icons.Resources,\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n );\n\n const ignoredResources: Array<Resource> = [\n \"blackcoin\",\n \"burnedParagon\",\n \"elderBox\",\n \"gflops\",\n \"hashrates\",\n \"kittens\",\n \"paragon\",\n \"temporalFlux\",\n \"wrappingPaper\",\n \"zebras\",\n ];\n\n this.addChildContent(\n new SettingsList(this).addChildren(\n this.host.game.resPool.resources\n .filter(\n item =>\n !ignoredResources.includes(item.name) && !isNil(this.setting.resources[item.name]),\n )\n .sort((a, b) => a.title.localeCompare(b.title, locale.selected))\n .map(\n resource => [this.setting.resources[resource.name], ucfirst(resource.title)] as const,\n )\n .map(([setting, title]) => this._makeResourceSetting(this, setting, locale, title)),\n ),\n );\n }\n\n /**\n * Creates a UI element that reflects stock and consume values for a given resource.\n * This is currently only used for the craft section.\n *\n * @param label The title to apply to the option.\n * @param option The option that is being controlled.\n * @returns A new option with stock and consume values.\n */\n private _makeResourceSetting(\n parent: UiComponent,\n option: ResourcesSettingsItem,\n locale: SettingOptions<SupportedLocale>,\n label: string,\n ) {\n const element = new SettingListItem(parent, option, label, {\n onCheck: () => {\n parent.host.engine.imessage(\"status.resource.enable\", [label]);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.resource.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n // How many items to stock.\n const stockElement = new StockButton(parent, option, locale, label, {\n alignment: \"right\",\n border: false,\n classes: [stylesButton.headAction],\n onRefreshRequest: () => {\n stockElement.inactive = !option.enabled || option.stock === 0;\n },\n });\n element.head.addChild(stockElement);\n\n // The consume rate for the resource.\n const consumeElement = new ConsumeButton(parent, option, locale, label, {\n border: false,\n classes: [stylesButton.lastHeadAction],\n onRefreshRequest: () => {\n consumeElement.inactive = !option.enabled || option.consume !== 100;\n consumeElement.ineffective = option.enabled && option.consume === 0;\n },\n });\n element.head.addChild(consumeElement);\n\n return element;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { PolicySettings } from \"../settings/PolicySettings.js\";\nimport type { ScienceSettings } from \"../settings/ScienceSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class PolicySettingsUi extends SettingsPanel<PolicySettings> {\n constructor(\n parent: UiComponent,\n settings: PolicySettings,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ScienceSettings,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrade.policies\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefreshRequest: () => {\n this.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.policies).some(policy => policy.enabled);\n },\n },\n );\n\n const policies = this.host.game.science.policies.filter(\n policy => !isNil(this.setting.policies[policy.name]),\n );\n\n const items = [];\n let lastLabel = policies[0].label;\n for (const policy of policies.sort((a, b) => a.label.localeCompare(b.label, locale.selected))) {\n const option = this.setting.policies[policy.name];\n\n const element = new SettingListItem(this, option, policy.label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [policy.label]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [policy.label]);\n },\n });\n\n if (this.host.engine.localeSupportsFirstLetterSplits(locale.selected)) {\n if (lastLabel[0] !== policy.label[0]) {\n element.element.addClass(stylesLabelListItem.splitter);\n }\n }\n\n items.push(element);\n\n lastLabel = policy.label;\n }\n\n this.addChildContent(new SettingsList(this).addChildren(items));\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { ScienceSettings } from \"../settings/ScienceSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { TechSettings } from \"../settings/TechSettings.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class TechSettingsUi extends SettingsPanel<TechSettings, SettingTriggerListItem> {\n constructor(\n parent: UiComponent,\n settings: TechSettings,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ScienceSettings,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrade.techs\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n settings.trigger === -1 &&\n !Object.values(settings.techs).some(tech => tech.enabled && 0 <= tech.trigger);\n\n this.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.techs).some(tech => tech.enabled);\n },\n },\n );\n\n const techs = this.host.game.science.techs.filter(\n tech => !isNil(this.setting.techs[tech.name]),\n );\n\n const items = [];\n let lastLabel = techs[0].label;\n for (const tech of techs.sort((a, b) => a.label.localeCompare(b.label, locale.selected))) {\n const option = this.setting.techs[tech.name];\n\n const element = new SettingTriggerListItem(this, option, locale, tech.label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [tech.label]);\n },\n onRefresh: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n option.enabled &&\n settings.trigger === -1 &&\n option.trigger === -1;\n },\n onRefreshTrigger: () => {\n element.triggerButton.element[0].title = this.host.engine.i18n(\"ui.trigger\", [\n option.trigger < 0\n ? settings.trigger < 0\n ? this.host.engine.i18n(\"ui.trigger.section.blocked\", [label])\n : `${this.host.renderPercentage(settings.trigger, locale.selected, true)} (${this.host.engine.i18n(\"ui.trigger.section.inherited\")})`\n : this.host.renderPercentage(option.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n this.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n option.trigger !== -1\n ? this.host.renderPercentage(option.trigger, locale.selected, true)\n : this.host.engine.i18n(\"ui.trigger.section.inherited\"),\n ]),\n option.trigger !== -1 ? this.host.renderPercentage(option.trigger) : \"\",\n this.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n return;\n }\n\n option.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [tech.label]);\n },\n renderLabelTrigger: false,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n\n if (this.host.engine.localeSupportsFirstLetterSplits(locale.selected)) {\n if (lastLabel[0] !== tech.label[0]) {\n element.element.addClass(stylesLabelListItem.splitter);\n }\n }\n\n items.push(element);\n\n lastLabel = tech.label;\n }\n\n this.addChildContent(new SettingsList(this).addChildren(items));\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { ScienceSettings } from \"../settings/ScienceSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { PolicySettingsUi } from \"./PolicySettingsUi.js\";\nimport { TechSettingsUi } from \"./TechSettingsUi.js\";\n\nexport class ScienceSettingsUi extends SettingsPanel<ScienceSettings> {\n private readonly _policiesUi: PolicySettingsUi;\n private readonly _techsUi: TechSettingsUi;\n private readonly _observeStars: SettingListItem;\n\n constructor(\n parent: UiComponent,\n settings: ScienceSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${ScienceSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.upgrade\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefresh: () => {\n if (this.setting.observe.enabled) {\n $(\"#observeButton\").hide();\n } else {\n $(\"#observeButton\").show();\n }\n },\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n ((this.setting.policies.enabled && this._policiesUi.expando.ineffective) ||\n (this.setting.techs.enabled &&\n (this._techsUi.expando.ineffective ||\n this._techsUi.settingItem.triggerButton.ineffective)));\n },\n },\n );\n\n this._policiesUi = new PolicySettingsUi(this, settings.policies, locale, settings);\n this._techsUi = new TechSettingsUi(this, settings.techs, locale, settings);\n\n this._observeStars = new SettingListItem(\n this,\n this.setting.observe,\n this.host.engine.i18n(\"option.observe\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [this.host.engine.i18n(\"option.observe\")]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.observe\"),\n ]);\n },\n },\n );\n\n const itemsList = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n itemsList.addChildren([this._techsUi, this._policiesUi, this._observeStars]);\n this.addChildContent(itemsList);\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { MissionSettings } from \"../settings/MissionSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { SpaceSettings } from \"../settings/SpaceSettings.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class MissionSettingsUi extends SettingsPanel<MissionSettings> {\n private readonly _missions: Array<SettingListItem>;\n\n constructor(\n parent: UiComponent,\n settings: MissionSettings,\n _locale: SettingOptions<SupportedLocale>,\n sectionSetting: SpaceSettings,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrade.missions\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefresh: () => {\n this.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.missions).some(mission => mission.enabled);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n );\n\n // Missions should be sorted by KG. For example, when going to the sun just choose the top five Checkbox instead of looking through the list\n this._missions = this.host.game.space.programs\n .filter(item => !isNil(this.setting.missions[item.name]))\n .map(\n mission =>\n new SettingListItem(this, this.setting.missions[mission.name], mission.label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [mission.label]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [mission.label]);\n },\n }),\n );\n\n const itemsList = new SettingsList(this).addChildren(this._missions);\n this.addChildContent(itemsList);\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { SpaceSettings } from \"../settings/SpaceSettings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { BuildSectionTools } from \"./BuildSectionTools.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { MissionSettingsUi } from \"./MissionSettingsUi.js\";\n\nexport class SpaceSettingsUi extends SettingsPanel<SpaceSettings, SettingTriggerListItem> {\n private readonly _missionsUi: MissionSettingsUi;\n\n constructor(\n parent: UiComponent,\n settings: SpaceSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${SpaceSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.space\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger.section\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.buildings).some(_ => _.enabled && 0 < _.max && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled &&\n (Object.values(settings.buildings).some(\n _ => _.enabled && (0 === _.max || (_.trigger < 0 && settings.trigger < 0)),\n ) ||\n (!Object.values(settings.buildings).some(_ => _.enabled) &&\n !settings.unlockMissions.enabled) ||\n this._missionsUi.expando.ineffective);\n },\n },\n );\n\n this.addChildContent(\n new SettingsList(this, {\n onReset: () => {\n this.setting.load({ buildings: new SpaceSettings().buildings });\n },\n }).addChildren(\n this.host.game.space.planets\n .filter(planet => 0 < planet.buildings.length)\n .flatMap((planet, indexPlanet, arrayPlant) => [\n new HeaderListItem(this, this.host.engine.labelForPlanet(planet.name)),\n ...planet.buildings\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map((building, indexBuilding, arrayBuilding) =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[building.name],\n locale,\n this.setting,\n building.label,\n label,\n {\n delimiter:\n indexPlanet < arrayPlant.length - 1 &&\n indexBuilding === arrayBuilding.length - 1,\n renderLabelTrigger: false,\n },\n ),\n ),\n ]),\n ),\n );\n\n const listAddition = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n listAddition.addChild(new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")));\n\n this._missionsUi = new MissionSettingsUi(\n this,\n this.setting.unlockMissions,\n locale,\n this.setting,\n );\n listAddition.addChild(this._missionsUi);\n this.addChildContent(listAddition);\n }\n}\n","import { AbstractError } from \"./AbstractError.js\";\n/**\n * Used when the user supplied an argument that is not valid in the current\n * context.\n */\nexport class InvalidArgumentError extends AbstractError {\n /**\n * Constructs a new {@linkcode InvalidArgumentError}.\n * @param message - The main error message.\n * @param status - The HTTP status code to return.\n */\n constructor(message, status = 400) {\n super(\"ERR_OS_INVALID_ARGUMENT\", message, status);\n this.name = \"InvalidArgumentError\";\n if (typeof Error.captureStackTrace !== \"undefined\") {\n // Capture a new stacktrace, otherwise it will include our base-class\n // constructor instead of the code location we're actually interested in.\n Error.captureStackTrace(this, InvalidArgumentError);\n }\n }\n}\n//# sourceMappingURL=InvalidArgumentError.js.map","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name constructNow\n * @category Generic Helpers\n * @summary Constructs a new current date using the passed value constructor.\n * @pure false\n *\n * @description\n * The function constructs a new current date using the constructor from\n * the reference date. It helps to build generic functions that accept date\n * extensions and use the current date.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @param date - The reference date to take constructor from\n *\n * @returns Current date initialized using the given date constructor\n *\n * @example\n * import { constructNow, isSameDay } from 'date-fns'\n *\n * function isToday<DateType extends Date>(\n * date: DateArg<DateType>,\n * ): boolean {\n * // If we were to use `new Date()` directly, the function would behave\n * // differently in different timezones and return false for the same date.\n * return isSameDay(date, constructNow(date));\n * }\n */\nexport function constructNow(date) {\n return constructFrom(date, Date.now());\n}\n\n// Fallback for modularized imports:\nexport default constructNow;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const diff = +toDate(dateLeft) - +toDate(dateRight);\n\n if (diff < 0) return -1;\n else if (diff > 0) return 1;\n\n // Return 0 if diff is 0; return NaN if diff is NaN\n return diff;\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { endOfDay } from \"./endOfDay.js\";\nimport { endOfMonth } from \"./endOfMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @param date - The date to check\n * @param options - An object with options\n *\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n return +endOfDay(_date, options) === +endOfMonth(_date, options);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.js\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.js\";\n\n/**\n * The {@link differenceInMonths} function options.\n */\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(laterDate, earlierDate, options) {\n const [laterDate_, workingLaterDate, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n laterDate,\n earlierDate,\n );\n\n const sign = compareAsc(workingLaterDate, earlierDate_);\n const difference = Math.abs(\n differenceInCalendarMonths(workingLaterDate, earlierDate_),\n );\n\n if (difference < 1) return 0;\n\n if (workingLaterDate.getMonth() === 1 && workingLaterDate.getDate() > 27)\n workingLaterDate.setDate(30);\n\n workingLaterDate.setMonth(workingLaterDate.getMonth() - sign * difference);\n\n let isLastMonthNotFull = compareAsc(workingLaterDate, earlierDate_) === -sign;\n\n if (\n isLastDayOfMonth(laterDate_) &&\n difference === 1 &&\n compareAsc(laterDate_, earlierDate_) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n const result = sign * (difference - +isLastMonthNotFull);\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","export function getRoundingMethod(method) {\n return (number) => {\n const round = method ? Math[method] : Math.trunc;\n const result = round(number);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n };\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n *\n * @returns The number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nexport function differenceInMilliseconds(laterDate, earlierDate) {\n return +toDate(laterDate) - +toDate(earlierDate);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMilliseconds;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.js\";\n\n/**\n * The {@link differenceInSeconds} function options.\n */\n\n/**\n * @name differenceInSeconds\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of seconds\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * const result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\nexport function differenceInSeconds(laterDate, earlierDate, options) {\n const diff = differenceInMilliseconds(laterDate, earlierDate) / 1000;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInSeconds;\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { minutesInDay, minutesInMonth } from \"./constants.js\";\nimport { differenceInMonths } from \"./differenceInMonths.js\";\nimport { differenceInSeconds } from \"./differenceInSeconds.js\";\n\n/**\n * The {@link formatDistance} function options.\n */\n\n/**\n * @name formatDistance\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words.\n *\n * | Distance between dates | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance between dates | Result |\n * |------------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param laterDate - The date\n * @param earlierDate - The date to compare with\n * @param options - An object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `baseDate` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistance(new Date(2014, 6, 2), new Date(2015, 0, 1))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00, including seconds?\n * const result = formatDistance(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * { includeSeconds: true }\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistance(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> 'about 1 year ago'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistance(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> 'pli ol 1 jaro'\n */\nexport function formatDistance(laterDate, earlierDate, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n const minutesInAlmostTwoDays = 2520;\n\n const comparison = compareAsc(laterDate, earlierDate);\n\n if (isNaN(comparison)) throw new RangeError(\"Invalid time value\");\n\n const localizeOptions = Object.assign({}, options, {\n addSuffix: options?.addSuffix,\n comparison: comparison,\n });\n\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n ...(comparison > 0 ? [earlierDate, laterDate] : [laterDate, earlierDate]),\n );\n\n const seconds = differenceInSeconds(earlierDate_, laterDate_);\n const offsetInSeconds =\n (getTimezoneOffsetInMilliseconds(earlierDate_) -\n getTimezoneOffsetInMilliseconds(laterDate_)) /\n 1000;\n const minutes = Math.round((seconds - offsetInSeconds) / 60);\n let months;\n\n // 0 up to 2 mins\n if (minutes < 2) {\n if (options?.includeSeconds) {\n if (seconds < 5) {\n return locale.formatDistance(\"lessThanXSeconds\", 5, localizeOptions);\n } else if (seconds < 10) {\n return locale.formatDistance(\"lessThanXSeconds\", 10, localizeOptions);\n } else if (seconds < 20) {\n return locale.formatDistance(\"lessThanXSeconds\", 20, localizeOptions);\n } else if (seconds < 40) {\n return locale.formatDistance(\"halfAMinute\", 0, localizeOptions);\n } else if (seconds < 60) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", 1, localizeOptions);\n }\n } else {\n if (minutes === 0) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n }\n }\n\n // 2 mins up to 0.75 hrs\n } else if (minutes < 45) {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n\n // 0.75 hrs up to 1.5 hrs\n } else if (minutes < 90) {\n return locale.formatDistance(\"aboutXHours\", 1, localizeOptions);\n\n // 1.5 hrs up to 24 hrs\n } else if (minutes < minutesInDay) {\n const hours = Math.round(minutes / 60);\n return locale.formatDistance(\"aboutXHours\", hours, localizeOptions);\n\n // 1 day up to 1.75 days\n } else if (minutes < minutesInAlmostTwoDays) {\n return locale.formatDistance(\"xDays\", 1, localizeOptions);\n\n // 1.75 days up to 30 days\n } else if (minutes < minutesInMonth) {\n const days = Math.round(minutes / minutesInDay);\n return locale.formatDistance(\"xDays\", days, localizeOptions);\n\n // 1 month up to 2 months\n } else if (minutes < minutesInMonth * 2) {\n months = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"aboutXMonths\", months, localizeOptions);\n }\n\n months = differenceInMonths(earlierDate_, laterDate_);\n\n // 2 months up to 12 months\n if (months < 12) {\n const nearestMonth = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"xMonths\", nearestMonth, localizeOptions);\n\n // 1 year up to max Date\n } else {\n const monthsSinceStartOfYear = months % 12;\n const years = Math.trunc(months / 12);\n\n // N years up to 1 years 3 months\n if (monthsSinceStartOfYear < 3) {\n return locale.formatDistance(\"aboutXYears\", years, localizeOptions);\n\n // N years 3 months up to N years 9 months\n } else if (monthsSinceStartOfYear < 9) {\n return locale.formatDistance(\"overXYears\", years, localizeOptions);\n\n // N years 9 months up to N year 12 months\n } else {\n return locale.formatDistance(\"almostXYears\", years + 1, localizeOptions);\n }\n }\n}\n\n// Fallback for modularized imports:\nexport default formatDistance;\n","import { constructNow } from \"./constructNow.js\";\n\nimport { formatDistance } from \"./formatDistance.js\";\n\n/**\n * The {@link formatDistanceToNow} function options.\n */\n\n/**\n * @name formatDistanceToNow\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given date and now in words.\n *\n * | Distance to now | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance to now | Result |\n * |---------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param date - The given date\n * @param options - The object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * const result = formatDistanceToNow(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * const result = formatDistanceToNow(\n * new Date(2015, 0, 1, 0, 0, 15),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * const result = formatDistanceToNow(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in about 1 year'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * const eoLocale = require('date-fns/locale/eo')\n * const result = formatDistanceToNow(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\nexport function formatDistanceToNow(date, options) {\n return formatDistance(date, constructNow(date), options);\n}\n\n// Fallback for modularized imports:\nexport default formatDistanceToNow;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link isSameWeek} function options.\n */\n\n/**\n * @name isSameWeek\n * @category Week Helpers\n * @summary Are the given dates in the same week (and month and year)?\n *\n * @description\n * Are the given dates in the same week (and month and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same week (and month and year)\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4), {\n * weekStartsOn: 1\n * })\n * //=> false\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same week?\n * const result = isSameWeek(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameWeek(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return (\n +startOfWeek(laterDate_, options) === +startOfWeek(earlierDate_, options)\n );\n}\n\n// Fallback for modularized imports:\nexport default isSameWeek;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n standalone: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n withPreposition: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n },\n\n xSeconds: {\n standalone: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n withPreposition: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n },\n\n halfAMinute: {\n standalone: \"eine halbe Minute\",\n withPreposition: \"einer halben Minute\",\n },\n\n lessThanXMinutes: {\n standalone: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n withPreposition: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n },\n\n xMinutes: {\n standalone: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n withPreposition: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n },\n\n aboutXHours: {\n standalone: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n withPreposition: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n },\n\n xHours: {\n standalone: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n withPreposition: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n },\n\n xDays: {\n standalone: {\n one: \"1 Tag\",\n other: \"{{count}} Tage\",\n },\n withPreposition: {\n one: \"1 Tag\",\n other: \"{{count}} Tagen\",\n },\n },\n\n aboutXWeeks: {\n standalone: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n withPreposition: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n },\n\n xWeeks: {\n standalone: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n withPreposition: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n },\n\n aboutXMonths: {\n standalone: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monate\",\n },\n withPreposition: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monaten\",\n },\n },\n\n xMonths: {\n standalone: {\n one: \"1 Monat\",\n other: \"{{count}} Monate\",\n },\n withPreposition: {\n one: \"1 Monat\",\n other: \"{{count}} Monaten\",\n },\n },\n\n aboutXYears: {\n standalone: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahre\",\n },\n withPreposition: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahren\",\n },\n },\n\n xYears: {\n standalone: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahre\",\n },\n withPreposition: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahren\",\n },\n },\n\n overXYears: {\n standalone: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahre\",\n },\n withPreposition: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahren\",\n },\n },\n\n almostXYears: {\n standalone: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahre\",\n },\n withPreposition: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahren\",\n },\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = options?.addSuffix\n ? formatDistanceLocale[token].withPreposition\n : formatDistanceLocale[token].standalone;\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return \"vor \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\n// DIN 5008: https://de.wikipedia.org/wiki/Datumsformat#DIN_5008\nconst dateFormats = {\n full: \"EEEE, do MMMM y\", // Montag, 7. Januar 2018\n long: \"do MMMM y\", // 7. Januar 2018\n medium: \"do MMM y\", // 7. Jan. 2018\n short: \"dd.MM.y\", // 07.01.2018\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'um' {{time}}\",\n long: \"{{date}} 'um' {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'letzten' eeee 'um' p\",\n yesterday: \"'gestern um' p\",\n today: \"'heute um' p\",\n tomorrow: \"'morgen um' p\",\n nextWeek: \"eeee 'um' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"v.Chr.\", \"n.Chr.\"],\n abbreviated: [\"v.Chr.\", \"n.Chr.\"],\n wide: [\"vor Christus\", \"nach Christus\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1. Quartal\", \"2. Quartal\", \"3. Quartal\", \"4. Quartal\"],\n};\n\n// Note: in German, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mär\",\n \"Apr\",\n \"Mai\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Dez\",\n ],\n\n wide: [\n \"Januar\",\n \"Februar\",\n \"März\",\n \"April\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"August\",\n \"September\",\n \"Oktober\",\n \"November\",\n \"Dezember\",\n ],\n};\n\n// https://st.unicode.org/cldr-apps/v#/de/Gregorian/\nconst formattingMonthValues = {\n narrow: monthValues.narrow,\n abbreviated: [\n \"Jan.\",\n \"Feb.\",\n \"März\",\n \"Apr.\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"Aug.\",\n \"Sep.\",\n \"Okt.\",\n \"Nov.\",\n \"Dez.\",\n ],\n\n wide: monthValues.wide,\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"D\", \"M\", \"D\", \"F\", \"S\"],\n short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n abbreviated: [\"So.\", \"Mo.\", \"Di.\", \"Mi.\", \"Do.\", \"Fr.\", \"Sa.\"],\n wide: [\n \"Sonntag\",\n \"Montag\",\n \"Dienstag\",\n \"Mittwoch\",\n \"Donnerstag\",\n \"Freitag\",\n \"Samstag\",\n ],\n};\n\n// https://www.unicode.org/cldr/charts/32/summary/de.html#1881\nconst dayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachm.\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n};\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachm.\",\n evening: \"abends\",\n night: \"nachts\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber) => {\n const number = Number(dirtyNumber);\n\n return number + \".\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n formattingValues: formattingMonthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(\\.)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n abbreviated: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n wide: /^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i,\n};\nconst parseEraPatterns = {\n any: [/^v/i, /^n/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](\\.)? Quartal/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated:\n /^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\\.?/i,\n wide: /^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^j[aä]/i,\n /^f/i,\n /^mär/i,\n /^ap/i,\n /^mai/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smdmf]/i,\n short: /^(so|mo|di|mi|do|fr|sa)/i,\n abbreviated: /^(son?|mon?|die?|mit?|don?|fre?|sam?)\\.?/i,\n wide: /^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i,\n};\nconst parseDayPatterns = {\n any: [/^so/i, /^mo/i, /^di/i, /^mi/i, /^do/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(vm\\.?|nm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n abbreviated:\n /^(vorm\\.?|nachm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n wide: /^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^v/i,\n pm: /^n/i,\n midnight: /^Mitte/i,\n noon: /^Mitta/i,\n morning: /morgens/i,\n afternoon: /nachmittags/i, // will never be matched. Afternoon is matched by `pm`\n evening: /abends/i,\n night: /nachts/i, // will never be matched. Night is matched by `pm`\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./de/_lib/formatDistance.js\";\nimport { formatLong } from \"./de/_lib/formatLong.js\";\nimport { formatRelative } from \"./de/_lib/formatRelative.js\";\nimport { localize } from \"./de/_lib/localize.js\";\nimport { match } from \"./de/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary German locale.\n * @language German\n * @iso-639-2 deu\n * @author Thomas Eilmsteiner [@DeMuu](https://github.com/DeMuu)\n * @author Asia [@asia-t](https://github.com/asia-t)\n * @author Van Vuong Ngo [@vanvuongngo](https://github.com/vanvuongngo)\n * @author RomanErnst [@pex](https://github.com/pex)\n * @author Philipp Keck [@Philipp91](https://github.com/Philipp91)\n */\nexport const de = {\n code: \"de\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default de;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"פחות משנייה\",\n two: \"פחות משתי שניות\",\n other: \"פחות מ־{{count}} שניות\",\n },\n\n xSeconds: {\n one: \"שנייה\",\n two: \"שתי שניות\",\n other: \"{{count}} שניות\",\n },\n\n halfAMinute: \"חצי דקה\",\n\n lessThanXMinutes: {\n one: \"פחות מדקה\",\n two: \"פחות משתי דקות\",\n other: \"פחות מ־{{count}} דקות\",\n },\n\n xMinutes: {\n one: \"דקה\",\n two: \"שתי דקות\",\n other: \"{{count}} דקות\",\n },\n\n aboutXHours: {\n one: \"כשעה\",\n two: \"כשעתיים\",\n other: \"כ־{{count}} שעות\",\n },\n\n xHours: {\n one: \"שעה\",\n two: \"שעתיים\",\n other: \"{{count}} שעות\",\n },\n\n xDays: {\n one: \"יום\",\n two: \"יומיים\",\n other: \"{{count}} ימים\",\n },\n\n aboutXWeeks: {\n one: \"כשבוע\",\n two: \"כשבועיים\",\n other: \"כ־{{count}} שבועות\",\n },\n\n xWeeks: {\n one: \"שבוע\",\n two: \"שבועיים\",\n other: \"{{count}} שבועות\",\n },\n\n aboutXMonths: {\n one: \"כחודש\",\n two: \"כחודשיים\",\n other: \"כ־{{count}} חודשים\",\n },\n\n xMonths: {\n one: \"חודש\",\n two: \"חודשיים\",\n other: \"{{count}} חודשים\",\n },\n\n aboutXYears: {\n one: \"כשנה\",\n two: \"כשנתיים\",\n other: \"כ־{{count}} שנים\",\n },\n\n xYears: {\n one: \"שנה\",\n two: \"שנתיים\",\n other: \"{{count}} שנים\",\n },\n\n overXYears: {\n one: \"יותר משנה\",\n two: \"יותר משנתיים\",\n other: \"יותר מ־{{count}} שנים\",\n },\n\n almostXYears: {\n one: \"כמעט שנה\",\n two: \"כמעט שנתיים\",\n other: \"כמעט {{count}} שנים\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n // Return word instead of `in one day` or `one day ago`\n if (token === \"xDays\" && options?.addSuffix && count <= 2) {\n if (options.comparison && options.comparison > 0) {\n return count === 1 ? \"מחר\" : \"מחרתיים\";\n }\n\n return count === 1 ? \"אתמול\" : \"שלשום\";\n }\n\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else if (count === 2) {\n result = tokenValue.two;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"בעוד \" + result;\n } else {\n return \"לפני \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, d בMMMM y\",\n long: \"d בMMMM y\",\n medium: \"d בMMM y\",\n short: \"d.M.y\",\n};\n\nconst timeFormats = {\n full: \"H:mm:ss zzzz\",\n long: \"H:mm:ss z\",\n medium: \"H:mm:ss\",\n short: \"H:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'בשעה' {{time}}\",\n long: \"{{date}} 'בשעה' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"eeee 'שעבר בשעה' p\",\n yesterday: \"'אתמול בשעה' p\",\n today: \"'היום בשעה' p\",\n tomorrow: \"'מחר בשעה' p\",\n nextWeek: \"eeee 'בשעה' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"לפנה״ס\", \"לספירה\"],\n abbreviated: [\"לפנה״ס\", \"לספירה\"],\n wide: [\"לפני הספירה\", \"לספירה\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"רבעון 1\", \"רבעון 2\", \"רבעון 3\", \"רבעון 4\"],\n};\n\nconst monthValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"],\n\n abbreviated: [\n \"ינו׳\",\n \"פבר׳\",\n \"מרץ\",\n \"אפר׳\",\n \"מאי\",\n \"יוני\",\n \"יולי\",\n \"אוג׳\",\n \"ספט׳\",\n \"אוק׳\",\n \"נוב׳\",\n \"דצמ׳\",\n ],\n\n wide: [\n \"ינואר\",\n \"פברואר\",\n \"מרץ\",\n \"אפריל\",\n \"מאי\",\n \"יוני\",\n \"יולי\",\n \"אוגוסט\",\n \"ספטמבר\",\n \"אוקטובר\",\n \"נובמבר\",\n \"דצמבר\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"א׳\", \"ב׳\", \"ג׳\", \"ד׳\", \"ה׳\", \"ו׳\", \"ש׳\"],\n short: [\"א׳\", \"ב׳\", \"ג׳\", \"ד׳\", \"ה׳\", \"ו׳\", \"ש׳\"],\n abbreviated: [\n \"יום א׳\",\n \"יום ב׳\",\n \"יום ג׳\",\n \"יום ד׳\",\n \"יום ה׳\",\n \"יום ו׳\",\n \"שבת\",\n ],\n\n wide: [\n \"יום ראשון\",\n \"יום שני\",\n \"יום שלישי\",\n \"יום רביעי\",\n \"יום חמישי\",\n \"יום שישי\",\n \"יום שבת\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בוקר\",\n afternoon: \"אחר הצהריים\",\n evening: \"ערב\",\n night: \"לילה\",\n },\n abbreviated: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בוקר\",\n afternoon: \"אחר הצהריים\",\n evening: \"ערב\",\n night: \"לילה\",\n },\n wide: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בוקר\",\n afternoon: \"אחר הצהריים\",\n evening: \"ערב\",\n night: \"לילה\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בבוקר\",\n afternoon: \"בצהריים\",\n evening: \"בערב\",\n night: \"בלילה\",\n },\n abbreviated: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בבוקר\",\n afternoon: \"אחר הצהריים\",\n evening: \"בערב\",\n night: \"בלילה\",\n },\n wide: {\n am: \"לפנה״צ\",\n pm: \"אחה״צ\",\n midnight: \"חצות\",\n noon: \"צהריים\",\n morning: \"בבוקר\",\n afternoon: \"אחר הצהריים\",\n evening: \"בערב\",\n night: \"בלילה\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n\n // We only show words till 10\n if (number <= 0 || number > 10) return String(number);\n\n const unit = String(options?.unit);\n\n const isFemale = [\"year\", \"hour\", \"minute\", \"second\"].indexOf(unit) >= 0;\n\n const male = [\n \"ראשון\",\n \"שני\",\n \"שלישי\",\n \"רביעי\",\n \"חמישי\",\n \"שישי\",\n \"שביעי\",\n \"שמיני\",\n \"תשיעי\",\n \"עשירי\",\n ];\n\n const female = [\n \"ראשונה\",\n \"שנייה\",\n \"שלישית\",\n \"רביעית\",\n \"חמישית\",\n \"שישית\",\n \"שביעית\",\n \"שמינית\",\n \"תשיעית\",\n \"עשירית\",\n ];\n\n const index = number - 1;\n return isFemale ? female[index] : male[index];\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern =\n /^(\\d+|(ראשון|שני|שלישי|רביעי|חמישי|שישי|שביעי|שמיני|תשיעי|עשירי|ראשונה|שנייה|שלישית|רביעית|חמישית|שישית|שביעית|שמינית|תשיעית|עשירית))/i;\nconst parseOrdinalNumberPattern = /^(\\d+|רא|שנ|של|רב|ח|שי|שב|שמ|ת|ע)/i;\n\nconst matchEraPatterns = {\n narrow: /^ל(ספירה|פנה״ס)/i,\n abbreviated: /^ל(ספירה|פנה״ס)/i,\n wide: /^ל(פני ה)?ספירה/i,\n};\nconst parseEraPatterns = {\n any: [/^לפ/i, /^לס/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^רבעון [1234]/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^\\d+/i,\n abbreviated: /^(ינו|פבר|מרץ|אפר|מאי|יוני|יולי|אוג|ספט|אוק|נוב|דצמ)׳?/i,\n wide: /^(ינואר|פברואר|מרץ|אפריל|מאי|יוני|יולי|אוגוסט|ספטמבר|אוקטובר|נובמבר|דצמבר)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^1$/i,\n /^2/i,\n /^3/i,\n /^4/i,\n /^5/i,\n /^6/i,\n /^7/i,\n /^8/i,\n /^9/i,\n /^10/i,\n /^11/i,\n /^12/i,\n ],\n\n any: [\n /^ינ/i,\n /^פ/i,\n /^מר/i,\n /^אפ/i,\n /^מא/i,\n /^יונ/i,\n /^יול/i,\n /^אוג/i,\n /^ס/i,\n /^אוק/i,\n /^נ/i,\n /^ד/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[אבגדהוש]׳/i,\n short: /^[אבגדהוש]׳/i,\n abbreviated: /^(שבת|יום (א|ב|ג|ד|ה|ו)׳)/i,\n wide: /^יום (ראשון|שני|שלישי|רביעי|חמישי|שישי|שבת)/i,\n};\nconst parseDayPatterns = {\n abbreviated: [/א׳$/i, /ב׳$/i, /ג׳$/i, /ד׳$/i, /ה׳$/i, /ו׳$/i, /^ש/i],\n wide: [/ן$/i, /ני$/i, /לישי$/i, /עי$/i, /מישי$/i, /שישי$/i, /ת$/i],\n any: [/^א/i, /^ב/i, /^ג/i, /^ד/i, /^ה/i, /^ו/i, /^ש/i],\n};\n\nconst matchDayPeriodPatterns = {\n any: /^(אחר ה|ב)?(חצות|צהריים|בוקר|ערב|לילה|אחה״צ|לפנה״צ)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^לפ/i,\n pm: /^אחה/i,\n midnight: /^ח/i,\n noon: /^צ/i,\n morning: /בוקר/i,\n afternoon: /בצ|אחר/i,\n evening: /ערב/i,\n night: /לילה/i,\n },\n};\n\nconst ordinalName = [\"רא\", \"שנ\", \"של\", \"רב\", \"ח\", \"שי\", \"שב\", \"שמ\", \"ת\", \"ע\"];\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => {\n const number = parseInt(value, 10);\n return isNaN(number) ? ordinalName.indexOf(value) + 1 : number;\n },\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./he/_lib/formatDistance.js\";\nimport { formatLong } from \"./he/_lib/formatLong.js\";\nimport { formatRelative } from \"./he/_lib/formatRelative.js\";\nimport { localize } from \"./he/_lib/localize.js\";\nimport { match } from \"./he/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary Hebrew locale.\n * @language Hebrew\n * @iso-639-2 heb\n * @author Nir Lahad [@nirlah](https://github.com/nirlah)\n */\nexport const he = {\n code: \"he\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default he;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"不到 1 秒\",\n other: \"不到 {{count}} 秒\",\n },\n\n xSeconds: {\n one: \"1 秒\",\n other: \"{{count}} 秒\",\n },\n\n halfAMinute: \"半分钟\",\n\n lessThanXMinutes: {\n one: \"不到 1 分钟\",\n other: \"不到 {{count}} 分钟\",\n },\n\n xMinutes: {\n one: \"1 分钟\",\n other: \"{{count}} 分钟\",\n },\n\n xHours: {\n one: \"1 小时\",\n other: \"{{count}} 小时\",\n },\n\n aboutXHours: {\n one: \"大约 1 小时\",\n other: \"大约 {{count}} 小时\",\n },\n\n xDays: {\n one: \"1 天\",\n other: \"{{count}} 天\",\n },\n\n aboutXWeeks: {\n one: \"大约 1 个星期\",\n other: \"大约 {{count}} 个星期\",\n },\n\n xWeeks: {\n one: \"1 个星期\",\n other: \"{{count}} 个星期\",\n },\n\n aboutXMonths: {\n one: \"大约 1 个月\",\n other: \"大约 {{count}} 个月\",\n },\n\n xMonths: {\n one: \"1 个月\",\n other: \"{{count}} 个月\",\n },\n\n aboutXYears: {\n one: \"大约 1 年\",\n other: \"大约 {{count}} 年\",\n },\n\n xYears: {\n one: \"1 年\",\n other: \"{{count}} 年\",\n },\n\n overXYears: {\n one: \"超过 1 年\",\n other: \"超过 {{count}} 年\",\n },\n\n almostXYears: {\n one: \"将近 1 年\",\n other: \"将近 {{count}} 年\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return result + \"内\";\n } else {\n return result + \"前\";\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"y'年'M'月'd'日' EEEE\",\n long: \"y'年'M'月'd'日'\",\n medium: \"yyyy-MM-dd\",\n short: \"yy-MM-dd\",\n};\n\nconst timeFormats = {\n full: \"zzzz a h:mm:ss\",\n long: \"z a h:mm:ss\",\n medium: \"a h:mm:ss\",\n short: \"a h:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} {{time}}\",\n long: \"{{date}} {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","import { isSameWeek } from \"../../../isSameWeek.js\";\n\nfunction checkWeek(date, baseDate, options) {\n const baseFormat = \"eeee p\";\n\n if (isSameWeek(date, baseDate, options)) {\n return baseFormat; // in same week\n } else if (date.getTime() > baseDate.getTime()) {\n return \"'下个'\" + baseFormat; // in next week\n }\n return \"'上个'\" + baseFormat; // in last week\n}\n\nconst formatRelativeLocale = {\n lastWeek: checkWeek, // days before yesterday, maybe in this week or last week\n yesterday: \"'昨天' p\",\n today: \"'今天' p\",\n tomorrow: \"'明天' p\",\n nextWeek: checkWeek, // days after tomorrow, maybe in this week or next week\n other: \"PP p\",\n};\n\nexport const formatRelative = (token, date, baseDate, options) => {\n const format = formatRelativeLocale[token];\n\n if (typeof format === \"function\") {\n return format(date, baseDate, options);\n }\n\n return format;\n};\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"前\", \"公元\"],\n abbreviated: [\"前\", \"公元\"],\n wide: [\"公元前\", \"公元\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"第一季\", \"第二季\", \"第三季\", \"第四季\"],\n wide: [\"第一季度\", \"第二季度\", \"第三季度\", \"第四季度\"],\n};\n\nconst monthValues = {\n narrow: [\n \"一\",\n \"二\",\n \"三\",\n \"四\",\n \"五\",\n \"六\",\n \"七\",\n \"八\",\n \"九\",\n \"十\",\n \"十一\",\n \"十二\",\n ],\n\n abbreviated: [\n \"1月\",\n \"2月\",\n \"3月\",\n \"4月\",\n \"5月\",\n \"6月\",\n \"7月\",\n \"8月\",\n \"9月\",\n \"10月\",\n \"11月\",\n \"12月\",\n ],\n\n wide: [\n \"一月\",\n \"二月\",\n \"三月\",\n \"四月\",\n \"五月\",\n \"六月\",\n \"七月\",\n \"八月\",\n \"九月\",\n \"十月\",\n \"十一月\",\n \"十二月\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"],\n short: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"],\n abbreviated: [\"周日\", \"周一\", \"周二\", \"周三\", \"周四\", \"周五\", \"周六\"],\n\n wide: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"上\",\n pm: \"下\",\n midnight: \"凌晨\",\n noon: \"午\",\n morning: \"早\",\n afternoon: \"下午\",\n evening: \"晚\",\n night: \"夜\",\n },\n abbreviated: {\n am: \"上午\",\n pm: \"下午\",\n midnight: \"凌晨\",\n noon: \"中午\",\n morning: \"早晨\",\n afternoon: \"中午\",\n evening: \"晚上\",\n night: \"夜间\",\n },\n wide: {\n am: \"上午\",\n pm: \"下午\",\n midnight: \"凌晨\",\n noon: \"中午\",\n morning: \"早晨\",\n afternoon: \"中午\",\n evening: \"晚上\",\n night: \"夜间\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"上\",\n pm: \"下\",\n midnight: \"凌晨\",\n noon: \"午\",\n morning: \"早\",\n afternoon: \"下午\",\n evening: \"晚\",\n night: \"夜\",\n },\n abbreviated: {\n am: \"上午\",\n pm: \"下午\",\n midnight: \"凌晨\",\n noon: \"中午\",\n morning: \"早晨\",\n afternoon: \"中午\",\n evening: \"晚上\",\n night: \"夜间\",\n },\n wide: {\n am: \"上午\",\n pm: \"下午\",\n midnight: \"凌晨\",\n noon: \"中午\",\n morning: \"早晨\",\n afternoon: \"中午\",\n evening: \"晚上\",\n night: \"夜间\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n\n switch (options?.unit) {\n case \"date\":\n return number.toString() + \"日\";\n case \"hour\":\n return number.toString() + \"时\";\n case \"minute\":\n return number.toString() + \"分\";\n case \"second\":\n return number.toString() + \"秒\";\n default:\n return \"第 \" + number.toString();\n }\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(第\\s*)?\\d+(日|时|分|秒)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(前)/i,\n abbreviated: /^(前)/i,\n wide: /^(公元前|公元)/i,\n};\nconst parseEraPatterns = {\n any: [/^(前)/i, /^(公元)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^第[一二三四]刻/i,\n wide: /^第[一二三四]刻钟/i,\n};\nconst parseQuarterPatterns = {\n any: [/(1|一)/i, /(2|二)/i, /(3|三)/i, /(4|四)/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^(一|二|三|四|五|六|七|八|九|十[二一])/i,\n abbreviated: /^(一|二|三|四|五|六|七|八|九|十[二一]|\\d|1[12])月/i,\n wide: /^(一|二|三|四|五|六|七|八|九|十[二一])月/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^一/i,\n /^二/i,\n /^三/i,\n /^四/i,\n /^五/i,\n /^六/i,\n /^七/i,\n /^八/i,\n /^九/i,\n /^十(?!(一|二))/i,\n /^十一/i,\n /^十二/i,\n ],\n\n any: [\n /^一|1/i,\n /^二|2/i,\n /^三|3/i,\n /^四|4/i,\n /^五|5/i,\n /^六|6/i,\n /^七|7/i,\n /^八|8/i,\n /^九|9/i,\n /^十(?!(一|二))|10/i,\n /^十一|11/i,\n /^十二|12/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[一二三四五六日]/i,\n short: /^[一二三四五六日]/i,\n abbreviated: /^周[一二三四五六日]/i,\n wide: /^星期[一二三四五六日]/i,\n};\nconst parseDayPatterns = {\n any: [/日/i, /一/i, /二/i, /三/i, /四/i, /五/i, /六/i],\n};\n\nconst matchDayPeriodPatterns = {\n any: /^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^上午?/i,\n pm: /^下午?/i,\n midnight: /^午夜/i,\n noon: /^[中正]午/i,\n morning: /^早上/i,\n afternoon: /^下午/i,\n evening: /^晚上?/i,\n night: /^凌晨/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./zh-CN/_lib/formatDistance.js\";\nimport { formatLong } from \"./zh-CN/_lib/formatLong.js\";\nimport { formatRelative } from \"./zh-CN/_lib/formatRelative.js\";\nimport { localize } from \"./zh-CN/_lib/localize.js\";\nimport { match } from \"./zh-CN/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary Chinese Simplified locale.\n * @language Chinese Simplified\n * @iso-639-2 zho\n * @author Changyu Geng [@KingMario](https://github.com/KingMario)\n * @author Song Shuoyun [@fnlctrl](https://github.com/fnlctrl)\n * @author sabrinaM [@sabrinamiao](https://github.com/sabrinamiao)\n * @author Carney Wu [@cubicwork](https://github.com/cubicwork)\n * @author Terrence Lam [@skyuplam](https://github.com/skyuplam)\n */\nexport const zhCN = {\n code: \"zh-CN\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default zhCN;\n","import type { KGSaveData } from \"../types/_save.js\";\nimport type { GamePage } from \"../types/game.js\";\n\nexport class SavegameLoader {\n private readonly _game: GamePage;\n\n constructor(game: GamePage) {\n this._game = game;\n }\n\n /**\n * Conveniently wraps the savegame loading process in an async construct.\n *\n * @param data The savegame data to load. We accept `null` here for convenience\n * when dealing with `import`ed save game data.\n * @returns Nothing\n */\n load(data: string | null): Promise<void> {\n return new Promise((resolve, reject) => {\n if (data === null) {\n resolve();\n return;\n }\n\n this._game.saveImportDropboxText(data, error => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n }\n\n loadRaw(data: KGSaveData): Promise<void> {\n const compressed = this._game.compressLZData(JSON.stringify(data));\n return this.load(compressed);\n }\n}\n","import type { Button } from \"./Button.js\";\nimport type { IconButton } from \"./IconButton.js\";\nimport { ListItem, type ListItemOptions } from \"./ListItem.js\";\nimport styles from \"./ToolbarListItem.module.css\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type ToolbarListItemOptions = ThisType<ToolbarListItem> & ListItemOptions;\n\nexport class ToolbarListItem extends ListItem {\n declare readonly options: ToolbarListItemOptions;\n\n constructor(parent: UiComponent, options?: ToolbarListItemOptions) {\n super(parent, options);\n\n this.element.addClass(styles.toolbar);\n }\n\n toString(): string {\n return `[${ToolbarListItem.name}#${this.componentId}]`;\n }\n\n override addChild(child: Button | IconButton): this {\n return super.addChild(child);\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport { InvalidArgumentError } from \"@oliversalzburg/js-utils/errors/InvalidArgumentError.js\";\nimport { formatDistanceToNow } from \"date-fns/formatDistanceToNow\";\nimport { de, enUS, he, type Locale, zhCN } from \"date-fns/locale\";\nimport { Engine, type EngineState, type SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport { KittenScientists } from \"../KittenScientists.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { StateSettings } from \"../settings/StateSettings.js\";\nimport { Unique } from \"../tools/Entries.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { SavegameLoader } from \"../tools/SavegameLoader.js\";\nimport type { KGSaveData } from \"../types/_save.js\";\nimport { UserScriptLoader } from \"../UserScriptLoader.js\";\nimport { Button } from \"./components/Button.js\";\nimport { ButtonListItem } from \"./components/ButtonListItem.js\";\nimport { Container } from \"./components/Container.js\";\nimport { Delimiter } from \"./components/Delimiter.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { IconButton } from \"./components/IconButton.js\";\nimport { LabelListItem } from \"./components/LabelListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { ListItem } from \"./components/ListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport stylesSettingListItem from \"./components/SettingListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { TextButton } from \"./components/TextButton.js\";\nimport { ToolbarListItem } from \"./components/ToolbarListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport type StoredGame = {\n label: string;\n game: KGSaveData;\n timestamp: string;\n};\nexport type StoredState = {\n label: string;\n state: EngineState;\n timestamp: string;\n};\n\nexport class StateManagementUi extends SettingsPanel<StateSettings> {\n readonly games = new Array<Unique<StoredGame>>();\n\n /**\n * The states persisted to local storage. They use Unique<T> so that when we\n * provide a state to the engine to load or get a state from the engine to\n * save, we are not accidentally sharing a reference to a live object.\n */\n readonly states = new Array<Unique<StoredState>>();\n\n readonly gameList: SettingsList;\n readonly stateList: SettingsList;\n readonly locale: Locale;\n\n constructor(\n parent: UiComponent,\n settings: StateSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${StateManagementUi.name}`));\n\n const label = parent.host.engine.i18n(\"state.title\");\n super(\n parent,\n settings,\n new LabelListItem(parent, label, {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: Icons.State,\n }).addChildrenHead([\n new Container(parent, {\n classes: [stylesLabelListItem.fillSpace],\n }),\n ]),\n {\n onRefresh: () => {\n this._refreshGameList();\n this._refreshStateList();\n },\n },\n );\n\n this.gameList = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n this.stateList = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n\n this.locale =\n locale.selected === \"zh-CN\"\n ? zhCN\n : locale.selected === \"he-IL\"\n ? he\n : locale.selected === \"de-DE\"\n ? de\n : enUS;\n\n this.addChildContent(\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new SettingListItem(this, this.setting.noConfirm, this.host.engine.i18n(\"state.noConfirm\")),\n new ListItem(this).addChild(new Delimiter(this)),\n\n new HeaderListItem(this, this.host.engine.i18n(\"state.local\")),\n new ToolbarListItem(this).addChildren([\n new Button(this, this.host.engine.i18n(\"state.import\"), Icons.Import, {\n onClick: () => {\n this.import();\n },\n title: this.host.engine.i18n(\"state.importTitle\"),\n }),\n ]),\n new ListItem(this).addChild(new Delimiter(this)),\n\n new HeaderListItem(this, this.host.engine.i18n(\"state.localStates\")),\n new ToolbarListItem(this).addChildren([\n new Button(this, this.host.engine.i18n(\"state.store\"), Icons.SaveAs, {\n onClick: () => {\n this.storeState();\n },\n title: this.host.engine.i18n(\"state.storeState\"),\n }),\n new Button(this, this.host.engine.i18n(\"copy\"), Icons.Copy, {\n onClick: () => {\n this.copyState().catch(redirectErrorsToConsole(console));\n this.host.engine.imessage(\"state.copied.stateCurrent\");\n },\n title: this.host.engine.i18n(\"state.copy.stateCurrent\"),\n }),\n new Button(this, this.host.engine.i18n(\"state.new\"), Icons.Draft, {\n onClick: () => {\n this.storeStateFactoryDefaults();\n this.host.engine.imessage(\"state.stored.state\");\n },\n title: this.host.engine.i18n(\"state.storeFactory\"),\n }),\n new Button(this, this.host.engine.i18n(\"state.exportAll\"), Icons.Sync, {\n onClick: () => {\n this.exportStateAll();\n },\n title: this.host.engine.i18n(\"state.exportAllTitle\"),\n }),\n ]),\n new ListItem(this).addChild(this.stateList),\n new ListItem(this).addChild(new Delimiter(this)),\n\n new HeaderListItem(this, this.host.engine.i18n(\"state.localGames\")),\n new ToolbarListItem(this).addChildren([\n new Button(this, this.host.engine.i18n(\"state.store\"), Icons.SaveAs, {\n onClick: () => {\n this.storeGame();\n this.host.engine.imessage(\"state.stored.game\");\n },\n title: this.host.engine.i18n(\"state.storeGame\"),\n }),\n new Button(this, this.host.engine.i18n(\"copy\"), Icons.Copy, {\n onClick: () => {\n this.copyGame().catch(redirectErrorsToConsole(console));\n this.host.engine.imessage(\"state.copied.gameCurrent\");\n },\n title: this.host.engine.i18n(\"state.copy.gameCurrent\"),\n }),\n ]),\n new ListItem(this).addChild(this.gameList),\n new SettingListItem(this, this.setting.compress, this.host.engine.i18n(\"state.compress\")),\n ]),\n );\n\n this._loadGames();\n this._loadStates();\n }\n\n private _loadGames() {\n let index = 0;\n let game = localStorage.getItem(`ks.game.${index}`);\n this.games.splice(0);\n try {\n while (!isNil(game)) {\n const gameObject = JSON.parse(game) as StoredGame;\n this.games.push(new Unique(gameObject));\n game = localStorage.getItem(`ks.game.${++index}`);\n }\n } catch (error) {\n console.error(...cl(error));\n }\n }\n private _storeGames() {\n let index = 0;\n let game = localStorage.getItem(`ks.game.${index}`);\n while (!isNil(game)) {\n localStorage.removeItem(`ks.game.${index}`);\n game = localStorage.getItem(`ks.game.${++index}`);\n }\n\n index = 0;\n for (const game of this.games) {\n localStorage.setItem(`ks.game.${index++}`, JSON.stringify(game));\n }\n }\n\n private _loadStates() {\n let stateIndex = 0;\n let state = localStorage.getItem(`ks.state.${stateIndex}`);\n this.states.splice(0);\n try {\n while (!isNil(state)) {\n const stateObject = JSON.parse(state) as StoredState;\n KittenScientists.unknownAsEngineStateOrThrow(stateObject.state);\n this.states.push(new Unique(stateObject));\n state = localStorage.getItem(`ks.state.${++stateIndex}`);\n }\n } catch (error) {\n console.error(...cl(error));\n }\n }\n private _storeStates() {\n let stateIndex = 0;\n let state = localStorage.getItem(`ks.state.${stateIndex}`);\n while (!isNil(state)) {\n localStorage.removeItem(`ks.state.${stateIndex}`);\n state = localStorage.getItem(`ks.state.${++stateIndex}`);\n }\n\n stateIndex = 0;\n for (const state of this.states) {\n localStorage.setItem(`ks.state.${stateIndex++}`, JSON.stringify(state));\n }\n }\n\n private _refreshGameList() {\n this.gameList.removeChildren(this.gameList.children);\n this.gameList.addChildren(\n this.games\n .sort(\n (a, b) =>\n new Date(a.unwrap().timestamp).getTime() - new Date(b.unwrap().timestamp).getTime(),\n )\n .map(game => [game.unwrap(), game] as const)\n .map(([game, gameSlot]) =>\n new ButtonListItem(\n this,\n new TextButton(\n this,\n `${game.label} (${formatDistanceToNow(new Date(game.timestamp), {\n addSuffix: true,\n locale: this.locale,\n })})`,\n {\n onClick: () => {\n this.loadGame(game.game).catch(redirectErrorsToConsole(console));\n this.host.engine.imessage(\"state.loaded.game\", [game.label]);\n },\n title: new Date(game.timestamp).toLocaleString(),\n },\n ),\n ).addChildren([\n new Container(this, { classes: [stylesLabelListItem.fillSpace] }),\n new IconButton(this, Icons.Save, this.host.engine.i18n(\"state.update.game\"), {\n onClick: () => {\n this.updateGame(gameSlot, this.host.game.save());\n this.host.engine.imessage(\"state.updated.game\", [game.label]);\n },\n }),\n new IconButton(this, Icons.Edit, this.host.engine.i18n(\"state.edit.game\"), {\n onClick: () => {\n this.storeGame(game.game);\n this.deleteGame(gameSlot, true);\n this.host.engine.imessage(\"state.updated.game\", [game.label]);\n },\n }),\n new IconButton(this, Icons.Copy, this.host.engine.i18n(\"state.copy.game\"), {\n onClick: () => {\n this.copyGame(game.game).catch(redirectErrorsToConsole(console));\n this.host.engine.imessage(\"state.copied.game\", [game.label]);\n },\n }),\n new IconButton(this, Icons.Delete, this.host.engine.i18n(\"state.delete.game\"), {\n onClick: () => {\n this.deleteGame(gameSlot);\n this.host.engine.imessage(\"state.deleted.game\", [game.label]);\n },\n }),\n ]),\n ),\n );\n }\n private _refreshStateList() {\n this.stateList.removeChildren(this.stateList.children);\n this.stateList.addChildren(\n this.states\n .sort(\n (a, b) =>\n new Date(a.unwrap().timestamp).getTime() - new Date(b.unwrap().timestamp).getTime(),\n )\n .map(stateSlot => [stateSlot.unwrap(), stateSlot] as const)\n .map(([state, stateSlot]) =>\n new ButtonListItem(\n this,\n new TextButton(\n this,\n `${state.label} (${formatDistanceToNow(new Date(state.timestamp), {\n addSuffix: true,\n locale: this.locale,\n })})`,\n {\n onClick: () => {\n this.loadState(state.state);\n this.host.engine.imessage(\"state.loaded.state\", [state.label]);\n },\n title: new Date(state.timestamp).toLocaleString(),\n },\n ),\n ).addChildren([\n new Container(this, { classes: [stylesLabelListItem.fillSpace] }),\n new IconButton(this, Icons.Save, this.host.engine.i18n(\"state.update.state\"), {\n onClick: () => {\n this.updateState(stateSlot, this.host.engine.stateSerialize());\n this.host.engine.imessage(\"state.updated.state\", [state.label]);\n },\n }),\n new IconButton(this, Icons.Edit, this.host.engine.i18n(\"state.edit.state\"), {\n onClick: () => {\n this.storeState(state.state);\n this.deleteState(stateSlot, true);\n this.host.engine.imessage(\"state.updated.state\", [state.label]);\n },\n }),\n new IconButton(this, Icons.Copy, this.host.engine.i18n(\"state.copy.state\"), {\n onClick: () => {\n this.copyState(state.state).catch(redirectErrorsToConsole(console));\n this.host.engine.imessage(\"state.copied.state\", [state.label]);\n },\n }),\n new IconButton(this, Icons.Delete, this.host.engine.i18n(\"state.delete.state\"), {\n onClick: () => {\n this.deleteState(stateSlot);\n this.host.engine.imessage(\"state.deleted.state\", [state.label]);\n },\n }),\n ]),\n ),\n );\n }\n\n async copyState(state?: EngineState) {\n await this.host.copySettings(state, false);\n }\n\n async copyGame(game?: KGSaveData) {\n const saveData = game ?? this.host.game.save();\n const saveDataString = JSON.stringify(saveData);\n const encodedData = this.setting.compress.enabled\n ? this.host.game.compressLZData(saveDataString)\n : saveDataString;\n\n await UserScriptLoader.window.navigator.clipboard.writeText(encodedData);\n }\n\n /**\n * Request text input from the user, and try to import it.\n *\n * Things users might paste, in no specific order:\n * 1. Kittens Game Save, uncompressed line-agnostic JSON\n * 2. Kittens Game Save, lz-string compressed single-line UTF-8 string\n * 3. Kittens Game Save, lz-string compressed single-line UTF-16 string\n * 4. Kitten Scientists Settings, uncompressed line-agnostic JSON\n * 5. Kitten Scientists Settings, lz-string compressed single-line Base64 string\n * 6. Kitten Scientists Settings Export, multi-line string where all lines are either:\n * - #4, but must be single-line\n * - #5\n * 7. Kitten Scientists Settings Export, multi-line string where each line is\n * an uncompressed JSON string serialization of:\n * {\n * label: \"The label the user previously assigned to these settings.\",\n * state: \"The same options as #6\",\n * timestamp: \"Last time the settings were modified. As new Date().toISOString().\",\n * }\n */\n import() {\n const userInput = UserScriptLoader.window.prompt(this.host.engine.i18n(\"state.loadPrompt\"));\n if (isNil(userInput)) {\n return;\n }\n\n const importId = new Date().toDateString();\n let importSequence = 1;\n const makeImportLabel = () =>\n this.host.engine.i18n(\"state.importedState\", [`${importId} #${importSequence++}`]);\n\n const internalImport = (input: string) => {\n // Handles #4 and #5\n try {\n // decodeSettings throws if the input is not a valid engine state.\n const state = KittenScientists.decodeSettings(input);\n this.storeState(state, makeImportLabel());\n this.host.engine.imessage(\"state.imported.state\");\n return;\n } catch (_error) {\n // Not a valid Kitten Scientists state.\n }\n\n // Handles #7\n try {\n const subjectData = JSON.parse(input) as {\n label: string;\n state: string;\n timestamp: string;\n };\n const state = KittenScientists.decodeSettings(subjectData.state);\n this.storeState(state, subjectData.label);\n this.host.engine.imessage(\"state.imported.state\");\n return;\n } catch (_error) {\n // Not a valid Kitten Scientists state.\n }\n\n // Attempt to parse as KG save.\n let subjectData: KGSaveData;\n try {\n subjectData = JSON.parse(input) as KGSaveData;\n } catch (_error) {\n // Expected, as we assume compressed input.\n const uncompressed = this.host.game.decompressLZData(input);\n try {\n subjectData = JSON.parse(uncompressed) as KGSaveData;\n } catch (_error) {\n // Continued failure to parse as JSON might indicate newline-delimited JSON.\n if (input.match(/\\r?\\n/)) {\n return input.split(/\\r?\\n/).map(line => void internalImport(line));\n }\n\n throw new InvalidArgumentError(\n \"The provided input can not be parsed as anything we understand.\",\n );\n }\n }\n\n // If game contains KS settings, import those separately.\n let stateLabel: string | undefined;\n if (!isNil(subjectData) && \"ks\" in subjectData && !isNil(subjectData.ks)) {\n const state = subjectData.ks.state[0];\n stateLabel = this.storeState(state, makeImportLabel()) ?? undefined;\n this.host.engine.imessage(\"state.imported.state\");\n subjectData.ks = undefined;\n }\n\n this.storeGame(subjectData, stateLabel);\n this.host.engine.imessage(\"state.imported.game\");\n };\n\n internalImport(userInput);\n }\n\n storeGame(game?: KGSaveData, label?: string): string | null {\n let gameLabel = label;\n\n if (isNil(gameLabel)) {\n gameLabel =\n UserScriptLoader.window.prompt(this.host.engine.i18n(\"state.storeGame.prompt\")) ??\n undefined;\n }\n\n if (isNil(gameLabel)) {\n return null;\n }\n\n // Normalize empty string to \"no label\".\n gameLabel =\n (gameLabel === \"\" ? undefined : gameLabel) ?? this.host.engine.i18n(\"state.unlabeledGame\");\n\n // Ensure labels aren't excessively long.\n gameLabel = gameLabel.substring(0, 127);\n\n this.games.push(\n new Unique({\n game: game ?? this.host.game.save(),\n label: gameLabel,\n timestamp: new Date().toISOString(),\n }),\n );\n\n this._storeGames();\n this.requestRefresh();\n\n return gameLabel;\n }\n\n storeState(state?: EngineState, label?: string): string | null {\n let stateLabel = label;\n\n if (isNil(stateLabel)) {\n stateLabel =\n UserScriptLoader.window.prompt(this.host.engine.i18n(\"state.storeState.prompt\")) ??\n undefined;\n }\n\n if (isNil(stateLabel)) {\n return null;\n }\n\n // Normalize empty string to \"no label\".\n stateLabel =\n (stateLabel === \"\" ? undefined : stateLabel) ?? this.host.engine.i18n(\"state.unlabeledState\");\n\n // Ensure labels aren't excessively long.\n stateLabel = stateLabel.substring(0, 127);\n\n this.states.push(\n new Unique({\n label: stateLabel,\n state: state ?? this.host.engine.stateSerialize(),\n timestamp: new Date().toISOString(),\n }),\n );\n\n this._storeStates();\n this.requestRefresh();\n\n return stateLabel;\n }\n\n storeStateFactoryDefaults() {\n this.storeState(Engine.DEFAULT_STATE);\n }\n\n storeAutoSave(state: EngineState) {\n const existing = this.states.find(state => state.unwrap().label === \"Auto-Save\");\n if (!isNil(existing)) {\n console.info(...cl(\"Updating existing Auto-Save...\"));\n existing.replace({\n ...existing.unwrap(),\n state,\n timestamp: new Date().toISOString(),\n });\n\n this._storeStates();\n this.requestRefresh();\n\n return;\n }\n\n console.info(...cl(\"Storing new Auto-Save...\"));\n this.storeState(state, \"Auto-Save\");\n }\n\n exportStateAll() {\n const statesJson = this.states\n .map(state => state.unwrap())\n .map(state =>\n JSON.stringify({\n label: state.label,\n state: KittenScientists.encodeSettings(state.state, false),\n timestamp: state.timestamp,\n }),\n )\n .join(\"\\n\");\n const a = document.createElement(\"a\");\n const blob = new Blob([statesJson], { type: \"application/x-ndjson\" });\n const url = URL.createObjectURL(blob);\n a.setAttribute(\"href\", url);\n a.setAttribute(\"download\", `ks-local-states-${Date.now()}.ndjson`);\n a.click();\n }\n\n async loadGame(game: KGSaveData) {\n if (this._destructiveActionPrevented()) {\n return;\n }\n\n await new SavegameLoader(this.host.game).loadRaw(game);\n }\n\n loadState(state: EngineState) {\n if (this._destructiveActionPrevented()) {\n return;\n }\n\n this.host.engine.stateLoad(state, true);\n this.host.refreshEntireUserInterface();\n }\n\n loadAutoSave() {\n if (this.host.engine.isLoaded) {\n console.info(...cl(\"Not attempting to load Auto-Save, because a state is already loaded.\"));\n return;\n }\n\n const existing = this.states.find(state => state.unwrap().label === \"Auto-Save\");\n if (isNil(existing)) {\n console.info(...cl(\"No Auto-Save settings found.\"));\n return;\n }\n\n console.info(...cl(\"Loading Auto-Save...\"));\n this.host.engine.stateLoad(existing.unwrap().state, false);\n }\n\n updateGame(game: Unique<StoredGame>, newGame: KGSaveData) {\n if (this._destructiveActionPrevented()) {\n return;\n }\n\n const label = game.unwrap().label;\n game.replace({\n game: newGame,\n label,\n timestamp: new Date().toISOString(),\n });\n this._storeGames();\n this.requestRefresh();\n }\n\n updateState(state: Unique<StoredState>, newState: EngineState) {\n if (this._destructiveActionPrevented()) {\n return;\n }\n\n const label = state.unwrap().label;\n state.replace({\n label,\n state: newState,\n timestamp: new Date().toISOString(),\n });\n this._storeStates();\n this.requestRefresh();\n }\n\n deleteGame(game: Unique<StoredGame>, force = false) {\n if (!force && this._destructiveActionPrevented()) {\n return;\n }\n\n const index = this.games.indexOf(game);\n if (index < 0) {\n return;\n }\n\n this.games.splice(index, 1);\n this._storeGames();\n this.requestRefresh();\n }\n\n deleteState(state: Unique<StoredState>, force = false) {\n if (!force && this._destructiveActionPrevented()) {\n return;\n }\n\n const index = this.states.indexOf(state);\n if (index < 0) {\n return;\n }\n\n this.states.splice(index, 1);\n this._storeStates();\n this.requestRefresh();\n }\n\n private _destructiveActionPrevented(): boolean {\n if (\n !this.setting.noConfirm.enabled &&\n !UserScriptLoader.window.confirm(this.host.engine.i18n(\"state.confirmDestruction\"))\n ) {\n return true;\n }\n\n return false;\n }\n}\n","import type { Setting } from \"../../settings/Settings.js\";\nimport { CollapsiblePanel, type CollapsiblePanelOptions } from \"./CollapsiblePanel.js\";\nimport { Container } from \"./Container.js\";\nimport { LabelListItem, type LabelListItemOptions } from \"./LabelListItem.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport stylesSettingListItem from \"./SettingListItem.module.css\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type IconSettingsPanelOptions = ThisType<IconSettingsPanel> &\n LabelListItemOptions &\n CollapsiblePanelOptions & {\n /**\n * When set to an SVG path, will be used as an icon on the panel.\n */\n readonly icon: string;\n };\n\nexport class IconSettingsPanel<TSetting extends Setting = Setting> extends CollapsiblePanel {\n declare readonly options: IconSettingsPanelOptions;\n readonly setting: TSetting;\n\n /**\n * Constructs a settings panel that can have an icon.\n *\n * @param host A reference to the host.\n * @param label The label to put main checkbox of this section.\n * @param setting An setting for which this is the settings panel.\n * @param options Options for the panel.\n */\n constructor(\n parent: UiComponent,\n label: string,\n setting: TSetting,\n options?: IconSettingsPanelOptions,\n ) {\n super(\n parent,\n new LabelListItem(parent, label, {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: options?.icon,\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n options,\n );\n this.setting = setting;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetBonfireSettings } from \"../settings/ResetBonfireSettings.js\";\nimport type { SettingOptions, SettingTrigger } from \"../settings/Settings.js\";\nimport type { StagedBuilding } from \"../types/index.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport stylesDelimiter from \"./components/Delimiter.module.css\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetBonfireSettingsUi extends IconSettingsPanel<ResetBonfireSettings> {\n private readonly _buildings: Array<HeaderListItem | SettingTriggerListItem>;\n\n constructor(\n parent: UiComponent,\n settings: ResetBonfireSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.build\");\n super(parent, label, settings, {\n icon: Icons.Bonfire,\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(_ => _.enabled && _.trigger <= 0);\n },\n });\n\n this._buildings = [];\n for (const buildingGroup of this.host.game.bld.buildingGroups) {\n this._buildings.push(new HeaderListItem(this, buildingGroup.title));\n for (const building of buildingGroup.buildings) {\n if (building === \"unicornPasture\" || isNil(this.setting.buildings[building])) {\n continue;\n }\n\n const meta = this.host.game.bld.getBuildingExt(building).meta;\n if (!isNil(meta.stages)) {\n const name = Object.values(this.setting.buildings).find(\n item => item.baseBuilding === building,\n )?.building as StagedBuilding;\n this._buildings.push(\n this._getResetOption(\n this,\n this.setting.buildings[building],\n locale,\n settings,\n meta.stages[0].label,\n ),\n this._getResetOption(\n this,\n this.setting.buildings[name],\n locale,\n settings,\n meta.stages[1].label,\n false,\n true,\n ),\n );\n } else if (!isNil(meta.label)) {\n this._buildings.push(\n this._getResetOption(\n this,\n this.setting.buildings[building],\n locale,\n settings,\n meta.label,\n ),\n );\n }\n }\n\n // Add padding after each group. Except for the last group, which ends the list.\n if (\n buildingGroup !==\n this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length - 1]\n ) {\n this._buildings.at(-1)?.element.addClass(stylesDelimiter.delimiter);\n }\n }\n\n const listBuildings = new SettingsList(this);\n listBuildings.addChildren(this._buildings);\n this.addChildContent(listBuildings);\n }\n\n private _getResetOption(\n parent: UiComponent,\n option: SettingTrigger,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ResetBonfireSettings,\n label: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n const element = new SettingTriggerListItem(parent, option, locale, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.enable\", [label]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled && option.enabled && option.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderAbsolute(option.trigger, locale.selected)\n : parent.host.engine.i18n(\"ui.trigger.inactive\"),\n ]),\n option.trigger !== -1 ? parent.host.renderAbsolute(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.reset.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n option.enabled = false;\n return;\n }\n\n option.trigger = Number(value);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.disable\", [label]);\n },\n upgradeIndicator,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetReligionSettings } from \"../settings/ResetReligionSettings.js\";\nimport type { SettingOptions, SettingTrigger } from \"../settings/Settings.js\";\nimport { UnicornItems, type ZigguratUpgrade } from \"../types/index.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Delimiter } from \"./components/Delimiter.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetReligionSettingsUi extends IconSettingsPanel<ResetReligionSettings> {\n constructor(\n parent: UiComponent,\n settings: ResetReligionSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.faith\");\n super(parent, label, settings, {\n icon: Icons.Religion,\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(_ => _.enabled && _.trigger <= 0);\n },\n });\n\n this.addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n const unicornsArray: Array<ZigguratUpgrade | \"unicornPasture\"> = [...UnicornItems];\n\n this.addChildContent(\n new SettingsList(this).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.ziggurat.label\")),\n this._getResetOption(\n this,\n this.setting.buildings.unicornPasture,\n locale,\n settings,\n this.host.engine.i18n(\"$buildings.unicornPasture.label\"),\n ),\n\n ...this.host.game.religion.zigguratUpgrades\n .filter(\n item => unicornsArray.includes(item.name) && !isNil(this.setting.buildings[item.name]),\n )\n .map(zigguratUpgrade =>\n this._getResetOption(\n this,\n this.setting.buildings[zigguratUpgrade.name],\n locale,\n settings,\n zigguratUpgrade.label,\n ),\n ),\n new Delimiter(this),\n\n ...this.host.game.religion.zigguratUpgrades\n .filter(\n item => !unicornsArray.includes(item.name) && !isNil(this.setting.buildings[item.name]),\n )\n .map(upgrade =>\n this._getResetOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n settings,\n upgrade.label,\n ),\n ),\n new Delimiter(this),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.orderOfTheSun.label\")),\n ...this.host.game.religion.religionUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(upgrade =>\n this._getResetOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n settings,\n upgrade.label,\n upgrade.name === this.host.game.religion.religionUpgrades.at(-1)?.name,\n ),\n ),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$religion.panel.cryptotheology.label\")),\n ...this.host.game.religion.transcendenceUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(upgrade =>\n this._getResetOption(\n this,\n this.setting.buildings[upgrade.name],\n locale,\n settings,\n upgrade.label,\n ),\n ),\n ]),\n );\n }\n\n private _getResetOption(\n parent: UiComponent,\n option: SettingTrigger,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ResetReligionSettings,\n label: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n const element = new SettingTriggerListItem(parent, option, locale, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.enable\", [label]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled && option.enabled && option.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderAbsolute(option.trigger, locale.selected)\n : parent.host.engine.i18n(\"ui.trigger.inactive\"),\n ]),\n option.trigger !== -1 ? parent.host.renderAbsolute(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.reset.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n option.enabled = false;\n return;\n }\n\n option.trigger = Number(value);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.disable\", [label]);\n },\n upgradeIndicator,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetResourcesSettings } from \"../settings/ResetResourcesSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetResourcesSettingsUi extends IconSettingsPanel<ResetResourcesSettings> {\n constructor(\n parent: UiComponent,\n settings: ResetResourcesSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.resources\");\n super(parent, label, settings, {\n icon: Icons.Resources,\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.resources).some(_ => _.enabled && _.trigger < 0);\n },\n });\n\n this.addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n const resources = this.host.game.resPool.resources;\n\n const items = [];\n let lastLabel = resources[0].title;\n for (const resource of [...resources].sort((a, b) =>\n a.title.localeCompare(b.title, locale.selected),\n )) {\n const option = this.setting.resources[resource.name];\n\n const element = new SettingTriggerListItem(this, option, locale, ucfirst(resource.title), {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [resource.title]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n settings.enabled && option.enabled && option.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.prompt.float\"),\n this.host.engine.i18n(\"ui.trigger.build.prompt\", [\n resource.title,\n option.trigger !== -1\n ? this.host.renderAbsolute(option.trigger, locale.selected)\n : this.host.engine.i18n(\"ui.trigger.inactive\"),\n ]),\n option.trigger !== -1 ? this.host.renderAbsolute(option.trigger) : \"\",\n this.host.engine.i18n(\"ui.trigger.reset.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n option.enabled = false;\n return;\n }\n\n option.trigger = parent.host.parseAbsolute(value) ?? option.trigger;\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [resource.title]);\n },\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n\n if (this.host.engine.localeSupportsFirstLetterSplits(locale.selected)) {\n if (lastLabel[0] !== resource.title[0]) {\n element.element.addClass(stylesLabelListItem.splitter);\n }\n }\n\n items.push(element);\n\n lastLabel = resource.title;\n }\n\n this.addChildContent(new SettingsList(this).addChildren(items));\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetSpaceSettings } from \"../settings/ResetSpaceSettings.js\";\nimport type { SettingOptions, SettingTrigger } from \"../settings/Settings.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetSpaceSettingsUi extends IconSettingsPanel<ResetSpaceSettings> {\n constructor(\n parent: UiComponent,\n settings: ResetSpaceSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.space\");\n super(parent, label, settings, {\n icon: Icons.Space,\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(_ => _.enabled && _.trigger <= 0);\n },\n });\n\n this.addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n this.addChildContent(\n new SettingsList(this).addChildren(\n this.host.game.space.planets\n .filter(plant => 0 < plant.buildings.length)\n .flatMap((planet, indexPlanet, arrayPlant) => [\n new HeaderListItem(this, this.host.engine.labelForPlanet(planet.name)),\n ...planet.buildings\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map((building, indexBuilding, arrayBuilding) =>\n this._getResetOption(\n this,\n this.setting.buildings[building.name],\n locale,\n settings,\n building.label,\n indexPlanet < arrayPlant.length - 1 && indexBuilding === arrayBuilding.length - 1,\n ),\n ),\n ]),\n ),\n );\n }\n\n private _getResetOption(\n parent: UiComponent,\n option: SettingTrigger,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ResetSpaceSettings,\n label: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n const element = new SettingTriggerListItem(parent, option, locale, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.enable\", [label]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled && option.enabled && option.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderAbsolute(option.trigger, locale.selected)\n : parent.host.engine.i18n(\"ui.trigger.inactive\"),\n ]),\n option.trigger !== -1 ? parent.host.renderAbsolute(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.reset.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n option.enabled = false;\n return;\n }\n\n option.trigger = Number(value);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.disable\", [label]);\n },\n upgradeIndicator,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetTimeSettings } from \"../settings/ResetTimeSettings.js\";\nimport type { SettingOptions, SettingTrigger } from \"../settings/Settings.js\";\nimport type { TimeItem } from \"../settings/TimeSettings.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetTimeSettingsUi extends IconSettingsPanel<ResetTimeSettings> {\n constructor(\n parent: UiComponent,\n settings: ResetTimeSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.time\");\n super(parent, label, settings, {\n icon: Icons.Time,\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(_ => _.enabled && _.trigger <= 0);\n },\n });\n\n this.addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n this.addChildContent(\n new SettingsList(this).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"$workshop.chronoforge.label\")),\n ...this.host.game.time.chronoforgeUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(building =>\n this._getResetOption(\n this,\n this.setting.buildings[building.name],\n locale,\n settings,\n building.label,\n building.name === this.host.game.time.chronoforgeUpgrades.at(-1)?.name,\n ),\n ),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$science.voidSpace.label\")),\n ...this.host.game.time.voidspaceUpgrades\n .filter(item => item.name in this.setting.buildings)\n .map(building =>\n this._getResetOption(\n this,\n this.setting.buildings[building.name as TimeItem],\n locale,\n settings,\n building.label,\n ),\n ),\n ]),\n );\n }\n\n private _getResetOption(\n parent: UiComponent,\n option: SettingTrigger,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: ResetTimeSettings,\n label: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n const element = new SettingTriggerListItem(parent, option, locale, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.enable\", [label]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled && option.enabled && option.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.trigger.build.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderAbsolute(option.trigger, locale.selected)\n : parent.host.engine.i18n(\"ui.trigger.inactive\"),\n ]),\n option.trigger !== -1 ? parent.host.renderAbsolute(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.reset.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n option.enabled = false;\n return;\n }\n\n option.trigger = Number(value);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.disable\", [label]);\n },\n upgradeIndicator,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { ResetUpgradeSettings } from \"../settings/ResetUpgradeSettings.js\";\nimport type { Setting, SettingOptions } from \"../settings/Settings.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesDelimiter from \"./components/Delimiter.module.css\";\nimport { IconSettingsPanel } from \"./components/IconSettingsPanel.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class ResetUpgradesSettingsUi extends IconSettingsPanel<ResetUpgradeSettings> {\n constructor(\n parent: UiComponent,\n settings: ResetUpgradeSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrades\");\n super(parent, label, settings, {\n icon: Icons.Workshop,\n });\n\n this.addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]);\n\n const upgrades = this.host.game.workshop.upgrades.filter(\n upgrade => !isNil(this.setting.upgrades[upgrade.name]),\n );\n\n const items = [];\n let lastLabel = upgrades[0].label;\n let lastElement: SettingListItem | undefined;\n for (const upgrade of upgrades.sort((a, b) =>\n a.label.localeCompare(b.label, locale.selected),\n )) {\n const option = this.setting.upgrades[upgrade.name];\n\n const element = this._getResetOption(this, option, upgrade.label);\n\n if (this.host.engine.localeSupportsFirstLetterSplits(locale.selected)) {\n if (lastLabel[0] !== upgrade.label[0]) {\n if (!isNil(lastElement)) {\n lastElement.element.addClass(stylesDelimiter.delimiter);\n }\n element.element.addClass(stylesLabelListItem.splitter);\n }\n }\n\n lastElement = element;\n items.push(element);\n\n lastLabel = upgrade.label;\n }\n\n this.addChildContent(new SettingsList(this).addChildren(items));\n }\n\n private _getResetOption(\n parent: UiComponent,\n option: Setting,\n label: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n return new SettingListItem(parent, option, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.enable\", [label]);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.reset.check.disable\", [label]);\n },\n upgradeIndicator,\n });\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { ResetSettings } from \"../settings/ResetSettings.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { Container } from \"./components/Container.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { ResetBonfireSettingsUi } from \"./ResetBonfireSettingsUi.js\";\nimport { ResetReligionSettingsUi } from \"./ResetReligionSettingsUi.js\";\nimport { ResetResourcesSettingsUi } from \"./ResetResourcesSettingsUi.js\";\nimport { ResetSpaceSettingsUi } from \"./ResetSpaceSettingsUi.js\";\nimport { ResetTimeSettingsUi } from \"./ResetTimeSettingsUi.js\";\nimport { ResetUpgradesSettingsUi } from \"./ResetUpgradesSettingsUi.js\";\n\nexport class ResetSettingsUi extends SettingsPanel<ResetSettings> {\n private readonly _bonfireUi: ResetBonfireSettingsUi;\n private readonly _religionUi: ResetReligionSettingsUi;\n private readonly _resourcesUi: ResetResourcesSettingsUi;\n private readonly _spaceUi: ResetSpaceSettingsUi;\n private readonly _timeUi: ResetTimeSettingsUi;\n private readonly _upgradesUi: ResetUpgradesSettingsUi;\n\n constructor(\n parent: UiComponent,\n settings: ResetSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"option.time.reset\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled &&\n [\n this._bonfireUi,\n this._religionUi,\n this._resourcesUi,\n this._spaceUi,\n this._timeUi,\n this._upgradesUi,\n ].some(_ => _.expando.ineffective);\n },\n },\n );\n\n const list = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n this._bonfireUi = new ResetBonfireSettingsUi(this, this.setting.bonfire, locale);\n this._religionUi = new ResetReligionSettingsUi(this, this.setting.religion, locale);\n this._resourcesUi = new ResetResourcesSettingsUi(this, this.setting.resources, locale);\n this._spaceUi = new ResetSpaceSettingsUi(this, this.setting.space, locale);\n this._timeUi = new ResetTimeSettingsUi(this, this.setting.time, locale);\n this._upgradesUi = new ResetUpgradesSettingsUi(this, this.setting.upgrades, locale);\n\n list.addChildren([\n this._bonfireUi,\n this._religionUi,\n this._resourcesUi,\n this._spaceUi,\n this._timeUi,\n this._upgradesUi,\n ]);\n this.addChildContent(list);\n }\n}\n","import type { Setting } from \"../../settings/Settings.js\";\nimport type { Cycle } from \"../../types/index.js\";\nimport { SettingListItem } from \"./SettingListItem.js\";\nimport { SettingsList, type SettingsListOptions } from \"./SettingsList.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingWithCycles = Record<Cycle, Setting>;\n\nexport type CyclesListOptions = ThisType<CyclesList> &\n SettingsListOptions & {\n /**\n * Called when a cycle is checked.\n *\n * @param label The label on the cycle element.\n * @param setting The setting associated with the cycle.\n */\n readonly onCheckCycle?: (label: string, setting: Setting, isBatchProcess?: boolean) => void;\n\n /**\n * Called when a cycle is unchecked.\n *\n * @param label The label on the cycle element.\n * @param setting The setting associated with the cycle.\n */\n readonly onUnCheckCycle?: (label: string, setting: Setting, isBatchProcess?: boolean) => void;\n };\n\n/**\n * A list of settings correlating to the planetary cycles in the game.\n */\nexport class CyclesList extends SettingsList {\n declare readonly options: CyclesListOptions;\n readonly setting: SettingWithCycles;\n\n /**\n * Constructs a `SeasonsList`.\n *\n * @param host A reference to the host.\n * @param setting The settings that correlate to this list.\n * @param behavior Control cycle check box log output\n * @param options Options for this list.\n */\n constructor(parent: UiComponent, setting: SettingWithCycles, options?: CyclesListOptions) {\n super(parent, options);\n this.setting = setting;\n\n const makeCycle = (cycle: Cycle, setting: Setting) => {\n const label = parent.host.engine.labelForCycle(cycle);\n return new SettingListItem(parent, setting, label, {\n onCheck: (isBatchProcess?: boolean) => {\n options?.onCheckCycle?.(label, setting, isBatchProcess);\n },\n onUnCheck: (isBatchProcess?: boolean) => {\n options?.onUnCheckCycle?.(label, setting, isBatchProcess);\n },\n });\n };\n\n const cycles = [\n makeCycle(\"charon\", this.setting.charon),\n makeCycle(\"umbra\", this.setting.umbra),\n makeCycle(\"yarn\", this.setting.yarn),\n makeCycle(\"helios\", this.setting.helios),\n makeCycle(\"cath\", this.setting.cath),\n makeCycle(\"redmoon\", this.setting.redmoon),\n makeCycle(\"dune\", this.setting.dune),\n makeCycle(\"piscine\", this.setting.piscine),\n makeCycle(\"terminus\", this.setting.terminus),\n makeCycle(\"kairo\", this.setting.kairo),\n ];\n this.addChildren(cycles);\n\n this.element[0].addEventListener(\"enableAll\", () => {\n for (const cycle of cycles) {\n cycle.check(true);\n }\n });\n this.element[0].addEventListener(\"disableAll\", () => {\n for (const cycle of cycles) {\n cycle.uncheck(true);\n }\n });\n }\n}\n","import type { Setting } from \"../../settings/Settings.js\";\nimport type { Season } from \"../../types/index.js\";\nimport { SettingListItem } from \"./SettingListItem.js\";\nimport { SettingsList, type SettingsListOptions } from \"./SettingsList.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingWithSeasons = Record<Season, Setting>;\n\nexport type SeasonsListOptions = ThisType<SeasonsList> &\n SettingsListOptions & {\n /**\n * Called when a season is checked.\n *\n * @param label The label on the season element.\n * @param setting The setting associated with the season.\n */\n readonly onCheckSeason?: (label: string, setting: Setting, isBatchProcess?: boolean) => void;\n\n /**\n * Called when a season is unchecked.\n *\n * @param label The label on the season element.\n * @param setting The setting associated with the season.\n */\n readonly onUnCheckSeason?: (label: string, setting: Setting, isBatchProcess?: boolean) => void;\n };\n\n/**\n * A list of 4 settings correlating to the 4 seasons.\n */\nexport class SeasonsList extends SettingsList {\n declare readonly options: SeasonsListOptions;\n readonly setting: SettingWithSeasons;\n\n readonly spring: SettingListItem;\n readonly summer: SettingListItem;\n readonly autumn: SettingListItem;\n readonly winter: SettingListItem;\n\n /**\n * Constructs a `SeasonsList`.\n *\n * @param host A reference to the host.\n * @param setting The settings that correlate to this list.\n * @param options Options for this list\n */\n constructor(parent: UiComponent, setting: SettingWithSeasons, options?: SeasonsListOptions) {\n super(parent, options);\n this.setting = setting;\n\n const makeSeason = (label: string, setting: Setting) => {\n return new SettingListItem(this, setting, label, {\n onCheck: (isBatchProcess?: boolean) => {\n options?.onCheckSeason?.(label, setting, isBatchProcess);\n },\n onUnCheck: (isBatchProcess?: boolean) => {\n options?.onUnCheckSeason?.(label, setting, isBatchProcess);\n },\n });\n };\n\n this.spring = makeSeason(this.host.engine.i18n(\"$calendar.season.spring\"), this.setting.spring);\n this.summer = makeSeason(this.host.engine.i18n(\"$calendar.season.summer\"), this.setting.summer);\n this.autumn = makeSeason(this.host.engine.i18n(\"$calendar.season.autumn\"), this.setting.autumn);\n this.winter = makeSeason(this.host.engine.i18n(\"$calendar.season.winter\"), this.setting.winter);\n\n this.addChildren([this.spring, this.summer, this.autumn, this.winter]);\n }\n\n toString(): string {\n return `[${SeasonsList.name}#${this.componentId}]`;\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { TimeControlSettings } from \"../settings/TimeControlSettings.js\";\nimport type { TimeSkipHeatSettings } from \"../settings/TimeSkipHeatSettings.js\";\nimport type { TimeSkipSettings } from \"../settings/TimeSkipSettings.js\";\nimport { CyclesList } from \"./components/CyclesList.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport styles from \"./TimeSkipHeatSettingsUi.module.css\";\n\nexport class TimeSkipHeatSettingsUi extends SettingsPanel<\n TimeSkipHeatSettings,\n SettingTriggerListItem\n> {\n constructor(\n parent: UiComponent,\n settings: TimeSkipHeatSettings,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: TimeSkipSettings,\n sectionParentSetting: TimeControlSettings,\n ) {\n const label = parent.host.engine.i18n(\"option.time.activeHeatTransfer\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.activeHeatTransfer.prompt\"),\n parent.host.engine.i18n(\"ui.trigger.activeHeatTransfer.promptTitle\", [\n parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]),\n parent.host.renderPercentage(settings.trigger),\n parent.host.engine.i18n(\"ui.trigger.activeHeatTransfer.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n settings.activeHeatTransferStatus.enabled = false;\n },\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled;\n this.settingItem.triggerButton.ineffective =\n sectionParentSetting.enabled &&\n sectionSetting.enabled &&\n settings.enabled &&\n settings.trigger === -1;\n\n this.expando.ineffective =\n sectionParentSetting.enabled &&\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.cycles).some(cycle => cycle.enabled);\n\n if (settings.activeHeatTransferStatus.enabled) {\n this.head.elementLabel.attr(\"data-ks-active-from\", \"◎\");\n this.head.elementLabel.attr(\"data-ks-active-to\", \"◎\");\n this.head.elementLabel.addClass(styles.active);\n } else {\n this.head.elementLabel.removeClass(styles.active);\n }\n },\n },\n );\n\n this.addChildContent(\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new CyclesList(this, this.setting.cycles, {\n onCheckCycle: (label: string) => {\n this.host.engine.imessage(\"time.heatTransfer.cycle.enable\", [label]);\n },\n onUnCheckCycle: (label: string) => {\n this.host.engine.imessage(\"time.heatTransfer.cycle.disable\", [label]);\n },\n }),\n ]),\n );\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { TimeControlSettings } from \"../settings/TimeControlSettings.js\";\nimport type { TimeSkipSettings } from \"../settings/TimeSkipSettings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { CollapsiblePanel } from \"./components/CollapsiblePanel.js\";\nimport { Container } from \"./components/Container.js\";\nimport { CyclesList } from \"./components/CyclesList.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { LabelListItem } from \"./components/LabelListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SeasonsList } from \"./components/SeasonsList.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport stylesSettingListItem from \"./components/SettingListItem.module.css\";\nimport { SettingMaxTriggerListItem } from \"./components/SettingMaxTriggerListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { TimeSkipHeatSettingsUi } from \"./TimeSkipHeatSettingsUi.js\";\n\nexport class TimeSkipSettingsUi extends SettingsPanel<TimeSkipSettings, SettingMaxTriggerListItem> {\n private readonly _cycles: CollapsiblePanel;\n private readonly _seasons: CollapsiblePanel;\n private readonly _activeHeatTransferUI: TimeSkipHeatSettingsUi;\n\n constructor(\n parent: UiComponent,\n settings: TimeSkipSettings,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: TimeControlSettings,\n ) {\n const label = parent.host.engine.i18n(\"option.time.skip\");\n super(\n parent,\n settings,\n new SettingMaxTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshMax() {\n this.maxButton.updateLabel(parent.host.renderAbsolute(settings.max));\n this.maxButton.element[0].title =\n settings.max < 0\n ? parent.host.engine.i18n(\"ui.max.timeSkip.titleInfinite\", [label])\n : settings.max === 0\n ? parent.host.engine.i18n(\"ui.max.timeSkip.titleZero\", [label])\n : parent.host.engine.i18n(\"ui.max.timeSkip.title\", [\n parent.host.renderAbsolute(settings.max),\n label,\n ]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : `${parent.host.renderFloat(settings.trigger, locale.selected)} TC`,\n ]);\n },\n onSetMax: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.max.timeSkip.prompt\"),\n parent.host.engine.i18n(\"ui.max.timeSkip.promptTitle\", [\n parent.host.renderAbsolute(settings.max, locale.selected),\n ]),\n parent.host.renderAbsolute(settings.max),\n parent.host.engine.i18n(\"ui.max.timeSkip.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.max = -1;\n return;\n }\n\n if (value === \"0\") {\n settings.enabled = false;\n }\n\n settings.max = parent.host.parseAbsolute(value) ?? settings.max;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.timeSkip.prompt\"),\n parent.host.engine.i18n(\"ui.trigger.timeSkip.promptTitle\", [\n parent.host.renderAbsolute(settings.trigger, locale.selected),\n ]),\n parent.host.renderAbsolute(settings.trigger),\n parent.host.engine.i18n(\"ui.trigger.timeSkip.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n settings.trigger = parent.host.parseAbsolute(value) ?? settings.trigger;\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.maxButton.inactive = !settings.enabled || settings.max === -1;\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n\n this.settingItem.maxButton.ineffective =\n sectionSetting.enabled && settings.enabled && settings.max === 0;\n\n this._cycles.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.cycles).some(cycle => cycle.enabled);\n this._seasons.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.seasons).some(season => season.enabled);\n },\n },\n );\n this.settingItem.triggerButton.element.removeClass(stylesButton.lastHeadAction);\n\n this._cycles = new CollapsiblePanel(\n this,\n new LabelListItem(this, ucfirst(this.host.engine.i18n(\"ui.cycles\")), {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: Icons.Cycles,\n }).addChildrenHead([new Container(this, { classes: [stylesLabelListItem.fillSpace] })]),\n ).addChildrenContent([\n new CyclesList(this, this.setting.cycles, {\n onCheckCycle: (label: string) => {\n this.host.engine.imessage(\"time.skip.cycle.enable\", [label]);\n },\n onUnCheckCycle: (label: string) => {\n this.host.engine.imessage(\"time.skip.cycle.disable\", [label]);\n },\n }),\n ]);\n this._seasons = new CollapsiblePanel(\n this,\n new LabelListItem(this, ucfirst(this.host.engine.i18n(\"trade.seasons\")), {\n classes: [stylesSettingListItem.checked, stylesSettingListItem.setting],\n icon: Icons.Seasons,\n }).addChildrenHead([new Container(this, { classes: [stylesLabelListItem.fillSpace] })]),\n ).addChildrenContent([\n new SeasonsList(this, this.setting.seasons, {\n onCheckSeason: (label: string) => {\n this.host.engine.imessage(\"time.skip.season.enable\", [label]);\n },\n onUnCheckSeason: (label: string) => {\n this.host.engine.imessage(\"time.skip.season.disable\", [label]);\n },\n }),\n ]);\n this._activeHeatTransferUI = new TimeSkipHeatSettingsUi(\n this,\n this.setting.activeHeatTransfer,\n locale,\n settings,\n sectionSetting,\n );\n\n this.addChildContent(\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n this._cycles,\n this._seasons,\n new SettingListItem(\n this,\n this.setting.ignoreOverheat,\n this.host.engine.i18n(\"option.time.skip.ignoreOverheat\"),\n ),\n this._activeHeatTransferUI,\n ]),\n );\n }\n}\n","import type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { TimeControlSettings } from \"../settings/TimeControlSettings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { ResetSettingsUi } from \"./ResetSettingsUi.js\";\nimport { TimeSkipSettingsUi } from \"./TimeSkipSettingsUi.js\";\n\nexport class TimeControlSettingsUi extends SettingsPanel<TimeControlSettings> {\n protected readonly _items: Array<SettingListItem>;\n\n private readonly _accelerateTime: SettingTriggerListItem;\n private readonly _timeSkipUi: TimeSkipSettingsUi;\n private readonly _resetUi: ResetSettingsUi;\n\n constructor(\n parent: UiComponent,\n settings: TimeControlSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${TimeControlSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.timeCtrl\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled && [this._timeSkipUi, this._resetUi].some(_ => _.expando.ineffective);\n },\n },\n );\n\n const list = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n const accelerateLabel = this.host.engine.i18n(\"option.accelerate\");\n this._accelerateTime = new SettingTriggerListItem(\n this,\n this.setting.accelerateTime,\n locale,\n accelerateLabel,\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [accelerateLabel]);\n },\n onRefresh: () => {\n this._accelerateTime.triggerButton.inactive = !this.setting.accelerateTime.enabled;\n this._accelerateTime.triggerButton.ineffective =\n this.setting.enabled &&\n this.setting.accelerateTime.enabled &&\n this.setting.accelerateTime.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.accelerateTime.prompt\"),\n this.host.engine.i18n(\"ui.trigger.accelerateTime.promptTitle\", [\n this.host.renderPercentage(\n this.setting.accelerateTime.trigger,\n locale.selected,\n true,\n ),\n ]),\n this.host.renderPercentage(this.setting.accelerateTime.trigger),\n this.host.engine.i18n(\"ui.trigger.accelerateTime.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n this.setting.accelerateTime.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [accelerateLabel]);\n },\n },\n );\n this._accelerateTime.triggerButton.element.addClass(stylesButton.lastHeadAction);\n this._timeSkipUi = new TimeSkipSettingsUi(this, this.setting.timeSkip, locale, settings);\n this._resetUi = new ResetSettingsUi(this, this.setting.reset, locale);\n\n this._items = [this._accelerateTime, this._timeSkipUi, this._resetUi];\n\n list.addChildren(this._items);\n this.addChildContent(list);\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { TimeItem, TimeSettings } from \"../settings/TimeSettings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { BuildSectionTools } from \"./BuildSectionTools.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class TimeSettingsUi extends SettingsPanel<TimeSettings, SettingTriggerListItem> {\n constructor(\n parent: UiComponent,\n settings: TimeSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${TimeSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.time\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefresh: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger.section\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger < 0;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.buildings).some(_ => _.enabled && 0 < _.max && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled &&\n Object.values(settings.buildings).some(\n _ => _.enabled && (0 === _.max || (_.trigger < 0 && settings.trigger < 0)),\n );\n },\n },\n );\n\n this.addChildrenContent([\n new SettingsList(this).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"$workshop.chronoforge.label\")),\n ...this.host.game.time.chronoforgeUpgrades\n .filter(item => !isNil(this.setting.buildings[item.name]))\n .map(building =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[building.name],\n locale,\n this.setting,\n building.label,\n label,\n {\n delimiter: building.name === this.host.game.time.chronoforgeUpgrades.at(-1)?.name,\n renderLabelTrigger: false,\n },\n ),\n ),\n\n new HeaderListItem(this, this.host.engine.i18n(\"$science.voidSpace.label\")),\n ...this.host.game.time.voidspaceUpgrades\n .filter(item => item.name in this.setting.buildings)\n .map(building =>\n BuildSectionTools.getBuildOption(\n this,\n this.setting.buildings[building.name as TimeItem],\n locale,\n this.setting,\n building.label,\n label,\n { renderLabelTrigger: false },\n ),\n ),\n ]),\n\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([\n new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")),\n new SettingListItem(\n this,\n this.setting.fixCryochambers,\n this.host.engine.i18n(\"option.fix.cry\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.fix.cry\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.fix.cry\"),\n ]);\n },\n },\n ),\n ]),\n ]);\n }\n}\n","import type { SupportedLocale } from \"../../../Engine.js\";\nimport type { SettingBuy, SettingOptions } from \"../../../settings/Settings.js\";\nimport { Dialog } from \"../Dialog.js\";\nimport { TextButton, type TextButtonOptions } from \"../TextButton.js\";\nimport type { UiComponent } from \"../UiComponent.js\";\nimport styles from \"./BuyButton.module.css\";\n\nexport type BuyButtonOptions = ThisType<BuyButton> & TextButtonOptions;\n\nexport class BuyButton extends TextButton {\n declare readonly options: BuyButtonOptions;\n readonly setting: SettingBuy;\n\n constructor(\n parent: UiComponent,\n setting: SettingBuy,\n locale: SettingOptions<SupportedLocale>,\n options?: BuyButtonOptions,\n ) {\n super(parent, undefined, {\n onClick: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"blackcoin.buy.prompt\"),\n parent.host.engine.i18n(\"blackcoin.buy.promptTitle\", [\n parent.host.renderAbsolute(setting.buy, locale.selected),\n ]),\n parent.host.renderAbsolute(setting.buy),\n parent.host.engine.i18n(\"blackcoin.buy.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n setting.buy = -1;\n return;\n }\n\n setting.buy = parent.host.parseAbsolute(value) ?? setting.buy;\n },\n onRefresh: () => {\n this.element.prop(\n \"title\",\n this.host.engine.i18n(\"blackcoin.buy.title\", [\n this.host.renderAbsolute(this.setting.buy),\n ]),\n );\n this.element.text(\n this.host.engine.i18n(\"blackcoin.buy\", [this.host.renderAbsolute(this.setting.buy)]),\n );\n\n options?.onRefresh?.call(this);\n },\n });\n\n this.element.addClass(styles.buyButton);\n\n this.setting = setting;\n }\n\n toString(): string {\n return `[${BuyButton.name}#${this.componentId}]`;\n }\n}\n","import type { SupportedLocale } from \"../../../Engine.js\";\nimport type { SettingOptions, SettingSell } from \"../../../settings/Settings.js\";\nimport { Dialog } from \"../Dialog.js\";\nimport { TextButton, type TextButtonOptions } from \"../TextButton.js\";\nimport type { UiComponent } from \"../UiComponent.js\";\nimport styles from \"./SellButton.module.css\";\n\nexport type SellButtonOptions = ThisType<SellButton> & TextButtonOptions;\n\nexport class SellButton extends TextButton {\n declare readonly options: SellButtonOptions;\n readonly setting: SettingSell;\n\n constructor(\n parent: UiComponent,\n setting: SettingSell,\n locale: SettingOptions<SupportedLocale>,\n options?: SellButtonOptions,\n ) {\n super(parent, undefined, {\n onClick: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"blackcoin.sell.prompt\"),\n parent.host.engine.i18n(\"blackcoin.sell.promptTitle\", [\n parent.host.renderAbsolute(setting.sell, locale.selected),\n ]),\n parent.host.renderAbsolute(setting.sell),\n parent.host.engine.i18n(\"blackcoin.sell.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n setting.sell = -1;\n return;\n }\n\n setting.sell = parent.host.parseAbsolute(value) ?? setting.sell;\n },\n onRefresh: () => {\n this.element.prop(\n \"title\",\n this.host.engine.i18n(\"blackcoin.sell.title\", [\n this.host.renderAbsolute(this.setting.sell),\n ]),\n );\n this.element.text(\n this.host.engine.i18n(\"blackcoin.sell\", [this.host.renderAbsolute(this.setting.sell)]),\n );\n\n options?.onRefresh?.();\n },\n });\n\n this.element.addClass(styles.sellButton);\n\n this.setting = setting;\n }\n\n toString(): string {\n return `[${SellButton.name}#${this.componentId}]`;\n }\n}\n","import { Icons } from \"../../../images/Icons.js\";\nimport type { SettingLimited } from \"../../../settings/Settings.js\";\nimport { Button, type ButtonOptions } from \"../Button.js\";\nimport stylesButton from \"../Button.module.css\";\nimport type { UiComponent } from \"../UiComponent.js\";\n\nexport type LimitedButtonOptions = ThisType<LimitedButton> &\n ButtonOptions & {\n readonly onLimitedCheck?: () => void;\n readonly onLimitedUnCheck?: () => void;\n };\n\nexport class LimitedButton extends Button {\n declare readonly options: LimitedButtonOptions;\n readonly setting: SettingLimited;\n\n constructor(\n parent: UiComponent,\n setting: SettingLimited,\n options: Omit<LimitedButtonOptions, \"onClick\">,\n ) {\n super(parent, \"\", Icons.Eco, {\n border: false,\n classes: [],\n onClick: () => {\n this.setting.limited = !this.setting.limited;\n\n if (this.setting.limited) {\n options?.onLimitedCheck?.call(this);\n } else {\n options?.onLimitedUnCheck?.call(this);\n }\n },\n onRefresh: () => {\n this.updateTitle(\n this.host.engine.i18n(this.setting.limited ? \"ui.limited.on\" : \"ui.limited.off\"),\n );\n\n if (this.setting.limited && !this.inactive) {\n this.element.removeClass(stylesButton.inactive);\n } else {\n this.element.addClass(stylesButton.inactive);\n }\n\n options?.onRefresh?.call(this);\n },\n });\n\n this.setting = setting;\n\n for (const className of options?.classes ?? []) {\n this.element.addClass(className);\n }\n }\n\n toString(): string {\n return `[${LimitedButton.name}#${this.componentId}]`;\n }\n}\n","import type { SettingLimited } from \"../../settings/Settings.js\";\nimport { LimitedButton } from \"./buttons/LimitedButton.js\";\nimport { Container } from \"./Container.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport { SettingListItem, type SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingLimitedListItemOptions = ThisType<SettingLimitedListItem> &\n SettingListItemOptions & {\n /**\n * Is called when the \"Limited\" checkbox is checked.\n */\n readonly onLimitedCheck?: () => void;\n\n /**\n * Is called when the \"Limited\" checkbox is unchecked.\n */\n readonly onLimitedUnCheck?: () => void;\n };\n\nexport class SettingLimitedListItem extends SettingListItem {\n declare readonly options: SettingLimitedListItemOptions;\n readonly limitedButton: LimitedButton;\n\n /**\n * Create a UI element for a setting that can be limited.\n * This will result in an element with a checkbox that has a \"Limited\" label.\n *\n * @param host The userscript instance.\n * @param label The label for the setting.\n * @param setting The setting model.\n * @param options Options for the list item.\n */\n constructor(\n parent: UiComponent,\n setting: SettingLimited,\n label: string,\n options: SettingLimitedListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.limitedButton = new LimitedButton(parent, setting, {\n border: false,\n onLimitedCheck: options?.onLimitedCheck\n ? () => options.onLimitedCheck?.call(this)\n : undefined,\n onLimitedUnCheck: options?.onLimitedUnCheck\n ? () => options.onLimitedUnCheck?.call(this)\n : undefined,\n });\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.limitedButton,\n ]);\n }\n\n toString(): string {\n return `[${SettingLimitedListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import type { SupportedLocale } from \"../../Engine.js\";\nimport type { SettingLimitedTrigger, SettingOptions } from \"../../settings/Settings.js\";\nimport { TriggerButton } from \"./buttons/TriggerButton.js\";\nimport {\n SettingLimitedListItem,\n type SettingLimitedListItemOptions,\n} from \"./SettingLimitedListItem.js\";\nimport type { SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { SettingTriggerListItemOptions } from \"./SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingLimitedTriggerListItemOptions = SettingListItemOptions &\n SettingLimitedListItemOptions &\n SettingTriggerListItemOptions &\n ThisType<SettingLimitedTriggerListItem>;\n\nexport class SettingLimitedTriggerListItem extends SettingLimitedListItem {\n declare readonly options: SettingLimitedTriggerListItemOptions;\n readonly triggerButton: TriggerButton;\n\n constructor(\n parent: UiComponent,\n setting: SettingLimitedTrigger,\n locale: SettingOptions<SupportedLocale>,\n label: string,\n options: SettingLimitedTriggerListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.triggerButton = new TriggerButton(parent, setting, locale, {\n border: false,\n onClick: async () => {\n await options.onSetTrigger.call(this);\n },\n onRefresh: options?.onRefreshTrigger ? () => options.onRefreshTrigger?.call(this) : undefined,\n renderLabel: options?.renderLabelTrigger ?? true,\n });\n this.addChildHead(this.triggerButton);\n }\n\n toString(): string {\n return `[${SettingLimitedTriggerListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import type { SettingMax } from \"../../settings/Settings.js\";\nimport { MaxButton } from \"./buttons/MaxButton.js\";\nimport { Container } from \"./Container.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport { SettingListItem, type SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type SettingMaxListItemOptions = ThisType<SettingMaxListItem> &\n SettingListItemOptions & {\n readonly onRefreshMax?: () => void;\n readonly onSetMax: () => void | Promise<void>;\n };\n\nexport class SettingMaxListItem extends SettingListItem<SettingMax> {\n declare readonly options: SettingMaxListItemOptions;\n readonly maxButton: MaxButton;\n\n /**\n * Create a UI element for a setting that can have a maximum.\n * This will result in an element with a labeled checkbox and a \"Max\" indicator,\n * which controls the respective `max` property in the setting model.\n *\n * @param host The userscript instance.\n * @param label The label for the setting.\n * @param setting The setting model.\n * @param options Options for the list item.\n */\n constructor(\n parent: UiComponent,\n setting: SettingMax,\n label: string,\n options: SettingMaxListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.maxButton = new MaxButton(parent, setting, {\n border: false,\n onClick: async () => {\n await options.onSetMax.call(this);\n },\n onRefresh: options?.onRefreshMax ? () => options.onRefreshMax?.call(this) : undefined,\n });\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.maxButton,\n ]);\n }\n\n toString(): string {\n return `[${SettingMaxListItem.name}#${this.componentId}]: '${this.elementLabel.text()}'`;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { EmbassySettings } from \"../settings/EmbassySettings.js\";\nimport type { SettingMax, SettingOptions } from \"../settings/Settings.js\";\nimport type { TradeSettings } from \"../settings/TradeSettings.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { SettingMaxListItem } from \"./components/SettingMaxListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class EmbassySettingsUi extends SettingsPanel<EmbassySettings, SettingTriggerListItem> {\n constructor(\n parent: UiComponent,\n settings: EmbassySettings,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: TradeSettings,\n ) {\n const label = parent.host.engine.i18n(\"option.embassies\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.embassies.prompt\"),\n parent.host.engine.i18n(\"ui.trigger.embassies.promptTitle\", [\n parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]),\n parent.host.renderPercentage(settings.trigger),\n parent.host.engine.i18n(\"ui.trigger.embassies.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled;\n this.settingItem.triggerButton.ineffective = settings.enabled && settings.trigger === -1;\n\n this.expando.ineffective =\n sectionSetting.enabled &&\n settings.enabled &&\n !Object.values(settings.races).some(race => race.enabled);\n },\n },\n );\n\n const listRaces = new SettingsList(this).addChildren(\n this.host.game.diplomacy.races\n .filter(item => item.name !== \"leviathans\" && !isNil(this.setting.races[item.name]))\n .map(race =>\n this._makeEmbassySetting(\n this,\n this.setting.races[race.name],\n locale.selected,\n settings,\n race.title,\n ),\n ),\n );\n this.addChildContent(listRaces);\n }\n\n private _makeEmbassySetting(\n parent: UiComponent,\n option: SettingMax,\n locale: SupportedLocale,\n sectionSetting: EmbassySettings,\n label: string,\n ) {\n const onSetMax = async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.max.prompt.absolute\"),\n parent.host.engine.i18n(\"ui.max.build.prompt\", [\n label,\n parent.host.renderAbsolute(option.max, locale),\n ]),\n parent.host.renderAbsolute(option.max),\n parent.host.engine.i18n(\"ui.max.build.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.max = -1;\n return;\n }\n\n if (value === \"0\") {\n option.enabled = false;\n }\n\n option.max = parent.host.parseAbsolute(value) ?? option.max;\n };\n\n const element = new SettingMaxListItem(parent, option, label, {\n onCheck: (isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.sub.enable\", [label]);\n if (option.max === 0 && !isBatchProcess) {\n return onSetMax();\n }\n },\n onRefresh: () => {\n element.maxButton.inactive = !option.enabled || option.max === -1;\n element.maxButton.ineffective =\n sectionSetting.enabled && option.enabled && option.max === 0;\n },\n onRefreshMax: () => {\n element.maxButton.updateLabel(parent.host.renderAbsolute(option.max));\n element.maxButton.element[0].title =\n option.max < 0\n ? parent.host.engine.i18n(\"ui.max.embassy.titleInfinite\", [label])\n : option.max === 0\n ? parent.host.engine.i18n(\"ui.max.embassy.titleZero\", [label])\n : parent.host.engine.i18n(\"ui.max.embassy.title\", [\n parent.host.renderAbsolute(option.max),\n label,\n ]);\n },\n onSetMax,\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n });\n element.maxButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type {\n SettingBuySellThreshold,\n SettingLimitedTrigger,\n SettingOptions,\n SettingTrigger,\n} from \"../settings/Settings.js\";\nimport type { TradeSettings, TradeSettingsItem } from \"../settings/TradeSettings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { BuyButton } from \"./components/buttons-text/BuyButton.js\";\nimport { SellButton } from \"./components/buttons-text/SellButton.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport { SeasonsList } from \"./components/SeasonsList.js\";\nimport { SettingLimitedTriggerListItem } from \"./components/SettingLimitedTriggerListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { EmbassySettingsUi } from \"./EmbassySettingsUi.js\";\n\nexport class TradeSettingsUi extends SettingsPanel<TradeSettings, SettingTriggerListItem> {\n private _racePanels: Array<SettingsPanel<SettingLimitedTrigger, SettingLimitedTriggerListItem>>;\n\n constructor(\n parent: UiComponent,\n settings: TradeSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${TradeSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.trade\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger.section\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.races).some(_ => _.enabled && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled &&\n Object.values(this._racePanels).some(\n _ => _.expando.ineffective || _.settingItem.triggerButton.ineffective,\n );\n },\n },\n );\n\n this._racePanels = this.host.game.diplomacy.races\n .filter(item => !isNil(this.setting.races[item.name]))\n .map(race =>\n this._getTradeOption(\n this,\n this.setting.races[race.name],\n locale,\n settings,\n race.title,\n label,\n race.name === this.host.game.diplomacy.races.at(-2)?.name,\n ),\n );\n const listRaces = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren(this._racePanels);\n\n listRaces.addChild(\n new SettingListItem(\n this,\n this.setting.feedLeviathans,\n this.host.engine.i18n(\"option.autofeed\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.autofeed\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.autofeed\"),\n ]);\n },\n },\n ),\n );\n\n listRaces.addChild(\n new SettingsPanel<SettingBuySellThreshold, SettingTriggerListItem>(\n this,\n this.setting.tradeBlackcoin,\n new SettingTriggerListItem(\n this,\n this.setting.tradeBlackcoin,\n locale,\n this.host.engine.i18n(\"option.crypto\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.crypto\"),\n ]);\n },\n onRefreshRequest() {\n this.triggerButton.inactive = !this.setting.enabled || this.setting.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.crypto.promptTitle\"),\n this.host.engine.i18n(\"ui.trigger.crypto.prompt\", [\n this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger, locale.selected),\n ]),\n this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger),\n this.host.engine.i18n(\"ui.trigger.crypto.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n this.setting.tradeBlackcoin.trigger =\n this.host.parseAbsolute(value) ?? this.setting.tradeBlackcoin.trigger;\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.crypto\"),\n ]);\n },\n },\n ),\n ).addChildrenContent([\n new BuyButton(this, this.setting.tradeBlackcoin, locale),\n new SellButton(this, this.setting.tradeBlackcoin, locale),\n ]),\n );\n this.addChildContent(listRaces);\n\n const listAddition = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n listAddition.addChild(new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")));\n\n listAddition.addChild(\n new EmbassySettingsUi(this, this.setting.buildEmbassies, locale, settings),\n );\n\n listAddition.addChild(\n new SettingListItem(\n this,\n this.setting.unlockRaces,\n this.host.engine.i18n(\"ui.upgrade.races\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"ui.upgrade.races\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"ui.upgrade.races\"),\n ]);\n },\n },\n ),\n );\n this.addChildContent(listAddition);\n }\n\n private _getTradeOption(\n parent: UiComponent,\n option: TradeSettingsItem,\n locale: SettingOptions<SupportedLocale>,\n sectionSetting: SettingTrigger,\n label: string,\n sectionLabel: string,\n delimiter = false,\n upgradeIndicator = false,\n ) {\n const element = new SettingLimitedTriggerListItem(parent, option, locale, label, {\n delimiter,\n onCheck: () => {\n parent.host.engine.imessage(\"status.sub.enable\", [label]);\n },\n onLimitedCheck: () => {\n parent.host.engine.imessage(\"trade.limited\", [label]);\n },\n onLimitedUnCheck: () => {\n parent.host.engine.imessage(\"trade.unlimited\", [label]);\n },\n onRefreshTrigger: () => {\n element.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger\", [\n option.trigger < 0\n ? sectionSetting.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.blocked\", [sectionLabel])\n : `${parent.host.renderPercentage(sectionSetting.trigger, locale.selected, true)} (${parent.host.engine.i18n(\"ui.trigger.section.inherited\")})`\n : parent.host.renderPercentage(option.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n option.trigger !== -1\n ? parent.host.renderPercentage(option.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.trigger.section.inherited\"),\n ]),\n option.trigger !== -1 ? parent.host.renderPercentage(option.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n return;\n }\n\n option.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: () => {\n parent.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n renderLabelTrigger: false,\n upgradeIndicator,\n });\n\n const panel = new SettingsPanel(parent, option, element, {\n onRefreshRequest: () => {\n element.limitedButton.inactive = !option.enabled || !option.limited;\n\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n sectionSetting.enabled &&\n option.enabled &&\n sectionSetting.trigger === -1 &&\n option.trigger === -1;\n\n panel.expando.ineffective =\n sectionSetting.enabled &&\n option.enabled &&\n !option.seasons.autumn.enabled &&\n !option.seasons.spring.enabled &&\n !option.seasons.summer.enabled &&\n !option.seasons.winter.enabled;\n },\n }).addChildContent(\n new SeasonsList(parent, option.seasons, {\n onCheckSeason: (labelSeason: string) => {\n parent.host.engine.imessage(\"trade.season.enable\", [ucfirst(label), labelSeason]);\n },\n onUnCheckSeason: (labelSeason: string) => {\n parent.host.engine.imessage(\"trade.season.disable\", [ucfirst(label), labelSeason]);\n },\n }),\n );\n\n return panel;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingMax, SettingOptions } from \"../settings/Settings.js\";\nimport type { VillageSettings } from \"../settings/VillageSettings.js\";\nimport { cl } from \"../tools/Log.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport { Container } from \"./components/Container.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { HeaderListItem } from \"./components/HeaderListItem.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { OptionsListItem } from \"./components/OptionsListItem.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingMaxListItem } from \"./components/SettingMaxListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class VillageSettingsUi extends SettingsPanel<VillageSettings> {\n private readonly _hunt: SettingTriggerListItem;\n private readonly _festivals: SettingListItem;\n private readonly _promoteKittens: SettingTriggerListItem;\n private readonly _promoteLeader: SettingListItem;\n private readonly _electLeader: SettingListItem;\n\n constructor(\n parent: UiComponent,\n settings: VillageSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${VillageSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.distribute\");\n super(\n parent,\n settings,\n new SettingListItem(parent, settings, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n }).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]),\n {\n onRefreshRequest: () => {\n this.expando.ineffective =\n settings.enabled && Object.values(settings.jobs).some(_ => _.enabled && 0 === _.max);\n },\n },\n );\n\n const listJobs = new SettingsList(this).addChildren(\n this.host.game.village.jobs\n .filter(item => !isNil(this.setting.jobs[item.name]))\n .map(job =>\n this._getDistributeOption(\n this.setting.jobs[job.name],\n locale.selected,\n settings,\n job.title,\n ),\n ),\n );\n this.addChildContent(listJobs);\n\n const listAddition = new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n });\n\n listAddition.addChild(new HeaderListItem(this, this.host.engine.i18n(\"ui.additional\")));\n\n this._hunt = new SettingTriggerListItem(\n this,\n this.setting.hunt,\n locale,\n this.host.engine.i18n(\"option.hunt\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [this.host.engine.i18n(\"option.hunt\")]);\n },\n onRefreshRequest: () => {\n this._hunt.triggerButton.inactive = !this.setting.hunt.enabled;\n this._hunt.triggerButton.ineffective =\n this.setting.enabled && this.setting.hunt.enabled && this.setting.hunt.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n this.host.engine.i18n(\"ui.trigger.hunt.prompt\", [\n this.host.renderPercentage(this.setting.hunt.trigger, locale.selected, true),\n ]),\n this.host.renderPercentage(this.setting.hunt.trigger),\n this.host.engine.i18n(\"ui.trigger.hunt.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n this.setting.hunt.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [this.host.engine.i18n(\"option.hunt\")]);\n },\n },\n );\n this._hunt.triggerButton.element.addClass(stylesButton.lastHeadAction);\n listAddition.addChild(this._hunt);\n\n this._festivals = new SettingListItem(\n this,\n this.setting.holdFestivals,\n this.host.engine.i18n(\"option.festival\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.festival\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.festival\"),\n ]);\n },\n },\n );\n listAddition.addChild(this._festivals);\n\n this._promoteKittens = new SettingTriggerListItem(\n this,\n this.setting.promoteKittens,\n locale,\n this.host.engine.i18n(\"option.promotekittens\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.promotekittens\"),\n ]);\n },\n onRefresh: () => {\n this._promoteKittens.triggerButton.inactive = !this.setting.promoteKittens.enabled;\n this._promoteKittens.triggerButton.ineffective =\n this.setting.enabled &&\n this.setting.promoteKittens.enabled &&\n this.setting.promoteKittens.trigger === -1;\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.promoteKittens.promptTitle\"),\n this.host.engine.i18n(\"ui.trigger.promoteKittens.prompt\", [\n this.host.renderPercentage(\n this.setting.promoteKittens.trigger,\n locale.selected,\n true,\n ),\n ]),\n this.host.renderPercentage(this.setting.promoteKittens.trigger),\n this.host.engine.i18n(\"ui.trigger.promoteKittens.promptExplainer\"),\n );\n\n if (value === undefined || value === \"\" || value.startsWith(\"-\")) {\n return;\n }\n\n this.setting.promoteKittens.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.promotekittens\"),\n ]);\n },\n },\n );\n this._promoteKittens.triggerButton.element.addClass(stylesButton.lastHeadAction);\n listAddition.addChild(this._promoteKittens);\n\n this._promoteLeader = new SettingListItem(\n this,\n this.setting.promoteLeader,\n this.host.engine.i18n(\"option.promote\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [this.host.engine.i18n(\"option.promote\")]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.promote\"),\n ]);\n },\n },\n );\n listAddition.addChild(this._promoteLeader);\n\n for (const option of this.setting.electLeader.job.options) {\n if (option.value === \"any\") {\n option.label = this.host.engine.i18n(\"option.elect.job.any\");\n } else {\n option.label = this.host.engine.i18n(`$village.job.${option.value}`);\n }\n }\n\n for (const option of this.setting.electLeader.trait.options) {\n option.label = this.host.engine.i18n(`$village.trait.${option.value}`);\n }\n\n this._electLeader = new SettingListItem(\n this,\n this.setting.electLeader,\n this.host.engine.i18n(\"option.elect\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [this.host.engine.i18n(\"option.elect\")]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [this.host.engine.i18n(\"option.elect\")]);\n },\n },\n ).addChildren([\n new OptionsListItem(\n this,\n this.host.engine.i18n(\"option.elect.job\"),\n this.setting.electLeader.job,\n ),\n new OptionsListItem(\n this,\n this.host.engine.i18n(\"option.elect.trait\"),\n this.setting.electLeader.trait,\n ),\n ]);\n listAddition.addChild(this._electLeader);\n\n this.addChildContent(listAddition);\n }\n\n private _getDistributeOption(\n option: SettingMax,\n locale: SupportedLocale,\n sectionSetting: VillageSettings,\n label: string,\n delimiter = false,\n ) {\n const onSetMax = async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.max.distribute.prompt\", [label]),\n this.host.engine.i18n(\"ui.max.distribute.promptTitle\", [\n label,\n this.host.renderAbsolute(option.max, locale),\n ]),\n this.host.renderAbsolute(option.max),\n this.host.engine.i18n(\"ui.max.distribute.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.max = -1;\n return;\n }\n\n if (value === \"0\") {\n option.enabled = false;\n }\n\n option.max = this.host.parseAbsolute(value) ?? option.max;\n };\n\n const element = new SettingMaxListItem(this, option, label, {\n delimiter,\n onCheck: (isBatchProcess?: boolean) => {\n this.host.engine.imessage(\"status.sub.enable\", [label]);\n if (option.max === 0 && !isBatchProcess) {\n return onSetMax();\n }\n },\n onRefresh: () => {\n element.maxButton.inactive = !option.enabled || option.max === -1;\n element.maxButton.ineffective =\n sectionSetting.enabled && option.enabled && option.max === 0;\n },\n onRefreshMax: () => {\n element.maxButton.updateLabel(this.host.renderAbsolute(option.max));\n element.maxButton.element[0].title =\n option.max < 0\n ? this.host.engine.i18n(\"ui.max.distribute.titleInfinite\", [label])\n : option.max === 0\n ? this.host.engine.i18n(\"ui.max.distribute.titleZero\", [label])\n : this.host.engine.i18n(\"ui.max.distribute.title\", [\n this.host.renderAbsolute(option.max),\n label,\n ]);\n },\n onSetMax,\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n });\n element.maxButton.element.addClass(stylesButton.lastHeadAction);\n return element;\n }\n}\n","import type { SupportedLocale } from \"../../Engine.js\";\nimport type { SettingOptions } from \"../../settings/Settings.js\";\nimport type { CraftSettingsItem } from \"../../settings/WorkshopSettings.js\";\nimport stylesButton from \"./Button.module.css\";\nimport { LimitedButton } from \"./buttons/LimitedButton.js\";\nimport { MaxButton } from \"./buttons/MaxButton.js\";\nimport { TriggerButton } from \"./buttons/TriggerButton.js\";\nimport { Container } from \"./Container.js\";\nimport stylesLabelListItem from \"./LabelListItem.module.css\";\nimport stylesListItem from \"./ListItem.module.css\";\nimport type { SettingLimitedListItemOptions } from \"./SettingLimitedListItem.js\";\nimport { SettingListItem, type SettingListItemOptions } from \"./SettingListItem.js\";\nimport type { SettingMaxListItemOptions } from \"./SettingMaxListItem.js\";\nimport type { SettingTriggerListItemOptions } from \"./SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./UiComponent.js\";\n\nexport type WorkshopCraftListItemOptions = SettingListItemOptions &\n SettingLimitedListItemOptions &\n SettingMaxListItemOptions &\n SettingTriggerListItemOptions &\n ThisType<WorkshopCraftListItem>;\n\nexport class WorkshopCraftListItem extends SettingListItem<CraftSettingsItem> {\n declare readonly options: WorkshopCraftListItemOptions;\n readonly limitedButton: LimitedButton;\n readonly maxButton: MaxButton;\n readonly triggerButton: TriggerButton;\n\n constructor(\n parent: UiComponent,\n setting: CraftSettingsItem,\n locale: SettingOptions<SupportedLocale>,\n label: string,\n options: WorkshopCraftListItemOptions,\n ) {\n super(parent, setting, label, options);\n\n this.limitedButton = new LimitedButton(parent, setting, {\n ...options,\n classes: [stylesListItem.headAction],\n });\n\n this.maxButton = new MaxButton(parent, setting, {\n alignment: \"right\",\n border: false,\n classes: [stylesButton.headAction],\n onClick: () => options.onSetMax.call(this),\n onRefresh: options?.onRefreshMax ? () => options.onRefreshMax?.call(this) : undefined,\n });\n\n this.triggerButton = new TriggerButton(parent, setting, locale, {\n border: false,\n classes: [stylesButton.lastHeadAction],\n onClick: async () => {\n await options.onSetTrigger.call(this);\n },\n onRefresh: options?.onRefreshTrigger ? () => options.onRefreshTrigger?.call(this) : undefined,\n renderLabel: options?.renderLabelTrigger ?? true,\n });\n this.addChildrenHead([\n new Container(parent, { classes: [stylesLabelListItem.fillSpace] }),\n this.limitedButton,\n this.maxButton,\n this.triggerButton,\n ]);\n }\n\n toString(): string {\n return `[${WorkshopCraftListItem.name}#${this.componentId}]`;\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport type { UpgradeSettings } from \"../settings/UpgradeSettings.js\";\nimport stylesButton from \"./components/Button.module.css\";\nimport stylesDelimiter from \"./components/Delimiter.module.css\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport stylesLabelListItem from \"./components/LabelListItem.module.css\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\n\nexport class UpgradeSettingsUi extends SettingsPanel<UpgradeSettings, SettingTriggerListItem> {\n constructor(\n parent: UiComponent,\n settings: UpgradeSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n const label = parent.host.engine.i18n(\"ui.upgrade.upgrades\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger\", [\n settings.trigger === -1\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.upgrades).some(_ => _.enabled && _.trigger < 0);\n\n this.expando.ineffective =\n settings.enabled && !Object.values(settings.upgrades).some(_ => _.enabled);\n },\n },\n );\n\n const upgrades = this.host.game.workshop.upgrades.filter(\n upgrade => !isNil(this.setting.upgrades[upgrade.name]),\n );\n\n const items = [];\n let lastLabel = upgrades[0].label;\n let lastElement: SettingTriggerListItem | undefined;\n for (const upgrade of upgrades.sort((a, b) =>\n a.label.localeCompare(b.label, locale.selected),\n )) {\n const option = this.setting.upgrades[upgrade.name];\n\n const element = new SettingTriggerListItem(this, option, locale, upgrade.label, {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [upgrade.label]);\n },\n onRefreshRequest: () => {\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n settings.enabled && option.enabled && settings.trigger === -1 && option.trigger === -1;\n },\n onRefreshTrigger: () => {\n element.triggerButton.element[0].title = this.host.engine.i18n(\"ui.trigger\", [\n option.trigger < 0\n ? settings.trigger < 0\n ? this.host.engine.i18n(\"ui.trigger.build.blocked\", [label])\n : `${this.host.renderPercentage(settings.trigger, locale.selected, true)} (${this.host.engine.i18n(\"ui.trigger.section.inherited\")})`\n : this.host.renderPercentage(option.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n this.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n option.trigger !== -1\n ? this.host.renderPercentage(option.trigger, locale.selected, true)\n : this.host.engine.i18n(\"ui.trigger.section.inherited\"),\n ]),\n option.trigger !== -1 ? this.host.renderPercentage(option.trigger) : \"\",\n this.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n return;\n }\n\n option.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [upgrade.label]);\n },\n renderLabelTrigger: false,\n });\n element.triggerButton.element.addClass(stylesButton.lastHeadAction);\n\n if (this.host.engine.localeSupportsFirstLetterSplits(locale.selected)) {\n if (lastLabel[0] !== upgrade.label[0]) {\n if (!isNil(lastElement)) {\n lastElement.element.addClass(stylesDelimiter.delimiter);\n }\n element.element.addClass(stylesLabelListItem.splitter);\n }\n }\n\n lastElement = element;\n items.push(element);\n\n lastLabel = upgrade.label;\n }\n\n this.addChildContent(new SettingsList(this).addChildren(items));\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport type { SupportedLocale } from \"../Engine.js\";\nimport type { SettingOptions } from \"../settings/Settings.js\";\nimport { type CraftSettingsItem, WorkshopSettings } from \"../settings/WorkshopSettings.js\";\nimport { ucfirst } from \"../tools/Format.js\";\nimport { cl } from \"../tools/Log.js\";\nimport type { ResourceCraftable } from \"../types/index.js\";\nimport { Dialog } from \"./components/Dialog.js\";\nimport { SettingListItem } from \"./components/SettingListItem.js\";\nimport { SettingsList } from \"./components/SettingsList.js\";\nimport { SettingsPanel } from \"./components/SettingsPanel.js\";\nimport { SettingTriggerListItem } from \"./components/SettingTriggerListItem.js\";\nimport type { UiComponent } from \"./components/UiComponent.js\";\nimport { WorkshopCraftListItem } from \"./components/WorkshopCraftListItem.js\";\nimport { UpgradeSettingsUi } from \"./UpgradeSettingsUi.js\";\n\nexport class WorkshopSettingsUi extends SettingsPanel<WorkshopSettings, SettingTriggerListItem> {\n private readonly _crafts: Array<SettingListItem>;\n\n constructor(\n parent: UiComponent,\n settings: WorkshopSettings,\n locale: SettingOptions<SupportedLocale>,\n ) {\n console.debug(...cl(`Constructing ${WorkshopSettingsUi.name}`));\n\n const label = parent.host.engine.i18n(\"ui.craft\");\n super(\n parent,\n settings,\n new SettingTriggerListItem(parent, settings, locale, label, {\n onCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.enable\", [label]);\n },\n onRefreshTrigger() {\n this.triggerButton.element[0].title = parent.host.engine.i18n(\"ui.trigger.section\", [\n settings.trigger < 0\n ? parent.host.engine.i18n(\"ui.trigger.section.inactive\")\n : parent.host.renderPercentage(settings.trigger, locale.selected, true),\n ]);\n },\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n parent,\n parent.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n parent.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n settings.trigger !== -1\n ? parent.host.renderPercentage(settings.trigger, locale.selected, true)\n : parent.host.engine.i18n(\"ui.infinity\"),\n ]),\n settings.trigger !== -1 ? parent.host.renderPercentage(settings.trigger) : \"\",\n parent.host.engine.i18n(\"ui.trigger.section.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n settings.trigger = -1;\n return;\n }\n\n settings.trigger = parent.host.parsePercentage(value);\n },\n onUnCheck: (_isBatchProcess?: boolean) => {\n parent.host.engine.imessage(\"status.auto.disable\", [label]);\n },\n renderLabelTrigger: false,\n }),\n {\n onRefreshRequest: () => {\n this.settingItem.triggerButton.inactive = !settings.enabled || settings.trigger === -1;\n this.settingItem.triggerButton.ineffective =\n settings.enabled &&\n settings.trigger < 0 &&\n Object.values(settings.resources).some(_ => _.enabled && 0 !== _.max && _.trigger < 0);\n },\n },\n );\n\n let excludeCraftsArray: Array<ResourceCraftable> = [];\n if (!game.challenges.getChallenge(\"ironWill\").active) {\n this.setting.resources.bloodstone.enabled = false;\n this.setting.resources.tMythril.enabled = false;\n excludeCraftsArray = [\"bloodstone\", \"tMythril\"];\n }\n\n const preparedCrafts: Array<[CraftSettingsItem, string]> = this.host.game.workshop.crafts\n .filter(\n item =>\n !excludeCraftsArray.includes(item.name) && !isNil(this.setting.resources[item.name]),\n )\n .map(resource => [this.setting.resources[resource.name], ucfirst(resource.label)]);\n\n this._crafts = [];\n for (const [option, label] of preparedCrafts) {\n const onSetMax = async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.max.craft.prompt\", [label]),\n this.host.engine.i18n(\"ui.max.craft.promptTitle\", [\n label,\n this.host.renderAbsolute(option.max, locale.selected),\n ]),\n this.host.renderAbsolute(option.max),\n this.host.engine.i18n(\"ui.max.craft.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.max = -1;\n return;\n }\n\n if (value === \"0\") {\n option.enabled = false;\n }\n\n option.max = this.host.parseAbsolute(value) ?? option.max;\n };\n\n const element = new WorkshopCraftListItem(this, option, locale, label, {\n delimiter: option.resource === \"kerosene\" || option.resource === \"blueprint\",\n onCheck: (isBatchProcess?: boolean) => {\n this.host.engine.imessage(\"status.sub.enable\", [label]);\n if (option.max === 0 && !isBatchProcess) {\n return onSetMax();\n }\n },\n onLimitedCheck: () => {\n this.host.engine.imessage(\"craft.limited\", [label]);\n },\n onLimitedUnCheck: () => {\n this.host.engine.imessage(\"craft.unlimited\", [label]);\n },\n onRefreshMax: () => {\n element.maxButton.updateLabel(this.host.renderAbsolute(option.max));\n element.maxButton.element[0].title =\n option.max < 0\n ? this.host.engine.i18n(\"ui.max.craft.titleInfinite\", [label])\n : option.max === 0\n ? this.host.engine.i18n(\"ui.max.craft.titleZero\", [label])\n : this.host.engine.i18n(\"ui.max.craft.title\", [\n this.host.renderAbsolute(option.max),\n label,\n ]);\n },\n onRefreshRequest: () => {\n element.limitedButton.inactive = !option.enabled || !option.limited;\n element.maxButton.inactive = !option.enabled || option.max === -1;\n element.maxButton.ineffective = settings.enabled && option.enabled && option.max === 0;\n element.triggerButton.inactive = !option.enabled || option.trigger === -1;\n element.triggerButton.ineffective =\n settings.enabled && option.enabled && settings.trigger === -1 && option.trigger === -1;\n },\n onRefreshTrigger: () => {\n element.triggerButton.element[0].title = this.host.engine.i18n(\"ui.trigger\", [\n option.trigger < 0\n ? settings.trigger < 0\n ? this.host.engine.i18n(\"ui.trigger.build.blocked\", [label])\n : `${this.host.renderPercentage(settings.trigger, locale.selected, true)} (${this.host.engine.i18n(\"ui.trigger.build.inherited\")})`\n : this.host.renderPercentage(option.trigger, locale.selected, true),\n ]);\n },\n onSetMax,\n onSetTrigger: async () => {\n const value = await Dialog.prompt(\n this,\n this.host.engine.i18n(\"ui.trigger.prompt.percentage\"),\n this.host.engine.i18n(\"ui.trigger.section.prompt\", [\n label,\n option.trigger !== -1\n ? this.host.renderPercentage(option.trigger, locale.selected, true)\n : this.host.engine.i18n(\"ui.trigger.build.inherited\"),\n ]),\n option.trigger !== -1 ? this.host.renderPercentage(option.trigger) : \"\",\n this.host.engine.i18n(\"ui.trigger.build.promptExplainer\"),\n );\n\n if (value === undefined) {\n return;\n }\n\n if (value === \"\" || value.startsWith(\"-\")) {\n option.trigger = -1;\n return;\n }\n\n option.trigger = this.host.parsePercentage(value);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [label]);\n },\n renderLabelTrigger: false,\n });\n this._crafts.push(element);\n\n if (option.resource === \"ship\") {\n this._crafts.push(\n new SettingListItem(\n this,\n this.setting.shipOverride,\n this.host.engine.i18n(\"option.shipOverride\"),\n {\n onCheck: () => {\n this.host.engine.imessage(\"status.sub.enable\", [\n this.host.engine.i18n(\"option.shipOverride\"),\n ]);\n },\n onUnCheck: () => {\n this.host.engine.imessage(\"status.sub.disable\", [\n this.host.engine.i18n(\"option.shipOverride\"),\n ]);\n },\n upgradeIndicator: true,\n },\n ),\n );\n }\n }\n\n const listCrafts = new SettingsList(this, {\n onReset: () => {\n this.setting.load({ resources: new WorkshopSettings().resources });\n },\n }).addChildren(this._crafts);\n this.addChildContent(listCrafts);\n\n this.addChildContent(\n new SettingsList(this, {\n hasDisableAll: false,\n hasEnableAll: false,\n }).addChildren([new UpgradeSettingsUi(this, this.setting.unlockUpgrades, locale)]),\n );\n }\n}\n","import { formatMilliseconds } from \"@oliversalzburg/js-utils/format/milliseconds.js\";\nimport { measure } from \"@oliversalzburg/js-utils/measurement/performance.js\";\nimport { Icons } from \"../images/Icons.js\";\nimport type { KittenScientists } from \"../KittenScientists.js\";\nimport { cl } from \"../tools/Log.js\";\nimport { UserScriptLoader } from \"../UserScriptLoader.js\";\nimport { BonfireSettingsUi } from \"./BonfireSettingsUi.js\";\nimport { UiComponent } from \"./components/UiComponent.js\";\nimport { EngineSettingsUi } from \"./EngineSettingsUi.js\";\nimport { InternalsUi } from \"./InternalsUi.js\";\nimport { LogFiltersSettingsUi } from \"./LogFilterSettingsUi.js\";\nimport { ReligionSettingsUi } from \"./ReligionSettingsUi.js\";\nimport { ResourcesSettingsUi } from \"./ResourcesSettingsUi.js\";\nimport { ScienceSettingsUi } from \"./ScienceSettingsUi.js\";\nimport { SpaceSettingsUi } from \"./SpaceSettingsUi.js\";\nimport { StateManagementUi } from \"./StateManagementUi.js\";\nimport { TimeControlSettingsUi } from \"./TimeControlSettingsUi.js\";\nimport { TimeSettingsUi } from \"./TimeSettingsUi.js\";\nimport { TradeSettingsUi } from \"./TradeSettingsUi.js\";\nimport styles from \"./UserInterface.module.css\";\nimport { VillageSettingsUi } from \"./VillageSettingsUi.js\";\nimport { WorkshopSettingsUi } from \"./WorkshopSettingsUi.js\";\n\nexport class UserInterface extends UiComponent {\n readonly showActivity: JQuery;\n\n private _engineUi: EngineSettingsUi;\n private _sections: Array<\n | BonfireSettingsUi\n | SpaceSettingsUi\n | WorkshopSettingsUi\n | ResourcesSettingsUi\n | ScienceSettingsUi\n | TradeSettingsUi\n | ReligionSettingsUi\n | TimeSettingsUi\n | TimeControlSettingsUi\n | VillageSettingsUi\n | LogFiltersSettingsUi\n | StateManagementUi\n | InternalsUi\n >;\n stateManagementUi: StateManagementUi;\n\n private _refreshTimeout: number | undefined;\n\n constructor(host: KittenScientists) {\n console.debug(...cl(`Constructing ${UserInterface.name}`));\n\n super({ host }, {});\n\n const engine = host.engine;\n this._engineUi = new EngineSettingsUi(this, engine.settings);\n this.stateManagementUi = new StateManagementUi(\n this,\n engine.settings.states,\n engine.settings.locale,\n );\n this._sections = [\n new BonfireSettingsUi(this, engine.bonfireManager.settings, engine.settings.locale),\n new VillageSettingsUi(this, engine.villageManager.settings, engine.settings.locale),\n new ScienceSettingsUi(this, engine.scienceManager.settings, engine.settings.locale),\n new WorkshopSettingsUi(this, engine.workshopManager.settings, engine.settings.locale),\n new ResourcesSettingsUi(this, engine.settings.resources, engine.settings.locale),\n new TradeSettingsUi(this, engine.tradeManager.settings, engine.settings.locale),\n new ReligionSettingsUi(this, engine.religionManager.settings, engine.settings.locale),\n new SpaceSettingsUi(this, engine.spaceManager.settings, engine.settings.locale),\n new TimeSettingsUi(this, engine.timeManager.settings, engine.settings.locale),\n new TimeControlSettingsUi(this, engine.timeControlManager.settings, engine.settings.locale),\n new LogFiltersSettingsUi(this, engine.settings.filters),\n this.stateManagementUi,\n new InternalsUi(this, engine.settings, engine.settings.locale),\n ];\n\n this.parent = this;\n this.element = $(\"<div/>\").addClass(\"kitten-scientists\").addClass(styles.ui);\n for (const section of [this._engineUi, ...this._sections]) {\n this.addChild(section);\n }\n\n const optionsListElement = $(\"<ul/>\");\n optionsListElement.append(this._engineUi.element);\n for (const section of this._sections) {\n optionsListElement.append(section.element);\n }\n this.element.append(optionsListElement);\n\n // Make _engineUI's expando button hide/show the other option groups\n const expando = this._engineUi.expando;\n let sectionsVisible = false;\n expando.element.on(\"click\", () => {\n sectionsVisible = !sectionsVisible;\n for (const section of this._sections) {\n section.toggle(sectionsVisible, true);\n }\n });\n\n // Keep track of open panels and adjust the state of the\n // expando accordingly.\n let panelsOpen = 0;\n for (const section of this._sections) {\n section.element[0].addEventListener(\"panelHidden\", () => {\n --panelsOpen;\n if (panelsOpen === 0) {\n sectionsVisible = false;\n }\n if (!sectionsVisible) {\n expando.setCollapsed();\n }\n });\n section.element[0].addEventListener(\"panelShown\", () => {\n ++panelsOpen;\n sectionsVisible = true;\n expando.setExpanded();\n });\n }\n\n // Set up the \"show activity summary\" area.\n this.showActivity = $(\"<span/>\", {\n html: `<svg style=\"width: 18px; height: 18px;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"${Icons.Summary}\"/></svg>`,\n title: host.engine.i18n(\"summary.show\"),\n }).addClass(styles.showActivity);\n\n this.showActivity.on(\"click\", () => {\n host.engine.displayActivitySummary();\n });\n\n $(\"#clearLog\").prepend(this.showActivity);\n\n // Add Kitten Scientists above the game log.\n\n const usingKSColumn = engine.settings.ksColumn.enabled && game.colorScheme !== \"sleek\";\n if (usingKSColumn) {\n $(\"#rightColumn\").after(\n `<div id=\"ksColumn\" class=\"column\"><span class=\"${styles.spacer}\"></span></div>`,\n );\n } else {\n $(\"#ksColumn\").remove();\n }\n\n const right = $(usingKSColumn ? \"#ksColumn\" : \"#rightColumn\");\n if (right.length === 0) {\n // Try to fall back to options page.\n const optionsPageContent = $(\"#optionsPage .full-screen-position .page .page-content\");\n if (optionsPageContent.length === 0) {\n console.warn(...cl(\"Unable to find right column to inject UI into. Running headless.\"));\n } else {\n optionsPageContent.append(this.element);\n this.element.attr(\"style\", \"border-top:1px solid grey; padding:15px\");\n }\n } else {\n right.prepend(this.element);\n }\n this.element = this.element;\n\n this._needsRefresh = false;\n }\n\n toString(): string {\n return `[${UserInterface.name}#${this.componentId}]`;\n }\n\n destroy() {\n if (this._refreshTimeout !== undefined) {\n UserScriptLoader.window.clearTimeout(this._refreshTimeout);\n this._refreshTimeout = undefined;\n }\n this.showActivity.remove();\n this.element.remove();\n }\n\n requestRefresh(_withChildren = true, depth = 0, _trace = false) {\n if (this._needsRefresh) {\n if (this._refreshTimeout === undefined) {\n console.error(...cl(\"User interface claims to have a refresh pending, but there isn't.\"));\n }\n return;\n }\n\n this._refreshTimeout = UserScriptLoader.window.setTimeout(() => {\n const [_, duration] = measure(() => this.refresh());\n console.info(...cl(`UI refresh took ${formatMilliseconds(duration)}.`));\n this._refreshTimeout = undefined;\n }, 0);\n\n super.requestRefresh(true, depth, false);\n }\n\n forceFullRefresh(): void {\n console.warn(...cl(\"Forcing refresh on all user interface components...\"));\n this.requestRefresh();\n console.warn(...cl(\"Refresh on all user interface components enforced.\"));\n }\n}\n","import { isNil } from \"@oliversalzburg/js-utils/data/nil.js\";\nimport { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport { InvalidOperationError } from \"@oliversalzburg/js-utils/errors/InvalidOperationError.js\";\nimport gt from \"semver/functions/gt.js\";\nimport { Engine, type EngineState, type SupportedLocale } from \"./Engine.js\";\nimport { ScienceSettings } from \"./settings/ScienceSettings.js\";\nimport { SpaceSettings } from \"./settings/SpaceSettings.js\";\nimport { WorkshopSettings } from \"./settings/WorkshopSettings.js\";\nimport { cl } from \"./tools/Log.js\";\nimport type { ReleaseChannel, ReleaseInfoSchema } from \"./types/_releases.js\";\nimport type { GamePage } from \"./types/game.js\";\nimport type { I18nEngine, Locale } from \"./types/index.js\";\nimport { UserScriptLoader } from \"./UserScriptLoader.js\";\nimport { UserInterface } from \"./ui/UserInterface.js\";\n\ndeclare global {\n const GM: unknown;\n const RELEASE_CHANNEL: ReleaseChannel;\n const RELEASE_VERSION: string | undefined;\n}\n\nexport const ksVersion = (prefix = \"\") => {\n if (isNil(RELEASE_VERSION)) {\n throw Error(\"Build error: RELEASE_VERSION is not defined.\");\n }\n\n return `${prefix}${RELEASE_VERSION}`;\n};\n\nexport class KittenScientists {\n readonly game: GamePage;\n\n /**\n * A function in the game that allows to retrieve translated messages.\n *\n * Ideally, you should never access this directly and instead use the\n * i18n interface provided by `Engine`.\n */\n readonly i18nEngine: I18nEngine;\n\n private _userInterface: UserInterface;\n engine: Engine;\n\n private _gameBeforeSaveHandle: [\"game/beforesave\", number] | undefined;\n private _serverLoadHandle: [\"server/load\", number] | undefined;\n\n constructor(\n game: GamePage,\n i18nEngine: I18nEngine,\n gameLanguage: Locale = \"en\",\n engineState?: EngineState,\n ) {\n console.info(\n ...cl(`Kitten Scientists ${ksVersion(\"v\")} constructed. Checking for previous instances...`),\n );\n if (\"kittenScientists\" in UserScriptLoader.window) {\n console.warn(...cl(\"Detected existing KS instance. Trying to unload it...\"));\n UserScriptLoader.window.kittenScientists?.unload();\n }\n console.info(...cl(`You are on the '${String(RELEASE_CHANNEL)}' release channel.`));\n\n this.game = game;\n this.i18nEngine = i18nEngine;\n try {\n this.engine = new Engine(this, gameLanguage);\n this._userInterface = new UserInterface(this);\n } catch (error: unknown) {\n console.error(...cl(\"Failed to construct core components.\", error));\n if (typeof GM !== \"undefined\") {\n console.warn(...cl(\"Detected running in Greasemonkey.\"));\n }\n throw error;\n }\n\n if (!isNil(engineState)) {\n this.setSettings(engineState);\n } else {\n this._userInterface.stateManagementUi.loadAutoSave();\n }\n }\n\n rebuildUi() {\n this._userInterface.destroy();\n this._userInterface = new UserInterface(this);\n this._userInterface.forceFullRefresh();\n }\n\n /**\n * Runs some validations against the game to determine if internal control\n * structures still match up with expectations.\n * Issues should be logged to the console.\n */\n validateGame() {\n ScienceSettings.validateGame(this.game, this.engine.scienceManager.settings);\n SpaceSettings.validateGame(this.game, this.engine.spaceManager.settings);\n WorkshopSettings.validateGame(this.game, this.engine.workshopManager.settings);\n }\n\n /**\n * Removes Kitten Scientists from the browser.\n */\n unload(): void {\n console.warn(...cl(\"Unloading Kitten Scientists...\"));\n this.engine.stop();\n this._userInterface.destroy();\n $(\"#ks-styles\").remove();\n if (this._gameBeforeSaveHandle !== undefined) {\n UserScriptLoader.window.dojo.unsubscribe(this._gameBeforeSaveHandle);\n this._gameBeforeSaveHandle = undefined;\n }\n if (this._serverLoadHandle !== undefined) {\n UserScriptLoader.window.dojo.unsubscribe(this._serverLoadHandle);\n this._gameBeforeSaveHandle = undefined;\n }\n const managerIndex = this.game.managers.indexOf(this._saveManager);\n if (-1 < managerIndex) {\n this.game.managers.splice(managerIndex, 1);\n }\n UserScriptLoader.window.kittenScientists = undefined;\n console.warn(...cl(\"Kitten Scientists have been unloaded!\"));\n }\n\n /**\n * Start the user script after loading and configuring it.\n */\n run(): void {\n // Increase messages displayed in log\n // TODO: This should be configurable.\n this.game.console.maxMessages = 1000;\n\n this.refreshEntireUserInterface();\n\n if (this.engine.settings.enabled) {\n this.engine.start(true);\n }\n\n this.engine.imessage(\"status.ks.init\");\n\n this.runUpdateCheck().catch(redirectErrorsToConsole(console));\n\n if (this._gameBeforeSaveHandle !== undefined) {\n UserScriptLoader.window.dojo.unsubscribe(this._gameBeforeSaveHandle);\n this._gameBeforeSaveHandle = undefined;\n }\n this._gameBeforeSaveHandle = UserScriptLoader.window.dojo.subscribe(\n \"game/beforesave\",\n (saveData: Record<string, unknown>) => {\n console.info(...cl(\"Injecting Kitten Scientists engine state into save data...\"));\n const state = this.getSettings();\n saveData.ks = { state: [state] };\n this._userInterface.stateManagementUi.storeAutoSave(state);\n document.dispatchEvent(\n new CustomEvent<typeof saveData>(\"ks.reportSavegame\", { detail: saveData }),\n );\n },\n );\n\n if (this._serverLoadHandle !== undefined) {\n UserScriptLoader.window.dojo.unsubscribe(this._serverLoadHandle);\n this._gameBeforeSaveHandle = undefined;\n }\n this._serverLoadHandle = UserScriptLoader.window.dojo.subscribe(\n \"server/load\",\n (saveData: unknown) => {\n const state = UserScriptLoader.tryEngineStateFromSaveData(\"ks\", saveData) as\n | EngineState\n | undefined;\n\n if (!state) {\n console.info(\n ...cl(\n \"The Kittens Game save data did not contain a script state. Trying to load Auto-Save settings...\",\n ),\n );\n return;\n }\n\n console.info(...cl(\"Found! Loading settings...\"));\n this.engine.stateLoad(state);\n },\n );\n }\n\n /**\n * Check which versions of KS are currently published.\n */\n async runUpdateCheck() {\n if (RELEASE_CHANNEL === \"fixed\") {\n console.debug(...cl(\"No update check on 'fixed' release channel.\"));\n return;\n }\n\n try {\n const response = await fetch(\"https://kitten-science.com/release-info.json\");\n const releaseInfo = (await response.json()) as ReleaseInfoSchema;\n console.debug(...cl(releaseInfo));\n\n if (\n isNil(releaseInfo[RELEASE_CHANNEL].version) ||\n releaseInfo[RELEASE_CHANNEL].version === \"\"\n ) {\n console.debug(\n \"Could not read current version for our release channel from provided metadata!\",\n );\n return;\n }\n\n if (!isNil(RELEASE_VERSION) && gt(releaseInfo[RELEASE_CHANNEL].version, RELEASE_VERSION)) {\n this.engine.imessage(\"status.ks.upgrade\", [\n releaseInfo[RELEASE_CHANNEL].version,\n RELEASE_VERSION,\n releaseInfo[RELEASE_CHANNEL].url.release,\n ]);\n }\n } catch (error) {\n console.warn(...cl(\"Update check failed.\"));\n console.warn(...cl(error));\n }\n }\n\n /**\n * Requests the user interface to refresh.\n */\n refreshEntireUserInterface(): void {\n console.info(...cl(\"Requesting entire user interface to be refreshed.\"));\n this._userInterface.forceFullRefresh();\n }\n\n /**\n * Turns a string like 52.7 into the number 52.7\n * @param value - String representation of an absolute value.\n * @returns A number between 0 and Infinity, where Infinity is represented as -1.\n */\n parseFloat(value: string | null): number | null {\n if (value === null || value === \"\") {\n return null;\n }\n\n const hasSuffix = /[KMGTP]$/i.test(value);\n const baseValue = value.substring(0, value.length - (hasSuffix ? 1 : 0));\n\n let numericValue =\n value.includes(\"e\") || hasSuffix ? Number.parseFloat(baseValue) : Number.parseInt(baseValue);\n if (hasSuffix) {\n const suffix = value.substring(value.length - 1).toUpperCase();\n numericValue = numericValue * 1000 ** [\"\", \"K\", \"M\", \"G\", \"T\", \"P\"].indexOf(suffix);\n }\n if (numericValue === Number.POSITIVE_INFINITY || numericValue < 0) {\n numericValue = -1;\n }\n\n return numericValue;\n }\n\n parseAbsolute(value: string | null): number | null {\n const floatValue = this.parseFloat(value);\n return floatValue !== null ? Math.round(floatValue) : null;\n }\n\n /**\n * Turns a string like 52.7 into the number 0.527\n * @param value - String representation of a percentage.\n * @returns A number between 0 and 1 representing the described percentage.\n */\n parsePercentage(value: string): number {\n const cleanedValue = value.trim().replace(/%$/, \"\");\n return Math.max(0, Math.min(1, Number.parseFloat(cleanedValue) / 100));\n }\n\n /**\n * Turns a number into a game-native string representation.\n * Infinity, either by actual value or by -1 representation, is rendered as a symbol.\n * @param value - The number to render as a string.\n * @param host - The host instance which we can use to let the game render values for us.\n * @returns A string representing the given number.\n */\n renderAbsolute(value: number, locale: SupportedLocale | \"invariant\" = \"invariant\") {\n if (value < 0 || value === Number.POSITIVE_INFINITY) {\n return \"∞\";\n }\n\n return locale !== \"invariant\" && Math.floor(Math.log10(value)) < 9\n ? new Intl.NumberFormat(locale, { maximumFractionDigits: 0, style: \"decimal\" }).format(value)\n : this.game.getDisplayValueExt(value, false, false);\n }\n\n /**\n * Turns a number like 0.527 into a string like 52.7\n * @param value - The number to render as a string.\n * @param locale - The locale in which to render the percentage.\n * @param withUnit - Should the percentage sign be included in the output?\n * @returns A string representing the given percentage.\n */\n renderPercentage(\n value: number,\n locale: SupportedLocale | \"invariant\" = \"invariant\",\n withUnit?: boolean,\n ): string {\n if (value < 0 || value === Number.POSITIVE_INFINITY) {\n return \"∞\";\n }\n\n return locale !== \"invariant\"\n ? new Intl.NumberFormat(locale, { style: \"percent\" }).format(value)\n : `${this.game.getDisplayValueExt(value * 100, false, false)}${withUnit ? \"%\" : \"\"}`;\n }\n\n renderFloat(value: number, locale: SupportedLocale | \"invariant\" = \"invariant\"): string {\n if (value < 0 || value === Number.POSITIVE_INFINITY) {\n return \"∞\";\n }\n\n return locale !== \"invariant\"\n ? new Intl.NumberFormat(locale, { style: \"decimal\" }).format(value)\n : this.game.getDisplayValueExt(value, false, false);\n }\n\n //#region Settings\n /**\n * Encodes an engine states into a string.\n *\n * @param settings The engine state to encode.\n * @param compress Should we use LZString compression?\n * @returns The settings encoded into a string.\n */\n static encodeSettings(settings: EngineState, compress = true): string {\n const settingsString = JSON.stringify(settings);\n return compress\n ? UserScriptLoader.window.LZString.compressToBase64(settingsString)\n : settingsString;\n }\n\n /**\n * Given a serialized engine state, attempts to deserialize that engine state.\n * Assumes the input has been compressed with LZString, will accept uncompressed.\n *\n * @param compressedSettings An engine state that has previously been serialized to a string.\n * @returns The engine state, if valid.\n */\n static decodeSettings(compressedSettings: string): EngineState {\n try {\n const naiveParse = JSON.parse(compressedSettings) as { v?: string };\n return KittenScientists.unknownAsEngineStateOrThrow(naiveParse);\n } catch (_error) {\n /* expected, as we assume the input to be compressed. */\n }\n\n if (compressedSettings.match(/\\r?\\n/)) {\n throw new InvalidOperationError(\"Multi-line non-JSON input can't be decoded.\");\n }\n\n const settingsString =\n UserScriptLoader.window.LZString.decompressFromBase64(compressedSettings);\n const parsed = JSON.parse(settingsString) as Record<string, unknown>;\n return KittenScientists.unknownAsEngineStateOrThrow(parsed);\n }\n\n /**\n * Retrieves the state from the engine.\n *\n * @returns The engine state.\n */\n getSettings(): EngineState {\n return this.engine.stateSerialize();\n }\n\n getSettingsAsJson(): string {\n return JSON.stringify(this.getSettings());\n }\n\n /**\n * Updates the engine with a new state.\n *\n * @param settings The engine state to apply.\n */\n setSettings(settings: EngineState) {\n console.info(...cl(\"Loading engine state...\"));\n const requiresUiRebuild =\n this.engine.settings.ksColumn.enabled !== settings.engine.ksColumn.enabled;\n this.engine.stateLoad(settings);\n\n if (requiresUiRebuild) {\n this.rebuildUi();\n }\n\n this._userInterface.refresh(true);\n }\n\n /**\n * Loads an encoded state into the engine.\n *\n * @param encodedSettings The encoded settings.\n */\n importSettingsFromString(encodedSettings: string) {\n const settings = KittenScientists.decodeSettings(encodedSettings);\n this.setSettings(settings);\n }\n\n /**\n * Copies an engine state to the clipboard.\n *\n * @param settings The engine state to copy to the clipboard.\n * The default is this engine's current state.\n * @param compress Should the state be compressed?\n */\n async copySettings(settings = this.getSettings(), compress = true) {\n const encodedSettings = KittenScientists.encodeSettings(settings, compress);\n await UserScriptLoader.window.navigator.clipboard.writeText(encodedSettings);\n }\n\n /**\n * Determines if an object is an engine state, and throws an\n * exception otherwise.\n *\n * @param subject The object that is hopefully an engine state.\n * @param subject.v The version in the engine state.\n * @returns An engine state.\n */\n static unknownAsEngineStateOrThrow(subject?: unknown): EngineState {\n const v = (subject as { v?: string }).v;\n if (!isNil(v) && typeof v === \"string\") {\n if (v.startsWith(\"2\")) {\n return subject as EngineState;\n }\n }\n throw new Error(\"Not a valid engine state.\");\n }\n //#endregion\n\n //#region SaveManager\n installSaveManager() {\n console.info(...cl(\"Installing save game manager...\"));\n this.game.managers.push(this._saveManager);\n }\n\n private _saveManager = {\n load: (saveData: Record<string, unknown>) => {\n console.info(...cl(\"Looking for Kitten Scientists engine state in save data...\"));\n\n const state = UserScriptLoader.tryEngineStateFromSaveData(\"ks\", saveData) as\n | EngineState\n | undefined;\n\n if (!state) {\n console.info(...cl(\"The Kittens Game save data did not contain a script state.\"));\n return;\n }\n\n console.info(...cl(\"Found Kitten Scientists engine state in save data.\"));\n this.engine.stateLoad(state);\n this.refreshEntireUserInterface();\n },\n resetState: () => null,\n save: (_saveData: Record<string, unknown>) => {\n // We ignore the manager invocation, because we already handle the\n // `game/beforesave` event, which is intended for external consumers.\n },\n };\n //#endregion\n}\n","import { redirectErrorsToConsole } from \"@oliversalzburg/js-utils/errors/console.js\";\nimport { KittenScientists } from \"./KittenScientists.js\";\nimport { UserScriptLoader } from \"./UserScriptLoader.js\";\n\nexport const main = async () => {\n const userScript = await new UserScriptLoader().waitForGame(KittenScientists, \"ks\");\n\n UserScriptLoader.window.kittenScientists = userScript;\n\n userScript.validateGame();\n userScript.run();\n};\n\n// We auto-ignite the loader, unless we're running in GreaseMonkey (content script).\n// The content script loader will handle the orchestration of that scenario.\nif (typeof GM === \"undefined\") {\n main().catch(redirectErrorsToConsole(console));\n}\n"],"names":["redirectErrorsToConsole","console","error","isNil","subject","is","Prototype","UnexpectedNilError","message","mustExist","errorMessage","coalesceArray","nilables","to","result","nilable","AbstractError","code","status","__publicField","allowForeignModule","errorRecord","InvalidOperationError","debug_1","args","SEMVER_SPEC_VERSION","MAX_LENGTH","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","constants","require$$0","debug","require$$1","exports","module","re","safeRe","src","safeSrc","t","R","LETTERDASHNUMBER","safeRegexReplacements","makeSafeRegex","value","token","max","createToken","name","isGlobal","safe","index","looseOption","emptyOpts","parseOptions_1","options","numeric","compareIdentifiers","a","b","anum","bnum","identifiers","require$$2","parseOptions","require$$3","require$$4","SemVer","version","m","id","num","other","i","release","identifier","identifierBase","match","base","prerelease","semver","compare_1","loose","compare","gt_1","InternalError","internalError","UnknownError","isError","unknownToError","measure","context","entry","measureAsync","difference","x","cl","arg","maybeError","objectEntries","consumeEntriesPedantic","source","consumer","key","Unique","elem","ucfirst","input","roundToTwo","negativeOneToInfinity","BulkPurchaseHelper","host","workshopManager","builds","metaData","sectionTrigger","sourceTab","potentialBuilds","counter","build","trigger","Engine","buildMetaData","prices","priceRatio","price","material","itemPrices","priceModifier","resPriceModifier","currentResourcePool","res","iterations","buildsCommitted","candidatesThisIteration","buildThisIteration","committedThisIteration","tempPool","committedBuild","potentialBuild","targetInstanceCount","possibleInstances","buildCacheItem","resources","buildsPossible","maxItemsBuilt","priceIndex","spaceOil","cryoKarma","oilPrice","karmaPrice","oilReductionRatio","burnedParagonRatio","priceIndex2","oilPriceRefund","karmaPriceRefund","refundVal","newPriceValue","model","controller","amount","meta","amountCalculated","vsMeta","data","ratio","ratioDiff","resourcePriceModifier","finalResourcePrice","oilModifier","karmaModifier","Buildings","StagedBuildings","Seasons","Cycles","ResourcesCraftable","Resources","Jobs","Traits","UnicornItemVariant","ReligionUpgrades","TranscendenceUpgrades","ZigguratUpgrades","Races","Policies","TechnologiesIgnored","Technologies","Missions","SpaceBuildings","ChronoForgeUpgrades","VoidSpaceUpgrades","Upgrades","TimeItemVariant","UnicornItems","ReligionOptions","Setting","enabled","setting","SettingLimited","limited","SettingTrigger","SettingThreshold","threshold","SettingMax","SettingLimitedMax","SettingLimitedMaxTrigger","SettingLimitedTrigger","SettingTriggerMax","SettingThresholdMax","SettingOptions","selected","__privateAdd","_options","option","__privateSet","__privateGet","SettingBuySellThreshold","buy","sell","BuildingUpgradeSetting","upgrade","_upgrade","BuildingUpgradeSettings","items","item","settings","building","BonfireBuildingSetting","baseStage","_baseBuilding","_building","_stage","BonfireSettings","gatherCatnip","turnOnSteamworks","turnOnMagnetos","turnOnReactors","upgradeBuildings","_a","_b","_c","_d","TabManager","tab","BonfireManager","bulkManager","buildList","pastures","aqueducts","pastureMeta","button","aqueductMeta","libraryMeta","energyConsumptionRate","libToDat","_e","warehouseMeta","_f","amphitheatreMeta","_g","steamworks","magnetos","reactors","clicks","amountTemp","label","itemMetaRaw","stage","metaRaw","buildingMeta","ActivitySummary","section","summarySection","summary","_amount","years","days","duration","ReligionSettingsItem","variant","_variant","ReligionSettings","bestUnicornBuilding","sacrificeAlicorns","sacrificeUnicorns","refineTears","refineTimeCrystals","autoPraise","adore","transcend","ReligionManager","bonfireManager","maxPastures","buildingButton","tearsNeeded","priceTears","tearsAvailableForUse","maxSacrifice","needSacrifice","buildRequest","alreadyHandled","pastureButton","validBuildings","unicornsPerSecondBase","globalRatio","religionRatio","paragonRatio","faithBonus","currentCycleIndex","currentCycle","cycleBonus","unicornsPerSecond","zigguratRatio","baseUnicornsPerRift","riftChanceRatio","unicornRiftChange","bestAmortization","bestBuilding","pastureProduction","pastureAmortization","unicornPrice","buildingInfo","religionBonus","riftChance","effect","unicornsPerRift","riftBonus","buildingProduction","amortization","buildInfo","panel","buttons","available","total","percentageInverse","link","resolve","unicorns","availableNow","cost","alicorns","tears","sorrow","availableForConversion","timeCrystals","faith","faithLevel","worship","epiphany","transcendenceTierCurrent","maxSolarRevolution","triggerSolarRevolution","epiphanyIncrease","epiphanyAfterAdore","worshipAfterAdore","solarRevolutionAfterAdore","transcendenceReached","adoreIncreaseRatio","needNextLevel","k","atheism","blackObelisk","apocryphaBonus","worshipIncrease","PolicySetting","policy","_policy","PolicySettings","game","inSettings","inGame","missingInSettings","redundantInSettings","TechSetting","tech","_tech","TechSettings","ScienceSettings","policies","techs","observe","UpgradeManager","success","action","originalConfirm","sleep","FallbackLocale","TIMEOUT_DEFAULT","TIMEOUT_OVERRIDE","UserScriptLoader","saveDataKey","saveData","saveDataProxy","ksData","state","UserScript","timeout","i18nEngine","gameLanguage","signals","subGameStart","subServerLoad","ScienceManager","_context","toUnlock","workLoop","resource","targetPolicy","MissionSetting","mission","_mission","MissionSettings","program","SpaceBuildingSetting","SpaceSettings","unlockMissions","SpaceManager","missions","missionLoop","panels","child","LogFilterItemVariant","FilterItems","LogFilterSettingsItem","LogFilterSettings","disableKGLog","filter","UpgradeSettingsItem","UpgradeSettings","CraftSettingsItem","_resource","WorkshopSettings","unlockUpgrades","shipOverride","craft","WorkshopManager","upgrades","crafts","craftRequests","current","materials","billOfMaterials","request","materialAmount","materialResource","availableSource","availableTarget","recipeRequires","recipeProduces","craftsPossible","craftsDone","orderDone","craftsMaxLimit","resourceName","cacheManager","preTrade","production","minProd","mat","rat","addProd","output","hunterRatio","stock","resPerTick","consume","worstWeather","productionField","resourceProduction","productionVillager","baseProd","hydroponics","paragonBonus","baseDemand","unicornPastures","happyCon","catnipDemandWorkerRatioGlobal","resourceCells","resourceCell","isBelow","ResourcesSettingsItem","ResourcesSettings","StateSettings","noConfirm","compress","EngineSettings","filters","states","language","ksColumn","retainMetaBehavior","ResetBonfireBuildingSetting","ResetBonfireSettings","ResetReligionBuildingSetting","ResetReligionSettings","ResetResourcesSettingsItem","ResetResourcesSettings","ResetSpaceBuildingSetting","ResetSpaceSettings","ResetTimeBuildingSetting","ResetTimeSettings","ResetUpgradeSettingsItem","ResetUpgradeSettings","ResetSettings","bonfire","religion","space","time","TimeSkipHeatSettings","activeHeatTransferStatus","cycle","TimeSkipSettings","ignoreOverheat","activeHeatTransfer","season","TimeControlSettings","accelerateTime","reset","timeSkip","TimeSettingsItem","TimeSettings","fixCryochambers","EmbassySetting","race","_race","EmbassySettings","TradeSettingsItem","summer","autumn","winter","spring","require","_require","TradeSettings","buildEmbassies","feedLeviathans","tradeBlackcoin","unlockRaces","defaultRequire","ElectLeaderSettings","job","trait","VillageSettings","holdFestivals","hunt","promoteKittens","promoteLeader","electLeader","TimeControlManager","religionManager","spaceManager","engine","checkedList","checkList","check","bld","unicornPasture","panelButton","reject","checked","challengeIndex","temporalFlux","shatterCostIncreaseChallenge","timeCrystalsAvailable","shatterVoidCost","voidAvailable","heatMax","heatNow","factor","maxSkipsActiveHeatTransfer","heatPerTick","ticksPerSecond","temporalFluxProduction","daysPerYear","ticksPerDay","daysPerTicks","ticksPerYear","fluxEnabled","flux","maxSkips","canSkip","willSkip","yearsPerCycle","remainingYearsCurrentCycle","cyclesPerEra","skipCycles","shatter","TimeManager","buildMeta","buildButton","buildingMetaData","btn","fixed","fixHappened","TradeManager","catpower","gold","trades","trade","profitable","maxTrades","maxByRace","tradeIndex","tradeSettings","trigConditions","tradePos","tradesDone","randomRaceIndex","minTrades","minTradeIndex","tradeNet","matAmount","meanOutput","out","outValue","count","culture","cultureVal","racePanels","embassyBulk","bulkTracker","panelIndex","raceIndex","emBulk","nextPrice","leviathanInfo","necrocorns","maxRaces","manpower","unlockedRace","coinPrice","relicsInitial","coinsInitial","coinsExchanged","relicsExchanged","currentCoin","relicsCurrent","tick","profit","prod","standingRatio","raceRatio","tradeRatio","failedRatio","successRatio","bonusRatio","mean","tradeChance","shipCount","titaniumProbability","seasionRatio","normBought","normBonus","spiceChance","spiceTradeAmount","_limited","_trigConditions","required","manpowerCost","goldCost","highestCapacity","tradeOutput","capacity","raceInfo","MaterialsCache","cacheIndex","oldData","oldMaterials","currentTick","startingTick","VillageManager","freeKittens","assignedKitten","jobsNotCapped","unlocked","maxKittensInJob","maxKittensToAssign","kittensInJob","noFarmersAssigned","jobName","kittens","leader","leaderCandidates","kitten","bestLeader","kittenIndex","tier","engineerSpeciality","rank","goldStock","huntCount","averageOutput","trueOutput","craftManager","catpowProfitable","cultureProfitable","parchProfitable","beforeDays","i18nData","deDE","enUS","heIL","zhCN","locale","rebuildUI","previousLocale","ksVersion","attemptLoad","loader","msg","loop","timeTaken","filterCheckboxes","checkbox","symbol","planet","cycleCandidate","argIndex","i18nLiteral","i18nArgs","logStyle","text","activityClass","summaryLine","cssClasses","color","filterItem","subSectionTrigger","toZeroIfInfinity","parseNumber","milliseconds","parseBigint","parseMilliseconds","isZero","pluralize","word","SECOND_ROUNDING_EPSILON","ONE_DAY_IN_MILLISECONDS","formatMilliseconds","isBigInt","optionsAdjusted","floorDecimals","decimalDigits","flooredInterimValue","add","long","short","valueString","wholeDigits","minLength","parsed","seconds","microseconds","nanoseconds","millisecondsAndBelow","millisecondsDecimalDigits","roundedMilliseconds","millisecondsString","secondsDecimalDigits","secondsFixed","secondsString","separator","Icons","_UiComponent","parent","withChildren","depth","trace","force","children","UiComponent","Container","className","ListItem","stylesDelimiter","LabelListItem","stylesListItem","styles","iconElement","SettingListItem","stylesSettingListItem","_event","isBatchProcess","IconButton","pathData","title","stylesButton","SettingsList","toolOptions","hasTools","tools","event","onReset","ExpandoButton","CollapsiblePanel","head","expando","expand","toggleNested","visible","toggleChildren","SettingsPanel","settingItem","_value","BuildingUpgradeSettingsUi","_locale","sectionSetting","_isBatchProcess","stylesLabelListItem","itemsList","Button","Delimiter","HeaderListItem","Input","Paragraph","Dialog","stylesToolbarListItem","initialValue","explainer","stylesExplainer","MaxButton","TriggerButton","triggerValue","SettingMaxTriggerListItem","BuildSectionTools","sectionLabel","onSetMax","element","SettingTriggerListItem","BonfireSettingsUi","_","buildingGroup","EngineSettingsUi","ButtonListItem","Fieldset","legend","stylesLabel","RadioItem","groupKey","OptionsListItem","TextButton","InternalsUi","ExplainerListItem","LogFiltersSettingsUi","listFilters","ReligionSettingsUi","buildingName","stylesTimeSkipHeatSettings","unicornsArray","zigguratUpgrade","defaults","ConsumeButton","consumeValue","StockButton","stockValue","ResourcesSettingsUi","ignoredResources","stockElement","consumeElement","PolicySettingsUi","lastLabel","TechSettingsUi","ScienceSettingsUi","MissionSettingsUi","SpaceSettingsUi","indexPlanet","arrayPlant","indexBuilding","arrayBuilding","listAddition","InvalidArgumentError","minutesInMonth","minutesInDay","constructFromSymbol","constructFrom","date","constructNow","formatDistanceLocale","formatDistance","tokenValue","buildFormatLongFn","width","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_date","_baseDate","buildLocalizeFn","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","localize","dirtyNumber","number","rem100","quarter","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","defaultOptions","getDefaultOptions","toDate","argument","getTimezoneOffsetInMilliseconds","utcDate","normalizeDates","dates","normalize","compareAsc","dateLeft","dateRight","diff","differenceInCalendarMonths","laterDate","earlierDate","laterDate_","earlierDate_","yearsDiff","monthsDiff","endOfDay","endOfMonth","month","isLastDayOfMonth","differenceInMonths","workingLaterDate","sign","isLastMonthNotFull","getRoundingMethod","method","differenceInMilliseconds","differenceInSeconds","defaultLocale","minutesInAlmostTwoDays","comparison","localizeOptions","offsetInSeconds","minutes","months","hours","nearestMonth","monthsSinceStartOfYear","formatDistanceToNow","startOfWeek","weekStartsOn","day","isSameWeek","formattingMonthValues","de","unit","isFemale","male","female","ordinalName","he","checkWeek","baseDate","baseFormat","format","SavegameLoader","compressed","ToolbarListItem","StateManagementUi","gameObject","stateIndex","stateObject","KittenScientists","gameSlot","stateSlot","saveDataString","encodedData","userInput","importId","importSequence","makeImportLabel","internalImport","subjectData","uncompressed","line","stateLabel","gameLabel","existing","statesJson","blob","url","newGame","newState","IconSettingsPanel","ResetBonfireSettingsUi","listBuildings","delimiter","upgradeIndicator","ResetReligionSettingsUi","ResetResourcesSettingsUi","ResetSpaceSettingsUi","plant","ResetTimeSettingsUi","ResetUpgradesSettingsUi","lastElement","ResetSettingsUi","list","CyclesList","makeCycle","cycles","SeasonsList","makeSeason","TimeSkipHeatSettingsUi","sectionParentSetting","TimeSkipSettingsUi","TimeControlSettingsUi","accelerateLabel","TimeSettingsUi","BuyButton","SellButton","LimitedButton","SettingLimitedListItem","SettingLimitedTriggerListItem","SettingMaxListItem","EmbassySettingsUi","listRaces","TradeSettingsUi","labelSeason","VillageSettingsUi","listJobs","WorkshopCraftListItem","UpgradeSettingsUi","WorkshopSettingsUi","excludeCraftsArray","preparedCrafts","listCrafts","UserInterface","optionsListElement","sectionsVisible","panelsOpen","usingKSColumn","right","optionsPageContent","_withChildren","_trace","prefix","engineState","_saveData","managerIndex","hasSuffix","baseValue","numericValue","suffix","floatValue","cleanedValue","withUnit","settingsString","compressedSettings","naiveParse","requiresUiRebuild","encodedSettings","v","main","userScript"],"mappings":"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AK,MAAM,KAAK,aAClC,KAAK,MAAM,KAAK,UAAU,mBAAmB,EAC7C,GACF,EACMpB,EAAWmB,GAAsB,EAAIC,GACvC,GAAA,KAAK,iBAAiB,kBAAkB,KAAK,EAAIpB,EAAW,MAAQ9B,EAAM,IACrE,MAAA,EACT,SAGSA,EAAM,OAAS,gBAAkBM,EAAM,OAAS,QAAS,CAC5D,MAAA6C,EAAgB,KAAK,MAAM,KAAK,aACpC,IAAO,KAAK,MAAM,KAAK,SAAS,sBAAsB,EACtD,CACF,EACMpB,EAAakB,GAAsB,EAAIE,GAE3C,GAAA,KAAK,iBAAiB,kBAAkB,OAAO,EAC/CpB,EAAa1B,GAAcL,EAAM,IAE1B,MAAA,EACT,SAGE,KAAK,iBAAiB,kBAAkBM,EAAM,IAAI,EAClD2C,EAAqB5C,GAAcL,EAAM,IAElC,MAAA,EAEX,CAIK,MAAA,EAAA,CAEX,CCrdO,MAAMoD,GAAY,CACvB,UACA,cACA,SACA,eACA,WACA,OACA,SACA,UACA,WACA,SACA,eACA,UACA,QACA,SACA,MACA,UACA,WACA,aACA,UACA,UACA,OACA,OACA,cACA,UACA,UACA,SACA,UACA,UACA,aACA,SACA,YACA,iBACA,YACA,WACA,aACA,eACA,gBACA,UACF,EAGaC,GAAkB,CAC7B,iBACA,aACA,aACA,YACA,WACF,EAyMaC,GAAU,CAAC,SAAU,SAAU,SAAU,QAAQ,EAGjDC,GAAS,CACpB,SACA,QACA,OACA,SACA,OACA,UACA,OACA,UACA,WACA,OACF,EAGaC,GAAqB,CAChC,QACA,OACA,aACA,YACA,YACA,WACA,UACA,OACA,WACA,aACA,WACA,YACA,QACA,WACA,OACA,OACA,QACA,SACA,WACA,UACA,MACF,EAGaC,GAAY,CACvB,GAAGD,GACH,UACA,aACA,YACA,gBACA,SACA,OACA,UACA,WACA,QACA,OACA,SACA,OACA,YACA,OACA,QACA,QACA,UACA,WACA,WACA,YACA,MACA,UACA,QACA,UACA,SACA,QACA,YACA,QACA,eACA,cACA,WACA,WACA,cACA,UACA,OACA,gBACA,QACF,EAeaE,GAAO,CAClB,MACA,WACA,SACA,YACA,SACA,QACA,SACA,UACA,YACF,EAGaC,GAAS,CACpB,UACA,WACA,UACA,eACA,WACA,OACA,YACA,MACF,EAGY,IAAAC,GAAAA,IACVA,EAAA,eAAiB,IACjBA,EAAA,cAAgB,IAChBA,EAAA,SAAW,IACXA,EAAA,eAAiB,KAJPA,IAAAA,GAAA,CAAA,CAAA,EAOL,MAAMC,GAAmB,CAC9B,YACA,WACA,cACA,gBACA,kBACA,aACA,eACA,WACA,WACA,eACF,EAGaC,GAAwB,CACnC,YACA,eACA,aACA,eACA,gBACA,SACA,WACA,eACA,YACA,aACF,EAGaC,GAAmB,CAC9B,eACA,eACA,aACA,SACA,YACA,WACA,mBACA,oBACA,cACA,eACF,EAsBaC,GAAQ,CACnB,UACA,WACA,QACA,aACA,UACA,SACA,UACA,QACF,EAGaC,GAAW,CACtB,aACA,iBACA,YACA,cACA,eACA,YACA,eACA,wBACA,mBACA,YACA,6BACA,6BACA,4BACA,mBACA,eACA,eACA,eACA,UACA,YACA,wBACA,6BACA,gCACA,yBACA,eACA,mBACA,aACA,UACA,2BACA,4BACA,yBACA,kBACA,WACA,YACA,0BACA,wBACA,sBACA,aACA,gBACA,mBACA,oBACA,cACA,YACA,WACA,sBACA,0BACA,0BACA,wBACA,YACA,YACA,0BACA,4BACA,iCACA,WACA,cACA,iBACA,cACA,sBACA,YACA,YACA,iBACA,4BACA,2BACF,EAGaC,GAAsB,CAAC,SAAS,EAGhCC,GAAe,CAC1B,YACA,gBACA,cACA,KACA,SACA,aACA,aACA,UACA,eACA,oBACA,YACA,eACA,UACA,aACA,WACA,YACA,gBACA,QACA,aACA,eACA,iBACA,WACA,qBACA,QACA,UACA,cACA,cACA,cACA,aACA,gBACA,WACA,cACA,oBACA,YACA,OACA,gBACA,QACA,YACA,cACA,SACA,iBACA,aACA,iBACA,gBACA,qBACA,qBACA,kBACA,aACA,UACA,sBACA,WACA,WACA,aACA,QACA,kBACA,gBACA,iBACA,WACA,UACA,YACA,SACF,EAGaC,GAAW,CACtB,yBACA,gBACA,cACA,sBACA,gBACA,eACA,cACA,gBACA,iBACA,mBACA,kBACA,eACA,aACF,EAmBaC,GAAiB,CAC5B,qBACA,cACA,YACA,WACA,cACA,iBACA,cACA,aACA,WACA,cACA,eACA,gBACA,iBACA,YACA,cACA,gBACA,eACA,gBACA,WACA,YACA,WACA,qBACF,EAsBaC,GAAsB,CACjC,eACA,qBACA,sBACA,kBACA,oBACA,gBACA,YACF,EAGaC,GAAoB,CAC/B,eACA,mBACA,aACA,WACA,gBACA,eACF,EAGaC,GAAW,CACtB,qBACA,qBACA,UACA,cACA,aACA,WACA,aACA,WACA,kBACA,UACA,UACA,YACA,aACA,gBACA,aACA,YACA,kBACA,gBACA,kBACA,SACA,UACA,QACA,aACA,eACA,sBACA,aACA,qBACA,kBACA,cACA,cACA,aACA,mBACA,eACA,gBACA,eACA,qBACA,WACA,gBACA,aACA,aACA,aACA,uBACA,iBACA,cACA,oBACA,cACA,kBACA,kBACA,oBACA,mBACA,sBACA,oBACA,kBACA,oBACA,kBACA,gBACA,UACA,MACA,UACA,kBACA,eACA,qBACA,WACA,qBACA,WACA,WACA,WACA,MACA,YACA,sBACA,kBACA,cACA,cACA,cACA,YACA,YACA,iBACA,gBACA,kBACA,cACA,kBACA,cACA,iBACA,YACA,mBACA,eACA,iBACA,gBACA,WACA,YACA,OACA,UACA,gBACA,gBACA,WACA,kBACA,gBACA,uBACA,eACA,aACA,iBACA,SACA,OACA,QACA,kBACA,iBACA,qBACA,kBACA,WACA,iBACA,aACA,WACA,cACA,WACA,aACA,iBACA,kBACA,sBACA,WACA,gBACA,kBACA,cACA,gBACA,kBACA,cACA,qBACA,eACA,mBACA,iBACA,mBACA,kBACA,wBACA,iBACA,SACA,iBACA,aACA,cACF,EAYY,IAAAC,IAAAA,IACVA,EAAA,YAAc,SACdA,EAAA,UAAY,OAFFA,IAAAA,IAAA,CAAA,CAAA,EAOL,MAAM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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,34,68,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159]}