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 or use bound consumable",
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: "Shift+m",
111 description: "Relocate nearest owned chest/lodging — 1×1 ghost square, Enter confirm",
112 },
113 KeyBinding {
114 keys: "k",
115 description: "Buy crown land — claim mode: WASD move plot, [ ] size, Enter buy",
116 },
117 KeyBinding {
118 keys: "v",
119 description: "Quest log / withdraw menu",
120 },
121 KeyBinding {
122 keys: "h",
123 description: "Hired workers — hire, dismiss, give items (g), teach recipes (t), toggle companion/job loop",
124 },
125 ],
126 },
127 KeyBindingCategory {
128 name: "Inventory & crafting",
129 bindings: &[
130 KeyBinding {
131 keys: "b",
132 description: "Inventory (worn items by body slot, on-you items, nearby open chests)",
133 },
134 KeyBinding {
135 keys: "p",
136 description: "Equip paperdoll — body slots, hands, mitigation / resists",
137 },
138 KeyBinding {
139 keys: "n",
140 description: "Craft menu (Enter to craft, Esc to close)",
141 },
142 KeyBinding {
143 keys: ",",
144 description: "Keychain — stow/retrieve chest keys (zero carry mass when stowed)",
145 },
146 KeyBinding {
147 keys: "i",
148 description: "Character stats overlay",
149 },
150 KeyBinding {
151 keys: "↑↓ / jk",
152 description: "Move selection in craft or inventory menus",
153 },
154 KeyBinding {
155 keys: "Enter",
156 description: "Inventory: equip/wear/use selected item, or move it",
157 },
158 KeyBinding {
159 keys: "m / d / x / l",
160 description: "Inventory: move to… / Relocate… (placed chest) / drop / destroy / lock nearby chest",
161 },
162 ],
163 },
164 KeyBindingCategory {
165 name: "Chat",
166 bindings: &[
167 KeyBinding {
168 keys: "t",
169 description: "Nearby chat — focus CHAT column input",
170 },
171 KeyBinding {
172 keys: "g",
173 description: "Whisper-stone contacts in CHAT",
174 },
175 KeyBinding {
176 keys: "f (on player)",
177 description: "Whisper or Trade with nearest player",
178 },
179 KeyBinding {
180 keys: "Y / N",
181 description: "Accept / decline inbound trade request",
182 },
183 KeyBinding {
184 keys: "Enter",
185 description: "Send chat line",
186 },
187 KeyBinding {
188 keys: "Tab",
189 description: "While whispering: return to Nearby speech",
190 },
191 KeyBinding {
192 keys: "Esc",
193 description: "Unfocus chat / cancel trade / close overlay",
194 },
195 ],
196 },
197 KeyBindingCategory {
198 name: "Session & HUD",
199 bindings: &[
200 KeyBinding {
201 keys: "? or /",
202 description: "Help & keybindings",
203 },
204 KeyBinding {
205 keys: ".",
206 description: "Cycle HUD — normal → compact (keeps CHAT) → map",
207 },
208 KeyBinding {
209 keys: "'",
210 description: "Hide / show the bottom LOG panel",
211 },
212 KeyBinding {
213 keys: "F2",
214 description: "Connection settings (server host / ports)",
215 },
216 KeyBinding {
217 keys: "Ctrl+Q",
218 description: "Quit client",
219 },
220 KeyBinding {
221 keys: "Ctrl+C",
222 description: "Interrupt / force quit",
223 },
224 ],
225 },
226 KeyBindingCategory {
227 name: "Dev / debug",
228 bindings: &[
229 KeyBinding {
230 keys: "-",
231 description: "Test damage (25 HP) — dev only",
232 },
233 KeyBinding {
234 keys: ";",
235 description: "Toggle harvest / use radius overlay",
236 },
237 ],
238 },
239];
240
241pub fn format_keybindings_plain() -> String {
243 let mut out = String::from("Flatland3 play — keybindings\n\n");
244 for cat in CATEGORIES {
245 out.push_str(cat.name);
246 out.push_str("\n");
247 for b in cat.bindings {
248 out.push_str(&format!(" {:<16} {}\n", b.keys, b.description));
249 }
250 out.push('\n');
251 }
252 out.push_str(&format_map_legend_plain());
253 out.push_str("Wildlife: rabbits north meadow (~95,195); wolves bog (~118,122).\n");
254 out
255}