From a79651ed04dc94234a4560e96b7e13c9764ce6fc Mon Sep 17 00:00:00 2001 From: = Date: Tue, 2 Sep 2014 22:52:29 -0700 Subject: [PATCH] pathfinding works. --- desktop/resources/pathfind-test-big.png | Bin 0 -> 12427 bytes desktop/resources/pathfind-test.png | Bin 0 -> 1275 bytes desktop/src-common/advent/core.clj | 30 +++++---- desktop/src-common/advent/pathfind.clj | 80 ++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 desktop/resources/pathfind-test-big.png create mode 100644 desktop/resources/pathfind-test.png create mode 100644 desktop/src-common/advent/pathfind.clj diff --git a/desktop/resources/pathfind-test-big.png b/desktop/resources/pathfind-test-big.png new file mode 100644 index 0000000000000000000000000000000000000000..38611a98b11072d9c5bc7a298aaf685a8173a179 GIT binary patch literal 12427 zcmeI3gS z5Q57hm+!CY{t>t8zL}cop3|r6^yxlNeWoT%RauVU>9eO87#IW!^3rM;7?|RZ_y0iH zk5|W6ZPpkVK<3Xow6nE9=8ni2rr?j`G*;90xN>h(D}|7H4s{zF5V}pC9`cQ+)mjk-P|)0Nd1S{-U#1 zK|O?{SV7)vr-um4dWfa5*5YQ$rrx7}elsk%BDgKQZMY~cYV^4-l|~~psiZsu!JHUh zK$(!K6h2vlRD6Og*;RfOJ3LCt)kSeRw!cOn4jMj;{d=!`!PMay@n<3oqS9$cK@X?7 z!v8RWw60eq@4!J{eQv=1b4vGbiVp}V0VKoIN!=&<*+iAWFx;qdj(v(UP%E}b>)a>q z1{0$v)C2Kr8g{hJkWaBSWpO4>h&AqL#|G#F5m%b)*@3|~ZFKstCbLGOu;rH*AKSxV zvvp^5{}d~YDw-5be6g;gZzjC~?hGH!isIld%iD5BMrGv7*vnX66AlG_ zs)=)!{geSFfmv5e(waOfza!17+BvhG*unwz&#NY@UGLz)^_DZ5)0+2Iv?=vcz*~RMh~#twj_2ZFboqm zyJgc1Q@-n)*k$!C`{Zd!vM`6$l1a4?leIK?;DSxbtMzDym-H+NuGBjXlGYvWNb;b>q4-(TnP1PO%W|+pp@3FQ_e4 z<^I~c_8(_r?Sc)6jZ8MJjThhN+!xsu8WmC@SA@R=(g^1>!#UtD?_R*!;M{lb!(DWm zA$QCMiS4mmSb{A_ZCNaHUKK_rWJ}=&R@2s5Z`st9hrCc!n+dnAx78xFmE=uE&*KYF zZT}8%FGlh2=-a4Wp4NO(s`Gkv45WTT#DblHJ=^!OH?YKoQfDzMK3|P*pl|MsslZJ? zeKRTCT_`i0O+M@>LZzpF{WYK=v-QgGinTKT$@zUe8IO?Asx9YxmVwvn8A6VlGG|X+ z(#A&(e6Uvta}-M4X849EwB{>{E7)z$+z4baL0_VKBZGAge9)%sNE>yXK zrr%XuUvg=faQC~^K(I**Gw?rqDCd7BYy^3roUk~B>0mgz+t9uw!@%H#C`e0ubjLh| zw(6=CPR|^Vv&9m7PeJ~Oj)%`D5Mz;#HFE^%MJTLqc4>t zYZmzd+V#__I?m5O5-OBOQq9B3G7dx?7Gg?w{Yz)O_){@T^W{1I1ofi8mHSqfD$$;l1=i&}EO^mo-Z012t^x zLyxP!@j%;Gwmo(Cl8ijT)8FtLxnAQ&rD7aiP3~T|{hPDw_&O>|!W8f}oF${k>`YhvO-WukOjf3&j-Hl87-pRaz53T%7s=K&LCUD& zt38)MKp<+c3wqO4OXv|mY?{^{$r)}VMbW<==+Y7g4$(HS-O?g2C|S5UYbpP$NK6WP z&LG9_m60Y;_fNI;quvgDRkWi~_Kv__#QyvHfHg=bx@4y}gaxGdG{Nf!eF#T13Cmp< zD=ODUjJzbgH0ptaPxI@%vj1x~am6qCe$?~ctBPdb=R`JJKkOpvkyX6sLE=vVjbHB% zqJ23EzwmRCi?Cli%Cn&a%(u-L+o_cU6d4_A)KnOx+(|6WdVksas8^ikGFfJ z{fy{|KTKdBYf4%&ka)2NEO@{!M|;9gP%loeH`_Y(H?AiYnFIsGi%3R^voe#8sRu)E z8dq~8#pS<%+j5#j#8EgK@vUn(@F=NIkwgYDKg)Y%{ZKON>jHHg6-WK9cQ;pOPnx3F zTm|!$CPGp*vH6RH+ezLr%FFh#<4M zsmGyjt%fP>Ya$Hi#JSJnLNC&DeIv*$kYx+Jm&IwTnp-ia{{{c3KU(U(3_oxb zPa1TRAC085GD1See)xKO#13_jCW-;H$_DIJ?M$!Mw%EYNkpwpUEg5DuS3h4_w0|F! zBJ|qAd?0#$zEV&i=tH=3cbtOoJQ30AxFLhUW-wuqoA4XKD?$?LW6-oYJY-7>nyj>? z;#){Wn~|1TR+d&>5AwgK{(W=qj4Ybe^{p(~n_AQgqo1r}rcFJPyf{2n8GU{_sp7Kc zx%aqZA}g!Z_{jN<-zWPN;;euT27XF)=RQA#_Q~k&nZBRwWVib^F-R~%v?b1v5)cWj zKRx4zLUt#x28qlTx4jGNpc9rEPy>|!859mfX^^9&&;9`665Ncwh9*t#xu@}`KNp?l zU9^9gcueP&RJtpxIj$XkFUqZ@v_<UcATM5o2d94xc_OWJ(-fi&tl=k7Xg>=~8 zv6|{??gHCZ)OHPy@=e6&IibL&OxmZ0jV2QK0yK{CA3{zwXZPRN=DcJ z6GF_Np%!fy&=gu^yaq}3xQdqT3qEsZ*;=HD9)Gg-o$H;B@J(>(-Uhe)LGj&+`4Sd- z{5O_C%tEY+Pv1u(GsC0<#@{KYJNAOBU7XH&@_Mz|-ub?;(6lkT%HjIE(~(bsgrQF! zctY@Ap_`1)aqe_zZ13p$3_l%?vzcTg$mnje@!s}?20Ds+(;h8}wrmeS@QHrVHFBGp z$m;FetG2g&5mCqfmTKOq{N4M7zy+Zm@)LE|Cki*dGJI7xZl#L}Y4ZeM(94z+>C-`( zY-(d>Q9kmzHbv^lxZ7}-;xQ=0+`Nwl41C9T8~aD{zARE&;RJn4RZ&0X!C)TZ`%j?* z8IlfEP^%>@w6_>f69bq5(n!;8b@U#j%5f&E(lSvJY)J`>xm>yx5gtCvlxZP^&MzkY zpL4f1GJU@5oDIcy9z{ufyx66>38gV~WF@v_*iu`&T`BleD-}Rd$Ox8|5$0jp66{!gB zm{X`=r%9T&y9+s~z3Ax~y3I+*xR)2Y_?T3diINv%7L2sbsw(VvENxpeDjz6_8fNtw zUvK`h$*{5Em@>=G#xQKR%&Ud}2}BIA6+Qf zxNexq6nRD3<~>@DUwP;>ozutb>6I`*jD?MUF+|wH15YZcwU>}SJE(p#@~~*Ldhp5c zMj7#PLY}w}(e3Z|&%nY1?(4sc{wBn;Wf4ir3Z}a+reD3s-;+e_DXaL+Rc6z2GJoUZ zD`a`2saEe;Mqu~J8@pk5H#+~i7VBEHa#l)#{}wsmVzXRt|1p1wHO+Z1?-Nebv1tdV z(O&L(vq3uc;Vuyr=6HcHFUUOB+DS6(Nvi7w;h(1Qi*PMgZpQvpvHvF^$UV0gR<)b(Xa2%_-X95!R=PurD z-VbKmL1ZflXD|4m@}A7ykIOc<4b*niJx+_fcLV^l*8+%0nYP>Lw-o|XR#Fa?&s&4= zsWz8!w!)PKkp&F(l{HlS`H9!y?wi!(>Xb6JKdO9iaDA6LangRTj*?kl{Xp+fGH zrlVUF_-aQrl}(YOhnle8xzFWs?=nz)btA&wkuv+P%GZOl2oBoGv<&UR*&Y^?a<7@s zDx(h-4uAZz(-NE=thVo%xWnG$BLdyu1wLQyS?~UgFpTk{G1CK_rH%B}-&^*eeDZtqFaJ3&SRhIiczL7y)svwU2aGaqIdGPZu; zY5K%qAbb{$l+K|ca_(a~1{X!&X7)dX2s$6=>3z#$qFINDgJC_xi;3SoZfa0e)gHrg zmat*}CiYoWQlTn)|_3*H=2f08AOqq6L(&gW$%MC{~BTcwcwsZMht>O`7K5*77 zJyDO~&}cq&Kp;k1JR9|yb0^D}Fmb=e))jp#ABW}s7Ypy- zSlZY}cnCLaMw!)=wBP^w%*AYYvt}93{3;@BHi+PSqJZnBQ9f=bw_YXlD@`*^2PFVL zgTHdt>s`jl?*cn0N>wjpxCqtQ?!{8}wLtZ2X9BPLKS^0*(9Q&jxt8KPc}d_zch1$i zk?GMtxWzjs;fs7wWt*9-FU~lZV@S|3O0VJFtDBhgjpZg@eYUPAsG~G!xq0j|TIV@* z8n_)sBKBfq!}>mGQzIlPoe@$r+Orkr#KIQGcABjc^%>FsH^%oyJdNzM*B1q^`mM?c`Cp^{@a&-ffX(hJFWubYp{yGY_zV{i z4+$b68z~`VopU?FJ!Zvo7XD0V?}>ADj<)V%kJAK zG)&9Tr}qu_P0jrpI&c&*s^Zt5#dFR5XE}N$4!$;(mF>CgMEK;Y2TSh=&uPF1eb8XR zEx4IT&DG<2J!?ODil0Hea=tf@aMD%{z2(u8_G9L2iDHHcTl99X@f zwnz2{N${i95NE9<;$7O)kOTf}{kxf#=R>XvNyw_hg0VIZud~^e%m}d)w&eE(%3i$+ zQ|(7FA}`pk#g!pUP~}0Z#4~xxN(%Y-|WdSyi{Q7YMaC!VpQZSNC)@?Qu|PUV!(?q};grel+U{V$1?eR{svziCwb z+_>siwu-pl=AX?#D(@z>N=bCrE8{hlyEjAzLi13#Va-!h%TL#iPnxOY^|OB`v#6WC z&bl;NUNCzvIxrt1!Y1w_axMM|7st#i=**D=y?nk>`Q}tG;Ar_Mz#B@wj*5A#HBm?Hg_AIbaZ7trGL|3pF4|>!)NbM; z_7>XZ5jolIGOO?o^l!mqe|Zl{Q4}uv{a_3bkM``?-v>YQU(|;li14|IR<&Oqxg#Ur&Eq=A>O29DGXbual5c_9l&4c!5ANjw zQwza~6_C~SZJV6}Qbrd?lc|5etAYpg6xrGkA`QlWUHuA+x!LUTsE!bK5^5sJaMR1g zkji@Kg?OCgX0k~PP3)anPN@23f|$vEDxGXrpo6^S0V2CtII! z$2fK^v~E~Qj*#)Aq(2V{5HBNJRgKenzQh!BLqVN|J7B;6awW#r;D`Gu?nAGNH75|; z-w)(KJj|2M?0#}e6ANmiGxK_v_uQNjW*})i06O4Bp%U~SK&wd2%W9O?Y{)^Ncot{} zILEf|B+3Hz@C5gUzsmx(wXFh2EMn`IsgVK5fYN@=WW0(#P=Nz8E?0R^I`qX59$Sa? z;pQ_u|7=D^0Nv2L5%y@}>%*I66^jaie}xAs?R6)xUrt&iyE<{?*Mh5W=$HYJP6;kW zUxg*t71wzmFEREfyYnR+*E)J<$NS$~j_TR%@6!7ujbDI5F+!?Iod-4|JJ5)Ev(t_? zt%swdd36TGPW#K4+wnb8fRv0lPym^@3$DPuKEyv8*zJfpmcH6}$@aSg-aoc7Q6Jq7 zo?P5zNdv>~v+;y0+KH*30&bp-sA`&Gc*NY!-Cr#l@{T^u>-SYR`FV;eLu7f}PUG@m z#7TdXcpN$9SBgF4Yx)IJ1T%(#t3Dg18T%6GBc9CG{))|hDD&!8inq2ouv3*}oavvc zR{loo^68}ICW*YaMz`p06Pe!JZ3nu;sP|*Dq_OH_Xax#4ci4UuqqbH2XYcMT1dn?M zh}d9WYZeh)U><3p3xICD82<%Z%=~#)%iB|CYQ>3oqxULKU>@Lqecc>qDNj^q)XIqH1)Kq7e#}4Tt<@=}^E{%LF+v;#HM?{s@*bHCFf_E&mbe_L!-acpo=k zhl-nbs2{P0>_HWXV!iDd#dS{N1zwSjZk;U^Qq04Q&* zbRh!E%P1)b?*%}=kwv{*nlT7iRMKw>$)15Q0&1-aJ7PdRp~Ss&WZCi#;N*s>ymPi= z;UKLswD{`xZ6iv8-xWjRYcl-|&!?w)1W1T6qnwwL%fG~~PQLogjTMIB<*y^L^&LYw zK!jkAS>R}zTG^Xq)nP{R$C;m>d?ii{)r&xogFmHWQGLYYOF{(o5xY4aQ+lg1deBY1 zaPbK}lV^(!zhia@ps_SsC1k6OGkVkIkWM)hKu$bkEVb540Nt!-iS9Q)`Eft!WI4zo z4-eK?&2O{ts^-DZU)~||Yxh{HjGu6os{J5|`@hVP*XZcYa9~)^m2Ml5W+jyy-kY7w zC~$p^XTHOYc0z?VFl62>M~H1}y!lJ*AMJZEqRFIRb$C(OaXvw#1oFp{>x?%H{pTGf zLJ$D5zs*RiUTIvthDZ>p{XVu7^U$mgK{MP+RNK+ZWMJ(7WKEM`A{N4&QJBlbK7ac| z2sF0v2HY;ncMvztB9(z*IV+JH%eboICu0$!93nsv2RwdD6T7MlEQwjr-ERa2hD7A` z^Vxl{myPZ`cZi=3fDl8PbJPx)j;ZCx$rhe_{Y_i)UHKZ$xMvZ?CSGrgHO=IpCqINR zChlZ%7}~AipgDQdXvNkQ!F4PDs}6I`V|`<;A(3wOBVopUF|o-6QzfW!D`&ta1(fG= zZ;4yYL6UQl1M8T^=Di(F2$`kNqW3)5_@pmpwvTz85*_A73Y?yyfJh#t1@3GbL`no| zghmU7VuS@Q{E}r%yyXNjOUC>>)XUKBC?i{=^}R3h2rYRyx~w*1==kckRCcK>SkIH^jzMB^Z+-PM7U{FITp`z6Kba&ijPEZCvm zoj%^QUG^P3pC8V=yE-`8@5op>?PQwI|K9S6P2?C#qvDS)TS-atKFsSMW)Q1q#-i%hTwoIQig<4$Vy_y&8{z;KX}l>PK<@hAfR#5fH^gAWmHIA)Z)MAY!T&Q2hIU8q}@0W7~9?lJ$pir>BDVt7hzd?&R<;Je7@v1=2^7 zV8Qt8c@IJg9tRC@NK0xI<6W1UGEBk|Mn>`Ur-5?YSw-^=ozW}yM+d)szrx)rnZ$jt zt>FH|5&=|3ju8|kS$=+EPu^oFaGXm0B)kUeskkv#kOT1Mt2|+H9#fQTV&3%F1!CS~ zeF!WmpJU1t=BqB}Wqyq&Pp6dhsA&bM#{v)>U%TZeZg7J4D^=1E9QVEouU9c~ZJ(!V ze^UjWyk`a&Y)F6rX;RYdDIug_krvc5Z65i}LF?Vi=4q{sv z5t7MvI4clqhQ|2UQ9NpNvBQ zN&^*~-+6Oh*4R6@?{~0HeJUS5Py{xPl(ZPv)k*jm#OTu&z(|&P>}5$-d1fs>>UgZb zWP&QnTQn>A)jF!(h3=@uJ`2t?48S*|mrV;|>mVjJh@;z>1`98QpN00U*Fida^=f_% z3IyFs_VR&ySf#%%aWALA4+<&>e=*MoJQgnf@gO}^Et<8RHBT{czW-3=cX>A zOY8K0HZx&+4x8Q8pj5uXI&k~Q2q^IImRbW_DU`dnesH7802G@gW9ET|bZ#0fc4=r{ zPBbWh+4DZ%MO<+{8(yKpdSAb#X($<)!FjK+1q;8QCoT;)E$~!$!t$L;rH7g!MQ!Mwdu+eY~$sF_;DX zrY-OhZjv27pt*2SmbitSK2Ieyj<+`^_*e*SE`{Km53XpZBbg28e=Pf(*=S~gMdBtmd6+`DxJB8f_Gs1jU3FAqL^ zn;k+j;5<@{W2tj4hx$PI2fyIHq(AcRGruw#oX&&%K&qFWl3>*f?U&Vhg`4SK)sW66 z?ygEQ>dD>c0^xdT?>>?s=MY<9tGIJQ12Faq`ZSs!*N#NGj)BnYN zA@N+vn;odxlAD#NA8H3J}61bT;rDEgl<0kSQ+WCdYo%x#dNx zwhLhetLoVOQ1%;cYwy}Kbh%w?qT|L0cG6(s-0KgGaoQvJrMwB{{0~@XJY6!Cl2LM# zVH6V-G>N@sanZ{D(Ap$*E`a`+D}g4~$^Hov2eKEA3cwOH(SUFcX-MyM8cb$`92BT# zlBZd&HCUc!>DlN@t3qi9B2J3-)TOlp&(;xP7*xIlxfCwPje62t6VgKIp(Lq@*ZIkD zx+~0A&X)AF@ArdYH*RkKd}ym9DjHb?xJ_Ii*J>I{+lm!N6qYY?;#p1Y?a%f2wRuZl zCIlY))1XC_x8V=mS2-Ysj3k)2n3W7u^S5>7Le+ONrcN2QwmC@`nc!R3CcN@icFN{h zk$N9+0i%R|h}|-ieajI0*LD<4+7GX>(;|&U*0UbTg z$_y=rOC0^XMYMX@rTKen{+R3}2_{#kWU_4%dG||>8p8QnB_5gU=^r(3>tah-#8Fd$ zHbXNtrOVWqe4{0te|g6uFmP&%HTY!JCuvpZe-&x-zErpSc3=t>!RE&(%5y~_lzW%!H&DqLiXJ?z^S(q zc^Fow3KJE@Q(E66q=O;d^DS0OL)_g*JNpz5Haoq~f5pwKKG#qm$hYp6AIv^%$=Od` z7>yb>!j}ewm__wVK{&GXW;ZM#ed9v;GyHB4{maLLr&mcufc8 z8mcLy&TdpPml4!DUetoyZbmF5#S(u54g}ediQK%mU2K)u(vkbprdjcQfvW72UdK^` zf5_#0Un6cG9EoJ^Aoou4Cq7MPWRIA5n}Q+25}goqECfgWHJhRN`r#o5X&9(Q)kxlJ z&6^zXb@n_DHJ;ZObC?siHlnwh5VQ;Ulh6nrm#XGE!Rw`oE5+}S>B}pv2bcX8ai*Dk z#!X5yM$Aaba~^E{)cp$`3i*c8dt~EXQPt?e(0UzBiM7b^mtCQI-Yafh`)K=EI|I&t zWfAS|Gn)MUZ-F4W=jo7bSHG91M*Wr_qTr*6)6=rg+2_bNV@+3NGnL@v)8oj7gDGOG zQ$w1)A|81^%1kl)o{ydTTM2tBGg*@rX)57IG0N}gU7g+?(+(9Bl`5AjnGK22`_~^u zfHUx&0Z0PvJE#|aN*#P-@zpH0j~MJ|3bA;lfnNTqfwq{iCsQ}&MNFBj%^IhyQZI5* zJ`>=Yl6}`(IGU<%=H`f~{~%{{-4JU{fxlR2{hUpT#5hrdYh0-b^QN60Z_*&Ni2VJw zhJ1V-os$72g7vK~%ys|p8?lU^+b?7mEx?t3@DHgW?jK5tpTRPvS#!y2jh0cwWM0LGO_l>=psK&ALZu> zhxR)Uqk;1KZQsGnul@UGEJ~Xe(%Ol@SryTe*PcL1+YNl%E>53Q=HIF|X^Z0yPp*F% zUZ~6`#+rm9x=4N+6pl;gle1*t0w@(tCb|E9%YkDElCDLVUfYgAts)C4sRcT4M27xNAp+@#TNXI;sMGa<8)(bX9dpvv!K>L zv~Un&TEA=5-Yh3>Jtx}t@*%$AorI7Fu)KQQfJ~0%4P>bPc^3Ef_)Sx2%aCbbq0Ng& zMU50t<>fVTG}`xAe*CCoTxW3Gi~B0b`WMdViK-U6OJ7{(P|LVc(w-;d_~)QaJc{+N z8FDus@czh2L||Jjruj_lU0zBry1PF-LlF5lUw(@BTJJt=prE`>r4oIKo=t1lDV*vv z-yk!7N9u~He7uxM=xkR#z{kHI(tdb5jmkx0!0s^@Ji zr_!Kx^gpcRO;rD%g>b6wrW!KFcp@x=k2)Da+Ol*Dx*bC9^%N}w2uPWZI(~@iez4{3 zC$~8h9Lq(RtEY=j>I{wZp9Ne8ka%CXjiTX4CaOaDf-;e$UZN_98+@jB4&HYFNvg=@ zNE*KsYaVbe6w_l82f#FW`gOm?)23a%Cu3N4JJ|QTDOneCAuZL7?qCb=`;J>VMlfq3 zA=AtEqeR^@-d(Ept`63m_onQ!<07w6d2zq|ZJ4BiM~;>4R+#e#!^8-D>W`34R&f^t z`JeTgG6Nk7cS`Y}!;Lcjs6U>G7PiGc?9=F{-}jLwcW-(pZo<#gwy00jI4VeCSkdGe z$Ul;vw3(_avvg>+=g`*x>;FZeeWk;O)4Cl?N>`{q8hBCeD_3T z1Jk)rF!j>3V(sSjpJH2xscj9f*J`M|?=znA(>b zBD#O-{y{7{eIa!4Rz0-nU29ASHM?g=<>6`7LchKB!4buNa-$y2jSQb*!yvVzsUY$k zJwCx*Vx#-XdGsy+*p>G}GxxSxw0fea?zNYn?Kgh)U)YHxAQI&tWTa~Ji@YngBdaaS4vTIlf)&91T=KaDoh=J0?C16L=qxvpHuAV7!>h~r-&A4^ABmnCp%*xd zbaHc}Jd5c+fdSrs)^HN<`4qsIe3& zg-6hGS;rYR=y`N`>?}#^4J^2<7}*$%Q9_OW2N8`9?HdjdH_DT5O+Aph*=fnRyjSrc z{g;Bg(P;Fb+KU+128}%N=aYv@yIi0sQ?umCWS~?(h~hvFv3Q)i0;9P8^(2Lo;Su6? zGFO~WxPiD1G*4gtuf3f(l*Duq)vs>0=p(8eIn{S5-FD;=Ia>xi+&sb@%N6J)2S`c% z9NYdV^Y(UwXeBMf`&3MZBV!~CL)c$KIjHlB_ytpMvx<4ulqD@F0%KA9gIJ&+aVSLG zv{cd0;SVb=7v8Q;r=<_Ym~tUEFtF2`#7ffJ_EURgkDRx(pR{Bdv9=^|ua%tU>G4Gs zohR-j&QLfQi0y~LP$X3p8FprK2N915zL69MMLzX6kku#)rvN-YP(Pv;Hoj|+A2Bu6 zfB0M0Q2f~5`AF1nj0;~r`e`J7RKBd+G|GsH0oa%%KQW~Yz>L7YM}Xvp&j z=>*h!PcgwfT>n9~uD!;iq2Hq0A0nKN(;s$S6yfOBx6KA0B?-e*gdg literal 0 HcmV?d00001 diff --git a/desktop/resources/pathfind-test.png b/desktop/resources/pathfind-test.png new file mode 100644 index 0000000000000000000000000000000000000000..f067079ad3d50b0a8d7affd73914955d8e9dd86c GIT binary patch literal 1275 zcmV4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0001zNklflLb{4EkLIXj?;Wr>wy35|>oC%+#aW)!*`Ss~R8v-3&Op1! z%+QYjD>DE-L~Iz^HqTb818z(TJ9blscreen screen {:x (:input-x screen) :y (:input-y screen)})] - (assoc-in entities [:ego :target] {:x x :y y}))) + (assoc-in entities [:ego :target-path] (take-nth 10 (advent.pathfind/visit-all + (:collision (:background entities)) + [(int (:x (:ego entities))) (int (:y (:ego entities)))] + [(int x) (int y)]))))) (defn get-ego [screen] (let [player-sheet (texture! (texture "player.png") :split 18 36) @@ -42,27 +46,29 @@ (texture (aget player-sheet 1 i)))) :anim (animation 0.075 (for [i (range 8)] (texture (aget player-sheet 0 i)))) - :x 100 :y 75 :x-velocity 1 + :x 150 :y 95 :x-velocity 1 :id "ego"}] (merge (animation->texture screen (:anim ego)) ego))) (defn update-ego [screen entities ego] - (let [ego (merge ego (animation->texture screen (:anim ego))) - target (:target ego)] - (if target - (let [delta-x (- (:x target) (:x ego)) + target-path (:target-path ego) + [target-x target-y] (first target-path) + target {:x target-x :y target-y}] + (if (and target (seq target-path)) + (let [ + delta-x (- (:x target) (:x ego)) delta-y (- (:y target) (:y ego)) mag (Math/sqrt (+ (* delta-x delta-x) (* delta-y delta-y))) - vector-x (* 2 (/ delta-x mag)) - vector-y (* 2 (/ delta-y mag))] + vector-x (* 1.5 (/ delta-x mag)) + vector-y (* 1.5 (/ delta-y mag))] (if (< mag 1) - (dissoc ego :target) + (update-in ego [:target-path] rest) (-> ego (update-in [:x] #(+ % vector-x)) (update-in [:y] #(+ % vector-y))))) - ego))) + (dissoc ego :target-path)))) (defscreen main-screen :on-show (fn [screen entities] @@ -71,7 +77,7 @@ _ (input! :set-cursor-image (cursor "cursor.png" 0) 0 0) background (texture "bg5.png")] {:cursor {:id "cursor" :cursor-index 0} - :background (assoc background :origin-y 0 :origin-x 0 :id "background" :x 0 :y 0 :scale-x 1 :scale-y 1) + :background (assoc background :origin-y 0 :origin-x 0 :id "background" :x 0 :y 0 :scale-x 1 :scale-y 1 :collision (advent.pathfind/map-from-resource "pathfind-test-big.png")) :ego (get-ego screen)})) :on-render diff --git a/desktop/src-common/advent/pathfind.clj b/desktop/src-common/advent/pathfind.clj new file mode 100644 index 00000000..c58ae5e9 --- /dev/null +++ b/desktop/src-common/advent/pathfind.clj @@ -0,0 +1,80 @@ +(ns advent.pathfind + (:require [play-clj.core :refer :all] + [play-clj.ui :refer :all] + [play-clj.utils :refer :all] + [play-clj.g2d :refer :all] + [clojure.pprint]) + (:import [com.badlogic.gdx.files FileHandle] + [com.badlogic.gdx Files] + [com.badlogic.gdx.graphics Camera Color GL20 OrthographicCamera + PerspectiveCamera Pixmap Pixmap$Format PixmapIO Texture + VertexAttributes$Usage])) + +(defn printmap [my-map & [skip]] + (let [skip (or skip 1)] + (doseq [row (take-nth skip my-map)] + (println (take-nth skip (map {0 \space 1 "W" "X" "X" "." "."} row)))))) + +(defn random-map [] (-> (vec (take (/ 240 2) (repeatedly (fn [] (vec (take (/ 320 2) (repeatedly (fn [] (rand-nth [0 0 1 ]))))))))) + (update-in [1 1] (constantly 0)) + (update-in [50 50] (constantly 0)))) + + +(defn neighbors [x y my-map] + (let [candidates [[(dec x) (dec y)] [x (dec y)] [(inc x) (dec y)] + [(dec x) y] [(inc x) y] + [(dec x) (inc y)] [x (inc y)] [(inc x) (inc y)]]] + (remove #(= 1 (get-in my-map (reverse %))) + (filter (fn [[x y]] (and (< -1 x (count (first my-map))) + (< -1 y (count my-map)))) candidates)))) + + +(defn resolve [came-from play-loc target-loc] + (loop [path [] + current-node target-loc] + (if (or (= current-node play-loc) + (nil? current-node)) + (reverse (conj path current-node)) + (recur + (conj path current-node) + (came-from current-node))))) + +(defn visit-all [my-map play-loc target-loc ] + (if (= 1 (get-in my-map (reverse target-loc))) + nil + (loop [came-from {} + fronteir [play-loc]] + (let [[current-x current-y] (first fronteir)] + (if (or (empty? fronteir) + (= [current-x current-y] target-loc)) + (if (nil? (came-from target-loc)) + nil + (resolve came-from play-loc target-loc)) + (let [neighbors (neighbors current-x current-y my-map) + [came-from fronteir] (reduce (fn [[came-from fronteir] neighbor] + (if (came-from neighbor) + [came-from (vec fronteir)] + [(assoc came-from neighbor [current-x current-y]) + (vec (conj fronteir neighbor))])) + [came-from fronteir] + neighbors)] + (recur came-from (vec (rest fronteir))))))))) + + +(defn print-resolved [path my-map] + (doseq [row (reduce (fn [acc path] + (if path + (update-in acc (reverse path) (constantly "X")) + acc)) + my-map + path)] + + (println (map {0 \space 1 "W" "X" "X"} row))) + nil) + +(defn map-from-resource [filename] + (let [pm (pixmap filename)] + (vec (for [y (reverse (range (pixmap! pm :get-height)))] + (vec (for [x (range (pixmap! pm :get-width))] + (if (color! (color (pixmap! pm :get-pixel x y)) :equals (color 0 0 0 255)) + 1 0)))))))