Back to shtanton's homepage
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2025-04-05 17:27:22 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2025-04-05 17:27:22 +0100
commitd36583ad6ae53708f1ae11bb7e4f4939e6ac3b4d (patch)
treeb56533e4bdb81864e80771e1a3a2e16347328684 /src
parentfa9bffcc842eb5973829d46436d3435993de9510 (diff)
downloadldjam57-d36583ad6ae53708f1ae11bb7e4f4939e6ac3b4d.tar
allow cloning blues
Diffstat (limited to 'src')
-rw-r--r--src/all.c49
-rw-r--r--src/index.html.in7
2 files changed, 55 insertions, 1 deletions
diff --git a/src/all.c b/src/all.c
index 17fa45b..4cca8ae 100644
--- a/src/all.c
+++ b/src/all.c
@@ -89,6 +89,16 @@ enum {
N_COLORS,
};
+static int isRed(int cell) {
+ return (
+ cell == RED ||
+ cell == RED_LEFT ||
+ cell == RED_RIGHT ||
+ cell == RED_UP ||
+ cell == RED_DOWN
+ );
+}
+
static const Color colors[N_COLORS][4] = {
{
{255, 255, 255, 255},
@@ -372,7 +382,16 @@ static void update(Game *game, uint64_t now, Arena a) {
}
break;
case YELLOW:
- game->state.grid[x + y * GRIDWIDTH] = BLACK;
+ if (
+ (x > 0 && lastState->grid[x - 1 + y * GRIDWIDTH] == BLUE_RIGHT) ||
+ (x < GRIDWIDTH - 1 && lastState->grid[x + 1 + y * GRIDWIDTH] == BLUE_LEFT) ||
+ (y > 0 && lastState->grid[x + (y - 1) * GRIDWIDTH] == BLUE_DOWN) ||
+ (y < GRIDHEIGHT - 1 && lastState->grid[x + (y + 1) * GRIDWIDTH] == BLUE_UP)
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = RED;
+ } else {
+ game->state.grid[x + y * GRIDWIDTH] = BLACK;
+ }
break;
case BLUE:
blues = 0;
@@ -430,6 +449,13 @@ static void update(Game *game, uint64_t now, Arena a) {
break;
case BLUE_LEFT:
if (
+ (x > 0 && isRed(lastState->grid[x - 1 + y * GRIDWIDTH])) ||
+ (x < GRIDWIDTH - 1 && isRed(lastState->grid[x + 1 + y * GRIDWIDTH])) ||
+ (y > 0 && isRed(lastState->grid[x + (y - 1) * GRIDWIDTH])) ||
+ (y < GRIDHEIGHT - 1 && isRed(lastState->grid[x + (y + 1) * GRIDWIDTH]))
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ } else if (
x > 0 &&
lastState->grid[x - 1 + y * GRIDWIDTH] == EMPTY
) {
@@ -440,6 +466,13 @@ static void update(Game *game, uint64_t now, Arena a) {
break;
case BLUE_RIGHT:
if (
+ (x > 0 && isRed(lastState->grid[x - 1 + y * GRIDWIDTH])) ||
+ (x < GRIDWIDTH - 1 && isRed(lastState->grid[x + 1 + y * GRIDWIDTH])) ||
+ (y > 0 && isRed(lastState->grid[x + (y - 1) * GRIDWIDTH])) ||
+ (y < GRIDHEIGHT - 1 && isRed(lastState->grid[x + (y + 1) * GRIDWIDTH]))
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ } else if (
x < GRIDWIDTH - 1 &&
lastState->grid[x + 1 + y * GRIDWIDTH] == EMPTY
) {
@@ -450,6 +483,13 @@ static void update(Game *game, uint64_t now, Arena a) {
break;
case BLUE_UP:
if (
+ (x > 0 && isRed(lastState->grid[x - 1 + y * GRIDWIDTH])) ||
+ (x < GRIDWIDTH - 1 && isRed(lastState->grid[x + 1 + y * GRIDWIDTH])) ||
+ (y > 0 && isRed(lastState->grid[x + (y - 1) * GRIDWIDTH])) ||
+ (y < GRIDHEIGHT - 1 && isRed(lastState->grid[x + (y + 1) * GRIDWIDTH]))
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ } else if (
y > 0 &&
lastState->grid[x + (y - 1) * GRIDWIDTH] == EMPTY
) {
@@ -460,6 +500,13 @@ static void update(Game *game, uint64_t now, Arena a) {
break;
case BLUE_DOWN:
if (
+ (x > 0 && isRed(lastState->grid[x - 1 + y * GRIDWIDTH])) ||
+ (x < GRIDWIDTH - 1 && isRed(lastState->grid[x + 1 + y * GRIDWIDTH])) ||
+ (y > 0 && isRed(lastState->grid[x + (y - 1) * GRIDWIDTH])) ||
+ (y < GRIDHEIGHT - 1 && isRed(lastState->grid[x + (y + 1) * GRIDWIDTH]))
+ ) {
+ game->state.grid[x + y * GRIDWIDTH] = BLUE;
+ } else if (
y < GRIDHEIGHT - 1 &&
lastState->grid[x + (y + 1) * GRIDWIDTH] == EMPTY
) {
diff --git a/src/index.html.in b/src/index.html.in
index 0b76295..8d0ccea 100644
--- a/src/index.html.in
+++ b/src/index.html.in
@@ -90,9 +90,16 @@ async function main() {
const mousey = e.clientY;
if (e.button == 0) {
exports.game_update(INPUT_CLICK, mousex, mousey, now());
+ } else if (e.button == 2) {
+ e.preventDefault();
+ exports.game_update(INPUT_RCLICK, mousex, mousey, now());
}
});
+ canvas.addEventListener("contextmenu", function (e) {
+ e.preventDefault();
+ });
+
document.addEventListener("keydown", function (e) {
if (e.key === " ") {
exports.game_update(INPUT_PAUSE_PLAY, 0, 0, now());