From a876a9332f3d6bf386f754ca3f7e4fd0b0087f62 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 17 Feb 2019 20:14:56 -0500 Subject: [PATCH] Tile map editing UI --- game.exe | Bin 108563 -> 109136 bytes game.jor | 110 +++++++++++++++++++++++++++++++++++++++-------------- game.prj | Bin 5265 -> 5265 bytes jorth.c | 23 +++++------ jorth.h | 1 - sprite.tif | Bin 4078 -> 4078 bytes testbed.c | 31 ++++++++++++++- tiles.c | 21 +--------- tiles.h | 23 +++++++++++ 9 files changed, 145 insertions(+), 64 deletions(-) diff --git a/game.exe b/game.exe index f615d956794d6240f64216937a6c5fdcd004bdc8..956badc70dbfe8e211a235ff743059d7abe24465 100755 GIT binary patch delta 24442 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 AmH+?% delta 24002 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 TjJ0(t^IyS&b`D;_Zm9kb9&cXj diff --git a/game.jor b/game.jor index 546e3df..0968b20 100755 --- a/game.jor +++ b/game.jor @@ -13,6 +13,8 @@ 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 @@ -43,6 +45,12 @@ defer draw 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 ; + : defsprite ( s n e w ) b, b, b, b, here 4 - const ; : sprindex ( sprite dir ) + b@ ; @@ -50,8 +58,8 @@ defer draw defentity player -100 player entity.x ! -100 player entity.y ! +128 player entity.x ! +128 player entity.y ! ( timer + lerping ) : clamp0 ( range val -- i ) @@ -59,9 +67,8 @@ defentity player dup 0 <= if drop drop 0 else swap drop then then ; : >ratio ( range value -- f ) - over swap clamp0 >fix swap >fix fix/ ; -: fix fix* ratio ; +: range ( start end -- start range ) over - ; : >range r< ? ) +var move-timer +var move-speed -: move-footer-to ( ytarget -- ) - footer-y @ swap ( from to -- ) - footer-timer now! +: move-to ( p target speed -- ) + move-speed ! swap dup r> @ swap ( from to -- ) + move-timer now! begin - 2dup 10 footer-timer lerp ( from to now -- ) - dup footer-y ! + 2dup move-speed @ move-timer lerp ( from to now -- ) + dup r< dup r> ! over != ( from to -- ) while suspend - repeat drop drop ; + repeat drop drop r< drop ; -: show-footer 24 move-footer-to ; -: hide-footer 0 move-footer-to ; +: show-footer footer-y 24 10 move-to ; +: hide-footer footer-y 0 10 move-to ; : say1 ( s -- ) clear text1 show-footer ^ENTER wait-key ; : say2 ( s1 s2 -- ) clear text2 text1 show-footer ^ENTER wait-key ; -( T I C K ) +( M O U S E ) -: tick-player - 0 ^LEFT key-down if 3 - W player entity.dir ! then - ^RIGHT key-down if 3 + E player entity.dir ! then - player entity.x +! - 0 ^UP key-down if 3 - N player entity.dir ! then - ^DOWN key-down if 3 + S player entity.dir ! then - player entity.y +! ; +var prevbutton +: tick-debounce + mousebuttons prevbutton ! ; +1 const MOUSEL +: mousedown ( button -- bool ) mousebuttons & ; +: clicked ( button -- bool ) + dup mousedown not swap + prevbutton @ & and ; + +( M A P ) +: +pos ( x1 y1 x2 y2 -- x y ) + rot + rot rot + swap ; + +var tileselect +3 const MAXTILE + +: mouseworldpos mousepos scrollpos +pos ; +: mousetile mouseworldpos 4 >> swap 4 >> swap ; +: tile ( x y -- ptr ) mapsize drop * + map + ; + +: 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 ; + + +( J O B ) var MODE-MOVE var MODE-WAIT -( J O B ) : listen-for-jobs activate blah begin receive MODE-WAIT @ ' tick redefine @@ -131,15 +164,35 @@ var MODE-WAIT task const JOB JOB listen-for-jobs -: hello-world s" Hello, world!" say1 s" How are you" s" today?" say2 ; +( T I C K ) + +: move-player + player entity.dir @ dir>pos + dup if swap drop player entity.y ( d v -- ) + else drop player entity.x then + swap 16 * over @ + 5 move-to ; + +: tick-player + 0 ^LEFT key-down if drop 1 W player entity.dir ! then + ^RIGHT key-down if drop 1 E player entity.dir ! then + ^UP key-down if drop 1 N player entity.dir ! then + ^DOWN key-down if drop 1 S player entity.dir ! then + if ' move-player JOB send then ; + +: hello-world + s" Hello, world!" say1 + s" How are you" s" today?" say2 ; : mode-move tick-player + tick-mapedit ^SPACE key-pressed if ' hello-world JOB send - then ; + then + tick-debounce ; + ' mode-move MODE-MOVE ! -' noop MODE-WAIT ! +' tick-debounce MODE-WAIT ! : draw-player player entity.x @ @@ -153,8 +206,9 @@ JOB listen-for-jobs scroll draw-player - 50 50 0 draw-sprite - 600 600 2 draw-sprite + 48 64 0 draw-sprite + 640 640 2 draw-sprite + mouseworldpos 4 draw-sprite draw-screen draw-footer ; diff --git a/game.prj b/game.prj index 17f475ba7ca4a1a5d9fd664a4c9095cc26fad713..9889ef24ebe3c22539d841ab350c1e20808c8fee 100755 GIT binary patch delta 326 zcmbQJIZ<#;&q79iNe14n0e)N97#J1` zF)*Cmyq?dLkyVu8dQ;%!m;68V@)_STU1IWL;AYyun8Easp@d0-$%iSDF@;f;@gL(y z#=VSt8N3)67z7vu8Tz(N77)~{=LDL^#jtp(tDhpn>?Iz4VhntZfqwu0v+Wdrb=Q)? zHNc5sr#KG-KLa}uhyL%|65to&8XV%}>Z0ciG>L;joM8*lo$L$>95G@L%@E`M|L0%T z2Qrt7L774LpzOx~AWpC=NRKcB8_-%7pdPgtF^EG-S(GX7`*I+#lhW|iYCl?7tFaw=C`K-_bW}u0aHwZrj0N|QpCIA2c delta 331 zcmbQJIZ<pWhZX28M+~ z3=DTRujeymWR+y_tqz#{lK-b3JL5a1OH9^`+)Nu7Gnl*>N|+>=e3(8m{9)M3@Q?8$ z<6g#mMlS{i1_1^^2FL2j0)l$B4Xgb8xEK~Mb@fwZn7zcqPmG~vi?`qZ|7<(OU){B2 z@U(AW=&5FBVD|D43h_|*?^qq+7vdTm;^gY0=gctqv0z<20|N(xFoP)2T`UX=95G_- zV3Gq&vNEVGwD99+0NL{Y|3TS}|3NDB^gw#V85n^cgs6tt3USB(|NP8BAO~?VC^HCy t^nf_QuKz)Xgn0V62J3k+{0Hd;yJ>QTP!KcF&6CdxJzxg9V)6#zhXDQzWH|r; diff --git a/jorth.c b/jorth.c index a57464b..19f81a9 100755 --- a/jorth.c +++ b/jorth.c @@ -96,18 +96,15 @@ BINOP(f_bitxor, u, ^) BINOP(f_shr, u, >>) BINOP(f_shl, u, <<) -void f_itofix() { - TOP().i = TOP().i << FIX_FRACTIONAL_BITS; -} -void f_fixtoi() { - TOP().i = TOP().i >> FIX_FRACTIONAL_BITS; -} -void f_fixmul() { - ST1().i = ((long)ST1().i * (long)TOP().i) / (1 << FIX_FRACTIONAL_BITS); +#define RATIO_FRACTIONAL_BITS 14 + +void f_toratio() { // a/b ( a b -- r ) + ST1().i = ((long)ST1().i * (1 << RATIO_FRACTIONAL_BITS)) / TOP().i; DROP(1); } -void f_fixdiv() { - ST1().i = ((long)ST1().i * (1 << FIX_FRACTIONAL_BITS)) / TOP().i; + +void f_fromratio() { // a*r ( a r -- b ) + ST1().i = ((long)ST1().i * (long)TOP().i) / (1 << RATIO_FRACTIONAL_BITS); DROP(1); } @@ -813,10 +810,8 @@ void f_init() { CDEF("^", f_bitxor); CDEF("<<", f_shl); CDEF(">>", f_shr); - CDEF(">fix", f_itofix); - CDEF("ratio", f_toratio); + CDEF("*RKtG; U{>>Memhf;KU|?uy;OJlg0P}ZGj{pDw delta 25 hcmaDS|4x3xGp5Z6%xyfA6PT+w4lpn@G;nk<004_k2_pai diff --git a/testbed.c b/testbed.c index d80216b..0db6ec9 100755 --- a/testbed.c +++ b/testbed.c @@ -74,6 +74,8 @@ void game_init() { FILE *f; TifImageMeta_t meta; + mouse_init(); + setEGAMode(); atexit(vid_cleanup); @@ -105,7 +107,6 @@ void game_init() { scroll(0, 0); } - void f_seremit() { ser_write_byte(TOP().i); if (TOP().i == '\n') { @@ -130,6 +131,11 @@ void f_scroll() { // ( x y -- ) scroll(ST1().i, TOP().i); DROP(2); } + +void f_scrollpos() { // ( -- x y ) + PUSHI(screen.scrollX); + PUSHI(screen.scrollY); +} void f_ticks() { PUSHU(timer_counter); } @@ -142,6 +148,24 @@ void f_text() { // ( col line s -- ) text_draw(ST2().u + (ST1().u * PAGE_STRIDE), TOP().s); DROP(3); } + +void f_map() { + PUSHP(map); +} + +void f_mapsize() { // ( -- w h ) + PUSHI(screen.w); + PUSHI(screen.h); +} + +void f_mousepos() { // ( -- x y ) + PUSHI(MOUSE.x); + PUSHI(MOUSE.y); +} +void f_mousebuttons() { + PUSHI(MOUSE.buttons); +} + void game_f_init() { f_init(); CDEF("seremit", f_seremit); @@ -149,10 +173,15 @@ void game_f_init() { CDEF("key-down", f_keyIsDown); CDEF("draw-sprite", f_drawSprite); CDEF("scroll", f_scroll); + CDEF("scrollpos", f_scrollpos); CDEF("draw-screen", drawScreen); CDEF("split-screen", f_splitscreen); CDEF("ticks", f_ticks); CDEF("text", f_text); + CDEF("map", f_map); + CDEF("mapsize", f_mapsize); + CDEF("mousepos", f_mousepos); + CDEF("mousebuttons", f_mousebuttons); f_loadfile("game.jor"); } diff --git a/tiles.c b/tiles.c index 92435aa..10a774c 100755 --- a/tiles.c +++ b/tiles.c @@ -35,26 +35,7 @@ void blitTile(unsigned int offsetFrom, unsigned int offsetTo) { #define D_BGTILE 0x81 #define isBufIndex(d) (!((d) & 0x80)) -#define NUM_BUFFERS 32 -#define nextBufferIndex(i) ((i + 1) % 32) -#define BUF_WSTRIDE 16 -#define BUF_WSIZE (BUF_WSTRIDE * 4) -typedef struct { - unsigned int w; - unsigned int h; - int scrollX; - int scrollY; - unsigned int pageOffset[2]; - unsigned char dirty[2][PAGE_TILES_COUNT]; - unsigned int tilesOffset; - unsigned int *memTiles; - unsigned char *map; - unsigned int buffer[NUM_BUFFERS][BUF_WSIZE]; - unsigned int bufferOffset[NUM_BUFFERS]; - unsigned char currentPage; - unsigned char nextBuffer; - unsigned char firstBuffer; -} TiledScreen_t; +#define nextBufferIndex(i) ((i + 1) % NUM_BUFFERS) TiledScreen_t screen = { 0, 0, 0, 0, { 0x0600, 0x2B00 }, 0, 0, NULL, NULL, 0, 0, 0, 0, 0 }; diff --git a/tiles.h b/tiles.h index 16ce566..89d68e0 100755 --- a/tiles.h +++ b/tiles.h @@ -12,3 +12,26 @@ void drawScreen(); #define PAGE_TILES_H 14 #define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W) #define PAGE_STRIDE (PAGE_TILES_W << 1) + +#define NUM_BUFFERS 32 +#define BUF_WSTRIDE 16 +#define BUF_WSIZE (BUF_WSTRIDE * 4) + +typedef struct { + unsigned int w; + unsigned int h; + int scrollX; + int scrollY; + unsigned int pageOffset[2]; + unsigned char dirty[2][PAGE_TILES_COUNT]; + unsigned int tilesOffset; + unsigned int *memTiles; + unsigned char *map; + unsigned int buffer[NUM_BUFFERS][BUF_WSIZE]; + unsigned int bufferOffset[NUM_BUFFERS]; + unsigned char currentPage; + unsigned char nextBuffer; + unsigned char firstBuffer; +} TiledScreen_t; + +extern TiledScreen_t screen; \ No newline at end of file