1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
}
|