diff --git a/game.exe b/game.exe index 108de1e..52629cd 100755 Binary files a/game.exe and b/game.exe differ diff --git a/game.prj b/game.prj index 780f942..add6b58 100755 Binary files a/game.prj and b/game.prj differ diff --git a/jiles.jor b/jiles.jor index 8217dcf..bd5f944 100755 --- a/jiles.jor +++ b/jiles.jor @@ -14,16 +14,26 @@ REPL start-repl intern input.jor input.jor loadfile -: worldpos>tilepos 4 >> swap 4 >> swap ; -: tilepos>mapindex mapsize drop * + ; +var color +var spriteindex + +8 spriteindex ! +2 color ! + + +: refresh + spriteindex @ drawfatsprite ; + +: mousepos>sprpos 3 >> swap 3 >> swap ; + : tick MOUSEL clicked if - 0xf5 mousepos worldpos>tilepos tilepos>mapindex map + b! + color @ mousepos mousepos>sprpos spriteindex @ putpixel then tick-debounce ; -: draw - 0 0 scroll - mousepos 4 draw-sprite - draw-screen ; \ No newline at end of file +: draw ; + +mouseshow +refresh diff --git a/testbed.c b/testbed.c index 2ca8a76..4d745d0 100755 --- a/testbed.c +++ b/testbed.c @@ -263,6 +263,66 @@ void f_glitch() { } } +/* JILES */ +#define SCREEN_STRIDE 320 +void f_mouseshow() { + setLogicalWidth(SCREEN_STRIDE >> 1); + mouse_show(); +} + +void f_drawfatsprite() { + int isprite = TOP().i; + unsigned int dst = 0; + unsigned int far *spr = &sprites[isprite * SPRITE_STRIDE]; + int x, y, faty; + + DROP(1); + setWriteMode(0); + for ( y = 0; y < 16; y ++ ) { + for ( x = 0; x < 16; x ++ ) { + 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 colour = b | (g << 1) | (r << 2) | (i << 3); + int fill1 = (spr[y + 64] & (1 << shift)) ? 0xff : 0x55; + int fill2 = fill1 == 0xff ? 0xff : 0xaa; + setPlaneColor(colour); + for ( faty = 0; faty < 8; faty ++) { + VID[dst + x + (SCREEN_STRIDE * faty)] = (faty % 2) ? fill1 : fill2; + } + } + dst += (SCREEN_STRIDE * 8); + } +} + +void f_putpixel() { + int isprite = TOP().i; + unsigned int far *spr = &sprites[isprite * SPRITE_STRIDE]; + int x = ST2().i; + int y = ST1().i; + int color, shift, b, g, r, i, v; + + DROP(3); + color = TOP().i; + DROP(1); + + shift = (15 - x); + b = (color & 0x01); + g = (color & 0x02) >> 1; + r = (color & 0x04) >> 2; + i = (color & 0x08) >> 3; + v = ((color & 0x10) >> 4) ^ 1; + + 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[y + 64] = (spr[y + 64] & ~(1 << shift)) | (v << shift); +} + +/* INIT */ void game_f_init(char *exe, char *bootjor) { f_init(exe); CDEF("seremit", f_seremit); @@ -288,6 +348,10 @@ void game_f_init(char *exe, char *bootjor) { CDEF("glitch", f_glitch); CDEF("unfuck", tile_init); + CDEF("mouseshow", f_mouseshow); + CDEF("drawfatsprite", f_drawfatsprite); + CDEF("putpixel", f_putpixel); + f_loadjor(bootjor); f_atexit = f_lookupcp("atexit");