tell users when they succeed/fail at a passenger job
This commit is contained in:
+101
-4
@@ -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
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -447,6 +447,7 @@ typedef enum Message {
|
|||||||
MessagePayoffResult,
|
MessagePayoffResult,
|
||||||
MessageSystemPassengers,
|
MessageSystemPassengers,
|
||||||
MessageJobAcceptResult,
|
MessageJobAcceptResult,
|
||||||
|
MessageJobComplete,
|
||||||
Message_Count,
|
Message_Count,
|
||||||
} Message;
|
} Message;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user