1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2025-02-05 16:17:45 -05:00

Configuration cleanup (#257)

* Cleanup config file loading, move defaults to code

* Default to fullscreen

* Cleanup

* Store configuration in UserConfigDir

* print config path on load and save
This commit is contained in:
Alex Yatskov 2019-12-17 18:32:37 -08:00 committed by Tim Sarbin
parent cead000c3f
commit d5a0038125
3 changed files with 109 additions and 77 deletions

View File

@ -1,37 +0,0 @@
{
"Language": "ENG",
"FullScreen": true,
"Scale": 1,
"TicksPerSecond": -1,
"RunInBackground": true,
"VsyncEnabled": true,
"SfxVolume": 1.0,
"BgmVolume": 0.3,
"MpqPath": "C:/Program Files (x86)/Diablo II",
"MpqLoadOrder": [
"Patch_D2.mpq",
"d2exp.mpq",
"d2xmusic.mpq",
"d2xtalk.mpq",
"d2xvideo.mpq",
"d2data.mpq",
"d2char.mpq",
"d2music.mpq",
"d2sfx.mpq",
"d2video.mpq",
"d2speech.mpq"
],
"MpqMacLoadOrder": [
"Diablo II Patch",
"Diablo II Expansion Data",
"Diablo II Expansion Movies",
"Diablo II Expansion Music",
"Diablo II Expansion Speech",
"Diablo II Game Data",
"Diablo II Graphics",
"Diablo II Movies",
"Diablo II Music",
"Diablo II Sounds",
"Diablo II Speech"
]
}

View File

@ -56,7 +56,12 @@ type Engine struct {
// CreateEngine creates and instance of the OpenDiablo2 engine // CreateEngine creates and instance of the OpenDiablo2 engine
func CreateEngine() Engine { func CreateEngine() Engine {
var result Engine var result Engine
result.loadConfigurationFile()
result.Settings = d2corecommon.LoadConfiguration()
if err := result.Settings.Save(); err != nil {
log.Printf("could not load settings: %v", err)
}
result.assetManager = createAssetManager(result.Settings) result.assetManager = createAssetManager(result.Settings)
d2resource.LanguageCode = result.Settings.Language d2resource.LanguageCode = result.Settings.Language
d2datadict.LoadPalettes(nil, &result) d2datadict.LoadPalettes(nil, &result)
@ -84,11 +89,6 @@ func CreateEngine() Engine {
return result return result
} }
func (v *Engine) loadConfigurationFile() {
log.Println("Loading configuration file")
v.Settings = d2corecommon.LoadConfiguration()
}
func (v *Engine) LoadFile(fileName string) []byte { func (v *Engine) LoadFile(fileName string) []byte {
return v.assetManager.LoadFile(fileName) return v.assetManager.LoadFile(fileName)
} }
@ -194,7 +194,7 @@ func (v Engine) Draw(screen *ebiten.Image) {
ebitenutil.DebugPrintAt(screen, "HeapSys "+strconv.FormatInt(int64(m.HeapSys/1024/1024), 10), 680, 20) ebitenutil.DebugPrintAt(screen, "HeapSys "+strconv.FormatInt(int64(m.HeapSys/1024/1024), 10), 680, 20)
ebitenutil.DebugPrintAt(screen, "NumGC "+strconv.FormatInt(int64(m.NumGC), 10), 680, 30) ebitenutil.DebugPrintAt(screen, "NumGC "+strconv.FormatInt(int64(m.NumGC), 10), 680, 30)
cx, cy := ebiten.CursorPosition() cx, cy := ebiten.CursorPosition()
ebitenutil.DebugPrintAt(screen, "Coords "+strconv.FormatInt(int64(cx), 10) + ","+strconv.FormatInt(int64(cy), 10), 680, 40) ebitenutil.DebugPrintAt(screen, "Coords "+strconv.FormatInt(int64(cx), 10)+","+strconv.FormatInt(int64(cy), 10), 680, 40)
} }
} }

View File

