From 446e04879c66c85324926683390970c0f03d2775 Mon Sep 17 00:00:00 2001 From: Misode Date: Sun, 27 Oct 2024 05:39:04 +0100 Subject: [PATCH] Add random seed button --- src/app/Utils.ts | 6 +++++- .../components/generator/McdocRenderer.tsx | 19 +++++++++++++++---- src/app/services/Spyglass.ts | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/app/Utils.ts b/src/app/Utils.ts index fc3daefa..aa37752f 100644 --- a/src/app/Utils.ts +++ b/src/app/Utils.ts @@ -30,7 +30,11 @@ export function hexId(length = 12) { } export function randomSeed() { - return BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)) + return BigInt(Math.floor((Math.random() - 0.5) * 2 * Number.MAX_SAFE_INTEGER)) +} + +export function randomInt() { + return Math.floor(Math.random() * 4294967296) - 2147483648 } export function generateUUID() { diff --git a/src/app/components/generator/McdocRenderer.tsx b/src/app/components/generator/McdocRenderer.tsx index c205cf0c..47c70891 100644 --- a/src/app/components/generator/McdocRenderer.tsx +++ b/src/app/components/generator/McdocRenderer.tsx @@ -12,7 +12,7 @@ import { useCallback, useMemo } from 'preact/hooks' import config from '../../Config.js' import { useLocale } from '../../contexts/Locale.jsx' import { useFocus } from '../../hooks/useFocus.js' -import { generateColor, hexId } from '../../Utils.js' +import { generateColor, hexId, randomInt, randomSeed } from '../../Utils.js' import { ItemDisplay } from '../ItemDisplay.jsx' import { Octicon } from '../Octicon.jsx' @@ -207,8 +207,10 @@ function NumericHead({ type, node, makeEdit }: Props) { const value = node && JsonNumberNode.is(node) ? Number(node.value.value) : undefined const isFloat = type.kind === 'float' || type.kind === 'double' - const onChangeValue = useCallback((value: string) => { - const number = value.length === 0 ? undefined : Number(value) + const onChangeValue = useCallback((value: string | bigint | number) => { + const number = typeof value === 'string' + ? (value.length === 0 ? undefined : Number(value)) + : value if (number !== undefined && Number.isNaN(number)) { return } @@ -217,7 +219,7 @@ function NumericHead({ type, node, makeEdit }: Props) { return undefined } const newValue: core.FloatNode | core.LongNode = isFloat - ? { type: 'float', range, value: number } + ? { type: 'float', range, value: Number(number) } : { type: 'long', range, value: BigInt(number) } const newNode: JsonNumberNode = { type: 'json:number', @@ -241,12 +243,21 @@ function NumericHead({ type, node, makeEdit }: Props) { onChangeValue(generateColor().toString()) }, [onChangeValue]) + const random = type.attributes?.find(a => a.name === 'random') + + const onRandom = useCallback(() => { + onChangeValue(type.kind === 'long' ? randomSeed() : randomInt()) + }, [type, onChangeValue]) + return <> onChangeValue((e.target as HTMLInputElement).value)} /> {colorKind && <> onChangeColor((e.target as HTMLInputElement).value)} /> } + {random && <> + + } } diff --git a/src/app/services/Spyglass.ts b/src/app/services/Spyglass.ts index e5473421..091258cb 100644 --- a/src/app/services/Spyglass.ts +++ b/src/app/services/Spyglass.ts @@ -29,7 +29,7 @@ dispatch minecraft:resource[text_component] to Text dispatch minecraft:resource[world] to struct WorldSettings { generate_features: boolean, bonus_chest: boolean, - seed: #[random] int, + seed: #[random] long, dimensions: struct { [#[id="dimension"] string]: Dimension, },