commit b8aa5feab016f257bbbfe98275a272f8244fc53b Author: Felix Pankratz Date: Thu Sep 22 01:10:21 2022 +0200 initial commit, drawing cells diff --git a/.assets.h.swp b/.assets.h.swp new file mode 100644 index 0000000..3566dca Binary files /dev/null and b/.assets.h.swp differ diff --git a/application.fam b/application.fam new file mode 100644 index 0000000..16d3c76 --- /dev/null +++ b/application.fam @@ -0,0 +1,11 @@ +App( + appid="minesweeper", + name="BPM Tapper", + apptype=FlipperAppType.PLUGIN, + entry_point="minesweeper_app", + cdefines=["APP_MINESWEEPER"], + requires=["gui"], + stack_size=2 * 1024, + fap_category="Games", + order=35, +) diff --git a/assets.h b/assets.h new file mode 100644 index 0000000..59c595f --- /dev/null +++ b/assets.h @@ -0,0 +1,4 @@ +#define tile_uncleared_width 8 +#define tile_uncleared_height 8 +static uint8_t tile_uncleared_bits[] = { + 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, }; diff --git a/assets/mockup.png b/assets/mockup.png new file mode 100644 index 0000000..00d99b1 Binary files /dev/null and b/assets/mockup.png differ diff --git a/assets/tile_0.png b/assets/tile_0.png new file mode 100644 index 0000000..21cd190 Binary files /dev/null and b/assets/tile_0.png differ diff --git a/assets/tile_1.png b/assets/tile_1.png new file mode 100644 index 0000000..e887fa9 Binary files /dev/null and b/assets/tile_1.png differ diff --git a/assets/tile_2.png b/assets/tile_2.png new file mode 100644 index 0000000..423d097 Binary files /dev/null and b/assets/tile_2.png differ diff --git a/assets/tile_3.png b/assets/tile_3.png new file mode 100644 index 0000000..f6d6784 Binary files /dev/null and b/assets/tile_3.png differ diff --git a/assets/tile_4.png b/assets/tile_4.png new file mode 100644 index 0000000..4ac276e Binary files /dev/null and b/assets/tile_4.png differ diff --git a/assets/tile_5.png b/assets/tile_5.png new file mode 100644 index 0000000..22fad62 Binary files /dev/null and b/assets/tile_5.png differ diff --git a/assets/tile_6.png b/assets/tile_6.png new file mode 100644 index 0000000..b8112e7 Binary files /dev/null and b/assets/tile_6.png differ diff --git a/assets/tile_7.png b/assets/tile_7.png new file mode 100644 index 0000000..385dbb3 Binary files /dev/null and b/assets/tile_7.png differ diff --git a/assets/tile_8.png b/assets/tile_8.png new file mode 100644 index 0000000..2e59014 Binary files /dev/null and b/assets/tile_8.png differ diff --git a/assets/tile_empty.png b/assets/tile_empty.png new file mode 100644 index 0000000..1f48880 Binary files /dev/null and b/assets/tile_empty.png differ diff --git a/assets/tile_flag.png b/assets/tile_flag.png new file mode 100644 index 0000000..6ec2a71 Binary files /dev/null and b/assets/tile_flag.png differ diff --git a/assets/tile_mine.png b/assets/tile_mine.png new file mode 100644 index 0000000..3c4a38e Binary files /dev/null and b/assets/tile_mine.png differ diff --git a/assets/tile_uncleared.png b/assets/tile_uncleared.png new file mode 100644 index 0000000..b98de11 Binary files /dev/null and b/assets/tile_uncleared.png differ diff --git a/assets/tile_uncleared.xbm b/assets/tile_uncleared.xbm new file mode 100644 index 0000000..ad05436 --- /dev/null +++ b/assets/tile_uncleared.xbm @@ -0,0 +1,4 @@ +#define tile_uncleared_width 8 +#define tile_uncleared_height 8 +static char tile_uncleared_bits[] = { + 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, }; diff --git a/minesweeper.c b/minesweeper.c new file mode 100644 index 0000000..7c0e2ff --- /dev/null +++ b/minesweeper.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include + +#include "assets.h" + +#define PLAYFIELD_WIDTH 16 +#define PLAYFIELD_HEIGHT 7 +#define TILE_WIDTH 8 +#define TILE_HEIGHT 8 + +typedef enum { + EventTypeTick, + EventTypeKey, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} PluginEvent; + +typedef enum { + TileTypeUncleared, + TileTypeCleared, + TileType0, + TileType1, + TileType2, + TileType3, + TileType4, + TileType5, + TileType6, + TileType7, + TileType8, + TileTypeFlag, + TileTypeMine +} TileType; + +typedef enum { + FieldMine, + FieldEmpty +} Field; + +typedef struct { + Field minefield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; + TileType playfield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; +} Minesweeper; + +static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { + furi_assert(event_queue); + + PluginEvent event = {.type = EventTypeKey, .input = *input_event}; + furi_message_queue_put(event_queue, &event, FuriWaitForever); +} + +static void render_callback(Canvas* const canvas, void* ctx) { + const Minesweeper* minesweeper_state = acquire_mutex((ValueMutex*)ctx, 25); + if (minesweeper_state == NULL) { + return; + } + canvas_set_font(canvas, FontPrimary); + for (int y = 0; y < PLAYFIELD_HEIGHT; y++) { + for (int x = 0; x < PLAYFIELD_WIDTH; x++) { + canvas_draw_xbm( + canvas, + x*TILE_HEIGHT, // x + 8 + (y * TILE_WIDTH), // y + TILE_WIDTH, + TILE_HEIGHT, + tile_uncleared_bits); + } + } + release_mutex((ValueMutex*)ctx, minesweeper_state); +} + + +//static void minesweeper_state_init(Minesweeper* const plugin_state) { +// +//} + +int32_t minesweeper_app(void* p) { + UNUSED(p); + + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); + + Minesweeper* minesweeper_state = malloc(sizeof(Minesweeper)); + // setup + //minesweeper_state_init(minesweeper_state); + + ValueMutex state_mutex; + if (!init_mutex(&state_mutex, minesweeper_state, sizeof(minesweeper_state))) { + FURI_LOG_E("Minesweeper", "cannot create mutex\r\n"); + free(minesweeper_state); + return 255; + } + // BEGIN IMPLEMENTATION + + // Set system callbacks + ViewPort* view_port = view_port_alloc(); + view_port_draw_callback_set(view_port, render_callback, &state_mutex); + view_port_input_callback_set(view_port, input_callback, event_queue); + + // Open GUI and register view_port + Gui* gui = furi_record_open("gui"); + gui_add_view_port(gui, view_port, GuiLayerFullscreen); + + PluginEvent event; + for (bool processing = true; processing;) { + FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); + Minesweeper* minesweeper_state = (Minesweeper*)acquire_mutex_block(&state_mutex); + if(event_status == FuriStatusOk) { + // press events + if(event.type == EventTypeKey) { + if(event.input.type == InputTypePress) { + switch(event.input.key) { + case InputKeyUp: + case InputKeyDown: + case InputKeyRight: + case InputKeyLeft: + case InputKeyOk: + break; + case InputKeyBack: + // Exit the plugin + processing = false; + break; + } + } + } + } else { + FURI_LOG_D("Minesweeper", "FuriMessageQueue: event timeout"); + // event timeout + } + view_port_update(view_port); + release_mutex(&state_mutex, minesweeper_state); + } + view_port_enabled_set(view_port, false); + gui_remove_view_port(gui, view_port); + furi_record_close("gui"); + view_port_free(view_port); + furi_message_queue_free(event_queue); + delete_mutex(&state_mutex); + free(minesweeper_state); + + return 0; +} +