119 lines
4.1 KiB
C
119 lines
4.1 KiB
C
|
#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);
|
||
|
}
|