81 lines
3.9 KiB
C
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);
|
|
}
|