From 343fca4889493fc28936d0bf57a5485b1d63ee37 Mon Sep 17 00:00:00 2001 From: Michael Mainguy Date: Sat, 8 Nov 2025 19:20:36 -0600 Subject: [PATCH] Refactor replay system to reuse Level1.initialize() and simplify UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major architectural improvements: - Simplified replay system from ~1,450 lines to ~320 lines (78% reduction) - Removed scene reconstruction complexity in favor of reusing game logic - Added isReplayMode parameter to Level1 and Ship constructors - Level1.initialize() now creates scene for both game and replay modes - ReplayPlayer simplified to find existing meshes instead of loading assets Replay system changes: - ReplayManager now uses Level1.initialize() to populate scene - Deleted obsolete files: assetCache.ts, ReplayAssetRegistry.ts - Removed full scene deserialization code from LevelDeserializer - Fixed keyboard input error when initializing in replay mode - Physics bodies converted to ANIMATED after Level1 creates them UI simplification for new users: - Hidden level editor, settings, test scene, and replay buttons - Hidden "Create New Level" link - Filtered level selector to only show recruit and pilot difficulties - Clean, focused experience for first-time users Technical improvements: - PhysicsRecorder now accepts LevelConfig via constructor - Removed sessionStorage dependency for level state - Fixed Color3 alpha property error in levelSerializer - Cleaned up unused imports and dependencies ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- index.html | 9 +- .../themes/default/audio/{ => voice}/ammo.mp3 | Bin .../themes/default/audio/voice/armed.mp3 | Bin 0 -> 27534 bytes .../default/audio/{ => voice}/danger.mp3 | Bin .../themes/default/audio/voice/disarmed.mp3 | Bin 0 -> 33804 bytes .../themes/default/audio/voice/empty.mp3 | Bin 0 -> 28370 bytes .../themes/default/audio/voice/exitarm.mp3 | Bin 0 -> 49268 bytes .../themes/default/audio/{ => voice}/fuel.mp3 | Bin .../themes/default/audio/voice/full.mp3 | Bin 0 -> 29206 bytes .../themes/default/audio/voice/guns.mp3 | Bin 0 -> 28370 bytes .../themes/default/audio/{ => voice}/hull.mp3 | Bin .../default/audio/voice/returncomplete.mp3 | Bin 0 -> 47179 bytes .../default/audio/voice/returntobase.mp3 | Bin 0 -> 76018 bytes .../default/audio/{ => voice}/warning.mp3 | Bin src/level1.ts | 76 ++-- src/levelConfig.ts | 59 +++ src/levelDeserializer.ts | 19 +- src/levelSelector.ts | 12 +- src/levelSerializer.ts | 232 ++++++++++- src/main.ts | 87 ++++ src/physicsRecorder.ts | 21 +- src/physicsStorage.ts | 78 +++- src/replay/ReplayAssetRegistry.ts | 153 -------- src/replay/ReplayCamera.ts | 7 + src/replay/ReplayControls.ts | 27 +- src/replay/ReplayManager.ts | 321 +++++++++++++++ src/replay/ReplayPlayer.ts | 184 +++++---- src/replay/ReplaySelectionScreen.ts | 371 ++++++++++++++++++ src/ship.ts | 76 ++-- 29 files changed, 1383 insertions(+), 349 deletions(-) rename public/assets/themes/default/audio/{ => voice}/ammo.mp3 (100%) create mode 100644 public/assets/themes/default/audio/voice/armed.mp3 rename public/assets/themes/default/audio/{ => voice}/danger.mp3 (100%) create mode 100644 public/assets/themes/default/audio/voice/disarmed.mp3 create mode 100644 public/assets/themes/default/audio/voice/empty.mp3 create mode 100644 public/assets/themes/default/audio/voice/exitarm.mp3 rename public/assets/themes/default/audio/{ => voice}/fuel.mp3 (100%) create mode 100644 public/assets/themes/default/audio/voice/full.mp3 create mode 100644 public/assets/themes/default/audio/voice/guns.mp3 rename public/assets/themes/default/audio/{ => voice}/hull.mp3 (100%) create mode 100644 public/assets/themes/default/audio/voice/returncomplete.mp3 create mode 100644 public/assets/themes/default/audio/voice/returntobase.mp3 rename public/assets/themes/default/audio/{ => voice}/warning.mp3 (100%) delete mode 100644 src/replay/ReplayAssetRegistry.ts create mode 100644 src/replay/ReplayManager.ts create mode 100644 src/replay/ReplaySelectionScreen.ts diff --git a/index.html b/index.html index 6fb0592..9314ef6 100644 --- a/index.html +++ b/index.html @@ -19,8 +19,8 @@
- ๐Ÿ“ Level Editor - โš™๏ธ Settings + +
Loading...
@@ -56,10 +56,13 @@
-
+
+
+ Create New Level diff --git a/public/assets/themes/default/audio/ammo.mp3 b/public/assets/themes/default/audio/voice/ammo.mp3 similarity index 100% rename from public/assets/themes/default/audio/ammo.mp3 rename to public/assets/themes/default/audio/voice/ammo.mp3 diff --git a/public/assets/themes/default/audio/voice/armed.mp3 b/public/assets/themes/default/audio/voice/armed.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6963c8f0eacbec7b7519b938caab96bbd07a7848 GIT binary patch literal 27534 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 SlX#zR5&?9xebgd?ApiiYQU1&T literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/danger.mp3 b/public/assets/themes/default/audio/voice/danger.mp3 similarity index 100% rename from public/assets/themes/default/audio/danger.mp3 rename to public/assets/themes/default/audio/voice/danger.mp3 diff --git a/public/assets/themes/default/audio/voice/disarmed.mp3 b/public/assets/themes/default/audio/voice/disarmed.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9b8b6a640121facf5a119071caf5f16e13254017 GIT binary patch literal 33804 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≠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 literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/voice/exitarm.mp3 b/public/assets/themes/default/audio/voice/exitarm.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2906a017b402d90f8e9ec467bff575fbf922ccbc GIT binary patch literal 49268 zcmeFZbzIcX_CLNsceixsE}ha!3eu&rEZtqAbazRKgmjl60)limNFxZMl!OR~!gtqr zU*9)A_uk(h_woDVy*$``&CHoIXU;iuo-=0_lobR}0000GM5Lpwt%!KS0|3BkFi%Ti z2rpEa7Yc#gRMe0I0D;bkdYH4by$u}ZZsX+0=gkA>cZTsez#MHXE!^CB+}xd9Eda>6 z?{D}EF06-Z)G|L72y#hfM_mk@84=M*3;CCty zS4VLV4;yoFVIea?3qe6M9y7R^5RagkfF+L@6j4Mx2?&b_n~T8VVu-Oo_kXhE_`we5 z_9u48L3v?rZWgY{Ik_P^0H%L-xP|Os>*nP6dk11ScXKyhH@LNh1B}PX)rwc%)dHao zPYZn~S36{H3OK);wPHb0=9(qhY-Yju9gQnzCq(^2B&Yj~GH@qHcMETKMsY@KcXwwu zaX!8u%y<#Z7`Yi`+Q4^lC6OH+p49 zIPY(LHC(L_Hu3##CB_GL9w0^^`jZmOoLqmO(|67D!r5mF!*a~mrgcbL7llZPwZLI*J;?;FV3 zA|?y>){4`HxevhPheun#0_YaSexs1P1C!JT2|O2{#Pyg)8LMP>djDnH!*A4P@R!)zQ7Q!W?^s1^nLPDd`L3B|7wwa@51{BJKMjlrr>)WSHz(8-H-)b!7))qER$5`)at01883D1r|k*?B@K{)@9 zL4FMShkyU%%dqH{Zs(r!#kL~->$y4qB`s-dcSU!~5bQBPO(m-A;SatX|Bmk;&i0cn zq|Pz^Tm3u9>)thA7Mi#cZ|qgg-71U`5=#BZae-O?!NwdeZt3Le0CTs6d6?Tc@i{nK zSlQY*B7D*jZlSE;&F$^rEN+8{a3bcy5V(-284uI~_C3N0@R(T&3h_W-7J`;SA`pm( zsNio-3IIrG|8%$?Yl9#DPh#C4c0xFv1QXKfCPNJIVEI5%Mhb>tLlj|15DGse2uzg= z1_41J0+4Ya+{L*9$3Mb{`f1n6Cy>=YLW#6bl>ETPyCOf;}A3K}s;R~t$S zAx0Lkh;bAUF+d&>R*}&ON(muHR$~(rczJp8B9}WH(ZmaPa)7cxn2=3iVwyjCC^*4A z5X;e>UK`<~HjY;G^0E+Ga$J5P1Q;QvjeHp)io%GZFu#D1n2?weMDNdX5JK>gTrr3- zZdrKI8zO@9FB!0i3I0BI{%QjMV-v&^LV$*jnDD3+2#AKt6^H_01e*a+_D&^_><4P& zjn2f+Ql#U>zn+yb)m^$163TN5jq5L+jY=?AY<9elN$Yyl2|DlHy4EOsP!cNhtw$OY zBdd(GicNyVBWmq}Lq216`u*O(I100&S$~Jm?DUd}CuxTHji*7tbVv{|1wx0I#x*7s z3J6&M$;VNl4Gz=~@ASx<4 z81%;z3M4QVNl%9o7zzmtf=K5|(k{xalGJIc%QSV4K=uJ-@P zK=8k0aQ~NVKp=_}!~w$ms|*2#QT&w43GU|nC$)Zr0s%p9uBC-r)_t8NCG6c9&UzxbOKI#oVMieKbm`O;g4COees^V(yi-^6ICOE2_FP3bhmD8k9!&R(C(OL)o-nM9 zl;cqFOuL-cPH@>)j)#;3(9Y!mhmUs@DmEikB0oh=4@@qGrz=4(+dmw{rd}>mH##}_ zV4JeIqEpSHZ*9!uw`v9EfW!LgPD+n6o>+V{VwNhsnQ8iP5u-r-@)Gil2t}l+Yg(-HW)?}LylY!45Ki#B*02$Q!{W~i_P-At%n(L| zPa*;b^)Gj$mvwVP0Gc_yvI4!9lau?;xB(S_LLov>{$FuJ^ta;wEPe$68GqLR5EX#% z8+-s_jbnk34m5b1Ox!Eugp9fL*~Yt-R9`5rO1ACL0~Wu6tj8f=Fa)hnFj=od6>Auj z)MheL!*Zyyy*{^C;TIY`F2ujc+MJ}|-09W9F^ga_D~COD)F3yb4XpS;@UAPnx$*Pn z+HP-^Do>VDIK1^*j%guT{I{eX7s39!y`*zdDqo3(A!WG2G(6*Y8qc5`hPOUp^EaE> zdsv+LM%E`A3o6x|sh-g51s5uv#HPU2z-*-uU8_`5Y7QBu?1qv)Tnj)w;d@36Cx!Hl zOIMHe7Zp(TJ8SqwDcrgJ?8_xLP(|YiNHWW$L&(-|8718dt-moMOX74n_@%n7QV5GD zkUOXG>j>Ty2n+-Op9XS_^LBJ-2f7By>^U<(=hHd}|1yN3du>YDp2uMbQoB{GE@%P}$C$FiEpf>-57KAA2 z(FOsv0I~o_fDeEk-~n(0SRg)~0G5b%cYrm(22n!~kVn+IBFZ+1dK&;707E<@>EH-T zM+613#U0TbS&O7c9QqJH764~N4GckneEyv)vZR3MV}Ru)YUu%9-=&8m-sutjY!EF- z8Gk&(0A`31vi3)Rq>RY1kQ|X?A;&<@%@r{NLs2r{6n73+Q7`9I;$LQvCW0$76YQ46C2}+wxI-z3e z=~zBq3@4}a&Ubn&L4;YU9Yd9o!dM-_J6M6)ZOhLOrqFK_MQ1q-?km(|d`k4WJb7bA zcy#JxbCI1f&{qxIx)r?l^4c&#K#!B~n2^py^v!5b!wwwG0oz*hA)Zr>4-&<~^vWBj z6#>fm z2{AZZZ#K#2Zd}H1ntr7|fQbFBHPrtp#6X0h2vGU)LTpVDfb+NF{|f2;9l})Nk&bT2 z2bk1`A2*qvyATytEwQFVlzkdKp%-H}FvU3wSSTe;<%dZ=t7Q*~idxFS!U-n#jZdhE z+VashfrfB?#!u%L_8eYWmMqEtXnVnMqy<~ep?^)cUORtDVLnM@eDBalb9@w+?D+M?!LwbC3LP+^M`V|VkE1;uULWSG;&NSKyDmI29gj;8 z>h;zQr_USPbinFY_JgJi*fV|zALlp9e?c5XxF<%Qogwa;_wGx<{0uqNqbl?PW0f@U zM%ZU|pZ?l~4Sn+NhctLK4M|0M^=)-&du7E3O+6*jsbu3>TB{2Ou}W>w)k zM>F#)di6QOqa^IjxM`*)L}~^bQ&PdoiUw&yHdG}yxAl5`%8BNz0z+2)F(p&pJ!j>n zZ_*232an0&Hc0=U0e*`{sP;L;pF``Nz1O!9BheRX>T7XeNh}{$77=niV^B{^z07S`k zLvevPfq=k24ms#R2oxC+e(QunzivVvT&kGyInZ$8`mGRttO$&2GS-aQ?Yr&O$vG02 zAs_+`>EeDWz1~wev+CQH)khDa|_oW zVn7km`XBebAmqLmgxL2YOg?_2f`_R0$@q4asa`#o{tKtuS7FXrz|}#KVM;j&oWCSv zm1NfC0=r{pqDPI~+1?MRv=v=+yk*s^{^g6LyLx-U#c1CN{7{5JgE?THmVh%=es6Ka zlD5X!+&7V{O(DyF4a2mVi@VsjBx8TLn$-0HxUFW`*BtdJi7?)|BC= zmZD6YLO(urI>=lXoeT}U_1Kp%yt?&$i^-Pg7`sO^XKr;No1-d*vz9GSGlog zZN2(>8!S@httTo|E2*=Df&)q9_un&uQ5z=mjw?hM7)G+>sBFfguoP+Mnh%(ZTGb+* zG39kTGo5n+PQPCG6#t0ILBLeR&NLB%gK)GTkr)I4{1%2cB)%R&_r865eVph5r__`m zgT=i6b85s%Tjj$BnxF6BdV=0(zG>y%p<92B^N1YB_gn}I@>GEX!TPl)24g@1Q-2i@ zM~T1)2qMYxpXC$o{OSh*h28#jjQGFu2|t(cO~Kz6@XuBBV@)AfFJke2&okUZYJ(2N z0HO!c$<@l$47>GfjDMMN`ELfWhtMMjphrPu=O7qpXjXwZKorn#`&dK-{ri0=V#Qi; zRvyx@p)^;S%I;2JC_I77xH6n=d}h>G6pAjydgc^LNaaU{Izfp)2P}U*Vm%)kpT}_g znN>mLP@|?H`IQdYQ`nb9hQOD2@1HXTceeU!KK~LLROTTKX}2IfD>}Y%Wwq405Ay@! zPrK*cYP>!N6)ThcXgNASAHg$j8j3&9(JFU5YZoz3BZp2vd-sHA43w}3%g3iKq zR$FadZ6$G)odCs+1U1*kVPVYvZj55I;0i6fy*yh_aN42fZH_%hVZU)*k?1Ep#k7i7 za^(qV*Gs!5vmWREpRAA zSBi$S_i{K{p>7ShyMN`nGbLNjCNNIs973ljc3kz95i>`OKm%J#B{3|d37(BdiY-1=M(nvMG~v4Pqc5t$ik*{CU0yJu4qGU` z3LCFuD9)=^+&~NHr|3bOnc?ZIw9Oc%_PDvE98i3=%jTj>?w>uwB7e)eC#G?PG?ff` zKV$F=`yo!eFAb(X4d`4&f3Ewc4<{CRivlk46!jA^9B!f&Ho}M?^^v0iH z^YTjdhyX1#s2aC6&g4{K9y_ru@9SD7IF(>P};R^8nHqEUIPN~ z9{&V9+`bBZ)GLMzUKx2t9C78azjGOg*`HD7zt8h9d|&7YB&7HQetse0_ax6v!JkMc z^jmURKokOn3jRX6{~_r9JG^V~hE8Fn%eualywO2Z;j#D>aWmF%n><^+G8Q-GS;nJa zZk;`OTf%rDa(;WcvUBPhaksU+%hJ}nyi}4*C3CApCyYDT`B{$^iuYK8jBpl(&Jr)I zHm)fZ#!Qtx4wb(IHYo>m16QsETgg+UWl$8qd~4dHd587p#U4-9^?;|lu&*dBwJ44< zZ5OhhT_Kn}I>`i1{J?8LvSv85jAD}B;&Y+S-36r*iVNi9V}9c*s*Oe?{eFUXor;?> ztxQuzsBB-@Phm{Q^*SX1&8ryOp2Vt!H09=Ci&=mZ0&u#7}v0i)hE6vbRuZ zU2`jmx6?H!Xsoy@D?#YQQj=CCh2_*754zzpsJgw4cJ!!cyiP_I&82Q-rXA1~gPBAs z#9F^g`c-cht)%4vzg1l2TD;<-Y@c74=v8^2@1Ow`GbJke?vY-0EZ-KJM#1}`?U65T zk^*&Gyt(BPW*RG@?N`Qh%?X1MQ0i$EN#8O3>Wdflf?KA{gNz;9)6|xCR6?k=ZHJSR z*5!+OZ*a`p$KmmQl!XLZ&M2~+7_M9&4YVl^F*+Mi5wKjyyP9!^iIHw?UIGcg)pRd99?kUZhvi z;A{LD^$>Y725ATVfg7|B6 zWtpJ49lYNURfF5)-AR3mGpT9U|7l#nHiY@KX-AS;DgK@6$il+`FPP{h1BNE?^XW^) zxA9!cK|Y_tzRYY>J)&IR;YQ`zK63r64Zbco)cu^?f8jhEPSDwoGth2Fs1+3Ams2eA zd-w6kHQGZKE3RJI2tS7<>iq9M60X#ti**Ogm_LoZ#GJ2s%O?~j{8ax8>aL8_r>&wL9WL9MV@1G+ z0xE+Vmp$8W6PWY`$Bn*3F}gn1IH*KJc}Gw^>N9WK-q1oslyGsSf|spdcc<~OC41ci zfww%(JvaJy&2Ybo>-xEJ%I8;ImQ2A*OjfAL`5RtptJR%ZlmR`9*2KxYEC{BHh(9V* z#@wQ4XvcRF6?8Msg+9)(SbgR0x_)DS4G0r=fU>T65+>j!rv)XE)SAEbs<63PMkRaI z#qwOFK0k>2fW@jRaX3P%hA);iEBo^D`W|V80ee*R1Ri(oD)d@Lf6iquLG3BSV(+|< z+UKfS=@Ur62gp}~guI)GMc|glPu#-GqKG>m=h^zWsJV_ILt*qgZXqu=|9AHj z{QM9ETK(;ihRhv_{erIl1$_QH%xZs^;AXwjvT;X662b_v5!mf4X5k%RkUEN*GwfXB zD3&rP_skrrx=$T~+YO;RrY;aA+tKSybGTMs=W{ejIJt3e7FALUUyH8y32EWOmpP^S zWQMw~)z-<*opmofGHl)WQzi%$2zXb6j?qKjxl1^>tn=Vd@6*o=&|iad@Qm)>z15$5 z#sJF_+(GTVyK79YA##8O{BN5>!zhpS1W7&5Q7KY0Jn+sXlr zyPHB=(4mFoyGwEL0Sk?Z=`smEUEY0-wcXEbDMY~pv2)WR1-z&aB2I#?6C^s9>jug4 zzg|Rf<8({}`Z1_Yw^mVuJ??m0&Wl48G6iJXFwKz_<> zawFdS^p#D7XS%19;T<{8@W?b9U!{XL`9#!~neKxtsApGYkMHWXPR z8#5IsxgK_;G)%%Ab_C{oR#i~|!w+auyW&q7>gouaTKtb@Vw|~UP0MQG6bh+So@Ng} z2h?1=H!l*Hh(up&YkDVNK=HiD3%G`#g2QmFPKSdf(tZ<9>-J6em#h_yvK}kG758GL z2U@3O35kq12{d=0J%g@fjF_u_Y97+?U50zz^tbJtYRki-H9BV%?`6|}&7cbMJ=UEv0HEZ9>k4zL7P$Y`IOob29=);iPp1_S-^}Q`yVGM6 z@(Nk<3_Fip^OPDghO#w^(ZIxBYzos`{_hP-4%+#!i#{9)O75P5`@%~m)nq7zZrIxB z)I87Ai`y-jk$PXd^o?fjlb4Z+PK?vXJWZ*uo|x7lIZlI%^sz#wG$8O0eNBZyE}jg$ zC!O(Co#BbD-56WBz2~SC6VIoIF1Ac|j8{a@b$Hkw&WX<-G=@L=W;|h1LD8k26l!T&HZ1|s-pNxI+Cgt>te5UM}&keFa7?w?YP5SqWW zp+fP$e=+56=|KqBZ^R%RC=G-Pg823Z3dyn=q#_K92V%D%T5Ij21wp@%eF)+E8!Hqj zBMN=AjuU>#3-1qxH$NSTk6HRX{)C1V9T+i0;K1<8DDrC)MC5nwe9-R~pAbYxm0an3 z?$;(EJtoQVL2*`gkE;gjrQbTRWyg`U1@Vf&d(x)gvAV32h-|{CTjHy5lE7R;< zg8cm=n~t~+xB_hL`Laky_>=XEWe!pGRB=l4EKSDimkNI8k3_wK%$4@?AIOVn9o=Mq zi)Lw6WkoTVR#(Py;|reNw>TELa1wu~<>SI@;EQ#bIm$PRvs0^(>H4e|;hrk7n>3L0 z7cal2a3+SRmu6CGSzdpu$JL(WR)CgQ6mL^HBKF~ZV#MwBtoPAr$1Ze~E1L2Z%rmce z(B9l2(_a)*+g(v_{33X_tWTio9_8q#0WxO-)$5Fod@E0VhHmwt5n7PvZ$c1R`Xc63vOD=ry0MmXnLYwVXyQw)b@-G!+p$~g8}qbxD$&j(LcVXe8qZe zXP@;=R=;DG(TP3#at;01E3et@Pdf@ubmF@H^$V@Vb2LL!y+O|5v>6$!%Gl*_R2Zw% zcFJUpFM#>_U42P1Z^!vtODpGqg)**N0aOk_>_THHJVtYUo^l~(t_egt;m)NUS4UuzP!A2<9_?MWLC8d!K;@SHm7QVIA(;`l3VJ0Pp#n~0y#!LV@ZXZE&ETN zJSNDFX-65DyMB%e!sDeo0Z|3wSDYz8Cb!Fz76nlWn#hT;cnW)PE%<|k8R=b_% za>8FgvFK6mYD4KtB!0`|Md*GCb&=_vW0})N(^&TiJrbgkR&nbW?+>@x*)=YgI@DloLyB@7;kX$TV9=z=K-fOisMGTi@}Yv@EXi~&BOpb_oN2jM44QEnyZVX zZVCY9$tIXIEdXo|vGo!{{OR&&(3@@j`*u}pZ=r0_&yxgSYRS667Y88Cz-Mwt{_|wR< z&h=HHS?S_lk=DuiQ2%yoKZ;ljTyqOM!i{b%dMXLrq#j1n>djFVlIeB`k9I(t#S{^m zrDDVsHZKUI1kOwukE9heIbvn2yGzNyjxs<)5#$y8JSe*6B zgpBTe^}qV@!t!2u>U!0C?=ZrQ!yj98eu+r_e(E?@2LP3Wb?9-DLkv*$B`J5SdI{1( zSOAJwsrrVG1HkCTyIz6^AQA$bJa9l5hBY6z$uqkZh1$SQ)_hK~d;ld2@vHpyo^)9` z=sg3uSM9MdQ7WzXHbH=HCeeMal7vW%&rp%e6*_#C$GqpBYaix!t~4|bU-&h1hS#;7 zvX0W`OnWWg1@X787hMK!hh5v7 zXUA9%+@#!EyIM!xE>`#NkG4C1oH82o{&?|3a$nSQS+)J%#rfLH6`K_EhyVbvF{^RW zp-!IoS{OdcT8682SRC!mBbY6XDNfO=ASyT@Q`<~oyqiGn8}_TuXr8rq&;+okIIJcv z&7lIArC-Z7S|74Aa^bqIX_b>hHw`ntB_ zL6&w=)Ml5M?V#UL!!hr*$^lF%Rk^1mf{ffAH{kr9n2)oH%^u*DWjLv>tGs(%*4F$s zg;Tv%LjXrKVa4&}zJ7R+TcKgB%5VY3z;R8BrZNF_KmrEV(o&kT$Lxk6pPV{xNVA5x z&~v1PZ~`b&6K$Hq1E^BUIq%g&fQ{7xN*;t0vR*y?LAdg;8;zk=3IryvIW6ATgJMmX zi{uhRM>6&7fb@h3xA7aAMG5PON5RQ-;B0C_XrFHZ)Q8DC{`pAYUf;VaLDHQ#sg zh}wGYUewsx`^2xEvW@V1p4KG|dh;mL#}PCSZbdh@tl1gcBckX`#VbsIDmSZGhS@FJ z&!>YSit%*{@6rvENS|Fw&tA5_KKV3T-5%qA^(i>(<?d~XLE34{#n7QXA ztNUz93){Hzb5UTZp5hc-k&0GC9hE;SWwyy^x=>TywlaGj<)g5s6+_Q(sKd<45r7%- zPd+{aUDc8ryJ*^54!;qt!rKvB%#9cPve5H`cicox=uyX1}c z0Yz5F>`kPFXaSj&F48<7;)jg5Sze8>=0TcEY3S=5VgfJ(>TXxboAIv^^iLC_Far71 ziOCq;h>1pZA7;5O&sUettyXe8de)0lxvg~~&gCKW=vub0p+gB-VY%)Dhr81^M^f-K z$oZnsPl_C3_VQu7zO(~ZmBnnuS~Zd<3EU3YPjxjCS*69e1>3NmCcSX-zgOp9YB%|M zDSflw?Y?#SgLp?>KH4Lbc-zwxR5fB&yr&eR({70_IbA?!X9GbHT{IvJpt3823Q54t zBs+hSPC&K?0$IO-)dCVld(Z{sQHO2)geXiqfydbBF|3*b1Kw`}_#;Q?T{>?_0!*Os z1WGi6=-3286(~_#Daz;^NH) zmF^DNcdYT}r(L8)acO;c$6uOU@ zXW4kExA8#Lt9J*UVN?M-GE8<)TOxP#y4(g(004P1GW0NBU|2?8ucd{A*MeP=RGYC?68*V?TMlL>fl%YmbzwFQ^5)r}L~IZ?OGx~BVRsKmBA zQzv8HA(s;WZB=JDt1|E?xC`@Xs5+U4CH3gDnnoTA0rj$;9WFbQEE)&%^eN7T>aWW? zxcuch+)|FH88D6-6P=Xy=vvs7CPrY0s1=0-pIG7X1VtQ9^CMsK^eHs4@Htpu=s^bn zx8qezWG@auW#~68C@D;hg!7Klc1_%l1O|toE(@P9yW4e5XeZGnI4B0k5R9WhD3scU zamUNS`^MC{j745}1w`>Ef7-{d`$AU(6Fp%%y#ifMeu0`O+rQKUH9sr#IDg;*d!fbS zOXZg)C6=On=g)L)$`4bE+E%mc&qlX|V)eJ~=Ck>aX>`%- z*v~O^*T`a)-s3wx10}vU>U9|HS!>gt}~ff$w=l75~^XopxSH-I?zBM1y*j1 z0XY3k6ENYBhqMqWfCAHyPG}c^9RaZs5l8?U-MZIRkIsx8S@(9_t9LnL; zo|bew6Paq3mL=xo=XhGvdk>Bp4Nv`-cMM>6^-CV6VVT?)c$h|Quqnpf*>ipK#Bof2 zjBBQ9c>`K;ynh1M=QwX4yBB`6tp4r6gA32vCJo1vFBuE<*=lt~Lp~o3H}7-vY&xZK z8};oPHb4Hh#9unQP*w|qmpeadQMelDpzNc!6WnOJLG1E;DPcgC71co}xUuH=+hysle=!_ zs&8xPI%u1pVzHpAr>j@qMAbwQV-RJ9E3+GzQ?sb&Bu^CWRlhkz@a}p&)u0F~7lTfs zcf&PH+L$3;3+=Sh<1YLswRCYkjHg_^JUiUSt728lOE#mKotl33ml_n!C&6YdE2kW2QGBRGK)|x1WE}X zueiw@Enq(+k(jW`zibdL?!bW6le}~w9oI*+Qp~Y|@mBmp4~`~XROsS65kbr?!caAD z^Bs+}BQlG}+x#x6$9wzplr!EMd69)ggt%=gO-Xn2ZjbIxS*hlQ?DG8 zjkHR5drTbF2~!ZpY@?l5znHI*ywOj{_guKzM|Lb=+a+?i#f(D+KTn3Z3N+a3-v}WO z#VQR|^RH#jbv#_^P?R*rKw5|hK$_=o+!vdO39Bnk5Qp%-J-5r5JsU zmV`WJsB=Bfp>UU)q}eD^w8A1G>wr80Eprabg%OWWWS>XP#{PAmo>(Lh0Ri&yR)>M z1WI1l^}BS0pOMzcP6%0umHRb^n)i}+^O`p88P?0psPiX;z4bF{b6$r(G$iV$R+`T^`V?`Kn^(j` zzIZl&XJ$vgu=(rWjupHwwW3-=hFwGed2$YT#9nMuHIn?mK(X2*@3Y!BiKN&0G~vwr z11kL%fXKrh@pM;DVlulaC9%f0X14M0jO-}KS{JdY#Qw+90D?<8Dos)X?O1Rk<%zGF zs5Dj*&NP0X;!z!S$04N^$kZA2-@GNXJ;8x|}qAP$^k7DgXh% zlzMNN>jN?(&KpR^nRblo7R@r2cH0Wns6g^!-3T7 zZCKs|ih;N4+51!TZ#SZ81WLNuSYkdzig}A_hZ^ye=o`#nCcX(2peA4^Xnqhft>67>kE4?@v8OJCrn=(u;5hFf7#(D&Ez89OBJ``v`C5jd2en+mda!4`9w$~0%5po!cD*I-HKb&Dd5iIb$AcSn-oLrT~r<6El|7cc6SQxFev#9_z_@cq#r>j=R|t&AOzs>_KtOBxBt=5&(rOfmPz6(-yX~B$nQs zqsN*BcjL8`cD`4Efsmay-9-z#uKGL!6AAD1*f0b!HJ0mFo@J)D4!(9Mzwc=!WXF=& z-|DI8C(DNi2eXLE3i&`{0br^&%$_1^29AQN*G61q(TY^(KCJak-BC&(wHx*Yr*!?_O)S>$5#P>qxXN|`O-PtNn!73k{%_Z#s~&t^yr9)o3%R-%&MfsKu^zzw9x&)>5*7bJjl$TKcs+kmWo*XAhMdxghgY3 zvZS?%^Yk52gY`1U8Y91>WRx=7zyi_J{%849#kR!Z+*9Nuw=17J8Z3Rng|>cnl`L0i zaNf(T3|w4_WO{qs95Z&L&i|N`9!HG2gUzOMhNDHUIXn**0C=B3leEv}>XMI5YHYxh zrW~9WfdeG>(4~FfT4YqqLBPz3lETU$+Sy+eI>f_h;C1(omez6M3u{Mqcs>!CfocHVlBUwFSq_AXiZ1oISZ4pMaysLQ@i=64xkW+Fo4f&~U*FOaf(Kjm#> zeqjcC++zJDsK%LALhQAEUOnbEq2bZwkTO3rCMnyx=uC0MiIL-ybY*E22mhf#i-VO| zwTL7CN|P-H{NAGU^=*QozVoQ;fhOgtc6A$h{pbA3mf6o!?}OYj4yG~4-oIo`LFXhY zoqo%QS+wB!#N9!Xz%7v8)PO21iH!*(Hi{5wp(nvQQW-?N1#UqPYx5L)sfc79cf`Ix z9+HZvaY&8Z(lCG4zN03lS*c%`rc&=|1m`vHluH6LsofZ3vNG&0GmX3G7T3E-)OT|u zZXvi&)=P{bvD%i#Lopk=zPR*3EdNAAY<%h!QP&F;Oh&PiSQ0I?$*pFu0=#^iwMXyP zF>z7rdQv^C*$JarwdgS?O>@n$p7x`eX5A^VomGENaF6U6Wx6AQlyhJq)Kyj}G~s+M zz_(Q6=~a|}{bw30B`RU%cwi>MKv8r!TH46--aPl6#I@L^$1}LlI`FG`9_%vwu?yEm$7FeU{$(KxvyNTQZFM zQ%1_b4=@w?Uel1=fHKs}ZDyy1_H3#b|h@T~WCLrk#xmz-cF* ztt`i)^QnwPm+S`G#=}u+e}9|}=N^(eu+TWfR4hF<6;)A1B;0HGn%7D5sgm)EcLoV5azcg?C1g!z~OEy>C3B+_%ZrTPR*}JoAbdG zkr^og>FlL30X1E8#L%Q22>P)zrf|`{juhqJ71rTtw@Y@i-X1Py~FaRjx-0KOth8l zYC4P0BGzg%jfW0R-3>?!tpiwz7$`E@0zi%2AKYpVfENcjW-t1xb}sFV?N;9%7GGvK zD7-X;W8eGMO%DJX;oz_n*jnbRqQTffOYDqjL8W%6t_f&eWO9wwjF*^TG&H7MXX^wa zKQ?);7zt;1*k0a*9C0oc7$A-MrboMzkvyO)sHRTLFhffC!(H!l$rlM{5u`Z*5$g<( zLV`?NTTOSd^@WE<`}S!`u|HH4c-b4QwfJ9M;VJE44zebYKVlV?CvnO9wq&j|;@iGj z_|?hg@*wr0tQQJ*3?UyC3h+$`+6+ZMSj-vMTF(5eUlS1-tTW}F%LvkDV3%dcjngm? z0U=m4cqlWgdJEc=F(T;ac2JK^G6UVfSP`m;tI%Gpb%gdr^~*B zaF{}~Bw_MdC1xtgGe`?H2d11jDdX0XgFN^+3=5e6Ria9_c-%kjF5IVg2R*LZKJ;N< z)VDb`ZzwG=DYCCDDWk@_NwO*}IO<^E`RcH%D*%j=%ZVFLh?@Si`t6JdyI!WEb*??z zjP2+4tMfwP=ju;SoeS6q`73LI^s%fXW2!`ige^#k$K2=u-p$CJ> z8x2LDikkwo!zryvP=~?t!>>dEY77ATj^}7<=rX1dP@fEnDO$=>rynK=XwX3c*4RRy zCP@*^SMiEQ8)_)SGMk+A;}~ZSaMk-nrIa9J6g?b7I4-eYa0}qsq-xx*uI|aDI=p+M zwl8I()cx6Ith%h%y9Ko{v^0%-eeWFT(rtYn#i+Uk#i>*@Sl#L``4Zpj!}N_B({Hc9 zN#rFa8w>NdZT_nJPAl_knWaZBcbn^3Sn%V~4Q=xvZOmevI7$v6|`-BBMy*jPLM!niB)x3j%E8Y+Cd*H zAcX)OjA~%oG0CBzOP_?a&~k8!gTE-R4Q3Y+gb8(*^4!@T93LN}9A2K>(vUi-cjqJY z^+TI-ItdTi;0;1loC`Xi%3{^ADT*z-V>M%^2OjShHZ+y(&Z;ujMCQ>dhId9C>zCHhgp@aUU#YR9?u=y zDl8ikS2Qfxg;T_-s`TIN(M~>ck&I$|S@6N~cIouW@Ck!w_B%8^qS;7AIcVbJ*Y_U} zdSt&BaNJ^06D&`TxT2PS;y7y@Co| zw5CeN(7~!lC&7IR{DfVfnM+~P+XT1Nfrv8A#+4*hb_I^)JF_!Cq68gXuXu--(yToU zz4Hp7GnZiLH!pZD%u5?iE|0X(0XY4(2Oi&t@GfY5p6oZsS#fl6>F$c=UOKVpd8hG> zyyLP*X{H-{6rbib8X=Y;+c^4xvv<2VPR8oN0-n|{ONpj8>-*?8>mM#C(&$`0i91gi zW3{wq{)k~OD~)>1$-ZaFRV2NsE52>Qu`QeWIL5MTqKUYr!RE2q%EUKA0Y6+Z3rLDF>4^^KPGl-i;zcH(_3RNLl-hF6ve5#{!Cy^kOlB0J@NwAcj z5*>3mk;<}?=-FG+LTt@17FqoDNDF-gQ?8X`X?zIn!V)ljbqR4=(^XNqCoi-FsvJ;~gNFME7Bd=Ba~@xI8nijSLd(m-Ntk4*HfbR=N_`@P z`AR=u&z_Hh&hWjyeIm7LHLGB#7?a=zRnc2wMNVap{z5MG2YE4{?m1q4adGwk*8E}KNLjAo#>K$8NIa9P#_Vt#uJCo_A$J2k)YMJswAn(02A8f9V*kF3Z;ug*XR; zlmRj*0CAso0d{xs?h0rPznHT)|ArwDy$j%MnsB#^Jv^8lL?4iW_&=ELorwoyL1O2Y zNiV`5kyHCQ);}p}4gA)848}V0_EP2fGCN3;mS*b3sh3*!S`v|qYjkT8+AOaIEWA!4YPZ=Q#3xR0T z*IQDe#DI9c^!ByZ^l1&sV;9AAN@d-yB&F%L&O{*!GOU<@5C9_p1*?AIa4LKeG=YJd zP6Mi3{r1(PeWkfo;-wQ}|ABag?H+rdUeSG&zG_Dn-><1PUsHVkagfQ~CF+*;>nVBw zX7b3!sGFf6jtr+@srT`_WMHHkjiO)%q-#xHC0wnS4@ecGrF#uE9YdufDP_=>?&|U!7C>y5O3IJ!Mp)g!57jQ}ic@xkPsMs5TugKTH zDU5@K$GFkua6C3=juLe3hPy2~CM5=tBAkCi6#60TEj|n&vyDHLf3A&aD1)@(~t# z_v5!`I^}@M{V%PiM$&Vn7Mgj5;Wt|N;;CZHG5CWdQ6jK| z6ER-BNqCN%OhG~e%R3}E;WM2XmP3OmVH)Jkln|id;0xTueUxWZGx~x%?9yE>jd;c7PP^S`>>Yu&lmZf9^M5f6==iH4z#wj5m?6Q_NU*0nCsD)a6( zruy=@K2FT;d==@EKVDz?;-(3mx(E`a4g31h^oYow$=itM<^(?wxgx zd?u3b@oQ0o-4$hP@?1KOpiJ}(iJgEbdZXM;aE%yKOd3a4!rHU|Q>I8?fwC)Y6uC-0 zOFo>BxxtXMNRLe^l7yU4snN`KRb~dntxdyDX!gN-ZU)QoN&D61hf)FE{J`4U(tIcP z5uK#ZH}x-@HoKUI)u|#Y8JjoMaWdk_li6;0T!Wiu&b494cio$%Hx(W~=Df?_Kzw2f zxqW21rYWmgyGGiFK?O49IqHZBA4%IY1&mQgfIo}Z@U#FhyA_nAh#x~b6*G-$H~j+1 zdGyCINdlAt#;cj+oR}UL%VjoY0MAlAzjl|Hqs^hL74lz7f-%lmp)-|iET zCd!)-1#8YJ<0P(50G^B+6zM7OiVi#`5%)sl0)=wwk%KB;hmnj4oY_xz^+HR8gO9^|BpQ{ z_L_Wq>hsz!e4i*~$>>vu-TI)6PB@|-c$0|bNsm}lhV)~x`Bp>>nig+iKJOKh9&wnR zS5Aj*-Mu8e$y!q@hH~_yQ~VZ#?tv%Yx?SZyFm0PT2rmP2;PZ88)_oiKpi2;*?5+@q zCo_|(G}flASb047~7Lmss}hheUK$*Om| zS8~CXd<(L1=yJ!cK%1Lqo9D|v@JHAA8k;5g$8->pj28PW==bc^?hD`NeK?De(fU`l zeo3)F`BOgc-mqH}_0`90LsRlL9B~}b(ZFyt(-yX(@~zhpS13yL!P$LviT1m^RSVu? zI9L%S!kAm$#fw+{OAJn5qB}5Mf@-ijNLMI07!e`)N60xctISlIx1~43tI`FxrVu_( zf7icWl?wtjLHc2t)fn#)D158s(NBsp7%Arv79T1*^+0rlkZ@Gvb}kWaNDeto$gekO zqdNK;rm#OQUC8>iB^5Vd6<)GA{K*YZRH8Jdo?*l8OzHL}jvS!{V(r1vVbbXI|Di^X zrFU^zi79zj4*=w~t{bu>B(kT(2{3lF0s=lGOuyHy#SNZAbF>%lQ<8b_mniF=ZSUof zsxZ4bB|y-$-g2hlBs8Ru$2R)FP;Fa?9^pg6xgIEGuKSa(Ca(`}qYYM75F;w`EdEkt;BN{c>6`w>_%JKO4ymEy-yVHsCA-5NQ zIt|sz0N-?I6q$5!04m$bmJ!gwxmYj+kD1IE0rK5%wA}ZpNbBZ0OMdUNsHtIHFmv8OPD{F*tdirH^L0}otCCQP|aQNZM#Fzi2c1mso3S6-#7=93_FVaK+6FD;mNO@X~D$tDM*79 zB4E<1b(#;P@!_xNYHBTrl3)XXK>+T&3*%jBJ4Gay7VazHm@b`9UC`L!ZB9X9*>htP2E3f0#S&GwsOVGqYI$Aeq50ie6* z2mn9;B4{;Xfd!H0RuaHv5#4R!ledC!aemU&fnD*u2}mA-Add=^02nA0<^bRTwh6dw zkY0pZ2_3C)VWh6z+~n35c1OkhJaG!jg3@Z&wzZVwBO1EAxj1_Pujp7dJ+{0!|5e+| zd&DzPT?7u?0c4Nf$wV=hlC>n_7!r(B4d_z+9u;*0F`5u(%_)3wF9Rv!MQcXc&sikf z@w08)Fq#IhhkQd(;^W^nU?IgJeJ9&^9Ay^{j2u=_M8mAo_q_1s68K7nYuwZAKk(-~Td#?v5|T6| zF%$z?RecdcN(I0CxO&DO(0AQ@Npjfp&xF#^Y_~?dccC1p3Q@z}od)p!C|?mz<<8)E zPn-ovgtxfgL6eFnan=Z{4q1wEtE<6gad@7%njZ2V*9;Gx~?Tb6!! zc*!F!FXqDDCI7n0XZ`&{B~3L~OY~ZrlD{oy7Q-0fm>K-*7k4-D?`S@l{<+?o{F|!B z%wIxNsLuKbJAI=kV2_7QHm_Xk8NT8I0SImIY!glrO=2eR(+ud_wwO#HUmM<2e$#w5 zM1OL;cq>xuLIa%ebxJs1Gc0tdl@z8tEtssGvU}mST$^Psl_m_HEi9@g4>4;s=JNP@ z!xC*fxMM1Q{{goZb2TYiu&A z8>sxfU6t4S0`Rf+)=GD~mruX@)pw9-m*R8{0EpY5ZEC}caCnly_A{Fpk8QONfgfDF zb{3P&fMTGX%&?XBTd^O&p47uKC(U{8cJl;%wv4(pCe8 z#EZdsQ!I74m+G+$8~-|&WKM<~?Y$Yg@bi9%{a;@-Mf%wc4iD<71ge~Mv-K%B!|#&! z>@f-2%jT#k1r+!fpDu%4 ztLqp6azJVXT0cD7SUmldOo6TjHW*Qwgpa{1Qzowor8az5rqt{G9h#$eBT}Y+@}dP8r5Tm$C-D|2D%97O5^VuQI_z^ zo6UV~5S;(q9Of5KWGe2>y+zg1Gwu_x=XLd2(lcE#_5E$}^ABS0&Zp)+cfZGM$xNFZ zp?^Wx+*n5d0N~P&VMz3ZbLPMxK0%|&SXRS> zHt|*?Ur3@V{&J(X3ueNfO*obN(0*JQq?HPmpLN6gb8XaV5fl^$xSNVct$P8Lvu8>6 zsU5M73Z-9|>N60nYuaJEA8%H5(E94b+4p!n@W+12%$cm+%!AghXFJ1gixN;_V{M_* zSvH&>upY$O1gNqA?o8_8+pGwW&x(=DFIIWX(h>1CCLnXqt4^VpeM~evnV+XN>ZRby zi}GF7xWdpA@hmTU)1c*MwO~uLv2V&hls7_tHkURPGmxtlWd?6CX$taEnb8{A0m=@B z-krUt6yrJr=z}^)S&sYYt9NW!AyG@vwhq2@r0P!`z6>*Ve!&i-DVnJ(rP?uJhM$XN zqRXm}YU0Xs27hTo^w5EABbGD{wQnj=^TOgKtu<4ZA9lgmhjfw=`=!6ulNQ~0hrymT z6mz0ATEtJ@UyuIdD*3lCqSDv!PdIDT!kgYOlVyHOxsK{|AZx1?n#BO*;A$cOWa zIcFn_m-;!s+S6<}8jyZ)@ED0rk{NJvYnPQ;T0 zCeCuc!!}!jeLO>7oV;{0R#HicY~0Cv`VFRxV*!^$9rzR@x;?D#G&QXyW7V`WbQl(_ zxVf2wdSbP1;))|l30*#tb|};qgaL{4J6r0^?`t1+a{kIueSqPL3TJafy_nofd31Vm zd~33r8`=`wb0-MBTAVMwH~7=1MNz-kvZIbty*ugKt1>O8L^lwWGjTn zP}9|~1<&bRIu*TNy;^a?|EyqW1gV|B6BOJLng$r%IO~ncNDnphas_^U%lKDa!t-#R zylR+P!hYcUMYeKHV-GYJMUOHwwt5)P1xGv(w9BTN^b<7V@2y&SR7^HPp_xgb;&@0B z2X&TEsn{CZO&Nb0VOJ$Lha{d`}cgDAiOmARAwEsZ~TQH@gnTbTbN1InJ{uJYl1*|hD^Ov~v zP6QK=yGH3aqs>H}CwedIXh00Ax?V!zR zxSsCHw+SNS zQXvRe#|U$yr$+oK>{J&gysg9)H^k4|=@0)A+Cv)>g=mc@rz(aBIFd%a3ACft;%Zxu zq36|GCyVYhdm5glf>Spb;YcGF)6^Y%+*0H^PXx(;$tPzMKI={DD&uf{?vaWcui*5m zws4b<&BB9AP@vZ{cOBVnnQ5Y^li)d58$~#xDi? zfJ#KD#O7;2a(rEgnjmuf%9IzlcVANNU43^HQa81jh}^RhCXzP9g%Gv53NXpV z3D}AFoSBXNZTx0rtdjP0|IP30tz>PQKPxumgDokl_+Eu?N}STvi`1$g;I*t7Zh^1 zcWF@u{W&>;;X$Prw0v+Ss^st?$^Kve!l~PT%fI9DX7>Ll|E=z)1bOMkKVk=d`VcVa z1)G|^I4zM=CsdkN&KPmc1qg@1R1v@d*rP~5H^K{zX`Ff)(u32Sh-{4k6u);M^a2wTm@@Th+M7$?5X zomK@2Lfw{AfF)V79@QOoa2Y#Zrz~Q)oEJN}4Ipbayz((+sbqBi7UC)+KgMb{j)Gi0 z&gbr81vaonoA~=!FPJ}z4o;cAuLRX%(I-XO@|>^s55T!XuZFArYUAwxlF###+W7eaZ2A?YVr> zp%4ymv}&)|fo)WHX4r5k)f0#1TPs&;47|Ge(%AByrw(k&^vz%yr>?wMj%R3BLPH&D z@;^w8V-R2j+DOP=Uhu+3oC(cNNYLxjF<^4v+dcl5 zE`hDx@&1b`P%ct)I@>gfZ1VFU*@P_hO?#RvKxKH4X_aU z>D>dx#TU!`&AO~91J4dg%+)$G>y)tA>&{{XB4Nqw#mMUhDcJ@|J#`izwD_o6=HC=6 zkv;6UF6Sfw8UTEX`9+5vOlnq|i_{<|L7ANSq0%bnEvEAv6cMG21H0k2Ho9`Hm4N)( zwFpA0YO}l;0%9Zyonb<>?mt2u;TiD)Qc&b#gmL4sNEgJ5!;CCn!D^slP48+#u?F{R`vXRN_eRW*GS^JLDLyTVr$WdN@j{SV?c`DU?=_q~8Jbt)NDl?| z5AL%lIdd{L8HWB0!(!7l_O-p2I85=W5^PBU+=6uc!#Gdrbiu*%v~u=4f(#WDd=LTV zxP=N9K@#KeG{rG70KEy)E)qZshLXYwP&Q?8h-#1+{7;%)nQIP2xd~ayk;YhD4$xY- zRz#s{K~{F96qNK7WKn2!0}vQD($U7&u|SiC&^A$pI`1tx6Q4*xiM8{CrZ@5=o7L6~ zhbPyM+G<=I+l-c!7}ar7(wY}TkB0^7J+?Z(cbDm{O?Nizy>;9PUrf;ynEL&^-nURY#W6G?t=kwLl{OgV4As*9bt^MdxNDU!b9aPeo&4V{5xs zfXhe~l)`@~1kcl@u!Ru-=;-(b8Pzbv?fmyqzSI$0S%(0$R!6+@qx3I)UQY`G0ryF1 zl>D6F-g3+eFcms)_y26@5SXJUB|-E$0Ef7#h7d!wt#(|YFgKfr!}hpIFBi2o_1>!? z+r`b&O32{V!N=vQIugsc&T2pAZ1Wh$WH$<&dwv`cE(8zH-)L?Z=LYHizk21}N`mQ% z9ul9+OY9HmAoS#ky5{m8I(^!>!aH{VxBpKt&57SZiy4p z$y1`5@K@cTLH+MOvrNuDJ?*RMf93{*f@!o89->l6P+Y`Gxc5*nx}w4m0Ns|W<&@P}xA;UpYWt9kf{veSP>zgcK)fANvs2|JlFRcwma ztbbvH8$9Eqca$Xix&*86&TZ_GN5Zds;#MhZQ#+cxu@AcxD=wt8c=BZx$_@U>TXLDG zb3&gacV$mFN7~8uTOSv4b=nwaGB5*_%rhh3uF9@D#AwL3?nPbxGh7Xb*kJ)Q-yKCC zHQdBT7?bfs)*|;Jf|0rClsA>*W|{1}QoPD~`OX1bsQ-J$AQ~sRZ|w3w-kPb!h)S*%oOLJi6+R;|`eS$QY6)&3aSkvEmX zJqS_iDs!$oD1#usa{rR%ZYqp@nRQk2Wb$Q(Wp}Pid)i=^=w-TDHUj{FYA>_csMpMB zBb-X9c2VQt1}kO?2aK?zhCKC+@0mtauvxM$8^goPcA0JFL1gmZnE;32DzJb<$6hirS_zh^g%Zw`6;f1ryl$xzhdI+5bJ(r1$m{O%B zH%|_V7GjsLvlY!60!UudaYRrhl=NK>m{Stj&9-|pl18Fl3u{nziy&kROaL*cN$M*B z89heu(F1d=ER*C)j0)}ov`P^a2NlY@ReiOSemdRW%_n2P>Rz_V>3Ui+O}HHU1QcB?_99q?E2%zYwONSUUN^;at%@oo&v%} z)N8@A*H_n}hPAd(*x)?Vl2k@-z|{i~?v(J8XY?z3QeddEX?4lsk~e^uWlC`@g=% zJA+@?x?YkMJ$Fo&DUzN&li*A4Z<{oz*DleX+*zhJ>lSy_ryZ$U*x`7aEkB<=kd>t$ zX!YQ=`jgR!@|NA>?_UWtk`hD4HUlxXLKFO@e}q*8%}QrDs)hDie_EV!>0$ELj96JgVC z$G_E~+|_*ZHMHX;-D?}4Kbem&7H^0&A3EvGjtP%-Brm}sv?R*_(0{pL@Vzg2;>aPi zq>ZGtQ`h5!OPxISaGG!vg8cnRiQ0%jfg7@H5&MV3%z~1{3c%`-EC%uN2 z0R}u5WjaKO{c@v*5r5)8LZ>*7)}{eOH0jfXy`>s$1AyVvaO7%ug9e+uU;zZ~9*+CE z`AZ-84aet2{wmZMbr{A1f&*x2N_NlTIOK5My+#iV6QY;i+>NEOjYb;_{+tO}TI$GJ zYB`XRS|47N&nd4j?9aOXyx#D&?qmb@=K;yA5^F(=jVB>`ko6lraBlEPA^~+#^$VIL zcGgbTtBV+(b6U;0+}4AnIn8_3KO_@ehBXhXAFoXk5W~Uv^(JA4WbwX2tTh?)Ci@4@ zUp@``RStX1avrn`Ci+vST?9hGa^e@GT1hYf8$Ol16O*E<^|^y0(bcVp<#NLZ`=Xap zG*7Mn{Xx(S4#|AsUGTQsoyajI%>3V__vL*icpPJvHx6R7A0Bh<&6vN*yUV_#0RX7n z-D1nY%7)JrY-?;%jk1fg^QEg6-hOLKhCe2_-(^#8ro!KXwj0A?GiE8WV`Lwr1^7Bx z$+FSN9Xj|k9C9-@J4FD{LQ)!n0`_hi!uGhL0$*En^YaREqEKj_k#Hc!iGbFow0hs6 zx>^+CFn%{q`p36_gwD}CqWplhFLx8P1uENRS^#eLDtuP1_vGCw$Uw+&rDHE9$-T)l`$T7w({Utuxs3KJW-!t)qMQKsD_qp%!A*5oNa0`ZcA_7i*LjJ z+-;z+)>eP+_Z+cdwWk9hm7W((X=4bYhNH?lSim?i(um9`loOoKZy3Nz<|;7Pz-@*O zB&_@DqQk|XIyw}wKz}&wf>L@N;UXBp$bg1TBD48wE5m<0#)di2$mF(5EZlHd@=Du{ z)pZ)TaZCDs`%<|e|8ZKM+rhnZzc-bpa=K2f_o<(tX5EiZM!zkV)g&nr=41<1#J`I& zi~tYgCgt|moT6)TM(^o_cs%xtEy7uW*xm*) zz!Z^?UcgdO`n}8SKQHGTNnRYJ^sEaFNoiuA>8M}|J=48Qk81S{pEU00dI>*>=Fn88 zm!CriIw8N&kH887j22>4uDc*)!0+o4E#*%+2=I``O!2Eb-OGv;GnSHdPVKtyi`%2l zZS>4ZIvwM{+^fA0W;s;Z#jtV&N2pWAgA)k3a42=y9y_@AONEze4ZPfb_!5 zxZwzb(P*+wO`Bm1G1T`X4;o`b5eXt!ROO99;CMSEp88p63o7s5G)Ycc%{*FrPH#er z_vrEqkic;233rl`_FC$bAP;{hCnsmem>luoy{hN)t)_MkB9l4QdTzgOw*-2Zkg_+Y zyXH}WL3XWY7hNt6-svIl^6YuZI1TLm7O}^}_6-%_K!4%gR5=H3V_CMU{uUr3plu*e z+Hvq+N33c-?mWlbGEW2h_1nZD-mI1KyKz&MwP>rA3WfVM#Ol;fuJa7_oS+y6edYtGvp8rXit zMaO{S`IsSe(>|Uj=bsHFM^e!H$Z55h(t7Y8Cs$UGs{OG3`w;u<#m`qqYRb{9*#{?{ zr%?_;dLyr$`@SEsd~!CrvwMFwJGq_FUFNGp8@Xs*7EV$)uaH+7NFp2uehX^@rsE_6 zE6dxsDjeJ|s^@LZe)~J8fbx)6-4X=Rnx)akS_mUQ>)Mc9uNTu9*ZzaB;Rz-` z*3zwZ)0g$!0E7M$G~F8JZw-%?@d zAS8KciCjg)?UEfg@!c)f20+|_x<>$xK+y(@94ied3JC$BW)ZNE*y4Db+Pg>o1}2414SH5(L+#O-HYuP(5kIx ztZ8QnojkoGX9>brqwEKM-sjg`y`K4+SAVOLY=VS$)bA(J?Cd`)}V z#n8>|4yt8InjZoqz4kRy^iMUcv<5tH>xd{`W;?X>=^XKGEt$v@!Gz5Y9=o;8LgEF4 zQ>TyzA3X}2$gX{Zo#l}g1k8Fl1fVB${M~f`z5PM1NUH=41HQ<_K>wjIT^_>1sSubU zuM+P`!UTPcC1cIwAP5=C5_g^xmz%G*FNI#fTv>Xx1dYO#^!AaxgNVpqY02=BR0uw4 z0}dV^+3T{LkN<4w5Qm)TDeCbX{`+2y)#@1Lz?!%FBX!U7hCXiyJI_Cy>AP?HZp>6b zWE@=~sQMKm=;D7R;<#%8NMusGqV@slpCG2* z_9XV%Jw-x-*bRf6YnUR0@0yN$0zu6~k7VG9YO?+SiYJXe-e+u2qKuBj<5njJYmv_j zxU>vJ8o1&{oMlp>F`}}f+25HcY(~>F2iaul@}nTO#^Gd96KXy%Ftulv+hdL4i4D$S zn&+U=#FE{3L@h-%+qaF35Wie0t%qLuhX)eTZ>(;=V6t5YPJQPd9GVi3G%1=N^x)T!1Dw*TX#~%Omr0&j|MaSPsAVR^5y0Yq&}wP>NNRKZ zm(a7#TkX!iI?a#2i}MO$wbx{j1f~ZY56b`sY6=ZP5(BTDY7EeFhwK6=gec1wVxE9u zg$fO@0;EQkgHnF%XdWI1viDK@Rsk;`mjG^Vf><%2tjs z4M9L|`rX4%s`VeCZ#b*c=Yo8$=j7}SRfCv>V5)eF51LPKB}iP9Cwf<8kERklw-w{R z88fLHKN1QoA+s$Y(&6a8wkKU7gc9f`8Q(IJCr+=r#2goz^v<6u9Ji3(?W6H3o( zdvluc@x*OPHU1+MnfKKe$tN8|E>L?Aj>!omP77a9rl#$?cvD2oE^5km!up8q5kBu= zh-624&N6INL%Cd{@cvWV!8y+1z&}Ymg77mN4`SOmjYPI8;?)AytiRz>M0?D7?1UO& zl?IKCoiE4#_O-rDbP?1yrU*i$VUH8O&(XG~3e&r={}%59!El+H+9-E;lpo zh$koS55OMqpBX(LW?58afts}-;>i-Y)rGdq%+kK|nM-N?*g9cxOq4qxF}lgJ9y5Q3 z{fouc`6=E>Cxw+HNHCwTO6g&wad5k#}Y!Xqe)bmC(JTuDE-yG>~ zV{5Z7I{N+*I>*WL)8XQi?ztz};1Isa5P0<6Y4+J8L0f_LD+7(M?y1y?ppcI}d1?hGD_y@@^la@kIi-QBCb6VS8s_UVu52Ux6oSaMKNOP{hw z=b6y-{RgQb4IaxqO)19DGhSvRMeYr>e}nVm-HiUkDab?kcrzu$sI(G*4Djim6fJ6b zM~M{x^3RD-RB$@Aue0)A3&`O>r9f^)V@R1N3MZ*mS^n`k#gYiL-C0BWCpCOk>-88Y z)^^e;?;oMh0E)F#5pC(qNV`S{+|Lf-wmuTyvjiYNE^A&|8!S!#h>e8|(Yrbd_dncR z#_5=hjwVe?l%JsmjLsRo4r`C8_*QuJL@H}mShTtDeF_WC6lY`D^?$zvf>gG~*C#?Ui_W^z3>+0!%ZULD$j8V#)Ka0k1p4$U(*jPx9f|}V@jgEX| zViak{nB&+UrVTM7J~8g4X_9_=zrD1tLJ(_uaBZ6!d=p_HU|s*HH$A60lK>pB=zs+^@qO+jT;N{aL)al9LwHk(fASSk{!6it$F{q zbXA?n`ERhPrM&Z5R;+aT-Xyun%(=yvtc$DkVf7OL3Li(O_6)_cr33LpCD5R(sAr-L z#J9&%gohQj(WS5^G9h9F7`~uBB%#ZGvaGr&ujCUiM->iE@ffvVe&hpwX1}%6}z|c*TUS}xTTKjcpV`gc`b7TxEmg&171Y6M+lr!3gOC`$|gYz zYz?YwB{Z|eXH+K z5T`sUH{Yo%;gDdb4NQy8+eG4iPhPrP1M05tz@JYUv{0zo42`3c#Zn8xud>XzgOfRA zf}jA?e?WffZ7BvwKC$IWw3kdLg4Kvk(uB1!84%2=Xuoi_dHguER$FcB6%SF`>Sa&! z;a{pf6^DW|??WE3>r7bL@JKg4B#d9ujV)@bSDT396J%Kn ztQr0@ArN)37bD-v!98)Lz3FFZn}D>2Ce`1|KG%Oc1BKccG$J6DO9?T`ke*_*+NA3B zX$c7X(az`O629_+N0_j_Pm8x9uD@$^PGcHY-#IWt$y0|Dl~{*0!H=MiwPNlu{HH%$IsInwpT*7wK7)Haw z0X(q$y3SRthCOt+oZq`Ma=WR{V{t55P=l1{p*z~nwM2o{_#If8_Bc6sI1#s)! ze1~B4Fe=Ky3gTxxFth$6*K?jvbG+y0WARUda%`g6C|6^|zBSpNCa%s%8{W^7g~i`n?j^oefjI`z?7_yRsOz z6(*m5whX%wsVuU2`+MTBXA;PwAJ%?@{`9#P5ALE3l2iMxAA#w5V#-(Ao2n& zJk;U~Ak2#sfKxELSM4r|pp&MT6iq;yPRO7(eiiO#p~r89cJWUm|Uq15+b-Qy*SyM`+0@E!vhAw5WuL2#J_Q(E~90q zN@{+1#L4T^?NJDeF~kILCB7!gB%~(?IZPJgcB#4Pkm!D}6pYWM)Y_I{rPJFiiK!wt zxYx8B;cQ#$M3bZ_kpEPIrr}ip?ZW53p&u|j8{HluQhhJOpi(()4d2`Pwq#PJ?C;BWdSP|Q z#)mj+VDRg&6-* zGWka_-@J>cGc{Xyz;Ga6EUyf>6wO%k$hV8rI*<1Kl)@W;lrbMS4}(DZR5P>)-hNa?Dh2@ z>~CsEinZ0E{|-ZclJA>3rGXX0XTSN{8rY}M9d7A39EesqMKck=&C>M zFSD_EgzcbXc#x**J_@+i;ZYNiGg$(~7+Vd!p?rN}#-CGK74lGGHUe3`sJOnj__WRL z(S-1xbKE-ci49wEw{~=3S8U?cJA8z18iH z_zrT!FR?Pt{fA*#?4OU#Zp1$(1>yQD+W;u|Uhh;X)(Y}E7<&t?^h{|;#WYLS+(<%1y%9%pU@sq6tA}$-RZ<5s47M- z0|E{$t_b^Y4AXa>*K#&oem`{^lg5SznK8V_O2u3pN%Wtirgi`P%do z^zz_*+PWcs-uhkG>Bo-}1}e1&B2qqrVT%E!K!8ub$C!!|ZX5?VStuJz3>Fj4?;yZ z&*xT(VKIgxFbq+o=jhpUsN9g!m<4+hzk=bQ3lfDlLN~G`i783Q8Xu9w@G2k%0@;%Y zhIDOklgJ{K#!dM!60u4nuf-KUl~LD>fazKQKxPU$ARZVHG5C)VXC%E}IvxKLl4%CE zy}=LpKbaJV#%O8nsF>6ZsGf;dk%4rnZrau1UGvLZKt+SJk%;*jXKI@IZVqB|kio(@ zXRTX6;g-l%kLCyK2Jn2)VnVW$uQ zjE_|Z)>m`53{fdV-w-9q0iaMS%omar$7ZNtIEsL5A~6#d*t@wIa zfS4wMpm>m=-8CKxk7FiSBxWE$2n@C(qD2*iV1{H5gbc$Kz&-+ckzgb7L~?#zLHR`l zDVc!A!hU0JB4&>?JS#4)Z;v?AnQs> zV?shI7h?Awq{){rg2AXcZi&#jWxGAi7!)xD=q{sAk4&%`_(zBehuX^=q3!C0qrg)U z{h=ILcBv*j`#@J>eF9@M=aK|Q*p}JWnF1m4R4NYl3L~q-Y>Z7iL|+RTU$T{M_T#rw zXBCt04B8^Qgg+hW4;xk0h3#IRe=!f5{d2)Yz?9B0sL`F7nA)0B8$kBu`NylaCA$-e z6B+&P`6Gek{yyxfy;)G9x+94Wc?Hbx{I}PX^tmI8#1e0)LJmk3%_taub_8!E(*3b zl|X`lS$l*E2Z1g^gA4$qR22xaPZGr&FAm~}iv#gY$}!qx3n5X$EPDiE=5wD6{Ad>i zU!-X=kp%4cf58Txhs~aU`uoG!bAFCMoS26%A&nlFu&&JL>qG3tA}bJP#in-yvYQ>A ze^j4{eX;n{ZM&;j&1=pwox^+T-c_X1``wg862lrd8z5xvpOFcFA5u&%*;pzVKGR2IN0J}Mla?VR`g-QlmAeoKn=2W=06 zOD3WY+Sub6G@<8YdIk;hDR?R^BPG#Mb_?=FMAcjp>7meFC&5?JrLrKlM4TiD+|Wi( zAbCiIos-ry*lVrDuEoUmSVN5j2B>Y`Xl2E-LvhGaN2uWtfynU(4M5?e8P?GxuJ?fI z#PTLaQ?ou}oX=H7t`_`1-Qo-mct+rGK*X!Es#mu@d3AC$B=i((RQsOZQf~>gmPn>V zn(DK@ldOm~6M5C%rz+__7y6Ki^#urqLq0}=ODZtq`zduU`~nc+C>WkOqhd+eJ>h_^ zY_dPZgXY0Nc4SPcb9i4$^N+Wk=4@d==8T@0w`W-#;EvIaJEfH~ZL3OY5GkcVEWCW( zgCpTxh!#F7;8|e7_vVp4CX={&Zi zbG{KdOn=|8b?cO$CSMaFOXv-?_-BoCl0W*~3>L=D! zB15H9DQX1?iUw@jnW9mW+@SCXz?I1aMR0p#Bvf2&;I8o%vX7bQ1GePdYgYP|8&7Cj z1qt2vGNC4|c+VCbW~e7q5_rZougIh1f`e_HnJ4MM%&vr6qrT@^i1!%Bue`rz)enEX z(u<4=ig1!*EF0PbI7j9`@0|0ZRcY7JOnpN6+@t;HE-FhDu{(hbM;jNRK zB#Vo`qm!o0{F5c`xEj4LDW8IK^D|Nr^AY8$dt)Ib_UU>npV%`^^P?!>0)jNc6tc)b z6oss5&SuA?brMfKERZzcn+T@Fo2bI7cVqwaSABU`TN>;iAy=GC%X|txmzN-GfnE6- zq9C9dpwel-7oQYn70GO7=|46m2yjKNAs~%oT6|LhjiSZBB`ibR;qo&Ch3xv#o_kOnZDnwfU!8h z5JzUiYEtQ2K?Bsd+@fF{`Q&F}NJETUtD$9LEobn%37XHoxyiq%P@C??+ z7Waxkl!I}g90w;9G>{y>EdWr;N@5>@vhO@$#$)FcNH?Nsi6;D-##|@FIcKoo-y?1y z$`(IGq_u=O?}?Y4l6>rHW_F(n^Hx@`Gklp)RGIiNL$HS{TrRSMQi~H_4SnQ%GugRx503#Wg00_QF!C~zS&reTdc_-dg zTqySLAHkypep00doKCY~u-)xV+$k2V!nX@z#(>QiL2;P6aLkAP&Fsw@di+36J^EmC5;;W#w4Gj}Y3~zCV50tn|_z%Y7oD6wGAAJ*n76 z9PH0IBw^G))yan%u&N3`%|?k47QVAI|BPnIGIGRn?bG z=Iv?>`QXpl&4OG~qge{qQC!Yi5|Qn&%O@W6Mg2%>G4A&F;5l3Bd?BN#L-tENu?XS{~XH2GGKH#l%G-DEggE;QA zy=Yp7)LDGbNbz+njR5%E}gX5&WQ;N9_iYBIrPNioi}m#vSSg@ z;GPP~bM^aMr)i=eV8{&nQ^6!Np}_EjQ;mBSo5h^nrWyimRa;M%;ELgSVdJ=YwVi&b zM6X;&WKf}2QYaQOK1jZBkM!j$<##jvilmb6F7BfXHGFkYO zkFmVb-cOEc8%4Y$e;c##zxJ;3D+=ygBOTJ65)%wDGy;Ou07DHOgS2$1^boIfHw+CD zGjuly2uKJF4I?22C`hS*pdjew^~3#q*ShQeKHc*VJZqh2opbiyXYc1Z@d^(!3F-PX zt2}T!s7fFkD^K$IxNXu~sjfqaNCCnjNjTex`PE1Ys~>?BUEV+$~nEU2HQW zPkMG+NSWa-;m1mc*qMaal%?!0L;}QP!}CKCw@66{Gv13R+`om7Eg;VSa477Fi%nu~ zW}OK!qMu_1(h_P5IEyW6h*L9+@!a(h zS}(}~)j}GcDr8>S+z#Hj>any3IZcfYc=RXMK?5h)U<|)}y9^xf)THDX+$>VXfODMFBkbL#q8yLxmTUcoftRvX6CDz=^mA-(o0Uy zhw|MqlX|Yq8u{3pcwAM*JiFpMn>{pAReb%d<{H*sH=mtxEi#wYYtBc?U-QX3_~KHV zD^N#@w}3S*NVL*?Etkeg-h_HTT;=1jVvvwY%YrvO%Y2-~Z`|U?S@~3AYf@R+hp`Zv zg#yb$bQ5LO>wVS&b7=m92QDd94#8(h3*hwK*;Y2du`B-qdJyd%?Baau#>_{7FPTp$ zo{)}P20|kOy!k@2Q9Ccn!}f&-ve)Y`iH3P?u_kGmTg8xmbG@6Ka@y+4%UkdYZl2#; zy2#64*N~K>3jG@?tVNjVn;1_(zxgpMdHvlybS0c64jo( z3;{ocY7FgxM?XOU7_?Qhcw8^;X-x{_vHKn_8Iia0aPi6@4YaI{2~$>_k38d=RAQ5L zVchwCd>O-X*wQSV=e+kF{D{TX-Y2cm$Hg;|V%GJ@!n@$R2R`^`?#~XV<=)nN`lx0< zSrw{mSbW|&mcPJ$7N!s>#h}{8nEd*iYbdR+kHy*>vU%s1afc^ChZ-xrS2kagPdX1< zI;D|<|L|pqRGmwd`R4o-a(e5Pf}hU#wIGg4=j zXw{q1g@L++AZvw@T$BFAf`g&F>5`a!aRGT}T&}{j*zoLWQop_6f|&<{c`8Ax2|W{y zl2zt=kDQ4~-E__K)YB`E-`&D%qGf5KpQRboAJzk?%EK+xhL~>+^%U4e{y)l8fhG zRjL_Em@X;MVprarbj(2N#6^7WnNt^rQUvNaO5*- zzpf!+0tzNIe7{b_^7P?CEZ$ycJz`Z*#aqNEn`ET;FteA8!gwOzFY0Ap&UM~7&_ha@ zBeNG~m;SI*W$1nt(uQ&OAfirgf#jG{OK3i8U&r1ZR*UN~5ncGrhUb&04+-GtgTj3q zA#NJq3%klY>m>q>go;vcnJTWxaWl)=r`-g?6HIS0*pb4imYun>^Ro)GL*Ox?ApwEU za6l$W<2~_d-|&`%86{dpgu|qXboqmZ$b`0Cqy2xd`$W)9Q7x;eTTksNlKybSb*ud8 z5zURge&jJ)Qe77FFGG8`R=wS&yxd37osfdNt-=w?U+8d~1lp<;Hho&rzfDk z%m(xDi1w_Vf+!HYew(yQh9A$jQ{v;htYc;X$ubzXsR^PO)OF5TSwB+jO2YPpub|bn zS21fs3xW2mnj|szq*6~0{mpZu9$Fap)zmr0$(3Q@f%-JM0*BxRX=`P9Irs5w#=4CA zUMucyISYc*>)z2zx%u)@Hu8N-@s(j`RdYyr`_DNK@R@j!7P&jC?Vc#`hEN>1qVYCk13ZJ+yn1 ztT?hP5(6~3?}8+RG6Os0PVvfazM}bgm8H((HDMpz+BMAXc^$4Un;P+@C(Ndn{IpRq zK3QS{1}S;+JO9hj=SaMf68CMuTV2(Ta@8u%e9xZcjAWpM>S(n16W@sBvU7uD^>& z`H}7JOVgcA2Fi49ve?%8Kd0<21Dfo67lH77t~Wtn|5Y=S=~(Kir%7GTnOLH z^840yiRK;f!02g!+Sb;u>Taj5+E`J5LFLxxIenUm02wHhJ#UkP@)cATo+zKn;6>WZ zWFTY~8<%OWZiBdPRP3ho+r3xFv2ij8;^p4~~ zn54nv1t#Nap|ZJnRaM=)#lBCLreT6ZHkM2xv#B*|$RpUW>;z)`WV|C#na0+?{1o>KuV4GG(?lm04b!#(6W4*X`=a>rY-lDXUxi zR4B(!u#S{=E0@LNU^q{{>{%zjKtYJ6qc(e2Ja#c`6nkzKtY1X9PWwiu?OxG7<&*GS z&Bq&JTQ{u*H?2O=YZTiA)CHN-!U}hWD85iFi0GW=O;&604Q(1b_GwvWu}AGB9-=wjR*zMAp=CLa7LbG(HF#`f z!4;sLe4frNA-9wL8mC*B>WR-SSDPr9u&*1}>fv?EDiEOKGi-WQmEt`9g&x2cmTkoE zmnsG4(4QBzqfYO9;gJgcF>5}Wo8^SLXC zt@ZTxZdIQ)(ME%fK(_QZD=!yLd;$ks)$5S?-ZL%xp#q+r*)B5tW-YlUC}3e$)6|%8 z*$zvhfpl1+aTbU3Jk2;fC(i_6Kt;Tp5zUcV{t-*`sWmCyqzGm8VM;yj-4?3X4NJcr z@(F=>L7R?@E55e95l^4K*f{liGiAH<2Z_3)L=+$u>F^m0U8#S%x94Nlt@?<2_Mf{< zp+>UU4^oWT)aFd8Q3)Gmy?Q3v(}M+7;$g<@hGjb+=xL_>jQfYz%tS2k1B$8oo166p zZ?ACc+wMYt2fPlWEw!f!Zr?D(^y1D~P79xRtQ$_kZR^8wy`gn8cQ0cV^%{kTy>U}% zm#`Ua<^>dYSi6F~tXt(Wa0UL;^aQe9EnaJ)WL`_P40|crNo{r{lBl*cQLj}Rv;5m! z35LL^BasEA;*jk60SPS>^R#rt7oKvIA4f+hhyN}uA;}?IZ4F9~jK%bX%%e1GGt?hn z_n_8iht0t=ywk3K_F{5TyBN06{X`JKKjxh83lwZyP(H>uiW%lOw69xeY-3iR5QZ1e zAkT-cZjUT9?H!d$l?L-7(yWYb)v9GJc5wI7Q+RL=SOoBW_zYMYcb$G!zb40Erjodf zF&#}X>S=gCD6py@u=u-*9@f4R(U>LA6*IQ@D^BnU*gi~&I8P<$5{t60352Wo&F3jh zb!|OjEAc#a@agtxTRz<0{IjqmDX8*UeKM>LLXC@oQ^dv2Mw4bA-UUol zw*FQdlxZ%NTdMb~aGHH)gSRupI-D$_v%hL+X5Rh$?#U(&|C*=k^oP}kZ99wX28~K; z2MJVh@8sj(Geoo|KlS@I`|&j4z`NmSNz`Lekfd!^9d^I#ksp_p_BvN zHx;=D>LF>*b!_TGOkA6Lfg`w=i=J>RcT}SnSj4LvXVM6K<1?O7F0LctEn#}NnM48l z(rHvac7T+WkyEiY7Hj6vF->@%E6|t zzattyC@2jq&Mcp?r$GWPj*6Z(^?w3?Ez0dTLYQBlN?p!2-!Z)p;U#JCbn|KQ-`vJ$ z%RqLUei?S`WzP(R<>AG}X}D8icikJNI?LT;hEU$vXdmr8LY z`^8uq4Hc>LjGT}@XIRQ(AYYRq%8c+HnDC`cwGS&(!sxNlR#FA`3Ra*7T+hAyEI#vD zHjbT(g@Vj6eo8G6U{_n~%5D+NJaB}J-<9dJ6MNQdrwsOUy)W|a0M8MWD=HTYEoD0x zb)lh>PGJI^n!V}y?7#mSy3;bqa-+rm)I4Zuz-wd8ak4G2B z1;U%$FSVZ4mv~-geYClL!83Oax|Z4ZnNxkx$-OnjOR?f$TE2a23R#7xrGo9Y5kosh z431;JHJX>}qG&jhPR8R1HAW^;;rl^k6 z&Ymr;en4p&zbqBiTtl*`t7f?Kxa`RC zCs2q1j$NGg;Q7TJ&v8V12Y?B*6D8=LS>z zG}dYJI*c!ZpRM)#gy$E&Ey-=zunQRXmOq<&u`w95wQaHjAs{T6a0g@C4HbcxWq`EC zB$0jsWQ-M7x+(?(Po#h!Q}R1j6*)V{bmuzkw285{rU_vYH>Dy*dlFVMiYMg~gpl~jm|MA8>V7J2`4NjU**x@oRN2~w zFwNMg8zC}7#RZ8ki6r!(IExi`!Sdp zB+?qmHPTd9YNnM9bm4MoEVFwE0gkq^q-Vc@#fE0ANLJKk12acV6x~<6dC=q&O$#jI zmx(~Iby&}tH#!ljEVf$bc#+1f_!3O3CRZ#5YBU@KIts;mXov8L|L*(*c7wat(_o6% z>63qD^x)v04QIYfl6GjvFVWd1;)#|}vrQGTbI({hU@yL7oQSH$3bns%0wipLB*z(zy}Bs9X7WM52@ zB5q(=r!&JKO92y9Bs&EqBQpiiP?JD z@5S2ZgM{IP1nM9x=Lnpn-HRWF(M=qH0$EAM9#zU-Uvi}MkKtV0D?Y%;yk60gR?z*` z82ONzjls*&rLTIb`WjMD332hd|C{wUVU6PCA^bigAv$H>VQ>AtK<}fU)>%9T zFuEY9W12Izw!Ts+I8~vG%g^u2fAwpZCZ*JAR9m7KpsiFsp92)qPGWcU*=!(2VA{KAm7pG~| z)^Ya6s?%egn?h^8fL(Lybx7cP$B(p>yzo5eCB9zI$Ioh}u)|@H@+&jdhy!(!kf0c0 rA*Bx0fAeAXpIZMiR2{uh(sZb&l#oC`ARR$KK>VKq|9_nS!4CWvv?1bu literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/fuel.mp3 b/public/assets/themes/default/audio/voice/fuel.mp3 similarity index 100% rename from public/assets/themes/default/audio/fuel.mp3 rename to public/assets/themes/default/audio/voice/fuel.mp3 diff --git a/public/assets/themes/default/audio/voice/full.mp3 b/public/assets/themes/default/audio/voice/full.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4a293c3bed44a4c455e9a627d315778a9cd69d05 GIT binary patch literal 29206 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
BDJc6LLh={^=^2aaZyF>;O-yiT53 zgA2o0AU3-}4aO&+6`YYb)KXeqMcbm)juGRL5_OS80_vBLW(FlXK=~*W42xJ$aCu^I z_wg}ip;fW2;aX2t>|kDxX*0K)@yIzi6(#cJ_`6{nGw}X}#t*TiC*OAmB)>>41&ZQVAE0xml@g9Czh z*2>YGzM0j*ZN~kj1@@qLT%@h_LWo-K6m8fs+x-;?k)k&0O&vFPiQwtz9jv&KE{I)y zVnRQuJkjpBhBBWR&@!y6S_(p*j%lb$CIQ(bcf_h1PD*98*1x^Z``B8x(>bsO3qj2b_1R&1DHZy zU)4h~&@_we>@=Z^P?MIT1l8klCr9t!8xk!~S>?X8IcLWEx%~4WtHAQx?3I-o-`5*6 z7CkvTyI)4HBWf@LbgPQXy?-!VbgxQ9N97QRXOAr6q7kwBbaWpT*zfGT@`03yawa^h_uZx016)FO3EG`~8ZJ^pu1I}@}RZ(&5?PFdhDi$&h zZ#zp8>`!3te~0&#@v?Nuo9f{4@sg@59?d3-K3!LB$zikElMci-wcMM~ddalRjzg#$ z1a6tB1{IG#O^~!CjHKZY_NdmBjDt#ELbWE3cFn|o2wddG^fL*4NEMb?U27z?;--1A zx88#Ts`M6MW()Xqto&%Kd%LsB3o>R~A1L3kV%^=+bgi%^_eL7*Fw2bTKd zFjNAY4`Wn0iHIOxI^4zDq>Ny~I{=Wr^2LEgSr-F8NrHt^LUpJw*jjgjLec{OfPaL_ zVl#zACzOEqy9C5peZOr*MD?0}g$QNZY%kZRy0O+)A%#V~2!#TvxCo$Y;2etL`D$Cn@AIj`VrP&SoUMCWUz-Q-SQ(GmpIrwabIWj{h zH9$hUi-N7%n?GWwHyR*i!!J>OP^95xbH7FiHD}lLzl7m$lC)3gPCQqx^s9e6n~#rA Rm%_&f_?z+n5B;w*@Nc!7&+`BP literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/voice/guns.mp3 b/public/assets/themes/default/audio/voice/guns.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..12954604ff48a3e69c458b303ccf6fee6f898920 GIT binary patch literal 28370 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
(); + + for (const material of this.scene.materials) { + // Skip duplicates + if (seenIds.has(material.id)) { + continue; + } + seenIds.add(material.id); + + const materialConfig: MaterialConfig = { + id: material.id, + name: material.name, + type: "Basic", + alpha: material.alpha, + backFaceCulling: material.backFaceCulling + }; + + // Handle PBR materials + if (material instanceof PBRMaterial) { + materialConfig.type = "PBR"; + if (material.albedoColor) { + materialConfig.albedoColor = [ + material.albedoColor.r, + material.albedoColor.g, + material.albedoColor.b + ]; + } + materialConfig.metallic = material.metallic; + materialConfig.roughness = material.roughness; + if (material.emissiveColor) { + materialConfig.emissiveColor = [ + material.emissiveColor.r, + material.emissiveColor.g, + material.emissiveColor.b + ]; + } + materialConfig.emissiveIntensity = material.emissiveIntensity; + + // Capture texture references (not data) + materialConfig.textures = {}; + if (material.albedoTexture) { + materialConfig.textures.albedo = material.albedoTexture.name; + } + if (material.bumpTexture) { + materialConfig.textures.normal = material.bumpTexture.name; + } + if (material.metallicTexture) { + materialConfig.textures.metallic = material.metallicTexture.name; + } + if (material.emissiveTexture) { + materialConfig.textures.emissive = material.emissiveTexture.name; + } + } + // Handle Standard materials + else if (material instanceof StandardMaterial) { + materialConfig.type = "Standard"; + if (material.diffuseColor) { + materialConfig.albedoColor = [ + material.diffuseColor.r, + material.diffuseColor.g, + material.diffuseColor.b, + 1.0 + ]; + } + if (material.emissiveColor) { + materialConfig.emissiveColor = [ + material.emissiveColor.r, + material.emissiveColor.g, + material.emissiveColor.b + ]; + } + } + + materials.push(materialConfig); + } + + return materials; + } + + /** + * Serialize scene hierarchy (all transform nodes and meshes) + */ + private serializeSceneHierarchy(): SceneNodeConfig[] { + const nodes: SceneNodeConfig[] = []; + const seenIds = new Set(); + + // Serialize all transform nodes + for (const node of this.scene.transformNodes) { + if (seenIds.has(node.id)) continue; + seenIds.add(node.id); + + const nodeConfig: SceneNodeConfig = { + id: node.id, + name: node.name, + type: "TransformNode", + position: this.vector3ToArray(node.position), + rotation: this.vector3ToArray(node.rotation), + scaling: this.vector3ToArray(node.scaling), + isEnabled: node.isEnabled(), + metadata: node.metadata + }; + + // Capture quaternion if present + if (node.rotationQuaternion) { + nodeConfig.rotationQuaternion = this.quaternionToArray(node.rotationQuaternion); + } + + // Capture parent reference + if (node.parent) { + nodeConfig.parentId = node.parent.id; + } + + nodes.push(nodeConfig); + } + + // Serialize all meshes + for (const mesh of this.scene.meshes) { + if (seenIds.has(mesh.id)) continue; + seenIds.add(mesh.id); + + const nodeConfig: SceneNodeConfig = { + id: mesh.id, + name: mesh.name, + type: mesh.getClassName() === "InstancedMesh" ? "InstancedMesh" : "Mesh", + position: this.vector3ToArray(mesh.position), + rotation: this.vector3ToArray(mesh.rotation), + scaling: this.vector3ToArray(mesh.scaling), + isVisible: mesh.isVisible, + isEnabled: mesh.isEnabled(), + metadata: mesh.metadata + }; + + // Capture quaternion if present + if (mesh.rotationQuaternion) { + nodeConfig.rotationQuaternion = this.quaternionToArray(mesh.rotationQuaternion); + } + + // Capture parent reference + if (mesh.parent) { + nodeConfig.parentId = mesh.parent.id; + } + + // Capture material reference + if (mesh.material) { + nodeConfig.materialId = mesh.material.id; + } + + // Determine asset reference from mesh source (use full paths) + if (mesh.metadata?.source) { + nodeConfig.assetReference = mesh.metadata.source; + } else if (mesh.name.includes("ship") || mesh.name.includes("Ship")) { + nodeConfig.assetReference = "assets/themes/default/models/ship.glb"; + } else if (mesh.name.includes("asteroid") || mesh.name.includes("Asteroid")) { + nodeConfig.assetReference = "assets/themes/default/models/asteroid.glb"; + } else if (mesh.name.includes("base") || mesh.name.includes("Base")) { + nodeConfig.assetReference = "assets/themes/default/models/base.glb"; + } + + nodes.push(nodeConfig); + } + + return nodes; + } + + /** + * Serialize asset references (mesh ID -> GLB file path) + */ + private serializeAssetReferences(): { [key: string]: string } { + const assetRefs: { [key: string]: string } = {}; + + // Map common mesh patterns to their source assets (use full paths as keys) + for (const mesh of this.scene.meshes) { + if (mesh.metadata?.source) { + assetRefs[mesh.id] = mesh.metadata.source; + } else if (mesh.name.toLowerCase().includes("ship")) { + assetRefs[mesh.id] = "assets/themes/default/models/ship.glb"; + } else if (mesh.name.toLowerCase().includes("asteroid")) { + assetRefs[mesh.id] = "assets/themes/default/models/asteroid.glb"; + } else if (mesh.name.toLowerCase().includes("base")) { + assetRefs[mesh.id] = "assets/themes/default/models/base.glb"; + } + } + + return assetRefs; + } + /** * Helper to convert Vector3 to array */ @@ -240,6 +450,18 @@ export class LevelSerializer { ]; } + /** + * Helper to convert Quaternion to array + */ + private quaternionToArray(quat: Quaternion): QuaternionArray { + return [ + parseFloat(quat.x.toFixed(4)), + parseFloat(quat.y.toFixed(4)), + parseFloat(quat.z.toFixed(4)), + parseFloat(quat.w.toFixed(4)) + ]; + } + /** * Export current level to JSON string */ diff --git a/src/main.ts b/src/main.ts index 55436df..4b9d78d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,6 +27,8 @@ import {hasSavedLevels, populateLevelSelector} from "./levelSelector"; import {LevelConfig} from "./levelConfig"; import {generateDefaultLevels} from "./levelEditor"; import debugLog from './debug'; +import {ReplaySelectionScreen} from "./replay/ReplaySelectionScreen"; +import {ReplayManager} from "./replay/ReplayManager"; // Set to true to run minimal controller debug test const DEBUG_CONTROLLERS = false; @@ -41,6 +43,7 @@ export class Main { private _gameState: GameState = GameState.DEMO; private _engine: Engine | WebGPUEngine; private _audioEngine: AudioEngineV2; + private _replayManager: ReplayManager | null = null; constructor() { if (!navigator.xr) { setLoadingMessage("This browser does not support WebXR"); @@ -170,6 +173,90 @@ export class Main { } else { console.warn('[Main] Test level button not found in DOM'); } + + // View Replays button handler + const viewReplaysBtn = document.querySelector('#viewReplaysBtn'); + debugLog('[Main] View Replays button found:', !!viewReplaysBtn); + + if (viewReplaysBtn) { + viewReplaysBtn.addEventListener('click', async () => { + debugLog('[Main] ========== VIEW REPLAYS BUTTON CLICKED =========='); + + // Initialize engine and physics if not already done + if (!this._started) { + this._started = true; + await this.initialize(); + } + + // Hide main menu + const levelSelect = document.querySelector('#levelSelect') as HTMLElement; + const editorLink = document.querySelector('.editor-link') as HTMLElement; + const settingsLink = document.querySelector('.settings-link') as HTMLElement; + + if (levelSelect) { + levelSelect.style.display = 'none'; + } + if (editorLink) { + editorLink.style.display = 'none'; + } + if (settingsLink) { + settingsLink.style.display = 'none'; + } + + // Show replay selection screen + const selectionScreen = new ReplaySelectionScreen( + async (recordingId: string) => { + // Play callback - start replay + debugLog(`[Main] Starting replay for recording: ${recordingId}`); + selectionScreen.dispose(); + + // Create replay manager if not exists + if (!this._replayManager) { + this._replayManager = new ReplayManager( + this._engine as Engine, + () => { + // On exit callback - return to main menu + debugLog('[Main] Exiting replay, returning to menu'); + if (levelSelect) { + levelSelect.style.display = 'block'; + } + if (editorLink) { + editorLink.style.display = 'block'; + } + if (settingsLink) { + settingsLink.style.display = 'block'; + } + } + ); + } + + // Start replay + if (this._replayManager) { + await this._replayManager.startReplay(recordingId); + } + }, + () => { + // Cancel callback - return to main menu + debugLog('[Main] Replay selection cancelled'); + selectionScreen.dispose(); + if (levelSelect) { + levelSelect.style.display = 'block'; + } + if (editorLink) { + editorLink.style.display = 'block'; + } + if (settingsLink) { + settingsLink.style.display = 'block'; + } + } + ); + + await selectionScreen.initialize(); + }); + debugLog('[Main] Click listener added to view replays button'); + } else { + console.warn('[Main] View Replays button not found in DOM'); + } }); } private _started = false; diff --git a/src/physicsRecorder.ts b/src/physicsRecorder.ts index 304fa22..c74fabb 100644 --- a/src/physicsRecorder.ts +++ b/src/physicsRecorder.ts @@ -1,6 +1,7 @@ import { Scene, Vector3, Quaternion, AbstractMesh } from "@babylonjs/core"; import debugLog from "./debug"; import { PhysicsStorage } from "./physicsStorage"; +import { LevelConfig } from "./levelConfig"; /** * Represents the physics state of a single object at a point in time @@ -33,6 +34,7 @@ export interface RecordingMetadata { frameCount: number; recordingDuration: number; // milliseconds physicsUpdateRate: number; // Hz + levelConfig?: LevelConfig; // Full scene state at recording time } /** @@ -80,9 +82,11 @@ export class PhysicsRecorder { private _autoSaveInterval: number = 10000; // Save every 10 seconds private _lastAutoSaveTime: number = 0; private _currentSessionId: string = ""; + private _levelConfig: LevelConfig | null = null; - constructor(scene: Scene) { + constructor(scene: Scene, levelConfig?: LevelConfig) { this._scene = scene; + this._levelConfig = levelConfig || null; // Initialize IndexedDB storage this._storage = new PhysicsStorage(); @@ -168,10 +172,12 @@ export class PhysicsRecorder { const timestamp = performance.now() - this._startTime; const objects: PhysicsObjectState[] = []; - // Get all physics-enabled meshes + // Get all physics-enabled meshes AND transform nodes const physicsMeshes = this._scene.meshes.filter(mesh => mesh.physicsBody !== null && mesh.physicsBody !== undefined); + const physicsTransformNodes = this._scene.transformNodes.filter(node => node.physicsBody !== null && node.physicsBody !== undefined); + const allPhysicsObjects = [...physicsMeshes, ...physicsTransformNodes]; - for (const mesh of physicsMeshes) { + for (const mesh of allPhysicsObjects) { const body = mesh.physicsBody; // Double-check body still exists and has transformNode (can be disposed between filter and here) @@ -300,13 +306,17 @@ export class PhysicsRecorder { const snapshotsToSave = [...this._autoSaveBuffer]; this._autoSaveBuffer = []; + // Use the LevelConfig passed to constructor + const levelConfig = this._levelConfig || undefined; + // Create a recording from the buffered snapshots const metadata: RecordingMetadata = { startTime: snapshotsToSave[0].timestamp, endTime: snapshotsToSave[snapshotsToSave.length - 1].timestamp, frameCount: snapshotsToSave.length, recordingDuration: snapshotsToSave[snapshotsToSave.length - 1].timestamp - snapshotsToSave[0].timestamp, - physicsUpdateRate: this._physicsUpdateRate + physicsUpdateRate: this._physicsUpdateRate, + levelConfig // Include complete scene state }; const recording: PhysicsRecording = { @@ -319,7 +329,8 @@ export class PhysicsRecorder { await this._storage.saveRecording(this._currentSessionId, recording); const duration = (metadata.recordingDuration / 1000).toFixed(1); - debugLog(`PhysicsRecorder: Auto-saved ${snapshotsToSave.length} frames (${duration}s) to IndexedDB`); + const configSize = levelConfig ? `with scene state (${JSON.stringify(levelConfig).length} bytes)` : 'without scene state'; + debugLog(`PhysicsRecorder: Auto-saved ${snapshotsToSave.length} frames (${duration}s) ${configSize} to IndexedDB`); } catch (error) { debugLog("PhysicsRecorder: Error during auto-save", error); } diff --git a/src/physicsStorage.ts b/src/physicsStorage.ts index eab943c..aa1bb22 100644 --- a/src/physicsStorage.ts +++ b/src/physicsStorage.ts @@ -58,7 +58,8 @@ export class PhysicsStorage { throw new Error("Database not initialized"); } - const recordingId = `recording-${Date.now()}`; + // Use the provided name as recordingId (for session-based grouping) + const recordingId = name; const segmentSize = 1000; // 1 second at ~7 Hz = ~7 snapshots per segment return new Promise((resolve, reject) => { @@ -190,23 +191,76 @@ export class PhysicsStorage { request.onsuccess = () => { const allSegments = request.result; - // Group by recordingId and get first segment (which has metadata) - const recordingMap = new Map(); + // Group by recordingId and aggregate all segments + const sessionMap = new Map(); + // Group segments by session allSegments.forEach(segment => { - if (!recordingMap.has(segment.recordingId) && segment.metadata) { - recordingMap.set(segment.recordingId, { - id: segment.recordingId, - name: segment.name, - timestamp: segment.timestamp, - duration: segment.metadata.recordingDuration / 1000, // Convert to seconds - frameCount: segment.metadata.frameCount + if (!sessionMap.has(segment.recordingId)) { + sessionMap.set(segment.recordingId, { + segments: [], + metadata: null }); } + const session = sessionMap.get(segment.recordingId)!; + session.segments.push(segment); + if (segment.metadata) { + session.metadata = segment.metadata; // Keep first metadata for LevelConfig + } }); - const recordings = Array.from(recordingMap.values()); - debugLog(`PhysicsStorage: Found ${recordings.length} recordings`); + // Build recording list with aggregated data + const recordings: Array<{ + id: string; + name: string; + timestamp: number; + duration: number; + frameCount: number; + }> = []; + + sessionMap.forEach((session, recordingId) => { + // Sort segments to get first and last + session.segments.sort((a, b) => a.segmentIndex - b.segmentIndex); + + const firstSegment = session.segments[0]; + const lastSegment = session.segments[session.segments.length - 1]; + + // Calculate total frame count across all segments + const totalFrames = session.segments.reduce((sum, seg) => sum + seg.snapshots.length, 0); + + // Calculate total duration from first to last snapshot across ALL segments + let firstTimestamp = Number.MAX_VALUE; + let lastTimestamp = 0; + + session.segments.forEach(seg => { + if (seg.snapshots.length > 0) { + const segFirstTimestamp = seg.snapshots[0].timestamp; + const segLastTimestamp = seg.snapshots[seg.snapshots.length - 1].timestamp; + + if (segFirstTimestamp < firstTimestamp) { + firstTimestamp = segFirstTimestamp; + } + if (segLastTimestamp > lastTimestamp) { + lastTimestamp = segLastTimestamp; + } + } + }); + + const totalDuration = (lastTimestamp - firstTimestamp) / 1000; // Convert to seconds + + recordings.push({ + id: recordingId, + name: recordingId, // Use session ID as name + timestamp: firstSegment.timestamp, + duration: totalDuration, + frameCount: totalFrames + }); + }); + + debugLog(`PhysicsStorage: Found ${recordings.length} sessions (${allSegments.length} total segments)`); resolve(recordings); }; diff --git a/src/replay/ReplayAssetRegistry.ts b/src/replay/ReplayAssetRegistry.ts deleted file mode 100644 index 9c51e69..0000000 --- a/src/replay/ReplayAssetRegistry.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AbstractMesh, InstancedMesh, Mesh, Scene } from "@babylonjs/core"; -import loadAsset from "../utils/loadAsset"; -import debugLog from "../debug"; - -/** - * Registry for loading and caching assets used in replay - * Maps object IDs to appropriate mesh templates and creates instances - */ -export class ReplayAssetRegistry { - private _assetCache: Map = new Map(); - private _scene: Scene; - private _initialized: boolean = false; - - constructor(scene: Scene) { - this._scene = scene; - } - - /** - * Pre-load all assets that might be needed for replay - */ - public async initialize(): Promise { - if (this._initialized) { - return; - } - - debugLog("ReplayAssetRegistry: Loading replay assets..."); - - try { - // Load ship mesh - await this.loadShipMesh(); - - // Load asteroid meshes - await this.loadAsteroidMesh(); - - // Load base mesh - await this.loadBaseMesh(); - - this._initialized = true; - debugLog("ReplayAssetRegistry: All assets loaded"); - } catch (error) { - debugLog("ReplayAssetRegistry: Error loading assets", error); - throw error; - } - } - - /** - * Load ship mesh template - */ - private async loadShipMesh(): Promise { - const data = await loadAsset("ship.glb"); - const shipMesh = data.container.transformNodes[0]; - shipMesh.setEnabled(false); // Keep as template - this._assetCache.set("ship-template", shipMesh as AbstractMesh); - debugLog("ReplayAssetRegistry: Ship mesh loaded"); - } - - /** - * Load asteroid mesh template - */ - private async loadAsteroidMesh(): Promise { - const data = await loadAsset("asteroid4.glb"); - const asteroidMesh = data.container.meshes[0]; - asteroidMesh.setEnabled(false); // Keep as template - this._assetCache.set("asteroid-template", asteroidMesh); - debugLog("ReplayAssetRegistry: Asteroid mesh loaded"); - } - - /** - * Load base mesh template - */ - private async loadBaseMesh(): Promise { - const data = await loadAsset("base.glb"); - const baseMesh = data.container.transformNodes[0]; - baseMesh.setEnabled(false); // Keep as template - this._assetCache.set("base-template", baseMesh as AbstractMesh); - debugLog("ReplayAssetRegistry: Base mesh loaded"); - } - - /** - * Create a replay mesh from object ID - * Uses instancedMesh for asteroids, clones for unique objects - */ - public createReplayMesh(objectId: string): AbstractMesh | null { - if (!this._initialized) { - debugLog("ReplayAssetRegistry: Not initialized, cannot create mesh for", objectId); - return null; - } - - // Determine mesh type from object ID - if (objectId.startsWith("asteroid-") || objectId.startsWith("rock-")) { - // Create instance of asteroid template - const template = this._assetCache.get("asteroid-template"); - if (template) { - const instance = new InstancedMesh(objectId, template as Mesh); - instance.setEnabled(true); - return instance; - } - } else if (objectId === "ship" || objectId.startsWith("shipBase")) { - // Clone ship (needs independent properties) - const template = this._assetCache.get("ship-template"); - if (template) { - const clone = template.clone(objectId, null, true); - if (clone) { - clone.setEnabled(true); - return clone; - } - } - } else if (objectId.startsWith("base") || objectId.startsWith("starBase")) { - // Clone base - const template = this._assetCache.get("base-template"); - if (template) { - const clone = template.clone(objectId, null, true); - if (clone) { - clone.setEnabled(true); - return clone; - } - } - } else if (objectId.startsWith("ammo")) { - // Skip projectiles - they're small and numerous - return null; - } - - debugLog(`ReplayAssetRegistry: Unknown object type for ID: ${objectId}`); - return null; - } - - /** - * Get statistics about loaded assets - */ - public getStats(): { - initialized: boolean; - templateCount: number; - templates: string[]; - } { - return { - initialized: this._initialized, - templateCount: this._assetCache.size, - templates: Array.from(this._assetCache.keys()) - }; - } - - /** - * Dispose of all cached assets - */ - public dispose(): void { - debugLog("ReplayAssetRegistry: Disposing assets"); - this._assetCache.forEach((mesh, key) => { - mesh.dispose(); - }); - this._assetCache.clear(); - this._initialized = false; - } -} diff --git a/src/replay/ReplayCamera.ts b/src/replay/ReplayCamera.ts index 29df84a..c7db63a 100644 --- a/src/replay/ReplayCamera.ts +++ b/src/replay/ReplayCamera.ts @@ -48,6 +48,10 @@ export class ReplayCamera { this._camera.lowerBetaLimit = 0.1; this._camera.upperBetaLimit = Math.PI / 2; + // Set clipping planes for visibility + this._camera.minZ = 0.1; // Very close near plane + this._camera.maxZ = 5000; // Far plane for distant objects + // Mouse wheel zoom speed this._camera.wheelPrecision = 20; @@ -55,6 +59,8 @@ export class ReplayCamera { this._camera.panningSensibility = 50; scene.activeCamera = this._camera; + + debugLog("ReplayCamera: Created with clipping planes minZ=0.1, maxZ=5000"); } /** @@ -115,6 +121,7 @@ export class ReplayCamera { objects.forEach(obj => { const pos = obj.position; + debugLog(`ReplayCamera: Framing object ${obj.name} at position ${pos.toString()}`); minX = Math.min(minX, pos.x); minY = Math.min(minY, pos.y); minZ = Math.min(minZ, pos.z); diff --git a/src/replay/ReplayControls.ts b/src/replay/ReplayControls.ts index 873928a..29783b0 100644 --- a/src/replay/ReplayControls.ts +++ b/src/replay/ReplayControls.ts @@ -94,8 +94,9 @@ export class ReplayControls { this._playPauseButton.fontWeight = "bold"; this._playPauseButton.left = "20px"; - this._playPauseButton.top = "-80px"; + this._playPauseButton.top = "20px"; this._playPauseButton.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT; + this._playPauseButton.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; this._playPauseButton.onPointerClickObservable.add(() => { this._player.togglePlayPause(); @@ -124,8 +125,9 @@ export class ReplayControls { stepBackBtn.fontSize = "18px"; stepBackBtn.left = "150px"; - stepBackBtn.top = "-80px"; + stepBackBtn.top = "20px"; stepBackBtn.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT; + stepBackBtn.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; stepBackBtn.onPointerClickObservable.add(() => { this._player.stepBackward(); @@ -144,8 +146,9 @@ export class ReplayControls { stepFwdBtn.fontSize = "18px"; stepFwdBtn.left = "220px"; - stepFwdBtn.top = "-80px"; + stepFwdBtn.top = "20px"; stepFwdBtn.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT; + stepFwdBtn.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; stepFwdBtn.onPointerClickObservable.add(() => { this._player.stepForward(); @@ -167,8 +170,9 @@ export class ReplayControls { this._speedText.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; this._speedText.left = "-320px"; - this._speedText.top = "-95px"; + this._speedText.top = "10px"; this._speedText.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT; + this._speedText.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; this._controlBar.addControl(this._speedText); @@ -183,8 +187,9 @@ export class ReplayControls { speed05Btn.fontSize = "14px"; speed05Btn.left = "-250px"; - speed05Btn.top = "-85px"; + speed05Btn.top = "20px"; speed05Btn.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT; + speed05Btn.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; speed05Btn.onPointerClickObservable.add(() => { this._player.setPlaybackSpeed(0.5); @@ -204,8 +209,9 @@ export class ReplayControls { speed1Btn.fontSize = "14px"; speed1Btn.left = "-180px"; - speed1Btn.top = "-85px"; + speed1Btn.top = "20px"; speed1Btn.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT; + speed1Btn.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; speed1Btn.onPointerClickObservable.add(() => { this._player.setPlaybackSpeed(1.0); @@ -225,8 +231,9 @@ export class ReplayControls { speed2Btn.fontSize = "14px"; speed2Btn.left = "-110px"; - speed2Btn.top = "-85px"; + speed2Btn.top = "20px"; speed2Btn.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT; + speed2Btn.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; speed2Btn.onPointerClickObservable.add(() => { this._player.setPlaybackSpeed(2.0); @@ -252,8 +259,9 @@ export class ReplayControls { this._progressSlider.thumbColor = "#00ff88"; this._progressSlider.thumbWidth = "20px"; - this._progressSlider.top = "-30px"; + this._progressSlider.top = "80px"; this._progressSlider.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; + this._progressSlider.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; let isDragging = false; @@ -286,9 +294,10 @@ export class ReplayControls { this._timeText.fontSize = "18px"; this._timeText.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; - this._timeText.top = "-30px"; + this._timeText.top = "80px"; this._timeText.left = "-20px"; this._timeText.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT; + this._timeText.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; this._controlBar.addControl(this._timeText); } diff --git a/src/replay/ReplayManager.ts b/src/replay/ReplayManager.ts new file mode 100644 index 0000000..a27df72 --- /dev/null +++ b/src/replay/ReplayManager.ts @@ -0,0 +1,321 @@ +import { + Engine, + HavokPlugin, + PhysicsMotionType, + PhysicsViewer, + Scene, + Vector3 +} from "@babylonjs/core"; +import "@babylonjs/inspector"; +import HavokPhysics from "@babylonjs/havok"; +import { PhysicsStorage } from "../physicsStorage"; +import { ReplayPlayer } from "./ReplayPlayer"; +import { CameraMode, ReplayCamera } from "./ReplayCamera"; +import { ReplayControls } from "./ReplayControls"; +import debugLog from "../debug"; +import { DefaultScene } from "../defaultScene"; +import { Level1 } from "../level1"; + +/** + * Manages the replay scene, loading recordings, and coordinating replay components + */ +export class ReplayManager { + private _engine: Engine; + private _originalScene: Scene; + private _replayScene: Scene | null = null; + private _replayHavokPlugin: HavokPlugin | null = null; + private _physicsViewer: PhysicsViewer | null = null; + + // Replay components + private _level: Level1 | null = null; + private _player: ReplayPlayer | null = null; + private _camera: ReplayCamera | null = null; + private _controls: ReplayControls | null = null; + + private _onExitCallback: () => void; + private _keyboardHandler: ((ev: KeyboardEvent) => void) | null = null; + + constructor(engine: Engine, onExit: () => void) { + this._engine = engine; + this._originalScene = DefaultScene.MainScene; + this._onExitCallback = onExit; + } + + /** + * Start replay for a specific recording + */ + public async startReplay(recordingId: string): Promise { + debugLog(`ReplayManager: Starting replay for ${recordingId}`); + + // Stop any existing render loop immediately + this._engine.stopRenderLoop(); + + try { + // 1. Load recording from IndexedDB + const storage = new PhysicsStorage(); + await storage.initialize(); + const recording = await storage.loadRecording(recordingId); + storage.close(); + + if (!recording || !recording.metadata.levelConfig) { + debugLog("ReplayManager: Recording not found or missing LevelConfig"); + return; + } + + debugLog(`ReplayManager: Loaded recording with ${recording.snapshots.length} frames`); + + // 2. Create replay scene + await this.createReplayScene(); + + // 3. Use Level1 to populate the scene (reuse game logic!) + debugLog('ReplayManager: Initializing Level1 in replay mode'); + this._level = new Level1(recording.metadata.levelConfig, null, true); // isReplayMode = true + await this._level.initialize(); + debugLog('ReplayManager: Level1 initialized successfully'); + + // 4. Convert all physics bodies to ANIMATED (replay-controlled) + let physicsCount = 0; + for (const mesh of this._replayScene!.meshes) { + if (mesh.physicsBody) { + mesh.physicsBody.setMotionType(PhysicsMotionType.ANIMATED); + // Disable collisions for replay objects + const shape = mesh.physicsBody.shape; + if (shape) { + shape.filterMembershipMask = 0; + shape.filterCollideMask = 0; + } + physicsCount++; + } + } + debugLog(`ReplayManager: Set ${physicsCount} objects to ANIMATED motion type`); + + // 5. Create player for physics playback + this._player = new ReplayPlayer(this._replayScene!, recording); + await this._player.initialize(); + + // Enable physics debug for all replay objects + if (this._physicsViewer) { + const replayObjects = this._player.getReplayObjects(); + debugLog(`ReplayManager: Enabling physics debug for ${replayObjects.size} objects`); + replayObjects.forEach((mesh) => { + if (mesh.physicsBody) { + this._physicsViewer!.showBody(mesh.physicsBody); + } + }); + } + + // 6. Setup camera + this._camera = new ReplayCamera(this._replayScene!); + + // Frame all objects initially in FREE mode + const objects = Array.from(this._player.getReplayObjects().values()); + debugLog(`ReplayManager: Framing ${objects.length} objects for camera`); + + if (objects.length > 0) { + this._camera.frameAllObjects(objects); + this._camera.setMode(CameraMode.FREE); + debugLog(`ReplayManager: Camera set to FREE mode`); + } else { + debugLog(`ReplayManager: WARNING - No objects to frame!`); + // Set default camera position if no objects + this._camera.getCamera().position.set(0, 50, -100); + this._camera.getCamera().setTarget(Vector3.Zero()); + } + + // Set ship as follow target for later toggling + const ship = this._player.getShipMesh(); + if (ship) { + this._camera.setFollowTarget(ship); + debugLog(`ReplayManager: Ship set as follow target`); + } + + // 6. Create controls UI + this._controls = new ReplayControls(this._player, this._camera, () => { + this.exitReplay(); + }); + this._controls.initialize(); + + // 7. Setup keyboard handler for inspector + this._keyboardHandler = (ev: KeyboardEvent) => { + // Toggle inspector with 'i' key + if (ev.key === 'i' || ev.key === 'I') { + if (this._replayScene) { + if (this._replayScene.debugLayer.isVisible()) { + this._replayScene.debugLayer.hide(); + debugLog("ReplayManager: Inspector hidden"); + } else { + this._replayScene.debugLayer.show(); + debugLog("ReplayManager: Inspector shown"); + } + } + } + }; + window.addEventListener('keydown', this._keyboardHandler); + debugLog("ReplayManager: Keyboard handler registered (press 'i' for inspector)"); + + // 8. Start render loop + debugLog(`ReplayManager: Starting render loop for replay scene`); + debugLog(`ReplayManager: Replay scene has ${this._replayScene!.meshes.length} meshes, camera: ${this._replayScene!.activeCamera?.name}`); + + this._engine.runRenderLoop(() => { + if (this._replayScene && this._replayScene.activeCamera) { + this._replayScene.render(); + + // Update camera and controls + if (this._camera) { + this._camera.update(); + } + if (this._controls) { + this._controls.update(); + } + } + }); + + // 9. Auto-start playback + this._player.play(); + + debugLog("ReplayManager: Replay started successfully"); + } catch (error) { + debugLog("ReplayManager: Error starting replay", error); + await this.exitReplay(); + } + } + + + /** + * Create a new scene for replay + */ + private async createReplayScene(): Promise { + // Dispose old replay scene if exists + if (this._replayScene) { + await this.disposeReplayScene(); + } + + // Create new scene + this._replayScene = new Scene(this._engine); + + // Create new Havok physics instance for this scene + debugLog("ReplayManager: Creating Havok physics instance for replay scene"); + const havok = await HavokPhysics(); + this._replayHavokPlugin = new HavokPlugin(true, havok); + + // Enable physics + this._replayScene.enablePhysics(Vector3.Zero(), this._replayHavokPlugin); + + // Enable physics debug rendering + this._physicsViewer = new PhysicsViewer(this._replayScene); + debugLog("ReplayManager: Physics debug viewer created"); + + // Update DefaultScene singleton (Level1.initialize will use this scene) + DefaultScene.MainScene = this._replayScene; + + debugLog("ReplayManager: Replay scene created"); + } + + /** + * Exit replay and return to original scene + */ + public async exitReplay(): Promise { + debugLog("ReplayManager: Exiting replay"); + + // Remove keyboard handler + if (this._keyboardHandler) { + window.removeEventListener('keydown', this._keyboardHandler); + this._keyboardHandler = null; + debugLog("ReplayManager: Keyboard handler removed"); + } + + // Stop render loop + this._engine.stopRenderLoop(); + + // Dispose replay components + await this.disposeReplayScene(); + + // Restore original scene + DefaultScene.MainScene = this._originalScene; + + // Restore original render loop + this._engine.runRenderLoop(() => { + this._originalScene.render(); + }); + + // Call exit callback + this._onExitCallback(); + + debugLog("ReplayManager: Exited replay"); + } + + /** + * Dispose of replay scene and all components + */ + private async disposeReplayScene(): Promise { + if (!this._replayScene) { + return; + } + + debugLog("ReplayManager: Disposing replay scene"); + + // 1. Dispose UI + if (this._controls) { + this._controls.dispose(); + this._controls = null; + } + + // 2. Dispose player (stops playback, removes observables) + if (this._player) { + this._player.dispose(); + this._player = null; + } + + // 3. Dispose camera + if (this._camera) { + this._camera.dispose(); + this._camera = null; + } + + // 4. Dispose level (if exists) + if (this._level) { + // Level disposal would happen here if needed + this._level = null; + } + + // 6. Dispose all meshes with physics + this._replayScene.meshes.forEach(mesh => { + if (mesh.physicsBody) { + mesh.physicsBody.dispose(); + } + if (mesh.skeleton) { + mesh.skeleton.dispose(); + } + mesh.dispose(); + }); + + // 7. Dispose materials and textures + this._replayScene.materials.forEach(mat => mat.dispose()); + this._replayScene.textures.forEach(tex => tex.dispose()); + + // 8. Dispose scene + this._replayScene.dispose(); + this._replayScene = null; + + // 9. Clean up physics viewer + if (this._physicsViewer) { + this._physicsViewer.dispose(); + this._physicsViewer = null; + } + + // 10. Clean up Havok plugin + if (this._replayHavokPlugin) { + this._replayHavokPlugin = null; + } + + debugLog("ReplayManager: Replay scene disposed"); + } + + /** + * Get current replay scene + */ + public getReplayScene(): Scene | null { + return this._replayScene; + } +} diff --git a/src/replay/ReplayPlayer.ts b/src/replay/ReplayPlayer.ts index 09f2465..80fe51e 100644 --- a/src/replay/ReplayPlayer.ts +++ b/src/replay/ReplayPlayer.ts @@ -1,15 +1,11 @@ import { AbstractMesh, Observable, - PhysicsAggregate, - PhysicsMotionType, - PhysicsShapeType, Quaternion, Scene, Vector3 } from "@babylonjs/core"; import { PhysicsRecording, PhysicsSnapshot } from "../physicsRecorder"; -import { ReplayAssetRegistry } from "./ReplayAssetRegistry"; import debugLog from "../debug"; /** @@ -19,7 +15,6 @@ import debugLog from "../debug"; export class ReplayPlayer { private _scene: Scene; private _recording: PhysicsRecording; - private _assetRegistry: ReplayAssetRegistry; private _replayObjects: Map = new Map(); // Playback state @@ -27,26 +22,28 @@ export class ReplayPlayer { private _isPlaying: boolean = false; private _playbackSpeed: number = 1.0; - // Timing - private _physicsHz: number; - private _frameDuration: number; // milliseconds per physics frame + // Timing (timestamp-based, not Hz-based) + private _playbackStartTime: number = 0; // Real-world time when playback started + private _recordingStartTimestamp: number = 0; // First snapshot's timestamp private _lastUpdateTime: number = 0; - private _accumulatedTime: number = 0; // Observables public onPlayStateChanged: Observable = new Observable(); public onFrameChanged: Observable = new Observable(); - constructor(scene: Scene, recording: PhysicsRecording, assetRegistry: ReplayAssetRegistry) { + constructor(scene: Scene, recording: PhysicsRecording) { this._scene = scene; this._recording = recording; - this._assetRegistry = assetRegistry; - this._physicsHz = recording.metadata.physicsUpdateRate || 7.2; - this._frameDuration = 1000 / this._physicsHz; // ~138.9ms at 7.2 Hz + + // Store first snapshot's timestamp as our recording start reference + if (recording.snapshots.length > 0) { + this._recordingStartTimestamp = recording.snapshots[0].timestamp; + } } /** - * Initialize replay by creating all meshes from first snapshot + * Initialize replay by finding existing meshes in the scene + * (Level1.initialize() has already created all objects) */ public async initialize(): Promise { if (this._recording.snapshots.length === 0) { @@ -55,35 +52,24 @@ export class ReplayPlayer { } const firstSnapshot = this._recording.snapshots[0]; - debugLog(`ReplayPlayer: Creating ${firstSnapshot.objects.length} replay objects`); + debugLog(`ReplayPlayer: Initializing replay for ${firstSnapshot.objects.length} objects`); + debugLog(`ReplayPlayer: Object IDs in snapshot: ${firstSnapshot.objects.map(o => o.id).join(', ')}`); + // Find all existing meshes in the scene (already created by Level1.initialize()) for (const objState of firstSnapshot.objects) { - const mesh = this._assetRegistry.createReplayMesh(objState.id); - if (!mesh) { - continue; // Skip objects we can't create (like ammo) - } + const mesh = this._scene.getMeshByName(objState.id) as AbstractMesh; - this._replayObjects.set(objState.id, mesh); - - // Create physics body (ANIMATED = kinematic, we control position directly) - try { - const agg = new PhysicsAggregate( - mesh, - PhysicsShapeType.MESH, - { - mass: objState.mass, - restitution: objState.restitution - }, - this._scene - ); - agg.body.setMotionType(PhysicsMotionType.ANIMATED); - } catch (error) { - debugLog(`ReplayPlayer: Could not create physics for ${objState.id}`, error); + if (mesh) { + this._replayObjects.set(objState.id, mesh); + debugLog(`ReplayPlayer: Found ${objState.id} in scene (physics: ${!!mesh.physicsBody})`); + } else { + debugLog(`ReplayPlayer: WARNING - Object ${objState.id} not found in scene`); } } // Apply first frame state this.applySnapshot(firstSnapshot); + debugLog(`ReplayPlayer: Initialized with ${this._replayObjects.size} objects`); } @@ -96,13 +82,14 @@ export class ReplayPlayer { } this._isPlaying = true; - this._lastUpdateTime = performance.now(); + this._playbackStartTime = performance.now(); + this._lastUpdateTime = this._playbackStartTime; this.onPlayStateChanged.notifyObservers(true); // Use scene.onBeforeRenderObservable for smooth updates this._scene.onBeforeRenderObservable.add(this.updateCallback); - debugLog("ReplayPlayer: Playback started"); + debugLog("ReplayPlayer: Playback started (timestamp-based)"); } /** @@ -132,48 +119,65 @@ export class ReplayPlayer { } /** - * Update callback for render loop + * Update callback for render loop (timestamp-based) */ private updateCallback = (): void => { - if (!this._isPlaying) { + if (!this._isPlaying || this._recording.snapshots.length === 0) { return; } const now = performance.now(); - const deltaTime = (now - this._lastUpdateTime) * this._playbackSpeed; - this._lastUpdateTime = now; - this._accumulatedTime += deltaTime; + // Calculate elapsed playback time (with speed multiplier) + const elapsedPlaybackTime = (now - this._playbackStartTime) * this._playbackSpeed; - // Update when enough time has passed for next frame - while (this._accumulatedTime >= this._frameDuration) { - this._accumulatedTime -= this._frameDuration; - this.advanceFrame(); + // Calculate target recording timestamp + const targetTimestamp = this._recordingStartTimestamp + elapsedPlaybackTime; + + // Find the correct frame for this timestamp + let targetFrameIndex = this._currentFrameIndex; + + // Advance to the frame that matches our target timestamp + while (targetFrameIndex < this._recording.snapshots.length - 1 && + this._recording.snapshots[targetFrameIndex + 1].timestamp <= targetTimestamp) { + targetFrameIndex++; } - // Interpolate between frames for smooth motion - const alpha = this._accumulatedTime / this._frameDuration; - this.interpolateFrame(alpha); - }; + // If we advanced frames, update and notify + if (targetFrameIndex !== this._currentFrameIndex) { + this._currentFrameIndex = targetFrameIndex; - /** - * Advance to next frame - */ - private advanceFrame(): void { - this._currentFrameIndex++; + // Debug: Log frame advancement every 10 frames + if (this._currentFrameIndex % 10 === 0) { + const snapshot = this._recording.snapshots[this._currentFrameIndex]; + debugLog(`ReplayPlayer: Frame ${this._currentFrameIndex}/${this._recording.snapshots.length}, timestamp: ${snapshot.timestamp.toFixed(1)}ms, objects: ${snapshot.objects.length}`); + } - if (this._currentFrameIndex >= this._recording.snapshots.length) { - // End of recording - this._currentFrameIndex = this._recording.snapshots.length - 1; + this.applySnapshot(this._recording.snapshots[this._currentFrameIndex]); + this.onFrameChanged.notifyObservers(this._currentFrameIndex); + } + + // Check if we reached the end + if (this._currentFrameIndex >= this._recording.snapshots.length - 1 && + targetTimestamp >= this._recording.snapshots[this._recording.snapshots.length - 1].timestamp) { this.pause(); debugLog("ReplayPlayer: Reached end of recording"); return; } - const snapshot = this._recording.snapshots[this._currentFrameIndex]; - this.applySnapshot(snapshot); - this.onFrameChanged.notifyObservers(this._currentFrameIndex); - } + // Interpolate between current and next frame for smooth visuals + if (this._currentFrameIndex < this._recording.snapshots.length - 1) { + const currentSnapshot = this._recording.snapshots[this._currentFrameIndex]; + const nextSnapshot = this._recording.snapshots[this._currentFrameIndex + 1]; + + const frameDuration = nextSnapshot.timestamp - currentSnapshot.timestamp; + const frameElapsed = targetTimestamp - currentSnapshot.timestamp; + const alpha = frameDuration > 0 ? Math.min(frameElapsed / frameDuration, 1.0) : 0; + + this.interpolateFrame(alpha); + } + }; + /** * Apply a snapshot's state to all objects @@ -185,30 +189,30 @@ export class ReplayPlayer { continue; } - // Apply position - mesh.position.set( + const newPosition = new Vector3( objState.position[0], objState.position[1], objState.position[2] ); - // Apply rotation (quaternion) - if (!mesh.rotationQuaternion) { - mesh.rotationQuaternion = new Quaternion(); - } - mesh.rotationQuaternion.set( + const newRotation = new Quaternion( objState.rotation[0], objState.rotation[1], objState.rotation[2], objState.rotation[3] ); - // Update physics body transform if exists + // Update mesh transform directly + mesh.position.copyFrom(newPosition); + if (!mesh.rotationQuaternion) { + mesh.rotationQuaternion = new Quaternion(); + } + mesh.rotationQuaternion.copyFrom(newRotation); + + // For ANIMATED bodies, sync physics from mesh + // (ANIMATED bodies should follow their transform node) if (mesh.physicsBody) { - mesh.physicsBody.setTargetTransform( - mesh.position, - mesh.rotationQuaternion - ); + mesh.physicsBody.disablePreStep = false; } } } @@ -235,24 +239,37 @@ export class ReplayPlayer { continue; } + // Create temporary vectors for interpolation + const interpPosition = new Vector3(); + const interpRotation = new Quaternion(); + // Lerp position Vector3.LerpToRef( new Vector3(...objState.position), new Vector3(...nextState.position), alpha, - mesh.position + interpPosition ); // Slerp rotation - if (!mesh.rotationQuaternion) { - mesh.rotationQuaternion = new Quaternion(); - } Quaternion.SlerpToRef( new Quaternion(...objState.rotation), new Quaternion(...nextState.rotation), alpha, - mesh.rotationQuaternion + interpRotation ); + + // Apply interpolated transform to mesh + mesh.position.copyFrom(interpPosition); + if (!mesh.rotationQuaternion) { + mesh.rotationQuaternion = new Quaternion(); + } + mesh.rotationQuaternion.copyFrom(interpRotation); + + // Physics body will sync from mesh if ANIMATED + if (mesh.physicsBody) { + mesh.physicsBody.disablePreStep = false; + } } } @@ -263,7 +280,14 @@ export class ReplayPlayer { this._currentFrameIndex = Math.max(0, Math.min(frameIndex, this._recording.snapshots.length - 1)); const snapshot = this._recording.snapshots[this._currentFrameIndex]; this.applySnapshot(snapshot); - this._accumulatedTime = 0; // Reset interpolation + + // Reset playback timing to match the new frame's timestamp + if (this._isPlaying) { + const targetTimestamp = snapshot.timestamp; + const elapsedRecordingTime = targetTimestamp - this._recordingStartTimestamp; + this._playbackStartTime = performance.now() - (elapsedRecordingTime / this._playbackSpeed); + } + this.onFrameChanged.notifyObservers(this._currentFrameIndex); } diff --git a/src/replay/ReplaySelectionScreen.ts b/src/replay/ReplaySelectionScreen.ts new file mode 100644 index 0000000..8c9f906 --- /dev/null +++ b/src/replay/ReplaySelectionScreen.ts @@ -0,0 +1,371 @@ +import { + AdvancedDynamicTexture, + Button, + Control, + Rectangle, + ScrollViewer, + StackPanel, + TextBlock +} from "@babylonjs/gui"; +import { PhysicsStorage } from "../physicsStorage"; +import debugLog from "../debug"; + +/** + * Recording info for display + */ +interface RecordingInfo { + id: string; + name: string; + timestamp: number; + duration: number; + frameCount: number; +} + +/** + * Fullscreen UI for selecting a recording to replay + */ +export class ReplaySelectionScreen { + private _texture: AdvancedDynamicTexture; + private _scrollViewer: ScrollViewer; + private _recordingsList: StackPanel; + private _selectedRecording: string | null = null; + private _playButton: Button; + private _deleteButton: Button; + + private _onPlayCallback: (recordingId: string) => void; + private _onCancelCallback: () => void; + + private _selectedContainer: Rectangle | null = null; + + constructor(onPlay: (recordingId: string) => void, onCancel: () => void) { + this._onPlayCallback = onPlay; + this._onCancelCallback = onCancel; + } + + /** + * Initialize and show the selection screen + */ + public async initialize(): Promise { + this._texture = AdvancedDynamicTexture.CreateFullscreenUI("replaySelection"); + + // Semi-transparent background + const background = new Rectangle("background"); + background.width = "100%"; + background.height = "100%"; + background.background = "rgba(10, 10, 20, 0.95)"; + background.thickness = 0; + this._texture.addControl(background); + + // Main panel + const mainPanel = new Rectangle("mainPanel"); + mainPanel.width = "900px"; + mainPanel.height = "700px"; + mainPanel.thickness = 2; + mainPanel.color = "#00ff88"; + mainPanel.background = "#1a1a2e"; + mainPanel.cornerRadius = 10; + mainPanel.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; + mainPanel.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER; + this._texture.addControl(mainPanel); + + // Title + const title = new TextBlock("title", "RECORDED SESSIONS"); + title.width = "100%"; + title.height = "80px"; + title.color = "#00ff88"; + title.fontSize = "40px"; + title.fontWeight = "bold"; + title.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; + title.textVerticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; + title.top = "20px"; + mainPanel.addControl(title); + + // ScrollViewer for recordings list + this._scrollViewer = new ScrollViewer("scrollViewer"); + this._scrollViewer.width = "840px"; + this._scrollViewer.height = "480px"; + this._scrollViewer.thickness = 1; + this._scrollViewer.color = "#444"; + this._scrollViewer.background = "#0a0a1e"; + this._scrollViewer.top = "110px"; + this._scrollViewer.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP; + mainPanel.addControl(this._scrollViewer); + + // StackPanel inside ScrollViewer + this._recordingsList = new StackPanel("recordingsList"); + this._recordingsList.width = "100%"; + this._recordingsList.isVertical = true; + this._recordingsList.spacing = 10; + this._recordingsList.paddingTop = "10px"; + this._recordingsList.paddingBottom = "10px"; + this._scrollViewer.addControl(this._recordingsList); + + // Bottom button bar + this.createButtonBar(mainPanel); + + // Load recordings + await this.loadRecordings(); + + debugLog("ReplaySelectionScreen: Initialized"); + } + + /** + * Create button bar at bottom + */ + private createButtonBar(parent: Rectangle): void { + const buttonBar = new StackPanel("buttonBar"); + buttonBar.isVertical = false; + buttonBar.width = "100%"; + buttonBar.height = "80px"; + buttonBar.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; + buttonBar.verticalAlignment = Control.VERTICAL_ALIGNMENT_BOTTOM; + buttonBar.spacing = 20; + buttonBar.paddingBottom = "20px"; + parent.addControl(buttonBar); + + // Play button + this._playButton = Button.CreateSimpleButton("play", "โ–ถ Play Selected"); + this._playButton.width = "200px"; + this._playButton.height = "50px"; + this._playButton.color = "white"; + this._playButton.background = "#00ff88"; + this._playButton.cornerRadius = 10; + this._playButton.thickness = 0; + this._playButton.fontSize = "20px"; + this._playButton.fontWeight = "bold"; + this._playButton.isEnabled = false; // Disabled until selection + + this._playButton.onPointerClickObservable.add(() => { + if (this._selectedRecording) { + this._onPlayCallback(this._selectedRecording); + } + }); + + buttonBar.addControl(this._playButton); + + // Delete button + this._deleteButton = Button.CreateSimpleButton("delete", "๐Ÿ—‘ Delete"); + this._deleteButton.width = "150px"; + this._deleteButton.height = "50px"; + this._deleteButton.color = "white"; + this._deleteButton.background = "#cc3333"; + this._deleteButton.cornerRadius = 10; + this._deleteButton.thickness = 0; + this._deleteButton.fontSize = "18px"; + this._deleteButton.fontWeight = "bold"; + this._deleteButton.isEnabled = false; // Disabled until selection + + this._deleteButton.onPointerClickObservable.add(async () => { + if (this._selectedRecording) { + await this.deleteRecording(this._selectedRecording); + } + }); + + buttonBar.addControl(this._deleteButton); + + // Cancel button + const cancelButton = Button.CreateSimpleButton("cancel", "โœ• Cancel"); + cancelButton.width = "150px"; + cancelButton.height = "50px"; + cancelButton.color = "white"; + cancelButton.background = "#555"; + cancelButton.cornerRadius = 10; + cancelButton.thickness = 0; + cancelButton.fontSize = "18px"; + cancelButton.fontWeight = "bold"; + + cancelButton.onPointerClickObservable.add(() => { + this._onCancelCallback(); + }); + + buttonBar.addControl(cancelButton); + } + + /** + * Load recordings from IndexedDB + */ + private async loadRecordings(): Promise { + const storage = new PhysicsStorage(); + await storage.initialize(); + const recordings = await storage.listRecordings(); + storage.close(); + + if (recordings.length === 0) { + this.showNoRecordingsMessage(); + return; + } + + // Sort by timestamp (newest first) + recordings.sort((a, b) => b.timestamp - a.timestamp); + + recordings.forEach(rec => { + const item = this.createRecordingItem(rec); + this._recordingsList.addControl(item); + }); + + debugLog(`ReplaySelectionScreen: Loaded ${recordings.length} recordings`); + } + + /** + * Show message when no recordings are available + */ + private showNoRecordingsMessage(): void { + const message = new TextBlock("noRecordings", "No recordings available yet.\n\nPlay the game to create recordings!"); + message.width = "100%"; + message.height = "200px"; + message.color = "#888"; + message.fontSize = "24px"; + message.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER; + message.textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER; + message.textWrapping = true; + this._recordingsList.addControl(message); + } + + /** + * Create a selectable recording item + */ + private createRecordingItem(recording: RecordingInfo): Rectangle { + const itemContainer = new Rectangle(); + itemContainer.width = "800px"; + itemContainer.height = "90px"; + itemContainer.thickness = 1; + itemContainer.color = "#555"; + itemContainer.background = "#2a2a3e"; + itemContainer.cornerRadius = 5; + itemContainer.isPointerBlocker = true; + itemContainer.hoverCursor = "pointer"; + + // Hover effect + itemContainer.onPointerEnterObservable.add(() => { + if (this._selectedRecording !== recording.id) { + itemContainer.background = "#3a3a4e"; + } + }); + + itemContainer.onPointerOutObservable.add(() => { + if (this._selectedRecording !== recording.id) { + itemContainer.background = "#2a2a3e"; + } + }); + + // Click to select + itemContainer.onPointerClickObservable.add(() => { + this.selectRecording(recording.id, itemContainer); + }); + + // Content panel + const contentPanel = new StackPanel(); + contentPanel.isVertical = true; + contentPanel.width = "100%"; + contentPanel.paddingLeft = "20px"; + contentPanel.paddingRight = "20px"; + contentPanel.paddingTop = "10px"; + itemContainer.addControl(contentPanel); + + // Session name (first line) - Format session ID nicely + const sessionName = this.formatSessionName(recording.name); + const nameText = new TextBlock("name", sessionName); + nameText.height = "30px"; + nameText.color = "#00ff88"; + nameText.fontSize = "20px"; + nameText.fontWeight = "bold"; + nameText.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT; + contentPanel.addControl(nameText); + + // Details (second line) + const date = new Date(recording.timestamp); + const dateStr = date.toLocaleString(); + const durationStr = this.formatDuration(recording.duration); + const detailsText = new TextBlock( + "details", + `๐Ÿ“… ${dateStr} | โฑ ${durationStr} | ๐Ÿ“Š ${recording.frameCount} frames` + ); + detailsText.height = "25px"; + detailsText.color = "#aaa"; + detailsText.fontSize = "16px"; + detailsText.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT; + contentPanel.addControl(detailsText); + + return itemContainer; + } + + /** + * Select a recording + */ + private selectRecording(recordingId: string, container: Rectangle): void { + // Deselect previous + if (this._selectedContainer) { + this._selectedContainer.background = "#2a2a3e"; + this._selectedContainer.color = "#555"; + } + + // Select new + this._selectedRecording = recordingId; + this._selectedContainer = container; + container.background = "#00ff88"; + container.color = "#00ff88"; + + // Enable buttons + this._playButton.isEnabled = true; + this._deleteButton.isEnabled = true; + + debugLog(`ReplaySelectionScreen: Selected recording ${recordingId}`); + } + + /** + * Delete a recording + */ + private async deleteRecording(recordingId: string): Promise { + const storage = new PhysicsStorage(); + await storage.initialize(); + await storage.deleteRecording(recordingId); + storage.close(); + + debugLog(`ReplaySelectionScreen: Deleted recording ${recordingId}`); + + // Refresh list + this._recordingsList.clearControls(); + this._selectedRecording = null; + this._selectedContainer = null; + this._playButton.isEnabled = false; + this._deleteButton.isEnabled = false; + + await this.loadRecordings(); + } + + /** + * Format session name for display + */ + private formatSessionName(sessionId: string): string { + // Convert "session-1762606365166" to "Session 2024-11-08 07:06" + if (sessionId.startsWith('session-')) { + const timestamp = parseInt(sessionId.replace('session-', '')); + const date = new Date(timestamp); + const dateStr = date.toLocaleDateString(); + const timeStr = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + return `Session ${dateStr} ${timeStr}`; + } + return sessionId; + } + + /** + * Format duration for display + */ + private formatDuration(seconds: number): string { + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + if (mins > 0) { + return `${mins}m ${secs}s`; + } else { + return `${secs}s`; + } + } + + /** + * Dispose of UI + */ + public dispose(): void { + this._texture.dispose(); + debugLog("ReplaySelectionScreen: Disposed"); + } +} diff --git a/src/ship.ts b/src/ship.ts index 6b81374..a19e94e 100644 --- a/src/ship.ts +++ b/src/ship.ts @@ -50,9 +50,11 @@ export class Ship { private _landingAggregate: PhysicsAggregate | null = null; private _resupplyTimer: number = 0; private _isInLandingZone: boolean = false; + private _isReplayMode: boolean; - constructor(audioEngine?: AudioEngineV2) { + constructor(audioEngine?: AudioEngineV2, isReplayMode: boolean = false) { this._audioEngine = audioEngine; + this._isReplayMode = isReplayMode; } public get scoreboard(): Scoreboard { @@ -138,46 +140,48 @@ export class Ship { this._weapons.setShipStatus(this._scoreboard.shipStatus); this._weapons.setGameStats(this._gameStats); - // Initialize input systems - this._keyboardInput = new KeyboardInput(DefaultScene.MainScene); - this._keyboardInput.setup(); + // Initialize input systems (skip in replay mode) + if (!this._isReplayMode) { + this._keyboardInput = new KeyboardInput(DefaultScene.MainScene); + this._keyboardInput.setup(); - this._controllerInput = new ControllerInput(); + this._controllerInput = new ControllerInput(); - // Wire up shooting events - this._keyboardInput.onShootObservable.add(() => { - this.handleShoot(); - }); + // Wire up shooting events + this._keyboardInput.onShootObservable.add(() => { + this.handleShoot(); + }); - this._controllerInput.onShootObservable.add(() => { - this.handleShoot(); - }); + this._controllerInput.onShootObservable.add(() => { + this.handleShoot(); + }); - // Wire up status screen toggle event - this._controllerInput.onStatusScreenToggleObservable.add(() => { - if (this._statusScreen) { - this._statusScreen.toggle(); - } - }); - - // Wire up camera adjustment events - this._keyboardInput.onCameraChangeObservable.add((cameraKey) => { - if (cameraKey === 1) { - this._camera.position.x = 15; - this._camera.rotation.y = -Math.PI / 2; - } - }); - - this._controllerInput.onCameraAdjustObservable.add((adjustment) => { - if (DefaultScene.XR?.baseExperience?.camera) { - const camera = DefaultScene.XR.baseExperience.camera; - if (adjustment.direction === "down") { - camera.position.y = camera.position.y - 0.1; - } else { - camera.position.y = camera.position.y + 0.1; + // Wire up status screen toggle event + this._controllerInput.onStatusScreenToggleObservable.add(() => { + if (this._statusScreen) { + this._statusScreen.toggle(); } - } - }); + }); + + // Wire up camera adjustment events + this._keyboardInput.onCameraChangeObservable.add((cameraKey) => { + if (cameraKey === 1) { + this._camera.position.x = 15; + this._camera.rotation.y = -Math.PI / 2; + } + }); + + this._controllerInput.onCameraAdjustObservable.add((adjustment) => { + if (DefaultScene.XR?.baseExperience?.camera) { + const camera = DefaultScene.XR.baseExperience.camera; + if (adjustment.direction === "down") { + camera.position.y = camera.position.y - 0.1; + } else { + camera.position.y = camera.position.y + 0.1; + } + } + }); + } // Initialize physics controller this._physics = new ShipPhysics();

xZ@VmHu>1}&rmiDL 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 literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/hull.mp3 b/public/assets/themes/default/audio/voice/hull.mp3 similarity index 100% rename from public/assets/themes/default/audio/hull.mp3 rename to public/assets/themes/default/audio/voice/hull.mp3 diff --git a/public/assets/themes/default/audio/voice/returncomplete.mp3 b/public/assets/themes/default/audio/voice/returncomplete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d2a6019974d06e4eaefafdfeccaf489e197a03d1 GIT binary patch literal 47179 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 literal 0 HcmV?d00001 diff --git a/public/assets/themes/default/audio/voice/returntobase.mp3 b/public/assets/themes/default/audio/voice/returntobase.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6a360127d005ebec3f712d4cd13f4d50cd0fc416 GIT binary patch literal 76018 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 nCUyR&>>om5=(C;q*YbtKk6N$%s7LAK|Ea { + xr.baseExperience.camera.parent = this._ship.transformNode; + const currPose = xr.baseExperience.camera.globalPosition.y; + xr.baseExperience.camera.position = new Vector3(0, 0, 0); - xr.baseExperience.onInitialXRPoseSetObservable.add(() => { - xr.baseExperience.camera.parent = this._ship.transformNode; - const currPose = xr.baseExperience.camera.globalPosition.y; - xr.baseExperience.camera.position = new Vector3(0, 0, 0); + // Start game timer when XR pose is set + this._ship.gameStats.startTimer(); + debugLog('Game timer started'); - // Start game timer when XR pose is set - this._ship.gameStats.startTimer(); - debugLog('Game timer started'); + // Start physics recording when gameplay begins + if (this._physicsRecorder) { + this._physicsRecorder.startRingBuffer(); + debugLog('Physics recorder started'); + } - // Start physics recording when gameplay begins - if (this._physicsRecorder) { - this._physicsRecorder.startRingBuffer(); - debugLog('Physics recorder started'); - } - - const observer = xr.input.onControllerAddedObservable.add((controller) => { - debugLog('๐ŸŽฎ onControllerAddedObservable FIRED for:', controller.inputSource.handedness); - this._ship.addController(controller); + const observer = xr.input.onControllerAddedObservable.add((controller) => { + debugLog('๐ŸŽฎ onControllerAddedObservable FIRED for:', controller.inputSource.handedness); + this._ship.addController(controller); + }); }); - }); + } // Don't call initialize here - let Main call it after registering the observable } @@ -69,6 +73,10 @@ export class Level1 implements Level { } public async play() { + if (this._isReplayMode) { + throw new Error("Cannot call play() in replay mode"); + } + // Create background music using AudioEngineV2 const background = await this._audioEngine.createSoundAsync("background", "/song1.mp3", { loop: true, @@ -134,8 +142,6 @@ export class Level1 implements Level { this._ship.scoreboard.setRemainingCount(entities.asteroids.length); debugLog(`Initialized scoreboard with ${entities.asteroids.length} asteroids`); - - // Create background starfield setLoadingMessage("Creating starfield..."); this._backgroundStars = new BackgroundStars(DefaultScene.MainScene, { @@ -154,14 +160,19 @@ export class Level1 implements Level { }); // Initialize physics recorder (but don't start it yet - will start on XR pose) - setLoadingMessage("Initializing physics recorder..."); - this._physicsRecorder = new PhysicsRecorder(DefaultScene.MainScene); - debugLog('Physics recorder initialized (will start on XR pose)'); + // Only create recorder in game mode, not replay mode + if (!this._isReplayMode) { + setLoadingMessage("Initializing physics recorder..."); + this._physicsRecorder = new PhysicsRecorder(DefaultScene.MainScene, this._levelConfig); + debugLog('Physics recorder initialized (will start on XR pose)'); + } - // Wire up recording keyboard shortcuts - this._ship.keyboardInput.onRecordingActionObservable.add((action) => { - this.handleRecordingAction(action); - }); + // Wire up recording keyboard shortcuts (only in game mode) + if (!this._isReplayMode) { + this._ship.keyboardInput.onRecordingActionObservable.add((action) => { + this.handleRecordingAction(action); + }); + } this._initialized = true; @@ -206,6 +217,7 @@ export class Level1 implements Level { } } + /** * Get the physics recorder instance */ diff --git a/src/levelConfig.ts b/src/levelConfig.ts index fe3100b..59b6b06 100644 --- a/src/levelConfig.ts +++ b/src/levelConfig.ts @@ -7,6 +7,58 @@ */ export type Vector3Array = [number, number, number]; +/** + * 4D quaternion stored as array [x, y, z, w] + */ +export type QuaternionArray = [number, number, number, number]; + +/** + * 4D color stored as array [r, g, b, a] (0-1 range) + */ +export type Color4Array = [number, number, number, number]; + +/** + * Material configuration for PBR materials + */ +export interface MaterialConfig { + id: string; + name: string; + type: "PBR" | "Standard" | "Basic"; + albedoColor?: Color4Array; + metallic?: number; + roughness?: number; + emissiveColor?: Vector3Array; + emissiveIntensity?: number; + alpha?: number; + backFaceCulling?: boolean; + textures?: { + albedo?: string; // Asset reference or data URL + normal?: string; + metallic?: string; + roughness?: string; + emissive?: string; + }; +} + +/** + * Scene hierarchy node (TransformNode or Mesh) + */ +export interface SceneNodeConfig { + id: string; + name: string; + type: "TransformNode" | "Mesh" | "InstancedMesh"; + position: Vector3Array; + rotation?: Vector3Array; + rotationQuaternion?: QuaternionArray; + scaling?: Vector3Array; + parentId?: string; // Reference to parent node + materialId?: string; // Reference to material + assetReference?: string; // For meshes loaded from GLB + isVisible?: boolean; + isEnabled?: boolean; + metadata?: any; +} + /** * Ship configuration */ @@ -82,6 +134,8 @@ export interface LevelConfig { metadata?: { author?: string; description?: string; + babylonVersion?: string; + captureTime?: number; [key: string]: any; }; @@ -93,6 +147,11 @@ export interface LevelConfig { // Optional: include original difficulty config for reference difficultyConfig?: DifficultyConfig; + + // New fields for full scene serialization + materials?: MaterialConfig[]; + sceneHierarchy?: SceneNodeConfig[]; + assetReferences?: { [key: string]: string }; // mesh id -> asset path (e.g., "ship" -> "ship.glb") } /** diff --git a/src/levelDeserializer.ts b/src/levelDeserializer.ts index 8b948e6..d9eb627 100644 --- a/src/levelDeserializer.ts +++ b/src/levelDeserializer.ts @@ -1,11 +1,12 @@ import { - AbstractMesh, Color3, + AbstractMesh, + Color3, MeshBuilder, Observable, PBRMaterial, PhysicsAggregate, Texture, - Vector3 + Vector3, } from "@babylonjs/core"; import { DefaultScene } from "./defaultScene"; import { RockFactory } from "./rockFactory"; @@ -16,7 +17,6 @@ import { Vector3Array, validateLevelConfig } from "./levelConfig"; -import { GameConfig } from "./gameConfig"; import { FireProceduralTexture } from "@babylonjs/procedural-textures"; import { createSphereLightmap } from "./sphereLightmap"; import debugLog from './debug'; @@ -41,8 +41,11 @@ export class LevelDeserializer { /** * Create all entities from the configuration + * @param scoreObservable - Observable for score events */ - public async deserialize(scoreObservable: Observable): Promise<{ + public async deserialize( + scoreObservable: Observable + ): Promise<{ startBase: AbstractMesh | null; landingAggregate: PhysicsAggregate | null; sun: AbstractMesh; @@ -51,19 +54,11 @@ export class LevelDeserializer { }> { debugLog('Deserializing level:', this.config.difficulty); - // Create entities const baseResult = await this.createStartBase(); const sun = this.createSun(); const planets = this.createPlanets(); const asteroids = await this.createAsteroids(scoreObservable); - /* - const dir = new Vector3(-1,-2,-1) - - const light = new DirectionalLight("dirLight", dir, DefaultScene.MainScene); - const light2 = new DirectionalLight("dirLight2", dir.negate(), DefaultScene.MainScene); - light2.intensity = .5; - */ return { startBase: baseResult.baseMesh, landingAggregate: baseResult.landingAggregate, diff --git a/src/levelSelector.ts b/src/levelSelector.ts index 14c8fa7..d87afa2 100644 --- a/src/levelSelector.ts +++ b/src/levelSelector.ts @@ -16,7 +16,15 @@ export function populateLevelSelector(): boolean { const savedLevels = getSavedLevels(); - if (savedLevels.size === 0) { + // Filter to only show recruit and pilot difficulty levels + const filteredLevels = new Map(); + for (const [name, config] of savedLevels.entries()) { + if (config.difficulty === 'recruit' || config.difficulty === 'pilot') { + filteredLevels.set(name, config); + } + } + + if (filteredLevels.size === 0) { container.innerHTML = `