diff options
| author | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-05 16:25:51 +0100 | 
|---|---|---|
| committer | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-05 16:25:51 +0100 | 
| commit | fa9bffcc842eb5973829d46436d3435993de9510 (patch) | |
| tree | c91baec4d8e4a185215dc25479feb2f19c7bea49 /src | |
| parent | b03e011bfeeae336f2648ea61fa2554ccdcf07a1 (diff) | |
| download | ldjam57-red.tar | |
Add bluered
Diffstat (limited to 'src')
| -rw-r--r-- | src/all.c | 228 | ||||
| -rw-r--r-- | src/index.html.in | 3 | 
2 files changed, 218 insertions, 13 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;  				}  			}  		} diff --git a/src/index.html.in b/src/index.html.in index a58354a..0b76295 100644 --- a/src/index.html.in +++ b/src/index.html.in @@ -30,7 +30,8 @@ button {  // Mirror these in src/all.c  const INPUT_NONE  = 0;  const INPUT_CLICK = 1; -const INPUT_PAUSE_PLAY = 2; +const INPUT_RCLICK = 2; +const INPUT_PAUSE_PLAY = 3;  const WASM =  #include "../build/main.wasm.b64" | 
