Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
76eb86a
this commit is a firstpass which addresses htps://github.com/SteamSer…
JacksonTheMaster Sep 23, 2025
0197a9b
added missing SaveName template var to config page
JacksonTheMaster Sep 24, 2025
2bfaf75
re-added weblate generated current localization files
JacksonTheMaster Sep 24, 2025
a148b02
Translated using Weblate (German)
Sep 24, 2025
8c7f4ae
Merge pull request #98 from nightly-lang
JacksonTheMaster Sep 24, 2025
c48568b
fully migrate the old SaveInfo field into new vars if applicable and …
JacksonTheMaster Sep 24, 2025
0249e45
remove unused vars from config page
JacksonTheMaster Sep 24, 2025
de5a2e2
fix image name
JacksonTheMaster Sep 24, 2025
aa93930
fix docker context in gh action
JacksonTheMaster Sep 24, 2025
e379d02
fix docker context in gh action
JacksonTheMaster Sep 24, 2025
fa8cdbc
Merge pull request #100 from feat-saveinfo-rework
JacksonTheMaster Sep 25, 2025
fce4195
added en-US localization for new SaveName and WorldID ui options
JacksonTheMaster Sep 25, 2025
f8d58ca
update terrain and save system step handling in TwoBoxFormand accordi…
JacksonTheMaster Sep 25, 2025
6895451
this removes the terrain selection screen from setup entirely and now…
JacksonTheMaster Sep 25, 2025
3ed9932
LocalIpAddress now defaults to 0.0.0.0, realized in playtest
JacksonTheMaster Sep 25, 2025
bf61f6e
Merge feat-setup-omitterrainsettings into nightly
JacksonTheMaster Sep 25, 2025
c6d8215
Zipslip fix for restore and steamcmd install.
mitoskalandiel Sep 25, 2025
14867ff
Merge pull request #101 from SteamServerUI/fix-zipslip
mitoskalandiel Sep 25, 2025
b9d6a49
add debug when shutting down global backup manager
JacksonTheMaster Sep 25, 2025
3d8df72
add Initializing log for global backup manager
JacksonTheMaster Sep 25, 2025
e80bc23
Translated using Weblate (German)
Sep 25, 2025
08f1c81
Translated using Weblate (Swedish)
Sep 25, 2025
f648a10
Translated using Weblate (English)
Sep 25, 2025
f5b92e9
Merge pull request #102 from SteamServerUI/nightly-lang
JacksonTheMaster Sep 25, 2025
ff6bce9
Add validation for world configurations and enhance tooltip styles
mitoskalandiel Sep 26, 2025
26ce3ec
added basic validation and a hint to the world gen settings page to s…
JacksonTheMaster Sep 26, 2025
ec5c7f4
Added indicators to validation
JacksonTheMaster Sep 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .docker/compose.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
services:
stationeers-server:
container_name: stationeers-server
container_name: stationeers-server-ui
build:
context: ..
dockerfile: ./.docker/Dockerfile
image: stationeers-server-ui:latest
image: stationeersserverui:latest
stdin_open: true
tty: true
deploy:
Expand All @@ -28,4 +28,4 @@ services:
restart: unless-stopped

volumes:
app-data:
app-data:
13 changes: 13 additions & 0 deletions UIMod/onboard_bundled/assets/css/config.css
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,19 @@
filter: brightness(1.2);
}

.fill-hint-wraper{
background-color: var(--danger);
border-radius: 8px;
}

.fill-hint{
font-size: 1rem;
color: #ffffff;
padding: 2%;
font-style: italic;
text-align: center;
}

