Settings System

Status: Designed Author: user + game-designer Last Updated: 2026-03-28 System Index: #21 — Alpha, Polish Layer

Overview

The Settings System manages user preferences — audio volume, display options, and controls. Settings are persisted locally via Godot's ConfigFile to user://settings.cfg. The system provides a UI overlay accessible from the Main Menu and via a pause menu (Escape key) during gameplay. Settings apply immediately without requiring a restart.

Player Fantasy

"The game respects my preferences." Volume too loud? One slider. Want fullscreen? One click. Settings persist between sessions — set once, forget.

Detailed Design

Core Rules

  1. Settings stored as an autoloaded singleton (Settings) reading/writing user://settings.cfg.
  2. Settings UI is a modal overlay — pauses the game when opened during gameplay (client-side only, server continues).
  3. Changes apply immediately (no "Apply" button needed for V1).
  4. Default values used if config file is missing or corrupt.

V1 Settings

CategorySettingTypeDefaultRange
AudioMaster Volumefloat1.00.0-1.0
AudioMusic Volumefloat0.70.0-1.0
AudioSFX Volumefloat1.00.0-1.0
DisplayFullscreenboolfalsetoggle
DisplayVSyncbooltruetoggle
DisplayWindow Sizeenum1280x720720p/1080p/1440p
GameDisplay Namestring"Player"1-20 chars
GameServer Addressstring(default)IP or hostname

Settings UI Layout

┌────────────────────────────────────┐
│  SETTINGS                    [X]   │
│                                    │
│  Audio                             │
│  Master:   [━━━━━━━●━━] 80%       │
│  Music:    [━━━━━●━━━━] 70%       │
│  SFX:      [━━━━━━━━━●] 100%      │
│                                    │
│  Display                           │
│  Fullscreen: [ ] Off               │
│  VSync:      [✓] On               │
│  Resolution: [1280×720 ▼]          │
│                                    │
│  Game                              │
│  Name: [__________]                │
│  Server: [________________]        │
│                                    │
│           [RESET DEFAULTS]         │
└────────────────────────────────────┘

Persistence

save_settings():
    var config = ConfigFile.new()
    config.set_value("audio", "master_volume", master_volume)
    config.set_value("audio", "music_volume", music_volume)
    config.set_value("audio", "sfx_volume", sfx_volume)
    config.set_value("display", "fullscreen", fullscreen)
    config.set_value("display", "vsync", vsync)
    config.set_value("display", "window_size", window_size)
    config.set_value("game", "display_name", display_name)
    config.set_value("game", "server_address", server_address)
    config.save("user://settings.cfg")

load_settings():
    var config = ConfigFile.new()
    if config.load("user://settings.cfg") != OK:
        return  # use defaults
    master_volume = config.get_value("audio", "master_volume", 1.0)
    # ... etc

Interactions with Other Systems

SystemDirectionInterface
Audio ManagerWrites toVolume settings applied to AudioBus volumes
Main MenuOpens overlaySettings button on main menu
All scenesOpens overlayEscape key opens pause + settings

Formulas

None.

Edge Cases

CaseResolution
Config file corrupt/unreadableDelete and recreate with defaults. Log warning.
Web export: no fullscreen toggleUse browser fullscreen API instead. Setting may behave differently.
Web export: no window size optionHide resolution setting on web. Browser controls window size.
Settings changed during multiplayerClient-side only. No server impact.
Reset defaultsRestore all values to defaults, save immediately.

Dependencies

Upstream

None — standalone utility system.

Downstream

SystemDependency TypeInterface
Audio ManagerSoftReads volume settings
Main MenuSoftReads display name and server address

Tuning Knobs

The settings ARE tuning knobs for the player. No meta-tuning needed.

Acceptance Criteria

#CriterionVerification
1Settings persist between sessionsIntegration test: change volume, quit, relaunch, assert volume preserved
2Volume sliders affect audio immediatelyAudio test: drag slider, assert volume changes in real-time
3Fullscreen toggle worksVisual test: toggle fullscreen, assert window mode changes
4Escape opens settings during gameplayIntegration test: press Escape in combat, assert settings overlay appears
5Reset defaults restores all valuesIntegration test: change settings, click Reset, assert all defaults
6Missing config file uses defaultsIntegration test: delete settings.cfg, launch, assert defaults loaded
Built with LogoFlowershow