diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/all.c | 73 | ||||
| -rw-r--r-- | src/levels.c | 38 | ||||
| -rw-r--r-- | src/types.c | 23 | 
3 files changed, 117 insertions, 17 deletions
| @@ -91,12 +91,14 @@ static const Color colors[N_COLORS][4] = {  #define BUTTON_SIZE 32  #define BUTTON_SPACING 16 -#define BUTTON_SPACER(i) (BUTTON_SPACING + (BUTTON_SIZE * (i) + (i) * BUTTON_SPACING)) +#define BUTTON_SPACER(i) (BUTTON_SPACING + BUTTON_SIZE + (BUTTON_SIZE * (i) + (i) * BUTTON_SPACING)) +// reverse order as they're anchored to bottom  static const Button buttons[N_BUTTONS] = { -	[BUTTON_CONTINUE] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_CONTINUE), .w = BUTTON_SIZE, .h = BUTTON_SIZE}, -	[BUTTON_RETRY] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_RETRY), .w = BUTTON_SIZE, .h = BUTTON_SIZE},  	[BUTTON_BACK] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_BACK), .w = BUTTON_SIZE, .h = BUTTON_SIZE}, +	[BUTTON_RETRY] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_RETRY), .w = BUTTON_SIZE, .h = BUTTON_SIZE}, +	[BUTTON_PLAY] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_PLAY), .w = BUTTON_SIZE, .h = BUTTON_SIZE}, +	[BUTTON_CONTINUE] = {.x = BUTTON_SPACING, .y = BUTTON_SPACER(BUTTON_CONTINUE), .w = BUTTON_SIZE, .h = BUTTON_SIZE},  };  static DrawList *render(State *state, UI *ui, Arena *a) { @@ -132,6 +134,7 @@ static DrawList *render(State *state, UI *ui, Arena *a) {  		}  	} +	// render end cell  	drawList->els[drawList->len++] = (DrawElement) {  		.x = cellWidth * state->goalx + GRID_OFFSET_X,  		.y = cellHeight * state->goaly, @@ -142,15 +145,17 @@ static DrawList *render(State *state, UI *ui, Arena *a) {  		.image = 5,  	}; +	// render side panel  	drawList->els[drawList->len++] = (DrawElement) {  		.x = 0,  		.y = 0,  		.w = GRID_OFFSET_X,  		.h = ui->height, -		.fill = {255, 255, 0, 255}, +		.fill = {100, 100, 100, 255},  		.border = {0, 0, 0, 255},  	}; -	 + +	// render buttons  	for (int i = 0; i < N_BUTTONS; i++) {  		Color colour = {0, 0, 0, 255};  		switch (state->buttonStates[i]) { @@ -164,16 +169,51 @@ static DrawList *render(State *state, UI *ui, Arena *a) {  				colour = (Color) {255, 0, 0, 255};  				break;  		} +		int image = IMAGE_NULL; +		switch (i) { +			case BUTTON_CONTINUE: +				image = IMAGE_CONTINUE; +				break; +			case BUTTON_BACK: +				image = IMAGE_EXIT; +				break; +			case BUTTON_RETRY: +				image = IMAGE_RETRY; +				break; +			case BUTTON_PLAY: +				image = state->playing ? IMAGE_PAUSE : IMAGE_PLAY; +				break; +		}  		drawList->els[drawList->len++] = (DrawElement) {  			.x = buttons[i].x, -			.y = buttons[i].y, +			.y = ui->height - buttons[i].y,  			.w = buttons[i].w,  			.h = buttons[i].h, -			.fill = colour, -			.border = {0, 0, 0, 255} +			.image = image,  		};  	} +	// render placeable cells +	int cellCount = 0; // doesn't increment when ignoring empty cells +	for (int i = 0; i < MAX_PLACEABLE_CELLS; i++) { +		if (levels[state->currentLevel].placeableCells[i] == EMPTY) +			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)) * (cellCount + 1), // TODO - padding +					.w = BUTTON_SIZE / 2, +					.h = BUTTON_SIZE / 2, +					.fill = colors[cellCount + 1][x + 2 * y], +					.border = {0, 0, 0, 0}, +				}; +			} +		} +		cellCount++; +	} +  	return drawList;  } @@ -189,15 +229,27 @@ static void update(Game *game, uint64_t now, Arena a) {  			for (int i = 0; i < N_BUTTONS; i++) {  				if (  					game->mousex > buttons[i].x && game->mousex < buttons[i].x + buttons[i].w && -					game->mousey > buttons[i].y && game->mousey < buttons[i].y + buttons[i].h +					game->mousey > game->ui.height - buttons[i].y && +						game->mousey < game->ui.height - buttons[i].y + buttons[i].h  				) {  					// TODO - CLICK THINGS  					//game->state.buttonStates[i] = BUTTON_STATE_PRESSED; +					switch (i) { +						case BUTTON_RETRY: +							break; +						case BUTTON_CONTINUE: +							break; +						case BUTTON_BACK: +							break; +						case BUTTON_PLAY: +							game->state.playing = !game->state.playing; +							break; +					}  				}  			}  			break;  		case INPUT_RCLICK: -			x = game->mousex * GRIDWIDTH / game->ui.width; +			x = (game->mousex - GRID_OFFSET_X) * GRIDWIDTH / offset_width;  			y = game->mousey * GRIDHEIGHT / game->ui.height;  			game->state.grid[x + y * GRIDWIDTH] = EMPTY;  			break; @@ -243,6 +295,7 @@ int main(int argc, char **argv) {  	xmemcpy(&game->state.grid, &levels[0].grid, sizeof(game->state.grid));  	game->state.goalx = levels[0].goalx;  	game->state.goaly = levels[0].goaly; +	game->state.currentLevel = 0;  	game->state.playing = 0;  	game->ui = (UI) {  		.width = 640, diff --git a/src/levels.c b/src/levels.c index 004d0d9..7f49fb1 100644 --- a/src/levels.c +++ b/src/levels.c @@ -3,11 +3,6 @@  #include "all.c" -typedef struct { -	int grid[GRIDWIDTH * GRIDHEIGHT]; -	int goalx, goaly; -} Level; -  #define _ EMPTY,  #define B BLACK,  #define O BLUE, @@ -33,6 +28,39 @@ static Level levels[] = {  		},  		.goalx = 18,  		.goaly = 7, +		.placeableCells = { +			BLACK, +			RED, +			EMPTY, +			YELLOW, +			RED_RIGHT +		}, +	}, +	{ +		.grid = { +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  B  B  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  B  O  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  B  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  B  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  B  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +			_  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _  _ +		}, +		.goalx = 18, +		.goaly = 10, +		.placeableCells = { +			BLACK, +			RED_DOWN +		},  	},  };  #undef _ diff --git a/src/types.c b/src/types.c index bfe0d7d..4c7a3cb 100644 --- a/src/types.c +++ b/src/types.c @@ -8,6 +8,7 @@  #define GRIDHEIGHT 16  #define TICK_LENGTH 200  #define GRID_OFFSET_X 64 +#define MAX_PLACEABLE_CELLS 16  typedef struct {  	unsigned char r, g, b, a; @@ -48,9 +49,20 @@ enum {  };  enum { -	BUTTON_CONTINUE, -	BUTTON_RETRY, +	IMAGE_NULL, +	IMAGE_CONTINUE, +	IMAGE_EXIT, +	IMAGE_PAUSE, +	IMAGE_PLAY, +	IMAGE_RETRY, +	N_IMAGES, +}; + +enum {  	BUTTON_BACK, +	BUTTON_RETRY, +	BUTTON_PLAY, +	BUTTON_CONTINUE,  	N_BUTTONS,  }; @@ -69,11 +81,18 @@ typedef struct {  } Button;  typedef struct { +	int grid[GRIDWIDTH * GRIDHEIGHT]; +	int goalx, goaly; +	int placeableCells[MAX_PLACEABLE_CELLS]; // Color +} Level; + +typedef struct {  	uint64_t lastTick;  	char playing;  	int grid[GRIDWIDTH * GRIDHEIGHT];  	int goalx, goaly;  	ButtonState buttonStates[N_BUTTONS]; +	int currentLevel;  } State;  // Mirror these in src/index.html.in | 
