#pragma once #include #include #include #include #define __BSD_VISIBLE 1 #include //--- // Level structures //--- typedef enum { Shape_Square = 0, Shape_SmallBar = 2, Shape_MediumBar = 3, Shape_NormalBar = 4, Shape_LongBar = 5, Shape_HugeBar = 6, Shape_LongVertical = 7, } shape_t; typedef enum { Action_Normal = 0, Action_RotateLeft = 1, Action_RotateRight = 2, Action_Speed1 = 3, Action__4 = 4, Action_OuterRotateLeft = 5, Action_OuterRotateRight = 6, Action_Slide = 7, Action_Speed2 = 8, Action_Speed3 = 9, Action_Slow = 10, } action_t; typedef enum { Fadeout_None = 0, Fadeout_1 = 1, Fadeout_2 = 2, Fadeout_3 = 3, } fadeout_t; typedef enum { Position_Left = 0, Position_Right = 1, Position_Middle = 2 } position_t; typedef struct { int time; shape_t shape; position_t position; action_t action; fadeout_t fadeout; } rectmeta_t; typedef struct { float speed_factor; const char *message; int block_count; rectmeta_t *blocks; } level_t; typedef struct { char const *name; int level_count; level_t **levels; } episode_t; //--- // Game //--- #define PLAYER_X 60 #define PLAYER_R 40 #define PLAYER_SIZE 8 #define CORRIDOR_SIZE 156 #define RECT_SPEED 50 /* px/tempo */ typedef struct { float w, h; /* px */ float y_init; /* px */ float x, y; /* px */ float r; /* rad */ int opacity; /* 0..256 */ rectmeta_t const *meta; } rect_t; typedef struct game { /* Current level */ level_t const *level; /* List of rectangles (same amount as lv->block_count) */ rect_t *rects; int rect_count; /* Current player rotation */ float player_rota; /* Current level time (determines the position of all objects) */ float time; /* Time spent during the death freeze animation */ float time_dead; /* Time spent during level transition */ float time_transition; /* Time spent during episode transition */ float time_episode_transition; /* Time sent during finale */ float time_finale; /* Forced rotation speed for level transitions and death rewind */ float forced_player_rota; } game_t; //--- // Rendering //--- void dcircle(int x, int y, int r, int color, bool fill, int rep1, int rep2); void dtriangle(int x1, int y1, int x2, int y2, int x3, int y3, int color, int opacity); void drectoid(rect_t const *r, float extra_size, int color); void render_player(int x, int y, float angle, int r, float opacity); void render_glow(int x, int y, int r1, int r2, int c1, int c2, float angle, float opacity); void radial_fadeout(int x, int y, int r1, int r2, int c); //--- // Duet Text //--- /* (x,y) is screen as usual, but align is relative to rotated text */ void duet_text_opt(int x, int y, int fg, int bg, int halign, int valign, char const *str, int size); //--- // Physics //--- void player_position(float angle, float *x1, float *y1, float *x2, float *y2, int r); bool player_collision(game_t const *game); bool rect_circle_collide(rect_t const *r, int cx, int cy, int cr); void rect_load(rect_t *r, rectmeta_t const *meta); void rect_physics(rect_t *r, rectmeta_t const *meta, float time); //--- // Levels //--- extern level_t level1_1, level1_2, level1_3, level1_4, level1_5; extern level_t level2_1, level2_2, level2_3, level2_4, level2_5, level2_6; extern level_t level3_1, level3_2, level3_3, level3_4, level3_5; extern level_t level4_1, level4_2, level4_3, level4_4, level4_5, level4_6; extern level_t level5_1, level5_2, level5_3, level5_4, level5_5, level5_6; extern level_t level6_1, level6_2, level6_3, level6_4, level6_5, level6_6; extern level_t level7_1, level7_2, level7_3, level7_4, level7_5, level7_6; extern level_t level8_1, level8_2, level8_3, level8_4, level8_5, level8_6, level8_7, level8_8, level8_9; extern episode_t episodes[]; extern int episode_count; //--- // Menu //--- /* Main menu, sets selected level */ int main_menu(int *episode, int *level);