diff --git a/testbed.c b/testbed.c index 2279012..cd56ed1 100755 --- a/testbed.c +++ b/testbed.c @@ -469,7 +469,7 @@ int tifLoad(FILE *f, TifImageMeta_t meta, unsigned int *planeBuf, int maxY, int // 89ABCDEF 01234567 << 3 => BCDEFXXX 3456789A byteswap => 3456789A BCDEFXXX #define PAGE_TILES_W 21 -#define PAGE_TILES_H 12 +#define PAGE_TILES_H 14 #define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W) #define PAGE_STRIDE (PAGE_TILES_W << 1) @@ -511,7 +511,7 @@ typedef struct { unsigned char firstBuffer; } TiledScreen_t; -TiledScreen_t screen = { 0, 0, 0, 0, { 0x0400, 0x2400 }, 0, 0, NULL, NULL, +TiledScreen_t screen = { 0, 0, 0, 0, { 0x0600, 0x2B00 }, 0, 0, NULL, NULL, 0, 0, 0, 0, 0 }; void loadTiles(unsigned int tilesOffset, unsigned int *memTiles) { @@ -598,7 +598,7 @@ void drawSprite(unsigned int *sprite, int x, int y) { void scroll(int newX, int newY) { newX = min(max(newX, 0), (screen.w << 4) - 320); - newY = min(max(newY, 0), (screen.h << 4) - 176); + newY = min(max(newY, 0), (screen.h << 4) - 200); if ((screen.scrollX & 0xfff0) != (newX & 0xfff0) || (screen.scrollY & 0xfff0) != (newY & 0xfff0)) { int mapX, mapY; @@ -675,7 +675,7 @@ void drawScreen() { /*** S C R A T C H ***/ #define NUM_TILES 128 #define NUM_SPRITES 64 -#define OFF_TILES 0x4840 +#define OFF_TILES 0x5000 #define TILE_STRIDE 64 #define SPRITE_STRIDE 80 unsigned int tiles[NUM_TILES * TILE_STRIDE]; @@ -695,10 +695,64 @@ void fillMap() { } } +#define DIR_N 0 +#define DIR_E 1 +#define DIR_W 2 +#define DIR_S 3 + +#define STATE_MAP 0 +#define STATE_DIALOG 1 + +struct entity; +typedef struct entity Entity_t; + +struct entity { + int x; + int y; + int dir; + int sprites[4]; +}; + +void drawEntity(Entity_t *entity) { + int isprite = entity->sprites[entity->dir]; + drawSprite(&sprites[isprite * SPRITE_STRIDE], entity->x, entity->y); +} + +void playerThink(Entity_t *self) { + if (keyPressed(K_LEFT)) { self->x -= 3; self->dir = DIR_W; } + if (keyPressed(K_RIGHT)) { self->x += 3; self->dir = DIR_E; } + if (keyPressed(K_UP)) { self->y -= 3; self->dir = DIR_N; } + if (keyPressed(K_DOWN)) { self->y += 3; self->dir = DIR_S; } +} + +typedef struct { + int dy; + int y; + int debounce; +} Footer_t; + +typedef struct { + Entity_t player; + Footer_t footer; + int state; +} Game_t; + +Game_t game; + void game_init() { FILE *f; TifImageMeta_t meta; + game.player.x = 100; + game.player.y = 100; + game.player.dir = DIR_E; + game.player.sprites[DIR_E] = 0; + game.player.sprites[DIR_N] = 1; + game.player.sprites[DIR_W] = 2; + game.player.sprites[DIR_S] = 3; + game.footer.y = 0; + game.state = STATE_MAP; + setEGAMode(); atexit(vid_cleanup); @@ -721,7 +775,7 @@ void game_init() { tifLoad(f, meta, sprites, NUM_SPRITES * 16, 16, 5); fclose(f); - setSplitScreen(351); +// setSplitScreen(351); loadTiles(OFF_TILES, tiles); loadMap(map, 100, 100); @@ -729,21 +783,37 @@ void game_init() { } int main() { - int x = -1; - int y = -1; - int dir = 0; - game_init(); kbd_init(); while (!keyPressed(K_ESC)) { - - if (keyPressed(K_LEFT)) { x -= 3; dir = 2; } - if (keyPressed(K_RIGHT)) { x += 3; dir = 0; } - if (keyPressed(K_UP)) { y -= 3; dir = 1; } - if (keyPressed(K_DOWN)) { y += 3; dir = 3; } - scroll(x - 152, y - 90); - drawSprite(&sprites[dir * SPRITE_STRIDE], x, y); + if (game.state == STATE_MAP) { + if (keyPressed(K_SPACE)) { + game.state = STATE_DIALOG; + game.footer.debounce = 1; + game.footer.dy = 1; + } + playerThink(&game.player); + scroll(game.player.x - 152, game.player.y - 92); + } else if (game.state == STATE_DIALOG) { + if (game.footer.debounce && !keyPressed(K_SPACE)) { + game.footer.debounce = 0; + } + if (!game.footer.debounce && keyPressed(K_SPACE)) { + game.footer.dy = -1; + } + game.footer.y += game.footer.dy; + if (game.footer.dy > 0 && game.footer.y > 24) { + game.footer.y = 24; + game.footer.dy = 0; + } else if (game.footer.dy < 0 && game.footer.y < 0) { + game.footer.y = 0; + game.footer.dy = 0; + game.state = STATE_MAP; + } + setSplitScreen(399 - (game.footer.y << 1)); + } + drawEntity(&game.player); drawScreen(); } diff --git a/testbed.exe b/testbed.exe index c3131ce..9708cc3 100755 Binary files a/testbed.exe and b/testbed.exe differ