From 38c679b319677e1e1b03be1ee7f273ef8280d20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 7 Nov 2026 14:42:32 +0100 Subject: [PATCH] readable names also in io, checks and texture messages (naming moved to editor.model), tile palette filter by name or number, import preview frames the main mass and zooms with the wheel, object palette right-click no longer switches to place, floorfinder built on ground, levelbuild starts get one camera node behind the llama (golden hashes updated, boot-to-level moves it along) --- docs/manual/06-geometry.md | 5 +- docs/manual/07-meshes.md | 4 +- docs/manual/09-objects.md | 2 +- examples/testwelt.llamalevel | Bin 7432 -> 7743 bytes notes/editor-playtest.md | 4 +- notes/editor-tools-geometry.md | 7 +- notes/editor-tools-objects.md | 7 +- notes/editor-ui.md | 6 + notes/img/editor/geo_import_focus.jpg | Bin 0 -> 67467 bytes notes/img/editor/geo_import_zoomed_out.jpg | Bin 0 -> 16737 bytes notes/img/editor/palette_rightclick.jpg | Bin 0 -> 103883 bytes notes/img/editor/testworld_start_camera.jpg | Bin 0 -> 85262 bytes notes/img/editor/tile_palette_filter.jpg | Bin 0 -> 14570 bytes notes/levelbau.md | 14 +- notes/mod-boottolevel.md | 5 + .../llamamod/editor/io/BrushCompiler.java | 11 +- .../llamamod/editor/io/Validator.java | 41 ++-- .../llamamod/editor/model/ReadableNames.java | 198 ++++++++++++++++++ .../llamamod/editor/model/cmd/Edits.java | 3 +- .../llamamod/editor/model/cmd/RemoveNode.java | 5 +- .../tools/geometry/MeshImportDialog.java | 60 +++++- .../editor/tools/geometry/TilePaintTool.java | 24 ++- .../editor/tools/objects/CameraView.java | 7 +- .../llamamod/editor/tools/objects/Ground.java | 40 +++- .../editor/tools/objects/ObjectChecks.java | 52 +++-- .../editor/tools/objects/ObjectPalette.java | 106 +++++++--- .../editor/tools/objects/PathTool.java | 3 +- .../editor/tools/playtest/FloorFinder.java | 77 ++----- .../tools/textures/TexturesEditorPlugin.java | 14 +- .../llamamod/editor/ui/NodeNames.java | 179 +--------------- .../editor/ui/panels/OutlinerPanel.java | 16 +- .../editor/ui/panels/ProblemsPanel.java | 3 +- .../llamamod/levelbuild/LevelBuilder.java | 31 ++- .../mods/boottolevel/StartOverride.java | 14 +- .../editor/bugs/EditorRegressionTest.java | 6 +- .../llamamod/editor/io/HandednessDemo.java | 17 +- .../llamamod/editor/io/NoCollisionDemo.java | 16 +- .../editor/model/ReadableNamesTest.java | 22 ++ .../editor/tools/catalog/XobjDemo.java | 16 +- .../editor/tools/geometry/GeoDemo.java | 17 +- .../editor/tools/geometry/GeoLibDemo.java | 16 +- .../tools/geometry/PaletteAndPreviewTest.java | 56 +++++ .../tools/objects/LevelBuilderStartTest.java | 43 ++++ .../tools/objects/ObjectPaletteTest.java | 81 +++++++ .../tools/textures/TextureLibraryTest.java | 13 ++ .../llamamod/levelbuild/BrushRecorder.java | 2 +- .../mods/boottolevel/BootToLevelModTest.java | 18 ++ .../mods/testworld/TestWorldGoldenTest.java | 10 +- tools/levelbuild.py | 18 +- 49 files changed, 819 insertions(+), 470 deletions(-) create mode 100644 notes/img/editor/geo_import_focus.jpg create mode 100644 notes/img/editor/geo_import_zoomed_out.jpg create mode 100644 notes/img/editor/palette_rightclick.jpg create mode 100644 notes/img/editor/testworld_start_camera.jpg create mode 100644 notes/img/editor/tile_palette_filter.jpg create mode 100644 src/main/java/com/eliasmueller/llamamod/editor/model/ReadableNames.java create mode 100644 src/test/java/com/eliasmueller/llamamod/editor/model/ReadableNamesTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/PaletteAndPreviewTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/editor/tools/objects/LevelBuilderStartTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPaletteTest.java diff --git a/docs/manual/06-geometry.md b/docs/manual/06-geometry.md index be079ef..aec6001 100644 --- a/docs/manual/06-geometry.md +++ b/docs/manual/06-geometry.md @@ -243,8 +243,9 @@ levels are built. Start it with **T**, from the toolbar or **Geometry → Tiles ### Tile palette The Inspector shows the **Tile palette**: every tile model of the level with a thumbnail, its -vertex count and how many tiles use it. **Filter (model number)** narrows the list, **Only models -used in the level** hides unused ones. Click a model to make it the current one, or +vertex count and how many tiles use it. **Filter by name or number** narrows the list as you type +(model names as in the Outliner; a number matches whole numbers only, so "12" finds Model 12 but not +Model 120), **Only models used in the level** hides unused ones. Click a model to make it the current one, or **Shift+click** a tile in the viewport to pick it. ### Modes and options diff --git a/docs/manual/07-meshes.md b/docs/manual/07-meshes.md index b204c67..d8d56d8 100644 --- a/docs/manual/07-meshes.md +++ b/docs/manual/07-meshes.md @@ -25,7 +25,9 @@ project**, so the `.llamalevel` file stays complete when you share it (see **File → Import mesh (OBJ, glTF)…** (or **Import mesh…** in the **Imported** tab of the Assets panel) asks for the file and opens the import dialog. The left side is a preview you can orbit by -dragging; the grid squares are 1 cell and the small marker shows the llama's size (0.6 cells). +dragging and zoom with the **mouse wheel**; the grid squares are 1 cell and the small marker shows the +llama's size (0.6 cells). It is framed on the main part of the model, so a few far-off pieces (a stray +vertex, a huge ground plane) do not shrink it to a dot – zoom out to see them. ![The Import mesh dialog](img/geo_import.jpg) diff --git a/docs/manual/09-objects.md b/docs/manual/09-objects.md index 0b56b6f..361aaca 100644 --- a/docs/manual/09-objects.md +++ b/docs/manual/09-objects.md @@ -56,7 +56,7 @@ The **Objects** panel sits in the left dock next to the Outliner – the tab wit * **Click** an entry to make it the current type and switch to the **Place objects** tool (**P**). Then click in the viewport to place it. * **Drag** an entry into the viewport to place one object exactly under the mouse pointer. -* **Right-click** an entry for its menu: **Add to favourites ★** / **Remove from favourites** +* **Right-click** an entry for its menu (this does not pick the type or switch tools): **Add to favourites ★** / **Remove from favourites** (favourites are marked with ★, listed first and remembered between sessions) and, for your own [custom types](22-strats.md), **Edit type…** and **Delete type…**. The same menu (with **Place at view centre**) opens on the types in **Assets → Objects**. diff --git a/examples/testwelt.llamalevel b/examples/testwelt.llamalevel index 2413881a8dab86bdb14bcb62d316e88eb58725c0..927aa81e8d6afb7156961198833c5c8157eba924 100644 GIT binary patch literal 7743 zcmY*eWl$VSkjCBJg9dkZ2ol_Ff#AF7Vv9RLg1c*Qm&H90EZGEix8NEUd02A1le)W^ zA2ZYaeIwmn)iu>R>c}W02pAX`2nZMqYzY6SVZF{>fIdJM9w&&K>-h&WH|p`Ukf|p6 zn;yK*OY$$k2pan30%>$r_hvZ)6edR(XU$Y3RizI6>#a`v=!|bCC!l00QC;p45y1j$ z{oCLVhOhnQ(hbxa?^|~ZhQ1hgZ?4y8k-OR7XnMDI^+K9>Lrh6JN4JcZT9qE`yK^#^ zMAsG`O9%G$Ca!yWfB+dGa-Miiz=!2o)P9yonGY}f3Pa_!o2|x|oBf=zz?O`>%fH@IQLP~wt{G(p(M-^uccfz^0kAL4wEmu zom-)77ajYn{S$eCKeX50)bYaX;Q3(K`5ovXWRK@%?IrYR@7)`d?*}1I*6lJRQ-5Ml zJt6G_-D@Ig^|J1F&8EDK_LqxwYsxYCf7dU@a<_s*B-grhJ6d~{epmPj23m5F?LWd@ zZe0&742_#$yPmp}M%jOjEx@8~pwa7t4tF`OCbGJTmmV+jM*GpTMw3wUjV611(KYK4jNFnnAaG-M&~hT{w?*Nty(sr{8Yf`1%f8 z3X7ax_fwxEXuVK|1l`8_+6rG54PV`#Ohro{lw z?}Q+~ss-Oa+E~BSIgKAxiB^eru1X6?OQ13oz{-C&c?>MFi?sThjxz_lW1*0)wQA#~ zP--Kq@#L?ESOQ)4KT-fExZp}(hb}Fq7(`>|g_LZnfm2y=G=3 zJD)7ds6b+mRb!&o0|o=6KdsUT^=?^mb-4v;`i;6~DYlOB)uLwyKxveQ0%++82H(?4 zOurTNi95c}#5w3uvG#7U!^oEQP)?*W2rFAk(@kK8MDwBU8f>UWCvi}YKn3;U>~PPR z=dwqQTnxU`dyv<$*+3)GJe)6!n1^5Y*u6KMuxlw|7`r3gGb(!=aKDKbln55lm47rP zt=4_96bs;{9BcT(fuS~bL)xKV_BiN%V~XrN`LYs;PD7F!45-wVwh{|ywGsHXN>32O z-@j7vpDbG_w?O)|4$kRjGNrgp6*M9BvjoeUT5L-_e0lyNF!5x0XeM7OuOoJDT%0%W zhB;ezLqaTIug{^G5eKRS+0b7!Og@<%nxU>CV3z;LPOA1~DsrN`A^v(F(z>)0F*ae1 z+tEzj53hoB%{>}j?rM_+L+Mzcfh=CqX3XeO8v(C3Ssib%WGyxNd$+ifNZ|n|OeKLr zZX4-Xkb(BUAZ0zdNF6;nhsA6YWn9~@GrkGdD*o@o_zP5K(v$eh#`s@7mjtC^|BVqF zjlG!dpnU85DsdnoRUONNEC%l^U&JS#T)grsc;8NZ+Q~RAGI|d(2qjOl2=s}LXAaFK z#�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 VM;#UIUmfCW7keFlzwU>C@E>n4C3^q> literal 7432 zcmZ{JRag{IyETYPhjfQ@hcqJ6;n3YMbT^XHATS^d-JLUZgMbVS-7z3T3DPYkAn@~@ z|Kgl;ao&CL)>`Y?&)(18H?PJgw3oyv7#J8RC>RWEDF4H-o?~YlUmIs0M=v+mV^h;_ z$U$)MR2{*NkBdu4$nOcNzc2cBTzQT*fMGu{MBg>nv?x$2WrL36|J}HN!FD>PtB#4v z!a^AlOulR?HDW%Uod@1N=jKx5wq&P^IXS?aDbFTTs6Lt0acy;Os#&&y*LKN| zrHk8cTnWmmS)W>2uZHN`cyw^t9gaP5*7+jInt(0s?70kj`eRquuG*d0i%mdZW9JVw zr@~G5@RO~h11tZlecx__$ID+Kr+RfgJgzIex(|t<_a8zL0e?c`uJ|z)*sFKz66_woUY^RA3)->BX8QIYT0)0*WI6HcjG2fF-j77 z^w+`Ernd*R&>j~bRMTG^pk%yN`SAudSQwgBr}gyI0a4+Rf>;I6mCRE%19B8 zvpC6o6$u)R1HsCZux~SCKm-84VZIt?^B;TAANF+Q^39}G?c@l5C>Ys6AKz%3ew*Ze z*0tz0tol|+O$n#vXrxjpt`L~2@~53=G{rVG(_ph_WlmapGbn?dGV5iWZRtgn|5JD4 z;H~@RYm&C+(n1)dnA$uRbD*BJr^!RyFh6=%+rMXi!o$ zuXSVXxclYuFBPkQg;HN}%7Q1DQb;Hw7#MX01az=}Y74Tu=vmiK%VR-Ok{L{{2Po2X zbwW!PhuIXsVzQYp#C1OpPeX_4!}5}~m;x%gGenaR4QTpS?y`C5(HGAm`3o!rjVKZ6i+@dF`IS5SFyGhI2a$xA zxK=2WgiAPHrLnBPT-g-u<$g&?0s$Y0vI*U*6wqpnP>%M^10ig$&=}-@9 z>h3W3o?vW7Ckcc%Bu5DJtP9tGQLeW{rUKeX8}bWBC`bBcsO*_u$zix)VNBeGGeba_ zitF#98MbLq2i@PwtA7}@Uf}<=m+-BDlKmV*y8qQ7b~f~!=UG`nGr8HoYqFD<8X3|6 z{l!BaY<>rv1(K_EoUls>7;c%02GIPZ-~n%%s&Q4$9O0$?7cH50m0HEhi`tdj&-WS!|>bH713vJIA zsRL5-WS*zYODEH!Kh1l|3`s&!bWPUm0$a?!&? zO*AXn)XQp?Y+Tc@WU2_*NLa%n83Y~M6=Wsn!ooxXBH}C@J|%$}xm}*{KGrw-DkvM# zLv+-)F-{(#f_2Tb0+ZMhS}!(5!_k3_;6yUa-8$n@Oxra!)*1U*R`u9 z@Rt|t;cO|T9HW)oRyhMU7f1Df@I(5rCc;gCXvigDAe!Uiwb?mYS`eK=fBuD9*^5F6G;(%4s zoXzsP*51Y1(Qa|Z)5Mc@-k$k9IR949`cw6=-Q)L89x1C+u^=?L+cwD55U)xw4Xi5y3LL?9o>;asIc9}BxI)xyO5 zu7y5TCR9&Tqn_`pX^qBkKH#-f(2j4^pXL4_n^D_(rv+QID#*QB|MDFCWNNZr(Aog& z^E>=#=1NQ5>G~1jvdFhF$e3K{t}B4_PY-c^XMBuGDVmjIJgotxa^`$$m+ZDzu3j1g zgs`UTynD4mDAgTdNi~V0kfb-EwbTE)ww}M~-APAD{9i8J4;ZwZ2!;E7daNimbQ2Jg0(!Z;bFn7T4 z5DwXx1wk~SjF2{r;<=j1+mY)x1_9oDelqm0>FR}4oFLO?s3HpJ&>BrAMY-)exk9C8 z-*~pJs20n28%3`#<5{9nE z;zJaCvyCVink>MCJHWV?{>Hgz^nVFyTzUJ^3e0-Fw)Haqr^?lGMY`?MlXL1$OHn95 z>?v}}I1VzsTB^?tYY-NG&BJE1)>Ant^JjUML{W{L>e`p8qCwUplfNjKX`!UX_@(83 z>xmvi*u(yygWelK2qv-JhS)-3fGt%D%ntD0pAploQA7bEKnTc=#5`iTI>IAFm zZ^3q}mD1mueST>F8Nm|fTDeKn`gs(L^g`Ls`IV1u%UBHg*?mo zna%YDGomh3%RT~lTcIxJE){1`5`a-kwWa3gwzF>_f~m$Y7>ESR!>+0B%!nBaXzo}o z7*eVRPBAU<#U-A@l(8u+FPWN8=O_Xj;oaCQG_~2Wk?SeERzq)Dy;3*R)t2O~$#0Si z;Ij?pIn&WQyc(b?Gc~N|G5xXI4UgaVo36d$;ZSaMt$uQ`G#xe06%lPw4gJhQRpB8U z52?<7_)19z?O1;Sq!M(yBF7{Cq z%+@L1l}qyubRMIUmG=T6MuK1P?k{ji19wi6He`6WMJ&q)8pBkB9$D2hG4cq;tc{=K z)_Wic>j>M%V|HXBv?;a)d>=(76K-@g(t0(8iF~aN+HP=ZlKf4f?|EhtI@11J+=|B9 z^rXnZGN5~N!Yo8_6X_ArGS&fd68r;*e+IzQ2XSdXjM%IgRpx?_2_CYP3c_0)@$b#8 z1zdw0YM#OFS)h0~OkII3>lMTxF1yZ85GStIfFs)<>Te_M6(9)#|2Qmcd^8<|2U$!y zeL;kWV!66zRpg(;^_78FE#xUahXq6knk*Sznp?U27lsu|DL%%=pPebwd{gGleX15? zJR4mfykMPHL{-hL%lMh>8QyW3$Y%sc+AlBwaXj4V=q!*nGy7I^!Fu%$XndHcTG0s5 zdMeGpE_<$AKWl50K{p+S{-(B`CH=ErW}Hg|l+P~nnGa_IBxF?s|8ZrHO{`vT$!|8< zALN9Xp!S-YKb*p=d$x}c^*0!F;HvV8@mrAX>UI;v){*e%?FRYSn@>Skyur2ka5NS7 z9=*j#sS)$p+w+shT7?^+G3n6y!5pvyYQ`qK#93Dj(M2mEd$<3=odq6Gu{iX4{bUq* z@F_P_IgsA)d!w>}nA)UfCNhd|0cqYS_G2l8XVx|NFl6z#_?n2! zrr~F>^`ld-klS57dn;0E^bnsp)UF#@<97C~hGiCBy|N}dr9(9zQ64a+9=7OuVE2yZ zNgR3AD7BjiW(_2PkfGi1id$}*X5~~ zB%o@SAC>X%aX)0(u#H_&Gj=JqXwockdCefw*dE~(CA2)vF*T90#PDMWC%(+xoDie4 zU_u;|>hV&}ZHkeI4o<2(NwG!qX`*YCjo&WZB0-F3!#i6rY+U+0SX6!K1i?vgOb3p- zV`ifAOXUOc&~)7MFK)U}dCwT=*~p_TR2cn7RJRWY*YJNcU__ffcDL}EF$ z>^0jN=I+PE>vQ}iwS1P1{s#(H3&7t!|A}`NdihT;LHm>swf;kMjNdo2_DXYEHqMCn zSf(z&zxdFFISd^ARKQ6u@Bl{iI*2Dai^CoxB{5%N{YsLbBSl+%$Tyz1!{Q*-0I{BC z9Nv32!LvMj&CH)XOr1YSVz(4ZsbaQTA4PH4x@uQxiRG?Uh7&UZOdR^sGMg`vIg52& z7>(WBnFnu8N`v#BtUCUldFb>*wF3jwAUUaLa%yp4^bP{@i^t88aU#w9PxMmvNC4LIQK){!0@E#-v+A2p+s1pDi~Jec(9u^1y}2ePOb%F(^6z7a`nSevo?YZRba z&|HdX06h(?ds07TEEEya+-X%%($KwiA@zz7b8Ai{FP@(!kFE*iP6X~n;D7xnR{P!m z2uMx0LGbk=gtQDRHyPLXa)r9%V}urZ5D=-AuK;r29^eP|LoNOfpeKZ z1w*X|<^Dq-=@1RzY^@S&a1eB+EKG{65@iND&w72iM8pEDShNA}kKzC;BnVb)frEo^QN&ccJ=%sO``cbO6^MH zFL58kl?EzDba7l|lVarF@s%dsk}{2pd@ksql5tXdK~qeB4tTeROMxj!>Ld80oY==3 zIA_1~oDkb-gT=-FYh&@^lor}?|7Q{|E}rZlXiZt(OsLsr(Z90g0WBJ%2an9@{V&6F?7&62njLt9rV|Q{kn%08Dy=j~b>7j8 znyMw5Kv&zk9;HRgx<1xuBHpS5L4f5H$3j}D7sn#33Gw%Eo~JC$`SNkDe#6o0W5(pI zRdJzHVV?1yzq^L))cg~Tc2N;2VzavqXsTA)GV?jgd*-KlGvtMZ{Dt=JOJ%I(_U@Oc z@->1u_#?_N`zwMB)VrBiOrSV+fujlV70#~MNVD$Q^HKg3j09)XTQX^KN>6203eh^^ z7Pgctk+aXM%)Dc9Oo%Z;!>D5?R3L02yadG>Z51I1U{2wY$#OL>C9R4Pew9LzXW1HC zDRMP)ucU~Y2K%85-ivcX3@KlI?wo(iLC*=CLf`5SWs@^%#cmtO(uIJsB4ae)IVDBs zP-|a|P**7v8yvm-I&=2oee1bL|AbU)*TklA9#Ylhn7BY$)rVlbjk(xuczpj3}>DlGQ(I1tIrISvGm&^O2=b!gE%^U^f=D~ab zPJ#DGNWuE|EdR+TL~LVric6t@5&A;HmV-NkhF#ns46SOR4%@@Xp3Qcu0`K z=M$NW`+?Run}!-QvsLa4#l_S3?FuYr@1H@-UYqC|O+il7YJv3WvYqt$B-`qZ$QugF z<$DQR6+rHRYj!`n+NsF586bB7$J)F2ejR>VjkM#$*lYo~x?~Afz|gPqYXUGn;Z`*C zRZdYzMtA<}N5Qgh6atanTR$aXZ;seEt8mU?g|hmjr!UpHo{!=)Zfh4Wjt%_m0)zypB=E z@%^UmEp2s(Cf;Aii7??u?7Z}+Y}C=Sf65DfPS$q}FkJaWo{IbZ6#O?mhE{Jj-M)#K zmh+u`OwU}p*;!bBn!z+C==i!hAuW1M?6~c}{i0|nW6aSZQ;K2hMom#pATGE^eKvEt zs3@A?+8bNql?Fc6-F;r&aZhanJPVK|dOI~TBe|@1=kRkIl;9anl)&PkP~N>B3vqMNT7I>l z{ja=e_MjKFM4CN6b_3dWu&V|Be{m1=;T7KU8`2#t@|qx`Z}p-Xfh1vXW&sD9`p{VR z#Jnm+7;>!Lo`KeX{4WcwW`rkwPJp$Qk;!Kp)W-oVH{4i_+E{1Yz7f3=-uDNRHFvuX zWvD~mdp$fq@Ct8kSt=*s_21QDkc1AL^qcNWT83lfAJDE7E31;{4hoR^9sX?HRZmHT*Vz&(-?GQ&1({98|PN3ZEYE-F|eNJqPe9k+- z_V+tkPn4GaU&9Rvg5-k(q`5|NXZ=QR4MZ1t1}1bh{Q zucYdHjgNe{ZLfxoS9g3VEI?AGik=1u)id=rNqTmK!i#sy)AIC~5WBNMbu>arzk>#` z1L>D2)EYt=Q}`MxulKN7x?BDEzbS0+cn_3G=iY3Lq3ZW885f+2D~+I3oUqA8iVoJZ zF43C$d!MKgy=?)8zblDEQB1`fIvZXQfU~8Ab8>R0e1y~d)uCl>NbQzzPW$E(-(LtK z9C_8Y66R#lpA>_Z2*P%1_WbL`m@tgv%oTHrXCP(%CvI;uMn0A_T0#bE$fQ^%x5dP3 zFo9s6%|*x7-by)Ge;PIyDb$=atZ84P3sxxs(MLPUph1}jMFX&5nEZNZp7`HfxMof< zjN3no47Z9=*K*Z7dT>Uh31UEf>a})pB3rX}ebF15dl^kSPHp_VNI+UFQKgd;DwEFB zRBW(F@aTiXtA>tlX)e{11HgyYa1U~U+^=}e{0ahPnMH(`VSdfgm=l#nAc`t6A@O&u z4W*3|&dFcUxs!C~l^CD`xopfbYoX$9fED0SB!hs2omGd8z8NB*QmanLH?_e;+qQ~f zT&1i-KCEWbuqqch4K^&6b}H=)D?{@Z37d69gDRmT2)1F`jxDl!O0>>Cu(Wu8++Ce_ zBi=hdLh)wqB7wuL7#$`-DwW0;K5!+Qh*Td=>NmPQw%)EVyrdA!kmKT3T2?eM628=f@xCxJ}? zUq{28t9U$jwja!GMvm31sXG9P%%m4)EITUgA4dfGiLDAbmFB>CUB)Y8vj%0W+!XFn9HQMC9g`fE55mcl5?fItD#`(2&*bX6i@Y9dSxVZeTOTJlnEKU>AWW|;q;ha zwZm{m^)Jk2b|sdM(g>f{8THr==dOcswEc5;Wu3el?O>o>&hGGrkO={X#e1=n67{QE z#?n`@4#00By?uFdSp{^)#0%b_BE;}nIb!E-dD483sM_92{E<(b2b2bS zUl1va$nlbHld7pylhpmuQLtcjKFX!ABGz1q3ZA!!hj?P!r6lWoNl}5a!8@s^Y*5lU zwUhB%r*OK&$woSYka|Yn$9i3UTTBjgDvC%Y`=ELIc<_wYcn@x)&)U?IN(dRPN{edF z`^&ZsIvmY6Fs9B-ig+=!(<^=YdoZJ(=#);ii!GGu1U%1uBgc^;n!p{bx z2*2z*$)CZ@IivN9<|^Wmf@^6l4GJ&+ynpZvHg`o48AQw>#SW$G$=oG=B{efFm8|{} zeSex4E=eWvmp`we-}c%-j2-X8N==Z!Wzf;|P~`AQ;gFs%jxU#q+$Pl`Pl zWDRN=lkgkQ^i};3Z;F^iz(0Y;bN?MzsdA)`EoSo`(a9*yA9Uyr(Fe~Bz

