From ca1abba60b3efd8fda1aa2c6a8747afe325333f9 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 6 Aug 2019 22:47:15 -0400 Subject: [PATCH] add 1x sprite preview over tiles --- game.exe | Bin 100692 -> 101592 bytes game.prj | Bin 5667 -> 5522 bytes jiles.jor | 10 +++++ testbed.c | 26 ++++++++++++ tiles.c | 122 +++++++++++++++++++++++++----------------------------- tiles.h | 4 ++ 6 files changed, 96 insertions(+), 66 deletions(-) diff --git a/game.exe b/game.exe index ec179c1ccd5805154c9bf52013bd3cda41d7daf2..f452deb40e120de26fdd91d90d61ebd0a53805bc 100755 GIT binary patch delta 23336 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 delta 340 zcmbQFy;x_1Ivb1s8oY>b;X@R=~ODKYqf zykb7WaESR4!!4%gOe>gYGbb>pG8!>2;23ZCh zppEPd3LG(F9AJ_KOiH_hDOLux%|HDF8N^mM`N=WJEV1xoVra;j>c`LUrF5zv7sKaS zQ~VSe`U>m)#29|mZt)Xkm;#g)VQ?&|_xu0f*EL9C@&yqwdq*E1e`h@phW{YTLR^DG voLpV>oPiGDU=U_d0g6E^MRo?nW{5qTHwl(8v4CuxtRvFE0@5&fgUBNQS_)&@ diff --git a/jiles.jor b/jiles.jor index fb78efc..bf4fb49 100755 --- a/jiles.jor +++ b/jiles.jor @@ -5,12 +5,21 @@ var spriteindex var refresh-needed : refresh 1 refresh-needed ! ; +array preview 128 allot + : color! >r dup r@ @ = if drop else r@ ! refresh then rdrop ; : +sprite! spriteindex spritecount +!cycle refresh ; : draw-palette 0 0x11 for i 79 i 3 << drawfatbox next ; +: draw-preview + 0 18 for + i preview tile>buf + spriteindex @ preview spr>buf + i 3 % 2 * 65 + i 3 / 16 * preview paintbuf + next ; + : mousepos>sprpos 3 >> swap 3 >> swap ; : mousexys mousepos mousepos>sprpos spriteindex @ ; @@ -52,6 +61,7 @@ var jiles-old-draw : jiles-draw refresh-needed @ if mousehide + draw-preview spriteindex @ drawfatsprite lcolor @ 77 0 drawfatbox rcolor @ 78 0 drawfatbox diff --git a/testbed.c b/testbed.c index f32be07..699f1c1 100755 --- a/testbed.c +++ b/testbed.c @@ -346,6 +346,7 @@ void f_drawfatsprite() { int x, y; DROP(1); + setAllPlanes(); for ( y = 0; y < 16; y ++ ) { for ( x = 0; x < 16; x ++ ) { int color = getsprpixel(x, y, spr); @@ -422,6 +423,28 @@ void f_spritecount() { PUSHI(NUM_SPRITES); } +void f_tile2buf() { + unsigned int *buf = TOP().p; + unsigned int itile = ST1().u; + DROP(2); + writeTile(buf, &tiles[itile * TILE_STRIDE]); +} + +void f_spr2buf() { + unsigned int *buf = TOP().p; + unsigned int isprite = ST1().u; + DROP(2); + overlaySprite(buf, &sprites[isprite * SPRITE_STRIDE], 0, 0); +} + +void f_paintbuf() { + unsigned int *buf = TOP().p; + int y = ST1().i; + int x = ST2().i; + DROP(3); + paintBuffer(buf, x + (y * 40)); +} + /* INIT */ void game_f_init(char *exe, char *bootjor) { f_init(exe); @@ -457,6 +480,9 @@ void game_f_init(char *exe, char *bootjor) { CDEF("getpixel", f_getpixel); CDEF("spritecount", f_spritecount); CDEF("savegfx", f_savegfx); + CDEF("tile>buf", f_tile2buf); + CDEF("spr>buf", f_spr2buf); + CDEF("paintbuf", f_paintbuf); f_loadjor(bootjor); diff --git a/tiles.c b/tiles.c index 8d05dd8..399ce8b 100755 --- a/tiles.c +++ b/tiles.c @@ -74,57 +74,18 @@ void loadMap(unsigned char *map, unsigned int w, unsigned int h) { memset(screen.dirty, D_BGTILE, PAGE_TILES_COUNT * 2); } -int prepareBuffer(int pageX, int pageY) { - unsigned char *dirty = &screen.dirty[screen.currentPage][pageX + (pageY * PAGE_TILES_W)]; +void writeTile(unsigned int *buf, unsigned int far *tile) { int i; - if (!isBufIndex(*dirty)) { - unsigned int startX = screen.scrollX >> 4; - unsigned int startY = screen.scrollY >> 4; - unsigned char tile = screen.map[startX + pageX + ((startY + pageY) * screen.w)]; - unsigned char ibuffer = screen.nextBuffer; - screen.nextBuffer = nextBufferIndex(ibuffer); - *dirty = ibuffer; - if ((tile & 0xf0) == 0xf0) { - unsigned int val = (tile & 0x01) ? 0xffff : 0x0000; - for (i = 0; i < 16; i ++) { - screen.buffer[ibuffer][i] = val; - } - val = (tile & 0x02) ? 0xffff : 0x0000; - for (i = 16; i < 32; i ++) { - screen.buffer[ibuffer][i] = val; - } - val = (tile & 0x04) ? 0xffff : 0x0000; - for (i = 32; i < 48; i ++) { - screen.buffer[ibuffer][i] = val; - } - val = (tile & 0x08) ? 0xffff : 0x0000; - for (i = 48; i < 64; i ++) { - screen.buffer[ibuffer][i] = val; - } - } else { - for (i = 0; i < BUF_WSIZE; i ++) { - screen.buffer[ibuffer][i] = (&screen.memTiles[tile * BUF_WSIZE])[i]; - } - } - screen.bufferOffset[ibuffer] = screen.pageOffset[screen.currentPage] - + (pageX << 1) + (pageY * PAGE_STRIDE * 16); + for (i = 0; i < BUF_WSIZE; i ++) { + buf[i] = tile[i]; } - return *dirty; } -void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart) { - unsigned int *buf; +void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart) { unsigned int far *mask; unsigned int maskval; int y, h, plane; - if (pageX < 0 || pageY < 0 || - pageX >= PAGE_TILES_W || pageY >= PAGE_TILES_H || - shift >= 16 || shift <= -16 || - yStart <= -16 || yStart >= 16) { - return; - } - buf = screen.buffer[prepareBuffer(pageX, pageY)]; if (yStart < 0) { sprite = &sprite[-yStart]; h = yStart + 16; @@ -155,6 +116,37 @@ void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, } } +int prepareBuffer(int pageX, int pageY) { + unsigned char *dirty = &screen.dirty[screen.currentPage][pageX + (pageY * PAGE_TILES_W)]; + int i; + if (!isBufIndex(*dirty)) { + unsigned int startX = screen.scrollX >> 4; + unsigned int startY = screen.scrollY >> 4; + unsigned char tile = screen.map[startX + pageX + ((startY + pageY) * screen.w)]; + unsigned char ibuffer = screen.nextBuffer; + screen.nextBuffer = nextBufferIndex(ibuffer); + *dirty = ibuffer; + writeTile(screen.buffer[ibuffer], &screen.memTiles[tile * BUF_WSIZE]); + screen.bufferOffset[ibuffer] = screen.pageOffset[screen.currentPage] + + (pageX << 1) + (pageY * PAGE_STRIDE * 16); + } + return *dirty; +} + +void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart) { + unsigned int *buf; + + if (pageX < 0 || pageY < 0 || + pageX >= PAGE_TILES_W || pageY >= PAGE_TILES_H || + shift >= 16 || shift <= -16 || + yStart <= -16 || yStart >= 16) { + return; + } + + buf = screen.buffer[prepareBuffer(pageX, pageY)]; + overlaySprite(buf, sprite, shift, yStart); +} + void drawSprite(unsigned int far *sprite, int x, int y) { int pageX = (int)(x - (screen.scrollX & 0xfff0)) >> 4; int pageY = (int)(y - (screen.scrollY & 0xfff0)) >> 4; @@ -195,6 +187,25 @@ void scroll(int newX, int newY) { screen.scrollY = newY; } +void paintBufferPlane(unsigned int *buf, unsigned int vidOffset, int stride, int plane) { + unsigned int drawOffset = vidOffset >> 1; + unsigned int y, bmp; + for (y = 0; y < 16; y ++) { + bmp = buf[y + (BUF_WSTRIDE * plane)]; + WVID[drawOffset] = (bmp << 8) | (bmp >> 8); + drawOffset += stride >> 1; + } +} + +void paintBuffer(unsigned int *buf, unsigned int vidOffset) { + int plane; + setWriteMode(0); + for (plane = 0; plane < 4; plane ++) { + setPlane(plane); + paintBufferPlane(buf, vidOffset, 40, plane); + } +} + void drawScreen() { unsigned int startX = screen.scrollX >> 4; unsigned int startY = screen.scrollY >> 4; @@ -213,9 +224,7 @@ void drawScreen() { for (x = startX; x < startX + PAGE_TILES_W; x ++) { if (dirty[di++] == D_BGTILE) { char tile = screen.map[x + (y * screen.w)]; - if ((tile & 0xf0) != 0xf0) { - blitTile(screen.tilesOffset + (tile << 5), drawOffset); - } + blitTile(screen.tilesOffset + (tile << 5), drawOffset); } drawOffset += 2; } @@ -225,29 +234,10 @@ void drawScreen() { for(plane = 0; plane < 4; plane ++) { setPlane(plane); for (di = screen.firstBuffer; di != screen.nextBuffer; di = nextBufferIndex(di)) { - drawOffset = screen.bufferOffset[di] >> 1; - for (y = 0; y < 16; y ++) { - bmp = screen.buffer[di][y + (BUF_WSTRIDE * plane)]; - WVID[drawOffset] = (bmp << 8) | (bmp >> 8); - drawOffset += PAGE_STRIDE >> 1; - } + paintBufferPlane(screen.buffer[di], screen.bufferOffset[di], PAGE_STRIDE, plane); } } setAllPlanes(); - di = 0; - drawOffset = screen.pageOffset[screen.currentPage]; - for (y = startY; y < startY + PAGE_TILES_H; y ++) { - for (x = startX; x < startX + PAGE_TILES_W; x ++) { - if (dirty[di++] == D_BGTILE) { - char tile = screen.map[x + (y * screen.w)]; - if ((tile & 0xf0) == 0xf0) { - blitSolidBlock(drawOffset, tile & 0x0f); - } - } - drawOffset += 2; - } - drawOffset += PAGE_STRIDE * 15; - } setDisplayOffset(scrollOffset); setHorizontalPan(screen.scrollX & 0x07); diff --git a/tiles.h b/tiles.h index d6064ee..5d5cd80 100755 --- a/tiles.h +++ b/tiles.h @@ -12,6 +12,10 @@ 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 paintBuffer(unsigned int *buf, unsigned int vidOffset); + #define PAGE_TILES_W 21 #define PAGE_TILES_H 14 #define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W)