From e1d8a89e8cd684c5d8c8f23fd23fb22492552a9f Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 5 Dec 2025 20:02:05 -0600 Subject: [PATCH] multiple levels --- include/level/level2.data.h | 19 ++++++++ include/level/level2.data.pal.h | 19 ++++++++ include/level/level3.data.h | 19 ++++++++ include/level/level3.data.pal.h | 19 ++++++++ include/level/level4.data.h | 19 ++++++++ include/level/level4.data.pal.h | 19 ++++++++ include/level/level5.data.h | 19 ++++++++ include/level/level5.data.pal.h | 19 ++++++++ include/state.h | 3 ++ include/update.hpp | 1 + src/level/level2.data | Bin 0 -> 364 bytes src/level/level2.data.pal | Bin 0 -> 21 bytes src/level/level2.png | Bin 0 -> 624 bytes src/level/level3.data | Bin 0 -> 364 bytes src/level/level3.data.pal | Bin 0 -> 12 bytes src/level/level3.png | Bin 0 -> 608 bytes src/level/level4.data | Bin 0 -> 364 bytes src/level/level4.data.pal | Bin 0 -> 18 bytes src/level/level4.png | Bin 0 -> 644 bytes src/level/level5.data | Bin 0 -> 364 bytes src/level/level5.data.pal | Bin 0 -> 24 bytes src/level/level5.png | Bin 0 -> 656 bytes src/main.c | 4 +- src/render.cpp | 6 +-- src/update.cpp | 77 ++++++++++++++++++++++++++++++-- 25 files changed, 234 insertions(+), 9 deletions(-) create mode 100644 include/level/level2.data.h create mode 100644 include/level/level2.data.pal.h create mode 100644 include/level/level3.data.h create mode 100644 include/level/level3.data.pal.h create mode 100644 include/level/level4.data.h create mode 100644 include/level/level4.data.pal.h create mode 100644 include/level/level5.data.h create mode 100644 include/level/level5.data.pal.h create mode 100644 src/level/level2.data create mode 100644 src/level/level2.data.pal create mode 100644 src/level/level2.png create mode 100644 src/level/level3.data create mode 100644 src/level/level3.data.pal create mode 100644 src/level/level3.png create mode 100644 src/level/level4.data create mode 100644 src/level/level4.data.pal create mode 100644 src/level/level4.png create mode 100644 src/level/level5.data create mode 100644 src/level/level5.data.pal create mode 100644 src/level/level5.png diff --git a/include/level/level2.data.h b/include/level/level2.data.h new file mode 100644 index 0000000..8e0e6bd --- /dev/null +++ b/include/level/level2.data.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level2_data_start __asm("_binary_src_level_level2_data_start"); +extern uint32_t _binary_src_level_level2_data_end __asm("_binary_src_level_level2_data_end"); +extern uint32_t _binary_src_level_level2_data_size __asm("_binary_src_level_level2_data_size"); + +#define src_level_level2_data_start ((const char *)&_binary_src_level_level2_data_start) +#define src_level_level2_data_end ((const char *)&_binary_src_level_level2_data_end) +#define src_level_level2_data_size (src_level_level2_data_end - src_level_level2_data_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level2.data.pal.h b/include/level/level2.data.pal.h new file mode 100644 index 0000000..aa086a8 --- /dev/null +++ b/include/level/level2.data.pal.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level2_data_pal_start __asm("_binary_src_level_level2_data_pal_start"); +extern uint32_t _binary_src_level_level2_data_pal_end __asm("_binary_src_level_level2_data_pal_end"); +extern uint32_t _binary_src_level_level2_data_pal_size __asm("_binary_src_level_level2_data_pal_size"); + +#define src_level_level2_data_pal_start ((const char *)&_binary_src_level_level2_data_pal_start) +#define src_level_level2_data_pal_end ((const char *)&_binary_src_level_level2_data_pal_end) +#define src_level_level2_data_pal_size (src_level_level2_data_pal_end - src_level_level2_data_pal_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level3.data.h b/include/level/level3.data.h new file mode 100644 index 0000000..ee90f00 --- /dev/null +++ b/include/level/level3.data.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level3_data_start __asm("_binary_src_level_level3_data_start"); +extern uint32_t _binary_src_level_level3_data_end __asm("_binary_src_level_level3_data_end"); +extern uint32_t _binary_src_level_level3_data_size __asm("_binary_src_level_level3_data_size"); + +#define src_level_level3_data_start ((const char *)&_binary_src_level_level3_data_start) +#define src_level_level3_data_end ((const char *)&_binary_src_level_level3_data_end) +#define src_level_level3_data_size (src_level_level3_data_end - src_level_level3_data_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level3.data.pal.h b/include/level/level3.data.pal.h new file mode 100644 index 0000000..2bd4793 --- /dev/null +++ b/include/level/level3.data.pal.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level3_data_pal_start __asm("_binary_src_level_level3_data_pal_start"); +extern uint32_t _binary_src_level_level3_data_pal_end __asm("_binary_src_level_level3_data_pal_end"); +extern uint32_t _binary_src_level_level3_data_pal_size __asm("_binary_src_level_level3_data_pal_size"); + +#define src_level_level3_data_pal_start ((const char *)&_binary_src_level_level3_data_pal_start) +#define src_level_level3_data_pal_end ((const char *)&_binary_src_level_level3_data_pal_end) +#define src_level_level3_data_pal_size (src_level_level3_data_pal_end - src_level_level3_data_pal_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level4.data.h b/include/level/level4.data.h new file mode 100644 index 0000000..06e441f --- /dev/null +++ b/include/level/level4.data.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level4_data_start __asm("_binary_src_level_level4_data_start"); +extern uint32_t _binary_src_level_level4_data_end __asm("_binary_src_level_level4_data_end"); +extern uint32_t _binary_src_level_level4_data_size __asm("_binary_src_level_level4_data_size"); + +#define src_level_level4_data_start ((const char *)&_binary_src_level_level4_data_start) +#define src_level_level4_data_end ((const char *)&_binary_src_level_level4_data_end) +#define src_level_level4_data_size (src_level_level4_data_end - src_level_level4_data_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level4.data.pal.h b/include/level/level4.data.pal.h new file mode 100644 index 0000000..ca63746 --- /dev/null +++ b/include/level/level4.data.pal.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level4_data_pal_start __asm("_binary_src_level_level4_data_pal_start"); +extern uint32_t _binary_src_level_level4_data_pal_end __asm("_binary_src_level_level4_data_pal_end"); +extern uint32_t _binary_src_level_level4_data_pal_size __asm("_binary_src_level_level4_data_pal_size"); + +#define src_level_level4_data_pal_start ((const char *)&_binary_src_level_level4_data_pal_start) +#define src_level_level4_data_pal_end ((const char *)&_binary_src_level_level4_data_pal_end) +#define src_level_level4_data_pal_size (src_level_level4_data_pal_end - src_level_level4_data_pal_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level5.data.h b/include/level/level5.data.h new file mode 100644 index 0000000..9988110 --- /dev/null +++ b/include/level/level5.data.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level5_data_start __asm("_binary_src_level_level5_data_start"); +extern uint32_t _binary_src_level_level5_data_end __asm("_binary_src_level_level5_data_end"); +extern uint32_t _binary_src_level_level5_data_size __asm("_binary_src_level_level5_data_size"); + +#define src_level_level5_data_start ((const char *)&_binary_src_level_level5_data_start) +#define src_level_level5_data_end ((const char *)&_binary_src_level_level5_data_end) +#define src_level_level5_data_size (src_level_level5_data_end - src_level_level5_data_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level5.data.pal.h b/include/level/level5.data.pal.h new file mode 100644 index 0000000..131a2d0 --- /dev/null +++ b/include/level/level5.data.pal.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level5_data_pal_start __asm("_binary_src_level_level5_data_pal_start"); +extern uint32_t _binary_src_level_level5_data_pal_end __asm("_binary_src_level_level5_data_pal_end"); +extern uint32_t _binary_src_level_level5_data_pal_size __asm("_binary_src_level_level5_data_pal_size"); + +#define src_level_level5_data_pal_start ((const char *)&_binary_src_level_level5_data_pal_start) +#define src_level_level5_data_pal_end ((const char *)&_binary_src_level_level5_data_pal_end) +#define src_level_level5_data_pal_size (src_level_level5_data_pal_end - src_level_level5_data_pal_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/state.h b/include/state.h index bbe7616..f3dd7ac 100644 --- a/include/state.h +++ b/include/state.h @@ -22,6 +22,7 @@ extern "C" { struct game_state { struct block_state blocks[28 * 13]; + int level_ix; const uint8_t * level; const uint8_t * pal; @@ -34,6 +35,8 @@ extern "C" { double start_time; double time; double remaining; + + bool intro_shown; }; #ifdef __cplusplus diff --git a/include/update.hpp b/include/update.hpp index 9433ac5..138bf85 100644 --- a/include/update.hpp +++ b/include/update.hpp @@ -7,6 +7,7 @@ extern "C" { #endif void launch_ball(struct game_state * state, double time); + void reset_game(struct game_state * state); void reset_level(struct game_state * state); void update(struct game_state * state, double time); diff --git a/src/level/level2.data b/src/level/level2.data new file mode 100644 index 0000000000000000000000000000000000000000..bb4ee901689a3eeefddfd15ab5566431135dc42a GIT binary patch literal 364 zcmc(XK@Pwm48yW?<^NA6NKhh#b{!|XjsQL%$?A-VWsD}7rl4KP;G2MBw!bq5-nt9+ RNRnQVdAL_gkFihwEX>4Tx04R}tkv&MmKpe$i(@I4v9qb_DkfA!+MMVUcT7@E12(?114knj=L6e50 z#l=x@EjakGSaoo5*44pP5ClI!+yy5^7b)?7NufoI2gm(*ckglc4iK6ZrdfeFpy@R; zolJU5saWpZjwRsCkP4K9M-i46{bOK|H-# zGdS-PM_5T#iO-40O}ZfQBi9v|-#8Z?7IPWeLC zWtH<5XRT6a?R)YUhVuH#GS_L2Ac;jRL4pVcb(B#-4KZ4EQY@rtKjGmYcKi~#6mpfp z$gzMbG{}x0{11M2YZWFZ+@w$f=y|d2k5M4F3$z-x{e5iPtrNii3|#3Qf3*qBe3IVi zXwf4eybWAjcQj=WxZDATo($QP9m!8qC=`JAGy0|+Fn9~}t+~Cm_i_3FWT>mu4RCM> zj1?(+-Q(T8-M#&LrrqBUoK14KSiPIz0000LP)t-s000177AeMIX|!mxXrRBmxWfPc z|IVqpMF0Q*32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rk3<{98FWQh zbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b069rSK~xCWV_?7lOiB=1*;oP0 zH8TbaFc~XBXd_gbL0L%wMIVC$lvaS!0Z^JXlmSfyN{cek3;+P`%LLgFH6wfg0000< KMNUMnLSTZyp!nth literal 0 HcmV?d00001 diff --git a/src/level/level3.data b/src/level/level3.data new file mode 100644 index 0000000000000000000000000000000000000000..a3c0cfec2b1cf2c356b6474b4f261af9e49c0858 GIT binary patch literal 364 zcmd7MF%AGA2m?T*|NpZEBzACcgsGP_4Q5{lX#rQvs|6>H;E5D-fr|VEX>4Tx04R}tkv&MmKpe$i(@I4v9qb_DkfA!+MMVUcT7@E12(?114knj=L6e50 z#l=x@EjakGSaoo5*44pP5ClI!+yy5^7b)?7NufoI2gm(*ckglc4iK6ZrdfeFpy@R; zolJU5saWpZjwRsCkP4K9M-i46{bOK|H-# zGdS-PM_5T#iO-40O}ZfQBi9v|-#8Z?7IPWeLC zWtH<5XRT6a?R)YUhVuH#GS_L2Ac;jRL4pVcb(B#-4KZ4EQY@rtKjGmYcKi~#6mpfp z$gzMbG{}x0{11M2YZWFZ+@w$f=y|d2k5M4F3$z-x{e5iPtrNii3|#3Qf3*qBe3IVi zXwf4eybWAjcQj=WxZDATo($QP9m!8qC=`JAGy0|+Fn9~}t+~Cm_i_3FWT>mu4RCM> zj1?(+-Q(T8-M#&LrrqBUoK14KSiPIz0000CP)t-s0002TU}Z8b30000PbVXQnLvL+uWo~o; zLvm$dbY)~9cWHEJAV*0}P*;Ht7XSbNGD$>1R0!8&U_b>2KVUXUz%k&;;wB`PJAGaA4y#H_O%9pnpo eGpKG0*3br7_A}+k)D=bC=O+xwQ>e7V-aiNX{Q(jH literal 0 HcmV?d00001 diff --git a/src/level/level4.data.pal b/src/level/level4.data.pal new file mode 100644 index 0000000000000000000000000000000000000000..6d0284228fc6a170f8e59199df6c42bf60dea2c2 GIT binary patch literal 18 acmZQzV6Za@-O-zrK7aq(4U^aHO922lEX>4Tx04R}tkv&MmKpe$i(@I4v9qb_DkfA!+MMVUcT7@E12(?114knj=L6e50 z#l=x@EjakGSaoo5*44pP5ClI!+yy5^7b)?7NufoI2gm(*ckglc4iK6ZrdfeFpy@R; zolJU5saWpZjwRsCkP4K9M-i46{bOK|H-# zGdS-PM_5T#iO-40O}ZfQBi9v|-#8Z?7IPWeLC zWtH<5XRT6a?R)YUhVuH#GS_L2Ac;jRL4pVcb(B#-4KZ4EQY@rtKjGmYcKi~#6mpfp z$gzMbG{}x0{11M2YZWFZ+@w$f=y|d2k5M4F3$z-x{e5iPtrNii3|#3Qf3*qBe3IVi zXwf4eybWAjcQj=WxZDATo($QP9m!8qC=`JAGy0|+Fn9~}t+~Cm_i_3FWT>mu4RCM> zj1?(+-Q(T8-M#&LrrqBUoK14KSiPIz0000IP)t-s0000!G*!5bVrQSft+11>zGR*C z3l0DP010qNS#tmYE+YT{E+YYWr9XB6000McNliru=?n$}01u8oo5%nF02y>eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{002-)L_t&t*JEHn03`o@d e1~W5I8vp=Ynh8c&?czrO000001ONa4 literal 0 HcmV?d00001 diff --git a/src/level/level5.data.pal b/src/level/level5.data.pal new file mode 100644 index 0000000000000000000000000000000000000000..4a3a226d658a7d0f979df49049cc2cbe6a49b475 GIT binary patch literal 24 gcmZQzU^t$baiV7Rj=to~1^X-a<*nP7ws-px0EUJPpa1{> literal 0 HcmV?d00001 diff --git a/src/level/level5.png b/src/level/level5.png new file mode 100644 index 0000000000000000000000000000000000000000..78022e1aebea2f9c01aace88461de578f5b102af GIT binary patch literal 656 zcmV;B0&o3^P)EX>4Tx04R}tkv&MmKpe$i(@I4v9qb_DkfA!+MMVUcT7@E12(?114knj=L6e50 z#l=x@EjakGSaoo5*44pP5ClI!+yy5^7b)?7NufoI2gm(*ckglc4iK6ZrdfeFpy@R; zolJU5saWpZjwRsCkP4K9M-i46{bOK|H-# zGdS-PM_5T#iO-40O}ZfQBi9v|-#8Z?7IPWeLC zWtH<5XRT6a?R)YUhVuH#GS_L2Ac;jRL4pVcb(B#-4KZ4EQY@rtKjGmYcKi~#6mpfp z$gzMbG{}x0{11M2YZWFZ+@w$f=y|d2k5M4F3$z-x{e5iPtrNii3|#3Qf3*qBe3IVi zXwf4eybWAjcQj=WxZDATo($QP9m!8qC=`JAGy0|+Fn9~}t+~Cm_i_3FWT>mu4RCM> zj1?(+-Q(T8-M#&LrrqBUoK14KSiPIz0000OP)t-s0002TVQ9#FtGJG1X`sJ(zHY9* zX1%w>lbZE-nsWn%Nj?Pntmh qkYr^@GX-balls_launched == 0) { + if (state->intro_shown == 0) { vec3 base_color = vec3(1, 1, 1); glUniform3fv(uniform_base_color, 1, &base_color[0]); render_text(plane_mesh, @@ -377,7 +377,7 @@ void render_font(struct mesh plane_mesh, aspect, a, s, r); } else if (state->remaining <= 0) { - if (1) { + if (state->level_ix == 0) { vec3 base_color = vec3(1, 0.1, 0.1); glUniform3fv(uniform_base_color, 1, &base_color[0]); render_text(plane_mesh, diff --git a/src/update.cpp b/src/update.cpp index 64bd41e..57b30b2 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -9,6 +9,47 @@ #include "level/level1.data.h" #include "level/level1.data.pal.h" +#include "level/level2.data.h" +#include "level/level2.data.pal.h" + +#include "level/level3.data.h" +#include "level/level3.data.pal.h" + +#include "level/level4.data.h" +#include "level/level4.data.pal.h" + +#include "level/level5.data.h" +#include "level/level5.data.pal.h" + +struct level { + const char * data_start; + const char * data_pal_start; +}; + +const struct level levels[] = { + { + .data_start = src_level_level1_data_start, + .data_pal_start = src_level_level1_data_pal_start, + }, + { + .data_start = src_level_level2_data_start, + .data_pal_start = src_level_level2_data_pal_start, + }, + { + .data_start = src_level_level3_data_start, + .data_pal_start = src_level_level3_data_pal_start, + }, + { + .data_start = src_level_level4_data_start, + .data_pal_start = src_level_level4_data_pal_start, + }, + { + .data_start = src_level_level5_data_start, + .data_pal_start = src_level_level5_data_pal_start, + } +}; +const int levels_length = (sizeof (levels)) * (sizeof (levels[0])); + #include "math/float_types.hpp" #include "math/transform.hpp" @@ -52,6 +93,7 @@ void launch_ball(struct game_state * state, double time) ball.launch_time = time; state->balls_launched += 1; + state->intro_shown = true; } void reset_level(struct game_state * state) @@ -61,9 +103,9 @@ void reset_level(struct game_state * state) state->start_time = 0.0; - assert(src_level_level1_data_size == 13 * 28); - const uint8_t * level = (const uint8_t *)src_level_level1_data_start; - const uint8_t * pal = (const uint8_t *)src_level_level1_data_pal_start; + //assert(src_level_level2_data_size == 13 * 28); + const uint8_t * level = (const uint8_t *)levels[state->level_ix].data_start; + const uint8_t * pal = (const uint8_t *)levels[state->level_ix].data_pal_start; state->level = level; state->pal = pal; @@ -72,6 +114,12 @@ void reset_level(struct game_state * state) } } +void reset_game(struct game_state * state) +{ + state->level_ix = 0; + reset_level(state); +} + static inline void ball_collision_response(struct ball_state& ball, struct collision_data& cd) { @@ -151,8 +199,31 @@ void update_ball(struct game_state * state, struct ball_state& ball, double time ball.ball_y += ball.ball_dy; } +void update_advance_level(struct game_state * state) +{ + int block_count = 0; + + for (int i = 0; i < 13 * 28; i++) { + char tile = state->level[i]; + if (tile == 0) + continue; + if (state->blocks[i].destroyed_time != 0.0) + continue; + + block_count += 1; + } + + if (block_count < 10) { + state->level_ix = (state->level_ix + 1) % levels_length; + printf("next level %d\n", state->level_ix); + reset_level(state); + } +} + void update(struct game_state * state, double time) { + update_advance_level(state); + if (state->remaining >= 0.0) { for (int i = 0; i < state->balls_launched; i++) { if (state->balls[i].ball_y > 30.0f)