improve board view with visual cues of the properties owned
This commit is contained in:
@@ -6,10 +6,22 @@
|
||||
|
||||
class MonopolyBoardRenderer {
|
||||
public:
|
||||
static void draw_tile(LowLevelRenderer* renderer, int x, int y, int w, int h, int index, bool is_corner, Player* players, int players_count, int orientation = 0, int currentPlayerPos = -1) {
|
||||
static void draw_tile(LowLevelRenderer* renderer, int x, int y, int w, int h, int index, bool is_corner, Player* players, int players_count, int orientation = 0, int currentPlayerPos = -1, int observer_idx = -1) {
|
||||
if (index < 0 || index >= BOARD_SIZE) return;
|
||||
|
||||
bool isInverted = (index == currentPlayerPos);
|
||||
// Find owner
|
||||
int owner_id = -1;
|
||||
for (int i = 0; i < players_count; i++) {
|
||||
for (int j = 0; j < players[i].property_count; j++) {
|
||||
if (players[i].properties_owned[j] == index) {
|
||||
owner_id = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (owner_id != -1) break;
|
||||
}
|
||||
|
||||
bool isInverted = (index == currentPlayerPos) || (observer_idx != -1 && owner_id == observer_idx);
|
||||
if (isInverted) {
|
||||
renderer->draw_filled_rectangle(x, y, w, h, true, 1);
|
||||
renderer->set_text_color(false); // Black text on white background
|
||||
@@ -39,31 +51,39 @@ public:
|
||||
}
|
||||
|
||||
if (isInverted) {
|
||||
// In inverted mode, the bar should be black (transparent/inverted)
|
||||
renderer->draw_filled_rectangle(bx, by, bw, bh, false, 0); // Clear the bar area back to black
|
||||
renderer->set_text_color(true); // Groups on the bar are usually white text on black bar in this mode
|
||||
// Background is white, so bar is black
|
||||
renderer->draw_filled_rectangle(bx, by, bw, bh, false, 0);
|
||||
renderer->set_text_color(true); // White text
|
||||
} else {
|
||||
renderer->draw_filled_rectangle(bx, by, bw, bh, true, 1);
|
||||
renderer->set_text_color(false); // Black text on white bar
|
||||
renderer->set_text_color(false); // Black text
|
||||
}
|
||||
|
||||
// Group number
|
||||
char gbuf[2] = { (char)('0' + tile.group[0]), '\0' };
|
||||
renderer->draw_string_scaled(bx + (bw - 6) / 2, by + (bh - 8) / 2, gbuf, 1);
|
||||
|
||||
if (isInverted) renderer->set_text_color(false); // Back to black text for the rest of the tile
|
||||
if (isInverted) renderer->set_text_color(false);
|
||||
else renderer->set_text_color(true);
|
||||
}
|
||||
|
||||
char short_name[5] = {0};
|
||||
const char* full_name = tile.name;
|
||||
char short_name[8] = {0};
|
||||
int s_ptr = 0;
|
||||
|
||||
// Add * if owned by someone else
|
||||
if (owner_id != -1 && observer_idx != -1 && owner_id != observer_idx) {
|
||||
short_name[s_ptr++] = '*';
|
||||
}
|
||||
|
||||
const char* full_name = tile.name;
|
||||
if (is_corner) {
|
||||
strncpy(short_name, full_name, 4);
|
||||
int len = strlen(full_name);
|
||||
if (len > 3) len = 3;
|
||||
for(int i=0; i<len; i++) short_name[s_ptr++] = full_name[i];
|
||||
} else {
|
||||
short_name[0] = full_name[0];
|
||||
short_name[s_ptr++] = full_name[0];
|
||||
const char* space = strchr(full_name, ' ');
|
||||
if (space && space[1] != '\0') short_name[1] = space[1];
|
||||
if (space && space[1] != '\0') short_name[s_ptr++] = space[1];
|
||||
}
|
||||
|
||||
for (int i = 0; short_name[i]; i++) if(short_name[i] >= 'a' && short_name[i] <= 'z') short_name[i] -= 32;
|
||||
@@ -81,38 +101,38 @@ public:
|
||||
}
|
||||
|
||||
if (isInverted) {
|
||||
renderer->set_text_color(true); // Reset for next tiles
|
||||
renderer->set_text_color(true);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_board_perimeter(LowLevelRenderer* renderer, int width, int height, Player* players, int players_count, int currentPlayerPos = -1) {
|
||||
static void draw_board_perimeter(LowLevelRenderer* renderer, int width, int height, Player* players, int players_count, int currentPlayerPos = -1, int observer_idx = -1) {
|
||||
int cw = width / 7; // Corner width
|
||||
int ch = height / 7; // Corner height
|
||||
int rw = (width - 2 * cw) / 9; // Regular tile width
|
||||
int rh = (height - 2 * ch) / 9; // Regular tile height
|
||||
|
||||
// --- Bottom Row: 0 to 10 (Right to Left) ---
|
||||
draw_tile(renderer, width - cw, height - ch, cw, ch, 0, true, players, players_count, 0, currentPlayerPos); // GO
|
||||
draw_tile(renderer, width - cw, height - ch, cw, ch, 0, true, players, players_count, 0, currentPlayerPos, observer_idx); // GO
|
||||
for (int i = 1; i < 10; ++i) {
|
||||
draw_tile(renderer, width - cw - i * rw, height - ch, rw, ch, i, false, players, players_count, 0, currentPlayerPos);
|
||||
draw_tile(renderer, width - cw - i * rw, height - ch, rw, ch, i, false, players, players_count, 0, currentPlayerPos, observer_idx);
|
||||
}
|
||||
draw_tile(renderer, 0, height - ch, cw, ch, 10, true, players, players_count, 1, currentPlayerPos); // JAIL
|
||||
draw_tile(renderer, 0, height - ch, cw, ch, 10, true, players, players_count, 1, currentPlayerPos, observer_idx); // JAIL
|
||||
|
||||
// --- Left Column: 11 to 19 (Bottom to Top) ---
|
||||
for (int i = 11; i < 20; ++i) {
|
||||
draw_tile(renderer, 0, height - ch - (i - 10) * rh, cw, rh, i, false, players, players_count, 1, currentPlayerPos);
|
||||
draw_tile(renderer, 0, height - ch - (i - 10) * rh, cw, rh, i, false, players, players_count, 1, currentPlayerPos, observer_idx);
|
||||
}
|
||||
|
||||
// --- Top Row: 20 to 30 (Left to Right) ---
|
||||
draw_tile(renderer, 0, 0, cw, ch, 20, true, players, players_count, 2, currentPlayerPos); // FREE PARKING
|
||||
draw_tile(renderer, 0, 0, cw, ch, 20, true, players, players_count, 2, currentPlayerPos, observer_idx); // FREE PARKING
|
||||
for (int i = 21; i < 30; ++i) {
|
||||
draw_tile(renderer, cw + (i - 21) * rw, 0, rw, ch, i, false, players, players_count, 2, currentPlayerPos);
|
||||
draw_tile(renderer, cw + (i - 21) * rw, 0, rw, ch, i, false, players, players_count, 2, currentPlayerPos, observer_idx);
|
||||
}
|
||||
draw_tile(renderer, width - cw, 0, cw, ch, 30, true, players, players_count, 3, currentPlayerPos); // GO TO JAIL
|
||||
draw_tile(renderer, width - cw, 0, cw, ch, 30, true, players, players_count, 3, currentPlayerPos, observer_idx); // GO TO JAIL
|
||||
|
||||
// --- Right Column: 31 to 39 (Top to Bottom) ---
|
||||
for (int i = 31; i < 40; ++i) {
|
||||
draw_tile(renderer, width - cw, ch + (i - 31) * rh, cw, rh, i, false, players, players_count, 3, currentPlayerPos);
|
||||
draw_tile(renderer, width - cw, ch + (i - 31) * rh, cw, rh, i, false, players, players_count, 3, currentPlayerPos, observer_idx);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user