@ -2,14 +2,11 @@ package d2corecommon
import ( import (
"encoding/json" "encoding/json"
"io/ioutil"
"log" "log"
"os" "os"
"os/user"
"path" "path"
"runtime" "runtime"
"strings"
"github.com/mitchellh/go-homedir"
) )
// Configuration defines the configuration for the engine, loaded from config.json // Configuration defines the configuration for the engine, loaded from config.json
@ -23,44 +20,116 @@ type Configuration struct {
VsyncEnabled bool VsyncEnabled bool
MpqPath string MpqPath string
MpqLoadOrder []string MpqLoadOrder []string
MpqMacLoadOrder []string
SfxVolume float64 SfxVolume float64
BgmVolume float64 BgmVolume float64
} }
// ConfigBasePath is used for tests to find the base config json file
var ConfigBasePath = "./"
func LoadConfiguration() *Configuration { func LoadConfiguration() *Configuration {
configJSON, err := ioutil.ReadFile(path.Join(ConfigBasePath, "config.json")) configDir, err := os.UserConfigDir()
if err != nil { if err != nil {
log.Fatal(err) return getDefaultConfiguration()
} }
var config Configuration
err = json.Unmarshal(configJSON, &config) configDir = path.Join(configDir, "OpenDiablo2")
if err != nil { configPath := path.Join(configDir, "config.json")
log.Fatal(err) log.Printf("loading configuration file from %s...", configPath)
} configFile, err := os.Open(configPath)
if runtime.GOOS == "darwin" { defer configFile.Close()
if config.MpqPath[0] != '/' {
config.MpqPath = "/Applications/Diablo II/" if err == nil {
} var config Configuration
config.MpqLoadOrder = config.MpqMacLoadOrder decoder := json.NewDecoder(configFile)
} else { if err := decoder.Decode(&config); err == nil {
// Path fixup for wine-installed diablo 2 in linux return &config
if config.MpqPath[0] != '/' {
if _, err := os.Stat(config.MpqPath); os.IsNotExist(err) {
homeDir, _ := homedir.Dir()
newPath := strings.ReplaceAll(config.MpqPath, `C:\`, homeDir+"/.wine/drive_c/")
newPath = strings.ReplaceAll(newPath, "C:/", homeDir+"/.wine/drive_c/")
newPath = strings.ReplaceAll(newPath, `\`, "/")
if _, err := os.Stat(newPath); !os.IsNotExist(err) {
config.MpqPath = newPath
}
}
} }
} }
return &config
return getDefaultConfiguration()
} }
func (c *Configuration) Save() error {
configDir, err := os.UserConfigDir()
if err != nil {
return err
}
configDir = path.Join(configDir, "OpenDiablo2")
if err := os.MkdirAll(configDir, 0755); err != nil {
return err
}
configPath := path.Join(configDir, "config.json")
log.Printf("saving configuration file to %s...", configPath)
configFile, err := os.Create(configPath)
if err != nil {
return err
}
encoder := json.NewEncoder(configFile)
encoder.SetIndent("", " ")
if err := encoder.Encode(c); err != nil {
return err
}
return nil
}
func getConfigurationPath() string {
configDir, err := os.UserConfigDir()
if err != nil {
return "config.json"
}
return path.Join(configDir, "OpenDiablo2/config.json")
}
func getDefaultConfiguration() *Configuration {
config := &Configuration{
Language: "ENG",
FullScreen: true,
Scale: 1,
TicksPerSecond: -1,
RunInBackground: true,
VsyncEnabled: true,
SfxVolume: 1.0,
BgmVolume: 0.3,
MpqPath: "C:/Program Files (x86)/Diablo II",
MpqLoadOrder: []string{
"Patch_D2.mpq",
"d2exp.mpq",
"d2xmusic.mpq",
"d2xtalk.mpq",
"d2xvideo.mpq",
"d2data.mpq",
"d2char.mpq",
"d2music.mpq",
"d2sfx.mpq",
"d2video.mpq",
"d2speech.mpq",
},
}
switch runtime.GOOS {
case "darwin":
config.MpqPath = "/Applications/Diablo II/"
config.MpqLoadOrder = []string{
"Diablo II Patch",
"Diablo II Expansion Data",
"Diablo II Expansion Movies",
"Diablo II Expansion Music",
"Diablo II Expansion Speech",
"Diablo II Game Data",
"Diablo II Graphics",
"Diablo II Movies",
"Diablo II Music",
"Diablo II Sounds",
"Diablo II Speech",
}
case "linux":
if usr, err := user.Current(); err == nil {
config.MpqPath = path.Join(usr.HomeDir, ".wine/drive_c/Program Files (x86)/Diablo II")
}
}
return config
}