From 96247fbcfaa5d491f088b9ddb6bbe3ecff975aed Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sat, 21 Aug 2021 16:31:19 +0200 Subject: [PATCH] add level conversion, loading, basic mechanics --- .gitignore | 2 +- CMakeLists.txt | 10 +++- assets-cg/example.png | Bin 3816 -> 0 bytes assets-cg/level/fxconv-metadata.txt | 3 ++ assets-cg/level/level1.txt | 2 +- assets-cg/level/level5.txt | 2 +- converters.py | 68 ++++++++++++++++++++++++++++ src/duet.h | 44 +++++++++++++----- src/main.c | 51 ++++++++++++++------- src/physics.c | 62 +++++++++++++++++++++++++ 10 files changed, 211 insertions(+), 33 deletions(-) delete mode 100644 assets-cg/example.png create mode 100644 assets-cg/level/fxconv-metadata.txt create mode 100644 converters.py diff --git a/.gitignore b/.gitignore index 2c4f84b..be51d83 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ /*.g3a # Python bytecode - __pycache__/ +__pycache__/ # Common IDE files *.sublime-project diff --git a/CMakeLists.txt b/CMakeLists.txt index bca6ad8..207147b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,10 +15,16 @@ set(SOURCES src/physics.c ) set(ASSETS - assets-cg/example.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 ) +fxconv_declare_converters(converters.py) fxconv_declare_assets(${ASSETS} WITH_METADATA) add_executable(addin ${SOURCES} ${ASSETS}) diff --git a/assets-cg/example.png b/assets-cg/example.png deleted file mode 100644 index 8826800383eeae92dade9545feaeb68faf0720f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3816 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 eRZ5JQiUR=bBzf^!G-(0=0000blocks; + game.time = -5.0; timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame)); timer_start(timer); @@ -61,8 +57,8 @@ int main(void) while (need_frame == 0) sleep(); need_frame = 0; - dt = (1.0 / 30) * level0.tempo; - game.time += 1.0 / 30; + dt = (1.0 / 30) * game.level->tempo; + game.time += dt; /* Input analysis */ @@ -81,7 +77,31 @@ int main(void) } /* Level generation */ - /* TODO */ + + // Remove rectangles that have passed their lifetime by 2 seconds + for(int i = 0; i < game.cursor;) { + if(game.time > game.table[i].meta->time + 2) + game.table[i] = game.table[--game.cursor]; + else + i++; + } + + // Find rectangles that need to be loaded + rectmeta_t const *meta = game.current; + while(meta < game.level->blocks + game.level->block_count) { + if(meta - game.current > RECT_TABLE_SIZE - game.cursor) + break; /* oops, not enough array space left */ + if(meta->time - 10 > game.time) + break; + meta++; + } + + // Load everything up to meta + while(game.current < meta) { + rect_t *r = &game.table[game.cursor++]; + r->meta = game.current++; + rect_load(r, r->meta); + } /* Physics */ @@ -89,22 +109,19 @@ int main(void) // break; for(int i = 0; i < game.cursor; i++) { - rect_t *r = &game.table[i]; - r->x += r->vx * dt; - r->y += r->vy * dt; - r->r += r->vr * dt; + rect_physics(&game.table[i], game.table[i].meta, game.time); } if(rotate_left) - game.player_rota += M_PI * dt; + game.player_rota += 2.1 * dt; if(rotate_right) - game.player_rota -= M_PI * dt; + game.player_rota -= 2.1 * dt; /* Rendering */ dclear(player_collision(&game) ? C_RED : C_BLACK); dprint(0, 0, C_WHITE, "game time: %.2fs", game.time); - dprint(0, 11, C_WHITE, "player rota: %.2f rad", game.player_rota); + dprint(0, 11, C_WHITE, "rectangles loaded: %d", game.cursor); for(int i = 0; i < game.cursor; i++) drectoid(&game.table[i], C_WHITE); diff --git a/src/physics.c b/src/physics.c index 4614e09..a003dec 100644 --- a/src/physics.c +++ b/src/physics.c @@ -50,5 +50,67 @@ bool rect_circle_collide(rect_t const *r, int cx0, int cy0, int cr) if(cly > r->h/2) cly = r->h/2; /* Determine whether that point is in the circle */ + return (clx - cx) * (clx - cx) + (cly - cy) * (cly - cy) <= cr * cr; } + +void rect_load(rect_t *r, rectmeta_t const *meta) +{ + r->w = 0; + r->h = 0; + + switch(meta->shape) { + case Shape_Square: + r->w = 0.4; + r->h = 0.5; + break; + case Shape_SmallBar: + r->w = 0.2; + r->h = 0.5; + break; + case Shape_MediumBar: + r->w = 0.2; + r->h = 0.65; + break; + case Shape_NormalBar: + r->w = 0.2; + r->h = 1.0; + break; + case Shape_LongBar: + r->w = 0.2; + r->h = 1.15; + break; + case Shape_HugeBar: + r->w = 0.2; + r->h = 1.5; + break; + case Shape_LongVertical: + r->w = 0.8; + r->h = 0.2; + break; + } + + r->w *= 2 * PLAYER_R; + r->h *= 2 * PLAYER_R; + + switch(meta->position) { + case Position_Left: + r->y = DHEIGHT/2 - CORRIDOR_SIZE/2 + r->w/2; + break; + case Position_Right: + r->y = DHEIGHT/2 + CORRIDOR_SIZE/2 - r->w/2; + break; + case Position_Middle: + r->y = DHEIGHT/2; + break; + } +} + +void rect_physics(rect_t *r, rectmeta_t const *meta, float absolute_time) +{ + // TODO: Use position and actions + float time = absolute_time - meta->time; /* <= 0 most of the time */ + + r->x = PLAYER_X - RECT_SPEED * time; + r->r = 0; +}