From 69a456db88db0148d18b7a5d6340ba0cd6504a9d Mon Sep 17 00:00:00 2001 From: "SLAPTOP\\marvi" Date: Wed, 11 Jun 2025 17:54:55 +0200 Subject: [PATCH] no message --- .../assets/textures/ledge hang 144x144.png | Bin 0 -> 915 bytes .../textures/ledge hang 144x144.png.import} | 8 +- .../textures/player ledge climb 144x144.png | Bin 0 -> 2875 bytes .../player ledge climb 144x144.png.import | 34 ++ sidescroller/resources/360x360 idle 4.png | Bin 24069 -> 0 bytes .../resources/player ledge cshape.tres | 4 + sidescroller/scenes/Player.tscn | 249 +++++++- .../scenes/Player.tscn20170388760.tmp | 523 +++++++++++++++++ .../scenes/Player.tscn20179383087.tmp | 523 +++++++++++++++++ sidescroller/scenes/Player.tscn2581566153.tmp | 545 ++++++++++++++++++ sidescroller/scenes/world.tscn | 8 +- sidescroller/scripts/State Machine.gd | 42 ++ sidescroller/scripts/State Machine.gd.uid | 1 + sidescroller/scripts/State.gd | 19 + sidescroller/scripts/State.gd.uid | 1 + sidescroller/scripts/player.gd | 242 ++++---- sidescroller/scripts/playerclimbup.gd | 46 ++ sidescroller/scripts/playerclimbup.gd.uid | 1 + sidescroller/scripts/playercrouch.gd | 37 ++ sidescroller/scripts/playercrouch.gd.uid | 1 + sidescroller/scripts/playercrouchwalk.gd | 32 + sidescroller/scripts/playercrouchwalk.gd.uid | 1 + sidescroller/scripts/playerdoublejump.gd | 26 + sidescroller/scripts/playerdoublejump.gd.uid | 1 + sidescroller/scripts/playerfall.gd | 30 + sidescroller/scripts/playerfall.gd.uid | 1 + sidescroller/scripts/playeridle.gd | 27 + sidescroller/scripts/playeridle.gd.uid | 1 + sidescroller/scripts/playerjump.gd | 25 + sidescroller/scripts/playerjump.gd.uid | 1 + sidescroller/scripts/playerledgegrab.gd | 38 ++ sidescroller/scripts/playerledgegrab.gd.uid | 1 + sidescroller/scripts/playerrun.gd | 28 + sidescroller/scripts/playerrun.gd.uid | 1 + sidescroller/scripts/playerwallrun.gd | 31 + sidescroller/scripts/playerwallrun.gd.uid | 1 + sidescroller/scripts/playerwallrunpushoff.gd | 27 + .../scripts/playerwallrunpushoff.gd.uid | 1 + 38 files changed, 2398 insertions(+), 159 deletions(-) create mode 100644 sidescroller/assets/textures/ledge hang 144x144.png rename sidescroller/{resources/360x360 idle 4.png.import => assets/textures/ledge hang 144x144.png.import} (66%) create mode 100644 sidescroller/assets/textures/player ledge climb 144x144.png create mode 100644 sidescroller/assets/textures/player ledge climb 144x144.png.import delete mode 100644 sidescroller/resources/360x360 idle 4.png create mode 100644 sidescroller/resources/player ledge cshape.tres create mode 100644 sidescroller/scenes/Player.tscn20170388760.tmp create mode 100644 sidescroller/scenes/Player.tscn20179383087.tmp create mode 100644 sidescroller/scenes/Player.tscn2581566153.tmp create mode 100644 sidescroller/scripts/State Machine.gd create mode 100644 sidescroller/scripts/State Machine.gd.uid create mode 100644 sidescroller/scripts/State.gd create mode 100644 sidescroller/scripts/State.gd.uid create mode 100644 sidescroller/scripts/playerclimbup.gd create mode 100644 sidescroller/scripts/playerclimbup.gd.uid create mode 100644 sidescroller/scripts/playercrouch.gd create mode 100644 sidescroller/scripts/playercrouch.gd.uid create mode 100644 sidescroller/scripts/playercrouchwalk.gd create mode 100644 sidescroller/scripts/playercrouchwalk.gd.uid create mode 100644 sidescroller/scripts/playerdoublejump.gd create mode 100644 sidescroller/scripts/playerdoublejump.gd.uid create mode 100644 sidescroller/scripts/playerfall.gd create mode 100644 sidescroller/scripts/playerfall.gd.uid create mode 100644 sidescroller/scripts/playeridle.gd create mode 100644 sidescroller/scripts/playeridle.gd.uid create mode 100644 sidescroller/scripts/playerjump.gd create mode 100644 sidescroller/scripts/playerjump.gd.uid create mode 100644 sidescroller/scripts/playerledgegrab.gd create mode 100644 sidescroller/scripts/playerledgegrab.gd.uid create mode 100644 sidescroller/scripts/playerrun.gd create mode 100644 sidescroller/scripts/playerrun.gd.uid create mode 100644 sidescroller/scripts/playerwallrun.gd create mode 100644 sidescroller/scripts/playerwallrun.gd.uid create mode 100644 sidescroller/scripts/playerwallrunpushoff.gd create mode 100644 sidescroller/scripts/playerwallrunpushoff.gd.uid diff --git a/sidescroller/assets/textures/ledge hang 144x144.png b/sidescroller/assets/textures/ledge hang 144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc1c4999a1315c676a38c7275a8db094e230f46 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$a>cF%}28J29*~C-ahlf!Wv7#WAE} z&f7ct`*{*2*grhw=v!K#R3|RPsmQfosMAe%g@}lV&_Bjjr=9}3XezUIF4 ziIa2Be&7A~RsPLp?Ks=HNWY;y{jHw zW1G(B(!r#pa++hc;Wn@Ny9^eS5K_ z=Jkos2h7;JVY*%mbgm7$|84u_S;>>-z0d#D-zN6p_ZOd>U}i6NB^O3PBObwRDXWf! zt!CVQ8tSl|jk4lG+4B!|U8}Pft*ol5e?PBA`2HD&ON|_X4lOedd9fs~4lGe{5)n{5 zERcBAbJO$AHOFq8D%$jRD#X^`W!1m$oh`Ak`m8JazV`nTlXG%&^QYV1>8`xLJ8^GC z#1dw~MGYJ$>$t2z|p|x0P-6%zEAz`|`)zBOATW+gAK=T>7~f>KfBSS>~k=E4Ig%cAvf!Z9PjM z+SN)xk*i~ZPW~$S{d;y_5(%5L=UK<9j$_AWg1xy!F!+Yj(Xc?npx`-s=kAyyCv(l> zGB}8Ma$B~ppZDUsn3N;T`m3Lo26Zn96ozP3xz3?&+Aul1YxCFF%Yx?ooo6-6FJkAv zqeA&B;~Mn{FxB^xcs1f||8_!=k>npuqq+i>0xn_@B gumehphI9UYzopr0H=7L)&Kwi literal 0 HcmV?d00001 diff --git a/sidescroller/resources/360x360 idle 4.png.import b/sidescroller/assets/textures/ledge hang 144x144.png.import similarity index 66% rename from sidescroller/resources/360x360 idle 4.png.import rename to sidescroller/assets/textures/ledge hang 144x144.png.import index 7b07966..77fd2b1 100644 --- a/sidescroller/resources/360x360 idle 4.png.import +++ b/sidescroller/assets/textures/ledge hang 144x144.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dee2owliuw21p" -path="res://.godot/imported/360x360 idle 4.png-117ef8683eb12d17036155a97c6705d5.ctex" +uid="uid://d4dnvylog631n" +path="res://.godot/imported/ledge hang 144x144.png-38a6ad6401796dcb66209ee6ec21dbf1.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/360x360 idle 4.png" -dest_files=["res://.godot/imported/360x360 idle 4.png-117ef8683eb12d17036155a97c6705d5.ctex"] +source_file="res://assets/textures/ledge hang 144x144.png" +dest_files=["res://.godot/imported/ledge hang 144x144.png-38a6ad6401796dcb66209ee6ec21dbf1.ctex"] [params] diff --git a/sidescroller/assets/textures/player ledge climb 144x144.png b/sidescroller/assets/textures/player ledge climb 144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..61dde494e77fe22312c448cc5b4d7f4fba754ee2 GIT binary patch literal 2875 zcmcJRc{p478pnfa>*`=^wZ%T2D#gSSJE2NC;HXQ?oFND*urgKMu56OAPoTE+A}k`X^SY@n6(VN*UNS(RA6U8 ztFbsKLk4Ff_!UML3rPTe6Le=>K%M{6&$mLQ{mYcA@+BWqq2ss6cLXmew8CY=()uSa z*u6BW%E)pN)_8`^RcGh7;cJl4wHhUo%cdHcCDFc&+UWU5UGoq2H#RAl=$$Cl-FP() zj4+G7Nuzq|kKQlrey! znn%wTA%2>3nOr+-A*5gx!U2FJ?UCz#aaIfzTTIkc<*nzZ{KmWi5(AXou<;Z}ZYf2c zzU5R00KOegya-76syQ>1Fubq+CS6nN>*YA@F!aa8(U;%bfz(^^v)LEQ76}N5)aP$W zBmLUu!qo5CxdDKGMU=4tq;E>d0h6tb--Mx+)P}rY`$Qn*b4%N(cE!puwjuc=uyLe1Uzemh#Qx^TAjm~-YGBh9B(Wa>4=|`wHPJvUW zz;%e;GH;NN)I*17@o3_PO1^X*vL!TEckzvOzclSpc7<4@y@$Bc#7$j%Lhu{#4q;Vz zT!F{ytMfYkV-aT)t>;SiU9nsQ8hz@0_SeETsX7+E!}?9TndCZlIJ;6GxT=KY>5k-+ zw)bU;>xXJR?*%_!iwf+yKcMa{SK`n7L~U8t&qJOd+slT?jJ{HDsnd1rz>>hy+sj8@ zF|?+`8f@%AGjv8#We@~<2;1L&x6W;-u|oC+{+g;Ca#3YT zcV8B0wj(QwtWV$a5u(V~KerD~2QO;xf6~R?`=eT{V9aIO?zFIjUJ93-A}SLL5Vy&B zLMWZ|aAMW7G5l4b)04~DVkAC_pMT7byS&2#(_{r&A7k)T?e83koG^hfTRESt1OHX8 zp5ow;6j{<8<@`GEPZmJRs)=inrxT?k3^qsURr9YhA7gkJ3NGU3HNlS8nIT0iXQUdq zu=-izcVuRcwP8%iN?5dFzLA6Gj8pRU5w6zQW+d~0cXFv75`(1`+{JeKPND}UEwZGn zk8Z@QQFa-=lG&QSr8z|=qM{<|_{K##P%gXyHaA%OZmZorLgK0HnW?qF_0%h+>|joe z!4~*7t3@EvDh{PgtdXFE$bTw|7>XN;2llI7;?anU18z9#+#9&9f`^h;E{Hf?uHT#$ z@2?z+FICpqQQ@A|m&dk$6Hrd|j}XH|F$U&%K*T=nHmekkhc13kw} zBF{OZsv@8C6u*xs|IsqaL?dmv`Q?=gi68tUqh9j~C@kg5lbe~OA1&RQ8ngua9ai>} zcTz9{_wfSnJ;fWRF1z_cuS4U*j9b6^TCxp%eGr8BmdOa9Hg=`%79EF1kL@1QaP?~0 zArfK)i-B<#oSYFcEvUgrrm&L8Pf4&vj-Z7m8wbF8ASCRCWHUwpNqUMBvaZl1O9qQN z69xoh%`{HX21oDQdIEyG_69@sR7x(*g* zk8L;o)2~K2n#=?=uqVQ|xmiDMDg(Uei?CC{a_1{I=&666s_|6-=knUD=|Obu}+f;(2Lx( z+W-83=`2HH8$M-Cn9m8zX%{{oU8uo*P#j3n65SQcxR|sb+(_vMOr& zL~bs}W91j@&mBukzr8(+Gb`-~qSwG*tG1}*YGxJP(&61x*GGPz8&qwh99ATECB8BM za!fFYoowi1O`ORIOI6iu6PfP(rax1-#S40qlwJHTGwnsNT(+fMS&9!;9Md(j5VF_s z9Ym2OP`VouZWF5XGqZDAinRRBK1723FoY|IC(j zSo~n@?;9<1ZT91AKe0~0SvjED-Tm$Rqq?b7ox>YPGwlTd-Hhh#=(TBdIONWv-|#Pu zP|z9mUTGYPnerCv#)DBW4k`4Tf*Y+1?czNFeRW;psSlvg&{(2T27Ghq&dgJsUJW zeNmz(Vi-7$I>WTAZg$)-y=i3yX2fhm9dF?3E8{!cqeG4xXeswlkKH#|$IL`c=z7d@ zGTas9{rthgVlqOZc49lfI+FqoG$qQ_b9-5};es1p#jRV6;azSk#b!T-)hWfk%*W94 zlH~CR4D%w6i4+!(`%5f1nktGD(!xK$Ge^+4MJ<@3q5_=z9Q?Zn1Bu3Fg*qoo=@esR z-u{x99XB$lhjCe-Wk#{{p+g7{sju*$X9I(pV2F0yzU>(8pt$x#?E}x6oW>w#3cRxj zr5kp^{$WXX9ZoJ%KTglA(0k^D-u~~c@Z&%GP9x8(KDqZ0KBuETLp+Jy zUM?8+dCk}_GgO_>>*VP?MPJ*MY<-se4jzu(`#91#oozDPT#EGWAWkQGY3O)@wR5Mjg{T2<_rzKNAb?|R$dU+S=+6bC_m@Yaka}> zFLBS0wkv$T#4GRk3rx1M(V7BT@h>j>N&1TEVFcg3y5}G&+}>@r$Fbeezql^==;6~2 z4vT7kT-x&0?^_7&#HsV6m6x`r45w7H(gxL3wu5y4_s{>;!2cgKFccYE;ISmAolEEp zUMoO;PK`bF-ow%fZIKwnd;J&=1HUGIX-VUL!rX*dgEW)zp?X zNrETBmY)49hba)TEB_Ts(O z@jPNuJLm!;(P$yg?`5`osU5M^%iWfXPKL(~XGNuyncP=L32MF}`&S%83nH>!|A6A- z{5~fD=Xc&o|4FHbeEeM$&YJc{@Morjb#fci>$uQT_={ij)bn}ovKu$3pS_g zox|K=6+{REYiY$D6w;3vNgbV&+MG{(-A_bwRy;p-ZfG_0?nH91Xj)7v@7-Jft-b4{ zMeLhlzI%qKNniE#fL0vIVK{q#+H;Gf1V{e z+pS&u_Qa9~1JuAuH9wVJ^!qvSz zSNBdAmCbivIoi(lee{Hp?6fbJ^gptRDN<5C*D zswl*t7g~HDj+yjWF*lFB9@sEgftSuggNvPlefe{}@>PS@dsW!)O74EOxce>pN%srM zqqxvggV>dRZ3{D%fzvS_7y8RYfN z_Q`eS(sGZ&E0N$S9ifm1=})LBl8XV8-%>CV4~kg5T_*bUJ9jc~7Z#ojwHovp!4|84 zy}`Lv_z0gBDm+vxK8;D3@+IeIj+H%)Zy}~H>0H~8D|;fyemSJu;@ZDF-Ovm-KjKbM z8N4i;9oPCTS28zl78{_Cn?H}&pB3%i!1YD0*dnoXr;Q|G@qDi3&M9#9pPSxj)^vKa z7E_fu+(WWn=u>H`_M**9{M1^!MmV-Rn;KR9^H!F^*-%VI3O6jWmq6uu-6HljneUF- zzuo&3i5#$={l#PPYe)4Y{c{c@fR@;I`+Ge(V6IHlC=}Cu;9s&OfNV1l3OvG?d(UWB z(`%Mf!4d~9=FV?4Qzcgk$`Uid%s-X*~`c2;@94RExxYk{?VUp(R?XQjcK3NyxyHf3r>ZDQO0M2zaNpyL*Hdn27|U{dk2SY z&2B$HY?({^boEGe?*Zcd6cP=6cj8;7X^exS=NJOOX1JGW5{$j<*_WpJyO~9y(>vXR z3h8v^XhKMkPk&iRO*czVGxxQ^*?pKm>3=~l1Y+ASY5PlDMH+Gg@lx7gb>Pnjp-gr* z?6;w={_^D6#r*aSD^2ysUvJnjj@`MlfRqwLYOK;@QmmPRbb%=Zz>rjw^&giqq-u~~#zOiR*P4ssM|1f4>(BGY1yfc6K!Wty+a%v5gO$GqVvQexIhsOQBy$4$hhL}) z^L;ffp{=0p!1#xfo$#|>HjQt0c3jA?@#2kqQt%w9y4Rn{7acGufT1JD)Co?0*`EW985^+CLAU(4sms@7{&mH!oHn>nbf{6AsVHWT{GLvBKn9Tobs zBhEx$YqoP*yxi)^Y`F<(JZ@hJ1L6hT?<_8%cC_%e(J>>;!j}K_=5KGF(*!-Oa0_JH zmamz1SLH%Ni0dh|^`{dQQM+icy@rSzmoDvUEqZAVne?mRqr!t9Yf6>22Z8lp%hsi5T#J;a9T%PpZxQeKx*NS{9d$Nt!H>xpvr1<^^#DEy> zzbmQm|DfGog>wH2=gO|1Y?c<=kFhHBXXr$wyC#9`h?hJgF!g}z8IS%G!?!sxeCfj8 zD^c&t1Ez#Szc`(}T2WPUAe**wOs>j@taFruDqrb!B?K3@6T?ED!-`K01Uv#|t8tb6PKCXrevAQ)V7_jiIDpL&}W%h;Wz zHLGRg=wYc>P0tOPnwV4@b->dW9hJ>BZ%@2%T6KkJ!)3Dn%)1C@5L@C5|B0#!g^DMW z6a*&=j>NRqyQamos0H6~G{XEHBW+!wEL&C!JB0QslorhnXJLsq5x_t|;sYu_Z$tC$ zN`Y~;_DZM{Ap3>hO%4=~KepIuF9j3hhII*^QDGhQt z&sX*8(D^OdDgKt`q!E4F(5xQv7~@s?hv1#JJ~<6-F|f*>YFU)gwF2j8uF^yev(J$*hm;zTU^RjbE!=SxEfo1)HJ{ zAZ&19oK)#E+Y@M8HQ{%AQ;5-%&=!w|ANbE#GH&zU{q2Vjxqb-y7bpq8_nUn``;AbP z#l=56zeO5ttqh$n@^idYQY}B6fD7@IckZabmZg@2XQrXZ%e1E}a3 z1nLFOk2%c*)6Z6!^#mkJMPb#zIObBDQQ1kfWW zBkmsOmLEUcOX%|V@<=Rp~RFH zuZ`WYnQIvNZS)Z=ahAbL*c*&#q8%J7teF#~B)b(2s_@HZh3oEELe`%^*d>%fCj>-y ze0R;bf=`N_l`?!1=$T~_5N2;=RPSsj>}51&e4#R^P&HdpRj)j$FSlGumD;rD!33>h zR^{bRlS&qN#`hD{_Na++Sb~%t~i^BvqPuZXHS1Z#x*`+LCU2S8z!}yHGR6u{3v@=~m zLX2y9*^BJ*LfQ8;Lb&~(As8uT3h6|=q|VKaf%+yXN-M_-WACqR=AeaY&OVXTkGNE9Oi@B><3Z;z zT`s43h7>pFVHq4OlP;<4xI0+i~>wA)m%iP&y-DVO=GUv0?{OQV_Ve(v#g4Efs8az;cIkH6K zzwzCxiM7u?&`tkrl&{!N$!^F9`#s_<{B%vG#rgc^MZY2nIqwkjr zYRw$e%rc!d+C%)pwL~{!iC$B^ltI*7?IKoY5-C`tp5#k2zxKp#x#s=3G{HHnnmzD( zoYh|)Lc2tpD}F#G3*V~VL5u;xWCAbZa^niu^G=HPZ_5fFV_Y27J$;^v5Ql-#nSO*t zl#2EK;1%hR7SIw-vrvDO-hzrk*dBr~ZGbTKi@e$h?eh06QRp4GIX1dm!q*=Yg@90N zXZtIN2s?av(~4$drh0_*>+%UvSwi?2!iX+Ut_oGE{ME^4IjCP`^1hyS@S>>TA+GQK zZ4WSevCxcm?XEzL?N35h)<8w_nl_CxMA$=*{k|?Ww3zClsQqu`=Ob8gt)%E&)BJVA>4a{U?Y$LjLDNZyArq*+nm%=J!E z`~G3r&hr@QGY>bkWCJJH-3l^3)8-fXoVtdw*ZyMPZkp$fH4M{$q!zIj?L*eg+nK4~ zKh->YPcoh8o=^+eL`<&(iU*nn@7;)yO8IKE2sAG&2!as;>N#7^;xU|U>{}Iqx)cZA z%__Gt<(<-3j?NYOg_fE2tD4)ZvL2Iv+vv%GT!Z$)-PT&ulnEu{nManneub?5`94Oa zVR>#@n;wCnB@w(StW}>(iSx@(P9`;W#gUMb7nVnQRRp?V7^Ix{%C1t|KKE^5h^%yO z6dV!(H{F;cBhtBnZ_@ulxJbrrlbuv^QRb+4(RnAE&td%=@h)Q%w85ZnN*G`5jn$M= z+w!ANG^1>TCa=0&ZT4|XvLFp#3@gXg_GK4^RQd$$th_w8Es(z=oo4U#n$CDh`hH$( zgWZbl6t(OG(aO`fF2YVixaNJ5N>OY~5bxLK(9Td^4(x0M*(zM69+^Mc!Z^W^?F2`5 zh4bN_W6PXDKa@CJX0=#TE)H|DmOMF(6=^hKlJm)vS{Ose zkoSwch;@1zd_fY^x-IJ28<%@G`6#J`jSW+_(*+L6gEYJ5KMEW&ww98pkX#i(l(zf| zZd&Mcad5>#aF3OyN5cwc$DrxNC5$hz6A6mP^9o*(<0hZPAG?ftF=qDqJr0fYBx`69(+{;*!_BI0=!8E`>EDcDG;;0JX%(JA> zs%DOhW zcx-I$oA(`Sd8fi;&2EJSSKd~3^ZAZY1GnJY8%XI6f?9s(FW|3Ngj7E364PZ0xIXd5 z5rA66v^Kit&+qtX1K&;!+IPPI`X4btHgjUA?J^yqM&kj|I&4up4T^Yw7v?%~vBcFe za3`SE&r^rJ_51IPS$b6CvszlR)ttM!Zf`c#_S3AU_qq|pO+t-2PVsdo2gQ@LWjgjB zsr0{(t!>G5iT%_pZ)!m`pA8tO+-}CwLt8|tN0tDqMCCNtct>*O&4)wEBi6l zN5zDEms%&g;57>grhG}*A(*99q~;V}IL%7VX>ZG8^p^k;u{}xaK%uFR|aI6YA-j@ArnUouE4~Td* zwwuOOyja(4kbbY-XJw6r?`2F&EqQJd<@#lj)qjgIbl3=&tLPD4Jd}I zle3+{cH^<4Nygd1afY?HLGQ$f(!iIz5W!q+jEi$;eQU2hlh3qE$Mltp4p&gNXl4f6o1T-U)3zKOmW#9LO}wfx;`C|n+7O26Kdl|sXt z-#vZR7jLv~IS7IqGCiOUGYTDhNZDk; zu#t;OCA4*X``9N=Oz!-yH4nt}RnwxL3PoId*(kwd;K*U+l6B(z zXC7V0Q90sh;|8I=mX$5lwzyHDop|7lbXIt&>?NI0{N-;SeRwDOtI)6IOYu!%X(rgl{4ACIt}S2Jg_IQb@oRoq>QHaROtFuhs* zHc)^rAafjNyp<4M>e>=&^n|_1o<>01C{(u?D`PCN?4VfJ9aqfDs?cQ*Ob-o0Lh+uQ z_Tv@bblh@7Gd@aHU-$~@wlv{&os*qg#|^FWRS`aFS0zl9pHKzmRE&=%zt&cbyv^JB zeE6O<<yu9wk|Q&Q?XYIf6vA(-C|KP!^&oFr6O>8J%W+s@Ff z`WNWT*Bi>Ow$6%Lv?kMof+@9<)}L>uQPkCtjg@x!Gfj&eI+`E@>EUu+=Jyf8ovDNx z&}*kd$X0?YZ`nCkd5Wu}%Ru;#qi#O>p%H6hydL0I2uno;ZQel$SMo`VY|pK_tnxzJ zqT2mIO>lYNoS2(eVaZ=Bnia$>-Y4&*8vEaQmgk4QJXfhDrujyGG_GahnGu;!Up%(H zQQdbej;u@y@rGiSzy?>7*z%`7`a8P+dUeI3&DyrYcgJx0*w2pT&`w4F+Yo~ zfc6qZf&qxE&!#h6Mxi|FJQrdwQHm{w9RJ<{YgrQhgJ0I{kfc7kpd5W@J7htT`hoTQ zp9}vC7g1HrHXb9XWml^o3~g{3u3+s$?M`DgUt6v-lwnvmqO6t_G&j_8?12-lG1x6~ zqF>%$v&`3hVCLSaQZ?(#kqyAdc9bgauSup`-Kco`8icWoA@xI4hqEY(3=&bS!NV#v zNQeR++MreMD0EdY;>eD3e^eeuS9S)Yhhs>S0~?6uV;Q| zuzg;0c+{I&Ju+Pqc$I`6d+v)nGB5r+gQ-yD&=V zs+3E7&--rc>Sx#Y{qflCOW%C3k!HD&-R@aBB*%vq0pZ2d!x^b-^qgcx%2M}(16nZe zw-Dnyfhfol^82O~{D_5&^gKTv=k!*>Lglcd_lNOCqLpbRVKOvVu^{SXM>bw%(abiV z^@1j+Pu26Pu4V*3@}>`Vi74*>kWAMoi|;#k)ekz_Pmkls_W@j}goWx2OeZ^oQ5Bnk z*K|RtEfi9M12*a%i22On4^3L=FLHX~$#vtoTHg0N+S3DcOb+8Q7FRe(?jj?i%qQw) zv@z|qcDL`lvA8#IUa`JYJ(I16V-F2qEIv2pGb+%XR>c~pPVwzDe=kleB5%Z6k-bAQ zA_}cSeoh^m{PubF74_?2pI~S(rg{6Y0JXILwYu0w`{|&?+3!|ebN11JT-~L zu0GV3dnEtCBZI-G;Y07vu8MGD7;Th&#u2$YHUpYO*JJ^##R>zVQ(DNoH}Be;T8yvS zdmq|uUv;hhhi`l#m(Mqs@tX&{A8cPpnx)0LS6$WD_Y&KLS1#y1Ayp^N!U#!@#6?P=%^QdR1?DUM=m+{$X zXrraJi#y5^bUA;3x{)pr_kzarr~Y`Jyw%8P%&G{r558ke+Ltle<=*C79opB& z-(trnbStO|L59!jDWuIB>T1xSIp_ZV)r?Jo#jdy(?QJwG%X3ohHxAy~tsmrp4}FQc z{S$g1r`dO)a#E5>BbgQ1*L7LI@l2-_p$3w#7?nVQx)Pr>nD}v#w>Yu@+q;O3`?87O z&vDYTFx@sZa9Vd)#)6@y(y|OATmo?2Ql$<226C(2ALJef^P%;}@=_-C$+N4^XqnY5 z?0{oDpW z3p`?oPBVt+iw$amm0D#)&Ppx&I#EBi9j|C&DJQU-8Wfy6^Q@69Ksn@vxvv_G^}@(>Qh_pJs%7u z6@V<*r=I6e6)5dqobEi-G$#MvC%Ks@QC>RKIe}?v99*L-Dfa~$I@C5opur|V89h!) z&aNY00Cc{=Dq&%ZWq~mQp|zA}yRwqrpT~UpH_MTM{3S!q??yOWWf1t6`5pK*A%qG4xQuF z4bf0H7`nnr<%K)}b!(>f1b_IMyxdzqSzKF#gXf(hm%@wP^}mCWg!;SN=%yEoG7}_< z#Xpg&7V9?^i>EY}bJiZsBbyqfKUJzdNos*APftsW9GFxhb;fpoLuIs5z(Hb2EuzU{ zMY;y`C*vQogWx3cdhO!J?Erz&z;cc$uelG{a_V82P2Ss<^%a(cdymS|PY>g4W1y-y zxq&}_%{8x*%MD#JB0NzKPw6GJ$CC^MyN^FOfH+Ltsgd6GrMBkE)tBdnKicQl^r=_2 zB@Z^bT5Z{jXAK_I!(`WzgTP~!ye@l8%NWj>WPppp`r3y^334#q(A=Z_3j0Tj_=CQ% zO_tgT8Rcj$F;i;Cs;lI7)s8uqosn90wsF1?8Cxxc#Ep2{nX;`7R zlAPCzV6E*&Lr0H6l%#WPPYb&F;%H*ba-A^!zr@tL)?<8i5%<+zL9;o+jA$runFyHf zOYo!BC{;&QlvYcM3N~yfAYfEJOi@4*4~wD->>{SY!_YniV-Z7lqL8M5TO3$d9_F4m zXnTVvKnQ^Q!mK}Zy`KK*s^?Lvy>WV(v#6kq>^VW}5jVVNp}}A1*SpxV;qSXNd|njs zT31B6Po5bbwKi8ax3z3LJ2T8Pl@hcMTy1+Td3G4PAD~&`;o{3>LJ9Oc7a(j5Zdx4h zlV=M|LtH+)zTCUyt^6qww7KE4}FWYqzznge$I)-p%-yU-Y2!rG*9C;}=a>tHQH)7o^xGgh|(tHNe<0 zEIb_fYp-aT?Sbyl8&@Obi26^=m!`w~<5i&Da;tu1Y zVR5A~t!T*aPv0);op~<0OIk-cg>%xZ!DAWeZK*1pX4jQ1mue7MHp*MPo~{9PTW7n5 z(yp&7n%6<@k-wpCmyqIPkN8%+mLi8{yy!dlT8U3Jxu@6cfO%4P{D>v9@W~*lOKZ`& z!%rDG9!c0v2satVpP3cib&#zF11`mod%h(?O0;A7OY|77g%H2-Y`J&cJr*NM(wchh z?2R=s`qy$m1Z8^a5kTw53hGYbP$>}xs}JlUyxwdNWS3VL>3*opd^y28rI;DsnjCz$ zw4`9KU)1d<1k%i)_4$qE{#q`T`-+Wc%VGa<+X(eQ$5vAbWJrMe3f1>(Al<-WlD`A? zKJc4EAJ;bTZWJDezF**b{|5K*%s`uxx0&VWxE+N0d+=g~Lco*QjD=*9y-`t#HviNa z^ECl=u6v)UT4?U`3-`R!Hk;NYEF(>R!7^DDVLDsx@@Mhh`h=&11tW2{i!2sqqXDPb zOdiJLz#0eHCY56i+QEA(}1cPX(WDpoWTs_TbH3o?=u4B#*(H1`*twNK@f$#4IT|nA(&l_ zia4{s1o0lKo{Ebi4*mNhy6vpF0JqRnfUd8ECh&K5`LA_CXr*# z`W^-?Jor9o#Ffb)hKy+mL))~>F(fO6E@d2Yj0Qk@6HP6ZW<^v6pFHATJy1u#M2EPR4gRO4~uw}9>ZltuE7{rGIE|b zYBW`Kuc>ETb8V9u%5NP>cjq=G-2i7lM$8nIH+~BNsS->oX3HBBUDIR1UOQDgQY0+z zwGdaAHIUqs_C5SlCp8K9sD6fb$9vl3X?kD7c;RGY-6&#}&aliGDRBnc&!jx^825Do;Q??^Ou-ZFCJdK#Xtq)1U2gbq@(K#92aG>t9b#H3?BR zuB$Ez{dNDX`q0oF(JS8>L4(H{8iNW5TY8n2X};LM@jS)u>`q|7mI;O?pfjo}I2D5065TYD!pnA|l8g zvS>ja*%yK$nMFZjYBh48;lL98`Yin3-o_o?G(YT7yjY9%om->hKGxBDPihy@m7gVx z!(jsjW|0AA zwbePs+hL@;sFi7cF!?n$QDFCZSW&fXUj{U2otGN4Z3!g%NY&BN5=iiqowekNN$d9# zCymI)b)K6nFV^{;o|%jU$0;uDDBGPxgLFCnOe;h?^*Q3IOhxx(2^~J%0cPG@Kc?29!aj9lc#zNzOU?3-= z&J^uV*-k01k8`z|^$vOOqwRnkY|F}}(5*(!F<-O<;G%;ItQy;nr`)<}YP7>G_O*q@ z1P$f&_kn@PErcq=c$pyZDjDEab&h3@80j7_@s{0!gnNoq^*^|Ma`GI~>yQ5^aOshv zCLzH>Dpgkx(^7Ds1VbkN!Uhg65IbDFRGeO8eJk9JP}ERI#&vW}&Lp=k2G}-{G@n(I zR?`k>ALei>h|F=opXE&QVj$WgmVSrTr2;@v2TewoPmb~DFwzC1$`2V#9Z~+En0}_?27;3R^IQ&c>$^>#7KYSm-{Cj^deO))?RN^4^5E zjkou`1wS}es%kNAxozrGyCd%9d8f}cx)aee^|MuPBo4SHygu| zHV5F=PXG+3A7fWYIx$PoHXumRp zYy!ePCy?2*>p2bpN#o+h;-*^jBbNueayd3hc7&5UzgfJsIWx8G*4U?t)Gy?TOD^PW zF)@p)OAU^DB$xxX6J(GQsL&CFmKGe*9&%uvQ7(}c=N~tF_(%V`cjb*^qotjDkSM4f zrtF7&U2sUbtGbNF^JOip{rD7)EYv-scnR<2c`LGbhhlL~VNfCY1U7epdfwZ5kmhCU z@%V1KdUMMWK|wC@Dy=170w-9%lxC9~JRt4ENw$Wea>-h8eo@7jfAqgx75G@R-?u<% z)tCgJ!RcYV793q<{v~q62xs242~ORHOzNax%LBnKz1%eU;>@{X_c0}OXZwRA)=CbQ zdhYvHcS^>ZMn#ubn<%+8oy!yxyS~&V<{zdUN9qd}9)`dmpQ_A0P79Y!4E??{qFd^yKi5Agt8Ui zA?lwD$wHR3?U?x43~0;iPt*I~*jOI#r}b4WjMa}lqfwFL5Z&rPROgm|Ac4e6COM^O zg-AI4&X=xbV0<_n@`58Y1NW^JdnHl?hpSH9J%#i^TI$F!6y5zPQTlG7D+HL*dVXjm z?F0k}FdXdqd|UKWt)`%d0N{Y4@MaBFH2}Ux>Gi>p3NJp^=0-QG8j~;@e-aatsHymxk;)DT*cD zkIh`qkN&hPjbwkkd^DMc*N4I?XnVjaQ==b}ft8;U&oUr)*Uh7fm6j#~ETUPI{b1u& zU}Kv#QVMWVe-|=tvWYfHutt~T(FL{S5IE~!W{`$*3m36VZ!M+t1@1P}6)(g<6>amE zSZBb72S*37+Q@h~^h*BX3`@abC+%;CS!*UtHhEj>gEXNzQ=J!{fM#~7y@E3c-Isrj zUouE*vW)?ZtawHbnxq<4ATuA76n%%m-kmxaIO*UF?aMEb6b>&yq+HvzKBrL+Pq@CE z+B}Jp;DH?(Grb=MG~KNum$?{qJfLMqDLW{NSi9rQC4~jM8yhQ2FFJ>feH_I%(ewwp zB%r^LUBVY_l)7uB#1`&^1ZSq0B921F$Q9rW@>SWU9=UYQW4rrZU5A&=OT)xbls0U# zU0DVuPeIx7v9TnV33arGp`hCp4kcr6Cv(02o_Zq>>flg9W0FKzXG!U^g6`nNs${_^PjR9ju3Pw=Dn7Qqn zpPFsmI#0<~trSAW%Zeq^|uHj2`hbb7rF7*9|aW`rjPd_b{ z@oi!DMabFl?u7}Hhw)`${QrecB9NguJBfEEQWuw}P1JT6>C`%3!=| zn&eR8FjZxbfviAITx-G0!SYMSrbVGJnl#hJ6ha9h!^Qvf){(@}rfQtbTV9>@@;lb% z*KGDe3wrKC)M~Hr6DBQXMR=Y%xZ+d@mc4yDkbGXzSD~aLoM81PUs%h0l&YSpxbpX; zMbvR*ya~Jr8DB-_`u`};>|Wm#T(%2I5pej9nmlVC_MS(YcsWYlPGufpCq$d!IhmY& z1IMTF4a{Iqq%A#2>1feLrhDO{M=>%H0nGG;sR}0Q-6FOD<^i(|Wiuwxi&KH2-qZ3e z#z$eg5ZRWhYh&N0SW@<|j7U06E#Jq>iV9AB=%iaQyjgL;N*C_64O*C3;&R&wEo!AN z1bBsz3B2FBXzQe>#?S?aUcpE?4emp1>Amt&wAG;6$E6N|IL;8aspa~@B*d1zvPqn<#45M$j<^{cdNjQO+smkD?RzS<2pN*_P}Ach&2y;E3K(8 z8rfCgjg}1yuS7}!pYvZ%;K;+!7z`VaZy-yX8j&T>L0oNlnKPwOT73ylr0P<;HYx1P zs;2)i=<%8BV~3!uIr)m4yfony4B(oVGn0seBhW*(8*vK<{i4;DVhrZ8Ek2sSARCR0 zUjeNdP0OtWYu+oK62XtEN`J*c064}t92U8y%roibO44BEdj#7~Hh5$xFEQxm8hT*`< z44kMx1(r_-Kh3-LF3-2Hs?+R<%EJ1_YwuE}$M8fO;06M6nczJ%dJwV;Zl?7<2>E*7eyjY;Mi+w6vZ>*k@YH0_ zMZ{~htCeQeddC-0fiWpp?E}SW$*+=XRAygihZGt%I_tI(Gr89je7J}`^kXRwwpotz zsH>#Dl*vFZIVzr46|$pDE;Y;XVxp<#A|894qOtEJO1)M`hsZN~>%W48qMS%-vyBU#HtoWvm zYo;vBPCx=Y)-_WpN$mEl$>^B?cbdPF;{WTX6L00^jRKRMm$}5_eg4*xChmV8+?Dxh(tPk$EHia`h=&aQz>18u2-Qj)E(zj2*ZLnf z&lEuRZ~Pl@rE<3OA$m15-$K}$)}-~9=O)jioelXj>^Z*ig=*$OefG~RaeANcmJ7Ce z&?5_+c4#3DEX*GJOfjvn!4|1e1@}jBA%SyyVaX?SMU_QN`Ubd+13>IjW1|d=1=U+@ zEsDpb4SH@WHh1ZWlS}V^nzhhSp39&lmxHvw#{qvL^O%sAq+s41$xAX{n-TVCR|GL- zWx$TE1_fN`bZ*$^uO9jtpVD=|k=WbISY^t0hdg}xbMT9i?;Tx6GXgmGDb0?_F_;Xm zy7chz8oh9(I&uPXtPvCf5El4bUS!e=@!>>Wxr|BZJ0YMua#(a|BhX@1<)|2v0ins` zl~8w9HbWdSUIlILfO%-IqLyt@L2h3g#A?@ifrZ&$oQ}*l^cHv>iIG_2JvcOF~T7F&oy409l^gWC946;RDfY99Tp21fwE>CC* z?v+d<{m|KhNy&MOhh&qH=P+Hcjo<-?1IuRV0QM5Axj-4`gcKT@0AdZBkx~;G&?i=O ziVYQO^Y3qh*7*b3C45v>)Meg*;mGHOZ4Uw)m%lX+{hCIdFs2G?-9* zcP4?cD@7=+fl?Cxgu8|m&J}^nFicyw^5g2|RAf+srd0CZ~Ocua9Nwz2RYXI}hZ^?BvQuau;Q;^YhFj>dwIm)}?5*RS}KR=M_C4 z>ks4O+UWU#_v^Gz*&9)jm=lAPTwr zg&6f#k0n|*j+2!p&jfOCFI|>*stHapFVuHz7-S6f+F9%Gu4H^n6OXe+7wC0&Fa|K`&p2s*FbO;~`^@-l2%2JU*PbLW{C%$AV; zOg7&X1B9_lZB?2~lpZU*){q(4N=8}^OO)Yvyv;(ql>yT^$-Ovb<#PTZ1oS2Sk&-q# z`cv;7VOx#B)}$^4F<{S}&f#zT(tzZt4j!J$y##3bWH}fRb^bwvE}WoS?YZ=6Y&G*v zYU+3UOcBmqCxi{z{=-;?h_OtU?p}VnrA&m;mLZcDK}{pxAz^=>Dnt0x)DfZ(_po) z+?xlNQNfLa}7O7d`l*;a6eOOY=Y$aMo){9rKN+m4& zcNGJ9YyTa9L4EG^gWVU`U-U%PxIYPk83*DU87p-@1FCvO;Q{(X)Lt(9FySoXZ*GGq z?Ns~zQ*c!b`tmY6zoL*Fl1SGuZ?D*FC+j7`xxNanZE+Xj>3>k*;E1Ska`IG9gLHBD zy@N}ZBC-y-dmeft7gj2hbQPwN62FTu_}%9Hkh@O2FL{dL5bbaFk@Fb8`sBf7w?X|m#Bvklgd$A5WjdK49-!P)bx*{?7v=lsG^Fx+aZQ5 zG?a*3_E4BpGgFq-XCE~B*L4Oi-yi=^6cC?pSrYWjaFEfltzxR~_7sm>U!2qgIrl0M zQg;MMT~00CH3S1goTU9}f)NhCuW;YgKwMeX@jk_WpOT`dp-}LpAIQLC!3-M4QkJR$ zA;h7#kinscEWkBsJ=#Z=xfg*Yg)W4BJMn!@Mnoy)jG&-IzC2y!g{tcLw||5|vzb#< z2y>&zA_@=$I_)xgOTK7vgo+kAE;M9um_&|&x>F*#&#K_L|E;RG?7@Le-?}e3T-YeM za=K1BW1YyoV@@ddaD!duAs%68G3DVu$GukcUJ3JcSlPUCS?&Es_dM z7Qb}2Ephy#VfO8!haLm9jClMDHNF!Ma2SVHr!b9C5-O>6!8H_PC%!=X;btY}faP-z zGh_(d%YVmHBYXKE|EUsv0(wucy6)qOWrF|p-s$lYreMbE1=9ZbRT18o!gy;Rkx=D( zWIRz%ca@W>pmc7ums^2Wjb2*oQUd|4uzgpjQA zhw4h}AXhq#$&naM&Dz^Fr}JOg<+f;>!E1?$k|Mt|K(EB<{y2#fZ4Y z4_5}eH+Ip{o3V^lSzS}(-lf@YVKz(eew2rIPi2xo;>}KM(K&qhJ$IpIR1#G*qYAr0 z^^MfBUlkF{U)wY_6IYtBu6%mA?_lUJdTzA3V8fyRj}6Byzq>h7g1EBjJEefP1!d+s zZS!IIfv`_h*e4Ft?#L3jH$H`%`7;z_5xyk2Z;zN3*z_4ZVftXXkQ{$_$Ek6=%gYNd z~^ao16*{ z-w*-H>vuvG8u%Z(d`s>wqo3!$BzKzcVet}mxk~R7u>Im0#_I^~kz}%774@pfi;&Oi zLs_P34*u#(KNF>gDFJ8vZ7y%JT}pC(X5WdI_Jz;JcZ1c8)88t3Gtm zEh)5%b~tRBu98^djeofFYQ~!`Lvl!%i?r8c-Tdso+Q)Av12? zEa|(ch1D)Hvvdl@95pW>%@Lk_T&^=VyyRf+MZG6@!)oX{TEw40Zfm)(h50AKEhuEY zH>qi&AC~LHe_eWf^y_kI?R~b-F{(e@&?Rb}5_VR7egH>x28`T{;DzQ&Q!H|Y=rV%8ET=M1%7$o5z zO1py*{Z+-`UXHF}qQ(ObFc%1+foJ&lhb<}pX-@%sLd&Gr5!QvrX3Uu6+|3*K&)nt4 z+z3a|F}}o_Xsw`7pA}+ZcqFugc~#TtSnbUV;wb+qEz@hOB4q0RBdt^dcxhik`-=fR z+xQGL$A_q*VKtzQ;b+z8do`eX0EFGEh0?*$!rQ%%6VRLW$CJTB=gr)b;bk*ws#a`5 z!wp{j_Sp3og>t0ID8Cos-@&UU96 zPf6N26T#m>^b;Qhg6FP<*!f`7)Y3A;lN#Ew@Vq_^hI|%(iqsyS)HQ zNQ59TnLP*bQ(VywpJX>2MXWJ_>P3rLq=BmSr|~X;c`gRu@p8J(8CPDvoFTZ;N!g_3 z>4TNyHdlC$E(LRjG7`*n!DZFxr!u98P$N9jgRYV27Z}C;TZ22Dq}l|QcJ@|=vok%* z3g795GvyabG==x?3}!u=rJ(SwWaB+r!uusDWaAg2N3jNk!0tiRosqLWhb`4;wS$!(hWv- z$KdP^NlN-NB^x4$d94e5E;-@q#bpMhn1o2eVC97Zx4|( zyjF6-o<%=&m@H&Mc9J3@&;vB}G*)v}u`(=nDw_oQ&VRz$mm_|Dj+wK;#jGiHa8~13 zwFinymt+WRYaxe@VNcva_J3H7kH4r!7-i_ zN5qOf)Ttuj8D+N9UJYU5`gH+0B;w6IR6|1e8E|oje`sS2JXo?_z#mn@%(l-ru&~D< zzrUg)4p6)YHWoKP?gXdogiHmH@bs}h$)-9$tM;P`e4PW4_%PM7g*m3RnnH2NJ2rv;B#b*DBU{q2Ec?Ax|M+DU|oL zDR(#Hu$v|%;LZ4xL9<&Bm&qg*_`^4H^$CH$bhP$gJwr++%+nKWLl-W8jpix7#WfK^ zzw)Sv4=1lgl#A@8P#;ll$EgcRI81)hv-9A4*vIXhm@@gY{7XWa;#orY#6S1)gk%YO zaXbOOLQqRV_HqfuTnqSxVEYpjLL~r?$rF+$Z0D#C;=Xvt(u50^wrhDFEv1VSDTv?d zbD-jp3E|~)cEcZ5Qp1jp650o}G1z9Z7-`v4r;oV#A6G<i5R#*Y5K4Vd5!cU9N3`+`38cM`J2{&2W(Q*m2-wYw!QbU4@o1Mm#{5u1)OwbqR`@<@?-S)!mqX@r`YVG6 zeIj`uA6=qwn-Tbhmw`(iF2#A6xjE`80|Pytou~%!i+J<{hCp%5nFS5l#AM=6Fl~cs z7!nHzQAqYNI)MDVSsr-~B*20M7fx@~#+*WugyS?m`>h~R2~>e>U{5-h&G_+sN)kQf z$<>2d%C}@KOnzc1ejPgyO(Z)`WBb6*Qyn|6jy@$Ve`?=(w~=8*RL}Ei0GM3Y!FUr@ z)Qw(erWsWgLYwU|Whbo*nMYB$yzIiYNPx<9W|IgIAP;vuC4IQOPsA(vBHu~yv~?Zo zxg_GA(_^U{BD4>4)QU=ie5AH;1T}=H{1J(`63J|4Q+T-raqYt#t+rT6MPNW12y2lC zB&r<&W>IeQ=JHR6EV%|%)JJaI*8q!;1{SZD==MVv-Vx$*x&+Ab{z#D4^?#mENw~4b zS+RI&F;viAU_j@AzDF~i^ngXSnTaF5oR9d=1CIa1=m%H*fP}u>rUK2SO`LMUG@Ii& z5HR35j!>wmS!Z)RXEowEPe>cMKJ4TiW+ld{V4y-N=2^0KUoz-N5Eht1()PRGf<{XN z-*kF1=hL#eN@3-xr38&ajRIAYN&o>p!|$1z{l~%AEeI4}$qV+497tnsMR_h|5j#BuqTtu2Qy!>wW-}!m zVMT0lKsy28CNt$NUSh%^bV`LhPnno>^l4dhl;!~iHTQ!xw{rVX-W9d@BoSpQL zj9S!2z37Bb00k*QiZ>+2@_<}mkKn`MAEylaQ$P(h3rG%3`{;7cZ{gu+fU12!TZ`9k z;4gnt-_?5>)N(2VUOhbtEJk}>KCN5{wtKO=l|0B^3?v%I)QO6z-oj}a5yDHxDBq}} zs<-GA-BFVE6%J55K39r+>Bvs{hU7-9V8*75@FXOoB{AMyL%vr+>j4!d^;HH}w;PnM zvrXkuT4K<(_6P$l!)bkB@t*i#2&tsuJ^=XIy_|38gRE_a!2{~UmzfhIiX?#smmJ*u z{s`pX+eE3xBY>O4;be7&!67%9PIF%2B31X7So`B?Bx#L-nb*TkYRLk>JziS~Jl+ba z$st>ugrGdgtp>^YJ*nC zFe^uKS8zQ6uItT0GXsSR#%bvWp5(u$%UKbHa)l~MDnYposMW^5mdXwk5f?v+s0O8a z1#v(PDDOb>WpMilDJ#xEm>|Cl+lr)#Hb>Os`sF&R;oKqzsxcIb`ZN3FZ)s4_SrJF| zyhuWTEByE7kq;n$PF!O;1-#M*!B8mgpVvad46E7n`5rAElsOn4=~Otd1W+i?z8TKr~qyvzW^61BceHVeq*bX z8?R#)cslZPnPB(hS>feNp4ta?wuEB1agp3#EqQ4E*~Uh%AE_g1Vg3kRT(_X{9*d&1 z0SfP(D=+P2{rVPNn2@H$`oTP@wUTJYcykAb$r`69GX!pzog+A1=Cuofgm&Qr?xivb zf3Ie_j{8@aOXqf|LlBqy7WE+uAU|5Z@)A) zm}Hj^td~5rzx_P)M-tdEy1n+pd6p9!v*y3GFJ4kV_b+q6?X3p!e|{YP?(I@_p7EA| zl*KH&*TxevpV~z~V3_o>*uIv{En@5W`r3-?w%0S>&Y!+aidV*W{_hvY23>aFFQz9< z3H^O%)=%RJKrx_whfdY*19sVf`5|Td@ke)V{W0GIkCv&wa~hd}ZurHM61DSubq34? zk=l2Q&mYjx{(ckeM2Iw~)lzXEbRMbGz^y z7&bi{ispacClT|sd-Z{xUv|#7V^)3vaW&8mV4V%)fx4xV2jdl%oDNRRd;8BZu;<@H z23{G@`QI<6Kk)cfGnKbHXm@g(b^ z*4RTe-7mfz+quYg{{g$_Y33WIf)fKYDu3N^pWhhxWhZdtbMcE}d7u+7KDPr#)uQvY zUnC`55vj-RH?Ymt@cGT(;N|hVTz+K#|FzV6h1UIoe@5H;Oa}0X+yhJj?!fr@GE)$k2xkE6o!^ct zKrOMC%Pp@xKmT)U#ra=v9BhHhve%sFyR!KF_p{`2&%OQg8tC?&XMdyz?l0T@`?Gy- z^;`S$kD%Cn#52ctzWk+hg+@F3CFdQOYU@1aH?sWtGr^9T^UF`gS~j53PQV@DQ+j`|}OB6ZZDL^{cdRszIW_Mg;Ic-1GLaf1huiYQY?hH@YB3 q9niqA8&W2ZlA|Fo8Ukn`@b0I6nP-{L>btwTKr)`LelF{r5}E*AEA?~$ diff --git a/sidescroller/resources/player ledge cshape.tres b/sidescroller/resources/player ledge cshape.tres new file mode 100644 index 0000000..58e26eb --- /dev/null +++ b/sidescroller/resources/player ledge cshape.tres @@ -0,0 +1,4 @@ +[gd_resource type="RectangleShape2D" format=3 uid="uid://dncqi3j0k35v5"] + +[resource] +size = Vector2(58, 59.25) diff --git a/sidescroller/scenes/Player.tscn b/sidescroller/scenes/Player.tscn index 122fe17..b24cabe 100644 --- a/sidescroller/scenes/Player.tscn +++ b/sidescroller/scenes/Player.tscn @@ -1,18 +1,34 @@ -[gd_scene load_steps=21 format=3 uid="uid://c3w3n7ysd02bd"] +[gd_scene load_steps=38 format=3 uid="uid://c3w3n7ysd02bd"] [ext_resource type="Texture2D" uid="uid://c1my4xbvhsdq8" path="res://assets/textures/Player Idle 144x144.png" id="1_p0vlq"] -[ext_resource type="Shape2D" uid="uid://bsdsjlbi8h6cf" path="res://resources/player standing cshape.tres" id="2_khinc"] [ext_resource type="Texture2D" uid="uid://crkx6pt8e4cmc" path="res://assets/textures/player new jump 144x144.png" id="2_qu4a1"] [ext_resource type="Texture2D" uid="uid://dvy7cws4egkmh" path="res://assets/textures/player fall 144x144.png" id="3_70d11"] [ext_resource type="Texture2D" uid="uid://d11goqqiewsdg" path="res://assets/textures/player run 144x144.png" id="4_cw2d6"] [ext_resource type="Texture2D" uid="uid://dletf8p3wr4n4" path="res://assets/textures/player air spin 144x144.png" id="5_khinc"] [ext_resource type="Texture2D" uid="uid://cox74najv0828" path="res://assets/textures/player crouch-walk 144x144.png" id="6_70d11"] [ext_resource type="Texture2D" uid="uid://co5l6328i3y76" path="res://assets/textures/Player Crouch-Idle 144x144.png" id="6_cw2d6"] +[ext_resource type="Script" uid="uid://c0iqbs1ms86cw" path="res://scripts/State Machine.gd" id="9_bruh7"] +[ext_resource type="Texture2D" uid="uid://d4dnvylog631n" path="res://assets/textures/ledge hang 144x144.png" id="9_sfy4j"] +[ext_resource type="Script" uid="uid://cawr3av2aa8jb" path="res://scripts/playercrouch.gd" id="10_6eyey"] +[ext_resource type="Texture2D" uid="uid://cry06ubemcrcf" path="res://assets/textures/player ledge climb 144x144.png" id="10_b8lor"] +[ext_resource type="Script" uid="uid://dyee6xwb8js1s" path="res://scripts/playerrun.gd" id="11_p7iby"] +[ext_resource type="Script" uid="uid://dhvehwhg63p2h" path="res://scripts/playercrouchwalk.gd" id="11_srp4u"] +[ext_resource type="Script" uid="uid://d0cc7xgq16onu" path="res://scripts/playerjump.gd" id="12_0rnld"] +[ext_resource type="Script" uid="uid://bcnm70o0yo87k" path="res://scripts/playerwallrun.gd" id="13_srp4u"] +[ext_resource type="Script" uid="uid://cgsyaphtn6k6q" path="res://scripts/playerdoublejump.gd" id="14_61ith"] +[ext_resource type="Script" uid="uid://d34ia87aolokd" path="res://scripts/playeridle.gd" id="14_jfpux"] +[ext_resource type="Script" uid="uid://bxkdsl12qa7jy" path="res://scripts/playerwallrunpushoff.gd" id="16_61ith"] +[ext_resource type="Script" uid="uid://whap2d3r3yk" path="res://scripts/playerfall.gd" id="16_jfpux"] +[ext_resource type="Script" uid="uid://c46i4062efgw1" path="res://scripts/playerledgegrab.gd" id="19_ebwui"] +[ext_resource type="Script" uid="uid://boe7p8pcolkln" path="res://scripts/playerclimbup.gd" id="21_gv3ic"] [sub_resource type="GDScript" id="GDScript_khinc"] script/source = "extends CharacterBody2D " +[sub_resource type="RectangleShape2D" id="RectangleShape2D_gv3ic"] +size = Vector2(58, 86.5) + [sub_resource type="Animation" id="Animation_6eyey"] length = 0.001 tracks/0/type = "value" @@ -63,9 +79,75 @@ tracks/3/keys = { "update": 1, "values": [1] } +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../Sprite2D:offset") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_6e537"] +resource_name = "climb up" +length = 0.5 +step = 0.03 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("10_b8lor")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [5] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.0909091, 0.181818, 0.30303, 0.454545), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4] +} [sub_resource type="Animation" id="Animation_cw2d6"] resource_name = "crouch idle" +loop_mode = 1 step = 0.1 tracks/0/type = "value" tracks/0/imported = false @@ -381,6 +463,69 @@ tracks/3/keys = { "values": [0, 1, 2, 3, 4, 5] } +[sub_resource type="Animation" id="Animation_gv3ic"] +resource_name = "ledge hang" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("9_sfy4j")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.0666667), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.0333333), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../Sprite2D:offset") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + [sub_resource type="Animation" id="Animation_lkdrv"] resource_name = "run" length = 0.81 @@ -438,35 +583,41 @@ tracks/3/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_0rnld"] _data = { &"RESET": SubResource("Animation_6eyey"), +&"climb up": SubResource("Animation_6e537"), &"crouch idle": SubResource("Animation_cw2d6"), &"crouch walk": SubResource("Animation_khinc"), &"double jump": SubResource("Animation_p7iby"), &"fall": SubResource("Animation_o4126"), &"idle": SubResource("Animation_bruh7"), &"jump": SubResource("Animation_d3wef"), +&"ledge hang": SubResource("Animation_gv3ic"), &"run": SubResource("Animation_lkdrv") } [sub_resource type="RectangleShape2D" id="RectangleShape2D_bruh7"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_sfy4j"] + [sub_resource type="RectangleShape2D" id="RectangleShape2D_6eyey"] [node name="Player" type="CharacterBody2D"] script = SubResource("GDScript_khinc") [node name="Sprite2D" type="Sprite2D" parent="."] -position = Vector2(4, -48) +position = Vector2(0, -48) texture = ExtResource("1_p0vlq") hframes = 10 frame = 1 [node name="mainbody" type="CollisionShape2D" parent="."] position = Vector2(0, -43) -shape = ExtResource("2_khinc") +shape = SubResource("RectangleShape2D_gv3ic") [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(0, -90) +[node name="RootMotion" type="Node" parent="."] + [node name="AnimationPlayer" type="AnimationPlayer" parent="."] root_node = NodePath("../Camera2D") libraries = { @@ -474,40 +625,102 @@ libraries = { } autoplay = "idle" -[node name="crouchrc1" type="RayCast2D" parent="."] +[node name="topcheck1" type="RayCast2D" parent="."] position = Vector2(-29, -50) target_position = Vector2(0, -37) -[node name="crouchrc2" type="RayCast2D" parent="."] +[node name="topcheck2" type="RayCast2D" parent="."] position = Vector2(29, -50) target_position = Vector2(0, -37) [node name="wallrunrcright1" type="RayCast2D" parent="."] position = Vector2(0, -22) -target_position = Vector2(150, 0) +target_position = Vector2(120, 0) [node name="wallrunrcright2" type="RayCast2D" parent="."] position = Vector2(0, -97) -target_position = Vector2(150, 0) +target_position = Vector2(120, 0) [node name="wallrunrcleft1" type="RayCast2D" parent="."] position = Vector2(0, -22) -target_position = Vector2(-150, 0) +target_position = Vector2(-120, 0) [node name="wallrunrcleft2" type="RayCast2D" parent="."] position = Vector2(0, -97) -target_position = Vector2(-150, 0) +target_position = Vector2(-120, 0) + +[node name="wallcheckleft" type="ShapeCast2D" parent="."] +position = Vector2(-28, -60) +scale = Vector2(0.5, 0.8) +shape = SubResource("RectangleShape2D_bruh7") + +[node name="wallcheckright" type="ShapeCast2D" parent="."] +position = Vector2(28, -60) +scale = Vector2(0.5, 0.8) +shape = SubResource("RectangleShape2D_sfy4j") [node name="floorcheck" type="RayCast2D" parent="."] -position = Vector2(-1.90735e-06, -42) -scale = Vector2(3.5, 1) - -[node name="wallcheck" type="ShapeCast2D" parent="."] -position = Vector2(0, -68) -scale = Vector2(3.4, 1) -shape = SubResource("RectangleShape2D_bruh7") +position = Vector2(0, -47) [node name="ledgecollision" type="CollisionShape2D" parent="."] position = Vector2(0, -90) -scale = Vector2(3.4, 1e-05) +scale = Vector2(3.5, 1e-05) shape = SubResource("RectangleShape2D_6eyey") + +[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("player", "initial_state")] +script = ExtResource("9_bruh7") +player = NodePath("..") +initial_state = NodePath("PlayerIdle") + +[node name="PlayerCrouch" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("10_6eyey") +player = NodePath("../..") +metadata/_custom_type_script = "uid://cawr3av2aa8jb" + +[node name="PlayerCrouchWalk" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("11_srp4u") +player = NodePath("../..") +metadata/_custom_type_script = "uid://dhvehwhg63p2h" + +[node name="PlayerRun" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("11_p7iby") +player = NodePath("../..") +metadata/_custom_type_script = "uid://dyee6xwb8js1s" + +[node name="PlayerJump" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("12_0rnld") +player = NodePath("../..") +metadata/_custom_type_script = "uid://d0cc7xgq16onu" + +[node name="PlayerDoubleJump" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("14_61ith") +player = NodePath("../..") +metadata/_custom_type_script = "uid://cgsyaphtn6k6q" + +[node name="PlayerWallrun" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("13_srp4u") +player = NodePath("../..") +metadata/_custom_type_script = "uid://bcnm70o0yo87k" + +[node name="PlayerWallrunPushoff" type="Node" parent="StateMachine"] +script = ExtResource("16_61ith") +metadata/_custom_type_script = "uid://bxkdsl12qa7jy" + +[node name="PlayerIdle" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("14_jfpux") +player = NodePath("../..") +metadata/_custom_type_script = "uid://d34ia87aolokd" + +[node name="PlayerFall" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("16_jfpux") +player = NodePath("../..") +metadata/_custom_type_script = "uid://whap2d3r3yk" + +[node name="PlayerLedgeGrab" type="Node" parent="StateMachine" node_paths=PackedStringArray("player")] +script = ExtResource("19_ebwui") +player = NodePath("../..") +metadata/_custom_type_script = "uid://c46i4062efgw1" + +[node name="PlayerClimbUp" type="Node" parent="StateMachine"] +script = ExtResource("21_gv3ic") +metadata/_custom_type_script = "uid://boe7p8pcolkln" diff --git a/sidescroller/scenes/Player.tscn20170388760.tmp b/sidescroller/scenes/Player.tscn20170388760.tmp new file mode 100644 index 0000000..dc17dc7 --- /dev/null +++ b/sidescroller/scenes/Player.tscn20170388760.tmp @@ -0,0 +1,523 @@ +[gd_scene load_steps=23 format=3 uid="uid://c3w3n7ysd02bd"] + +[ext_resource type="Texture2D" uid="uid://c1my4xbvhsdq8" path="res://assets/textures/Player Idle 144x144.png" id="1_p0vlq"] +[ext_resource type="Shape2D" uid="uid://bsdsjlbi8h6cf" path="res://resources/player standing cshape.tres" id="2_khinc"] +[ext_resource type="Texture2D" uid="uid://crkx6pt8e4cmc" path="res://assets/textures/player new jump 144x144.png" id="2_qu4a1"] +[ext_resource type="Texture2D" uid="uid://dvy7cws4egkmh" path="res://assets/textures/player fall 144x144.png" id="3_70d11"] +[ext_resource type="Texture2D" uid="uid://d11goqqiewsdg" path="res://assets/textures/player run 144x144.png" id="4_cw2d6"] +[ext_resource type="Texture2D" uid="uid://dletf8p3wr4n4" path="res://assets/textures/player air spin 144x144.png" id="5_khinc"] +[ext_resource type="Texture2D" uid="uid://cox74najv0828" path="res://assets/textures/player crouch-walk 144x144.png" id="6_70d11"] +[ext_resource type="Texture2D" uid="uid://co5l6328i3y76" path="res://assets/textures/Player Crouch-Idle 144x144.png" id="6_cw2d6"] +[ext_resource type="Script" uid="uid://c0iqbs1ms86cw" path="res://scripts/state_machine.gd" id="9_bruh7"] +[ext_resource type="Script" uid="uid://cawr3av2aa8jb" path="res://scripts/playercrouch.gd" id="10_6eyey"] + +[sub_resource type="GDScript" id="GDScript_khinc"] +script/source = "extends CharacterBody2D +" + +[sub_resource type="Animation" id="Animation_6eyey"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} + +[sub_resource type="Animation" id="Animation_cw2d6"] +resource_name = "crouch idle" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_khinc"] +resource_name = "crouch walk" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_p7iby"] +resource_name = "double jump" +length = 0.55 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("5_khinc")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_o4126"] +resource_name = "fall" +length = 0.05 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("3_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_bruh7"] +resource_name = "idle" +length = 0.95 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_d3wef"] +resource_name = "jump" +length = 0.55 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_qu4a1")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_lkdrv"] +resource_name = "run" +length = 0.81 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("4_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0rnld"] +_data = { +&"RESET": SubResource("Animation_6eyey"), +&"crouch idle": SubResource("Animation_cw2d6"), +&"crouch walk": SubResource("Animation_khinc"), +&"double jump": SubResource("Animation_p7iby"), +&"fall": SubResource("Animation_o4126"), +&"idle": SubResource("Animation_bruh7"), +&"jump": SubResource("Animation_d3wef"), +&"run": SubResource("Animation_lkdrv") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bruh7"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_6eyey"] + +[node name="Player" type="CharacterBody2D"] +script = SubResource("GDScript_khinc") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(4, -48) +texture = ExtResource("1_p0vlq") +hframes = 10 +frame = 1 + +[node name="mainbody" type="CollisionShape2D" parent="."] +position = Vector2(0, -43) +shape = ExtResource("2_khinc") + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(0, -90) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Camera2D") +libraries = { +&"": SubResource("AnimationLibrary_0rnld") +} +autoplay = "idle" + +[node name="crouchrc1" type="RayCast2D" parent="."] +position = Vector2(-29, -50) +target_position = Vector2(0, -37) + +[node name="crouchrc2" type="RayCast2D" parent="."] +position = Vector2(29, -50) +target_position = Vector2(0, -37) + +[node name="wallrunrcright1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(150, 0) + +[node name="wallrunrcright2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(150, 0) + +[node name="wallrunrcleft1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(-150, 0) + +[node name="wallrunrcleft2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(-150, 0) + +[node name="floorcheck" type="RayCast2D" parent="."] +position = Vector2(-1.90735e-06, -42) +scale = Vector2(3.5, 1) + +[node name="wallcheck" type="ShapeCast2D" parent="."] +position = Vector2(0, -68) +scale = Vector2(3.4, 1) +shape = SubResource("RectangleShape2D_bruh7") + +[node name="ledgecollision" type="CollisionShape2D" parent="."] +position = Vector2(0, -90) +scale = Vector2(3.4, 1e-05) +shape = SubResource("RectangleShape2D_6eyey") + +[node name="state machine" type="Node" parent="." node_paths=PackedStringArray("initial_state")] +script = ExtResource("9_bruh7") +initial_state = NodePath("PlayerCrouch") + +[node name="PlayerCrouch" type="Node" parent="state machine"] +script = ExtResource("10_6eyey") +metadata/_custom_type_script = "uid://cawr3av2aa8jb" diff --git a/sidescroller/scenes/Player.tscn20179383087.tmp b/sidescroller/scenes/Player.tscn20179383087.tmp new file mode 100644 index 0000000..dc17dc7 --- /dev/null +++ b/sidescroller/scenes/Player.tscn20179383087.tmp @@ -0,0 +1,523 @@ +[gd_scene load_steps=23 format=3 uid="uid://c3w3n7ysd02bd"] + +[ext_resource type="Texture2D" uid="uid://c1my4xbvhsdq8" path="res://assets/textures/Player Idle 144x144.png" id="1_p0vlq"] +[ext_resource type="Shape2D" uid="uid://bsdsjlbi8h6cf" path="res://resources/player standing cshape.tres" id="2_khinc"] +[ext_resource type="Texture2D" uid="uid://crkx6pt8e4cmc" path="res://assets/textures/player new jump 144x144.png" id="2_qu4a1"] +[ext_resource type="Texture2D" uid="uid://dvy7cws4egkmh" path="res://assets/textures/player fall 144x144.png" id="3_70d11"] +[ext_resource type="Texture2D" uid="uid://d11goqqiewsdg" path="res://assets/textures/player run 144x144.png" id="4_cw2d6"] +[ext_resource type="Texture2D" uid="uid://dletf8p3wr4n4" path="res://assets/textures/player air spin 144x144.png" id="5_khinc"] +[ext_resource type="Texture2D" uid="uid://cox74najv0828" path="res://assets/textures/player crouch-walk 144x144.png" id="6_70d11"] +[ext_resource type="Texture2D" uid="uid://co5l6328i3y76" path="res://assets/textures/Player Crouch-Idle 144x144.png" id="6_cw2d6"] +[ext_resource type="Script" uid="uid://c0iqbs1ms86cw" path="res://scripts/state_machine.gd" id="9_bruh7"] +[ext_resource type="Script" uid="uid://cawr3av2aa8jb" path="res://scripts/playercrouch.gd" id="10_6eyey"] + +[sub_resource type="GDScript" id="GDScript_khinc"] +script/source = "extends CharacterBody2D +" + +[sub_resource type="Animation" id="Animation_6eyey"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} + +[sub_resource type="Animation" id="Animation_cw2d6"] +resource_name = "crouch idle" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_khinc"] +resource_name = "crouch walk" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_p7iby"] +resource_name = "double jump" +length = 0.55 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("5_khinc")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_o4126"] +resource_name = "fall" +length = 0.05 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("3_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_bruh7"] +resource_name = "idle" +length = 0.95 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_d3wef"] +resource_name = "jump" +length = 0.55 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_qu4a1")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_lkdrv"] +resource_name = "run" +length = 0.81 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("4_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0rnld"] +_data = { +&"RESET": SubResource("Animation_6eyey"), +&"crouch idle": SubResource("Animation_cw2d6"), +&"crouch walk": SubResource("Animation_khinc"), +&"double jump": SubResource("Animation_p7iby"), +&"fall": SubResource("Animation_o4126"), +&"idle": SubResource("Animation_bruh7"), +&"jump": SubResource("Animation_d3wef"), +&"run": SubResource("Animation_lkdrv") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bruh7"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_6eyey"] + +[node name="Player" type="CharacterBody2D"] +script = SubResource("GDScript_khinc") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(4, -48) +texture = ExtResource("1_p0vlq") +hframes = 10 +frame = 1 + +[node name="mainbody" type="CollisionShape2D" parent="."] +position = Vector2(0, -43) +shape = ExtResource("2_khinc") + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(0, -90) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Camera2D") +libraries = { +&"": SubResource("AnimationLibrary_0rnld") +} +autoplay = "idle" + +[node name="crouchrc1" type="RayCast2D" parent="."] +position = Vector2(-29, -50) +target_position = Vector2(0, -37) + +[node name="crouchrc2" type="RayCast2D" parent="."] +position = Vector2(29, -50) +target_position = Vector2(0, -37) + +[node name="wallrunrcright1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(150, 0) + +[node name="wallrunrcright2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(150, 0) + +[node name="wallrunrcleft1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(-150, 0) + +[node name="wallrunrcleft2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(-150, 0) + +[node name="floorcheck" type="RayCast2D" parent="."] +position = Vector2(-1.90735e-06, -42) +scale = Vector2(3.5, 1) + +[node name="wallcheck" type="ShapeCast2D" parent="."] +position = Vector2(0, -68) +scale = Vector2(3.4, 1) +shape = SubResource("RectangleShape2D_bruh7") + +[node name="ledgecollision" type="CollisionShape2D" parent="."] +position = Vector2(0, -90) +scale = Vector2(3.4, 1e-05) +shape = SubResource("RectangleShape2D_6eyey") + +[node name="state machine" type="Node" parent="." node_paths=PackedStringArray("initial_state")] +script = ExtResource("9_bruh7") +initial_state = NodePath("PlayerCrouch") + +[node name="PlayerCrouch" type="Node" parent="state machine"] +script = ExtResource("10_6eyey") +metadata/_custom_type_script = "uid://cawr3av2aa8jb" diff --git a/sidescroller/scenes/Player.tscn2581566153.tmp b/sidescroller/scenes/Player.tscn2581566153.tmp new file mode 100644 index 0000000..3da6592 --- /dev/null +++ b/sidescroller/scenes/Player.tscn2581566153.tmp @@ -0,0 +1,545 @@ +[gd_scene load_steps=27 format=3 uid="uid://c3w3n7ysd02bd"] + +[ext_resource type="Texture2D" uid="uid://c1my4xbvhsdq8" path="res://assets/textures/Player Idle 144x144.png" id="1_p0vlq"] +[ext_resource type="Shape2D" uid="uid://bsdsjlbi8h6cf" path="res://resources/player standing cshape.tres" id="2_khinc"] +[ext_resource type="Texture2D" uid="uid://crkx6pt8e4cmc" path="res://assets/textures/player new jump 144x144.png" id="2_qu4a1"] +[ext_resource type="Texture2D" uid="uid://dvy7cws4egkmh" path="res://assets/textures/player fall 144x144.png" id="3_70d11"] +[ext_resource type="Texture2D" uid="uid://d11goqqiewsdg" path="res://assets/textures/player run 144x144.png" id="4_cw2d6"] +[ext_resource type="Texture2D" uid="uid://dletf8p3wr4n4" path="res://assets/textures/player air spin 144x144.png" id="5_khinc"] +[ext_resource type="Texture2D" uid="uid://cox74najv0828" path="res://assets/textures/player crouch-walk 144x144.png" id="6_70d11"] +[ext_resource type="Texture2D" uid="uid://co5l6328i3y76" path="res://assets/textures/Player Crouch-Idle 144x144.png" id="6_cw2d6"] +[ext_resource type="Script" uid="uid://c0iqbs1ms86cw" path="res://scripts/State Machine.gd" id="9_bruh7"] +[ext_resource type="Script" uid="uid://cawr3av2aa8jb" path="res://scripts/playercrouch.gd" id="10_6eyey"] +[ext_resource type="Script" uid="uid://dyee6xwb8js1s" path="res://scripts/playerrun.gd" id="11_p7iby"] +[ext_resource type="Script" uid="uid://d0cc7xgq16onu" path="res://scripts/playerjump.gd" id="12_0rnld"] +[ext_resource type="Script" uid="uid://bcnm70o0yo87k" path="res://scripts/playerwallrun.gd" id="13_srp4u"] +[ext_resource type="Script" uid="uid://d34ia87aolokd" path="res://scripts/playeridle.gd" id="14_jfpux"] + +[sub_resource type="GDScript" id="GDScript_khinc"] +script/source = "extends CharacterBody2D +" + +[sub_resource type="Animation" id="Animation_6eyey"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} + +[sub_resource type="Animation" id="Animation_cw2d6"] +resource_name = "crouch idle" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_khinc"] +resource_name = "crouch walk" +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("6_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_p7iby"] +resource_name = "double jump" +length = 0.55 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("5_khinc")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_o4126"] +resource_name = "fall" +length = 0.05 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("3_70d11")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_bruh7"] +resource_name = "idle" +length = 0.95 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_p0vlq")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_d3wef"] +resource_name = "jump" +length = 0.55 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_qu4a1")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [6] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} + +[sub_resource type="Animation" id="Animation_lkdrv"] +resource_name = "run" +length = 0.81 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("4_cw2d6")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0rnld"] +_data = { +&"RESET": SubResource("Animation_6eyey"), +&"crouch idle": SubResource("Animation_cw2d6"), +&"crouch walk": SubResource("Animation_khinc"), +&"double jump": SubResource("Animation_p7iby"), +&"fall": SubResource("Animation_o4126"), +&"idle": SubResource("Animation_bruh7"), +&"jump": SubResource("Animation_d3wef"), +&"run": SubResource("Animation_lkdrv") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bruh7"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_6eyey"] + +[node name="Player" type="CharacterBody2D"] +script = SubResource("GDScript_khinc") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(4, -48) +texture = ExtResource("1_p0vlq") +hframes = 10 +frame = 1 + +[node name="mainbody" type="CollisionShape2D" parent="."] +position = Vector2(0, -43) +shape = ExtResource("2_khinc") + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(0, -90) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Camera2D") +libraries = { +&"": SubResource("AnimationLibrary_0rnld") +} +autoplay = "idle" + +[node name="crouchrc1" type="RayCast2D" parent="."] +position = Vector2(-29, -50) +target_position = Vector2(0, -37) + +[node name="crouchrc2" type="RayCast2D" parent="."] +position = Vector2(29, -50) +target_position = Vector2(0, -37) + +[node name="wallrunrcright1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(150, 0) + +[node name="wallrunrcright2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(150, 0) + +[node name="wallrunrcleft1" type="RayCast2D" parent="."] +position = Vector2(0, -22) +target_position = Vector2(-150, 0) + +[node name="wallrunrcleft2" type="RayCast2D" parent="."] +position = Vector2(0, -97) +target_position = Vector2(-150, 0) + +[node name="floorcheck" type="RayCast2D" parent="."] +position = Vector2(-1.90735e-06, -42) +scale = Vector2(3.5, 1) + +[node name="wallcheck" type="ShapeCast2D" parent="."] +position = Vector2(0, -68) +scale = Vector2(3.4, 1) +shape = SubResource("RectangleShape2D_bruh7") + +[node name="ledgecollision" type="CollisionShape2D" parent="."] +position = Vector2(0, -90) +scale = Vector2(3.4, 1e-05) +shape = SubResource("RectangleShape2D_6eyey") + +[node name="State Machine" type="Node" parent="." node_paths=PackedStringArray("player", "initial_state")] +script = ExtResource("9_bruh7") +player = NodePath("..") +initial_state = NodePath("PlayerIdle") + +[node name="PlayerCrouch" type="Node" parent="State Machine"] +script = ExtResource("10_6eyey") +metadata/_custom_type_script = "uid://cawr3av2aa8jb" + +[node name="PlayerRun" type="Node" parent="State Machine"] +script = ExtResource("11_p7iby") +metadata/_custom_type_script = "uid://dyee6xwb8js1s" + +[node name="PlayerJump" type="Node" parent="State Machine"] +script = ExtResource("12_0rnld") +metadata/_custom_type_script = "uid://d0cc7xgq16onu" + +[node name="PlayerWallrun" type="Node" parent="State Machine"] +script = ExtResource("13_srp4u") +metadata/_custom_type_script = "uid://bcnm70o0yo87k" + +[node name="PlayerIdle" type="Node" parent="State Machine" node_paths=PackedStringArray("player")] +script = ExtResource("14_jfpux") +player = NodePath("../..") +metadata/_custom_type_script = "uid://d34ia87aolokd" diff --git a/sidescroller/scenes/world.tscn b/sidescroller/scenes/world.tscn index 6a40069..b4eb1a0 100644 --- a/sidescroller/scenes/world.tscn +++ b/sidescroller/scenes/world.tscn @@ -13,15 +13,15 @@ size = Vector2(1001, 98) [node name="World" type="Node2D"] [node name="Player" parent="." instance=ExtResource("1_go701")] -position = Vector2(601, 137) +position = Vector2(589, 149) script = ExtResource("2_5a7ea") speed = 350 -gravity = 40 +grav = 40 jump_force = 800 fallvelocity_cap = 1000 max_air_jumps = 1 -crouch_mult = 1 -sprint_mult = 1 +sprint_mult = 1.5 +crouch_mult = 0.4 [node name="Platform" type="StaticBody2D" parent="."] position = Vector2(604, 135) diff --git a/sidescroller/scripts/State Machine.gd b/sidescroller/scripts/State Machine.gd new file mode 100644 index 0000000..665dcac --- /dev/null +++ b/sidescroller/scripts/State Machine.gd @@ -0,0 +1,42 @@ +extends Node + +@export var player: Node # In Godot im Inspector zuweisen! +@export var initial_state : State + +var current_state : State + +var states : Dictionary = {} + +func _ready(): + for child in get_children(): + if child is State: + states[child.name.to_lower()] = child + child.Transitioned.connect(on_child_transitioned) + child.player = player + + if initial_state: + initial_state.enter() + current_state = initial_state + +func _process(delta): + if current_state: + current_state.update(delta) + +func _physics_process(delta): + if current_state: + current_state.physics_update(delta) + +func on_child_transitioned(state, new_state_name): + if state != current_state: + return + + var new_state = states.get(new_state_name.to_lower()) + if !new_state: + return + + if current_state: + current_state.exit() + + new_state.enter() + + current_state = new_state diff --git a/sidescroller/scripts/State Machine.gd.uid b/sidescroller/scripts/State Machine.gd.uid new file mode 100644 index 0000000..12a6cb2 --- /dev/null +++ b/sidescroller/scripts/State Machine.gd.uid @@ -0,0 +1 @@ +uid://c0iqbs1ms86cw diff --git a/sidescroller/scripts/State.gd b/sidescroller/scripts/State.gd new file mode 100644 index 0000000..af01b27 --- /dev/null +++ b/sidescroller/scripts/State.gd @@ -0,0 +1,19 @@ +extends Node + +class_name State + +@export var player: CharacterBody2D # HIER hinzugefügt + +signal Transitioned + +func enter(): + pass + +func exit(): + pass + +func update(_delta: float): + pass + +func physics_update(_delta: float): + pass diff --git a/sidescroller/scripts/State.gd.uid b/sidescroller/scripts/State.gd.uid new file mode 100644 index 0000000..262da52 --- /dev/null +++ b/sidescroller/scripts/State.gd.uid @@ -0,0 +1 @@ +uid://c6qk0yh300myk diff --git a/sidescroller/scripts/player.gd b/sidescroller/scripts/player.gd index e7a33a2..488aeca 100644 --- a/sidescroller/scripts/player.gd +++ b/sidescroller/scripts/player.gd @@ -1,113 +1,114 @@ extends CharacterBody2D @export var speed = 350 -@export var gravity = 40 +@export var grav = 40 @export var jump_force = 800 @export var fallvelocity_cap = 1000 # How fast the player can get when falling @export var max_air_jumps = 1 # Number of total jumps allowed (1 = normal, 2 = double jump) -@export var crouch_mult = 1 -@export var sprint_mult = 1 + +var input_direction = 0 +var direction_locked = false +var facing_direction = 1 # 1 = right, -1 = left + +@export var sprint_mult = 1.5 +@export var crouch_mult = 0.4 @onready var ap = $AnimationPlayer @onready var sprite = $Sprite2D @onready var cshape = $mainbody -@onready var crouch_raycast1 = $crouchrc1 -@onready var crouch_raycast2 = $crouchrc2 +@onready var topcheck1 = $topcheck1 +@onready var topcheck2 = $topcheck2 + +@onready var statemachine = $StateMachine + @onready var wallrun_raycast_left1 = $wallrunrcleft1 @onready var wallrun_raycast_left2 = $wallrunrcleft2 @onready var wallrun_raycast_right1 = $wallrunrcright1 @onready var wallrun_raycast_right2 = $wallrunrcright2 -@onready var wallcheck = $wallcheck +@onready var wallcheckright = $wallcheckright +@onready var wallcheckleft = $wallcheckleft @onready var floorcheck = $floorcheck +var horizontal_direction = 0 +var v_mult = 1 #velocity multiplier +var v_push = 0 #velocity push in either direction + var air_jumps_done = 0 -var is_crouching = false + var stuck_under_object = false var wallrun_available := true var wallrun_timer := 0.0 #:= bedeutet, dass der Typ fest festgelegt ist (z.B int, bool etc.) var wallrun_time := 1 # Dauer des Wallruns in Sekunden var wallrun_speed := -250.0 # Geschwindigkeit nach oben (negativ wegen y-Achse) + var wallpushoff_force := 450 # Stärke des Abstoßens +var wallpushoff_mult := 0.3 # schränkt die velocity.x Kontrolle des Spielers ein. var wallpushoff_timer := 0.0 var wallpushoff_time := 0.5 # dauer des pushoffs -var wallrunning := false -var pushingoffwall := false -var wallrun_direction := 0 # -1 = links, 1 = rechts -var standing_cshape = preload("res://resources/player standing cshape.tres") -var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var climbup_pos1 = Vector2(0, 0) +var climbup_pos2 = Vector2(0, 0) +var climbup_pos1_reached = false +var climbup_speed_y = 100 +var climbup_speed_x = 500 func _process(delta): + #turnmovement() pass -func _physics_process(delta): - var horizontal_direction = Input.get_axis("move_left", "move_right") - - if !is_on_floor(): - velocity.y += gravity - if velocity.y > fallvelocity_cap: - velocity.y = fallvelocity_cap - else: - air_jumps_done = 0 - wallrun_available = true - - if Input.is_action_just_pressed("jump") && Input.is_action_pressed("move_right") && wall_detected_right() && wallrun_available: - start_wallrun(1) - elif Input.is_action_just_pressed("jump") && Input.is_action_pressed("move_left") && wall_detected_left() && wallrun_available: - start_wallrun(-1) - elif Input.is_action_just_pressed("jump"): - if is_on_floor(): - velocity.y = -jump_force - elif air_jumps_done < max_air_jumps: - velocity.y = -jump_force - air_jumps_done += 1 - - if wallrunning: - wallrun_timer += delta - velocity.y = wallrun_speed # Bewegt nach oben - - if wallrun_direction > 0 && !wallrun_raycast_right2.is_colliding(): - ledgedetected() - if wallrun_direction < 1 && !wallrun_raycast_left2.is_colliding(): - ledgedetected() - elif wallrun_timer >= wallrun_time: - wallpushoff() - - elif pushingoffwall: - wallpushoff_timer += delta - velocity.x = speed * 0.3 * horizontal_direction + (-wallrun_direction * wallpushoff_force) - - if wallpushoff_timer >= wallpushoff_time: - pushingoffwall = false - - else: - velocity.x = speed * horizontal_direction * crouch_mult - if horizontal_direction != 0: - switchdirection(horizontal_direction) - - - if Input.is_action_just_pressed("crouch"): - crouch() - elif Input.is_action_just_released("crouch"): - if above_head_empty(): - stand() - else: - if stuck_under_object != true: - stuck_under_object = true - print("player stuck under object") - - if stuck_under_object && above_head_empty(): - if !Input.is_action_pressed("crouch"): - stand() - stuck_under_object = false - - move_and_slide() - - update_animation(horizontal_direction) -func above_head_empty() -> bool: - var result = !crouch_raycast1.is_colliding() && !crouch_raycast2.is_colliding() +func _physics_process(delta): + + move_and_slide() + input_direction = Input.get_axis("move_left", "move_right") + + #print(statemachine.current_state.get_state_name()) # zum debuggen aktivieren + + if statemachine.current_state.get_state_name() not in ["PlayerWallrun", "PlayerClimbUp"]: + gravity() + + if statemachine.current_state.get_state_name() not in ["PlayerWallrun", "PlayerWallrunPushoff", "PlayerLedgeGrab", "PlayerClimbUp"]: + turnmovement() + + + $ledgecollision.disabled = statemachine.current_state.get_state_name() in ["PlayerIdle", "PlayerRun", "PlayerCrouch", "PlayerCrouchWalk", "PlayerJump", "PlayerWallrun", "PlayerClimbUp"] or velocity.y < 0 or Input.is_action_pressed("crouch") or(topcheck1.is_colliding() and topcheck2.is_colliding() and statemachine.current_state.get_state_name() != "PlayerLedgeGrab") + +func movement(): + velocity.x = speed * input_direction * v_mult + v_push + +func turnmovement(): + movement() + + if direction_locked: + return + + if input_direction != 0 and sign(input_direction) != facing_direction: + switch_direction(sign(input_direction)) + +func switch_direction(new_direction): + facing_direction = new_direction + sprite.flip_h = (facing_direction == -1) + +func set_facing_direction(dir: int): #manual flip + if direction_locked: + return + if dir in [-1, 1] and dir != facing_direction: + switch_direction(dir) + +func lock_direction(): + direction_locked = true + +func unlock_direction(): + direction_locked = false + +func gravity(): + velocity.y += grav + if velocity.y > fallvelocity_cap: + velocity.y = fallvelocity_cap + +func head_clear() -> bool: + var result = !topcheck1.is_colliding() && !topcheck2.is_colliding() return result func wall_detected_left() -> bool: @@ -117,67 +118,42 @@ func wall_detected_left() -> bool: func wall_detected_right() -> bool: var result = wallrun_raycast_right1.is_colliding() && wallrun_raycast_right2.is_colliding() return result + +# transition functions + +func transitionidle() -> bool: + var result = Input.get_axis("move_left", "move_right") == 0 && is_on_floor() + return result -func start_wallrun(direction: int): - wallrunning = true - wallrun_available = false - wallrun_direction = direction - velocity.x = 1000 * wallrun_direction # An Wand haften - print("start wallrun called") +func transitionrun() -> bool: + var result = Input.get_axis("move_left", "move_right") != 0 && is_on_floor() + return result -func wallpushoff(): - wallrunning = false - pushingoffwall = true - wallpushoff_timer = 0.0 - wallrun_timer = 0.0 - print("stop wallrun called") +func transitionjump() -> bool: + var result = Input.is_action_just_pressed("jump") && is_on_floor() + return result -func ledgedetected(): - wallrunning = false - wallrun_timer = 0.0 +func transitiondoublejump() -> bool: + var result = Input.is_action_just_pressed("jump") && !is_on_floor() && (air_jumps_done < max_air_jumps) + return result -func checkledgegrab() -> bool: - var result = wallcheck.is_colliding() && !floorcheck.is_colliding() && velocity.y == 0 +func transitionfall() -> bool: + var result = velocity.y > 0 && !is_on_floor() + return result + +func transitionledgegrab() -> bool: + var result = !floorcheck.is_colliding() && velocity.y - grav == 0 && (wallcheckright.is_colliding() or wallcheckleft.is_colliding()) return result -func update_animation(horizontal_direction): - if is_on_floor(): - if horizontal_direction == 0: - if is_crouching: - ap.play("crouch idle") - else: - ap.play("idle") - else: - if is_crouching: - ap.play("crouch walk") - else: - ap.play("run") - else: - if velocity.y < 0: - if air_jumps_done == 0 : - ap.play("jump") - elif air_jumps_done == 1: - ap.play("double jump") - elif velocity.y > 0: - ap.play("fall") - -func crouch(): - if is_crouching: - return - is_crouching = true - crouch_mult = 0.4 - cshape.shape = crouching_cshape - cshape.position.y = -31 +func transitioncrouch() -> bool: + var result = is_on_floor() && Input.is_action_pressed("crouch") + return result -func stand(): - if is_crouching == false: - return - is_crouching = false - crouch_mult = 1 - cshape.shape = standing_cshape - cshape.position.y = -44 +func transitioncrouchwalk() -> bool: + var result = is_on_floor() && Input.is_action_pressed("crouch") && Input.get_axis("move_left", "move_right") != 0 + return result -func switchdirection(horizontal_direction): - sprite.flip_h = (horizontal_direction == -1) - sprite.position.x = horizontal_direction * 4 +func transitionwallrun() -> bool: + var result = Input.is_action_just_pressed("jump") and ((Input.is_action_pressed("move_right") && wall_detected_right()) or (Input.is_action_pressed("move_left") && wall_detected_left())) and wallrun_available + return result diff --git a/sidescroller/scripts/playerclimbup.gd b/sidescroller/scripts/playerclimbup.gd new file mode 100644 index 0000000..2d45e2d --- /dev/null +++ b/sidescroller/scripts/playerclimbup.gd @@ -0,0 +1,46 @@ +extends State +class_name PlayerClimbUp + +func get_state_name(): + return str(self).split(":")[0] + +var ledge_cshape = preload("res://resources/player ledge cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func enter(): + + player.climbup_pos1 = player.position + Vector2(0, -52) + player.climbup_pos2 = player.position + Vector2(player.facing_direction * 40, -52) + + print(player.position) + print (player.climbup_pos1) + + player.ap.play("climb up") + player.sprite.position.x = player.facing_direction * 11 + player.sprite.position.y = -60 + + player.cshape.shape = ledge_cshape + player.cshape.position.y = -69 + +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -43 + + player.sprite.position.x = 0 + player.sprite.position.y = -48 + + player.climbup_pos1_reached = false + +func update(delta): + pass + +func physics_update(delta): + + if player.position != player.climbup_pos1 && !player.climbup_pos1_reached: + player.position = player.position.move_toward(player.climbup_pos1, player.climbup_speed_y * delta) + if player.position == player.climbup_pos1: + player.climbup_pos1_reached = true + elif player.position != player.climbup_pos2 && player.climbup_pos1_reached: + player.position = player.position.move_toward(player.climbup_pos2, player.climbup_speed_x * delta) + elif player.position == player.climbup_pos2: + Transitioned.emit(self, "PlayerFall") diff --git a/sidescroller/scripts/playerclimbup.gd.uid b/sidescroller/scripts/playerclimbup.gd.uid new file mode 100644 index 0000000..ca20550 --- /dev/null +++ b/sidescroller/scripts/playerclimbup.gd.uid @@ -0,0 +1 @@ +uid://boe7p8pcolkln diff --git a/sidescroller/scripts/playercrouch.gd b/sidescroller/scripts/playercrouch.gd new file mode 100644 index 0000000..8cf90c6 --- /dev/null +++ b/sidescroller/scripts/playercrouch.gd @@ -0,0 +1,37 @@ +extends State +class_name PlayerCrouch + +var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.cshape.shape = crouching_cshape + player.cshape.position.y = -31 + +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -44 + +func update(delta): + + var horizontal_direction = Input.get_axis("move_left", "move_right") + + if player.is_on_floor(): + if horizontal_direction == 0: + player.ap.play("crouch idle") + else: + Transitioned.emit(self, "PlayerCrouchwalk") + + if player.head_clear() and (Input.is_action_just_released("crouch") or !Input.is_action_pressed("crouch")): + Transitioned.emit(self, "PlayerIdle") + player.stuck_under_object = false + elif !player.head_clear(): + if player.stuck_under_object != true: + player.stuck_under_object = true + print("player stuck under object", player.stuck_under_object) + +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playercrouch.gd.uid b/sidescroller/scripts/playercrouch.gd.uid new file mode 100644 index 0000000..a503a1f --- /dev/null +++ b/sidescroller/scripts/playercrouch.gd.uid @@ -0,0 +1 @@ +uid://cawr3av2aa8jb diff --git a/sidescroller/scripts/playercrouchwalk.gd b/sidescroller/scripts/playercrouchwalk.gd new file mode 100644 index 0000000..a6d58de --- /dev/null +++ b/sidescroller/scripts/playercrouchwalk.gd @@ -0,0 +1,32 @@ +extends State +class_name PlayerCrouchWalk + +var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.cshape.shape = crouching_cshape + player.cshape.position.y = -31 + player.v_mult = player.crouch_mult +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -44 + player.v_mult = 1 +func update(delta): + player.ap.play("crouch walk") + + if player.head_clear() and (Input.is_action_just_released("crouch") or !Input.is_action_pressed("crouch")): + Transitioned.emit(self, "PlayerIdle") + player.stuck_under_object = false + elif Input.get_axis("move_left", "move_right") == 0: + Transitioned.emit(self, "PlayerCrouch") + elif !player.head_clear(): + if player.stuck_under_object != true: + player.stuck_under_object = true + print("player stuck under object") + +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playercrouchwalk.gd.uid b/sidescroller/scripts/playercrouchwalk.gd.uid new file mode 100644 index 0000000..4c3e9d1 --- /dev/null +++ b/sidescroller/scripts/playercrouchwalk.gd.uid @@ -0,0 +1 @@ +uid://dhvehwhg63p2h diff --git a/sidescroller/scripts/playerdoublejump.gd b/sidescroller/scripts/playerdoublejump.gd new file mode 100644 index 0000000..a101e7e --- /dev/null +++ b/sidescroller/scripts/playerdoublejump.gd @@ -0,0 +1,26 @@ +extends State +class_name PlayerDoubleJump + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.ap.play("double jump") + player.velocity.y = -player.jump_force + player.air_jumps_done += 1 + +func exit(): + pass + +func update(delta): + if player.velocity.y > 0 and !player.is_on_floor(): + Transitioned.emit(self, "PlayerFall") + elif !player.is_on_floor() and Input.is_action_just_pressed("jump") and (player.air_jumps_done < player.max_air_jumps): + Transitioned.emit(self, "PlayerDoubleJump") + elif player.is_on_floor() && player.velocity.x != 0: + Transitioned.emit(self, "PlayerRun") + elif player.is_on_floor(): + Transitioned.emit(self, "PlayerIdle") + +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playerdoublejump.gd.uid b/sidescroller/scripts/playerdoublejump.gd.uid new file mode 100644 index 0000000..c4b43da --- /dev/null +++ b/sidescroller/scripts/playerdoublejump.gd.uid @@ -0,0 +1 @@ +uid://cgsyaphtn6k6q diff --git a/sidescroller/scripts/playerfall.gd b/sidescroller/scripts/playerfall.gd new file mode 100644 index 0000000..83412b1 --- /dev/null +++ b/sidescroller/scripts/playerfall.gd @@ -0,0 +1,30 @@ +extends State +class_name PlayerFall + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + pass + +func exit(): + pass + +func update(delta): + player.ap.play("fall") + + if player.transitionledgegrab(): + Transitioned.emit(self, "PlayerLedgeGrab") + elif player.transitiondoublejump(): + Transitioned.emit(self, "PlayerDoubleJump") + elif player.transitionidle(): + Transitioned.emit(self, "PlayerIdle") + elif player.transitionrun(): + Transitioned.emit(self, "PlayerRun") + + player.gravity() + +func physics_update(delta): + pass + #player.turnmovement() + diff --git a/sidescroller/scripts/playerfall.gd.uid b/sidescroller/scripts/playerfall.gd.uid new file mode 100644 index 0000000..fafa4c7 --- /dev/null +++ b/sidescroller/scripts/playerfall.gd.uid @@ -0,0 +1 @@ +uid://whap2d3r3yk diff --git a/sidescroller/scripts/playeridle.gd b/sidescroller/scripts/playeridle.gd new file mode 100644 index 0000000..a395c83 --- /dev/null +++ b/sidescroller/scripts/playeridle.gd @@ -0,0 +1,27 @@ +extends State +class_name PlayerIdle + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.air_jumps_done = 0 + player.wallrun_available = true + +func exit(): + pass + +func update(delta): + player.ap.play("idle") + + if player.transitionfall(): + Transitioned.emit(self, "PlayerFall") + elif player.transitionrun(): + Transitioned.emit(self, "PlayerRun") + elif player.transitioncrouch(): + Transitioned.emit(self, "PlayerCrouch") + elif player.transitionjump(): + Transitioned.emit(self, "PlayerJump") + +func physics_update(delta): + player.gravity() diff --git a/sidescroller/scripts/playeridle.gd.uid b/sidescroller/scripts/playeridle.gd.uid new file mode 100644 index 0000000..c46ba5d --- /dev/null +++ b/sidescroller/scripts/playeridle.gd.uid @@ -0,0 +1 @@ +uid://d34ia87aolokd diff --git a/sidescroller/scripts/playerjump.gd b/sidescroller/scripts/playerjump.gd new file mode 100644 index 0000000..b81a03c --- /dev/null +++ b/sidescroller/scripts/playerjump.gd @@ -0,0 +1,25 @@ +extends State +class_name PlayerJump + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.ap.play("jump") + player.velocity.y = -player.jump_force +func exit(): + pass +func update(delta): + + if player.transitionledgegrab(): + Transitioned.emit(self, "PlayerLedgeGrab") + elif player.transitionfall(): + Transitioned.emit(self, "PlayerFall") + elif !player.is_on_floor() and Input.is_action_just_pressed("jump") and (player.air_jumps_done < player.max_air_jumps): + Transitioned.emit(self, "PlayerDoubleJump") + elif player.is_on_floor() && player.velocity.x != 0: + Transitioned.emit(self, "PlayerRun") + elif player.is_on_floor(): + Transitioned.emit(self, "PlayerIdle") +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playerjump.gd.uid b/sidescroller/scripts/playerjump.gd.uid new file mode 100644 index 0000000..8357a0f --- /dev/null +++ b/sidescroller/scripts/playerjump.gd.uid @@ -0,0 +1 @@ +uid://d0cc7xgq16onu diff --git a/sidescroller/scripts/playerledgegrab.gd b/sidescroller/scripts/playerledgegrab.gd new file mode 100644 index 0000000..f25ed23 --- /dev/null +++ b/sidescroller/scripts/playerledgegrab.gd @@ -0,0 +1,38 @@ +extends State +class_name PlayerLedgeGrab + +var ledge_cshape = preload("res://resources/player ledge cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + if player.wallcheckright.is_colliding() and player.facing_direction == -1: + player.set_facing_direction(1) + elif player.wallcheckleft.is_colliding() and player.facing_direction == 1: + player.set_facing_direction(-1) + + player.ap.play("ledge hang") + player.sprite.position.x = player.facing_direction * 11 + player.sprite.position.y = -54 + + player.cshape.shape = ledge_cshape + player.cshape.position.y = -55 + +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -43 + + player.sprite.position.x = 0 + player.sprite.position.y = -48 + +func update(delta): + + if Input.is_action_just_pressed("jump"): + Transitioned.emit(self, "PlayerClimbUp") + elif player.floorcheck.is_colliding() or (!player.wallcheckright.is_colliding() and !player.wallcheckleft.is_colliding()) or Input.is_action_pressed("crouch"): + Transitioned.emit(self, "PlayerFall") + +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playerledgegrab.gd.uid b/sidescroller/scripts/playerledgegrab.gd.uid new file mode 100644 index 0000000..4ee9c6d --- /dev/null +++ b/sidescroller/scripts/playerledgegrab.gd.uid @@ -0,0 +1 @@ +uid://c46i4062efgw1 diff --git a/sidescroller/scripts/playerrun.gd b/sidescroller/scripts/playerrun.gd new file mode 100644 index 0000000..cc4ddb0 --- /dev/null +++ b/sidescroller/scripts/playerrun.gd @@ -0,0 +1,28 @@ +extends State +class_name PlayerRun + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.air_jumps_done = 0 + player.wallrun_available = true + player.v_mult = 1 +func exit(): + pass +func update(delta): + player.ap.play("run") + + if player.transitionidle(): + Transitioned.emit(self, "PlayerIdle") + elif player.transitioncrouch(): + Transitioned.emit(self, "PlayerCrouchwalk") + elif player.transitionwallrun(): + Transitioned.emit(self, "PlayerWallrun") + elif player.transitionjump(): + Transitioned.emit(self, "PlayerJump") + elif player.transitionfall(): + Transitioned.emit(self, "PlayerFall") + +func physics_update(delta): + pass diff --git a/sidescroller/scripts/playerrun.gd.uid b/sidescroller/scripts/playerrun.gd.uid new file mode 100644 index 0000000..2f857b8 --- /dev/null +++ b/sidescroller/scripts/playerrun.gd.uid @@ -0,0 +1 @@ +uid://dyee6xwb8js1s diff --git a/sidescroller/scripts/playerwallrun.gd b/sidescroller/scripts/playerwallrun.gd new file mode 100644 index 0000000..827d81b --- /dev/null +++ b/sidescroller/scripts/playerwallrun.gd @@ -0,0 +1,31 @@ +extends State +class_name PlayerWallrun + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.wallrun_available = false + + player.velocity.x = 2000 * player.facing_direction # An Wand haften + +func exit(): + player.wallrun_timer = 0.0 + +func update(delta): + pass + +func physics_update(delta): + player.wallrun_timer += delta + player.velocity.y = player.wallrun_speed # Bewegt nach oben + + if player.facing_direction > 0 && !player.wallrun_raycast_right2.is_colliding(): + Transitioned.emit(self, "PlayerFall") + if player.facing_direction < 1 && !player.wallrun_raycast_left2.is_colliding(): + Transitioned.emit(self, "PlayerFall") + elif player.wallrun_timer >= player.wallrun_time: + Transitioned.emit(self, "PlayerWallrunPushoff") + +func transitionwallrunpushoff() -> bool: + var result = player.wallrun_timer >= player.wallrun_time + return result diff --git a/sidescroller/scripts/playerwallrun.gd.uid b/sidescroller/scripts/playerwallrun.gd.uid new file mode 100644 index 0000000..3bdccd6 --- /dev/null +++ b/sidescroller/scripts/playerwallrun.gd.uid @@ -0,0 +1 @@ +uid://bcnm70o0yo87k diff --git a/sidescroller/scripts/playerwallrunpushoff.gd b/sidescroller/scripts/playerwallrunpushoff.gd new file mode 100644 index 0000000..99b42d5 --- /dev/null +++ b/sidescroller/scripts/playerwallrunpushoff.gd @@ -0,0 +1,27 @@ +extends State +class_name PlayerWallrunPushoff + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.v_mult = player.wallpushoff_mult + player.v_push = -player.facing_direction * player.wallpushoff_force + print("pushoff entered") + +func exit(): + player.wallpushoff_timer = 0.0 + player.v_mult = 1 + player.v_push = 0 + player.set_facing_direction(-player.facing_direction) + +func update(delta): + pass + +func physics_update(delta): + player.movement() + + player.wallpushoff_timer += delta + + if player.wallpushoff_timer >= player.wallpushoff_time: + Transitioned.emit(self, "PlayerFall") diff --git a/sidescroller/scripts/playerwallrunpushoff.gd.uid b/sidescroller/scripts/playerwallrunpushoff.gd.uid new file mode 100644 index 0000000..07c06ff --- /dev/null +++ b/sidescroller/scripts/playerwallrunpushoff.gd.uid @@ -0,0 +1 @@ +uid://bxkdsl12qa7jy