Back to shtanton's homepage
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/all.c59
-rw-r--r--src/levels.c10
-rw-r--r--src/tick.c4
-rw-r--r--src/types.c9
4 files changed, 44 insertions, 38 deletions
diff --git a/src/all.c b/src/all.c
index 87b9b56..459539d 100644
--- a/src/all.c
+++ b/src/all.c
@@ -135,14 +135,14 @@ static DrawList *render(State *state, UI *ui, Arena *a) {
for (int x = 0; x < GRIDWIDTH; x++) {
for (int y = 0; y < GRIDHEIGHT; y++) {
- if (colorImages[state->grid[x + GRIDWIDTH * y]]) {
+ if (colorImages[(int) state->grid[x + GRIDWIDTH * y]]) {
drawList->els[drawList->len++] = (DrawElement) {
.x = cellWidth * x + GRID_OFFSET_X,
.y = cellHeight * y,
.w = cellWidth,
.h = cellHeight,
.image = (ImageRef) {
- .index = colorImages[state->grid[x + GRIDWIDTH * y]],
+ .index = colorImages[(int) state->grid[x + GRIDWIDTH * y]],
.opacity = 255,
},
};
@@ -154,7 +154,7 @@ static DrawList *render(State *state, UI *ui, Arena *a) {
.y = cellHeight * y + suby * cellHeight / 2,
.w = cellWidth / 2 + (1 - subx),
.h = cellHeight / 2 + (1 - suby),
- .fill = colors[state->grid[x + GRIDWIDTH * y]][subx + 2 * suby],
+ .fill = colors[(int) state->grid[x + GRIDWIDTH * y]][subx + 2 * suby],
};
}
}
@@ -279,11 +279,16 @@ static DrawList *render(State *state, UI *ui, Arena *a) {
image = state->playing ? IMAGE_PAUSE : IMAGE_PLAY;
break;
}
+ Color fill = {0};
+ if (i == BUTTON_CONTINUE && state->levelComplete) {
+ fill = (Color) {127, 255, 127, 200};
+ };
drawList->els[drawList->len++] = (DrawElement) {
.x = buttons[i].x,
.y = ui->height - buttons[i].y,
.w = buttons[i].w,
.h = buttons[i].h,
+ .fill = fill,
.image = (ImageRef) {
.index = image,
.opacity = 255,
@@ -291,36 +296,24 @@ static DrawList *render(State *state, UI *ui, Arena *a) {
};
}
- // render placeable cells
- int cellCount = 0; // doesn't increment when ignoring empty cells
+ // Placeable cells
for (int i = 0; i < MAX_PLACEABLE_CELLS; i++) {
- if (levels[state->currentLevel].placeableCells[i] == EMPTY)
- continue;
-
- // TODO - FIXME (how to tell how many cells we have left of a colour? Maybe placedCells is a bad idea!)
- int canContinue = 1;
- for (int j = 0; j < MAX_PLACEABLE_CELLS; j++) {
- if (levels[state->currentLevel].placeableCells[i] == state->placedCells[j]) {
- canContinue = 0;
- break;
- }
+ if (state->placeableCells[i] == EMPTY) {
+ break;
}
- if (canContinue == 0)
- continue;
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 2; y++) {
drawList->els[drawList->len++] = (DrawElement) {
.x = BUTTON_SIZE / 2 + x * (BUTTON_SIZE / 2),
- .y = (BUTTON_SIZE / 2 + y * (BUTTON_SIZE / 2) + BUTTON_SPACING * (cellCount % 2 + 1)) * (cellCount + 1), // TODO - padding
+ // .y = (BUTTON_SIZE / 2 + y * (BUTTON_SIZE / 2) + BUTTON_SPACING * (cellCount % 2 + 1)) * (cellCount + 1), // TODO - padding
+ .y = BUTTON_SIZE / 2 + i * (BUTTON_SIZE + BUTTON_SPACING) + y * (BUTTON_SIZE / 2),
.w = BUTTON_SIZE / 2,
.h = BUTTON_SIZE / 2,
- .fill = colors[cellCount + 1][x + 2 * y],
- .border = {0, 0, 0, 0},
+ .fill = colors[(int) state->placeableCells[i]][x + 2 * y],
};
}
}
- cellCount++;
}
return drawList;
@@ -332,6 +325,7 @@ static void restart_level(Game* game) {
game->state.goalx = levels[level].goalx;
game->state.goaly = levels[level].goaly;
game->state.playing = 0;
+ xmemcpy(&game->state.placeableCells, &levels[level].placeableCells, sizeof(game->state.placeableCells));
}
static void update(Game *game, uint64_t now, Arena a) {
@@ -350,17 +344,27 @@ static void update(Game *game, uint64_t now, Arena a) {
int celly = game->ui.mousey - y * cellHeight;
// Keeping this around for testing purposes
// game->state.grid[x + y * GRIDWIDTH] = (game->state.grid[x + y * GRIDWIDTH] + 1) % (sizeof(colors) / sizeof(colors[0]));
- game->state.grid[x + y * GRIDWIDTH] = getPlaceAction(
+ char placed = getPlaceAction(
game->state.grid[x + y * GRIDWIDTH],
cellx,
celly,
cellWidth,
cellHeight
);
- }
- // TODO - some ignore list for which cells we have left to place
- game->state.placedCells[0] = BLACK;
+ if (placed != EMPTY) {
+ for (int i = 0; i < MAX_PLACEABLE_CELLS; i++) {
+ if (game->state.placeableCells[i] == placed) {
+ game->state.grid[x + y * GRIDWIDTH] = placed;
+ for (int j = i; j < MAX_PLACEABLE_CELLS - 1; j++) {
+ game->state.placeableCells[j] = game->state.placeableCells[j + 1];
+ }
+ game->state.placeableCells[MAX_PLACEABLE_CELLS - 1] = EMPTY;
+ break;
+ }
+ }
+ }
+ }
for (int i = 0; i < N_BUTTONS; i++) {
if (
@@ -375,9 +379,10 @@ static void update(Game *game, uint64_t now, Arena a) {
restart_level(game);
break;
case BUTTON_CONTINUE:
- // TODO - don't allow if level has not been completed
- if (game->state.currentLevel + 1 >= 2) // TODO - get size of levels array
+ // TODO - get size of levels array
+ if (!game->state.levelComplete || game->state.currentLevel + 1 >= 2)
break;
+ game->state.levelComplete = 0;
game->state.currentLevel++;
restart_level(game);
break;
diff --git a/src/levels.c b/src/levels.c
index 7f49fb1..e6f4d3a 100644
--- a/src/levels.c
+++ b/src/levels.c
@@ -16,7 +16,7 @@ static Level levels[] = {
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- _ _ _ _ B O _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ _ _ _ _ B O _ _ _ _ _ _ _ _ _ _ _ _ _ B
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
@@ -29,11 +29,11 @@ static Level levels[] = {
.goalx = 18,
.goaly = 7,
.placeableCells = {
- BLACK,
RED,
- EMPTY,
+ BLACK,
YELLOW,
- RED_RIGHT
+ RED_DOWN,
+ RED_LEFT,
},
},
{
@@ -48,7 +48,7 @@ static Level levels[] = {
_ _ _ _ B O _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ B _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- _ _ _ _ B _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ _ _ _ _ B _ _ _ _ _ _ _ _ _ _ _ _ _ _ B
_ _ _ _ _ B _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
diff --git a/src/tick.c b/src/tick.c
index e351155..a15c1cb 100644
--- a/src/tick.c
+++ b/src/tick.c
@@ -341,8 +341,8 @@ static void tick(Game *game, Arena a) {
}
}
- if (isBlue(game->state.grid[game->state.goalx + game->state.goaly * GRIDWIDTH])) {
- // TODO: Win conditions
+ if (game->state.grid[game->state.goalx + game->state.goaly * GRIDWIDTH] == BLUE) {
+ game->state.levelComplete = 1;
}
}
diff --git a/src/types.c b/src/types.c
index fdb9aa0..b2f1ee6 100644
--- a/src/types.c
+++ b/src/types.c
@@ -101,19 +101,20 @@ typedef struct {
} Button;
typedef struct {
- int grid[GRIDWIDTH * GRIDHEIGHT];
+ char grid[GRIDWIDTH * GRIDHEIGHT];
int goalx, goaly;
- int placeableCells[MAX_PLACEABLE_CELLS]; // Color
+ char placeableCells[MAX_PLACEABLE_CELLS]; // Color
} Level;
typedef struct {
uint64_t lastTick;
char playing;
- int grid[GRIDWIDTH * GRIDHEIGHT];
+ char levelComplete;
+ char grid[GRIDWIDTH * GRIDHEIGHT];
int goalx, goaly;
ButtonState buttonStates[N_BUTTONS];
int currentLevel;
- int placedCells[MAX_PLACEABLE_CELLS]; // indices into Level placeableCells
+ char placeableCells[MAX_PLACEABLE_CELLS];
} State;
// Mirror these in src/index.html.in