From b375a67790a86ae1d41283e85a045ed0ab781afe Mon Sep 17 00:00:00 2001 From: RocketGod <57732082+RocketGod-git@users.noreply.github.com> Date: Sun, 7 Dec 2025 21:22:43 -0800 Subject: [PATCH] About screen sexiness --- dist/proto_pirate.fap | Bin 0 -> 42548 bytes helpers/protopirate_types.h | 1 + protopirate_app.c | 8 ++ protopirate_app_i.h | 1 + scenes/protopirate_scene_about.c | 170 +++++++++++++++++++++++++++---- 5 files changed, 159 insertions(+), 21 deletions(-) create mode 100644 dist/proto_pirate.fap diff --git a/dist/proto_pirate.fap b/dist/proto_pirate.fap new file mode 100644 index 0000000000000000000000000000000000000000..54b938c144e44a085bbd03493a91f55f7836818c GIT binary patch literal 42548 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[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, ProtoPirateViewWidget, widget_get_view(app->widget)); + // About View + app->view_about = view_alloc(); + view_dispatcher_add_view(app->view_dispatcher, ProtoPirateViewAbout, app->view_about); + // Receiver app->protopirate_receiver = protopirate_view_receiver_alloc(); view_dispatcher_add_view( @@ -171,6 +175,10 @@ void protopirate_app_free(ProtoPirateApp* app) { view_dispatcher_remove_view(app->view_dispatcher, ProtoPirateViewVariableItemList); variable_item_list_free(app->variable_item_list); + // About View + view_dispatcher_remove_view(app->view_dispatcher, ProtoPirateViewAbout); + view_free(app->view_about); + // Widget view_dispatcher_remove_view(app->view_dispatcher, ProtoPirateViewWidget); widget_free(app->widget); diff --git a/protopirate_app_i.h b/protopirate_app_i.h index d0c5ab4..de5e408 100644 --- a/protopirate_app_i.h +++ b/protopirate_app_i.h @@ -46,6 +46,7 @@ struct ProtoPirateApp { VariableItemList* variable_item_list; Submenu* submenu; Widget* widget; + View* view_about; ProtoPirateReceiver* protopirate_receiver; ProtoPirateReceiverInfo* protopirate_receiver_info; ProtoPirateTxRx* txrx; diff --git a/scenes/protopirate_scene_about.c b/scenes/protopirate_scene_about.c index e9c235b..ef74508 100644 --- a/scenes/protopirate_scene_about.c +++ b/scenes/protopirate_scene_about.c @@ -1,38 +1,166 @@ // scenes/protopirate_scene_about.c #include "../protopirate_app_i.h" +#include +#include -void protopirate_scene_about_on_enter(void* context) { - furi_assert(context); - ProtoPirateApp* app = context; +#define CREDITS_START_Y 28 +#define CREDITS_END_Y 52 +#define CREDIT_LINE_HEIGHT 10 +#define SCROLL_SPEED 1 - widget_add_string_multiline_element( - app->widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "ProtoPirate"); +static const char* credits[] = { + "Protocols: L0rdDiakon", + "Protocols: YougZ", + "Protocols: RocketGod", + "App: RocketGod", + "App: MMX", + // can add more +}; - widget_add_string_multiline_element( - app->widget, - 0, - 12, - AlignLeft, - AlignTop, - FontSecondary, - "Kia protocols by RocketGod\n" - "L0rdDiakon & YougZ\n\n\n" - "App by RocketGod & MMX"); +#define CREDITS_COUNT (sizeof(credits) / sizeof(credits[0])) - widget_add_string_element( - app->widget, 0, 64 - 12, AlignLeft, AlignBottom, FontSecondary, "Version: 1.1"); +typedef struct { + uint8_t frame; + uint8_t seed; + int16_t scroll_offset; +} GlitchState; - view_dispatcher_switch_to_view(app->view_dispatcher, ProtoPirateViewWidget); +static GlitchState g_state = {0}; + +static void draw_noise_pixels(Canvas* canvas, uint8_t density) { + for(uint8_t i = 0; i < density; i++) { + canvas_draw_dot(canvas, rand() % 128, rand() % 64); + } } -bool protopirate_scene_about_on_event(void* context, SceneManagerEvent event) { +static void about_draw_callback(Canvas* canvas, void* context) { + UNUSED(context); + + srand(g_state.seed); + canvas_clear(canvas); + + // Light background static + canvas_set_color(canvas, ColorBlack); + draw_noise_pixels(canvas, 6 + (rand() % 6)); + + // Occasional subtle x-jitter + int8_t x_off = (rand() % 15 == 0) ? ((rand() % 4) - 2) : 0; + + // Animated TPP decoration (centered) + canvas_set_font(canvas, FontKeyboard); + if(g_state.frame % 8 < 4) { + canvas_draw_str_aligned(canvas, 64, 18, AlignCenter, AlignBottom, ">>>=================<<<"); + } else { + canvas_draw_str_aligned(canvas, 64, 18, AlignCenter, AlignBottom, ">>>======[TPP]======<<<"); + } + + // Draw credits region (clip area) + canvas_set_font(canvas, FontSecondary); + + // Calculate total scroll height + int16_t total_height = CREDITS_COUNT * CREDIT_LINE_HEIGHT; + + // Draw scrolling credits + for(size_t i = 0; i < CREDITS_COUNT; i++) { + int16_t y = CREDITS_START_Y + (i * CREDIT_LINE_HEIGHT) - g_state.scroll_offset; + + // Wrap around for endless scroll + while(y < CREDITS_START_Y - CREDIT_LINE_HEIGHT) { + y += total_height; + } + while(y > CREDITS_START_Y + total_height) { + y -= total_height; + } + + // Only draw if in visible region + if(y >= CREDITS_START_Y - CREDIT_LINE_HEIGHT && y <= CREDITS_END_Y) { + canvas_draw_str(canvas, x_off, y, credits[i]); + } + } + + // Draw fade/mask bars at top and bottom of credits area + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 0, 0, 128, CREDITS_START_Y - CREDIT_LINE_HEIGHT); + canvas_draw_box(canvas, 0, CREDITS_END_Y, 128, 14); + + // Redraw header over mask + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, x_off, 10, "ProtoPirate v1.1"); + + canvas_set_font(canvas, FontKeyboard); + if(g_state.frame % 8 < 4) { + canvas_draw_str_aligned(canvas, 64, 18, AlignCenter, AlignBottom, ">>>=================<<<"); + } else { + canvas_draw_str_aligned(canvas, 64, 18, AlignCenter, AlignBottom, ">>>======[TPP]======<<<"); + } + + // Redraw static in header area + srand(g_state.seed + 1); + for(uint8_t i = 0; i < 3; i++) { + canvas_draw_dot(canvas, rand() % 128, rand() % (CREDITS_START_Y - CREDIT_LINE_HEIGHT)); + } + + // Footer: The Pirate's Plunder Discord + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str_aligned(canvas, 127, 62, AlignRight, AlignBottom, "discord.gg/thepirates"); + + // Rare subtle glitch bar + if(rand() % 30 == 0) { + canvas_set_color(canvas, ColorXOR); + uint8_t y = rand() % 60; + canvas_draw_box(canvas, 0, y, 128, 2); + } +} + +static bool about_input_callback(InputEvent* event, void* context) { UNUSED(context); UNUSED(event); return false; } +void protopirate_scene_about_on_enter(void* context) { + furi_assert(context); + ProtoPirateApp* app = context; + + g_state.frame = 0; + g_state.seed = furi_get_tick() & 0xFF; + g_state.scroll_offset = 0; + + view_set_draw_callback(app->view_about, about_draw_callback); + view_set_input_callback(app->view_about, about_input_callback); + view_set_context(app->view_about, app); + + view_dispatcher_switch_to_view(app->view_dispatcher, ProtoPirateViewAbout); +} + +bool protopirate_scene_about_on_event(void* context, SceneManagerEvent event) { + ProtoPirateApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeTick) { + g_state.frame++; + g_state.seed = rand(); + + if(g_state.frame % 2 == 0) { + g_state.scroll_offset += SCROLL_SPEED; + int16_t total_height = CREDITS_COUNT * CREDIT_LINE_HEIGHT; + if(g_state.scroll_offset >= total_height) { + g_state.scroll_offset = 0; + } + } + + view_commit_model(app->view_about, false); + consumed = true; + } + + return consumed; +} + void protopirate_scene_about_on_exit(void* context) { furi_assert(context); ProtoPirateApp* app = context; - widget_reset(app->widget); -} + + view_set_draw_callback(app->view_about, NULL); + view_set_input_callback(app->view_about, NULL); +} \ No newline at end of file