1use crate::map_presentation::format_map_legend_plain;
4
5pub struct KeyBinding {
6 pub keys: &'static str,
7 pub description: &'static str,
8}
9
10pub struct KeyBindingCategory {
11 pub name: &'static str,
12 pub bindings: &'static [KeyBinding],
13}
14
15pub const CATEGORIES: &[KeyBindingCategory] = &[
16 KeyBindingCategory {
17 name: "Movement",
18 bindings: &[
19 KeyBinding {
20 keys: "WASD / arrows",
21 description: "Move (cardinals; hold two for diagonal)",
22 },
23 KeyBinding {
24 keys: "Click map",
25 description: "Auto-walk to clicked cell (A* path); right-click cancels",
26 },
27 KeyBinding {
28 keys: "Shift (hold)",
29 description: "Sprint while moving",
30 },
31 KeyBinding {
32 keys: "x",
33 description: "Toggle sprint mode (faster move, stamina drain)",
34 },
35 KeyBinding {
36 keys: "Shift+Space",
37 description: "Lunge forward (~8.5 m, high stamina)",
38 },
39 KeyBinding {
40 keys: "m",
41 description: "Map target mode — mouse/WASD place X, Enter to auto-walk",
42 },
43 KeyBinding {
44 keys: "u / j",
45 description: "Climb / descend",
46 },
47 KeyBinding {
48 keys: "Alt + WASD / arrows",
49 description: "Directional jump — leap one cell over a medium cliff (~2 m rise)",
50 },
51 KeyBinding {
52 keys: "Space",
53 description: "Stop movement / cancel auto-walk",
54 },
55 ],
56 },
57 KeyBindingCategory {
58 name: "Combat",
59 bindings: &[
60 KeyBinding {
61 keys: "Tab",
62 description: "Cycle T1 target (hostile)",
63 },
64 KeyBinding {
65 keys: "Shift+Tab",
66 description: "Cycle T2 target (allies, then monsters)",
67 },
68 KeyBinding {
69 keys: "0 / Shift+0",
70 description: "Clear T1 / T2 target",
71 },
72 KeyBinding {
73 keys: "1–9",
74 description: "Hotbar — cast bound ability (see client-settings.yaml)",
75 },
76 KeyBinding {
77 keys: "r / Shift+r",
78 description: "Toggle auto rotation for T1 / T2",
79 },
80 KeyBinding {
81 keys: "c",
82 description: "Dodge (i-frames, stamina)",
83 },
84 KeyBinding {
85 keys: "q",
86 description: "Toggle block (melee damage reduction)",
87 },
88 KeyBinding {
89 keys: "l",
90 description: "Loadout — assign rotation preset to T1/T2",
91 },
92 KeyBinding {
93 keys: "o",
94 description: "Rotation editor — create/edit/delete presets",
95 },
96 KeyBinding {
97 keys: "(auto)",
98 description: "T1 auto pursues into weapon range when idle",
99 },
100 ],
101 },
102 KeyBindingCategory {
103 name: "World",
104 bindings: &[
105 KeyBinding {
106 keys: "f",
107 description: "Use nearest — interact, then pickup loot/chest, then harvest/butcher",
108 },
109 KeyBinding {
110 keys: "v",
111 description: "Quest log / withdraw menu",
112 },
113 ],
114 },
115 KeyBindingCategory {
116 name: "Inventory & crafting",
117 bindings: &[
118 KeyBinding {
119 keys: "b",
120 description: "Inventory (worn items by body slot, on-you items, nearby open chests)",
121 },
122 KeyBinding {
123 keys: "n",
124 description: "Craft menu (Enter to craft, Esc to close)",
125 },
126 KeyBinding {
127 keys: ",",
128 description: "Keychain — stow/retrieve chest keys (zero carry mass when stowed)",
129 },
130 KeyBinding {
131 keys: "i",
132 description: "Character stats overlay",
133 },
134 KeyBinding {
135 keys: "↑↓ / jk",
136 description: "Move selection in craft or inventory menus",
137 },
138 KeyBinding {
139 keys: "Enter",
140 description: "Inventory: equip/wear/use selected item, or move it",
141 },
142 KeyBinding {
143 keys: "m / d / x / l",
144 description: "Inventory: move to… picker / drop on ground / destroy permanently / lock nearby chest",
145 },
146 ],
147 },
148 KeyBindingCategory {
149 name: "Chat",
150 bindings: &[
151 KeyBinding {
152 keys: "t",
153 description: "Say to nearby players",
154 },
155 KeyBinding {
156 keys: "g",
157 description: "Whisper (requires whisper_stone)",
158 },
159 KeyBinding {
160 keys: "Enter",
161 description: "Send chat line",
162 },
163 KeyBinding {
164 keys: "Esc",
165 description: "Cancel chat or close overlay",
166 },
167 ],
168 },
169 KeyBindingCategory {
170 name: "Session",
171 bindings: &[
172 KeyBinding {
173 keys: "? or /",
174 description: "Toggle this keybindings help",
175 },
176 KeyBinding {
177 keys: ".",
178 description: "Cycle HUD view — normal → compact → map",
179 },
180 KeyBinding {
181 keys: "Ctrl+Q",
182 description: "Quit client",
183 },
184 KeyBinding {
185 keys: "Ctrl+C",
186 description: "Interrupt / force quit",
187 },
188 ],
189 },
190 KeyBindingCategory {
191 name: "Dev / debug",
192 bindings: &[
193 KeyBinding {
194 keys: "-",
195 description: "Test damage (25 HP) — dev only",
196 },
197 ],
198 },
199];
200
201pub fn format_keybindings_plain() -> String {
203 let mut out = String::from("Flatland3 play — keybindings\n\n");
204 for cat in CATEGORIES {
205 out.push_str(cat.name);
206 out.push_str("\n");
207 for b in cat.bindings {
208 out.push_str(&format!(" {:<16} {}\n", b.keys, b.description));
209 }
210 out.push('\n');
211 }
212 out.push_str(&format_map_legend_plain());
213 out.push_str("Wildlife: rabbits north meadow (~95,195); wolves bog (~118,122).\n");
214 out
215}