import { useState } from 'react'
const SLIDER_VALUES = [0, 0.167, 0.5, 1, 2, 3]
const SLIDER_LABELS = ['None', 'Very Low', 'Low', 'Normal', 'High', 'Very High']
function valueToSlider(value) {
if (value === 0 || value === undefined) return 0
if (value <= 0.167) return 1
if (value <= 0.5) return 2
if (value <= 1) return 3
if (value <= 2) return 4
return 5
}
function sliderToValue(index) {
return SLIDER_VALUES[index]
}
function ValueSelect({ value, onChange }) {
const index = valueToSlider(value)
return (
)
}
function ResourceRow({ label, settings, onChange }) {
const freq = settings?.frequency ?? 1
const size = settings?.size ?? 1
const richness = settings?.richness ?? 1
return (
{label}
onChange({ ...settings, frequency: v })} />
onChange({ ...settings, size: v })} />
onChange({ ...settings, richness: v })} />
)
}
function SimpleSlider({ label, value, onChange }) {
const sliderIndex = valueToSlider(value)
return (
)
}
function EvolutionSlider({ label, value, onChange }) {
const displayValue = (value * 100).toFixed(0)
return (
)
}
export default function WorldGenForm({
settings,
onSettingsChange,
presets,
templates,
onLoadPreset,
onLoadTemplate,
onSaveTemplate
}) {
const [selectedPreset, setSelectedPreset] = useState('default')
const [templateName, setTemplateName] = useState('')
const [showSaveTemplate, setShowSaveTemplate] = useState(false)
const handlePresetChange = (presetName) => {
setSelectedPreset(presetName)
onLoadPreset(presetName)
}
const handleSaveTemplate = () => {
if (templateName.trim()) {
onSaveTemplate(templateName.trim())
setTemplateName('')
setShowSaveTemplate(false)
}
}
const updateAutoplace = (key, value) => {
onSettingsChange({
...settings,
autoplace_controls: {
...settings.autoplace_controls,
[key]: value
}
})
}
const updateCliff = (key, value) => {
onSettingsChange({
...settings,
cliff_settings: {
...settings.cliff_settings,
[key]: value
}
})
}
const updateProperty = (key, value) => {
onSettingsChange({
...settings,
property_expression_names: {
...settings.property_expression_names,
[key]: value
}
})
}
return (
{/* Preset & Template Selection */}
Preset:
{templates?.length > 0 && (
Template:
)}
{showSaveTemplate && (
setTemplateName(e.target.value)}
placeholder="Template name..."
className="input flex-1"
/>
)}
{/* Terrain Section */}
Terrain
updateAutoplace('water', { frequency: v, size: v })}
/>
updateAutoplace('trees', { frequency: v, size: v, richness: v })}
/>
updateCliff('richness', v)}
/>
onSettingsChange({ ...settings, starting_area: v })}
/>
{/* Resources Section */}
Resources
updateAutoplace('iron-ore', v)}
/>
updateAutoplace('copper-ore', v)}
/>
updateAutoplace('coal', v)}
/>
updateAutoplace('stone', v)}
/>
updateAutoplace('uranium-ore', v)}
/>
updateAutoplace('crude-oil', v)}
/>
{/* Enemies Section */}
{/* Evolution Section */}
Evolution
updateProperty('enemy-evolution-factor-by-time', v)}
/>
updateProperty('enemy-evolution-factor-by-pollution', v)}
/>
updateProperty('enemy-evolution-factor-by-killing-spawners', v)}
/>
{/* Advanced Section */}
)
}