From 11b72a72f81230538e17a5b35d019894e9d73246 Mon Sep 17 00:00:00 2001 From: JayisonDevadas Date: Mon, 22 Sep 2025 21:30:18 -0400 Subject: [PATCH] rebuild project --- Class1notes.txt | 17 - assets/graphics/enemies/slime_purple (1).png | Bin 0 -> 1030 bytes .../slime_purple (1).png.import} | 8 +- .../environment/backgrounds/block.png | Bin 934 -> 0 bytes .../backgrounds/forestbackground.png.import | 2 +- .../graphics/environment/backgrounds/sky.png | Bin 692 -> 652 bytes .../environment/backgrounds/sky.png.import | 2 +- .../environment/backgrounds/trees.png | Bin 0 -> 2610 bytes .../environment/backgrounds/trees.png.import | 2 +- ...ain (32x32)(1).png => Terrain (32x32).png} | Bin ....png.import => Terrain (32x32).png.import} | 8 +- .../environment/terrain/mushroom_32x64.png | Bin 2776 -> 2290 bytes .../terrain/mushroom_32x64.png.import | 2 +- .../environment/terrain/veg_32x32.png.import | 2 +- assets/graphics/objects/crate.png.import | 2 +- assets/graphics/pickups/coin.png.import | 2 +- .../player/death/Player Death 64x64(1).png | Bin 0 -> 1584 bytes .../death/Player Death 64x64(1).png.import | 34 ++ .../player/hurt/Player Hurt 48x48.png | Bin 0 -> 1448 bytes .../hurt/Player Hurt 48x48.png.import} | 8 +- .../player/idle/Player Idle 48x48.png.import | 2 +- ...ump 48x48(1).png => player jump 48x48.png} | Bin ...ng.import => player jump 48x48.png.import} | 8 +- .../player/run/player run 48x48.png.import | 2 +- assets/graphics/projectiles/coin.png | Bin 500 -> 0 bytes .../projectiles/pixel_bullet.png.import | 2 +- icon.svg.import | 2 +- project.godot | 22 +- scenes/bullet.tscn | 24 +- scenes/coin.tscn | 92 ++-- scenes/crate.tscn | 21 +- scenes/game.tscn | 201 +++----- scenes/level2.tscn | 474 +++++++++++++++++ scenes/level3.tscn | 480 ++++++++++++++++++ scenes/player.tscn | 142 +++++- scenes/slime.tscn | 100 ++++ scenes/trigger.tscn | 8 +- scripts/bullet.gd | 16 +- scripts/bullet.gd.uid | 2 +- scripts/coin.gd | 4 +- scripts/coin.gd.uid | 1 + scripts/crate.gd.uid | 2 +- scripts/gamecontroller.gd | 152 +++++- scripts/gamecontroller.gd.uid | 2 +- scripts/player.gd | 73 ++- scripts/player.gd.uid | 2 +- scripts/rscs/characterstats.gd | 9 + scripts/rscs/characterstats.gd.uid | 1 + scripts/rscs/gameSaveStats.tres | 18 + scripts/rscs/playerStats.tres | 12 + scripts/rscs/savedgame.gd | 3 + scripts/rscs/savedgame.gd.uid | 1 + scripts/rscs/slimeStats.tres | 12 + scripts/scene_manager.gd | 77 ++- scripts/scene_manager.gd.uid | 2 +- scripts/slime.gd | 51 ++ scripts/slime.gd.uid | 1 + scripts/trigger.gd | 7 +- scripts/trigger.gd.uid | 2 +- 59 files changed, 1795 insertions(+), 324 deletions(-) delete mode 100644 Class1notes.txt create mode 100644 assets/graphics/enemies/slime_purple (1).png rename assets/graphics/{projectiles/coin.png.import => enemies/slime_purple (1).png.import} (65%) delete mode 100644 assets/graphics/environment/backgrounds/block.png create mode 100644 assets/graphics/environment/backgrounds/trees.png rename assets/graphics/environment/terrain/{Terrain (32x32)(1).png => Terrain (32x32).png} (100%) rename assets/graphics/environment/terrain/{Terrain (32x32)(1).png.import => Terrain (32x32).png.import} (72%) create mode 100644 assets/graphics/player/death/Player Death 64x64(1).png create mode 100644 assets/graphics/player/death/Player Death 64x64(1).png.import create mode 100644 assets/graphics/player/hurt/Player Hurt 48x48.png rename assets/graphics/{environment/backgrounds/block.png.import => player/hurt/Player Hurt 48x48.png.import} (66%) rename assets/graphics/player/jump_fall/{player jump 48x48(1).png => player jump 48x48.png} (100%) rename assets/graphics/player/jump_fall/{player jump 48x48(1).png.import => player jump 48x48.png.import} (71%) delete mode 100644 assets/graphics/projectiles/coin.png create mode 100644 scenes/level2.tscn create mode 100644 scenes/level3.tscn create mode 100644 scenes/slime.tscn create mode 100644 scripts/coin.gd.uid create mode 100644 scripts/rscs/characterstats.gd create mode 100644 scripts/rscs/characterstats.gd.uid create mode 100644 scripts/rscs/gameSaveStats.tres create mode 100644 scripts/rscs/playerStats.tres create mode 100644 scripts/rscs/savedgame.gd create mode 100644 scripts/rscs/savedgame.gd.uid create mode 100644 scripts/rscs/slimeStats.tres create mode 100644 scripts/slime.gd create mode 100644 scripts/slime.gd.uid diff --git a/Class1notes.txt b/Class1notes.txt deleted file mode 100644 index d2cb27b..0000000 --- a/Class1notes.txt +++ /dev/null @@ -1,17 +0,0 @@ -big 4 static body rigid body character body trigger(area) - -architecture - -view ( big 4) actors - -Gamer controller writer -logic -requires data -contains functions - -scene manager -decides when things happen director - - -Signals -to connect signal go to main scene and select emmiter diff --git a/assets/graphics/enemies/slime_purple (1).png b/assets/graphics/enemies/slime_purple (1).png new file mode 100644 index 0000000000000000000000000000000000000000..76f564e1d18d3f4b59c032ee8233ebf4665af431 GIT binary patch literal 1030 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<@!3HEb(?2AGr~;43Vg?3oVGw3ym^DX&fq{94 zr;B4q#hkZu_UB)A5IH_yFgSBs)oT$}vmn=*zw9@ptqPdBe?d}nV{fk>$4CBvg?)Ed z_vO50>IiWPSm-r%m!<3^wh~P~_4RS~ zpI=Gub+-QhIeq%h`RaxX{5TJNc>dLzfkEQSwe9u4|AzdIT*^2{!A86~-QWe|7ymwB zC>Ti{|81}_`+UPPl@+TN=sEg&On58UrMgnvLQXF0_ys@bQ1@EdnLWo=s>t&5b6*sD zcFMcwU?tm(D_Xg)W-Wc$-E!h}Crjk()1K3gUwWA?xq;Wdw18cHo3k~Zx-$Fb`AU$*-@DD zmGPf?jG6V$dCTQj>{2>(Zt>F0fcfj}50vb4xa*Xko3|y%e%9UPUyOMTg5ncDvEEv- z-pIj{ckVgygWdnMA2Z(bzqjb#^{`seQ^pPQ$9_6a&90O2#S*<mC1;UMyZZkxfN& z@uKHWkGnrH91Z`H^EmwCk41a3FUGWg-!^5J_|wx1K5Uz!#D3x7Zw}ELVrNTt9P8IR z_1(WOXsY%rc>^6i*W&vj&+HC_UuW8s@vbNLPX_a5tiDo{M8w?>Zhi3J zc+%B_MKh66kh4ZXojWF+ zT*q}VoaI8hBaecXVeow6qbfGXuiMtt?Ct)j^S-#gPfj)6=zzMwd84}+U`w)4S;`RQ%FC0X+NS=A{|*KCMMplfIxDEMp+mJpKw)v0(5Vdqi$j% zwQ$ZJ8SWJhtxtX&{QsbQdsA7?e_iS+wNL0GMzs#_1dTK zR|n3hzuY=a%#x{Udt>+OX=?8or&}MmFj-G>k}_+?ug{ea{`TzC>27vj{@L0& zb_|)Xv?`fpWSEj!PsM$&C=ajB|35GD+jr)crlNHre;FqMqlL4;BeIx*K~EWk87r3B zmjMOYOFVsD*o_1zJ2E@P)M@GHKN2hKQ}iuuY|$5C^fMpHASI3vm`^o-P1Q9 zypc~F7`YQXT^vIyZoR$C$jQLK!D48-QP6IeWsB~igJ0EH|Ck6hG%_+Xv$26N508Wd z2pbrHa6-a?10W1i(2Pw{LIU}UczBSlgPGLOco5k-k`%!l4RI69B)HEY){&$L=6#5p iaF~Qc5w3tdoX?*0o9TwY!4IGaWbkzLb6Mw<&;$UfE<$wx diff --git a/assets/graphics/environment/backgrounds/forestbackground.png.import b/assets/graphics/environment/backgrounds/forestbackground.png.import index dc8fd31..086fe5a 100644 --- a/assets/graphics/environment/backgrounds/forestbackground.png.import +++ b/assets/graphics/environment/backgrounds/forestbackground.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://b1pfjj3fy2omh" +uid="uid://l4a5qfhhue26" path="res://.godot/imported/forestbackground.png-1170ae197e211023a79091cf48300332.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/environment/backgrounds/sky.png b/assets/graphics/environment/backgrounds/sky.png index e9b48de09e3b1da1d2ded6645228b27f9f188d7b..286d1c6f2069803f4abf9cd7944a616af20efe81 100644 GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yow{Wll$)``g3IZvXbVpxD28NCO+de>MIk~R^699v!tDnm{r-UW|>)dmc literal 692 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 EA7^XUHUIzs literal 0 HcmV?d00001 diff --git a/assets/graphics/environment/backgrounds/trees.png.import b/assets/graphics/environment/backgrounds/trees.png.import index 90dad85..0cf34c2 100644 --- a/assets/graphics/environment/backgrounds/trees.png.import +++ b/assets/graphics/environment/backgrounds/trees.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dhbq35sm7q38" +uid="uid://dv63a7rb24ob8" path="res://.godot/imported/trees.png-b1cfb32a6f99a640507fdab863a473f5.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/environment/terrain/Terrain (32x32)(1).png b/assets/graphics/environment/terrain/Terrain (32x32).png similarity index 100% rename from assets/graphics/environment/terrain/Terrain (32x32)(1).png rename to assets/graphics/environment/terrain/Terrain (32x32).png diff --git a/assets/graphics/environment/terrain/Terrain (32x32)(1).png.import b/assets/graphics/environment/terrain/Terrain (32x32).png.import similarity index 72% rename from assets/graphics/environment/terrain/Terrain (32x32)(1).png.import rename to assets/graphics/environment/terrain/Terrain (32x32).png.import index a5eedb9..48716bb 100644 --- a/assets/graphics/environment/terrain/Terrain (32x32)(1).png.import +++ b/assets/graphics/environment/terrain/Terrain (32x32).png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cfoysdgyt6nar" -path="res://.godot/imported/Terrain (32x32)(1).png-f30083663c5b61a547e537b745ce35df.ctex" +uid="uid://bqe3w5v76lyek" +path="res://.godot/imported/Terrain (32x32).png-81a713b69add642b2640197ae95d1555.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/graphics/environment/terrain/Terrain (32x32)(1).png" -dest_files=["res://.godot/imported/Terrain (32x32)(1).png-f30083663c5b61a547e537b745ce35df.ctex"] +source_file="res://assets/graphics/environment/terrain/Terrain (32x32).png" +dest_files=["res://.godot/imported/Terrain (32x32).png-81a713b69add642b2640197ae95d1555.ctex"] [params] diff --git a/assets/graphics/environment/terrain/mushroom_32x64.png b/assets/graphics/environment/terrain/mushroom_32x64.png index 9dca2d0373e4cb6468ffbb705293990760d2d879..f3ed761a913e475d8256f1c4eec53ccf16e263db 100644 GIT binary patch delta 2279 zcmVppIZ5U{scJ^2_dyJB?0#76R6C<=WNt49v|+1gEhzOj1h2a{(ZP-z4oKH~o9rkj&fbTw$u_&#RK2(v{#op;T?dh zLE3ACa-kkdO5TkBG;)U;MrVzZdx$6M# zH~#vvVWqC+LMW(s8NSN!wWC}Rw91OrnwGDx7_J1O1Y530=u3cSsAM70J>)ZY8%mm)L(24ic|WLVlsww5@mN&X~EF+Bv zc6085Hh*IjpMs3zU(ZO6|GPr z5Da6118M=t`wy)Km5kz+J*I0p?hgQF98*%h|`!C1^g zP?$YcPPHUf7DGkL2fv`n{U!%~6{~Y(KBQ#g&-JgP>vSKYJ|=fe$CfCz?0+ZFOB_S1 zNIiu%mRVB#heA{>37VlG^ej?qrj<5HW05?c;07thqv7!?jSafUhdeJ z9#bvRnPI_NdNzGH0U?e)b0b3Fgdnwo@f6b7;Es*E`^X3c0_z01g(S0#bH^xmOguN+ zBTmtb4im>fJ7gdTbVgy+Lx1KOB2SUi5!QXN79nPIa_fjDj{RizZLPygbA&M{8raA|}wmL!8g;^>VnQR=`t zJeNZb2FDa<=CeV2%`fkDlSm4PKI)BLn3K4ZE4?)~^dn0=$+7tq>3?zr7H|k5$io(K zXPvmSK_0X)RuCnIUS!#gExoBF%4hXM0uD!nVT3szO!m4-w7eEb?O^i$PX8lcvb52x z>=;k86Q@1pL_J67hLCuAUX2V$$;4_RQ3L^@Q!q6Q;*7mSvO9GQb4PyUZZT_rW`a`y zABgEUwz~13=c#)f)PHX-Hnnv;_fn_&(fnBYBBNXcE$3nugd(eSi0d7!aOmMKcDTi8 zk~7RC2gWgW4(mV)2;77H?)M^DDj@o4H_0DJ!ip5;dTc&!?T?n$k35lNkW5ZC-$|z1 zDBFPky)9hsQ`)jnja?nk-0h()m0dNtRw42yd&4i!yN7d`w{Sm-x zQcG{W-MI4Ni@o4hccWYhsW++w{;VU$$pjrw8QYBYXV>_}@Ba9}gY9>d^vrKYbK?N- z+1&o&U)%lTbAK-dQc9$hC^>6VQk>ZQQEm0qZ(OGqeDkF%-U$JT(jMCL&|U%MX{0(C z{WpV2@w9r+^l~~!vE);!)u@)s2m#6~G8{x4942Sh^;iT7#UkZOg=)2m5CSI@Mc;p{ z{|6q6fD{s?G+Jwf5GbXPQvUA<%$lK_&584p_LyoUPk#mOv3EWt0-O^#C-C1VV6C+$ zC(z;MneUFS?wj|VG3KcgkW#9XA#^qci=#1m{(XF3>r>a4M+(0A(iLfpS=hL^ac{m> zE{6o=GJZJg1-W%psucik-|F)G*Iypz@Be8eI>sBx#8sV_&2cKm_qLM@vi^?002ovPDHLkV1gNg BI}ZQ= delta 2742 zcmV;n3Q6_y5!e-wBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iTcsiu5i5!~ zWT;Lph>AFB6^c+H)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROv zg%&X$9QWhhy~o``&;5hSpPC5R9p zqlyyBun?nFBY(w2iuU6k{$a;2l1nC635*;Is6d6}_`(0+ceiGKa>7jt#evQj+x{2@ zg1bPYX4~J#w%s@Z0?)ve*78^Cz|1GeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00^*2L_t(&-tCyrk6c%k$3N%Z_p08H`d!`C-EO<>b_|}3 zNvx0{g7_iW5JkWuLSc&piVzF_4K|>WW;IF{Go#V0W|jk30)hA?gair_e?$->3~m#5 z+wQ9F>aMEys@{)#SX6b}W*qF;VP?}uD!o_lo_o$$=bn4c_g*-W6FHF+Igt}NkrO$Q z|7VeRqx_{ay&BL#2~-gUJu)JKAdCfuHDi*0-nyv|W7B�GwkJc%j~ozA+q3URA}h zaBf6Ig#Y~a8@GS@_04s|e*)ZNN8rn6dNR(m+6tsssYhE6(l^uO^E*@bz5f~(lTX*I ze)r};AA1R2?kzvnsLH3KX7tSuL|MNbo26E42z&#;ELRSalD&x={$^5X{b_IXiEnKW ze)3omcx9s}qfGsFAU!L*C~@=}z-QJ`EYdWoO{-8?nCu&i9R665-_|=P#_4oN9SyDHiH}PH1yNPpMUeZq2gZ z^vnyVN-jpT!_{VO_X`_KAA5a&uLSI)B%u#nvT^iJPgG`;i(M~RZ(6%lvxH%YdJ#Dw zWr~<7Q58h&kwN$An4x8m0TnxW8& zEpZe;r9s*_&B5|{6p*sOW(Sz!0IQC;3N2@8M+Szl9Ma2ze|(!wigg!pV=K`IEkR|q zZr*Q&j{sbXvRg}4SqXd(S3gVII>)HJ&SA3$fGu*=`h>$R{K<7JGXhWOh4bZjve&rw zMmmVON-k&dfZ{<*Pz9d#DwS6OHX63G94fxCWYH3%?rDbI^<(8>cb!r93|X{K-3`tLlRi2IvU>nDjkMp_2;TzGX?F8Mwd{nZQV~Fp+nxsq{$!g*IRjO^ z*&cbcf68e2JVhm>v1{-Tw;3lHgRx~gfowX?x3kj!M=IA7nLY2rZ?7K#cyX;8WXhSU zkq-itS+>6xo7HY;@Kl-33VdVnJ%g2bIBmX<&G$e{5KF1c*fOWgEm@W`n>zN!C4)nl zB#KuW|0w^S)9TOvAlcf|*>LJ3zNb(JKDki~e_kWYw$Fs7w_3AwV}l?J6G4Gy1m^A( z(nSg>*mRfrEn%u2$^L+YVM>2w=#Q1rR8fUC9{Y?%9_ji{FtG5mbcC36mLQNr@gi*So;X`Iu9oaFFJXNui7iW$NpE zj@-B4&3A!a3?8P+zNeT-h`gN2sE;Xff27DTvk^}3-%~{9a0;i4r^;SBe>$i5S%H)# zwp5(zeVb7x!k+;SoX@RES%?@wQ%U*=3aSf72K8ggpfTSOvk{t&DN9G1!+xst zCysHZ;1pjAD4;}{p?7nGJpdyx27YvXJpCfT+lBRROiBi0M=~vN#SEhbf&&y0f1!xG zB)xMay-kX!OX-AhTGAgoZYPfZ%rP$J^<&OXl`$nF%41@(yOoaD&PK*ln127};J2SW z)g8Qfn11yi8sWd(OkCfpv;NzQI+xII&bg;FfS zE%WwQPEiZ+y39U$V=MXDQR*Hqf9l6pI-XPB*Rk^ag+}phZI z4=0K@yp0>)U^Fcl=7xh(nW*A)9^Odr?RWnp>1qWTWLs%*Pbsb&DX%2uo1csA-XBNl zSI*bNS5x&#r*|g5oz8Z!u5Bj!ff=Th)-ctaqzp;QDb*mp$5}KwyyyQLf0B8iZW+Uk zcVflQ_c}H*@+9!g)6MWd{(AgPv45(?(Ppz=!>{@jMwrYp_V)If<#(vxug166Eu3EX zm;rB%VU}&B<=;p1tTF7an7$vjY`9 z%6whC-NpB`EX(&CfHB72A)#{?EDIWa^gJH-yoatY4^({V*^8zu%caeY&09y`YPFcC zRwIn(y`XSPy-^3?f7;b8p8W80lj8e7KIO&X?vTvel+T^Z!{mkN`>+wtRh0O~;xOR1ZCs3_a-Ux$0!!RTW!#PVX3Zf_? w2&+<$Jh^st>-ncX_3>~2?&rUVA7uM4MYFfE3JE2S000002uVdwM6N<$f`4#2wEzGB diff --git a/assets/graphics/environment/terrain/mushroom_32x64.png.import b/assets/graphics/environment/terrain/mushroom_32x64.png.import index b083c77..9efe631 100644 --- a/assets/graphics/environment/terrain/mushroom_32x64.png.import +++ b/assets/graphics/environment/terrain/mushroom_32x64.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bk35d1yyqwvxf" +uid="uid://cy0lgun8t11xv" path="res://.godot/imported/mushroom_32x64.png-cefb137d64a82ca31a8f0068d916c09f.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/environment/terrain/veg_32x32.png.import b/assets/graphics/environment/terrain/veg_32x32.png.import index 227d9b1..e8b531f 100644 --- a/assets/graphics/environment/terrain/veg_32x32.png.import +++ b/assets/graphics/environment/terrain/veg_32x32.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ctremhbhix1fj" +uid="uid://dvn642wmhcrfc" path="res://.godot/imported/veg_32x32.png-4b0b47ef99f3aa28e8f24956e44a31a5.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/objects/crate.png.import b/assets/graphics/objects/crate.png.import index 5eae428..2cdb2e0 100644 --- a/assets/graphics/objects/crate.png.import +++ b/assets/graphics/objects/crate.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bvm82m176wflv" +uid="uid://bnhycmkyqxdiu" path="res://.godot/imported/crate.png-b286bd97caa3cbc59746f2db7de46191.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/pickups/coin.png.import b/assets/graphics/pickups/coin.png.import index 7ad30c0..3a35f7d 100644 --- a/assets/graphics/pickups/coin.png.import +++ b/assets/graphics/pickups/coin.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dqt56yigjia14" +uid="uid://b22ko1chbu1t2" path="res://.godot/imported/coin.png-f0b33289d8d72c34d5a0c76da4c0f19c.ctex" metadata={ "vram_texture": false diff --git a/assets/graphics/player/death/Player Death 64x64(1).png b/assets/graphics/player/death/Player Death 64x64(1).png new file mode 100644 index 0000000000000000000000000000000000000000..2e6a1ae0514b237d754893f563c87ba5f95dc109 GIT binary patch literal 1584 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 void: func _on_body_entered(body: Node2D) -> void: - + print("Bullet hitting") if body.is_in_group("shootables"): - - bulletDamageSignal.emit(body,self) - + print("This is shootable") + bulletDamageSignal.emit(body, self) + + +func _on_area_entered(area: Area2D) -> void: + print("Bullet hitting") + if area.is_in_group("shootables"): + print("This is shootable") + bulletDamageSignal.emit(area, self) diff --git a/scripts/bullet.gd.uid b/scripts/bullet.gd.uid index 9878aa1..975793f 100644 --- a/scripts/bullet.gd.uid +++ b/scripts/bullet.gd.uid @@ -1 +1 @@ -uid://p7brl4n4miw6 +uid://bhh178vuo5bgo diff --git a/scripts/coin.gd b/scripts/coin.gd index 9f1150b..a2eac16 100644 --- a/scripts/coin.gd +++ b/scripts/coin.gd @@ -2,7 +2,7 @@ class_name Coin extends Area2D signal coinCollectedSignal(body, coin) - func _on_body_entered(body: Node2D) -> void: print("coin collision") - coinCollectedSignal.emit(body, self) + if body is Player: + coinCollectedSignal.emit(body, self) diff --git a/scripts/coin.gd.uid b/scripts/coin.gd.uid new file mode 100644 index 0000000..ed9a714 --- /dev/null +++ b/scripts/coin.gd.uid @@ -0,0 +1 @@ +uid://nqigicsb4oqh diff --git a/scripts/crate.gd.uid b/scripts/crate.gd.uid index 25a71bf..40a9e9b 100644 --- a/scripts/crate.gd.uid +++ b/scripts/crate.gd.uid @@ -1 +1 @@ -uid://bv1u5eyjco2m8 +uid://c5gjsxgxmjfki diff --git a/scripts/gamecontroller.gd b/scripts/gamecontroller.gd index e1ecac2..5d77298 100644 --- a/scripts/gamecontroller.gd +++ b/scripts/gamecontroller.gd @@ -1,30 +1,148 @@ extends Node2D +signal playerDeathSignal +signal playerDamageSignal(health, maxhealth) +signal destroySignal(body) +signal levelChangeSignal(level) -signal playerDamage +var loadIntent = false +var timer = Timer.new() +var timeAvailable:int = 5 + +var levels = ["res://scenes/game.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"] +var timers = [15,10,9] +var currentLevel = 0 + +#character stats +var enemy:CharacterStats +var player:CharacterStats +var playerCurrentHealth:int + +var enemiesDict = {} + +var saveObject = {} # Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - +func _ready() -> void: + enemy = load("res://scripts/rscs/slimeStats.tres") + player = load("res://scripts/rscs/playerStats.tres") + playerCurrentHealth = player.starting_health + + add_child(timer) + timer.wait_time = 1 + timer.one_shot = false + timer.connect("timeout", secondCounter) + timer.start() + +func reset(): + enemiesDict.clear() + timeAvailable = timers[currentLevel] + playerCurrentHealth = player.max_health + + if loadIntent: + var saved_game:SavedGame = load("res://scripts/rscs/gameSaveStats.tres") + saveObject = saved_game.gameData + playerCurrentHealth = saveObject ["PlayerHealth"] + timeAvailable = saveObject["TimeAvailable"] + loadIntent = false + return saveObject + return{} +func secondCounter(): + timeAvailable -=1 + #check for time running out + if timeAvailable <=0: + print("You lose") + levelChangeSignal.emit(levels[currentLevel]) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - pass + if Input.is_action_just_pressed("save"): + saveGame() + if Input.is_action_just_pressed("load"): + loadGame() -func _on_trigger(effect: Variant, body:Variant) -> void: +func _on_trigger(effect: Variant, body: Variant) -> void: print("GC sees trigger "+effect) match effect: "player_hurt": if body is Player: - print("ouch") - playerDamage.emit() - if not body is Player: - body.queue_free() - + print("hurt the player") + #playerDamage.emit() + #if not body is Player: + # body.queue_free() + func bulletDamage(body, bullet): - print("gc knows about bullet hit") - body.queue_free() - #apply_central_impulse(Vector2(shoveDirection,0)*700) + print("GC know about bullet hit") + if body is Slime: + #give damage to this individual enemy + enemiesDict[body]["health"] -= player.rangeDamage + if enemiesDict[body]["health"] <=0: + print ("enemy is dead") + removeEnemyFromLevel(body) + destroySignal.emit(body) + else: + print("enemy is damaged") + body.handle_damage() -func coinCollected(body,coin): - print("gc knows coin collected") +func removeEnemyFromLevel(body)->void: + enemiesDict.erase(body) + +func coinCollected(body, coin): + print("GC knows coin collected") + destroySignal.emit(coin) + +func totalCoinCount(count): + print("GC knows total coins "+str(count)) + if count == 0: + currentLevel +=1 + if currentLevel >= levels.size(): + currentLevel = 0 + levelChangeSignal.emit(levels[currentLevel]) + +func playerAttacked(body, slime): + print("GC knows slime attack") + print("Damge : "+str(enemiesDict[slime]["damage"]) ) + print("Player health : "+str(playerCurrentHealth)) + playerCurrentHealth -= enemiesDict[slime]["damage"] + if playerCurrentHealth <=0: + print("YOU DEAD") + playerDeathSignal.emit() + else: + print("taking damage") + playerDamageSignal.emit(playerCurrentHealth, player.max_health) + +func deathComplete()->void: + levelChangeSignal.emit(levels[currentLevel]) + +func addEnemyToLevel(slime)->void: + var randHealth:int= randi() % 20 + var randDamage:int = randi() % 10 + var enemyState= {"health": enemy.health + randHealth, + "damage": enemy.meleeDamage + randDamage + } + enemiesDict[slime]= enemyState + +func saveGame()->void: + saveObject["enemies"]={} + var index = 0 + # create an object with all critical game data + print("game Level"+str(currentLevel)) + print("time Remaining"+str(timeAvailable)) + print("player Health"+str(playerCurrentHealth)) + #bad guys stuff + for key in enemiesDict: + var tempObj = {} + tempObj["health"]= enemiesDict[key]["health"] + tempObj ["damage"]=enemiesDict[key]["damage"] + tempObj["global_position"]= key.global_position + saveObject["enemies"]["slime"+str(index)] = tempObj + index +=1 + saveObject["GameLevel"]= currentLevel + saveObject["TimeAvailable"]= timeAvailable + saveObject["PlayerHealth"]= playerCurrentHealth + var saved_game:SavedGame = SavedGame.new() + saved_game.gameData = saveObject + ResourceSaver.save(saved_game, "res://scripts/rscs/gameSaveStats.tres") + +func loadGame()->void: + loadIntent = true + levelChangeSignal.emit(levels[saveObject["GameLevel"]]) diff --git a/scripts/gamecontroller.gd.uid b/scripts/gamecontroller.gd.uid index b2b04a9..c119f6f 100644 --- a/scripts/gamecontroller.gd.uid +++ b/scripts/gamecontroller.gd.uid @@ -1 +1 @@ -uid://cpua8fr5bby78 +uid://bblqtronap0j4 diff --git a/scripts/player.gd b/scripts/player.gd index 3013919..83fd533 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -4,34 +4,41 @@ class_name Player extends CharacterBody2D @onready var left_cast: RayCast2D = $LeftCast @onready var right_spawn: Node2D = $RightSpawn @onready var left_spawn: Node2D = $LeftSpawn -@onready var jump_buffer_timer: Timer = $jumpBufferTimer +@onready var jump_buffer_timer: Timer = $JumpBufferTimer @onready var player_graphic: AnimatedSprite2D = $PlayerGraphic -const SPEED = 300 +const SPEED = 300.0 const JUMP_VELOCITY = -400.0 - -@export var acceleration:int = 15 +@export var acceleration:int = 5 var upJump:bool = false -var direction +var direction enum FaceDirection{LEFT, RIGHT} var facing:FaceDirection = FaceDirection.RIGHT -enum State{IDLE,RUN,JUMP,FALLING} +enum State{IDLE, RUN,JUMP,FALLING,HURT, DEATH} var current_state:State = State.IDLE + var pushTarget var pushEnabled := false +signal playerDeathCompleteSignal - -func _physics_process(delta:float) -> void: +func _physics_process(delta: float) -> void: # Add the gravity. - - handle_input() + if current_state != State.HURT and current_state != State.DEATH: + handle_input() handle_movement(delta) handle_states() handle_animation() move_and_slide() handle_collisions() +func handle_damage(health, maxhealth)->void: + print("player takes damage") + current_state = State.HURT + +func handle_death()->void: + print("player is dead") + current_state = State.DEATH func handle_states() -> void: match current_state: State.IDLE when velocity.x !=0: @@ -39,8 +46,9 @@ func handle_states() -> void: State.RUN: if velocity.x == 0: current_state = State.IDLE + #player steps off ledge if not is_on_floor() && velocity.y > 0: - current_state = State.FALLING + current_state = State.FALLING State.FALLING when is_on_floor(): if velocity.x == 0: current_state = State.IDLE @@ -48,6 +56,8 @@ func handle_states() -> void: current_state = State.RUN State.JUMP when velocity.y >0: current_state = State.FALLING + + func handle_animation() -> void: match current_state: State.IDLE: @@ -59,13 +69,16 @@ func handle_animation() -> void: State.JUMP: if upJump: player_graphic.play("jump") - -func handle_movement(delta:float) -> void: + State.HURT: + player_graphic.play("hurt") + State.DEATH: + player_graphic.play("death") +func handle_movement(delta:float) -> void: if direction == 0: #not moving velocity.x = move_toward(velocity.x,0, acceleration) else: - velocity.x = move_toward(velocity.x,SPEED * direction, acceleration) + velocity.x = move_toward(velocity.x, SPEED * direction, acceleration) if not is_on_floor(): velocity += get_gravity() * delta @@ -74,54 +87,54 @@ func handle_movement(delta:float) -> void: jump_buffer_timer.stop() current_state = State.JUMP upJump = true - + func handle_input(): if Input.is_action_just_pressed("ui_accept") and is_on_floor(): #velocity.y = JUMP_VELOCITY jump_buffer_timer.start() direction = Input.get_axis("ui_left", "ui_right") - if direction <0: - facing =FaceDirection.LEFT + if direction < 0: + facing = FaceDirection.LEFT player_graphic.flip_h = true if direction > 0: facing = FaceDirection.RIGHT player_graphic.flip_h = false + if Input.is_action_just_pressed("shove") && pushEnabled: var shoveDirection:int match facing: FaceDirection.RIGHT: - #this is where tabbing does'nt work shoveDirection = 1 FaceDirection.LEFT: shoveDirection = -1 pushTarget.apply_central_impulse(Vector2(shoveDirection,0)*700) if Input.is_action_just_pressed("shoot"): - + print("Ima shoot") match facing: FaceDirection.RIGHT: - - %SceneManager.makeBullet(right_spawn.global_transform,700) + print("shoot to right") + %SceneManager.makeBullet(right_spawn.global_transform, 700) FaceDirection.LEFT: - %SceneManager.makeBullet(left_spawn.global_transform,-700) + %SceneManager.makeBullet(left_spawn.global_transform, -700) + func handle_collisions(): for i in get_slide_collision_count(): var c = get_slide_collision(i) if c.get_collider() is RigidBody2D: c.get_collider().apply_central_impulse(-c.get_normal() * 100) - # i? - if right_cast.is_colliding() && facing == FaceDirection.RIGHT: - + + if right_cast.is_colliding() && facing==FaceDirection.RIGHT: + print("RC is colliding") var collider = right_cast.get_collider() if collider is Node && collider is RigidBody2D && collider.is_in_group("pushables"): pushTarget = collider pushEnabled = true - - if left_cast.is_colliding() && facing == FaceDirection.LEFT: - + if left_cast.is_colliding() && facing==FaceDirection.LEFT: var collider = left_cast.get_collider() if collider is Node && collider is RigidBody2D && collider.is_in_group("pushables"): pushTarget = collider pushEnabled = true + if not right_cast.is_colliding() && not left_cast.is_colliding(): pushEnabled = false @@ -130,3 +143,7 @@ func _on_animation_finished() -> void: match current_state: State.JUMP: upJump = false + State.HURT: + current_state = State.IDLE + State.DEATH: + playerDeathCompleteSignal.emit() diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid index a1ba301..0cb9001 100644 --- a/scripts/player.gd.uid +++ b/scripts/player.gd.uid @@ -1 +1 @@ -uid://cnwga6l2btdbk +uid://b7rahgxxw1yuw diff --git a/scripts/rscs/characterstats.gd b/scripts/rscs/characterstats.gd new file mode 100644 index 0000000..5361989 --- /dev/null +++ b/scripts/rscs/characterstats.gd @@ -0,0 +1,9 @@ +class_name CharacterStats extends Resource + +@export var health:int = 100 +@export var max_health: int =100 +@export var starting_health:int = 100 + +# damage dealing +@export var meleeDamage:int = 10 +@export var rangeDamage:int = 0 diff --git a/scripts/rscs/characterstats.gd.uid b/scripts/rscs/characterstats.gd.uid new file mode 100644 index 0000000..e1553d9 --- /dev/null +++ b/scripts/rscs/characterstats.gd.uid @@ -0,0 +1 @@ +uid://r408skwtvisy diff --git a/scripts/rscs/gameSaveStats.tres b/scripts/rscs/gameSaveStats.tres new file mode 100644 index 0000000..4544f1d --- /dev/null +++ b/scripts/rscs/gameSaveStats.tres @@ -0,0 +1,18 @@ +[gd_resource type="Resource" script_class="SavedGame" load_steps=2 format=3] + +[ext_resource type="Script" path="res://scripts/rscs/savedgame.gd" id="1_v2d26"] + +[resource] +script = ExtResource("1_v2d26") +gameData = { +"GameLevel": 0, +"PlayerHealth": 100, +"TimeAvailable": 7, +"enemies": { +"slime0": { +"damage": 31, +"global_position": Vector2(606.127, 280), +"health": 68 +} +} +} diff --git a/scripts/rscs/playerStats.tres b/scripts/rscs/playerStats.tres new file mode 100644 index 0000000..3615832 --- /dev/null +++ b/scripts/rscs/playerStats.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://bff0fewekswn"] + +[ext_resource type="Script" uid="uid://r408skwtvisy" path="res://scripts/rscs/characterstats.gd" id="1_sqkfu"] + +[resource] +script = ExtResource("1_sqkfu") +health = 100 +max_health = 100 +starting_health = 100 +meleeDamage = 10 +rangeDamage = 30 +metadata/_custom_type_script = "uid://r408skwtvisy" diff --git a/scripts/rscs/savedgame.gd b/scripts/rscs/savedgame.gd new file mode 100644 index 0000000..e251422 --- /dev/null +++ b/scripts/rscs/savedgame.gd @@ -0,0 +1,3 @@ +class_name SavedGame extends Resource + +@export var gameData:Dictionary diff --git a/scripts/rscs/savedgame.gd.uid b/scripts/rscs/savedgame.gd.uid new file mode 100644 index 0000000..7f7bdc3 --- /dev/null +++ b/scripts/rscs/savedgame.gd.uid @@ -0,0 +1 @@ +uid://b0iyohv2ch6yg diff --git a/scripts/rscs/slimeStats.tres b/scripts/rscs/slimeStats.tres new file mode 100644 index 0000000..3ccc39e --- /dev/null +++ b/scripts/rscs/slimeStats.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://r5hx4gu0mtog"] + +[ext_resource type="Script" uid="uid://r408skwtvisy" path="res://scripts/rscs/characterstats.gd" id="1_ppipo"] + +[resource] +script = ExtResource("1_ppipo") +health = 50 +max_health = 50 +starting_health = 50 +meleeDamage = 25 +rangeDamage = 0 +metadata/_custom_type_script = "uid://r408skwtvisy" diff --git a/scripts/scene_manager.gd b/scripts/scene_manager.gd index ccda8e7..ed0f949 100644 --- a/scripts/scene_manager.gd +++ b/scripts/scene_manager.gd @@ -1,43 +1,100 @@ class_name SceneManager extends Node2D -var bulletArray = [] +var bulletArray =[] var totalAllowedBullets = 7 var bullet = preload("res://scenes/bullet.tscn") -@onready var game: Node2D = $".." +var slime = preload("res://scenes/slime.tscn") @onready var triggers: Node2D = $"../triggers" @onready var coins: Node2D = $"../coins" +@onready var enemies: Node2D = $"../enemies" +@onready var player: Player = $"../Player" + # Called when the node enters the scene tree for the first time. func _ready() -> void: + var loadObject = Gamecontroller.reset() + print("LOAD OBECT") + print(loadObject) + loadSceneInfo(loadObject) if triggers: for obj in triggers.get_children(): if obj is Trigger: - obj.areaTriggerSignal.connect(game._on_trigger) - - + obj.areaTriggerSignal.connect(Gamecontroller._on_trigger) if coins: - print("found coins") - for obj in coins.get_children(): + updateCoins() + + if enemies: + updateEnemies() + + Gamecontroller.destroySignal.connect(destroy) + Gamecontroller.levelChangeSignal.connect(changeScene) + Gamecontroller.playerDamageSignal.connect(player.handle_damage) + Gamecontroller.playerDeathSignal.connect(player.handle_death) + + player.playerDeathCompleteSignal.connect(Gamecontroller.deathComplete) + +func updateEnemies(): + for obj in enemies.get_children(): + if obj is Slime: + if not obj.playerDamageSignal.is_connected(Gamecontroller.playerAttacked): + obj.playerDamageSignal.connect(Gamecontroller.playerAttacked) + Gamecontroller.addEnemyToLevel(obj) + + +func updateCoins(): + var coinCount = 0 + for obj in coins.get_children(): if obj is Coin: - print("coin collected") - obj.coinCollectedSignal.connect(game.coinCollected) + if not obj.coinCollectedSignal.is_connected(Gamecontroller.coinCollected): + obj.coinCollectedSignal.connect(Gamecontroller.coinCollected) + #connect tree exit + if not obj.tree_exited.is_connected(updateCoins): + obj.tree_exited.connect(updateCoins) + coinCount +=1 + Gamecontroller.totalCoinCount(coinCount) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass + # makes and recycles bullets func bulletFactory(): var myBullet:Bullet if bulletArray.size() < totalAllowedBullets: + #make a new bullet myBullet = bullet.instantiate() - myBullet.bulletDamageSignal.connect(game.bulletDamage) + myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage) owner.add_child(myBullet) else: myBullet = bulletArray.pop_back() + bulletArray.push_front(myBullet) return myBullet func makeBullet(position, speed): var someBullet = bulletFactory() someBullet.setSpeed(speed) + # postition the bullet someBullet.transform = position + +func destroy(body): + body.queue_free() +func changeScene(level): + get_tree().call_deferred("change_scene_to_file", level) +func loadSceneInfo(loadObject)->void: + print("make the scene") + if loadObject.size()<1: + print("bailing out") + return + if enemies: + for obj in enemies.get_children(): + if obj is Slime: + obj.queue_free() + #build and place save game badguys + var enemiesList = loadObject["enemies"] + for key in enemiesList: + print(enemiesList[key]) + var badguy = slime.instantiate() + enemies.add_child(badguy) + badguy.global_position = enemiesList[key]["global_position"] + diff --git a/scripts/scene_manager.gd.uid b/scripts/scene_manager.gd.uid index 88fd073..1c5d235 100644 --- a/scripts/scene_manager.gd.uid +++ b/scripts/scene_manager.gd.uid @@ -1 +1 @@ -uid://chu805lvjnh7s +uid://d1daji4xwuj03 diff --git a/scripts/slime.gd b/scripts/slime.gd new file mode 100644 index 0000000..72143b0 --- /dev/null +++ b/scripts/slime.gd @@ -0,0 +1,51 @@ +class_name Slime extends Area2D +@onready var slime_graphic: AnimatedSprite2D = $SlimeGraphic +@onready var right_cast: RayCast2D = $RightCast +@onready var left_cast: RayCast2D = $LeftCast +@onready var left_down_cast: RayCast2D = $LeftDownCast +@onready var right_down_cast: RayCast2D = $RightDownCast + +var speed:int = 100 +var direction = 1 + +signal playerDamageSignal(body, slime) + +enum State {IDLE, HURT, DEATH} +var currentState = State.IDLE + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. +func updateAnimation()->void: + match currentState: + State.IDLE: + slime_graphic.play("idle") + State.HURT: + slime_graphic.play("hurt") +func handle_damage()->void: + currentState = State.HURT + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + if not right_down_cast.is_colliding(): + direction = -1 + slime_graphic.flip_h = true + + if not left_down_cast.is_colliding(): + direction = 1 + slime_graphic.flip_h = false + updateAnimation() + position.x += direction * speed * delta + + +func _on_body_entered(body: Node2D) -> void: + if body is Player: + print("Slime attack!") + playerDamageSignal.emit(body, self) + + +func _on_slime_graphic_animation_finished() -> void: + match currentState: + State.HURT: + currentState = State.IDLE diff --git a/scripts/slime.gd.uid b/scripts/slime.gd.uid new file mode 100644 index 0000000..9877604 --- /dev/null +++ b/scripts/slime.gd.uid @@ -0,0 +1 @@ +uid://cuaxw7eh73a1i diff --git a/scripts/trigger.gd b/scripts/trigger.gd index 6e6e08e..c1fc962 100644 --- a/scripts/trigger.gd +++ b/scripts/trigger.gd @@ -7,6 +7,9 @@ signal areaTriggerSignal(effect, Object) func _on_body_entered(body: Node2D) -> void: - print("trigger sees a body") + print("Trigger sees reaction") areaTriggerSignal.emit(effect, body) - + + +func _on_area_trigger_signal(effect: Variant, Object: Variant) -> void: + pass # Replace with function body. diff --git a/scripts/trigger.gd.uid b/scripts/trigger.gd.uid index 2c063aa..757654c 100644 --- a/scripts/trigger.gd.uid +++ b/scripts/trigger.gd.uid @@ -1 +1 @@ -uid://c57chsew3r87y +uid://ditcg54u4c1lr