From c654fd412133519fa89ddd509b8925efffd68750 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sun, 16 Jan 2022 19:30:11 +0100 Subject: [PATCH] slide mechanic + levels up to 6_1 --- CMakeLists.txt | 61 +++++++++++++++------------- assets-cg/font.png | Bin 994 -> 12203 bytes assets-cg/level/level5_1.txt | 46 ++++++++++----------- assets-cg/level/level5_2.txt | 36 ++++++++--------- assets-cg/level/level5_3.txt | 42 +++++++++---------- assets-cg/level/level5_4.txt | 63 +++++++++++++++-------------- assets-cg/level/level5_5.txt | 76 +++++++++++++++++------------------ assets-cg/level/level5_6.txt | 56 +++++++++++++------------- assets-cg/level/level6_1.txt | 4 +- converters.py | 4 +- src/duet.h | 19 +++++---- src/main.c | 21 ++++++---- src/physics.c | 49 +++++++++++++++++----- 13 files changed, 258 insertions(+), 219 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb212dd..1200afd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,33 +20,40 @@ set(ASSETS assets-cg/font.png assets-cg/title.png assets-cg/levels.png - assets-cg/level/level1.txt - assets-cg/level/level2.txt - assets-cg/level/level3.txt - assets-cg/level/level4.txt - assets-cg/level/level5.txt - assets-cg/level/level6.txt - assets-cg/level/level7.txt - assets-cg/level/level8.txt - assets-cg/level/level9.txt - assets-cg/level/level10.txt - assets-cg/level/level11.txt - assets-cg/level/level12.txt - assets-cg/level/level13.txt - assets-cg/level/level14.txt - assets-cg/level/level15.txt - assets-cg/level/level16.txt - assets-cg/level/level17.txt - assets-cg/level/level18.txt - assets-cg/level/level19.txt - assets-cg/level/level20.txt - assets-cg/level/level21.txt - assets-cg/level/level22.txt - assets-cg/level/level23.txt - assets-cg/level/level24.txt - assets-cg/level/level25.txt - assets-cg/level/level26.txt - assets-cg/level/level27.txt + assets-cg/level/level1_1.txt + assets-cg/level/level1_2.txt + assets-cg/level/level1_3.txt + assets-cg/level/level1_4.txt + assets-cg/level/level1_5.txt + assets-cg/level/level2_1.txt + assets-cg/level/level2_2.txt + assets-cg/level/level2_3.txt + assets-cg/level/level2_4.txt + assets-cg/level/level2_5.txt + assets-cg/level/level2_6.txt + assets-cg/level/level3_1.txt + assets-cg/level/level3_2.txt + assets-cg/level/level3_3.txt + assets-cg/level/level3_4.txt + assets-cg/level/level3_5.txt + assets-cg/level/level4_1.txt + assets-cg/level/level4_2.txt + assets-cg/level/level4_3.txt + assets-cg/level/level4_4.txt + assets-cg/level/level4_5.txt + assets-cg/level/level4_6.txt + assets-cg/level/level5_1.txt + assets-cg/level/level5_2.txt + assets-cg/level/level5_3.txt + assets-cg/level/level5_4.txt + assets-cg/level/level5_5.txt + assets-cg/level/level5_6.txt + assets-cg/level/level6_1.txt + assets-cg/level/level6_2.txt + assets-cg/level/level6_3.txt + assets-cg/level/level6_4.txt + assets-cg/level/level6_5.txt + assets-cg/level/level6_6.txt ) fxconv_declare_converters(converters.py) diff --git a/assets-cg/font.png b/assets-cg/font.png index cb8cf89de82700034f0d68feba207d958e300a01..25f43153e1e36388d9c90a78a1bd6fa5ab678d98 100644 GIT binary patch literal 12203 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 normal - if shape < 0 and action in [0, 3, 8, 9]: + if shape < 0 and action in [0, 3, 7, 8, 9, 10]: shape = 4 if shape < 0 or action < 0 or position < 0: diff --git a/src/duet.h b/src/duet.h index 8d24662..11e99fc 100644 --- a/src/duet.h +++ b/src/duet.h @@ -34,6 +34,7 @@ typedef enum { Action_Slide = 7, Action_Speed2 = 8, Action_Speed3 = 9, + Action_Slow1 = 10, } action_t; typedef enum { @@ -69,19 +70,18 @@ typedef struct { #define PLAYER_X 60 #define PLAYER_R 40 #define PLAYER_SIZE 8 -#define CORRIDOR_SIZE 150 +#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 */ rectmeta_t const *meta; } rect_t; -#define RECT_TABLE_SIZE 20 - typedef struct game { /* Current level */ level_t const *level; @@ -144,13 +144,12 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float time); // Levels //--- -extern level_t level1, level2, level3, level4; -extern level_t level5, level6, level7, level8; -extern level_t level9, level10, level11, level12; -extern level_t level13, level14, level15, level16; -extern level_t level17, level18, level19, level20; -extern level_t level21, level22, level23, level24; -extern level_t level25, level26, level27, level28; +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 episode_t episodes[]; extern int episode_count; diff --git a/src/main.c b/src/main.c index 127bc8e..1eaa4cd 100644 --- a/src/main.c +++ b/src/main.c @@ -28,37 +28,42 @@ episode_t episodes[] = { .name = "ignorance", .level_count = 5, .levels = (level_t *[]){ - &level1, &level2, &level3, &level4, &level5 + &level1_1, &level1_2, &level1_3, &level1_4, &level1_5 }, }, { .name = "denial", .level_count = 6, .levels = (level_t *[]){ - &level6, &level7, &level8, &level9, &level10, - &level11, + &level2_1, &level2_2, &level2_3, &level2_4, &level2_5, &level2_6 }, }, { .name = "anger", .level_count = 5, .levels = (level_t *[]){ - &level12, &level13, &level14, &level15, &level16, + &level3_1, &level3_2, &level3_3, &level3_4, &level3_5 }, }, { .name = "bargaining", .level_count = 6, .levels = (level_t *[]){ - &level17, &level18, &level19, &level20, &level21, - &level22, + &level4_1, &level4_2, &level4_3, &level4_4, &level4_5, &level4_6 }, }, { .name = "guilt", - .level_count = 5, + .level_count = 6, .levels = (level_t *[]) { - &level23, &level24, &level25, &level26, &level27, + &level5_1, &level5_2, &level5_3, &level5_4, &level5_5, &level5_6 + }, + }, + { + .name = "depression", + .level_count = 6, + .levels = (level_t *[]){ + &level6_1, &level6_2, &level6_3, &level6_4, &level6_5, &level6_6 }, }, }; diff --git a/src/physics.c b/src/physics.c index 66335e4..b43468e 100644 --- a/src/physics.c +++ b/src/physics.c @@ -96,24 +96,31 @@ void rect_load(rect_t *r, rectmeta_t const *meta) switch(meta->position) { case Position_Left: if(meta->shape == Shape_Square) - r->y = DHEIGHT/2 - 0.22*CORRIDOR_SIZE; + r->y_init = DHEIGHT/2 - 0.22*CORRIDOR_SIZE; else if(meta->shape == Shape_HugeBar) - r->y = DHEIGHT/2 - 0.38*CORRIDOR_SIZE; + r->y_init = DHEIGHT/2 - 0.38*CORRIDOR_SIZE; else - r->y = DHEIGHT/2 - CORRIDOR_SIZE/2 + r->h/2; + r->y_init = DHEIGHT/2 - CORRIDOR_SIZE/2 + r->h/2; break; case Position_Right: if(meta->shape == Shape_Square) - r->y = DHEIGHT/2 + 0.22*CORRIDOR_SIZE; + r->y_init = DHEIGHT/2 + 0.22*CORRIDOR_SIZE; else if(meta->shape == Shape_HugeBar) - r->y = DHEIGHT/2 + 0.38*CORRIDOR_SIZE; + r->y_init = DHEIGHT/2 + 0.38*CORRIDOR_SIZE; else - r->y = DHEIGHT/2 + CORRIDOR_SIZE/2 - r->h/2; + r->y_init = DHEIGHT/2 + CORRIDOR_SIZE/2 - r->h/2; break; case Position_Middle: - r->y = DHEIGHT/2; + r->y_init = DHEIGHT/2; break; } + + r->y = r->y_init; +} + +float cubic_ease(float t) +{ + return (t <= 0.5) ? 4 * t * t * t : 1 - 4 * (1 - t) * (1 - t) * (1 - t); } void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) @@ -121,6 +128,7 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) float time = absolute_time - meta->time; /* <= 0 most of the time */ r->x = PLAYER_X - RECT_SPEED * time; + r->y = r->y_init; r->r = 0; if(meta->action == Action_RotateLeft) { @@ -132,7 +140,7 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) r->r = 0.3 - time * vr; } else if(meta->action == Action_Speed1) { - /* Double speed between -6 and -4 to skip 2 tempos */ + /* Double speed between -4 and -2 to skip 2 tempi */ float speeding_period = fminf(2.0, fmaxf(0.0, time + 4.0)); r->x -= RECT_SPEED * (speeding_period - 2.0); } @@ -148,13 +156,32 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) r->r = -time * vr; } else if(meta->action == Action_Slide) { - // TODO + float amp = 2 * (DHEIGHT/2 - r->y_init); + /* Nothing happens until -7 */ + if(time <= -7.0) {} + /* Slide to the opposite side between -7 and -5 */ + else if(time <= -5.0) r->y += amp * cubic_ease((time + 7) / 2); + /* Stay there until -3 */ + else if(time <= -3.0) r->y += amp; + /* Slide back between -3 and -1 */ + else if(time <= -1.0) r->y += amp * (1 - cubic_ease((time + 3) / 2)); + /* Stay there until +1 */ + else if(time <= +1.0) {} + /* Move back between +1 and +3 */ + else if(time <= +3.0) r->y += amp * cubic_ease((time - 1) / 2); + /* Stay there indefinitely */ + else r->y += amp; } else if(meta->action == Action_Speed2) { - /* Speed x1.6 permanently */ - r->x -= RECT_SPEED * time * 0.6; + /* Speed x1.5 permanently */ + r->x -= RECT_SPEED * time * 0.5; } else if(meta->action == Action_Speed3) { // TODO } + else if(meta->action == Action_Slow1) { + /* Speed x2/3 until they come close enough to you */ + if(time <= -1.0) + r->x += RECT_SPEED * (time + 1) / 3; + } }