crocparty/game/game_inflict.c

119 lines
4.1 KiB
C
Raw Permalink Normal View History

2024-02-29 22:31:44 +00:00
#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);
}