From 2094618c018decffd20b69d280e07511be004f32 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 15 Mar 2022 20:44:58 +0000 Subject: [PATCH] better timeline + turn lv1 on its head in 1 block --- CMakeLists.txt | 4 +- assets-cg/hud_delay.png | Bin 0 -> 162 bytes assets-cg/hud_event.png | Bin 305 -> 0 bytes assets-cg/hud_flag.png | Bin 0 -> 177 bytes assets-cg/levels/lv1.tmx | 4 +- src/level.c | 11 +++++ src/level.h | 3 ++ src/render.c | 94 +++++++++++++++++++++++---------------- 8 files changed, 74 insertions(+), 42 deletions(-) create mode 100644 assets-cg/hud_delay.png delete mode 100644 assets-cg/hud_event.png create mode 100644 assets-cg/hud_flag.png create mode 100644 src/level.c diff --git a/CMakeLists.txt b/CMakeLists.txt index ee2f999..2714848 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ set(SOURCES src/game.c src/geometry.c src/item.c + src/level.c src/main.c src/map.c src/menu.c @@ -51,7 +52,8 @@ set(ASSETS assets-cg/menu_arrows.png # HUD assets-cg/hud.png - assets-cg/hud_event.png + assets-cg/hud_delay.png + assets-cg/hud_flag.png assets-cg/hud_life.png assets-cg/hud_stars.png assets-cg/hud_window.png diff --git a/assets-cg/hud_delay.png b/assets-cg/hud_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6e69e5efa0deaddb44ce16969a6476aebc6556 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}F`h1tAsQ2> zPCCeYK!Jz3c*XDaHGdsMgIEp;@i)(%!4SA$mgRvXt2fL!{=xs4-oLP?nfg(^B~HO> z4Z|3mzTR-`wP{aRmziojtu5B2YU^X$D-1j4UHW?XZ_%86$GG>VI{b^5JLCnlhr!d; K&t;ucLK6TAq&xNi literal 0 HcmV?d00001 diff --git a/assets-cg/hud_event.png b/assets-cg/hud_event.png deleted file mode 100644 index aa95b9e9ca532478399df73dd8df73313e55b2ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmV-10nYx3P)Px#>q$gGR7i=KtQ6dA2wjn=lv3RzMYF9I8wOQ_2Kzo0O8&*ByeMztic#X*AH6=4!mDL zsfxtFx_-f!2DGl@7$g>{qfeExWLlu?9soe8DjTl^;M@LG$dmwkB$VBwkbz8zPN+7& zBxH5{uu0D4J1YdYFCj<#B~~Ax&C@9U<3)riaEt*N$ds428FVlZ zf+J1A+BO??G{CuxDXaKHLX|>k(X+1ak074Wrqef+V31#GW00000NkvXXu0mjf Dt`L8N diff --git a/assets-cg/hud_flag.png b/assets-cg/hud_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..6424724e69cd25dcbe424fbd97b67cebf9d4340e GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>$@X+{43U_c zoZ`Ur9|-!-q^G2$v}}x=pgKS0sKV;zY#=u!#WCzd?RQU+R)dcqMd^P)event_count; i++) + wave_count += (lv->events[i].type == LEVEL_EVENT_WAVE); + + return wave_count; +} diff --git a/src/level.h b/src/level.h index f605e80..8b3069d 100644 --- a/src/level.h +++ b/src/level.h @@ -74,6 +74,9 @@ typedef struct { } level_t; +/* Get the number of waves in a level */ +int level_wave_count(level_t const *lv); + /* List of levels */ extern level_t level_lv1; extern level_t level_lv2; diff --git a/src/render.c b/src/render.c index 1c5cfc8..22a115f 100644 --- a/src/render.c +++ b/src/render.c @@ -297,19 +297,27 @@ static void render_entities(game_t const *g, camera_t const *camera, free(rendering_order); } -static void render_info_wave(int x0, int y0, level_event_t const *event, int w) +static int render_info_delay(int x, int y, level_event_t const *event) +{ + extern bopti_image_t img_hud_delay; + dimage(x, y, &img_hud_delay); + return img_hud_delay.width; +} + +static int render_info_wave(int x, int y, level_event_t const *event, + uint8_t *wave_left) { level_wave_t const *wave = event->wave; - - int x = x0 + 5; - int y = y0 + 8; + int x0 = x; + y += 4; for(int i = 0; i < wave->entry_count; i++) { enemy_t const *enemy = enemy_data(wave->entries[i].identity); - int amount = wave->entries[i].amount; + int amount_total = wave->entries[i].amount; + int amount = wave_left ? wave_left[i] : amount_total; int text_w; - font_damage_size(amount, &text_w, NULL); + font_damage_size(amount_total, &text_w, NULL); anim_frame_t *frame = enemy->anim_idle->start[0]; dsubimage(x, y - frame->h / 2, frame->sheet, @@ -319,50 +327,58 @@ static void render_info_wave(int x0, int y0, level_event_t const *event, int w) x += frame->w - 6 + text_w; } + + return x-x0; } -static void render_info_item(int x, int y, level_event_t const *event, int w) +static int render_info_item(int x, int y, level_event_t const *event) { - dprint(x, y+3, C_WHITE, "Item"); + int w; + dsize("Item", NULL, &w, NULL); + + dprint(x, y, C_WHITE, "Item"); + return w; } -static void render_info_bg(int x, int y, int w) +static void render_info(int x, int y, game_t const *g) { - extern bopti_image_t img_hud_event; - int h = img_hud_event.height; + if(!g->level) + return; - dsubimage(x, y, &img_hud_event, 0, 0, 8, h, DIMAGE_NONE); - x += 8; w -= 8; + int intro_w; + char str[32]; + snprintf(str, 32, "Wave %d", level_wave_count(g->level)); + dsize(str, NULL, &intro_w, NULL); + snprintf(str, 32, "Wave %d", g->wave_number); + dtext(x+8, y-1, C_WHITE, str); + x += intro_w + 20; - while(w >= 24) { - dsubimage(x, y, &img_hud_event, 8, 0, 16, h, DIMAGE_NONE); - x += 16; w -= 16; - } + int sep_w; + dsize(">", NULL, &sep_w, NULL); - dsubimage(x, y, &img_hud_event, 32-w, 0, w, h, DIMAGE_NONE); -} + for(int i = g->event; i <= g->level->event_count && x <= DWIDTH; i++) { + if(i == g->level->event_count) { + extern bopti_image_t img_hud_flag; + dimage(x+1, y, &img_hud_flag); -static void render_info(int y, game_t const *g) -{ - int const PX_PER_SECOND = 12; - - int x = fround(-g->time_total * PX_PER_SECOND); - - for(int i = 0; i < g->level->event_count && x <= DWIDTH; i++) { - level_event_t const *event = &g->level->events[i]; - int w = fround(event->duration * PX_PER_SECOND); - - if(i > g->event && x + w > 0) { - if(event->type != LEVEL_EVENT_DELAY) - render_info_bg(x, y, w); - - if(event->type == LEVEL_EVENT_WAVE) - render_info_wave(x, y, event, w); - if(event->type == LEVEL_EVENT_ITEM) - render_info_item(x, y, event, w); + // TODO: If victory reached, write "Victory!" + break; } - x += w; + level_event_t const *event = &g->level->events[i]; + + if(event->type == LEVEL_EVENT_DELAY) + x += render_info_delay(x, y, event); + if(event->type == LEVEL_EVENT_WAVE) { + uint8_t *wave_left = (i == g->event) ? g->wave_left : NULL; + x += render_info_wave(x, y, event, wave_left); + } + if(event->type == LEVEL_EVENT_ITEM) + x += render_info_item(x, y, event); + + x += 12; + dprint(x, y, C_WHITE, ">"); + x += sep_w + 12; } } @@ -459,7 +475,7 @@ void render_game(game_t const *g, bool show_hitboxes) int HEADER_Y = cubic(-15, 2, gui_time, MAX_GUI_TIME); /* Render wave information */ - render_info(HEADER_Y, g); + render_info(0, HEADER_Y, g); /* Render HUD */ extern bopti_image_t img_hud;