From dbafefd660f7317c192eb565002d1b67831dec0b Mon Sep 17 00:00:00 2001 From: cojoedmo Date: Sat, 4 Jul 2026 03:04:56 -0400 Subject: [PATCH] still working out movement --- Art/star.png | Bin 0 -> 14604 bytes Art/star.png.import | 40 +++++++++++++++++++++++++++++++++ HoverableNode.cs | 4 ++++ Map.cs | 17 +++++++------- MapCell.cs | 7 ++++++ Peg.cs | 33 +++++++++------------------ PegController.cs | 28 +++++++++++++++-------- Pegs/Actions/BasicMovement.cs | 14 ++++++------ Pegs/Actions/ThrustSpear.cs | 5 ++++- Pegs/Actions/thrust_spear.tscn | 1 + Pegs/FriendlyPegs/Spearman.cs | 3 +-- Pegs/HostilePegs/infantry.tscn | 2 +- PlayArea.cs | 35 +++++++++++++++-------------- map_cell.tscn | 10 ++++++++- play_area.tscn | 3 ++- project.godot | 5 +++++ 16 files changed, 136 insertions(+), 71 deletions(-) create mode 100644 Art/star.png create mode 100644 Art/star.png.import diff --git a/Art/star.png b/Art/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b112c3b0af431492903643b76ae2baecabb39278 GIT binary patch literal 14604 zcmYLw2{@Gd_xOx4GqR>aF+;^D*;10Rwpbb@QIRbrYKX=dk|l$R5^9trk}bJ1lqI`y zTQmvHSVNgYmXJ#2TJk@ydw<{meV%U5yzhI?=X}n-b;ZusQbJT-6oo=bQ1+SGqfkOl z@W(&|2T$gm^%CGO;lMqVLn82BxX8&k_`QO*?`R+jMd(NVpyiHC?1zWz80Jn4hqK;{ zbI0jksB`DeX;J-s13iz^ytK~JPu-m|l82AhARir~GR}CRP9CTGu0L@m$ZLHd<2aq4 z>7I&0tw&MJb{`5!pL~D5((7=<$kI6-t+#nkZc@x}0g9;I!qO|Tgk8es3DE&4%XF-H zGGo)2cv^0bUp3|K#pe$x9kcP2GpqgfUn}K3?~!j>+qC)Wliewt6MxMu2K=?}VEFI=iL0X(H|V>a~2F)O7A^lHfA4x zo3TPj5JQCGoS1?9{KY7r6zNx}bbv3MB^^stBpT1#d?@}k<{IF2deE3H0aES+HyhhIdTjn{O?G=%Y zlxD9+AjMMiTX|EP@gse*? zvKo|#ApW)sFLknV-Jbv*8SIL%t?ypd8^fErlYqstIpTw0x0_$A-%^tbwI0DR+99*> zsL+WO+7wMHaIEhAh5O~+Xbo?cADnfs`#ZDY>q}!7R)+$DKk)Mw_rWbGx$chve*(Lr z4>Mou|2g{q1iFr?-iGU;Ox&(d9ueD=1pLX7rGUh8A3 zo&8zlnlJu&gwp?Clt(!YkjkDqq5MCH;K9~XT8Inmp6 zo6QAs2wK59PNG9)tFoTr&-Ik7=+8Q75 z!Lz3K0Xg_)t_)oIDx>ilI}9&)zRt~sRnZ(xQsY1K4)JTc$od;@b7|DaaLudjwJ+AW z`PDa3L_gk5%H3R?_U-3yoZ_~@uzh?MP@0{-EjCPF_2!ztqe;}M>Rw5qDg9U%E#Z207&Lh+c6L^TAy6PAU0>}4$&yR&nU?0U*LD5j@Y3Kj z3?>N}sOtc~wu6+!-!=vGQ{DV(%-|Du3*A|XXvUwdgfEY{%Md*be+end6Zi1-5stmi$-!vE zfGKWAt{UX#cMkpQTI*x+Qx^E^y0*x1w1W($SGBKW-wotyh}+OehpS6N@Dxq)hgU>T$G&|Mr5wF4qJ84#S%Zves}K*$r#5uJ(OH$6dT zt^f$(@`Cr~f@7`mk|h>~TOVQUNk3D8)G~rB(L)p=RTN0w@x>=>Rfz*5QBD7GpPpu80CPlr~5(;`|r>^Vna`XF*s+Z63ynI1?!hv3`W)PSAF#s;( z1kJ%LwOzWJ$H;s{~bDHFTEYzsxu5g09 zr;?OET~4qY1So+B&_{zmdgjKT8mqKbfJJ7^r-qn(E5jT#pzH)(ME$3zhZ`e~Tpi}v zw}=of3t!y|wPG+)>=Xa`60a{leKPtg29_uU0T_kz6}b|p!N&cPlRk#}z@m>}@6K0F znc+o-z@>U23`=2G1aTsA0)@fkbs#{sqnr8mXV96wqho=za{v5!Q~XjbE)L*IapD59Hfrc&Je z@aTcKR-Wf=OxW#o|ErQ43nCF=?2rSvDnp@7$e{;-3YQ-}qbLmGkXRtZ>RarJI;N7v z$Xe!C^!)AgaOGPJF*wip^(7t}cfwTA2txdc2+_Xvs^r%7pgHfa!Y|D;;jJIgJTmTi zG->PzaG+ww9uXqC%Ehq{140~^1CDEE5Q!d4*B2~?7@WKlgt)HKl97l8iBx0ZeT%Ww zfZUP6KM+O{@|5atSoQXA&%ubNg7Nx;$11Cux5TgA3ZLGEJEPxr21_FLgf{%E(60fJ zMk7cgc?7%rp%J%*5iGbJ$yx=b1U~dMB(hk1-CE^2} zw}aa30~l$5LHB4H#CA<&K|TrzM_Dky5VYbX?-%r-LtKG;U$DfNA1{ug(&Pb3WVYlK zRRB30)*o6K}Ul(LHr1{&d|I1LgytQ-U%exC?F}F`x`2j)O&DM&j(` zOV|}LQISclSp_whxvA4>qw85mnq)MnJp`%5_NmHkY7%L{(26Dt{M$ER54bnLP&);w z+=b%|$(A>_IPRo;h3uGp&Sb}u+>fDN3{*=8kr@lRR%QTXSAz4qe+P6;;wA_ltj}M} z75gZ@HTzDrc+by12mg=OzPq=nfa4QZdkM^Up($E@&+f`iJVPAoMv9x_^s|MnQv->!Cinp#Wi~ zW=k~bXE$Vo4}XKM7!SwUjc2hd-bZB$feAkBz90-4>vGQHLdRN<=gS?h;{TdlVWbOm zy7Yl7F;m@yIg9ca?mD|L^7HPZugidoRDap??uy@a3OkqDNclgvFP&AFXlet^@-R}I zr7=V#4mkE1s7BuCJ3iP@Jd-)HSp6!jcqVA6Vl{22;Djnk-Nv!c>O#0nU`t;8)8THt zN7G?_bG<18eZ9XOzt?FtG+a4rASADYqXslOCit!?Zng2b{0ijaQy^863siArPj8Y z&f|Bj72ECT)%8ORA(}~YuquU>d*vxQ*00F5@yL-9z3$FnRPwt|Zuxijvs9>dY$10$ z`dsqlqTtB^`d6QMjNs@j&z8a}3o*eOl@HCd3@=Q>8*Oq1K3&|k?zIOHvbR)mRz^@c zoTBd3DB7i}ka^?RISx-fGz;!k5-z6?_quVbp7x?`qXyZ{fo^~cAtyT&kSMH|pWSR) zE1UzWq7Ogv@PlaYZ==Tn9G+-M~pVQT5-py98acietLBIK~O^{jTO;&p{bNih#bHKK_ z0YljFg^mq$YV3uKMAF9MvQ%ob1l(Hng0NBP(9DPP?`faao$lUDXKRp&q6-`SnYUFa zKfXoYIdd}8r7D`tUS`Q3&H(0I+I$O%!rxeVk6VB%)+V>qO0z}Kcp?Y{ymVwafx!<6SI$%t1}xR$Rp+ZZrpoO4goUUcK-BCM0P2>+C9!Z zbvymfMgx&I0m<_fz;12wd$|zJ+S=~dh%=3>57;IjpU@G zAO*kgM+DRLDe9wR%WVE7WPo=oUji_-DwO!~ zWE;IFzw2EaQU7YK?zD;E7eWo+wO@E)%XBj-|8Dj(jqdxRvf#d3IRipTajhFEEbnnc z4w;mnWPv|g@F7X$=^=V`)(~UW^chv9Hn6jg7a|*9!g>`t9%p@zMrE2!wFbM`6OIv_8qHzz#M<)!9mb@dwMlo(`b56KT4ZoKd>k>&3p`` zy!)4w*FegjWjIY&G0?!78s2Viud-!QOi}kPDF{fE@t8Ku0X1@jn!ziL1fOLcJkL?H zG5MuNVSTEV*7unh7M1l_26@kHz$YdGPx#SQ;vwGLv9sARZ<^UlS$y zc(FQo#VtrlPZV~?JW6U+rtmr8aa@bw=1vRHg)Ha=fp7RKgMi(uLCU z>#JVf`(cHVjzO#n#rS6sn4{@xVr~*a+TWZzM&aDq6%RMIZ(GozRSx@nac%5PL|S}G zXvLKXE)P@mJx6+I7~^_11tFtN_;lqQ)+GLSr@l1J8k&_Ogc zkiL3aofD}}{^wzp*AtH-JI6jr&M{OHauWYqgo1v}(9E~d^?N-Vo%7fg5Vp|4SCCiY zwU`k9UPIVpdqC4SwuomIuVxntj1?GemwwBBI~|82x& z?l-ZsiIUqGY>)lmf228hrZJ+2WqZCv4G3QVh2G0Z)hY4Vf6%cnkrM{ZiBmUJsCVk| z3um}vUvpxvUBUX|s(bI@T!khG$i4k$tp&BL_F>-cmoKAtC_`q5R>DjvBCil#do(oj zV068wS7RD97Y14q^z1=V&>mWuO|>szR_?BgevfVMkwZsnKos{TS289yUtLo zD;=Vn_=4ti+^7aC_tKBOf_0?)-{$zEYh)jhzxWtR&ANHyFTa|8YV*3&i?>_$3RWHL zHsj72rs-zj2(^rjamUs^9vae~CzpC)$9-znhA1Lp+24IT^~}koaK?3WFNinL(43BB zBA3z?T~Y`+&mHR>T_67@x)TFw`nL0LT9+*^CWuS}))!~Tyo&Brck>&;oaIPNvvP0! z6DFWS2(`rXE@BH$LDq{h5uH#1Y#m`cQ4OdCZ!R^0v37Bj*pUN4uH-pfrny7+N$@S`akd?Z4Kp3%Ni1SA%OKl7_ucebbeM7@g=j(ll_~ zFgxaSAM%RT4*t`VDaO2;{bL{N?{IPbH}oCiY!4)<+`zG9M&y8eKYvyg+>Sa1O&z&O zNCzcA)B2dDIbd(zQ!bo$r2GSBc;0LMjfDHGb~1;`%%8F1hb*p3zHxuphw0jgWaHus zm}!n+Gb?wjfFovYd-jTCb|3$i%;)@TVi>_50~N!r2}PW{!PzOesv5 zIcQK(PpBY>6RC!j!xm5_$lpMEIfhZCi0-9Kh9QnMGEOpk?6F4zkhac7&+-8xRlm@k zGf}Xt#>$qg4~olW~Un4UWImN%?$=} zq*Dq5fIc*%+?dJzA^vqOK*{#t1QHyuk1sjTPDAx5mR;zFS1tY14m{!u&25;TVYSca z#GE#PR}Ts&xf~a!8<5D4o>dUsA>}s%&o96$DEVw{6y+nn0*$&Sy3xfN)G$ieWmCfmaDox$ zz!vg9VuyE@dLYfCV!V4axOJ*;Jq}5?+IYJ=Ol39v4mb`jh0FRDvW8Q>2wI8a8|?7k}?f9zc%mhyul3Mh5hv;p%Jj%)kL$! zQ;qy5LFJQp(7CPpSD}5Lz|qDu96{3WYnL0N^JKpG%)1GyD$(xz*@)GMH{*`3N4kMW z@(L$~Rb!Js=z)c{yvh`6(HuC=hjH2NveJyyk{~)$in_RcUAntN=bRN=v z-7p;rA&xrx=LYxPkpbW=^iru?z}$pQgeH^-=By*0#?#J%hLm*wYmzx1;pJb|y;|sd zSAZE3O_5v47d}4Y?bcP4)!6Um*vIA6MD>{gFD7S~kPLB_P*tIUQ**hOIVRwWuI9Yo##I8GfxtXeA7m= zDy9k%AC?Iqe%$E1599wo!sULby2vdRE{5Vy^92AwzYra=lNJg@*U_+uhSflc-glyr zzn)RPC_df9(E`?8`bUIj%N>IpC3i9)G9H&TG!yJ$DrkmRE$=O6(~{G z%mb)%39TEU_8Nh@I!SV43oGe0Z}e7rebZ2_2IZT7nJZNqxN`|A{s@nOQ39*-|GHV! z6xT-nDA-rbu+@0HF*6zZV5Oj&8$7<|g8@G?^LMJ34V{mst=DoGVU1=oCi}K~{imyWFuC#6#JEC=Jo9aws zt31iEMAsSI)QKwA+;}4A3U5R1Q82DIT3034Q|}U1`;@_1WpEY-0_9%*k;PP~`5|54 zmsLgQ9fYxv6FaxQW;L7-^V@`5gS)9~0q7twxrDWj2K3-N(j zV=;2QOe1W$KmMR4I!`B5rbG*Bf3HBBhr9r@hrBVLc~zPRLz2=QypDFN>7x8pM?lgR(lx;Q_|qfL)E>1i2C}#6q)%A$vPjQIl znmN09WR;@VA0Rv5kV}O-+PFsnxvv&s`o%l^j%J)*C=0qKP6qMBV(3A&J#qep*B( zH}&l?TX|g|JOpV0$C`~?*OfU3!)*%=+&E-iB0f(iz~*6NpxMJl@WGAK+~Pg*e9rVU_EIgX87xC{*G{xUjye{L(1MS(BpGHWO*~)L;-jJYYw_9BcQIb zcM6^4p-F#v=sXXta*3{#f&($)vI_l($=?LFh?6p?9h#{E+J1o~vqDr;)G5G&mB5h~ zKj1dwFb%GN_~G>LLqzmzNh@oU?MU`x(CCk`c=d|z3J*s$P&f& z5?6||iR0rALs^ZVJZreR{2G7*sf6Yi7NHSq)ZP4h3prv3h~x^ufU9grV8{TY4lpgv z2#m^sAje|;jfaXEg?-)b)kEK5$I%_b7^G@gl-W6k5^nl8p;aYTZCRB&kJ?*luu9 z_O`l{C^Tw~Kp3usDU&6li!c@6~O#Wj`tfuO^Sn@}d6cBm49Z1NyI)QD#C_HPz-Ghy|Xi&*P} z1Sy}eKM#ix8p5n2N{1La(;fo#9|?I;;2l;bipXRaPHtImIbx^1L-2^z9(Mc3Gw>&v z28@yKg96<{3aQstG$3ip3mJ_TNSAInvCGP|h32)Mx}u@oq(;sVGs0H-cyo0RePO~t z^6jU`9%_FV=3pM4(?c~JrB@&0QV(aYg6x>6PndmkD48k_4txrnDXex}5bD=5hz-pV zN&@XTAuopv6K8h_WNeOT=Spz?xb(GcYKc~NN-JbnJS%Y>GmQ}H@pT>+y$>ZScWjS9 zhvU^=&Bpl=FQnN8LJX^|Q-#L$abwzX?pP12-6qj_Gr3Mmf6c5wgI(MRE}0F-!iET2 z*dKyT)&=o&=uh&EAj7V}OmBhWDC2X$fuDSwKXoZE7S2$k>W4FpShI%xx+NGeF>4$s(vex&jn>#o5pccS< zB4Q7*QIPGnLLQqBBdyOMFf9$IG<;Lc;BN=PEUO*M+kK>PXhu_@FDSQpo&6Hlh`d{+ zv%I10+QcE|1fKRb!KUjMu70P?D9;eD#rAA6i1$8WTymDnwN#^e!-tq-o`C8W$pzqQ9a`{gBQCFM6vGu>U5cygZ}yXTJ@?F>VM77&D72=o4f||15YU=CXZ(za3%UXs&dE3cx-c+B++DrWBgYE7IbIef}(WA|$761mnOrek*4%d+%vj1xizGidp=5ij-di zWh;?*^2V+758?!LxR(Cal+USlunff4HQr#r^dB}5tRUs*Ti|(S+_6FqkMk9jqbR+j zGdOm1r956N<-v);CjRgE)-0FVEwtNEr9;z1^Hw@rom`j7-S;{NJ?AMWnECJ9;Z7c! zQMx~=rpl2!*2Ftr76jtONn(uz<)&a%TNc)2JplJx!*RvuR{QW67Gs? zih10HX|SUkKu2UhV{Orgm-O(>)AvR-#9;K;1yjCwvtn4l5$Fs-2>;~DW z;;O~bv5(Aou`99l$$I%@o#P2m(u2VkLO(97KWxW=ubat}r>dN7AQGabg#VBYnxpqY z0xj=UQYKsc{F}hYRm$k`(9Cw;?lr)vAi)OC7dSAk6g*@lc>GSN6wrh<8J-vU2R} zj;b*qS(_D!OZ;sXTm-&qZuA zq!blue*93_S*;kt8n!xUWjlaM#9oN!?yhjY(}zk*l+1#~FDl9X>R@B%tU*a6cdQK< z_4ro0Kjb$eMz~51gEm+z>3Blk*a5Alh;^nn%2p{bm)z)~yP-ygRp5ElSugsk+LRF= z)lAh|JrGcvjE1JQW1m*#ZyypHZCl}5Pz(+lrMRLNH=X>bc@QWA9j4a_FV$*vpNgsj z=PySz>rG*`&#~HzF-@3(#MbRAPeHD>bym!w`R6rQw<=Mb&11DolkzhyVsE5?;!y-! z1#Y~fIKg8D(`jYDxflA04c8>I zF8q*tkTQ5__LP^4$@7zgg~L`cFh^KTTQmJ)RKxgl{)%$9Kl~25(RPDf2i^h>>y+l0(1ma`_b_wXn`c zH=f>3+BD!)ZU@p5O2oLwC%t<&#Av$MD+}jsX^MF|{gv~Wl&@rgzp)W2iGM@BwN$!0 zJ@f!W{HgwbZjWuO{umg^c z#1RM?q*u^}|7{U#x1=#QYw7ZvAY1C{hq?gyROPT$Z~gzG{t8$bvIa+E4V^5FJI$aE3USrtoxWoDE=D4GerxhhO7pEUD^k8S zQ#nf8?9`ncL)0cqI2Gu-dFrwLVB=jTjGYxfTO6iN{{OJQ%@Xv;Zb^S*M-g~@2#5=9>p^$#niJ@k4&|>15=#^bg0^uc zP7%Jes9!-CyfR@AW$@}KQ}nNd)@>LfWTFYsDVBn0ZtZED_EE~p7VpB&)hFdk>AZ`c z-pM=aeIF&2B$@T6#A6Ji(E-o!!A9RGOE7vO(QMVt^b5l2xY}rL`^J~gb+Y_F$JxP- z;JgZr0V}g}k(_VPZH7);HS~&%Jl?nb;D7IC$83f@gWjQ6qbOh6>ggw} z_HQZb)JhPQ*AuCkbJ?Yj8Z(%&=CO9rhKHfu#%Dw+cU(WLAY6u}lr9*yx^c%|a0XM; zHFuannlGz?p8hn7Dx7iT)RXdyVa-z)?5e?=?%ibxxchR?Aoh!%)y+!n^Um9jnIu$>>(L6iH3{m-yfQ(fRnu; zz&dcp7DjnapE&Ko@#Va)2@os~s zT*05ecbK0G5kik7BUL4uJrDYv0k#%zH8{@Ef@#746}UCD^o1ewoL+5>{(%73(??c9g;N>p|6449%dF&M8x^!FG;+4=FZ< zKrWHELN0Yvl{QR`EKD6s*g}dBXQ4AoS%fVSNt(`eh|nJ|Cd@aLd7SBjg~`c7b4S@G zxCtuM_^t}3hZlAUGU1a(osZE^JT%#m*7p1zDu`ya2bfG*@U0-9l{69#F;3RRMSK%( zx){%u{um8&J=uLcvfi9DEu1^14)>E7cquctbNhKM4<*7e`rK)TNXzY_P&BxxJ&~_F z!&1Yo-a^U01qR1nAf?#s(lbb}uO$=ftK+tk$m9EeO%p6Jv5x+NB+J)uO|RSD2<-drbaVlP`L!Mdo#4|(Xo3!ioOaFj7P$@T*vxGLB)ldFlln} zM_qsv28z5}fwjddeuueZKR7oyO0EBNfn?(D_RB%Q4vT7fGZripa)>*&IE86z%N6iawh6=tN zOZ#Z7LVW<~33frJr2Crxw@Fre)b{F%(C0FbUVJNA=ROZrH#AuGLO4`HvM~J|7Xplm zJFc;d6d!wNf-}g8>T4D7cM7#_A!mFZ^jArMNj;vU9M!$`eCAy}Fb$6MMM*O$@EWN4TtFlr>}N9NL59buT?Y|{({uq%wa2j&#iP5?vTUf zuW6sWq$YgA-mWRmSA-E{|I4M-BWiAJbpGx1dnS2bU`h+3(jXg4hbYn}Z)$~g-DKz7 zgAWG^^BEc1=y_n+cKD2c9~`%^Q5<)$q3d;olQN7z8!R7v`w6LwJH7fWx8SbDdWt+$ zn{qG{7;qWPlZ2_z3DFxJ4ziD=f#CFV<3Ats5eF*v09HeA;064+V^y4FX6B=h_Usc0 zsaW5B_tMMV7esqtC+IQt(v4gsMlbTWEm#%yIqK1<)van8@m#Lqi3*NHYzj&{tuq=>K2Y0NKqsEasGD~l| zsO;4!UwkVOza)#4C&i^A$`nsW`rP{Drit1}tahnK!cDAit?kjzZSO_WUFf0Ll4@?` zmV?gXjO0T|v}fDg>7aqfOZVrA!2Q5$Q=|EC$CP)& zwwViT$*!)v=weHl`g)K&_))Yg4*tzYj7v&kr0}l_SBibZ{{`@YiDnR69M;!WF9F|; zF?FOHR71sfay^C5Uyj_U3zxX_6zaDoA_LnZm!yTwzfTdfCq*Lue+eIAf-lFzwd%myAy@9)*9Dh@zO=nz8qIME^f4 CC0;xL literal 0 HcmV?d00001 diff --git a/Art/star.png.import b/Art/star.png.import new file mode 100644 index 0000000..fbf968b --- /dev/null +++ b/Art/star.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5jj7yhlnodxt" +path="res://.godot/imported/star.png-7953868fbd7392e6e06ff69587708912.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/star.png" +dest_files=["res://.godot/imported/star.png-7953868fbd7392e6e06ff69587708912.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/HoverableNode.cs b/HoverableNode.cs index f663ac2..e60fe53 100644 --- a/HoverableNode.cs +++ b/HoverableNode.cs @@ -31,6 +31,10 @@ public partial class HoverableNode : Node2D { EmitSignal(SignalName.Click, this, 2); } + if (Input.IsActionJustPressed("middleClick")) + { + EmitSignal(SignalName.Click, this, 1); + } } } diff --git a/Map.cs b/Map.cs index 9e5d45d..46d26e0 100644 --- a/Map.cs +++ b/Map.cs @@ -72,6 +72,7 @@ public partial class Map : TileMapLayer public override void _Ready() { base._Ready(); + // GD.Print(GlobalPosition); List usedCells = [.. GetUsedCells()]; _cellSize = TileSet.TileSize; for (int i = 0; i < usedCells.Count; i++) @@ -79,7 +80,8 @@ public partial class Map : TileMapLayer MapCell newMapCell = _mapCellScene.Instantiate(); Vector2I usedCell = usedCells[i]; newMapCell._address = usedCell; - newMapCell.GlobalPosition = GetCellPositionFromAddress(newMapCell._address); + newMapCell.GlobalPosition = newMapCell._address * _cellSize + _cellSize / 2; + // GD.Print(GlobalPosition, newMapCell.GlobalPosition); newMapCell._occupant = null; _cells[usedCell] = newMapCell; AddChild(newMapCell); @@ -110,14 +112,10 @@ public partial class Map : TileMapLayer } return new Vector2I((int)Math.Floor(POSITION.X / _cellSize.X), (int)Math.Floor(POSITION.Y / _cellSize.Y)); } - public Vector2 GetCellPosition(MapCell CELL) - { - return CELL.GlobalPosition; - } - public Vector2 GetCellPositionFromAddress(Vector2I CELL_ADDRESS) + public int GetCellDisposition(Vector2I ADDRESS) { - return GlobalPosition + CELL_ADDRESS * _cellSize + _cellSize / 2; + return (int)GetCellTileData(ADDRESS).GetCustomData("disposition"); } public MapCellOccupant GetOccupant(Vector2I CELL_TO_CHECK) @@ -157,11 +155,12 @@ public partial class Map : TileMapLayer { if (PEG != null) { - if (PEG._address != -Vector2I.One) + if (PEG._cell != null) { - CELL._occupant = null; + PEG._cell._occupant = null; SetCellSolid(_cells[PEG._address]); } + PEG._cell = CELL; PEG._address = CELL._address; } CELL._occupant = PEG; diff --git a/MapCell.cs b/MapCell.cs index b25d5da..2713553 100644 --- a/MapCell.cs +++ b/MapCell.cs @@ -5,4 +5,11 @@ public partial class MapCell : Node2D { public Vector2I _address; public MapCellOccupant _occupant; + + public override void _Ready() + { + base._Ready(); + } + } + diff --git a/Peg.cs b/Peg.cs index 675b87b..a578f22 100644 --- a/Peg.cs +++ b/Peg.cs @@ -1,6 +1,7 @@ using Godot; using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; public partial class Peg : MapCellOccupant @@ -8,7 +9,7 @@ public partial class Peg : MapCellOccupant [Signal] public delegate void DeathEventHandler(Peg THIS); public int _id, _health = 2, _healthMax = 2, _stamina, _staminaRemaining, _movement = 0, _visibility; - public List _path = new(); + public List _path = new(); public PegController _pegController; public Map _map; public List _actions; @@ -45,28 +46,15 @@ public partial class Peg : MapCellOccupant } - public virtual List GetBestPath(bool PARTIAL = false) + public virtual List GetBestPath(bool PARTIAL = false) { - // Map map = _pegController._playArea._map; - // List goals = Target(); - - // for (int i = 0; i < goals.Count; i++) - // { - // List path = map.GetPath(_address, goals[i], false, PARTIAL); - // if (path.Count > 0) - // { - // return path; - // } - - // } MapCell goal = Goal(); - return _pegController._playArea._map.GetPath(_address, goal._address, false, PARTIAL); + return [.. _map.GetPath(_address, goal._address, false, PARTIAL).Select(a => _map._cells[a])]; } public virtual Dictionary GetEnemies() { - Map map = _pegController._playArea._map; - return map._cells.Where(c => (int)c.Value._occupant._disposition == -(int)_disposition).ToDictionary(); + return _map._cells.Where(c => (int)(c.Value._occupant?._disposition ?? Disposition.NONE) == -(int)_disposition).ToDictionary(); } public virtual Dictionary GetVisibleCells() @@ -83,17 +71,16 @@ public partial class Peg : MapCellOccupant return enemies.Keys.Intersect(visible.Keys).ToDictionary(e => e, e => enemies[e]); } - public Vector2 GetPositionFromAddress() - { - return _pegController._playArea._map.GetCellPositionFromAddress(_address); - } - public virtual MapCell Goal() { Map map = _pegController._playArea._map; Dictionary visible = GetVisibleCells(); Dictionary unoccupied = visible.Where(c => !map._astar.IsPointSolid(c.Key)).ToDictionary(); - Dictionary closest = unoccupied.OrderByDescending(c => c.Value._address.Y * (int)_disposition).ThenByDescending(c => Math.Abs(c.Value._address.X - _address.X)).ToDictionary(); + Dictionary enemyTerritory = map._cells.Where(c => _map.GetCellDisposition(c.Value._address) == -(int)_disposition).ToDictionary(); + Dictionary closest = enemyTerritory.OrderByDescending(c => c.Value._address.Y).ThenByDescending(c => Math.Abs(c.Value._address.X - _address.X)).ToDictionary(); + + // Dictionary closest = unoccupied.OrderByDescending(c => c.Value._address.Y * -(int)_disposition).ThenByDescending(c => Math.Abs(c.Value._address.X - _address.X)).ToDictionary(); + // Dictionary closest = furthest.Where(c => _map.GetCellDisposition(c.Value._address) == -(int)_disposition).ToDictionary(); return closest.ElementAt(0).Value; } diff --git a/PegController.cs b/PegController.cs index dbeb2ad..955f1d5 100644 --- a/PegController.cs +++ b/PegController.cs @@ -153,13 +153,7 @@ public partial class PegController : TurnController } if (CLICK_TYPE == 0) { - List newPath = peg.GetBestPath(); - - // pathLayer.GetUsedCells().ToList().ForEach(c => pathLayer.SetCell(c,0,Vector2I.Down*4)); - // for (int i = 0; i < newPath.Count; i++) - // { - // pathLayer.SetCell(newPath[i],0,Vector2I.One); - // } + Map map = _playArea._map; TileMapLayer pathLayer = _playArea.GetNode("PathLayer"); List pl = [.. pathLayer.GetUsedCells()]; @@ -172,10 +166,22 @@ public partial class PegController : TurnController } } + else if (CLICK_TYPE == 1) + { + TileMapLayer pathLayer = _playArea.GetNode("PathLayer"); + List newPath = peg.GetBestPath(true); + + pathLayer.GetUsedCells().ToList().ForEach(c => pathLayer.SetCell(c,0,Vector2I.Down + Vector2I.Right*4)); + for (int i = 0; i < newPath.Count; i++) + { + pathLayer.SetCell(newPath[i]._address,0,Vector2I.One); + } + } else if (CLICK_TYPE == 2) { HandlePegRemoval(peg); } + } public void HandlePegRemoval(Peg PEG_TO_REMOVE) @@ -201,6 +207,7 @@ public partial class PegController : TurnController List fPositions = [.. positions.Where(c => (int)init.GetCellTileData(c).GetCustomData("disposition") == 1)]; AddHostilePegs(hPositions); AddFriendlyPegs(fPositions); + _playArea.HighlightCells(); } public void ProcessTween() @@ -227,7 +234,10 @@ public partial class PegController : TurnController Peg peg = step.Item1; PegAction action = step.Item2; Tween tween = action.CreateAnimation(peg); - _tween.Parallel().TweenSubtween(tween); + if (tween != null) + { + _tween.Parallel().TweenSubtween(tween); + } } } _tween.TweenCallback(Callable.From(EndTurn)); @@ -245,12 +255,12 @@ public partial class PegController : TurnController HandlePegSort(); HandlePegTurn(); + _playArea.HighlightCells(); } public void SetPeg(Peg PEG, MapCell CELL) { _map.SetCellPeg(CELL, PEG); - PEG._cell = CELL; PEG.GlobalPosition = CELL.GlobalPosition; } diff --git a/Pegs/Actions/BasicMovement.cs b/Pegs/Actions/BasicMovement.cs index 6ef5267..ee4d942 100644 --- a/Pegs/Actions/BasicMovement.cs +++ b/Pegs/Actions/BasicMovement.cs @@ -20,10 +20,10 @@ public partial class BasicMovement : PegAction { PegController pegController = PEG._pegController; Map map = pegController._playArea._map; - Vector2I cell = PEG._path[0]; + MapCell cell = PEG._path[0]; Tween subtween = CreateTween(); - Vector2 target = map.GetCellPositionFromAddress(cell); + Vector2 target = cell.GlobalPosition; subtween.TweenProperty(PEG, "global_position", target, 0.25f); PEG._path.RemoveAt(0); @@ -32,23 +32,23 @@ public partial class BasicMovement : PegAction public override void DoImmediately(Peg PEG) { - List path = PEG.GetBestPath(true); + List path = PEG.GetBestPath(true); PegController pegController = PEG._pegController; Map map = pegController._playArea._map; if (path?.Count == 0) { return; } - Vector2I cell = path[0]; + MapCell cell = path[0]; - map.SetCellPeg(map._cells[cell], PEG); + map.SetCellPeg(cell, PEG); PEG._path.Add(cell); } public override bool MeetsCriteria(Peg PEG) { - List bestPath = PEG.GetBestPath(true); - return base.MeetsCriteria(PEG) && bestPath.Count > 0 && (int)PEG._pegController._playArea._map.GetCellTileData(bestPath[0]).GetCustomData("disposition") != -(int)PEG._disposition; + List bestPath = PEG.GetBestPath(true); + return base.MeetsCriteria(PEG) && bestPath.Count > 0; } diff --git a/Pegs/Actions/ThrustSpear.cs b/Pegs/Actions/ThrustSpear.cs index 404fabc..2bb4d28 100644 --- a/Pegs/Actions/ThrustSpear.cs +++ b/Pegs/Actions/ThrustSpear.cs @@ -17,6 +17,10 @@ public partial class ThrustSpear : PegAction public override Tween CreateAnimation(Peg PEG) { MapCell target = Target(PEG); + if (target == PEG._cell) + { + return null; + } Tween subtween = CreateTween(); subtween.TweenProperty(_image, "visible", true, 0.0f); @@ -36,5 +40,4 @@ public partial class ThrustSpear : PegAction return PEG.Goal(); } - } diff --git a/Pegs/Actions/thrust_spear.tscn b/Pegs/Actions/thrust_spear.tscn index dbde826..dac33a3 100644 --- a/Pegs/Actions/thrust_spear.tscn +++ b/Pegs/Actions/thrust_spear.tscn @@ -7,6 +7,7 @@ script = ExtResource("1_revbx") [node name="Image" type="Sprite2D" parent="." unique_id=1133735272] +visible = false position = Vector2(0, -4.999999) scale = Vector2(0.1, 0.1) texture = ExtResource("2_nwcvh") diff --git a/Pegs/FriendlyPegs/Spearman.cs b/Pegs/FriendlyPegs/Spearman.cs index 3434f0e..629d020 100644 --- a/Pegs/FriendlyPegs/Spearman.cs +++ b/Pegs/FriendlyPegs/Spearman.cs @@ -14,11 +14,10 @@ public partial class Spearman : FriendlyPeg public override MapCell Goal() { - Map map = _pegController._playArea._map; Dictionary enemies = GetVisibleEnemies(); if (enemies.Count == 0) { - return _map._cells[_address]; + return _cell; } Dictionary closest = enemies.OrderBy(e => (e.Value._occupant._address - _address).Length()).ToDictionary(); return closest.ElementAt(0).Value; diff --git a/Pegs/HostilePegs/infantry.tscn b/Pegs/HostilePegs/infantry.tscn index e81873f..68bd4e6 100644 --- a/Pegs/HostilePegs/infantry.tscn +++ b/Pegs/HostilePegs/infantry.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" uid="uid://xlg4cblo1vf1" path="res://Pegs/HostilePegs/Infantry.cs" id="1_wlksp"] [ext_resource type="Texture2D" uid="uid://nwj4n7if8kqd" path="res://Art/circle25r.png" id="2_b77ka"] -[ext_resource type="PackedScene" path="res://Pegs/Actions/swing_shortsword.tscn" id="3_b77ka"] +[ext_resource type="PackedScene" uid="uid://c6df6ib0qan5g" path="res://Pegs/Actions/swing_shortsword.tscn" id="3_b77ka"] [ext_resource type="PackedScene" uid="uid://bup5oli00p3lg" path="res://Pegs/Actions/basic_movement.tscn" id="4_b77ka"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_7k104"] diff --git a/PlayArea.cs b/PlayArea.cs index c1f51ec..2ce7121 100644 --- a/PlayArea.cs +++ b/PlayArea.cs @@ -20,8 +20,7 @@ public partial class PlayArea : Node2D CollisionShape2D regionBounds = _region.GetNode("Bounds"); _map = GetNode("Map"); - // TileMapLayer occupiedSpaces = GetNode("OccupiedSpaces"); - // occupiedSpaces.SetCell(Vector2I.Zero, 0, new Vector2I(4,0)); + TileMapLayer occupiedSpaces = GetNode("OccupiedSpaces"); } public override void _Process(double delta) @@ -32,21 +31,23 @@ public partial class PlayArea : Node2D public void HighlightCells() { TileMapLayer occupiedSpaces = GetNode("OccupiedSpaces"); - // _map._cells.ForEach(c => - // { - // if (_map.HasOccupant(c)) - // { - // occupiedSpaces.SetCell(c, 0, new Vector2I(4,0)); - // } - // else if (_map._astar.IsPointSolid(c)) - // { - - // } - // else - // { - // occupiedSpaces.SetCell(c, 0, Vector2I.Down*4); - // } - // }); + for (int i = 0; i < _map._cells.Count; i++) + { + MapCell c = _map._cells.ElementAt(i).Value; + if (c._occupant != null) + { + GD.Print(c._occupant); + occupiedSpaces.SetCell(c._address, 0, new Vector2I(4,0)); + } + else if (_map._astar.IsPointSolid(c._address)) + { + occupiedSpaces.SetCell(c._address, 0, new Vector2I(3,1)); + } + else + { + occupiedSpaces.SetCell(c._address, 0, new Vector2I(4,1)); + } + } } } diff --git a/map_cell.tscn b/map_cell.tscn index b0c6d30..0e7ed03 100644 --- a/map_cell.tscn +++ b/map_cell.tscn @@ -1,3 +1,11 @@ -[gd_scene format=3 uid="uid://bh28pqqlppt3a"] +[gd_scene format=3 uid="uid://cqwi2kesqh5wt"] + +[ext_resource type="Script" uid="uid://b8fx1wwyj30bg" path="res://MapCell.cs" id="1_jkeij"] +[ext_resource type="Texture2D" uid="uid://c5jj7yhlnodxt" path="res://Art/star.png" id="2_ugbl7"] [node name="MapCell" type="Node2D" unique_id=953237004] +script = ExtResource("1_jkeij") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=733491629] +scale = Vector2(0.025, 0.025) +texture = ExtResource("2_ugbl7") diff --git a/play_area.tscn b/play_area.tscn index 54473e1..0ee3aab 100644 --- a/play_area.tscn +++ b/play_area.tscn @@ -1,7 +1,7 @@ [gd_scene format=4 uid="uid://dumcridek4xy3"] [ext_resource type="Script" uid="uid://bnaxgcafcvtfv" path="res://PlayArea.cs" id="1_lq4m8"] -[ext_resource type="PackedScene" uid="uid://mjinvqj25wha" path="res://Map.tscn" id="2_wqv88"] +[ext_resource type="PackedScene" uid="uid://dqknim3lldrmv" path="res://Map.tscn" id="2_wqv88"] [ext_resource type="Texture2D" uid="uid://cf554xlykq1o4" path="res://Art/tile_set.png" id="3_md2b6"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_q4dkg"] @@ -95,6 +95,7 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAA tile_set = SubResource("TileSet_he03c") [node name="InitialPositions" type="TileMapLayer" parent="." unique_id=555896823] +visible = false tile_map_data = PackedByteArray("AAADAAcAAAABAAAAAAAEAAYAAAABAAAAAAAEAAgAAAABAAAAAAAFAAcAAAABAAAAAAAHAAwAAAABAAAAAAAIAA0AAAABAAAAAAAJAA4AAAABAAAAAAAKAA0AAAABAAAAAAALAAkAAAABAAAAAAALAA4AAAABAAAAAAAMAAgAAAABAAAAAAAMAA0AAAABAAAAAAANAAcAAAABAAAAAAANAA4AAAABAAAAAAAOAAgAAAABAAAAAAAOAA0AAAABAAAAAAAPAAgAAAABAAAAAAAPAA0AAAABAAAAAAAQAAcAAAABAAAAAAAQAA4AAAABAAAAAAARAAgAAAABAAAAAAARAA0AAAABAAAAAAASAAkAAAABAAAAAAASAA4AAAABAAAAAAATAA0AAAABAAAAAAAUAA4AAAABAAAAAAAVAA0AAAABAAAAAAAWAAwAAAABAAAAAAAYAAcAAAABAAAAAAAZAAYAAAABAAAAAAAZAAgAAAABAAAAAAAaAAcAAAABAAAAAAACAAAAAAACAAAAAAAHAAAAAAACAAAAAAAMAAAAAAACAAAAAAARAAAAAAACAAAAAAAWAAAAAAACAAAAAAAbAAAAAAACAAAAAAA=") tile_set = SubResource("TileSet_vqhsw") diff --git a/project.godot b/project.godot index 7ae815b..617cfc8 100644 --- a/project.godot +++ b/project.godot @@ -51,6 +51,11 @@ changeTurn={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":84,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +middleClick={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(222, 10),"global_position":Vector2(231, 58),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} [physics]