- To get started, edit the page.tsx file. -
-- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -
-From 81a53e441e8c0fb4ef86f51f99847d0dcf468ba2 Mon Sep 17 00:00:00 2001 From: StrangeD0s <47105931+StrangeD0s@users.noreply.github.com> Date: Sat, 7 Feb 2026 20:11:26 +0100 Subject: [PATCH] mvp --- app/components/apitest.tsx | 20 --- app/globals.css | 5 + app/layout.tsx | 13 +- app/page.tsx | 140 +++++++++++---------- components/ActionPanel.tsx | 230 ++++++++++++++++++++++++++++++++++ components/EventLog.tsx | 76 +++++++++++ components/GalaxyMap.tsx | 82 ++++++++++++ components/GameOverScreen.tsx | 41 ++++++ components/Hud.tsx | 76 +++++++++++ components/StartScreen.tsx | 75 +++++++++++ content/locales.ts | 130 +++++++++++++++++++ hooks/useGameEngine.ts | 191 ++++++++++++++++++++++++++++ public/fonts/Starjedi.ttf | Bin 0 -> 46512 bytes services/swapi.ts | 35 ++++++ types/swapi.ts | 41 ++++++ 15 files changed, 1069 insertions(+), 86 deletions(-) delete mode 100644 app/components/apitest.tsx create mode 100644 components/ActionPanel.tsx create mode 100644 components/EventLog.tsx create mode 100644 components/GalaxyMap.tsx create mode 100644 components/GameOverScreen.tsx create mode 100644 components/Hud.tsx create mode 100644 components/StartScreen.tsx create mode 100644 content/locales.ts create mode 100644 hooks/useGameEngine.ts create mode 100644 public/fonts/Starjedi.ttf create mode 100644 services/swapi.ts create mode 100644 types/swapi.ts diff --git a/app/components/apitest.tsx b/app/components/apitest.tsx deleted file mode 100644 index 18a54ef..0000000 --- a/app/components/apitest.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// app/Apitest.tsx - -export default async function Apitest() { - // 1. Fetch the data directly in the component - const res = await fetch('https://swapi.py4e.com/api/people/1/'); - const data = await res.json(); - - // 2. This console.log will appear in your TERMINAL, not the browser console - // because this is a Server Component! - console.log("Fetched Pilot:", data.name); - - return ( -
Name: {data.name}
-Height: {data.height}cm
-Mass: {data.mass}kg
-- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -
-+ {displaySubtitle} +
++ {isCombat + ? enemy.manufacturer + : planet?.population.toLocaleString()} +
++ {isCombat ? `${enemy.cost_in_credits} Cr` : planet?.gravity} +
++ {isCombat + ? t.ACTION_PANEL.STATUS.COMBAT_WARNING + : t.ACTION_PANEL.STATUS.PLANET_SCAN} +
++ {t.EVENT_LOG.EMPTY_STATE} +
+ )} + {logs.map((log) => ( +{t.GAME_OVER.SUBTITLE}
+ ++ {t.GAME_OVER.SCORE_LABEL} +
++ {credits.toLocaleString()} Credits +
++ {t.START_SCREEN.SUBTITLE} +
++ {t.START_SCREEN.INTRO_TEXT} + + {" "} + {t.START_SCREEN.MISSION_HIGHLIGHT} + +
++ {t.START_SCREEN.FOOTER_ENGINE} +
+8$dl9EE^&aK1C8rQIDn=f9?^cR|gpXLN6B2gCU%J>%m(gY+M4RFCByQUBH)& z-V7;Xm!y%BfH2C+fvjlMgcQSE^*gz&B57VCL>moZj}W)-c)O`;+yl3t!TSfE)LZx& zp)rDaY{0y&c+1+|FKnvXpiky+>Y8bUzHi91Db3J_eJIyl#Rb+-}h=!h73m- zkuyimWY0O31%KwbdJ81iLWMY3L<2R_t@BZaQAo>@mr-66GE$`>8d9ZE8$C87bs6Pm zM*Fo=!kor|qXstURRbG@HXi3m^R|O$4*XN_h@16M{C5U7MVa@FeccKhPW6BriBTWn z2aCQJaD(P=APm2Y;HxwWp&Tv9(FFNswN~=0?HC0_-A=(I$17kp-2826^}5rpF!5K# zrFZKGwqBxt_UvM?aOdV_CSk=D;t2=uec-h#Cz{03SHAm@IFag&1NUQGN14U^7$n>D zaw5y;Ez}u(VYCV=hEf?ym2G3|%=Z923$l~5T7|_LFlh8n0rXCReD4%M?-W4q6hQA3 zK<^Yl?-W4q6hQA3K<^Yl?-W4q6hQA3K<^ZQL4^kSjLO^vJ))+I`hy*cMvSomEK|hf zF_Up@=h>#Z?n(VJ{UH7}?mqKn-t-49@)b`WSiffH6_;z-rYijLGyT5X@8IJ Ag$8|6d!QJ7eR#jcA~T4x3+vEbK7iR5NG<9>XN=WKPtE?FFMIsD&utW*6#$M!tvi zS&*ZL>GIzCp~dyDKcJ5oq{r8++q!kr&a%UF7+VlzJMwk1bT(IlgsH(4Ay-CiGusw- zAqKUmEIR^}#ZVGMuQB4pU?oa=h#8HCAH!cAc>fF0ba0t|4K)2_XnGPswfY-qLNHi) zorg`bJY?jZpuAB+vO^B&+F&MVSWL`Fl-D5( * zH!-chE^IK2H}q1#enBP;2VXMy$j`v26_CZGnOG65BgtN)85p<#R}=Z)glG9b2Hu*b zPnpF>KF_ZpP30#2plQLt jG zX|#C{(!>ZetCIo(N%d%G?1DOwA0+!gcGd+OKo4CAbmZ-9EZf!f>nv0vWFZTC*oCwr28>(-uG0T~*0 z%6u&Nv9aTbpX|hpR8@eDB=c?pPj>hg_!flA2rmLnd^(6vicI}1X%NlmP(Y(5ApF9g zxPlCv{u62|;(h$f{j&wjz_$>K!Gi^Z{xiXY`%qt#EjCSgy_5$T@*>;}_L5^Rh(e>6 zbNew9PrJo4kCCR{yy?i59txK9pKo_D60U;2r_N zIMJyT86CgTrlhy=t|M=|Y{t8=mXL`=wksPz>0~hqTJy>)67|WsIdgu5F~aQ04lzv6 zk&QYu$l&Zwv4+2iyu@t#&9j!PTavjKHF+mbi8aEx1D6?PL;q%;h zV5c?*HU6J(a{A;SYH-}JzdIl|iG_0gf+<%<(mT#f`H_zR`^y0xj^jPT=z#%%U?%f6 zg1z?7#_PC5*hO8MgdZOC;uYDkFLmwN@uv@Z5+ptG;W^o2Avd24VeC%7t?)y}C@VK^ zlw>6=5)eXm)8EqE64$s=7()K#vwxRbH~s3kpUi5!NB`_`eLg>G%4%up0{!=VPN-8b zb*biU!q!Kw+}3O=I%>v}mb>~}1ffp d=PKR@sZM_9P zp~KWbH15VgkdNSP2D2}f>Mw!c+lA@icRKk4w;Mc<%&5X*emOM2mD8cD-J-T8Mjzq# zf2!}|mk(^9^4)+=f2I*P*K=mg4$QS7Tj)oAP6#b<-@t#zFW1jPd%Ps`fw&a&*ze~- z0|P l~A zyS_y4A3Vy}C+oq(#`ywPE1B>V@*%*+Kzt7ekF8V()GO0I02&XFL}W@gS)-1`{p4LBZWjm~7}^Bc2zaRKyV0qzUH zc+(5G={M-pf$|K+#)Q)iJ!nEmE3~B^G3pV6em8(7e**jo2s<70T0(qip8~bSV)T6E zpMn!j N^Dz$iigw<_U;FZ%%`M4*a?BDdx%WDSR<} zD)$=0I!6TVuS5-3czE2L8>mO!0Q&ReSE$$zPK&J=*;6dc`VrM@tT|*yyhps@7BP-A zX3{)*SZ*obfrDS^pZ4+DFY9~tXGM{>+Vw{s;EYfIYMU_=-s$0Q348cExxw>M7(5Ht z|JZc=i)EbUz=nan<`bWJp6hz0o_uhNH21I}xRJ_^BU35P&xZc>>A;*kQwNur=jNIE zr?_n3Lw)ylr#`t!2=L%mkEJ+2P5 C0ebht@4Y)F_wL*yvd0t&`)6j#GvzfvjcQmY_Trq3eG410o1@pTY`d__ zA=^gEaC(f|z&)sU($G5SIng6QkId0WgFYJc&k;TcT6GHE{kfs%6tWagm*!&LOPb@t zkt9jh>dbL5?(N|54&IWE`c)J6rxWQ^A`Ukpi-I?uD#sHFatVkptCbyGZBY?RtK;!X zxm=L_Jk^{?#}n~{tR-ZrTrj6w(k&gl8Lwyw%_XRk#{I~k4%mz=seVzF8_kqq3U4bZ z5h FtvYjYp?w3O;a?*>Fep9`3ZM^!dbf t&}8)WB<3H#U8D>Ku{ zSTcR4PieTSH|;FzC|kVT=X6%5>wDXsJsQ7By7;Dz=RB-zP~=#v{+;hSS#I@Bi6xzT ztGOeY?(N#_>(R9Ko|);H&bz0`+$qcYm%;X%HYhWlR|OptaIA*<)uUOte35)NcB0vG zeQ<#0CMn6qJ!XHJsxqEvNvnP}g$hlpE+K{LF6S<6J@Auqh$gQh$;@m57Af$roy%HX z6 0=v{Z}4Ns20I~>pnih> zvHqnqBt7%9`_}6>p6)#MuAM8l1sli8!)ABRUhvd&r#H@DnUotkm#x)Lo9|qI{8M|m z_MATUmFHIKos9~YxxyO-4ZUSg<~!+Il*fgcX#*CgJ}Hz-Gs;B@5B0AT&``XMs-((w zLOe~)1}&pGo${v?D5xL0Eo*VFUv=^LNGx+J2rB0(lwVZSEs%ohM{7d6qu2>45yw*n z%_xQ!@hSo!Hy8KIXnt{*kZ6X`(0+IVZ3%MJ5TQeCsS}#fOoVhfZ&4AS8mK=VZ^kPK zLduHEjCxR{a!V?WR)@- +H z<=|! ^mr{bGhuXUF>8yb9avbQg(IGyc_tCM|bewwp>!c`qkrK_X9 zHQ2TB;bihPMft-_&6jR%KpX2`98_ct&8j2j>j>7j_Ba)1b*#0z8ydgSv1V#)RvFs& z6lYKgf Vk 5g_q;X9PFttjimX}M=Yx+ASkk-L&HZGtnY^=j3<$)FN*I@dHzQ4~2S2Yc3O zN_)F9#km|m76;R4Tdh;%vL#)~n>3|5xTc|9tCxF{)ta*-32PZ^b@l{fn$pnIuqNhA zN )IO{${I*^4fVmGvhFImwIK!q zG5Qwwbf>jGnc5%*vYGwz&*axIjtXK2rYqNDBr%Gkksq({dT2{jrKb|jO|3BFFh~?8 z8V65hboheVWR?;YVsq4Zo)&+>gX3&yPJ74N2UeZVr(Lo7ij(;y-uB&O{i^0~ztZ=e z`-d6&&!sqDJQh&sKK=D8mJVFKoiE(UKY8WW<#lGiJ^M2E^Pq=c__qmKh28Vj-}K$; zGg~j3(tPfxdar)R-=6nKo=b&^b$YueaLw{7P!5Sr(6>vvd_PV`KgwQX@34>2`hH5K z*@Z2UQ;nhE$JpRU-QQGnWS65OyBr %7@a|b`68zZc_I{5TZz1%p zI*f|1N3`v@pGA}&oWG{zdJusj0*#o<@#1#8whOyl^3=K<1!;B&DFux*1v?<4)rvBj zDRoJ4v|=2YL5q!*b6?gh#On~f39S)*BHEj&xel#3hHfk-`&?WS6%~!tkAJ8NMNTxs zfKcnkFA2ZUvg0xuJVN4RG|5b)R3eZL8aSG|hTfKPL*tI8TPXVu^r))D(Ve 6A+usOjIoqxmd&a5bDd>9!Pc%zdgR5*1lhS&=?czL zUX+!Y-Rsbob~$fbBP&5Dv(_!g&
qHuViU2y!xC`{QjvQC4yZYm#c74N zDN2{zqsb3QXUMIJwrPr-M3Qpra;K)$``Q<7M&B!U%h*^yRhclWeIANd7MusO(mG-B zlB7>*4JL!_%K2pt9SX(_K@1P@UWcatttZ*KZbF}|%!{=KgMBhuZUf8 $_*A<(V1;rJakxOzTv bFDHYcb`hg1T2h-K+8Zc0=7e za}=H<&QW-NKKxnmXQ8 1~kI2&_m >Dx`8hVtkCyj}c=D=r2H%|7Fhq2L3mA GZ7CO(4o-vT=7fv}oW`&^1@kMb3Wh{9a4zR* zf0_me3Js@WG1OFtNKcfwO5-FyY=oc~qX9hgE9l8#ax~Dgnouw%PNN$qYY>-_JB`sX zo;KomH8M>t2`|h9MhCDFGzJ@KSdlpI5L4wM z;zScaJ+x7}pl^~*bD!0wscu_U$N2M3sFGBhgfmO-6MyGcJx%VeT1j<#B+cGc?QRNH zNs=0~SJ}sRP7Bq#+d}hf?n`irP6}1kP6}0Zh9uRlYKyvTwW`}KxmELtO&&>|W((Qf zRdzd`x@$dB$Zj^fanx5us2L}ut5nUd4zt 5@|~m}Eaea#wpgG+RgKy0bg%9ol$z(@OqyX#81i_RjIOnp>)^l{Q=e zR%$23?Bmr?m0ep`x2Uf+6zj4{9yb_spWRXI4uzU*ZR0znORh4vO L%5FcC6Zb0Yt*Bzcsh@g@&EoQHz|K`o>S2*QE6|xvMT{ z3+ZPBaS*Lf!Ypm&{WsUPRaJEdwKfPc&=s51Iq*SOQ=8T~NtHUJ`~Rrk(4k6IkYA{F z(#G+>7_Zs}?w4v;uIxIqE7WGI>guaiJ>z*%2M%Czd{yV?!Yk4%z#npU!vUj`+pXfj zZWRZ1t2i)|bYQoN1G`lm*sbEgZWRZ1t2nS*#ev-_4(wKOV7H1RzgxwDg-i#QXwiOX z<$|Hzn4|F`-dxP1PC%?-L3l;K?D#cfFjhFX?S$dM(6AF0Ucpm*#IN|1{I93K_4yYo z&i(S!H^H9<{`$dRaegJ(fq_qMC0N8*9q4~{H<^ejiHMb85i7wWR)R&W1dCV+7O@g6 zVkKC_O0bBPU=g-K#7eMe>{B9?(?ggUE$w9a^thX9g+$a}iv2`IoL{eB_CdIHb~8Ws zgjHQ#s~7Uy`Mwng-~DvXRr*W%qc`8IKdS#3Ymjf{*56e&n(S{Dh@v%kT5}H|7aJ^! z4Zn-=o7R;|2m$jNDBa=fue6haV^1Z|uD{b-eAJy=mN#!({H*@jC0q3acP|z7mqo#J z#cAtSOF;DcAA0x7(V}VMm9IU(f5mqkyz`0`f@#@i@dRL#H;DTrpMe>=a%03i<_Tbj z_O@gfM2vYI@L>6`i0jNE5LkLM1e0BYlTZc;zX_AJfF}6M3H;BBVmJ-kNg=d4=7e9I z#Uk@78HD-LS|!AQhcZf;g?v%GEdFacTPMhu*2sVWj}TAMm*ipJEDUTc_o6(&xMf-! za ylW3PbxOO)+@(S8?Wq5ePF?}EXEiPmKcsPccb z-^H}&hxWUyz?g*gyA-hSEEr8tJN9csPte|Ip9|q%qz|Mt0&2;MH6MrxHN|)GB##Si z1K9KeNSt;VV53WR(+l5AyK2aGjTq3)s|{HhdXQgk&nKAGS&`N?vukNs6D*;`p>O`Q zTf#CAt&A8u8u*^}nfp%}*vHQ{)n_*}3^dM`^vS|Q!hWnsX4gsHLS7CwE!)1GxprYf zTc83+P&d+g(tcXgp*0*kXcNMW9lx}eN2?+E%|B3Lqx1qI7&=NCQuq^Bkp2%|GbZgn zv}#Oi4y2c~mSkg7vOLkIVrrjuB$=JoAZhSn0v{5>XziMOD}EE?ZLD9@+6nCe%C4hk z7e;752Cau=;bh2(Y)yU*$!H>nR*?jQ58B`2#2P|wRo|CexF@*Uk>B59GWICY&hD%o zAkheK ce)r=r5aI-|@Y@E|h!m_jkMCq(4qJGN}s~&TyPy90%m|CQKT)qxPR> ze?~9$DbChO+|DDsk&hOhA&Kq6C$_et5_Vx(Wsl+Cg2e{ CJZ#`c5v!C!lXZ7>$9yL>SRugZ>(C zeN!m!zYEm K0#%()kEaV^tvSk&32%F0CvU6U#YYsLk1SB5 z3NgVg@1nki)Sb4qb>kj~*EF2uqsmJF4I#f3>nh~mk;BegQA}#4 7=Bscj=-UxS@$Q6w5B$5) z_$bZ;@b8BI;2S%+20uI1*v0m }|YKu5wZXi^|2v}R0QrAnY0m~teV%elE+Oi3Ly zsR7cjDzbvfNQdYG @jhld$N|EUiHS7WP*SoO zlxw6&B2p5GJ0g+Jgtye^?M&4;A~h1|Qg3|f6knnyA(bxjHPxiNrEQ&eA7vNH?am61 z37fB1dCdd=<%mdEc;%X?G{xtriFc+FHQvbBVe1_=C8d$IV@s#v8#$80CrNgEYT=X% zQ(JvrM W+Z-8jpVJF>TsMVJ5H4rIUMmgB$k-aDMg}j zxh>)w7M1Zi2XEwzD35z0g7>tLX#K|FsJWXYD~*lMOpTq1uT*(U9g$ONh9w*&HAm^c z*FPQRxV%P=ERq*FN=nz)AO*eL*Ocn)jZBEomACd@@2K%g7fRly8t;LU7
VfQ8$6x{`hbysW#og>_zo{*Hr2b5OUDb7&KXxPo7`T(Uuh}FcYd7a z*r?JP=_s#M0&$hr#C?(%60nz?;)};+#}tf9DwvenZ>f|2ik&AdSV^A>yRn3=1t9Ws z*r)CI8soFMpYsMibB{yfDU1&X!~QEt1qw?HWcs ;7pN%(YG#3&SD+RYsKo_p zS%E5W&o3>6Z75Ke7pTnz>V^WfwLslcpnhGTZYxl?7pNTt>b?T?V2*;Ui+A$JXhx@D zG=@Hh-_I8q{uKTjqYwI=-vxgs`y3TB1Jy7C6?qrvnV@H)N@jpwiXMS_hzk*RA)en4 zdK2hPxwv0}{t7+Qex&ueQK?IjZ43H=7R11td~`MiJ_%v;`*`@rqZgTpiSbgSZ$X-T z4npT3bRJ*8?=PftK2isF{Bk_K98Wjra@oaiC{SAq)GfIbcky2rsM`wEjzWGIobdaQ z;(g$d=v|<9fgTO|cc6bqJs5#$SSj>yW-Lj>(^!%K9tJ24h!xh&2wg*$z$#tb1jGsp zXz1_Kw1S2Yy3p!ai q2|xN4Anm~MkN{Ev1Q$o=1<(x3m~jAT zcuR|GKnBs#qBl&bKCITYh=@QPXB>T>qyjNUvUS{xq9qh87I1K!E*BCc0CdX4Ai(>| zM(U^&ajY`5sI<6;l!5NciKaTNmX~AQ9t%0mSj9_Y*}PmJ2oMX0Y4n_4Gl~&y;R3 ztPFZF2x#U?quhudF^<(vc(F9P_JmhW)uGQvkBzmARGmpy(g^^J&1ypBE|c0Jh-xMJ z>S)67@R83IpYOisoNmQ;j{ZmeMSbOi3kSxWD5>`dH(hqHTd)Wo+vIcF*1rDvQ}Z|5 znpfR&&U~9^@_hY6J#ph6{oUVeFvV-_?hr6TscpDqcQ<+5!##Y-{E&TkTlI9Cjh|L$ zcdymDrMAhM zQO K?7L`b{n1mX0#_ z*rjRsDr2C!b27iY+U*(MCaIfh>r`{CWMA8C>vU^@kQ%CMs?*fA6YcguNPls %-2mbym-D z+oh&v$V_+@U-omo%tLiWUNKM&09g<&;;v7ET<$@tXzyrc_4=xmLI>&dg=bAuE_$Vp#;Fh-eYXg!8cy7<; zTi*KRORqo3FI1(v`T94{3IVfSYc@}lYzJ)J)zUO+Q^?)Z*3&8VoOffhHdz{P4v&|b zLLq67$K6&pKWx^9S1-6HJYSOP>^L4#Rco8`l1EjmJ Qk&h*V#Mmos;j7YV8ZvIe4>H zZ4UMPBv2b_3P>Ssx4o`5V4r-?LbbYD0!CduKZLz1^SkS8lQ&DNK3}!Av!^+vpRj5A zi5SUA(u1Ad=efJ>17C4}on4$Iep)TrJFCrh{hyNRIdE6VJx%kNYlY>i*%SI49}jbL zxvtv&4@L4=>jEX=BBv!(; w@5S`{hCZuGn z3 wGcq!9^v zI|BYF amg&QM_U7P=NyWGE@aD40zV6@ z6tIIIJn;bdVC|2bc_6X<$f<`su0rP?Y kCMZw9X3 ztN--n3*LGE?GL|Rt?wPTWbNv+r=xML+j97^htm;uw*L5tCQEV8iq)$ZbdqFIrw37| zbpGKmT#F;?!RH^G7>HOfJRp#qFeJjY2(~hCt^BzMd;{31AtY$jkPQ(yVXwr0;qTB% z2!fOjorN$o8K)sgHcV$GKX@w6YXKU7k)((uf!5Owc-rev2x9&mJI+LyG`GK9NV`q` z{nCi*KYZkd>8Bl2YaE9-DBODKigq0D6pAZG%`{ixEu3vJ&PM&OIt!6M5%nWyAq %M4THQ4%uRHXV2o1{LUu2+sTrCl=TAlCcQZ3chEP6|5J4Q| zV=r*tV&swWZ0b}a*y&7=D(!X_Za4Nk3+xH8Mx?#@lz#3MVRl&r>7mvwNR#rQjpw8V zxjeGyd;X+?DX+1}Ls-RA18V-*MDFMWY!&{m9;pra47OF2D4~!95mU`(*9xFLQPG^U zR7kLbU-3NO$0rQzr?XfCZ}ESa9uca95oaDOqP?4Rrh@bb>C>6fLuVW8&~HjLFD_d4 zDJI>7Vh-LLOKO_k=_)i0>=8da{MhKgK5=>W;3!qf;TuH7xuxjLDC=z7z7%b{Jin#} zfEd{uC%_rj)EL&(7}nGnCSVL}Y7A>?^tCaDH8qAcH3sO8VNH!;O$~drvnRmuiB0@4 z*3@VjNg+9h1sv8)a~uV#73iq(VEe$|vP?g3_1Y!lcyRUCAHMzmI~N>gB+i>Iyt`sW zcd?~ug#I{LjMMMsw*DPBAT`KRbg!T+fwO-r;cSj^&cc VJakg0|MBO+z z0p&V$>h`6c$T1Jx&d;tGr@uRWV8_5dp(wvgmyq`2O&2}#)~2d~txY)gV_6|C8gzV- ziRcfq=R17(GC-UiMLF-nr{%KeJLp_%n9g_jG0)ES3~|FRhoBDi5Tr>8E5|Hn5YCKU zH$Q&T1FH?@|KV8=Qh@*AX%Er`vNLhW?l6p=Or{ 0En`P+(I9uu!&ow)lOBehH`>Hu>v}Xma3PO8A5OID@2?e*xkV|A zi6U`SSl1)tKqt$8aOGgonGR#|VDPC9lHT{vb$oZJj(qTKp&uUae0Qm|LTB0Wj?qU* zD}FF8E%6+RN%}h#Yg=P*mLqVew=IQnFsyH>p~p1PpdN)RLc5s#CPMaOGW2x`r*U#q zcuGITa_q^|`sQ`rGHm(tE6?L>XYUi!^r^<#D)py7A3vt4DN 6Ar74i9<~{h}447(eVn1wxy#N-+iBT|5;#zUjM%*>4_RgD=zF0H~XgqJI3JAb|4O z+dzvxVxMD+$^jfbR(Tm8%_s8dn7=RO%lY}hi>}9KVfOI1#gB|O!ngA`s44I!KGN_X z (zpw< Dzo5CJDJ(L&aw)qclAD!Y*E@J$_0dR$l76pd9%( zFU?VOf*#6HiaWb+0>sg{XW(9ldnNA6a9@Y}4&1-R{S5BE;Qk2rcewEt9)1nrn;QY& z+z6m(Yk{ln2*qj@$8IeC80dE~0^z^quNzAEEPu*S!hi8GhW{#dtC3R1jlLO%4nm|u zZghs$iZFZ}87FioG>On8Lg@>q6uJxFgv?VH6{vNEcj9>G61+qHdid*6MMPf)`m!9o z5j2He0sjhwQ9eHd{j(f>E$C}=^mU-G1N|!EybPNB*Wtg8u+Koh2l_qG{{sC1=np`D z0wk^tqG$vCF~UBENXFp#H=t>|**-|&Uq%Uui*FJ7Ekt<=`+$97gdz`qF5W*E?;{4s z);fMMXz 2Rt7nuxGLzXpeRTAjLfd|7;rsOYsV6@?d0Y?cs>l>v;r8 z%OPIU_mHcPu&qv||L#OO5vT_JS0`q(y)B1kt;J9L7Z9p>^ADhCKRE)!;>|YwYd+Sl z|H |3gUeyT1UZIfPzz9tmDPy4Ez*z&<67u+P`@vkqaO;@brDd?S&->~7tE z1R(VnU_XBz1WNr o!wHbx3l$ z@E(eJa9I|jGv9Y49yqYhW0&}|{|%C6FF Z%w{Z~PM4s+akfi|rf^QGH!-xC=0E`7{9_vHh6ANE_tsQq>UFV+dd zx%v|n_X)Aqn1547G*%om2dC*Z&A+iN!1&+8G01|8v-yd>>O<| z-Sn7njlL~*_OAK&=zBiBZ2doZ^N#EIm +81 z#sr6blZHpV-~TMlKnZ`Yzi<{65U%MB{jvW;dEqNggUUq{UYcyucRw6CG@4E@WxoJ` zbI5}Z9}B aY{P#z%La k#%*=nsb93|e|vtW zZ2Oe<8s+oDI^=6QUqV~%n+4fcik1tbNE $6ESZMi+DdFvW7>M>hy+0ON_x)V`fK72is>Q2pnFE-s2|9;)=p0eoN$;T}^ z^MscFtGz3Mj;c!2@4i>Bs#1`>mMlf`DwU#=K$6N{VM#*RWEDtIHl2j60qLX?X%H0K zw&@ a-s$nKrw1;;3M0ea-OFkp|tq zYYVgm$7QpU&R&F;d92na467U2HY5x!8e)m0@ujR9q&W~FyU?C;ozOm>+Xyu^DtRz7 z3I5(*&Glc0ffB#$==fwdOq~B=9&LEwo90Gdj~p}X2i@3{!~<@!Z-TrM`9db!Lb>o0 zt(6?y+_o1gMbeA&@#4UEabUbSFkT!OFAj_s2gZv7 7%v(?Nik%+T(o&5StH4gJecFmY96ooAV@ysOy8B32TQkEf`js6`1lcarlas$ z#9i~RG)7osj1?R2TlCi7);1*;44FT6@{r_AleKT#!~-$*i+*kPrcrYqx8B`ftf?Fr zBs-7RRut1vr1|XcMUbRsJIF$<@=-h52gph`5ZJlYgEXttUTBInD|0$75KvR%`qcg6 zQ1)Qh!2heC8{$=*l3$_F3<9Pxg&Z_XM!(&iAgfsSo%pby}!bEj4V(Fyu(&j2DJ$ zJ)$Q{ANjIV%1<73(H~UQP8%3+G>SB@0PgRv4-<%&F_5g6YPnpgL#A0w5GwI=^SoP+ zIp|q$^jV4s`bM=)^~BUR;(+`~mPF18WJsO8>-zuqzI4zv`D%0}Yq?I>q;FbNF7U-v zR$bLC>KQdQ yNkb?z_O!yeHNRVg*aV{?_=<$JOTNZew4gyO z;?Q_jniELZK$vD`nu+<^f}mn0Pb!D=O!8kqiWWaZuwI{}<29$KbT--|5l5lUP63 zwGh{)I5QJoPhn?)l6>exd_cYGQVZETYGE4-$y;-wwGk=z#kcYt#80B#ve9mF!h|c^ z&G4TfnTGr{_@WqPj_ODDR6;>C;d`w3Uae)RL^y6xHTf+SnT$6sJ96^W$y3z4^6TBp zGTe7#-!Gxwg6PLMC6}E{!+$Ea=M2z#4%L#RHuNA=KM74?!`_K8Ni|Kq%2?!eZ-@@U z7NbNB(f9bfxxPod{NCj*?st>~E3n=_oV>qk ){DUlev!ndsJ0>BLJsC^AJS=7PGp HE}TUzrO!d>5po1}yTjw1%3ruF1lyu?*V!;01hH=#dF zS8c@LY>H!Ilp5WTo96j3N{#6Jdh>pt#Py?Vz+Wk|W45qZ<7isO1CGX?iJ2l(w l{Yt9YB|c)>vtgHsWwnH6%rJ81yuYpGrwCKc zfa$6253(aOHco!|KPh?6FV}2X`iWMLC)FJjt?HJMqrmTPt?#AWMW^Mhke40c*L;1a z#bXl;7AceMSg!TV#H2Z}Yw-AKuzK0}Y9oVI$xf~dxJG8CRLI1AC1-k#>uax;poukc z1@3L}t<;*N&WD>tce}c-*RG@@>Z@JFUvbs&)fzU3RK*xO|I0pb1HZKh{Wa6*uWs~J z>aXsr_E)Vnsa@>?^<0>|slR4iuU!in`5W}vv{IKL7Xr-eDw)OHx C?E&KZY?{?MssnFvLT$K`Lui_zJaCRYP=(ZF#Ts|mBjiL|9A%uygHg+k3*FF9 zFatEMM=rORd0UPt_f3=S#ssY{H%eEh4vRV^n2dRv%j>sOeMK#g5BR?omWl>VW-|c4 zjBI~orohC8af2~KI&`wF@;=R(l}sFjmnaXQR*KV0lo=X2Cqgg-kLsBeP+g!gr BT;zLB zko;1zOV@QGYXm_EuK)K9bFH&Bytnz>@d@_~wTi==C$S{;9H0c*konsmd-%nLK~Y?- z{*>j9Xq-4M4=sH2eG}rx)MGryk>9Wa# AM zPfOZ(0KX%L9>u6b?-9Yr0p<6lY>b+In=I{dpnE1dfd+Qd-S@>9#^sAC_Z$zA&kUZ$ z{>vzVd&LY7R%bA(ZjMFcFzNCI?)QN_QNnLE4xNEdq0}-N_#DHAlZG;VChaLh5*abb zm|@qlGTY&WVTTun9bOoAcwyM#g<*#mh8 g<(fS z*s-vK9G;9eBsn||Q!VX{++1;Z4FUU+8Oa3%JrDd4ss>W3SsD@iH<^~`$%^>pi|YFQ zChG$oEN{PQz2Won^=qs5sBc;KvB973Vy1mfCf$fBzW%c#;_tp|1KtK`eA5m~2wVpd zq|^`4PgBteNFQe8E`nF3#)~{XGUIsS#0uGG+R^nn&qVW%dP?npyDO!~+07Uv@UyV5 zbg~?l4Ss~AG|yV~q%<3?Qi1w&)-v& oGcgDuH>L{q`m{O@)wB7`g1aS{z zHBVkmmejYv79*xPJVj~Lg>JjRvnAgloCx6v3^^_lJ%SN0=8 z@LXOK8D@PW?jq*U0JK#>VYn~?{BJ5SIVp?S1Hz91cDY5^DeM+rMV5zu5{~ew)=v=w z7{Pdu8In;UyisA*rZ`P%>J*L>kyt;*o% 7pEE `5d)`- zJWOyJ{8MK|ubLM ~?%vV_t)_=5gEUVA1YepE8f zF{|+{EZ(@2d1GtBhGNyhlF?j%wPq#QDzF9dO7iNz$b6hUCZ>7PoyE*XWLhVTL%cI0|%6VSJDK8gR4$M`uN!JFmz2 z7M!PG ~qT=O4rQUq|0XM-kF0{0+W_%Fm$uj9%W1@@8DUHTtyu(b9ov z>5b?cF5> 5LM~~ttojrzq1pD_vst=HWjr?b{Gaup%UHLKgD)ya- z{3NmB4E{fXIUkXs!Y3#bp- 4EK*ne~ujjnt66&W}REdXV5)D#1( z1lJZI7MAWGjI(raA)Z{^ Ycsuj^02?Rz0l86$kRY?n_pU6_ zT!a+SsX)MR)-d0|1gTO+h-+n)f^br=-|UmT6}cARjsjiHD-%u|%f*>WM`~FrzR(ZA zIsK%k4DhBNhXqKdK!Ec(Eeg=<6p7zb=_)VtAQK7DPjQ9Q;wfg5*YEJMFW7_j=a!6_ z@-fh|%Qv?s+2yI~DLIP`OIbB~3?Nc6CxEwB7uxgWwZro4ch#p$V{GzNIZ<_bo9v$@ zX4zNRtYf85?RmNKIFDt@rJd}~cM~1X($>~h4bpuq*H%BKtUk-t^+0^>&sHogs&b{A z7BeJQMMLnOjK~b1zih@mbH|U!m6^YOV9lUpN1}~YT^iLdY2}Z9#|r*%xL$79hnzrX zPc93yIWPVBmC160dj8P49qXpc?8#qkea@3I>X$3$v7Jfd0v>n8Ad|N|JtZTrAinD_ zE5=^_MT2+rIJ0V>I_jZW|NZr0cVjTv#?suugWJ}+)nB+9*+*TWP}m(}ABEiE0YK0E zK2lgUh7N_)Gr@2u5^if->uzJOO&<`vRLveg7!C#7g3`j^LG=ut!O}b1+-u#eEflI| z`$LgKYgt-&+cve<9db_(hvMGx*R8NcvN|^9c^92rk@s?B#fJ3sJ7=a&$;lg9xgx!! zbZB~=xMr(usN~OT?8@C~?>Zz)4?bj{XK%lImN>`dlYKc$#O8aY!oi6na|$AP|M+iD zuc)?~T={p{v+msT#k*2#lW3`FU#C{ZO9goaU7I9!{;fLiqOQ WGIu{PA`@` 7uO2)8tL^9ssG% zF>f+=m`_`hEOnNLEYDibS_9Vk*56q7TF=GV;!5L|#625#*f!ACVtd1O+;*{F3Vz4* zYl$yPcp~9^(!`_}QzqM6?5{df98HepjyIfwv(nk_e9C#)CAucM*1L{orezPyo|e5P zdsp@ar9f#>_9%b$ MXshbYto9vVmofmK`rIDu1~AT*cgqW0jLDU$3gE+7}!W?5JK?{pt|s zkflQo3{4x_GW5-11BX35+&R2y_}>lxvZkiy>6#0*t7^OIYU&=T`(T89#N-h_AN>?> z<0Pye87~RIJ13V%`eBguhU#SzYm`xXS;ES3f?hV^nwff;@+HjG%Vw<67wTmTq~;bV zshEjeY?lkG^)iDF<_o RabFD`Q$)mff!uDx;d0FP^_Z8QI*@ynI1>D~`<5i*=#J%`FR-H5cJe!?Naf zW&DEqi>EF4-Vc^Gw>PvdT()uu9i@ZOv!z8PmC=KANg=(9ze=Daf7K9F6*Ry~{H=%F zHdkmyX$(p&=)Cu%T!?KHjxL8?bv{H{1>!<8&eD+uLOZV1u9?^CXdNJb7xQBa@T6vh zAhh86WdMAk|Jrfac>F&f*G$9ydq75C%8xhTi3@SfN?}O!TI0$q?=8i1O8_!#oaw&O zcuHZkUfs0 2&Q5+p#W277BKdw z3wH~1gc-=EHVq$9Bh(4CXs){;!Hq)&CkT_k1@45U(FUBG*=X3A!f31srl5BvqbEtI zvI*YY r%(=5RXBpcdwMD#+-^0KfCYmP$@zjq2tU<6-`wa0zJ^TPK*?4`my zkYzp4cIKnm-xAtDiV(5|v { + const res = await fetch(`${BASE_URL}/planets/`); + if (!res.ok) throw new Error("Galaxy data unavailable"); + const data = await res.json(); + + return data.results.map( + (p: SWAPIPlanet): Planet => ({ + ...p, + id: p.url, + // Add random x/y coordinates for galaxy map + x: Math.floor(Math.random() * 80) + 10, + y: Math.floor(Math.random() * 70) + 15, + }), + ); +} + +export async function fetchStarships(): Promise{ + const res = await fetch(`${BASE_URL}/starships/`); + if (!res.ok) throw new Error("Imperial records unavailable"); + const data = await res.json(); + + return data.results.map((s: SWAPIStarship): Starship => { + // Add difficulty score based on ship cost + const cost = parseInt(s.cost_in_credits); + let ds = 8; + if (isNaN(cost) || cost > 1000000) ds = 12; + else if (cost > 100000) ds = 10; + + return { ...s, id: s.url, ds }; + }); +} diff --git a/types/swapi.ts b/types/swapi.ts new file mode 100644 index 0000000..4d2a2c9 --- /dev/null +++ b/types/swapi.ts @@ -0,0 +1,41 @@ +// types/swapi.ts + +// Die korrigierten Rohdaten von der SWAPI +export interface SWAPIPlanet { // <-- Jetzt mit korrektem 'n' + name: string; + rotation_period: string; + orbital_period: string; + diameter: string; + climate: string; + gravity: string; + terrain: string; + surface_water: string; + population: string; + url: string; +} + +export interface SWAPIStarship { + name: string; + model: string; + manufacturer: string; + cost_in_credits: string; + length: string; + max_atmosphering_speed: string; + crew: string; + passengers: string; + cargo_capacity: string; + starship_class: string; + url: string; +} + +// Unsere erweiterten Typen für das Spiel +export interface Planet extends SWAPIPlanet { + id: string; + x: number; + y: number; +} + +export interface Starship extends SWAPIStarship { + id: string; + ds: number; // Difficulty Score für Tunnel Goons +} \ No newline at end of file