diff --git a/gsm-frontend/src/api.js b/gsm-frontend/src/api.js index d76f1bb..e154088 100644 --- a/gsm-frontend/src/api.js +++ b/gsm-frontend/src/api.js @@ -179,3 +179,9 @@ export async function getFactorioCurrentSave(token) { headers: { Authorization: `Bearer ${token}` }, }) } + +export async function getFactorioWorldSettings(token, saveName) { + return fetchAPI(`/servers/factorio/saves/${encodeURIComponent(saveName)}/settings`, { + headers: { Authorization: `Bearer ${token}` }, + }) +} diff --git a/gsm-frontend/src/components/FactorioWorldManager.jsx b/gsm-frontend/src/components/FactorioWorldManager.jsx index a52e1b3..4cca209 100644 --- a/gsm-frontend/src/components/FactorioWorldManager.jsx +++ b/gsm-frontend/src/components/FactorioWorldManager.jsx @@ -8,6 +8,7 @@ import { deleteFactorioTemplate, createFactorioWorld, deleteFactorioSave, + getFactorioWorldSettings, serverAction } from '../api' import WorldGenForm from './WorldGenForm' @@ -25,6 +26,9 @@ export default function FactorioWorldManager({ server, token, onServerAction }) const [creating, setCreating] = useState(false) const [deleteConfirm, setDeleteConfirm] = useState(null) const [actionLoading, setActionLoading] = useState(null) + const [viewingSettings, setViewingSettings] = useState(null) + const [settingsData, setSettingsData] = useState(null) + const [settingsLoading, setSettingsLoading] = useState(false) const fetchData = async () => { try { @@ -137,6 +141,35 @@ export default function FactorioWorldManager({ server, token, onServerAction }) } } + const handleViewSettings = async (saveName) => { + try { + setSettingsLoading(true) + setViewingSettings(saveName) + const data = await getFactorioWorldSettings(token, saveName) + setSettingsData(data) + } catch (err) { + setError(err.message) + setViewingSettings(null) + } finally { + setSettingsLoading(false) + } + } + + const closeSettingsModal = () => { + setViewingSettings(null) + setSettingsData(null) + } + + // Format setting value for display + const formatSettingValue = (value) => { + if (value === 0) return 'None' + if (value <= 0.2) return 'Very Low' + if (value <= 0.6) return 'Low' + if (value <= 1.2) return 'Normal' + if (value <= 2.5) return 'High' + return 'Very High' + } + if (loading) { return (
@@ -245,6 +278,117 @@ export default function FactorioWorldManager({ server, token, onServerAction })
)} + {/* View Settings Modal */} + {viewingSettings && ( +
+
e.stopPropagation()}> +
+

World Settings: {viewingSettings}

+ +
+
+ {settingsLoading ? ( +
Loading settings...
+ ) : settingsData?.legacy ? ( +
+
⚠️ Legacy World
+

+ {settingsData.message} +

+
+ ) : settingsData?.settings ? ( +
+ {settingsData.createdAt && ( +
+ Created: {new Date(settingsData.createdAt).toLocaleString()} +
+ )} + + {/* Terrain Settings */} +
+

Terrain

+
+
+ Water + {formatSettingValue(settingsData.settings.autoplace_controls?.water?.frequency)} +
+
+ Trees + {formatSettingValue(settingsData.settings.autoplace_controls?.trees?.frequency)} +
+
+ Cliffs + {formatSettingValue(settingsData.settings.cliff_settings?.richness)} +
+
+ Starting Area + {formatSettingValue(settingsData.settings.starting_area)} +
+
+
+ + {/* Resource Settings */} +
+

Resources

+
+ {['iron-ore', 'copper-ore', 'coal', 'stone', 'uranium-ore', 'crude-oil'].map((resource) => { + const ctrl = settingsData.settings.autoplace_controls?.[resource] + const displayName = resource.replace('-ore', '').replace('-', ' ').replace(/\b\w/g, c => c.toUpperCase()) + return ( +
+ {displayName} + + Freq: {formatSettingValue(ctrl?.frequency)} · Size: {formatSettingValue(ctrl?.size)} · Rich: {formatSettingValue(ctrl?.richness)} + +
+ ) + })} +
+
+ + {/* Enemy Settings */} +
+

Enemies

+
+
+ Biter Bases + {formatSettingValue(settingsData.settings.autoplace_controls?.['enemy-base']?.frequency)} +
+
+ Peaceful Mode + {settingsData.settings.peaceful_mode ? 'Yes' : 'No'} +
+
+
+ + {/* Seed */} + {settingsData.settings.seed !== undefined && ( +
+

Advanced

+
+ Seed: + {settingsData.settings.seed || 'Random'} +
+
+ )} +
+ ) : ( +
No settings data available
+ )} +
+
+ +
+
+
+ )} + {/* Header */}

Saved Worlds

@@ -280,6 +424,15 @@ export default function FactorioWorldManager({ server, token, onServerAction })
+