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