From 71b45c35ef582d1ef0e923852f6d4967f33f3134 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Mon, 13 Jan 2020 16:52:56 -0500 Subject: [PATCH] portrait editor --- game.exe | Bin 114345 -> 115800 bytes game.prj | Bin 5522 -> 5721 bytes jiles.jor | 13 +++-- portrait.gfx | Bin 0 -> 8192 bytes sprite.gfx | Bin 10240 -> 10240 bytes testbed.c | 157 ++++++++++++++++++++++++++++++++++++--------------- tiles.c | 22 ++++++++ tiles.h | 1 + 8 files changed, 143 insertions(+), 50 deletions(-) create mode 100755 portrait.gfx diff --git a/game.exe b/game.exe index cd67a672700941dfc3276934739f72627eb83685..6c96d80a45a582767a1c5eec9af91f93f5b0ab78 100755 GIT binary patch delta 26241 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 OBPua-k82HE$^RdyuF@a? delta 24521 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 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 0000000000000000000000000000000000000000..485b9fe55765d6c376c1e90671111305cc6d4595 GIT binary patch literal 8192 zcmeI1&u<$=6vw|Cm)MO6Zs0(RfE|j|+Qlty4+xYWHm#jDQd*+e6_rBeq>WuHg~YOx zwvh^+!UYaU;n)kxf&YLDr)K#Bs#Y8j2P7}#kV~bw0x7N%d-#smw$doA6F@{lJITj0 z-gz_c&G)@sTQab_762CC1?&TW#g!eT69)Ea_5lYp8DJp_$OaZ|+BH!GDx{_~25KB{ zzyl}~N=3>FxrzbwVXyqFT%}q>Uu6~efiadNq!;*|2RqX4{M1C&3{;dK8$>D7YVkB- zBu}fgXwEASbs?)B+-;7Pm-~6~Sao2Xwv}}Q57&W*cYvuS;1*-dk?_m(?`>}MFZ7+< zvzhDNZs&7i+9>jP3R3NMy|(`+{@eMhd2ma4qe^+DQvN24Rp;$(n|Uh}TUAZFRP`^E zS~ezan|bwHw0BtR{!tUSfV#c5z;?k z$dzw9aOZAUba-iW{Als#h3|{MTI#HVTCQoNQZ;HwippBoEICw5N)pZ~Tiqv~nypY1 z3YEoG*o!Na_=qTgthF4{E>S}Vl~l$F(~=0s2cti z{VVz>EkD(*{%>%u;LNxD_rbopoqyi*HD^yr-M7`>`5XtHXM6`qn2eJxO@9VIwKa6N zX`q)g>pO3*|N6(;_WJ9(xXJHTU!wBWH^8|U4Sd&QAlB&5`3(3v4ZLI+^0yAdMu!n5 zKEf|(};A#63LS^nX8+`MrnUadlO>jdOANfF`ua01-N}k9B~#E#+s{- ziNwh0P%@rMBu9s0@yj8>DEWWk;_$Gu%b8ewFmRab2DroFkjSJsKE<(~b|&-bPbPB5 zH=ES2Y&P6~MF%=E{QiY_z=D!aWM5^BO=Ej|D-{n zWs#nk6mRs4*_k{?!JiK5A4~YVIq+sSGnvka6`-l5a_z&+7K=bPv3K)Jc{9*jV_yb7SFw`;pWBAATkNFR?1^XWUfBfhU zumwAh_ZRn<&=W>Gm>T%e97v-4j(Ugz2p8Id-N*Zb`$OmfqXv)#7!CwF?;pDipPfy8 z4S$V1!~c)}-__r(zyJRo5Z?U1;{UYzmHW5vzYzcG{U!cA4EW{i2`G3ElfMtN;2G3{ zDfKJtx7%Nkf5i{BfPs%ezQMl1on^<^vQ3gydym`VkJ?19G1H2L21os~CMi`q3Q-a^8db0t=fOJJx@89~gd2 NPL!?R9IvpD9RQ$_j{^Vz delta 19 acmZn&Xb9MlAUpY?eEsHl1x40H%B%oS(+2_o 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);