From a5ec79c88aa71676040d570af96b7343c3bf56cf Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 9 Mar 2019 18:49:45 -0500 Subject: [PATCH] Split game.jor into multiple .jor files, add ability to specify code to run post-load for side effects --- boot.jim | Bin 923 -> 1237 bytes boot.jor | 37 ++++++- defs.jim | Bin 1276 -> 1462 bytes defs.jor | 26 +++-- entity.jim | Bin 0 -> 786 bytes entity.jor | 50 +++++++++ footer.jim | Bin 0 -> 1073 bytes footer.jor | 79 ++++++++++++++ game.exe | Bin 117074 -> 117433 bytes game.jim | Bin 5381 -> 5243 bytes game.jor | 298 ++------------------------------------------------- game.prj | Bin 5316 -> 5201 bytes input.jim | Bin 0 -> 372 bytes input.jor | 32 ++++++ jorth.c | 17 +++ keyboard.jor | 32 ++++++ map.jim | Bin 0 -> 664 bytes map.jor | 66 ++++++++++++ pete.jim | Bin 0 -> 239 bytes pete.jor | 24 +++++ timer.jim | Bin 0 -> 438 bytes timer.jor | 37 +++++++ 22 files changed, 399 insertions(+), 299 deletions(-) create mode 100755 entity.jim create mode 100755 entity.jor create mode 100755 footer.jim create mode 100755 footer.jor create mode 100755 input.jim create mode 100755 input.jor create mode 100755 keyboard.jor create mode 100755 map.jim create mode 100755 map.jor create mode 100755 pete.jim create mode 100755 pete.jor create mode 100755 timer.jim create mode 100755 timer.jor diff --git a/boot.jim b/boot.jim index 815b51e47a23546039d70eea28d759ba3b347409..ce571b72e2a99de03677435d736acb620e2ea96a 100755 GIT binary patch literal 1237 zcmY*YU1$_n6h3?R+`T_jS%tbtDdMgVF-njIS`d>Iv9?CYi?)iSK{m-GUb~rDc4rM@ zDAhKWLJPLihk{TF6+vj9L_x*%K`glVq6UgBc`4+nmXJcFGSHrLCvlNsV9x!{_nq&Y zbLUy%i{NK?fPWMaCc;_`w!bRiSwZ@s30I1s{t_vo%0o|Y523wKQV2aCMjTkE_@KeT zI@qZMH0$)a1qM_A?;aZ-8QJ&F@SgYg(b*^P9>Eh0(%hkb$)z|-;dqV0y*@ml&Vrkw zu#F4YE3IfFK(9>kl==+9S~K)ehoB6wqKv=gtpK$|2EU=ClSWU4 z2VH^h^jTG%e#vObpY=;-{HZSxV_5^1 zXmpqKIx>=kjd~+YX5+>r=^jyESUjb>Mb7jd3=+eOJ)d%@H{2lTuo>u z4Hr#QLK}a|-6t-ye>VtG9M|bM#ea>2$#815)PK3Z3w-T_FK|BA2+Bn`Yn<0lRDg;)spGjiRsziC&MJi9fhf9J8$3#xc9ordYMcx8P=~(=7f# zu02*%sNJjfd$}miNw%DAw1amopcPB>$1IAHctaeZoqkL@&FaZ;O^5aOTPsR>PBUJLOtHI8@oRG+*Dtyp2U;Y#5at^!UDb(JePy=OM8@V*FcbY;U(@5 zmUC^)0nI6RrMt8fF<+EHd78#}%g@}&qg3cXpnRbWKP}5R8bsC+5(nBNQ`sNO5a5GD6o31DZ)U!47BeVUhz_!cHX}14yc9&1fsh@-ZkDY&yN=GzEVHu+VPaC< z0>Od}yy>-tsBS{1lJJlybC`p-4k6Jd62^MzeKVrST;}(F@ArFuzPGMlFzc|uS9F9? z%Won)3Hved6=(rrFsPL2w*%UYG~5~P z9~kJn-G6hik7BdXLG-9ko@lJ5LcB_F#36V#hPRA4unPohSVyLrtcCzg3-P}394x0| z#nduU31PA(|Hw@i>7S{=NlFUFEtirKBE)&)1&mllJBfw3M0jf4b`qoGH9iNz)3JW-*wDSiPA4?6Z;cQilSeMA7M%rO%t0kfL^rGBg19G^@r^Lq zVk+WK#6J7M)r$7n11kSsq&3Ah;#gW!iZ8+;#WxZ046SZPv``~~<(GXcnDYEF^1W;n zcsJW-kH}$H{7Eh2U!jIu6Rk(NZnZRGsrOW#ZL)_3-4iE|_^LbUdQ)osJGh2D@&@eS zHJYSdreV}8mFX!C$~|Qf6&jLT)RrR~{1u(RgiK3?F3J$Elj5+&xa0 r> interpreter r< r< swap-input ; : loadstring ' key-string load-input drop drop ; -: loadimage-if-uptodate ( filename -- b ) - dup image-uptodate if imagefilename open loadimage close else drop 0 then ; +( image loading ) +: noop ; -: loadjor ( filename -- ) +: defer word new-word $DODEFERRED , ' noop , ; +: redefine ( cp cpdeferred ) cell + ! ; +: definition ( cpdeferred ) cell + @ ; + +defer onload +: postload onload ' noop ' onload redefine ; + +: loadimage ( -- [0 | onload] ) + fget fget fget fget fget ( onload tasks latest size start ) + here != if tell + seek drop drop drop 0 else + dup here fread here + here! latest! tasks! then ; + +: saveimage ( herestart -- ) + ' onload definition here drop fput + tasks fput + latest fput + dup here swap - fput + dup fput + dup here swap - swap fwrite ; + +( file loading ) +: loadimage-if-uptodate ( filename -- b ) + dup image-uptodate if imagefilename open loadimage close else drop 0 then + dup if execute 1 then ; + +: interpretjor ( filename -- ) open fdeactivate ' key-file load-input drop factivate close ; +: loadjor fdeactivate swap interpretjor postload factivate ; + : loadfile ( filename -- ) ( active file is preserved for the currently-loading file, but the new file is always loaded with no active files ) fdeactivate swap dup loadimage-if-uptodate not if - dup here swap loadjor - swap imagefilename overwrite saveimage close + dup here swap interpretjor + swap imagefilename overwrite saveimage close postload else drop then factivate ; diff --git a/defs.jim b/defs.jim index 8ad65f134175ac2d070dfb7d7611921f082d918e..ccece985b088153b39207f29adf3bebb54e8f1ff 100755 GIT binary patch literal 1462 zcmZ8hPiP!<6n;DNW_PnQJ2ML*R8VvqFR@8W8gnp9mzF3Zhykm?i`2>PtQnHssk6J; zga)NeEB>JuOA*w9h=K(1&%uKir-$HW4@$PtLm)j^^pJx^1VKjP_hxoum4%((eD8bj zd;fl;4 zLOcy(5wxoSJ~h(huAcXnU4Zk-4sRP{T95oO7)ozK#-mfvxLY7$(HXm||_LMGf#iw7Ch;QUKsOAUYggg!BTNz}6 zXNalD|50^Jy8}#Y5r3DzNM6hpYs7!#FH^%^O}3|ekJ~1)Ng=C|7&{x2+0sNTs$dD7s06uI;b9!bG*+v`+?ySc6Eb#q4{*yUG zRkz~T`-`)k`WUP81aeH#upv{B=rVz$@H%4=*A&81PFhEBak@NhjWBDkpq0r8biB(i z;@?nH-SL(ed{GTqiDw$|Q&xsrPIGC(lZ$mTEgBI!1GJf-Nxa0?v9gIraA;I8@5Fe` z$|c5T%c)5BZl*(456xd%`oOnu53Tq5n%_h7c*hT_alb~DFHEWIK|AT(eRf-s8f6w| z(f5+s<-bv#a3*ZV)jDBIo%{XFo5y7ur}|MY*~EWZzw>kU%tLfUBi^ujs?K45EGsbg zRMzAIbonKFAtOx_iP<>lq@BY;IF**Sl3XaA>(;JJ0!zOUpKjyyAx@IR>-HOT5Ba}W z=(;_)LJ@y$qm{whMAL1^zCMq6_ApnqAo5aamxl_ws&qf%J$r~cj@SA>`&gl#?(zfR q;geWk>Id78Ge1$tP~cWvZ$(!9t#l$G>$woSJzEe-ks6P`WB&jr_lP|J literal 1276 zcmY*Z&ubi29Dn=XcV^f5@m8?1l6pv~C|E^^ziQPgT1pg2E)jZkIy+0oW_QBOBuyn2 zty{1sK|M@BFLphsF%%N0pr!wSP)V7?7Q}-KLOpB+^{_p}&v#}wDmmoM=hydrzwf>E ztw-ux;!k?iGDVU$qm@)d^^8)Qr5%-%5BO}DF1D5dFBqC$G450rjG<~^mD4*GiQ{p^ z9)k?ZX#>DabA{CdH9)}E0G=!XP21KqePK1A`yTL96L>-#rIK#Y2+mzgikTM?q>+3; zjZpG{dK1K7@OGkzYviQuia3u|Mtgg!AP?G7vj(Me=yI{TE^}IUJ`k;ld&)?|{B1R(zT&89d}VZ3O5++Z=5qSdd0&Kumf4(cI$hBT z*2>%0C=8|T5_WS7wqX(VSRww^F~qqrSZX5RD0X_U+ZBQ5FXD4j^;$KjX~69$=HX;C z<^G$)eLd?|(f?^o?+o}UHzOg?t$R^Su#C7`MsLBH)7!2R?XUyww#6gJ+>sjMWV(!d zYX$xw@GE2dGxr`GvLCg_H)^-?F7A}2d2rhn&w5k!70>xDa8viyOR^9D-|ipiwMQd& zsD7r`(Rn%OpYY9pIqhKQZ7*Cp9dXr+WN~tM3c4y%FFEsg$WLR#Q%fQ cKL}U($bGZa+{SocD^$ dup @ ( b v val r: flag ) @@ -26,9 +24,6 @@ : :| inline| $DOCOLON , ; immediate : |; ' ret , |inline ; immediate -: defer word new-word $DODEFERRED , ' noop , ; -: redefine ( cp cpdeferred ) cell + ! ; - : array word new-word $DOVAR , ; : create word new-word $DOCREATE , 0 , ; @@ -56,6 +51,8 @@ : dobreak yield 0 ; : break ' rdrop , ' dobreak , ; immediate +: links begin yield @ dup not until ; + : min ( x y -- x|y ) 2dup > if swap then drop ; : max ( x y -- x|y ) 2dup < if swap then drop ; @@ -76,6 +73,18 @@ : task-stack task-user-size 3 + cells + ; : task-rstack task-stack stacksize cells + ; +: .wordin ( ptr -- ) + latest links each + 2dup > if wordname type drop 0 break then + more dup if . else drop then ; + +: tasks.s + tasks links each + dup .wordin s" : " type + dup task-sp @ over task-stack ( task stackLim stack ) + begin 2dup > while dup @ . cell + repeat + cr drop drop more ; + : doactivate ( task ip -- ) over task-ip ! dup task-stack over task-sp ! @@ -89,11 +98,16 @@ ' ret , ; immediate -: send ( val task -- ) +: try-send ( val task -- b ) + mailbox dup @ if drop drop 0 else ! 1 then ; + +: wait-send ( val task -- ) mailbox begin dup @ while suspend repeat ( wait for empty mailbox ) ! ; +: send ( val task -- ) try-send drop ; + : receive ( -- val ) running mailbox begin dup @ not while suspend repeat ( wait for mail ) diff --git a/entity.jim b/entity.jim new file mode 100755 index 0000000000000000000000000000000000000000..f69a6b0455fcea24b8e73411d0ea1786e75bb1c8 GIT binary patch literal 786 zcmYLHO=#3m5T3kDHrb!FSeo|&o+3z5S%tzLbYTV8qOzce_2(qGY_c`f?k=0Cl~Ry` zKZhRlrg-rrr8j@TiW*h3d z_1Mb6+||n$>J2zL4X|$MGQD)Aex7m#-dlNay^hxn{qP=aOqR_EIUdpEi4ftHy8n&w zvt>Y9dVGnBWx<3#Vln>NC!|V*YDP@(!d{2#4-$%H)C@N>suuJIe&`Vkq_(C0Qer&A z^Lwn@BgVlLzriOnyi9WkVT<~jwAd0aX1Locdv~Z~jc=*n@C|oxQy=0-9-#tjd|Ulp zaxg-mC9fM1R%yZedW=u_LpT-oZntkz>nH0akMS#iK#<>FAmnX={NRtE`roTfJ@x7x zBe_J{!EKey;0jzz+&(B2m`i*!pv%=+!@n5gV~FZSzGWe~5J2ZUd z7c(AE)&Nv!{&RSUwmNNB2&+-HVGeP|=Gdey8;J@~m3$m|pF^4lrX2js9Q;SVGD0OT t?sprite cell + @ execute ; +: entity>do ( entity event ) swap @ execute ; + +var entity-defstate +: entitydo-ev ( [cp ifhere] ev -- ) + entity-defstate @ if swap [ ' then , ] + else 1 entity-defstate ! :noname swap then + ' dup , lit ' = , [ ' if , ] ; +: :touch EVTOUCH entitydo-ev ; immediate +: :tick EVTICK entitydo-ev ; immediate +: ;entity ( entity cp ifhere -- ) + [ ' then , ] ' drop , [ ' ; , ] + 0 entity-defstate ! swap ! ; immediate + +0 const W +1 const E +2 const N +3 const S + +: dir>pos ( dir -- dx dy ) + dup W = if drop -1 0 ret then + dup E = if drop 1 0 ret then + N = if 0 -1 + else 0 1 then ; + +: frame ( s n e w ) b, b, b, b, ; +array frames +( 0: car ) 3 1 0 2 frame +( 1: pete stand ) 11 9 7 5 frame +( 2: pete walk ) 12 10 8 6 frame + +: sprindex ( dir frame ) 2 << frames + + b@ ; +: defstatic ( frame -- ) create b, does> b@ sprindex ; +: defanim ( frame... framecount ticks-per-frame -- ) + create b, dup b, 0 for b, next + does> ( dir a -- ) + dup dup 1 + b@ swap b@ ( dir a count tpf ) + ticks swap / swap % ( dir a index ) + 2 + + b@ sprindex ; + +0 defstatic {car} +1 defstatic {pete-stand} +1 2 2 5 defanim {pete-walk} diff --git a/footer.jim b/footer.jim new file mode 100755 index 0000000000000000000000000000000000000000..0c9fbf98d611be665e5deaf756d85d06c0fd4dbb GIT binary patch literal 1073 zcmah|Ur1AN6#m>j`{Q&CWeMKtPC@ZKn#`+6PLy`#o9w-yS35gY@0a2rzq+< z=p}mcp$GB7hv>=JL((7imKcQMQy4@_h(!;V>iq7O>#YkH?)QDabIy0pxj&nGr}2)z zjUsB7>cY)TCU0ar<}m65B5EDt+30LXnZ=?vsjeyZMw8O29T!7^z9F38a}QKvbT!DJ z29H@92nU11jBHq7sc$kMfr4dKK{(jY--MT{6PE)6!Qrt0V>{l-jNy?9dD4N8j6wt9 zz$7ClJ~QgCAQ!$%tx~QQisq0f%k|u7&{(V#tV4@NxH32_UDo5Y=0d1i(t{ojoeYLT zBNMD2LWn~rE)9;!HoUm5xsf*t`Hom7mC5oryhv(JTHAV19 z<`2|POLgO+X3~=b_Kd~)EOz;T?XpT0SMf!wwY1!{VZ_;>4L{la zR7#$&nAz4glp?vYuYFQXatjxdQ?YWsMejDdEK&`&Y@i|?Lr7VtaUnxWbWJqTVPR6c zP|y}>u)mOz< zvqS9KiUf4C#Q{3X{8_!5K8Op97Cj}>^d=gmw4+3J{xWG#*bz$^(JZ$mS7&Gi9>N~Y z>n;CzAgAz5ThZQIA#(rKk#F$G19}~DiOfIOrAVESD@m$mvq?``PbA|;^*Tx8Rego^ z%Ke*-Cgoa}^l{&o&!kOVK`tu)x*>f@|1G}iCjHRwN$#jT<|@)JeYKvq?yp5G5zR(< z@v_5yPrJR{UZh_CEsx3e*A&?;oLjav dup @ text-color ! cell + @ draw-portrait ; + +0 GREEN character pete +1 MAGENTA character mary +2 BROWN character chuck + diff --git a/game.exe b/game.exe index 22bfdb0344c64a0c691856a00502006cf09a8035..17a61a6fc3d2a876c4d28175b8c52ab2f98dc3e0 100755 GIT binary patch delta 28417 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 D4i-?5 delta 28073 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 WM&4?Syld$C;RC!Uw&oLdW&8u>5cuK% diff --git a/game.jim b/game.jim index 4d79ccd293a2106877af5816cdce9c1011110bbc..35c136b8c7f2b6ca32a420f35a0e2cabef146e32 100755 GIT binary patch literal 5243 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 Q#onC7nJ^C|b3a-A7m5=Z4gdfE literal 5381 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 Lhj2%9S!DPh2StUT diff --git a/game.jor b/game.jor index 0ecc60c..349b643 100755 --- a/game.jor +++ b/game.jor @@ -7,275 +7,16 @@ blah task const REPL REPL start-repl -1 const ^ESC -28 const ^ENTER -29 const ^CTRL -51 const ^< -52 const ^> -56 const ^ALT -57 const ^SPACE -72 const ^UP -75 const ^LEFT -77 const ^RIGHT -80 const ^DOWN - -: wait-key ( k -- ) begin dup key-pressed not while suspend repeat drop ; -: udelta ( u u -- u ) - 2dup u> if - swap -1 swap - + 1 + - else - swap - - then ; -: sleep ( count -- ) - ticks swap begin over ticks udelta over u< while suspend repeat drop drop ; - defer tick defer draw -0 const EVTICK -1 const EVTOUCH - -: defentity ( x y dir anim -- ) array ' drop , , , 4 << , 4 << , ; -: entity.x 4 cells + ; -: entity.y 3 cells + ; -: entity.dir 2 cells + ; -: entity>sprite cell + @ execute ; -: entity>do ( entity event ) swap @ execute ; - -var entity-defstate -: entitydo-ev ( [cp ifhere] ev -- ) - entity-defstate @ if swap [ ' then , ] - else 1 entity-defstate ! :noname swap then - ' dup , lit ' = , [ ' if , ] ; -: :touch EVTOUCH entitydo-ev ; immediate -: :tick EVTICK entitydo-ev ; immediate -: ;entity ( entity cp ifhere -- ) - [ ' then , ] ' drop , [ ' ; , ] - 0 entity-defstate ! swap ! ; immediate - -0 const W -1 const E -2 const N -3 const S - -: dir>pos ( dir -- dx dy ) - dup W = if drop -1 0 ret then - dup E = if drop 1 0 ret then - N = if 0 -1 - else 0 1 then ; - -: frame ( s n e w ) b, b, b, b, ; -array frames -( 0: car ) 3 1 0 2 frame -( 1: pete stand ) 11 9 7 5 frame -( 2: pete walk ) 12 10 8 6 frame - -: sprindex ( dir frame ) 2 << frames + + b@ ; -: defstatic ( frame -- ) create b, does> b@ sprindex ; -: defanim ( frame... framecount ticks-per-frame -- ) - create b, dup b, 0 for b, next - does> ( dir a -- ) - dup dup 1 + b@ swap b@ ( dir a count tpf ) - ticks swap / swap % ( dir a index ) - 2 + + b@ sprindex ; - -0 defstatic {car} -1 defstatic {pete-stand} -1 2 2 5 defanim {pete-walk} - -( timer + lerping ) -: clamp0 ( range val -- i ) - 2dup <= if drop else - dup 0 <= if drop drop 0 else - swap drop then then ; -: >ratio ( range value -- f ) - over swap clamp0 swap />ratio ; -: range ( start end -- start range ) over - ; -: >range r< >range r< ratio lerpr ; -: lerp ( start end duration start -- i ) - ticks udelta ( start end duration delta ) - >ratio lerpr ; - -: triggered ( duration timer -- b ) - dup r> @ ticks udelta ( duration delta ) - 2dup <= if drop r< +! 1 else drop drop rdrop 0 then ; - -: now! ( timer -- ) ticks swap ! ; -: advance! ( timer -- delta ) - dup @ ticks udelta ( timer delta ) - dup @ >rot ticks ( from to duration start ) - begin - 4dup lerp r@ ! - rot suspend - repeat rdrop drop drop drop drop ; - -: show-footer 48 10 footer-y move-to ; -: hide-footer 0 10 footer-y move-to ; - -: footer-wait show-footer ^ENTER wait-key ; - -: say ( s -- ) clear show-footer slowtext footer-wait ; -: say" [ ' s" , ] ' say expile ; immediate - -: character ( iportrait color ) create , , - does> dup @ text-color ! cell + @ draw-portrait ; - -0 GREEN character pete -1 MAGENTA character mary -2 BROWN character chuck - -( M O U S E ) - -var prevbutton -: tick-debounce - mousebuttons prevbutton ! ; - -1 const MOUSEL -2 const MOUSER -: mousedown ( button -- bool ) mousebuttons & ; -: clicked ( button -- bool ) - dup mousedown not swap - prevbutton @ & and ; - -( M A P ) -: +pos ( x1 y1 x2 y2 -- x y ) - rot + swap ; - -var tileselect -8 const MAXTILE - -: mouseworldpos mousepos scrollpos +pos ; -: world>tile 4 >> swap 4 >> swap ; -: mousetile mouseworldpos world>tile ; -: tile ( x y -- ptr ) mapsize drop * + map + ; - -1 const WALKABLE -2 const DRIVABLE - -array tileflags -( grass ) WALKABLE b, -( dirt ) WALKABLE b, -( water ) 0 b, -( pavement ) WALKABLE DRIVABLE | b, -( brick ) 0 b, -( forest ) 0 b, -( roof ) 0 b, -( brick ) 0 b, -( window ) 0 b, - -: mapflag? ( x y flag -- b ) >rot tile b@ tileflags + b@ & ; -: walkable? ( x y -- b ) WALKABLE mapflag? ; -: drivable? ( x y -- b ) DRIVABLE mapflag? ; - -: tick-mapedit - tileselect @ - ^< key-pressed if 1 - then - ^> key-pressed if 1 + then - dup 0 < if drop MAXTILE then - dup MAXTILE > if drop 0 then - tileselect ! - - MOUSEL mousedown if tileselect @ mousetile tile b! then - MOUSER clicked if mouseworldpos world>tile swap . . then ; - -: copy-mapseg ( neww oldw y -- ) - r> ( oldw neww r: y ) - 2dup min >rot ( copyw neww oldw ) - r@ * map + ( copyw neww src ) - swap r< * map + ( copyw src dst ) - swap ( newh neww oldw r: oldh ) - 2dup < if 1 r< else r< 1 - 0 then ( newh neww copyw ystart ylim ) - for 2dup i copy-mapseg next - drop swap mapsize! ; - -: save-map ( filename -- ) - fdeactivate swap overwrite - mapsize swap fput fput - mapsize * map fwrite - factivate ; - -: load-map ( filename -- ) - fdeactivate swap open - fget fget - 2dup * map fread - mapsize! - factivate ; +:noname +s" input.jor" loadfile +s" entity.jor" loadfile +s" timer.jor" loadfile +s" footer.jor" loadfile +s" map.jor" loadfile +; execute ( J O B ) var MODE-MOVE @@ -294,6 +35,7 @@ JOB listen-for-jobs ( T I C K ) defer entities +:noname 0 ; ' entities redefine : entity-at ( x y -- entity|0 ) 0 >rot @@ -371,8 +113,6 @@ player :tick ( S T U F F ) : hello-world - mary say" Hello, world!" - say" How are you\today?" player.state DRIVING f@ not player.state DRIVING f! ; : mode-move @@ -404,24 +144,6 @@ player :tick MODE-MOVE @ ' tick redefine ' full-draw ' draw redefine -( P E T E ) - -8 8 E ' {car} defentity car - -var cartimer -cartimer now! -car :tick 60 cartimer triggered if - :| car entity.dir @ E = if W else E then car entity.dir ! - car try-move-entity |; JOB send -then -:touch pete say" What an old rustbucket. -Hasn't driven in years." -;entity - :noname - player yield - car yield - 0 ; -' entities redefine - -s" pete.map" load-map + s" pete.jor" loadfile +; ' onload redefine diff --git a/game.prj b/game.prj index 8918e135027a036c2038e5097c3b023514a9c6bb..62bd7622c9d55e820b00ede1f5a93553be5f0180 100755 GIT binary patch delta 168 zcmX@2c~N77IvewzX_=d~*iNwV8i!~4Eth9t=yPUZaNhi%=P45_1H-OqnUi1gUygKR zR%2jbxWe@RzZSDBa}&dVrUyXwd>~%TaDr(qlNQqk1_nlM#@$S37-X2@n9P~lnZy_; zGi_naW>RJ}VDw=OWO8A8!Pvm~|GyuDAJ8lg25|fJc^4pv%9L@*;-q
    2IvaCzcj{&>wi9f;5#6bN#_|jdmCg(dMw|chJY{0#W=O0}o&1vja^y~C zH3kL-cjo{9=Q2-VZel264rXR&6k=Y?AjW9TtiU{%Ntv;jv5rxX*`BeV=_1oAre92* zjBL#6O!t_kF)n7@&v=AsJ5w~%XU6~k{TTd!W^pixGo0;8oh&M-Q~w_b^z>qYD8xC& z)6dx_)WtO>I5IdUIK(kT&jYAhfPs@Cvnth(ok4*kMvMbYvVciehKoxg{R9~-sssEa z8Dy4N_%Sg|U*PY@&)_*P(vOQ_@lsbmMTXf+Jp9BMa)Bm@G8~x`>G%IXLr0bqLyZIv m13!Z>JCF$d4>CW*H8{k{)kV*FbAsSBMi!96HvbX|X9NHN;aEff diff --git a/input.jim b/input.jim new file mode 100755 index 0000000000000000000000000000000000000000..0295e064caf6968d929c1c574674930e676aabc8 GIT binary patch literal 372 zcmXw#O-lkn9LAsBovfq?ZKhKZ5?umMc`yh;Y|HQ!T?smD=(baV%wwWCU$a{dn3Sh~irIi}`p$C)~mv*I<_Nq?34%TWNh) z22*&H!NUGtQep4;WOxzPuy_LzQof4*nJ?Ny|W+Q@b%djUt%NnN`0?t z*WEG&_}mfMt0KgDY&;IJp*m1|Ou<0yvo$&$sw4Kx{Wxpc7ZuNSohFJLSQqnfPpn$F zYF8YuY1uS&9*l?&ZN#F&hfJ2$MTI41(Qv%BU3EImNvlhpmY9ZBr$M_q Sx%G_*XdxC6Z(3KoBL5G_omq?k literal 0 HcmV?d00001 diff --git a/input.jor b/input.jor new file mode 100755 index 0000000..6ec48a2 --- /dev/null +++ b/input.jor @@ -0,0 +1,32 @@ +( K E Y B O A R D ) +1 const ^ESC +28 const ^ENTER +29 const ^CTRL +51 const ^< +52 const ^> +56 const ^ALT +57 const ^SPACE +72 const ^UP +75 const ^LEFT +77 const ^RIGHT +80 const ^DOWN + +: wait-key ( k -- ) begin dup key-pressed not while suspend repeat drop ; +: udelta ( u u -- u ) + 2dup u> if + swap -1 swap - + 1 + + else + swap - + then ; + +( M O U S E ) +var prevbutton +: tick-debounce + mousebuttons prevbutton ! ; + +1 const MOUSEL +2 const MOUSER +: mousedown ( button -- bool ) mousebuttons & ; +: clicked ( button -- bool ) + dup mousedown not swap + prevbutton @ & and ; diff --git a/jorth.c b/jorth.c index 128dbfa..5119d46 100755 --- a/jorth.c +++ b/jorth.c @@ -62,6 +62,20 @@ void f_latest() { PUSHCP(LATEST); } +void f_latest_set() { + LATEST = TOP().p; + DROP(1); +} + +void f_tasks() { + PUSHCP(TASKS); +} + +void f_tasks_set() { + TASKS = TOP().p; + DROP(1); +} + void f_state() { PUSHC(STATE); } @@ -948,6 +962,9 @@ void f_init() { CDEF("here", f_here); CDEF("here!", f_here_set); CDEF("latest", f_latest); + CDEF("latest!", f_latest_set); + CDEF("tasks", f_tasks); + CDEF("tasks!", f_tasks_set); CDEF("state", f_state); CDEF("'", f_quote); f_immediate(); CDEF("`", f_revlookup); diff --git a/keyboard.jor b/keyboard.jor new file mode 100755 index 0000000..6ec48a2 --- /dev/null +++ b/keyboard.jor @@ -0,0 +1,32 @@ +( K E Y B O A R D ) +1 const ^ESC +28 const ^ENTER +29 const ^CTRL +51 const ^< +52 const ^> +56 const ^ALT +57 const ^SPACE +72 const ^UP +75 const ^LEFT +77 const ^RIGHT +80 const ^DOWN + +: wait-key ( k -- ) begin dup key-pressed not while suspend repeat drop ; +: udelta ( u u -- u ) + 2dup u> if + swap -1 swap - + 1 + + else + swap - + then ; + +( M O U S E ) +var prevbutton +: tick-debounce + mousebuttons prevbutton ! ; + +1 const MOUSEL +2 const MOUSER +: mousedown ( button -- bool ) mousebuttons & ; +: clicked ( button -- bool ) + dup mousedown not swap + prevbutton @ & and ; diff --git a/map.jim b/map.jim new file mode 100755 index 0000000000000000000000000000000000000000..4572e795eb1965641968fdeb6c7eafaa2613ae3e GIT binary patch literal 664 zcmX|7&ubGw6n>d`Yty(@x+FPRnA!DcqX$dDgIyDU5P}T_D=G-eHrbY?TQ_E7i}fND zPijwssDD8VA|5PwkmAWh5f2hUg~fvu5#mXDnuBk)iMuQ_?|a|(y>B1O^{n6aI$IOB z1;ThMied9`2@}T6ggK~iP2`{xgnsOYexn1kd4T6)2R5 zb(ydpf6NumlWxTe7rnXA*Zos6mI@yb+H42Q1GJW+FQiE`8jHut&u<1DqHl=LJj$<+ zcJYhc#tiJT)wKGVRtW?8XMl6Oi+^Pi-wL2_f-1C&X=g)x=Qj)Y3tc>7Yp6dZc*4#>+mC}) zU#m#sVA;|#9q6I01G~6`Pi>dN=Q<*}-QNdlrl6;Ebhk z&dx&YEf37^84lKsvgP2Gu|=m&_00$<`+FjWk=N{}(8MX@BfWW3lXi_6OVj=Vc15&+ literal 0 HcmV?d00001 diff --git a/map.jor b/map.jor new file mode 100755 index 0000000..20cc6fd --- /dev/null +++ b/map.jor @@ -0,0 +1,66 @@ +( M A P ) +: +pos ( x1 y1 x2 y2 -- x y ) + rot + swap ; + +var tileselect +8 const MAXTILE + +: mouseworldpos mousepos scrollpos +pos ; +: world>tile 4 >> swap 4 >> swap ; +: mousetile mouseworldpos world>tile ; +: tile ( x y -- ptr ) mapsize drop * + map + ; + +1 const WALKABLE +2 const DRIVABLE + +array tileflags +( grass ) WALKABLE b, +( dirt ) WALKABLE b, +( water ) 0 b, +( pavement ) WALKABLE DRIVABLE | b, +( brick ) 0 b, +( forest ) 0 b, +( roof ) 0 b, +( brick ) 0 b, +( window ) 0 b, + +: mapflag? ( x y flag -- b ) >rot tile b@ tileflags + b@ & ; +: walkable? ( x y -- b ) WALKABLE mapflag? ; +: drivable? ( x y -- b ) DRIVABLE mapflag? ; + +: tick-mapedit + tileselect @ + ^< key-pressed if 1 - then + ^> key-pressed if 1 + then + dup 0 < if drop MAXTILE then + dup MAXTILE > if drop 0 then + tileselect ! + + MOUSEL mousedown if tileselect @ mousetile tile b! then + MOUSER clicked if mouseworldpos world>tile swap . . then ; + +: copy-mapseg ( neww oldw y -- ) + r> ( oldw neww r: y ) + 2dup min >rot ( copyw neww oldw ) + r@ * map + ( copyw neww src ) + swap r< * map + ( copyw src dst ) + swap ( newh neww oldw r: oldh ) + 2dup < if 1 r< else r< 1 - 0 then ( newh neww copyw ystart ylim ) + for 2dup i copy-mapseg next + drop swap mapsize! ; + +: save-map ( filename -- ) + fdeactivate swap overwrite + mapsize swap fput fput + mapsize * map fwrite + factivate ; + +: load-map ( filename -- ) + fdeactivate swap open + fget fget + 2dup * map fread + mapsize! + factivate ; diff --git a/pete.jim b/pete.jim new file mode 100755 index 0000000000000000000000000000000000000000..41fffe78b38978b68527023718d3ce394f0d3535 GIT binary patch literal 239 zcmZ3gUaH8d{*>XP+7vZrhUCN|hF}pf^;!u=h6W(~sKx;jE6L1F1xYY4tm0>2+0Vkj zV9k7$B}RQeiw%R2`UFW3`x8rq`YQgPYGz`WnYG11@?PqS;-^`B)V0MyqPLlUs@19f zVF^~U5CoaQ2sUG(dW763mig-88HptdiFpe7IVlQ7rNt#lrODZ;C3?JE9*MLm&( zMVV!(c?y|%3YDpeMa6my|768j{;;g#|HQHzXl=H#HQ!G)Yd(*F ViRF@dL25~=UT$Im!*_*0EC6J$Nr(Ud literal 0 HcmV?d00001 diff --git a/pete.jor b/pete.jor new file mode 100755 index 0000000..0263573 --- /dev/null +++ b/pete.jor @@ -0,0 +1,24 @@ +( P E T E ) + +8 8 E ' {car} defentity car + +var cartimer +car :tick 60 cartimer triggered if + :| car entity.dir @ E = if W else E then car entity.dir ! + car try-move-entity |; JOB send +then +:touch pete say" What an old rustbucket. +Hasn't driven in years." +;entity + +:noname + :| + player yield + car yield + 0 |; + ' entities redefine + + cartimer now! + s" pete.map" load-map +; ' onload redefine + diff --git a/timer.jim b/timer.jim new file mode 100755 index 0000000000000000000000000000000000000000..0c21a1547c115bb6fa2f55df1e79e1130bcf330d GIT binary patch literal 438 zcmX|-Jxjw-6oyZe*II2vT1&{yAjF|l1ra(3C4&xKT%_P0+Dk1oX^Exo{tADCIFzn_ z^ao@TaS~jVii6SfRd*hcTP#*cLuEgyshe9{uwg=Eje6Bos~r(hN(b@^2-Bp;)6)-0OB_EIX_a z>Uc7>o~<_(HhjFBGvp}29iMEp(&ZE`xiA`Bcxj=B7ry<2C{WND2T@yUOp7i;jXM+` z#VUn^vD_W$cgSX$R;k>u#-hmuH4vJd+2Lobx~3K86BOJQ&&)oBZ(i`cFXeDCvT3U?tGx<;Vgqoe literal 0 HcmV?d00001 diff --git a/timer.jor b/timer.jor new file mode 100755 index 0000000..f5b2d08 --- /dev/null +++ b/timer.jor @@ -0,0 +1,37 @@ +( timer + lerping ) +: clamp0 ( range val -- i ) + 2dup <= if drop else + dup 0 <= if drop drop 0 else + swap drop then then ; +: >ratio ( range value -- f ) + over swap clamp0 swap />ratio ; +: range ( start end -- start range ) over - ; +: >range r< >range r< ratio lerpr ; +: lerp ( start end duration start -- i ) + ticks udelta ( start end duration delta ) + >ratio lerpr ; + +: triggered ( duration timer -- b ) + dup r> @ ticks udelta ( duration delta ) + 2dup <= if drop r< +! 1 else drop drop rdrop 0 then ; + +: now! ( timer -- ) ticks swap ! ; +: advance! ( timer -- delta ) + dup @ ticks udelta ( timer delta ) + dup @ >rot ticks ( from to duration start ) + begin + 4dup lerp r@ ! + rot suspend + repeat rdrop drop drop drop drop ; + +: sleep ( count -- ) + ticks swap begin over ticks udelta over u< while suspend repeat drop drop ;