aboutsummaryrefslogtreecommitdiff
path: root/internal/config/config.go
blob: cafa82f6410ba43f1f92614a91480848e0b9da57 (plain)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package config

import (
	"os"
	"path/filepath"

	"tui-ascii-mapper/internal/model"

	"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          []model.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: []model.Terrain{
			{Name: "water", Symbol: "≋", ASCII: "~", Colors: []model.TerrainColor{{Color: "21", Weight: 30}, {Color: "27", Weight: 30}, {Color: "33", Weight: 20}, {Color: "39", Weight: 20}}},
			{Name: "mountains", Symbol: "▲", ASCII: "^", Colors: []model.TerrainColor{{Color: "243", Weight: 40}, {Color: "247", Weight: 30}, {Color: "250", Weight: 30}}},
			{Name: "crater", Symbol: "▼", ASCII: "v", Colors: []model.TerrainColor{{Color: "243", Weight: 40}, {Color: "247", Weight: 30}, {Color: "250", Weight: 30}}},
			{Name: "plains", Symbol: "≡", ASCII: "=", Colors: []model.TerrainColor{{Color: "106", Weight: 30}, {Color: "70", Weight: 25}, {Color: "64", Weight: 25}, {Color: "71", Weight: 20}}},
			{Name: "trees", Symbol: "♣", ASCII: "#", Colors: []model.TerrainColor{{Color: "28", Weight: 30}, {Color: "34", Weight: 25}, {Color: "22", Weight: 25}, {Color: "29", Weight: 20}}},
			{Name: "settlement", Symbol: "⌂", ASCII: "@", Colors: []model.TerrainColor{{Color: "130", Weight: 40}, {Color: "136", Weight: 30}, {Color: "94", Weight: 30}}},
			{Name: "outpost", Symbol: "◈", ASCII: "&", Colors: []model.TerrainColor{{Color: "172", Weight: 40}, {Color: "166", Weight: 30}, {Color: "130", Weight: 30}}},
			{Name: "road", Symbol: "·", ASCII: ".", Colors: []model.TerrainColor{{Color: "244", Weight: 40}, {Color: "242", Weight: 30}, {Color: "246", Weight: 30}}},
			{Name: "desert", Symbol: "░", ASCII: "_", Colors: []model.TerrainColor{{Color: "178", Weight: 30}, {Color: "180", Weight: 25}, {Color: "222", Weight: 25}, {Color: "179", Weight: 20}}},
			{Name: "snow", Symbol: "❄", ASCII: "*", Colors: []model.TerrainColor{{Color: "255", Weight: 40}, {Color: "254", Weight: 30}, {Color: "250", Weight: 30}}},
			{Name: "swamp", Symbol: "≈", ASCII: "%", Colors: []model.TerrainColor{{Color: "64", Weight: 30}, {Color: "65", Weight: 25}, {Color: "58", Weight: 25}, {Color: "107", Weight: 20}}},
			{Name: "cave", Symbol: "◌", ASCII: "n", Colors: []model.TerrainColor{{Color: "237", Weight: 40}, {Color: "235", Weight: 30}, {Color: "239", Weight: 30}}},
			{Name: "wall", Symbol: "█", ASCII: "|", Colors: []model.TerrainColor{{Color: "240", Weight: 40}, {Color: "238", Weight: 30}, {Color: "242", Weight: 30}}},
			{Name: "bridge", Symbol: "▬", ASCII: "-", Colors: []model.TerrainColor{{Color: "94", Weight: 40}, {Color: "130", Weight: 30}, {Color: "136", Weight: 30}}},
			{Name: "lava", Symbol: "▓", ASCII: "L", Colors: []model.TerrainColor{{Color: "196", Weight: 30}, {Color: "202", Weight: 25}, {Color: "208", Weight: 25}, {Color: "124", Weight: 20}}},
			{Name: "ice", Symbol: "▩", ASCII: "I", Colors: []model.TerrainColor{{Color: "51", Weight: 40}, {Color: "45", Weight: 30}, {Color: "50", Weight: 30}}},
			{Name: "ruins", Symbol: "▣", ASCII: "r", Colors: []model.TerrainColor{{Color: "244", Weight: 35}, {Color: "240", Weight: 35}, {Color: "243", Weight: 30}}},
			{Name: "farmland", Symbol: "▤", ASCII: "f", Colors: []model.TerrainColor{{Color: "142", Weight: 35}, {Color: "143", Weight: 35}, {Color: "106", Weight: 30}}},
			{Name: "tower", Symbol: "◬", ASCII: "T", Colors: []model.TerrainColor{{Color: "220", Weight: 40}, {Color: "214", Weight: 30}, {Color: "222", Weight: 30}}},
			{Name: "castle", Symbol: "♜", ASCII: "C", Colors: []model.TerrainColor{{Color: "248", Weight: 35}, {Color: "244", Weight: 35}, {Color: "136", Weight: 30}}},
			{Name: "coast", Symbol: "∼", ASCII: "s", Colors: []model.TerrainColor{{Color: "33", Weight: 35}, {Color: "39", Weight: 35}, {Color: "27", Weight: 30}}},
			{Name: "village", Symbol: "◉", ASCII: "o", Colors: []model.TerrainColor{{Color: "208", Weight: 35}, {Color: "172", Weight: 35}, {Color: "166", Weight: 30}}},
			{Name: "graveyard", Symbol: "☠", ASCII: "y", Colors: []model.TerrainColor{{Color: "238", Weight: 40}, {Color: "240", Weight: 30}, {Color: "242", Weight: 30}}},
			{Name: "tavern", Symbol: "♨", ASCII: "a", Colors: []model.TerrainColor{{Color: "130", Weight: 35}, {Color: "94", Weight: 35}, {Color: "131", Weight: 30}}},
			{Name: "dungeon", Symbol: "◎", ASCII: "d", Colors: []model.TerrainColor{{Color: "239", Weight: 40}, {Color: "237", Weight: 30}, {Color: "241", Weight: 30}}},
			{Name: "forest", Symbol: "♠", ASCII: "F", Colors: []model.TerrainColor{{Color: "28", Weight: 30}, {Color: "64", Weight: 25}, {Color: "22", Weight: 25}, {Color: "35", Weight: 20}}},
			{Name: "shrine", Symbol: "✞", ASCII: "h", Colors: []model.TerrainColor{{Color: "220", Weight: 35}, {Color: "214", Weight: 35}, {Color: "178", Weight: 30}}},
			{Name: "crypt", Symbol: "▦", ASCII: "x", Colors: []model.TerrainColor{{Color: "236", Weight: 40}, {Color: "238", Weight: 30}, {Color: "240", Weight: 30}}},
			{Name: "rift", Symbol: "⚡", ASCII: "i", Colors: []model.TerrainColor{{Color: "129", Weight: 35}, {Color: "93", Weight: 35}, {Color: "201", Weight: 30}}},
			{Name: "oasis", Symbol: "◯", ASCII: "b", Colors: []model.TerrainColor{{Color: "51", Weight: 35}, {Color: "33", Weight: 35}, {Color: "39", Weight: 30}}},
			{Name: "citadel", Symbol: "◘", ASCII: "V", Colors: []model.TerrainColor{{Color: "250", Weight: 35}, {Color: "248", Weight: 35}, {Color: "253", Weight: 30}}},
			{Name: "flowers", Symbol: "⚘", ASCII: "f", Colors: []model.TerrainColor{{Color: "169", Weight: 35}, {Color: "133", Weight: 35}, {Color: "170", Weight: 30}}},
			{Name: "wall/road", Symbol: "═", ASCII: "=", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "║", ASCII: "|", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╔", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╗", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╚", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╝", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╠", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╣", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╦", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╩", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
			{Name: "wall/road", Symbol: "╬", ASCII: "+", Colors: []model.TerrainColor{{Color: "243", Weight: 100}}},
		},
	}
}

func findConfigFile() string {
	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
		}
	}
	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 ""
}

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
}