ziBHnZmiFg`xzRhK0JgnCfVYP?8xs_ zI&sM`4vUYra|jeIE-1?{9p*+e-8=RfMJJsQ(~rv3y*8A-vnRN;_DIjx*p_WrrjJ3vZch^@U)2y(Q)Hg2Dec#}naMc15NaM~32FMcvHb*l ztL-ma?u~O?x%-J@T6+D$Q&&}!F65~d3pBfP0^umUG5`v{)s+_h-BK@u~~+r!DtqYCZF}wy=)xh;ch4X93)jq2Iz& z!*<{Iqf=RB6WmiS@m9xNSo)=rG;=&d!&ACDNNimyq9jZsO^#nKO^B>SXVfqpic03@ zUVg7jnnYf}QVl(7v0LwuInUn{npotu3DQEkUap9KUW@bR{W)>b@05plvIQCw7~$Jg zb{NqgIEB~u>e&jB>y`wHw;7n*`otL*J1C5)Dh-`!=6gST(3ldlpv3IaC5mF^!#qhl zdWUwPG4u+BBi^a9Bp6Ke(5;KCEH=wC$Co+syX&cH5?RNQyUFcFM0lj}y>*{er5B#; zxXz=2qY8M>sB`I>J)w8M0adnwb8*NEWXce z0?F5@9R8Md_#a>Y$EUv%XjM)5aV+-W1*J`e^M`Ck>`$(K9Mk=OxJ~}Ir37BjH%z9q zw5RlY^o7X~4wXi$n%BtXFdmTpO>yo-wFGrtO`F_=EzZlS+Z1rkj33+YBA9Wn30qnU zxBE{L`!^8pB6#!P`^dk zu72G{Gd@LJ!hvSRpHaX#3kvSt{RLQdpO;gnw1g@NE$kj&6~3IThPR?YNN7m+J^M8B+m`9iJ6Zd@u1A!WO|$J4 z(hJT=68|>iV`PBs=9wTrzjFDdDx9Mr!C;XF*xtl08I?iw(gSiVz7oy#!kaJtv2@9c zPTi~5C(x?}y~Cd$%^ZdgVQiVd0FzTiE$=U$?A$#WssF+HcuxC!ws+*Wjo+=YKVI_D zI644Pw>cNSI6dRy=VgcsR0P~DEeQ{>gJ;G5AYP6SRE&O8Z#V@p?G`i<7nK_GX!qRZ z9KA5tZT=2ca!*^s)l0rQY#8&((IqDS8yFDFQ^e z2(9tNOje5?$v}by@d%9eT*2Pqh%U-{lL6sH(>~a8Bb@( zH7zm!y+*otrZD&7wNXs$0S8?qGvP<=*aO_~9D+zyO=SwEp^Iqd;xYuCDw+*Wr7+JT zERZZN&@S;VBQx)sP$(4y2X<^yzk2hc-vpL-6ruME(8`F_(KA#Rz7-`YVYC&xG$E0$ z1p9hN%QNeSd*G$!Y3wh+iG*kVc3YaaYp=ee6E)9h#LNPhqJn_RL0O6m5AV{VhnG-? zCys$W7V-;_PVsXp>?;~2@W^CAB$?0h=8btEAF$&o`}Uhcl?Bz7qp>DItdo(lU{fya{6d z>C*LG=hiA($J=wlme))~Yo~~yvTvSReFXoFaH!Oe75=pJ)-5y}#xKC;yHl&V*eGB98AguIf)mqo9N-frIr(Nnxc)*EK6FjC#1r@-atk!PH{5B(KDlAn3^fQTlu{SSv zIOT;?$9Y1+vQS2;{Vzb^Lw-ZE9JXZ~Rvz{X@G5N}$Eo>#M)AI0T&KhG(&_1NOmjDU zP*A#y$lVvZTpPSv_W>uuA0HAP{Y`|qfqXj;pHK@Q@JKcI#5Q)Cd{hRk|I9zZnz{QX zc@&Ji08iUSES7Gs^ppmFs6e@W9MfEhRSS-B|FKvvzn=7J?7mRJ>Fe@N`@2n{F_lfS zkAOCdrp2o3f%5#P zuZ+eDviqNZ+$t@!f3p%~dmI0K*JqjPOcZ0tS)u~@=&kn40bl=Mq8V)pDe1@fdz}AA z6}vYKU|dPS_xvSj$>~g8MV;vpy}9_@SDN`8Urgh>HP$@TPv?SDe$NKWQ)w~PVMs|a z(vk3U`;agYFZ`uc>_|kdq0?^qu-?#!dGJyBOv+o1l<=M3ZD{;%`ysYX{x9^XRHM9Q z?z9|*{$R=K18PgQH)XO$DQ$&|g?VX4uiU?c^;&RhhW5`R1U8;rpx=^Ibd4OLrvLr;Ti7|A z|1Z)0eKv?PF4cF~4Y0LKoAWLWb!kZC)4p5^rG2v8)?t?Q^`EsBlin5OcDFp*o(iNg zO~{X4O(~k!*40Gq4iq2E%#SNdQ}6nGAX<`#O^bdnQ$KGopk}l2gcp}CAP;3AG>7Kk z-@=Wk7n4XUeP#!JE_!_1QGn=os z6@nePu2j9F{Km&BWt2L_q&GU=0U*G>Ba48^Al^M_S!TcojTy&pZ0w5==7@8DNIS@F zY1IEqRmR=;LE@-J_^RlI%6?IGMuYC`PQuK{Lpx@(Ryk6=iSBu8H>2}6!t2LGi1fdY zq*QzM7V{t0nc{;#H?)Z+yB58jR%++61lqv*sh+zmq_^7H`BwJfOcV{yO**qQ{!~L0 z{x5R6&b9ByQq;_$!aHdIqGQVPX_EenxUOyN@k7RtmYtH?SUf+NEj`>QP zUR0q@H5KM6#)|GD^wF3Mv4W9VSs7Pd0b6m(!ur5+)U(I|decAl_=7Y2-|bd8?oToC qjl*u_(z|otSZ`lv`SyAqgcksY)m+p-8t<1q1|4XbRF22nGlc zs)b$!5;~|zuhNT@FLUppb3dI~^R4yX`+k4ioweYseNN7P+J5%$DcR}X`3N|!sj8t0 zU|;|M80a6sP9H!8uz&Bqef#$Ar~lc%fB%7lM}Ij;AHN+^9%Cx3Uc%E@&5J_2KrYI9yrMO%P)+)tW2!D|IcIRHGt`t zJs}Kl_cHJU_AoK*Wn$Q=0`UAs>RyK52H^K`aQ}f{_U&cZbBKQ1_&9)J@18yT4jnwa z=ir{hN9d0*?Ag0-{{g0h%%^03VPTgrc$iku!OD+(ncvpVAs~4fhOm4P^%QuIP3nsN z?MRZ!3qcvUm9^{r=r> z;~s{6d-neG0fs&Mnf4w4vPr?{?|qT?rmY?9vXA-HWs-y?tJRmCUck}440OKsG69qU zn|Zxcxw02>3cD|CWRZ)DmwWpc&=hwHOfFIqV|Q7Gv8wu%W$PbQ@1v4S>m>sUGwwtWfG0s!ScpE zH1iYlwvR7nj*UETa!_`zklx7fd1f7P#j9VLWB47n7fa`-wFY7F4Z(@)*O7OuzkNIQ z{6=bWv_$q+$y&!`;==E*x8CLEOhV;&bXsB}@>96Ql16(=3;s)u(YwiTKkb_Qm8s8q zc#ryk3roT|@8-jINlbCs0i@{0y1N+$$oaPkYbnSR-kq@i6)(3g#o5}I8+I}4gAm8( z_en*+*2tZ&<$btZ>?aw#%LK>B4givPZhA8J=s&m_{x38C)y#j*?7w^Ff5e-KufdO_ zB%t?kU#$oWrEa=KEV67X4(M{DIq-P6b^=W&Yx#u4zj(ya!Ckk;BY5DCj*k%UDq7a4 zH|EX$R2Qi5uqx589HP7Q!<4A6qVt@PfRC@g=S14uOM6J9@8{Crz4ExZ-|Ver3wbd8 zY*p=j;-~Xts5v<6&>^{Z?6Uul>bqX&CVm(!R1&{ap^eJ-4^?4rrEz(T%t)q2}boMf|l$hPXc` zT&QWoHS$7D&4>Yca?lk`Fbyhe$gv=4)b28_*d0FLS3J=$4-90wSS@lZk*j!Z!W!G+ zAA_6(>q9VZQmrO}on}~&Q_CUH$F}na6k=EJonyyMLNrUh+JX@ioWsqY{0@ou&?YQ? z81VFliDztb%Zm7!1dzv}VEJ6Hpv3VXrV7bR^QC2^XJPZpTVv^QhX99bs=jgZcP|(Q z%77k+0_D5Bo_*-EE0Wm(D6JQ)n_hnz9LQ)No)8Ou8)QydZz=) zSU4do2bYop2C@r+iHA!czDsl{*R~O$h&Fc(oIJI@3)R->_L&4$BM*A>fANW$xzz zMhA}ElmtE zh6>*SoIEJ|qwW3&%$arpk`oorUO3{GRbbe-KmN?QB6kEN8l=AJ@Sducl%qe5PDPES z2s(_W(|Xr-x4rJk=;j+(8XHbCu%lUX;+plq(Z+;GJeeKYP}!?%yLov6fN_3QgtgzC zvsws#n{n$|G=4QRc<_g*PzMV=uF}R6K_B=m2EFWWJpp7pUi!O||MnbD-y6eQ&oDV2 zSs}M2J`#$x7Lyl_u-AQ->TNQg4^T)jt?iVYox1QqsMFK!&Pb=to+b zcj1%UJe?tZIxsC`H+*KmbsCvRfKQ~q3*@VrnOWJyVE3aN{SSCnT_MF?my>Z^ec#GV zdijZ7BH6uUQ>%*B*0SOGd4V$!tzIi)ihYTub2J03V-Ww}r&Oa#UbC%5hS)B1I_Kp( zj}uvwV$1r~0@qwpyC;$|v+}X9t2|}@OZ$^`$ojjT?7MrrBu-p59(>i{5_jK^-u>V2@U0TGzd-@rlTqI89p;Z`3{jxW3GR!E~Ub8fRa|fW1y)p+dEBFCy{RDrRpf>Id3>r15u5D~D zc4$4kyWiUC+vfk<7qf%k1R5N%i%HH_F+0%iunD|&VaeP?i0?n&PL-kdNXMm41*1__fZ#OLnYHx)AX z!xWU9n-MlJ^0?||MDCoDbg??XK<4D%*6Hqpj5FWe{;VwG_DB;cUTkLT+9B{|)0 z*9iMAzk<+OM|4W6pY7(<@(w`2XO~bqRkELcL&~>#vFWWuVdvk^rrq`a{{KHan=T1~ zaa<=$C7;#@yRt=X6Ajnz|HmSVzdl6NcyGb~pojA?m7t8$7%>0=fgR+5yzg z%g*iwDtZNy5oSWDgz3sY49LH(?D>~nq}TaRSU059bFsAWpP;w%_1`D?_b2}VdjHiK z0RUq>M{Ba%k%T6CmdGqV2FS7z_muG)UDBYC5-l=FsOoe64uImR@&}>*rs}XNf4Zub zY5#~m?*5D{hM7DQkn<|XxIG(d6co}KYfw{@egligFFNf2jw@dJKspefXq|M}^Cm)y zrp0BW-XCtG8Ja8|4}(i1`tbH-*6c?uPFLjF`SC*L?nP^Ud_iuX4-TA78Ws7B;iYcU zsW$f?_DQNGxp*T9Yw4G37k)+teeMsT&c7VU8tKSS+;A`=uR2XpM~`c8Op@)Y36hjT zyg@b8$K!=%XvnX~%aprvwJMV38(IZqB&<>?f5H6fx8N-0hHbWcq^Q13a;RPs#HHLl zmwEeU!Qk3%@aFK(NR7lVEZpVSzXL%0wll~df28x`t2cr{_~2-GVq=r9iWedLF#0!H6l#SVR(MhUg}$ zj;sjLnhn9-0nEg_-h$>NIeu4lLN>+kK&gqFn|?Opm+tuGDMv%$4Swz*w@*IK9?5Vn zizr9+IAPoELnM}UzD84Ggpf|vmCz;gBy{e!$mWB1ZmsM!)3LFoXA~0q4uEe_IRiv- z%Sg=2rEzr#`zO=3Z6f`Tuyax*vE0e3tuO-tGx>-;+a;`K$rFzXmQZ;)xJ3u1H!036!^oMu$K_M-*?-$RK13!(tH zM_$y*>j?Flu5(UD*+BHNF2qekWVipY)o3Fi>Ri?ZI?fK<#o51uYObI~-(=Grz@R_= zACcXU3m;5vU{*_M8g#ki2`Np0Nfg*b^zcpi{XqA*$OZ+Y!;2T!G}gJho?0+n{nT?m;*WK zjo$U*4eAn@yfEpu-DtAncPL*_8U7d>8uj|s_C<8=1}Jwu`HWp~CLxz!&Tzc6<@(}R zy%h3kT}it<3(_gm#BB?G|C2`%VGX^mxWsiQ@5)8e9)AAePN=~SfXpJk>WJL7BpONy zwG@0ATjCuEox6%9m{q?XfNbcK>OwcWuz<#oB{&m5u_9U*?IM=c6td(s8m1kW=$HGY zu6AHVg9v1TnUraITw{(J1eO7@7Ecywy)Sy3dQu5va;76l)`t>oq|e?RkNqQBbs4#1;=m|(DB)Zp2#@@$G`jT;VgK^T81 zU~qijMD&ZAIg{C6;Vr0|V!J4QMsYVGk~D4>f}{Ilf`1=Ij(sb%fqfSc{C@g73w(&4 zs{HHYZO_c>xx<$IhCy@GXW?yHE&+$thlBHFmDC(Ya3Ck0kSn?oANh6wTqNPGE6O)q z{NKH*)Oay)LL=_PgPh!YNgW%Pk?qCxVFy*tlFIjucDWZ(#KtYXz(c=SWxgL6O1jf? zPO=qJ&#}}@M0Z{Z2}wqQI3_n`ZC=Z(zHzzM%i;LNd@7@`UzF-Es|VxM*HN$?if&RP zeJN^zKiJb_RKnAj? zpq-#0DL9VN=hnUTeS&9&N>ckrZpwRB8c>`2r?R0TBq6S9FM|pT=cip{?;~S+f3@Y2_?tBwyDxb6g`^av)JXLNsTqTpB2Ha!jD67mL zi(*rHLX~(ARdfMIU}8dYuuLeTyJl#?X1n{T3ZorBs%y6&mrsmGe4|qfit3doQWnMc3kz;5fjrA;3QSTu5F)b(6QBVTwW^zjU}P_TpBG$ z$P=8aLQ$Y;4|_)g+zki(*`dNtI90_2uE%AXops-KJ!^Rx)^B1$!c$6R@C?tsDeJrS zqe~RqYXqy}e3Y+#a$S!Y~aHLzZrPIb$W}i7pY+rPwAp>Qr9k<5iV5drz>K@F@Gvdd+9}Kh$OR!l;Az=l8 zeTvI2{+5_yE3^mam(%Yn_~LQ+`{C!-O1#h$Lt%7iJ=|H&B!xuMaSEKa#Z%Ts%0dSr*YC~?zFU+S3UnD&ub*N03! zBF_6(WOd`B8C&7-YsIEcQ!3nb4PH2-JGA>Y7@93QWlM%|F(e&t7jo~4skl87X)$z| z&{A22zj)qZiP>JWBp`_#b4Nar%p`*drn-q6wbdu#DW`R8wHI0iTcsRKJ}5=W3qrQj=tw^=eh2XF)N}er%{qY6Q2?B)UEJ=$nX7 zSFwxC%rOmEK6(#F3XxR5>kB4oE1CKknT&2?>iwK@07?xMkqa8B6Q zf!r0*)yU#SnUQsw8TbkXwxkOts$1U&kzDQARbY#it&aSXF3U@692*f&VJQm#n zsLrEqJ#8}b9>TIHw(OtKoYDUk)|5PE9|*Pp!L~{C@NaG8@rKx>_%4Q2QfF6 zPAxsZ6itORa*I_vm3$&I0%0(fN(P#YQkdv@Afl#=c!Ra3vNw6Vx?+CeS$o9bj6dmS znW_1dqR8Dd=RAVM@&|L{O7QZA`d8)0uJ$m8vx~UJ^AfmlrLdq}zkC{Ja87HIYS9sW zs5!$dk0z3Z0N054zu`}f-i-7 zx|M*QwPVSS*ywXXA=MrUqn^!%B0eJsh`X+yb-``tIHou5*_BqDlPHr1L_}u^uCQL~ znC6t{Oml*rdag?!88BqbYK*9PfnAEp@DrG0(|sjTdFeZGE{S`cK*op(dQKmmFf6 znt^zH=%^ggn>*RWGz*7GxcA)>zpu*9UQ&{)`phe(lGC6>b5!T?8U2utIgu0WC222)Dky-LqsWke#g=&cly+9lfjuE??E@n$_x333v z9uboDd*!a#nA+&6HZ((_*1Z(l>~IIe_;Vfcq5=H#spDcmMArc;N9bku@J9teS&-bP zaIbC@epmw@YG4DSMEm)yVTt1j^9d)UY1@t7180ea+&K}ZrxP7;@h zE6E&{tD94jTaICOrZsha2@g9n&EaJVrf+kPCgs!RojZU}aR>ATj|JC9ja0qiq9LWA zNSCo}e5rdv?$6mON$*Sf%B>r{R^6}|EMVeOSSL`5kTK|JZwQJ~Z8j(ZyMQxu-ScTo zEG7wSLLuiC-gmYSh!=;<)%K!ASr-hE5_2!o6El05xlEkleRGfN;psTaFop5Ix(^3-N}**4}OU8>8Xxym9w9pV}CXKr`bsWqtlPYr03(PU$-oKGdk-jO<~QF zo#v-EYqox%XkOwvJ!AEIJ@u~^|M|V2CPTtHw_xt+SuYplacoeS!ZliKOe+QnGc=Ko zq%2}=H|qqO9*nS{^@U#MRZTFl7&ix_LMl-y4q_T>cF!5z-%q#3Yjg%G3qmv^b0GDc z30f_IqK;=NJt{-sED3tytA7}-0k?_6wCjgY56EKb7WmTgy!AA7whAN zsulP#FhSKZLJJMi2p&a1Hx{M+cIzxotB2RK#8yR(yQxlKen^j7e-&mJ%Pu5~rodRN zoJ=Es5o~>+7SC#tik(kWQfMP0)I^UqBO9mc&GI(^%sEHXWY5YFMHdJa-lBFX!pq{D zIy-<}-TZk$UzTa~>-UQOU#aEi_x@mkphmM}CL=yy2+1PW4haz$!zLsK2xOPRi^O2G z`hzlOH=6 zQLQ<{9N>Zw?a1SN&wu7F{?k=*jcs>(1$BA5w046tX)nvI)X#n@L)NlhB~Nj2L@P1n z^en-cn3MtjFJ{v-FflFnPa{of$lwBo7B6JL!(9E)uT3?+oVc#Bpu>&Be?Er@EGG2fGHpL#)Ub6$} zu&cb;^oPpNf4bxwJ%%oM5AU70hQrHfaG$g8C2F_9GDGfe8J$8RjjWO8ZU)cyCKQNe zkBHHtO+y#^XLkTE{6AhT-gQs^aT{s9lmD>t%Q>VwX$Np+Gj+|)m73r&ucIp!>W$4I zRErr;j>S5}UJJLE-SZh;E;!^>qRkhCK08{5tY;;e2w?=R)4fu0nf)<9`T(%!a9qUQ^01&;0c?N8eO}(ky`UO($$xH-arp5 zl^S6pZJj_M_G}46Te2+*9PDDzvAzw_x`N3s19Iw zd9D0(@4Su^F*d5+@1lRE(TlKYmJZ~QIO-P*tsT`(StVVq+T%V*%40rOc*7)hYKdX9;ymYBu#WyQAUWRc;M7Daa7s$(JEqS92C61;FzuBK5IjCae1YMqct zA<``5Fi5yc$2MQ-P#DwTv;jy@q?kI-t*vN%B8LFu8W>Z8WksV1WWN`CH+KO0m7g3F zUD7MC_qkkmAa+BzSGwYqLccbH-tb;6UzQn8i{mZ~X%)dMVd6pJECBdAp#1~nt7=>o z_g(v&DZZ&%Lr1D!vut$$fgv(k& zAg!WBbPBh=(P}OP$XM8=S8kV9_Tal`o8L3WnqrF%^QU_{7Pqej&izLy{ZY98DuPWj zz=SQ3=~fCqemHqUHICj-bjw`mxx^~!qmy-wIGU>#zz&O=^d%}H@z&xm4ERI(V?@PDv@)A!Wjnr z40g+>_dA=eM;<@6r}X&Hnc-@%8^`^TJ!)R*1ty|P($aZK;ZdB%K+XvmlMOOTHT9)? zDy#wDWrMXkKPz3${xGD+IHZa{eB9r5E4Z^YyWHop~RFK?v0dm8LmlpNUF)`4#)}lvK7E#ta2=>kLNVF zB9HhBmu6M?*}m$@hR%^_b1YF;CoA~^hscQA(CYI9F88Q)6XCVKSR-6aVmzSx?h#(~qn@1P1=Sm%}(~4p7Fs1A$h3g-5GAK72;Xs85_1Jxwc+o|nMIAdgcCw07GXFb9bQ z;~XVAjg3L`%%@`=`XyAn3QT5izulG;LUu^n(IL|y#6?VN?Zr|S*#zW6Xb`1hJZ(hp zXFR?~{QTLuP}|Rb3=AHK60;u@?|rW2+!b0bI+*ef?iq3XvYtgCJ|#QzWd_oU+9eke z#+0q<=&0k(6I<%m=9aHo+_NMBbiAWq?m%4b(ol{V=_<%&+g;OJYN+9nvz~RM3g6(vhT4DI|9fkV&!&>VV{F2??r%O{NsRhiSn@ zd4OQ)82x$LuOUJtyJ$fj54>=~bR-M7@6|C2o)6AcBe4&LEEZPT#RhHqdV*!9#OE5L z*1Y(v98L;2CbQHeJClHOG?V$@QytS)^{&lY&a`G|ea5*Ms-Zn$fKx!}WyP^q&nKY8 z^2wgd(Sq8zr)9QBk!;}f%;4zDU>!yMnw8Xe0Ujx)W*4z)C=`J(cZD0Yfr)*RB zX!Yd*gMr-AuCDWN_+>7u0FGymZ5+`yo#ZSM6Me8eJ9^+y6=SslCq8q^kYD{UTy+23{M(=}99}85md)O-;#j znF~ij(Ua`-pSenc0^c46T{xj|>Sac7%&)G|;K&rgaF2FO-WYO&=K1>BP-u-{9@XUh z7UP-R%GO)O^ZKnC$M!l*V24{{1azhJj}B(jE6mtQfk<$iun^-w&^*+X7&UPl2TD?A ztXX-3pjoBPx-ltzkX}^{6?Aki0V9?3C@D4uCmy~coXayl5s;lj))3~{5PT7Q60_pj z$V^CbKo%ILQMyItj>!_xsH1Kk+J4rimMz2x*l(UA?V@(m zP=G0iZXq$vG#3Jr6PtoBH?vb@F?Q@Qs5cW$zpt5PAgrN~)t#qgkor+T#QJxV7#S$AY0@sQx@O9iK{$ zBD5)YgFoC(I`#Yw=3>{KQqhL6qQ-~8+^(%w(EYC2VI7V7rKiyRQu@+eh{n@sS!bB| z+S@Tt*MhYq)L~SD+Oe#sZEdfY0uG7JQ{`qb&+vHyG&f{J4g}du?1>R8Jz|Mldl6E~ z*fW`WZ$aaTP)gVY*RV^88W<=e5`#p-6Ol+gguAykI+Ta_D5R(T1+ZX7J55#4URbtW zm0#8*S+MchFP;3gcan}C<1UB`eK04p!Ih??HIa3ei#z9KrmHCKMF$8>B4#AinGo?K z^{Akm-613A;vDzuKTfmiG|(K&ens9ici#wHC%V`*XJQFRAY2+*k7QRcd-ST==lnaf zK*wd+>vh3L(JK};Hevo-1VbV}ODzW9I8QRvU2JC<1q7PP-1eNnPDLwMZ|qbV;NbcXllOhq|5KzGM(z zjo$Fnrob?d)kJ(SZX0xx)N`$@)$4xi&5((!%^Cz_?W!b$=|$5edbdI_$#C+LV6Q=y ztjthoKS|GmC;gpGI;9XL(iKU`@gD8M$q1PCX4tZzA{(E2OZMiJBsJXl|aByqT z(z*$3R{^`;mS~sA&WJ)-Gpka9Rz+AQz&=!WjU-L1{VO5|RVI51o&8&Tlt% zb}o^jIj3einTbDvs+q5!j?8tPlFl3@-6@9*Atn7vX1b{+H;aQgR@=?nVsr|Ij8FQ$ zP4h|2hhnTxy5bsRwV^bqMGD;!cOyaPM|rbw_tBw1qP=Kc@Rjwm0+=kAWMe2&PwHIs z_()SAtMBeY|)z$qcvaZlE%0Y%Zz51fL&Zw9-5#G zeO>Y^{X$~oY=CTfH|$!pP0$L3D^?eR!9ZJVo@E^GaTR&k+2dc1Fgx{T;!a}yey(Wb ztD4M-;dpTz8c#-58Jo2bn}G%+wgsr{r)O2{3SlPpObtu-qYk{|&08cAU@TxoFo((^ zD*T-uEZ|(U%H9ux5*7D_Wn{}S-nfwdNYhdzJb7yGrB@ctF~#k{78V9iT0@4zu6^#$ zR*$Xg(O1lGgbAAYnmaj_ebsCm3TU+tu+uq443Ik^%Uhe5m^oTsJ&zjCjOVFd$1YAz zk9K=s+C_~V8=dp)&Upc zrPVjLhC%E7avqA{?IU`Yw#5!7h{A#XbAw!^NNy?y2?R<(^|Cn<*zm>j4fMQe-^UfF TeOd8CtKrNMZKfSrJ3apgB3FK- literal 0 HcmV?d00001 diff --git a/notes/img/editor/palette_rightclick.jpg b/notes/img/editor/palette_rightclick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e04ff69cb6d9cd1d1ceca2416870b4a0810cee38 GIT binary patch literal 103883 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

;$hWlZ}Dxy9di9 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 literal 0 HcmV?d00001 diff --git a/notes/img/editor/tile_palette_filter.jpg b/notes/img/editor/tile_palette_filter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..137100d043bda43c96eb4eded034947cd277ce5f GIT binary patch literal 14570 zcmeHtXIN9)(r^&Lf}m9CB?+B?gd!r~0YXV=QUvMJf&l`CBGSa8BE2P{g{Fkii?oCy zMd?kX6ROfwnoC<%Q&zzw@d*S?r3k>HO7#NvYE-^AO zGchn+;<&`j%Er#le&OO}P7XFs7B+UaKbX+ap1gCK?i?N6IW|THMz;TPIc@JvshCjw~b{!7RSBf390(Vsa%$}yiHX-@-aPlV9@wHY+0*-cN;(lN8h8nX(iJ0#Kr zp_t!a46-@C26_8bR31+PF3_H|oSBvxa076Z3g{Fz%(-3^H^~>AfSmG_dY2^WIj_LX z-{wkr*h$&B!kf-G{?W%HnMs!6QdKmz!!p@`36-w@E;nLV;YQoA;EZa0j@S2h$SQdj zeY!bg*@nY>Ub72c(n(LLJO!3ktzrCD-NH?uR^~JYEB5@?>(JA*9m+w)fzecv6!WSO z&BmULhMI6jcE6IA0;MR)c-Q3=YK)tS8J-z(9waP`fOGpVsy7%7uRLVX1JY~XgnAI{ z3=(A7)=P7YVX^k-;p9oSABpXT{EJUTBMY?=3S#8xHy2JF^Kx7=;dRz$If8ixe@@e&C6hIGvZH9< zit-SK!WOX@V)dOhgAMuF^X^JlZE^M+_D_x1fc)w#Hiu9%MuqIe?smcD^I2hq)IMA~ zA%`VEm{gd;lC&-NJ!t4RF>13B4>i!j#f9f$%Hu|?BYC`5bzzv3P-xdRCwDbf9^(?s zmU2$S6Wp~cH&=V6Z0G2$!R)!%iGKgGG-E0`xl{qRLE^e!aEQ9(yud zIjQi<5;TcKx#X@f6vQ%OEiPjFUYvdA!WB-gD*qmwKeQ&@^$T%+D39d3xyFycF5+cd zQ$WjAU_$>n1p&5%vr02G^6P}iQNyVvIrm#eicv*UyG^IDlD&w6*^IOZH$YV zIrvfFWdV{C?~BsH7|Lbt)5x6aeEnD?9*or{0)camkX;~6)4%Z4U%|BDNCIsl#WkUC zc&%RX1_Lm`6ml2+;RcWuOED6cl2(cMqJs%$aR-;YtAg}{-HcP!=X|9KN6&o>D!PW= zFvXRE=c>&R_j7pf>-p$Ob)wv;r;)@NcdNd!pkj2ylfmbID*nGCB`nLz-v@e0$a^#> zc4AP_o1RztXR0oZt?2G5fHSNNU^+8(fRPvDXoa40RiqIW^XZJ_k<+{kwF6t&&tj9# zwIzEP=P-itwgsJsPQ{~&g?(EQ^T=Le?eE?ZEYrV3Zfzy(>tJVRoTTr`y`T4oybI#; zv`#p8698boePjVo%JKfRA!w6xnj)xoD>zrpc#%T6-J5aYyHaMaFMo%1^5QA8|K8w# z`gA5M@PWh5WmQf;k;ymM`jC?ITxVE(Q)6onJ=c!`_iLC7`F{TF`0bjZRjQRW$(GHg zy-=*kwyW}$9fVjwikM#%##nR*Cl3;AznH(xcV+Fi7Ne-PCM_tBr+gNn%^Lr3p+3Ej zV&^H&dMzTRClJbJQ1Bx;3qwxcs!bG<7Q==d{Oq6|&E)Wzx!HAB?tyY5lZnev-v>)~ z2X05TwN!DQ&6>Xh=A641+!8>9D;uqv$PcS4$N&f2y#uEQAcmq2u_A=) z7rAW`wzWW|9uYrA{DL+SCYkuzMI;i*$`!8{t40KZ;I zVXUd19=|-^D9)?DFBn@jF;Gi}hv{*Ry=sPE;oWUM>oPLyQooJSP3wapO$QTl&^ja4 z+p*P@q_)U&7#Qx$+{P7d0u|?O=la+&LGF67RKR4WK~eedF2MS_LLZZTvB^Na3ref# z20mT;mLwKlQCzoZ8y%Vb$R}q8RByaAfb_2H+*EO-i+(9=(TOS+mf#+Ftz?iJn_KCu zjhth(^y=zs@#T-Ie_dv&_yAYG!*4G z5K;Hu&~)P3zo_JSTgllyA*>LYmmI9;Su&(GSHbbIRv*<7^}Q61c}CGwA<3`Et%gGOH*!r?7s+=0UE&`b6=ANrloqj&PRA z7_6sojgU$|Z}jgTLCk;#-A}eTTiyz@#b+H9-Dq}MC@rc_^>p&8yTyT;Z{&ToouUt*%* zT_N9~-NlLILFF1&UAZsvWVpQ-wgmj(WGT4FEh>Q77%_RyU&?sRp4`dj# z0Orxmi4>ZAk(DOC3<)ahf~sWAFb z>lVk`ykK`_ssXNISu;Qex^;0e7b4=Eb7MuD_8x#f2mM}pw5Pg1u2_VspVTU9;w4NH zhwD9y-2iWL?s(}(~{ zZwvA~I%%K$`bP05A>Lm2X0ZbmGJ;PGSutkzPXkQTl)Aby zVac|!F=RoDHWzPjFMi${m7IVx8LKJi!r~LT($dyo+DKYCnX5v{GpM%u;YeYjyQ)Ju zYFkj~e!|6P z%PhGz@Sb6ZIx}C3n`>KSr?EuoyjU+y_wy@xaPHJ>TOk%s--vz@6owvU-l1*VxeXFz z5d;8*kn$X+#!P%mzIE>2nqqNn6kx#rqQa=SKAP4LAbju5hIV)LkI28VZkPz{MHVHD=%j~I$yzt#^6vD{Yed!)6p zYg};At;|U;2KjJpY|w$ZQiNdO9H6~cm8dF`#1kpEGM3CE%!KIxAYikuk zaOz!jCPHVxnb@+QyC5bx>{1}kFJrZ+@Ec>s{VH0e^0Bd^GRgj0w_+q>P~6=}Eq8pt zNh6_hu{qwE1inOl*t8fkmsxZDiW_O}!*^^>nX}@w1eGJXyu-Atu0p9=K8XaIOlrld zX?1Hm2oG^E-Fo~f%RDAt*8k@1c=tGiXWiy6`-wp|+N(VBFLlvv1@B;UEx5TvuHxD* zWmoOPl~ps0yGqk?x46ycjZSUoGn07#A4xoJQCqR#`9)8g31N3T5PY?p0~2MGsrJ8MZ%t#ugFb2&d04R=S?pV zhSP^!^40C1wubxI{v7%A(JKkhA%nW&({XS^gL zPEbu$*vhn;urjZN-oxjnT|H=Byd$;Y8t`-Mdf{a}S2Sleqf$hxEGo0iVYkG5#wOtH zHCa#Q+T@gR9BKtmO%xohkJ%M`I>Mh2h#%2Ue!`P9;xblT+9jKp3v+RczrEx>G#iui zp)$I(G`aJ3j>6??Vzaj{)70}HNjJ>bP_ zbk~iqSi7xjj(Fsx@U{Cn#x2X=O{2f2X2n_c`$#8n#S#OzMusWo_!r)rR5Rp`w7+zI z`5K4k3%9laf_)O=4GN69b)lYmhOy9FnTS(aQ2bcU8rFslO4P7YgD8N#K%C_sOHri9jmPMJl5jNRULNkjk)laQ>|JPC%cd*mmdJt|qV_|ya$By8O5qCfT+<5M$5@}f#u!i8iP1T=# z+zvK>S+Ge^kRzm&E{l)V=EMAp;t48ttd;`~c z)3Wvo7lX^zoh4|VQk%&0KrTq&N@3>8}v8vtg*DXFSn$sMW4pJ!r2OL*YjRrmJerzS{AD8 zze-|BN3f6LLe=z^T7dO%H#=j!AT;fT9?#TD67gr=H?1?avpV=nNFb*r zB*F{s2z|7{FuwLp6SXukBZ{8W;=;;ViXC0dZYzBw%J^wN|2t@yub>l)NIJV}Zc4hL zAoeV@oh!Gg2B)9Z-e9n)zGj_*0gSgQU;VsHlVCAxJb0adtS$wliT#N$6y-`v6xJsj z*5_ziGkZ{(g;fuAPxj{uXLK^vI-tAWZhZl=>rVCCo4QL)wS&AtDOQUQdMqp7q;$hb zicizF%s_ zruKZXE|{Z~+LaFriCEK1cnx{>Lg&r|{@EB_?TNLdvEl~^kIYhCDpPn!Zt625=t1bP=h5!nCy3Bn|etphjaKNZYykvz+^jnr%Y)eu2 zoNSWYov>(Ovg7H^=VwT;wqil)s0q(ndk{ek1|oEtaf^FYI%ff=nnuMG=LN58qg~dh z_u-6XHs^xx!%MITV_`56inxD%!)5Ro02tV!o0)U^oUXd4I8p}9c1i2<=$q2dv$nFv z;x~d=yDgdhgC8L*QHtVTXB5Mvi%Vk(iXL-U*O~ICE@5zNz23$=p>-O@2TeC1MY8n{8h1A=C%ibs*hHo@owglqFmiY zljIyM*?i}+0UX_m8d0W7MkX)nq3KckTpS(R+RhFa!|rBX&i_o22z2`BF?l=VTMXr6 zgAg7Yd7-eI!KywNI|iFQWJp}os(Tbx@ac7)FGkw2y_3yj>XxdG5LC+L#%PN#*;|f& zp-5?+3;k8Dr2!iXg*3z`mk3wP7Bf^+zYkTu1T@vXmnbZL5V=_H zxIyEbl+QUmy-V-*)7sPdtKfA@?v}B}skr$_cOAa(*@1da&}oV>bD}uR;UJ&j7l$$j zFM0(9E_Da<#EG{b>d6^z)D#>He3@t<)6js3yELNmDy4lP5|nF^mBwuO zJrYZ~5jbIEc!)+8B%*s*y(A`LZ<<2m*8cTJ3{>jV$e?O$TGb-8DXYT$BT%!*Z)t<5 zS_g4cjs7DW2Hc=Qyj8w>NBK!YUjwBiBl_H0j_TuLX_4PN+jCRca!fHZ8umcxFS9HS z(OxO{7;FtQ7w}i}F}CI-;&YY6Az^)SIQmkmX_O0|tn(U-^Xrd^hM<&CUas%$ylI%l9uqd^AE@%Q3Lu) zC}_@`rh!50N&&~+mu`_YaJ}TXhx;FGHR9Sw8m?p6h=|D17b4Ei&Y5I5IHv0jM>>(8 z@UEpHoR!z2YWh}#j#%#Po)FzfA22rNW`F49m(T;W2vV4r zG`{Ig2xRt2s{02hOT`{;_AFXb1vIXMo#ryQJ8VH>+jH++?Ot=l7AWW-HQ z;qs}8eXg{h2aobobUbKhKFNEU>Lyy!mxX|lxs!SU25$(u`pM_qeMj42lV=64z?Or1)bKf>qMB6_)^P->MFV1oFJj%bq3^lV`1^>UC~IFS=w9@_$k%|hEMc> zX;m--e*O__Ss3P;yvj#NKs>C`ZXR=Gq%?7yiIEc!lZOxUaCVtSf||=G(y}l5jOS&V z3fzu-N~+8Qiduvlg`OKH>i-lqGg_N0ek*}48MK+qgJsOKEnwE%7d5R54X0yIZ!r&` zdmmn3gQCYgHdc2ra;%?al^6I#HuO#L6 z#WXMe50e8M(#4xU_CzNKVy)?Fgd}mYi`A0`2rxJn0R_sLV6jJe&h~ONwX}wOqaiWW zuk%K+5-vfJZqE1Z5YsU=Lej$0;CNrI7bs)q^*XWmMdypX7Mtafr`}c~SjbhrL zj?@-Z@CJzcZFxjY%L@+pvB2SS6Y=QY(A10L>+iKIqiuF3)^8&;<8&e@CWf!@nC09* zr~*WNfE$a}hh6j&07hl^qQj^nNT&YxF~7=mQK!CVTXrss0^Pb+`rWY5kr?{-j8`{` z=ODRZ~v7UF)@*Udbqid!q@`f9=m_sl9#cm26N*#Cq z`b?wohuD7O;sZw!*SdYbr5(>(3zvQM?`(SqY`pC%g8kGo;K*rxA?PN2d8afuQABR2L^;hl=EX+;U7^?5W%o5RcpBFxCA2q!@G&`+}pNbVn8FnB75YiHAzp44fZA<05s zC-sq~#5rA-LY}62XeSIg&#_9staLf6fki|h;G2uEDv$!YmccBm?&Qsr%=_|F`puOCJajm@SFVcE-K1K%53e3=p~MU3<}(#PhF_Eymn(DtdVqiurt8C29q`0!O4>&kp9M4oi_RNB|9be|p zS(!F?VUhWs`HydSYu{DVhOx-i*xzJedNrC{nM}wp?#aqCWbs?`lZGMRt&SwULap|g zd`~Zg+MiMoQn}F3Ct=l^uv{OWW9jKGdc~8E1-dhQH8P0ybT4MXj>0ICPhO4Ezz<$O z3|6$~7g!N|xuRI+PS+Gth)HG66vn)9)ExN~u#g{&#&5tSZJn#y8PK~!eJA1QW-?#hY%%lt?f5h%zv z_1iY6-*=xSv&(t0%26LjZ&vtC)Iv7j`d$|mCs2#sVu&(BAxwzhu~?8GFNJ>0rs$*o z5BbU7dc85ruyjm0-|l_gCE~8lUUC*VGo8B3E%zP{U7&RJ#fT@=tGn^1JMC+g1vt5W z@v!k6n~5>$h*NeWHFBxC-Lh7bJ@k0N!;ReA_dhOXeaun2^q*T*k$=wb6Ag)V2GseGs3KOML`6M?lhA8@Wn2^yE-F?pL zxlWXal7ZI8k#FKgB1V5Cb)?8&tm^zvcOua0uUfu1B8b?wYsO#o>qpZVp7p*}5Rtny z_GT#m5)saVN1{OUO&cdU>^pNUl^!eMw`I9iQY58vsvzylHh$;J9j~r^#$-H2=!s0i zwR><^dR-aaKs9)v?WdPwv8AdS+f}^DrEwB?kl+p-w%~7h%bRe?JvXsziOcM0Ib?#T5aSqrA?C6KWsI*%T+_QLaE@X(f-n~|J6IcNS< z>rndjq&)7(nB_|jd2d`em{V?7aRqH+&?0pxVf0+5Z}NfvdhOX5&ux3O;oDM@efzDf zYtk^u608F4!}hz6Jr**MFS>$C;;KxrIerrIhiAqFKoe?9JGqTrvTN}w9fXhZ^MnWf z+bg^-*HyiQ&imEAmFgvgWHL`LinF0y5;Y4<=^h-d2Q&I z$q*H>F<&1C6PZAgjd7WN1PVBh$3Oo`MbmA`W^AD^Mli! ztK7uiEnnq2NM`qVxm~PrvCrlMzc%f1d*4r^AJvWl@^9{Xp}i!fpbP~*)}QiXHCM-^#3AHf_?*SRv?Z-7_eRKP+|0AIK+bxf~ z)bSc4itNIQh^s|ZU}WTq@^F56uueJ7)L1^AbyV@Ws7T@Nc=1@iP+z?81U9EotMW%a z)rwaKI1z)*0Zp7(jYTZ4T9x_r>Q}Q56_{Nor!Yw2N;&r-bn250ZrOF>)9; zo~VGKo}5C`s_Er&#@V|&xOkba`?yw}Qb`FRE&9d2!53omoJ%5V)oNtCfeK!g6vMVt z6;UYR@S~V@eA}V!9!nX4@-P%vEKcgWM+Cx+3J|#y!DLT=W9Q z_#Pq-#X6Zq$}+#lJ_g~_e~jvg3h-C_w00l(Kq6Z)r_=V19<4Uh+wL z`arLJYydT8i(c;zO74y8-h^O-6`@c$(Am#?0x!>9d$Hu{^!Zj@p8+<4q-JaZ0mITH zqV!hSHa)Zr35?FpI!#Npj2FU*OleD3ait}jWld(Ebu)#kjj$vB!r&nnP=V&tLDjDu z8`yv}Pi>@j(6bGn!EK{&{Oi3Q;R51S{AjX^pAY!T$nun&JkZpjRP2w?On9UuI)pqy zua8r|qF-^pjA|n8EtOy4c9^>DtP{eL7MI$u(py@a^fI>+tG&+c580bb+~DBlIrU;V zIHX?RyHR1Z8`Ig(=Qv{>SE@~_U5HkIv=?e4-7N|6U#_s9w~OUQ$J_r_Ti(eSS+hM; z^;ky@L49@*;m4FNRoIHoEy?!5-GvKjJ0o%Oxm{34KAxQg`YN*@!Dz;YwYP6jX(n?? z{8Ik<^jbzP9|i(z>_;B)|jBV zYGvuX3z_o3;wC84^EA;HKF#H)(yQAC=)l&3td?zJne=u|ax;+Tup}r|c_ot3L#xUe zhTq!+PVX_$qe%~%a+D376+){yZs7{Me!duM{wyMV4nNnDb0lB=c&d1BwfImm$9(BUt?$w0+956N;6=2sj zf7|b|YCqEb=kP|p3n6-bZW-px?90dRd%)RC?JkyG?5v4f9cTw7|5$)wHf-G!7sQdh z=k0}A@RKaA-PYLwkE&+wR9|EK={K6>Jz-@p9tX7J7(MaX=2YPu=Ytxe@8DZ^ zh%7Dd7q1i)EWC+KFiLd2`7GPBAHaX?@xR|4wA@0Ej)v`zP_D;-B|LBV{KPRJICP8{eaL=ebKt0&^21=X zHRZW74)Q%lRYC;fiJ8Mxnot!q0wm@Fv zc8zRamHwtO;JH5H>{{W^@v}ws)SpZtzo2MiR;9wsWFzLJuMdoy*jK0prg}`9%Kpet zH+`k|s#|3K87{@4rgNeC zYs?qK6$8U&N`CjITdEaVxMgIf%k3Ig^yMy@kf_22h()>xyehK4^a25poXlbCft)4Na z;6)F1@qt-_J*EU7;yD&(Ac}*z1Sy`vwAn{sa0)OVDLcxrMTo5Bi=aLk_31J1&2cKjr)PNtjNf zeBUILOZ3|`P3_-d|NMSRZD76TMwG>;`cu{%M=k>k3_Dyj$^gKr;!L+^GWi#-Y-oA5 zhuW1v$fYCm&4pM!pNXdJDF-g=?jg(|t7)11-nSp(a?Hzf9X=kR&?pnJG6$=gy$p+? zDx*WOh&}i*;C14Kozd!1La^CEVv(8&tZiSUWBxe+a6Zg_i}Vm`v0D3=jP5^g-d~`n zLw?n@_YYm6C%T@=tm!2+nqNv|`(8ou3bsGLnA{V~c??+G`#yRMpqu$=w80ou@p$}Z+Q*D+wv^E$Uo&2+5H%uF^);Kq%T(5!Loy70UmuiSO%(g6u_k%#-b zNtT|D#W+;!XJFeg;9TfD@EEY7DjIR1SJAV&D@!!b3{Am&i{BoW&a`c~vO4}qf<3e+ z>3g?*+53|`^Pd*x-B5Jlp-HpWJC+H`wsa_`{qwGK@0cyMuU>}aq?jsnL$t6@G^3)n z2zGN{bN6Dc2x#^oWwO7Bqv%jzc2TBEVY)9%NR{83;rA?^epv`>Wi#bA_GCwLs2dRC zH4$q(TckRBWYwH{#F?){9N15eMb@6r_(_THjT_QG(c%);4|fc}T3v-S**|!{suZ|# zViS8eN7dkkRsJPho`c>7@SqC@xu41MsWr67Q_e|M+SExqM=rTKQE5M9ameW7F(9JX z>kGN{<%fs;W?Mcy4cR{K;|n)ZwilZX(^Bfbs;ayg4usu$rw-Fyq9`0r`)M7KikFG} zRL#!e%_+N%bR*+~fsay~d;wCAwQl}pP&9K%{@)J@+NF+nD{NsTNsVYHM6|aoJR)^P zi+=pK>L2q<(QwYv0DaWks{2+e@8+9=O3zUxz8sNe1t|}tuLj+}TI11)`ON3P-xfsj zdUkn?pvg!gze}Eid*B7hK$%Z4QAd!zAHQC<<8#2N7Z!(w_AyC6HUQIq>S6$mfa~sL zcDv+`Ee#|(RPp0x*bhcP=HK6;xmkQ@Gii&OhgWv~gx}{OIOIuZELv z?P#~$j{#z5C^N@^hTr!UjsbYusf}a6Ov@qR7|=trz8AXj{-HtW5@7eBdGFp0k>;&O zK_PPowE{T%{ofu+xC}?i7x`*;9n{G&!*Y%~^4aY7Ks5UtP~eqk)^kyM%f#t{A8FaM zuG=*Df1$N4=YE0yo9ZuP?B7uSf(ES}O__ctJ&b-1 z{ssDPsyfu47p+|9SO4Zu*;j M{{ME cx && bb[2] - 1 < cz + 1 && bb[5] + 1 > cz) { - ids.add(b.id()); + ids.add(ReadableNames.name(b)); } } return ids.isEmpty() @@ -260,10 +261,10 @@ public final class BrushCompiler { replay(lb, b, kills, meshQuads.get(b)); postProcess(lb, b, q0, s0); } catch (IllegalArgumentException e) { - warn.add(b.label() + ": " + e.getMessage() + " – skipped"); + warn.add(ReadableNames.name(b) + ": " + e.getMessage() + " – skipped"); } catch (RuntimeException e) { // one broken brush must not take all the others with it (live preview and build) - warn.add(b.label() + ": cannot be built (" + e + ") – skipped"); + warn.add(ReadableNames.name(b) + ": cannot be built (" + e + ") – skipped"); } } byte[] wad; @@ -674,7 +675,7 @@ public final class BrushCompiler { List triangles(Brush b, List warn) { MeshAsset a = (MeshAsset) b.ref("asset"); if (a == null) { - warn.add(b.label() + ": no mesh asset"); + warn.add(ReadableNames.name(b) + ": no mesh asset"); return List.of(); } MeshData m = a.mesh(); @@ -682,7 +683,7 @@ public final class BrushCompiler { try { m = MeshImport.load(s, a); } catch (java.io.IOException | RuntimeException e) { - warn.add(b.label() + ": " + a.file() + " cannot be read: " + e.getMessage()); + warn.add(ReadableNames.name(b) + ": " + a.file() + " cannot be read: " + e.getMessage()); return List.of(); } } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/io/Validator.java b/src/main/java/com/eliasmueller/llamamod/editor/io/Validator.java index 807941d..a289b41 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/io/Validator.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/io/Validator.java @@ -3,6 +3,7 @@ package com.eliasmueller.llamamod.editor.io; import com.eliasmueller.llamamod.editor.model.Brush; import com.eliasmueller.llamamod.editor.model.LevelSettings; import com.eliasmueller.llamamod.editor.model.PathNode; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Strat; import com.eliasmueller.llamamod.editor.model.StratCatalog; @@ -26,6 +27,7 @@ public final class Validator { /** Errors; warnings are added to warn. */ public static List validate(Scene s, List warn) { List err = new ArrayList<>(); + ReadableNames names = ReadableNames.of(s); LevelSettings st = s.settings(); int w = st.width(); int h = st.height(); @@ -38,83 +40,86 @@ public final class Validator { int nTex = s.textures().size(); for (TileModel m : s.tileModels()) { if (m.vertexCount() > MAX_VERTS) { - err.add(m.id() + ": " + m.vertexCount() + " vertices (engine limit " + MAX_VERTS + ")"); + err.add(ReadableNames.modelName(m) + ": " + m.vertexCount() + " vertices (engine limit " + MAX_VERTS + + ")"); } if (m.vertices().length % TileModel.VERTEX_STRIDE != 0 || m.faces().length % TileModel.FACE_STRIDE != 0 || m.planes().length != m.faceCount() * TileModel.PLANE_STRIDE) { - err.add(m.id() + ": array lengths do not match"); + err.add(ReadableNames.modelName(m) + ": array lengths do not match"); continue; } for (int g = 0; g < 3; g++) { if (m.collision(g).length % TileModel.COLLISION_SIZE != 0) { - err.add(m.id() + ": collision group " + g + " is not a multiple of 32 bytes"); + err.add(ReadableNames.modelName(m) + ": collision group " + g + " is not a multiple of 32 bytes"); } } int nv = m.vertexCount(); for (int f = 0; f < m.faceCount(); f++) { for (int k = 0; k < 3; k++) { if (m.faceVertex(f, k) >= nv) { - err.add(m.id() + " face " + f + ": vertex index out of range"); + err.add(ReadableNames.modelName(m) + " face " + f + ": vertex index out of range"); break; } } if (m.faceTexture(f) >= nTex) { - warn.add(m.id() + " face " + f + ": texture " + m.faceTexture(f) + " beyond the table (" + nTex - + ")"); + warn.add(ReadableNames.modelName(m) + " face " + f + ": texture " + m.faceTexture(f) + + " beyond the table (" + nTex + ")"); } } } boolean alts = (st.wfpc() & MapChunk.WF_ALTS) != 0; for (Tile t : s.tiles()) { if (t.model() == null || !s.contains(t.model())) { - err.add(t.id() + ": model missing"); + err.add(names.nameOf(t) + ": model missing"); continue; } int cx = t.cellX(); int cz = t.cellZ(); if (cx < 0 || cx >= w || cz < 0 || cz >= h) { - err.add(t.id() + ": outside the " + w + "×" + h + " grid (cell " + cx + "," + cz + ")"); + err.add(names.nameOf(t) + ": outside the " + w + "×" + h + " grid (cell " + cx + "," + cz + ")"); } if (t.hasSwap()) { if (!alts) { - err.add(t.id() + ": tile swaps need WFPC flag 0x10000, which this base level does not have"); + err.add(names.nameOf(t) + + ": tile swaps need WFPC flag 0x10000, which this base level does not have"); } else if (t.swapAltModel() == null || !s.contains(t.swapAltModel())) { - err.add(t.id() + ": swap without alternative model"); + err.add(names.nameOf(t) + ": swap without alternative model"); } } } for (Strat x : s.strats()) { if (x.waypoint() != null && !s.contains(x.waypoint())) { - err.add(x.id() + ": waypoint is not part of the level"); + err.add(names.nameOf(x) + ": waypoint is not part of the level"); } StratCatalog.Type t = s.catalog().type(x.type()); if (x.type().isEmpty()) { - warn.add(x.id() + ": unknown strat code 0x" + Integer.toHexString(x.code())); + warn.add(names.nameOf(x) + ": unknown object code 0x" + Integer.toHexString(x.code())); } else if (t != null && t.variants().stream().noneMatch(v -> v.nParams() == x.params().length)) { - warn.add(x.id() + " (" + x.type() + "): " + x.params().length + " parameters, the type uses " + warn.add(names.nameOf(x) + ": " + x.params().length + " parameters, the type uses " + t.variants().getFirst().nParams()); } double gx = x.gx(); double gz = x.gz(); if (gx < 0 || gx >= w || gz < 0 || gz >= h) { - warn.add(x.id() + " (" + x.type() + ") is outside the grid"); + warn.add(names.nameOf(x) + " is outside the grid"); } } for (Brush b : s.brushes()) { String bad = b.enabled() ? BrushCompiler.problem(b, w, h, 8) : null; if (bad != null) { - err.add(b.id() + " (" + b.label() + "): " + bad); + err.add(names.nameOf(b) + ": " + bad); } } for (PathNode n : s.pathNodes()) { if (n.next() != null && !s.contains(n.next())) { - err.add(n.id() + ": next node is not part of the level"); + err.add(names.nameOf(n) + ": next node is not part of the level"); } } - for (TexturePage p : s.pages()) { + for (int i = 0; i < s.pages().size(); i++) { + TexturePage p = s.pages().get(i); if (p.pixels().length != p.width() * p.height()) { - err.add(p.id() + ": pixel count does not match " + p.width() + "×" + p.height()); + err.add("Texture page " + i + ": pixel count does not match " + p.width() + "×" + p.height()); } } if (s.pages().size() > 127) { diff --git a/src/main/java/com/eliasmueller/llamamod/editor/model/ReadableNames.java b/src/main/java/com/eliasmueller/llamamod/editor/model/ReadableNames.java new file mode 100644 index 0000000..cc24c7f --- /dev/null +++ b/src/main/java/com/eliasmueller/llamamod/editor/model/ReadableNames.java @@ -0,0 +1,198 @@ +package com.eliasmueller.llamamod.editor.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +/** + * Readable names for scene nodes ("Floor 2", "Coin 3", "Waypoint 4 (chain 2)", "Model 12") as used by the + * outliner, inspector header, status bar, asset browser and in build warnings. Numbers follow the level + * order (they shift when an earlier item of the same kind is deleted). One instance indexes a scene lazily; + * create a new one after edits. The UI uses it as {@code editor.ui.NodeNames}. + */ +public class ReadableNames { + private final Scene scene; + private Map numbered; + private List starts; + private Map waypoints; + + protected ReadableNames(Scene scene) { + this.scene = scene; + } + + public static ReadableNames of(Scene scene) { + return new ReadableNames(scene); + } + + /** Readable name of a node in its own scene (falls back to {@link Node#label()} when detached). */ + public static String name(Node n) { + return n == null ? "" : n.scene() == null ? fallback(n) : of(n.scene()).nameOf(n); + } + + /** Readable standalone name of a node of this scene. */ + public String nameOf(Node n) { + return switch (n) { + case Strat st -> objectName(st); + case Brush b -> numbered(b); + case Light l -> numbered(l); + case PathNode p -> waypointName(p, true); + case Tile t -> "Tile " + t.cellX() + ", " + t.cellZ() + + (t.model() == null ? "" : " · " + modelName(t.model())); + default -> fallback(n); + }; + } + + /** Object name: its type, numbered when the level has several of that type ("Coin 3"). */ + public String objectName(Strat st) { + return numbered(st); + } + + /** "Waypoint 4" (position in its chain), with "(chain 2)" when {@code withChain}. */ + public String waypointName(PathNode p, boolean withChain) { + int[] v = waypointIndex(p); + return v == null ? "Waypoint" : "Waypoint " + v[0] + (withChain ? " (chain " + v[1] + ")" : ""); + } + + /** Chain number (1-based, outliner order) of a waypoint, or 0. */ + public int chainNumber(PathNode p) { + int[] v = waypointIndex(p); + return v == null ? 0 : v[1]; + } + + private int[] waypointIndex(PathNode p) { + if (waypoints == null) { + waypoints = new IdentityHashMap<>(); + int nr = 0; + for (PathNode start : chainStarts()) { + nr++; + List ch = scene.chain(start); + for (int i = 0; i < ch.size(); i++) { + waypoints.putIfAbsent(ch.get(i), new int[] {i + 1, nr}); + } + } + } + return waypoints.get(p); + } + + /** + * First waypoint of every chain in level order (waypoints without a predecessor, then one node per loop + * that has no start). The outliner numbers chains in this order. + */ + public List chainStarts() { + if (starts != null) { + return starts; + } + Set hasPrev = Collections.newSetFromMap(new IdentityHashMap<>()); + for (PathNode p : scene.pathNodes()) { + if (p.next() != null) { + hasPrev.add(p.next()); + } + } + starts = new ArrayList<>(); + for (PathNode p : scene.pathNodes()) { + if (!hasPrev.contains(p)) { + starts.add(p); + } + } + Set reached = Collections.newSetFromMap(new IdentityHashMap<>()); + for (PathNode st : starts) { + reached.addAll(scene.chain(st)); + } + for (PathNode p : scene.pathNodes()) { + if (!reached.contains(p)) { + starts.add(p); + reached.addAll(scene.chain(p)); + } + } + return starts; + } + + private String numbered(Node n) { + if (numbered == null) { + numbered = new IdentityHashMap<>(); + number(scene.strats(), ReadableNames::typeName); + number(scene.brushes(), ReadableNames::brushName); + int nr = 0; + for (Light l : scene.lights()) { + numbered.put(l, "Light " + ++nr); + } + } + String s = numbered.get(n); + return s != null ? s : fallback(n); + } + + private void number(List nodes, java.util.function.Function base) { + Map count = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (T n : nodes) { + count.merge(base.apply(n), 1, Integer::sum); + } + Map nr = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (T n : nodes) { + String b = base.apply(n); + numbered.put(n, count.get(b) > 1 ? b + " " + nr.merge(b, 1, Integer::sum) : b); + } + } + + /** Object type or "?" (the outliner's type group key). */ + public static String typeName(Strat st) { + return st.type().isEmpty() ? "?" : st.type(); + } + + public static String brushName(Brush b) { + return b.name().isEmpty() ? b.brushKind().label() : b.name(); + } + + /** Tile model name, or "Model 12" for unnamed models. */ + public static String modelName(TileModel m) { + return m.name().isEmpty() ? "Model " + number(m.id()) : m.name(); + } + + /** The number part of an id ("model:12" → "12", "page:n3" → "n3"). */ + public static String number(String id) { + return id.substring(id.indexOf(':') + 1); + } + + private static String fallback(Node n) { + return switch (n) { + case LevelSettings s -> "Level settings"; + case Regions r -> "Visibility regions"; + case EnvZone z -> z.isDefault() ? "Default zone (fog, sky, music)" : "Zone " + z.cellX() + ", " + z.cellZ(); + case TileModel m -> modelName(m); + case TexturePage p -> p.name().isEmpty() ? "Page " + number(p.id()) : p.name(); + case MeshAsset m -> m.name().isEmpty() ? m.file() : m.name(); + case Strat st -> typeName(st); + case Brush b -> brushName(b); + case PathNode p -> "Waypoint"; + case Light l -> "Light"; + case Tile t -> "Tile " + t.cellX() + ", " + t.cellZ(); + default -> n.label(); + }; + } + + /** + * Case-insensitive substring match of a readable name; numbers in the query match whole numbers only + * ("floor 1" finds "Floor 1", not "Floor 12"; "2" does not find "Floor 12"). + */ + public static boolean matches(String name, String q) { + String n = name.toLowerCase(Locale.ROOT); + q = q.toLowerCase(Locale.ROOT); + if (q.isEmpty()) { + return true; + } + boolean numEnd = Character.isDigit(q.charAt(q.length() - 1)); + boolean numStart = Character.isDigit(q.charAt(0)); + for (int i = n.indexOf(q); i >= 0; i = n.indexOf(q, i + 1)) { + int end = i + q.length(); + if ((!numEnd || end >= n.length() || !Character.isDigit(n.charAt(end))) + && (!numStart || i == 0 || !Character.isDigit(n.charAt(i - 1)))) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/Edits.java b/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/Edits.java index 2deebe8..a8ffb7f 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/Edits.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/Edits.java @@ -8,6 +8,7 @@ import com.eliasmueller.llamamod.editor.model.Node; import com.eliasmueller.llamamod.editor.model.NodeKind; import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Prop; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Strat; import com.eliasmueller.llamamod.editor.model.StratCatalog; @@ -218,7 +219,7 @@ public final class Edits { for (Map.Entry r : s.referencesTo(n)) { if (!r.getValue().nullable() && !nodes.contains(r.getKey())) { throw new IllegalStateException( - n.id() + " is still used by " + r.getKey().id()); + ReadableNames.name(n) + " is still used by " + ReadableNames.name(r.getKey())); } } } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/RemoveNode.java b/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/RemoveNode.java index b0b9a14..42cc93f 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/RemoveNode.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/model/cmd/RemoveNode.java @@ -2,6 +2,7 @@ package com.eliasmueller.llamamod.editor.model.cmd; import com.eliasmueller.llamamod.editor.model.Node; import com.eliasmueller.llamamod.editor.model.Prop; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; import java.util.ArrayList; import java.util.List; @@ -21,8 +22,8 @@ public final class RemoveNode implements Command { this.node = node; for (Map.Entry r : s.referencesTo(node)) { if (!r.getValue().nullable()) { - throw new IllegalStateException(node.id() + " is still used by " - + r.getKey().id() + " (" + r.getValue().label() + ")"); + throw new IllegalStateException(ReadableNames.name(node) + " is still used by " + + ReadableNames.name(r.getKey()) + " (" + r.getValue().label() + ")"); } unlink.add(SetProp.of(r.getKey(), r.getValue(), null, null)); } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/MeshImportDialog.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/MeshImportDialog.java index 20ff4bd..75c0886 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/MeshImportDialog.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/MeshImportDialog.java @@ -131,7 +131,8 @@ final class MeshImportDialog extends JDialog { JPanel left = new JPanel(new BorderLayout()); left.add(preview, BorderLayout.CENTER); - JLabel hint = new JLabel("Drag to orbit · grid = 1 cell · the llama is 0.6 cells tall", JLabel.CENTER); + JLabel hint = + new JLabel("Drag to orbit, wheel to zoom · grid = 1 cell · the llama is 0.6 cells tall", JLabel.CENTER); hint.setFont(hint.getFont().deriveFont(11f)); left.add(hint, BorderLayout.SOUTH); left.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 4)); @@ -286,9 +287,14 @@ final class MeshImportDialog extends JDialog { // ------------------------------------------------------------------ preview - /** Software preview: flat-shaded triangles with a z-buffer ({@link PreviewRaster}), orbit by dragging. */ + /** + * Software preview: flat-shaded triangles with a z-buffer ({@link PreviewRaster}), orbit by dragging, + * zoom with the mouse wheel. Framed on the main mass of the mesh ({@link #focusBounds}). + */ static final class Preview extends JPanel { private MeshData mesh; + private double[] focus; + private double zoom = 1; /** Starts looking down at the model's front (+z, as Blender's front view shows it). */ private double yaw = Math.toRadians(215); @@ -319,9 +325,17 @@ final class MeshImportDialog extends JDialog { }; addMouseListener(m); addMouseMotionListener(m); + addMouseWheelListener(e -> { + zoom = Math.max(0.05, Math.min(50, zoom * Math.pow(1.15, -e.getPreciseWheelRotation()))); + repaint(); + }); } void set(MeshData m, double turnDeg, boolean mirror) { + if (m != mesh) { + focus = m == null ? null : focusBounds(m.positions()); + zoom = 1; + } mesh = m; turn = Math.toRadians(turnDeg); this.mirror = mirror; @@ -357,10 +371,10 @@ final class MeshImportDialog extends JDialog { } Graphics2D g = (Graphics2D) g0; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - double[] b = mesh.bounds(); + double[] b = focus; double cx = (b[0] + b[3]) / 2, cy = (b[1] + b[4]) / 2, cz = (b[2] + b[5]) / 2; double size = Math.max(1e-6, Math.max(b[3] - b[0], Math.max(b[4] - b[1], b[5] - b[2]))); - double sc = Math.min(getWidth(), getHeight()) * 0.62 / size; + double sc = Math.min(getWidth(), getHeight()) * 0.62 / size * zoom; double ct = Math.cos(turn), st = Math.sin(turn); double cyw = Math.cos(yaw), syw = Math.sin(yaw), cp = Math.cos(pitch), sp = Math.sin(pitch); int w2 = getWidth() / 2, h2 = getHeight() / 2; @@ -428,6 +442,44 @@ final class MeshImportDialog extends JDialog { line(g, b[3] - cx + 0.5, gy, 0, b[3] - cx + 0.5, gy + 0.6, 0, ct, st, cyw, syw, cp, sp, sc, w2, h2, true); } + /** + * Bounds {x0, y0, z0, x1, y1, z1} of the mesh's main mass: per axis the vertices within 2.5 + * interquartile ranges of the middle half (Tukey fences); the full bounds when they are not much + * larger (far-off pieces such as a stray triangle or a huge ground plane would otherwise shrink the + * model to a dot). + */ + static double[] focusBounds(double[] pos) { + int n = pos.length / 3; + double[] full = new double[6]; + double[] robust = new double[6]; + if (n == 0) { + return full; + } + double[] v = new double[n]; + boolean far = false; + for (int axis = 0; axis < 3; axis++) { + for (int i = 0; i < n; i++) { + v[i] = pos[3 * i + axis]; + } + java.util.Arrays.sort(v); + full[axis] = v[0]; + full[axis + 3] = v[n - 1]; + double q1 = v[(n - 1) / 4], q3 = v[(3 * (n - 1) + 3) / 4]; + double fence = 2.5 * (q3 - q1); + int lo = 0, hi = n - 1; + while (v[lo] < q1 - fence) { + lo++; + } + while (v[hi] > q3 + fence) { + hi--; + } + robust[axis] = v[lo]; + robust[axis + 3] = v[hi]; + far |= v[n - 1] - v[0] > 1.5 * (robust[axis + 3] - robust[axis]) + 1e-9; + } + return far ? robust : full; + } + private static void line( Graphics2D g, double x0, diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/TilePaintTool.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/TilePaintTool.java index 9a0c076..97f313d 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/TilePaintTool.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/geometry/TilePaintTool.java @@ -2,6 +2,7 @@ package com.eliasmueller.llamamod.editor.tools.geometry; import com.eliasmueller.llamamod.editor.model.Node; import com.eliasmueller.llamamod.editor.model.NodeKind; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Tile; import com.eliasmueller.llamamod.editor.model.TileModel; @@ -509,7 +510,7 @@ final class TilePaintTool implements Tool { JPanel grid = new JPanel(new GridLayout(0, 4, 3, 3)); grid.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); JTextField filter = new JTextField(); - filter.putClientProperty("JTextField.placeholderText", "Filter (model number)"); + filter.putClientProperty("JTextField.placeholderText", "Filter by name or number"); JCheckBox used = new JCheckBox("Only models used in the level", true); used.setFocusable(false); Runnable fill = () -> { @@ -517,7 +518,7 @@ final class TilePaintTool implements Tool { String f = filter.getText().trim(); int n = 0; for (TileModel m : s.tileModels()) { - if (used.isSelected() && !uses.containsKey(m) || !f.isEmpty() && !m.id().contains(f)) { + if (used.isSelected() && !uses.containsKey(m) || !paletteMatch(m, f)) { continue; } if (n++ >= 240) { @@ -544,7 +545,13 @@ final class TilePaintTool implements Tool { fill.run(); used.addActionListener(e -> fill.run()); filter.addActionListener(e -> fill.run()); - JScrollPane sp = new JScrollPane(grid); + javax.swing.Timer refill = new javax.swing.Timer(200, e -> fill.run()); + refill.setRepeats(false); + com.eliasmueller.llamamod.util.SwingListeners.onTextChange(filter, refill::restart); + // grid at the top: a few filter results keep their size instead of stretching to the viewport + JPanel gridTop = new JPanel(new BorderLayout()); + gridTop.add(grid, BorderLayout.NORTH); + JScrollPane sp = new JScrollPane(gridTop); sp.setPreferredSize(new Dimension(260, 260)); sp.getVerticalScrollBar().setUnitIncrement(24); sp.setAlignmentX(0); @@ -565,4 +572,15 @@ final class TilePaintTool implements Tool { root.setBackground(new Color(0, 0, 0, 0)); return root; } + + /** + * Palette filter: the readable model name ("Model 12" or its own name) or the model number, with the + * outliner's whole-number rule ("12" finds Model 12, not Model 120 or 112). + */ + static boolean paletteMatch(TileModel m, String q) { + q = q.trim(); + return q.isEmpty() + || ReadableNames.matches(NodeNames.modelName(m), q) + || ReadableNames.matches(NodeNames.number(m.id()), q); + } } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/CameraView.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/CameraView.java index f202e40..89a909f 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/CameraView.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/CameraView.java @@ -9,6 +9,7 @@ import com.eliasmueller.llamamod.editor.render.Camera; import com.eliasmueller.llamamod.editor.render.ViewportListener; import com.eliasmueller.llamamod.editor.tools.objects.ParamSchema.Role; import com.eliasmueller.llamamod.editor.ui.EditorContext; +import com.eliasmueller.llamamod.editor.ui.NodeNames; import com.eliasmueller.llamamod.editor.ui.ToolEvent; import java.util.LinkedHashMap; import java.util.List; @@ -88,6 +89,7 @@ final class CameraView { static final class Pilot implements ViewportListener { private final EditorContext ctx; private Node target; + private String targetName; private Object mergeKey; private boolean writing; private boolean listening; @@ -127,7 +129,8 @@ final class CameraView { } }); } - ctx.status("Piloting " + target.id() + ": fly with the right mouse button + WASD, the camera follows." + targetName = NodeNames.name(target); + ctx.status("Piloting " + targetName + ": fly with the right mouse button + WASD, the camera follows." + " Ctrl+Shift+L ends"); } @@ -136,7 +139,7 @@ final class CameraView { return; } ctx.viewport().removeViewportListener(this); - ctx.status("Pilot mode ended for " + target.id()); + ctx.status("Pilot mode ended for " + targetName); target = null; mergeKey = null; } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/Ground.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/Ground.java index 9972601..9880e58 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/Ground.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/Ground.java @@ -11,7 +11,8 @@ import java.util.Map; /** * Floor finder on the collision polygons of all tiles (original tiles and the tiles generated from - * brushes), in game space (x east, y up, z = grid row). Cached per scene revision. + * brushes), in game space (x east, y up, z = grid row). The objects tools cache one per scene revision; + * the play-test start check ({@code playtest.FloorFinder}) uses {@link #cellBelow}. * *

