From 812cdb20bae193197a36d220e3ca985e466696a5 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 28 Sep 2019 23:19:02 -0400 Subject: [PATCH] ducks, space, mark user words --- boot.jor | 1 + defs.jor | 17 ++++++++---- entity.jor | 19 ++++++++------ footer.jor | 16 ++++++------ game.exe | Bin 113775 -> 113937 bytes game.jor | 24 ++++++++--------- game.prj | Bin 5721 -> 5721 bytes gameboot.jor | 1 + jiles.jor | 2 +- jopl.jor | 72 +++++++++++++++++++++++++-------------------------- jorth.c | 9 ++++--- jorth.h | 1 + map.jor | 11 ++++---- pete.jor | 5 ++++ space | Bin 0 -> 2504 bytes space.jor | 26 +++++++++++++++++++ space.map | Bin 0 -> 2504 bytes sprite.gfx | Bin 10240 -> 10240 bytes state.jor | 24 ++++++++--------- testbed.c | 13 +++++++--- tiles.gfx | Bin 8192 -> 8192 bytes 21 files changed, 146 insertions(+), 95 deletions(-) create mode 100755 space create mode 100755 space.jor create mode 100755 space.map diff --git a/boot.jor b/boot.jor index eb75bbd..003c392 100755 --- a/boot.jor +++ b/boot.jor @@ -8,6 +8,7 @@ key ) const ')' key const sp 128 const F_IMMEDIATE +0x100 const F_USERWORD : cr '\n' emit ; : bl sp emit ; diff --git a/defs.jor b/defs.jor index d753419..82b5533 100755 --- a/defs.jor +++ b/defs.jor @@ -19,9 +19,11 @@ : f! ( b v flag -- ) >rot >r r@ @ >rot ( val flag b r: v ) if | else ~ & then if wordname type drop 0 break then - more dup if . else drop then ; + more dup if . else drop then ; userword : 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 ; + cr drop drop more ; userword : doactivate ( task ip -- ) over task-ip ! diff --git a/entity.jor b/entity.jor index 34aef9c..5ae492c 100755 --- a/entity.jor +++ b/entity.jor @@ -1,14 +1,14 @@ 0 const EVTICK 1 const EVTOUCH -: world>tile 4 >> swap 4 >> swap ; -: tile>world 4 << swap 4 << swap ; +: world>tile 4 >> swap 4 >> swap ; userword +: tile>world 4 << swap 4 << swap ; userword : +pos ( x1 y1 x2 y2 -- x y ) - rot + swap ; + rot + swap ; userword : -pos ( x1 y1 x2 y2 -- x y ) - negate swap negate swap +pos ; + negate swap negate swap +pos ; userword : defentity ( x y dir anim -- ) array ' drop , , , tile>world , , ; : entity.x 4 cells + ; @@ -16,8 +16,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 ) pos dup entity.x @ swap entity.y @ ; userword +: entity.pos! ( x y entity ) b@ sprindex ; @@ -98,8 +99,10 @@ array frames 38 defsingle {fridge} 43 defsingle {boat} 8 defstatic {boat-pete} +9 defstatic {duck} +46 defsingle {aliem} : sprite-bob ( x y sprindex -- x y sprindex ) - ticks 40 % 20 < if - dup 39 >= over 43 <= and if swap 1 + swap then + dup 39 >= over 46 <= and if + >rot 2dup + ticks + 40 % 20 < if 1 + then dup @ text-color ! cell + @ draw-portrait ; -0 GREEN character pete -1 MAGENTA character mary -2 BROWN character chuck -3 YELLOW character jeanne -4 LGRAY character phone +0 GREEN character pete userword +1 MAGENTA character mary userword +2 BROWN character chuck userword +3 YELLOW character jeanne userword +4 LGRAY character phone userword : noone WHITE text-color ! s" " dup dup dup - 8 portraity 16 portraity 24 portraity 32 portraity ; + 8 portraity 16 portraity 24 portraity 32 portraity ; userword diff --git a/game.exe b/game.exe index d103dbc7581b36e05a995c9cbde7b0e0fc4ec42d..7cbb0df1c0695cfe195013ea0f31998a4a32896b 100755 GIT binary patch delta 32405 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 q*O`^sa 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 diff --git a/game.jor b/game.jor index d4a9cad..96df770 100755 --- a/game.jor +++ b/game.jor @@ -26,20 +26,20 @@ defer entities more drop drop ; ( P L A Y E R ) -var player.state +var player.state userword var player.prevdir -1 const MOVING -2 const DRIVING -4 const BOATING -8 const NOCLIP -16 const ISMARY -32 const ISJEANNE +1 const MOVING userword +2 const DRIVING userword +4 const BOATING userword +8 const NOCLIP userword +16 const ISMARY userword +32 const ISJEANNE userword -: noclip player.state NOCLIP fnot! ; +: noclip player.state NOCLIP fnot! ; userword -: player.driving? player.state DRIVING f@ ; -: player.boating? player.state BOATING f@ ; +: player.driving? player.state DRIVING f@ ; userword +: player.boating? player.state BOATING f@ ; userword : :playerwalk create , , does> player.state MOVING f@ not if cell + then @ execute ; @@ -117,7 +117,7 @@ defer player-touch ( x y -- b ) var q-level var q-player.x var q-player.y -: queue-level q-level ! q-player.y ! q-player.x ! ; +: queue-level q-level ! q-player.y ! q-player.x ! ; userword player :tick 0 ^LEFT key-down if drop 1 W player entity.dir ! then @@ -130,7 +130,7 @@ player :tick ( S T U F F ) : reset-level :| done |; ' entities redefine - :| drop drop 0 |; ' player-touch redefine ; + :| drop drop 0 |; ' player-touch redefine ; userword : mode-move entities each EVTICK entity>do more diff --git a/game.prj b/game.prj index 3bebd242fd81c4aa287830016782a038ef368659..f86305753050c97952c1c44f02f210c60f20a3c3 100755 GIT binary patch delta 154 zcmcbqb5m!7IvcZAoy}$~wi9f;Qgt@|lFAGWACnmv9&G;4^PGuU9Vqvbe>Nk3G^09W z0s{ks2!kxcj0&5{lLft*uTvh?A>}o-6m?((0GJIi Ah5!Hn delta 151 zcmcbqb5m!7IvaEP2II|IY$w=w6V^!hiz_oQd`xCwxWD;7&vPc`6rkKo{@IND>WtBh z2@DJjA`G$&fg6k`PZsoM4p}2H`JtdV3s9J0@*hEWKA?nuh-+|&ldFrKGsEOoArmeJ x1`Y;s2DQ>nev_kxq|d9Lhl(_z)~wj@<66-mK1eh1OVDRF8Tlf diff --git a/gameboot.jor b/gameboot.jor index b0e863c..33f4fde 100755 --- a/gameboot.jor +++ b/gameboot.jor @@ -31,6 +31,7 @@ intern petehous.jor intern road.jor intern jeanne.jor intern trail1.jor +intern space.jor intern mpete.jor intern mroad.jor intern mjeanne.jor diff --git a/jiles.jor b/jiles.jor index de24232..517ce69 100755 --- a/jiles.jor +++ b/jiles.jor @@ -84,7 +84,7 @@ var copysrc ^TAB key-pressed if jiles-old-draw @ ' draw redefine jiles-old-tick @ ' tick redefine - mousehide unfuck invalidate-map reloadtiles + mousehide unfuck invalidate-map reloadtiles load-footer then tick-debounce ; diff --git a/jopl.jor b/jopl.jor index ab40d3d..9b8ff8f 100755 --- a/jopl.jor +++ b/jopl.jor @@ -57,7 +57,7 @@ var op : freqon ( oct freq -- ) dup 0xff & ar-freq adlib! 8 >> 0x03 & swap 2 << | 0x20 | ar-note adlib! ; -: noteoff ( -- ) 0 ar-note adlib! ; +: noteoff ( -- ) 0 ar-note adlib! ; userword array semitones 3520 3520 />ratio , @@ -91,44 +91,44 @@ array semitones ' ar-sr read-sbi-op-reg ' ar-wave read-sbi-op-reg fgetc ar-alg adlib! - close ; + close ; userword : rndbyte 256 rnd dup . ; : rndop rndbyte rndbyte rndbyte rndbyte rndbyte s" loadop " type loadop ; : rndinst s" op1 " type op1 rndop s" op2 " type op2 rndop - rndbyte s" ar-alg adlib! " type cr ar-alg adlib! ; + rndbyte s" ar-alg adlib! " type cr ar-alg adlib! ; userword -: panic 9 -1 for i voice ! noteoff next ; +: panic 9 -1 for i voice ! noteoff next ; userword var songticks var notestate var octave -: oct+ octave @ 12 * + ; -: rest songticks @ begin suspend dup songticks @ != until drop ; -: beat begin dup songticks @ swap % 0 != while rest repeat drop ; -: %O octave ! ; -: %V voice ! ; +: oct+ octave @ 12 * + ; userword +: rest songticks @ begin suspend dup songticks @ != until drop ; userword +: beat begin dup songticks @ swap % 0 != while rest repeat drop ; userword +: %O octave ! ; userword +: %V voice ! ; userword : mknote create b, does> ub@ oct+ notestate @ if b, else noteon rest then ; -: %loop 0xfe b, , ; +: %loop 0xfe b, , ; userword : mod % ; -: % notestate @ if 0xf0 b, else rest then ; -: %% 0 for % next ; -: %- notestate @ if 0xfd b, else noteoff then ; -: %do 0xff b, , ; +: % notestate @ if 0xf0 b, else rest then ; userword +: %% 0 for % next ; userword +: %- notestate @ if 0xfd b, else noteoff then ; userword +: %do 0xff b, , ; userword -11 mknote G# -10 mknote G -9 mknote F# -8 mknote F -7 mknote E -6 mknote D# -5 mknote D -4 mknote C# -3 mknote C -2 mknote B -1 mknote A# -0 mknote A +11 mknote G# userword +10 mknote G userword +9 mknote F# userword +8 mknote F userword +7 mknote E userword +6 mknote D# userword +5 mknote D userword +4 mknote C# userword +3 mknote C userword +2 mknote B userword +1 mknote A# userword +0 mknote A userword array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , @@ -144,9 +144,9 @@ array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , : track-tick ( i -- ) track dup @ dotrack swap ! ; -: :track create here 1 notestate ! does> voice @ track ! ; -: ;track %loop 0 notestate ! ; -: shush 0 voice @ track ! %- ; +: :track create here 1 notestate ! does> voice @ track ! ; userword +: ;track %loop 0 notestate ! ; userword +: shush 0 voice @ track ! %- ; userword : prev-name ( wordname -- wordname ) 2 cells - @ 2 cells + ; @@ -167,7 +167,7 @@ array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , : emit-track ( 'track -- ) -1 octave ! dup ` swap 2 cells + 'name :track type bl swap type bl - begin dup ub@ emit-cmd while 1 + repeat drop ; + begin dup ub@ emit-cmd while 1 + repeat drop ; userword ( T E X T ) @@ -234,7 +234,7 @@ var textleft : trackstatus cr voice @ showtrack ; -var tempo 1 tempo ! +var tempo userword 1 tempo ! : player 1 songticks +! songticks @ tempo @ mod 0 = if @@ -257,7 +257,7 @@ var t2 16 b, 3 b, 17 b, 4 b, 18 b, 19 b, 6 b, 20 b, 7 b, 21 b, 8 b, 22 b, 23 b, 10 b, 24 b, 11 b, 25 b, |inline ] 0 29 for dup i + ub@ key-pressed if drop i 3 + rdrop rdrop ret then next - drop 51 key-pressed if 15 else 0 then ; + drop 51 key-pressed if 15 else 0 then ; userword : onkeynote ( cp -- ) keynote dup if oct+ swap execute else drop drop then ; @@ -293,7 +293,7 @@ var stopkeys 41 key-pressed if 0xfd setnote then 52 key-down if 0xf0 setnote then |; dokeys - 0x1f textattr ! ; + 0x1f textattr ! ; userword : jamkeys stoponesc voicekeys @@ -301,7 +301,7 @@ var stopkeys 41 key-pressed if noteoff then 88 key-pressed if rndinst then ; -: jam ' jamkeys dokeys ; +: jam ' jamkeys dokeys ; userword var menuscroll var menuy @@ -360,9 +360,9 @@ defer onselect key-menu if s" *.sbi" draw-filemenu then 28 key-pressed if 1 stopkeys ! then |; dokeys - |; 66 1 13 menu-at ; + |; 66 1 13 menu-at ; userword -: dune ( -- ) s" dune" chdir inst s" .." chdir ; +: dune ( -- ) s" dune" chdir inst s" .." chdir ; userword :noname 9 -1 for i voice ! default next diff --git a/jorth.c b/jorth.c index c47c5e2..087be45 100755 --- a/jorth.c +++ b/jorth.c @@ -572,11 +572,12 @@ void f_wordname() { TOP().p = TOP().p + 2; } void f_wordflags() { - TOP().u = TOP().p[1].u; + TOP().p = TOP().p + 1; } + void f_codepointer() { unsigned int flags = TOP().p[1].u; - TOP().p = CELL_OFFSET(TOP().p + 2, (flags & ~F_IMMEDIATE) + 1); + TOP().p = CELL_OFFSET(TOP().p + 2, (flags & F_NAMELEN_MASK) + 1); } void f_lookup() { // name -- (codepointer flags) | (name 0) @@ -587,8 +588,8 @@ void f_lookup() { // name -- (codepointer flags) | (name 0) while (entry) { PUSHP(entry); - f_wordflags(); - if (len == (TOP().u & ~F_IMMEDIATE)) { + f_wordflags(); f_get(); + if (len == (TOP().u & F_NAMELEN_MASK)) { PUSHS(name); PUSHP(entry); f_wordname(); diff --git a/jorth.h b/jorth.h index 79819a4..9cee4f8 100755 --- a/jorth.h +++ b/jorth.h @@ -36,6 +36,7 @@ extern cell W; extern cell *rstack; extern cell *stack; +#define F_NAMELEN_MASK 0x7f #define F_IMMEDIATE 0x80 #define CELL_OFFSET(cp, b) ((cell*)(((char *)(cp)) + b)) diff --git a/map.jor b/map.jor index 59d4fa9..5e0b470 100755 --- a/map.jor +++ b/map.jor @@ -31,6 +31,7 @@ array tileflags ( fence ) 0 b, ( storefront ) 0 b, ( space ) 0 b, +( space2 ) BOATABLE b, here tileflags - 1 - const MAXTILE @@ -61,7 +62,7 @@ here tileflags - 1 - const MAXTILE swap mapsize >r ( newh neww oldw r: oldh ) 2dup < if 1 i_`Er^4L; literal 0 HcmV?d00001 diff --git a/space.jor b/space.jor new file mode 100755 index 0000000..ff30391 --- /dev/null +++ b/space.jor @@ -0,0 +1,26 @@ +( S P A C E ) + +24 10 N ' {aliem} defentity aliem +28 28 N ' {pete-bed} defentity bed +19 21 N ' {phone} defentity e_phone + +aliem :touch + pete say" hey mr aliem" +;entity + +:noname +:| aliem yield bed yield e_phone yield done |; ' entities redefine + +:| touch-begin S leaving? dup + if move-player 0 glitchlevel ! 19 0 pete.jor queue-level then +touch-next 5 11 2= dup + if move-player 41 37 tile>world player entity.pos! then +touch-next 41 37 2= dup + if move-player 5 11 tile>world player entity.pos! then +touch-next 44 23 2= dup + if pete say" It's...." say" home." then +touch-last |; ' player-touch redefine + +s" space.map" load-map +4 glitchlevel ! +; ' onload redefine diff --git a/space.map b/space.map new file mode 100755 index 0000000000000000000000000000000000000000..bede0abdfe088ec67a5ebbb40f247a47f16e72af GIT binary patch literal 2504 zcmb`I3vPoj5JXW_3N4M2R^}qP|KYm7S=+G2AO*Gc+MYMFhJ?O`*N}p1U4z9pEv=#X z`9M-ajIrGrhlxsxmfjR(Y-%-Z$vut*{%gkyPv-;*ShE^6_H2}8YP;CZWv(_9rZ-&H zU;|)(-GZJ*^(ceQ^@m1Q3$)fm9FYAPstGfVhkaKX5XZoScRhqAeYKL@nX3<=!cqwS z!1OQEDAAXzVy58=@g)6&i8CEp6VtVfIZdBany++~(npbTrnLv@pYh3mt?k{=yjS*7 z-T>b^56=-3W^jQhp80*bR}HM)j3q4(Mbff lzi_R`VIV*Ws??%Z)H7Bq!WHzIQ!723kIv$o0$i%nsedSNvPS>_ literal 0 HcmV?d00001 diff --git a/sprite.gfx b/sprite.gfx index a088d0eac1e3c4bc7fda3eca2ed6b4c21fd550b5..b1a0fdb041ac089de4df1fa24602a7db728853b5 100755 GIT binary patch delta 490 zcmZn&Xb9NQC0&2|f8&3~?~D(aKd^sb|MB%dIyn7*__kavxnLNl>c@ATmL8A^7fHG