From 067d8c29af55b7162161c922efe69e837f511a30 Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Thu, 5 Feb 2026 05:03:53 +1100 Subject: [PATCH] Added first setup of level-based system --- BrickPile/brick_pile.glb | Bin 0 -> 30616 bytes BrickPile/brick_pile.glb.import | 50 +++++++++ BrickPile/brick_pile.tscn | 7 ++ BrickPile/brick_pile_bricks.png | Bin 0 -> 527 bytes BrickPile/brick_pile_bricks.png.import | 43 ++++++++ BrickPile/brick_pile_mat.tres | 12 +++ Level1/specs.tres | 20 ++++ Level1/wave1.tres | 13 +++ Level1/wave2.tres | 12 +++ Level1/wave3.tres | 15 +++ Level1/wave4.tres | 14 +++ Level1/wave5.tres | 14 +++ Level1/wave6.tres | 12 +++ Level2/specs.tres | 24 +++++ Level2/wave1.tres | 13 +++ Level2/wave2.tres | 13 +++ Level2/wave3.tres | 13 +++ Level2/wave4.tres | 16 +++ Level2/wave5.tres | 15 +++ Level2/wave6.tres | 18 ++++ Level2/wave7.tres | 14 +++ Level2/wave8.tres | 14 +++ PCs/hero.gd | 13 ++- Scenes/CardPrinter/card_printer.gd | 12 ++- Scripts/Resources/enemy.gd | 22 +--- Scripts/Resources/level_specs.gd | 6 ++ Scripts/Resources/level_specs.gd.uid | 1 + Scripts/data.gd | 3 +- Scripts/enemy_card.gd | 2 +- Scripts/enemy_spawner.gd | 33 +++--- Scripts/game.gd | 39 ++++--- Scripts/level.gd | 2 +- Scripts/wave.gd | 11 +- Scripts/wave_config.gd | 7 ++ Scripts/wave_config.gd.uid | 1 + UI/Menus/MainMenu/level_selecter_main_menu.gd | 30 ++++++ .../MainMenu/level_selecter_main_menu.gd.uid | 1 + UI/Menus/MainMenu/main_menu.gd | 9 ++ UI/Menus/MainMenu/main_menu.tscn | 54 +++++++++- Worlds/GreenPlanet/Levels/Bridge/bridge.tscn | 4 +- cassette_test_image-export.png | Bin 0 -> 1075 bytes cassette_test_image-export.png.import | 40 +++++++ floating_element.gd | 18 ++++ floating_element.gd.uid | 1 + floating_element.tscn | 26 +++++ lavel_sel.tscn | 30 ++++++ level_select.gd | 99 ++++++++++++++++++ level_select.gd.uid | 1 + tool3.png | Bin 0 -> 497 bytes tool3.png.import | 40 +++++++ tool4.png | Bin 0 -> 481 bytes tool4.png.import | 40 +++++++ wand.png | Bin 0 -> 641 bytes wand.png.import | 40 +++++++ wave_viewer.gd | 11 +- wrench.png | Bin 0 -> 519 bytes wrench.png.import | 40 +++++++ 57 files changed, 906 insertions(+), 82 deletions(-) create mode 100644 BrickPile/brick_pile.glb create mode 100644 BrickPile/brick_pile.glb.import create mode 100644 BrickPile/brick_pile.tscn create mode 100644 BrickPile/brick_pile_bricks.png create mode 100644 BrickPile/brick_pile_bricks.png.import create mode 100644 BrickPile/brick_pile_mat.tres create mode 100644 Level1/specs.tres create mode 100644 Level1/wave1.tres create mode 100644 Level1/wave2.tres create mode 100644 Level1/wave3.tres create mode 100644 Level1/wave4.tres create mode 100644 Level1/wave5.tres create mode 100644 Level1/wave6.tres create mode 100644 Level2/specs.tres create mode 100644 Level2/wave1.tres create mode 100644 Level2/wave2.tres create mode 100644 Level2/wave3.tres create mode 100644 Level2/wave4.tres create mode 100644 Level2/wave5.tres create mode 100644 Level2/wave6.tres create mode 100644 Level2/wave7.tres create mode 100644 Level2/wave8.tres create mode 100644 Scripts/Resources/level_specs.gd create mode 100644 Scripts/Resources/level_specs.gd.uid create mode 100644 Scripts/wave_config.gd create mode 100644 Scripts/wave_config.gd.uid create mode 100644 UI/Menus/MainMenu/level_selecter_main_menu.gd create mode 100644 UI/Menus/MainMenu/level_selecter_main_menu.gd.uid create mode 100644 cassette_test_image-export.png create mode 100644 cassette_test_image-export.png.import create mode 100644 floating_element.gd create mode 100644 floating_element.gd.uid create mode 100644 floating_element.tscn create mode 100644 lavel_sel.tscn create mode 100644 level_select.gd create mode 100644 level_select.gd.uid create mode 100644 tool3.png create mode 100644 tool3.png.import create mode 100644 tool4.png create mode 100644 tool4.png.import create mode 100644 wand.png create mode 100644 wand.png.import create mode 100644 wrench.png create mode 100644 wrench.png.import diff --git a/BrickPile/brick_pile.glb b/BrickPile/brick_pile.glb new file mode 100644 index 0000000000000000000000000000000000000000..a1575e0f11b702bf78870d6ee24fe2203d514394 GIT binary patch literal 30616 zcmYe#32|d$U|^V0&cKkv!@%Gb?C)2tlvrGxTB2lCt(2acms*rql3%1`rR1Gal%JPh ztN_xY;FOb^my%kf;HmGgP-d!Upl4*Lq@z@pT2!2wpQmJ{WTa=HRI8&@oSd4Ms$^vV zWfdz~MOQ23CFZ6oSt$jB<#d$t@>5bl5(YYkI!3Xzu?UfBrQFow46t^Xo`Q_jqEsav zrIMn=yyBe160mL226|?OhQ{V*<_1RQ7N#bahL$?I26_g@CI&_Z#)g)r7KR4Kh88*o zdIpBZh9-u_24;qa=7#3x28OYJ=o+oES+0P+(JY%;>M$%v|ciq%odO)N<* z%1q1wg>1D_N`7flPHJ#wN@|LdRY_54D%=IWP<2q>79z(3eC#M9pooF4rAgM1x* zl&lPOltNr1oc;ZST;dIstc+@Plrr;DGLu1Cj1i##awRybQPL62&&1hkqN4<})fClM zGh|!MiLezE+eG@+0%5Bqs;!2gfQNh5&=B3;SRJJjNMu3MKyhMjK~8EBIQWY5ON)|0 z850yCnYoGSpzw;WR!S;OOG_;Z%Su;2=k(ivET3no81hEO(6ayWl5{OZzhDK%}!P2}EB`XsP1CYBbl&qo+ z^-RqS%?%CA4NZ+KjV&xpjCBn4OiU~+4UJ3<42_LV4NXjR4E4+`&CM+h%`8n#EltcV z%*{Y)Ju^?qDq7c2&)mew%*fE#z{t$N#LV2(7*q-v8Jb&|8k!gz7@C`#Sy-6q=o;#o zn3|g#8W@>@N)00mLnBa7LA)8}>TIk8Die_XUDl(8R*b$iU3N6cP=l<`zaK zCKhHUmL>*fCdQz6Ff_IV0Si+zOA`wVQ)2@00Cq6$cmVqX8V*?F(VU1-KP!EU}pY_7*rMEzJ_Q$tfT zBOL=hGh=f@3o}DAOEV)AV3CbT97A7V}2F8{qmIPwKkU*9Oc>)oNSaK7A?1ZWxGZqZ7W+y~6fQkw9 z>=3JiRJ0)%QsB}ssj?*1Cp9mu=U>IO(4Dt}N3ykskz{nic_l9N`1_pRE7#SOw zpy@C-HUeb?BAtxI082AtBON7VC*uorLsMfjR2LW-T7ra#HNeyyUB9u3Ihq6Tg&8Q0 z&>Uc5U_wF=U@^ed$bf`&XKrSJ<^VHeQ#2po3qo+og`DP%%ni|#oiV7MhqfUgIVd+V z-7Pbx1k|LkGzUd_Ze|`_z|z75qybWmLezsSfMqiya}xuL+SpowYz77=Pd^5W4f^&u zzhBwjeNeU^7yFupru~QcbM2~x7VO8x{?LA9ufhE7wu&*C`*E?G6j}B?I5ELaE@0+< zT|VdFh1M9=~d%?Tx70pd zY$^Hsb|ClgznriS7n?zBzrFbFt9!E!x!L1lD?dAKFIAsom--;s9v9oJI^X_j&g{Jh zBUanvV(;s1uou7GVz>YKMtfZBM_cCEYix+w^Cp4S9v7Rnb-DfN3rp;t*9qC=N4%{?SF_p!#2I$xY!#zCfi>Lsj#;=d2lZ-w(qo7dlB9nwx3@<-G__aUcJV? zDZ0`wtDb8=E_UGwTl*RRL+rl@ZQqBBU39Y5{#r17Waxc+xiS!^K{=yVd@O z!kWEZ31{tavA11WZ_n_l$y%=HtsO45-kAvdviW-UJR-a7aIxj;r`cC&y4o*Ly=8}s zy=P7z*gXt<;l6XgXD=>x*H&darI>1aO%En}T%4j20m^X|QCp02bHdr)A9 zi+#J=&HhT0vVEMtiajoNbwHW@{Juk+n=nr+iw4S4|`l}`*)T5ox^_G?OEGnkBdFoC~SY_p>CA{`wM;M+JDgrvB$+e63GR256_}Fdt7YJ8M0vaJX$y19v6Gpj?eo*?&&O+ zw8zC>D8&nQkCT3uJubF&6w`iIH5>bf)%o_g*f*mj_KRk>+uw6SoyEVoUig-v@G!2*(n8T;_`*yh4R%-M1 znYi}b_q>}`%>~XPo z{D|Fa?AmXCkL`^uF7_-tHn4kI3mxomvF+rR?swWHYj^z-uRSjI!umt|H%2eE^Wb!} z$Hg{U(Xc;eTco|m#W{Ak*i$*@?Z5P^(O$Hl(H?>@ z9v3_3uM^lk6B)(qaj}gK)Pmi^q~U3gi~VHkhW(S{3+!}i-RyC(PtH8Ke>K}%JGbT{ zdtB@m>CpXi8oTXya@N@6VlSK6yx&fT!CoT&kUcJT5ZAH&m0m`B%N$GWak0($?(bKU zwzWH{Ji#6pTc4?6|FZjgcN_X0w#UU5W1G4E$i8Gd+rXRlxY$oFbnI`~s%-yY;n}^o z*a>Tw?H6rMvH!WYX)i8zufxB63)!aIKiluL4;S0vrq%wO-0k*XTxIv+VqYt51iME= zwZje?QpUEYS!#OkdS6`fOGR6 zTe)vmp`*t6Y}_h0^~YM+sO%oZ2>&hN?l+xVmH8Qwg!!NpFA+5vV? z+JZH9xY$LTZh_t7qt{@VQ;`*5)<*^li{@tnSwi*3t3TrQyuuZo?s4;S0g(!}PjPl)|JHh%j94O4C1F7fTRToi22?^|zw;~Jyw z#~B@ak<}oJA844m*XV5Y^4D4sgnb`Z52=9$sXSzRs zwf8<=ri%R&dc^nTulBa%WvZ~B&?9b#OFgnUvff#8Ci{I$gl*&2ncCwq2d)N}8^V|9 z?Jv`>w!0r<0CF4LJ;>_O)WF@3ERM%LaPyJX7x1I0@Md#Sy5!eKkbV_Exyy58)~ z+?KFEOYzJ;fj{kbc+}WuDW0(t_|v`*P0c>VV_Eh=U2kl0nUlFK0j}3O;V@i1vKtIN zrtE{dZ9lR($ZC+yK~|5w0V;~QpwXutekWc6rj;CkmA3f*tT!DG+UQG(ALxEeGw_d?ya zAK5*4+yGb4$1(}dM%Ih$9%OTn)g!BMIa_bnG_`zx^G_#RnVI(B_?lT&ZQo{Ayg$XX zXj#%|T|u%|TX=tOnV9WH%hMwE&mB zdV3A`<8cqN8o2wB&BtR7+?~j3HaHpCi(i%5|Gsd)-BPPh;PkVqGtvH)CfEMk;a>YM zBuv@&N|Vd}cDR@Qg@h?~xYXm)yTQq5zxY)d`}c+WQOrSBkE~{?)hBSguj)+Pk8BsR zdyv)OaU0wmWWBiTLNf>MW)-v5wlUH*`>no6+nreWX#C4l3iCF`3V zni{*NyM}hs46*iTYWBuR*VtQqk=}>PoD&N_!S$+`t%j>dGY9UTC20xZ^xTs54aH16 z?t!aE){ATxvfGf|gG;@WdAA*pw&ebapB?rG-1FZjuIRg;O<2Ib_(B0Vd@gNYyAN61 z$-H|XkG7=!#Lo`sYV5=neeKzV1@_}u()P7>$ZjaUP=Hk&*=+&$ z{E_W~`w>kqTn(}~vN>jcadsbjH}Csvnz{dM!?L}5_T}%ty=0wTFl!|^e7Y)g_aTd$ z`Ni$~*t^;8uW6<|ni|_Z`||B?FIl$_*-SiYu$qIW7aR^naJk+cCNFVcPno{LrCks%NJDkcU$b(Xa7*g-ox7x96oAG4EFzauG=^7 zR-QdWNUI$lHOS`JcU$bRvwx_wAK9GC7gXTl$Yvs|L3WRawnbBb$S) z2H6~Bd(q5v$zOD}!M>Ypp z4IXpgZa_8%+0Dpi{@JBz|5E77zE_8Z_v=gV*!O@laetfr0=usw8sM<%5O>5W{%4ow z{+B{u>|Pxfw%3>5VfTPD(Z0=o!9HX&(aeFXK^8|g=c|YY*zXm2m!jxkKj+%FeW#lQ?3oT~>=%vsw=eUo!T!y^oc1d2wb+lQ zWq`InQe;$91TWOFjl8oFM@ z7hD`!FS2`(%|W&c%}lr(kj0VBENIoS-)3OFU%l$a-sd~y!0n%p&ujMUez4fjI$v); z5BCdOWbuMlo&DPktnJmSZrCELK{iMCgM~dSXe|f#3v@HFiX)r(e1{yk-SY8yjXj!~ z$nHT_gVjBF%t3Yo+#F;#BfF=Bu>q{+=)Lm&`8jU(!P%1gH!}Fz8TN_n7klfopS@mk zAF>)`@%$XO{lVFi_8S>|(bd?Cz4ftYua~q#HWSSpWHoSe(A0zD>*&35dt`e{7#pyP zBfH12PXyU~xWCZ!!qp&)Bb#IMTh4w7&$E3?GgR!|xFG$DhEIn3eV)$Wr?oX@|H1gB z`*4Zd{Fd9lgy)&v(hL=ldONMHDfS2Bm)hYm6Rrl?Ok{JA^`f}}Tpl)jGPFk)N7n1c z1?hu8)xhmSHWQB;xL=UfNPP;j`|{Uyzj~#ly@gZ}xQzOqwrt6K~w zMMQ7!!zG@wVd1_*8h7l}+9LL=ELv=vUYTYuB6`~nkC|{a$Yvs&gRB?L4g1}SyY~9& zEw)1zN7ie^QG~1pZWpqdc+|lCf~A8pH>&VHm_m76a4q}7kVKhh_#Kwj}>Ok_y zG)x^x9K=SZLFzzaFdD=LVGtjt4#Wpx5FcF}#)r`$b;uYd4x&NgFdD>$VUW2nHb@@C zN2g)(AQ~hOqCps09f*&N@u`F91F46p1JNLHkQfYu_{icQK1>cqgXCdskUWTwPQ&Cu zG)NvsgVcf8Fbv~^XqY;f95Np!k4zI%2a*S=2hqrwkh#e6AbrSuka-|Jhz7}_V~{vV z9wZK;k@+AoWIjwDBo4zMc@P^!W0METfy7}nx;hviCJ&-v7^Dv*58}gU5E~>8qCps4 z9L5LHFm)grnGezj!ys`G8$`p@f%wQ6Bo5+(XmoWjK1?1&W5Y0YAQ~nQG7rXviGygE zIEV)EVQN5p5F13p#F1%aagaI~28n~%AR43|MuWs)d=MKX4x+JPm^u&*lSft$69>^S zaS#pSqpL?2hslFzWO0}t5DgNC(dg=6e3(3l#)e_)Ks2&Eh>vVOOb#XvqG4jl>R{p^ z8YB*)LF!;Mhz$}4(J&0+gXCc}NF2rou|eV>8XJbG1JTIxAU;eVG7S<3sRPk4aS$Jb zL41%nh>c7mi-Y7qd=L%8AU;Svj0TCr_#ie6gXCdskUWeH5=ZC59Rq2eGkXkUEe&G7VD)5(lwiG>8qu*wlmMVB#P)vObtNhz7}lFiajq z!^A-}HaFh2DlH6VEy4bu;zVd5Y;5FbXv#6dJj97KcU zKs1OCVxwb_I7}WygXBRpNF2n5VQhSmI*>ewMwSQhLE8wAgYiK$ObjFs z;)7_A7>EY(L2Psk5{JoyXplUJ28n~%FpP~4QU{Vprm?95sR3b-I*>ew2Jt}{#s|?L zJ_v*4L3|L6%m=a2F-#qd2FZi;f%qUc3}fSi)PdwdG_pL14-$uA5FaKFqCtF^9E=a5 zL1N4doD2*MoD6IX91PqH;tU)N;tV1T!VIDe0t~_o0t|c%ybSydEDXF1EDTHx>Aq?RRJ`5oY zJ`A1=0Sqw=VGIEbVGLdju?#^Bz6`Mpz6=oz2@J^$nG6XGnG9(R84TGB=?ujTc?{_cc??Mmr3_gNDGa3yDGd1xl?=5E zO$?O`O$>Dm^$g7n{S5UC{S4g%EIm1GRB@7E0 z<}u7+SimraVGhF-h6xPQ85S|jWth$|mthjaQihoflNpvWOlFwRu##ad!zPB644W9% zF>GMi%&?zf1H*oXJq)`T_A+c|*u}7&VGF}nhMf#+7`8I3VOYVio?$n`Hiq>K+Za|c z>|@x-u$o~X!)k^d42KwwGMr{O#BiG71j8|gQw-M`jxk(kxXf^g;Tpq5hD!_=8O}1C zVK~olnBfe=VTJ+-A7RaG&8d!xM)43{MztFuZ4Y z#Bhhl zGs8cI&kP?KzB4d0{$cpe@Q2|813Tj{hA#~4j9(ZS8MzpF8HE|S7=;-H82K3m8D$yy z8D$xz8D$vd7{wW77{wVy8O0bS8F?7R7yZC8TA>B8TA=;8TA+q8C4ne7*!dS7}Xe! z76g7_As>7@Zic7@Zg$80{Dx8GRY;7=0PN7`++&7~L7Y z8QmFO7~L2>7_AxI7_AvC8SNQ;7+o3d8C@AI82uTY8EqN;8EqLo83P!D86z137$X_O z7$X>?7*iP|7*iRO8B-Y37~>gJ7~>gZ8RHle8ABQ47(*F@7{eKp7-Ja28Dkg&8Pge~ z8ABM;8ABKo7&95O8H*S*8H*ST81oqm8S5DH8S5Bp7^@g-8Os@~7|R(;7|R$d8FLxS z7;_o381opb8A}=S7)u#580#5}8FLux8FLsb7#kRy89Nyp7&{r;7~2`U7^gC}Gfrik z#5jd<8e>1>6vlqWUdBGg35+d_eT*%PO^h9klNoy$I~aQy8yTlFb~CmzPG@XooX9wn zaW>;3#+i(Z7#A?kV_e9%mT?~ATE9%Vetc!cpd z<3YwFj0YL_G45qNz_^uhFXL9mO^n+Z4>9gx+{U_Y-VcgGnlJPX- zCB~DCml!WFo@2boc$e`U<6XvEjCUCCGu~vp!+4YN8sk;Q>x^d@uQHxtJjHmP@iyZX z#`BC<7*8tHJ*(>1P@LCZ?ta@sh$UEnBu zdMJ5Em!iT64$Y8LOdLBti1@iaFR6MG=)>}yk?F_Iu%PO zZ{ujiZRwcG_x#+2N{(aF#X?!1zh2;3ZXwHZApAhR)RNw?{;!g`_f>ZI=12$qaB(?W zwK+7kV(*tN5$mozDEh&Fp809g&RL<)vl#X~Dt%@8_O#36z5W+>%CHymba{CNsi{s` z5_HV5fpN(Rtaw%zXWqA^-RMd4$z3)n8?z-f z-M2}~O)NWJY^gMLN!;l@cRxIxG&gG7`|RP9st z^j!G*_JrCI$G4O2e|>9zlDYU*jPuF*Jfs&-N3v1klsf&t;ucLKDLQ zvBmq=8#wPXJ6gIQ7u#U9*nZ)d{=KcQC+^3^E{OWEckWppd(LvF{kYf`VJG&vuhX`_ z+flF|7yCUI$9~~&G5aC{HTL6T@740%fBo5^y;{j(`*E?ii>}`16vJj8%Jym>F81nG zQv2W9sM<4#D(}a|*3Of#5Bg=dFU{rMK3r^%Gk*3xOHS_fNwM6Ii`|#=-i|R<#Qs6c zynVRXDI$9IEbq1KyIKVI<6_^Cm}dua&xQ!&{kYhjS*&39oSap<9~WC8$P(hKQ4A@s*hbJqpqiV-wqdh z@1uKm!K)PQZQcmj;bLFf?q)B}Z)jh3ncofSJubFl zc(onKJwDe>?QyZQoaftt-1GTMgFPr$Hi{(`nwn8p2JDe_PE&Ro|x@dhz;F0%aVUTE_V6l zmi->g~tHwl_E1uTm~*FZZ2qKQ8wAnwI@hCq(V%uhQF(iye70V!upm=)RDU zsC~HDd(KYX?;;VhPiNwqeYn`Cv?KPbm5bV^c}4ES#r|40b$`qWQF{}fHT!U}&3*~l za|w3au6P)*fA>0fd%>hl`*?&{?Y)20?NbiP-=EXbxDQzkviR(dl5d~W(P)RP9?eW#YT)LesYiChelEf8y(=CDpt}t&j>|pBW}5vHf~!Y!Gh7_m zoSQnTc4tr=xi0z7XY^`~2Hm_nz2VydPOSe((G}3rp(l*B`Fi zi>wCOoDk)icK+?HwkNh0+av46C5~(+nmNdB0Q?_IKlOvYP$qik7f?sJx6{)*45h`jX^OJk9)xBAEX{xFS1?8ZbNnt zF7-z{=h{tr$i6>G!)yP#AlH5NUnBO0Z?}o=@9Mp{FX^?+=f*g*==3D7jd}=jzWws|*}D&_ZnrCQiP$~ufBpWNlvTTs)gX(T@#pVf{yy9Kpz8L0WiAoc z)Be}n*QBhnLRODvCN4E_bI{Zyy8*lgcs75&J+d44)V9OLak&TCOl0+FZpLa3>FX6i z^E|Nm9}o@WgJ{tF4-8}DgVclMK{UENOdLkT^CaS#oXgV7*1 z41?rhY>+&Nk50qnK{QAnMuXIW*f0#@!{k9?AU=qOVGtiC529gw5DilU5{I!t;vhbV z28n@a5Ff-w#~^W-JctI#gJ_UAhz-No_#ky4d1M-!I*=L=2B`zdgJ=*RgkgLTjm!tJ zVd_9MOdceTj$!i1G)xUlA2JP62a<=;AT~@M#6}l~@j*099f(HegY>~LNF2ll(J*x& zJ~9T0gZLmCT^)=MlLyf-3{wx{gVcd&5C(~ZXb?shhw(u)OdW_u=7aRXFi0H42GKBe zAU-k%iG%nc8eJWX50eMc*f2~Th=$37%!9FE;vgC(4x&MPm>Lit#0JqYaby}<9Hb70 zLE<1bhz6;L(I7DxAH)WUgJ^6RrVd2Il0WtQZU#tQag9%o!{hTp7$6Tp64h zTo~LL92s1|^Yymi`FdLhQwAdjGX^IH8wN858wLXgHwJ4469zX16DrQvCo!ZlWHTf& zWHV$iq%mYMlry9;lrt2g&DZBMBs1hNBr_y1q%)L2=j#(0N*OYt^YsM`RSdNZ%?wox z%?u3;bqtLRy$p2>y$oFpJq&#e?F>B(?F_99ZQ%L(Hil}3N``udZiW_ydWIH;3Wk1$ zCWab@e(-$#B!;OBvl%8a%x0LuFpXg*!%~K63`-dnF)U$N#xS2@3B!DbxeW6d7BEa^ zn8z@gVIsqHhQ$nX7^XAKVVJ!zPCH4C@#+GVEno z$FP@S7sDQgeGEGo_Au;V*v7DxVLNobeig$8hTRNX7&b6$VOYtqpJ6k@T88}$YZ-Pj zu&vo@cVK6w?K~?tLY@7%*e3Gg`(Bib?5&?zydM`k;TEf%c++3ICowDb z;bJpzU9%2g(6s;ME4?2Vdy&u1eIWNt*vh&e7klNyA7J-LUiI0Ji+$i^$UcyJ3{IHt z!^M8_bLBpedo+|^?!(1?%gJkJr*5$C-yX63xY)8;_I3+`9c-Q*PuP!(owu^ncEXzf zb{e@x`*5+(Wxlgbd#Goh>hpFVE_Q=^=01>n_AFQ1kBc4f+-x7nJxezg?8n89-Zx_( z$UQ0&Mf-5E+hpqZf!yrm?*`GM!$=s5!oF*o?)wtB6ZczQytfaRc*n}^`!YqS zUS#!XcER0nF}?=ucjMjK`_R-Ny9ZefRyQDeFnN$T48!C>G)N3YgVcf8=olmp zlLyftc@PZ}2eDxo8y}<&BoCsI8AiG$RE_%Is828n}cWDJrAiGyg6IEV)EL2P6i zBn}euuxDgoW#D39WZ*(u?=8e2%D~Sc#K6zM!@$cR2wm^Zz`)KR%)rOM&cMgO#307N z$-vAY#=y)Vz#z#W4PEc8z#zw<$e_z0$DoVWe^g~qXOLk~WsqTzVvuLhW>8^}XHa2~ zV9;YwW{_pjV~_>+A5EeCM>7U<25Sa426F~C1}BvMqYZ;SgE4~*gE4~vg9U>#gDryv ze7&~`gDZmxg9C#ngD*ocgC|2UgFk~GLl8qegCBIgcPv8$Lli>L4)1|Nnv1|Nn<1^|#C%oYFu literal 0 HcmV?d00001 diff --git a/BrickPile/brick_pile.glb.import b/BrickPile/brick_pile.glb.import new file mode 100644 index 0000000..9bfcfc4 --- /dev/null +++ b/BrickPile/brick_pile.glb.import @@ -0,0 +1,50 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c432msvkrfva1" +path="res://.godot/imported/brick_pile.glb-932c44dfae50ab3e5b291c66d7513aee.scn" + +[deps] + +source_file="res://BrickPile/brick_pile.glb" +dest_files=["res://.godot/imported/brick_pile.glb-932c44dfae50ab3e5b291c66d7513aee.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/fallback_path": "res://BrickPile/brick_pile_mat.tres", +"use_external/path": "uid://chic6b8ci1rrv" +} +} +} +gltf/naming_version=2 +gltf/embedded_image_handling=1 diff --git a/BrickPile/brick_pile.tscn b/BrickPile/brick_pile.tscn new file mode 100644 index 0000000..0cbbcc2 --- /dev/null +++ b/BrickPile/brick_pile.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://d1gauy86jxpnj"] + +[ext_resource type="PackedScene" uid="uid://c432msvkrfva1" path="res://BrickPile/brick_pile.glb" id="1_x3ssl"] + +[node name="Node3D" type="Node3D" unique_id=625195104] + +[node name="brick_pile" parent="." unique_id=1818861113 instance=ExtResource("1_x3ssl")] diff --git a/BrickPile/brick_pile_bricks.png b/BrickPile/brick_pile_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..15ee626177dc55c6a1135266fc02d076b1f985e1 GIT binary patch literal 527 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U_9yR z;usRqdNzD_?qLG~TftigTN#)PzMZ>wIeTz5aC{zf2Q-C_NC^WyU&cGDZyU!c2OYOHYJ-g!Kt*$xNleb=7AbYdT;@n(!vyOZlM=Nei$5g)O=Pp!o9Fr~< z%KH5E0?%>_S(XFg2kNDk^oI3+mCU`bvcoq=I_QUs%h9UMp{W&nzif$EcjZCR5B~Ga zPm^}e3Voi%u;)?fE7P~9T^{fCzqnI|y^yEN%PUAtb;^>UV~!1sOHOEoe(yN_G|%Z+ z(XpMK$JUFLpE_=INn&bh!osJ|YcrTMo{RjmHJE)R_EaQ9Z1on1fkzAf!WPnu8evPs#PEvf0gO;T=R+3{jarKwBePVc$< z;pwEgQQIc}jaoNhbz1J%&8!-G7cmBU@!dQc7b2%>pR%Xt!q>Ma)Q&j5opk@}TlF^6iA%kf-oK>mkK%u}p9~BP44$rjF6*2UngE void: var wave_preview: WaveViewer = wave_preview_scene.instantiate() as WaveViewer pause() hud.add_child(wave_preview) - wave_preview.set_waves(game_manager.pre_generate_waves(), game_manager.wave) + var wave_list: Array[Wave] = [] + var i: int = -1 + for wave: WaveConfig in game_manager.level_specs.waves.slice(game_manager.wave - 1): + i += 1 + var new_wave: Wave = Wave.new() + for enemy: Enemy in game_manager.level_specs.waves[game_manager.wave - 1 + i].enemies.keys(): + var enemy_card: EnemyCard = EnemyCard.new() + enemy_card.enemy = enemy + enemy_card.count = game_manager.level_specs.waves[game_manager.wave - 1 + i].enemies[enemy] + new_wave.enemy_groups.append(enemy_card) + wave_list.append(new_wave) + wave_preview.set_waves(wave_list, game_manager.wave) wave_preview.closed.connect(unpause) diff --git a/Scenes/CardPrinter/card_printer.gd b/Scenes/CardPrinter/card_printer.gd index 359ff78..1f14985 100644 --- a/Scenes/CardPrinter/card_printer.gd +++ b/Scenes/CardPrinter/card_printer.gd @@ -72,9 +72,13 @@ func randomize_cards(faction: Card.Faction) -> void: spawned_cards.append(item) -func find_cards(faction: Card.Faction) -> void: - var decided_rarity: int = generate_rarity() - var card_choices: Array[Card] = get_faction_cards(faction) +func find_cards(faction: Card.Faction, rarity: Data.Rarity, allowed_cards: Array[Card]) -> void: + var decided_rarity: int = rarity + if !decided_rarity: + decided_rarity = generate_rarity() + var card_choices: Array[Card] = allowed_cards + if !card_choices: + card_choices = get_faction_cards(faction) var cards: Array[Card] = [] var valid_cards_found: bool = false var testing_rarity: int = decided_rarity @@ -123,4 +127,4 @@ func _on_static_body_3d_button_interacted(_value: int, reply: Hero) -> void: return button_collider.disabled = true $StaticBody3D/AudioStreamPlayer3D.play() - find_cards(reply.hero_class.faction) + find_cards(reply.hero_class.faction, reply.game_manager.level_specs.waves[reply.game_manager.wave].station, reply.game_manager.level_specs.allowed_cards) diff --git a/Scripts/Resources/enemy.gd b/Scripts/Resources/enemy.gd index 308c0cd..ca1f7c8 100644 --- a/Scripts/Resources/enemy.gd +++ b/Scripts/Resources/enemy.gd @@ -9,28 +9,8 @@ extends Resource @export var death_sprite: Texture @export var sprite: AtlasTexture @export var spawn_power: int = 10 +@export var group_size: int = 5 @export var health: int = 100 @export var penalty: int = 10 @export var movement_speed: float = 0.5 @export var spawn_cooldown: float = 1.0 - -@export_group("Spawner Card") -@export_subgroup("Common") -@export var common_group: int = 1 -@export var common_cost: int = 1 - -@export_subgroup("Uncommon") -@export var uncommon_group: int = 1 -@export var uncommon_cost: int = 1 - -@export_subgroup("Rare") -@export var rare_group: int = 1 -@export var rare_cost: int = 1 - -@export_subgroup("Epic") -@export var epic_group: int = 1 -@export var epic_cost: int = 1 - -@export_subgroup("Legendary") -@export var legendary_group: int = 1 -@export var legendary_cost: int = 1 diff --git a/Scripts/Resources/level_specs.gd b/Scripts/Resources/level_specs.gd new file mode 100644 index 0000000..d8ac77e --- /dev/null +++ b/Scripts/Resources/level_specs.gd @@ -0,0 +1,6 @@ +class_name LevelSpecs extends Resource + +@export var hero_class: HeroClass +@export var allowed_cards: Array[Card] +@export var waves: Array[WaveConfig] +@export var points_blocked: Array[int] diff --git a/Scripts/Resources/level_specs.gd.uid b/Scripts/Resources/level_specs.gd.uid new file mode 100644 index 0000000..123e1e3 --- /dev/null +++ b/Scripts/Resources/level_specs.gd.uid @@ -0,0 +1 @@ +uid://dalgif6huggwg diff --git a/Scripts/data.gd b/Scripts/data.gd index 13e7ac0..46408a3 100644 --- a/Scripts/data.gd +++ b/Scripts/data.gd @@ -25,7 +25,7 @@ static var target_type_names: Dictionary[TargetType, String] = { } static var weapon_recharge_delay: float = 0.5 -static var starting_blanks: int = 1 +static var starting_blanks: int = 0 static var starting_cash: int = 15 static var starting_lives: int = 144 static var player_energy: int = 6 @@ -103,6 +103,7 @@ func load_mods(mod_list: Dictionary[String, bool]) -> void: load_classes() load_cards("res://Cards") + func _ready() -> void: var mod_dir: DirAccess = DirAccess.open("res://Mods") if mod_dir: diff --git a/Scripts/enemy_card.gd b/Scripts/enemy_card.gd index 672c13d..204ac1a 100644 --- a/Scripts/enemy_card.gd +++ b/Scripts/enemy_card.gd @@ -3,4 +3,4 @@ extends RefCounted var enemy: Enemy = null -var rarity: Data.Rarity = Data.Rarity.COMMON +var count: int diff --git a/Scripts/enemy_spawner.gd b/Scripts/enemy_spawner.gd index ae2b5a1..411857b 100644 --- a/Scripts/enemy_spawner.gd +++ b/Scripts/enemy_spawner.gd @@ -32,6 +32,12 @@ func _process(delta: float) -> void: return for enemy: Enemy in enemy_spawn_timers: + var enemy_code: int = -1 + for enemy_in_pool: Enemy in game_manager.level.enemy_pool: + enemy_code += 1 + if enemy.title == enemy_in_pool.title: + break + if enemies_spawned[enemy] == enemy_types_to_spawn[enemy]: continue @@ -40,12 +46,15 @@ func _process(delta: float) -> void: if enemy_spawn_timers[enemy] >= enemy.spawn_cooldown: if is_multiplayer_authority(): if type == Data.EnemyType.LAND: - networked_spawn_land_enemy.rpc(game_manager.level.enemy_pool.find(enemy), own_id, enemy_id) + #print(enemy) + #print(game_manager.level.enemy_pool[0]) + #print("Finding " + enemy.title + " in enemy pool and sending to spawn with num " + str(enemy_code)) + networked_spawn_land_enemy.rpc(enemy_code, own_id, enemy_id) if type == Data.EnemyType.AIR: var radius: float = 10.0 var random_dir: Vector3 = Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1, 1)) var random_pos: Vector3 = randf_range(0, radius) * random_dir.normalized() - networked_spawn_air_enemy.rpc(game_manager.level.enemy_pool.find(enemy), random_pos, own_id, enemy_id) + networked_spawn_air_enemy.rpc(enemy_code, random_pos, own_id, enemy_id) enemy_spawn_timers[enemy] -= enemy.spawn_cooldown enemy_spawned.emit() @@ -58,6 +67,7 @@ func _process(delta: float) -> void: @rpc("reliable", "call_local") func networked_spawn_land_enemy(enemy_num: int, id1: int, id2: int) -> void: var enemy: EnemyController + #print("Received spawn rpc code " + str(enemy_num) + " for " + game_manager.level.enemy_pool[enemy_num].title) enemy = game_manager.level.enemy_pool[enemy_num].scene.instantiate() enemy.stats = game_manager.level.enemy_pool[enemy_num] enemy.corpse_root = game_manager.level.corpses @@ -116,22 +126,9 @@ func spawn_wave() -> void: enemies_to_spawn = 0 enemy_spawn_timers = {} for card: EnemyCard in current_wave: - match(card.rarity): - Data.Rarity.COMMON: - enemy_types_to_spawn[card.enemy] += card.enemy.common_group - enemies_to_spawn += card.enemy.common_group - Data.Rarity.UNCOMMON: - enemy_types_to_spawn[card.enemy] += card.enemy.uncommon_group - enemies_to_spawn += card.enemy.uncommon_group - Data.Rarity.RARE: - enemy_types_to_spawn[card.enemy] += card.enemy.rare_group - enemies_to_spawn += card.enemy.rare_group - Data.Rarity.EPIC: - enemy_types_to_spawn[card.enemy] += card.enemy.epic_group - enemies_to_spawn += card.enemy.epic_group - Data.Rarity.LEGENDARY: - enemy_types_to_spawn[card.enemy] += card.enemy.legendary_group - enemies_to_spawn += card.enemy.legendary_group + enemy_types_to_spawn[card.enemy] += card.count + enemies_to_spawn += card.count + #print(card.enemy.title + ": " + str(card.count)) enemy_spawn_timers[card.enemy] = 0.0 enemies_spawned[card.enemy] = 0 current_wave = [] diff --git a/Scripts/game.gd b/Scripts/game.gd index 2ac8c81..af88ff7 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -33,6 +33,7 @@ var shop_chance: float = 0.0 var stats: RoundStats var card_gameplay: bool = false var level_layout: FlowFieldData +var level_specs: LevelSpecs #TODO: Create a reference to some generic Lobby object that wraps the multiplayer players list stuff @@ -196,13 +197,22 @@ func set_wave_to_spawners(wave_thing: Wave, wave_number: int) -> void: func set_upcoming_wave() -> void: if is_multiplayer_authority(): - var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size()) - #var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool) - var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) - #var new_wave: Wave = WaveManager.get_test_wave(level.enemy_pool) - set_wave_to_spawners(new_wave, wave) - temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) - #networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0)) + if level_specs.waves.size() == 0: + var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size()) + #var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool) + var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) + set_wave_to_spawners(new_wave, wave) + temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) + #networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0)) + else: + var new_wave: Wave = Wave.new() + for enemy: Enemy in level_specs.waves[wave - 1].enemies.keys(): + var enemy_card: EnemyCard = EnemyCard.new() + enemy_card.enemy = enemy + enemy_card.count = level_specs.waves[wave - 1].enemies[enemy] + new_wave.enemy_groups.append(enemy_card) + set_wave_to_spawners(new_wave, wave) + temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) func temp_set_upcoming_wave(new_wave: Wave, coins: int) -> void: @@ -267,7 +277,9 @@ func end_wave() -> void: var player: Hero = connected_players_nodes[peer_id] as Hero player.hud.set_wave_count(wave) player.currency += ceili(pot / connected_players_nodes.size()) + player.currency += level_specs.waves[wave - 1].bonus_cash player.energy = Data.player_energy + player.blank_cassettes += 1 if level_specs.waves[wave - 1].rewards_blank_cassette else 0 #if wave % 2 == 0: # player.blank_cassettes += 1 if card_gameplay: @@ -281,11 +293,13 @@ func end_wave() -> void: #tower_base.enable_duration_sprites() tower_base.iterate_duration() if is_multiplayer_authority(): - if NoiseRandom.randf_in_range(23 * wave, 0.0, 1.0) <= shop_chance: + if level_specs.waves[wave - 1].new_shop: networked_spawn_shop.rpc() - shop_chance = 0.0 - else: - shop_chance += 0.09 + #if NoiseRandom.randf_in_range(23 * wave, 0.0, 1.0) <= shop_chance: + #networked_spawn_shop.rpc() + #shop_chance = 0.0 + #else: + #shop_chance += 0.09 wave_finished.emit() set_upcoming_wave() @@ -319,6 +333,7 @@ func setup() -> void: objective_health = Data.starting_lives wave = 1 stats = RoundStats.new() + wave_limit = level_specs.waves.size() game_setup.emit() @@ -352,7 +367,7 @@ func start() -> void: #Start game game_active = true chatbox.append_message("SERVER", Color.TOMATO, "Started with seed: " + str(NoiseRandom.noise.seed)) - networked_spawn_shop.rpc() + #networked_spawn_shop.rpc() game_started.emit() diff --git a/Scripts/level.gd b/Scripts/level.gd index 99a2edb..acb8038 100644 --- a/Scripts/level.gd +++ b/Scripts/level.gd @@ -11,7 +11,7 @@ extends Node3D @export var printer: CardPrinter @export var shop: ShopStand @export var obstacle_scenes: Array[PackedScene] - +@export var obstacles: Array[PackedScene] var walls: Dictionary[FlowNode, TowerBase] = {} var wall_id: int = 0 var tower_base_scene: PackedScene = load("res://Scenes/TowerBase/tower_base.tscn") diff --git a/Scripts/wave.gd b/Scripts/wave.gd index ee44e33..4cc5be4 100644 --- a/Scripts/wave.gd +++ b/Scripts/wave.gd @@ -9,16 +9,7 @@ func to_dict() -> Dictionary: var dict: Dictionary = {} for group: EnemyCard in enemy_groups: var enemy_count: int = 0 - if group.rarity == Data.Rarity.COMMON: - enemy_count = group.enemy.common_group - elif group.rarity == Data.Rarity.UNCOMMON: - enemy_count = group.enemy.uncommon_group - elif group.rarity == Data.Rarity.RARE: - enemy_count = group.enemy.rare_group - elif group.rarity == Data.Rarity.EPIC: - enemy_count = group.enemy.epic_group - elif group.rarity == Data.Rarity.LEGENDARY: - enemy_count = group.enemy.legendary_group + enemy_count = group.count if !dict.has(group.enemy.title): dict[group.enemy.title] = 0 dict[group.enemy.title] += enemy_count diff --git a/Scripts/wave_config.gd b/Scripts/wave_config.gd new file mode 100644 index 0000000..f72c370 --- /dev/null +++ b/Scripts/wave_config.gd @@ -0,0 +1,7 @@ +class_name WaveConfig extends Resource + +@export var enemies: Dictionary[Enemy, int] +@export var station: Data.Rarity +@export var new_shop: bool +@export var rewards_blank_cassette: bool +@export var bonus_cash: int diff --git a/Scripts/wave_config.gd.uid b/Scripts/wave_config.gd.uid new file mode 100644 index 0000000..efa83d8 --- /dev/null +++ b/Scripts/wave_config.gd.uid @@ -0,0 +1 @@ +uid://bp6q371iypd06 diff --git a/UI/Menus/MainMenu/level_selecter_main_menu.gd b/UI/Menus/MainMenu/level_selecter_main_menu.gd new file mode 100644 index 0000000..18cd672 --- /dev/null +++ b/UI/Menus/MainMenu/level_selecter_main_menu.gd @@ -0,0 +1,30 @@ +class_name MainMenuLevelSelector extends PanelContainer + +signal level_selected(specs: LevelSpecs) + +var side: int = 0 + +@export var levels: Array[LevelSpecs] = [] + +func _on_button_pressed() -> void: + side = 0 + $VBoxContainer/Label.text = "Standard Campaign Mode" + + +func _on_button_2_pressed() -> void: + side = 1 + $VBoxContainer/Label.text = "Endless Mode with random waves and all unlocked equipment" + + +func _ready() -> void: + var i: int = 0 + for level: LevelSpecs in levels: + i += 1 + var button: Button = Button.new() + button.text = "Level " + str(i) + $VBoxContainer.add_child(button) + button.pressed.connect(start_level.bind(i - 1)) + + +func start_level(level: int) -> void: + level_selected.emit(levels[level]) diff --git a/UI/Menus/MainMenu/level_selecter_main_menu.gd.uid b/UI/Menus/MainMenu/level_selecter_main_menu.gd.uid new file mode 100644 index 0000000..8d797bc --- /dev/null +++ b/UI/Menus/MainMenu/level_selecter_main_menu.gd.uid @@ -0,0 +1 @@ +uid://bwsw4oq150v3p diff --git a/UI/Menus/MainMenu/main_menu.gd b/UI/Menus/MainMenu/main_menu.gd index 915d6b1..2d6f486 100644 --- a/UI/Menus/MainMenu/main_menu.gd +++ b/UI/Menus/MainMenu/main_menu.gd @@ -104,6 +104,7 @@ func open_game_menu() -> void: func _on_back_button_pressed() -> void: main_controls.visible = true game_select_menu.visible = false + func generate_seed() -> void: @@ -117,6 +118,14 @@ func generate_seed() -> void: gamemode.rng_seed = randi() +func level_selected(level: LevelSpecs) -> void: + generate_seed() + gamemode.endless = false + gamemode.daily = false + game.level_specs = level + start_game() + + func _on_standard_button_pressed() -> void: generate_seed() gamemode.endless = false diff --git a/UI/Menus/MainMenu/main_menu.tscn b/UI/Menus/MainMenu/main_menu.tscn index ff59047..a4c1407 100644 --- a/UI/Menus/MainMenu/main_menu.tscn +++ b/UI/Menus/MainMenu/main_menu.tscn @@ -2,6 +2,10 @@ [ext_resource type="Script" uid="uid://ci8vq73u23viy" path="res://UI/Menus/MainMenu/main_menu.gd" id="2_ivytu"] [ext_resource type="AudioStream" uid="uid://cp6ph4ra7u5rk" path="res://UI/drop_003.ogg" id="5_cwn2i"] +[ext_resource type="Script" uid="uid://bwsw4oq150v3p" path="res://UI/Menus/MainMenu/level_selecter_main_menu.gd" id="8_qshe4"] +[ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_specs.gd" id="9_nt3t4"] +[ext_resource type="Resource" uid="uid://b67b70x1uf2el" path="res://Level1/specs.tres" id="10_kjkav"] +[ext_resource type="Resource" uid="uid://dffoufw4bnfn7" path="res://Level2/specs.tres" id="11_kjkav"] [ext_resource type="Texture2D" uid="uid://cr1ucbuw3iotp" path="res://Assets/Textures/first_win_achievements.png" id="15_74epv"] [ext_resource type="Script" uid="uid://cjr0pbqisd51v" path="res://UI/Menus/MainMenu/achievements_menu.gd" id="15_sv1gy"] [ext_resource type="Texture2D" uid="uid://cpa1hl36xfplg" path="res://Assets/Textures/first_scroll_seen.png" id="16_sv1gy"] @@ -33,8 +37,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("2_ivytu") -bg_level = NodePath("") -game_select_menu = NodePath("GameSelectMenu") +game_select_menu = NodePath("PanelContainer") main_controls = NodePath("MainControls") seed_entry = NodePath("GameSelectMenu/VBoxContainer/HBoxContainer2/LineEdit") profile_controls = NodePath("ProfileManager") @@ -424,6 +427,49 @@ text = "BUTTON_CANCEL" layout_mode = 2 text = "BUTTON_CONFIRM" +[node name="PanelContainer" type="PanelContainer" parent="." unique_id=1673631030] +visible = false +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -6.0 +offset_top = -6.0 +offset_right = 6.0 +offset_bottom = 6.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("8_qshe4") +levels = Array[ExtResource("9_nt3t4")]([ExtResource("10_kjkav"), ExtResource("11_kjkav")]) + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer" unique_id=507718308] +layout_mode = 2 + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer" unique_id=2127573853] +layout_mode = 2 +size_flags_horizontal = 0 +text = "BUTTON_BACK" + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer" unique_id=654891125] +layout_mode = 2 +text = "Standard Campaign Mode" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer" unique_id=776357424] +layout_mode = 2 +alignment = 1 + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer" unique_id=1722538738] +layout_mode = 2 +text = "A-SIDE" + +[node name="Button2" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer" unique_id=708845101] +layout_mode = 2 +text = "B-SIDE" + [connection signal="mouse_entered" from="MainControls/PlayButton" to="." method="_on_button_mouse_entered"] [connection signal="pressed" from="MainControls/PlayButton" to="." method="_on_play_button_pressed"] [connection signal="mouse_entered" from="MainControls/ModsButton" to="." method="_on_button_mouse_entered"] @@ -445,3 +491,7 @@ text = "BUTTON_CONFIRM" [connection signal="pressed" from="AchievementsMenu/VBoxContainer/HBoxContainer/Button" to="." method="_on_achievements_back_button_pressed"] [connection signal="pressed" from="ModsMenu/VBoxContainer/HBoxContainer/CancelMods" to="." method="_on_cancel_mods_pressed"] [connection signal="pressed" from="ModsMenu/VBoxContainer/HBoxContainer/ConfirmMods" to="." method="_on_confirm_mods_pressed"] +[connection signal="level_selected" from="PanelContainer" to="." method="level_selected"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Button" to="." method="_on_back_button_pressed"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/Button" to="PanelContainer" method="_on_button_pressed"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/Button2" to="PanelContainer" method="_on_button_2_pressed"] diff --git a/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn b/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn index 0afc4b0..ae8afbd 100644 --- a/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn +++ b/Worlds/GreenPlanet/Levels/Bridge/bridge.tscn @@ -7,6 +7,7 @@ [ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="4_uh5sr"] [ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="5_g08yk"] [ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="6_asmpj"] +[ext_resource type="PackedScene" uid="uid://d1gauy86jxpnj" path="res://BrickPile/brick_pile.tscn" id="7_6tcu8"] [ext_resource type="PackedScene" uid="uid://1b2ikdanl66b" path="res://Scenes/CardPrinter/card_printer.tscn" id="9_r25gu"] [ext_resource type="Script" uid="uid://cxwtuxytavfu5" path="res://Scripts/enemy_goal.gd" id="9_s3rd7"] [ext_resource type="Script" uid="uid://yk54owkf7pgj" path="res://Scripts/cinema_cam.gd" id="9_xuyhn"] @@ -247,7 +248,7 @@ size = Vector2(7.84, 3.69) [node name="Bridge" type="Node3D" unique_id=1906077552 node_paths=PackedStringArray("tower_path", "player_spawns", "enemy_spawns", "enemy_goals", "corpses", "cinematic_cam", "printer", "shop")] script = ExtResource("1_ws6nn") -enemy_pool = Array[ExtResource("2_ks6qx")]([ExtResource("3_6tcu8"), ExtResource("4_uh5sr"), ExtResource("5_g08yk"), ExtResource("6_asmpj")]) +enemy_pool = Array[ExtResource("2_ks6qx")]([ExtResource("3_6tcu8"), ExtResource("6_asmpj"), ExtResource("5_g08yk"), ExtResource("4_uh5sr")]) tower_path = NodePath("Towers") player_spawns = [NodePath("PlayerSpawnLocations/PlayerSpawn1"), NodePath("PlayerSpawnLocations/PlayerSpawn2"), NodePath("PlayerSpawnLocations/PlayerSpawn3"), NodePath("PlayerSpawnLocations/PlayerSpawn4")] enemy_spawns = [NodePath("GroundSpawn"), NodePath("GroundSpawn2"), NodePath("GroundSpawn3"), NodePath("GroundSpawn4"), NodePath("GroundSpawn5"), NodePath("AirSpawn")] @@ -256,6 +257,7 @@ corpses = NodePath("Corpses") cinematic_cam = NodePath("CinemaCam") printer = NodePath("CardPrinter") shop = NodePath("ShopStand") +obstacles = Array[PackedScene]([ExtResource("7_6tcu8")]) metadata/_custom_type_script = "uid://cvejbo3srx8py" metadata/_editor_floor_ = Vector3(4, -10, 8) diff --git a/cassette_test_image-export.png b/cassette_test_image-export.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f28aed96605758f63f93e1f3a889aca8c2657b GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0y~yV9;Vtz`(#*9OUlAu);JE z)0uEXK}F1CgG-J>po&8it4d^OYgkC;W!4Z~-$enJrW~t0*>WRK=(feTini9-E01qX zR`U zYEEW<|HX}&HP83EM|q0vadf&IaV}H4H6(fS!wKBaRSHWx_Q%x=pDdp;`Tdn>aU)a4 z?#*EV>5J$8diGqW(dt6ML+K?`RW7DXTJPpI(_f|H?DNM@kL_jnV^G)bU%z{w-izb< z`wmF%mv8v|U2UhtoJE0apS`^nwkp~C3U6%EuD3G&+sq=4>85Pix?w`Pkv9*t;ZLC*9cl1Tz7M~#a#R3 zjwV&RILpj=vlsYEHagGB;1ro|#NaZ?Q&{K#16z8UIZu`4a($+l*|U|`zSiil5kBp( z^z0+~%koXL7kmm4nY|){$urF{w#<4fAN$28hplo~73OgW9eBQK`b47N&siHhh3ckv z``@~?sZT4FH)UVT!*hJh2{C~gH}_WiHhjz%(v{Nu^@{80W0vXDuFpO4e$~Q#ixzP- zHoPfQ7RdXzre`Y&o|5;*JUgyov4{r3d z{Hj{A__%d-CR2hL*2Z{$h?Urb%0L721|L-fQ0-D^#d?^Il%w zvN``J|B1FSvgl6HtQNWWf47_W%j4Feo_wii29Y!tFw(EDTTr>Y$h1S`tHzQxk z@SS`2UHHR0 tg(ht void: + #var direction: Vector2 = (dest - position).normalized() + #velocity += direction * acceleration + #velocity = velocity.limit_length(max_speed) + #position += velocity * delta + position = position.lerp(dest, 15.0 * delta) + + +func set_text(text: String) -> void: + $Label.text = text diff --git a/floating_element.gd.uid b/floating_element.gd.uid new file mode 100644 index 0000000..ab15271 --- /dev/null +++ b/floating_element.gd.uid @@ -0,0 +1 @@ +uid://c4clky2q4uxm8 diff --git a/floating_element.tscn b/floating_element.tscn new file mode 100644 index 0000000..b027573 --- /dev/null +++ b/floating_element.tscn @@ -0,0 +1,26 @@ +[gd_scene format=3 uid="uid://d2vsrj65smnv6"] + +[ext_resource type="Script" uid="uid://c4clky2q4uxm8" path="res://floating_element.gd" id="1_jnblp"] +[ext_resource type="Texture2D" uid="uid://bx1fk6yke4k4o" path="res://cassette_test_image-export.png" id="2_mjx08"] + +[node name="Control" type="MarginContainer" unique_id=1662494820] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_jnblp") + +[node name="TextureRect" type="TextureRect" parent="." unique_id=1181502411] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture = ExtResource("2_mjx08") +stretch_mode = 5 + +[node name="Label" type="Label" parent="." unique_id=228649740] +layout_mode = 2 +size_flags_horizontal = 4 +text = "LEVEL 0" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/lavel_sel.tscn b/lavel_sel.tscn new file mode 100644 index 0000000..2c11329 --- /dev/null +++ b/lavel_sel.tscn @@ -0,0 +1,30 @@ +[gd_scene format=3 uid="uid://bxdr8webgx483"] + +[ext_resource type="Script" uid="uid://dlhwckf6tnx2p" path="res://level_select.gd" id="1_eshvk"] +[ext_resource type="Texture2D" uid="uid://p0dxw3i45wor" path="res://wrench.png" id="2_ce83v"] +[ext_resource type="Texture2D" uid="uid://doexsqcmd58yh" path="res://wand.png" id="3_veguw"] +[ext_resource type="Texture2D" uid="uid://dlrmfamsk3cr2" path="res://tool3.png" id="4_ro7qf"] +[ext_resource type="Texture2D" uid="uid://c4ck0kcqrvm2a" path="res://tool4.png" id="5_43akl"] +[ext_resource type="Texture2D" uid="uid://bx1fk6yke4k4o" path="res://cassette_test_image-export.png" id="6_veguw"] +[ext_resource type="PackedScene" uid="uid://d2vsrj65smnv6" path="res://floating_element.tscn" id="7_ro7qf"] + +[node name="Control" type="Control" unique_id=444351615] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_eshvk") +icons = Array[Texture]([ExtResource("2_ce83v"), ExtResource("3_veguw"), ExtResource("4_ro7qf"), ExtResource("5_43akl")]) +cassette_image = ExtResource("6_veguw") +level_scene = ExtResource("7_ro7qf") + +[node name="Label" type="Label" parent="." unique_id=1955641701] +layout_mode = 0 +offset_left = 73.0 +offset_top = 83.0 +offset_right = 113.0 +offset_bottom = 91.0 +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/level_select.gd b/level_select.gd new file mode 100644 index 0000000..c90d8a6 --- /dev/null +++ b/level_select.gd @@ -0,0 +1,99 @@ +class_name MenuLevelSelect extends Control + +@export var icons: Array[Texture] = [] +@export var cassette_image: Texture + +var biomes: Dictionary[String, HBoxContainer] = {} +var selected_biome: String = "" + +var levels: Array[FloatingElement] = [] + +@export var level_scene: PackedScene + + +func _ready() -> void: + #create_classes() + make_level_labels() + + +func make_level_labels() -> void: + for x: int in 10: + var margin: FloatingElement = level_scene.instantiate() as FloatingElement + add_child(margin) + levels.append(margin) + margin.set_text("Level " + str(x)) + margin.dest = Vector2(x * 50.0, 0.0) + + +func move_right() -> void: + for x: FloatingElement in levels: + x.dest += (Vector2.LEFT * 50.0) + + +func move_left() -> void: + for x: FloatingElement in levels: + x.dest += (Vector2.RIGHT * 50.0) + + +func create_classes() -> void: + var centre: Vector2 = Vector2(get_viewport_rect().size.x / 2.0, get_viewport_rect().size.y / 2.0) + + biomes["Engineer"] = create_sprite("Engineer", icons[0]) + biomes["Engineer"].set_position(centre + Vector2(-32.0, 0.0 - 32.0)) + biomes["Mage"] = create_sprite("Mage", icons[1]) + biomes["Mage"].set_position(centre + Vector2(-32.0, 80.0 - 32.0)) + biomes["ThirdClass"] = create_sprite("ThirdClass", icons[2]) + biomes["ThirdClass"].set_position(centre + Vector2(-32.0, 160.0 - 32.0)) + biomes["FourthClass"] = create_sprite("FourthClass", icons[3]) + biomes["FourthClass"].set_position(centre + Vector2(-32.0, 240.0 - 32.0)) + + selected_biome = "Engineer" + $Label.text = selected_biome + + +func move_down() -> void: + for x: HBoxContainer in biomes.values(): + var tween: Tween = create_tween() + tween.tween_property(x, "position", x.position + Vector2(0.0, -80.0), 0.3) + var y: int = biomes.keys().find(selected_biome) + if y + 1 >= biomes.keys().size(): + y = -1 + selected_biome = biomes.keys()[y + 1] + $Label.text = selected_biome + + +func move_up() -> void: + for x: HBoxContainer in biomes.values(): + var tween: Tween = create_tween() + tween.tween_property(x, "position", x.position + Vector2(0.0, 80.0), 0.3) + var y: int = biomes.keys().find(selected_biome) + if y - 1 < 0: + y = biomes.keys().size() + selected_biome = biomes.keys()[y - 1] + $Label.text = selected_biome + + +func _process(delta: float) -> void: + if Input.is_action_just_pressed("Move Backward"): + move_down() + if Input.is_action_just_pressed("Move Forward"): + move_up() + if Input.is_action_just_pressed("Move Right"): + move_right() + if Input.is_action_just_pressed("Move Left"): + move_left() + + +func create_sprite(text: String, icon: Texture) -> HBoxContainer: + var hbox: HBoxContainer = HBoxContainer.new() + var sprite: TextureRect = TextureRect.new() + var label: Label = Label.new() + + add_child(hbox) + hbox.add_child(sprite) + hbox.add_child(label) + + label.text = text + sprite.texture = icon + + return hbox diff --git a/level_select.gd.uid b/level_select.gd.uid new file mode 100644 index 0000000..cfe06f7 --- /dev/null +++ b/level_select.gd.uid @@ -0,0 +1 @@ +uid://dlhwckf6tnx2p diff --git a/tool3.png b/tool3.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3451146867a9704466215e9474e7f1a2f6abe6 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z_{Ae z#WAE}&fD2%bD11@T76v%r%VvKP1q~fg%hs~$|+^EZcQmHPm z`sq*U{j-rVms#aT|M~x-9yz-hFQn)@dbW7~^D8_KtM@KlubePrt7Ay~`p{tBifuuQS@e?(*n33wcrZ7t zy(+I;F|ktO67z-KzgCoaOk_L}dEk%59@Q@bDoke>rk&?p#rTBh>Z}ybxFv?nLCMPO z`j-Nkqj;vVytnlZC~0)J1h_LWFfe$!`njxgN@xNAV;<0N literal 0 HcmV?d00001 diff --git a/tool3.png.import b/tool3.png.import new file mode 100644 index 0000000..6f61d70 --- /dev/null +++ b/tool3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlrmfamsk3cr2" +path="res://.godot/imported/tool3.png-f2dc4d1dc31e25861ec3b12ecbaefc22.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://tool3.png" +dest_files=["res://.godot/imported/tool3.png-f2dc4d1dc31e25861ec3b12ecbaefc22.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/tool4.png b/tool4.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4da983c1a4e7065666727aabdf32ddc1f9b9e9 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z&P8} z#WAE}&fD1sa}PNPxVCpBX*3FDsJWl=u%F_<>=C2nXSt-SphHYDMRmi!`hPuT_c&Gd z{QG}}a5?BY__8h#Td<5N zfIGmrhT--9`lhEfHYK^+Z@xR=RaeNl;QE(45-${1Oh53mqG3k8j4-Dz!HbAl|+H<~GKJ-lRf0V^_s%4`a&Rs_xG0uMaQ$~n4aP4s!ndCPz%b8H{$Ef3BsD&BZK#+LOEqo*)mhi8&k-O*DSAseanRT#YaaKcA!z_46Jk44ofy`glX=O&z+~;| z;uumf=j|**zrzM1ZTlDbt&w5sl>Xw-qcb%^^2S3ZnGWHGD~yJQ1{=y+HIIg@dz-%h z#(BQ|Eh3ku{P>;p+mdtj?Az`6VskcM|-8^Rg z4MpNkVyhg^t zx5mZh6+gFH=e*a`YmDD;;nsqZ6EiC09vt$YsWRosmEP$qmmjkGaiPvLXxbs)_6D{T zosFUCo8<(W{Uw>C_`_!LGsXu!ti657L{MPYub>|n_Du;94@kb_9TeJdYzO<^=}G~C z4Pt*pdZ#M|tmMf$?0>OhgHbjA4DL8>-_r@%6*D3oGIy??c$4J|1HUonhOpPpf#M0Z zm#q6%HQamP80gUdVS&nm@QMI|3&u7gTrXthxLA4^_-8V?HMa9GDj#ePIFRvS!4AF` zf^sZORXcZ1RP%K3H#fiJ!rEi;?k)>!4yNX3US_`Ye{Q6g*nMU({RixKx&D2+a3J_S0|Nttr>mdKI;Vst0Gj?8 ARR910 literal 0 HcmV?d00001 diff --git a/wand.png.import b/wand.png.import new file mode 100644 index 0000000..1154f3c --- /dev/null +++ b/wand.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://doexsqcmd58yh" +path="res://.godot/imported/wand.png-fe18440e78220c0866c5420a9025c37f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://wand.png" +dest_files=["res://.godot/imported/wand.png-fe18440e78220c0866c5420a9025c37f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/wave_viewer.gd b/wave_viewer.gd index 3b6b425..bd4be5f 100644 --- a/wave_viewer.gd +++ b/wave_viewer.gd @@ -33,16 +33,7 @@ func set_waves(waves: Array[Wave], starting_wave_number: int) -> void: func group_to_count(group: EnemyCard) -> int: var count: int = 0 - if group.rarity == Data.Rarity.COMMON: - count += group.enemy.common_group - elif group.rarity == Data.Rarity.UNCOMMON: - count += group.enemy.uncommon_group - elif group.rarity == Data.Rarity.RARE: - count += group.enemy.rare_group - elif group.rarity == Data.Rarity.EPIC: - count += group.enemy.epic_group - elif group.rarity == Data.Rarity.LEGENDARY: - count += group.enemy.legendary_group + count = group.count return count diff --git a/wrench.png b/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..95cf12fccfc72ce4bfa6195962c2fc85ea8c0beb GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&zk;8;^B zqN`q6xqDyz(!S4KaST>>nRh(Nx0}v?#VV#adiwn9|JgkB=NtCKi9@crJvA>hY2<(r8$%S6WWJdQT3MI2{XGm~#I>$q)jGR|-MY_!7B zz)52s(?!J)$>xcQCG}z}*c4W=wkI3JKZq>6mb9#}Reqiv(+%-0_4{>q9b4YfR&bqZ z(xNQ+vI%b;HghggxWnl1eMxx+j|XS+L1zXJ?mdb!QWw0n|J-EK;Fu?7Qm>TKE6y@q z-RX>=KjZ12`%UD;Rvceo-f>Of$a$9UnvDx|S3Rv{EK)x5#YeDA{R9(ZmG&8f*cIoP zCSBRaz{hZxtAOD}0E0u61LJ{NQUVza3)Gl+8>Senbzo%>v|_j?c7gH3xyuY2q8vC6 z6e|TVZ8(<1sLP6=51GI@hI}Hm>JLZmdKI;Vst01*kth5!Hn literal 0 HcmV?d00001 diff --git a/wrench.png.import b/wrench.png.import new file mode 100644 index 0000000..7be1fe0 --- /dev/null +++ b/wrench.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p0dxw3i45wor" +path="res://.godot/imported/wrench.png-3fc6e657ff73e8f0e538027d00374a3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://wrench.png" +dest_files=["res://.godot/imported/wrench.png-3fc6e657ff73e8f0e538027d00374a3e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1