#include "game.h" #include "device/device.h" #define GAME_INFLICT_SCREEN_MAX_N_MODALS 4 typedef enum { GAME_INFLICT_SCREEN_STATE_WAIT_FOR_DIALOGUE, GAME_INFLICT_SCREEN_STATE_CLOSE_EYELIDS, GAME_INFLICT_SCREEN_STATE_PERFORM_MODALS, GAME_INFLICT_SCREEN_STATE_OPEN_EYELIDS, GAME_INFLICT_SCREEN_STATE_INACTIVE } game_inflict_screen_state_t; game_inflict_screen_state_t game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_INACTIVE; game_inflict_type game_inflict_screen_type = 0; sys_i32 game_inflict_screen_n_modals = 0; sys_i32 game_inflict_screen_next_modal = 0; sys_i32 game_inflict_screen_progress = 0; const char* game_inflict_screen_modals[GAME_INFLICT_SCREEN_MAX_N_MODALS]; void game_inflict_apply(); void game_inflict_update(bool* allow_input) { if (game_inflict_screen_state <= GAME_INFLICT_SCREEN_STATE_OPEN_EYELIDS) { *allow_input = false; } switch (game_inflict_screen_state) { case GAME_INFLICT_SCREEN_STATE_WAIT_FOR_DIALOGUE: if (!game_dialogue_is_busy()) { game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_CLOSE_EYELIDS; game_inflict_screen_progress = 0; } break; case GAME_INFLICT_SCREEN_STATE_CLOSE_EYELIDS: game_inflict_screen_progress += 10; if (game_inflict_screen_progress >= 0x100) { game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_PERFORM_MODALS; game_inflict_screen_progress = 0; game_inflict_apply(); } break; case GAME_INFLICT_SCREEN_STATE_PERFORM_MODALS: if (game_dialogue_is_busy()) { // fine, don't do anything } else if (game_inflict_screen_next_modal < game_inflict_screen_n_modals) { game_dialogue_display(game_inflict_screen_modals[ game_inflict_screen_next_modal++ ], true); } else { game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_OPEN_EYELIDS; } break; case GAME_INFLICT_SCREEN_STATE_OPEN_EYELIDS: game_inflict_screen_progress += 10; if (game_inflict_screen_progress >= 0x100) { game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_INACTIVE; game_inflict_screen_progress = 0; } break; case GAME_INFLICT_SCREEN_STATE_INACTIVE: break; } } void game_inflict_enqueue(int inflict_id) { game_inflict_screen_state = GAME_INFLICT_SCREEN_STATE_WAIT_FOR_DIALOGUE; switch (inflict_id) { case GAME_INFLICT_TYPE_CHICKEN: game_inflict_screen_type = GAME_INFLICT_TYPE_CHICKEN; game_inflict_screen_n_modals = 2; game_inflict_screen_next_modal = 0; game_inflict_screen_modals[0] = "For your birthday..."; game_inflict_screen_modals[1] = "You're a chicken!"; break; } } void game_inflict_apply() { switch (game_inflict_screen_type) { case GAME_INFLICT_TYPE_CHICKEN: game_player_collectibles.n_cake = 0; game_player_phase = GAME_PLAYER_PHASE_CHICKEN; } } void game_inflict_draw_eyelids(uint8_t progress); void game_inflict_draw() { switch (game_inflict_screen_state) { case GAME_INFLICT_SCREEN_STATE_WAIT_FOR_DIALOGUE: // TODO: Screen distortion break; case GAME_INFLICT_SCREEN_STATE_CLOSE_EYELIDS: game_inflict_draw_eyelids(game_inflict_screen_progress & 0xff); break; case GAME_INFLICT_SCREEN_STATE_PERFORM_MODALS: game_inflict_draw_eyelids(255); break; case GAME_INFLICT_SCREEN_STATE_OPEN_EYELIDS: game_inflict_draw_eyelids(255 - game_inflict_screen_progress & 0xff); break; default: break; } } void game_inflict_draw_eyelids(uint8_t progress) { sys_i32 offset = DEVICE_H / 2 - ((255 - progress) * (255 - progress) * DEVICE_H/2) / (255 * 255); sys_rect_fill(0, 0, DEVICE_W, offset, 0); sys_rect_fill(0, DEVICE_H - offset, DEVICE_W, DEVICE_H, 0); }