1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-13 11:10:43 +00:00
OpenDiablo2/d2core/d2config/d2config.go

145 lines
2.9 KiB
Go
Raw Normal View History

package d2config
import (
2020-07-08 13:16:16 +00:00
"encoding/json"
"errors"
"log"
2020-07-08 13:16:16 +00:00
"os"
"path"
"strings"
)
2020-07-08 13:16:16 +00:00
// Config holds the configuration from config.json
var Config *Configuration //nolint:gochecknoglobals // Currently global by design
// Configuration defines the configuration for the engine, loaded from config.json
type Configuration struct {
2020-07-08 13:16:16 +00:00
MpqLoadOrder []string
Language string
MpqPath string
TicksPerSecond int
FpsCap int
SfxVolume float64
BgmVolume float64
FullScreen bool
RunInBackground bool
VsyncEnabled bool
Backend string
}
2020-07-08 13:16:16 +00:00
// Load loads a configuration object from disk
func Load() error {
Config = new(Configuration)
return Config.Load()
}
// Load loads a configuration object from disk
func (c *Configuration) Load() error {
configPaths := []string{
2020-07-08 13:16:16 +00:00
defaultConfigPath(),
localConfigPath(),
}
for _, configPath := range configPaths {
log.Printf("loading configuration file from %s...", configPath)
2020-07-08 13:16:16 +00:00
if _, err := os.Stat(configPath); os.IsNotExist(err) {
continue
}
2020-07-08 13:16:16 +00:00
configFile, err := os.Open(path.Clean(configPath))
if err != nil {
return err
}
2020-07-08 13:16:16 +00:00
if err := json.NewDecoder(configFile).Decode(&Config); err != nil {
return err
}
2020-07-08 13:16:16 +00:00
if err := configFile.Close(); err != nil {
return err
}
if err := verifyMpqFileReferences(); err != nil {
return err
}
2020-07-08 13:16:16 +00:00
return nil
}
2020-07-08 13:16:16 +00:00
log.Println("failed to load configuration file, saving default configuration...")
Config = defaultConfig()
if err := verifyMpqFileReferences(); err != nil {
return err
}
2020-07-08 13:16:16 +00:00
return Config.Save()
}
// Save saves the configuration object to disk
func (c *Configuration) Save() error {
2020-07-08 13:16:16 +00:00
configPath := defaultConfigPath()
log.Printf("saving configuration file to %s...", configPath)
2020-07-08 13:16:16 +00:00
configDir := path.Dir(configPath)
if err := os.MkdirAll(configDir, 0750); err != nil {
return err
}
configFile, err := os.Create(configPath)
if err != nil {
return err
}
buf, err := json.MarshalIndent(Config, "", " ")
if err != nil {
return err
}
2020-07-08 13:16:16 +00:00
if _, err := configFile.Write(buf); err != nil {
return err
}
return configFile.Close()
}
func defaultConfigPath() string {
if configDir, err := os.UserConfigDir(); err == nil {
return path.Join(configDir, "OpenDiablo2", "config.json")
}
return localConfigPath()
}
func localConfigPath() string {
return path.Join(path.Dir(os.Args[0]), "config.json")
}
func verifyMpqFileReferences() error {
badFiles := []string{}
for fileIdx := range Config.MpqLoadOrder {
actualPath := path.Join(Config.MpqPath, Config.MpqLoadOrder[fileIdx])
info, err := os.Stat(actualPath)
if !os.IsNotExist(err) {
continue
}
if info != nil && !info.IsDir() {
continue
}
badFiles = append(badFiles, actualPath)
}
if len(badFiles) > 0 {
return errors.New("The following MPQ file(s) could not be found:\n" + strings.Join(badFiles, "\n") +
"\n\nPlease check your configuration file located at:\n" + defaultConfigPath())
}
return nil
}