/* Responsive adjustments */
@media (max-width: 768px) {
.section-navigation {
Expand Down
145 changes: 145 additions & 0 deletions UIMod/onboard_bundled/assets/js/world-gen-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// Validation configuration object
const worldConfigs = {
Lunar: {
conditions: ['DefaultStart', 'Brutal'],
locations: ['LunarSpawnCraterVesper', 'LunarSpawnMontesUmbrarum', 'LunarSpawnCraterNox', 'LunarSpawnMonsArcanus']
},
Mars2: {
conditions: ['DefaultStart', 'Brutal'],
locations: ['MarsSpawnCanyonOverlook', 'MarsSpawnButchersFlat', 'MarsSpawnFindersCanyon', 'MarsSpawnHellasCrags', 'MarsSpawnDonutFlats']
},
Europa3: {
conditions: ['EuropaDefault', 'EuropaBrutal'],
locations: ['EuropaSpawnIcyBasin', 'EuropaSpawnGlacialChannel', 'EuropaSpawnBalgatanPass', 'EuropaSpawnFrigidHighlands', 'EuropaSpawnTyreValley']
},
MimasHerschel: {
conditions: ['MimasDefault', 'MimasBrutal'],
locations: ['MimasSpawnCentralMesa', 'MimasSpawnHarrietCrater', 'MimasSpawnCraterField', 'MimasSpawnDustBowl']
},
Vulcan2: {
conditions: ['VulcanDefault', 'VulcanBrutal'],
locations: ['VulcanSpawnVestaValley', 'VulcanSpawnEtnasFury', 'VulcanSpawnIxionsDemise', 'VulcanSpawnTitusReach']
},
Vulcan: {
conditions: ['VulcanDefault', 'VulcanBrutal'],
locations: ['VulcanSpawnVestaValley', 'VulcanSpawnEtnasFury', 'VulcanSpawnIxionsDemise', 'VulcanSpawnTitusReach']
},
Venus: {
conditions: ['VenusDefault', 'VulcanBrutal (yes, VULCAN Brutal!)'],
locations: ['VenusSpawnGaiaValley', 'VenusSpawnDaisyValley', 'VenusSpawnFaithValley', 'VenusSpawnDuskValley']
}
};

const validDifficulties = ['Creative', 'Easy', 'Normal', 'Stationeer'];

// Get form elements
const worldIdInput = document.getElementById('WorldID');
const difficultyInput = document.getElementById('Difficulty');
const startConditionInput = document.getElementById('StartCondition');
const startLocationInput = document.getElementById('StartLocation');
const fillHintWrapper = document.getElementById('fill-hint-wraper');

// Function to check if New Terrain tab is active
function isNewTerrainTabActive() {
const terrainButton = document.querySelector('button.section-nav-button[data-section="terrain-settings"].active');
return !!terrainButton;
}

// Function to check if one but not all fields are filled
function shouldShowFillHint() {
const hasDifficulty = difficultyInput.value && difficultyInput.value.trim() !== '';
const hasStartCondition = startConditionInput.value && startConditionInput.value.trim() !== '';
const hasStartLocation = startLocationInput.value && startLocationInput.value.trim() !== '';

// Don't show hint for these specific combinations
if (hasDifficulty && !hasStartCondition && !hasStartLocation) {
return false; // Only difficulty filled
}
if (hasDifficulty && hasStartCondition && !hasStartLocation) {
return false; // Difficulty and Start Condition filled
}
if (hasDifficulty && hasStartCondition && hasStartLocation) {
return false; // All fields filled
}

// Show hint for all other combinations where at least one field is filled
const filledInputs = [hasDifficulty, hasStartCondition, hasStartLocation].filter(Boolean).length;
return filledInputs > 0;
}

// Function to toggle fill hint visibility
function toggleFillHint() {
if (shouldShowFillHint()) {
fillHintWrapper.style.display = 'flex';
} else {
fillHintWrapper.style.display = 'none';
}
}

// Function to validate inputs
function validateInputs() {
const selectedWorld = worldIdInput.value;
const worldConfig = worldConfigs[selectedWorld];
const inputs = [worldIdInput, difficultyInput, startConditionInput, startLocationInput];

// Reset all validation states
inputs.forEach(input => {
input.classList.remove('invalid');
const infoDiv = input.nextElementSibling;
if (infoDiv && infoDiv.classList.contains('input-info')) {
// Restore original text if it exists, otherwise keep current text
infoDiv.textContent = infoDiv.getAttribute('data-original-text') || infoDiv.textContent;
}
});

// Validate difficulty
if (!difficultyInput.value || difficultyInput.value.trim() === '') {
updateInfoText(difficultyInput, validDifficulties.join(', '));
} else if (!validDifficulties.includes(difficultyInput.value)) {
difficultyInput.classList.add('invalid');
updateInfoText(difficultyInput, `❌${validDifficulties.join(', ')}`);
}

if (worldConfig) {
// Validate start condition
if (!startConditionInput.value || startConditionInput.value.trim() === '') {
updateInfoText(startConditionInput, `${selectedWorld}: ${worldConfig.conditions.join(', ')}`);
} else if (!worldConfig.conditions.includes(startConditionInput.value)) {
startConditionInput.classList.add('invalid');
updateInfoText(startConditionInput, `❌${selectedWorld}: ${worldConfig.conditions.join(', ')}`);
}

// Validate start location
if (!startLocationInput.value || startLocationInput.value.trim() === '') {
updateInfoText(startLocationInput, `${selectedWorld}: ${worldConfig.locations.join(', ')}`);
} else if (!worldConfig.locations.includes(startLocationInput.value)) {
startLocationInput.classList.add('invalid');
updateInfoText(startLocationInput, `❌${selectedWorld}: ${worldConfig.locations.join(', ')}`);
}
}

// Toggle fill hint visibility
toggleFillHint();
}

function updateInfoText(input, text) {
const infoDiv = input.nextElementSibling;
if (infoDiv && infoDiv.classList.contains('input-info')) {
if (!infoDiv.getAttribute('data-original-text')) {
infoDiv.setAttribute('data-original-text', infoDiv.textContent);
}
infoDiv.textContent = text;
}
}

// Add event listeners
worldIdInput.addEventListener('input', validateInputs);
difficultyInput.addEventListener('input', validateInputs);
startConditionInput.addEventListener('input', validateInputs);
startLocationInput.addEventListener('input', validateInputs);

// Initialize validation and fill hint on page load
document.addEventListener('DOMContentLoaded', () => {
validateInputs();
toggleFillHint();
});
Loading