Back to shtanton's homepage
summaryrefslogtreecommitdiff
path: root/src/all.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/all.c')
-rw-r--r--src/all.c228
1 files changed, 216 insertions, 12 deletions
diff --git a/src/all.c b/src/all.c
index 4fb902b..17fa45b 100644
--- a/src/all.c
+++ b/src/all.c
@@ -81,6 +81,11 @@ enum {
RED_DOWN,
RED_LEFT,
RED_RIGHT,
+ BLUE,
+ BLUE_UP,
+ BLUE_DOWN,
+ BLUE_LEFT,
+ BLUE_RIGHT,
N_COLORS,
};
@@ -112,27 +117,57 @@ static const Color colors[N_COLORS][4] = {
{
{255, 0, 0, 255},
{255, 0, 0, 255},
- {0, 0, 0, 255},
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
+ {255, 255, 0, 255},
},
{
- {0, 0, 0, 255},
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
+ {255, 255, 0, 255},
{255, 0, 0, 255},
{255, 0, 0, 255},
},
{
{255, 0, 0, 255},
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
{255, 0, 0, 255},
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
},
{
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
{255, 0, 0, 255},
- {0, 0, 0, 255},
+ {255, 255, 0, 255},
{255, 0, 0, 255},
},
+ {
+ {0, 0, 255, 255},
+ {0, 0, 255, 255},
+ {0, 0, 255, 255},
+ {0, 0, 255, 255},
+ },
+ {
+ {0, 0, 255, 255},
+ {0, 0, 255, 255},
+ {255, 255, 255, 255},
+ {255, 255, 255, 255},
+ },
+ {
+ {255, 255, 255, 255},
+ {255, 255, 255, 255},
+ {0, 0, 255, 255},
+ {0, 0, 255, 255},
+ },
+ {
+ {0, 0, 255, 255},
+ {255, 255, 255, 255},
+ {0, 0, 255, 255},
+ {255, 255, 255, 255},
+ },
+ {
+ {255, 255, 255, 255},
+ {0, 0, 255, 255},
+ {255, 255, 255, 255},
+ {0, 0, 255, 255},
+ },
};
static DrawList *render(State *state, UI *ui, Arena *a) {
@@ -200,6 +235,7 @@ static void update(Game *game, uint64_t now, Arena a) {
for (int y = 0; y < GRIDHEIGHT; y++) {
switch (lastState->grid[x + y * GRIDWIDTH]) {
int reds, red;
+ int blues, blue;
case BLACK:
reds = 0;
if (
@@ -209,8 +245,20 @@ static void update(Game *game, uint64_t now, Arena a) {
)
) {
reds++;
- red = lastState->grid[x + 1 + y * GRIDWIDTH];
+ if (
+ x < GRIDWIDTH - 2 &&
+ y > 0 &&
+ y < GRIDHEIGHT - 1 &&
+ lastState->grid[x + 2 + y * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x + 1 + (y - 1) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x + 1 + (y + 1) * GRIDWIDTH] == YELLOW
+ ) {
+ red = RED_LEFT;
+ } else {
+ red = lastState->grid[x + 1 + y * GRIDWIDTH];
+ }
}
+
if (
x > 0 && (
lastState->grid[x - 1 + y * GRIDWIDTH] == RED_RIGHT ||
@@ -218,8 +266,20 @@ static void update(Game *game, uint64_t now, Arena a) {
)
) {
reds++;
- red = lastState->grid[x - 1 + y * GRIDWIDTH];
+ if (
+ x > 1 &&
+ y > 0 &&
+ y < GRIDHEIGHT - 1 &&
+ lastState->grid[x - 2 + y * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x - 1 + (y - 1) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x - 1 + (y + 1) * GRIDWIDTH] == YELLOW
+ ) {
+ red = RED_RIGHT;
+ } else {
+ red = lastState->grid[x - 1 + y * GRIDWIDTH];
+ }
}
+
if (
y > 0 && (
lastState->grid[x + (y - 1) * GRIDWIDTH] == RED_DOWN ||
@@ -227,8 +287,20 @@ static void update(Game *game, uint64_t now, Arena a) {
)
) {
reds++;
- red = lastState->grid[x + (y - 1) * GRIDWIDTH];
+ if (
+ x > 0 &&
+ x < GRIDWIDTH - 1 &&
+ y > 1 &&
+ lastState->grid[x + (y - 2) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x - 1 + (y - 1) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x + 1 + (y - 1) * GRIDWIDTH] == YELLOW
+ ) {
+ red = RED_DOWN;
+ } else {
+ red = lastState->grid[x + (y - 1) * GRIDWIDTH];
+ }
}
+
if (
y < GRIDHEIGHT - 1 && (
lastState->grid[x + (y + 1) * GRIDWIDTH] == RED_UP ||
@@ -236,7 +308,18 @@ static void update(Game *game, uint64_t now, Arena a) {
)
) {
reds++;
- red = lastState->grid[x + (y + 1) * GRIDWIDTH];
+ if (
+ x > 0 &&
+ x < GRIDWIDTH - 1 &&
+ y < GRIDHEIGHT - 2 &&
+ lastState->grid[x + (y + 2) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x - 1 + (y + 1) * GRIDWIDTH] == YELLOW &&
+ lastState->grid[x + 1 + (y + 1) * GRIDWIDTH] == YELLOW
+ ) {
+ red = RED_UP;
+ } else {
+ red = lastState->grid[x + (y + 1) * GRIDWIDTH];
+ }
}
if (reds == 1) {
@@ -291,6 +374,127 @@ static void update(Game *game, uint64_t now, Arena a) {
case YELLOW:
game->state.grid[x + y * GRIDWIDTH] = BLACK;
break;
+ case BLUE:
+ blues = 0;
+ if (
+ x > 0 && (
+ lastState->grid[x - 1 + y * GRIDWIDTH] == RED ||
+ lastState->grid[x - 1 + y * GRIDWIDTH] == RED_LEFT ||
+ lastState->grid[x - 1 + y * GRIDWIDTH] == RED_RIGHT ||
+ lastState->grid[x - 1 + y * GRIDWIDTH] == RED_DOWN ||
+ lastState->grid[x - 1 + y * GRIDWIDTH] == RED_UP
+ )
+ ) {
+ blues++;
+ blue = BLUE_RIGHT;
+ }
+ if (
+ x < GRIDWIDTH - 1 && (
+ lastState->grid[x + 1 + y * GRIDWIDTH] == RED ||
+ lastState->grid[x + 1 + y * GRIDWIDTH] == RED_LEFT ||
+ lastState->grid[x + 1 + y * GRIDWIDTH] == RED_RIGHT ||
+ lastState->grid[x + 1 + y * GRIDWIDTH] == RED_DOWN ||
+ lastState->grid[x + 1 + y * GRIDWIDTH] == RED_UP
+ )
+ ) {
+ blues++;
+ blue = BLUE_LEFT;
+ }
+ if (
+ y > 0 && (
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == RED ||
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == RED_LEFT ||
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == RED_RIGHT ||
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == RED_DOWN ||
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == RED_UP
+ )
+ ) {
+ blues++;
+ blue = BLUE_DOWN;
+ }
+ if (
+ y < GRIDHEIGHT - 1 && (
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == RED ||
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == RED_LEFT ||
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == RED_RIGHT ||
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == RED_DOWN ||
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == RED_UP
+ )
+ ) {
+ blues++;
+ blue = BLUE_UP;
+ }
+ if (blues == 1) {
+ game->state.grid[x + y * GRIDWIDTH] = blue;
+ }
+ break;
+ case BLUE_LEFT:
+ if (
+ x > 0 &&
+ lastState->grid[x - 1 + y * GRIDWIDTH] == EMPTY
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = EMPTY;
+ } else {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ }
+ break;
+ case BLUE_RIGHT:
+ if (
+ x < GRIDWIDTH - 1 &&
+ lastState->grid[x + 1 + y * GRIDWIDTH] == EMPTY
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = EMPTY;
+ } else {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ }
+ break;
+ case BLUE_UP:
+ if (
+ y > 0 &&
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == EMPTY
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = EMPTY;
+ } else {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ }
+ break;
+ case BLUE_DOWN:
+ if (
+ y < GRIDHEIGHT - 1 &&
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == EMPTY
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = EMPTY;
+ } else {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ }
+ break;
+ case EMPTY:
+ // TODO: same as multiple reds
+ if (
+ x > 0 &&
+ lastState->grid[x - 1 + y * GRIDWIDTH] == BLUE_RIGHT
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE_RIGHT;
+ }
+ if (
+ x < GRIDWIDTH - 1 &&
+ lastState->grid[x + 1 + y * GRIDWIDTH] == BLUE_LEFT
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE_LEFT;
+ }
+ if (
+ y > 0 &&
+ lastState->grid[x + (y - 1) * GRIDWIDTH] == BLUE_DOWN
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE_DOWN;
+ }
+ if (
+ y < GRIDHEIGHT - 1 &&
+ lastState->grid[x + (y + 1) * GRIDWIDTH] == BLUE_UP
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE_UP;
+ }
+ break;
}
}
}