From da61dad1006af275e44f0b6969d81e1cdfa6fad3 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sun, 16 Jan 2022 15:04:03 +0100 Subject: [PATCH] add level speeds + fix fast_1 timing --- CMakeLists.txt | 5 +++++ assets-cg/level/level1_1.txt | 2 +- assets-cg/level/level1_2.txt | 1 + assets-cg/level/level1_3.txt | 1 + assets-cg/level/level1_4.txt | 1 + assets-cg/level/level1_5.txt | 1 + assets-cg/level/level2_1.txt | 1 + assets-cg/level/level2_2.txt | 1 + assets-cg/level/level2_3.txt | 3 ++- assets-cg/level/level3_1.txt | 4 ++-- assets-cg/level/level3_2.txt | 28 ++++++++++++++-------------- assets-cg/level/level3_3.txt | 33 +++++++++++++++++---------------- assets-cg/level/level3_4.txt | 29 +++++++++++++++-------------- assets-cg/level/level3_5.txt | 13 +++++++------ assets-cg/level/level4_1.txt | 3 ++- assets-cg/level/level4_2.txt | 1 + assets-cg/level/level4_3.txt | 1 + assets-cg/level/level4_4.txt | 19 ++++++++++--------- assets-cg/level/level4_5.txt | 17 +++++++++-------- assets-cg/level/level4_6.txt | 1 + assets-cg/level/level5_2.txt | 2 +- converters.py | 16 ++++++++++++++-- src/duet.h | 2 +- src/main.c | 11 ++++++++--- src/physics.c | 10 +++++----- 25 files changed, 122 insertions(+), 84 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ff1ca7..bb212dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,11 @@ set(ASSETS 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 ) fxconv_declare_converters(converters.py) diff --git a/assets-cg/level/level1_1.txt b/assets-cg/level/level1_1.txt index a0e13e6..be71b69 100644 --- a/assets-cg/level/level1_1.txt +++ b/assets-cg/level/level1_1.txt @@ -1,4 +1,5 @@ #It's good to see you.\n\nStay close to me and\ndon't touch anything. +!0.75 long_vertical middle @@ -11,7 +12,6 @@ right - small left, small right diff --git a/assets-cg/level/level1_2.txt b/assets-cg/level/level1_2.txt index 65abcdb..5f88f29 100644 --- a/assets-cg/level/level1_2.txt +++ b/assets-cg/level/level1_2.txt @@ -1,4 +1,5 @@ #You'll need a circular state of mind. +!0.75 left diff --git a/assets-cg/level/level1_3.txt b/assets-cg/level/level1_3.txt index c853751..58915a1 100644 --- a/assets-cg/level/level1_3.txt +++ b/assets-cg/level/level1_3.txt @@ -1,4 +1,5 @@ #This will be easy.\nJust hold left... +!0.75 left diff --git a/assets-cg/level/level1_4.txt b/assets-cg/level/level1_4.txt index a8b4e88..2a69be5 100644 --- a/assets-cg/level/level1_4.txt +++ b/assets-cg/level/level1_4.txt @@ -1,4 +1,5 @@ #Never give up. +!0.85 left left diff --git a/assets-cg/level/level1_5.txt b/assets-cg/level/level1_5.txt index 1493c81..7f36166 100644 --- a/assets-cg/level/level1_5.txt +++ b/assets-cg/level/level1_5.txt @@ -1,4 +1,5 @@ #There are some things\nworth fighting for. +!0.95 right middle diff --git a/assets-cg/level/level2_1.txt b/assets-cg/level/level2_1.txt index 401ca32..15404eb 100644 --- a/assets-cg/level/level2_1.txt +++ b/assets-cg/level/level2_1.txt @@ -1,2 +1,3 @@ #This will be full of\nunexpected twists and turns. +!0.55 middle rotate_right diff --git a/assets-cg/level/level2_2.txt b/assets-cg/level/level2_2.txt index 091faed..c48c6eb 100644 --- a/assets-cg/level/level2_2.txt +++ b/assets-cg/level/level2_2.txt @@ -1,4 +1,5 @@ #Tread carefully.\nDon't take things too far. +!0.85 left small right diff --git a/assets-cg/level/level2_3.txt b/assets-cg/level/level2_3.txt index 7b7cf0f..757807f 100644 --- a/assets-cg/level/level2_3.txt +++ b/assets-cg/level/level2_3.txt @@ -1,8 +1,9 @@ #Change is normal. +!0.85 middle rotate_left middle rotate_right -middle rotate_left \ No newline at end of file +middle rotate_left diff --git a/assets-cg/level/level3_1.txt b/assets-cg/level/level3_1.txt index 54d167c..629919e 100644 --- a/assets-cg/level/level3_1.txt +++ b/assets-cg/level/level3_1.txt @@ -1,9 +1,9 @@ #Anger may make certain\nchoices clearer. right +middle fast_1 - -left, middle fast_1 +left left diff --git a/assets-cg/level/level3_2.txt b/assets-cg/level/level3_2.txt index a6796d1..455a844 100644 --- a/assets-cg/level/level3_2.txt +++ b/assets-cg/level/level3_2.txt @@ -1,28 +1,28 @@ #Patterns always emerge,\neven in chaos. +right fast_1 +left -left, right fast_1 +right fast_1 +right +left fast_1 -right, right fast_1 +left +left fast_1 +left -left, left fast_1 +left fast_1 +left +left fast_1 -left, left fast_1 +left +right fast_1 - -left, left fast_1 - - - -left, left fast_1 - - - -right, right fast_1 +right diff --git a/assets-cg/level/level3_3.txt b/assets-cg/level/level3_3.txt index 6cfdec9..3542acf 100644 --- a/assets-cg/level/level3_3.txt +++ b/assets-cg/level/level3_3.txt @@ -1,32 +1,33 @@ #This need not define you. +!1.05 +square left fast_1 +square right -square left fast_1, square right +middle fast_1 +left +left fast_1 -left, middle fast_1 +left +square right fast_1 +square left -left, left fast_1 +left fast_1 +right +right fast_1 -square left, square right fast_1 +right +right fast_1 +right -left fast_1, right +right fast_1 - - -right, right fast_1 - - - -right, right fast_1 - - - -small left, right fast_1 +small left diff --git a/assets-cg/level/level3_4.txt b/assets-cg/level/level3_4.txt index 666a8f7..6528510 100644 --- a/assets-cg/level/level3_4.txt +++ b/assets-cg/level/level3_4.txt @@ -1,31 +1,32 @@ #Let it amplify you. +!1.15 +right fast_1 +left -left, right fast_1 +square left fast_1 +square right +middle fast_1 -square left fast_1, square right +right +left fast_1 +right -right, middle fast_1 +square right fast_1 - - -left fast_1, right - - - -square left, square right fast_1 +square left right small left +middle fast_1 +right -right, middle fast_1 +square right fast_1 - - -square left, square right fast_1 +square left diff --git a/assets-cg/level/level3_5.txt b/assets-cg/level/level3_5.txt index 9861335..4dae8fe 100644 --- a/assets-cg/level/level3_5.txt +++ b/assets-cg/level/level3_5.txt @@ -1,19 +1,20 @@ #Repeating the same action\nbut expecting new results is\na sign of madness. +!1.25 square left square right +left fast_1 - -left fast_1, right +right middle rotate_left +left fast_1 - -left fast_1, small right +small right square right @@ -29,9 +30,9 @@ square right right +square left fast_1 - -square left fast_1, square right +square right left small right diff --git a/assets-cg/level/level4_1.txt b/assets-cg/level/level4_1.txt index b9305eb..659b80c 100644 --- a/assets-cg/level/level4_1.txt +++ b/assets-cg/level/level4_1.txt @@ -1,4 +1,5 @@ #It's also a sign that you are\nhuman. +!0.85 right rotate @@ -7,4 +8,4 @@ left rotate -right rotate \ No newline at end of file +right rotate diff --git a/assets-cg/level/level4_2.txt b/assets-cg/level/level4_2.txt index e381c57..3b91889 100644 --- a/assets-cg/level/level4_2.txt +++ b/assets-cg/level/level4_2.txt @@ -1,4 +1,5 @@ #Once an action is done it\ncannot be undone. +!0.85 right rotate diff --git a/assets-cg/level/level4_3.txt b/assets-cg/level/level4_3.txt index 99900f1..57f45ce 100644 --- a/assets-cg/level/level4_3.txt +++ b/assets-cg/level/level4_3.txt @@ -1,4 +1,5 @@ #You cannot get out of this. +!1.0 right small left diff --git a/assets-cg/level/level4_4.txt b/assets-cg/level/level4_4.txt index 20dcf49..e8c8cf6 100644 --- a/assets-cg/level/level4_4.txt +++ b/assets-cg/level/level4_4.txt @@ -1,15 +1,16 @@ #Accept the situation and\nmove on. +!1.15 +left fast_1 +small right -left fast_1, small right +right fast_1 +middle +right fast_1 -right fast_1, middle - - - -small left, right fast_1 +small left middle rotate_left @@ -18,9 +19,9 @@ middle rotate_left right rotate +left fast_1 - -left fast_1, right +right left @@ -31,4 +32,4 @@ square right square left -right rotate \ No newline at end of file +right rotate diff --git a/assets-cg/level/level4_5.txt b/assets-cg/level/level4_5.txt index ca408f4..7370a51 100644 --- a/assets-cg/level/level4_5.txt +++ b/assets-cg/level/level4_5.txt @@ -1,11 +1,12 @@ #To try invites failure. +!1.25 left left +middle fast_1 - -middle fast_1, right +right middle @@ -23,17 +24,17 @@ middle rotate_left left small right +square right fast_1 - -square left, square right fast_1 +square left middle rotate_right +left fast_1 +small right -left fast_1, small right +left fast_1 - - -left fast_1, left +left diff --git a/assets-cg/level/level4_6.txt b/assets-cg/level/level4_6.txt index d14a6d5..79f5fc8 100644 --- a/assets-cg/level/level4_6.txt +++ b/assets-cg/level/level4_6.txt @@ -1,4 +1,5 @@ #Resistance is not an option. +!1.25 right rotate diff --git a/assets-cg/level/level5_2.txt b/assets-cg/level/level5_2.txt index 1b34eee..fbcac48 100644 --- a/assets-cg/level/level5_2.txt +++ b/assets-cg/level/level5_2.txt @@ -29,6 +29,6 @@ left fast_2 left -let fast_2 +left fast_2 left diff --git a/converters.py b/converters.py index eaf4363..ec2f0ef 100644 --- a/converters.py +++ b/converters.py @@ -1,4 +1,8 @@ import fxconv +import struct + +def float_to_bytes(f): + return struct.pack('>f', f) def convert(input, output, params, target): if params["custom-type"] == "level": @@ -10,10 +14,18 @@ def convert(input, output, params, target): def convert_level(input, output, params, target): with open(input, "r") as fp: raw = fp.read().split("\n") - lines = [tempo.split(",") for tempo in raw if not tempo.startswith("#")] + lines = [tempo.split(",") for tempo in raw + if not tempo.startswith("#") and not tempo.startswith("!")] messages = [l[1:].strip() for l in raw if l.startswith("#")] message = "\n".join(l.replace("\\n", "\n") for l in messages) + speed = 1.0 + for line in raw: + if line.startswith("!"): + speed = float(line[1:]) + + print(speed) + blocks = bytes() block_count = 0 @@ -99,7 +111,7 @@ def convert_level(input, output, params, target): block_count += 1 o = fxconv.ObjectData() - o += fxconv.u32(0x3f800000) # 1.0 as a float + o += float_to_bytes(speed) o += fxconv.ref(bytes(message, 'utf-8') + bytes(1), padding=4) o += fxconv.u32(block_count) o += fxconv.ref(blocks) diff --git a/src/duet.h b/src/duet.h index 8e68075..8d24662 100644 --- a/src/duet.h +++ b/src/duet.h @@ -50,7 +50,7 @@ typedef struct { } rectmeta_t; typedef struct { - float tempo; + float speed_factor; const char *message; int block_count; rectmeta_t *blocks; diff --git a/src/main.c b/src/main.c index a5ec4c1..127bc8e 100644 --- a/src/main.c +++ b/src/main.c @@ -56,9 +56,9 @@ episode_t episodes[] = { }, { .name = "guilt", - .level_count = 1, + .level_count = 5, .levels = (level_t *[]) { - &level22, // TODO + &level23, &level24, &level25, &level26, &level27, }, }, }; @@ -147,9 +147,11 @@ void game_loop(int current_episode, int current_level) /* Time management */ - float time_direction = lv->tempo * time_direction_forward; + float time_direction = time_direction_forward; if(state == State_Rewind) time_direction = time_direction_rewind; + if(state == State_Playing) + time_direction *= lv->speed_factor; if(state == State_Dead) { game.time_dead += FRAME_DURATION; @@ -167,6 +169,7 @@ void game_loop(int current_episode, int current_level) if(game.time_transition >= TRANSITION_DURATION) { game.time_transition = 0; game.forced_player_rota = 0; + game.player_rota = rpr(game.player_rota); state = State_Playing; } } @@ -175,6 +178,7 @@ void game_loop(int current_episode, int current_level) game.time_episode_transition += FRAME_DURATION; if(game.time_episode_transition >= TRANSITION_DURATION) { game.forced_player_rota = 0; + game.player_rota = rpr(game.player_rota); } if(game.time_episode_transition >= EPISODE_TRANSITION_DURATION) { game.time_episode_transition = 0; @@ -246,6 +250,7 @@ void game_loop(int current_episode, int current_level) if(state == State_Rewind && game.time <= REWIND_END) { game.time = REWIND_END; game.forced_player_rota = 0; + game.player_rota = rpr(game.player_rota); state = State_Playing; continue; } diff --git a/src/physics.c b/src/physics.c index 58d91db..66335e4 100644 --- a/src/physics.c +++ b/src/physics.c @@ -132,9 +132,9 @@ 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 -8 and -6 to skip 2 tempos */ - float speeding_period = fminf(2.0, fmaxf(0.0, time + 6.0)); - r->x -= RECT_SPEED * speeding_period; + /* Double speed between -6 and -4 to skip 2 tempos */ + float speeding_period = fminf(2.0, fmaxf(0.0, time + 4.0)); + r->x -= RECT_SPEED * (speeding_period - 2.0); } else if(meta->action == Action_FadeOut) { // TODO @@ -151,8 +151,8 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) // TODO } else if(meta->action == Action_Speed2) { - /* Double speed permanently */ - // TODO + /* Speed x1.6 permanently */ + r->x -= RECT_SPEED * time * 0.6; } else if(meta->action == Action_Speed3) { // TODO