Data/GenericData.dat specifies what the default values for some options should be. Respect them on startup if the options in config are unset.
122 lines
2.2 KiB
Go
122 lines
2.2 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
type Ordoor struct {
|
|
DataDir string `toml:"data_dir"`
|
|
VideoPlayer []string `toml:"video_player"`
|
|
}
|
|
|
|
// Things set in the options hash
|
|
// TODO: load defaults from Data/GenericData.dat if they're not set
|
|
type Options struct {
|
|
PlayMovies bool `toml:"play_movies"`
|
|
Animations bool `toml:"animations"`
|
|
PlayMusic bool `toml:"play_music"`
|
|
CombatVoices bool `toml:"combat_voices"`
|
|
ShowGrid bool `toml:"show_grid"`
|
|
ShowPaths bool `toml:"show_paths"`
|
|
PointSaving bool `toml:"point_saving"`
|
|
AutoCutLevel bool `toml:"auto_cut_level"`
|
|
|
|
XRes int `toml:"x_resolution"`
|
|
YRes int `toml:"y_resolution"`
|
|
|
|
MusicVolume int `toml:"music_volume"`
|
|
SFXVolume int `toml:"sfx_volume"`
|
|
|
|
UnitSpeed int `toml:"unit_speed"`
|
|
AnimSpeed int `toml:"animation_speed"`
|
|
}
|
|
|
|
type Config struct {
|
|
filename string `toml:"-"`
|
|
|
|
Defaults *Options `toml:"-"`
|
|
Ordoor `toml:"ordoor"`
|
|
Options `toml:"options"`
|
|
}
|
|
|
|
func Load(filename string) (*Config, error) {
|
|
var out Config
|
|
|
|
_, err := toml.DecodeFile(filename, &out)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
out.filename = filename
|
|
|
|
return &out, err
|
|
}
|
|
|
|
func (c *Config) HasUnsetOptions() bool {
|
|
var empty Options
|
|
|
|
return c.Options == empty
|
|
}
|
|
|
|
func (c *Config) Save() error {
|
|
f, err := os.OpenFile(c.filename, os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
return toml.NewEncoder(f).Encode(c)
|
|
}
|
|
|
|
// TODO: case-insensitive lookup
|
|
func (c *Config) DataFile(path string) string {
|
|
return filepath.Join(c.DataDir, path)
|
|
}
|
|
|
|
func (c *Config) ResetDefaults() error {
|
|
if c.Defaults == nil {
|
|
return errors.New("Defaults not available")
|
|
}
|
|
|
|
c.Options = *c.Defaults
|
|
|
|
return c.Save()
|
|
}
|
|
|
|
func (o *Options) ResolutionIndex() int {
|
|
if o.XRes == 640 && o.YRes == 480 {
|
|
return 1
|
|
}
|
|
|
|
if o.XRes == 800 && o.YRes == 600 {
|
|
return 2
|
|
}
|
|
|
|
if o.XRes == 1024 && o.YRes == 768 {
|
|
return 3
|
|
}
|
|
|
|
return 4 // Magic value
|
|
}
|
|
|
|
func (o *Options) SetResolutionIndex(value int) {
|
|
switch value {
|
|
case 1:
|
|
o.XRes = 640
|
|
o.YRes = 480
|
|
case 2:
|
|
o.XRes = 800
|
|
o.YRes = 600
|
|
case 3:
|
|
o.XRes = 1024
|
|
o.YRes = 768
|
|
}
|
|
|
|
// If the value isn't recognised, silently ignore the request to avoid
|
|
// overwriting options the resolution slider doesn't know about
|
|
}
|