From 070e393b7535937a32c6eb1aec674c0187eab761 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sat, 16 Jan 2021 22:16:19 +0100 Subject: Add initial game --- src/main.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/main.c diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..30cd2be --- /dev/null +++ b/src/main.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include + +struct screen { + unsigned char grid[25][40]; +}; + +enum direction { + UP, + DOWN, + LEFT, + RIGHT, +}; + +struct player { + char x; + char y; + enum direction dir; + unsigned char joy; + unsigned char prev_joy; + unsigned char next_char; +}; + +#define SCREEN (*(struct screen*) 0x0400) +#define SCREEN_AT(x, y) (SCREEN.grid[y][x]) + +#define MAX_PLAYERS 2 + +#define EMPTY '\x20' +#define PLAYER '\x71' + +#define CHR_V '\x42'+128 +#define CHR_H '\x43'+128 + +#define CHR_DR '\xed'+128 +#define CHR_RD '\xee'+128 +#define CHR_UR '\xf0'+128 +#define CHR_RU '\xfd'+128 + +static void update_player(struct player *p) { + /* has direction been changed? */ + if (p->joy == p->prev_joy) { + if (p->dir == DOWN || p->dir == UP) { + p->next_char = CHR_V; + } else if (p->dir == LEFT || p->dir == RIGHT) { + p->next_char = CHR_H; + } + return; + } + + if (JOY_UP(p->joy) && p->dir != DOWN) { + switch (p->dir) { + case RIGHT: p->next_char = CHR_RU; break; + case LEFT: p->next_char = CHR_DR; break; + } + p->dir = UP; + } else if (JOY_DOWN(p->joy) && p->dir != UP) { + switch (p->dir) { + case RIGHT: p->next_char = CHR_RD; break; + case LEFT: p->next_char = CHR_UR; break; + } + p->dir = DOWN; + } else if (JOY_LEFT(p->joy) && p->dir != RIGHT) { + switch (p->dir) { + case UP: p->next_char = CHR_RD; break; + case DOWN: p->next_char = CHR_RU; break; + } + p->dir = LEFT; + } else if (JOY_RIGHT(p->joy) && p->dir != LEFT) { + switch (p->dir) { + case UP: p->next_char = CHR_UR; break; + case DOWN: p->next_char = CHR_DR; break; + } + p->dir = RIGHT; + } + p->prev_joy = p->joy; +} + +static char move_player(struct player *p) { + int res = 1; + SCREEN_AT(p->x, p->y) = p->next_char; + + switch (p->dir) { + case UP: p->y--; break; + case DOWN: p->y++; break; + case LEFT: p->x--; break; + case RIGHT: p->x++; break; + } + + if (SCREEN_AT(p->x, p->y) != EMPTY || p->x < 0 || p->x >= 40 || p->y < 0 || p->y >= 25) { + res = 0; + } + SCREEN_AT(p->x, p->y) = PLAYER; + + return res; +} + +static void play_game(char n_players) { + uint16_t busy_wait = 300; + + struct player players[MAX_PLAYERS] = { + { 5, 12, RIGHT, 0, 0, CHR_H }, + { 35, 12, LEFT, 0, 0, CHR_H }, + }; + + clrscr(); + + while(1) { + char i; + uint16_t n; + + for (i=0; i