aboutsummaryrefslogtreecommitdiff
path: root/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'config.go')
-rw-r--r--config.go114
1 files changed, 114 insertions, 0 deletions
diff --git a/config.go b/config.go
new file mode 100644
index 0000000..0ed6d15
--- /dev/null
+++ b/config.go
@@ -0,0 +1,114 @@
+package main
+
+import (
+ "os"
+ "path/filepath"
+
+ "gopkg.in/yaml.v3"
+)
+
+type ConfigKeybindings struct {
+ Quit string `yaml:"quit"`
+ Save string `yaml:"save"`
+ Undo string `yaml:"undo"`
+ Redo string `yaml:"redo"`
+ UnicodeToggle string `yaml:"unicode_toggle"`
+ ColorToggle string `yaml:"color_toggle"`
+ FillToggle string `yaml:"fill_toggle"`
+ Resize string `yaml:"resize"`
+ DrillDown string `yaml:"drill_down"`
+ DrillUp string `yaml:"drill_up"`
+ DeleteSubmap string `yaml:"delete_submap"`
+}
+
+type Config struct {
+ Symbols []Terrain `yaml:"symbols"`
+ Keybindings ConfigKeybindings `yaml:"keybindings"`
+ SubmapBg string `yaml:"submap_bg"`
+ DefaultMapWidth int `yaml:"default_map_width"`
+ DefaultMapHeight int `yaml:"default_map_height"`
+}
+
+func defaultConfig() Config {
+ return Config{
+ SubmapBg: "236",
+ DefaultMapWidth: 80,
+ DefaultMapHeight: 25,
+ Keybindings: ConfigKeybindings{
+ Quit: "q",
+ Save: "s",
+ Undo: "u",
+ Redo: "r",
+ UnicodeToggle: "U",
+ ColorToggle: "C",
+ FillToggle: "F",
+ Resize: "R",
+ DrillDown: "enter",
+ DrillUp: "esc",
+ DeleteSubmap: "D",
+ },
+ Symbols: []Terrain{
+ {Name: "water", Symbol: "≋", ASCII: "~", Colors: []TerrainColor{{Color: "21", Weight: 50}, {Color: "27", Weight: 50}}},
+ {Name: "mountains", Symbol: "▲", ASCII: "^", Colors: []TerrainColor{{Color: "243", Weight: 50}, {Color: "250", Weight: 50}}},
+ {Name: "plains", Symbol: "≡", ASCII: "=", Colors: []TerrainColor{{Color: "106", Weight: 60}, {Color: "70", Weight: 40}}},
+ {Name: "trees", Symbol: "♣", ASCII: "#", Colors: []TerrainColor{{Color: "28", Weight: 50}, {Color: "34", Weight: 50}}},
+ {Name: "settlement", Symbol: "◉", ASCII: "@", Colors: []TerrainColor{{Color: "208", Weight: 100}}},
+ {Name: "outpost", Symbol: "◈", ASCII: "&", Colors: []TerrainColor{{Color: "130", Weight: 100}}},
+ {Name: "road", Symbol: "·", ASCII: ".", Colors: []TerrainColor{{Color: "244", Weight: 100}}},
+ {Name: "desert", Symbol: "░", ASCII: "_", Colors: []TerrainColor{{Color: "178", Weight: 70}, {Color: "180", Weight: 30}}},
+ {Name: "snow", Symbol: "❄", ASCII: "*", Colors: []TerrainColor{{Color: "255", Weight: 100}}},
+ {Name: "swamp", Symbol: "≈", ASCII: "%", Colors: []TerrainColor{{Color: "64", Weight: 100}}},
+ {Name: "cave", Symbol: "◌", ASCII: "n", Colors: []TerrainColor{{Color: "237", Weight: 100}}},
+ {Name: "wall", Symbol: "█", ASCII: "|", Colors: []TerrainColor{{Color: "240", Weight: 100}}},
+ {Name: "bridge", Symbol: "▬", ASCII: "-", Colors: []TerrainColor{{Color: "94", Weight: 100}}},
+ {Name: "lava", Symbol: "▓", ASCII: "L", Colors: []TerrainColor{{Color: "196", Weight: 50}, {Color: "202", Weight: 50}}},
+ {Name: "ice", Symbol: "▩", ASCII: "I", Colors: []TerrainColor{{Color: "51", Weight: 100}}},
+ {Name: "ruins", Symbol: "▣", ASCII: "r", Colors: []TerrainColor{{Color: "244", Weight: 100}}},
+ {Name: "farmland", Symbol: "▤", ASCII: "f", Colors: []TerrainColor{{Color: "142", Weight: 100}}},
+ {Name: "tower", Symbol: "◬", ASCII: "T", Colors: []TerrainColor{{Color: "220", Weight: 100}}},
+ {Name: "castle", Symbol: "◼", ASCII: "C", Colors: []TerrainColor{{Color: "244", Weight: 100}}},
+ {Name: "coast", Symbol: "∼", ASCII: "s", Colors: []TerrainColor{{Color: "33", Weight: 100}}},
+ },
+ }
+}
+
+// findConfigFile checks next to the binary, then XDG_CONFIG_HOME.
+func findConfigFile() string {
+ // 1. Next to the binary
+ exe, err := os.Executable()
+ if err == nil {
+ dir := filepath.Dir(exe)
+ p := filepath.Join(dir, "config.yaml")
+ if _, err := os.Stat(p); err == nil {
+ return p
+ }
+ }
+ // 2. XDG_CONFIG_HOME/tui-ascii-mapper
+ cfgDir := os.Getenv("XDG_CONFIG_HOME")
+ if cfgDir == "" {
+ home, _ := os.UserHomeDir()
+ cfgDir = filepath.Join(home, ".config")
+ }
+ p := filepath.Join(cfgDir, "tui-ascii-mapper", "config.yaml")
+ if _, err := os.Stat(p); err == nil {
+ return p
+ }
+ return ""
+}
+
+// LoadConfig loads config.yaml, recreating with defaults if missing.
+func LoadConfig() Config {
+ path := findConfigFile()
+ if path == "" {
+ return defaultConfig()
+ }
+ data, err := os.ReadFile(path)
+ if err != nil {
+ return defaultConfig()
+ }
+ var cfg Config
+ if err := yaml.Unmarshal(data, &cfg); err != nil {
+ return defaultConfig()
+ }
+ return cfg
+}