diff options
author | あく <alleteam@gmail.com> | 2020-12-18 23:15:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-18 23:15:29 +0300 |
commit | 73ecc7cde6072aedbfcd3db510048c5a31c5fb05 (patch) | |
tree | 051f4730371152649245ed76b40dea2615e43de3 /applications/dolphin | |
parent | 3ba1738acd9ae1d474c9cb3c7d37672122f4e8aa (diff) |
Rename Irukagotchi to Dolphin. Add basic game state structures. (#268)
* Rename Irukagotchi to Dolphin. Add basic game state structures.
* Dolphin: state, counters, api. BT: shared access to flash. Flash: write api.
* add fake -1 deeds, example of changing icounter
Co-authored-by: coreglitch <mail@s3f.ru>
Diffstat (limited to 'applications/dolphin')
-rw-r--r-- | applications/dolphin/dolphin.c | 124 | ||||
-rw-r--r-- | applications/dolphin/dolphin.h | 11 | ||||
-rw-r--r-- | applications/dolphin/dolphin_deed.c | 12 | ||||
-rw-r--r-- | applications/dolphin/dolphin_deed.h | 23 | ||||
-rw-r--r-- | applications/dolphin/dolphin_i.h | 51 | ||||
-rw-r--r-- | applications/dolphin/dolphin_state.c | 52 | ||||
-rw-r--r-- | applications/dolphin/dolphin_state.h | 22 |
7 files changed, 295 insertions, 0 deletions
diff --git a/applications/dolphin/dolphin.c b/applications/dolphin/dolphin.c new file mode 100644 index 00000000..8edcd826 --- /dev/null +++ b/applications/dolphin/dolphin.c @@ -0,0 +1,124 @@ +#include "dolphin_i.h" + +void dolphin_draw_callback(Canvas* canvas, void* context) { + Dolphin* dolphin = context; + + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + if(dolphin->screen == DolphinScreenIdle) { + dolphin_draw_idle(canvas, dolphin); + } else if(dolphin->screen == DolphinScreenDebug) { + dolphin_draw_debug(canvas, dolphin); + } else if(dolphin->screen == DolphinScreenStats) { + dolphin_draw_stats(canvas, dolphin); + } +} + +void dolphin_draw_idle(Canvas* canvas, Dolphin* dolphin) { + canvas_draw_icon(canvas, 128 - 80, 0, dolphin->icon); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 2, 10, "/\\: Stats"); + canvas_draw_str(canvas, 5, 32, "OK: Menu"); + canvas_draw_str(canvas, 2, 52, "\\/: Version"); +} + +void dolphin_draw_debug(Canvas* canvas, Dolphin* dolphin) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 2, 10, "Version info:"); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 5, 22, TARGET " " BUILD_DATE); + canvas_draw_str(canvas, 5, 32, GIT_BRANCH); + canvas_draw_str(canvas, 5, 42, GIT_BRANCH_NUM); + canvas_draw_str(canvas, 5, 52, GIT_COMMIT); +} + +void dolphin_draw_stats(Canvas* canvas, Dolphin* dolphin) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 2, 10, "Dolphin stats:"); + + char buffer[64]; + canvas_set_font(canvas, FontSecondary); + snprintf(buffer, 64, "Icounter: %ld", dolphin_state_get_icounter(dolphin->state)); + canvas_draw_str(canvas, 5, 22, buffer); + snprintf(buffer, 64, "Butthurt: %ld", dolphin_state_get_butthurt(dolphin->state)); + canvas_draw_str(canvas, 5, 32, buffer); + canvas_draw_str(canvas, 5, 40, "< > change icounter"); +} + +void dolphin_input_callback(InputEvent* event, void* context) { + Dolphin* dolphin = context; + + if(!event->state) return; + + if(event->input == InputOk) { + with_value_mutex( + dolphin->menu_vm, (Menu * menu) { menu_ok(menu); }); + } else if(event->input == InputUp) { + if(dolphin->screen != DolphinScreenStats) { + dolphin->screen++; + } + } else if(event->input == InputDown) { + if(dolphin->screen != DolphinScreenDebug) { + dolphin->screen--; + } + } else if(event->input == InputBack) { + dolphin->screen = DolphinScreenIdle; + } else if(event->input == InputLeft) { + dolphin_deed(dolphin, DolphinDeedIButtonEmulate); + } else if(event->input == InputRight) { + dolphin_deed(dolphin, DolphinDeedWrong); + } + + widget_update(dolphin->widget); +} + +Dolphin* dolphin_alloc() { + Dolphin* dolphin = furi_alloc(sizeof(Dolphin)); + + dolphin->icon = assets_icons_get(I_Flipper_young_80x60); + icon_start_animation(dolphin->icon); + + dolphin->widget = widget_alloc(); + widget_draw_callback_set(dolphin->widget, dolphin_draw_callback, dolphin); + widget_input_callback_set(dolphin->widget, dolphin_input_callback, dolphin); + + dolphin->menu_vm = furi_open("menu"); + furi_check(dolphin->menu_vm); + + dolphin->state = dolphin_state_alloc(); + + dolphin->screen = DolphinScreenIdle; + + dolphin->event_queue = osMessageQueueNew(8, sizeof(DolphinEvent), NULL); + furi_check(dolphin->event_queue); + return dolphin; +} + +void dolphin_deed(Dolphin* dolphin, DolphinDeed deed) { + DolphinEvent event; + event.type = DolphinEventTypeDeed; + event.deed = deed; + furi_check(osMessageQueuePut(dolphin->event_queue, &event, 0, osWaitForever) == osOK); +} + +void dolphin_task() { + Dolphin* dolphin = dolphin_alloc(); + + Gui* gui = furi_open("gui"); + gui_add_widget(gui, dolphin->widget, GuiLayerNone); + + if(!furi_create("dolphin", dolphin)) { + printf("[dolphin_task] cannot create the dolphin record\n"); + furiac_exit(NULL); + } + + furiac_ready(); + + DolphinEvent event; + while(1) { + furi_check(osMessageQueueGet(dolphin->event_queue, &event, NULL, osWaitForever) == osOK); + if(event.type == DolphinEventTypeDeed) { + dolphin_state_on_deed(dolphin->state, event.deed); + } + } +} diff --git a/applications/dolphin/dolphin.h b/applications/dolphin/dolphin.h new file mode 100644 index 00000000..38ca1e90 --- /dev/null +++ b/applications/dolphin/dolphin.h @@ -0,0 +1,11 @@ +#pragma once + +#include "dolphin_deed.h" + +typedef struct Dolphin Dolphin; + +/* + * Deed complete notification. Call it on deed completion. + * See dolphin_deed.h for available deeds. In futures it will become part of assets. + */ +void dolphin_deed(Dolphin* dolphin, DolphinDeed deed); diff --git a/applications/dolphin/dolphin_deed.c b/applications/dolphin/dolphin_deed.c new file mode 100644 index 00000000..d589ac23 --- /dev/null +++ b/applications/dolphin/dolphin_deed.c @@ -0,0 +1,12 @@ +#include "dolphin_deed.h" + +static const DolphinDeedWeight dolphin_deed_weights[DolphinDeedMax] = { + {1, 2, 60}, + {1, 2, 60}, + {1, 2, 60}, + {-1, 2, 60}, +}; + +const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed) { + return &dolphin_deed_weights[deed]; +} diff --git a/applications/dolphin/dolphin_deed.h b/applications/dolphin/dolphin_deed.h new file mode 100644 index 00000000..2af1829a --- /dev/null +++ b/applications/dolphin/dolphin_deed.h @@ -0,0 +1,23 @@ +#pragma once + +#include <stdint.h> + +/* Countable deed that affects icounter*/ +typedef enum { + // iButton + DolphinDeedIButtonRead, + DolphinDeedIButtonWrite, + DolphinDeedIButtonEmulate, + // for debug + DolphinDeedWrong, + // Special value, do not use + DolphinDeedMax +} DolphinDeed; + +typedef struct { + int32_t icounter; // how many icounter get by Deed + uint32_t limit_value; // how many deeds in limit interval + uint32_t limit_interval; // interval, in minutes +} DolphinDeedWeight; + +const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed); diff --git a/applications/dolphin/dolphin_i.h b/applications/dolphin/dolphin_i.h new file mode 100644 index 00000000..ab7e0365 --- /dev/null +++ b/applications/dolphin/dolphin_i.h @@ -0,0 +1,51 @@ +#pragma once + +#include "dolphin.h" +#include "dolphin_state.h" + +#include <flipper_v2.h> + +#include <gui/gui.h> +#include <gui/widget.h> +#include <gui/canvas.h> +#include <menu/menu.h> + +#include <assets_icons.h> + +#include <stdint.h> + +typedef enum { + DolphinEventTypeDeed, +} DolphinEventType; + +typedef struct { + DolphinEventType type; + union { + DolphinDeed deed; + }; +} DolphinEvent; + +typedef enum { + DolphinScreenDebug, + DolphinScreenIdle, + DolphinScreenStats, +} DolphinScreen; + +struct Dolphin { + Icon* icon; + Widget* widget; + ValueMutex* menu_vm; + // State + DolphinState* state; + DolphinScreen screen; + // Internal message queue + osMessageQueueId_t event_queue; +}; + +void dolphin_draw_callback(Canvas* canvas, void* context); +void dolphin_draw_idle(Canvas* canvas, Dolphin* dolphin); +void dolphin_draw_debug(Canvas* canvas, Dolphin* dolphin); +void dolphin_draw_stats(Canvas* canvas, Dolphin* dolphin); +void dolphin_input_callback(InputEvent* event, void* context); + +Dolphin* dolphin_alloc(); diff --git a/applications/dolphin/dolphin_state.c b/applications/dolphin/dolphin_state.c new file mode 100644 index 00000000..dcb9fddc --- /dev/null +++ b/applications/dolphin/dolphin_state.c @@ -0,0 +1,52 @@ +#include "dolphin_state.h" +#include <flipper_v2.h> + +typedef struct { + uint32_t ibutton; + uint32_t nfc; + uint32_t ir; + uint32_t rfid; +} DolphinLimit; + +struct DolphinState { + uint32_t icounter; + uint32_t butthurt; + + DolphinLimit limit; +}; + +DolphinState* dolphin_state_alloc() { + DolphinState* dolphin_state = furi_alloc(sizeof(DolphinState)); + return dolphin_state; +} + +void dolphin_state_release(DolphinState* dolphin_state) { + free(dolphin_state); +} + +void dolphin_state_save(DolphinState* dolphin_state) { +} + +void dolphin_state_load(DolphinState* dolphin_state) { +} + +void dolphin_state_clear(DolphinState* dolphin_state) { + memset(dolphin_state, 0, sizeof(DolphinState)); +} + +void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) { + const DolphinDeedWeight* deed_weight = dolphin_deed_weight(deed); + int32_t icounter = dolphin_state->icounter + deed_weight->icounter; + + if(icounter >= 0) { + dolphin_state->icounter = icounter; + } +} + +uint32_t dolphin_state_get_icounter(DolphinState* dolphin_state) { + return dolphin_state->icounter; +} + +uint32_t dolphin_state_get_butthurt(DolphinState* dolphin_state) { + return dolphin_state->butthurt; +} diff --git a/applications/dolphin/dolphin_state.h b/applications/dolphin/dolphin_state.h new file mode 100644 index 00000000..c3320b84 --- /dev/null +++ b/applications/dolphin/dolphin_state.h @@ -0,0 +1,22 @@ +#pragma once + +#include "dolphin_deed.h" +#include <stdint.h> + +typedef struct DolphinState DolphinState; + +DolphinState* dolphin_state_alloc(); + +void dolphin_state_release(DolphinState* dolphin_state); + +void dolphin_state_save(DolphinState* dolphin_state); + +void dolphin_state_load(DolphinState* dolphin_state); + +void dolphin_state_clear(DolphinState* dolphin_state); + +void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); + +uint32_t dolphin_state_get_icounter(DolphinState* dolphin_state); + +uint32_t dolphin_state_get_butthurt(DolphinState* dolphin_state); |