From 1760dd9d968e2a34857f1c49e60cb9bc3c8928cd Mon Sep 17 00:00:00 2001 From: Tenari Date: Fri, 20 Feb 2026 07:57:01 -0600 Subject: [PATCH] continue work on modal --- src/client.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/src/client.c b/src/client.c index 17d5d72..63e99bf 100644 --- a/src/client.c +++ b/src/client.c @@ -126,12 +126,14 @@ typedef struct GameState { LoginState login_state; MenuState menu; MenuState row; // for tracking which row of a table the user has selected + MenuState modal_choice; UDPMessage keep_alive_msg; UDPClient client; StringChunkList message_input; StarSystem map[STAR_SYSTEM_COUNT]; Pos2 pos; StarSystem current; + bool modal; } GameState; ///// GLOBALS @@ -702,7 +704,11 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count } break; case TabStation: { if (input_buffer[0] == 'q' || user_pressed_esc) { - should_quit = true; + if (state->modal) { + state->modal = !state->modal; + } else { + should_quit = true; + } } if (user_pressed_up) { if (state->row.selected_index == 0) { @@ -716,8 +722,6 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count } else { state->row.selected_index += 1; } - } else if (user_pressed_enter) { - // TODO they are trying to trade a commodity } renderStrToBuffer(tui->frame_buffer, box.x+2, box.y+1, "Welcome to ", screen_dimensions); renderStrToBuffer(tui->frame_buffer, box.x+2+11, box.y+1, state->current.name, screen_dimensions); @@ -739,6 +743,55 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count rows[i].owned = state->me.commodities[i]; } renderTable(tui, info, state->row.selected_index, MARKET_COMMODITY_FIELDS, 1, rows, sizeof(MarketCommodity)); + + if (user_pressed_enter) { + state->modal = !state->modal; + if (state->modal) { + state->modal_choice.len = 2; + state->modal_choice.selected_index = 0; + } + } + if (state->modal) { + if (user_pressed_right) { + state->modal_choice.selected_index = 1; + } else if (user_pressed_left) { + state->modal_choice.selected_index = 0; + } + // draw the "purchase order" modal + Box modal_outline = { + .x = (tui->screen_dimensions.width - 50) / 2, + .y = (tui->screen_dimensions.height - 15) / 2, + .height = 15, + .width = 50, + }; + drawAnsiBox(tui->frame_buffer, modal_outline, tui->screen_dimensions, false); + str cname = COMMODITIES[state->row.selected_index].name; + renderStrToBuffer(tui->frame_buffer, modal_outline.x+(modal_outline.width/2)-strlen(cname), modal_outline.y+1, cname, screen_dimensions); + u32 y_off = modal_outline.y+2; + u32 buy_x = modal_outline.x+2; + u32 sell_x = modal_outline.x+modal_outline.width-6; + renderStrToBuffer(tui->frame_buffer, buy_x, y_off, "Buy", screen_dimensions); + renderStrToBuffer(tui->frame_buffer, sell_x, y_off, "Sell", screen_dimensions); + if (state->modal_choice.selected_index == 0) { + u32 pos = XYToPos(buy_x, y_off, tui->screen_dimensions.width); + tui->frame_buffer[pos].background = ANSI_WHITE; + tui->frame_buffer[pos].foreground = ANSI_BLACK; + tui->frame_buffer[pos+1].background = ANSI_WHITE; + tui->frame_buffer[pos+1].foreground = ANSI_BLACK; + tui->frame_buffer[pos+2].background = ANSI_WHITE; + tui->frame_buffer[pos+2].foreground = ANSI_BLACK; + } else { + u32 pos = XYToPos(sell_x, y_off, tui->screen_dimensions.width); + tui->frame_buffer[pos].background = ANSI_WHITE; + tui->frame_buffer[pos].foreground = ANSI_BLACK; + tui->frame_buffer[pos+1].background = ANSI_WHITE; + tui->frame_buffer[pos+1].foreground = ANSI_BLACK; + tui->frame_buffer[pos+2].background = ANSI_WHITE; + tui->frame_buffer[pos+2].foreground = ANSI_BLACK; + tui->frame_buffer[pos+3].background = ANSI_WHITE; + tui->frame_buffer[pos+3].foreground = ANSI_BLACK; + } + } } break; case Tab_Count: {} break; }