From bfd653c136dd648087e6d1db22e83d96e0ce19bd Mon Sep 17 00:00:00 2001 From: vaporvee Date: Mon, 27 Oct 2025 18:29:06 +0100 Subject: [PATCH] pumpkin carving --- aseprite/knife.aseprite | Bin 0 -> 1104 bytes aseprite/pumpkin.aseprite | Bin 0 -> 553 bytes aseprite/pumpkin_inner.aseprite | Bin 0 -> 470 bytes aseprite/pumpkin_outer.aseprite | Bin 0 -> 497 bytes aseprite/tileset_grass_random.aseprite | Bin 10106 -> 10106 bytes assets/textures/knife.png | Bin 0 -> 274 bytes assets/textures/knife.png.import | 40 +++++++++++ assets/textures/pumpkin_inner.png | Bin 0 -> 302 bytes assets/textures/pumpkin_inner.png.import | 40 +++++++++++ assets/textures/pumpkin_outer.png | Bin 0 -> 291 bytes assets/textures/pumpkin_outer.png.import | 40 +++++++++++ assets/textures/tilemaps/grass_tilemap.png | Bin 8481 -> 1722 bytes project.godot | 1 + scenes/autoloads/event_manager.tscn | 30 ++++----- scenes/levels/home.tscn | 4 ++ scenes/menus/pumpkin_carve.tscn | 70 +++++++++++++++++++ scripts/autoloads/nodes/event_manager.gd | 7 +- scripts/autoloads/windowman.gd | 6 -- scripts/interactables/chair.gd | 2 +- scripts/menus/pumpkin_carve.gd | 74 +++++++++++++++++++++ scripts/menus/pumpkin_carve.gd.uid | 1 + scripts/player.gd | 10 ++- 22 files changed, 296 insertions(+), 29 deletions(-) create mode 100644 aseprite/knife.aseprite create mode 100644 aseprite/pumpkin.aseprite create mode 100644 aseprite/pumpkin_inner.aseprite create mode 100644 aseprite/pumpkin_outer.aseprite create mode 100644 assets/textures/knife.png create mode 100644 assets/textures/knife.png.import create mode 100644 assets/textures/pumpkin_inner.png create mode 100644 assets/textures/pumpkin_inner.png.import create mode 100644 assets/textures/pumpkin_outer.png create mode 100644 assets/textures/pumpkin_outer.png.import create mode 100644 scenes/menus/pumpkin_carve.tscn create mode 100644 scripts/menus/pumpkin_carve.gd create mode 100644 scripts/menus/pumpkin_carve.gd.uid diff --git a/aseprite/knife.aseprite b/aseprite/knife.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..661d0cd060d4af11943b8f85241fa977956f6f46 GIT binary patch literal 1104 zcmWGwVPJT$l#xLJ2n84z85kH+fEWodGJ*twaso(#)MH*?W?=aBkp*lk&?yXJK+LWH zwi3w_E}$wFuDFF)=eUv#_wRva+(Vv9YtWb8v8Qa&mHUadC5V^YHNS^78WW z@$vKX3kV1Z3JMAd2?+}ei-?Gbii(PfiHVDgOGrpaN=iyeNl8mf%gD&c%F4>g$;r#h zD<~)^Dk>@|DJd%}tEi}`s;a7~si~{0YiMX_YHDg}X=!U~>*(m{>gww0>FMk18yFZE z8X6iI85tWJo0yoGnwpxKnVFlLTUc0FT3T9JSy@|K+t}FH+S=OL+1cCMJ2*HvIyyQz zIXOE!ySTWxy1Kf#xw*T$dw6(wdU|?!d3k$#`}p|y`uh6$`T6_%2LuEJ1_lNN1qBBO zhlGTLhK7cPg@uQQM?^$KMn*U3Q#l^?RCnO{!CMG5&B_$^(r=+B$ zrlzK)rKP8*XJlk#W@ct(Wo2h)=j7z%=H}+*<>lw+7Zel}78Vv26%`j3mz0#0mX?;4 zm6ey5S5#C~R#sM3RaIA4*VNS1*4Eb5)z#P6H#9UfHa0djH8nRkx3sjhwzjslwY9gm zcXV`gc6N4kb#-@l_w@Ai_V)Jm_4W7nPna-a;>3xQCQX_=dGeGgQ>IRxI&Ipt>C>mr zm@#AK%$c)h&6+)X_MAC$=FXivZ{EE5^XD&EuwdcBg^Ly~TD*Aik|j%)E?v58*|O!! zm#aNyvkt0Wr9zA;O z*sC-XE?v5O`SO)3SFT>Y zdhOb^>({T}xN+m=&6~Gw-MW4I_MJO-?%ut7@7}%p_wPS=@ZjOYhmRgTdi?nDlP6D} zK7IP^*|X=*pTBtV;^oViuU@@+{rdHrH*em)ef#d+yZ7(kfB5j>@@87@w|NqMaGXRSMFgw7(e;|vU z!6&gYwMfCR5y)XxfXMx4g3t^M@(i*J6?5KRG2}a7z`^XG_WwVt&6L(vUdj`faeoU4 z)zXPPcW#o)EQ5&?^;G8Edf9UEoO;N4l^6G>hu+%%BKAY|?speGZrDowTUV(2T(Lsu i_SdwY_50agKcBg?cJBTC@2m5l@0@@6viz1%3swNfN5NnK literal 0 HcmV?d00001 diff --git a/aseprite/pumpkin.aseprite b/aseprite/pumpkin.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..651d51f848cbf9884bd76cf67188c43ac09b50cd GIT binary patch literal 553 zcmdO7Vqkc%l#xLJ3>g_17*c>30TdV*L4phdKu8O)5@`Cbk1SwYS%4OZ0WrG**h(bp zvVd$B2B4?{kfEet;;LbjW@*?TW_`a@#`U3+F$R%BREnN!yqBcq$)$=9oQ^-uTe z$~TY)*`&Y>Bw^q`kipL2lUSKrq+s|9$YE80Nc{%}9Rz>^uVT*IX@-1<40v3trNr9$ z?zD1mP%M3{5YxW7V9Ej>w`ro&-^-ixE59F z>W;>~4<^-1_@`OV(wEXISNUCPEpD>y(Z1=I&7VY`PtW?WLznlS)au1kXCFUzWx?m( zC%qXzmMT}NZ7%n1zAL`gGHUgkJJq%sd$+6J&pL5p?pFov@@vh_^&h^U>91>!ymjrJ z{ItXO>i_TizgTKf-OJK1|4;w8IeGWBhA)g6>lI%6$hT!U+|;=K`Os?1OWzIOOyiS| S)7`W~P}l6jXS)#n>0JP29yADL{+>3Ji=OK?VUJqy-2An*Qq}3)of`pao(;%&q{o63MzO zAe)5&D5?NtC@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pij}k>G+GXpu=@e&mMi!-({owM&(I<(pxn%p3be}v3(QvF1g{^C71PU zs*wHUY_^?ME1rfI{qf=5-}g%Ps`aI>lO|1H@pM_E-g>rGHEKumavmLN`%y>LH?SYYJ{$*Y=00N1DEdT%j literal 0 HcmV?d00001 diff --git a/aseprite/pumpkin_outer.aseprite b/aseprite/pumpkin_outer.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..cabf42bc13ba36b6f3836fce75d8111ab5c4b453 GIT binary patch literal 497 zcmey!$iVPmDIyADL{+>3Ji=OK?VUJqy;Dhn*Qq}3)of`pao(;%&q{o63MzO zAe)5&D5?NtC@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pij z?85qvU;LY;+Z>a=Y?4ot-*op24|_@V%Ut_2yb9GXGr!*}dHerJQq)cFuBxn?)&jp) zO13ST;oAK}`C3fW4eu^l=1hCrH^)-NZQmYCd+u<{UZ6~QcjA?Qfxq21{XOx;;fAfm zo8{Z3**5Vhh5Wy#AF_C+v_qQkWj4tb-}rY`W!>^!x34klf0A*##O92v><82AOn=!j JT;%=53;@H8i@pE= literal 0 HcmV?d00001 diff --git a/aseprite/tileset_grass_random.aseprite b/aseprite/tileset_grass_random.aseprite index 3a6291dbac87c9d1c44675cb60a03a6ad76c3ff5..5f9b7e0c07f21a4f6521785dac7c420d5ee8e82b 100644 GIT binary patch delta 14 Vcmez6_sefX4I?Ad=32(TssJ;t1{44Q delta 14 Vcmez6_sefX4I?A-=32(TssJ;z1{DAR diff --git a/assets/textures/knife.png b/assets/textures/knife.png new file mode 100644 index 0000000000000000000000000000000000000000..13f7d55447fe154015750aa2c6c82555cec0a984 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UjKx9jP7LeL$-D$|&Um^whIn*d zow}E)Re__mpU*BeIJm!L`LcPJj<#io3;tI++ceA+QleD&0o`6*SSa5nj)el+~J0n&3DfVG|v_b-Wm1P zj4LMZj-1oQpGHomwJI$|Y(*_q9osk#Yb@_*jmvne{dcnMPx#=t)FDR9J=WmOBo@FbsxG1Pix-q4(=axE}+(1q(x2aAmCckDW#l68V-s()9o0 z^bw-L;NLk!J1q0G^8Vv_qU-s!ZJEpM?!K?)LVY{?-|PaHG6bfe=iAhTH;pN?qIJcEssI2007*qoM6N<$f|bIB Apa1{> literal 0 HcmV?d00001 diff --git a/assets/textures/pumpkin_inner.png.import b/assets/textures/pumpkin_inner.png.import new file mode 100644 index 0000000..1d3d23a --- /dev/null +++ b/assets/textures/pumpkin_inner.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb8q0hsocixew" +path="res://.godot/imported/pumpkin_inner.png-09a1a9c2eccf0bfd935208992baba1e9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/pumpkin_inner.png" +dest_files=["res://.godot/imported/pumpkin_inner.png-09a1a9c2eccf0bfd935208992baba1e9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/textures/pumpkin_outer.png b/assets/textures/pumpkin_outer.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e1e145cec98ef49a8adbfabee6e824a3e7d878 GIT binary patch literal 291 zcmV+;0o?wHP)Px#-AP12R9J;$V4wh)Ps#glJ|*uzC1x;^qe;Ia>OY5!2#VN`CvO-ob}S>=JSK7+ zz#${T@Z-rF6wA>aL{kS~a|F47tSDfB#y`vf95NydCvzr|Wfn=A_NHqSo#32jUM0$G zq7)%pOpL)W^~5>?uR)~vnyUIKv6v#WDD^c(=F-AqLUxc{4p1G?!}mDtqNnBPb`E?L z4218I?H=$D7GmM6+|k^Ed%NnltNqu#nvW>B9tmo!KjEcfUJtF zK*3wLE@9~^Ql1hNQ9#HjRjC(HutI~#6j!Q&2qJfqOtHWE?Dy+@|IT^ODG8|))DuCyZd@)m1|{nO{wYetD=F|Sz-LJhkO67k6fWM zR9#6F=Yu_ghJwZB6E@6{hq{>V$g9X(Y9*vsOOS;a9jcfEOHmKR%Wk73l}*^u9hKIi zqM!H_a^rJo*@rI#-FLla-AOV8S8t)d4|0U%ncI+1euWirlok+ct6(Mm%|DC$L$Ah% z{EF~W_D}ty?QQ%5Lfa(Z{?V$b@{4b-8B!m)*wZoZZ4ZXJfN^PkQJpg%BKQg~ctG$a zh%1HXLp0}M=;7DJV8bU=BX&5mFb5x$+CYr!F3&0st|=rFwa1UqN1?oAp@jpT3kxm= zObIR3Mfd(|J_?IoC?ZT;T$UTXbtNL}e+f)M%aibl$O0krxc$-!U7rA=12@m{UXi{5 zx^c&PPMRVTT9TM!d36c4RN00M*I8VGhs1c)R+3sgByOfJT!WrU)XP z8EjvAGqT|w%yk&yf#h0BR`VH?(;o@`BNJzLlv<l_MlCE`gHA#{XZO!Lbboaxb5Amp8RCICvQ4> z8FHVe?k0CYvv~<>J0kx8YS@F|GH*P>)`P6!a%6>fjurSJ58nR`mBg6uVsp~mPI|#s z(`gH4tu(y3{dt;GVaUw`WkNbPa`In(5MJ9W-OADYE#04rni3&CdhX~E}5tb6B$ECafGXgCEPn)%dh%1{iQNT=ByoRXl1`~gxR z8BHLM{M4@dXt&7$f+$a=Abv)&m0VO7?aiRTD!ef_^r z{L1=mcXubEaCT<;GLV^k4Y(`?YP7qi0(R?Wb@cG)PcK)1?<2&=L5*o<9Qi|+6w$ns zlsBSd*WH+jVW)n+Dd`$JHn}E(JVlbRuQeZo{<3}}+s16`cVHsv8`@?2b*YG@Stt(^-Q<^PWIl9>mn#r!$!)QB++j;~dr#c` zh-H)uc_es^BgC^WW8w}$uDPVWucZ;f%>{2ctt}q({|340;q#7q?vP4U8#cdoF5o`Q#J97zv+zV ze$VqCLj#d!>sLZlg9TpKwumvJPx>^b#DPcuI9he#&iJCfftokNgBWq(Zh?6=jCGs( zFtbpf4&n$aB$w;{WR3AMb?xvkG)ZvQZO-1H!yE7WP`tex-i4*n(1iw0@#k6yI0YQPrfo+fp`s-$9uWGyBMuI~cZP z+yAaOesZj5^B;^$D=^&`5j(d13y;9J91)nR$ zR|F#g+TvdT1eNXkOkWxx1t}TJj;niNA`#(I3QWOKoP(#5C^Mc|(&wsf@YmD*;;^>- zc<^=3AyxH64^Hd9QfXQf*jwSjXuT%;x8MBJ)CsH(?w@>0B3$w?*lJKY2Emoq_9zYq zsDQGfOE~(X+^mJgIgY2b!XQg)VPVItdJkbnEEfjV#?yo76)$j|c#VBv*{0c6&e*d1 zV?0Rgp1mnKnmrYf`LHn07w}s%h;~^kAhi*2-Xw4Mk{Jg<;2j*j>dCeBlJbF5W4~F9 z(Ze|;n3_`ocq9NMWbi)zs0p^j&03M*TO5xV+3vt%6k8%%9Pk$tU1!5VqBJe|t_|S> z)eLFOwpw1Y{98&ZO*X4*3TIT0W z@DS|J!b173r{4M&UwH>xr$Lek?Dl*&EYyudm*`(C@Yg^b_)R5C$4#VQn~1YL{J}}q z(Awp+5(Cd7`hq7Wnt=r@4Xn(5kNFVQ==?B>JWPLuLy7pxHU?kBKJ~l91O!->;b(0P z1*;9lSm?2kEQ7YIr$Fdb1`Cul;qSsS22DH6KChfS1s1--QC~fvz!H9ukG`1xoC}dE zKRm;4a=`g(hP)_`BW|sdL=eMYesJhM$zu!Se;8O4641^|I_VAgQ3v4{POPZRT*r07 zRdT+oLKrIXRr!s#YP!qp69lR=w7MHrub8-OLV#wF6v+~k0-(sVTi!`}Awzbn^lBUC z%)OE*vBV6_pjz^#@vTx`#~69is%Mg38?*KFKs3Wo;Nl)E(Ek`cAOR5Bk=J(| z5a01S6;XJZPU3?Fs-j=w)Qz!26U-VbYzMp`BxLD=odMo9tIwQ&{^f%E5A*&Q;uafq z-goXjX$TX8EZsMciJgUd3Tx5a3c=BX`p|g@Z&OT7z-1|z%7FF0gRuNh?%y9;{Pe~= zD8n&B^+Fuvxe(5?u3=TK8^*;1GUUTvB7h-Y2g;*$;@#YJ$LLVkBS^)L-oFsWK@K*7 zvwG()p(#T4n*wPwF{sAg@x_B(Qr(v)6%_#KCDd{tfpVZ_! zKt<4}wZ89(D;0#G6g{?)OFsg%lR})gk*OgdD|ML0{3D5hu43rbGqnTdKnNXtRIVPW+EAC zfAZ%s<*upG*uT&JJhSx|bQD~~YOK5Nsl-fqtx+c&LPi`XD23T}Hxlm2+~Rg?weUj-b6Ldn{yEME8stgPR9Qa5G3_N*oAmX8KgJ;*^jO8=`vkCE^U8-#yJ!Hg?8-1}h`XO$V8)r{%rO zCCfb2AV~|}{V{hlD1OcLViBgqtap2MnP_DC75NNgB9~-W?;If@V!9ukK25JeKRp_J z#Lxi|BVPd8YguqGs3G!djRmN*FqT*lG+?4zSv0(3%aI4Zu$!%)uMf!3yWVGRu9i>8 z@>ttO%U5OB@(aPRFktX{co5prZ^sIY4_sE<3-P%RW?)NW&l>MU>a*Ed(QR&3t&j(GV5$s;l&LnTkJ^=Z+P45ysn-hSHUZ7t3x&&5-}KVF#qESn(wM zlBNt8X3emwnOBo6&rdy`;06(9!c*v?Alf(n!%%X_E*AJ&F0ochgHbTyXdWak(sE#y zaloGZS-*N)6Bw)&#U4%UYVbaPis5s#6!t*k?i?3yL2DskokQ|oTi%bRmy_{XzZ7n* zS*HSHSn+ZZppOc=NC!UusDlXVj2S-9AvC3a#Px3~B)j2Js_M`(4wKj$}utwS4CbFIF)ZYxA=4*BbBf{GtJuI`q5YPcS6VLT_<--T~^iK!!Q0) z&l`<+C8_5ubSNM*EqI|8_KYPOj1yY4<+M0FGd{AWZ?&kt<(u33Z04<-g1kGa_05Y! zUJb=4N1)bHpUdI{xuZtmH=`zt1DZmIw=|{7(Snw5=>m zIFfyn0_+?EV?SY!eZ&9_p93P5pC$i$?k~Z9AMKVLnHgFP_+F_m^zz`Vm~N{&pj2=| zwIX%ZG>?8aO}1vz0F-$J)kHVF#juxk#jsq0UKT0GT(6q?g0PT(A2E~AM76vI)Nvw% z19u9OY34_Nt`rzWez;PAugVEyIwvw<3BDNOi{USQ)g9%h{g_u-_I@PG`nN6GDJQR- zgsk`?_uTZ6!lf@K#c&+d=HrAQjn|(Gkf<A&p~!Ad=pt8j7>!3Yg_R-RH0b z^)cN-`uO9Cw#$2?7o}obxF{A3s}rkY7A&;)cTXJt(uqGPG)|@Nz3-h8piLvvji^W^ zOq`SSgKf-x+>bgV2fwG@9xoeZVW#qeuk}pJn4a|JCin|4J~nqPiv(0kBaZ_7m=4-E zD8;)OAK@z2wr+>%Ls7w+HsxD4Q6_)yZW44=&Jwmb^z45g=wwSKL?0Hx%eYAYVLI*F z-+DMT4}TUu@$=5H`i=UH1B80BcsK&F!tAlN3wQQeN!$W-m*w}}@j)F*f6NV|E!(UJ zW_N$(gT%1?w`QhGFJ$EJM^)ZS6&n9oPYIfJy!l{Hw^yAQAv=wLFX&Fb?*-OJHv_ga?H4O9nJC`smTkLYVbT+Wq9f@0dmRIl(saq!71N z7w+N-x8o3g6oFZ!Q-A%BMg;_o4Ye0@HMC&VpLU|`ykjBg?vxv3+8{&Bb=A;xK3Q2EMH`LFJS|d z4T(U@*4aVq4fM~cM-=bmZ3*^=HM{logs7WHME_4z~R%VC?MKOUj%PEYF`6rLdhfMUof*| zdr}*DO5V3A)z1&BdOdi_(FoqIaZ(xCNmfA7osZV=SN*>IklWp)6Ho ztO|>_e&?ho$9tTdoIv95Y}y0r07Aob0~px3EqdTQiz#z(J+sSl7) zO!6>**+pu71IYmlyEVY9GDJoJ|(iBBAYdud&>lS7PrcfTOt*b zJqO1YAC~Im;4u|In?rY5=EEcbqlgod^Y=Ep5g6aSfQizhCHaonr=V=W-g)QrXm=b`E%V&iUS&x4_JR-qFQ*vE)Q z<%yRq6=Wf`=Bgdf3V3Mpj!1|mh|<@n0}thd9riv^?jj!f@@Qh2u#C?xfrcRJW5|wnO5J}~HZ)-JXq7`>^^6RqMyLQU#u5JRD z@ydYqNKPO5In9q>W8+j*S6U)D1vr>5ocxCjCMc(wAT(ls5LPFmx5rgW!QxDZdh7pH z41S>cGLBYQURQ*uNa^8uS}Qr=PrYicm-w92`NTTrqNw=$z?k1t``0@dD@^+sXlhw? zS{S--6`_|n{R()F+P>LVN^FENHg}0cJ{s9A5Hp>c097q|RnDr9Cbu0geG5zT$B&a8 z3RV{&-eCv$_4*ZELy*S(=2V~bh@8UL!xztd{+Xu3ZlKy?p>d-peMXicJh1ovr>I^v=&vJ_$o>1sS=exO_l70VxIZ-q=YKZ( z!}kp|zjc&~*;srfNMC>=UZ}JI)Zkfep6|$8aJ-VFe9vqZXU|2HCA50qrIoy@K+V;B zTQ{Th$@2!*fQLIDNoYg46ofc#LWH5u{cKT|4NSh&H&EagT z0%~zC8&}nHx}HE1R`M`n28N;{r2r7+wYR)Y2WzQa-#5_}9wKB>yTma7Up~o9(tX>l zp}Z(mJ|4|ed4hRbV{K_V)j~yg#6V%) z9?`bC)>avyrtnU;4pBg{m=#1zW~%tLwStTB%^&rIwNtB_{C=wBpm%9)A>-@Hxfp{% zn+~E?omE#No7lhC&p5I|fYSTKaV^R{yAYyb!a#IzYMv88nQ@Lahybl z(P|FAZC$V4WDs8urTA8lkHEnxJV5&?#rpokk6|ISrMZ{p}#tq9rMxwBj@it zZw2iRV#rald~bO8)+YFGmx#loY|e#LjcMLEiuRb6d0S0$F{JbHcL@B^{^EIK@2PJj`eK*A};^)Na8R@GV)1v39EI{moI0J}a@L?3aWt=i$by zN$mDV-Nw=S7(E>b0LfiGRRSa2=QA8Hy}z7(${LBlG&l044R>owTdY6gS04i?9**yw`G%7@L^C0|X>b^W+;v1nqS~`U zN*|~_YIlFkv=TnS`dPTjT|1CL4B4!pF}T_1IF|0q0 z5x`;iOch0P?~O$q%k=TuE$=8pQ?;<-U`v>6szcvj{%X3X*dtnd^k~JjW5B4s63VeR zOOY%vAxk7(Rp4s9C=AR7kOV5v*W@HCF<1#`4ez1lghqS^H#YiU|MmJwU9uw`AkR`F zaipGe$v{8{hn~d8ve}6|Whl%Pc3@`zPFm)`Ev{=FEZr14*Ei`l4>CqmuG=$iH)h-U}3QiyxaYj`Au8U#W&^$62lc_P7n?3ExYp&v6=ax$7Q`x9*I5X6Gh8WhcFS%sDm~RGMB8xK7Gw01S z&OgU~^MWa$@-~KVcA1@VW`mKH%7rRXGL!&IsYsii8h;+ZtkQ3T zy8O46Ztw9S^37m*%$>gXl_AVp?eAPJWVV$<&fk2pcAefXx%6qmRe$Hd+mhsza^Eke z`4L1GoMq%MLkLl#a=FLp!XxYx0=8-85__%5IBOjX$hF>?WH3xu5jh>O?sEu#NSpe+ zo=svEQvcxIe~T|#MJwB)Mm?rj?uE<(b!mb@fvBWDgba1m{716KDMS?Ku2j|H*BK{S z#NVtqMO@Kc{(bBNLSU0}=N~ps;rfVerw|ptOSC*&eYpX$Z)wf});qps zk7)1Z`BY^~_VMhiS6tU8bFE)0%?==+-2n^a;b3q}j^zy-#XESkZ?*qSm9Lq_gTV18 z24}li;U{Sd`l*8FlG!WoK7%|DH9|)EC*C@Bk?l#mc07d1jl!?L^1q+g5M+$6ONOC_ z?(JW)O^Jw!C!eNx4*_P2xnNEboM3 zjoA?mE8+uFWe-nEDsKydTbTv7^357t8=V&OK2H$M+RHTEzX5sNIML zhN0}Hvu5GYA;{40f`{6|NTIICLs}Urw;zRtoO&%T6MWZs)BqSYh2unZvSssha6;#m z^<66Vl|f49cZnMO$1>3X8 zR9sbL!&yO*tU(61@tr^RST^mjjA|q*$6j+;i0s1M%jV1JP)Bt8pc@|Ql;PUY7#QGi zyucL3e?R2-#TBD1h3_@=k%H(lDAejAI~GJ_OKCFcG7~RZ-E)U=3|6onS>|31T`fBx zk!BKuZ|;gmt&Tq7f~zQ%>88vfEEIT5k#&Mgdt-JdAug0!7b;8o^|4)}`ZnOV3u4%x zE$3w?yDZkfCgcVAfdusH{>UzcH|*j%VP{QHX@dw1wNaL#3E30$5L3|y-U?@v)aE*! zuFk97GZ~xM`6M;F;3wvyW@ZN)$Ry{$h7P&XY5XcF&ff)aDt29MZWXWR1V`V%E2-E zfLXhu6c>szthVZsN~rxu3r><-VT{`uSnyGhInYN0M&2^B6-ptc9|y#F3~~WYZD&lh z@8<9E>uQQ7@jB}71VlD$u%jNb6ERMYmn||au>`N=%(^7KP|w-p}wXRDW{pB??s z_hFw1i@(w=rMYXNsrVNuWHbLRcA6^1_|Sufp8nfm+z~aX^?7zYD-OO&uw?8%&%P|` zpzYt3Y^U94la?D}ScKCrFg@dr=KFY{PSS^AERXl4a0|&fJOBX4A_HQDN77WvUtjIj z0Q+AK4U2sKsbA7&qMjTBGmmRJg0^g}t%02vRL=nGf?@j;dUDd5ztlb0@w~?7_t23G zwqI6so$*P~9Dd@}mldw>2S6D;$T)BxCC4S*4|ds?3C!lT-h7~>l3IEutOR|+RLN~Y z<}3--Vvs!O+!s+WJA0CSBIu!1jG&|m{Hge2=cXo-S?ISfQ>AjT-ek<}=!Kw8+ZxeE z1bSzII*iD-ChmN+zr3vbW#A|_di;zvk`Tw&muPrQ?tVPSWE@#?CH4+1lzLv1pjLl% z_j|Yy;$W<(wrO_dl)bcF3P9aTLp~As_IJzgRu~lJeoS{3(iu1bcil?3{}=C|&Vn=+ zy_Pe-(rt|lsgQT?$^#aY%H2D+3fX8M^U!yu$YOaU`R>gIq!{L>X>xqY`G!z>=Sab6 z;&=CndUD@weS-;n_)Oa`_BAO=-Ujds%qhi=V*tPHNag&SDC|NiN64pcJAe|UBwtZ< zH+yFaE5qMWX@ce+Jv?|Bf*al@Y>9ZLjoaxK%>o+v_=y0>8I%>>L-;P{2 zAo%w`TjoY*1sut{VmaP5UD z1~SjbhVCsvVzm|CZ^-OM|5Fg#iKjcaeC;k)^>8--R{6K+50|WV3qzfh1+V3)cEk`% zT?wC)U_d|dW{zd~^dbJDGjyd>Tl9+T0f!Aay2_$DgNNt+soIcbt(|)?zbLJ3qxH~j zj&3s=SLb!)KLVREDvPc*0pKb1K4Lmrn?OUpmqjOc0 z2(k3Y%wT!&k_F}qQ0pTZke)=GrNzc2Q&IIS(^w%f>4T!dsq|Ln*mTy$Kw`2H=HCv^ zw>zE!_7gqJJ(hQ%jV1E?H8$WUI?70RieqbHIQbtuQUCuEaI{bRKMw1c@f6bin!w(F zfP!bM`N$A07JNAh%imOhH{8U{yU`-FRE%`-fve(C7{X40D%|yDPA!84tLMp(5~}?k z+b{Hmz_+y_+UNEl?i_ void: - player_free = false animation_player.play("transition") func transition_end() -> void: animation_player.play_backwards("transition") - await animation_player.animation_finished - player_free = true func run_event(event: Events, player_postion: Vector2 = Vector2.ZERO): current_event = event @@ -24,9 +21,9 @@ func run_event(event: Events, player_postion: Vector2 = Vector2.ZERO): player.position = player_postion match event: Events.PUMPKIN_CARVE: + player_free = false get_tree().change_scene_to_file("uid://ccfdsdgaon63m") # scenes/levels/home.tscn - await get_tree().scene_changed - player.animated_sprite.animation = "sit" # should be replaced with chair interaction trigger + transition_end() func transition_scene_file(scene: String) -> void: diff --git a/scripts/autoloads/windowman.gd b/scripts/autoloads/windowman.gd index 67e2648..ad6582c 100644 --- a/scripts/autoloads/windowman.gd +++ b/scripts/autoloads/windowman.gd @@ -16,12 +16,6 @@ func _notification(what: int) -> void: if what == Window.NOTIFICATION_APPLICATION_FOCUS_OUT: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE -func _unhandled_input(event: InputEvent) -> void: - if event is InputEventMouse: - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - elif !event.is_action("escape"): - Input.mouse_mode = Input.MOUSE_MODE_HIDDEN - func toggle_fullscreen() -> void: if config.fullscreen: if OS.get_name() == "Windows": diff --git a/scripts/interactables/chair.gd b/scripts/interactables/chair.gd index b1dd0b0..b5c0157 100644 --- a/scripts/interactables/chair.gd +++ b/scripts/interactables/chair.gd @@ -44,7 +44,7 @@ func _on_interacted(p_player: Player) -> void: func _process(_delta: float) -> void: - if player: + if !Engine.is_editor_hint() && EventManager.player_free && player: move_input = Input.get_vector("move_left","move_right","move_up","move_down") if move_input.length() == 0: input_released = true diff --git a/scripts/menus/pumpkin_carve.gd b/scripts/menus/pumpkin_carve.gd new file mode 100644 index 0000000..8f12dc9 --- /dev/null +++ b/scripts/menus/pumpkin_carve.gd @@ -0,0 +1,74 @@ +extends Control + +var image: Image +var dtexture: TextureRect +var bgtexture: TextureRect + +var drawing: bool = false +var erasing: bool = false +var undo_stack: Array[Image] = [] +var bgimage: Image + +func _ready() -> void: + image = Image.create_empty(32, 32, false, Image.FORMAT_RGBA8) + dtexture = $DrawTexture + bgtexture = $Background + bgimage = bgtexture.texture.get_image() + update_texture() + +func update_texture() -> void: + var texture: ImageTexture = ImageTexture.create_from_image(image) + dtexture.texture = texture + +func push_undo_state() -> void: + var copy: Image = image.duplicate() + undo_stack.append(copy) + if undo_stack.size() > 20: + undo_stack.pop_front() + +func pixel(pposition: Vector2i, color: Color) -> void: + if pposition.x >= 0 and pposition.x < image.get_width() and pposition.y >= 0 and pposition.y < image.get_height(): + var bgcol: Color = bgimage.get_pixel(pposition.x, pposition.y) + if bgcol.a > 0.01: + image.set_pixel(pposition.x, pposition.y, color) + +func draw_at_mouse() -> void: + var lpos: Vector2 = dtexture.get_local_mouse_position() + var tex_size: Vector2 = Vector2(image.get_width(), image.get_height()) + var dscale: Vector2 = dtexture.get_size() / tex_size + var pixel_pos: Vector2i = (lpos / dscale).floor() + var color: Color = Color.BLACK if not erasing else Color(0, 0, 0, 0) + pixel(pixel_pos, color) + update_texture() + +func _input(event: InputEvent) -> void: + if event is InputEventKey and event.pressed and not event.is_echo(): + if event.keycode == KEY_Z and Input.is_key_pressed(KEY_CTRL): + undo() + return + + if event is InputEventMouseButton and not event.is_echo(): + if event.button_index == MOUSE_BUTTON_LEFT: + if event.pressed: + push_undo_state() + drawing = true + erasing = false + draw_at_mouse() + else: + drawing = false + elif event.button_index == MOUSE_BUTTON_RIGHT: + if event.pressed: + push_undo_state() + erasing = true + drawing = true + draw_at_mouse() + else: + erasing = false + drawing = false + elif event is InputEventMouseMotion and drawing: + draw_at_mouse() + +func undo() -> void: + if undo_stack.size() > 0: + image = undo_stack.pop_back() + update_texture() diff --git a/scripts/menus/pumpkin_carve.gd.uid b/scripts/menus/pumpkin_carve.gd.uid new file mode 100644 index 0000000..c4d8f47 --- /dev/null +++ b/scripts/menus/pumpkin_carve.gd.uid @@ -0,0 +1 @@ +uid://b5c8ov4lhocb8 diff --git a/scripts/player.gd b/scripts/player.gd index d355706..28f6f55 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -35,12 +35,12 @@ func _ready() -> void: ) func _process(_delta: float) -> void: - if Input.is_action_just_pressed("interact") && raycast.is_colliding() && raycast.get_collider() is Interactable: + if EventManager.player_free && !EventManager.animation_player.is_playing() && Input.is_action_just_pressed("interact") && raycast.is_colliding() && raycast.get_collider() is Interactable: var interactable: Interactable = raycast.get_collider() interactable.interact(self) func _physics_process(delta: float) -> void: - if !STILL_POSITIONS.has(animated_sprite.animation) && EventManager.player_free: + if !STILL_POSITIONS.has(animated_sprite.animation) && EventManager.player_free && !EventManager.animation_player.is_playing(): var input := Input.get_vector("move_left", "move_right", "move_up", "move_down").normalized() var raycast_input := Vector2.ZERO @@ -68,3 +68,9 @@ func _physics_process(delta: float) -> void: animated_sprite.animation = "down" else: animated_sprite.stop() + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouse: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + elif !event.is_action("escape"): + Input.mouse_mode = Input.MOUSE_MODE_HIDDEN