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 }