|
|
@ -43,7 +43,7 @@ typedef enum {
|
|
|
|
} TileType;
|
|
|
|
} TileType;
|
|
|
|
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
typedef enum {
|
|
|
|
FieldEmpty,
|
|
|
|
FieldEmpty, // <-- same goes for this
|
|
|
|
FieldMine
|
|
|
|
FieldMine
|
|
|
|
} Field;
|
|
|
|
} Field;
|
|
|
|
|
|
|
|
|
|
|
@ -99,8 +99,6 @@ static void render_callback(Canvas* const canvas, void* ctx) {
|
|
|
|
furi_string_printf(timeStr, "%01d:%02d", minutes, seconds);
|
|
|
|
furi_string_printf(timeStr, "%01d:%02d", minutes, seconds);
|
|
|
|
canvas_draw_str_aligned(canvas, 128, 0, AlignRight, AlignTop, furi_string_get_cstr(timeStr));
|
|
|
|
canvas_draw_str_aligned(canvas, 128, 0, AlignRight, AlignTop, furi_string_get_cstr(timeStr));
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t* tile_to_draw;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int y = 0; y < PLAYFIELD_HEIGHT; y++) {
|
|
|
|
for (int y = 0; y < PLAYFIELD_HEIGHT; y++) {
|
|
|
|
for (int x = 0; x < PLAYFIELD_WIDTH; x++) {
|
|
|
|
for (int x = 0; x < PLAYFIELD_WIDTH; x++) {
|
|
|
|
if ( x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) {
|
|
|
|
if ( x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) {
|
|
|
@ -108,53 +106,114 @@ static void render_callback(Canvas* const canvas, void* ctx) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
switch (minesweeper_state->playfield[x][y]) {
|
|
|
|
switch (minesweeper_state->playfield[x][y]) {
|
|
|
|
case TileType0:
|
|
|
|
case TileType0:
|
|
|
|
tile_to_draw = tile_0_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_0_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType1:
|
|
|
|
case TileType1:
|
|
|
|
tile_to_draw = tile_1_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_1_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType2:
|
|
|
|
case TileType2:
|
|
|
|
tile_to_draw = tile_2_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_2_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType3:
|
|
|
|
case TileType3:
|
|
|
|
tile_to_draw = tile_3_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_3_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType4:
|
|
|
|
case TileType4:
|
|
|
|
tile_to_draw = tile_4_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_4_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType5:
|
|
|
|
case TileType5:
|
|
|
|
tile_to_draw = tile_5_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_5_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType6:
|
|
|
|
case TileType6:
|
|
|
|
tile_to_draw = tile_6_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_6_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType7:
|
|
|
|
case TileType7:
|
|
|
|
tile_to_draw = tile_7_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_7_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileType8:
|
|
|
|
case TileType8:
|
|
|
|
tile_to_draw = tile_8_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_8_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileTypeFlag:
|
|
|
|
case TileTypeFlag:
|
|
|
|
tile_to_draw = tile_flag_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_flag_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileTypeUncleared:
|
|
|
|
case TileTypeUncleared:
|
|
|
|
tile_to_draw = tile_uncleared_bits;
|
|
|
|
canvas_draw_xbm(
|
|
|
|
|
|
|
|
canvas,
|
|
|
|
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
|
|
|
|
TILE_WIDTH,
|
|
|
|
|
|
|
|
TILE_HEIGHT,
|
|
|
|
|
|
|
|
tile_uncleared_bits);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case TileTypeMine:
|
|
|
|
case TileTypeMine:
|
|
|
|
tile_to_draw = tile_mine_bits;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
// this should never happen
|
|
|
|
|
|
|
|
tile_to_draw = tile_mine_bits;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
canvas_draw_xbm(
|
|
|
|
canvas_draw_xbm(
|
|
|
|
canvas,
|
|
|
|
canvas,
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
x*TILE_HEIGHT, // x
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
8 + (y * TILE_WIDTH), // y
|
|
|
|
TILE_WIDTH,
|
|
|
|
TILE_WIDTH,
|
|
|
|
TILE_HEIGHT,
|
|
|
|
TILE_HEIGHT,
|
|
|
|
tile_to_draw);
|
|
|
|
tile_mine_bits);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
if ( x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) {
|
|
|
|
if ( x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) {
|
|
|
|
canvas_invert_color(canvas);
|
|
|
|
canvas_invert_color(canvas);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -411,25 +470,25 @@ int32_t minesweeper_app(void* p) {
|
|
|
|
case InputKeyUp:
|
|
|
|
case InputKeyUp:
|
|
|
|
minesweeper_state->cursor_y--;
|
|
|
|
minesweeper_state->cursor_y--;
|
|
|
|
if(minesweeper_state->cursor_y < 0) {
|
|
|
|
if(minesweeper_state->cursor_y < 0) {
|
|
|
|
minesweeper_state->cursor_y = PLAYFIELD_HEIGHT - 1;
|
|
|
|
minesweeper_state->cursor_y = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyDown:
|
|
|
|
case InputKeyDown:
|
|
|
|
minesweeper_state->cursor_y++;
|
|
|
|
minesweeper_state->cursor_y++;
|
|
|
|
if(minesweeper_state->cursor_y >= PLAYFIELD_HEIGHT) {
|
|
|
|
if(minesweeper_state->cursor_y >= PLAYFIELD_HEIGHT) {
|
|
|
|
minesweeper_state->cursor_y = 0;
|
|
|
|
minesweeper_state->cursor_y = PLAYFIELD_HEIGHT-1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyRight:
|
|
|
|
case InputKeyRight:
|
|
|
|
minesweeper_state->cursor_x++;
|
|
|
|
minesweeper_state->cursor_x++;
|
|
|
|
if(minesweeper_state->cursor_x >= PLAYFIELD_WIDTH) {
|
|
|
|
if(minesweeper_state->cursor_x >= PLAYFIELD_WIDTH) {
|
|
|
|
minesweeper_state->cursor_x = 0;
|
|
|
|
minesweeper_state->cursor_x = PLAYFIELD_WIDTH-1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyLeft:
|
|
|
|
case InputKeyLeft:
|
|
|
|
minesweeper_state->cursor_x--;
|
|
|
|
minesweeper_state->cursor_x--;
|
|
|
|
if(minesweeper_state->cursor_x < 0) {
|
|
|
|
if(minesweeper_state->cursor_x < 0) {
|
|
|
|
minesweeper_state->cursor_x = PLAYFIELD_WIDTH-1;
|
|
|
|
minesweeper_state->cursor_x = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyOk:
|
|
|
|
case InputKeyOk:
|
|
|
@ -462,8 +521,6 @@ int32_t minesweeper_app(void* p) {
|
|
|
|
// Exit the plugin
|
|
|
|
// Exit the plugin
|
|
|
|
processing = false;
|
|
|
|
processing = false;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyMAX:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (event.input.type == InputTypeLong) {
|
|
|
|
} else if (event.input.type == InputTypeLong) {
|
|
|
|
// hold events
|
|
|
|
// hold events
|
|
|
@ -481,8 +538,6 @@ int32_t minesweeper_app(void* p) {
|
|
|
|
case InputKeyBack:
|
|
|
|
case InputKeyBack:
|
|
|
|
processing = false;
|
|
|
|
processing = false;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case InputKeyMAX:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|