From ee4119b6f98449b205c0596ba34c772f892a71ae Mon Sep 17 00:00:00 2001 From: Kenny Van de Maele Date: Thu, 15 Oct 2026 14:19:47 +0200 Subject: [PATCH] feat: the Scene view maps a mission's ships, markers, ranges and routes The Scene view was planned in the design and greyed out. It now shows the mission's map, drawn with ImPlot through a C shim: each ship and marker where it starts, in its flight group's colour, from above, the side or the front. Dragging one rewrites its position in the source as one step of Undo. The game's missions spread over areas millions of units apart, so a mission opens fitted to its ships and markers, and things that would overlap on the screen gather into one numbered mark that opens with a click. Names go where they have room and keep off the routes, and the wheel zooms around the pointer over markers too, which ImPlot's own zoom didn't. Ranges ring each ShipReached trigger's marker and each flyback marker the script sets. Routes link the places the script's SetAI orders and SetPatrolRoute send each ship and group, read from the syntax tree with OpenReliant's command catalogue and order table, so the map shows where a mission's ships come in, go and leave. Go to code and the other go-to actions switch to the Script view, since they moved a cursor the map hides, and the commands that act on that cursor are greyed out on the map. --- CONTRIBUTING.md | 9 +- README.md | 17 +- build.zig | 13 +- build.zig.zon | 4 + design/images/mission-scene.png | Bin 184940 -> 186136 bytes design/screens/mission-scene.html | 4 + docs/architecture.md | 37 +- docs/editing.md | 56 ++ src/app.zig | 58 +- src/commands.zig | 1 - src/forms.zig | 36 +- src/game.zig | 101 ++++ src/game/starlancer.zig | 533 +++++++++++++++++++ src/main.zig | 8 +- src/mission/document.zig | 24 + src/panels.zig | 13 +- src/platform/c.h | 3 +- src/screens/settings.zig | 34 +- src/shell.zig | 5 +- src/ui.zig | 3 +- src/ui/fonts.zig | 15 +- src/ui/gui.zig | 22 + src/ui/icons.zig | 8 + src/ui/plot.zig | 84 +++ src/ui/plot/plot_shim.cpp | 77 +++ src/ui/plot/plot_shim.h | 48 ++ src/ui/theme.zig | 26 + src/ui/widgets.zig | 116 +++- src/views/scene.zig | 857 ++++++++++++++++++++++++++++++ src/views/scene/drawing.zig | 475 +++++++++++++++++ src/views/script.zig | 30 +- 31 files changed, 2578 insertions(+), 139 deletions(-) create mode 100644 src/ui/plot.zig create mode 100644 src/ui/plot/plot_shim.cpp create mode 100644 src/ui/plot/plot_shim.h create mode 100644 src/views/scene.zig create mode 100644 src/views/scene/drawing.zig diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5ab3a43..48f62c9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,10 +68,11 @@ Write idiomatic Zig 0.17, as OpenReliant's guide describes: name every number, g `enum` and switch over it exhaustively, use tagged unions for variants and optionals for "none", check invariants with `comptime`, and share code rather than copy it. -C and C++ come in through two shims and one header: the text editor's -([`src/ui/text_editor`](src/ui/text_editor)), Dear ImGui's internal calls -([`src/ui/imgui_extras`](src/ui/imgui_extras)), and [`src/platform/c.h`](src/platform/c.h), which -the build translates into the `c` module with SDL3 and Dear Bindings' C API for Dear ImGui. +C and C++ come in through three shims and one header: the text editor's +([`src/ui/text_editor`](src/ui/text_editor)), ImPlot's for the map ([`src/ui/plot`](src/ui/plot)), +Dear ImGui's internal calls ([`src/ui/imgui_extras`](src/ui/imgui_extras)), and +[`src/platform/c.h`](src/platform/c.h), which the build translates into the `c` module with SDL3 +and Dear Bindings' C API for Dear ImGui. Add `test` blocks next to the code in the same change, with inputs built by hand so that they run without the game's files. `--check-missions` opens each of a game's own missions as source and diff --git a/README.md b/README.md index 19a217f..15b64cd 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,15 @@ A mission editor, script debugger and mod editor for StarLancer's engine. It links to the running game, so that a change to a mission or a mod shows in the game as it's made. -**Status:** Mission mode's Script view works. It opens a mod's missions, a mission file or one of -the game's own missions as source, colours it with the game's commands, checks it as it's typed, -offers the game's commands and conditions as you type, explains them on hover and in the Reference -panel, builds the mission, and plays it in OpenReliant, from its start or from a part. The inspector -edits the records as forms, and the outline adds new ones ([Editing records](docs/editing.md)). -Linked to the game, it holds the mission's script at breakpoints, steps through it, and shows its -threads and values ([Debugging a mission](docs/debugging.md)). The rest of the [design](design/README.md) is in -place and greyed out, each part with the issue that plans it. +**Status:** Mission mode's Script and Scene views work. The Script view opens a mod's missions, a +mission file or one of the game's own missions as source, colours it with the game's commands, +checks it as it's typed, offers the game's commands and conditions as you type, explains them on +hover and in the Reference panel, builds the mission, and plays it in OpenReliant, from its start or +from a part. The inspector edits the records as forms, the outline adds new ones, and the Scene +view's map shows the ships and markers and moves them ([Editing records](docs/editing.md)). Linked +to the game, it holds the mission's script at breakpoints, steps through it, and shows its threads +and values ([Debugging a mission](docs/debugging.md)). The rest of the [design](design/README.md) is +in place and greyed out, each part with the issue that plans it. The plan is OpenReliant's [#1126](https://github.com/OpenReliant/openreliant/issues/1126). ![The Script view of a mission, held at a breakpoint](design/images/mission-script.png) diff --git a/build.zig b/build.zig index 4946127..129279a 100644 --- a/build.zig +++ b/build.zig @@ -159,12 +159,14 @@ fn addWindowsResources(b: *std.Build, exe: *std.Build.Step.Compile, target: std. } /// Dear ImGui with its docking branch, Dear Bindings' C API over it, its SDL3 and SDL_GPU backends, -/// and the text editor with its C shim, as one static library. It is built optimized whatever the -/// editor's own mode, so that typing in a long mission stays smooth in a debug build too. +/// and the text editor and ImPlot with their C shims, as one static library. It is built optimized +/// whatever the editor's own mode, so that typing in a long mission stays smooth in a debug build +/// too. fn interfaceLibrary(b: *std.Build, target: std.Build.ResolvedTarget, sdl_library: *std.Build.Step.Compile) *std.Build.Step.Compile { const imgui = b.dependency("imgui", .{}); const bindings = b.dependency("dear_bindings", .{}); const text_editor = b.dependency("text_editor", .{}); + const implot = b.dependency("implot", .{}); const library = b.addLibrary(.{ .name = "interface", .linkage = .static, @@ -190,17 +192,20 @@ fn interfaceLibrary(b: *std.Build, target: std.Build.ResolvedTarget, sdl_library library.root_module.addCSourceFile(.{ .file = text_editor.path("TextEditor.cpp"), .flags = flags }); library.root_module.addCSourceFile(.{ .file = b.path("src/ui/text_editor/shim.cpp"), .flags = flags }); library.root_module.addCSourceFile(.{ .file = b.path("src/ui/imgui_extras/extras.cpp"), .flags = flags }); + library.root_module.addCSourceFiles(.{ .root = implot.path("."), .files = &.{ "implot.cpp", "implot_items.cpp" }, .flags = flags }); + library.root_module.addCSourceFile(.{ .file = b.path("src/ui/plot/plot_shim.cpp"), .flags = flags }); // The libraries' licences go with the program. for ([_]struct { std.Build.LazyPath, []const u8 }{ .{ imgui.path("LICENSE.txt"), "LICENSE-imgui.txt" }, .{ bindings.path("LICENSE.txt"), "LICENSE-dear-bindings.txt" }, .{ text_editor.path("LICENSE"), "LICENSE-text-editor.txt" }, + .{ implot.path("LICENSE"), "LICENSE-implot.txt" }, }) |notice| b.getInstallStep().dependOn(&b.addInstallFile(notice[0], notice[1]).step); return library; } /// The folders the interface's headers are in. -fn interfaceIncludes(b: *std.Build) [7]std.Build.LazyPath { +fn interfaceIncludes(b: *std.Build) [9]std.Build.LazyPath { const imgui = b.dependency("imgui", .{}); const bindings = b.dependency("dear_bindings", .{}); return .{ @@ -211,6 +216,8 @@ fn interfaceIncludes(b: *std.Build) [7]std.Build.LazyPath { b.dependency("text_editor", .{}).path("."), b.path("src/ui/text_editor"), b.path("src/ui/imgui_extras"), + b.dependency("implot", .{}).path("."), + b.path("src/ui/plot"), }; } diff --git a/build.zig.zon b/build.zig.zon index 1f42ec2..62bd639 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -44,6 +44,10 @@ .url = "git+https://codeberg.org/ziglang/rc?ref=zig-0.17.x#a8a3b3cebbe6e414fa12d6ad028c56a3a349c75e", .hash = "rc-0.0.0-rMftL71EAAAxhe4swpM5rrfcmC9k_j7ApwJJPRssBiDL", }, + .implot = .{ + .url = "git+https://github.com/epezent/implot.git?ref=v1.0#524f9fcd48d76c13fdf94c5ffbba8787a1ff7e39", + .hash = "N-V-__8AAKSTCwA_ALBxWjOi20O0c9_WB3Y1COzRQxwZLpLy", + }, }, .paths = .{ "build.zig", diff --git a/design/images/mission-scene.png b/design/images/mission-scene.png index 6dbd9a04dc8b8f6ef859197ec9d6ed820260a66b..281bea5c16a63221a3713fdec7ab821e367ff183 100644 GIT binary patch delta 180086 zcmYg%V{{$S`)=bjX_AJG?Z#?wV%t{J*fyrIoyNA)*tTukX>8o{yMNq!)_j>+v(D^2 zc=x0CEFUqs5;2Aekj5T-c#gV&g;7*cQNVy|{rk7|KflxE_4W0P?3wlTaTwRjj@JGg za{12?otxV3j)L6!NXvc&Ly|GTM}6hr^NJz@z8I2dGT!LR?b(egS$ z{(pO1Y}|mdrfPh@TK@Fk3~lGHp#dNp4-X4JiDXr)pKVwF`^OUdL1Lz6C)h<4gT{qL zdq&~#`K1CmGXm9qX=z{a7|;;HK1Ya&q5j{?#2_I55mQ%C*{3dL!lr{1j472?!^%pF zO-+f7qemMd3KuiAu)w3}7yl|TFDeYIQuA@t9ogek+x_<>FmV-ru+@F3g$D643TKjx z!27A_nK{9RR}B5ELEk0YTjW$>zlCZ0Vt|!Z9HvmLLSc*q8!w#q;mFD)B4m*GJ1sLY zIX*+yv?iG@Frn{=v?niC@xSJuFO-*EjBp}m;=xji2d}j6JBUvRxVY_M{+Zj0?mwUo z^D*rc-xpHUjIYRkMJdG#(74PM-q=R?&7)0ir|E%Wf>qK&gsi_t1PmO*z~TC#_}2jOI!?hxS4_&lXk|O^gi6Mg`u2u zKUYN`l}R06(0^b1D>MxRK832NC_C&8kp(bg`uPzDXL#)v15!{bdIu&dh1FCpi-SIz zDs9|mz4UJM8{?UF-O%tb$p|cM!B2pIV&z;B_icjQ8+nqJrG=Ake^ErrSPnTujO2e` zGpR4dcwb<77%1~gSBB`ma{CvQR!UQ&7TXgSNH9YN`}ytUhoVb1MmIjx0GQuN$;g6H zh&ar5$S&yLuVGKX=h;HJ zKLaB}LyymQt5>^&8J*nmd{RWZ47f<;u6lns`f?~hl8kydz;WC%4i zI=Z@Ql{%PMSd^Z)lTgq^LXPzj;S8XxC+;mXqdsD9PN!c$3{sJ(b73{EY=*G$Oi1zE z*~B2avGSBsK7$!qrb^9@eJbErT#dTB_d83?-4VWrp8Is|$A!18o(pon#Ghxg@hjhk7uySKwdqaGt6OOzcbYhEb+Wkpw#mF>s}Rv;V6K_w0Y+f8K~;HIX67#4eH zt*`vtF^y{YpW1v*-y<#6aXD&c7Zwu5x29N`j+SdD zJJxw>YHLFspu_A>InINTFTUS3KWr^8(BmQS9Cm7Be}yhd=Df!(E-$?}KYo4!ded6& z@NSP-m(E*nicqTdLd(i*mt4E-j4|1ZdHM&%^qcKi=qu)05|F+`uDBdMyTTxI`rg(h z)R@gD>5dqS6mS|)hVz=dvc;bq93RspO%gmj+>pG%A>q9o%+H4W^;7p`s#5jrI~v}S zn3UM8v5`bQ{$VqdTV|+_n{jah>^R-|H9>Oy8cV2~OTbf~-2cqw(ZgnJJm2p~CFw0Q zZgF?UqaiHJ%1OQTxV^qLTWPqsx0hd~k5KWm_lDhhK*$b0uxE?-Bm6K5@ewoEwkfDt zbdm7wS1zfGjb27^VZiT`FOlq-G*V)M_A|m2CeW1D9LP*j$O)^j7Tz~BjjUT&=hc^CXK$vJF z&~~lqi+vND53}mc{&yG}x#m{+23WueaU3eOiB8O$x2??cD|e z_j~7QYb*X$Rq|FcGQkb^#_OXM`Q@Y|6B|uF>`&;GOkO1jU)--=m!-cs=r6Rt+)s`T z(dBeq?ex!9t`nRt)VjE$|ENs(^T%?o-1*;o)b+5N&z8~@4iJ&kE3V(-mgyBrr&AZv z{Zr_B(j)sz|FyQSGz>Mrd=|*#<3jfCq_F+@mdEa~FWZ-Qn-H}Cu9%}jt8u-?T~{&= z2Gw9>E~QG3uhaRoMKz;^Oe}J__2V)j)G!30OWl;JX`NoH!RPjp&%e7^t%AFa;TGvj zE-Be|RcYx;BVemPna(GuVwH{k{d?Ka^Iw7P{nyj)xg_wU{NVK@L3Ms2i(BH|>*IjS zs`jAj`5npQcT>L@5vP%rn8|YmI$ZYiN{RNr4u7$9P)(9ROs7bvZ}0dR{l#Xp$zp#0 znfpa|@&jQF>`>5TlofVEnS8AzjU5F{L%Qd0`f za-6d^mld+tQ5LAJ*NEj@yB@CyW!NmVrL?4KWdPjur<$6vo^P+Or;AnUSzn`dLc+su zuCGbo+(GY|?K?BO$NTlhHzsDorza-^eXly%0g^>50PnLm;{~SrqmE)~%HG9Q7^c?o zfe95KD-U%EwJwuz%q|{d4ZBftvEuxa3S~yz$fV+~f(*Nlrq6*f@ke2>Tb)LcmW(00 z2VhNbwXt-Y9uT1eK>-r2l$&U6Wbk1$%b&fElonh&=CR9{?WNS`>j(|Q;MetZE!VF5 zg(yLoMd6L?YNPkN!m+W#Wn4?pZ6i9`>9iqZyWjqJO_7MPk=q&X7LTn|G);~%Yh!f$ zr^)j@l5{t-;|4AGqZ^gm`sC%+w$bK81H65XEQ1P`E7xi!=cZNS(D?8b=5{@XJ(eHu$PIFZI<_})WNPk#zu174S&Z70f0 z`m(O)pAgsTecs^WAjPvfpak@qfrmt^fgA%a>t`!g)|=m-Ix~10$omH6Gg-)J04`Jv z=#UzZ^8pm14Zb$U4o&Tbf85?XO|7lp6(Lz>ST*Pl=8kJ!&X-ndRPlJd{hOMWK+8qb zN3*8m=5s^Hb+xrc^1sVtHpOwVNl#9W<+GSu#UfK<0^2=Z21LYTalBq1I}D>Yh9xDz zYvIlPHMvwoRu;;d_)?{QtJm8B@HTBo`P%6EO;N&EQF-x`v7oN*?p@ipV3c<_J~HuW zIP>ei>fS9vkXut&>PZgNOV|0)QkndRF9JRcrmCu~Eu+@(!a^#yb>irQt)&`0RO4u4 z6(8RQ``GxfZbqxi>8$A||6#AIv(HEH*>)2oAJ-Y;?n+a%wU=u`L{frfhL-e{r? zLO!S8j3wF$JG(KdsgN+)lCuZIc6BzZnJE8e=>(~QZHnaZ%{M#9)^w+<;ycsa5*k|SHCSF zoxgg4+Ce(FKP)w?^n@X@KEUV|2k~#cCGs7wnM{Z04Ti;N4OI*k;PLJ+B=0#m!5dkY zLfO~f2HcQxOMzBUpLJ<8ygq&U`bknmP^A%<%>p*cR*nd?*4KTq%;sl8?&OMtr{3xF z6j4~{Qs$Det;rF)9#Eqb4-}Y9-Lm&9ery9F1EZ3KY3L-9iLr z?|tJmVbs7RL~}aG*MLw_#GIT3?p}R6v*cxrL`+OB@}YPE-d-eal&%}Q-4iaeWR)N6 zSuDz+Gg3ajD14M$FcdTTRhpZNi*b~e5(`m*MqMW?9uXYWo|)O5s4E^9kN%@vOQNvB zWj1qm@L`nC+g6`HFs(;Xq1bjdx%iU+9v0z~K_2B=t1~7-@?58!?x_v$i>OEd_4hI? zR9+U)*jO8on4`!pk?*+32V#is9<#>o`Cg!WNLYWWMMW{t>Gn*_MjjFqLcH#YTx?^4 z%m{JROgR$%5F4>S&KlKZLUj|)Pd#U7Du?HJa)w#9Qh%~oMt^5J)6_jB=)D0rA;5n* zo@(gtv+pfaXN?Mp&}#b?pVX-Dla(2Tj8tB6!TS}6?meHbm~CSAXJ?=5Z1rH!s9_)@ zt1T05#Zev^0cd# zl*D+_WrjS`pR6u9pUfa~@cOs;D?2#UY_@sGNKjUM?ex!)bT(`G-2!1F|6ofR3(sdV z)6Pb#D=aLnz8TYhkZ_01baeXj{dWv#hTRgFS5j7vM`8t&kr+Z9osQ<#R@n@`R`IG1 zk>Q-LGrMsPc=*4%vU7;71E7PK8qFkwO7+I;GV75z{rvp|*0)SdVBz40F*0KTM12=2RS#*j^kD8PC?5Ps0!8$;e1eCN)2) z({)C({pCaym($W%aCyGQdH2Kf8v5cFvh})OTOB%_SkW4)L_tPI1|n@s45UzW^EIE& z#avrUK01Pc3YJMGS1Z9~w^_RkCLjV<2V5e_ANmV(&dZw-L2GN7Ab0qu=i4h?EiGI{ z$ho=;)Vu-idyGj&|Iwwc21Vi30sT%N2;JS2 zJD$t=hg+v$9Wdihr1l?#5FwQw1q%+V4cjDm9OO zhgZ3YMT_O44~!@bSmy&!%$#5zJ@&5xTo}2`8_lvg($W)-rYhw9gJiSw@J>vY15&cFnCVsWKvD;;1});m&6PXtqRRe;GrF z6^Fm~@}ZZyAoxFDsSmfQrpbW`aj3|$6RcrhlR4}FWryAcF+&VsSeZk@?bauP@aOsN z6pphxC^B_4Q_?`wa=IlitEwooV>HdNw(g&TYZtslZ{R0P%%UWOR7D&+(VJ8~t`KuY&-M%*WepBu+g(^oIg} z4TTDi$lYMq!G19SOz)by^0S3ibd|&9@@lydwtm(wS2Iu33`?RH(PJ~4NXf{kNZ5VC zL909|*?q~&BlWmNm4|{eMnK;CcUY01Y}wj9&>-0tKJbtMHFf-@pDIyk(hu|l%{@f7y*hf!U33z=xpjIj0`8E`WnK??t5^%K6tUSrOmpoEt##w#2TVr*gQa0OO%DcA5GWmQ) zgN(CN-CrJo`1eGtgTnd9`g%4&h^2aK=SbZ7cJH_Gaanc7w6smQo*xz(o25~Y^NS76 zHx+nEICwbug$4e|4lg60%`IjrqhXzUbJZf>T7P^kkYXm|^z!lsD~Rw>g|ewb&#wOx zdAfOcdE2{~pOgYgNtj8fwG!B@_QsH=kcKr^qq6}6^vOLO@I=T9#)UdkY zaSRlRgSh-l2Mlud?J87$XRMFMUk3yKP79>|nBD02K$A%B)U5U;8d~BaxlY)3+Y%n@u5TIhgId~ioGI-NsU}$CcI;W21rTq8xy#> z%cj)==`myLZm(P1iitAmY)Bk4yly}LJvKpZXtuu~HF@9QIzgiE*chyLyutR!=NbtZ zzIX2?<)@8~pKTNfA6Bk+0x#UQ6HY>}>$%J9)|7bfBm0Q!_?|+BK9iN_BEwA{`*FJQ zChYWdq&>Y~kdSUPjI0)O$in;a*}aHCxaw7aPMh~XN$)h+Xu|b>OC_vrkocbW6Juj+ zENp&3u7gp?C6^_M%mmki_-ma-mW>x^FNhXkqOj3ot)BU5YCuj}w$<+4$wZ9OoQAb? za+0p@Uv_!31%SO}NCojUaZ}KgxEylfv@roFotJMy;mfK-L{3rAIQY4VtYD1WQlJ!bM@I8p@Xlrt6ZpIIf z>W_YO7D&93ul?u7*j9EIYA>vaXqc;Nna#=3Qanh$DOs5+GO+Vfg~NO$0-rg*pu%u7 zmp$FFgddrRzXR^`C;a+T4c&Gx)V&ITX4bS@9t_LHQU2|J{$k2*JcIo>y6f1=a}Sy2 z3l%JcgUu_X!~FdEG#ezlbFK3ehkEuG-HXVm(%HUWTLd2Om-kGN{n<)nYlU_r*(fd8 z5WujnW>&ky10y+|h1w2TG9pG-_uMQ{OQYwcFG1`5$=T8m4$6~}C-jn%;c-B#9(Xx9 ze)+K@Ct+5?ZoV-x+Pi=BPLS`8%$K#-`bL)t5B zsi`ICeKw+O?BXDGa!p6liV(h7&{hgDLjG^-I_U-P44WN~FCOb1KGmk1B!CKSWI7t@XdjJZ zB>A}c6k}r5#{K<#{Hgjxg?@du_@-baE_<-)-d0D&JDUB}IuGqJO8(oqbm|f0?;rM=Hm<<{GCS6ans{-C8eHq8ddQf;*^p6BHkq;O)X&|lC|hJ#VE zshp^p0HXA0g?5A0S{)5DbG2|Va-LWuIn-KhkQUcMS0Mu1bSg-jg)U1G&(K|AOt$g!E;id_GM0>PC^l?`$_T1V}0zf9MUk{Fcw)^f(o>@q}6t z+MCJ*6;qc9bben>^+S;=`2rbmKmS*-*}GYjwEDfEy!`sz`+|y=tX+inUKEPpQ6a+f z{_GnXKD_$lMmtZ9=jmdjZ--wni!3|dDQuA(ArwxN<_*@A_504#?EN{9%hAy%w1~zc zI7QqpIAC`v)_>My%>8kT!AW=@#qOjpc6`-kz2gOXC0CtMmlL>f^2y55{A=@R9)6}= zl6L5tW_U}O16P?Mv!i1pz-=D0eFl?LCE*V`+D>Q>V#IAj$H(PDi(qfh%+vLg;iR5- z@D~CI&8hi$&u5Vh9DkU&uS6)Wn$p_gugB--p8+M_HF0B1)g}(*!ik!4U2R3h&w3Yo zcAtf2s00wie0_ZzA{_<|f`Wr^rT5a50Q^i|Z#MJmx}b(g!3~ecOTy^E40c!F0%L-h zFV~3pGmbacw@2&ZApG8`q2#ul0JrXPos8Tr7Q25J=QZE|gW&AW7rbW_&-UXE;H7-T z01vTqZfC_Uff(ScS@PWxD`#|db4GJ_vXs+rUki3jf^O~#1WV>uuCD_wV?3Jk%8Efoh0ag2wO)AGX7*~ zV*~Tt6Fh8T)$}>UPc@wcCm^MBSbPO4fP6h=ZS88}8CL9an%r~Rq0e8bkE-j?k$1gQ znDxs>fdPr{gRQ<~QVAnwB70_Egtw3vox2AZj_o&2s69)`OUcCCCl*mseW#@v{%;Ic z46i`mPJ7h#B3YUZLuW9()Y_XQ}yYs8ti~LB zc3$r*Y9Ew`wNPx39!^vh5PdlF8gEu3CI*BTeCO~-gP80GL-@(erFhdSFjX{Cks;Hz zJbXY=Ql3?>TzC1HzIo-Fxum2F!of+&w)y=szA8^_ciy2U_CH!domDK46)B(I+Rv*S z6iDA*0sY2T=%~87Ir?GckO z3SYWC6Z6~+?P)$4(VdgCQf0Hti4q|9iAbr-%|}8j@m5Y6(g~-LUZG($tEhW6$4ys7 zMYYsiAOmD4x|Hc#3qy5h)to4y-g{ILE=LK}Kie`3v8aF5q_w`K0KoP!=*?GTwrwMobX-VwEnRBkkf0 ziI+|YT6}y){9zL$-{#O#fRnNrMNP8;T_wZj8E}@GoVIxTa5Gw)DyE`BK19^+=@k2H zBv~r5y=_pjTIcWc4yJ|JxVZKIwiMc1mN(XULX>s}?#j-&omO;*AhQ@4HhEmF46Uta zi#EHecc}zfIl=7E&d4Y~*Dv>$stHU3Ls?);?WcM#A7h&|wKaTWH`K_;41Gmt1OK%H zPG@MEn4kE3+=$Q#cpc_67^30MFXIQJzfwSHJ>K6}IG)Q|Y1z(BVQD>X5we?j&6>H+C65!{TfmljvzL&O*m7W{l1)Vz_navdb8wg$TfWKJ5`3bgORR&1 zYEPJ9Et+-UM+p4m3oZmtS!QTYjNdSTPgrTHf@*;xU-Q#_O^LW;Oege@&yQifucsK1 zPJ+%f7IO`1F(nX@r-(mZx1G~mcA_~$5U1AZ*)!m)WRIZ!Ej16`3_i4hbW2lGT`v}> z041E1X-N~zIemB_Y_hlY z$C#y-%h60;yMLa_r#LE0(IS~R>R3#l2P@-YlCUSbI0z}9odi1RbtcA(_=HWe(ES#2weGIGiFZ3CuK%6I9UG;q@DY>3w zYQ*NT$0|lKFd(stg5>%}$sZ;K&{|kn(3V=nq~^p*iivsn>Y4>;5Xr!O?j364{=v#h zLZY_f5&UdN=*Ws0Hkq~Ie6ez~5GftI?OwFp^T+jQ;bt^=N1d<5{Txz--_IX1pHK2? zr~6Dxi@Q25ke!XKUO6s4j>4K-RyN~^+Mcze>wOEMr>v0(3R2i+-CHFY2%U1tfLmg( zIiAaz?|SD|r_Vxk5c452-^$-hIH45VQ@A>r@1vC$5cqo$t=G$v`xxHp{c?ZIYOO@%%6EkkYee9nt4|o|F z@}Yc}ztCFM82-rj1=8g%!qsp|Lz8N+?JZPFHJD-Mg<};XIDcujW`Zs1zs_fC(hHrk z!Ik6Mb@I~Ey!LM2nyZhO0}u9RSZUQ466q;$UgkEPORwJA{(&nS?{pwnQ~-ONfAispEC-G6XT zKOmc2o|}uXGLqXrDhV8^`!;^0sWY<9%v$5JR+s$g-~Eb#t&wL!Uq$q0cyVD< zPe&&tyoam5d%KTlR4QCFVRtPYv>!F`z5GjpF!O}4K~nhru0^l$znOZT_~CS3SCXd9 zc0imM{u+?KK7K3n_iXGF30y2TKi=K%a6ivI$4jEu=_pwW!A;d-J*+ZYuVihzs;hIx zTV0Olfb0?WJ5Q}wQdSLa>HRw$-#s2P)_nhPBPA=@U^At0y)vntbbsd*95eNLKus-| z(p;QbPk+U;$4{-_6&)Sze6)fmhw|)uNT-K*EeNZ6VefVT1 zHz3jimg(Eu*I^)VRPkj<;ef4NgN>V?Z$hZmqcW^}gax;54dB6?;D=TYP z+)xc5#YfT}uTe%dLch2g&kWk1^rwVib0Ua5JYwNPCz0ZhyiA+k-;)%6rl~tOz3%I! zZwyu<_Rw(86`CBZogaBGiw57Bq(7u8^%nsZxe2A9~WJM!nz&d=RW+N*KQlH6rZoID6%qv7+r~Aj;EA3 zlaKzJqFPf%yR&J;l>ovE8$pQoC-0NFYEr1+0B9nvHsCh-a}11IdN&eZ^DjqpMt>fw zN9v_5AyF~0i8Nk+o%h1OknzLgZO#wO>2?-cCvl=TU55+jmb@>wfiZTOCH&7HP;YNr zcP;j{OG^mQL5#ASdh1dE%O0B1H?Xergk3a_{@`Pnr^W~dcbN)Z9OJAUe)#0|u9WhaW&{n4v z?UoD??27pdSklX5D$7hco#yf#sZfRrVb`VWEfzD_blVa|WK;rzUmjBH zEk^k@7(WENuYkSxaUXy2am_l|4Yw&TSy{;z`~9_{t63`PC`f|-%lH`gRrFtm_@5cG zc+KV)a@@=AvpHjGpU`%8p}qKq7?ywWl=j^4Yqjl&7@)EPkN!_axaj-dItWAjBq=kH!qC z0%lE_WB73EG_@Gy#eZ^+g^`ehci#^yr7u(n6X}OmnW5Gzr4QsMT>G*X1i(+hT#d~S z^6mb7&1`nc=Kgix-kw>((rTe?eqCFgF@s0ZYtQfGk5MRZlj}?Vv7@@}8cfo2+3etC zTr4pa@;?CYhxtKR{c1K$Y-*g+3Hyl>36Hjymi<*T;-|wZP^+h#xX3^RA>SvCp>;4X zxOo{0+HCXgR3!+<8pms_Yuvqoi7%udVO=i$+pJFEn+whZCnSp^ev8DTBIH(W^mz*d zp?!X8EtXU(pv6o}70oUy%1TI9KwWq)1!pmqDS>iM0denNNx6Doi}9?7!?pBhUr$^ttkgr@^1L!c z`twcQ(^fA+xFPs;NyIgb{xTejaX%uA9Tq ztO!Vl7-#fq2OXs=C@72>>iUTleW#@zl_Pmd$;Q|GPP&hlc}}FzgU+y{l)$RhGQaan zC_od?_({v?1Pk_TwY+4y*^#WhXNMGQg#bRO$3$!<5m3ncwL4cn(vyOsqW^W`;8|H} zDtLxj2|t=J9D>d)2BOEax%-(ySp3ILz!LQ16CCC?8KTqY(-Vup;3OwBW_KW*9v7-TlsfcQ1k8W^+x$0NC80 znPtUgvy#YBSX+}a<<#+gNWgc#ZdJiI_s?gN=Ef9UC*Et)nN~Emp@bETp_TU?zXQ=i zk?1>evyx>{Lp-4%?AZo?`;OHG#|#vLBhUu29#5DlkjjbsC=>T6)Z3rG+0%@qj71o+ zJFoBMCj(Nu;NX%2k~-`z5vv4M+5;)~Ml5ng%FqzKVDG0R+M%`dXJ@Cd;Fxe)3T-<(;$QeG}y4i){bcxVFuGd@RRYTq$&C)stJ~UDqt0b0scFVJ`!@BlIuq- z5ts`qDps-E%gR*>jCBl?>etPM{qIxYui#DjBK3llM^K?l%(}?3?*8FW&_sY5K<|Qk zosj=ufLu=uH@rdujBX}BMS~bwW#2DJV`GF0P*pMb{^{!v`nN%<&?4D5O_P|*0IypA zlRL-GQOM3O7tEW^K}V5YA(NN~XWs2FRIp`SEF98brRipI#?q}6RSAw`{`C7d@CFLy zDSb3UAdo(Ox@2LQK?_aC$6eb`$LDLL{yt&m5A|Q8E;&*#cM_#wZ}4OBze3S85Qza| z%IWwRS?S4mxmue#01r(8tm!#s$uLB!n9}f|21PHKVu=J*5o`?3|IJg!j3E7)n3`dh zl#ZIjGR~O}D~0|el{bAnV!>@c-Q7Q;_rG%oXQBTP;%4OJ=YsR>LjK7Dr3m1u56a5R zOHzBB!G1=-hkpSK`u;~N@FPb0pY*hfhaDznd^Zz5RZdy)F*qCXzdZ%Se{jG(0g%4` z?*P0~N;gfsE)zlggfRmUEJv)0${`+Fk=^sN#*D44U&2_F9L?nO&wQDTRnO1T&u$Z%=pYz*v_*&|_5;ARIN2&H zmsZ00n5HS4{eOleDyXQq_?;WN81F{F^`gH`1v<6~we3C&7n*t;s*Q{WlGFhXL1 zUmlZ@zzD5Tp^rEYE8mpLPj-;Wo1VT9gCXb9R>|&GzkG$O2%Ev_R6qJo^C7{3NTy9r zw=h(lsW_esHH9+TrcasZzgNSm@u`{h;xgJ5fuZUZx=hmaRHL-B;@*OhoDF*@G9 zI~}xODfx~s9zHE5G%~`37>)K8f^ssOpDen(&J)3sRw=%9eL{$tpcqZ^X{nAt;w)+2 za?1%FJ?4{PjzX}CM``AIB;=ELP3V7Bf&{3kiNe3d00wRY+$ah{h7hVH{&mlSTHqy) z{pVldgdgNwTwFNSS1KGC^o;|)Fu4C+$G`4v`t{^094%qf*>0u!SCY$1v_OVe_8m~< zDUw4nK!6a_=&z)oE5P^odbNz(TS zN%VoclX=6}J{ki9iW*vdwvY4Gikuuiw;_10-lR!Q5@UovQtTBb_+K&N2K7ZXY1k{I zD)_p7*08a&A+BL&eWe8)adm)NMFWJe~A3)9U5Zd;E)6N z>1t|mmy?T1N@E3=R#M-d@~OAAdt`!Q zm6bHO=nyo8D$&_{VOR-(o8R;4V8z<54rgh#rGPh3Y8(yT=8P8u=c|ea0yx1Z!_HDg z^5*Wdd%yG-K9}wHX;wT9ZO?6}pRb9@F9(_l8H2wXC#ksAu?3yjI!`h28NIS{icC{O z5p-g=|5@C{)dNp(>x?cY@w#$RCt`D-P?|)=^JkBJ-}T%V@d%xb!XS~Q; zYA5@fHZq(O@p)8RyhY_I|8`Z7qe%HE%q!!!e}>dE>23&FLO=+TYrC0!Rpe4sP}s6t!odAAdB~{U;P4hyFO9_r*3EborEZUB zN7s927Y7@i%hXCsOB?^K#jYc+jDUN18m-pF5}04!SEUOST+cUdUY8wn`!JHfxlhf` zpYKf_-yX9n2S9(p#pdWyux`F2No75 zGL%&G^jwrIbktM9;I*0dBM6lpS}=y6GFVDMdh&K)deF7b$ywsZ+~wpMm)+r+DA?>j z$A3>$*veKg&!yX5Mryt*j!3|GwA2}0D|8-BQn!I_@#L1n24=lqi+jV>uo8RT3{5qx zI3!4-(8Yz{xVYXMlj!Jg*UaYdwKx=qgs4@pGJ3L&3mm{7gr=GH0}fY=t+=Ro!7 zjF!LpYsnd{?&r(AaKA`N!)0^KUm6e_ZO^P{6CTTqjO|ji@DbuO$*4z4J&xh=eLgR{ zw$)6uzMr9Y0Gt|Eab;~8zEftmH#b!4q_InckLk^bt99ni2V?H;xxyJu22gksT0d}^R))yq@fTd;K#QjKlz~ki=~3WLD#CC-CrRy zh6i)ivT1B>-VejM`*`AC&L1|rk4qMh>wBUsUJg6V39K3Z%>jd*18p7I z?b8jFOre`KjN7n?hzR}?a5R6q7zmTe=e=@c%D7Oez1e7MtIN9%%Khz|Be?0~-C(^L zt2^-Bm-+aMEd6*S-h%hj4z!1qnM83qsxfOCkepCw@Kz|F#fJ%gJCBx1b`xmg6}G5} zgoK3h!z#*K%@Epl`}Bp>#ZAwWrwK0z9W0_|1|uImr;f)4##f9Ejl=_BJz9B8jg60w z@zhz%jDM<(uioH+i;@z9f>}Yc2^eX#dEPorhOvL4v^?`$&O4l-YwoJ{8PIX}TV?|+ zxqYVBYCRtSw`bB1y|4CL-f0-m72|u zp$_CsnQ*AotugGvEl8blSj&T)b-Ddhun9bGx?<;=e$9QYc3%{tbz{SdCzh&EcfL&c zyz=b9`i%S;@yiLXgV_TKlx;ewcXSWnu-v?V?=QQC$Hz2{Bq;Wo(i|&y_{w=bwGwfF zPUR35<9f{U*yVaOr@CNzwxlSVw#4gsPYNR4x$13&fbhjh(Ye7j;Xpd4l*i?_IWx1i zwhnRr=mvLT5)rO-!sY%R*gn2$kNP9~ek&e@-C#I)(d`dsW@a(;ET01M&C3Stwzg1_ zkRo>nk>|_6*2S#h?yn-5jHmtZ8{owS+)bz@smRPr26pOo#iKJ4GUr!a|A907lNmg^ z?Wv#HKpm}3NVp&wYK%-i=P!^T_vbdlV3(Np=9_Pl1_h+bv$=9Fa#3&(Hk80XznFYx z^U>8?8U(l#2b1-HL0w7h2{?F_Bplxo`|8hZf1^X*BoK?L=>iIgLbE1iTa#EVMNRJ8+EuY!GFgIsrrtJEW ziNyOHMM=xVhAW$(Y!=U{ogkZsb$8}JmXMmdb9|p6mp5N;!|B!s4Y)2=f%J}xhyH}4 z5b--7FBq?{%!hwt)NS>VZM4xUOjNX!NMxEx8qC)w|cgF+@%ixjKXI3x=Y2h zUU8zPdviJGRtqo?v_swhXH)VJB(75`0k9k_B6Db`*$)^EawE z9E>g3noho{C4iMAAPSf3dSw6mrmjv1!Y4108j8KEBB|e#(2Bz}>pXfwxrV<|IqH)> zK0lvEzdhUx%csD6_+Rq?2~hM z3gbtC=-Y@dap>s6Z%|#{Z+$pRUG`5mmfZf;_d`I{KYmzyi{s35r1P{ek=#kfO)Krc z7?53m)D_id=TM`^AwJW{r%KV%rcL6r7MrAJrh2?B0mpbn6Ml!?o{M=xy(b(N)M&=~ zd`<}I#FZHDK)GpZ1D}7!a*4E(4D4Q3TbFnW(2TSc`64bAcSFCCMC$p_dXPUk*+y1S@ zO(J4q1w{qD&AP1~in!Ue!h=&&OjzOUE@RXHrtv;0i;ZScrg6q|4PSjlIoQ{x7(u+z zss~5vV@mPJ;aqG_=IYfWQxn12^Q6GAQmvoA|1G1xFs5_W*ic}MQslQ77_J(<$K6S* z+n%!igogGXWw(4Ep&ZvjA>`Z0v9u*auT`_=DJd`rTz=0Gog1Cb*|mLIeST|ber^l~*%@Q7%Ws{%Y-U&(Gl^omDhsBJB{PKC%5>0xFFY1nNQIEqhZ@Hu@< zs6K);<}G8WJ|(C&x!UEyeZlFCxjjOAy6CWS({4Sm8$4aGlqh1w_e9cab3lZKVh%6v z!cN2fc-YL$&L*DH_+h=m;nZJrC?s$v4=p4sTPd zl&K+s8g16sN{yvix}Kdad7P|JqS!6foR8PIr~~8T z;%e-7O%%ATtjeqOniD?y5JXa!!BM{6(Y3ib6_=_!!-rZ^dEE{#h{|L)2sg@`+vE74 zAlN;|X-gGz+cWwzk=FZ9dN@b$FNSLnBTs9v&Wvo9QB~pFhI~ z-kdq9H(8#Cr_4nV^3NAWGbri{cFxzBsC5Oj^D;$Ulxy=8do>Bgyhh+Up94trXCo;b zU^=p+wYk3DX05o8;w2Hs11Y4c3q4XtaCIbID{f2!KbdeDLAS-hcDvjdBYr`VxLpIUz{soIw9iA1FUjwrt8DOlxq*ytT#VLQ^8sj;Xvn7Ei~ezn*b&ob7w zYegz|Z|$wC!oWad1aPAg+P1_dlfqPD^P4@NzBoQmOeVs!p35+pTcx&+k99eKvr7!G zlK5E4&cngbZeyqh;b>~Og(LD+L50rC$wUoIS6}BUN*~&LH+qfr>T#~&?5?PNHfuWf&|c1ZE90ZZfHky-2Os?K9ugSRI-bvg zT;f=PCb2e;K<9UXfdy)j=`gIpW2szl6U{&WBAXA?>@iIuCKpMoMm{~c*IO?w##vu<}QJm(tSXXG=wwk{r~~VOBiM?lgZN zflKA2uUSpa9)BlHY@6j)Hubabd3C_lwxbhD5F$c<5!~(T?Q`?cBHPiF(iAT*AJ!%o zm0Yr=;?P%VX^VkLBhl`e>FGC$ImTtlTR?BP_eUbkkL>14^W_+KQE!vkEu`w8Q&_7? zzST!qe%D$G_@q|;gLyxro%8x=EszFx9cRyQkG(AOp8MzUop4~pa4H|sVjvyeMf~u? zbx*~gprDN2dh^62294@|0n(0@5oku37PJlX{iB0$Vzv-uX1z{l)If3+8`Z8_A!xvk zn!RO@f!^GE{OMrIB-WgY6tABc{)U*}{Y`pvXaZx`*s#n=Uu4G5zl+u?1*21a@*@_> z(p_CUM4$B=3IYoh5`Q}$Y^r=pXl`gKE-V%dO+bEgC>eMIp8cKUD6xI&V#L$#S@LC5 zJ{u347WL{`Sn$|y2jQ_8W2m4W5HSH~n|n-WwiQCxUOHWmXvFGs6=-U~G$%ON9&iKp zP#(nh-x$x-C;P0f3Zq$!WkQ34{ZR zaqC8oZFzd$9(Nt}ZSP)fP%0MNvP@xN>ZjCVFCF@pNrpxsoL8OQQ=z}R@5=&krqIeJ z8da+Jt7}gd?|W|}Ikfqmh{tb7@1;fkw(VR@Zi$_p@0;czb7Bm~p=WWMrw7j$C%!Ch zHzv7x^`|So=%1+QBFk6aXm52*;T9(+`x6b_FASx9+vVhQ*|?pd>|bdPaN;{)+|t}7 z3b=W_*_4e+p;n|wqAg;qSp5zxH^I3MmL)H|$D!xuoPG>-NO|F-w$@?Mn=<#PITWeF z_Qc&U-Go8CKg9?VU&3XCD>LaHF2Y@H|G+7^%=EasVbDL3FlV#z<)P69*=pitC3X)o zrY#jBzdz3bS(MAHKRu+a>0kkp3w|D_ZO)JFY$c=(sZQaAHHF)|*`5NrO%K<9AImOr zd?}Q3A}CFjI!jBPruI6yhL1T6|JHIbG;uYfWZqoAUsq@?oR8p7R+iW)bck(n)fPvC3k z;4ntcw+**AzytZKQELnE6B^Byx`0QGArj-UbdTnr)(*D&?+B*bO~#Ud?fvsM57(4r z)km8(>xSC`xeSde`!ZJdnta)H8wpbymkV0jqD)BQGff`?!sfT|kce`%it=R5&n4Ad zfF~N?Ql^~(g;iLEE_H*-YnJ%w~?PIUM zUF`01yT?w-rEbbxT42Zexb|a&TpB0lHu8MK_tiVv%XZFYNAop0TCO}%9y^58&rZj` zjv#1%mykI?2m|n{_)%Kby230>!XLiTq#kWn>eR9dS zH_v;-E8JEq4W(+4qoA>!N(zk*rnpAnv_gU6!ts%+ofa-C!&t%)iL_&lhmuzEr_E!8 zzLCjuNaJ_w-Sv$v(DdWe*4KH`7GI~+9I>*srGI0IO91@&{G}YW;Cy}cI;ipoIQ!Jr zhBP$Px3#@^DsX)Np1`DArN8sVG$ouwfR;_gy*QRi*1Me+lSjq>t!(v1S75aM&5&9} z(3;+SWftgZg@#3jz3oFIfgIB~Am#XDkbF{Q2ql6rI~{H#VD$>=ZP{Y$w0n{_V@nJE z_|fhO{SlyW;3)wIiJ9iPnUcATcK3xgt0ku+4pVb8pN1CunZr({0Or#*paD4jGw`iX zi20+_$INm=?u}0W(46e-;-th{t2tO+Tn0@<4wwkfzYpOA9OcO=b7u+2J?vnFJyF0Cqx37<<9S7e`PF7oCzQz<3;I`!Tg#mb{8yjQ@_qOBf-UJ+$AEl5@2_J8Q ze?e%VbHpMO`K_oF{riDFq~<#pFJh_&JILt@2uiqld4}6qLi{39Ri7EebN6@Ywo^$} z?c3NEdCG1k8Fah*%U67rl^QqdCtkY?Y_fY>rthT0qR!`=jpf?S-&>r6X;k8VsR%=P z76IE{$r*{H6=anHUC)oy1X^ywSl^^jF))aaPcD*_>~@vN;guBi4!2cMJ{*cVIX8HM zSdI05Kg!E2wAZUq4^h9k#m*qm=JWhHyGBr+Hk(8x`U(s_(s+EeT<(zES|IdC^>7t? z2ZQ^Q9yS!F%(bn1-?L8Qoi=%HdqkDqDR6-0yWFay-5AY*+CpZ;kGIkrY438+zC1=U z$}Am~ms>7{J=%q}N1WD_skV~4)PPa;aMM!j#Gx4fG|LCY1o%!@>g3Fy)?VWoplt1y(G_7DJv<$aD`p@bwxu`#~6M$p5>9-b{lUy_k|dShrQs8FE%>d zwxxOpA`=wll+9Eb^kI+(eC-KJom654HSTm~PeSDurKw3oWZR<~Z3twHN){ioKi;Oj zG@BVPUvIh8SYq&ZG2Tk69-p%k5OAa@*JxJ6U!9rxg&z4hPEG+4)zCn&*0Zf_F}}Ze zgD(!Uc@$P`pHD>M$j1j>_g}(kS#VF+T0f7K7uCe`wm{Of45{UvO~(g&re@e!kEX50 zTj#u9e8qwLyV>G&lv=g>nD^LTYUS+6$N$}{)dbWU1LZE1iDl6#*18u3RLJo7t~H*f{x-jiEIg%j+I7DXhK z>i^v%c?T8f-Bup{+xg?<1hiHjS=rGXnN(ylj#JY$Av(!z&1z~)>U_3JAn#Ok2q{g+ z?V*1xY3w{}<F%ccML%)2PgYKj!~VE;#adgr&hMWClcJf{GRd63lsSSnb5UYI z9X(by2gEH|uhcaL=Hxu#aD<14x3)T@2o4PNkd!EU*-PJ(1quNPcRv1?*N%?hF#5W_ z(WSrT`E++MgiAdxl$zEq#RiXQ8aJBEHZ@or5tEJSJ3xv%&u@1u0!p-p(?wHdT64A2 ztZKORol3BOKfJg~mItJ#r?c8IG1<`YBH@mcsWS8%3SB3DF{;kbhfSk;DUUu% zhr)|dLbS5sj|AiyeerQ|;U=7}9k~!Uy&nQmcjP`9F@IpAgw~aY8Rt|j!<6<@ky#-{ zY})eIe&VH|q!#L?l*R!MZGB^Fz(LFo8->N`d+@;4;47Moyr~Adf1Op{&zOukj7)fU zl}lPjrml-yp>Z>t&y-5Wv9G1A=H*ji>>#=8e{X9G1Qsb8wA(!eoj}LIXRddO+e4(E zXn*BBNJl%IAVwVRZ(|JHEyY{+fd} z=|galaynJccf&<`Z@n$@vAM-2v!i7n|2#8UW1+P%muc-iB2`U5U{rp+z05D5q-<{l zT*S4j@1*r*=v_Q_*{_?z2@bA~cbW+x1K5rwc=aTUud^@Y=xIHAfsYUGf6{}ev}5l2 zc9(TiB}+mMJ}fA#o*3=@77;RCL4z-Tyq*|UJMH4zwb(jTxaM1dvo>`WQ(xPbJ*9?9RAOR75u<5Ds6_JwAF!WxM+mBgsrdL9SVd9?@Qw39?4C|j z>AI1pSQz2auFn2+q=`It2dL32~Z}N+#`fee`#SmwrAo=s|zC@R9cO#>!Da zK<`ZQLOpoOj)(}WtQ{nJ&dbeBjgHoF{HXLTVQ|oVhuu`QSPJKeHV^dE-V*aVyc{BG zEzORoD98DKRisKNx$m+p%kl;>~HzW2PR%*a9EgWYORSvpAcd~E9o`c zCT3=0k@1MMlhd5Tk2RMY+^Hz;66B`e3ir(xnrW2Yt7AGti-`qzle2RpzC&&3sdfWR z>tQ835fpRNm;k}%ran^hqk;q!w7V4nhsAR3PC}#&@Ar0wG=YI)YhR#OR!g13)N-X` zbZ5yV`(u^ovnB~ihRUZoL9E3l&u1{kEO-fi1v>2*w>EQC#SA!{_V&}BVf(b%!O<}> zrDbKZO=eg2+BrHZDo%rOlG;s<(QExQZ_1X35-PA8EH=B(88qiBG-_^^=1zyy=*chN z6JbFw6)KV+YR$R5TmY2kj~z>Q6QKT{#=S5pIpz7QRo?;!VyPLmo1CYp zsPh7X&shG+`+G4JDt3iArX(dHUa0*V?8PyYshP0#?jL}jkj;Fj=xpJOOSC56=AnmN5Bk+ah*tr``NvtIOO4=q5Hi9LCOoWslC9}; zylUEOC7afVoV~F&$i`sKr@5MHKRkcOAJ8YK{4?gJET*f-h`;cO2p?2F+M43+PvOa^ zFpNZh!ioMP2UM)Ye0Yz7T9*yw7pGnIcoH4!VIo8P+guXWaj5n2!=ZLz2gdrY^;{lw zlCiPoLszW*2iY;&E1aN)9;AQN57~l9(A>^I#6!zPW;QrTIUa<1^_0g2F1ww-moJ%^ zpb!yhLwnqQoo2#G5#@g8L(lC?{2mkMkmScwHJAH$fX07&=YFJl3upLXyri#23xZ?0 zR#;r_X}-70pA!Hf9^c#8IU+Zfvs!N2x#IVQZ^Y2Wu{J{I4Eb%I{w%!qaCZ>f4!pTK z^GbayaJt%xrU}i-%hw9tocS_=wI`@R3H|%YnGx9=^^X%w`rQMuCh<&K@6tln<)q~^ z*er+vRtQlu=rVJN&(F_q@q7vD(Py*PM_W{IRPF|8a6O^c$RwvH4_51y zRp(U`1rhJrq{@Oljxq(?xvwp;yL-jEZvhEXml#gRy#%)A(J6pT)<(MYn}{AskHT(WY*yw&nsy zl7L%v!>|kiWaFYN!G<67eu5-5E)c1P$5q>&m8EmZ4#ULfbo&xZ2JJSI#P12*0)6=N z(|>1j9OlxyV!ugQRl~Ak7Pc?mQFL1vO;n3s4BB$LKIoUwU`r8wI>%)3#?*M1E&?hR z(9i~IxCMvCyTal!S2y++D{U<99UnV=z^h#@V~yX%w%Pg_7CIp8C&Z4J%Q`tGWU=g% z3G|aY2zfN9;Szz_>W|LRsspT>>~}C*%Bf{i;}Wly4q+vJaC39B;+NG3Q&Yv>Z?rmp zNYAJMS7CqUQaQ~`P1S$k)*DKYUQZQ_8T5voO!jPSboD7|y*EPj-=8X|_o&(BZ)@uc zh>QY~=D$wGZi{+%4PY9!I=_VUW-ctU`!PD6<1$n4ouoCBiy;So0ts6C=K>Oheu<1} zJT@zJD`RtL$@$|Y@~8!Vw=D$)dznJe2m|U~`cnvKk?R)?p*ReQ0yf?td#uVJ5FGk1 z?rT~~NXaR{C-W1`>SEK&;IE;*QEl6u!5LycqM7L#sUw_id9LnxeAjFy<W+uTzriqDB>hnJ%9J6E63%&hq|!^lEe&k1EN$!AeW;(4%~0#me!Q$_(N5)nL2x z?$d7~EOcD_ZI4lJS72`gZP2H`;-Zoe?ElsJ(SPKICIqA20z@sK9eHNy@HgiV(=s!| zfArMVHrkWw4)7yNZ1yY5?H}r=*L>W~Gf7pi()p<*bB?{r!?=l%co-tu7yn9ZmHhk1 z) zhpXhL`|FiQU??zBUZ?IX`Lek-Zo1MdGtaH=#^!rR3*!D~kIS?3+8ODBa?KdZ^@>F1 zmA;wh(S=Z~1bQzN>%kk*PeE(my+7b5zl5M(CcvPMqskQHG9%W0+sm+zvjq7a+c!kb zg175!EV@29kR*;4!~o;m1YF);)>+IVvY)j$o~Tb8Q1tdiq%%Y7a1Tf#B#eeYKR&wr z8K|`crW7SLb{wNO`)x2jU^f}}Jb}nVo5iNFp}uyv1k`U-VYS8D7Au1=5E9;%s>gBM zy{|?GX>JkIHPx0NC}=uZU)ZtA4uQNcw6D`@^(I5sqr@(!rw&tJf3xm{GiqRGwyM-@ zt{)Z($v+zu2DT-oH1*Tk8~+M8ns?6Y5zGSgK5D}$kPP82sc$1L*T;Xl50LI#GD4k% zsrAIfG!-%{QfW<(_Q7bcAFl~WM(acCrpgy+b6d#w*kj~-Am(Wp%1t&CZr%+~u3NWb zd0lG7uvhF}85_j>&JS_FOQaPRmwUK4_?xM>l`j!Lupwu zzZf!GMwzRt-+@~b`vj(6k`!9`{0Zck%?0u)jSx^2qP3-0Q>zE0R?xNLM`$~qn>+G8 z{i`YRueN<>Jl*VZK!-WOFGTa>tIOAg zQEI~8$Lh0iB-Ativ5c5%I>p{Zt!V>hA*bwQt?6r9Q3Nz0^pE0+!nBhL2JDd}9uKf~ z53po#TZTA2(Aqf(PFR!R`r~G*`9>&3;8~nxHT;{&z_o~XtH3b<&VHleRW~o{4}G<& z9i9|p+22==k4wJ?H-SqH%h@(9HCP$KX0w~G*_ADVV|9k{wY=D-2tEnvLj8fIdZGFQ z19Xn?fl<^y6yri77+?87nDvL1ECMa>ocye})Jimq2XaMvLc5kRo@*Gw`Jc8%JV4su7IjCo=BUuvYZNB^3PN8 zd+I%cS%{%v{{J77u6{jeQ*0tXj`O>08L*t?JzP_bTf-Fn2<{+L~3En;M@i^F$jkQx<}fQ(77q z9}j5@tIF~OM3lpx974?#RYHTpcAvR5hsOn(SYlHs3_iVeWg^=Vytk|tOcwg1XP@3> zv+|ugtvoA>;aM`v3lU2+jt(?}AMU$Y*YZL#qOjl4u;>0kaedDw*gwxNah;uo_6hdkU|@C-sP-6We4c1=o#|=Y zujAeWsb7U4vf4w;42^fRf#&#{*H+2Kdxl_2G%@CTOH^@bek?Z0xk+EK#frK1`@u9uJ<}+e=i7i8S<7U$x0E|CJ)cDKz#psZSxE8g zrw`^Kei}Z=-)|48Wkg}{!_)CJhQ(_f#caRx-xkt*a{ai2Y(~k7Hg5i_eIq%IfiAd- zjQV~Cg_M5t7N72|H`zU(&_(}N?5|(%Y3h3xpr+{GXHI=#ud^hG9oNAIa*oi>Za;Np zeRRQZ1qZRAcm`wU{k<_=(ieC|xw`!LUGSkS6j!8Ck{=Kdkdor;C%_u{S{lr_CtIZ7 zuTv5uLGbVMdoI3jZ%2(#Y6pB`H+C3E((V<|pH5(Hfe&u!IHVW;6JxeA`=C@oU3oB{ zAo3MeATV1{S*)cUXf99XEF0?Zq}nw`_*}KL%j9yKi`|NE*ba_zET7v8d?~0xb zO-w*8ID>Yb&tt)nx7Au5IRitPf2#*5ADy2gG(%2XZ8tsw-lP&_XU^Z{>)Q>62!)~$ zktlhn#YwZ7%|s}>ceZfngQP<528R?Y#^6I$#;1mZp0SXqRM12j!mq|TUA|^_cs~(2 ze?ReO5f7ToYzpaTXgfqAjFN4P7Z8dHk(H3>f4WBsj z$1$e5jZxTJ_{o478$0gW@k>t3wi-u}enBBf`e(iKGugVJd5=VwHoAvXsiPS0HTI)= zqa5QE6OP}I@HlV0voJ)hpK9f)po~WN&nRY`BQjEC%BW%W29u({*Qc(n_fa{ZLAw}n zStP46S9*S(h{*)e?dlyAW7+_K6L%PxIQm1V8n{&lUCt_*zZr=8$cFQo3pus(!qDZV z-@cbjB!8Vp(eO)p!p^XbXoD3F75<;mJw8@@CXN=d@c2KgyJqlRC-&NAS;($z?!J+} z8EZg5ou2-(O+jcJE&igI?Y9evDa%5L!XH`5ry(T0cmZvobUL41jaiL4PDA89dAR%? zHO6b}nEU!U2g=K<(=;o}9dEgpZni6L3(L%JI zukHWD6BG`Ix;y&_7Go`8eof~lVwz8Z@rm$k629{vnntqG3Z%oECJ7Bd5FP&qum}QF zkhUxO@aFvGJpM{Q%@1H3Ri`PMYsGEkPXy1(m*#9867vaLrnpdP#_~6K$BDuwU zKu8tdlRH_m*#B&qCDDxw-w1`FM!Jn;{|->fpcPvu?e>NFfWPTKyHz8qvA`L(RRQ%2 z4L_|Myc41msH#7!XsAe23`)79^F>xiB87u-^j(k;SgtU->9%H1!cuRCK{Bz+ZPp)k7U!lUzD&y*~Kz*6^kVY z$QqVekNbq_*bF&nQ*xlVor?+y{ujbg*4xJ9jFN(jEi23{gbEj)&W#!jl~~T`ACi%$ z{WWU!?==lx*2V1e4`s>l&Uikt^oBlfzr|Js`&6*cvv z(wDk|YeJ@fU!g>i!tYPvqF&dMx%Om_h1t=HU{HxZw$g|}DP7?EfQGKTuC}%c4fdd` zn5bw$UI7-oQeKvl{qQvHOR&qcin<70#{W+t3B4c!G`7c!jWg53thBU}hh6$rpiVrR zRv$%!*A;+rA1h~!2h8Me<-pa$=f;drC(bVTER?XPea&+2He9=XzkGqNeh|XvHf_9o zi$m|$NnVT&;u6IJ0zqR^KbHDSj4o=e>B`1sUp-XY_xi2+>LijtMn2tk_s$(-%>O>| zAVM1267`wiFIO9~-fp04ppq-(q+HjCZ-(vn;jG2kF0g|IB^0uaR#13%{|IU#V_6Q6 z0~}mj$oZy`%ciTVJLLW$N$S~UpQpY8=D`g-ReQM|Z2B9BMN({U)k7t4TP;FXTed14 zwVI7coPXNxujb6Xamg+zEaGuILXkCsDncH%{*ycxvqi#``bdg39lmnf$i`~ML|sU4 zO@8woI3w+n$)RaHyD2Mq>zS_VWG?Ly&!COm<2fC)AtIW0+JW(NL~9Tae78)}IaD_m z?0;9PPPdD%o68OtB%Z}1(&~)nFy_U=Q^cOA&IXRBfW)k<;M5J^Q;Lh%9&Wn6b3DR- zKUyD7rwbb8vwm4|anPBN8Ng*ct!s(}IN2RHJI<(TWDHEJE3Tog;wcWos9WHKfZ=+wFgLrcyRB=TLOd^5mz$e<_L7#T&$P@CYVhIEC-a3F|IZ`j1 zs+aZdo>u0HHq0VRbm{V>zyt%NH+)VSPUETnX}^yu@atDxZv-BKk&dKBaA9GoI;-|e z2cU3qjT{z$O!B(Dkv2xMI?rao<@yx%`_pbd1+~+`YJG&tGnV+x*F;5wfG) z_?_dM;~gz&=uAU~H=#R~eRHt&7#eaA8AE#&p}V|X`w zeSG@Dh^svMUS?~I@SE) zDRs(>11}Bzk6HvR~sO+v&uVWQT6&yhE$&C^M$t{9U2UsSvzHg ze?Y)YU9IJ6%L4FtOTuoYIkt1IE<@EQ4GP13v$Cq!hfU3H#|w`cB_#yTCriykD=V$i zxNuese?hNy`C28o6U{6&FYE#|sb)snxIElnPgF8Ig=-xhb@|<{M()Yq?ax4hA`_Yu z3QCHTT?_LzndwXQ<;W0%{UkU#yIU1gnF z_m;inIn+y?uj@bv69{<+Uar~_0zcjP=71n*mv^X~RbUpj>DmhW{jYT1hP345 z$(bs&b(k&$19&vU>#hb_w@FD#hq(n`ve|eXweP-E;OSp(i&ER zeMD&cYfK+M+FvhTTU&3MwNp{`mZ+5#YA;PrO<4@Yyr1|yv98gzY}r>g^6=nVUQP@O z`G=DWdW+Koh=ijcYb1Xpm1vzr{YQ<&nqWr4fW>rwoz1I|2<_Wz#=;>sn~59XP_(K} z-(n8R70_dSTeG2sm(kr;|bS02FT7?k%DeQ4H!fiPGxc7J3+H^X4o6zFxy zSf-8wehH*zXXoThwP~klumJgz9Jsi1zdpqe;5|@X z8zH5@&W3~__C*lqDiqC?uUIY@ZiL}YT|7!a`x-pd(hemsfW&7%&})Rnt5sV`!lv(x z8ohO}!R4{IU7d&|n5AGUKuVo5U23FJQ0|=D8eeA(@>5l>EqRyQ0S>d(rqfIezizod z^T9QytWEWS7E7qw2-~_JX*lQS=FoBlo!tqWAz%YTv*X;sH}Nv7!?iY#xnjA$4kmI@ z=?X2l!x=|=xah>h{C1u5dD1u-dElTEq3w$3=QAGF!5HDO$Do;(ni_{r!r^{J!C-YB zH2AZL zSz5wmd;kva#YanR?9FnNv8gSnhOc{NxQr6Y4OgkXMhOC0%ofvk2g2gA$Y+;em_Loz zfGkOwVWgzHzi z;!>kBz0y5km*&}Nk6mYN#)Ei)H*Hg}V!i7h_+6#KHRCe`+KNaLgSPn&+)%{Oa(e_pC~5q^E~$lAok#D_xp zNCm`7!a5wU{@oc;`)xkc;(G5>9fQdVfO!z@uHmbTyiZO?vtXkIs)j`quoqtyJuyYi zgulez;_+xMVQTu-9ZG^OU1v4vAjzLCR4kHkq8%V9AHL>x0)gu#I#0|?HdjfU2J+? zcuIH%FUOdWcx1-gYu0@ipVgzJ%lHxt^Q5FX{4ee;?HM3~p9w^wF~=$YjRIo9r=t+r z>p)_pt({XV<2`s38$(ayvb_ zzPr1NEf}NMZA-k$;IwlEl?=<2wow#nkZ~_P+t}#tA4&KwG&J1Ufs+&vG&DAjD)NT*^r5~& z>nGk>IogXPUUq%BW90QZUE>8Q_7le~N4x(!D}zsiIm<;Pe0>pTc)S3{fb*Rx9u8a+ zctHvJ$KCVjyd2?3n^BUn46ctaLKv@4cPH;%ewFK>-%9V}eVAvfdM&F`!yO~uv1iHR z=(-;YoB;@aT9_SN+7P^Lj%fBP|~oFR)PV z-41dsz1x={C*FvXbJp6K(7(EjL31w#FDSHbY`m12O;IUCZraX+*3*Ih{^cr*$Rv&H zv5d6EdW)qpEnNHGft|^sRaI5t$H&2wut2e4cuMW~#Ei6*6f0}780uiZ?yICk5G4gm zvZU`7IPbIi^ zsm0SwM!7pBL0+|dX`xo*sG-4>lkn0=1~{8+%*@Q3tN;>Cf8J`Z z<)-uvX^W9DGgr!`af_J6rl;5GT|-TxtW3Dv_;^ZkgB0Y%m;rc@Hn|P|lQcF(i1hUX zsg~epSbxv$Lc8i06#PYcO=fvOOFWdUN+c(@RN|pPO6Rr%Tvny9S$vISew>+b83 zLbA2j&#ta6wyb=FR9q8qPS)97Chqr_;L5|m-S6E-!?Lq~zP=pMo`-jQcW0rr5=XNS z68eImt15hb4H$;F^|FLq9|HJwh;yU<=sWaxl$s2cCXy4(5jX9XSbDKn+4@(r$Nr!NVxnlIEyF9C65imjR`n-H)F z>u}Y+n9YZohbbKsd*&9uL_va%Q*UnkA!Q%@LDFJfR zAJFn-NibhIZwbKqVyxdfwDyB$jVqL^SjG8lVO_}=Pyz)@%hClJm#Q2hRgNG=hWWtb#d+@x-~dc0kY7OVyJ+e1IzxV0fYoC# zXtv&Na42}zD;?I)4Mgz2-$*=Ki&wMO{(AP*Bdsy!;r5e)f(jMyOSMr6YV`}N zRQY#6yVaGAI8r_iiAzL>0E=X;Rg>A`DH@u`|0@~S4n=!p-1fGJeE?EsS(&uNbgb@V zg3AYCVV?++)f$sW?g4t)wL9l?&9XDr=u4hAwxEi%4cCMbKbm2G|0Efu?Rrh51itRK z8EDUFxnMS0H|mt_EA~B(_fdXkREdnFnmB;ZV`pqGH3_(}OaB_Tj8@-QR91?A*Ol<* zpY!n3Cy5e45&_S0#hOtsAz=aFrN#EoGH+;^Aj4PhE`-P+cqF92QBAPuroSxSXhqxY zrm?9JH0a~l#p$Pr=0!9g&4G`4d^YRd(>>8-x*^?H+OR)e)cc3{soXateln6T04*Sa z3kF~?byIV5MGngS?l|w7owlm;kn%fW*(MF(AVTaMcX5b(oPZ>T}DGM0PMz-kqz8LULI<&fpydVid`;e>s{hoBgcL#hSQxeWQ zTnFYeJl}+dn#;LUM#h!q;JI#nX8Z6+Zcax9Mb$bh)2RX*CIA37ZQf9`nEWwElK!M? z14*#aRku|2Bw08sUrQ@ifx`ehobHG{V0|OflViSLkqLeT2NXU#3IIYBf2!N=XuqFT zR0ORRC>H^Os7xtydS$;UsgiB?cJv#91X)6u9`LRX68V3rOkaTS4AijA7Mfz?;~6a( zH0u*k>jvdl9#G&=o*UocH$o{#wcBhNGYD;Y=^!1rOq$kq2(~8{27z$^OiT?H7A$V< z$tB3XRNiDV>m$&$WA<;GYEhzKUIbxXhkg|zlEcaI0Lsy<`^#~yNrv+=EUPWNq?7)7 z#|yf}Wv|n^=f(DY8qe*#<;|0egGl!AiFPw5kB4DZBIv+1_>vTgI~v&TU_4^$VE1v# z?}5Ul`@#kX1ntX+i&ucP0jFy%q#hS@0AlFSk8vyjYtzT~DQmT`IA8Ah^ZTCh{&$B4 zAyRZ64`_jHG!qWoDPNpe=Ia31y-lFE$NuvgRffn0V-%TQtKMx7t z$37@Vat{}c%&WRihih}zxAkGGbir{uAK$L7`f zbIo3bdbQLs9uZ!8bAQsXN(>aq1h-QelP>4mgYI6jG3|fo{z>vAD?}VFH%$z$LSnf& za_M|+b0bwGmS^E;NGQqtZUdcMSj5YX6D6maVzS2rY`Xsn3`Jj-8$65jd|}tmZm%mX zCZUQE?=8IQt=Cp+_5N1s0lrxgd)rSVLrY6wwFo>HWHii5i~Z{z7`2Puod=J=pG|JU z&bN9yR(;_jZ5ubuYQ|T1j0Q#KGi7T%TN_p{?gpl^gyH^R5X`ePyc%P0N&EjXY--+> zyB^Vf)nJ8WTVk7yoc&oL$mx?`s@rSu8hgDsuo8#stB@nf+Wi#+r1C<}&2d80DA5TQ znbtGwCfNr6Lfe;r&rzij{uq+e3kZ;*@020NWHPP^D&!Y39?C-dijpLf2xslai)H zLHgCg!c0s=Ow!|fJI_js2SJ+__o8Msj!8)Vu~bEVzMPU$ODT8Knm8g2E=bAliCCe5 zvOmWz!XpyY5LKBq3`iAZ3aJL4^IzRD_}dB9BKoju2>=+F9;msW{-baUZ{uS+SYbp( zi`*|+U_|qH(?xxm-u|PV(VD!JPSQ{t8_#U%Z%s}1rpZ=b*|jp&P~LE(}7oiWSm9VszR|-g@veqiw8JMzoLs2JGXd#}Y1<*x5XlQ4~VYRWDy_xj*^q_J0M}MUxFpO)G5ScsN(v2RWX0APajPk)TT)Ku6={V_ z8KA=}%?#ieQFi-9S<~PAC*n$Y|EHT*M;|m!V}O68sGt=4oRp0Hzf$i03YsF* z!I$njOdn+#!zBo(C`@dQkrV(nstSdGd@DO_6)r>&MHMReLflEu&%u(G5*?Gq@bRCE zblc{Q3KR^b3al!^pjRoqr?D%d`##b#()DK;N;Y=5Lj##?LwK+z+u9W@w4S9w&pq@8 z`>C;E++}B2uQzxSlL@IYjWPPyd|?r>v@op2?Y}AySWq}}f72cUBs63L2b4(Z*r7a) zHSNDExhE>n&@jIVADtd&S5=)UzjL{V?p}}&mJUP0dLQ#F<@gCm(6{mUHSAW^h{Iuz zt)f9l30oueo4E$0FxECGbd}A6g-CR5heb(vMJ-{|P`91pp=E`g zyEO4FUVprumytOY%sk37>7YTB#?!lt`nTQ)*6*%X1(&G!7@}$3DolnAm-=fwO>ZZ5 zCXc*_D-5XO8no@)@MgSEaj%@4pVp+=E}-fO5_!+Z1iT3cdJR9(2orbte7{&L9drWU zT(*se%81)UW5B6@aRBi)z6g4Bp;YiFE50vG1|dpoT(_yEor*ekoU+hLznD{wr5DoB zo^cS9JwG^}zhqjUH5`bTy}?AFfZ?X4NJ&o?1UDl7QPS(^9Q+F*Ne6kEi6397GUI$b zg)pQqT-X3qNh=k#$)5~tlEj!Yl3}#J5I>3waj|jX5MtA*fPl0=+vEF2JSUPA*v1GA z<6huIOBLk~t|95nxhb(Zr+E- zfewUECFVP~YN|84Myk~IUfo;?H_6UTI+*mUxxqduX)yB;Lr2I4 zqwV>Z+hJq#6b=H?7_^)JcU->$x)5+pO@vYtiaA**(W3gk*68jS=Wk~fYUw&%>Zq6F z$*8_hNs58%*M48a@b3z02Z0eQ^vP)OEB_}M8CnFewS-1|@ZMGeqjJG=DPXqJ+gGp{ z-AZ!_>;G;J@1bB&-xXaI78gsdICAHB6j-0BvA+o&I9#m}@O}dLEmRpj@2_U#Bn|Yy zvLy=7i~%fhEzM~PI#}+-#Q@j`unfLD;-)nP7oWYh5whizUXJRG{f`P|dErMmUZGY$ zN)%k|lO6NLTiNqCxqfzX0!EwxsU#Uk^_`N_#O%apwldU|y1Jh_Bt-55hSX zZ^gab?7>D&9Y~`BCiMNfBmpr$|C5EP^gD7=a>?LePyTd~9ccArAv)Fn_DZa<#ix#U{9vS#Bh6FSjsbze6^+uBf!ANe>ppM$liQ= zPxk;=jaTYD^DS`{7Zv&NaB&$ur1q?}HR50pBf2Qr54Hx%2T6_gSH&`z&*e;*@)FZMPNu@n~u_3+=ofk3F|NtL-JN87-~7sY4zHMh=B#Dqj}g z<7r!29lKvt#?rDrUARzLDn<21i@n@@b^7GFZ>-w}oF{%Bua}R>>2lbt2*>f{&ydTTpZl;ju!tp(K-F9>lBn!@9uEvm9O{tD#7#39Ak#l^RD4q(~1{ajt}7T6pLl&?;p~? z7ij}d%)(7IqVMe{K5xZ$ZB*>}`}YLY)|Eq^_Vp$iFpUBO0_0Lz*~mWI9q%iGKn@Y_ z9Q8Qt_kt@QxGnuk_u4!j^`QIikxbsd$5vPcdsG4^u{l8vP63VyO@k)s-3BXWsh?SHXxd}ZOF)Y0t$MKMgLiNw@BRcqy5dCH_2Kj!}vrU1< zC*1K8yr;=8>trhx?aBYGDOZD&>bW1{;ILXL0Gr}BcFNRj_`$Ezr*F?@$!UMt|40M@ z%*wwN`qMXrvaFZ&CuJ_!Z7zv^c5+6Gy;Qve_e|)E?J=JhFkr|9ypV>2s|U}Fx58kO zFo&ERm1KTkg#O^#Ph5rO$?P(c*IR9jc%j}BvePL^ViSpBkSSgZwo|Y7#6B`*2m~;* z>@kK$L{t{fk@9Fcp3csIMZ2P5(tf#IBVzm}-4G z*%9vUiu`@}6$Dnb2f-vqCBbTz=F6>^Ji2@>HI|bj`Et76_k;KOfFZxwXc7xXwENRC z1nj1B*`s6o(;?wRO9*No!Etq46w096#>_N@gw-)7&;OZv>3($`C!hY6!O-+U-8Zx8 zN@po46#dMAh_Gd%wT5?$hA6i%!@}a? zj+Qhw*Y(-*GSE5chRz&uYt5A5;o)@}R&)ya03B7(*f&Bp%e&#*=<}WHpEqfI7nfJ? zkbSl_&b^pS63JZEYaVVcyV;4EmLFGdCCH=(X!Z#<{*(#Ok55hUIZ7=FAe7?M&)%t^ z{%tb>k!P2C{J2>;c{wQ@m3UpoupePKPah)+-*^+vL#GJ@taR%gZr6AH{&fr}!E=@N z`5&$+jBz_UYB2v>8lY+kwGv0$-P4b`}3X` zj?R#fZEY%T3YLfn%)z2bRMC`;qmkpP!fKkHk?iSDl|OmpFSGDgd8!D07pvYdAL!mO z-m+$>Soo+R*PX)P_1WQSUZ}+y71^!lbcsS}L4>;IRDsTLfWSZq2%oW<`xRF3{&2Bj zq%!WdaoCk!yM@CWu}cvM*A5V-o4P--0i}ef zDCH~~Qml}#3y-f9Lb`{K82pVhM8aLKb>17JZ18#->-z`y+f#?xnVMIILqGRK0>4$v zO`A=Yp&w77zY+z@nfAZ8RZ8im@@HfFmn8b~jWhP{42bo2A7&bj;!cC9v zEyS*v@abUHEu6bLxqLZO!(_GH-|6YmveeSNKV1q6_j;=@yte22iC&M8OQ}X%jh75B zp4v6cqsu@#LG_=QSlrc?`?-Qlbj~@Wu3uh^6%`qd0Z4c}&KMJjOJUKyS6Bv}P*WWb zbmnJANI)Qvon!|fl+RV?YR-zrD^p<|8DJ8Mm{bl@k#xYw&xUz&Ke{LUXA766rhO?b zyZM6i-;3@r;)R(a4G4~>&eJWUV65r64=FrN@ce1nf7IQ@{$w`4_b!w>Z}`hxhTx+? z@Xr3OF(%>C^IBvyPW}+gv`>h7qo+t&L4>0W`IzGeIo)3;?Jw(L*XY@>jNO28ftH1q zXsM~Tysp5Y)q3#w)2vnaTdrTWRA;z!#?jP|94G;-W191g-ysr~wKjKKtu||Jr!-D$ zQcg;PzJS0CjKihcv~K+}jhckvZ|EefdkdG`z-0V>z&Gwn=KgwbeM56dz+K)jJ4;XB zeJ$Ufx8fxn^$$F<((FnqVJ7X-g6r;Bq*9L%z9aKUq zEgo2FJKt4C5wm>8?eX0@wlWCFAGOWcSicKW25UjR#^CMAU(+|S1HW|mISp_Jddj7Gog{*8Ht~#20}AiV>vmQ3F9E zfGfKfvi2WSSs6%kv3UD;C;z(qTQZkfWN|RWoK7{1l7WIkgvWleo51ncNK+H>;%7RK zEAOa;6+!4svx#t<=PTIT>(lFN274TA1M#Z7+F2`J(q7|gGYkHV^i6-ck+n2VD+3Yz zi-WrKrIa*K25fA^YIUXm-aL1()SAqm%?L{+=5{>z^LKdfVUJ>>1=y7Yo@WwqHWHzN z{*QsEaRD`%V0Q;JA$-p7(?q~WlXKUDN-CtW5wTiU@_PES5zm)y9}|#@K*7oRlIXI; zVx`$_pWK95U5njRe>NrM=imL??6nNf-GYK?LPyhsT|Zw$Tj#{_aV)HL=y|V9WfG0x zE4sygFV%bFf?}Cuo>~=G@lz0a3ynk@G2lc;l^o2XzkKPV`sM4GRmxE|6$4wT?s&HA z&H?)gTdl?Es#msllb!VE&$?9}gonO{r;uyyD+5n2uXp~PUT|30_TM`-&m_{j2WP~@ zf{^BiQ+X|Rj^V)M3!!IvcGCWyMpbN0<#1zro#YkrF(@%2HuqfYY>iD;A#)tEcm1&F zv)tG3ur^FaTkbB7TTKQnzkjDN9uki6@t1QrS`z&H85KTEE zkm<~7y!hK|HT)EjK50bn{XVlWmkf7{7!H|0$xX;j4CE+`XQE@46Zi4yJMV`etW8dp zjSnwgGkj@8JZ7Uiy1zcsfY#o}gr}#}^OQkf*YX*31$$w%Gt9yTP4+;r6NBI9g%XqR z1ioThTU}i}<*U^`)Od}KNAOVosE)F^guA;o{dN3cRR8eQ>?o`A4>0%Vz3(nhDkW3{ zF|lhvF9K9S#e@yBWeUR73K3>=i0HeEofTF2;d4`i1r?Lt!ZuJZZ9t{yN-N9+7P$dT zwKBM&T`tz>Z?hu?M1_P>Qq~3eTJ4_T_eT2rYfF??Cm*?~iR-Ms&>YI3b^ySt90|Vw zDJ3Gk6HsyFxbDQMyivX6YjgdxcSY}0ikb=qup$SlF<>sfa{Co7%BevIT|?TNRV(z)UA;UU4W)~{FI9S(o?S-Daxesp|s z8Uy}a*x&xb`C;qpSSKrOR0G7iR^f=XGG8f%=UL3BAQo=!`}^6|w0(6JYisKqz_p%l zduHIV-e(~T*8HH7tS`3wf5QS*HdgV_S0D5Tn^Z}IyA|b?C8VTjxZX;f_l6Vu{pGh5 z!f#E)%5kG6_R5YkASNkq<`r7|{>|ji-Ll4rNR*P|CXNT6hkU-d$!cH!d}{A#Dk*v@ zl&Y@G270661nhT8dQc?JflUhHSk3`o7Hkro!BkOA+b>y6>VZc?$4 z$|o{L4JBb2YFxp-2Q0FX#6oLyrSD#(gZ%%okSi`Z=a%K^DGZ`D>U2_Mk-fdyk|Y@^ zwM^9`+!bo%cY zaQ3;z%%qgx*ME81E_D@|pSM~GbalyP#r^xT&FMBTsc67&nETcnAkp8fm}I~TZ1PjT zj~O=9Znm+VZ2VJHM3dt!ARz)zA^dn6K%J!w@TDXu>?sPpm3alH^N^%uKl2XV-b}+L zC_(Z@hEgRlm}EZR=VeHBzVwIu#iP=)N|rP)W;~)gB=wT(%UGWJ;57FW&~NFat!I?oB2j@SE$T1T!>NjyK}N?YTTpr-zl;I zwskbE4(&JY8+UMUrKh&OTd0F8BP;mtr$`udyHD3JyF9tr=yCR$nFTU6Mu%2`==cMi zb6s^wgZs4y$6YkiEa_l!-ARMPBZfj8(L&oMV4}&6toElD&%DXa^Zh9{RdbgctRkv` zU`f3vJ19X#{Nv+_`v7q}L#i-J+Go5`jY?xSvi^?+KXahJ;r-%Bn5hZOWC?TJcq7UZ*H9yS!?8^f{ZHW0Okl( zbbZfxEsi^;ZC(@^xp;(x?ss!f^>c4Q-JQPD=JNN{2-6EzoRPFW+0Ne=UWJ{`X`RNx zLYpCcNkgFnrgc~=K>RDh&3!`BOi*~Jq@+|x0CJ&)0s1kt+lRa%H(qNxsxV4Sjf8Q7 zzjIbHr#_mtskBBDIJhKx)RSw3X6b zF7W&T1ym}sO9*VP>7zDuvu=RXzrkaffRgeI58o6PD56rCEDXQ#`kG_p`?{Y;sVfe4 z-rDAq3JUSm@Zh9E2jr;~5U zet5D)CdBAvlt;(J{N6#0iNS4jFhy?>fT@7aYSH&;Xnv%$xl+^6OjWS>o7$P1dmrL_ zX-QIeY>Xon_RLcF+GY9y@k)l!#pM=NGz-Hbc@??{8r*cWH^#w!gN6TEt4>zt_3KHdEqDu+aqIQK%lo!<41ms zq*r*!QBl?3RBl!5G7O6It=EEO(;G93gc{&MSYMx41s z32ri4%?vwQ97i;TW__7~DBi1ISn{~s{`dZ$gahZ=@XID+>1VA^}zyG8o`b~MX zFabUnkNdGrQ!QOQLn5kT-xwB7;6$EwzGW}w$>XrZMsnXD!2!x`(}EeKgrQPHtbs!-e}fztXcd6KFC?~;%u3(^XIq6&|jj;V%l zjNA5h2_mY3SgP$56;V7&bMx{dPizZ({#eddtALB%qcyEV@M+lN^C>Ix4Vuf zfWx%>*zVOSGH?6iIW3Ovuz!Xqx}Wq_j@w6KLZUP4ikebrf9I^aXqEKAQ7pO6V%e@M zLT3wc-~Q=^{PYzn@`tYPnUB#?N_0aq6j^#HZO-tBz_E8?ZW77uOsI3me!}B^eP))H zCg3QyYQ(^QbBBcYc6?~6YkCHrZ9${P~Qzvd~#L0G*9ZNqe_ z8A9>})uCS1oQNppe;jtFo;nMfNtXxHwFN4hmy1gpt2n*rKC_P@h2O!jV$qS3=3VK6 zgJz|TlD(3x#8}=p91L-?zUQ5ybQll5HQ}V+CKG^};n!9kPId8Vrpgle7>xL((-_mK zzmxwKI@GE|A`?>^Z7&g%VUT0bsDGTH{b_y^QkQ-VUTlA?Yj!_l{@o&o}e^Gc!FsdGDs0 zL6%yh{(6ZY`oU_eLzq-{YLgQy1%r>4nmlf>f3(y!ylW(`+X@-2l;ObB=lVi{etrBYzsp}DHp$=Kf~U!;_4L^7q+-tmy1H@A1W0x zke3^*Tfh0-$)&gay*g7iFtlx4Tj*&dt&_m%K+%sO5=9Ea2 z=1M8+8%O7r&JiJuF%+qk!?;7{2#6H-D=ankVEgPKqbc?i@$-gX#}S-YXXm4qXB)e? z;CNqsQuru|M=7qIG^<%)TeF}XMmr+L&C9fIv1XS`#Oh9~)z)P3o95Hjbn*=Z06M06Rp&{*9^7((~$U{qZ2< zg%v-^wXKm{Qld(HXubR5wgAKc$OgoVwn%q?NQ>%Grd73nmfggV9$XrwR<47-^a@R} z-gz?!M0}W|Fz3lZdo!iQ^3*A9KVEu~LOv7t9qT)r^EKkDawocjE}H6^%T4y8Pa*=S z$f%>*PNMH=T1~TZb2GC`8S5cOp@~nj`IB?BZ}98d&(t!+ak0h){Y zWQbUh;5A)ZMp<4FZE|Z+<=l&+DNE$}Nd!0hGjoI0zDiXHJ%Y2<%^nyRC?oh`xo8rG zgbp5mp=yTnw0;rO8Ay-ZG~}&!zB)Q5l-F$KXgcKmA*3zy0AoC#)eizc0kM5So22bU z7JRe&B`%FAPW~_@_s(jY^E+%JiIG=ct$n)%0qhLvSNQ*-vF$3q&-UE$X=3*ac`GN; zlaRu7N1^~R1=R%E?9X{=oX3}bX@eViwa*Sjj)N3tgt7UC%K~nEL%%;SE zYhkP~)u-#~y?lA5x;8mOjMFrsF8}9X%^ijSIu19-OAgzozm?s#Uk9;K@Mv{JW6-bP z@$C)kIqZ%h{`9+Xs=!4>KLqxn`+FpT&YEB9mBNq;h$28Py>qtBFa6T;k(%S8dy`No zbNA>z+(L7HG@ZM&eHR4(xZiWE)Z3uIb8rkCyCVU0((G8?(>xB+n(2G0{Go)FguzY5 zgbVi3V^6sc@vaYBoLSY0Oy5F+lY1egu;Dab=j&Q@x%9S}V{iXl_j}dPaj#7q-;U6T z+dx22?BXoZ+q{F?1_ zQ(Apo3})wMDy}0mY~zm?T32o-ZRhMkVL!I2+vdz~G!tVI-P>`FN=~4_X1>^*C%S0a zM)--6)8HW|@%d=}?l4k)$_H_JE|B>gV)(&quR2bt9g4N3>X8BPoHH&PYsUQ1jgMI%`;^xOQ&vV6c0TL#wMS~>h0DX5;pP5z zbbc_^66J?3?KYdFkau{5xuw~17%wCPf~UtO!h&x*b6H)1^U405xBW2{3V_=)hC4o+6mC^9c@rKX{*7@b- z(PI86h=S;(ARkHPyxcxoq|+Mg@4_TUEuD({LH+lYXxQ56U)a#{_=bl0J*D1v{LT)W zJ;UPRT?_EI`KUXxRq7=nA<_jet4-(iHt%ZSkaog2z14J|J=`-mI_Q5u_4V~>T<)s6 za+n@rZy9kn^74&-a2#^il@%5i=H}&&7qBe)p&SyPJ@n}xO;G-|+>kBR`*KV=nHtDN_07OQP~Gtxe)=;KK^Y}} zHm3i=^LcWE^+!@PS(-)EGu9_?i0QU~%`wyt_-dUSby|GBF=)+rG-nKB05r9fZ!K*!k zGmsxuDFwZhv3htj_WW_p2a%do3a%b+d|j0F>sr}s;`WI~ZE2Cc(T8W|48Cs}<)6a$ z(6xn8t>T-nXrWIGYV<@%kAF7)5Q3?G2iZ4FlIQisms~ryupU@fOr%PyZOue%rj^CX zNHKLF!F6##vu=-6$3;w1A+qCZpM!!>d23OTO$DU3Hd@(cw+_ay*G<Qd5?El_8%h~u>B8Z+nbu07#JGjstRS)Ep^RN|3{rb9R+Jk=S~$*jL=F3 z&6^{5d8R*d!wLV*ha2?`N^<#DZuYUebtB^U8a1`S%bUti@p#C@KUHW#d!M6c@M7At zKG6j=ZsRjP{dJNu(KmB_n9DT0vS4EJxK%${Xeb57O^_dqfrg^l=D^y_dF$pCU1f`U zzb)(+YUg+cJd`iF1x#t%=oV%sCINq!Q|*(E}U(-^psD)evnKQu(f0`6}8!2hnn)L!tJf4YYWb3Rasf z(DjGvS!px%BC~=f51i4$lcnzQ$-(>Mql3$X+4H|w$6I5M3$ei<6CvYut<9w-rXyx? zqv~RvrIfTpwWTqVp1=PhJ9Q$RRvjkB2)Fra&%)ivk(vB*sX`To7pXyr`F$Bcl)R8l zUukII@F|1Q9spvMt+`N$6IJbKt~rPr-IysmAamkHl!&^BaUCoTO zcRF`YNPTzrOugD+rt##tzAU@zZDI>`W|F#=MU~?PmHHSy zwL6ya08~o&Z|^=>t13lyTFtkQNa5q-Ge2o;q*_;QR>_}{_jv^HaRMvr%++tVm&Kie zYt6@(x~Ef@Vxb1U-D$Z`RoFILU3)nG*P1g$^R+U;<2ZSEHxf@U6$mf!MT-dqocOA^ z1>34#$=ycNh;u?O(Lc4n`940moXMwM(s+jV@f5v((*V0o^2u)P8-wbyfD|mdQW<;T zf1gR;4+O#bhLBI8zhDUlwt>I*qe+jpxy-vB>}+f((X^^`lq@W0F7gug!fr7kcK##F z)6?C>1U}V*F14nUX$AXT-901eZ4oK{)O$CT(=orfuwL=gX$fx4NT# zjEh`?PEY?DoJkj0Z+6iHdT0GE#?!-*W=V3&Gfh@4l|@V^dzGUnZwialzH|1sBoTJM zCngc~`UF~$jtNPa`>7K~3=YinxVXs34r0cf*>g1#Fm$b9f#Y^GM+m1xMwio#P?ZhV zm8fnHX!Q`BmPWh3JeCe|qm=Az0bzJr>u~zhWIPF%qcJC_5#Oa_ z?)y2ttUo*~NZ|0tpzC{a!WT3BQ#fZLGP1wL3HqZ-z;+qgCT0G`xw?E!biQRa!$hek zIZ;JUQugU&ZF~}}M<6(Pmc~nhrAC7)izX>9GE^W5Wrz}A1~a|wb{O~cHm5|Y1m%UB z{D9H?Z(YwmMLp#|8k!&PF*^_~BbYU7fR0P$a|ClrTeDGxx`u{^iSOq*lPH9#y^D0{ zO0dc!ghe?@y~?`>i&Nk4iytjBGXO-O2%De~A&}=cS|3jwJ)~_ZUn)KdfYO_O{IPt>IbM1;NHBW};AwsF`KR`VFg`n$xq#d3YX|c-^4auU|7+A8QoCZYanmCR@;K?2^;Oip9L}68L3v z9S7f-9@e9}6{SMBZX^h*q=8Lln01(qe`Mhn2)kz7N3T>FD!%N5i?`#4XzY(|kR+N>bhhC%F@UU-k3$|@s< zFsWj4v|lWvWHwh^O*px|WyD&nEUXys=0HU#n>~Sx+eI)Cn#>Ld+szgt&^`CdGW0Us zcLjtRHJEqPOgsV#Kz%*Dtu6D9HurmaXrS(7MXS*+)6egYeJ7j@%KV0IUg9hCEwvH- zhN-mZ6W%C(;@hhCs9j8nLzqzp)Lf3%(vlx%Z^!%iKhH1Tibg1sbA3Q$%W}gqd}$no z<$`bWvU!Ll^4H<^(Kf8VCtSxmat`U519C94s%D9MYjq3oMO9^)~Ws{ zBjz3THY?%y%CQrXcRam1ur;h8*I7pnbp|< zB=xDc#@}RPXj<;k-0qLvRaN7h+#L}xIG*lL))JX_mY0@NQ@VR<{V_?hii_d+)+|>_ z0_{rc`U*D4v#~i$?VbU|yrw3kS&L2>Ad*$O=x_=hG1nFu z8R#36vRb29&Z*PB@gn^rR9FhqsJj(^t0+r(&_=Clii#>|2%8sEKC-L66dk~=cjx4s z-zy9hd6_Yp*kg!ZSy|6xso8zl2!%CB~--)=^zt}=bio-fp1_gaq`OUtv9 z-e-EP0?9G-|I-}jDVh`!xB&Tgda^=y5BQsC^6a~4s#1C^BZ?)zjQ5j%Oe$4X4K~+p zru$0e+Qukj>j|CTd@3}a071Hi0}yQ(cC*-oQcw|6+$9ao@{lxJodseT0t4R?CR!}N z-gt3=1S2D(Us_c_pRVZw=z&onB3Wg-4l}ZYz5O%z=B*q(o1*f3aig*G1V6!uHqpcq z@XM=UTZ*9=Q=Se1*)jRISYll5j~Rm9>7{*ND?gV72o}FwklkPCp)qZgj)PUGz&d5l z{KU;Qq@^xT@kX$*Yq4>nKBnXch6=Xe=O6tFKn$L>T zaidZGm|z|eI2pAW&^EBf#R_o@L7&$mqQ}O5J*0iaMhV6y#*yh0{B{T2a`ph8lMw~O z;2qT_69M6$akNW8bG^u~WsGIPYpF6-o#`$^3SsV6`IZsZ6Xz=4`%k>Zd;Nk?;TB6J z6Z`@yd#X?L&xR}O=n;`|$RHQ-4~CuVE8HOOC=|G2cmn~|HzZT&mSQm9k=8oog2Fv9 zs1QU|UQq=^k-;bajK|pTS)Il)Gb>u$HH|z*Y+Nt|K4hq$QnQO#@Rg9PmrrseiVZ6Z zo&2W26L{Y)Ll%4#+idZ z;rW<7>$!Xv(GFIzN(E>yDZge|B(k*mEUEl>Wk%5_839XAMdgh4jvbIzcQ}!%-2b(b zOaoRB`X3XJAkDiVG#3(7W{q@@H>|ZDcWIHn%l*iTAf>OvapH$FW6w{Rx zz2WHp_j@8xB%gJs(W6>xhGboD{uwA*#N)HGf^h3bauF$y&)kRyhQb1a{ZI|NmfQ;8dTeW|^2(QiK=(VYAS9Ez3e<|1BEP zaGz$)#H!$$9u|)p1f}{*{rhSE`}OB{1lRVne*8>O!(Cw)hn|^BJ%qjaANZa{L)Of{KS8%>Maw%dmS@C(a zM@I7$x_vkzjDJm-AZP^mFqhkZa9Sm%koC@-Bm)8S_51QK$+~xs?G@jq-6rzQ!adl~ zll%NQA69E`>fgfN5&}2N!$D4N*W@lOO!)>qk8C#c8QN!Lamm!uj3it_X=UY8`uG$@ zPGOo@seES8CT?tQC{HVAlT+B**aRqMRhL1T67S1!cJy%uXrvD6h?CeXNh5_1`Rpvu z7ephmzR53|trl`e_op!1!^0;x=@W+!^8RwoPHP>ntl^$1O_*&}Vpn0kbmyK;p8l0k zr@uVK_}Ij8RXCe*RvS8~timcDlGtc=5VVXmB5caV2s- zL*j>Ls~6*0GSNz1>+55^M# zc&`6FJeiq=iBVB{7L#kmlkvL+61%`VPd)sn_%ks|?8BMZi15Ez0VF9RsEkz8L-gaP zKLW#-R+E{n%rW-qrsrRE4C!0)A7jj|V->~Kpv6`tbGDu3Vk0c9j?s6k>2>RG zu$lA5q^1sUTGv^sLqeHBm?)CDA1GJr-3+_tOmu9u*Ick)N0rdRnB(v5;i8CYY59v~ z7Z((Cb$0`HhT>E$`1lXtu*%RGf2E?L^jy4L#G8|VoVde@*wME<$JW|G|9I+@m=UP- zaZ3E!%2QZWbb72H$vaEY$@uhka-+^=T)fcGbY;4tywMMO)BIm5um;>7!ZUtu+mab?_rrRo}5C6 zO#cxvl-usO!>~e0F^VCDFD5~LmlX9zeYL^5qO9hK1exeN)riae9ex4!T0m%MZGkrC z)KPx;al|ZCWLUa@5#}C?8@s8OHImAOh9^Z(;S!ppMxU}}XxN7Wm>ExYV#kUvK{6Uh z{Ca~@g}lY^&t64}{5M=ES1}XTNT*6w{wwLlmQk<>xTYXqi_qvXV-}lN;x4B9Qx!hc z$~2L}<{EVYG!F6z57Gr{ypRpj6#5u`t(7_qn`$)kCoRBO5>Fkb$J#UU_7>gd(kteUzw z%K+kA9a4#a_S56Xj^?=d-b4##!CR{ELj=xj(Ss|nq3<7(IN6`m6<=NZ+pwv*z(tzm z_I${hCob9J@ogAsi8Hs#l;m8_7)}oCT*wu=b$1#!iTOa?2zb807D*M)#3s3uIYWW+52p6 z>M;cI!HqLtAuO1-_nW-!{B)eYVwp#LxOc5{~HVv?N zQlM!T^C3kR!p7c$&W03dLJ{>knkf$m*eu2F&YhNk+}_Ex@$TMby0RphN>x6Cfn~3a z%l+Z_p+ZdN^Sn0QqFoZBqjTCRX#H4<>Z_LaCYw@|)eNNkcvqlS>u=%TRXHEM(>s;9l&oXHvK& zkGo~%MZp0M5-0*fpouNYEEL@WfYjg`G%E(oEE{s-F0up9wlDOUTuJ1=eN50?9LlEA zdPa@Oi&$LBe3A&Y5B)|!9(2!FkmKh%20IFqk~2b{Ob{tIP2B(!W`n4Y@v5yI3m>bj zpg?(fYN&THy5sAQhJO&196g-3YjA|A9Y8~Bv||amOAr!GXix!?_gK^@j_7;bsIaj$ zPruOQ!DHCrB%%IAhNqj3;gv_fPy&A9sLLPs4m&-fr`0B7^)kJd(ug=ZnWqc+^0sXV zZaQW2Qx_L3+He#m5`^GErLAt0RcdpWLnJ1&?IQ z(qw1o@Vc?t0T9d!1WF0P*#J>0yzyW)#Pp7wf#w)hEI&BcH1ogD39*-d=i!q5WTvM7 zsI#2<6J?YY(j`vZL<0xN?>H(ab&0XGBQs8vpilyKD{vR)gPiq^EO7STUIMp5__2Ve z2CAwg9CKpBK4-H;mFVvWB&xQ-d2%d{+7hiVe;H#D(yBo2O?Q4??%`r<*bO98vd@|^ zxd&nfu={io@(cc5ohok%Oy9mG_()9yTv?PKKENX&7`}v85m=7E(ZI@)lEVD+a;ml= zF)@>@V{DZg_hqpP`y>d7|L-m68w1cZ4ER5l&k3Uuu{kVl&C}3q^d}r~Irx|B2)WTJ z5S?m%ui|)BtPuTX9J>==6k_%mSh`9js;Yz^S6Dxd&d!LS_>k=$E7;YmF5S_7+3IoMH15gzy9Y-(8|O?b*Yl zTv@U|bN%n$)y`r z>DX^tnDpe4%{)OXHemH7U`sB|ER2mLD`OKB=lZu8&k?cq)p|bw{G|O@g*`nz$W@h~ z%Y5P$foGNK+Ljmj#YjDWf&Gd2cS=eL5e>UPq85JQ&CT{j;qQ?uxC)B*eSo`qOReQ4 zteYtRUCFmi(>7RYShkk|^7tdJp>gS`vaT4SW9iwLSyJ|CXd^ejCs+h3UQPJCsl|Cj5d@!TU}5;_+1P^9Esc#+ z;^LB0qf8sj_zplE`SMU<@oJUklqCRu+_(RQ(=09zEd-7UK{P+FpI` zWZg27PAA6=ygK0*i9t{0=B_rIH0`g970UcF2~ePJv6-M+eDn`F1J}TT=GljUzmwAy z>7f?UgleNM4Nb4w0>NQnf57@G=qJ5y8&J7Q@s{qh550NW#tp@}#G#mnF%=Llg-B&| zZ^3N6<**2Yg*sH_`=#Z`U*({5=rdJSR+^ieYiqYTyE+>h8J*v{5j>uRRR~3-3y2## z0lcS9Y`b#%j)}2puZZ{~_u%!v)3R?h%Nzlt?dKu)ipGvMykh!ipIG|-2U;{%`x@|| z_TAke!E;>gaziUb1uT6Zf0%!1`#?)hF1I$CzG4iSm=bf^xNUBi=8OU!BQ32dASGDM z96BenmrahzLsuJrvc=`LIJ-{#%9#XO(5FIAbop_hp8zZ;{pJ(T`-B^rBo?dXRwYN{ ze)+-}E_(|QfVp|JXZpXLtCQQiP^nT21NXh9iWmG=SutNfQs?G(;l#dy;a8GWK}CQt zat2;ZAo>b1vatmQAV1$-q5?oea>N>`kX~cDP-aq65+VY^tAG8JcMSd?Q=jZm{ADWH zU0j6+V`m!Qfv^7w3`$5ykh)`IV`pl(9(MJEJ){ty9~wR`4q>$Tn!Ku_S4?j>NtM~C z4t@M=nMHD=eQCR{mKN%h`lE96`Ss5pbp0jub`4f3k077JN2ib6c%f@EAYS&bUQ zv!f(}bfpH#Vdh~%hK7hsA56X?h*B2cp-W3kQ~VYNOiBa89K79rLu<|21CfBxid-dw zxc`)uW~)t%^K-KH5B_W)90^LGefUKE5p+vQvqk8pYWhFxKb2Tl#r;^)hO|@#Wvrhj zE@hJHV7;<4EpX)79n8OAyd2T3Z1u9JQpDxhwcB1zPE`NebLq#*#jayp!F8T^GrcD(|_!*yE>mjU+AptJL1 zC^4_5lG5^WC(duc%a5XR-WlOV@|Q&kI@E4@=7yfg6`bW&l+2cLL|rtCzy?`0&QmNK zwdyBB+KSm+0shqJTeJ_MQqdzw`25cFyQKYrfvj{T1gsVnR`-ptyqrNnr26uLK^fz) zZY@et-Oz`5W#uUl%qE^c36Ng91RxF2?Rs0or)L-~w8+57$Y(@lHE;Z^vniXRGf`SK zuPeh^R<>3?A-5z;Dj*&~Q8p+%dlFy%12fY^OiV0*c@(_@J@aQRDmqq#6{7KR1+YAj zRaEM#B3>6ZG&hd|CsIm^@;8~ge?u_|N=TI63y!Pb;^>fYexBRi1LHi4}9!!pAS!v8PTt`xx5`Pl?nme@qE*5T7G+j9V@a1_8A#*r`&qcY_ z$q7CEoy#4F_$DCO-zo#tx`>jXAjJb!I>V8Kq{Mz1NtxP;TAli@EBmYm*GJ2u0Y*k5 z2?=jOzy$$3#{4PaOsQ9ll9H0v96NNi#aHlROHwwChm4F2m}kr;{b~RgwU44k*^NGp zn@w+M3b+GnO;$D3AUP5@2P-W&2o%7y=)y+-;l{>1xVO-!^OqIomgZZDyw-Zo{&OuY z6|&msVZy3(o=HI^l|5T%1h?PQpyV&){a`erHQ!!_k4&^x2AUcn?H_kb2Iv;aE8)!q z@38fCimxKDaNbIPNFEMEzHj*QJ0}s9d2-_4`}D@;4zU7a94F6=pz;!kkO~uM$Hc_U z9xsRkRRiJ;Dm-iqC-@w_%Bjv6z#q9i=e~LH?t$4yv`ZVzwv3SXSpJeNa=$vLC9I;X ztlnVru>oXK^^vqs4i;OwFP`D#d%L~(-CHzmmONj#w@|7ELTU~ih{*)(q^s?PxeIu= z0_#uO;GnTNL`hiF*REF&@%(?{=(O5b8DwSQ5HSvx9owf&m=C6Fys0a!E0pqwZFUdm zDwG`OPjRTieA+gtWDAX!si~>oj^rz3`)!qdQY&ZwWpQ^K%v?anOWcGN8)k0Z{rNri zYXuk_LxWovSMQ4#MZFp8IL68}#=HnFZ{BLFsL(?HMIP{X_lj0&5KW}_?ws8=S6Ab5 zG-gFPed)RUq?b)-x}UVbrC0c8crZOrPKO_QA1ew52C%#P`(Ca6JJ##dkqHR`0HXu5 z|4t~gZ*UTBpX#!dQ0T~8=wq@k$v<@27Re^N`47(?h0#1L-;8<>a0+Xgi-kF+>^2jr zLZYbenWIsq;P;-cN;uE{)H2I|YwHx3l8H?(%r4^#d*n<~y!R=RpS( zCkhIRoBNwHrJIA}b-=oA@pZSg0q+Tf_5gfm6=vqe`Q_ru3S~MxAd6IYxY|$qd`8<9 zm+s1(TFWsdwFVVwwFpA76g9$yTa4S zPmnRN>rQ0<786qX_x?Fv22MV`@85%wIXyO}zIBSHb32mpQe-=y8aK9>HXZx8 zJ(Q@swgNu4puJi7Wir_0ND>np1EQEPyZ{1#$?@15q>2a|4aW52Bo3w55=KWyty`hn zGT#*EQ>ik#xj!1Z`k}N>oq_Q1^F)FTQA|&c6AjM_p9G3V5s8f@7vWa)@P^AmR&Z^IPCW|eY7McIcY`A^;^M|1>9W|lkCzV;dFOIcbM-GX#DJa7y1JJ zqq9ggq+0|Xf^VlnNK9fKIPm^>12|NH0y8f!?}rakOk@xOp{v9+Qcz=Ee0)|Ew%cIB zzpdNJ=ZL5%HL^$H`P-=XfU)ALMX%af=#2oFgi2as$+$n1pQ5 z)>5L9tn5fFxFLTPm~Y;p z6LccRcV8~XgW?l8VikuaV4H3+a=e4&=|fk~ol}FebG`ahnOb(9ftbskOrTAqI9Ak? zxxP_(X5r)3xP_(Ru?rXGiT30qyD=E-qSj}V|JG@75&>P{yytbTuK}?x$w@|r=kL5K zGKtq8=vZH~2~%tW@S^9oGFPznzgkEUs~`hbeB|U}p}V&idit9ybD#>;tX}CrDFNL| zHCrBlAbVmWu22HTW&tm_o6~g)vc$CrXciQ6NEZjQb#e?s6E#eZPY^lu?D^~0DabYM zM4afaJ>oVfUJH&d`&FV%m=l`D+bEo?zYxNSk8gvoSlTD@)8Aa3^4)r+MW>>Wo>|-l z74P|vqX`ofQ64c0R@MgO(fHAK?Q#5fp`VP%-bZ(=J--d}xSQkKTNyUPlUxQ(eq@hj z?rHrJC^dg2&?kR2WI}sVPB$=zB z{Hy;+yM?}0#7e~H0mJ--ewOl{S$BZ+;O#5Tcj-pE(a*o%Kx_Gd6@lU9R$l9g(s^E9 z9zXt*jVu@gP$|l;trZIDE0d3BEL@-4KRMBc*S2a19a=4o(JeaQaB`wd2kU1*d?sHNHPnR=;&!ce{F1Mh&B6*yj?-j=u^RmZbY2du|W{};4Yeq zvI?LgP-H{owo*K%o9QinxyXDUDf6pGB09dlB_Qzi_m>QDi{Ji2=cXuy@$XM6Q!>4? zD$R2%rWU0@VT)3E)Kp2_VLhDv&^Wn%e)8u?CWZ$5Kb+m_zvz71M1X$uJp zqxbJ5Bd(}m?Do^GvJ7?)jx#Ya2?`48@0Z*ZhcG|OO6pXYJ|3ts=(IX%nqTba8QShJ zr12T>c#+1w`rxCHZAfRu5Uw0pY78%^-#;*bf`Or^sA|YKkB@IsFUIumW$x=d!N(VU zm4i&g<>>14OmDtM&Guh#H=_Ob$A#A|MBJCVGmQU@>8i-c$fyi2JN3 z1I4X<3WK_5PZ4>&B5ezl>)(q_gcW*~;6KVzz*=+nT+)nB__RtoUbCnhJbu{Wx# zs}rT)e9ZWt1QJDfm5x4Y@BhctTgFxKh3&$d?vQSzLqh59M!KX#QM$Vs8tDemAoehU8=<39kxiX}tyA4O*=isD1$_bb&%Vxk$k&BjAkR<~2{qgwo_b(de6-qnk2}}GOv?}@E(~p{n1A>7?u8xlT z_t0+RDJ*Q5zHPFfkH^jFhU4?H6+0!6?S~SZG50oYg&d!fkc{k?>1+!UMyk|oLrXg8 z0dTf@^80tBO)`e$g>ct@Rt_=!(%j@Q5W=4n{toT14c<}}t zWht`{F|8}s3YUGO?Ko9EUc{FK3;#2-}3T;=G+TE?WP|Z z9r6&eB;tp{5)*&LR(}LQyq=L?iI!(DMD_3fj#y&N^>=!cCG>d$6beu>mu559$V#*B41cv#+oYSlRhuD*2r*9~l z`2n$J;Lct4=Ua5ND_a(-rX2Lnms8Ed4?#LXoq(7)c%1CN7w$h#LWcf-|LEC7e9x-w z5)w9w#uIu`FfpUeM{-bFCH^q8Z7$9ZqnS1*B%sM8N3Rlt&NH@F0oB-cuGd#z3JTHo z^OAnFz>5J>?fLmM*pvo%sG8jq)6;P%o14FW{Rh+xk*MQs)abO|`-_Re!~IVNPCP*J z-{Vvi5c1Qr`-ezQo<3WKxN^?^#zwyEaZE%kEh>e7v^F+~I)ekOD^`q9{aVm7F_{>| zr`YCRj#rRA;m=c}Ks`LpXI9$PmseI+J_9fkKG2lhwib>&I_4=5i*ziY+tI^g9(`uT zc+>e7P*j>r(X5F7-HD^`;nmz~^myu{=2?F<<3mXh0D(XP4$O)FcHCD(H5U@p#iUO1}#e1h=#$t#zrJv2M|ESXzC5J zbE-+fS=TT*@&`BwL>-IN6e~8>PI#je=WJC1ycm;QG11=M-pT1Fc;ui$K0&lubwKI4 zByOs%u6}wtDg^4}6i0nwiyzXH+ zp~Y^~M0T#qqAeb8I04R5jil7M2KS63OnhQ;$_r$&Y&dnHFrDB+)u#ayzbDb~-hN_{ zz?y$Y8GXd#TeHnT2{&XSOTI3#K@eSJe=;Z`|0If;HO z2xg=VTZt8~V!RYSK8YnoKwSC9-V)G;xZJQ)@uUSSJeFeZ7oZ|0WxhJsHXxbFLlPyPb?GO^xG z%whCrY%E9Q4sa0`UOJkuZf|}4{C9p_w|04czELtbOg@fEvWsLrHv}A`4DD!gq~)e2 z{&qR?Mue1orI($pnt#1M8#RJyd59B0)3X;2w$kiu?27nW&F_&Bet>s_$MRov$-$bg zU-%23&E)CA^h5s$1wNtw`SH)^VEJs3M-OY~f@*bI;8o3w8)?pW!Q0lBYjP7Y01pnL zH1Zlg)*CD1xAoG&%;Xc8^K>so;gTil^=E9=X?XdbsdFw08;9t2SzOJ1RM~ z{-9vlZD=v}{rQwus{__E)93nh?lH;*C?CVZxIV$&;ePUh`xZi=m@Vu^(kX3g zd(!zG5L_D@d&kR*1_xn{NlJ3Dw^z-3dE<*13V|TA3BSR3snY1>WMe}VtA+R?g3pmX z)kl+&54cp%121>@232!wAvj*g#}rV+IHrm033fcO&`(xoy&JX7A~{O=5|DtYvh{%8 z8h1aLy!F?BpJJ5|mjC@$#{VJ%mIeUj1!L{^;vT700RbT#GO?Tcow|IQn(G~KcyYSi z?jZBwZ4Mma8+rlQO_kw&C6djTSTfPYxv|r@>x{a4lW~)Y3Y|A$`BguDoGv$4X6CzP z@~yG!C#Iy-drg@HuI-u!)g5kefxUXr<-6(<1LP-PAA|mov!`M z8&rpk8ovL|^LK1u7fevMnR|>3UIHVFa46ndZuB5|?t*DhU_Pw->arjf8P9hftBXoK zPM_P;q^!hW8*yvWQc_S%I{Db++19v;zU{dfa&o@MK#9L?o;T|JpRKK9b1#o6EFCZ< z%r+dGQ;BpzS^)aL9r!NK5FiX0%w*SJ`X?tZOAC=OYw_J6=r6FIt5|9)F8TQv)C)bW z<&?O&UAj75ci|Jr65>0q_r@QXu+OOEHant&4@+SXLhSndGuY5rEw+t{0^=M%VsC{ZlbLo zY6|cFjE($iY{ZE}O;aqozb0rFP~`#3p~Ua;Q0QdgV*SzMP3MbjNO-63b%jsd=_wTz zSodF6>eqoA3DCj|yNB^u|HD=D^z`PnTAW!NxZfxY2OrUeri1aorw3l!8R)RSNw$zz zqU6YWcQBYJcDdP)fvAMsxdR%&4D4Z?lPl72+OZqKTlwHi=;-Z;3vGE~WBFiUy$I5e zjE=he;z8hHPEiV8)~55se&wq>z&QcqvYk~w+;*&?KzBpA*!vrBAf}m&k}%BLqSAj z`%oJ&xYgkhOd3Y|uwVf@8_O0R&k_Wa3jii9e0&Pzr}me#qQ1VDryKGaI`))__1C@= zI-Q^EVvW6#k=o+F$ugLv_Tq1@y-ob(dqxrR*>zkuc61$`O~Y*JG?(Ck!rz*WkN8Yh z=jKwK3i+90(;}{)w(5uNWgp(-P9GsOe&gNa?Z)7O6j4NoZJ!0cDFdDEYhvzgb4lRh z1G7+O#9z}xVccs<=17@wyn{S~mST*_f9VCNuH2E>?~5O1Hu+qOin)Z_j#CF&+h$;L zY`nqFJ0tlJ-VUK!BISJZU&Z?dMH%$!qCT1hUyE2n=A(h%0tA|68pT0+%~_zD=L1`8 zcvP!B@t?Qd4oY|3OvR6`hToJNVBZ17F%EkVd!r4EPy$&qvm#<{?zr*!>x8qz(^u5g zRZ-kC);ii>nc*SHip5vmf!yG}oQd}hO(%;URfda)=aT!3U#I zwwgbNDx++;mw!!Ar7pP*V}a55h&PQ3*!`OXmlS01LA8Akg(*)W$>B8O;V|;??#YA_ zFdfcO+CK&B#qUF);kRBS7plLO1t^QXkrjJg-Fm^($u)Q>RqX=T*#i1_yY|U!YSp^K zl2p`4RXCFNrO#B|9?rEn_8THm4 zPl+WFN@-MnTU!PEKb{ozgHl&%6G-;R`p4`1mUOe!*^HXra`Kd(8s{wFNq9P*Rx2N3J zSNq+;;azVz7y?cD%1t<$-0y5H9pl4GaiaQ_R065w;L6^@=yXd}pSrsA==;D|N`KwObUV~UnE7_hLHXMxIg zhJ_fpNu74S(FV3GrJo$Ix^Z?(4qxUNlPh?xd7)#?rzPt=DbI|dWL3@S%9f4kw7hlO ze=L3QhkAoj7*iL}A~vu>7Bq$U4BbSH#%R&_G0+F8VH(UdBQN{TE-uVcqvkHCi6Q7v zi1v@#_<0-PIVTbhs{F6xL+|E2c4&a5aUQ4mm;DiOfV!`>C_))+8 zEQ|zvMivLEm2W#>hY`IGTwGJ?f{x8uL3+gO&wO-mYg>+Wmw6L_JwYJ}55LB^8BCPCq6rSC5O)F-KdA20&z(GTJN#;l zIz&8xQxVV*;k5ndm%&DxHTTnF!B+PZ&>OWZyImBXL1G%5{l_8WP?xseZyp4Pz(~OQ z5A_Bc+cbgs^*RGQHF1>8SV>4BY3P@zyss%NnYDQFEMA8p;BZsq5r4J@Z-*cyH)oIK zdz+FaX@TyGMfQE`n~g_LI0|4NKVJJ?-8GQ^eSC5T<+DaeeSqyjcRndW5=|$5aaSC1 z+ORft2eGi9_i1ngb>!8_l#hzt=1g?kDVQTHPegYo`2De(tcod0Qz8& z@wuV~kJDNK%?JnxVCK)wAa%y1qND%$)xorv%ie1{50X%#PM^K8062u|wWfs{6JYJf z$m4zZ8Hbp~jb28-#`7jv)s*XXu2$sgZ5cYXynCqBZ+gojcmP&KF1w?>X<&FvkfFfc zpFEy$cCN+)@)V=~8>I0Q}co1)S40 ziQum!*SELIXq(0TaNKtUr_0nGFVAyTnK0|l=O?gVm?{4vU;ImkjxyEPi7)fZ7n`Ky z?;mO>mY0pHG^18;d<8$P=QX?RxgSrgPENiP6)jv>`cYNIlBndj^h~Oa92g-hr{vF$ z^Vl#xtjJkHSXNc2Cugk)REDf4S9lHUdTyTgqR60;Nl=QrNxsI#r23~!J4ew%A>w>E zc0vx?`2iLK&ez?a?e=m~wVSu#$^4ZKIwBa5H8cw*e!roVtme#2D-ZfdNSPB{P|Mup< ziQnt0z!yR>UHGmtLXi&cCNhc?lrz=Q?}F2V^Lkx-9{V$jvCQu5hKZeJBUX*sh#p!QhC2=0)>kq?c!V4upMfaq z{C9nfin%wLKfbd71yx*bW~G;WdS-f5pK1N#Yv4v+G9?hlEz5Ytw15_)ggj4bz0iZ0 zyJs=%l1ni#cW*KVk#jReU?xw2UYAQx>ZPhM9|K++le@@m^n3C$@gz$$A4XSqQf_Ni zT<~4Ge1f(HO@){ivv#o*pu;bnP%rLClNtWP>^jPAMW&zO%;;`Y`#gg$W3xM(LTsee z2~a(r6qO`|XM2?*SGU$6sV^E4wTBzv>%Xp#98e32%&!{t!f%-~0d`5HxiMqIW)Jhe z`X*pB3tUMU5lt>;Z&`OM{m~GQ(%U98&HXNi)9DK$1en2WZ0vP)>%lk>NY^*g0a#iJ z&Wk4?=H+Z^YFav$O~zwMvVSJ-vB+g=?-PNH92~oK({%sUsuIz@zjYP9T|;p|C1( zW6%0-HlPHRvzifo8mjPZr}jvENX8;RdTR=fO?BXXo74*M^x8-Pc4d zS40Y;jp(beb!5oR#bu-?j+#s@reJ&Yx9Y5mZ!c+ydUuCqVmBNtDRqX{4ACTgpmBv5 zyx17H3F5J@gB{WG0joDsxIEp*&6{zY^s-YK&IU0Sw5W;nq`a(GDTP(clAulc<0co6 zG|eLuP%J>2=aeIX*Cf-5jZB=7VeYO}u3glO_G+=Y{z#(&S9bG3v-}({gpsM68<##< z8dvHPM{QV#Cjz?2bGZe7_@twN>(9({IT&qEb55FJ*L_<7h|UKwISu4{QCLgeN}ykF zCNRu~2sEwB6%9pJIX4nt!SDSqSWuvO@y$rE!mg%#Ie{_k=Z7JT&OWe_uC6|X)x2j6 z&5;L@Gm=7U0!N5?xzUP|un6OgQzf<7GXwpaUA@{b z@W5Fd57pI(`A))zZXd^f8)YwjmE4*F$#X4-ZK4EYmeT7X02B%T(=P$ro3d~9` z!JZwIh^fM_nLk_>hvP)+{LYZI+I(d^i-b2%GGWSF8fX4STi za{{QEDKC00PAtP}aiPa-@1gS;&o*X5mpQd&0|UcraaKpx4yw3F9WEr1<}>c8J&a

&wD!oh04e@8Ma!(R?s*mU-7lwJ#*f+_LBVNq47l#bQR|Z z+v$8mhXJ>$aAg5o>r-IPCdT~K`gCvRXP|JD?6Kj5!*0nNcext(Ey(zY;Q0-?jhpgqh`+FGkCHDxUb+#xUgCcH`rE{h>c)J}pX_Eh zL4Ld^>3pCNbR5>CzDTq8VWvfWWW|jVO2?`mtoe+w=P(53Xomt}h^>y=HlAyE!@F2P1LjSW91ja5_>NyRr@_%c`WG`@i2 z1>r^qa|^S`{>^S_x#bqGt<6yGxjDX^oR7pDS+bC19I^V3mF~s~%>103#DPK?TvqL?gr)9`RzIH?fysZ|HD?KD z$Q>teA?nkIFMgAEQcSwRa@QUi8^jMw1p=<@7h!G;WBP&@xyTB827*V)#>}&6_%mO5fy6ka%tou$q&0SUfz`>k zijZmqjV#>wj93vKN+(OXPyH{&=8De68UDhZYaZm(tsRSE42%r7_mw0D^Il=@ROy>* zKnFL;$vkm+`lljv!j6=2v#oTkU;Uo-e>wXWJc&iUOav0qdaWR!0_r_ocAV7k3@*o!s!t^GHMKqGV}CJZNQJ~@pDYZT}}R) zKxP7Mh$48eV(4t|Gi|dm#pI;K7x8rh8K~^rb|&?gZW0iXk(W)am7)a~9{N|Z3r?c> z-Fs6hUj>D-T@ooDk=J-pAj15`npS4<`DL|nc^$6(YC4W;^=Rs6ioKASSObt-&DYQX zswfs$lt#&j{J8bRFaLZ-z=iB=?QbV1W?>Gp7fV^ANT<)vUAaYG=p^C+O*)uBMZBx@ z;P9lgr%z|G&*=~08v)x}9=$VrFo5 zKYX)#I{B|%OFC{v5B|5u(6&dvu0-BLcLW9BwFvEwy?W2g$7_AWJ6bN|E;A2@ZKo5n z_e(+?84H#MjiCbBs4?SHdi`BX)g_Z_^9U@7wOm{00&E=yYW9N@EI9|uDlEP3x+17VZ57Aw{sFW>xMSn-vQ29tR~0q(f=wpKK9yWs z2kenH?!Nc0if%kWu9D+wzBsbeQ)8q2pXUv&7xBvunwa^jih-ctaX9fNUEdHSQWRjv!F&SP>9qhw^X6T zRIyc_wid=nnz4O1g=t(_uGdq7njfE=LN`}J-XD`tH7A4aSD!&K*sTlj z%&I{V=0v_4mkyutX|U`HvQ_EZseDD>)%dZgm{kC;6cp5Z=~+0z$=R{#RZYw1EM z0Ozq-X#NPj-9+Od(!Vb^=YE?RW2FJ%rIn{LZzkls3sAGZY%6J7^Ttv;YD-!gmc1fK zSbN0U*z&6{=||14;+DgW{!lT4{YPo+aBchY<26RL-M=AxI1Q^sB;N9nk~i2g#e1x- zylfxXC_LZN{tTKbLKQHb7?J+z#TNTols|i-!HuTuF@w$%!SQQP4|(s@6=?`Q5dA&@ zo-?mGyXPo>7E@S{zLdF5D}OE=FLV>lSgx>UI#3$RK&A7f7}bK7pirM*#p;YyrvuAF zRto#TT+;c2K%S&+Vpjw%{25r(u(MY|ZDLG{8iSwVArcW##1f+%3D%)k)3pz9N|Aj` zJTNH{jh<*}od3qrWkgLzRN-Jw7#dobYaz)^$=8yQjbG}Y5-;RJDE!!9(C3r$&ga8U ze!?ucFF!wcI0&YgM|h+yTn7c-)8}+wX3?n);F6Zxj(R$4>LG=OC;RA@m;G}W$$)zZt_*aXa_K& zSXjXCOHI?mOj91&Ou(tpv(x54WCmw^tBdzBzW9S0MWIco=v|-Z%UPYkX*ODogdm%ecCHjc)$Zxm&Js}}b*?c@_rNnM&WaLMoe5_Hs zHxlW0QWxT3dOQk6$L8e#z45UufwE4t-2QAXzYa#X!YP%t|Lwv){p^)Cp%(t_(X(Ci zXd>DU?2&c2UBSu~(SCxV$}r!1qx=X`NnERPMFJmpTOMBC-0SPaxrFLf_ZZC?jd-LA=aetJ00q$MHV z?RQtzi*v5j-jpUKoV><+x(`mNS4rBfavKJP`99Z?p-H_bw7|o8V{Y2|-W*8WGYXoH zDMYz_Jny9bQb3o%V*~2ndUxtAr~TJVGW6tM<8Hcc-L9o>DYwS1xakPqoGi{%s8|qH z25}3gYxixS#ZPWJA~~0n1RkQ4X1Q6<$HYXG(5y`K3>Mp>*I#ameM{MLMSxQ$Yj$R2 zlvhcRIWuSr1l;a)gASKM^(C$A4OmmSGLlGb5g`*7H`fntPYq+nK1a&BH7lDN2f-3Q z(PImAivE*(lflk~h!6)V4_~Bisoz4*)=UI|)9t@Wu*1B-;MHs<&^iK~QxE&Y{K3>S zu~o4a?7efGo4s5$gLd!hzgne-bCu!BH^&Ry*4w}z@wu8@(T6w9Mtr8*%wIh>zZ9IW z&1}nL$u~8>82*%{9~uT_(Q`Huw;wZ@5ch~{a>V(#8{hIb+D_DZsk)o1s-{+g_hOJ* z$aym_|I0b;Db-yRN}IPXl!OIVFaD7Nz}j$tTBx1QmoMSggcOu*_rZb;X~%}O%9E{A zSOH#!zYF~cR<|MGp!PgSAd%Vb8r&4=b`eZ`LrQ9lwSR6WiV$TE5`Wi9PB>}bz#7OL z-GqKkG(xN(6&Cj4i=xDZJlR{Wf0>kYyW_QG@pbhU`;f{J)`yb3(vN#L?I{~aCPEV) zK&6mylP1a}+^T!hLV$#D2?wpQZ@)kH1bh+25UGiO7(Oh4lXH`H&x`%%69=LZpS7&s za2!hUXKrmVkib27d%eD@f>=>q@nXZ{7|%HQuk(d^Wfl$rg-X=BXhMX`3yk={*c%^D z7j9HFR>=wk>fDSi+R@NKK%OMW(aFuY#kIVy4kK-NW0O9>VZy|aUUCXkCGQcStSuQ` zay?zW-FPwt1--mBR#bUX9BS{s+06Z_N~>ABEX8p`%MoYi6`Xh>%^3jdesM(_)yc4> zD$%674Dksds2$qef>H~x>4 z1B>Q&zs!=TFTCLdlQJ$`KXC7{wRj)cT3i3BMg$}rTbwqIK>^c@Q&LI2_0svkECvx# z>Z%y;%WBE$1CU8p{6}e&glI-{^HF6ualO*tMQ6KKDom8Uu^>H@~y>bmd+c!&EdA@I;Rcj zt6sN8=jJ=6?d+`VwsyZ`+ml^RBj&VW&1uc3B*H5)`MT{rFeO3E-;+s{ok2`&V0p?J z3jK*gz0B44>mzh!2u;hpzh4fARFG=?Q3y(yIjZ>nThbdI<2-O4teTw0@AG`S#-`t& z7i?#qv zLadK{lL#f|<|0&`x+nLv8XO%g41(v|2~Ql=RAocW{+Fqtp?7oanFfv4p`D_x2Vrq> zx4+KPLc;#@!F``8WCnxgx1@_MuOPucSEfCmEY>g7`Lvp=I@A!cXZYQ&ND)QFjOT6w z>3bu0hX>OZH6QOdA9s&l(S;qHF^h_}yDi0r$5F`URdD|zqX18?HepRRRendWgv;C0 z6=4y!_f1FsS63{}Z5=E%dZIYV%d0+C(Uggu2k&(wHy;+=5K}jfz^W zPR5m0-oKYE0Mx49VpggD$q{KO?7W}95pSa4kbb?ASL@{^SeeT1dHYdn6>)#K=A%dq zXUjop+}Vb5H(JrbvkUk0(dj`i@dfbl8Oz_a*=SYoGR@n2_FE*TY;kgGhARN;QuRS$ z;;|BN}joRI#?2+4&%hSC++GAHpfeI%(tIvW?Jx%O@eHV%; z$hm*o2+;%;x78@sa&T9KgS_2z`Chn;RG=PI@wK_z*hN0!zFNL_MG| zNlW`{h=H++Pev`Uoz!l9`Dv^YnIy}!O} zRhcO!{|-9;e%pXOUVkd0#MLsvt{^1YJ2ts@E%Xe_vd-^#lWT{Dr8pA{}g!nQ1s@Gl8hqc=XS0;MhSurFX{}6qCj`p#7bq zPJKfV$rwXEo&{RsJhv93|2RTVZ> zpwsG3DMX|GB+(UUzue|@x5=Q*5Q2=7>I>7!vO#R~4h#N#_4BKF(ORd=$y|LDSat-t zA_Sm!@0?p^pkZN2&T6s?rxudt7fr?vZn`?TQU8S}iADLTl#q4zD~3gNP5n9;Mr$dxX_z)(D~C?zc&j!AXAbI`p}8%H4&p!Wf) ztE{Zt_9H!=G^b%cNG!O5K4_SGQbm8MRas^MHK0QElW9T%USZ~d!$Vt^D*|<4A5>oB z-6Q*U=7$T!UH$UOKk6wbg7gYgV`F0cOopsgSA7!`AI;!0Nz}vD68695X%_=4G)2tV ze>YiokRKJ_!PvLa&YAkzgxQfvS+~4X7U)&iNHksMUPTau;dS}_9_JEsu5D=eJ3O2+ ztUP~3_}{4ZhGIyqF%&-Esyln&g8I$57kr9Av36>~0pc@r`u7Y{w|R1R)sG9Lin6O; zzkI2?t;rT>mRS6@H&f2N#%TxyCVk^Bjm^x+SWmPsnoc8C>t>FMa9rss{y7#y3Yr$qSpm6>AR z$A}&K4tPZb(&-%Eh zTGy__jLXXM54i`9+I}2(ahE(qoDTx|^wr2{1uVmV)m3WLD3%xnNxyoxFr;!TTWUrV8OIh&|DZo$XQAqqsB3D%{ zr$gd>caBK0nXC7*sL85;7uEnN z4qM}6H7kGE3;UnNK!_W!(P>pxat81!s6r@$dTH(Dhp78?Yko3G@JiCrzSS43N}1^X z-EthwvW?DLRZ?a>zrYHa&C<>q-oc>Rf)od>y@lBYuZff;ulpfGAaViY#PI~L2uK1d z;C$s;3;E|4vV_Q9>qr+8sJk(2S2T*_wPqw)nQBua%b1cda?{m)?j3l3<^(KT7GoT+ zB%+Pvgv8`nUMi!mM1I6=Wk(K|foQ#%jYcBUl!I zs~J`uX2PDXZLn<#)rlqqa=+GnQ||s1Kp=1dH#>ZSdIu|!!l^u*@C{B-G+W#z8qoPq zZqWUDz0C9G<|a3WGD^bC`Tq}9RPfl4FV)6>D%Oms;E9wFwT3QwIx4_-zpc$98%p7B z&H0vM9j1fjJ}Ofnf{%}{$B*+rS_fu2n}VqhX<*Q4i>bM#nUF0yDrTkCV*bRCKgwtu z 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

r!gnu#k(9q%X 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 diff --git a/design/screens/mission-scene.html b/design/screens/mission-scene.html index 4d537d6..df3b833 100644 --- a/design/screens/mission-scene.html +++ b/design/screens/mission-scene.html @@ -274,6 +274,10 @@ Ranges + diff --git a/docs/architecture.md b/docs/architecture.md index 8353907..0c8d8d3 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -24,10 +24,12 @@ own library, which `build.zig.zon` pins, so it reads every mission exactly as th | [`panels.zig`](../src/panels.zig) | The dockable panels: the outline, problems, the inspector and the others | | [`forms.zig`](../src/forms.zig) | The inspector's forms: a record's fields as controls that write the source | | [`views/script.zig`](../src/views/script.zig) | The Script view: the source, its gutter, help and completion, and the listing | +| [`views/scene.zig`](../src/views/scene.zig) | The Scene view: the map of the mission's ships and markers, its ranges, curves and routes, and moving them | +| [`views/scene/drawing.zig`](../src/views/scene/drawing.zig) | How the map draws its parts: the grid, rings, legs, marks, names and notes | | [`palette.zig`](../src/palette.zig) | The command palette, Play from part, and the game's missions | | [`screens/`](../src/screens) | The start screen and the settings | | [`toasts.zig`](../src/toasts.zig) | Short messages that fade out | -| [`ui/`](../src/ui) | The interface kit: colours, fonts, icons, widgets, the text editor | +| [`ui/`](../src/ui) | The interface kit: colours, fonts, icons, widgets, the text editor, and the map's plot (ImPlot, through a C shim) | | [`platform/`](../src/platform) | The window, SDL_GPU, ImGui's backends, and the C header the build translates | ## The game profile @@ -41,6 +43,8 @@ profile, a `game.Profile`: parameters, the game's variables, and the names of its values; - the records a mission's source declares, for the outline and the inspector, the fields each record's table can give, and the changes that edit them or declare a new record; +- what the map shows of a mission: where its records start and which way its ships point, the + ranges its triggers watch, and its curves; - building source into a mission file, with the map of its script's statements to the source's lines, decompiling a mission file into source, and comparing two missions and their scripts; - the game's messages on the editor link, and the script's flags for a set of offsets; @@ -80,6 +84,34 @@ are each on one. While drawing, the interface only queues the change (`Document. makes it once the frame is drawn, since making it checks the text again, which replaces the outline the frame drew from. +## The map + +The Scene view's map draws on ImPlot, which gives it equal axes, the pointer's pan and dragging; the +editor reaches it through a C shim (`ui/plot/plot_shim.h`), as it reaches the text editor. The +editor zooms the map itself, around the pointer, and switches ImPlot's zoom off, since ImPlot +doesn't zoom while the pointer is over a marker. + +The profile says what the map shows (`Profile.scene`). StarLancer's places each ship and marker by +its `position`, and says which are scenery: the planets of the original's table +(`create.planets.original`) and the sun's and nebulae's markers. It points a ship as OpenReliant +turns it by its angles (`mission.recordOrientation`), rings each ShipReached trigger's nav point or +waypoint at the 4000 the game watches within, rings each ship the script's `SetFlybackMarker` +names at its range, and draws each curve as the director's camera runs it +(`executor.curves.point`). It reads the routes from the script's syntax tree, in the order the +source gives it: the orders that `SetAI` gives, found by the command catalogue's parameters and +sorted by OpenReliant's order table (`ai.orders.Order`) into flying, jumping and coming in, and the +patrol routes `SetPatrolRoute` sets. A branch that leaves a ship in different places stops its +route. The document keeps the scene until its text or its outline changes, since reading it parses +the whole script. + +The map fits the mission without its scenery, which lies far off. Each frame it gathers the things +that would overlap on the screen into one mark, the most important first: the selection, the player, +the ships, the markers, the camera's points and the scenery. Names then go in the same order, each +on the first side of its mark where it covers no mark and no name, and crosses no route where a side +is free. The map draws its own grid, so that its scale is always a cell, and draws only the part of +a range's ring or a route's leg that shows. A dragged ship or marker is queued as an edit of its +place, as the forms' edits are, when it's let go. + ## The debugger The debugger links to the game over OpenReliant's editor link ([Debugging a mission](debugging.md)). @@ -99,8 +131,7 @@ profile (`Profile.link`), so that it never names StarLancer's tags or opcodes. Each shows in the interface, greyed out, with its issue: -- the Scene view ([#2](https://github.com/OpenReliant/openreliant-editor/issues/2)) and the Blocks - view ([#3](https://github.com/OpenReliant/openreliant-editor/issues/3)); +- the Blocks view ([#3](https://github.com/OpenReliant/openreliant-editor/issues/3)); - Mod mode, with Reload scripts and Play with this mod only ([#4](https://github.com/OpenReliant/openreliant-editor/issues/4)); - the debugger's conditions, log points, Watch, values inline and Debugging screen diff --git a/docs/editing.md b/docs/editing.md index f534ae1..aec82dc 100644 --- a/docs/editing.md +++ b/docs/editing.md @@ -32,3 +32,59 @@ A name the source uses without declaring it shows in the Problems panel with **D a record under that name: choose what kind it is. Squads, formations and curves list other records, and are written in the source. + +## The map + +The Scene view (Ctrl+2, or Cmd+2 on macOS) shows the mission's map. **Top**, **Side** and +**Front** look at it from above, from the side and from the front; the note in the map's corner +says which way its axes point. Ships show as arrows that point the way they start, and nav points, +waypoints and points, such as where ships jump in, as diamonds, in their flight groups' colours. +Planets, the sun and nebulae show as faint discs. The scale in the corner is one cell of the grid. + +A mission opens fitted to its ships and markers, leaving out the planets and the sun, which lie far +off. Many of the game's missions take place in several areas millions of units apart, so they open +as an overview: things that would overlap on the screen show as one round mark with how many it +holds, named after its most important thing. + +- Drag the map to move it, and scroll to zoom in and out around the pointer. **Fit**, or a double + click on an empty part of the map, shows the whole mission again. +- Point at a numbered mark to list what it holds, and click it to zoom in to them. Where its + things lie on the same spot, the click lists them instead, to pick one. +- Names go where they have room, the selection's and the player's first, and keep off the routes + where they can. Point at a mark to see a name that has no room. +- Click a ship or a marker to select it: the inspector shows it, and the map marks it with its + place. Drag it to move where it starts: its `position` changes in the source when you let go, as + one step of Undo. Hold Shift to snap to 100. A click on an empty part of the map clears the + selection. +- **Ranges** rings each nav point or waypoint a ShipReached trigger watches, at the 4000 the game + watches within, and dots a ring where the script sets a flyback marker, at its range. + **Curves** shows the curves the director's camera flies, with their points. +- **Routes** shows where the script sends each ship and flight group (see below). +- **Follow** keeps a ship in the middle of the map. +- Where the map doesn't show the player's start, a note at its edge points to it. + +**Live** and **Orders** show where the ships are and what they do in the running game, and come +with the live scene ([#21](https://github.com/OpenReliant/openreliant-editor/issues/21)). + +### Routes + +A route links the places the script sends a ship or a flight group to, in its group's colour. A +dotted leg is one the ship flies (Fly and Escort), and a dashed leg one it jumps (Jump Out and Warp +Out). An arrowhead shows where each leg goes, and a small ring where the route starts. In an +overview, the player's route shows the order the mission visits its areas in. + +- A route starts where its ship starts, or a group's where its first ship starts. A ship the script + brings in by a jump or a warp waits far off until then, so its route starts where it comes in. +- When a ship reaches a marker that a ShipReached trigger watches, the trigger's orders continue + its route from there. +- A patrol route (`SetPatrolRoute`) goes round its flight group's waypoints in the order the mission + lists them, and back to the first. +- Where an `if` sends a ship to different places, the route stops there, since either could be + where it is next. +- A leg to or from a place off the map is a short stub that points the way. +- Select a ship, a group or a marker to make the routes it's on stand out, and click an empty part + of the map to show them all alike again. + +Routes read the script in the order the source gives its orders. A trigger runs when its condition +holds, so in the game a ship may take a route's legs in another order. The live scene will show +where ships really go. diff --git a/src/app.zig b/src/app.zig index 45ef76f..3fb90be 100644 --- a/src/app.zig +++ b/src/app.zig @@ -317,7 +317,14 @@ pub const App = struct { if (commands.info(command).planned) |plan| return .{ .reason = gui.print("Planned · {f}", .{plan}) }; const needs_document = "Open a mission first"; return switch (command) { - .add_record, .save, .build, .show_source, .show_listing, .toggle_breakpoint, .clear_breakpoints, .go_to_line, .comment_line, .find, .find_next, .replace, .undo, .redo, .cut, .copy, .paste, .select_all => if (app.document == null) .{ .reason = needs_document } else null, + .add_record, .save, .build, .show_source, .show_listing, .clear_breakpoints, .go_to_line, .find, .find_next, .replace, .undo, .redo => if (app.document == null) .{ .reason = needs_document } else null, + // These act on the source's cursor and selection, which only the Script view shows. + .toggle_breakpoint, .comment_line, .cut, .copy, .paste, .select_all => if (app.document == null) + .{ .reason = needs_document } + else if (app.view != .script) + .{ .reason = "Script view only" } + else + null, .play, .play_from_part => if (app.document == null) .{ .reason = needs_document } else if (app.settings.game_folder == null) .{ .reason = "Set the game's folder in Game settings" } else null, .new_mission => if (app.settings.game_folder == null and app.project == null) .{ .reason = "Set the game's folder in Game settings" } else null, .edit_game_mission => if (app.settings.game_folder == null) .{ .reason = "Set the game's folder in Game settings" } else null, @@ -352,7 +359,6 @@ pub const App = struct { fn viewUnavailable(app: *const App, command: Command) ?widgets.Disabled { return switch (app.mode) { .mission => switch (command) { - .view_2 => .{ .reason = gui.print("Planned · {f}", .{commands.plans.scene}) }, .view_3 => .{ .reason = gui.print("Planned · {f}", .{commands.plans.blocks}) }, .view_4 => .{ .reason = "Mission mode has three views" }, else => null, @@ -423,24 +429,28 @@ pub const App = struct { .paste => if (app.document) |document| document.editor.paste(), .select_all => if (app.document) |document| document.editor.selectAll(), .find, .replace => if (app.document) |document| { - app.source_tab = .source; + app.showSource(.source); document.editor.openFind(); }, - .find_next => if (app.document) |document| document.editor.findNext(), + .find_next => if (app.document) |document| { + app.showSource(.source); + document.editor.findNext(); + }, .comment_line => if (app.document) |document| document.editor.toggleComments(), .go_to_line => app.palette.show(.line), .palette => app.palette.show(.commands), .go_to => app.palette.show(.records), .view_1 => app.view = .script, - .view_2, .view_3, .view_4 => {}, + .view_2 => app.view = .scene, + .view_3, .view_4 => {}, .layout_full, .reset_layout => { app.open_panels = .initFill(true); app.layout_due = true; }, .full_screen => app.window.toggleFullScreen(), .build => app.build(), - .show_source => app.source_tab = .source, - .show_listing => app.source_tab = .listing, + .show_source => app.showSource(.source), + .show_listing => app.showSource(.listing), .toggle_breakpoint => if (app.document) |document| app.toggleBreakpoint(document.editor.cursor().line), .clear_breakpoints => if (app.document) |document| { document.clearBreakpoints(); @@ -1012,23 +1022,47 @@ pub const App = struct { .added => |added| { const line = added.line orelse return app.toasts.push(.info, gui.print("Can't add {s}", .{asked.add.name orelse asked.add.kind.label}), reason); app.selection = .{ .section = added.section, .line = line }; - app.goTo(line, 0); + // The map shows the new record selected, and the Script view its line. + if (app.view == .script) app.goTo(line, 0) else app.placeCursor(line, 0); }, } } + /// The record the inspector shows and the map marks: the one selected, or else the one the + /// source's cursor is in. + pub fn inspected(app: *const App) ?*const game.Record { + const document = app.document orelse return null; + const known = document.outline(); + if (app.selection) |chosen| return known.find(chosen.section, chosen.line); + return known.at(@intCast(document.editor.cursor().line)); + } + pub fn select(app: *App, record: game.Record) void { app.selection = .{ .section = record.section, .line = record.first_line }; } - /// Moves the source's cursor to `line` and `column`, counting from 0, and shows it. + /// Moves the source's cursor to `line` and `column`, counting from 0, and shows it in the + /// Script view, switching to it from another view. pub fn goTo(app: *App, line: u32, column: u32) void { const document = app.document orelse return; - app.source_tab = .source; - app.screen = .workspace; + app.showSource(.source); + app.placeCursor(line, column); + document.editor.focus(); + } + + /// Moves the source's cursor to `line` and `column`, counting from 0, and scrolls the source + /// to it, without switching views. + fn placeCursor(app: *App, line: u32, column: u32) void { + const document = app.document orelse return; document.editor.setCursor(.{ .line = line, .index = column }); document.editor.scrollToLine(line); - document.editor.focus(); + } + + /// Shows the source panel's `tab` in the Script view, switching to it from another view. + fn showSource(app: *App, tab: SourceTab) void { + app.screen = .workspace; + app.view = .script; + app.source_tab = tab; } fn askQuit(app: *App) void { diff --git a/src/commands.zig b/src/commands.zig index ba26772..42b8993 100644 --- a/src/commands.zig +++ b/src/commands.zig @@ -193,7 +193,6 @@ fn defaults(comptime windows_linux: []const []const u8, comptime macos: []const /// Issues of what doesn't work yet, by what each plans. pub const plans = struct { - pub const scene: Plan = .{ .issue = 2 }; pub const blocks: Plan = .{ .issue = 3 }; /// Mod mode's views, Reload scripts, and Play with this mod only. pub const mod_mode: Plan = .{ .issue = 4 }; diff --git a/src/forms.zig b/src/forms.zig index a928c07..067855e 100644 --- a/src/forms.zig +++ b/src/forms.zig @@ -92,7 +92,7 @@ pub fn trigger(app: *App, document: *Document, known: game.Outline, shown: game. } } - const repeats = fieldOf(shown, "repeats"); + const repeats = shown.given("repeats"); const repeat_index: usize = if (repeats) |given| (if (std.mem.eql(u8, given.value, "\"always\"")) 1 else if (std.mem.eql(u8, given.value, "\"once\"")) 0 else 2) else 0; form.label("Repeats", false); if (widgets.segmented("repeats", &.{ "Once", "Always", "Counted" }, repeat_index, off)) |chosen| if (chosen != repeat_index) { @@ -105,7 +105,7 @@ pub fn trigger(app: *App, document: *Document, known: game.Outline, shown: game. }; for (document.profile.fields(shown)) |spec| if (std.mem.eql(u8, spec.name, "component")) form.field(spec, labelOf(spec.name), false); form.label("Deferred", false); - const deferred = fieldOf(shown, "deferred"); + const deferred = shown.given("deferred"); const checked = if (deferred) |given| std.mem.eql(u8, given.value, "true") else false; if (widgets.checkbox("deferred", "Run on scheduler", checked, off)) form.set("deferred", if (checked) null else "true"); } @@ -139,7 +139,7 @@ const Form = struct { gui.tooltip(spec.about); gui.pushId(spec.name); defer gui.popId(); - const given = fieldOf(form.shown, spec.name); + const given = form.shown.given(spec.name); switch (spec.kind) { .record => |sections| { const target = if (given) |found| (if (found.names_record) form.known.named(found.value) else null) else null; @@ -178,7 +178,9 @@ const Form = struct { /// A vector's three boxes, X, Y and Z in their colours. A vector left out shows the origin. fn vector(form: Form, spec: game.FieldForm, given: ?game.Field) void { var values: [3]f64 = @splat(0); - if (given) |found| parseVector(found.value, &values); + if (given) |found| if (found.vector()) |vector_given| { + values = vector_given; + }; const tags = [3]widgets.Tag{ .{ .letter = "X", .color = theme.axis_x }, .{ .letter = "Y", .color = theme.axis_y }, @@ -211,7 +213,7 @@ const Form = struct { gui.setCursor(.{ .x = at.x + @as(f32, @floatFromInt(place)) * (each + px(row_gap)), .y = at.y }); gui.pushId(spec.name); defer gui.popId(); - const given = fieldOf(form.shown, spec.name); + const given = form.shown.given(spec.name); const tag: widgets.Tag = .{ .letter = spec.letter, .color = theme.axis_off, .text = theme.text }; if (widgets.textField("number", if (given) |found| found.value else "0", .{ .number = true, .tag = tag, .width = each, .disabled = form.off })) |typed| { if (form.numberText(typed)) |value| form.set(spec.name, value); @@ -292,12 +294,6 @@ fn markOf(shown: game.Record) widgets.RowMark { return .{ .icon = .{ .icon = panels.sectionIcon(shown.section), .color = panels.groupColor(shown) } }; } -/// The field `name` of `shown`'s table, if it gives one. -fn fieldOf(shown: game.Record, name: []const u8) ?game.Field { - for (shown.fields) |given| if (std.mem.eql(u8, given.name, name)) return given; - return null; -} - /// A field's label from its name: `component` as `Component`, and `_` as a space. fn labelOf(name: []const u8) []const u8 { const made = gui.frameAllocator().dupe(u8, name) catch return name; @@ -306,24 +302,6 @@ fn labelOf(name: []const u8) []const u8 { return made; } -/// The numbers of a vector as the outline shows it, `{ -2000, 0, 42000 }`, into `values`; the ones -/// it doesn't give stay as they are. -fn parseVector(text: []const u8, values: *[3]f64) void { - var parts = std.mem.tokenizeAny(u8, text, "{}, "); - for (values) |*value| { - const part = parts.next() orelse return; - value.* = std.fmt.parseFloat(f64, part) catch return; - } -} - test labelOf { try std.testing.expectEqualStrings("Formation point", labelOf("formation_point")); } - -test parseVector { - var values: [3]f64 = @splat(0); - parseVector("{ -2000, 0, 42000.5 }", &values); - try std.testing.expectEqual([3]f64{ -2000, 0, 42000.5 }, values); - parseVector("…", &values); - try std.testing.expectEqual([3]f64{ -2000, 0, 42000.5 }, values); -} diff --git a/src/game.zig b/src/game.zig index ab32d23..3129533 100644 --- a/src/game.zig +++ b/src/game.zig @@ -46,6 +46,8 @@ pub const Profile = struct { /// The kind of value a type of mission source takes, such as `FlightGroup?` or `ShipType`, as /// the language's parameters and fields name them. fieldKind: *const fn (type_name: []const u8) FieldKind, + /// What the map shows of the mission whose source is `text`, as `known` outlines it. + scene: *const fn (arena: Allocator, text: []const u8, known: Outline) Allocator.Error!Scene, /// The kinds of record the outline's + adds, in the order its menu lists them. new_kinds: []const NewKind, /// The change to `text`, whose outline is `known`, that declares a new record of `kind` after @@ -204,6 +206,85 @@ pub const FieldKind = union(enum) { source, }; +/// What the map shows of a mission (`Profile.scene`), in the game's coordinates, Y down: where its +/// records start, the ranges its triggers watch, its curves, and where its script sends its ships. +pub const Scene = struct { + things: []const Thing, + /// The player's ship, by its place in `things`, where the mission has one. + player: ?usize = null, + ranges: []const Range, + /// Each curve, as the points it passes. + curves: []const []const [3]f64, + routes: []const Route = &.{}, + /// The field the map writes a dragged thing's place to, such as `position`. + place_field: []const u8, +}; + +/// A record the map places. +pub const Thing = struct { + /// The record, by its section and its place among the section's (`Outline.nth`). + section: Section, + index: usize, + kind: ThingKind, + /// Where it starts. + place: [3]f64, + /// The way it points, as a unit vector; null for what points nowhere, such as a marker. + heading: ?[3]f64 = null, +}; + +/// What a thing on the map is, which picks how it's drawn. +pub const ThingKind = enum { + /// A ship, a capital ship or a station: an arrow that points the way it heads. + ship, + /// A nav point, a waypoint or a point, such as where a ship jumps in: a diamond. + marker, + /// A point of the director's camera's curves: shown with the curves. + camera, + /// Scenery far off, such as a planet or the sun: a ring, which the map's fit leaves out. + scenery, +}; + +/// Where the script sends a ship or a group: a leg from each place it sends it to the next, as its +/// orders read in the order the source gives them. It's a reading of the script, not a run of it: +/// triggers run when their conditions hold, which may be in another order. +pub const Route = struct { + /// The ship it's for, by its place in `Scene.things`; none for a group's. + ship: ?usize, + /// The flight group whose colour it takes: the ship's, or the group's own (`Record.group`). + group: ?usize, + legs: []const Leg, +}; + +/// A leg of a route, between two things by their place in `Scene.things`. +pub const Leg = struct { + from: usize, + to: usize, + way: Way, + /// Whether the route starts at `from`: where its ship starts, or where it comes in. + starts: bool = false, +}; + +/// How a ship goes along a leg. +pub const Way = enum { fly, jump }; + +/// A distance the mission watches within, around one of its records. +pub const Range = struct { + /// The record it's around, by its section and its place among the section's. + section: Section, + index: usize, + radius: f64, + /// What watches it, such as a trigger's condition. + label: []const u8, + style: RangeStyle, +}; + +pub const RangeStyle = enum { + /// A trigger fires within it. + trigger, + /// A hint of the game's, such as the display's flyback marker. + hint, +}; + /// A kind of record the outline's + adds. pub const NewKind = struct { /// The word that declares it, such as `ship`. @@ -490,6 +571,15 @@ pub const Field = struct { value: []const u8, /// Whether the value names another record, such as `group = alpha`. names_record: bool = false, + + /// The value as a place or a direction, where the source writes one as numbers: + /// `{ -2000, 0, 42000 }`. + pub fn vector(field: Field) ?[3]f64 { + var parts = std.mem.tokenizeAny(u8, field.value, "{}, "); + var made: [3]f64 = undefined; + for (&made) |*value| value.* = std.fmt.parseFloat(f64, parts.next() orelse return null) catch return null; + return made; + } }; pub const Record = struct { @@ -521,6 +611,12 @@ pub const Record = struct { first_line: u32, last_line: u32, column: u32 = 0, + + /// The field `name` its table gives, if it gives one. + pub fn given(record: Record, name: []const u8) ?Field { + for (record.fields) |field| if (std.mem.eql(u8, field.name, name)) return field; + return null; + } }; /// The number of characters to add, remove or change to turn `a` into `b`, for names up to 64 @@ -560,6 +656,11 @@ test Mission { try std.testing.expectEqual(20, built.statementOn(8).?.offset); } +test Field { + try std.testing.expectEqual([3]f64{ -2000, 0, 42000.5 }, (Field{ .name = "position", .value = "{ -2000, 0, 42000.5 }" }).vector().?); + try std.testing.expectEqual(null, (Field{ .name = "position", .value = "…" }).vector()); +} + test editDistance { try std.testing.expectEqual(3, editDistance("enemy", "enemies")); try std.testing.expectEqual(0, editDistance("nav", "nav")); diff --git a/src/game/starlancer.zig b/src/game/starlancer.zig index 07b46e6..8d9e23d 100644 --- a/src/game/starlancer.zig +++ b/src/game/starlancer.zig @@ -12,6 +12,12 @@ const dte = openreliant.dte; const source = dte.source; const syntax = source.syntax; const commands = openreliant.engine.game.executor.commands; +const orders = openreliant.engine.game.ai.orders; +const curves = openreliant.engine.game.executor.curves; +const math = openreliant.engine.surrender.math; +const game_mission = openreliant.engine.game.mission; +const gameobj = openreliant.engine.game.gameobj; +const planets = openreliant.engine.game.create.planets; const conditions = openreliant.engine.vm.conditions; const vm = openreliant.engine.vm; const mission_editor = openreliant.engine.game.mission.editor; @@ -31,6 +37,7 @@ pub const profile: game.Profile = .{ .edit = edit, .fields = fieldForms, .fieldKind = fieldKind, + .scene = scene, .new_kinds = &new_kinds, .addRecord = addRecord, .listing = listing, @@ -650,6 +657,417 @@ const wings = names: { break :names final; }; +/// What the map shows of a mission: each ship and marker where its `position` places it, a ship +/// pointing as the game turns it by its yaw, pitch and roll (`mission.recordOrientation`), its +/// planets and the sun's and nebulae's markers as scenery, the range of each ShipReached trigger +/// and of each flyback marker the script sets, each curve as the director's camera runs it +/// (`executor.curves.point`), and the routes the script sends ships along (`RouteWalk`). +fn scene(arena: Allocator, text: []const u8, known: game.Outline) Allocator.Error!game.Scene { + const tree = try source_parser.parse(arena, text); + var things: std.ArrayList(game.Thing) = .empty; + var ranges: std.ArrayList(game.Range) = .empty; + var paths: std.ArrayList([]const [3]f64) = .empty; + var walk: RouteWalk = .{ .arena = arena, .tree = tree, .known = known }; + var player: ?usize = null; + for (known.records) |record| switch (record.section) { + .ships => { + // The first ship is the player's. + if (record.index == 0) player = things.items.len; + const scenery = if (record.given("type")) |given| isScenery(std.mem.trim(u8, given.value, "\"")) else false; + try walk.addThing(record, things.items.len); + try things.append(arena, .{ + .section = record.section, + .index = record.index, + .kind = if (scenery) .scenery else .ship, + .place = vectorOf(record, "position"), + .heading = if (scenery) null else headingOf(record), + }); + }, + .markers => { + try walk.addThing(record, things.items.len); + try things.append(arena, .{ + .section = record.section, + .index = record.index, + .kind = markerKind(record), + .place = vectorOf(record, "position"), + }); + }, + .flight_groups => if (record.group) |group| try walk.groups.put(arena, record.name, group), + .squads => try walk.squads.put(arena, record.name, {}), + .triggers => if (std.meta.stringToEnum(dte.Condition, record.condition) == .ship_reached) { + const subject = known.named(record.subject) orelse continue; + try ranges.append(arena, .{ .section = subject.section, .index = subject.index, .radius = reached_reach, .label = record.condition, .style = .trigger }); + }, + .curves => try paths.append(arena, try curvePath(arena, record)), + else => {}, + }; + // The flyback markers the script sets: `SetFlybackMarker(nav, 5000)`, anywhere in its code. + for (0..tree.nodes.len) |index| { + const call = callOf(tree, @intCast(index)) orelse continue; + if (!std.mem.eql(u8, call.callee, set_flyback_marker.name) or call.arguments.len < set_flyback_marker.params.len) continue; + const name = globalName(tree, call.arguments[0]) orelse continue; + const radius = switch (tree.get(call.arguments[1])) { + .number => |value| value, + else => continue, + }; + const subject = known.named(name) orelse continue; + try ranges.append(arena, .{ .section = subject.section, .index = subject.index, .radius = radius, .label = "flyback", .style = .hint }); + } + return .{ .things = things.items, .player = player, .ranges = ranges.items, .curves = paths.items, .routes = try walk.read(), .place_field = "position" }; +} + +/// How the map shows a marker: a point that marks a place on a curve, and a curve point, with the +/// curves; a nav point, a waypoint and the other points, such as where ships jump in, always. +fn markerKind(record: game.Record) game.ThingKind { + return switch (std.meta.stringToEnum(source.names.Word, record.word) orelse return .marker) { + .curve_point => .camera, + .point => if (record.given("marker") != null) .camera else .marker, + else => .marker, + }; +} + +/// The commands the map reads: `SetAI`, whose order sends the entity it names to its target +/// (command `0x0B`), `SetPatrolRoute`, which sends it round a flight group's waypoints (`0x0D`), +/// and `SetFlybackMarker`, which sets the display's flyback marker on it within a range (`0x46`). +const set_ai = commands.table[0x0B]; +const set_patrol_route = commands.table[0x0D]; +const set_flyback_marker = commands.table[0x46]; +/// `SetAI`'s parameters: the entity it sends, its order, and its target, which may be none. +const set_ai_entity = 0; +const set_ai_order = for (set_ai.params, 0..) |param, index| { + if (source.vocabulary.of(param) == .order) break index; +} else @compileError("SetAI takes no order"); +const set_ai_target = set_ai.params.len - 1; + +comptime { + std.debug.assert(std.mem.eql(u8, set_ai.name, "SetAI") and std.mem.eql(u8, set_patrol_route.name, "SetPatrolRoute")); + std.debug.assert(std.mem.eql(u8, set_flyback_marker.name, "SetFlybackMarker")); + std.debug.assert(set_ai.params[set_ai_target].kinds.ship and set_ai.params[set_ai_target].extra.nullable); + std.debug.assert(set_patrol_route.params[1].kinds.flight_group); +} + +/// How an order sends a ship to its target, where it does (OpenReliant's +/// [orders](https://github.com/OpenReliant/openreliant/blob/main/docs/engine/orders.md#the-orders)): +/// Fly and Escort fly it there, Jump Out and Warp Out jump it there, and Jump In and Warp In bring +/// it in there. +const Move = enum { fly, jump, arrive }; + +fn moveOf(order: orders.Order) ?Move { + return switch (order) { + .fly, .escort => .fly, + .jump_out, .jump_out_spread, .warp_out, .fixed_gate_jump_out => .jump, + .jump_in, .jump_in_spread, .warp_in, .fixed_gate_jump_in => .arrive, + else => null, + }; +} + +/// The order the argument at `index` gives: by its name, or by its number. +fn orderOf(tree: syntax.Tree, index: syntax.Index) ?orders.Order { + const number: u32 = switch (tree.get(index)) { + .string => |name| source.vocabulary.value(.order, name) orelse return null, + .number => |value| if (value >= 0 and value <= std.math.maxInt(i16) and @floor(value) == value) @intFromFloat(value) else return null, + else => return null, + }; + return @fromBackingInt(std.math.cast(i16, number) orelse return null); +} + +fn globalName(tree: syntax.Tree, index: syntax.Index) ?[]const u8 { + return switch (tree.get(index)) { + .global_name => |name| name, + else => null, + }; +} + +/// Reads where the script sends its ships and groups (`game.Route`): each order that sends one to +/// a marker, in the order the source gives them, through branches and triggers. +const RouteWalk = struct { + arena: Allocator, + tree: syntax.Tree, + known: game.Outline, + /// The ships and markers of the scene, by their records' names. + things: std.StringHashMapUnmanaged(Placed) = .empty, + /// The flight groups, by name, each with its place among them (`Record.group`), and the + /// squads. + groups: std.StringHashMapUnmanaged(usize) = .empty, + squads: std.StringHashMapUnmanaged(void) = .empty, + /// Each flight group's first ship, where a group's route starts. + first_ships: std.AutoHashMapUnmanaged(usize, []const u8) = .empty, + /// The ships and groups the script brings in by a jump or a warp, by name, and the groups by + /// their place among the groups: such a ship waits far off until it comes in, so its route + /// starts where it comes in, not where it starts. + arriving: std.StringHashMapUnmanaged(void) = .empty, + arriving_groups: std.AutoHashMapUnmanaged(usize, void) = .empty, + /// Where the orders read so far send each ship or group. + whereabouts: Whereabouts = .empty, + /// The legs so far, by the name of the ship or group they're for. + legs: std.StringArrayHashMapUnmanaged(std.ArrayList(game.Leg)) = .empty, + + /// A ship or a marker of the scene: its place among the scene's things, its section, and its + /// flight group. + const Placed = struct { thing: usize, section: game.Section, group: ?usize }; + + /// A place a route reaches: the thing, and whether the route starts there. + const Spot = struct { thing: usize, starts: bool }; + + /// Where the orders send each ship or group, by name: at a spot, or lost where the script + /// leaves it unknown, such as after branches that send it to different places. + const Whereabouts = std.StringHashMapUnmanaged(union(enum) { at: Spot, lost }); + + fn addThing(walk: *RouteWalk, record: game.Record, thing: usize) Allocator.Error!void { + try walk.things.put(walk.arena, record.name, .{ .thing = thing, .section = record.section, .group = record.group }); + if (record.section != .ships) return; + const group = record.group orelse return; + const first = try walk.first_ships.getOrPut(walk.arena, group); + if (!first.found_existing) first.value_ptr.* = record.name; + } + + /// The routes, from the whole script. + fn read(walk: *RouteWalk) Allocator.Error![]const game.Route { + for (0..walk.tree.nodes.len) |index| { + const found = callOf(walk.tree, @intCast(index)) orelse continue; + if (!std.mem.eql(u8, found.callee, set_ai.name) or found.arguments.len < set_ai.params.len) continue; + const given = orderOf(walk.tree, found.arguments[set_ai_order]) orelse continue; + if (moveOf(given) != .arrive) continue; + const subject = globalName(walk.tree, found.arguments[set_ai_entity]) orelse continue; + try walk.arriving.put(walk.arena, subject, {}); + if (walk.groups.get(subject)) |group| try walk.arriving_groups.put(walk.arena, group, {}); + } + try walk.visit(walk.tree.root); + var routes: std.ArrayList(game.Route) = .empty; + var each = walk.legs.iterator(); + while (each.next()) |entry| { + const ship = walk.things.get(entry.key_ptr.*); + try routes.append(walk.arena, .{ + .ship = if (ship) |placed| placed.thing else null, + .group = if (ship) |placed| placed.group else walk.groups.get(entry.key_ptr.*), + .legs = entry.value_ptr.items, + }); + } + return routes.items; + } + + /// Reads the orders of the code at `index`, statement by statement. + fn visit(walk: *RouteWalk, index: syntax.Index) Allocator.Error!void { + switch (walk.tree.get(index)) { + .block => |statements| for (statements) |statement| try walk.visit(statement), + .@"if" => |both| try walk.branch(both.then, both.@"else"), + .call_statement => |statement| try walk.visit(statement), + .call => |found| try walk.call(found.function, found.arguments), + .function => |function| try walk.visit(function.body), + .local, .assign => |binding| for (binding.values) |value| try walk.visit(value), + .@"return" => |values| for (values) |value| try walk.visit(value), + .table => |items| for (items) |item| try walk.visit(item), + .item => |item| try walk.visit(switch (item) { + .list => |value| value, + .record => |record| record.value, + .general => |general| general.value, + }), + else => {}, + } + } + + fn call(walk: *RouteWalk, function: syntax.Index, arguments: []const syntax.Index) Allocator.Error!void { + if (globalName(walk.tree, function)) |callee| { + if (std.mem.eql(u8, callee, set_ai.name)) return walk.order(arguments); + if (std.mem.eql(u8, callee, set_patrol_route.name)) return walk.patrol(arguments); + if (std.meta.stringToEnum(source.names.Word, callee) == .on) try walk.reached(arguments); + } + for (arguments) |argument| try walk.visit(argument); + } + + /// `SetAI`: an order that sends the ship or group to a marker adds a leg from where it is. + fn order(walk: *RouteWalk, arguments: []const syntax.Index) Allocator.Error!void { + if (arguments.len < set_ai.params.len) return; + const subject = walk.subjectOf(arguments[set_ai_entity]) orelse return; + const move = moveOf(orderOf(walk.tree, arguments[set_ai_order]) orelse return) orelse return; + // Sent out of the mission, or after a ship: where it is next isn't known. + const target = walk.markerOf(arguments[set_ai_target]) orelse return walk.whereabouts.put(walk.arena, subject, .lost); + const from = walk.whereIs(subject); + if (from) |spot| if (spot.thing == target) return; + switch (move) { + .arrive => return walk.whereabouts.put(walk.arena, subject, .{ .at = .{ .thing = target, .starts = true } }), + .fly, .jump => if (from) |spot| { + try walk.addLeg(subject, .{ .from = spot.thing, .to = target, .way = if (move == .jump) .jump else .fly, .starts = spot.starts }); + }, + } + try walk.whereabouts.put(walk.arena, subject, .{ .at = .{ .thing = target, .starts = false } }); + } + + /// `SetPatrolRoute`: the ship or group flies to the route's first waypoint, then round its + /// waypoints in the order the mission lists them, back to the first (OpenReliant's + /// `ai/formations.zig`, `nextWaypoint`). Where it is when the patrol starts isn't known, the + /// route starts at the first waypoint. + fn patrol(walk: *RouteWalk, arguments: []const syntax.Index) Allocator.Error!void { + if (arguments.len < set_patrol_route.params.len) return; + const subject = walk.subjectOf(arguments[0]) orelse return; + const route = walk.groups.get(globalName(walk.tree, arguments[1]) orelse return) orelse return; + var at = walk.whereIs(subject); + var first: ?usize = null; + for (walk.known.records) |record| { + if (record.group != route or std.meta.stringToEnum(source.names.Word, record.word) != .waypoint) continue; + const thing = (walk.things.get(record.name) orelse continue).thing; + if (first == null) first = thing; + if (at) |spot| if (spot.thing != thing) { + try walk.addLeg(subject, .{ .from = spot.thing, .to = thing, .way = .fly, .starts = spot.starts }); + }; + const starts = at == null; + at = .{ .thing = thing, .starts = starts }; + } + if (first) |back| if (at) |spot| if (spot.thing != back) { + try walk.addLeg(subject, .{ .from = spot.thing, .to = back, .way = .fly }); + }; + // Where the patrol has it when another order comes isn't known. + try walk.whereabouts.put(walk.arena, subject, .lost); + } + + /// A ShipReached trigger: as its code runs, the ship its value names is at the marker it + /// watches. + fn reached(walk: *RouteWalk, arguments: []const syntax.Index) Allocator.Error!void { + if (arguments.len < 3) return; + const condition = stringOf(walk.tree, arguments[1]) orelse return; + if (std.meta.stringToEnum(dte.Condition, condition) != .ship_reached) return; + const marker = walk.markerOf(arguments[0]) orelse return; + const items = switch (walk.tree.get(arguments[2])) { + .table => |items| items, + else => return, + }; + for (items) |item| switch (walk.tree.get(item)) { + .item => |kind| switch (kind) { + .record => |record| if (walk.subjectOf(record.value)) |ship| { + try walk.whereabouts.put(walk.arena, ship, .{ .at = .{ .thing = marker, .starts = false } }); + }, + else => {}, + }, + else => {}, + }; + } + + /// Reads both ways of a branch from where the walk is. Where they leave a ship or a group in + /// different places, it could be in either: lost. + fn branch(walk: *RouteWalk, then: syntax.Index, otherwise: ?syntax.Index) Allocator.Error!void { + const before = try walk.whereabouts.clone(walk.arena); + try walk.visit(then); + const after_then = walk.whereabouts; + walk.whereabouts = before; + if (otherwise) |other| try walk.visit(other); + var each = after_then.iterator(); + while (each.next()) |entry| { + const other = walk.whereabouts.get(entry.key_ptr.*) orelse { + try walk.whereabouts.put(walk.arena, entry.key_ptr.*, .lost); + continue; + }; + if (!std.meta.eql(other, entry.value_ptr.*)) try walk.whereabouts.put(walk.arena, entry.key_ptr.*, .lost); + } + var others = walk.whereabouts.iterator(); + while (others.next()) |entry| if (!after_then.contains(entry.key_ptr.*)) { + entry.value_ptr.* = .lost; + }; + } + + /// Where `subject` is as the walk reaches an order for it: where the orders before sent it, or + /// else where it starts, unless the script brings it in by a jump or a warp. Null where that + /// isn't known. + fn whereIs(walk: *const RouteWalk, subject: []const u8) ?Spot { + if (walk.whereabouts.get(subject)) |found| return switch (found) { + .at => |spot| spot, + .lost => null, + }; + const start = walk.startOf(subject) orelse return null; + return .{ .thing = start, .starts = true }; + } + + /// Where `subject` starts: a ship where it is, a flight group where its first ship is; none + /// for a ship the script brings in by a jump or a warp, by itself or with its group, or for a + /// squad. + fn startOf(walk: *const RouteWalk, subject: []const u8) ?usize { + const ship = if (walk.groups.get(subject)) |group| walk.first_ships.get(group) orelse return null else subject; + const placed = walk.things.get(ship) orelse return null; + if (placed.section != .ships or walk.arriving.contains(ship)) return null; + if (placed.group) |group| if (walk.arriving_groups.contains(group)) return null; + return placed.thing; + } + + /// The name of the ship, flight group or squad the argument at `index` names. + fn subjectOf(walk: *const RouteWalk, index: syntax.Index) ?[]const u8 { + const name = globalName(walk.tree, index) orelse return null; + if (walk.things.get(name)) |placed| return if (placed.section == .ships) name else null; + if (walk.groups.contains(name) or walk.squads.contains(name)) return name; + return null; + } + + /// The thing of the marker the argument at `index` names. + fn markerOf(walk: *const RouteWalk, index: syntax.Index) ?usize { + const placed = walk.things.get(globalName(walk.tree, index) orelse return null) orelse return null; + return if (placed.section == .markers) placed.thing else null; + } + + /// Adds a leg to `subject`'s route, once. + fn addLeg(walk: *RouteWalk, subject: []const u8, leg: game.Leg) Allocator.Error!void { + const found = try walk.legs.getOrPut(walk.arena, subject); + if (!found.found_existing) found.value_ptr.* = .empty; + for (found.value_ptr.items) |*known| if (known.from == leg.from and known.to == leg.to and known.way == leg.way) { + known.starts = known.starts or leg.starts; + return; + }; + try found.value_ptr.append(walk.arena, leg); + } +}; + +/// Whether a ship of the type `type_name` is scenery: a planet, as the original's table of planets +/// has it (`create.planets.original`), or the sun's or a nebula's marker. +fn isScenery(type_name: []const u8) bool { + const number = source.vocabulary.value(.ship_type, type_name) orelse return false; + const ship_type: gameobj.Type = @fromBackingInt(std.math.cast(@typeInfo(gameobj.Type).@"enum".tag_type, number) orelse return false); + for (planets.original) |planet| if (planet.type == ship_type) return true; + return ship_type == gameobj.Type.of(.sun_marker) or ship_type == gameobj.Type.of(.nebula_marker); +} + +/// How far ShipReached's triggers look around a nav point or a waypoint, as OpenReliant's mission +/// events watch (`reached_reach`, `0x0052A5D0`). +const reached_reach = 4000; + +/// The points a curve's path passes on the map. +const curve_points = 48; + +/// The vector a record's field `name` gives; the origin where it gives none. +fn vectorOf(record: game.Record, name: []const u8) [3]f64 { + const given = record.given(name) orelse return @splat(0); + return given.vector() orelse @splat(0); +} + +/// The way a ship's nose points, as the game turns it by its angles. An angle left out, or unset +/// as -1, is 0. +fn headingOf(record: game.Record) [3]f64 { + var ship = std.mem.zeroes(dte.Ship); + ship.yaw = angleOf(record, "yaw"); + ship.pitch = angleOf(record, "pitch"); + ship.roll = angleOf(record, "roll"); + const nose = math.forward(game_mission.recordOrientation(ship)); + return .{ nose[0], nose[1], nose[2] }; +} + +fn angleOf(record: game.Record, name: []const u8) i16 { + const given = record.given(name) orelse return 0; + const degrees = std.fmt.parseFloat(f64, given.value) catch return 0; + if (degrees == -1) return 0; + return std.math.lossyCast(i16, degrees); +} + +/// The points a curve record's path passes, from its `from` to its `to`, along its tangents. +fn curvePath(arena: Allocator, record: game.Record) Allocator.Error![]const [3]f64 { + var curve = dte.Curve.blank; + for ([_]struct { *[3]f32, []const u8 }{ .{ &curve.from, "from" }, .{ &curve.to, "to" }, .{ &curve.leaving, "leaving" }, .{ &curve.arriving, "arriving" } }) |part| { + const value = vectorOf(record, part[1]); + part[0].* = .{ @floatCast(value[0]), @floatCast(value[1]), @floatCast(value[2]) }; + } + const points = try arena.alloc([3]f64, curve_points); + for (points, 0..) |*point, at| { + const on = curves.point(curve, @as(f32, @floatFromInt(at)) / (curve_points - 1)); + point.* = .{ on[0], on[1], on[2] }; + } + return points; +} + /// The records the outline's + adds. Squads, formations and curves list other records, and are /// written in the source. const new_kinds = [_]game.NewKind{ @@ -1026,6 +1444,121 @@ test addRecord { try std.testing.expect(source.vocabulary.value(.condition, new_condition) != null); } +test scene { + var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); + defer arena.deinit(); + const made = try outline(arena.allocator(), first_mission); + const shown = try scene(arena.allocator(), first_mission, made); + // The player, the nav point and the two Sabres, each where it starts. + try std.testing.expectEqual(4, shown.things.len); + try std.testing.expectEqual(made.named("player").?.index, shown.things[shown.player.?].index); + const sabre = made.named("sabre_1").?; + for (shown.things) |thing| if (thing.section == sabre.section and thing.index == sabre.index) { + try std.testing.expectEqual([3]f64{ -2000, 0, 42000 }, thing.place); + // Turned half round, it points back along Z. + try std.testing.expectApproxEqAbs(-1, thing.heading.?[2], 1e-6); + }; + // The nav point's ShipReached trigger watches within 4000 of it, and the start part sets the + // flyback marker on it within 5000. + try std.testing.expectEqual(2, shown.ranges.len); + try std.testing.expectEqual(made.named("nav").?.index, shown.ranges[0].index); + try std.testing.expectEqual(4000, shown.ranges[0].radius); + try std.testing.expectEqual(5000, shown.ranges[1].radius); + try std.testing.expectEqual(game.RangeStyle.hint, shown.ranges[1].style); + // A planet's type is scenery; a Sabre's isn't. + try std.testing.expect(isScenery("neptune_hi") and !isScenery("sabre")); +} + +test RouteWalk { + const text = + \\alpha = flight_group("(FG)Alpha", { wing = "player" }) + \\raiders = flight_group("(FG)Raiders") + \\round = flight_group("(FG)Round") + \\player = ship("Player", { type = "predator", group = alpha }) + \\wingman = ship("Wingman", { type = "predator", group = alpha, position = { 500, 0, 0 } }) + \\raider = ship("Raider", { type = "sabre", group = raiders, position = { 9000000, 0, 0 } }) + \\nav = nav_point("Nav 1", { position = { 0, 0, 40000 } }) + \\entry = point("Raider in", { position = { 5000, 0, 30000 } }) + \\target = waypoint("Raider fly to", { position = { 2000, 0, 35000 } }) + \\out = point("Raider out", { position = { 9000, 0, 35000 } }) + \\left = waypoint("Left", { position = { -3000, 0, 1000 } }) + \\right = waypoint("Right", { position = { 3000, 0, 1000 } }) + \\later = waypoint("Later", { position = { 0, 0, 9000 } }) + \\one = waypoint("One", { group = round, position = { 0, 0, 1 } }) + \\two = waypoint("Two", { group = round, position = { 0, 0, 2 } }) + \\three = waypoint("Three", { group = round, position = { 0, 0, 3 } }) + \\shot = point("Shot", { marker = { curve = path, at = 0.5 } }) + \\start = part("(F)Start", function() + \\ SetAI(raider, "jump_in", 1, entry) + \\ SetAI(raider, "fly", 1, target) + \\ SetAI(alpha, "jump_out", 1, nav) + \\ if game.mission_success == 1 then + \\ SetAI(wingman, "fly", 1, left) + \\ else + \\ SetAI(wingman, "fly", 1, right) + \\ end + \\ SetAI(wingman, "fly", 1, later) + \\ SetPatrolRoute(raiders, round) + \\ return 1 + \\end, { start = true }) + \\on(target, "ship_reached", { reached_ship = raider }, function(reached_ship) + \\ SetAI(raider, "jump_out", 1, out) + \\ return 1 + \\end) + \\ + ; + var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); + defer arena.deinit(); + const made = try outline(arena.allocator(), text); + const shown = try scene(arena.allocator(), text, made); + const at = struct { + fn thing(things: []const game.Thing, known: game.Outline, name: []const u8) usize { + const record = known.named(name).?; + for (things, 0..) |each, index| if (each.section == record.section and each.index == record.index) return index; + unreachable; + } + }; + const legsOf = struct { + fn route(routes: []const game.Route, things: []const game.Thing, known: game.Outline, name: []const u8) []const game.Leg { + const record = known.named(name).?; + for (routes) |each| { + if (each.ship) |ship| if (things[ship].section == record.section and things[ship].index == record.index) return each.legs; + if (each.ship == null and record.section == .flight_groups and each.group == record.group) return each.legs; + } + return &.{}; + } + }; + const things = shown.things; + // The raider waits far off until it jumps in, so its route starts where it comes in: it flies + // to its waypoint, and on reaching it jumps out. + try std.testing.expectEqualSlices(game.Leg, &.{ + .{ .from = at.thing(things, made, "entry"), .to = at.thing(things, made, "target"), .way = .fly, .starts = true }, + .{ .from = at.thing(things, made, "target"), .to = at.thing(things, made, "out"), .way = .jump }, + }, legsOf.route(shown.routes, things, made, "raider")); + // The player's group jumps to the nav point from where its first ship starts. + try std.testing.expectEqualSlices(game.Leg, &.{ + .{ .from = at.thing(things, made, "player"), .to = at.thing(things, made, "nav"), .way = .jump, .starts = true }, + }, legsOf.route(shown.routes, things, made, "alpha")); + // Either branch flies the wingman from its start; after them it could be at either, so no leg + // leads to the next waypoint. + try std.testing.expectEqualSlices(game.Leg, &.{ + .{ .from = at.thing(things, made, "wingman"), .to = at.thing(things, made, "left"), .way = .fly, .starts = true }, + .{ .from = at.thing(things, made, "wingman"), .to = at.thing(things, made, "right"), .way = .fly, .starts = true }, + }, legsOf.route(shown.routes, things, made, "wingman")); + // The raiders' patrol route goes round its waypoints in the order they're listed, back to the + // first. The group comes in nowhere and starts at its first ship, the raider, which jumps in, + // so the route starts at the first waypoint. + try std.testing.expectEqualSlices(game.Leg, &.{ + .{ .from = at.thing(things, made, "one"), .to = at.thing(things, made, "two"), .way = .fly, .starts = true }, + .{ .from = at.thing(things, made, "two"), .to = at.thing(things, made, "three"), .way = .fly }, + .{ .from = at.thing(things, made, "three"), .to = at.thing(things, made, "one"), .way = .fly }, + }, legsOf.route(shown.routes, things, made, "raiders")); + // A point where a ship comes in is a marker; one that marks a place on a curve shows with the + // curves. + try std.testing.expectEqual(game.ThingKind.marker, things[at.thing(things, made, "entry")].kind); + try std.testing.expectEqual(game.ThingKind.camera, things[at.thing(things, made, "shot")].kind); +} + test fieldForms { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); diff --git a/src/main.zig b/src/main.zig index 468b0b5..6c0fb89 100644 --- a/src/main.zig +++ b/src/main.zig @@ -21,6 +21,7 @@ pub const ui = @import("ui.zig"); pub const document = @import("mission/document.zig"); pub const edit = @import("mission/edit.zig"); pub const forms = @import("forms.zig"); +pub const scene_view = @import("views/scene.zig"); pub const script_view = @import("views/script.zig"); pub const start_screen = @import("screens/start.zig"); pub const settings_screen = @import("screens/settings.zig"); @@ -48,7 +49,7 @@ const Options = struct { check_missions: bool = false, print_version: bool = false, - const Show = enum { start, settings, palette, keys, link, problems }; + const Show = enum { start, settings, palette, keys, link, problems, scene }; const usage = \\Usage: openreliant-editor [] [options] @@ -59,7 +60,7 @@ const Options = struct { \\ --screenshot draw without a window and save a frame as a PNG file \\ --frames the frames drawn before the picture; 10 by default \\ --size x the window's size; 1440x900 by default - \\ --show start, settings, keys, link, palette or problems + \\ --show start, settings, keys, link, palette, problems or scene \\ --check-missions open each of the game's missions as source, build it again, \\ and check it's the same mission \\ @@ -137,6 +138,8 @@ pub fn main(init: std.process.Init) !u8 { const ini_path: ?[:0]const u8 = if (editor_settings.folder) |folder| try std.fmt.allocPrintSentinel(arena, "{s}layout.ini", .{folder}, 0) else null; var window = try Window.open("OpenReliant Editor", options.width, options.height, if (ini_path) |path| path.ptr else null, options.screenshot != null); defer window.close(); + ui.plot.create(); + defer ui.plot.destroy(); ui.fonts.load(); ui.theme.apply(window.scale); ui.gui.scale = window.scale; @@ -164,6 +167,7 @@ pub fn main(init: std.process.Init) !u8 { }, .palette => editor.palette.show(.commands), .problems => editor.showPanel(.problems), + .scene => editor.run(.view_2), }; var frame: u32 = 0; diff --git a/src/mission/document.zig b/src/mission/document.zig index 720461a..6513fc3 100644 --- a/src/mission/document.zig +++ b/src/mission/document.zig @@ -65,6 +65,8 @@ pub const Document = struct { good: Check, /// Whether the outline is from older source than the text's. outline_stale: bool = false, + /// A number that changes whenever `good` does. + outline_generation: usize = 0, built: ?Build = null, /// The listing of the last build's script, in its own arena. listing: ?[]const u8 = null, @@ -78,6 +80,10 @@ pub const Document = struct { /// from. Its strings are in `queue_arena`. queued: ?Queued = null, queue_arena: std.heap.ArenaAllocator, + /// What the map shows of the text (`scene`), in its own arena, with the text's version and the + /// outline's generation it was read from. + scene_read: ?struct { version: usize, generation: usize, scene: game.Scene } = null, + scene_arena: std.heap.ArenaAllocator, /// Opens the source file at `path`. pub fn open(gpa: Allocator, io: Io, path: []const u8, profile: *const game.Profile, language: ?text_editor.Language) !*Document { @@ -104,6 +110,7 @@ pub const Document = struct { .good = .{ .arena = .init(gpa) }, .listing_arena = .init(gpa), .queue_arena = .init(gpa), + .scene_arena = .init(gpa), }; document.recheck() catch {}; return document; @@ -115,6 +122,7 @@ pub const Document = struct { document.good.deinit(); document.listing_arena.deinit(); document.queue_arena.deinit(); + document.scene_arena.deinit(); document.gpa.free(document.path); document.gpa.destroy(document); } @@ -133,6 +141,21 @@ pub const Document = struct { return document.good.outline; } + /// What the map shows of the mission (`Profile.scene`), read again only once the text or its + /// outline changed, since reading it parses the whole script. + pub fn scene(document: *Document) Allocator.Error!game.Scene { + const version = document.editor.version(); + if (document.scene_read) |read| { + if (read.version == version and read.generation == document.outline_generation) return read.scene; + } + document.scene_read = null; + _ = document.scene_arena.reset(.retain_capacity); + const arena = document.scene_arena.allocator(); + const made = try document.profile.scene(arena, try arena.dupe(u8, document.editor.text()), document.outline()); + document.scene_read = .{ .version = version, .generation = document.outline_generation, .scene = made }; + return made; + } + /// The build of the text as last checked, with the map of its script's statements; null while /// the text has problems. pub fn mission(document: *const Document) ?game.Mission { @@ -186,6 +209,7 @@ pub const Document = struct { good.outline = try copyOutline(good.arena.allocator(), check.outline); document.good.deinit(); document.good = good; + document.outline_generation +%= 1; document.outline_stale = false; } else { document.outline_stale = true; diff --git a/src/panels.zig b/src/panels.zig index 23bc179..6025c2b 100644 --- a/src/panels.zig +++ b/src/panels.zig @@ -15,6 +15,7 @@ const commands = @import("commands.zig"); const game = @import("game.zig"); const Document = @import("mission/document.zig").Document; const forms = @import("forms.zig"); +const scene_view = @import("views/scene.zig"); const script_view = @import("views/script.zig"); const ui = @import("ui.zig"); const fonts = ui.fonts; @@ -36,7 +37,10 @@ pub fn draw(app: *App) void { switch (panel) { .mission => outline(app), .find => find(app), - .source => script_view.draw(app), + .source => switch (app.view) { + .scene => scene_view.draw(app), + .script, .blocks => script_view.draw(app), + }, .threads => threads(app), .breakpoints => breakpoints(app), .output => output(app), @@ -737,12 +741,7 @@ fn liveScene() void { fn inspector(app: *App) void { const document = app.document orelse return waiting(.sliders_horizontal, "No mission open", null); const known = document.outline(); - const chosen = app.selection orelse blk: { - // Without a selection, the record the cursor is in. - const record = known.at(@intCast(document.editor.cursor().line)) orelse return waiting(.sliders_horizontal, "Select a record in the outline or the source", null); - break :blk app_mod.Selection{ .section = record.section, .line = record.first_line }; - }; - const record = known.find(chosen.section, chosen.line) orelse return waiting(.sliders_horizontal, "Select a record in the outline or the source", null); + const record = app.inspected() orelse return waiting(.sliders_horizontal, "Select a record in the outline, the source or the map", null); gui.pushVar2(c.ImGuiStyleVar_WindowPadding, .{ .x = px(12), .y = px(14) }); // The forms take the panel's whole width, as the design's do: it scrolls without a bar. _ = c.ImGui_BeginChild("inspector", .{ .x = 0, .y = 0 }, c.ImGuiChildFlags_AlwaysUseWindowPadding, c.ImGuiWindowFlags_NoScrollbar); diff --git a/src/platform/c.h b/src/platform/c.h index 4d8092c..9ae2e1d 100644 --- a/src/platform/c.h +++ b/src/platform/c.h @@ -1,6 +1,6 @@ /* The C interfaces the editor uses, which the build translates into one Zig module: SDL3, Dear * ImGui through Dear Bindings with its SDL3 and SDL_GPU backends, the few internal calls the - * editor makes, and the text editor's shim. */ + * editor makes, and the shims of the text editor and of ImPlot. */ #include #include "dcimgui.h" @@ -8,4 +8,5 @@ #include "dcimgui_impl_sdlgpu3.h" #include "extras.h" +#include "plot_shim.h" #include "shim.h" diff --git a/src/screens/settings.zig b/src/screens/settings.zig index 4103acb..2a785fb 100644 --- a/src/screens/settings.zig +++ b/src/screens/settings.zig @@ -186,7 +186,7 @@ fn linkPage(app: *App) void { defer row.end(); const labels = [_][]const u8{ "Off", "1 Hz", "4 Hz" }; row.centre(choice_height); - if (choice("state rate", &labels, @backingInt(link.state_rate))) |chosen| { + if (widgets.choice("state rate", &labels, @backingInt(link.state_rate), .{})) |chosen| { link.state_rate = @fromBackingInt(@intCast(chosen)); app.settings.save(app.io); } @@ -310,38 +310,6 @@ fn portField(app: *App) void { } } -/// The design's choice of a few, the settings' `.seg`: each option as wide as its label, the one -/// chosen lit. The option clicked, if one is. -fn choice(id: []const u8, options: []const []const u8, current: usize) ?usize { - gui.pushId(id); - defer gui.popId(); - gui.sans(.regular, fonts.size.ui); - defer gui.popFont(); - var width = px(3) * 2 + px(2) * @as(f32, @floatFromInt(options.len - 1)); - for (options) |option| width += gui.textSize(option).x + px(12) * 2; - const height = px(30); - const at = gui.cursor(); - const list = gui.drawList(); - gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.field, 5); - gui.outline(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.border, 5); - var chosen: ?usize = null; - var x = at.x + px(3); - for (options, 0..) |option, index| { - const item_width = gui.textSize(option).x + px(12) * 2; - gui.setCursor(.{ .x = x, .y = at.y + px(3) }); - gui.pushIdInt(index); - if (c.ImGui_InvisibleButton("option", .{ .x = item_width, .y = px(24) }, 0)) chosen = index; - gui.popId(); - const on = index == current; - if (on) gui.rect(list, .{ .x = x, .y = at.y + px(3) }, .{ .x = x + item_width, .y = at.y + px(27) }, theme.border, 3); - gui.drawText(list, .{ .x = x + px(12), .y = gui.textTop(at.y + height / 2) }, if (on) theme.white else theme.text_muted, option); - x += item_width + px(2); - } - gui.setCursor(at); - c.ImGui_Dummy(.{ .x = width, .y = height }); - return chosen; -} - /// The design's `.plan`: what's planned, in a small grey pill, its middle at the cursor. fn planTag(text: []const u8) void { gui.sans(.semibold, 11); diff --git a/src/shell.zig b/src/shell.zig index 16fc910..18f1a40 100644 --- a/src/shell.zig +++ b/src/shell.zig @@ -12,6 +12,7 @@ const commands = @import("commands.zig"); const Command = commands.Command; const keys = @import("keys.zig"); const panels = @import("panels.zig"); +const scene_view = @import("views/scene.zig"); const ui = @import("ui.zig"); const version = @import("version.zig"); const fonts = ui.fonts; @@ -538,7 +539,9 @@ fn statusBar(app: *App) void { x += gui.textSize(text).x + gap; } const cursor = document.editor.cursor(); - for ([_][]const u8{ document.file, gui.print("Ln {d}, Col {d}", .{ cursor.line + 1, cursor.index + 1 }), keyHints(app) }) |part| { + // The Scene view shows the map and the place under the pointer instead of the cursor. + const where = if (app.view == .scene) scene_view.status() else gui.print("Ln {d}, Col {d}", .{ cursor.line + 1, cursor.index + 1 }); + for ([_][]const u8{ document.file, where, keyHints(app) }) |part| { gui.drawText(list, .{ .x = x, .y = text_y }, theme.text_muted, part); x += gui.textSize(part).x + gap; } diff --git a/src/ui.zig b/src/ui.zig index e2672ae..5c939b0 100644 --- a/src/ui.zig +++ b/src/ui.zig @@ -1,11 +1,12 @@ //! The editor's interface kit on Dear ImGui: the design's colours, fonts and icons, the widgets -//! the screens are made of, and the text editor. +//! the screens are made of, the text editor, and the map's plot. const std = @import("std"); pub const fonts = @import("ui/fonts.zig"); pub const gui = @import("ui/gui.zig"); pub const icons = @import("ui/icons.zig"); +pub const plot = @import("ui/plot.zig"); pub const text_editor = @import("ui/text_editor.zig"); pub const theme = @import("ui/theme.zig"); pub const widgets = @import("ui/widgets.zig"); diff --git a/src/ui/fonts.zig b/src/ui/fonts.zig index 7e1fd45..36c1943 100644 --- a/src/ui/fonts.zig +++ b/src/ui/fonts.zig @@ -127,11 +127,15 @@ pub fn iconFont() *c.ImFont { var icon_font: *c.ImFont = undefined; -/// A font's height above and below its baseline, in ems, from its `hhea` and `head` tables. +/// A font's height above and below its baseline, and its capitals' height, in ems, from its `hhea`, +/// `head` and `OS/2` tables. pub const Metrics = struct { /// The height above the baseline and below it, as a stylesheet lays out a line of text. ascent: f32, descent: f32, + /// The capitals' height above the baseline, which the figures share in the editor's fonts; 0 + /// where the font doesn't give it. + cap_height: f32, /// How much larger ImGui's size of the font is than its em. ImGui sizes a font by its ascent /// less its descent as the file gives them, a stylesheet by its em, so a font pushed at the /// design's size times this draws as large as in the design. @@ -143,6 +147,7 @@ pub const Metrics = struct { var units: u16 = 0; var ascent: i16 = 0; var descent: i16 = 0; + var cap_height: i16 = 0; for (0..tables) |index| { const record = 12 + index * 16; const offset = std.mem.readInt(u32, data[record + 8 ..][0..4], .big); @@ -151,6 +156,10 @@ pub const Metrics = struct { ascent = std.mem.readInt(i16, data[offset + 4 ..][0..2], .big); descent = std.mem.readInt(i16, data[offset + 6 ..][0..2], .big); } + // `sCapHeight` came in the table's second version. + if (std.mem.eql(u8, data[record..][0..4], "OS/2") and std.mem.readInt(u16, data[offset..][0..2], .big) >= 2) { + cap_height = std.mem.readInt(i16, data[offset + 88 ..][0..2], .big); + } } const em_units: f32 = @floatFromInt(units); return .{ @@ -158,6 +167,7 @@ pub const Metrics = struct { // Newtown gives its descent as a positive number; browsers take it as below the // baseline all the same. .descent = @as(f32, @floatFromInt(@abs(descent))) / em_units, + .cap_height = @as(f32, @floatFromInt(cap_height)) / em_units, .em = @as(f32, @floatFromInt(@as(i32, ascent) - descent)) / em_units, }; } @@ -186,6 +196,9 @@ test Metrics { try std.testing.expectEqual(13, Family.sans.metrics().baselineInLine(13, 13 * line_height)); try std.testing.expectApproxEqAbs(0.19, Family.brand.metrics().descent, 1e-6); try std.testing.expectEqual(16, Family.brand.metrics().baselineInLine(16, 16 * line_height)); + // Plex's capitals and figures are 0.698 of its em high, JetBrains Mono's 0.73. + try std.testing.expectApproxEqAbs(0.698, Family.sans.metrics().cap_height, 1e-6); + try std.testing.expectApproxEqAbs(0.73, Family.mono.metrics().cap_height, 1e-6); } test face { diff --git a/src/ui/gui.zig b/src/ui/gui.zig index 6c64614..d2847c9 100644 --- a/src/ui/gui.zig +++ b/src/ui/gui.zig @@ -80,6 +80,23 @@ pub fn textTopIn(middle: f32, line_pixels: ?f32) f32 { return @round(middle - line_height / 2 + face.family.metrics().baselineInLine(size, line_height)) - ascent(); } +/// Where a line of text in the current font goes for its capitals and figures to sit in the middle +/// of a box whose middle is at `middle`, such as a count in a badge, which has no small letters to +/// centre. The baseline goes on a whole pixel, since ImGui draws text from whole pixels. +pub fn capitalsTop(middle: f32) f32 { + return @round(middle + capitals() / 2) - ascent(); +} + +/// How high the current font's capitals and figures are; for a font that isn't one of the faces, +/// as high as Plex's would be at its size. +pub fn capitals() f32 { + const face = fonts.current() orelse { + const plex = fonts.Family.sans.metrics(); + return plex.cap_height / plex.em * c.ImGui_GetFontSize(); + }; + return face.family.metrics().cap_height * px(face.size); +} + /// How far below the top of a line of the current font its baseline is, as ImGui draws it. pub fn ascent() f32 { return c.or_imgui_font_ascent(); @@ -200,6 +217,11 @@ pub fn popVar(count: c_int) void { c.ImGui_PopStyleVarEx(count); } +/// Where the last item ends at its right. +pub fn lastItemRight() f32 { + return c.ImGui_GetItemRectMax().x; +} + pub fn cursor() Vec2 { return c.ImGui_GetCursorScreenPos(); } diff --git a/src/ui/icons.zig b/src/ui/icons.zig index efeab6f..8b1eae3 100644 --- a/src/ui/icons.zig +++ b/src/ui/icons.zig @@ -7,9 +7,13 @@ const std = @import("std"); pub const Icon = enum(u21) { archive = 0xe041, + arrow_down = 0xe042, arrow_down_to_dot = 0xe44d, arrow_left = 0xe048, + arrow_right = 0xe049, arrow_right_to_line = 0xe459, + arrow_up = 0xe04a, + arrow_up_right = 0xe04d, audio_waveform = 0xe55b, blocks = 0xe4fa, book = 0xe05e, @@ -26,6 +30,7 @@ pub const Icon = enum(u21) { chevron_up = 0xe070, circle = 0xe076, circle_alert = 0xe077, + circle_dashed = 0xe4b0, circle_dot = 0xe345, circle_help = 0xe082, clipboard_paste = 0xe3e8, @@ -73,6 +78,7 @@ pub const Icon = enum(u21) { pencil = 0xe1f9, play = 0xe13c, plus = 0xe13d, + radio = 0xe142, redo_2 = 0xe2a0, redo_dot = 0xe450, refresh_cw = 0xe145, @@ -80,10 +86,12 @@ pub const Icon = enum(u21) { route = 0xe53e, save = 0xe14d, save_all = 0xe40f, + scan = 0xe257, scissors = 0xe14e, search = 0xe151, settings = 0xe154, sliders_horizontal = 0xe29a, + spline = 0xe38b, square = 0xe167, step_forward = 0xe3ea, terminal = 0xe181, diff --git a/src/ui/plot.zig b/src/ui/plot.zig new file mode 100644 index 0000000..d0e8d34 --- /dev/null +++ b/src/ui/plot.zig @@ -0,0 +1,84 @@ +//! ImPlot through its C shim (`plot/plot_shim.h`): the plot the Scene view's map draws on, with +//! equal axes, which the pointer pans, and points it drags. The map zooms itself +//! (`views/scene.zig`). + +const std = @import("std"); +const c = @import("c"); + +const theme = @import("theme.zig"); + +pub const Vec2 = c.ImVec2; +pub const Rect = c.OrPlotRect; + +/// Makes ImPlot's context, once Dear ImGui's is made, on the map's ground. The map draws its own +/// grid (`views/scene/drawing.zig`). +pub fn create() void { + c.or_plot_create(); + c.or_plot_style(theme.map); +} + +pub fn destroy() void { + c.or_plot_destroy(); +} + +/// Begins a plot `size` pixels across and down. With `shown`, its axes show it from this frame +/// on. False where it isn't drawn; `end` ends it otherwise. +pub fn begin(id: [:0]const u8, size: Vec2, shown: ?Rect) bool { + return c.or_plot_begin(id, size.x, size.y, shown != null, shown orelse std.mem.zeroes(Rect)); +} + +pub fn end() void { + c.or_plot_end(); +} + +/// What the axes show. +pub fn limits() Rect { + return c.or_plot_limits(); +} + +/// The plot's area on the screen: its top left and bottom right corners. +pub fn area() [2]Vec2 { + var rect: [4]f32 = undefined; + c.or_plot_area(&rect); + return .{ .{ .x = rect[0], .y = rect[1] }, .{ .x = rect[2], .y = rect[3] } }; +} + +/// The place on the screen of `at` on the plot. +pub fn toPixels(at: [2]f64) Vec2 { + var pixels: [2]f32 = undefined; + c.or_plot_to_pixels(at[0], at[1], &pixels); + return .{ .x = pixels[0], .y = pixels[1] }; +} + +/// The place on the plot of `at` on the screen. +pub fn fromPixels(at: Vec2) [2]f64 { + var place: [2]f64 = undefined; + c.or_plot_from_pixels(at.x, at.y, &place); + return place; +} + +/// The draw list over the plot, clipped to its area until `popClip`. +pub fn drawList() *c.ImDrawList { + c.or_plot_push_clip(); + return @ptrCast(@alignCast(c.or_plot_draw_list().?)); +} + +pub fn popClip() void { + c.or_plot_pop_clip(); +} + +/// What the pointer did to a point (`dragPoint`). +pub const Drag = struct { + clicked: bool = false, + hovered: bool = false, + /// Whether the pointer holds it. + held: bool = false, +}; + +/// A point `radius` pixels around `at`, which the pointer can click and drag; a drag moves `at`. +/// The caller draws it. +pub fn dragPoint(id: usize, at: *[2]f64, radius: f32) Drag { + var drag: Drag = .{}; + _ = c.or_plot_drag_point(@intCast(id), &at[0], &at[1], radius, &drag.clicked, &drag.hovered, &drag.held); + return drag; +} diff --git a/src/ui/plot/plot_shim.cpp b/src/ui/plot/plot_shim.cpp new file mode 100644 index 0000000..d4d1854 --- /dev/null +++ b/src/ui/plot/plot_shim.cpp @@ -0,0 +1,77 @@ +// ImPlot through the editor's C interface (`plot_shim.h`). + +#include "plot_shim.h" + +#include "imgui.h" +#include "implot.h" + +extern "C" { + +void or_plot_create(void) { ImPlot::CreateContext(); } + +void or_plot_destroy(void) { ImPlot::DestroyContext(); } + +void or_plot_style(unsigned int background) { + ImPlotStyle &style = ImPlot::GetStyle(); + style.PlotPadding = ImVec2(0, 0); + style.PlotBorderSize = 0; + style.Colors[ImPlotCol_FrameBg] = ImVec4(0, 0, 0, 0); + style.Colors[ImPlotCol_PlotBg] = ImGui::ColorConvertU32ToFloat4(background); + // The editor zooms around the pointer itself, over the points too, and fits on a double click + // with its own fit: ImPlot's zoom does nothing, and its fit waits for a middle double click. + ImPlotInputMap &input = ImPlot::GetInputMap(); + input.ZoomRate = 0; + input.Fit = ImGuiMouseButton_Middle; +} + +bool or_plot_begin(const char *id, float width, float height, bool set, OrPlotRect limits) { + if (!ImPlot::BeginPlot(id, ImVec2(width, height), ImPlotFlags_CanvasOnly | ImPlotFlags_Equal)) return false; + const ImPlotAxisFlags axes = ImPlotAxisFlags_NoDecorations | ImPlotAxisFlags_NoMenus | ImPlotAxisFlags_NoHighlight | + ImPlotAxisFlags_NoSideSwitch; + ImPlot::SetupAxes(nullptr, nullptr, axes, axes); + if (set) ImPlot::SetupAxesLimits(limits.x_min, limits.x_max, limits.y_min, limits.y_max, ImPlotCond_Always); + // The axes settle now, so that the plot's places are known before anything is drawn. + ImPlot::SetupFinish(); + return true; +} + +void or_plot_end(void) { ImPlot::EndPlot(); } + +OrPlotRect or_plot_limits(void) { + const ImPlotRect limits = ImPlot::GetPlotLimits(); + return OrPlotRect{limits.X.Min, limits.X.Max, limits.Y.Min, limits.Y.Max}; +} + +void or_plot_area(float rect[4]) { + const ImVec2 at = ImPlot::GetPlotPos(); + const ImVec2 size = ImPlot::GetPlotSize(); + rect[0] = at.x; + rect[1] = at.y; + rect[2] = at.x + size.x; + rect[3] = at.y + size.y; +} + +void or_plot_to_pixels(double x, double y, float pixels[2]) { + const ImVec2 at = ImPlot::PlotToPixels(x, y); + pixels[0] = at.x; + pixels[1] = at.y; +} + +void or_plot_from_pixels(float x, float y, double place[2]) { + const ImPlotPoint at = ImPlot::PixelsToPlot(x, y); + place[0] = at.x; + place[1] = at.y; +} + +void *or_plot_draw_list(void) { return ImPlot::GetPlotDrawList(); } + +void or_plot_push_clip(void) { ImPlot::PushPlotClipRect(); } + +void or_plot_pop_clip(void) { ImPlot::PopPlotClipRect(); } + +bool or_plot_drag_point(int id, double *x, double *y, float radius, bool *clicked, bool *hovered, bool *held) { + // Drawn clear: the caller draws the marker. + return ImPlot::DragPoint(id, x, y, ImVec4(0, 0, 0, 0), radius, ImPlotDragToolFlags_NoFit, clicked, hovered, held); +} + +} // extern "C" diff --git a/src/ui/plot/plot_shim.h b/src/ui/plot/plot_shim.h new file mode 100644 index 0000000..c992f71 --- /dev/null +++ b/src/ui/plot/plot_shim.h @@ -0,0 +1,48 @@ +/* ImPlot, which the Scene view's map draws with, through a C interface for the editor's Zig code + * (`plot.zig`): a plot with equal axes, what its axes show, its places on the screen, and points + * to drag. Places on the plot are doubles; on the screen, ImGui's pixels. */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* The part of the plot its axes show. */ +typedef struct OrPlotRect { + double x_min, x_max, y_min, y_max; +} OrPlotRect; + +void or_plot_create(void); +void or_plot_destroy(void); + +/* The plots' look, their background an ImGui packed colour, with no padding and no border; and their + * input, where the pointer pans them while the wheel and double clicks are left to the editor. */ +void or_plot_style(unsigned int background); + +/* Begins a plot `width` by `height` pixels, with equal axes and nothing else: no frame, grid, + * labels, ticks, menus or box zoom. With `set`, the axes show `limits` from this frame on. False + * where it isn't drawn; otherwise `or_plot_end` ends it. */ +bool or_plot_begin(const char *id, float width, float height, bool set, OrPlotRect limits); +void or_plot_end(void); + +/* What the axes show, the plot's area on the screen, and places between the two. */ +OrPlotRect or_plot_limits(void); +void or_plot_area(float rect[4]); +void or_plot_to_pixels(double x, double y, float pixels[2]); +void or_plot_from_pixels(float x, float y, double place[2]); + +/* The draw list over the plot, clipped to its area between `or_plot_push_clip` and + * `or_plot_pop_clip`. */ +void *or_plot_draw_list(void); +void or_plot_push_clip(void); +void or_plot_pop_clip(void); + +/* A point the pointer can drag, `radius` pixels around (`x`, `y`), which the caller draws: true + * while a drag moves it. */ +bool or_plot_drag_point(int id, double *x, double *y, float radius, bool *clicked, bool *hovered, bool *held); + +#ifdef __cplusplus +} +#endif diff --git a/src/ui/theme.zig b/src/ui/theme.zig index 9f41020..6a8f61d 100644 --- a/src/ui/theme.zig +++ b/src/ui/theme.zig @@ -22,6 +22,18 @@ pub fn fade(color: Color, opacity: f32) Color { return (color & 0x00ff_ffff) | a << 24; } +/// `color` mixed with white, `amount` of the way from 0 to 1: the lighter text of a flight group's +/// colour. +pub fn lighten(color: Color, amount: f32) Color { + var result: Color = color & 0xff00_0000; + for ([_]u5{ 0, 8, 16 }) |shift| { + const value: f32 = @floatFromInt((color >> shift) & 0xff); + const mixed: u32 = @intFromFloat(value + (255 - value) * std.math.clamp(amount, 0, 1) + 0.5); + result |= mixed << shift; + } + return result; +} + pub fn vec4(color: Color) c.ImVec4 { return .{ .x = @as(f32, @floatFromInt(color & 0xff)) / 255, @@ -46,6 +58,13 @@ pub const bar = rgb(0x0c0f15); pub const toolbar = rgb(0x0e1118); /// Code, the source views and the inspector's code. pub const code = rgb(0x0b0d12); +/// The map's ground and its grid: a line every few cells, and the cells' lines between them. +pub const map = rgb(0x0a0c11); +pub const map_grid = rgb(0x202839); +pub const map_grid_minor = rgb(0x131824); +/// A trigger's range's label on the map, and a curve, in the dim text's colour. +pub const range_text = rgb(0xf4b27a); +pub const curve = text_dim; /// The line under the source's tabs that says where the cursor is. pub const breadcrumbs = rgb(0x0d1017); /// Fields, search boxes, and switches' tracks. @@ -266,3 +285,10 @@ test rgb { try std.testing.expectEqual(@as(Color, 0xff2c8af0), rgb(0xf08a2c)); try std.testing.expectEqual(@as(Color, 0x242c8af0), fade(rgb(0xf08a2c), 0.14)); } + +test lighten { + // The player's blue, nearly half way to white: the design's light blue. + try std.testing.expectEqual(rgb(0xa8d1ff), lighten(rgb(0x5aa9ff), 0.47)); + try std.testing.expectEqual(rgb(0x5aa9ff), lighten(rgb(0x5aa9ff), 0)); + try std.testing.expectEqual(rgb(0xffffff), lighten(rgb(0x5aa9ff), 1)); +} diff --git a/src/ui/widgets.zig b/src/ui/widgets.zig index ba31dac..d8fdc50 100644 --- a/src/ui/widgets.zig +++ b/src/ui/widgets.zig @@ -430,6 +430,31 @@ pub const PanelTab = struct { } }; +/// A panel's own tab bar, as the source panel's: `tabs` side by side from its left on the bar's +/// colour, with its line under them. The tab clicked, if one is. +pub fn panelTabs(tabs: []const PanelTab) ?usize { + const at = gui.cursor(); + const width = gui.available().x; + const height = px(tab_bar_height); + const list = gui.drawList(); + gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.bar, 0); + gui.rect(list, .{ .x = at.x, .y = at.y + height - px(1) }, .{ .x = at.x + width, .y = at.y + height }, theme.tab_divider, 0); + var clicked: ?usize = null; + var x = at.x; + for (tabs, 0..) |tab, index| { + const tab_width = tab.width(); + gui.setCursor(.{ .x = x, .y = at.y }); + gui.pushIdInt(index); + if (c.ImGui_InvisibleButton("tab", .{ .x = tab_width, .y = height - px(1) }, 0)) clicked = index; + gui.popId(); + tab.draw(list, .{ .x = x, .y = at.y }, .{ .x = x + tab_width, .y = at.y + height - px(1) }, gui.hovered()); + if (tab.dot) gui.tooltip("Changed since saved"); + x += tab_width; + } + gui.setCursor(.{ .x = at.x, .y = at.y + height }); + return clicked; +} + pub const ViewTab = struct { label: []const u8, icon: Icon, @@ -699,11 +724,13 @@ pub const Frame = struct { mark: RowMark = .none, chevron: bool = true, disabled: ?Disabled = null, + /// Its width; by default the space left on the line. + width: ?f32 = null, }; /// The design's `.frame`: a field that opens a list, as the inspector's. pub fn frame(id: []const u8, shown: Frame) bool { - const width = gui.available().x; + const width = shown.width orelse gui.available().x; const height = px(26); const at = gui.cursor(); const clicked = c.ImGui_InvisibleButton(gui.z(id), .{ .x = @max(width, 1), .y = height }, 0) and shown.disabled == null; @@ -763,7 +790,7 @@ pub fn pick(id: []const u8, shown: Frame, choices: []const Choice) ?usize { gui.pushId(id); defer gui.popId(); const at = gui.cursor(); - const width = gui.available().x; + const width = shown.width orelse gui.available().x; if (frame("frame", shown)) _ = c.ImGui_OpenPopup("choices", 0); c.ImGui_SetNextWindowPos(.{ .x = at.x, .y = at.y + px(26) + px(2) }, c.ImGuiCond_Always); c.ImGui_SetNextWindowSizeConstraints(.{ .x = width, .y = 0 }, .{ .x = @max(width, px(240)), .y = px(320) }, null, null); @@ -783,18 +810,18 @@ pub fn pick(id: []const u8, shown: Frame, choices: []const Choice) ?usize { } const term = std.mem.sliceTo(&Find.text, 0); var chosen: ?usize = null; - for (choices, 0..) |choice, index| { - if (finding and term.len > 0 and std.ascii.findIgnoreCase(choice.label, term) == null) continue; + for (choices, 0..) |item, index| { + if (finding and term.len > 0 and std.ascii.findIgnoreCase(item.label, term) == null) continue; gui.pushIdInt(index); defer gui.popId(); - if (choiceRow(choice)) chosen = index; + if (choiceRow(item)) chosen = index; } if (chosen != null) c.ImGui_CloseCurrentPopup(); return chosen; } /// A row of a list to choose from, as `pick`'s. True when clicked. -pub fn choiceRow(choice: Choice) bool { +pub fn choiceRow(item: Choice) bool { const width = gui.available().x; const height = px(26); const at = gui.cursor(); @@ -802,12 +829,12 @@ pub fn choiceRow(choice: Choice) bool { const list = gui.drawList(); if (gui.hovered()) gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.row_hover, 3); const middle = at.y + height / 2; - var x = drawMark(list, at.x + px(8), middle, choice.mark); - if (choice.mono) gui.mono(.regular, fonts.size.ui) else gui.sans(.regular, fonts.size.ui); - gui.drawText(list, .{ .x = x, .y = gui.textTop(middle) }, if (choice.dim) theme.text_dim else theme.text, choice.label); - x += gui.textSize(choice.label).x + px(7); + var x = drawMark(list, at.x + px(8), middle, item.mark); + if (item.mono) gui.mono(.regular, fonts.size.ui) else gui.sans(.regular, fonts.size.ui); + gui.drawText(list, .{ .x = x, .y = gui.textTop(middle) }, if (item.dim) theme.text_dim else theme.text, item.label); + x += gui.textSize(item.label).x + px(7); gui.popFont(); - if (choice.detail) |detail| { + if (item.detail) |detail| { gui.mono(.regular, fonts.size.ui); gui.drawText(list, .{ .x = x, .y = gui.textTop(middle) }, theme.text_dim, detail); gui.popFont(); @@ -920,6 +947,73 @@ pub fn popBareInput() void { gui.popColor(4); } +/// How `choice` draws: the box's height, the space each side of a label, the labels' size, and the +/// corners' radius. The defaults are the settings' `.seg`. +pub const ChoiceLook = struct { + height: f32 = 30, + padding: f32 = 12, + font: f32 = fonts.size.ui, + rounding: f32 = 5, +}; + +/// The design's choice of a few, as the settings' `.seg` and the map's views: each option as wide +/// as its label, the one chosen lit. The option clicked, if one is. +pub fn choice(id: []const u8, options: []const []const u8, current: usize, look: ChoiceLook) ?usize { + gui.pushId(id); + defer gui.popId(); + gui.sans(.regular, look.font); + defer gui.popFont(); + // The options sit 3 pixels inside the box's line, 2 pixels apart. + const inset = px(3); + var width = inset * 2 + px(2) * @as(f32, @floatFromInt(options.len - 1)); + for (options) |option| width += gui.textSize(option).x + px(look.padding) * 2; + const height = px(look.height); + const at = gui.cursor(); + const list = gui.drawList(); + gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.field, look.rounding); + gui.outline(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.border, look.rounding); + var chosen: ?usize = null; + var x = at.x + inset; + for (options, 0..) |option, index| { + const item_width = gui.textSize(option).x + px(look.padding) * 2; + gui.setCursor(.{ .x = x, .y = at.y + inset }); + gui.pushIdInt(index); + if (c.ImGui_InvisibleButton("option", .{ .x = item_width, .y = height - inset * 2 }, 0)) chosen = index; + gui.popId(); + const on = index == current; + if (on) gui.rect(list, .{ .x = x, .y = at.y + inset }, .{ .x = x + item_width, .y = at.y + height - inset }, theme.border, 3); + gui.drawText(list, .{ .x = x + px(look.padding), .y = gui.textTop(at.y + height / 2) }, if (on) theme.white else theme.text_muted, option); + x += item_width + px(2); + } + gui.setCursor(at); + c.ImGui_Dummy(.{ .x = width, .y = height }); + return chosen; +} + +/// The design's `.chip` that turns something on and off, such as the map's Ranges: an icon and a +/// label, lit while on. True when clicked. +pub fn toggleChip(id: []const u8, label: []const u8, icon: Icon, on: bool, disabled: ?Disabled) bool { + gui.sans(.regular, fonts.size.small); + defer gui.popFont(); + const icon_size = fonts.size.icon_small; + const width = px(9) + px(icon_size) + px(6) + gui.textSize(label).x + px(9); + const height = px(24); + const at = gui.cursor(); + const clicked = c.ImGui_InvisibleButton(gui.z(id), .{ .x = width, .y = height }, 0) and disabled == null; + if (disabled == null) gui.handCursor(); + const list = gui.drawList(); + const max = gui.vec2(at.x + width, at.y + height); + const lit = on and disabled == null; + gui.rect(list, at, max, if (lit) theme.pill else theme.field, 4); + gui.outline(list, at, max, if (lit) theme.border_strong else theme.border, 4); + const color = if (disabled != null) theme.text_off else if (lit) theme.text_strong else theme.text_muted; + const middle = at.y + height / 2; + drawIcon(list, .{ .x = at.x + px(9), .y = middle }, icon, icon_size, color); + gui.drawText(list, .{ .x = at.x + px(9) + px(icon_size) + px(6), .y = gui.textTop(middle) }, color, label); + if (disabled) |off| gui.tooltip(off.reason); + return clicked; +} + /// The design's segmented switch, such as a trigger's Repeats: Once, Always, Counted. pub fn segmented(id: []const u8, options: []const []const u8, current: usize, disabled: ?Disabled) ?usize { gui.pushId(id); diff --git a/src/views/scene.zig b/src/views/scene.zig new file mode 100644 index 0000000..a3e6925 --- /dev/null +++ b/src/views/scene.zig @@ -0,0 +1,857 @@ +//! The Scene view: the mission's map, from above, from the side or from the front, with its ships +//! and markers where they start in their flight groups' colours, the ranges its triggers watch, its +//! curves, and the routes its script sends ships along (`game.Scene`). Things that would overlap on +//! the screen show as one mark, a cluster, which opens with a click, so that a mission spread over +//! areas far apart shows whole. The pointer pans and zooms the map. A ship or a marker dragged +//! moves where it starts, which rewrites its place in the source as one step of Undo, and what the +//! map selects is what the outline and the inspector show. `scene/drawing.zig` draws the map's +//! parts. + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const c = @import("c"); + +const app_mod = @import("../app.zig"); +const App = app_mod.App; +const commands = @import("../commands.zig"); +const drawing = @import("scene/drawing.zig"); +const Document = @import("../mission/document.zig").Document; +const game = @import("../game.zig"); +const source_edit = @import("../mission/edit.zig"); +const panels = @import("../panels.zig"); +const ui = @import("../ui.zig"); +const fonts = ui.fonts; +const gui = ui.gui; +const plot = ui.plot; +const theme = ui.theme; +const widgets = ui.widgets; +const Color = theme.Color; +const Icon = ui.icons.Icon; +const Vec2 = gui.Vec2; +const px = gui.px; + +/// How the map looks at the mission. +pub const Projection = enum { + top, + side, + front, + + /// The map's place of `place`, in the game's coordinates, where Y points down: its horizontal + /// coordinate, then its vertical one, which points up. + pub fn project(projection: Projection, place: [3]f64) [2]f64 { + return switch (projection) { + .top => .{ place[0], place[2] }, + .side => .{ place[2], -place[1] }, + .front => .{ place[0], -place[1] }, + }; + } + + /// The game's place of `at` on the map, with the coordinate the map doesn't show kept from + /// `kept`. + pub fn unproject(projection: Projection, at: [2]f64, kept: [3]f64) [3]f64 { + return switch (projection) { + .top => .{ at[0], kept[1], at[1] }, + .side => .{ kept[0], -at[1], at[0] }, + .front => .{ at[0], -at[1], kept[2] }, + }; + } + + /// The game's coordinates the map shows, across and up, by their index in a place. + fn axes(projection: Projection) [2]usize { + return switch (projection) { + .top => .{ 0, 2 }, + .side => .{ 2, 1 }, + .front => .{ 0, 1 }, + }; + } + + /// The note in the map's corner, which says which way its axes point. + fn note(projection: Projection) []const u8 { + return switch (projection) { + .top => "X right · Z up", + .side => "Z right · Y down", + .front => "X right · Y down", + }; + } + + fn label(projection: Projection) []const u8 { + return switch (projection) { + .top => "Top", + .side => "Side", + .front => "Front", + }; + } +}; + +/// A record the map places, by its section and its place among the section's. +const Ref = struct { + section: game.Section, + index: usize, + + fn of(thing: game.Thing) Ref { + return .{ .section = thing.section, .index = thing.index }; + } + + fn eql(ref: Ref, other: Ref) bool { + return ref.section == other.section and ref.index == other.index; + } +}; + +/// What the map keeps from one frame to the next. +const Map = struct { + var projection: Projection = .top; + var ranges: bool = true; + var routes: bool = true; + var curves: bool = false; + /// Whether the axes fit the mission on the next frame: as the map first shows, as Fit asks, + /// and as the projection changes. + var fit: bool = true; + /// The record the map keeps in its middle. + var follow: ?Ref = null; + /// The record being dragged, and where it is now. + var dragging: ?struct { ref: Ref, place: [3]f64 } = null; + /// What the axes showed last, whose size Follow keeps, and where the map was on the screen. + var shown: ?plot.Rect = null; + var area: ?[2]Vec2 = null; + /// The mission the map last fitted, by its path: one opened anew shows whole. + var fitted_for: u64 = 0; + /// The places a click on a cluster opens on the next frame, and when the last one did, so that + /// the second click of a double click doesn't fit the mission again. + var zoom_to: ?[2][2]f64 = null; + var zoomed_at: f64 = -1; + /// The first thing of the cluster whose list is open. + var listed: ?Ref = null; + /// The place on the map under the pointer, for the status bar. + var pointer: ?[2]f64 = null; +}; + +/// The pixels around a marker's middle that the pointer takes it by. +const grab_radius = 11; +/// The marks' sizes, in design pixels: a ship's or a marker's, the player's, a camera point's and a +/// planet's (a cluster's is `drawing.cluster_size`). +const marker_size = 18; +const player_size = 20; +const camera_size = 8; +const scenery_size = 14; +/// How close on the screen, in pixels, things draw as one cluster. +const cluster_radius = 14; +/// The least the map shows across, in the game's units, as it fits the mission and as it opens a +/// cluster. +const least_fit = 4000; +const least_opened = 400; +/// How many of a cluster's things its tooltip names, and the least width, in design pixels, of the +/// list of things too close together to show apart. +const most_listed = 12; +const list_width = 200; +/// How much lighter than its group's colour the player's name is. +const player_tint = 0.47; +/// How much a notch of the wheel zooms, and how far in and out the map goes, in the game's +/// units across. +const zoom_step = 1.25; +const least_across = 200; +const most_across = 1e9; +/// The places a drag with Shift held snaps to, in the game's units. +const snap = 100; + +pub fn draw(app: *App) void { + const document = app.document orelse return; + if (widgets.panelTabs(&.{ + .{ .label = "Map", .icon = .map, .icon_color = theme.accent, .on = true }, + .{ .label = document.file, .icon = .file_code, .dot = document.dirty() }, + })) |index| if (index == 1) app.run(.view_1); + const scene = document.scene() catch return; + toolbar(document, scene); + map(app, document, scene); +} + +/// The status bar's part while the map shows: the projection, and the place under the pointer. +pub fn status() []const u8 { + const projection = Map.projection; + const at = Map.pointer orelse return gui.print("Map · {s}", .{lower(projection.label())}); + const names = axisNames(projection); + return gui.print("Map · {s} · {s} {s} · {s} {s}", .{ lower(projection.label()), names[0], drawing.distance(at[0]), names[1], drawing.distance(projectedValue(projection, at, 1)) }); +} + +/// The names of the game's coordinates across and up the map: `x` and `z` from above. +fn axisNames(projection: Projection) [2][]const u8 { + const names = [_][]const u8{ "x", "y", "z" }; + const axes = projection.axes(); + return .{ names[axes[0]], names[axes[1]] }; +} + +/// The game's coordinate `which` of a place on the map, 0 across and 1 up: up is Y's opposite on +/// the side and the front. +fn projectedValue(projection: Projection, at: [2]f64, which: usize) f64 { + if (which == 1 and projection != .top) return -at[1]; + return at[which]; +} + +fn lower(text: []const u8) []const u8 { + return std.ascii.lowerString(gui.frameAllocator().alloc(u8, text.len) catch return text, text); +} + +/// The map's toolbar: the projection, what it shows, the record it follows, and Fit. +fn toolbar(document: *Document, scene: game.Scene) void { + const at = gui.cursor(); + const width = gui.available().x; + const height = px(36); + const list = gui.drawList(); + gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.toolbar, 0); + gui.rect(list, .{ .x = at.x, .y = at.y + height - px(1) }, .{ .x = at.x + width, .y = at.y + height }, theme.divider, 0); + const middle = at.y + height / 2; + var x = at.x + px(10); + + gui.setCursor(.{ .x = x, .y = middle - px(13) }); + const projections = [_][]const u8{ Projection.top.label(), Projection.side.label(), Projection.front.label() }; + if (widgets.choice("projection", &projections, @backingInt(Map.projection), .{ .height = 26, .padding = 9, .font = fonts.size.small, .rounding = 4 })) |chosen| { + if (chosen != @backingInt(Map.projection)) { + Map.projection = @fromBackingInt(@as(u2, @intCast(chosen))); + Map.fit = true; + } + } + x = gui.lastItemRight() + px(8); + gui.rect(list, .{ .x = x, .y = middle - px(9) }, .{ .x = x + px(1), .y = middle + px(9) }, theme.border, 0); + x += px(9); + const live_planned: widgets.Disabled = .{ .reason = gui.print("Planned · {f}", .{commands.plans.live_scene}) }; + const chips = [_]struct { []const u8, []const u8, Icon, ?*bool }{ + .{ "live", "Live", .radio, null }, + .{ "ranges", "Ranges", .circle_dashed, &Map.ranges }, + .{ "routes", "Routes", .route, &Map.routes }, + .{ "orders", "Orders", .arrow_up_right, null }, + .{ "curves", "Curves", .spline, &Map.curves }, + }; + for (chips) |chip| { + gui.setCursor(.{ .x = x, .y = middle - px(12) }); + if (widgets.toggleChip(chip[0], chip[1], chip[2], if (chip[3]) |on| on.* else false, if (chip[3] == null) live_planned else null)) { + if (chip[3]) |on| on.* = !on.*; + } + x = gui.lastItemRight() + px(6); + } + + // At the end: Follow, and Fit. + const fit_width = px(30); + const follow_width = px(120); + var right = at.x + width - px(10) - fit_width; + gui.setCursor(.{ .x = right, .y = middle - px(13) }); + if (widgets.toolButton("fit", .{ .icon = .scan, .icon_only = true, .height = 26, .tooltip = "Zoom to fit the mission" })) Map.fit = true; + right -= px(6) + follow_width; + gui.setCursor(.{ .x = right, .y = middle - px(13) }); + followPick(document, scene, follow_width); + gui.sans(.regular, fonts.size.small); + const follow_label = "Follow"; + gui.drawText(list, .{ .x = right - px(6) - gui.textSize(follow_label).x, .y = gui.textTop(middle) }, theme.text_dim, follow_label); + gui.popFont(); + gui.setCursor(.{ .x = at.x, .y = at.y + height }); +} + +/// Follow's list: none, or a ship, which the map then keeps in its middle. +fn followPick(document: *Document, scene: game.Scene, width: f32) void { + const known = document.outline(); + const allocator = gui.frameAllocator(); + var choices: std.ArrayList(widgets.Choice) = .empty; + var refs: std.ArrayList(?Ref) = .empty; + choices.append(allocator, .{ .label = "none", .dim = true }) catch return; + refs.append(allocator, null) catch return; + var current: ?*const game.Record = null; + for (scene.things) |thing| { + if (thing.section != .ships) continue; + const record = known.nth(thing.section, thing.index) orelse continue; + choices.append(allocator, .{ .label = record.title, .mark = .{ .icon = .{ .icon = .navigation_2, .color = panels.groupColor(record.*) } } }) catch return; + refs.append(allocator, Ref.of(thing)) catch return; + if (Map.follow) |followed| if (followed.eql(Ref.of(thing))) { + current = record; + }; + } + const frame: widgets.Frame = if (current) |record| + .{ .label = record.title, .mark = .{ .icon = .{ .icon = .navigation_2, .color = panels.groupColor(record.*) } }, .width = width } + else + .{ .label = "none", .dim_label = true, .width = width }; + if (widgets.pick("follow", frame, choices.items)) |index| Map.follow = refs.items[index]; +} + +/// The map: the grid, the ranges and the curves, then the ships and markers, gathered into one +/// mark where they would overlap, each named where its name has room, and over them the legend, +/// the scale and the axes' note. The pointer pans the map and zooms it with the wheel, selects and +/// drags a thing, and opens a cluster with a click; a double click fits the mission. +fn map(app: *App, document: *Document, scene: game.Scene) void { + const size = gui.available(); + if (size.x < 1 or size.y < 1) return; + const known = document.outline(); + const projection = Map.projection; + const opened = std.hash.Wyhash.hash(0, document.path); + if (Map.fitted_for != opened) { + Map.fitted_for = opened; + Map.fit = true; + } + var wanted: ?plot.Rect = if (Map.fit) fitted(scene, projection, size) else if (Map.zoom_to) |bounds| framed(bounds, size, least_opened) else wheeled(); + Map.fit = false; + Map.zoom_to = null; + if (Map.follow) |followed| if (thingOf(scene, followed)) |thing| if (wanted orelse Map.shown) |around| { + wanted = centredOn(around, projection.project(placeOf(thing))); + }; + if (!plot.begin("##map", size, wanted)) return; + defer plot.end(); + Map.shown = plot.limits(); + Map.area = plot.area(); + const list = plot.drawList(); + defer plot.popClip(); + const corners = Map.area.?; + const shown = Map.shown.?; + const scale = (corners[1].x - corners[0].x) / @as(f32, @floatCast(shown.x_max - shown.x_min)); + const cell = drawing.cellOf(scale); + drawing.grid(list, shown, cell); + const rings: []const Ring = if (Map.ranges) drawRanges(list, scene, projection, scale, corners) else &.{}; + if (Map.curves) for (scene.curves) |path| drawCurve(list, projection, path); + + const inspected = app.inspected(); + const selected: ?Ref = if (inspected) |record| refOf(scene, record.*) else null; + const gathered = gather(scene, projection, selected) catch return; + const lines: []const [2]Vec2 = if (Map.routes) drawRoutes(list, scene, gathered, projection, if (inspected) |record| record.* else null, corners) else &.{}; + const pointer = pointerOnMap(); + var hovered: ?usize = null; + for (gathered.marks, 0..) |*mark, which| { + const thing = scene.things[mark.first]; + const record = known.nth(thing.section, thing.index) orelse continue; + const color = panels.groupColor(record.*); + if (mark.count > 1) { + drawing.cluster(list, mark.middle, mark.count, color); + if (pointer) |at| if (drawing.isInside(at, mark.box())) { + hovered = which; + }; + continue; + } + const ref = Ref.of(thing); + const dragged = if (Map.dragging) |drag| drag.ref.eql(ref) else false; + var at = projection.project(placeOf(thing)); + const drag = plot.dragPoint(mark.first, &at, px(grab_radius)); + if (drag.hovered or drag.held) hovered = which; + if (drag.clicked) app.select(record.*); + if (drag.held) { + if (c.ImGui_GetIO().*.KeyShift) at = .{ @round(at[0] / snap) * snap, @round(at[1] / snap) * snap }; + Map.dragging = .{ .ref = ref, .place = projection.unproject(at, thing.place) }; + } else if (dragged) { + // Let go: the place goes into the source, where it moved. + const moved = Map.dragging.?.place; + Map.dragging = null; + if (!std.meta.eql(moved, thing.place)) moveTo(document, scene, record.*, moved); + } + mark.middle = plot.toPixels(at); + if (drag.hovered or drag.held) gui.dot(list, mark.middle, mark.size / 2 + 6, theme.fade(theme.text, 0.08)); + drawing.thing(list, mark.middle, thing.kind, if (thing.heading) |heading| projection.project(heading) else null, mark.size, color); + } + + var labels: drawing.Labels = .{ .corners = corners, .lines = lines }; + for (gathered.marks) |mark| labels.take(mark.box()); + const named = nameMarks(list, &labels, scene, known, gathered.marks); + for (rings) |ring| nameRing(list, &labels, ring); + for (gathered.marks) |mark| { + const thing = scene.things[mark.first]; + if (mark.count > 1 or selected == null or !selected.?.eql(Ref.of(thing))) continue; + const place = placeOf(thing); + const axes = projection.axes(); + drawing.brackets(list, mark.middle, px(mark.size) / 2 + px(5)); + drawing.placeNote(list, mark.middle, axisNames(projection), .{ place[axes[0]], place[axes[1]] }); + } + if (hovered) |which| { + const mark = gathered.marks[which]; + if (mark.count > 1) { + c.ImGui_SetMouseCursor(c.ImGuiMouseCursor_Hand); + gui.tooltipNow(memberNames(scene, known, gathered, which, size)); + if (isClick(mark.middle, px(drawing.cluster_size) / 2)) openMark(scene, mark, size); + } else if (!named[which]) { + if (known.nth(scene.things[mark.first].section, scene.things[mark.first].index)) |record| gui.tooltipNow(record.title); + } + } + listMembers(app, scene, known, gathered); + // A click on an empty part of the map clears the selection. + if (hovered == null) if (pointer) |at| if (isClick(at, px(4))) { + app.selection = null; + }; + // A double click away from the things fits the mission again. + const settled = c.ImGui_GetTime() - Map.zoomed_at > c.ImGui_GetIO().*.MouseDoubleClickTime; + if (pointer != null and hovered == null and settled and c.ImGui_IsMouseDoubleClicked(0)) Map.fit = true; + + drawing.legend(list, corners[0], Map.routes and scene.routes.len > 0); + drawing.scaleBar(list, .{ .x = corners[0].x + px(12), .y = corners[1].y - px(12) }, cell, scale); + gui.sans(.regular, 11); + const note = projection.note(); + gui.drawText(list, .{ .x = corners[1].x - px(12) - gui.textSize(note).x, .y = corners[1].y - px(12) - c.ImGui_GetFontSize() }, theme.text_dim, note); + gui.popFont(); + if (scene.player) |player| { + const thing = scene.things[player]; + if (known.nth(thing.section, thing.index)) |record| drawStartOffMap(list, corners, shown, projection, thing, record.*); + } + Map.pointer = if (pointer) |at| plot.fromPixels(at) else null; +} + +/// Where the pointer is, while it's over the map and not over something in front of it. +fn pointerOnMap() ?Vec2 { + if (!c.ImGui_IsWindowHovered(0)) return null; + const mouse = c.ImGui_GetMousePos(); + return if (drawing.isInside(mouse, Map.area orelse return null)) mouse else null; +} + +/// Whether the left button has just been let go after a press within `radius` of `middle`, with +/// no drag between. +fn isClick(middle: Vec2, radius: f32) bool { + if (!c.ImGui_IsMouseReleased(0)) return false; + const io = c.ImGui_GetIO(); + const delta = c.ImGui_GetMouseDragDelta(0, -1); + return delta.x == 0 and delta.y == 0 and drawing.distanceTo(io.*.MouseClickedPos[0], middle) <= radius; +} + +/// Whether zooming in to a cluster's things, on a map `size` big, shows them apart. +fn opensApart(mark: Mark, size: Vec2) bool { + const opened = framed(.{ mark.low, mark.high }, size, least_opened); + const scale = size.x / (opened.x_max - opened.x_min); + return @max(mark.high[0] - mark.low[0], mark.high[1] - mark.low[1]) * scale >= px(cluster_radius); +} + +/// Opens a cluster: zooms in to its things where that shows them apart, or lists them where they +/// lie too close together. +fn openMark(scene: game.Scene, mark: Mark, size: Vec2) void { + if (opensApart(mark, size)) { + Map.zoom_to = .{ mark.low, mark.high }; + Map.zoomed_at = c.ImGui_GetTime(); + } else { + Map.listed = Ref.of(scene.things[mark.first]); + _ = c.ImGui_OpenPopup("members", 0); + } +} + +/// The list of a cluster's things that lie too close together to show apart. A click on one +/// selects it. +fn listMembers(app: *App, scene: game.Scene, known: game.Outline, gathered: Gathered) void { + if (!c.ImGui_BeginPopup("members", c.ImGuiWindowFlags_NoMove)) return; + defer c.ImGui_EndPopup(); + const listed = Map.listed orelse return c.ImGui_CloseCurrentPopup(); + const which = for (gathered.marks, 0..) |mark, index| { + if (Ref.of(scene.things[mark.first]).eql(listed)) break index; + } else return c.ImGui_CloseCurrentPopup(); + c.ImGui_Dummy(.{ .x = px(list_width), .y = 0 }); + for (scene.things, gathered.owners, 0..) |thing, owner, index| { + if (owner != which) continue; + const record = known.nth(thing.section, thing.index) orelse continue; + gui.pushIdInt(index); + defer gui.popId(); + const mark: widgets.RowMark = .{ .icon = .{ .icon = kindIcon(thing.kind), .color = panels.groupColor(record.*) } }; + if (widgets.choiceRow(.{ .label = record.title, .mark = mark })) { + app.select(record.*); + c.ImGui_CloseCurrentPopup(); + } + } +} + +fn kindIcon(kind: game.ThingKind) Icon { + return switch (kind) { + .ship => .navigation_2, + .marker => .diamond, + .camera => .circle_dot, + .scenery => .circle, + }; +} + +/// The names of a cluster's things, for its tooltip: the first `most_listed`, how many +/// more, and what a click does on a map `size` big. +fn memberNames(scene: game.Scene, known: game.Outline, gathered: Gathered, which: usize, size: Vec2) []const u8 { + var text: std.Io.Writer.Allocating = .init(gui.frameAllocator()); + const writer = &text.writer; + var count: usize = 0; + for (scene.things, gathered.owners) |thing, owner| { + if (owner != which) continue; + count += 1; + if (count > most_listed) continue; + const record = known.nth(thing.section, thing.index) orelse continue; + writer.print("{s}{s}", .{ if (count > 1) "\n" else "", record.title }) catch return ""; + } + if (count > most_listed) writer.print("\n{d} more", .{count - most_listed}) catch return ""; + writer.writeAll(if (opensApart(gathered.marks[which], size)) "\nClick to zoom in" else "\nClick to choose one") catch return ""; + return text.written(); +} + +/// What the map draws for a thing, or for several that would overlap on the screen. +const Mark = struct { + /// The thing it's for, the most important where it's for several, by its place in the scene. + first: usize, + count: usize, + middle: Vec2, + /// The map's places its things span, which a click on a cluster opens. + low: [2]f64, + high: [2]f64, + /// Its marker's height and width, in design pixels: a cluster is wider for a count of + /// three figures. + size: f32, + width: f32, + + /// Where its marker covers the map. + fn box(mark: Mark) [2]Vec2 { + const half: Vec2 = .{ .x = px(mark.width) / 2, .y = px(mark.size) / 2 }; + return .{ .{ .x = mark.middle.x - half.x, .y = mark.middle.y - half.y }, .{ .x = mark.middle.x + half.x, .y = mark.middle.y + half.y } }; + } +}; + +/// The map's marks, and the mark each thing of the scene is in, by its place among the marks; a +/// camera point, while the curves are hidden, is in none. +const Gathered = struct { + marks: []Mark, + owners: []const usize, +}; + +/// The things the map shows as marks, the most important first: the selected thing, the player, +/// the ships, the markers, the camera's points where the curves show, and the scenery. A thing +/// within `cluster_radius` of a mark on the screen joins it, but for the selected thing and the +/// one being dragged, which stay apart. +fn gather(scene: game.Scene, projection: Projection, selected: ?Ref) Allocator.Error!Gathered { + const allocator = gui.frameAllocator(); + var order: std.ArrayList(usize) = .empty; + for (scene.things, 0..) |thing, index| { + if (thing.kind == .camera and !Map.curves) continue; + try order.append(allocator, index); + } + const Order = struct { + scene: game.Scene, + selected: ?Ref, + fn lessThan(context: @This(), a: usize, b: usize) bool { + const first = importance(context.scene, a, context.selected); + const second = importance(context.scene, b, context.selected); + return if (first != second) first < second else a < b; + } + }; + std.mem.sort(usize, order.items, Order{ .scene = scene, .selected = selected }, Order.lessThan); + const owners = try allocator.alloc(usize, scene.things.len); + @memset(owners, std.math.maxInt(usize)); + var marks: std.ArrayList(Mark) = .empty; + things: for (order.items) |index| { + const thing = scene.things[index]; + const at = projection.project(placeOf(thing)); + const middle = plot.toPixels(at); + if (!isApart(Ref.of(thing), selected)) for (marks.items, 0..) |*mark, which| { + if (isApart(Ref.of(scene.things[mark.first]), selected)) continue; + if (drawing.distanceTo(mark.middle, middle) > px(cluster_radius)) continue; + mark.count += 1; + mark.size = drawing.cluster_size; + mark.width = drawing.clusterWidth(mark.count); + const point: @Vector(2, f64) = at; + const low: @Vector(2, f64) = mark.low; + const high: @Vector(2, f64) = mark.high; + mark.low = @min(low, point); + mark.high = @max(high, point); + owners[index] = which; + continue :things; + }; + owners[index] = marks.items.len; + const size = sizeOf(scene, index); + try marks.append(allocator, .{ .first = index, .count = 1, .middle = middle, .low = at, .high = at, .size = size, .width = size }); + } + return .{ .marks = marks.items, .owners = owners }; +} + +/// How important the thing at `index` in the scene is to the map: 0 is the most important. +fn importance(scene: game.Scene, index: usize, selected: ?Ref) u8 { + const thing = scene.things[index]; + if (isApart(Ref.of(thing), selected)) return 0; + if (scene.player == index) return 1; + return switch (thing.kind) { + .ship => 2, + .marker => 3, + .camera => 4, + .scenery => 5, + }; +} + +/// Whether a thing stays apart from the others: it's selected, or being dragged. +fn isApart(ref: Ref, selected: ?Ref) bool { + if (selected) |chosen| if (chosen.eql(ref)) return true; + if (Map.dragging) |drag| if (drag.ref.eql(ref)) return true; + return false; +} + +fn sizeOf(scene: game.Scene, index: usize) f32 { + if (scene.player == index) return player_size; + return switch (scene.things[index].kind) { + .ship, .marker => marker_size, + .camera => camera_size, + .scenery => scenery_size, + }; +} + +/// The scene's thing for `record`, where the map places it. +fn refOf(scene: game.Scene, record: game.Record) ?Ref { + const ref: Ref = .{ .section = record.section, .index = record.index }; + return if (thingOf(scene, ref) != null) ref else null; +} + +/// The axes the wheel asks for, zoomed by `zoom_step` a notch around the place under the pointer, +/// where the pointer is over the map; null otherwise. +fn wheeled() ?plot.Rect { + const wheel = c.ImGui_GetIO().*.MouseWheel; + if (wheel == 0) return null; + const mouse = pointerOnMap() orelse return null; + const area = Map.area.?; + const last = Map.shown orelse return null; + const across: f64 = (mouse.x - area[0].x) / (area[1].x - area[0].x); + const down: f64 = (mouse.y - area[0].y) / (area[1].y - area[0].y); + const at: [2]f64 = .{ last.x_min + across * (last.x_max - last.x_min), last.y_max - down * (last.y_max - last.y_min) }; + const width = last.x_max - last.x_min; + const factor = std.math.clamp(std.math.pow(f64, zoom_step, -wheel), least_across / width, most_across / width); + return .{ + .x_min = at[0] + (last.x_min - at[0]) * factor, + .x_max = at[0] + (last.x_max - at[0]) * factor, + .y_min = at[1] + (last.y_min - at[1]) * factor, + .y_max = at[1] + (last.y_max - at[1]) * factor, + }; +} + +/// Puts where `record` starts at `place`, in its table's place field, as one step of Undo, once +/// the frame is drawn. +fn moveTo(document: *Document, scene: game.Scene, record: game.Record, place: [3]f64) void { + const value = source_edit.vector(gui.frameAllocator(), &place) catch return; + document.queue(.{ .edit = .{ .section = record.section, .index = record.index, .edit = .{ .field = .{ .name = scene.place_field, .value = value } } } }); +} + +/// The scene's thing for a record. +fn thingOf(scene: game.Scene, ref: Ref) ?game.Thing { + return scene.things[indexOf(scene, ref) orelse return null]; +} + +/// Where the scene lists a record's thing. +fn indexOf(scene: game.Scene, ref: Ref) ?usize { + for (scene.things, 0..) |thing, index| if (Ref.of(thing).eql(ref)) return index; + return null; +} + +/// Where a thing is now: where a drag has it, or where it starts. +fn placeOf(thing: game.Thing) [3]f64 { + if (Map.dragging) |drag| if (drag.ref.eql(Ref.of(thing))) return drag.place; + return thing.place; +} + +/// The axes that show the mission: its ships and markers, and the camera's points where the +/// curves show, but not its scenery, which lies far off; every thing where that's all it has. +fn fitted(scene: game.Scene, projection: Projection, size: Vec2) plot.Rect { + var low: @Vector(2, f64) = @splat(std.math.inf(f64)); + var high: @Vector(2, f64) = @splat(-std.math.inf(f64)); + for ([_]bool{ false, true }) |everything| { + for (scene.things) |thing| { + if (!everything and (thing.kind == .scenery or (thing.kind == .camera and !Map.curves))) continue; + const at: @Vector(2, f64) = projection.project(thing.place); + low = @min(low, at); + high = @max(high, at); + } + if (low[0] <= high[0]) break; + } + if (low[0] > high[0]) return framed(.{ @splat(0), @splat(0) }, size, least_fit); + return framed(.{ low, high }, size, least_fit); +} + +/// The axes that show `bounds`, with a margin of a tenth each side and at least `least` across and +/// up, at the map's aspect. +fn framed(bounds: [2][2]f64, size: Vec2, least: f64) plot.Rect { + const across = @max(bounds[1][0] - bounds[0][0], least) * 1.2; + const up = @max(bounds[1][1] - bounds[0][1], least) * 1.2; + const middle: [2]f64 = .{ (bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2 }; + // Equal axes: the side that's too short for the map's shape grows. + const aspect: f64 = size.x / size.y; + const width = @max(across, up * aspect); + const height = width / aspect; + return .{ .x_min = middle[0] - width / 2, .x_max = middle[0] + width / 2, .y_min = middle[1] - height / 2, .y_max = middle[1] + height / 2 }; +} + +/// `last` moved to have `middle` in its middle. +fn centredOn(last: plot.Rect, middle: [2]f64) plot.Rect { + const half_across = (last.x_max - last.x_min) / 2; + const half_up = (last.y_max - last.y_min) / 2; + return .{ .x_min = middle[0] - half_across, .x_max = middle[0] + half_across, .y_min = middle[1] - half_up, .y_max = middle[1] + half_up }; +} + +/// Each mark's name, the most important first: right of its marker, else left, below or above, +/// wherever it covers no mark and no name placed before it. Returns which marks have their name +/// shown; the others show it as the pointer comes over them. +fn nameMarks(list: *c.ImDrawList, labels: *drawing.Labels, scene: game.Scene, known: game.Outline, marks: []const Mark) []const bool { + const named = gui.frameAllocator().alloc(bool, marks.len) catch return &.{}; + @memset(named, false); + gui.sans(.regular, fonts.size.smaller); + defer gui.popFont(); + const height = c.ImGui_GetFontSize(); + for (marks, named) |mark, *shown| { + const thing = scene.things[mark.first]; + const record = known.nth(thing.section, thing.index) orelse continue; + const text = if (mark.count > 1) gui.print("{s} +{d}", .{ record.title, mark.count - 1 }) else record.title; + const color = if (scene.player == mark.first) + theme.lighten(panels.groupColor(record.*), player_tint) + else switch (thing.kind) { + .ship, .marker => theme.text, + .camera, .scenery => theme.text_dim, + }; + const width = gui.textSize(text).x; + const box = mark.box(); + const gap = px(5); + const spots = [_]Vec2{ + .{ .x = box[1].x + gap, .y = mark.middle.y - height / 2 }, + .{ .x = box[0].x - gap - width, .y = mark.middle.y - height / 2 }, + .{ .x = mark.middle.x - width / 2, .y = box[1].y + px(2) }, + .{ .x = mark.middle.x - width / 2, .y = box[0].y - px(2) - height }, + }; + const at = labels.place(&spots, .{ .x = width, .y = height }) orelse continue; + drawing.label(list, at, .{ .x = width, .y = height }, color, text); + shown.* = true; + } + return named; +} + +/// A ring the map draws, for its label. +const Ring = struct { + middle: Vec2, + radius: f32, + range: game.Range, +}; + +/// The ranges, each ring once however many triggers watch it: a trigger's as a dashed ring with a +/// faint fill, a hint's as a dotted one. Returns the rings drawn, for their labels. +fn drawRanges(list: *c.ImDrawList, scene: game.Scene, projection: Projection, scale: f32, corners: [2]Vec2) []const Ring { + var rings: std.ArrayList(Ring) = .empty; + ranges: for (scene.ranges, 0..) |range, index| { + for (scene.ranges[0..index]) |before| { + if (before.section == range.section and before.index == range.index and before.radius == range.radius and before.style == range.style) continue :ranges; + } + const subject = thingOf(scene, .{ .section = range.section, .index = range.index }) orelse continue; + const middle = plot.toPixels(projection.project(placeOf(subject))); + const radius = @as(f32, @floatCast(range.radius)) * scale; + const reach = drawing.reachOf(middle, corners); + // A ring smaller than a few pixels, or one the map lies outside, shows nothing; one the + // map lies inside shows only its fill. + if (radius < px(4) or radius < reach[0]) continue; + const shows = radius <= reach[1]; + switch (range.style) { + .trigger => { + const fill = theme.fade(theme.accent, 0.035); + if (shows) c.ImDrawList_AddCircleFilled(list, middle, radius, fill, 0) else gui.rect(list, corners[0], corners[1], fill, 0); + if (shows) drawing.dashedCircle(list, middle, radius, theme.fade(theme.accent, 0.55), 5, 4, corners); + }, + .hint => if (shows) drawing.dashedCircle(list, middle, radius, theme.fade(theme.text_menu, 0.3), 1.5, 3, corners), + } + if (shows) rings.append(gui.frameAllocator(), .{ .middle = middle, .radius = radius, .range = range }) catch break; + } + return rings.items; +} + +/// A ring's label, inside it at its top or else at its bottom, where the ring is wide enough to +/// hold it and the label covers no mark and no name. +fn nameRing(list: *c.ImDrawList, labels: *drawing.Labels, ring: Ring) void { + gui.sans(.regular, 11); + defer gui.popFont(); + const text = gui.print("{s} · {s}", .{ ring.range.label, drawing.distance(ring.range.radius) }); + const size = gui.textSize(text); + if (size.x + px(40) > ring.radius * 2) return; + const left = ring.middle.x - size.x / 2; + const spots = [_]Vec2{ + .{ .x = left, .y = ring.middle.y - ring.radius + px(6) }, + .{ .x = left, .y = ring.middle.y + ring.radius - px(6) - size.y }, + }; + const at = labels.place(&spots, size) orelse return; + const color = switch (ring.range.style) { + .trigger => theme.range_text, + .hint => theme.text_muted, + }; + drawing.label(list, at, size, color, text); +} + +fn drawCurve(list: *c.ImDrawList, projection: Projection, path: []const [3]f64) void { + for (path) |place| c.ImDrawList_PathLineTo(list, plot.toPixels(projection.project(place))); + c.ImDrawList_PathStroke(list, theme.curve, px(1.4), 0); +} + +/// The routes, under the marks: each leg from mark to mark, dotted where the ship flies and dashed +/// where it jumps, in its group's colour, with an arrowhead where it goes and a ring where its +/// route starts. A leg within one cluster shows nothing, and a leg several routes share shows once. +/// With a ship, a group or a marker selected, the routes it's on show brighter and the others +/// faint. Returns the legs drawn, as lines on the screen. +fn drawRoutes(list: *c.ImDrawList, scene: game.Scene, gathered: Gathered, projection: Projection, inspected: ?game.Record, corners: [2]Vec2) []const [2]Vec2 { + var lines: std.ArrayList([2]Vec2) = .empty; + const selected: ?usize = if (inspected) |record| indexOf(scene, .{ .section = record.section, .index = record.index }) else null; + // A ship's group, or a group itself: the routes of the group show too. + const selected_group: ?usize = if (inspected) |record| switch (record.section) { + .ships, .flight_groups => record.group, + else => null, + } else null; + const Drawn = struct { from: usize, to: usize, way: game.Way, color: Color }; + var drawn: std.AutoHashMapUnmanaged(Drawn, void) = .empty; + for (scene.routes) |route| { + const base = if (route.group) |group| theme.groups[group % theme.groups.len] else theme.text_dim; + for (route.legs) |leg| { + const from = endOf(scene, gathered, projection, leg.from); + const to = endOf(scene, gathered, projection, leg.to); + if (from.mark != null and from.mark == to.mark) continue; + const focus: f32 = if (inspected == null) 0.75 else if (isOnRoute(route, leg, selected, selected_group)) 1 else 0.3; + const color = theme.fade(base, focus); + const key: Drawn = .{ .from = from.key(leg.from), .to = to.key(leg.to), .way = leg.way, .color = color }; + const seen = drawn.getOrPut(gui.frameAllocator(), key) catch return lines.items; + if (seen.found_existing) continue; + const line = drawing.leg(list, from, to, .{ .way = leg.way, .starts = leg.starts, .color = color }, corners) orelse continue; + lines.append(gui.frameAllocator(), line) catch return lines.items; + } + } + return lines.items; +} + +/// Whether a leg of `route` is on the selection: the selected ship's route, its group's, or a leg +/// to or from the selected marker. +fn isOnRoute(route: game.Route, leg: game.Leg, selected: ?usize, selected_group: ?usize) bool { + if (selected) |thing| { + if (route.ship == thing or leg.from == thing or leg.to == thing) return true; + } + if (route.ship == null) if (route.group) |group| if (selected_group == group) return true; + return false; +} + +/// Where a leg meets the thing at `thing` in the scene: the mark it's in, or where it is. +fn endOf(scene: game.Scene, gathered: Gathered, projection: Projection, thing: usize) drawing.End { + const owner = gathered.owners[thing]; + if (owner < gathered.marks.len) { + const mark = gathered.marks[owner]; + return .{ .middle = mark.middle, .reach = px(@max(mark.size, mark.width)) / 2, .mark = owner }; + } + return .{ .middle = plot.toPixels(projection.project(placeOf(scene.things[thing]))) }; +} + +/// Where the player starts, at the map's edge, where the map doesn't show it: the way to it, and +/// how far it is from the map's middle. +fn drawStartOffMap(list: *c.ImDrawList, corners: [2]Vec2, shown: plot.Rect, projection: Projection, player: game.Thing, record: game.Record) void { + const at = projection.project(placeOf(player)); + if (at[0] >= shown.x_min and at[0] <= shown.x_max and at[1] >= shown.y_min and at[1] <= shown.y_max) return; + const middle: [2]f64 = .{ (shown.x_min + shown.x_max) / 2, (shown.y_min + shown.y_max) / 2 }; + const across = at[0] - middle[0]; + const up = at[1] - middle[1]; + const far = @sqrt(across * across + up * up); + // The edge the player is beyond, by which way it is most. + const ratio = (shown.x_max - shown.x_min) / (shown.y_max - shown.y_min); + const sideways = @abs(across) > @abs(up) * ratio; + const icon: Icon = if (sideways) (if (across > 0) .arrow_right else .arrow_left) else (if (up > 0) .arrow_up else .arrow_down); + const color = theme.lighten(panels.groupColor(record), player_tint); + gui.sans(.regular, fonts.size.smaller); + defer gui.popFont(); + const text = gui.print("{s} start · {s}", .{ record.title, drawing.distance(far) }); + const width = px(9 + 12 + 6 + 9) + gui.textSize(text).x; + const height = px(24); + const centre: Vec2 = .{ .x = (corners[0].x + corners[1].x) / 2, .y = (corners[0].y + corners[1].y) / 2 }; + const min: Vec2 = if (sideways) + .{ .x = if (across > 0) corners[1].x - px(10) - width else corners[0].x + px(10), .y = centre.y - height / 2 } + else + .{ .x = centre.x - width / 2, .y = if (up > 0) corners[0].y + px(10) else corners[1].y - px(10) - height }; + const max: Vec2 = .{ .x = min.x + width, .y = min.y + height }; + gui.rect(list, min, max, theme.fade(theme.bar, 0.9), height / 2); + gui.outline(list, min, max, theme.border_off, height / 2); + widgets.drawIconCentered(list, .{ .x = min.x + px(9 + 6), .y = (min.y + max.y) / 2 }, icon, fonts.size.icon_tiny, color); + gui.drawText(list, .{ .x = min.x + px(9 + 12 + 6), .y = gui.textTop((min.y + max.y) / 2) }, color, text); +} + +test Projection { + const place: [3]f64 = .{ 1, 2, 3 }; + for (std.enums.values(Projection)) |projection| { + const at = projection.project(place); + try std.testing.expectEqual(place, projection.unproject(at, place)); + } + // From above, X runs across and Z up; from the side and the front, up is Y's opposite. + try std.testing.expectEqual([2]f64{ 1, 3 }, Projection.top.project(place)); + try std.testing.expectEqual([2]f64{ 3, -2 }, Projection.side.project(place)); +} diff --git a/src/views/scene/drawing.zig b/src/views/scene/drawing.zig new file mode 100644 index 0000000..44ed64f --- /dev/null +++ b/src/views/scene/drawing.zig @@ -0,0 +1,475 @@ +//! How the Scene view's map draws its parts on the screen: the grid, the rings, the routes' legs, +//! the ships' and markers' marks, the names, and the notes over the map. Nothing here knows the +//! map's state; the view (`views/scene.zig`) says what goes where. + +const std = @import("std"); +const c = @import("c"); + +const game = @import("../../game.zig"); +const ui = @import("../../ui.zig"); +const fonts = ui.fonts; +const gui = ui.gui; +const plot = ui.plot; +const theme = ui.theme; +const Color = theme.Color; +const Vec2 = gui.Vec2; +const px = gui.px; + +/// The least spacing of the grid's cells, in pixels: each is the smallest of 1, 2 or 5 times a +/// power of ten that is at least this wide. A line every `major_every` cells is brighter. +const least_cell = 40; +const major_every = 5; +/// A cluster's height, the size of its count, and the room around the count, in design pixels. A +/// cluster is the mark the map draws for several things that would overlap on the screen. +pub const cluster_size = 20; +const cluster_figures = fonts.size.tiny; +const cluster_padding = 4; +/// How long a leg to or from a place off the map is drawn, in pixels. +const stub_length = 56; + +pub fn distanceTo(a: Vec2, b: Vec2) f32 { + return @sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +} + +/// The point `pixels` from `from` along the unit vector `way`. +pub fn along(from: Vec2, way: Vec2, pixels: f32) Vec2 { + return .{ .x = from.x + way.x * pixels, .y = from.y + way.y * pixels }; +} + +/// Whether `point` is in the box between `corners`, edges included. +pub fn isInside(point: Vec2, corners: [2]Vec2) bool { + return point.x >= corners[0].x and point.x <= corners[1].x and point.y >= corners[0].y and point.y <= corners[1].y; +} + +/// The part of the line from `from` to `to` inside `corners`, as distances along it from `from`; +/// null where none of it is. +pub fn clipAlong(from: Vec2, to: Vec2, corners: [2]Vec2) ?[2]f32 { + const length = distanceTo(from, to); + if (length == 0) return null; + const delta: Vec2 = .{ .x = to.x - from.x, .y = to.y - from.y }; + var first: f32 = 0; + var last: f32 = 1; + // Each edge cuts off the part of the line beyond it (Liang and Barsky's clipping). + for ([_][2]f32{ + .{ -delta.x, from.x - corners[0].x }, + .{ delta.x, corners[1].x - from.x }, + .{ -delta.y, from.y - corners[0].y }, + .{ delta.y, corners[1].y - from.y }, + }) |edge| { + const toward, const room = edge; + if (toward == 0) { + if (room < 0) return null; + continue; + } + const cut = room / toward; + if (toward < 0) first = @max(first, cut) else last = @min(last, cut); + } + if (first > last) return null; + return .{ first * length, last * length }; +} + +/// How near and how far the map's area is from `middle`, in pixels: a ring shows on the map only +/// with a radius between the two. +pub fn reachOf(middle: Vec2, corners: [2]Vec2) [2]f32 { + const nearest: Vec2 = .{ .x = std.math.clamp(middle.x, corners[0].x, corners[1].x), .y = std.math.clamp(middle.y, corners[0].y, corners[1].y) }; + var farthest: f32 = 0; + for ([_]f32{ corners[0].x, corners[1].x }) |x| for ([_]f32{ corners[0].y, corners[1].y }) |y| { + farthest = @max(farthest, distanceTo(middle, .{ .x = x, .y = y })); + }; + return .{ distanceTo(middle, nearest), farthest }; +} + +/// The grid's cell for `scale` pixels to the game's unit: 1, 2 or 5 times a power of ten, the least +/// at least `least_cell` pixels wide. +pub fn cellOf(scale: f32) f64 { + if (scale <= 0) return 1000; + const least: f64 = least_cell / @as(f64, scale); + var power = std.math.pow(f64, 10, @floor(std.math.log10(least))); + while (true) : (power *= 10) { + for ([_]f64{ 1, 2, 5 }) |step| if (step * power >= least) return step * power; + } +} + +/// The grid over the part of the map `shown`, a line every `cell` of the game's units. +pub fn grid(list: *c.ImDrawList, shown: plot.Rect, cell: f64) void { + const corners = plot.area(); + var x = @ceil(shown.x_min / cell) * cell; + while (x <= shown.x_max) : (x += cell) { + const at = plot.toPixels(.{ x, 0 }).x; + const color = if (isMajor(x, cell)) theme.map_grid else theme.map_grid_minor; + c.ImDrawList_AddLineEx(list, .{ .x = at, .y = corners[0].y }, .{ .x = at, .y = corners[1].y }, color, px(1)); + } + var y = @ceil(shown.y_min / cell) * cell; + while (y <= shown.y_max) : (y += cell) { + const at = plot.toPixels(.{ 0, y }).y; + const color = if (isMajor(y, cell)) theme.map_grid else theme.map_grid_minor; + c.ImDrawList_AddLineEx(list, .{ .x = corners[0].x, .y = at }, .{ .x = corners[1].x, .y = at }, color, px(1)); + } +} + +fn isMajor(value: f64, cell: f64) bool { + const cells = @round(value / cell); + return @mod(cells, major_every) == 0; +} + +/// A circle of dashes `dash` pixels long, `gap` pixels apart, drawn only where it can show on the +/// map, so that a ring far larger than the map costs no more than one that fits it. +pub fn dashedCircle(list: *c.ImDrawList, middle: Vec2, radius: f32, color: Color, dash: f32, gap: f32, corners: [2]Vec2) void { + var from: f32 = 0; + var to: f32 = 2 * std.math.pi; + if (!isInside(middle, corners)) { + // From outside the map, its corners lie within half a turn of the way to its middle. + const towards = std.math.atan2((corners[0].y + corners[1].y) / 2 - middle.y, (corners[0].x + corners[1].x) / 2 - middle.x); + var least: f32 = 0; + var most: f32 = 0; + for ([_]f32{ corners[0].x, corners[1].x }) |x| for ([_]f32{ corners[0].y, corners[1].y }) |y| { + var turn = std.math.atan2(y - middle.y, x - middle.x) - towards; + if (turn > std.math.pi) turn -= 2 * std.math.pi; + if (turn < -std.math.pi) turn += 2 * std.math.pi; + least = @min(least, turn); + most = @max(most, turn); + }; + from = towards + least; + to = towards + most; + } + const step = px(dash + gap) / radius; + const share = dash / (dash + gap); + var angle = @floor(from / step) * step; + while (angle < to) : (angle += step) { + c.ImDrawList_PathArcTo(list, middle, radius, angle, angle + step * share, 2); + c.ImDrawList_PathStroke(list, color, px(1), 0); + } +} + +/// The places taken on the map by its marks and the names placed so far, so that a name goes where +/// it covers neither, and the routes' legs, which a name keeps off where it can. +pub const Labels = struct { + corners: [2]Vec2, + taken: std.ArrayList([2]Vec2) = .empty, + lines: []const [2]Vec2 = &.{}, + + /// Takes the first of `spots` where a name `size` big fits, clear of the legs where one is, + /// and returns it, if one does. + pub fn place(labels: *Labels, spots: []const Vec2, size: Vec2) ?Vec2 { + for ([_]bool{ true, false }) |clear_of_lines| for (spots) |spot| { + const box: [2]Vec2 = .{ spot, .{ .x = spot.x + size.x, .y = spot.y + size.y } }; + if (!isInside(box[0], labels.corners) or !isInside(box[1], labels.corners) or labels.covers(box)) continue; + if (clear_of_lines and labels.crossesLine(box)) continue; + labels.take(box); + return spot; + }; + return null; + } + + pub fn take(labels: *Labels, box: [2]Vec2) void { + labels.taken.append(gui.frameAllocator(), box) catch {}; + } + + fn covers(labels: Labels, box: [2]Vec2) bool { + for (labels.taken.items) |other| { + if (box[0].x < other[1].x and box[1].x > other[0].x and box[0].y < other[1].y and box[1].y > other[0].y) return true; + } + return false; + } + + fn crossesLine(labels: Labels, box: [2]Vec2) bool { + for (labels.lines) |line| if (clipAlong(line[0], line[1], box) != null) return true; + return false; + } +}; + +/// A name on the map, `size` big at `at`, on a backing of the map's colour that the lines and rings +/// pass under, with a dark edge. +pub fn label(list: *c.ImDrawList, at: Vec2, size: Vec2, color: Color, text: []const u8) void { + const pad: Vec2 = .{ .x = px(3), .y = px(1) }; + gui.rect(list, .{ .x = at.x - pad.x, .y = at.y - pad.y }, .{ .x = at.x + size.x + pad.x, .y = at.y + size.y + pad.y }, theme.fade(theme.map, 0.82), 3); + for ([_][2]f32{ .{ -1, 0 }, .{ 1, 0 }, .{ 0, -1 }, .{ 0, 1 } }) |offset| { + gui.drawText(list, .{ .x = at.x + offset[0], .y = at.y + offset[1] }, theme.ground, text); + } + gui.drawText(list, at, color, text); +} + +/// What the map draws for a thing at `middle`, `size` design pixels across: a ship's arrow, +/// pointing the way `heading` goes on the map, outlined in its group's colour on the map's ground, +/// as where it starts; a marker's diamond, filled; a camera point's small ring; or a planet's or +/// the sun's faint disc. +pub fn thing(list: *c.ImDrawList, middle: Vec2, kind: game.ThingKind, heading: ?[2]f64, size: f32, color: Color) void { + const scale = px(size) / 24; + switch (kind) { + .ship => { + // The design's arrow, in a box of 24 with its middle at 12, 12, pointing up. + const shape = [_][2]f32{ .{ 0, -10 }, .{ 8, 9 }, .{ 0, 4.5 }, .{ -8, 9 } }; + const way = heading orelse .{ 0, 1 }; + const angle: f32 = if (@abs(way[0]) + @abs(way[1]) < 1e-6) 0 else @floatCast(std.math.atan2(way[0], way[1])); + var points: [4]Vec2 = undefined; + for (shape, &points) |point, *made| made.* = turned(middle, point, scale, angle); + // Filled in two halves, since it isn't convex, then outlined. + c.ImDrawList_AddTriangleFilled(list, points[0], points[1], points[2], theme.map); + c.ImDrawList_AddTriangleFilled(list, points[0], points[2], points[3], theme.map); + c.ImDrawList_AddPolyline(list, &points, points.len, color, px(1.8), c.ImDrawFlags_Closed); + }, + .marker => { + const shape = [_][2]f32{ .{ 0, -10 }, .{ 10, 0 }, .{ 0, 10 }, .{ -10, 0 } }; + var points: [4]Vec2 = undefined; + for (shape, &points) |point, *made| made.* = turned(middle, point, scale, 0); + c.ImDrawList_AddConvexPolyFilled(list, &points, points.len, color); + c.ImDrawList_AddPolyline(list, &points, points.len, theme.ground, px(1.2), c.ImDrawFlags_Closed); + }, + .camera => { + c.ImDrawList_AddCircleFilled(list, middle, px(size) / 2, theme.map, 0); + c.ImDrawList_AddCircleEx(list, middle, px(size) / 2, theme.curve, 0, px(1.4)); + }, + .scenery => { + c.ImDrawList_AddCircleFilled(list, middle, px(size) / 2, theme.fade(theme.text_dim, 0.18), 0); + c.ImDrawList_AddCircleEx(list, middle, px(size) / 2, theme.fade(theme.text_dim, 0.7), 0, px(1.2)); + }, + } +} + +/// `point` of a shape around `middle`, scaled, and turned clockwise by `angle` radians. +fn turned(middle: Vec2, point: [2]f32, scale: f32, angle: f32) Vec2 { + const x = point[0] * scale; + const y = point[1] * scale; + return .{ .x = middle.x + x * @cos(angle) - y * @sin(angle), .y = middle.y + x * @sin(angle) + y * @cos(angle) }; +} + +/// A cluster of `count` things: a ring in `color` with the count in its middle, or a pill where the +/// count is too wide for the ring (`clusterWidth`). +pub fn cluster(list: *c.ImDrawList, middle: Vec2, count: usize, color: Color) void { + const width = clusterWidth(count); + gui.sans(.semibold, cluster_figures); + defer gui.popFont(); + const text = gui.print("{d}", .{count}); + const text_width = gui.textSize(text).x; + // ImGui draws text from whole points, so the count goes there, and the ring around it. + const at: Vec2 = .{ .x = @round(middle.x - text_width / 2), .y = gui.capitalsTop(middle.y) }; + const centre: Vec2 = .{ .x = at.x + text_width / 2, .y = at.y + gui.ascent() - gui.capitals() / 2 }; + const half: Vec2 = .{ .x = px(width) / 2, .y = px(cluster_size) / 2 }; + const line = px(1.6); + if (width > cluster_size) { + const min: Vec2 = .{ .x = centre.x - half.x, .y = centre.y - half.y }; + const max: Vec2 = .{ .x = centre.x + half.x, .y = centre.y + half.y }; + gui.rect(list, min, max, theme.map, cluster_size / 2); + c.ImDrawList_AddRectEx(list, .{ .x = min.x + line / 2, .y = min.y + line / 2 }, .{ .x = max.x - line / 2, .y = max.y - line / 2 }, color, half.y - line / 2, line, 0); + } else { + c.ImDrawList_AddCircleFilled(list, centre, half.y, theme.map, 0); + c.ImDrawList_AddCircleEx(list, centre, half.y - line / 2, color, 0, line); + } + gui.drawText(list, at, color, text); +} + +/// How wide a cluster of `count` things is, in design pixels: a ring, or wider for a count of three +/// figures. +pub fn clusterWidth(count: usize) f32 { + gui.sans(.semibold, cluster_figures); + defer gui.popFont(); + const figures = gui.textSize(gui.print("{d}", .{count})).x / px(1); + return @max(cluster_size, figures + 2 * cluster_padding); +} + +/// The selection's corners around `middle`, `half` pixels out. +pub fn brackets(list: *c.ImDrawList, middle: Vec2, half: f32) void { + const long = px(8); + for ([_][2]f32{ .{ -1, -1 }, .{ 1, -1 }, .{ -1, 1 }, .{ 1, 1 } }) |corner| { + const tip: Vec2 = .{ .x = middle.x + corner[0] * half, .y = middle.y + corner[1] * half }; + var points = [_]Vec2{ + .{ .x = tip.x, .y = tip.y - corner[1] * long }, + tip, + .{ .x = tip.x - corner[0] * long, .y = tip.y }, + }; + c.ImDrawList_AddPolyline(list, &points, points.len, theme.accent, px(2), 0); + } +} + +/// The note by the selected thing: where it is on the map's axes, `names` across and up, and how +/// to move it. +pub fn placeNote(list: *c.ImDrawList, middle: Vec2, names: [2][]const u8, values: [2]f64) void { + const where = gui.print("{s} {d} · {s} {d}", .{ names[0], @round(values[0]), names[1], @round(values[1]) }); + const how = "Drag · Shift: snap 100"; + gui.mono(.regular, fonts.size.smaller); + const where_width = gui.textSize(where).x; + gui.popFont(); + gui.sans(.regular, fonts.size.smaller); + const how_width = gui.textSize(how).x; + gui.popFont(); + const width = @max(where_width, how_width) + px(18); + const height = px(42); + const min: Vec2 = .{ .x = middle.x - px(14) - width, .y = middle.y + px(14) }; + const max: Vec2 = .{ .x = min.x + width, .y = min.y + height }; + gui.rect(list, min, max, theme.fade(theme.panel, 0.94), 4); + gui.outline(list, min, max, theme.border_strong, 4); + gui.mono(.regular, fonts.size.smaller); + gui.drawText(list, .{ .x = min.x + px(9), .y = gui.textTop(min.y + px(13)) }, theme.text_strong, where); + gui.popFont(); + gui.sans(.regular, fonts.size.smaller); + gui.drawText(list, .{ .x = min.x + px(9), .y = gui.textTop(min.y + px(29)) }, theme.text_muted, how); + gui.popFont(); +} + +/// Where a leg meets a thing on the screen: the middle of the mark it's in, and how far out from +/// it the mark reaches, or where it is where it's in no mark. +pub const End = struct { + middle: Vec2, + reach: f32 = 0, + mark: ?usize = null, + + /// A number for the end: its mark's, or else its thing's, `thing_index`. The two never clash. + pub fn key(end: End, thing_index: usize) usize { + return if (end.mark) |mark| mark * 2 else thing_index * 2 + 1; + } +}; + +pub const LegLook = struct { + way: game.Way, + starts: bool, + color: Color, +}; + +/// A leg from `from` to `to`, clear of both marks: dots for a flight, dashes for a jump, an +/// arrowhead at its end, and a ring at its start where its route starts there. A leg to or from a +/// place the map doesn't show is a stub `stub_length` long that points the way, and one between +/// two such places shows nothing. Only the part inside `corners` is drawn. Returns the line drawn, +/// if any. +pub fn leg(list: *c.ImDrawList, from: End, to: End, look: LegLook, corners: [2]Vec2) ?[2]Vec2 { + const from_shows = isInside(from.middle, corners); + const to_shows = isInside(to.middle, corners); + if (!from_shows and !to_shows) return null; + const length = distanceTo(from.middle, to.middle); + var start_at = from.reach + px(3); + var end_at = length - to.reach - px(3); + if (end_at - start_at < px(6)) return null; + if (!to_shows) end_at = @min(end_at, start_at + px(stub_length)); + if (!from_shows) start_at = @max(start_at, end_at - px(stub_length)); + const way: Vec2 = .{ .x = (to.middle.x - from.middle.x) / length, .y = (to.middle.y - from.middle.y) / length }; + const start = along(from.middle, way, start_at); + const end = along(from.middle, way, end_at); + const shown = clipAlong(start, end, corners) orelse return null; + const period = px(switch (look.way) { + .fly => 5, + .jump => 10, + }); + var at = @floor(shown[0] / period) * period; + while (at < shown[1]) : (at += period) { + switch (look.way) { + .fly => if (at >= shown[0]) c.ImDrawList_AddCircleFilled(list, along(start, way, at), px(1), look.color, 4), + .jump => { + const dash_start = @max(at, shown[0]); + const dash_end = @min(at + px(6), shown[1]); + if (dash_end > dash_start) c.ImDrawList_AddLineEx(list, along(start, way, dash_start), along(start, way, dash_end), look.color, px(1.5)); + }, + } + } + if (isInside(end, corners)) { + const back = along(end, way, -px(7)); + const side: Vec2 = .{ .x = -way.y * px(3.5), .y = way.x * px(3.5) }; + c.ImDrawList_AddTriangleFilled(list, end, .{ .x = back.x + side.x, .y = back.y + side.y }, .{ .x = back.x - side.x, .y = back.y - side.y }, look.color); + } + if (look.starts and from_shows and isInside(start, corners)) gui.ring(list, along(start, way, px(3)), 3, 1.4, look.color); + return .{ along(start, way, shown[0]), along(start, way, shown[1]) }; +} + +/// What the map's marks and lines are, in its top left corner: where the ships start, and while the +/// routes show, the legs ships fly and those they jump. +pub fn legend(list: *c.ImDrawList, corner: Vec2, routes: bool) void { + const rows = [_][]const u8{ "Start", "Flies", "Jumps" }; + const shown: usize = if (routes) rows.len else 1; + gui.sans(.regular, fonts.size.smaller); + defer gui.popFont(); + var widest: f32 = 0; + for (rows[0..shown]) |text| widest = @max(widest, gui.textSize(text).x); + const sample = px(18); + const row = px(20); + const min: Vec2 = .{ .x = corner.x + px(10), .y = corner.y + px(10) }; + const max: Vec2 = .{ .x = min.x + px(10 + 7 + 10) + sample + widest, .y = min.y + px(10) + row * @as(f32, @floatFromInt(shown)) }; + gui.rect(list, min, max, theme.fade(theme.bar, 0.9), 4); + gui.outline(list, min, max, theme.border_off, 4); + for (rows[0..shown], 0..) |text, index| { + const middle = min.y + px(5) + row * (@as(f32, @floatFromInt(index)) + 0.5); + const left = min.x + px(10); + switch (index) { + 0 => thing(list, .{ .x = left + sample / 2, .y = middle }, .ship, null, fonts.size.icon_tiny, theme.text_menu), + else => _ = leg(list, .{ .middle = .{ .x = left, .y = middle } }, .{ .middle = .{ .x = left + sample + px(4), .y = middle } }, .{ + .way = if (index == 1) .fly else .jump, + .starts = false, + .color = theme.text_menu, + }, .{ min, max }), + } + gui.drawText(list, .{ .x = left + sample + px(7), .y = gui.textTop(middle) }, theme.text_menu, text); + } +} + +/// The scale, a cell of the grid long, its left end at `corner`, at `scale` pixels to the game's +/// unit. +pub fn scaleBar(list: *c.ImDrawList, corner: Vec2, cell: f64, scale: f32) void { + const length = @as(f32, @floatCast(cell)) * scale; + const bottom = corner.y; + var points = [_]Vec2{ .{ .x = corner.x, .y = bottom - px(6) }, .{ .x = corner.x, .y = bottom }, .{ .x = corner.x + length, .y = bottom }, .{ .x = corner.x + length, .y = bottom - px(6) } }; + c.ImDrawList_AddPolyline(list, &points, points.len, theme.text_muted, px(1), 0); + gui.sans(.regular, 11); + defer gui.popFont(); + gui.drawText(list, .{ .x = corner.x, .y = bottom - px(9) - c.ImGui_GetFontSize() }, theme.text_muted, distance(cell)); +} + +/// A distance as the map writes it: `4k` for 4000, `1.5k`, `2.5M` for 2,500,000, or `500`. +pub fn distance(value: f64) []const u8 { + const size = @abs(value); + for ([_]struct { f64, []const u8 }{ .{ 1e6, "M" }, .{ 1e3, "k" } }) |unit| { + if (size < unit[0]) continue; + const count = value / unit[0]; + if (@round(count) == count or size >= 100 * unit[0]) return gui.print("{d}{s}", .{ @round(count), unit[1] }); + return gui.print("{d:.1}{s}", .{ count, unit[1] }); + } + return gui.print("{d}", .{@round(value)}); +} + +test cellOf { + // 54 pixels to a thousand: the cell is a thousand; zoomed out ten times, ten thousand. + try std.testing.expectEqual(1000, cellOf(54.0 / 1000.0)); + try std.testing.expectEqual(10_000, cellOf(5.4 / 1000.0)); + try std.testing.expectEqual(2000, cellOf(30.0 / 1000.0)); +} + +test distance { + try std.testing.expectEqualStrings("4k", distance(4000)); + try std.testing.expectEqualStrings("1.5k", distance(1500)); + try std.testing.expectEqualStrings("500", distance(500)); + try std.testing.expectEqualStrings("-2k", distance(-2000)); + try std.testing.expectEqualStrings("2.5M", distance(2_500_000)); + try std.testing.expectEqualStrings("150M", distance(150_000_000)); +} + +test clipAlong { + const corners: [2]Vec2 = .{ .{ .x = 0, .y = 0 }, .{ .x = 100, .y = 100 } }; + // A line across the map from outside it on the left to outside it on the right shows inside + // it, 50 to 150 pixels along. + try std.testing.expectEqual([2]f32{ 50, 150 }, clipAlong(.{ .x = -50, .y = 50 }, .{ .x = 150, .y = 50 }, corners).?); + // One wholly inside shows whole, and one beside the map not at all. + try std.testing.expectEqual([2]f32{ 0, 10 }, clipAlong(.{ .x = 10, .y = 10 }, .{ .x = 20, .y = 10 }, corners).?); + try std.testing.expectEqual(null, clipAlong(.{ .x = -50, .y = -10 }, .{ .x = 150, .y = -10 }, corners)); +} + +test Labels { + defer gui.newFrame(); + const corners: [2]Vec2 = .{ .{ .x = 0, .y = 0 }, .{ .x = 200, .y = 200 } }; + // A leg leaves a mark at 100, 100 to the right. + var labels: Labels = .{ .corners = corners, .lines = &.{.{ .{ .x = 110, .y = 100 }, .{ .x = 190, .y = 100 } }} }; + const size: Vec2 = .{ .x = 40, .y = 10 }; + const right: Vec2 = .{ .x = 110, .y = 95 }; + const left: Vec2 = .{ .x = 50, .y = 95 }; + // The name goes left, clear of the leg, though right comes first. + try std.testing.expectEqual(left, labels.place(&.{ right, left }, size).?); + // With the left taken, the next covers the leg rather than going without. + try std.testing.expectEqual(right, labels.place(&.{ right, left }, size).?); + // With both taken, the third goes without. + try std.testing.expectEqual(null, labels.place(&.{ right, left }, size)); +} + +test reachOf { + const corners: [2]Vec2 = .{ .{ .x = 0, .y = 0 }, .{ .x = 300, .y = 400 } }; + // From inside the map, the nearest is its own place and the farthest the far corner. + try std.testing.expectEqual([2]f32{ 0, 500 }, reachOf(.{ .x = 0, .y = 0 }, corners)); + // From 100 pixels left of the map's left edge. + const reach = reachOf(.{ .x = -100, .y = 0 }, corners); + try std.testing.expectEqual(100, reach[0]); + try std.testing.expectApproxEqAbs(@sqrt(400.0 * 400.0 + 400.0 * 400.0), reach[1], 1e-3); +} diff --git a/src/views/script.zig b/src/views/script.zig index 9831b63..92df513 100644 --- a/src/views/script.zig +++ b/src/views/script.zig @@ -72,30 +72,16 @@ pub fn draw(app: *App) void { } } -/// The panel's own tab bar, as the docked panels' (`widgets.PanelTab`): the source file, and its +/// The panel's own tab bar, as the docked panels' (`widgets.panelTabs`): the source file, and its /// script listing. fn tabs(app: *App, document: *Document) void { - const at = gui.cursor(); - const width = gui.available().x; - const height = px(widgets.tab_bar_height); - const list = gui.drawList(); - gui.rect(list, at, .{ .x = at.x + width, .y = at.y + height }, theme.bar, 0); - gui.rect(list, .{ .x = at.x, .y = at.y + height - px(1) }, .{ .x = at.x + width, .y = at.y + height }, theme.tab_divider, 0); - var x = at.x; - for (std.enums.values(app_mod.SourceTab)) |which| { - const on = app.source_tab == which; - const shown: widgets.PanelTab = switch (which) { - .source => .{ .label = document.file, .icon = .file_code, .icon_color = theme.accent, .dot = document.dirty(), .on = on }, - .listing => .{ .label = "Script listing", .icon = .list, .detail = if (document.built) |built| built.file else "not built", .on = on }, - }; - const tab_width = shown.width(); - gui.setCursor(.{ .x = x, .y = at.y }); - if (c.ImGui_InvisibleButton(@tagName(which), .{ .x = tab_width, .y = height - px(1) }, 0)) app.source_tab = which; - shown.draw(list, .{ .x = x, .y = at.y }, .{ .x = x + tab_width, .y = at.y + height - px(1) }, gui.hovered()); - if (shown.dot) gui.tooltip("Changed since saved"); - x += tab_width; - } - gui.setCursor(.{ .x = at.x, .y = at.y + height }); + const which = std.enums.values(app_mod.SourceTab); + var shown: [which.len]widgets.PanelTab = undefined; + for (which, &shown) |tab, *made| made.* = switch (tab) { + .source => .{ .label = document.file, .icon = .file_code, .icon_color = theme.accent, .dot = document.dirty(), .on = app.source_tab == tab }, + .listing => .{ .label = "Script listing", .icon = .list, .detail = if (document.built) |built| built.file else "not built", .on = app.source_tab == tab }, + }; + if (widgets.panelTabs(&shown)) |index| app.source_tab = which[index]; } /// The line under the tabs: the file, the record the cursor is in, and its statement, with the