Follows the engine's floor test (FUN_004036d0, used for the player and for objects): only the * tiles listed in the grid cell of the point count ({@link Tile#cellX}/{@link Tile#cellZ}), so a @@ -55,12 +56,35 @@ public final class Ground { } } + /** Collision material of death floors (kill planes): never a floor to snap onto. */ + public static final int DEATH = 30; + private final Map> cells = new HashMap<>(); private final Map> swaps = new HashMap<>(); private final Map> overlaps = new HashMap<>(); private Ground() {} + /** + * Floors of the scene's tiles and brushes listed in the grid cells x0..x1 / z0..z1 only (brushes that + * do not compile have none): enough for {@link #cellBelow} there, cheap for a single query. + */ + public static Ground ofCells(Scene s, int x0, int z0, int x1, int z1) { + List tiles = new ArrayList<>(s.tiles()); + try { + tiles.addAll(BrushCompiler.compile(s, new ArrayList<>()).tiles()); + } catch (RuntimeException e) { + // brushes that do not compile have no floor + } + Ground g = new Ground(); + for (Tile t : tiles) { + if (t.cellX() >= x0 && t.cellX() <= x1 && t.cellZ() >= z0 && t.cellZ() <= z1) { + g.addTile(t); + } + } + return g; + } + public static Ground build(Scene s, BrushCompiler.Output brushTiles) { Ground g = new Ground(); for (Tile t : s.tiles()) { @@ -161,18 +185,30 @@ public final class Ground { return h; } + /** + * The engine's own floor test: highest floor of the tiles listed in the cell of (x, z), death floors + * included, not more than {@code above} over {@code probeY}; no swap models, no neighbours. Null if none. + */ + public Hit cellBelow(double x, double z, double probeY, double above) { + return best(cells.get(key((int) Math.floor(x), (int) Math.floor(z))), Source.CELL, x, z, probeY, above, true); + } + /** Highest polygon of a neighbouring tile reaching into the cell (what the game ignores there). */ Hit neighbourBelow(double x, double z, double probeY, double above) { return best(overlaps.get(key((int) Math.floor(x), (int) Math.floor(z))), Source.NEIGHBOUR, x, z, probeY, above); } private static Hit best(List l, Source src, double x, double z, double probeY, double above) { + return best(l, src, x, z, probeY, above, false); + } + + private static Hit best(List l, Source src, double x, double z, double probeY, double above, boolean death) { if (l == null) { return null; } Hit best = null; for (Floor f : l) { - if (f.material == 30 || !f.contains(x, z)) { + if (!death && f.material == DEATH || !f.contains(x, z)) { continue; } double y = f.y(x, z); diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectChecks.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectChecks.java index 5a02396..5a5296f 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectChecks.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectChecks.java @@ -10,6 +10,7 @@ import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import com.eliasmueller.llamamod.editor.tools.objects.ParamSchema.ParamDef; import com.eliasmueller.llamamod.editor.tools.objects.ParamSchema.TypeSchema; import com.eliasmueller.llamamod.editor.ui.LevelCheck; +import com.eliasmueller.llamamod.editor.ui.NodeNames; import com.eliasmueller.llamamod.editor.ui.Problem; import com.eliasmueller.llamamod.save.Worlds; import java.util.ArrayList; @@ -28,10 +29,12 @@ final class ObjectChecks implements LevelCheck { @Override public void check(Scene s, List out) { + NodeNames names = NodeNames.of(s); PathNode broken = ChainOps.firstBroken(s); if (broken != null) { out.add(Problem.error( - "Waypoint chain at " + broken.id() + " is not stored in one piece (the game links node i to" + "Waypoint chain at " + names.waypointName(broken, true) + + " is not stored in one piece (the game links node i to" + " i+1): run Tools → Repair waypoint chains", broken)); } @@ -45,7 +48,7 @@ final class ObjectChecks implements LevelCheck { String cam = startCamera(s, st); if (cam != null) { out.add(Problem.warning( - label(st) + ": " + cam + " (Place tool → Player start sets a camera node)", st)); + names.objectName(st) + ": " + cam + " (Place tool → Player start sets a camera node)", st)); } } TypeSchema sc = Schemas.of(type); @@ -56,13 +59,14 @@ final class ObjectChecks implements LevelCheck { if (sc != null) { if (n < sc.paramCount()) { out.add(Problem.warning( - label(st) + " has " + n + " parameters, " + type + " reads " + sc.paramCount(), st)); + names.objectName(st) + " has " + n + " parameters, " + type + " reads " + sc.paramCount(), + st)); } for (ParamDef d : sc.params()) { if (d.index() < n) { String e = d.validate(st.params()[d.index()]); if (e != null) { - out.add(Problem.warning(label(st) + ": " + e, st)); + out.add(Problem.warning(names.objectName(st) + ": " + e, st)); } } } @@ -72,16 +76,17 @@ final class ObjectChecks implements LevelCheck { : type.equals("AlligatorSpawner") ? "alligators" : null; if (gone != null && spawned != null) { out.add(Problem.warning( - label(st) + ": the game removes its " + spawned + " as soon as they spawn because " + gone + names.objectName(st) + ": the game removes its " + spawned + + " as soon as they spawn because " + gone + " (Waypoint tool: give it a box of 2 nodes around its position)", st)); } else if (gone != null) { out.add(Problem.error( - label(st) + " never appears: the game removes it at level start because " + gone + names.objectName(st) + " never appears: the game removes it at level start because " + gone + " (Waypoint tool: give it a box of 2 nodes around its position)", st)); } else if (Guards.startWarning(s, st) != null) { - out.add(Problem.warning(label(st) + ": " + Guards.startWarning(s, st), st)); + out.add(Problem.warning(names.objectName(st) + ": " + Guards.startWarning(s, st), st)); } if (gone == null && Guards.eventBit(st) > 0) { int bit = Guards.eventBit(st); @@ -89,7 +94,7 @@ final class ObjectChecks implements LevelCheck { setBits = EventBits.setBits(s); } out.add(Problem.info( - label(st) + " stays hidden until event bit " + bit + " is set by another object" + names.objectName(st) + " stays hidden until event bit " + bit + " is set by another object" + (setBits.contains(bit) ? "" : ", but no object in this level sets bit " + bit + " (" @@ -101,28 +106,29 @@ final class ObjectChecks implements LevelCheck { && sc.waypoints().required() && chain.size() < sc.waypoints().min()) { out.add(Problem.warning( - label(st) + " needs " + sc.waypoints().min() + " waypoint(s) (" + names.objectName(st) + " needs " + sc.waypoints().min() + " waypoint(s) (" + sc.waypoints().role().label + "), has " + chain.size(), st)); } if (sc.waypoints().max() > 0 && chain.size() > sc.waypoints().max()) { out.add(Problem.info( - label(st) + " uses only " + sc.waypoints().max() + " waypoint(s), the chain has " - + chain.size(), + names.objectName(st) + " uses only " + + sc.waypoints().max() + " waypoint(s), the chain has " + chain.size(), st)); } if (sc.waypoints().pairs() && chain.size() % 2 == 1 && !Guards.walksBoxes(type)) { out.add(Problem.warning( - label(st) + ": box nodes come in pairs, the chain has " + chain.size(), st)); + names.objectName(st) + ": box nodes come in pairs, the chain has " + chain.size(), st)); } } else if (stat != null) { if (n != stat.params()) { out.add(Problem.info( - label(st) + " has " + n + " parameters, most originals have " + stat.params(), st)); + names.objectName(st) + " has " + n + " parameters, most originals have " + stat.params(), + st)); } if (stat.alwaysWaypoints() && chain.isEmpty()) { out.add(Problem.warning( - label(st) + " has no waypoints; all " + stat.instances() + " original " + type + names.objectName(st) + " has no waypoints; all " + stat.instances() + " original " + type + " objects have a chain (" + stat.minChain() + "–" + stat.maxChain() + " nodes)", st)); } @@ -138,8 +144,8 @@ final class ObjectChecks implements LevelCheck { int cx = (int) Math.floor(st.gx()), cz = (int) Math.floor(st.gz()); if (!cellHasMaterial(doorTiles, cx, cz, 16)) { out.add(Problem.warning( - label(st) + " stands in cell " + cx + ", " + cz + " without exit floor (collision material" - + " 16): the door never fires", + names.objectName(st) + " stands in cell " + cx + ", " + cz + + " without exit floor (collision material" + " 16): the door never fires", st)); } int[] p = st.params(); @@ -148,12 +154,15 @@ final class ObjectChecks implements LevelCheck { boolean fin = t == 7 && w == 7 && c == 7; if (fin && s.settings().isNewLevel()) { out.add(Problem.warning( - label(st) + " targets (7,7,7) \"world finished\": in TestLevel (world 9) this unlocks" + names.objectName(st) + + " targets (7,7,7) \"world finished\": in TestLevel (world 9) this unlocks" + " world 10 and crashes the map – pick a chapter instead", st)); } else if (!fin && (w < 1 || w > Worlds.COUNT || c < 1 || c > Worlds.chapters(w))) { out.add(Problem.warning( - label(st) + " targets world " + w + " chapter " + c + ", which does not exist", st)); + names.objectName(st) + " targets world " + w + " chapter " + c + + ", which does not exist", + st)); } } } @@ -162,7 +171,8 @@ final class ObjectChecks implements LevelCheck { double d = Math.hypot(r.gx() - st.gx(), r.gz() - st.gz()); if (d > 3) { out.add(Problem.info( - label(st) + ": respawn node is " + String.format("%.1f", d) + " cells away", st)); + names.objectName(st) + ": respawn node is " + String.format("%.1f", d) + " cells away", + st)); } } } @@ -208,8 +218,4 @@ final class ObjectChecks implements LevelCheck { } return null; } - - static String label(Strat s) { - return s.type() + " (" + s.id() + ")"; - } } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPalette.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPalette.java index b15cc69..795a157 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPalette.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPalette.java @@ -15,9 +15,9 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; +import java.awt.EventQueue; import java.awt.Font; import java.awt.GridLayout; -import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayDeque; @@ -45,8 +45,11 @@ import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.UIManager; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; /** * Object palette: every placeable type of the level's base with thumbnail, category filter, @@ -60,7 +63,39 @@ final class ObjectPalette extends JPanel { private final EditorContext ctx; private final DefaultListModel model = new DefaultListModel<>(); - private final JList list = new JList<>(model); + /** {@code when} of the mouse press that closed the context menu (it must not select an entry). */ + private long dismissPress = -1; + + private boolean swallow; + + /** + * Only left presses reach the list's UI: a right-click (and the click that closes the context menu) + * must not select an entry, which would switch to the Place tool. + */ + private final JList list = new JList<>(model) { + @Override + protected void processMouseEvent(MouseEvent e) { + if (e.getID() == MouseEvent.MOUSE_PRESSED) { + swallow = e.getWhen() == dismissPress || !SwingUtilities.isLeftMouseButton(e); + } + if (e.isPopupTrigger()) { + menu(e); + } + if (swallow && e.getID() != MouseEvent.MOUSE_ENTERED && e.getID() != MouseEvent.MOUSE_EXITED) { + e.consume(); + return; + } + super.processMouseEvent(e); + } + + @Override + protected void processMouseMotionEvent(MouseEvent e) { + if (!swallow || e.getID() == MouseEvent.MOUSE_MOVED) { + super.processMouseMotionEvent(e); + } + } + }; + private final JTextField search = new JTextField(); private final JComboBox category = new JComboBox<>(); private final JToggleButton favOnly = new JToggleButton("★"); @@ -144,38 +179,6 @@ final class ObjectPalette extends JPanel { choose(en.type); } }); - list.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - menu(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - menu(e); - } - - private void menu(MouseEvent e) { - int i = list.locationToIndex(e.getPoint()); - if (!e.isPopupTrigger() || i < 0) { - return; - } - String type = model.get(i).type; - boolean fav = Session.of(ctx).favourites().contains(type); - JPopupMenu m = new JPopupMenu(); - JMenuItem f = new JMenuItem(fav ? "Remove from favourites" : "Add to favourites ★"); - f.addActionListener(a -> { - Session.of(ctx).toggleFavourite(type); - list.repaint(); - if (favOnly.isSelected()) { - reload(); - } - }); - m.add(f); - TypeMenus.fill(ctx, type, m); - m.show(list, e.getX(), e.getY()); - } - }); JScrollPane sp = new JScrollPane(list); sp.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIManager.getColor("Component.borderColor"))); add(sp, BorderLayout.CENTER); @@ -205,6 +208,41 @@ final class ObjectPalette extends JPanel { setPreferredSize(new Dimension(260, 400)); } + private void menu(MouseEvent e) { + int i = list.locationToIndex(e.getPoint()); + if (i < 0 || !list.getCellBounds(i, i).contains(e.getPoint())) { + return; + } + String type = model.get(i).type; + boolean fav = Session.of(ctx).favourites().contains(type); + JPopupMenu m = new JPopupMenu(); + JMenuItem f = new JMenuItem(fav ? "Remove from favourites" : "Add to favourites ★"); + f.addActionListener(a -> { + Session.of(ctx).toggleFavourite(type); + list.repaint(); + if (favOnly.isSelected()) { + reload(); + } + }); + m.add(f); + TypeMenus.fill(ctx, type, m); + m.addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent ev) {} + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent ev) {} + + @Override + public void popupMenuCanceled(PopupMenuEvent ev) { + if (EventQueue.getCurrentEvent() instanceof MouseEvent me && me.getID() == MouseEvent.MOUSE_PRESSED) { + dismissPress = me.getWhen(); + } + } + }); + m.show(list, e.getX(), e.getY()); + } + private JButton setup(String label, String icon, PlaceTool.Mode mode, String tip) { JButton b = new JButton(label, Icons.get(icon, 14)); b.setToolTipText(tip); diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/PathTool.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/PathTool.java index e1ddc57..07f1f22 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/PathTool.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/objects/PathTool.java @@ -10,6 +10,7 @@ import com.eliasmueller.llamamod.editor.model.cmd.Edits; import com.eliasmueller.llamamod.editor.render.Legend; import com.eliasmueller.llamamod.editor.render.Overlay; import com.eliasmueller.llamamod.editor.ui.EditorContext; +import com.eliasmueller.llamamod.editor.ui.NodeNames; import com.eliasmueller.llamamod.editor.ui.Tool; import com.eliasmueller.llamamod.editor.ui.ToolEvent; import java.awt.Cursor; @@ -196,7 +197,7 @@ public final class PathTool implements Tool { } ctx.execute(new Batch("Add waypoint", cmds)); ctx.selection().set(fresh, this); - ctx.status("Waypoint " + fresh.id() + " added (" + (chain.size() + 1) + " nodes)"); + ctx.status(NodeNames.of(s).waypointName(fresh, true) + " added (" + (chain.size() + 1) + " nodes)"); return true; } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/playtest/FloorFinder.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/playtest/FloorFinder.java index 00205a8..ee96a01 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/playtest/FloorFinder.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/playtest/FloorFinder.java @@ -1,22 +1,19 @@ package com.eliasmueller.llamamod.editor.tools.playtest; -import com.eliasmueller.llamamod.editor.io.BrushCompiler; import com.eliasmueller.llamamod.editor.model.Regions; import com.eliasmueller.llamamod.editor.model.Scene; -import com.eliasmueller.llamamod.editor.model.Tile; -import com.eliasmueller.llamamod.editor.model.TileModel; -import java.util.ArrayList; -import java.util.List; +import com.eliasmueller.llamamod.editor.tools.objects.Ground; /** * Collision floor under a point: the player start must stand on collision, not just on visible - * geometry (trees, roofs and decorations often have none, and the llama would fall through). + * geometry (trees, roofs and decorations often have none, and the llama would fall through). Uses the + * objects tools' {@link Ground} with the engine's strict cell rule. */ public final class FloorFinder { /** Floors at most this far above the probe point still count (the probe may be on a slope). */ static final double ABOVE = 0.6; - static final int DEATH = 30; + static final int DEATH = Ground.DEATH; /** tileX/tileZ = grid cell of the tile that owns the floor polygon. */ public record Floor(double x, double y, double z, int material, int tileX, int tileZ) {} @@ -28,13 +25,14 @@ public final class FloorFinder { * if there is nothing else; null if no floor at all. */ public static Floor near(Scene s, double gx, double gy, double gz) { - List tiles = tiles(s); + Ground g = Ground.ofCells(s, (int) Math.floor(gx - 1), (int) Math.floor(gz - 1), (int) Math.floor(gx + 1), (int) + Math.floor(gz + 1)); Floor death = null; for (double r = 0; r <= 0.76; r += 0.25) { int n = r == 0 ? 1 : 8; for (int i = 0; i < n; i++) { double a = i * Math.PI / 4; - Floor f = below(tiles, gx + r * Math.sin(a), gy, gz + r * Math.cos(a)); + Floor f = below(g, gx + r * Math.sin(a), gy, gz + r * Math.cos(a)); if (f != null && f.material() != DEATH) { return f; } @@ -51,67 +49,18 @@ public final class FloorFinder { * {@link #ABOVE}; null if none. */ public static Floor below(Scene s, double gx, double gy, double gz) { - return below(tiles(s), gx, gy, gz); - } - - /** Scene tiles plus the tiles generated from brushes. */ - static List tiles(Scene s) { - List tiles = new ArrayList<>(s.tiles()); - try { - tiles.addAll(BrushCompiler.compile(s, new ArrayList<>()).tiles()); - } catch (RuntimeException e) { - // brushes that do not compile have no floor - } - return tiles; + int cx = (int) Math.floor(gx), cz = (int) Math.floor(gz); + return below(Ground.ofCells(s, cx, cz, cx, cz), gx, gy, gz); } /** * Only the tiles listed in the grid cell of (x, z) count: the engine's floor test * (FUN_004036d0) walks the cell list of the cell the player stands in, so a polygon that - * reaches into the cell from a neighbouring tile carries nothing there. + * reaches into the cell from a neighbouring tile carries nothing there ({@link Ground#cellBelow}). */ - static Floor below(List tiles, double gx, double gy, double gz) { - double ex = gx, ez = -gz; - int cx = (int) Math.floor(gx), cz = (int) Math.floor(gz); - Floor best = null; - for (Tile t : tiles) { - if (t.cellX() != cx || t.cellZ() != cz) { - continue; - } - for (TileModel.PlacedPolygon p : t.worldCollisionPolygons()) { - Double y = heightAt(p.corners(), ex, ez); - if (y == null || y > gy + ABOVE) { - continue; - } - if (best == null || y > best.y()) { - best = new Floor(gx, y, gz, p.material(), t.cellX(), t.cellZ()); - } - } - } - return best; - } - - /** y of a (convex, roughly horizontal) polygon at (x, z), or null if outside or a wall. */ - static Double heightAt(double[][] p, double x, double z) { - double[] a = p[0], b = p[1], c = p[2]; - double ux = b[0] - a[0], uy = b[1] - a[1], uz = b[2] - a[2]; - double vx = c[0] - a[0], vy = c[1] - a[1], vz = c[2] - a[2]; - double nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx; - double len = Math.sqrt(nx * nx + ny * ny + nz * nz); - if (len < 1e-9 || Math.abs(ny) / len < 0.5) { - return null; // wall or steep slope - } - boolean pos = false, neg = false; - for (int i = 0; i < p.length; i++) { - double[] q = p[i], r = p[(i + 1) % p.length]; - double cr = (r[0] - q[0]) * (z - q[2]) - (r[2] - q[2]) * (x - q[0]); - pos |= cr > 1e-9; - neg |= cr < -1e-9; - } - if (pos && neg) { - return null; - } - return a[1] - (nx * (x - a[0]) + nz * (z - a[2])) / ny; + static Floor below(Ground g, double gx, double gy, double gz) { + Ground.Hit h = g.cellBelow(gx, gz, gy, ABOVE); + return h == null ? null : new Floor(gx, h.y(), gz, h.material(), (int) Math.floor(gx), (int) Math.floor(gz)); } /** diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/textures/TexturesEditorPlugin.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/textures/TexturesEditorPlugin.java index e416f5a..731c037 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/textures/TexturesEditorPlugin.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/textures/TexturesEditorPlugin.java @@ -1,5 +1,6 @@ package com.eliasmueller.llamamod.editor.tools.textures; +import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.TextureEntry; import com.eliasmueller.llamamod.editor.ui.ActionSpec; import com.eliasmueller.llamamod.editor.ui.Dock; @@ -73,12 +74,23 @@ public final class TexturesEditorPlugin implements EditorPlugin { } for (TextureEntry e : s.textures()) { if (!e.isFlat() && e.page() >= s.pages().size()) { - out.add(Problem.error(e.label() + " refers to missing page " + e.page(), e)); + out.add(Problem.error(missingPage(s, e), e)); } } }); } + /** "Texture #5 uses page 7, but the level has only 4 texture pages (0–3)". */ + static String missingPage(Scene s, TextureEntry e) { + int n = s.pages().size(); + String name = "Texture #" + s.textures().indexOf(e) + (e.name().isEmpty() ? "" : " \"" + e.name() + "\""); + return name + " uses page " + e.page() + ", but the level has " + + (n == 0 + ? "no texture pages" + : "only " + n + " texture page" + (n == 1 ? " (0)" : "s (0–" + (n - 1) + ")")) + + ": change its page in the inspector"; + } + private static void icons() { Icons.register("texpaint", (g, c) -> { g.setColor(Icons.ACCENT); diff --git a/src/main/java/com/eliasmueller/llamamod/editor/ui/NodeNames.java b/src/main/java/com/eliasmueller/llamamod/editor/ui/NodeNames.java index d9653ac..e137c46 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/ui/NodeNames.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/ui/NodeNames.java @@ -1,188 +1,19 @@ package com.eliasmueller.llamamod.editor.ui; -import com.eliasmueller.llamamod.editor.model.Brush; -import com.eliasmueller.llamamod.editor.model.EnvZone; -import com.eliasmueller.llamamod.editor.model.LevelSettings; -import com.eliasmueller.llamamod.editor.model.Light; -import com.eliasmueller.llamamod.editor.model.MeshAsset; -import com.eliasmueller.llamamod.editor.model.Node; -import com.eliasmueller.llamamod.editor.model.PathNode; -import com.eliasmueller.llamamod.editor.model.Regions; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; -import com.eliasmueller.llamamod.editor.model.Strat; -import com.eliasmueller.llamamod.editor.model.TexturePage; -import com.eliasmueller.llamamod.editor.model.Tile; -import com.eliasmueller.llamamod.editor.model.TileModel; -import java.util.ArrayList; -import java.util.Collections; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; /** * Readable names for scene nodes ("Floor 2", "Coin 3", "Waypoint 4 (chain 2)", "Model 12") as used by the - * outliner, inspector header, status bar and asset browser. Numbers follow the level order (they shift when - * an earlier item of the same kind is deleted). One instance indexes a scene lazily; create a new one after - * edits. + * outliner, inspector header, status bar and asset browser; the naming itself lives in + * {@link ReadableNames} (also used by editor.io for build warnings). */ -public final class NodeNames { - private final Scene scene; - private Map numbered; - private List starts; - private Map waypoints; - +public final class NodeNames extends ReadableNames { private NodeNames(Scene scene) { - this.scene = scene; + super(scene); } public static NodeNames of(Scene scene) { return new NodeNames(scene); } - - /** Readable name of a node in its own scene (falls back to {@link Node#label()} when detached). */ - public static String name(Node n) { - return n == null ? "" : n.scene() == null ? fallback(n) : of(n.scene()).nameOf(n); - } - - /** Readable standalone name of a node of this scene. */ - public String nameOf(Node n) { - return switch (n) { - case Strat st -> objectName(st); - case Brush b -> numbered(b); - case Light l -> numbered(l); - case PathNode p -> waypointName(p, true); - case Tile t -> "Tile " + t.cellX() + ", " + t.cellZ() - + (t.model() == null ? "" : " · " + modelName(t.model())); - default -> fallback(n); - }; - } - - /** Object name: its type, numbered when the level has several of that type ("Coin 3"). */ - public String objectName(Strat st) { - return numbered(st); - } - - /** "Waypoint 4" (position in its chain), with "(chain 2)" when {@code withChain}. */ - public String waypointName(PathNode p, boolean withChain) { - int[] v = waypointIndex(p); - return v == null ? "Waypoint" : "Waypoint " + v[0] + (withChain ? " (chain " + v[1] + ")" : ""); - } - - /** Chain number (1-based, outliner order) of a waypoint, or 0. */ - public int chainNumber(PathNode p) { - int[] v = waypointIndex(p); - return v == null ? 0 : v[1]; - } - - private int[] waypointIndex(PathNode p) { - if (waypoints == null) { - waypoints = new IdentityHashMap<>(); - int nr = 0; - for (PathNode start : chainStarts()) { - nr++; - List ch = scene.chain(start); - for (int i = 0; i < ch.size(); i++) { - waypoints.putIfAbsent(ch.get(i), new int[] {i + 1, nr}); - } - } - } - return waypoints.get(p); - } - - /** - * First waypoint of every chain in level order (waypoints without a predecessor, then one node per loop - * that has no start). The outliner numbers chains in this order. - */ - public List chainStarts() { - if (starts != null) { - return starts; - } - Set hasPrev = Collections.newSetFromMap(new IdentityHashMap<>()); - for (PathNode p : scene.pathNodes()) { - if (p.next() != null) { - hasPrev.add(p.next()); - } - } - starts = new ArrayList<>(); - for (PathNode p : scene.pathNodes()) { - if (!hasPrev.contains(p)) { - starts.add(p); - } - } - Set reached = Collections.newSetFromMap(new IdentityHashMap<>()); - for (PathNode st : starts) { - reached.addAll(scene.chain(st)); - } - for (PathNode p : scene.pathNodes()) { - if (!reached.contains(p)) { - starts.add(p); - reached.addAll(scene.chain(p)); - } - } - return starts; - } - - private String numbered(Node n) { - if (numbered == null) { - numbered = new IdentityHashMap<>(); - number(scene.strats(), NodeNames::typeName); - number(scene.brushes(), NodeNames::brushName); - int nr = 0; - for (Light l : scene.lights()) { - numbered.put(l, "Light " + ++nr); - } - } - String s = numbered.get(n); - return s != null ? s : fallback(n); - } - - private void number(List nodes, java.util.function.Function base) { - Map count = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - for (T n : nodes) { - count.merge(base.apply(n), 1, Integer::sum); - } - Map nr = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - for (T n : nodes) { - String b = base.apply(n); - numbered.put(n, count.get(b) > 1 ? b + " " + nr.merge(b, 1, Integer::sum) : b); - } - } - - /** Object type or "?" (the outliner's type group key). */ - public static String typeName(Strat st) { - return st.type().isEmpty() ? "?" : st.type(); - } - - public static String brushName(Brush b) { - return b.name().isEmpty() ? b.brushKind().label() : b.name(); - } - - /** Tile model name, or "Model 12" for unnamed models. */ - public static String modelName(TileModel m) { - return m.name().isEmpty() ? "Model " + number(m.id()) : m.name(); - } - - /** The number part of an id ("model:12" → "12", "page:n3" → "n3"). */ - public static String number(String id) { - return id.substring(id.indexOf(':') + 1); - } - - private static String fallback(Node n) { - return switch (n) { - case LevelSettings s -> "Level settings"; - case Regions r -> "Visibility regions"; - case EnvZone z -> z.isDefault() ? "Default zone (fog, sky, music)" : "Zone " + z.cellX() + ", " + z.cellZ(); - case TileModel m -> modelName(m); - case TexturePage p -> p.name().isEmpty() ? "Page " + number(p.id()) : p.name(); - case MeshAsset m -> m.name().isEmpty() ? m.file() : m.name(); - case Strat st -> typeName(st); - case Brush b -> brushName(b); - case PathNode p -> "Waypoint"; - case Light l -> "Light"; - case Tile t -> "Tile " + t.cellX() + ", " + t.cellZ(); - default -> n.label(); - }; - } } diff --git a/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/OutlinerPanel.java b/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/OutlinerPanel.java index cb25ef1..5379540 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/OutlinerPanel.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/OutlinerPanel.java @@ -7,6 +7,7 @@ import com.eliasmueller.llamamod.editor.model.MeshAsset; import com.eliasmueller.llamamod.editor.model.Node; import com.eliasmueller.llamamod.editor.model.NodeKind; import com.eliasmueller.llamamod.editor.model.PathNode; +import com.eliasmueller.llamamod.editor.model.ReadableNames; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.SceneEvent; import com.eliasmueller.llamamod.editor.model.Strat; @@ -301,20 +302,9 @@ public final class OutlinerPanel extends JPanel { return n instanceof Strat st && StratCatalog.category(st.type()).contains(q); } - /** - * Case-insensitive substring match of a readable name; a query ending in a number matches whole numbers - * only ("floor 1" finds "Floor 1", not "Floor 12"). - */ + /** Readable-name match with the whole-number rule ({@link ReadableNames#matches}). */ static boolean nameMatches(String name, String q) { - String n = name.toLowerCase(Locale.ROOT); - boolean num = !q.isEmpty() && Character.isDigit(q.charAt(q.length() - 1)); - for (int i = n.indexOf(q); i >= 0; i = n.indexOf(q, i + 1)) { - int end = i + q.length(); - if (!num || end >= n.length() || !Character.isDigit(n.charAt(end))) { - return true; - } - } - return false; + return ReadableNames.matches(name, q); } private DefaultMutableTreeNode group(DefaultMutableTreeNode parent, String key, String label, Icon icon) { diff --git a/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/ProblemsPanel.java b/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/ProblemsPanel.java index d3b975d..c60f598 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/ProblemsPanel.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/ui/panels/ProblemsPanel.java @@ -3,6 +3,7 @@ package com.eliasmueller.llamamod.editor.ui.panels; import com.eliasmueller.llamamod.editor.ui.EditorContext; import com.eliasmueller.llamamod.editor.ui.EditorWindow; import com.eliasmueller.llamamod.editor.ui.Icons; +import com.eliasmueller.llamamod.editor.ui.NodeNames; import com.eliasmueller.llamamod.editor.ui.Problem; import java.awt.BorderLayout; import java.awt.Component; @@ -42,7 +43,7 @@ public final class ProblemsPanel extends JPanel { 14)); c.setBorder(BorderFactory.createEmptyBorder(3, 8, 3, 8)); if (p.node() != null) { - c.setToolTipText("Double-click to select " + p.node().id()); + c.setToolTipText("Double-click to select " + NodeNames.name(p.node())); } return c; } diff --git a/src/main/java/com/eliasmueller/llamamod/levelbuild/LevelBuilder.java b/src/main/java/com/eliasmueller/llamamod/levelbuild/LevelBuilder.java index 44c7a0b..9d4b1f8 100644 --- a/src/main/java/com/eliasmueller/llamamod/levelbuild/LevelBuilder.java +++ b/src/main/java/com/eliasmueller/llamamod/levelbuild/LevelBuilder.java @@ -121,7 +121,7 @@ public final class LevelBuilder { record Mode(String name) implements Waypoints {} - /** Points {x, z[, y[, rotDeg]]}; y = NaN: ground height. */ + /** Points {x, z[, y[, rotDeg[, unk2]]]}; y = NaN: ground height; unk2 default: the prototype node's. */ record Points(List pts) implements Waypoints {} static Waypoints of(List pts) { @@ -959,32 +959,27 @@ public final class LevelBuilder { return strat(name, x, z, null, null, null, Waypoints.RELATIVE, variant, false); } + /** Camera node of the player start: this far behind the llama (must stay below the 2.5-cell search range). */ + public static final double PLAYER_CAMERA_BACK = 2.0; + /** - * Player start (strat "Llama"). The first waypoint of the llama chain is the camera start: - * placed camDist behind the llama, the others on the llama. + * Player start (strat "Llama") with its start camera: one waypoint camDist behind the llama, 0.5 + * above it, field unk2 = 0 (default camera distance and height). The game takes the first node of + * the llama's chain within 2.5 cells as the camera start, looking at the llama (as the editor's + * {@code PlayerStart}); the prototype's chain (one node per entry point of the original level) + * would put the camera into the llama's head on village 2 bases. */ public StratSpec player(double x, double z, double rot, Double y, double camDist) { StratSpec d = strat("Llama", x, z, y, rot, null, Waypoints.HERE, 0, false); double a = PyNum.radians(rot); double cx = x - camDist * PyNum.sin(a); double cz = z - camDist * PyNum.cos(a); - int n = 1; - int k = protos.get("Llama").get(0)[13]; - while (k >= 0 && map.nodes.get(k).next() != 0 && n < 200) { - k = map.nodes.get(k).next(); - n++; - } - List wp = new ArrayList<>(); - wp.add(new double[] {cx, cz, d.y - 0.4, rot}); - for (int i = 1; i < n; i++) { - wp.add(new double[] {x, z, d.y, rot}); - } - d.wp = Waypoints.of(wp); + d.wp = Waypoints.of(List.of(new double[] {cx, cz, d.y + 0.5, rot, 0})); return d; } public StratSpec player(double x, double z, double rot) { - return player(x, z, rot, null, 8.0); + return player(x, z, rot, null, PLAYER_CAMERA_BACK); } public StratSpec checkpoint(double x, double z) { @@ -1534,7 +1529,9 @@ public final class LevelBuilder { py = h == null || h == 0.0 ? d.y : h; } int pr = p.length > 3 ? deg(p[3]) : s[1]; - int a = i < chain.size() ? chain.get(i).unk2() : 0; + int a = p.length > 4 + ? (int) p[4] + : i < chain.size() ? chain.get(i).unk2() : 0; int b = i < chain.size() ? chain.get(i).unk3() : 0; fresh.add(new int[] { 0, diff --git a/src/main/java/com/eliasmueller/llamamod/mods/boottolevel/StartOverride.java b/src/main/java/com/eliasmueller/llamamod/mods/boottolevel/StartOverride.java index f1ead1c..e7a32fb 100644 --- a/src/main/java/com/eliasmueller/llamamod/mods/boottolevel/StartOverride.java +++ b/src/main/java/com/eliasmueller/llamamod/mods/boottolevel/StartOverride.java @@ -7,6 +7,7 @@ import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Strat; import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import com.eliasmueller.llamamod.editor.tools.playtest.FloorFinder; import java.io.IOException; import java.util.ArrayList; @@ -15,9 +16,9 @@ import java.util.Locale; /** * Moves the player start (the Llama strat) of a level WAD. In levelbuild/editor levels its waypoint - * chain is the camera start (first node, 8 cells behind) plus nodes on the llama: then the whole - * chain moves and turns with it. Original levels use the llama's chain as a level-wide point list, - * which stays where it is. + * chain is the start camera: one node 2 cells behind ({@link PlayerStart}), or in older builds a node + * 8 cells behind plus nodes on the llama. Then the whole chain moves and turns with it. Original levels + * use the llama's chain as a level-wide point list, which stays where it is. */ public final class StartOverride { static final double ON_LLAMA = 0.5; @@ -45,7 +46,12 @@ public final class StartOverride { for (PathNode p : chain.subList(1, chain.size())) { onLlama &= Math.hypot(p.gx() - llama.gx(), p.gz() - llama.gz()) <= ON_LLAMA; } - if (onLlama) { + boolean cameraNode = chain.size() == 1 + && Math.hypot( + chain.getFirst().gx() - llama.gx(), + chain.getFirst().gz() - llama.gz()) + < PlayerStart.RANGE; + if (onLlama || cameraNode) { moved.addAll(chain); rotate.addAll(chain); } diff --git a/src/test/java/com/eliasmueller/llamamod/editor/bugs/EditorRegressionTest.java b/src/test/java/com/eliasmueller/llamamod/editor/bugs/EditorRegressionTest.java index 243dca0..4f53716 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/bugs/EditorRegressionTest.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/bugs/EditorRegressionTest.java @@ -20,6 +20,7 @@ import com.eliasmueller.llamamod.editor.model.cmd.AddNode; import com.eliasmueller.llamamod.editor.model.cmd.Edits; import com.eliasmueller.llamamod.editor.model.cmd.History; import com.eliasmueller.llamamod.editor.model.cmd.SetProp; +import com.eliasmueller.llamamod.editor.ui.NodeNames; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -97,7 +98,8 @@ class EditorRegressionTest { f.prop("points").setRaw(f, new double[] {2, 0, 6, 0}); s.add(f, -1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> WadBuilder.build(s)); - assertTrue(e.getMessage().contains(f.id()), e.getMessage()); + assertTrue(e.getMessage().contains(NodeNames.name(f)), e.getMessage()); + assertFalse(e.getMessage().contains(f.id()), e.getMessage()); } /** B6/B7: absurd parameters must not hang or exhaust memory; they are reported instead. */ @@ -129,7 +131,7 @@ class EditorRegressionTest { assertTrue(warn.stream().anyMatch(w -> w.contains("skipped")), c + ": " + warn); List err = Validator.validate(s, new ArrayList<>()); if (!c.getValue().containsKey("top")) { - assertTrue(err.stream().anyMatch(x -> x.startsWith(b.id())), c + ": " + err); + assertTrue(err.stream().anyMatch(x -> x.startsWith(NodeNames.name(b) + ":")), c + ": " + err); } } } diff --git a/src/test/java/com/eliasmueller/llamamod/editor/io/HandednessDemo.java b/src/test/java/com/eliasmueller/llamamod/editor/io/HandednessDemo.java index f94d8dd..1baba07 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/io/HandednessDemo.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/io/HandednessDemo.java @@ -3,12 +3,9 @@ package com.eliasmueller.llamamod.editor.io; import com.eliasmueller.llamamod.editor.model.Brush; import com.eliasmueller.llamamod.editor.model.BrushKind; import com.eliasmueller.llamamod.editor.model.MeshAsset; -import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.cmd.AddNode; -import com.eliasmueller.llamamod.editor.model.cmd.Batch; -import com.eliasmueller.llamamod.editor.model.cmd.Command; -import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import java.nio.file.Path; /** @@ -48,17 +45,7 @@ public final class HandednessDemo { mesh(s, obj, 19.5, 13, 180, "F obj turned"); mesh(s, glb, 22, 13, 180, "F glb turned"); double px = 16, pz = 4, yaw = 0; - Batch b = (Batch) Edits.placeStrat(s, "Llama", 0, px, 0, pz, yaw); - int k = 0; - for (Command c : b.commands()) { - if (c instanceof AddNode an && an.node() instanceof PathNode p) { - p.setRaw("x", Edits.fixed(px)); - p.setRaw("y", Edits.fixed(k == 0 ? 1.5 : 0)); - p.setRaw("z", Edits.fixed(k == 0 ? pz - 8 : pz)); - k++; - } - } - b.apply(s); + PlayerStart.place(s, px, 0, pz, yaw).apply(s); WadBuilder.Result r = WadBuilder.buildWithReport(s); System.out.println("built " + r.wad().length + " bytes, " + r.stats() + ", warnings " + r.warnings()); ProjectIO.save(pr, Path.of(a[3]), cd); diff --git a/src/test/java/com/eliasmueller/llamamod/editor/io/NoCollisionDemo.java b/src/test/java/com/eliasmueller/llamamod/editor/io/NoCollisionDemo.java index df1b944..d97ea84 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/io/NoCollisionDemo.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/io/NoCollisionDemo.java @@ -3,15 +3,13 @@ package com.eliasmueller.llamamod.editor.io; import com.eliasmueller.llamamod.editor.model.Brush; import com.eliasmueller.llamamod.editor.model.BrushKind; import com.eliasmueller.llamamod.editor.model.NodeKind; -import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Prop; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Tile; import com.eliasmueller.llamamod.editor.model.TileModel; import com.eliasmueller.llamamod.editor.model.cmd.AddNode; -import com.eliasmueller.llamamod.editor.model.cmd.Batch; -import com.eliasmueller.llamamod.editor.model.cmd.Command; import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import com.eliasmueller.llamamod.format.Level; import java.nio.file.Path; import java.util.ArrayList; @@ -93,17 +91,7 @@ public final class NoCollisionDemo { System.out.println("north wall tiles (visual only): " + bake(s, north, true)); System.out.println("south wall tiles (solid): " + bake(s, south, false)); double px = 10.5, pz = 8.5, yaw = 90; - Batch b = (Batch) Edits.placeStrat(s, "Llama", 0, px, 0, pz, yaw); - int k = 0; - for (Command c : b.commands()) { - if (c instanceof AddNode an && an.node() instanceof PathNode p) { - p.setRaw("x", Edits.fixed(k == 0 ? px - 8 : px)); - p.setRaw("y", Edits.fixed(k == 0 ? 1.5 : 0)); - p.setRaw("z", Edits.fixed(pz)); - k++; - } - } - b.apply(s); + PlayerStart.place(s, px, 0, pz, yaw).apply(s); WadBuilder.Result r = WadBuilder.buildWithReport(s); Level l = Level.parse(r.wad()); int noColl = 0; diff --git a/src/test/java/com/eliasmueller/llamamod/editor/model/ReadableNamesTest.java b/src/test/java/com/eliasmueller/llamamod/editor/model/ReadableNamesTest.java new file mode 100644 index 0000000..7ee6229 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/editor/model/ReadableNamesTest.java @@ -0,0 +1,22 @@ +package com.eliasmueller.llamamod.editor.model; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class ReadableNamesTest { + @Test + void numbersMatchWholeNumbersOnly() { + assertTrue(ReadableNames.matches("Floor 1", "floor 1")); + assertFalse(ReadableNames.matches("Floor 12", "floor 1")); + assertTrue(ReadableNames.matches("Model 12", "12")); + assertFalse(ReadableNames.matches("Model 120", "12")); + assertFalse(ReadableNames.matches("Model 112", "12")); + assertFalse(ReadableNames.matches("Floor 12", "2")); + assertTrue(ReadableNames.matches("Coin 3 (strat:12)", "12")); + assertTrue(ReadableNames.matches("Treetop", "TREE")); + assertTrue(ReadableNames.matches("Model 7", "")); + assertFalse(ReadableNames.matches("Rock 12 big", "rock 1")); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/catalog/XobjDemo.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/catalog/XobjDemo.java index 4fc2d71..7bd20d1 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/tools/catalog/XobjDemo.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/catalog/XobjDemo.java @@ -4,12 +4,10 @@ import com.eliasmueller.llamamod.editor.io.Bases; import com.eliasmueller.llamamod.editor.io.Project; import com.eliasmueller.llamamod.editor.io.ProjectIO; import com.eliasmueller.llamamod.editor.model.BrushKind; -import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Scene; -import com.eliasmueller.llamamod.editor.model.cmd.AddNode; -import com.eliasmueller.llamamod.editor.model.cmd.Batch; import com.eliasmueller.llamamod.editor.model.cmd.Command; import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -21,17 +19,7 @@ import java.util.Map; */ public final class XobjDemo { static Command placePlayer(Scene s, double x, double y, double z) { - Batch b = (Batch) Edits.placeStrat(s, "Llama", 0, x, y, z, 0.0); - int k = 0; - for (Command c : b.commands()) { - if (c instanceof AddNode an && an.node() instanceof PathNode p) { - p.prop("x").setRaw(p, Edits.fixed(x)); - p.prop("y").setRaw(p, Edits.fixed(k == 0 ? y - 0.4 : y)); - p.prop("z").setRaw(p, Edits.fixed(k == 0 ? z - 8 : z)); - k++; - } - } - return b; + return PlayerStart.place(s, x, y, z, 0); } public static void main(String[] a) throws Exception { diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoDemo.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoDemo.java index 9a70bce..b47c76e 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoDemo.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoDemo.java @@ -9,12 +9,10 @@ import com.eliasmueller.llamamod.editor.io.WadBuilder; import com.eliasmueller.llamamod.editor.model.Brush; import com.eliasmueller.llamamod.editor.model.BrushKind; import com.eliasmueller.llamamod.editor.model.MeshAsset; -import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.cmd.AddNode; -import com.eliasmueller.llamamod.editor.model.cmd.Batch; -import com.eliasmueller.llamamod.editor.model.cmd.Command; import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -116,18 +114,7 @@ public final class GeoDemo { pz = Double.parseDouble(st[1]); yaw = Double.parseDouble(st[2]); } - Batch b = (Batch) Edits.placeStrat(s, "Llama", 0, px, 0, pz, yaw); - int k = 0; - for (Command c : b.commands()) { - if (c instanceof AddNode an && an.node() instanceof PathNode p) { - double r = Math.toRadians(yaw); - p.prop("x").setRaw(p, Edits.fixed(k == 0 ? px - 8 * Math.sin(r) : px)); - p.prop("y").setRaw(p, Edits.fixed(k == 0 ? -0.4 : 0)); - p.prop("z").setRaw(p, Edits.fixed(k == 0 ? pz - 8 * Math.cos(r) : pz)); - k++; - } - } - b.apply(s); + PlayerStart.place(s, px, 0, pz, yaw).apply(s); Edits.placeStrat(s, "LevelDoor", 0, 39.5, 2.0, 15.5, 0.0).apply(s); WadBuilder.Result r = WadBuilder.buildWithReport(s); System.out.println("built " + r.wad().length + " bytes, warnings " + r.warnings()); diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoLibDemo.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoLibDemo.java index 3a58c9d..aab1ee3 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoLibDemo.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/GeoLibDemo.java @@ -9,13 +9,11 @@ import com.eliasmueller.llamamod.editor.model.Brush; import com.eliasmueller.llamamod.editor.model.BrushKind; import com.eliasmueller.llamamod.editor.model.MeshAsset; import com.eliasmueller.llamamod.editor.model.Node; -import com.eliasmueller.llamamod.editor.model.PathNode; import com.eliasmueller.llamamod.editor.model.Scene; import com.eliasmueller.llamamod.editor.model.Tile; import com.eliasmueller.llamamod.editor.model.cmd.AddNode; import com.eliasmueller.llamamod.editor.model.cmd.Batch; -import com.eliasmueller.llamamod.editor.model.cmd.Command; -import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -48,17 +46,7 @@ public final class GeoLibDemo { if (!s.catalog().has("Llama")) { return p; } - Batch b = (Batch) Edits.placeStrat(s, "Llama", 0, 8.5, 0, 12.5, 90.0); - int n = 0; - for (Command c : b.commands()) { - if (c instanceof AddNode an && an.node() instanceof PathNode pn) { - pn.prop("x").setRaw(pn, Edits.fixed(n == 0 ? 0.5 : 8.5)); - pn.prop("y").setRaw(pn, Edits.fixed(n == 0 ? -0.4 : 0)); - pn.prop("z").setRaw(pn, Edits.fixed(12.5)); - n++; - } - } - b.apply(s); + PlayerStart.place(s, 8.5, 0, 12.5, 90).apply(s); return p; } diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/PaletteAndPreviewTest.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/PaletteAndPreviewTest.java new file mode 100644 index 0000000..2263f6f --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/geometry/PaletteAndPreviewTest.java @@ -0,0 +1,56 @@ +package com.eliasmueller.llamamod.editor.tools.geometry; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.eliasmueller.llamamod.editor.model.TileModel; +import org.junit.jupiter.api.Test; + +class PaletteAndPreviewTest { + @Test + void paletteFilterUsesReadableNamesAndWholeNumbers() { + TileModel m12 = new TileModel("model:12"); + TileModel m120 = new TileModel("model:120"); + TileModel named = new TileModel("model:5"); + named.prop("name").setRaw(named, "Bridge plank"); + assertTrue(TilePaintTool.paletteMatch(m12, "12")); + assertFalse(TilePaintTool.paletteMatch(m120, "12")); + assertTrue(TilePaintTool.paletteMatch(m12, "model 12")); + assertFalse(TilePaintTool.paletteMatch(m120, "model 12")); + assertTrue(TilePaintTool.paletteMatch(named, "plank")); + assertTrue(TilePaintTool.paletteMatch(named, "5")); + assertTrue(TilePaintTool.paletteMatch(m120, " ")); + } + + @Test + void previewFramesTheMainMass() { + // a 1-cell cube of 200 vertices plus one stray vertex 500 cells away + double[] pos = new double[3 * 201]; + for (int i = 0; i < 200; i++) { + pos[3 * i] = (i % 2); + pos[3 * i + 1] = (i / 2 % 2); + pos[3 * i + 2] = (i / 4 % 2); + } + pos[600] = 500; + double[] f = MeshImportDialog.Preview.focusBounds(pos); + assertTrue(f[3] < 2, "x max " + f[3]); + assertEquals(0, f[0], 0.2); + // without far-off pieces: the full bounds + double[] cube = java.util.Arrays.copyOf(pos, 600); + assertArrayEquals(new double[] {0, 0, 0, 1, 1, 1}, MeshImportDialog.Preview.focusBounds(cube), 1e-9); + // a small model (24 vertices) with a far-off triangle (3 vertices, over 10 % of them) + double[] small = new double[3 * 27]; + for (int i = 0; i < 24; i++) { + small[3 * i] = i % 2 * 2; + small[3 * i + 1] = i / 2 % 2; + small[3 * i + 2] = i / 4 % 3; + } + for (int i = 24; i < 27; i++) { + small[3 * i] = 400 + i % 2; + } + double[] g = MeshImportDialog.Preview.focusBounds(small); + assertArrayEquals(new double[] {0, 0, 0, 2, 1, 2}, g, 1e-9); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/LevelBuilderStartTest.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/LevelBuilderStartTest.java new file mode 100644 index 0000000..547a3e1 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/LevelBuilderStartTest.java @@ -0,0 +1,43 @@ +package com.eliasmueller.llamamod.editor.tools.objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import com.eliasmueller.llamamod.editor.io.WadImporter; +import com.eliasmueller.llamamod.editor.model.PathNode; +import com.eliasmueller.llamamod.editor.model.Scene; +import com.eliasmueller.llamamod.editor.model.Strat; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; +import com.eliasmueller.llamamod.levelbuild.LevelBuilder; +import java.nio.file.Files; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; + +/** + * levelbuild player starts carry the editor's start camera (one node 2 cells behind, unk2 = 0) on both + * village bases; the prototype's chain put the camera into the llama's head on village 2. Needs + * -Dllamamod.cd. + */ +class LevelBuilderStartTest { + @Test + void playerStartHasOneCameraNodeBehind() throws Exception { + for (String base : new String[] {"t1l1m001", "t1l1m002"}) { + byte[] wad = Files.readAllBytes(ObjectToolsTest.cd().resolve("wads/" + base + ".wad")); + LevelBuilder lb = new LevelBuilder(wad, rel -> null, "Start", 1, Map.of()); + lb.floor(8, 8, 14, 14, 1.0, "grass"); + lb.player(11, 11, 90); + Scene s = WadImporter.importWad(lb.build(), base, null); + Strat ll = s.playerStart(); + List ch = s.chain(ll.waypoint()); + assertEquals(1, ch.size(), base); + PathNode cam = ch.getFirst(); + assertEquals(0, PlayerStart.startNode(ch, ll.gx(), ll.gz()), base); + assertEquals(11 - LevelBuilder.PLAYER_CAMERA_BACK, cam.gx(), 1e-3, base); // facing +x + assertEquals(11, cam.gz(), 1e-3, base); + assertEquals(ll.gy() + 0.5, cam.gy(), 1e-3, base); + assertEquals(0, cam.unk2(), base); + assertNull(ObjectChecks.startCamera(s, ll), base); + } + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPaletteTest.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPaletteTest.java new file mode 100644 index 0000000..5081bdb --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/objects/ObjectPaletteTest.java @@ -0,0 +1,81 @@ +package com.eliasmueller.llamamod.editor.tools.objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.eliasmueller.llamamod.editor.io.Bases; +import com.eliasmueller.llamamod.editor.io.Project; +import com.eliasmueller.llamamod.editor.model.Scene; +import com.eliasmueller.llamamod.editor.ui.EditorContext; +import com.eliasmueller.llamamod.editor.ui.EditorPrefs; +import java.awt.Rectangle; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JList; +import javax.swing.SwingUtilities; +import org.junit.jupiter.api.Test; + +/** Right-clicking an object type opens its menu only: no selection, no switch to the Place tool. */ +class ObjectPaletteTest { + @Test + void rightClickDoesNotPickTheType() throws Exception { + Scene s = Project.create(Bases.fromCd(ObjectToolsTest.cd()), "new", "t1l1m001") + .scene(); + List tools = new ArrayList<>(); + EditorPrefs prefs = new EditorPrefs(null); + EditorContext[] self = new EditorContext[1]; + self[0] = (EditorContext) Proxy.newProxyInstance( + EditorContext.class.getClassLoader(), new Class[] {EditorContext.class}, (p, m, a) -> { + return switch (m.getName()) { + case "scene" -> s; + case "prefs" -> prefs; + case "setTool" -> tools.add((String) a[0]); + case "hashCode" -> System.identityHashCode(p); + case "equals" -> p == a[0]; + case "toString" -> "ctx"; + default -> m.getReturnType() == boolean.class + ? false + : m.getReturnType() == int.class ? 0 : null; + }; + }); + SwingUtilities.invokeAndWait(() -> { + ObjectPalette pal = new ObjectPalette(self[0]); + JList list = findList(pal); + list.setSize(260, 4000); + Rectangle r = list.getCellBounds(1, 1); + int x = r.x + 20, y = r.y + r.height / 2; + long t = System.currentTimeMillis(); + for (int id : new int[] {MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED, MouseEvent.MOUSE_CLICKED}) { + list.dispatchEvent(new MouseEvent( + list, id, t++, InputEvent.BUTTON3_DOWN_MASK, x, y, 1, false, MouseEvent.BUTTON3)); + } + assertNull(list.getSelectedValue()); + assertTrue(tools.isEmpty(), tools.toString()); + for (int id : new int[] {MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED, MouseEvent.MOUSE_CLICKED}) { + list.dispatchEvent(new MouseEvent( + list, id, t++, InputEvent.BUTTON1_DOWN_MASK, x, y, 1, false, MouseEvent.BUTTON1)); + } + assertEquals(1, list.getSelectedIndex()); + assertEquals(List.of(PlaceTool.ID), tools); + }); + } + + private static JList findList(java.awt.Container c) { + for (java.awt.Component k : c.getComponents()) { + if (k instanceof JList l) { + return l; + } + if (k instanceof java.awt.Container cc) { + JList l = findList(cc); + if (l != null) { + return l; + } + } + } + return null; + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/editor/tools/textures/TextureLibraryTest.java b/src/test/java/com/eliasmueller/llamamod/editor/tools/textures/TextureLibraryTest.java index 9aad4fd..89bbb9f 100644 --- a/src/test/java/com/eliasmueller/llamamod/editor/tools/textures/TextureLibraryTest.java +++ b/src/test/java/com/eliasmueller/llamamod/editor/tools/textures/TextureLibraryTest.java @@ -112,4 +112,17 @@ class TextureLibraryTest { assertEquals(Blend.SEMI.pageFlags, s.pages().getLast().flags()); assertEquals(Blend.SEMI.entryFlags, s.textures().getLast().flags()); } + + @Test + void missingPageIsNamedInUserTerms() throws Exception { + Scene s = village(); + TextureEntry e = s.textures().get(5); + e.prop("page").setRaw(e, 99); + int n = s.pages().size(); + String msg = TexturesEditorPlugin.missingPage(s, e); + assertTrue(msg.startsWith("Texture #5"), msg); + assertTrue( + msg.contains("uses page 99, but the level has only " + n + " texture pages (0–" + (n - 1) + ")"), msg); + assertTrue(!msg.contains("tex:") && !msg.contains("page:"), msg); + } } diff --git a/src/test/java/com/eliasmueller/llamamod/levelbuild/BrushRecorder.java b/src/test/java/com/eliasmueller/llamamod/levelbuild/BrushRecorder.java index 2307bc0..590686c 100644 --- a/src/test/java/com/eliasmueller/llamamod/levelbuild/BrushRecorder.java +++ b/src/test/java/com/eliasmueller/llamamod/levelbuild/BrushRecorder.java @@ -364,7 +364,7 @@ public final class BrushRecorder { py = h == null || h == 0.0 ? d.y : h; } int pr = p.length > 3 ? deg(p[3]) : ry; - int a = i < chain.size() ? chain.get(i)[7] : 0; + int a = p.length > 4 ? (int) p[4] : i < chain.size() ? chain.get(i)[7] : 0; int b = i < chain.size() ? chain.get(i)[8] : 0; fresh.add(new int[] { 0, diff --git a/src/test/java/com/eliasmueller/llamamod/mods/boottolevel/BootToLevelModTest.java b/src/test/java/com/eliasmueller/llamamod/mods/boottolevel/BootToLevelModTest.java index 0059460..5dde48f 100644 --- a/src/test/java/com/eliasmueller/llamamod/mods/boottolevel/BootToLevelModTest.java +++ b/src/test/java/com/eliasmueller/llamamod/mods/boottolevel/BootToLevelModTest.java @@ -16,6 +16,7 @@ import com.eliasmueller.llamamod.editor.model.cmd.AddNode; import com.eliasmueller.llamamod.editor.model.cmd.Batch; import com.eliasmueller.llamamod.editor.model.cmd.Command; import com.eliasmueller.llamamod.editor.model.cmd.Edits; +import com.eliasmueller.llamamod.editor.model.cmd.PlayerStart; import com.eliasmueller.llamamod.exe.ExeImage; import com.eliasmueller.llamamod.mods.GameData; import com.eliasmueller.llamamod.mods.ModContext; @@ -182,4 +183,21 @@ class BootToLevelModTest { assertEquals(58.2, chain.getFirst().gz(), 1e-2); assertEquals(34.2, chain.get(1).gx(), 1e-2); } + + @Test + void singleCameraNodeMovesWithTheStart() throws Exception { + Bases b = Bases.fromCd(GameData.cd()); + Scene s = WadImporter.importWad(b.wad("t1l1m001"), "t1l1m001", null); + Edits.delete(s, List.of(s.playerStart())).apply(s); + // editor and levelbuild starts: one camera node 2 cells behind the llama + PlayerStart.place(s, 10.5, 2, 10.5, 0).apply(s); + byte[] wad = WadBuilder.build(s); + Scene moved = WadImporter.importWad(StartOverride.apply(wad, new double[] {34.2, 7.35, 58.2, 90}), "x", null); + List chain = moved.chain(moved.playerStart().waypoint()); + assertEquals(1, chain.size()); + // yaw 90 = facing +x: the camera node is 2 cells behind at x − 2 + assertEquals(34.2 - PlayerStart.BACK, chain.getFirst().gx(), 1e-2); + assertEquals(58.2, chain.getFirst().gz(), 1e-2); + assertEquals(0, PlayerStart.startNode(chain, 34.2, 58.2)); + } } diff --git a/src/test/java/com/eliasmueller/llamamod/mods/testworld/TestWorldGoldenTest.java b/src/test/java/com/eliasmueller/llamamod/mods/testworld/TestWorldGoldenTest.java index d46d591..2f995cc 100644 --- a/src/test/java/com/eliasmueller/llamamod/mods/testworld/TestWorldGoldenTest.java +++ b/src/test/java/com/eliasmueller/llamamod/mods/testworld/TestWorldGoldenTest.java @@ -24,10 +24,14 @@ import org.junit.jupiter.api.Test; * tools/png2cor.py ladebild.png OUT). The test world has no Python counterpart any more (its * all-worlds gallery is imported with format.stpcmerge): its SHA-256 pins the current output, so a * change of the level (or of the cross-world merge) has to be confirmed here deliberately. + * + *

2026-11-07: all three levels changed only in the llama's waypoint chain (LevelBuilder.player: + * one start camera node 2 cells behind, 0.5 up, unk2 = 0, instead of the prototype's 14-node chain; + * the two strats with chains after it get lower waypoint indices). Jump lab = Python output again. */ class TestWorldGoldenTest { - private static final String TEST_WORLD_SHA = "786a8f9e907a6bbd22a08798e7eb1c07c2d8d96893fbbe6fdb37363c02b03643"; - private static final String PARKOUR_SHA = "858f69883c04763b19ee98d23bef68df5563a093e1f37af864458286d98bcbc8"; + private static final String TEST_WORLD_SHA = "4abdc4fbc4a4a5f0dc2e88f532240e9a33d7932ee6a234a97be26853a4b3b7f6"; + private static final String PARKOUR_SHA = "3776cc25d16a0f6327eaffc482b81d220d1eb1a954418e53acc115f6bb2ec5c4"; private static final int GALLERY_SIZE = 253; private static byte[] build(Path cd, LevelScript script, Map opts) throws IOException { @@ -86,7 +90,7 @@ class TestWorldGoldenTest { @Test void jumpLab() throws IOException { byte[] out = build(GameData.cd(), new JumpLab(), Map.of()); - check(out, "sprunglabor.wad", "1f8fb96322fc62dcf1e2468748d912f3ab0713b004273c63db186bd3e67f7895"); + check(out, "sprunglabor.wad", "18db0b69274432b2281d69f8758d3ed00f9c186a6abe81a1c4c0c95311d8faf1"); } @Test diff --git a/tools/levelbuild.py b/tools/levelbuild.py index bde8a31..ee87614 100644 --- a/tools/levelbuild.py +++ b/tools/levelbuild.py @@ -419,7 +419,7 @@ class Level: """Place an object. y=None: put it on the highest surface at (x,z). rot: degrees (None = as in the original). params: list of u32 (None = original). wp: 'relative' (move the original's waypoint chain along, y snapped to the ground), - 'here' (all waypoints on the object), 'none' (-1) or list [(x,z[,y[,rot]]),...].""" + 'here' (all waypoints on the object), 'none' (-1) or list [(x,z[,y[,rot[,unk2]]]),...].""" if name not in self.protos: raise KeyError('strat type %r not in base level (available: %s)' % (name, ', '.join(self.types()))) if y is None: @@ -430,17 +430,15 @@ class Level: self.strats.append(d) return d - def player(self, x, z, rot=0, y=None, cam_dist=8.0): - """Player start. The first waypoint of the llama chain is (in the original) the camera's - start position -> put it behind the llama (distance cam_dist), the rest on the llama.""" + def player(self, x, z, rot=0, y=None, cam_dist=2.0): + """Player start with its start camera: one waypoint cam_dist behind the llama, 0.5 above it, + unk2 = 0 (default camera distance/height). The game takes the first node of the llama chain + within 2.5 cells as the camera start (keep cam_dist below that); the prototype's chain would put + the camera into the llama's head on village 2 bases.""" d = self.strat('Llama', x, z, y, rot, wp='here') a = math.radians(rot or 0) cx, cz = x - cam_dist * math.sin(a), z - cam_dist * math.cos(a) - n = 1 - k = self.protos['Llama'][0][13] - while k >= 0 and self.map['nodes'][k][0] and n < 200: - k = self.map['nodes'][k][0]; n += 1 - d['wp'] = [(cx, cz, d['y'] - 0.4, rot or 0)] + [(x, z, d['y'], rot or 0)] * (n - 1) + d['wp'] = [(cx, cz, d['y'] + 0.5, rot or 0, 0)] return d def checkpoint(self, x, z, rot=None, y=None): @@ -773,6 +771,8 @@ class Level: pr = deg(p[3]) if len(p) > 3 else s[1] # copy extra fields (wait time/mode etc.) from the original waypoint a_, b_ = (chain[i][8], chain[i][9]) if i < len(chain) else (0, 0) + if len(p) > 4: + a_ = p[4] new.append([0, 0, 0, pr, 0, int(px * FX), int(py * FX), int(pz * FX), a_, b_]) elif chain and wp != 'none': ox, oy, oz = proto[3], proto[4], proto[5]