From 70785c5cfaffaac94973728c7d27970738e28a4b Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Thu, 19 Sep 2019 21:52:24 -0400 Subject: [PATCH] Add tile editing features (copy/paste, flip, nudge), boat This commit also has a colour-remapping experiment but it appears to be too costly to do in real-time; will probably back it out and rethink --- entity.jor | 8 +++++ game.exe | Bin 111081 -> 113775 bytes game.jor | 24 +++++++++------ game.prj | Bin 5721 -> 5721 bytes jiles.jor | 14 +++++++++ map.jor | 6 ++-- pete.jor | 7 +++++ sprite.gfx | Bin 10240 -> 10240 bytes testbed.c | 77 +++++++++++++++++++++++++++++++++++++++++++++--- tiles.c | 85 +++++++++++++++++++++++++++++++++++++++-------------- tiles.gfx | Bin 8192 -> 8192 bytes tiles.h | 4 +-- 12 files changed, 185 insertions(+), 40 deletions(-) diff --git a/entity.jor b/entity.jor index 642b25d..34aef9c 100755 --- a/entity.jor +++ b/entity.jor @@ -70,6 +70,7 @@ array frames ( 5: car lights ) 29 27 26 28 frame ( 6: jeanne stand ) 30 32 34 36 frame ( 7: jeanne walk ) 31 33 35 37 frame +( 8: boat w/ pete ) 42 41 40 39 frame : sprindex ( dir frame ) 2 << frames + + b@ ; : defstatic ( frame -- ) create b, does> b@ sprindex ; @@ -95,3 +96,10 @@ array frames 6 7 2 5 defanim {jeanne-walk} 18 defsingle {phone} 38 defsingle {fridge} +43 defsingle {boat} +8 defstatic {boat-pete} + +: sprite-bob ( x y sprindex -- x y sprindex ) + ticks 40 % 20 < if + dup 39 >= over 43 <= and if swap 1 + swap then + then ; diff --git a/game.exe b/game.exe index 8df01f595e6a77b704f86e4823abcd5b7cadb8ee..d103dbc7581b36e05a995c9cbde7b0e0fc4ec42d 100755 GIT binary patch delta 25108 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 player.state MOVING f@ not if cell + then @ execute ; @@ -46,15 +50,17 @@ var player.prevdir : {player} player.driving? if {car-drive} + else player.boating? if {boat-pete} else - player.state ISMARY f@ if {pmary} - else player.state ISJEANNE f@ if {pjeanne} - else {ppete} then then - then ; + player.state ISMARY f@ if {pmary} + else player.state ISJEANNE f@ if {pjeanne} + else {ppete} then then + then then ; : player.canmove? ( x y -- ) player.state NOCLIP f@ not if - player.driving? if DRIVABLE else WALKABLE then mapflag? + player.driving? if DRIVABLE else + player.boating? if BOATABLE else WALKABLE then then mapflag? else drop drop 1 then ; 12 9 N ' {player} defentity player @@ -145,7 +151,7 @@ player :tick : draw-entity >r r@ entity.x @ r@ entity.y @ r@ entity.dir @ sprite - draw-sprite ; + sprite-bob draw-sprite ; var showmouse 1 showmouse ! diff --git a/game.prj b/game.prj index e0716feefe3e96de36bc0b009e17dbd30ae5a4ad..3bebd242fd81c4aa287830016782a038ef368659 100755 GIT binary patch delta 151 zcmcbqb5m!7IvaEP2II|IY!w{5b6fQN+j$rmx`Ehq^LjpWM&=Zt+)Mu1jQr}1(ToWU z3=AR+vJ8P6j3-YPv}9gctv~s^pe74Ym|^lCL3eSWgnx)@aEOzui=H!3kb^;(VS0=H tvh?A>}o-@PbRv{Bk v1_llWVFrbb?31H}q~hHr*17a diff --git a/jiles.jor b/jiles.jor index 8d754eb..de24232 100755 --- a/jiles.jor +++ b/jiles.jor @@ -50,6 +50,13 @@ var jiles-old-draw 45 const ^X 31 const ^S 20 const ^T +33 const ^F +46 const ^C +47 const ^V +73 const ^PgUp +81 const ^PgDn + +var copysrc : jiles-tick mousepos 128 < swap 128 < and if @@ -67,6 +74,13 @@ var jiles-old-draw ^X key-pressed if mousexys getpixel rcolor color! then ^S key-pressed if s" SAVING " type gfxfilename dup type cr savegfx then ^T key-pressed if edittarget if 0 else 1 then edittarget! 0 +sprite! then + ^C key-pressed if spriteindex @ copysrc ! then + ^V key-pressed if copysrc @ spriteindex @ paste-tile refresh then + ^F key-pressed if spriteindex @ flip-tile refresh then + ^PgDn key-pressed if 5 +sprite! then + ^PgUp key-pressed if -5 +sprite! then + ^UP key-pressed if -1 spriteindex @ nudge-sprite refresh then + ^DOWN key-pressed if 1 spriteindex @ nudge-sprite refresh then ^TAB key-pressed if jiles-old-draw @ ' draw redefine jiles-old-tick @ ' tick redefine diff --git a/map.jor b/map.jor index 75bc722..59d4fa9 100755 --- a/map.jor +++ b/map.jor @@ -7,11 +7,12 @@ var tileselect 1 const WALKABLE 2 const DRIVABLE +4 const BOATABLE array tileflags ( grass ) WALKABLE b, ( dirt ) WALKABLE DRIVABLE | b, -( water ) 0 b, +( water ) BOATABLE b, ( pavement ) WALKABLE DRIVABLE | b, ( brick ) 0 b, ( forest ) 0 b, @@ -29,12 +30,11 @@ array tileflags ( house ) 0 b, ( fence ) 0 b, ( storefront ) 0 b, +( space ) 0 b, here tileflags - 1 - const MAXTILE : 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 @ diff --git a/pete.jor b/pete.jor index 1f714ac..44a0050 100755 --- a/pete.jor +++ b/pete.jor @@ -2,12 +2,18 @@ 13 8 N ' {car} defentity car 32 5 W ' {horse} defentity e_chuck +17 10 W ' {boat} defentity boat car :touch move-player 1 player.state DRIVING f! ;entity +boat :touch + move-player + 1 player.state BOATING f! +;entity + e_chuck :touch pete say" It's good to have you\back, Chuck." chuck say" * w h i n n y *\(I remember this place...)" @@ -16,6 +22,7 @@ e_chuck :touch :noname :| player.driving? not CHUCK-FOLLOW flag@ not and if car yield then CHUCK-STOLEN flag@ if e_chuck yield then + player.boating? not if boat yield then done |; ' entities redefine :| diff --git a/sprite.gfx b/sprite.gfx index 7916a11d45b5a4bb65271fb6cfe4ded1face51f3..a088d0eac1e3c4bc7fda3eca2ed6b4c21fd550b5 100755 GIT binary patch delta 823 zcmaKq!D`z;5QcZy3OP7I7$4$NXbFKpo}mZRH}D%YegYGE>|s|pA=iW)lA9I!05$Xh zy2dW`&F#H3b}ur7!X}QX?Z~^Cu_8-0p*sjIe9J$dRwFC2(mW^$mRVea^e;h98`Iu2 zwAa?gP=eyLLmpr~aZoE97#sQi6?{rKli{y49HXHqx3I=voxu6w3>W#-pW^$j;+jXh z=A#jdDw{XVKJDAotf`!IxvNAARn zOS|{mxtziugM!vIp7my2`*)N-s1MpL6cmYJ&HjrIjA5J}K*J|N;x!ETFh0!ij373s z+1jkAL4&$IDI66#J4?X>rr88E(@r8sZxj?uL;RVGHL?Rs0_hOOSNJ@qA^abwAzbHw g?UqW0aF3=iK0wz*Ym>cZro1|Y=hc$R delta 21 ccmZn&Xb9MlATha7x_buf", f_tile2buf); CDEF("spr>buf", f_spr2buf); + CDEF("remap-spr>buf", f_remap_spr2buf); CDEF("paintbuf", f_paintbuf); CDEF("edittarget", f_getedittarget); CDEF("edittarget!", f_setedittarget); CDEF("reloadtiles", f_reloadtiles); + CDEF("paste-tile", f_pastetile); + CDEF("flip-tile", f_fliptile); + CDEF("nudge-sprite", f_nudgesprite); f_loadjor(bootjor); diff --git a/tiles.c b/tiles.c index 5cb19ee..459764e 100755 --- a/tiles.c +++ b/tiles.c @@ -107,7 +107,7 @@ void writeTile(unsigned int *buf, unsigned int far *tile) { } } -void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart) { +void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart, char *remap) { unsigned int far *mask; unsigned int maskval; int y, h, plane; @@ -120,24 +120,65 @@ void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int y h = 16 - yStart; } mask = &sprite[BUF_WSTRIDE * 4]; - if (shift < 0) { - shift = -shift; - for (plane = 0; plane < 4; plane ++) { - for (y = 0; y < h; y ++) { - maskval = mask[y] << shift; - buf[y] = (buf[y] & ~maskval) | ((sprite[y] << shift) & maskval); + if (!remap) { + if (shift < 0) { + shift = -shift; + for (plane = 0; plane < 4; plane ++) { + for (y = 0; y < h; y ++) { + maskval = mask[y] << shift; + buf[y] = (buf[y] & ~maskval) | ((sprite[y] << shift) & maskval); + } + sprite += BUF_WSTRIDE; + buf += BUF_WSTRIDE; + } + } else { + for (plane = 0; plane < 4; plane ++) { + for (y = 0; y < h; y ++) { + maskval = mask[y] >> shift; + buf[y] = (buf[y] & ~maskval) | ((sprite[y] >> shift) & maskval); + } + sprite += BUF_WSTRIDE; + buf += BUF_WSTRIDE; } - sprite += BUF_WSTRIDE; - buf += BUF_WSTRIDE; } } else { - for (plane = 0; plane < 4; plane ++) { - for (y = 0; y < h; y ++) { - maskval = mask[y] >> shift; - buf[y] = (buf[y] & ~maskval) | ((sprite[y] >> shift) & maskval); + unsigned int b, bo, g, go, r, ro, i, io, bgri; + int bit; + if (shift < 0) { + shift = -shift; +#define SPLANE(b, y, p) b[y + (BUF_WSTRIDE * (p))] +#define DO_REMAP(ss, bitstart, bitlim) \ + for (y = 0; y < h; y ++) { \ + bo = go = ro = io = 0; \ + b = SPLANE(sprite, y, 0); \ + g = SPLANE(sprite, y, 1); \ + r = SPLANE(sprite, y, 2); \ + i = SPLANE(sprite, y, 3); \ + for (bit = (bitstart); bit < (bitlim); bit ++) { \ + int bshift = 1 << bit; \ + bgri = ((b & bshift) ? 0x01 : 0x00) | \ + ((g & bshift) ? 0x02 : 0x00) | \ + ((r & bshift) ? 0x04 : 0x00) | \ + ((i & bshift) ? 0x08 : 0x00); \ + bgri = remap[bgri]; \ + if (bgri & 0x01) bo |= bshift; \ + if (bgri & 0x02) go |= bshift; \ + if (bgri & 0x04) ro |= bshift; \ + if (bgri & 0x08) io |= bshift; \ + } \ + maskval = mask[y] ss shift; \ + SPLANE(buf, y, 0) = (SPLANE(buf, y, 0) & ~maskval) | ((bo ss shift) & maskval); \ + SPLANE(buf, y, 1) = (SPLANE(buf, y, 1) & ~maskval) | ((go ss shift) & maskval); \ + SPLANE(buf, y, 2) = (SPLANE(buf, y, 2) & ~maskval) | ((ro ss shift) & maskval); \ + SPLANE(buf, y, 3) = (SPLANE(buf, y, 3) & ~maskval) | ((io ss shift) & maskval); \ } - sprite += BUF_WSTRIDE; - buf += BUF_WSTRIDE; + + DO_REMAP(<<, shift, 16) + } else { + DO_REMAP(>>, 0, 16 - shift) + +#undef DO_REMAP +#undef SPLANE } } } @@ -159,7 +200,7 @@ int prepareBuffer(int pageX, int pageY) { return *dirty; } -void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart) { +void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart, char *remap) { unsigned int *buf; if (pageX < 0 || pageY < 0 || @@ -170,19 +211,19 @@ void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, } buf = screen.buffer[prepareBuffer(pageX, pageY)]; - overlaySprite(buf, sprite, shift, yStart); + overlaySprite(buf, sprite, shift, yStart, remap); } -void drawSprite(unsigned int far *sprite, int x, int y) { +void drawSprite(unsigned int far *sprite, int x, int y, char *remap) { int pageX = (int)(x - (screen.scrollX & 0xfff0)) >> 4; int pageY = (int)(y - (screen.scrollY & 0xfff0)) >> 4; int pageOffsetX = x & 0x0f; int pageOffsetY = y & 0x0f; - drawSpriteToBuf(sprite, pageX, pageY, pageOffsetX, pageOffsetY); - drawSpriteToBuf(sprite, pageX + 1, pageY, pageOffsetX - 16, pageOffsetY); - drawSpriteToBuf(sprite, pageX, pageY + 1, pageOffsetX, pageOffsetY - 16); - drawSpriteToBuf(sprite, pageX + 1, pageY + 1, pageOffsetX - 16, pageOffsetY - 16); + drawSpriteToBuf(sprite, pageX, pageY, pageOffsetX, pageOffsetY, remap); + drawSpriteToBuf(sprite, pageX + 1, pageY, pageOffsetX - 16, pageOffsetY, remap); + drawSpriteToBuf(sprite, pageX, pageY + 1, pageOffsetX, pageOffsetY - 16, remap); + drawSpriteToBuf(sprite, pageX + 1, pageY + 1, pageOffsetX - 16, pageOffsetY - 16, remap); } void scroll(int newX, int newY) { diff --git a/tiles.gfx b/tiles.gfx index 7e975e751c671310a6b9d9f734846d57a62bb3d2..bf7be909650cab2ff7df9d88c70a1e546025ed14 100755 GIT binary patch delta 160 zcmZp0XmHq2&BV&c!pNd9xsg#}^8%&>_Id^ffd>K(HB15w0t_q+3=9qo4}cg56hH(M yR6qd8U|?VoK$B+z3p+p*LgYazz(4^=g5-e)3OHB*&Bv;rkzq3Hq)$ diff --git a/tiles.h b/tiles.h index 5d5cd80..ab8a951 100755 --- a/tiles.h +++ b/tiles.h @@ -6,14 +6,14 @@ void tile_init(); void loadTiles(unsigned int tilesOffset, unsigned int far *memTiles); void loadMap(unsigned char *map, unsigned int w, unsigned int h); -void drawSprite(unsigned int far *sprite, int x, int y); +void drawSprite(unsigned int far *sprite, int x, int y, char *remap); void scroll(int newX, int newY); void drawScreen(); void blit32x32(unsigned int offsetFrom, unsigned int offsetTo); void writeTile(unsigned int *buf, unsigned int far *tile); -void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart); +void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart, char *remap); void paintBuffer(unsigned int *buf, unsigned int vidOffset); #define PAGE_TILES_W 21