Noah Petherbridge
864156da53
* Added a Settings window for game options, such as enabling the horizontal toolbars in Edit Mode. The Settings window also has a Controls tab showing the gameplay buttons and keyboard shortcuts. * The Settings window is available as a button on the home screen OR from the Edit->Settings menu in the EditScene. * Bugfix: using WASD to move the player character now works better and is considered by the game to be identical to the arrow key inputs. Boy now updates his animation based on these keys, and they register as boolean on/off keys instead of affected by key-repeat. * Refactor the boolProps: they are all part of usercfg now, and if you run e.g. "boolProp show-all-doodads true" and then cause the user settings to save to disk, that boolProp will be permanently enabled until turned off again.
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
/*
|
|
Package usercfg has functions around the user's Game Settings.
|
|
|
|
Other places in the codebase to look for its related functionality:
|
|
|
|
- pkg/windows/settings.go: the Settings Window is the UI owner of
|
|
this feature, it adjusts the usercfg.Current struct and Saves the
|
|
changes to disk.
|
|
*/
|
|
package usercfg
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"git.kirsle.net/apps/doodle/pkg/userdir"
|
|
)
|
|
|
|
// Settings are the available game settings.
|
|
type Settings struct {
|
|
// Initialized is set true the first time the settings are saved to
|
|
// disk, so the game may decide some default settings for first-time
|
|
// user experience, e.g. set horizontal toolbars for mobile.
|
|
Initialized bool
|
|
|
|
// Configurable settings (pkg/windows/settings.go)
|
|
HorizontalToolbars bool `json:",omitempty"`
|
|
|
|
// Secret boolprops from balance/boolprops.go
|
|
ShowHiddenDoodads bool `json:",omitempty"`
|
|
WriteLockOverride bool `json:",omitempty"`
|
|
JSONIndent bool `json:",omitempty"`
|
|
|
|
// Bookkeeping.
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
// Current loaded settings, good defaults by default.
|
|
var Current = Defaults()
|
|
|
|
// Defaults returns sensible default user settings.
|
|
func Defaults() *Settings {
|
|
return &Settings{}
|
|
}
|
|
|
|
// Filepath returns the path to the settings file.
|
|
func Filepath() string {
|
|
return filepath.Join(userdir.ProfileDirectory, "settings.json")
|
|
}
|
|
|
|
// Save the settings to disk.
|
|
func Save() error {
|
|
var (
|
|
filename = Filepath()
|
|
bin = bytes.NewBuffer([]byte{})
|
|
enc = json.NewEncoder(bin)
|
|
)
|
|
enc.SetIndent("", "\t")
|
|
Current.Initialized = true
|
|
Current.UpdatedAt = time.Now()
|
|
if err := enc.Encode(Current); err != nil {
|
|
return err
|
|
}
|
|
err := ioutil.WriteFile(filename, bin.Bytes(), 0644)
|
|
return err
|
|
}
|
|
|
|
// Load the settings from disk. The loaded settings will be available
|
|
// at usercfg.Current.
|
|
func Load() error {
|
|
var (
|
|
filename = Filepath()
|
|
settings = Defaults()
|
|
)
|
|
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
|
return nil // no file, no problem
|
|
}
|
|
|
|
fh, err := os.Open(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Decode JSON from file.
|
|
dec := json.NewDecoder(fh)
|
|
err = dec.Decode(settings)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
Current = settings
|
|
return nil
|
|
}
|