a modern tui library written in zig
1const std = @import("std");
2const log = std.log.scoped(.main);
3const mem = std.mem;
4const process = std.process;
5
6const vaxis = @import("vaxis");
7const View = vaxis.widgets.View;
8const Cell = vaxis.Cell;
9const border = vaxis.widgets.border;
10
11const Event = union(enum) {
12 key_press: vaxis.Key,
13 winsize: vaxis.Winsize,
14};
15
16pub fn main() !void {
17 var gpa = std.heap.GeneralPurposeAllocator(.{}){};
18 defer {
19 const deinit_status = gpa.deinit();
20 if (deinit_status == .leak) {
21 log.err("memory leak", .{});
22 }
23 }
24 const alloc = gpa.allocator();
25
26 var world_map: []const u8 = lg_world_map;
27 var map_width = lg_map_width;
28 var map_height = lg_map_height;
29 var use_sm_map = false;
30 var use_mini_view = false;
31
32 var x: usize = 0;
33 var y: usize = 0;
34 var h: usize = 0;
35 var w: usize = 0;
36 defer log.info(
37 \\Results:
38 \\ - Map Size: {d}x{d}
39 \\ - Screen Size: {d}x{d}
40 \\ - Position: {d}, {d}
41 , .{
42 map_width, map_height,
43 w, h,
44 x, y,
45 });
46
47 var tty = try vaxis.Tty.init();
48 defer tty.deinit();
49
50 var buffered_writer = tty.bufferedWriter();
51 const writer = buffered_writer.writer().any();
52
53 // Initialize Vaxis
54 var vx = try vaxis.init(alloc, .{
55 .kitty_keyboard_flags = .{ .report_events = true },
56 });
57 defer vx.deinit(alloc, tty.anyWriter());
58 var loop: vaxis.Loop(Event) = .{
59 .vaxis = &vx,
60 .tty = &tty,
61 };
62 try loop.init();
63 try loop.start();
64 defer loop.stop();
65 try vx.enterAltScreen(writer);
66 try buffered_writer.flush();
67 try vx.queryTerminal(tty.anyWriter(), 20 * std.time.ns_per_s);
68
69 // Initialize Views
70 // - Large Map
71 var lg_map_view = try View.init(alloc, &vx.unicode, .{ .width = lg_map_width, .height = lg_map_height });
72 defer lg_map_view.deinit();
73 //w = lg_map_view.screen.width;
74 //h = lg_map_view.screen.height;
75 var lg_map_buf: [lg_map_width * lg_map_height]u8 = undefined;
76 _ = mem.replace(u8, lg_world_map, "\n", "", lg_map_buf[0..]);
77 _ = try lg_map_view.printSegment(.{ .text = lg_map_buf[0..] }, .{ .wrap = .grapheme });
78 // - Small Map
79 var sm_map_view = try View.init(alloc, &vx.unicode, .{ .width = sm_map_width, .height = sm_map_height });
80 defer sm_map_view.deinit();
81 w = sm_map_view.screen.width;
82 h = sm_map_view.screen.height;
83 var sm_map_buf: [sm_map_width * sm_map_height]u8 = undefined;
84 _ = mem.replace(u8, sm_world_map, "\n", "", sm_map_buf[0..]);
85 _ = try sm_map_view.printSegment(.{ .text = sm_map_buf[0..] }, .{ .wrap = .grapheme });
86 // - Active Map
87 var map_view = lg_map_view;
88
89 // TUI Loop
90 while (true) {
91 const event = loop.nextEvent();
92 switch (event) {
93 .key_press => |key| {
94 // Close Demo
95 if (key.matches('c', .{ .ctrl = true })) break;
96 // Scroll
97 if (key.matches(vaxis.Key.left, .{})) x -|= 1;
98 if (key.matches(vaxis.Key.right, .{})) x +|= 1;
99 if (key.matches(vaxis.Key.up, .{})) y -|= 1;
100 if (key.matches(vaxis.Key.down, .{})) y +|= 1;
101 // Quick Scroll
102 if (key.matches(vaxis.Key.left, .{ .ctrl = true })) x -|= 30;
103 if (key.matches(vaxis.Key.right, .{ .ctrl = true })) x +|= 30;
104 if (key.matches(vaxis.Key.up, .{ .ctrl = true })) y -|= 10;
105 if (key.matches(vaxis.Key.down, .{ .ctrl = true })) y +|= 10;
106 // Goto Side
107 if (key.matches(vaxis.Key.left, .{ .shift = true })) x -|= map_width;
108 if (key.matches(vaxis.Key.right, .{ .shift = true })) x +|= map_width;
109 if (key.matches(vaxis.Key.up, .{ .shift = true })) y -|= map_height;
110 if (key.matches(vaxis.Key.down, .{ .shift = true })) y +|= map_height;
111 // Change Zoom (Swap Map Views)
112 if (key.matches('z', .{})) {
113 if (use_sm_map) {
114 world_map = lg_world_map;
115 map_width = lg_map_width;
116 map_height = lg_map_height;
117 map_view = lg_map_view;
118 } else {
119 world_map = sm_world_map;
120 map_width = sm_map_width;
121 map_height = sm_map_height;
122 map_view = sm_map_view;
123 }
124 use_sm_map = !use_sm_map;
125 w = map_width;
126 h = map_height;
127 }
128 // Mini View (Forced Width & Height Limits)
129 if (key.matches('m', .{})) use_mini_view = !use_mini_view;
130 },
131 .winsize => |ws| try vx.resize(alloc, tty.anyWriter(), ws),
132 }
133
134 const win = vx.window();
135 win.clear();
136
137 const controls_win = win.child(.{
138 .height = .{ .limit = 1 },
139 });
140 _ = try controls_win.print(
141 if (win.width >= 112) &.{
142 .{ .text = "Controls:", .style = .{ .bold = true, .ul_style = .single } },
143 .{ .text = " Exit: ctrl + c | Scroll: dpad | Quick Scroll: ctrl + dpad | Goto Side: shift + dpad | Zoom: z | Mini: m" },
144 } else if (win.width >= 25) &.{
145 .{ .text = "Controls:", .style = .{ .bold = true, .ul_style = .single } },
146 .{ .text = " Win too small!" },
147 } else &.{
148 .{ .text = "" },
149 },
150 .{ .wrap = .none },
151 );
152
153 // Views require a Window to render to.
154 const map_win = if (use_mini_view)
155 win.child(.{
156 .y_off = controls_win.height,
157 .border = .{ .where = .top },
158 .width = .{ .limit = 45 },
159 .height = .{ .limit = 15 },
160 })
161 else
162 win.child(.{
163 .y_off = controls_win.height,
164 .border = .{ .where = .top },
165 });
166
167 // Clamp x and y
168 x = @min(x, map_width -| map_win.width);
169 y = @min(y, map_height -| map_win.height);
170
171 map_view.draw(map_win, .{
172 .x_off = x,
173 .y_off = y,
174 });
175 if (use_mini_view) {
176 _ = try win.printSegment(
177 .{ .text = "This is a mini portion of the View." },
178 .{ .row_offset = 16, .col_offset = 5, .wrap = .word },
179 );
180 }
181
182 // Render the screen
183 try vx.render(writer);
184 try buffered_writer.flush();
185 }
186}
187
188const sm_world_map =
189 \\ +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+
190 \\ W................................................................................................E
191 \\ W................................................................................................E
192 \\ W............................ @:::::::::@ ..................... .............................E
193 \\ W..... . ..... ::: ...::::::: ........ ...... %@%...........:*%@ . ..............E
194 \\ W..@:::::::::::::::::::: ::: ::::@ @@ ..... %#%%%%%%%%%%%%...........................* .......E
195 \\ W ::::@::::::::::::: .. :: ... * ....... . %%% %%%%%%%%%%%%%..................... ..* .........E
196 \\ W .....@::::::::::::.=::::: ........... @% @. %% %%%-...................:%% @. ..........E
197 \\ W...... :::%@@:@:::::::::@ :-........... @%%%%%%%%%%%%%%%%........................ .. ..........E
198 \\ W......@::::@@@.=-:::::=: ............. %@%%@# %%%%%%%..%%%.........@............ @=............E
199 \\ W..... :::::::::::::: ................. %%% @ % ........................... . . .............E
200 \\ W..... #:::::::::::@ .................. @=====@ .........................@ .= ............E
201 \\ W...... :::::@ @ ................... ============== .... ..................... .. .............E
202 \\ W....... .::=.. :# ................. ================ ...... ............... .................E
203 \\ W......... ::::... @-............... ================- ....@ ...-... . ....@ .. ...............E
204 \\ W............. :=.. % ...............==================+ ......@. .... ... .. @ ..............E
205 \\ W............... ######@ ............ ========@=@@@======@........ @.... . .. ................E
206 \\ W................ ######### ................. ===========@............... .@ ..@ =..............E
207 \\ W............... #############= ............. ========== ................. . ..*. . --- .......E
208 \\ W................ ###@@@#@#####%.............. ======== .................... @.@.... .*-=- ......E
209 \\ W................. ##@##@@#@### .............. ========-. -...................... -- + ........E
210 \\ W................... ##########................=======% *= .................... @-------- .......E
211 \\ W................... #######* ................-====== .-+....................#-@--@-@#--- ......E
212 \\ W................... ####### .................. ====- ........................@----------- ......E
213 \\ W................... ###### ....................@-* .......................... = ----:..... .E
214 \\ W....................####@ ......................................................... - .... -@ E
215 \\ W.................... ###.................................................................%-@ ...E
216 \\ W..................... #@........................................................................E
217 \\ W...................... ......................................................................E
218 \\ +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
219 \\
220;
221const sm_map_width = mapWidth: {
222 @setEvalBranchQuota(100_000);
223 break :mapWidth mem.indexOfScalar(u8, sm_world_map, '\n').?;
224};
225const sm_map_height = mapHeight: {
226 @setEvalBranchQuota(100_000);
227 break :mapHeight mem.count(u8, sm_world_map, "\n");
228};
229
230const lg_world_map =
231 \\ +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+
232 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
233 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
234 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
235 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
236 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
237 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
238 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
239 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
240 \\ W........................................................................................................................................................ ............................................................................................................................................................................................................................................E
241 \\ W................................................................................................................................ ................................................................................................................................................................................................................................E
242 \\ W........................................................................................................................... @@@@@@@@%-::::---::::::=#@@@@.... ................................................................................................................................................................................................................................E
243 \\ W..................................................................................................................... .@@@@:::::::::::::::::::::::::::::::::::::-@@ ...............................................................................................................................................................................................................................E
244 \\ W.................................................................................................................... %@@@#:::::::::::::::::::::::::::::::::::::@@- ...................................................................................... .........................................................................................................................E
245 \\ W................................................................................................................... @:::::::::::::::::::::::::::::::::::::::::@ .................................................................................... .@....@@: .......................................................................................................................E
246 \\ W............................................................................................... .... +:::::::::::::::::::::::::::::::::- ........................................................................... .. #@-.................@ ......................................................................................................E
247 \\ W......................................................................................... +@@@@@@@@@@ .... @:::::::::::::::::::::::::::::::@: ........................................................................ @@...........................%%%%*....%%@@= ..................................................................................E
248 \\ W........................ ... .................... @:::::::::::::@ ........ @::::::::::::::::::::::::::::+% ............................... ....................... @%%%%@@@%%%............................................-@@ %@@*******@@ .. ............................................................E
249 \\ W................... *@@#+++++++++@@%=== ======== ... @@::@ +::::::::::::::::-@ ....... *:::::::::::::::::::::::::::%@ ............................. %@@@@@= .. :@%%%%%%%%%%#.........................................................................+@= ................................................E
250 \\ W................ :@%=:::::::::::::::::::::::%%%-.:::::::::::::+%@@ =:::::--:::::@##%%::::::::@ ..... @:::::::::::::::::::::::%@+ ............................ @@%#%%%%%%%%%%#@@* +***@@%%%%%%%%%%%%%##..........................................................................................-%@@@@@+ .........................................E
251 \\ W............. .*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::%@@@=:::::::::::::::@@ @::::::::@ .... @:::::::::::::::::::@@. ...................... @%%%%%%%%%%%%%%%#%%%%%%%@@%%%%@@@%%%%%%%%%#%%%%%%%%%%%%=.....................................................................................................@@@%. ....................................E
252 \\ W............ =#-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::=@* @+:::::=:::+@ ... @::::::::::::::::@. @@@@@%%@@@ ................... @@%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%............................................................................................................@@@ ...................................E
253 \\ W......... *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@ *%::::::::::@ @@ ... *::::::::::@@@ ... %%%%%%%%@ ................ @@%%%%%##%* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%......................................................................................................* @...@ ...................................E
254 \\ W....... =@@=::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@ =@@@@ @:::::=@ ..... *:::::::::@ ....... :=@%%@ ............. %@%%%%%%%%%@: @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#=.......................................................................................................@ ...................................E
255 \\ W...... @:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@: @:::-@ @@* ........ @::::::@- .............. ............... @@@%%%%%%%%%%@ @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.....................................................................................................+@@ .......................................E
256 \\ W..... :@::::::::::::::::#%*::::::::::::::::::::::::::::::::::::::::::::::::::::@ ...... @:::::::@ .......... ..@:@: .............................. .... *@%%%%%%%%%%%@* +@%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%....................................................................................@ .@.=@.........@ .........................................E
257 \\ W.... @::::::::::=%@@ #%:::::::::::::::::::::::::::::::::::::::::::::- ........ @::::::::@:@=::@ ........... ................................ -@@ .. @%%%@@%%%%%%%=# @%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.........................................................................%@@@@@####@# +....#% ............................................E
258 \\ W. -@-:::*@- .. @::::::::::::::::::::::::::::::::::::::::::::@+ ..... @:::::::::::::::.- ................................................... @%%%@% ... @%%%@# #@%%% : : - %= :: : +%%%%%%%%%%%%%%%%%%%%%%.......................................................................-. @.....@ ...............................................E
259 \\ W @:::::%@ ............. ::::::::::::::::::::::::::::::::::::::::::::::::%+ +@:::::::::::::::::@ ............................................... %@%%%= ... %@ @%%%@ @%%%%% %. . - : . . +%%%%%%%%%%%%%%%#*%##%-.......................................................................:* ..... @......@: ..............................................E
260 \\ W@::::+@ .................. ::::::::::::::::::::::::::::::::::::::::::::::::::.+@ @*::::::::::::::::::::@ ........................................... :@@ @%%@# . #%%- @@@%%%%%% . . - # : . *#%%%%%%%%%%%#...............................................................................-@%% .... @........ ..............................................E
261 \\ W ...................... :::::::::::::::::::::::::::::::::::::::::::::::::::-. @::::::::::::::::::::::::* ........................................... @%%%@ @%%%@ @@@%%%%%%%%%%%%%%%%%%% @. . - : *#. *%%%%%%%%%%%%%#.........................................................................................@ .... @.....% ..............................................E
262 \\ W.. ......................... ::::::::::@:@:@@@:%@@%%@@@@@=@:::::::::::::::::::::= #=:::::::::::::::::::::::@ ........................................... :@%%%@ #%%%%%@ @@%%%%%%%%%%%%%%%%%%%%%% % % . .* += *%: -%%%%%%%%%#%............................................................................................@ ... +@..# ..............................................E
263 \\ W............................... .@.::::::::@#@.@+@@%@*@:%@:@@#@:::::::::::::::::::::::::::::::::::::::::::::::::@ ........................................... @@@ @@%@@@@ @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%...............................................................................................@- .... @ ..............................................E
264 \\ W............................... @::::::::::@@@:@+@%%@%@:%@:@@@@:::::::::::::::::::::::::::::::::::::::%@@ @:::::@ ........................................... @@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.................................................................................................@ ..... ...............................................E
265 \\ W............................... @:::::::::@=@:@*@#%@+@:%@:@@=@::::::::::::::::::::::::::::::::::::::*@ @::::::* ................................................ .@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##%##%%%%%%%%%%%%%.............................................................................................@@=.-: .........................................................E
266 \\ W............................... @:::::::::::::::::::::::::::.::::::::::::::::::::::::::::::::::::::. @@@:@-:+= ................................................ @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%#.......*%##%%%%%%%#%...........................................................................................- @.@ .........................................................E
267 \\ W.............................. @::::::::.:@@::@@:@@+@@.@@@:@*:@@*:@@*:::::::::::::::::::::::::::::::::@ ............................................. . @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%#............%%%%%%%%%%..............................@@.+@-@.@.@@@................................................@ .....................................................E
268 \\ W............................ -=:::::::::::@@*:@@*@@+@::@:@:@*@@=@:@@@::::::::::::::::::::::::::::::@@@ ..................................................... @%%%%%%%%%#%%%%%%@-@@%%%#%%%%%%%%%%%%%%%%%%%%##%#.........%#%%%%%%%%%=...........................@@=.@@..@.@.@...............................................@ *@@ ....................................................E
269 \\ W........................... @:::::::::::::@=@:@@@%@+@@.@@@:@*@@:::@.@:::::::::::::::::::::@@# :%@ ...................................................... @%%%%%%%%%%%%%@@@@@- *@%#@- .@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%........#%%%%%%%%%%..........................*@@@.:*@.@.@+@..............................................@ =....# ....................................................E
270 \\ W.......................... @:::::::::::::+@@@:@=@%@+@::@.@:@*#@=@:@@@:::::::::::::::::::.@ ........................................................ @%%%%%%%%%%%%%%@ #@%%@@ .@%%%%%%%%%%%%%%%#%%%%%%%%%%..........%%%%%%%#%=.........................@@=@.@@@.@.@.@............................................@ . =..++ .....................................................E
271 \\ W......................... @::::::::::::::-=:=:=:--=:==:=:=:=::*@::=:=::::::::::::::::@# ................................................................. @%%%%%%%%%%%@@- .... .@@%%@* @%%%%@@@***%%%#......................%%%%%%%%%..................................................................................% ... .....................................................E
272 \\ W......................... @.:::::::::::::::::::::::::::::::::::::::::::::::::::::::-% ................................................................... @%%%%%%%%%%%@ ....... @%@ @%%#@ -...............................#%%%%#.........................................................................% #*@@....+ ..... ..@ .....................................................E
273 \\ W......................... @::::::::::::::::::::::::::::::::::::::::::::::::::::::@ ....................................................................... @%%%%%%%%%@: @%%%%@ :%%% .@.............................................................................................................@ @....@ ... ...@ .....................................................E
274 \\ W.......................... @:::::::::::::::::::::::::::::::::::::::::::::::::::::- .......................................................................... ==-@@@@@ .@@+--*#####@# @%@ @@@ @................................................................................................................= @... +...@ .....................................................E
275 \\ W.......................... @::::::::::::::::::::::::::::::::::::::::::::::::::::.@ ........................................................................... %@@@@@@=-============@ . @+.=.....................................................................................................@ #..@ @@%....@ .....................................................E
276 \\ W.......................... =@::::::::::::::::::::::::::::::::::::::::::::::::::@ ........................................................................... @=====================@ .. ...... @......................................................................................................@ +- @.....@ .....................................................E
277 \\ W........................... *::::::::::::::::::::::::::::::::::::::::::::::@= ............................................................................ @-======================-@+.. ... @.......................................................................................................@ .@...%*+ .......................................................E
278 \\ W............................ *:::::::::::::::::::::::::::::::::::::::::::@ ............................................................................. :*-============================-@:. +====-@@@@@@@@* %.........................................................................................................@ .. @..-@ @@ .........................................................E
279 \\ W............................ @:::@@::::::::::::::::::::::::::::-*=:::::=. ............................................................................... @==================================--===============-@#..........................................................................................................- .. *@ @.@ .........................................................E
280 \\ W............................. @:@ @:::::::::::::::::::.@...... #@::: ............................................................................. ##=====================================================@ *................- #.....................................................................................= ... :.. .........................................................E
281 \\ W.............................. @:@ @::::::::::::::::@ :-:: ............................................................................ @@-======================================================% -...............@ @..................................................................................+. ... ............................................................E
282 \\ W.............................. @::@ %::::::::::::::+ ........... @.: .......................................................................... @=========================================================-@ %.................@# @.:@@:...........................................................................@ ...... ..............................................................E
283 \\ W.............................. @:.- *-:::::::::::.@ ............ .@ ......................................................................... @============================================================-= *+.................@ . ==@@......................................................................:. .........................................................................E
284 \\ W............................... =@:+% @::::::::::.@ ........... ........................................................................ @-============================================================-@. @................:%%:..:@ :+-...........................................................% .........................................................................E
285 \\ W................................ =.@ -@::::::::.% ..... -@::::*@@ .................................................................... #-===============================================================:@ @:........................+ .. %........................................................@% ...........................................................................E
286 \\ W................................. =::::::::.@ ... #@ @: -@:::@@: ............................................................. @=================================================================% @........................@ ...... @ .....................-@@-@.........................** ............................................................................E
287 \\ W....................................... @:::::::::.@ #::% *:::=: ........................................................... *-=================================================================- @.......................@ ........ ...................@ @..................@ -@@ ....... ....................................................................E
288 \\ W....................................... +@.:::::::::%@@@@@@:::@ ..... @::::@ .......................................................... @-=================================================================@. @....................@ ............ :@...............@ . :-...............- ........ ..................................................................E
289 \\ W........................................ -@::::::::::::::::@ ....... .-+@@-: ........................................................... :==================================================================-@ @.................@ ............. @..............@ .... *................+@ ......... @..@ ..................................................................E
290 \\ W.......................................... @@**+:.::::::::@ ......... ........................................................... @====================================================================-+ @.............@+ ............... :*..........*@ ....... +.................@ ........ +:..- .................................................................E
291 \\ W............................................. *%::::::::::@ ............................................................................. +-=====================================================================*@ #........-#@ .................. #........** ........ @..............- ....... @:..@# ................................................................E
292 \\ W.................................................... -@::::::::% ......... .............................................................. +-========================================================================% @...:@@ ...................... @.......@ ............. =.............+ ....... @@..# ...............................................................E
293 \\ W........................................................ @+::::@ ...... :+: ....................................................... @-========================================================================-@ =%- ....................... @......* ............... ..............@ ......... *@@ ...............................................................E
294 \\ W.......................................................... @:::@ ... @@%####@. ................................................... %+===================================@@=-@@=@@@-@@-@@@-@@@=================. .#@+-=@ ........................ @.....: ................ ..= @.......-= ........... ................................................................E
295 \\ W............................................................. -::+@ ###################@ ................................................... #-================================-@%%-@--@=@+@@=@-@-@+@-=========================@ .......................... @...@- ................ ..@ @...@@ ..................................................................................E
296 \\ W............................................................. -@@:+@@@#######################@ ................................................... *-================================@=@-@=-@=@+@@=@-=-@:@=========================@ ........................... @.% ................ ...@ @@: ........ ........................................................................E
297 \\ W............................................................... @%########################@ ............................................... --==============================*@*@-@--@=@+@@-@-@-@+@========================-* ............................. @+ ............. @...@ ......... : ......................................................................E
298 \\ W................................................................... =###########################@@* .............................................. @-================---========================================================@ ............................... *.- ........... %%...@ ......... #.@ ....................................................................E
299 \\ W....................................................................... .##############################+@ ............................................. @%=---=-*+--%@ @-====================================================-@ .................................. ........... @.@ @...@ ....... @#....-: ....................................................................E
300 \\ W...................................................................... @################################=@ ............................................... @-==============================================-@ .................................... .............. @..@ @..@ ... =@.....@ .. ..............................................................E
301 \\ W..................................................................... @##################################@ ................................................................... +============================================--* ......................................................... *...@ @.@ @........@ .............................................................E
302 \\ W.................................................................... @####################################@ .................................................................. *===========================================%# ............................................................ @..#@@ @............@ .++#@.@ .... ....................................................E
303 \\ W................................................................... @######################################@+ ............................................................. @==========================================-@ ............................................................... +....@ @..........@# *.....% .. ............................................E
304 \\ W................................................................... @#############################################%@+ ......................................................... @-========================================-@ .................................................................. @-...@- @.........+: @...*@ .. @---+: .......................................E
305 \\ W................................................................... @##################################################@@ ...................................................... =-=====================================-@ .................................................................... @....% @........@ @....# .... #+--+##---=@% .....................................E
306 \\ W................................................................... %##############%@@@#@@@#@%@%@@@#@%@@#################@. ..................................................... @-===================================-@ ........................................................................ %@..@ @@@@#@ .....+ ..... @+=-----------+@ ..................................E
307 \\ W................................................................... @###############@@###@#@#@%@%#@%#@@@@####################@= .................................................... @-==================================@ .......................................................................... @..@ .:@@@@ ...... @------------#@ .................................E
308 \\ W................................................................... +%################@@#@#@#@%@%#@%#@@@@#####################* ..................................................... :-=================================@ ............................................................................. *...:@@@@# ........... #-----------@ ................................E
309 \\ W.................................................................... @#############%@%@#@#@#@%@##@%#@%@@#####################@ ...................................................... @=================================@ .............................................................................. @........@# ...................... @------------@ ...............................E
310 \\ W..................................................................... #######################################################. ....................................................... @=================================@ .............................................................................. @@%.++@ ............... .. :+:@---@ @--*% ..............................E
311 \\ W..................................................................... @############@@#%@%%@%@@@#@@@#@#%@@%#@@##############% ........................................................ .*=================================== .................................................................................. .............. @%%@@ .............................E
312 \\ W....................................................................... @###########@@#%@@@@%@@##@#@#@#@%@@#@@@#############* ........................................................ %=================================-# .... ................................................................................................. %=@@@@= . :@ .............................E
313 \\ W........................................................................ @#########%@@@%@@@@%@@@%@@@#@#@%###@%@###########@ ........................................................ @-=================================% ... :*@ ........................................................................................ @------+ . -=-@ .... ...............................E
314 \\ W......................................................................... @########@@@@%@@@@%@@#%@#@#@#@%@@%@@@########### ......................................................... @===================================% @-=+ ....................................................................................... #@@@@%@--------: @--+ .....................................E
315 \\ W.......................................................................... @############################%#################+ ......................................................... ===================================-@ =@@===+ .................................................................................... %=--------------= .=---=+ ....................................E
316 \\ W........................................................................... @@#########################################** ......................................................... ==================================-@ @-======@ ................................................................................... %+------------------*@= @-----# ....................................E
317 \\ W.............................................................................. @#######################################@ ......................................................... +===============================-@ =======% ................................................................................. .@-----------------------------# ....................................E
318 \\ W................................................................................. =#######################################@ ......................................................... -+============================-@ . @=====+ ................................................................................ :@--------------------------------%* ..................................E
319 \\ W................................................................................. @#####################################@ ........................................................... --==========================@ .. @====-@ .............................................................................. @--------------------------------------@ .................................E
320 \\ W.................................................................................. @#####################################@ ............................................................. %==========================@ ... @-=====@ ............................................................................. @-----------------------------------------% ................................E
321 \\ W.................................................................................. @*#################################%@ .............................................................. %=========================@ ... +-====* ............................................................................. @-----+@@-@*@@-@@@*@@@*@@#-@@=-@--@-*@@-----=@ ...............................E
322 \\ W.................................................................................. :*############################+@* ................................................................ %========================-@ ... @-==-@ .............................................................................. *-----@+@-@*@@+@---#@-*@*@-@*#-@--@-@+@-------* ..............................E
323 \\ W.................................................................................. :*###########################@ ..................................................................... @-=======================* ..... @@-@ .............................................................................. *-----@-@-@*@@--@@-#@-*@%@-@=@-@--@-@-@-------@ ..............................E
324 \\ W.................................................................................. :*########################### ........................................................................ =+=====================@ ....... ............................................................................... @-----@#@+@#@@+@-@-#@-*@+@*@%@-@--@-@#@+------@ ..............................E
325 \\ W.................................................................................. :############################@ ........................................................................ #===================*. ................................................................................................ @---------------------------------------------= ...............................E
326 \\ W.................................................................................. %##########################@ ......................................................................... +================-@ ................................................................................................ =--------------------------------------------# ...............................E
327 \\ W.................................................................................. @#########################@ ........................................................................... @================@ .................................................................................................. @-------------------------------------------@ ................................E
328 \\ W................................................................................... @#######################%* ............................................................................. @-===========-@: .................................................................................................... *----------------------------------------+@ .................................E
329 \\ W................................................................................... @#######################* ............................................................................... *:=========-@* ...................................................................................................... *----% @--------------------@ .................. ..........E
330 \\ W................................................................................... @#####################%= ................................................................................ .@-=-#%%%%@ ........................................................................................................ :*... @------------------@ .................. @@ ..........E
331 \\ W................................................................................... @####################@ ................................................................................. ........................................................................................................... ........... @--------------@ .................... @--@ .........E
332 \\ W................................................................................... %#################### ..................................................................................... ...................................................................................................................................... @-----------=. ..................... @---@: .......E
333 \\ W................................................................................... @##################% ................................................................................................................................................................................................................................... .%=---------@ .................... @#-----@ .......E
334 \\ W.................................................................................... @##############%@- .................................................................................................................................................................................................................................... @@@ .................. ==----=@ .......E
335 \\ W.................................................................................... @#############@ ......................................................................................................................................................................................................................................... ................... @+----@ .........E
336 \\ W..................................................................................... @############ .................................................................................................................................................................................................................................................................... %@----*@: .............E
337 \\ W...................................................................................... %##########= ................................................................................................................................................................................................................................................................. @-----@ ...............E
338 \\ W...................................................................................... @#########@ ................................................................................................................................................................................................................................................................. =@-----#@# ..................E
339 \\ W....................................................................................... %#######@ ................................................................................................................................................................................................................................................................. %--+@#% ....................E
340 \\ W....................................................................................... @#######@@. ................................................................................................................................................................................................................................................................. ........................E
341 \\ W........................................................................................ @########@ .................................................................................................................................................................................................................................................................. .............................E
342 \\ W......................................................................................... @#####%. ....................................................................................................................................................................................................................................................................................................E
343 \\ W.......................................................................................... @#####+ ....................................................................................................................................................................................................................................................................................................E
344 \\ W........................................................................................... @#####@ .................................................................................................................................................................................................................................................................................................E
345 \\ W............................................................................................ +@@@##%@# ...............................................................................................................................................................................................................................................................................................E
346 \\ W............................................................................................. +@@@@@ ...............................................................................................................................................................................................................................................................................................E
347 \\ W................................................................................................. ................................................................................................................................................................................................................................................................................................E
348 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
349 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
350 \\ W...........................................................................................................................................................................................................................................................................................................................................................................................................E
351 \\ +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
352 \\
353;
354const lg_map_width = mapWidth: {
355 @setEvalBranchQuota(100_000);
356 break :mapWidth mem.indexOfScalar(u8, lg_world_map, '\n').?;
357};
358const lg_map_height = mapHeight: {
359 @setEvalBranchQuota(100_000);
360 break :mapHeight mem.count(u8, lg_world_map, "\n");
361};