diff options
Diffstat (limited to 'src/all.c')
-rw-r--r-- | src/all.c | 228 |
1 files changed, 216 insertions, 12 deletions
@@ -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; } } } |