Files
battleship/src/application.c
T

81 lines
3.9 KiB
C

#include "application.h"
#include <stddef.h>
void application_init(application_t *application, random_source_t random) {
if (application == NULL) return;
application->command_queue = (command_queue_t){0};
game_lifecycle_init(&application->lifecycle, random);
}
void application_set_bot_scheduler(application_t *application, scheduler_t scheduler) {
if (application != NULL) game_lifecycle_set_bot_scheduler(&application->lifecycle, scheduler);
}
bool application_enqueue(application_t *application, const app_command_t *command) {
return application != NULL && command_queue_push(&application->command_queue, command);
}
bool application_take_next_command(application_t *application, app_command_t *command) {
return application != NULL && command_queue_pop(&application->command_queue, command);
}
lifecycle_result_t application_join(application_t *application, role_t requested_role, const char *name,
uint8_t *session_index) {
return application == NULL ? LIFECYCLE_RESULT_UNAUTHORIZED :
game_lifecycle_join(&application->lifecycle, requested_role, name, session_index);
}
lifecycle_result_t application_resume(application_t *application,
const uint8_t token[kSessionTokenBytes], uint8_t *session_index) {
return application == NULL ? LIFECYCLE_RESULT_UNAUTHORIZED :
game_lifecycle_resume(&application->lifecycle, token, session_index);
}
bool application_session_for_token(const application_t *application,
const uint8_t token[kSessionTokenBytes], uint8_t *session_index) {
return application != NULL && session_manager_find(&application->lifecycle.sessions, token, session_index);
}
lifecycle_result_t application_leave(application_t *application, uint8_t session_index, uint32_t game_id,
recovery_reason_t reason) {
if (application == NULL || application->lifecycle.game.state.game_id != game_id) return LIFECYCLE_RESULT_STALE_GAME;
const lifecycle_result_t result = game_lifecycle_leave(&application->lifecycle, session_index);
if (result == LIFECYCLE_RESULT_OK) game_lifecycle_set_recovery_reason(&application->lifecycle, reason);
return result;
}
lifecycle_result_t application_submit(application_t *application, const app_command_t *command) {
if (!application_enqueue(application, command)) return LIFECYCLE_RESULT_GENERATION_FAILED;
app_command_t next = {0};
if (!application_take_next_command(application, &next)) return LIFECYCLE_RESULT_GENERATION_FAILED;
switch (next.type) {
case COMMAND_CONFIG:
return game_lifecycle_configure(&application->lifecycle, next.session_index, next.game_id, next.mode);
case COMMAND_START:
return game_lifecycle_start(&application->lifecycle, next.session_index, next.game_id);
case COMMAND_SHOT:
return game_lifecycle_shot(&application->lifecycle, next.session_index, next.game_id, next.coordinate, NULL);
case COMMAND_REMATCH:
return game_lifecycle_rematch(&application->lifecycle, next.session_index, next.game_id);
case COMMAND_ABORT:
return game_lifecycle_abort(&application->lifecycle, next.session_index, next.game_id);
case COMMAND_LEAVE:
return application_leave(application, next.session_index, next.game_id, RECOVERY_REASON_SESSION_LEFT);
case COMMAND_PROFILE_RESET:
return application_leave(application, next.session_index, next.game_id, RECOVERY_REASON_PROFILE_RESET);
case COMMAND_RESET:
{
const lifecycle_result_t result = game_lifecycle_reset(&application->lifecycle, next.session_index, next.game_id);
if (result == LIFECYCLE_RESULT_OK) application->command_queue = (command_queue_t){0};
return result;
}
default:
return LIFECYCLE_RESULT_GENERATION_FAILED;
}
}
bool application_bot_take_turn(application_t *application) {
return application != NULL && game_lifecycle_bot_take_turn(&application->lifecycle);
}