diff --git a/boot.jim b/boot.jim index ce571b7..27ecbc0 100755 Binary files a/boot.jim and b/boot.jim differ diff --git a/boot.jor b/boot.jor index 8d6cd67..b39e239 100755 --- a/boot.jor +++ b/boot.jor @@ -57,7 +57,7 @@ key " const '"' : definition ( cpdeferred ) cell + @ ; defer onload -: postload onload ' noop ' onload redefine ; +: postload ' onload definition ' noop ' onload redefine execute ; : loadimage ( -- [0 | onload] ) fget fget fget fget fget ( onload tasks latest size start ) diff --git a/defs.jim b/defs.jim index ccece98..7ed7c39 100755 Binary files a/defs.jim and b/defs.jim differ diff --git a/defs.jor b/defs.jor index 3df7f50..cd1bca0 100755 --- a/defs.jor +++ b/defs.jor @@ -65,6 +65,8 @@ 1 + ( cp i+1 ) repeat drop drop then drop ; +: words latest links each dup wordname type bl more ; + ( tasks ) : mailbox 2 cells + ; : task-ip task-user-size cells + ; diff --git a/entity.jim b/entity.jim index f69a6b0..d6f167e 100755 Binary files a/entity.jim and b/entity.jim differ diff --git a/entity.jor b/entity.jor index f87c75d..bcec31b 100755 --- a/entity.jor +++ b/entity.jor @@ -7,6 +7,8 @@ : entity.dir 2 cells + ; : entity>sprite cell + @ execute ; : entity>do ( entity event ) swap @ execute ; +: entity>pos dup entity.x @ swap entity.y @ ; +: entity.pos! ( x y entity ) rot ( b b x w ) >= or or ; +: leaving? ( x y dir -- b ) + dup N = if drop swap drop 0 < else + dup W = if drop drop 0 < else + S = if swap drop mapsize swap drop >= else + drop mapsize drop >= then then then ; + : no-touch drop drop 0 ; defer player-touch ( x y -- b ) ' no-touch ' player-touch redefine @@ -141,9 +128,7 @@ player :tick draw-screen draw-footer ; +:noname MODE-MOVE @ ' tick redefine ' full-draw ' draw redefine - -:noname - s" pete.jor" loadfile -; ' onload redefine +; ' onload redefine \ No newline at end of file diff --git a/game.prj b/game.prj index 62bd762..ac99acb 100755 Binary files a/game.prj and b/game.prj differ diff --git a/gameboot.jor b/gameboot.jor new file mode 100755 index 0000000..2080b7a --- /dev/null +++ b/gameboot.jor @@ -0,0 +1,22 @@ +: blah ' seremit task-emit ! ; +blah + +: start-repl activate blah + s" .:: J O R T H ( jean forth) ::." type cr + begin receive loadstring s" ok" type cr again ; +task const REPL +REPL start-repl + +defer tick +defer draw + +:noname +s" input.jor" loadfile +s" entity.jor" loadfile +s" timer.jor" loadfile +s" footer.jor" loadfile +s" map.jor" loadfile +s" game.jor" loadfile + +s" pete.jor" loadfile +; ' onload redefine diff --git a/input.jim b/input.jim index 0295e06..6c9b75f 100755 Binary files a/input.jim and b/input.jim differ diff --git a/jorth.c b/jorth.c index 5119d46..e402a0e 100755 --- a/jorth.c +++ b/jorth.c @@ -844,6 +844,14 @@ void f_loadfile(char *filename) { f_cexecute(); } +void f_loadjor(char *filename) { + PUSHS(filename); + PUSHS("loadjor"); + f_lookup(); + DROP(1); + f_cexecute(); +} + // does not use the jorth interpreter defined in boot.jor void f_loadfile_cterp(char *filename) { cell *start = HERE; diff --git a/map.jim b/map.jim index 4572e79..c61b8e5 100755 Binary files a/map.jim and b/map.jim differ diff --git a/pete.jim b/pete.jim index 41fffe7..93e9e96 100755 Binary files a/pete.jim and b/pete.jim differ diff --git a/pete.jor b/pete.jor index 0263573..2416acb 100755 --- a/pete.jor +++ b/pete.jor @@ -1,24 +1,24 @@ ( P E T E ) -8 8 E ' {car} defentity car +13 8 N ' {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." +car :touch + 1 player.state DRIVING f! + car entity>pos player entity.pos! ;entity :noname - :| - player yield - car yield - 0 |; - ' entities redefine + :| player yield + player.driving? not if car yield then + 0 |; ' entities redefine - cartimer now! + ( TODO: DSL for touch events? ) + :| 2dup S leaving? player.driving? not and if + pete say" It's too far to walk to town." 1 else + 2dup 12 7 2= if + player.driving? not if pete say" TODO: Go home" then 1 + else 0 then then >rot drop drop + |; ' player-touch redefine s" pete.map" load-map ; ' onload redefine diff --git a/testbed.c b/testbed.c index 123749e..9eef18f 100755 --- a/testbed.c +++ b/testbed.c @@ -213,7 +213,7 @@ void game_f_init() { CDEF("mousepos", f_mousepos); CDEF("mousebuttons", f_mousebuttons); CDEF("unfuck", tile_init); - f_loadfile("game.jor"); + f_loadjor("gameboot.jor"); } void f_poll() { diff --git a/timer.jim b/timer.jim index 0c21a15..7078a5c 100755 Binary files a/timer.jim and b/timer.jim differ