From 3bdbfb18115ad9ccc1837a7f691ab031d4343050 Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Mon, 2 Feb 2026 23:14:11 -0500 Subject: [PATCH] Fix 1-bit bitmap rendering and add player turn modal --- display/low_level_render.cpp | 6 +-- games/monopoly/TurnModalGame.h | 67 ++++++++++++++++++++++++++++++++++ lib/game.h | 3 +- 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 games/monopoly/TurnModalGame.h diff --git a/display/low_level_render.cpp b/display/low_level_render.cpp index dcd80d9..648ed52 100644 --- a/display/low_level_render.cpp +++ b/display/low_level_render.cpp @@ -484,11 +484,11 @@ void LowLevelRenderer::draw_arc(int center_x, int center_y, int radius, int star void LowLevelRenderer::draw_bitmap(const unsigned char* bitmap, int x, int y, int width, int height, bool invert) { + int byteWidth = (width + 7) / 8; // Bitmaps are typically padded to the next full byte for each row for (int py = 0; py < height; ++py) { for (int px = 0; px < width; ++px) { - int bit_index = py * width + px; - int byte_index = bit_index / 8; - int bit_offset = 7 - (bit_index % 8); // MSB first + int byte_index = py * byteWidth + (px / 8); + int bit_offset = 7 - (px % 8); // MSB first bool pixel_on = (bitmap[byte_index] & (1 << bit_offset)) != 0; if (invert) { pixel_on = !pixel_on; diff --git a/games/monopoly/TurnModalGame.h b/games/monopoly/TurnModalGame.h new file mode 100644 index 0000000..df4797d --- /dev/null +++ b/games/monopoly/TurnModalGame.h @@ -0,0 +1,67 @@ +// TurnModalGame.h +#pragma once +#include "../../lib/game.h" +#include "../../display/low_level_render.h" +#include "../../display/low_level_gui.h" +#include "input_manager.h" +#include "player.h" +#include +#include + +class TurnModalGame : public Game { + Player* next_player; + bool dismissed; + +public: + TurnModalGame(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager, Player* next) + : Game(width, height, renderer, gui, input_manager), next_player(next), dismissed(false) {} + + void init() override { dismissed = false; } + Type get_type() const override { return Type::MONOPOLY_TURN; } + + bool update(const InputEvent& event) override { + if (event.type == INPUT_BUTTON_1) { + dismissed = true; + return true; + } + return false; + } + + void draw() override { + renderer->clear_buffer(); + + // Window background + int cw = width / 6; + int ch = height / 6; + int ix = cw, iy = ch; + int iw = width - 2 * cw, ih = height - 2 * ch; + + renderer->draw_filled_rectangle(ix, iy, iw, ih, false, 0); // White background + renderer->draw_rectangle(ix, iy, iw, ih, true, 2); // Border + + // Header + renderer->draw_filled_rectangle(ix + 2, iy + 2, iw - 4, 40, true, 1); + renderer->set_text_color(false); + renderer->draw_string_scaled(ix + (iw - (int)strlen("NEXT TURN") * 12) / 2, iy + 15, "NEXT TURN", 2); + renderer->set_text_color(true); + + // Player Name + char buf[64]; + snprintf(buf, sizeof(buf), "%s", next_player->name); + int name_len = (int)strlen(buf); + renderer->draw_string_scaled(ix + (iw - name_len * 18) / 2, iy + 60, buf, 3); + + // Message + const char* msg = "IT'S YOUR TURN!"; + renderer->draw_string_scaled(ix + (iw - (int)strlen(msg) * 12) / 2, iy + 100, msg, 2); + + const char* submsg = "Please hold the device"; + renderer->draw_string_scaled(ix + (iw - (int)strlen(submsg) * 6) / 2, iy + 130, submsg, 1); + + // Prompt + const char* prompt = "Press B to start"; + renderer->draw_string_scaled(ix + (iw - (int)strlen(prompt) * 6) / 2, iy + ih - 30, prompt, 1); + } + + bool is_dismissed() const { return dismissed; } +}; diff --git a/lib/game.h b/lib/game.h index c17b694..ee3f53f 100644 --- a/lib/game.h +++ b/lib/game.h @@ -34,7 +34,8 @@ public: MONOPOLY_PROPERTY, MONOPOLY_BOARD, MONOPOLY_CHANCE, - MONOPOLY_COMMUNITY_CHEST + MONOPOLY_COMMUNITY_CHEST, + MONOPOLY_TURN }; /**