diff --git a/game.exe b/game.exe index cd67a67..6c96d80 100755 Binary files a/game.exe and b/game.exe differ diff --git a/game.prj b/game.prj index 12e2a70..b5590aa 100755 Binary files a/game.prj and b/game.prj differ diff --git a/jiles.jor b/jiles.jor index fe20e69..aaf5e39 100755 --- a/jiles.jor +++ b/jiles.jor @@ -24,7 +24,8 @@ array preview 128 allot i 3 % 2 * 65 + i 3 / 16 * preview paintbuf next ; -: mousepos>sprpos 3 >> swap 3 >> swap ; +: mousecoord>sprcoord 2 edittarget = if 2 else 3 then >> ; +: mousepos>sprpos mousecoord>sprcoord swap mousecoord>sprcoord swap ; : mousexys mousepos mousepos>sprpos spriteindex @ ; : mousepixel! ( color -- ) @@ -35,14 +36,14 @@ array preview 128 allot : gfxfilename 0 edittarget = if s" sprite.gfx" - else + else 1 edittarget = if NIGHT flag@ if s" ntiles.gfx" else s" tiles.gfx" then - then ; - + else s" portrait.gfx" then then ; + var jiles-old-tick var jiles-old-draw @@ -74,7 +75,7 @@ var copysrc ^Z key-pressed if mousexys getpixel lcolor color! then ^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 + ^T key-pressed if edittarget 1 + 3 % 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 @@ -86,7 +87,7 @@ var copysrc ^TAB key-pressed if jiles-old-draw @ ' draw redefine jiles-old-tick @ ' tick redefine - mousehide unfuck invalidate-map reloadtiles load-footer + mousehide unfuck invalidate-map reloadtiles reloadportraits load-footer then tick-debounce ; diff --git a/portrait.gfx b/portrait.gfx new file mode 100755 index 0000000..485b9fe Binary files /dev/null and b/portrait.gfx differ diff --git a/sprite.gfx b/sprite.gfx index b1a0fdb..8aa18f4 100755 Binary files a/sprite.gfx and b/sprite.gfx differ diff --git a/testbed.c b/testbed.c index 563fb36..ae4e3f7 100755 --- a/testbed.c +++ b/testbed.c @@ -84,31 +84,37 @@ size_t freadfar(FILE *fp, void far *buf, size_t length) { } /*** S C R A T C H ***/ +#define PORTRAIT_GFX #define NUM_SPRITES 64 #define TILE_STRIDE 64 #define SPRITE_STRIDE 80 +#define PORTRAIT_STRIDE 256 unsigned int far *tiles; unsigned int far *sprites; +unsigned int far *portraits; unsigned char map[10000]; void deallocate_gfx() { - if (tiles) farfree(tiles); - if (sprites) farfree(sprites); + if (tiles) farfree(tiles); + if (sprites) farfree(sprites); + if (portraits) farfree(portraits); } void allocate_gfx() { unsigned long memleft = farcoreleft(); tiles = farmalloc(NUM_TILES * TILE_STRIDE * 2); sprites = farmalloc(NUM_SPRITES * SPRITE_STRIDE * 2); + portraits = farmalloc(NUM_PORTRAITS * PORTRAIT_STRIDE * 2); atexit(deallocate_gfx); - if (!tiles || !sprites) { + if (!tiles || !sprites || !portraits) { printf("%lu bytes free - need %lu\n", memleft, (unsigned long) - ((NUM_TILES * TILE_STRIDE) + - (NUM_SPRITES * SPRITE_STRIDE))); + ((NUM_TILES * TILE_STRIDE * 2) + + (NUM_SPRITES * SPRITE_STRIDE * 2) + + (NUM_PORTRAITS * PORTRAIT_STRIDE * 2))); exit(1); } } @@ -153,8 +159,6 @@ void f_loadtiles() { DROP(1); } -#define TILES_GFX - void f_load_footer() { FILE *f = fopen("FOOTER.TIF", "rb"); TifImageMeta_t meta = tifLoadMeta(f); @@ -162,6 +166,10 @@ void f_load_footer() { fclose(f); } +void f_reloadportraits() { + blitMemToVid(OFF_PORTRAITS, portraits, PORTRAIT_STRIDE >> 2, NUM_PORTRAITS); +} + void game_init() { FILE *f; TifImageMeta_t meta; @@ -186,17 +194,21 @@ void game_init() { freadfar(f, sprites, NUM_SPRITES * SPRITE_STRIDE * 2); fclose(f); +#ifdef PORTRAIT_GFX + f = fopen("portrait.gfx", "rb"); + freadfar(f, portraits, NUM_PORTRAITS * PORTRAIT_STRIDE * 2); + fclose(f); + f_reloadportraits(); +#else f = fopen("PORTRAIT.TIF", "rb"); meta = tifLoadMeta(f); + tifLoad(f, meta, portraits, NUM_PORTRAITS * 32, 32, 4); tifLoadEGA(f, meta, OFF_PORTRAITS, NUM_PORTRAITS * 32, 32); fclose(f); - -#ifdef TILES_GFX - readTiles("tiles.gfx"); -#else - readTifTiles("TILES.TIF"); #endif + readTiles("tiles.gfx"); + loadMap(map, 100, 100); scroll(0, 0); } @@ -321,25 +333,39 @@ void f_glitch() { typedef enum { ET_SPRITE = 0, - ET_TILE = 1 + ET_TILE = 1, + ET_PORTRAIT = 2 } EditTarget_t; EditTarget_t editTarget = ET_SPRITE; unsigned int far *getTarget(int index) { if (editTarget == ET_SPRITE) { return &sprites[index * SPRITE_STRIDE]; - } else { + } else if (editTarget == ET_TILE) { return &tiles[index * TILE_STRIDE]; + } else { + return &portraits[index * PORTRAIT_STRIDE]; } } +#define ET_STRIDE (editTarget == ET_SPRITE ? SPRITE_STRIDE : \ + (editTarget == ET_TILE ? TILE_STRIDE : PORTRAIT_STRIDE)) + int getsprpixel(int x, int y, unsigned int far *spr) { - int shift = (15 - x); - int b = (spr[y + 0] & (1 << shift)) >> shift; - int g = (spr[y + 16] & (1 << shift)) >> shift; - int r = (spr[y + 32] & (1 << shift)) >> shift; - int i = (spr[y + 48] & (1 << shift)) >> shift; - int v = editTarget != ET_SPRITE || (spr[y + 64] & (1 << shift)) ? 0 : 1; + int shift = (15 - (x % 16)); + int plane_stride = 16; + int b, g, r, i, v; + if (editTarget == ET_PORTRAIT) { + y = y << 1; + if (x > 15) y ++; + plane_stride = 64; + } + spr += y; + b = (*spr & (1 << shift)) >> shift; spr += plane_stride; + g = (*spr & (1 << shift)) >> shift; spr += plane_stride; + r = (*spr & (1 << shift)) >> shift; spr += plane_stride; + i = (*spr & (1 << shift)) >> shift; spr += plane_stride; + v = editTarget != ET_SPRITE || (*spr & (1 << shift)) ? 0 : 1; return b | (g << 1) | (r << 2) | (i << 3) | (v << 4); } int resetEnabledCache = 0; @@ -367,18 +393,46 @@ void drawFatBox(int x, int y, int color) { } } +void drawDoubleFatBox(int x, int y, int colorl, int colorr) { + int faty, plane; + unsigned int dst = (SCREEN_STRIDE * y) + x; + + setResetEnabledCached(0); + + for ( plane = 0; plane < 4; plane ++ ) { + int fill = colorr & ( 1 << plane ) ? 0x0f : 0x00; + fill |= colorl & ( 1 << plane ) ? 0xf0 : 0x00; + + setPlane( plane ); + for ( faty = 0; faty < 4; faty ++ ) { + VID[dst + (SCREEN_STRIDE * faty)] = fill; + } + } +} + void f_drawfatsprite() { int isprite = TOP().i; unsigned int far *spr = getTarget(isprite); int x, y; DROP(1); - setAllPlanes(); - for ( y = 0; y < 16; y ++ ) { - for ( x = 0; x < 16; x ++ ) { - int color = getsprpixel(x, y, spr); - drawFatBox(x, y << 3, color); + if (editTarget != ET_PORTRAIT) { + setAllPlanes(); + for ( y = 0; y < 16; y ++ ) { + for ( x = 0; x < 16; x ++ ) { + int color = getsprpixel(x, y, spr); + drawFatBox(x, y << 3, color); + } } + } else { + for ( y = 0; y < 32; y ++ ) { + for ( x = 0; x < 32; x += 2 ) { + int colorl = getsprpixel( x, y, spr); + int colorr = getsprpixel(x + 1, y, spr); + drawDoubleFatBox(x >> 1, y << 2, colorl, colorr); + } + } + setAllPlanes(); } } @@ -391,8 +445,10 @@ void f_savegfx() { FILE *fp = fopen(TOP().s, "wb"); if (editTarget == ET_SPRITE) { fwritefar(fp, sprites, NUM_SPRITES * SPRITE_STRIDE * 2); - } else { + } else if (editTarget == ET_TILE) { fwritefar(fp, tiles, NUM_TILES * TILE_STRIDE * 2); + } else { + fwritefar(fp, portraits, NUM_PORTRAITS * PORTRAIT_STRIDE * 2); } fclose(fp); DROP(1); @@ -421,24 +477,32 @@ void f_putpixel() { int x = ST2().i; int y = ST1().i; int color, shift, b, g, r, i, v; + int plane_stride = 16; DROP(3); color = TOP().i; DROP(1); - shift = (15 - x); + shift = (15 - (x % 16)); + if (editTarget == ET_PORTRAIT) { + y = y << 1; + if (x > 15) y ++; + plane_stride = 64; + } + b = (color & 0x01); g = (color & 0x02) >> 1; r = (color & 0x04) >> 2; i = (color & 0x08) >> 3; v = ((color & 0x10) >> 4) ^ 1; + spr = &spr[y]; - spr[y + 0] = (spr[y + 0] & ~(1 << shift)) | (b << shift); - spr[y + 16] = (spr[y + 16] & ~(1 << shift)) | (g << shift); - spr[y + 32] = (spr[y + 32] & ~(1 << shift)) | (r << shift); - spr[y + 48] = (spr[y + 48] & ~(1 << shift)) | (i << shift); + *spr = (*spr & ~(1 << shift)) | (b << shift); spr += plane_stride; + *spr = (*spr & ~(1 << shift)) | (g << shift); spr += plane_stride; + *spr = (*spr & ~(1 << shift)) | (r << shift); spr += plane_stride; + *spr = (*spr & ~(1 << shift)) | (i << shift); spr += plane_stride; if (editTarget == ET_SPRITE) { - spr[y + 64] = (spr[y + 64] & ~(1 << shift)) | (v << shift); + *spr = (*spr & ~(1 << shift)) | (v << shift); } } @@ -455,8 +519,10 @@ void f_getpixel() { void f_spritecount() { if (editTarget == ET_SPRITE) { PUSHI(NUM_SPRITES); - } else { + } else if (editTarget == ET_TILE) { PUSHI(NUM_TILES); + } else if (editTarget == ET_PORTRAIT) { + PUSHI(NUM_PORTRAITS); } } @@ -484,14 +550,11 @@ void f_remap_spr2buf() { } void f_pastetile() { - unsigned int far *src; - unsigned int far *dst; - unsigned int far *gfx = editTarget == ET_SPRITE ? sprites : tiles; - unsigned int stride = editTarget == ET_SPRITE ? SPRITE_STRIDE : TILE_STRIDE; + unsigned int far *src = getTarget(ST1().i); + unsigned int far *dst = getTarget(TOP().i); + unsigned int stride = ET_STRIDE; unsigned int i; - src = &gfx[ST1().i * stride]; - dst = &gfx[TOP().i * stride]; DROP(2); for (i = 0; i < stride; i ++) { dst[i] = src[i]; @@ -499,13 +562,11 @@ void f_pastetile() { } void f_fliptile() { - unsigned int far *dst; - unsigned int far *gfx = editTarget == ET_SPRITE ? sprites : tiles; - unsigned int stride = editTarget == ET_SPRITE ? SPRITE_STRIDE : TILE_STRIDE; + unsigned int far *dst = getTarget(TOP().i); + unsigned int stride = ET_STRIDE; unsigned int i; unsigned int bit; - dst = &gfx[TOP().i * stride]; DROP(1); for (i = 0; i < stride; i ++) { unsigned int src = dst[i]; @@ -515,7 +576,13 @@ void f_fliptile() { result |= (1 << (15 - bit)); } } - dst[i] = result; + if (editTarget == ET_PORTRAIT && ((i % 2) == 1)) { + bit = dst[i - 1]; + dst[i - 1] = result; + dst[i] = bit; + } else { + dst[i] = result; + } } } @@ -526,6 +593,7 @@ void f_vfliptile() { unsigned int y; unsigned int plane; + if (editTarget == ET_PORTRAIT) return; // TODO dst = &gfx[TOP().i * stride]; DROP(1); for (plane = 0; plane < (editTarget == ET_SPRITE ? 5 : 4); plane ++) { @@ -621,6 +689,7 @@ void game_f_init(char *exe, char *bootjor) { CDEF("edittarget", f_getedittarget); CDEF("edittarget!", f_setedittarget); CDEF("reloadtiles", f_reloadtiles); + CDEF("reloadportraits", f_reloadportraits); CDEF("paste-tile", f_pastetile); CDEF("flip-tile", f_fliptile); CDEF("vflip-tile", f_vfliptile); diff --git a/tiles.c b/tiles.c index 459764e..fd5160c 100755 --- a/tiles.c +++ b/tiles.c @@ -53,6 +53,28 @@ void blit32x32(unsigned int offsetFrom, unsigned int offsetTo) { } } +void blitMemToVid(unsigned int offset, unsigned int far *mem, unsigned int planeStride, int count) { + int i, j, plane; + + offset = offset >> 1; // word aligned + setWriteMode(0); + for (i = 0; i < count; i ++) { + for (plane = 0; plane < 4; plane ++) { + unsigned int drawOffset = offset; + unsigned int bmp; + + setPlane(plane); + for (j = 0; j < planeStride; j ++) { + bmp = mem[j]; + WVID[drawOffset + j] = (bmp << 8) | (bmp >> 8); + } + mem += planeStride; + } + offset += planeStride; + } + setAllPlanes(); +} + #define D_NOTHING 0x80 #define D_BGTILE 0x81 #define isBufIndex(d) (!((d) & 0x80)) diff --git a/tiles.h b/tiles.h index ab8a951..d9cdeb1 100755 --- a/tiles.h +++ b/tiles.h @@ -11,6 +11,7 @@ void scroll(int newX, int newY); void drawScreen(); void blit32x32(unsigned int offsetFrom, unsigned int offsetTo); +void blitMemToVid(unsigned int offset, unsigned int far *mem, unsigned int planeStride, int count); void writeTile(unsigned int *buf, unsigned int far *tile); void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart, char *remap);