From e5d1ac5c79520305abaf3c75312249bc3e7d5487 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 20 Jan 2019 11:44:42 -0500 Subject: [PATCH] Fullscreen scrolling, initial cut at game logic --- testbed.c | 102 +++++++++++++++++++++++++++++++++++++++++++--------- testbed.exe | Bin 65109 -> 65976 bytes 2 files changed, 86 insertions(+), 16 deletions(-) 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 c3131ce54e6f18a42ce222a3d2fba8ac204334d5..9708cc39bfd61abfc0a0f6627742f1c1befc80b7 100755 GIT binary patch delta 8145 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 U#N)FjXOUz0h}-@#PPtF{7jVRSr~m)}