tell users when they succeed/fail at a passenger job

This commit is contained in:
Tenari
2026-03-19 07:35:02 -05:00
parent 58b80e53d0
commit 8d898c70cb
3 changed files with 131 additions and 9 deletions
+101 -4
View File
@@ -69,6 +69,8 @@ typedef enum Screen {
ScreenDefeat, ScreenDefeat,
ScreenVictory, ScreenVictory,
ScreenTurnTick, ScreenTurnTick,
ScreenPassengerJobFailed,
ScreenPassengerJobSucceeded,
Screen_Count Screen_Count
} Screen; } Screen;
@@ -143,6 +145,8 @@ typedef struct MenuState {
typedef struct GameState { typedef struct GameState {
Screen screen; Screen screen;
bool still_need_to_show_job_completion_screen;
bool job_completion_screen_result;
Screen old_screen; Screen old_screen;
PlayerShip me; PlayerShip me;
u64 server_frame; u64 server_frame;
@@ -376,6 +380,9 @@ fn void handleIncomingMessage(u8* message, u32 len, SocketAddress sender, i32 so
case MessageGameOver: { case MessageGameOver: {
parsed.byte = message[msg_pos++]; parsed.byte = message[msg_pos++];
} break; } break;
case MessageJobComplete: {
parsed.byte = message[msg_pos++];
} break;
case MessageSystemPassengers: { case MessageSystemPassengers: {
parsed.byte = message[msg_pos++]; parsed.byte = message[msg_pos++];
u32 i; u32 i;
@@ -386,9 +393,6 @@ fn void handleIncomingMessage(u8* message, u32 len, SocketAddress sender, i32 so
parsed.offers[i].offer = readU32FromBufferLE(message + msg_pos); parsed.offers[i].offer = readU32FromBufferLE(message + msg_pos);
msg_pos += 4; msg_pos += 4;
} }
u8 buf[128] = {0};
sprintf((ptr)buf, "Got %d passenger jobs for %s", i, STAR_NAMES[parsed.byte]);
addSystemMessage(buf);
} break; } break;
case MessageJobAcceptResult: { case MessageJobAcceptResult: {
parsed.byte = message[msg_pos++]; // boolean success/fail parsed.byte = message[msg_pos++]; // boolean success/fail
@@ -575,6 +579,12 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count
case MessagePayoffResult: { case MessagePayoffResult: {
state->ship_tab_states = ShipTabStateMain; state->ship_tab_states = ShipTabStateMain;
} break; } break;
case MessageJobComplete: {
sprintf(sbuf,"MessageJobComplete: %s", msg.byte ? "true" : "false");
addSystemMessage((u8*)sbuf);
state->still_need_to_show_job_completion_screen = true;
state->job_completion_screen_result = msg.byte;
} break;
case MessageTurnTick: { case MessageTurnTick: {
MemoryZero(sbuf, SBUFLEN); MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf,"got TurnTick message from server %lld", loop_count); sprintf(sbuf,"got TurnTick message from server %lld", loop_count);
@@ -675,6 +685,80 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count
bool user_pressed_backspace = input_buffer[0] == ASCII_BACKSPACE || input_buffer[0] == ASCII_DEL; bool user_pressed_backspace = input_buffer[0] == ASCII_BACKSPACE || input_buffer[0] == ASCII_DEL;
bool user_pressed_enter = input_buffer[0] == ASCII_RETURN || input_buffer[0] == ASCII_LINE_FEED; bool user_pressed_enter = input_buffer[0] == ASCII_RETURN || input_buffer[0] == ASCII_LINE_FEED;
switch (state->screen) { switch (state->screen) {
case ScreenPassengerJobFailed: {
u32 line = 2;
StarSystem dest = state->map[state->destination_sys_idx];
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "Upon arriving at %s", dest.name);
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, line++, sbuf, screen_dimensions);
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "one of your passenger jobs was failed due to time limit");
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, line++, sbuf, screen_dimensions);
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "The passenger(s) have left your ship in an angry huff.");
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, ++line, sbuf, screen_dimensions);
line++;
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "CONTINUE");
u32 x = (screen_dimensions.width - (strlen(sbuf)+4))/2;
Range1u32 range = {
.min = XYToPos(x, line, screen_dimensions.width),
.max = XYToPos(x+strlen(sbuf), line, screen_dimensions.width),
};
colorizeRange(tui, range, ANSI_WHITE, ANSI_BLACK);
tui->cursor.x = x;
tui->cursor.y = line;
renderStrToBuffer(tui->frame_buffer, x, line, sbuf, screen_dimensions);
if (user_pressed_enter || user_pressed_esc || user_pressed_space || user_pressed_tab) {
state->screen = ScreenMainGame;
state->menu.len = Tab_Count;
state->menu.selected_index = TabShip;
}
} break;
case ScreenPassengerJobSucceeded: {
u32 line = 2;
StarSystem dest = state->map[state->destination_sys_idx];
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "Upon arriving at %s", dest.name);
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, line++, sbuf, screen_dimensions);
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "one of your passenger jobs is completed!");
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, line++, sbuf, screen_dimensions);
line++;
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "The passenger(s) have left your ship");
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, ++line, sbuf, screen_dimensions);
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "and the reward has been credited to your account.");
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, ++line, sbuf, screen_dimensions);
line++;
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "CONTINUE");
u32 x = (screen_dimensions.width - (strlen(sbuf)+4))/2;
Range1u32 range = {
.min = XYToPos(x, line, screen_dimensions.width),
.max = XYToPos(x+strlen(sbuf), line, screen_dimensions.width),
};
colorizeRange(tui, range, ANSI_WHITE, ANSI_BLACK);
tui->cursor.x = x;
tui->cursor.y = line;
renderStrToBuffer(tui->frame_buffer, x, line, sbuf, screen_dimensions);
if (user_pressed_enter || user_pressed_esc || user_pressed_space || user_pressed_tab) {
state->screen = ScreenMainGame;
state->menu.len = Tab_Count;
state->menu.selected_index = TabShip;
}
} break;
case ScreenTurnTick: { case ScreenTurnTick: {
u32 line = 2; u32 line = 2;
StarSystem dest = state->map[state->destination_sys_idx]; StarSystem dest = state->map[state->destination_sys_idx];
@@ -689,10 +773,15 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count
renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, ++line, sbuf, screen_dimensions); renderStrToBuffer(tui->frame_buffer, (screen_dimensions.width - (strlen(sbuf)+4))/2, ++line, sbuf, screen_dimensions);
if (state->turn_tick_started_on + TURN_TICK_LEN < loop_count) { if (state->turn_tick_started_on + TURN_TICK_LEN < loop_count) {
if (state->still_need_to_show_job_completion_screen) {
state->screen = state->job_completion_screen_result ? ScreenPassengerJobSucceeded : ScreenPassengerJobFailed;
state->still_need_to_show_job_completion_screen = false;
} else {
state->screen = ScreenMainGame; state->screen = ScreenMainGame;
state->menu.len = Tab_Count; state->menu.len = Tab_Count;
state->menu.selected_index = TabMap; state->menu.selected_index = TabMap;
} }
}
} break; } break;
case ScreenCreateCharacter: { case ScreenCreateCharacter: {
//// SIMULATION //// SIMULATION
@@ -1083,6 +1172,14 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count
MemoryZero(sbuf, SBUFLEN); MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "Passengers: %d filling %d / %d berths", passenger_count, used_berths, state->me.passenger_berths); sprintf(sbuf, "Passengers: %d filling %d / %d berths", passenger_count, used_berths, state->me.passenger_berths);
renderStrToBuffer(tui->frame_buffer, box.x+2, yoff++, sbuf, screen_dimensions); renderStrToBuffer(tui->frame_buffer, box.x+2, yoff++, sbuf, screen_dimensions);
for (u32 i = 0; i < MAX_PASSENGER_BERTHS; i++) {
Passenger p = state->me.passengers[i];
if (p.people > 0) {
MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "- %d credits to %s in %d turns", p.reward, STAR_NAMES[p.goal_system_idx], p.turns_remaining);
renderStrToBuffer(tui->frame_buffer, box.x+3, yoff++, sbuf, screen_dimensions);
}
}
for (u32 i = 0; i < Commodity_Count; i++) { for (u32 i = 0; i < Commodity_Count; i++) {
MemoryZero(sbuf, SBUFLEN); MemoryZero(sbuf, SBUFLEN);
@@ -1431,7 +1528,7 @@ fn bool updateAndRender(TuiState* tui, void* s, u8* input_buffer, u64 loop_count
DisplayPassengerJobOffer current_row = rows[state->row.selected_index]; DisplayPassengerJobOffer current_row = rows[state->row.selected_index];
MemoryZero(sbuf, SBUFLEN); MemoryZero(sbuf, SBUFLEN);
sprintf(sbuf, "%d passengers to %s", current_row.people, current_row.destination); sprintf(sbuf, "%d passengers to %s", current_row.people, current_row.destination);
renderStrToBuffer(tui->frame_buffer, modal_outline.x+(modal_outline.width/2)-strlen(sbuf), y_off++, sbuf, screen_dimensions); renderStrToBuffer(tui->frame_buffer, modal_outline.x+((modal_outline.width-strlen(sbuf))/2), y_off++, sbuf, screen_dimensions);
renderStrToBuffer(tui->frame_buffer, modal_outline.x+((modal_outline.width-8)/2), y_off++, "offering", screen_dimensions); renderStrToBuffer(tui->frame_buffer, modal_outline.x+((modal_outline.width-8)/2), y_off++, "offering", screen_dimensions);
+26 -2
View File
@@ -997,13 +997,37 @@ fn void* gameLoop(void* params) {
acct->ship.credits += job->reward; acct->ship.credits += job->reward;
printf("%d credits awarded to %s for finishing passenger job\n", job->reward, acct->name.bytes); printf("%d credits awarded to %s for finishing passenger job\n", job->reward, acct->name.bytes);
MemoryZero(job, sizeof(Passenger)); MemoryZero(job, sizeof(Passenger));
// TODO send a job completion message? printf("%s FINISHED a passenger job!\n", acct->name.bytes);
// send a job completion message?
for (u32 i = 1; i < state.clients.length; i++) {
if (state.clients.items[i].last_ping != 0 && state.clients.items[i].account_id == acct->id) {
outgoing_message.address = state.clients.items[i].address;
outgoing_message.bytes_len = 2;
outgoing_message.bytes[0] = (u8)MessageJobComplete;
outgoing_message.bytes[1] = true;
outgoingMessageQueuePush(state.network_send_queue, &outgoing_message);
printf("sent MessageJobComplete to %s\n", acct->name.bytes);
break;
}
}
} else { } else {
job->turns_remaining -= 1; job->turns_remaining -= 1;
if (job->turns_remaining == 0) { if (job->turns_remaining == 0) {
// they failed the job // they failed the job
// TODO send a job failed message?
MemoryZero(job, sizeof(Passenger)); MemoryZero(job, sizeof(Passenger));
printf("%s failed a passenger job\n", acct->name.bytes);
// send a job failed message?
for (u32 i = 1; i < state.clients.length; i++) {
if (state.clients.items[i].last_ping != 0 && state.clients.items[i].account_id == acct->id) {
outgoing_message.address = state.clients.items[i].address;
outgoing_message.bytes_len = 2;
outgoing_message.bytes[0] = (u8)MessageJobComplete;
outgoing_message.bytes[1] = false;
outgoingMessageQueuePush(state.network_send_queue, &outgoing_message);
printf("sent MessageJobComplete to %s\n", acct->name.bytes);
break;
}
}
} }
} }
} }
+1
View File
@@ -447,6 +447,7 @@ typedef enum Message {
MessagePayoffResult, MessagePayoffResult,
MessageSystemPassengers, MessageSystemPassengers,
MessageJobAcceptResult, MessageJobAcceptResult,
MessageJobComplete,
Message_Count, Message_Count,
} Message; } Message;