From c1107cf675da2d6bbfac86543336ebe2f2d23cf7 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Wed, 28 Dec 2022 23:48:32 +0100 Subject: [PATCH] core combo mechanic with classy HUD --- CMakeLists.txt | 2 ++ assets-cg/fxconv-metadata.txt | 3 ++ assets-cg/hud.png | Bin 8154 -> 8343 bytes assets-cg/hud_arcade_font.png | Bin 0 -> 1981 bytes assets-cg/hud_arcade_font.xcf | Bin 0 -> 7886 bytes assets-cg/hud_combo.png | Bin 0 -> 758 bytes src/game.c | 12 +++++++ src/game.h | 4 +++ src/render.c | 58 +++++++++++++++++++++++++++++++--- src/render.h | 4 +++ 10 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 assets-cg/hud_arcade_font.png create mode 100644 assets-cg/hud_arcade_font.xcf create mode 100644 assets-cg/hud_combo.png diff --git a/CMakeLists.txt b/CMakeLists.txt index c8b868e..2d3f1af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,9 @@ set(ASSETS assets-cg/menu_title.png # HUD assets-cg/hud.png + assets-cg/hud_arcade_font.png assets-cg/hud_backpack.ase + assets-cg/hud_combo.png assets-cg/hud_delay.png assets-cg/hud_flag.png assets-cg/hud_itemslots.png diff --git a/assets-cg/fxconv-metadata.txt b/assets-cg/fxconv-metadata.txt index f3bde5e..511f6e5 100644 --- a/assets-cg/fxconv-metadata.txt +++ b/assets-cg/fxconv-metadata.txt @@ -15,6 +15,9 @@ hud_backpack.ase: center: 0, 0 next: Idle=Idle, Open=Idle, InventoryOpen=InventoryIdle, InventoryIdle=InventoryIdle, InventoryClose=Idle +hud_arcade_font.png: + profile: p8 + font_rogue.png: type: font name: font_rogue diff --git a/assets-cg/hud.png b/assets-cg/hud.png index b5c8522746973a383539daa1da4041e06e38a6b2..0f087ccbddecc97f4eddfe850ccedbbe9d1ef097 100644 GIT binary patch delta 4668 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 QN&o-=07*qoM6N<$f{)91S^xk5 diff --git a/assets-cg/hud_arcade_font.png b/assets-cg/hud_arcade_font.png new file mode 100644 index 0000000000000000000000000000000000000000..b36350b004d3b35e86eff84d1793cdcbc8c6e0c8 GIT binary patch literal 1981 zcmV;u2SWIXP)EX>4Tx04R}tkv&MmKpe$iTcskE4i*$~2vVKwq9TGztwIqhgj%6h2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCVj!sUBE>hzEl0u6Z503ls?%w0>9pGzPKSqJzF3_yo_V=-EH&1}TGjOG~{nZ9A^GSNW ztwoQ3@HTL9-PYti;Bp5Te9|RDa-;xFf1v=ppV2qvfc{&ccg^jswU5&WAVXcHZh(VB zV5~^l>mKj!>Fn*_Gp+u90R7r>-uX+whX4Qo32;bRa{vGf6951U69E94oEQKA00(qQ zO+^Rh3>+025fg^&s{jB6%Sl8*RA}DqnZIjWR}{xT_u=47jszZRn?MLfqF&>G3(?ZS z_TOMA#Z#A-8j}!WNs}a(U=s|1Qi|6YDIKvqwo9w@F2tk0^zzuQ z>+3D8(mV47Qtql5N}a!SgG|eMn){vsJIt?y+wSL_T)v=m2 zHnwDFcC2roVKr;q{_Yc;e)RMxTq2PWD|2#A?=9nXA)o*4Wr;h4$l)O>%Zx#cFo)NPhT`nWi)@|PNG(ClB)8~GY7AExW{U4Qt7wg5}Qou9uBozC|kz3D84J{U_v z+qK;NDU4fxct~4VT6^&HR=O_AbN|sBESD{)IjCF5;m;4C)uPLhA2aavZjft`3Db|y zbXDqiHTzQ6&3-<y03}L>> zWV>dHj-y+T;2@n0Vb0GpSX_S0hHynF3xk?AG#{+-QJ5>v>O9@BOA&*l+5;wmxa z_|nAHFNfZYE?biT#DLe<1R#iO1RdrI$bijMupEj>BvOk7DCeGmH954t~3?U|oCFet$d*#q8SSlhyMMMBN z7EzAfey~+~*!(l*>iiY4aB>@#F&W zPn@c_IRkuDw`#=h9uo}A~si0~r7lSm{)EIIG#23=(@;4(91vnZ?z(mgkrVvIoyV zabdijQV~(l?B_JCXr(Q5>#%KGZvOgb=Py|Iz6zbre*2)9L2yBP@bp&Li}IWYqqBbr zU&DfBSg;HWmSMs2xdqFOiN{{*O&4;7*{}R)TFU>6J(1rZly%ZARe2W=vSf@O9u4N}6*^T*XMhu(~C?2LNB)OSWh$y9>8 zGIXYY!P3~dY{UXgXRQT`{KH1@b`nQm#tGs9D=yc z;%dxn2NqXjMn3g^-{n$$#d%(y&y8ykp6-I>unRLRScV15uwWUs3$%X#wKFMW#cGYs P00000NkvXXu0mjfB01aW literal 0 HcmV?d00001 diff --git a/assets-cg/hud_arcade_font.xcf b/assets-cg/hud_arcade_font.xcf new file mode 100644 index 0000000000000000000000000000000000000000..00f6c5f78a2261ee331f6ce26c214d63742fcfff GIT binary patch literal 7886 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 z&Z?T=4wave_number = 0; g->wave_spawned = 0; g->wave_left = NULL; + g->combo = 0; + g->combo_health = fix(0); g->hud_xp_anim.frame = anims_hud_xp_Idle.start[0]; g->hud_xp_anim.elapsed = 0; @@ -293,6 +295,10 @@ void game_remove_dead_entities(game_t *g) g->hud_xp_anim.elapsed = 0; } + /* Update player combo */ + g->combo++; + g->combo_health = fix(1); + entity_mark_to_delete(e); } } @@ -465,6 +471,12 @@ void game_update_effects(game_t *g, fixed_t dt) f->invulnerability_delay = max(f->invulnerability_delay - dt, fix(0)); f->speed_delay = max(f->speed_delay - dt, fix(0)); } + + g->combo_health -= dt / 5; + if(g->combo_health <= 0) { + g->combo_health = 0; + g->combo = 0; + } } void game_update_aoes(game_t *g, fixed_t dt) diff --git a/src/game.h b/src/game.h index 4024a5b..2e2d8c6 100644 --- a/src/game.h +++ b/src/game.h @@ -49,6 +49,10 @@ typedef struct game { int wave_number; int wave_spawned; uint8_t *wave_left; + /* Current combo score and its health (measured between 0 and 1, decreases + at a variable rate) */ + int combo; + fixed_t combo_health; /* XP bar animation */ anim_state_t hud_xp_anim; diff --git a/src/render.c b/src/render.c index 3d2e604..5af5e9f 100644 --- a/src/render.c +++ b/src/render.c @@ -473,6 +473,50 @@ int render_small_text(int x, int y, int color, char const *text, int size) return 0; } +static int render_arcade_char_size(int c) +{ + if(c < '0' || c > '9') + return 0; + return 7 - (c == '1' || c == '7') + (c == '4'); +} + +int render_arcade_dsize(int value) +{ + char str[16]; + sprintf(str, "%d", value); + + int pixels = 0; + for(int i = 0; str[i]; i++) + pixels += render_arcade_char_size(str[i]); + return pixels; + + return pixels; +} + +void render_arcade(int x, int y, int halign, int value, int color_style) +{ + extern bopti_image_t img_hud_arcade_font; + int w = render_arcade_dsize(value); + if(halign == DTEXT_RIGHT) + x -= w; + else if(halign == DTEXT_CENTER) + x -= (w >> 1); + + /* Auto style based on the number of digits */ + if(color_style < 0) + color_style = (value >= 10) + (value >= 100); + + char str[16]; + sprintf(str, "%d", value); + + for(int i = 0; str[i]; i++) { + int w = render_arcade_char_size(str[i]); + dsubimage(x, y, &img_hud_arcade_font, 1 + 9 * (str[i] - '0'), + 1 + 9 * color_style, w, 8, DIMAGE_NONE); + x += w; + } +} + static void print_stat_opt(int x, int y, int stat, int reference, char const *format, ...) { @@ -596,10 +640,8 @@ void render_game(game_t const *g, bool show_hitboxes) extern font_t font_hud; player_data_t *player_data = player_f->player; dfont(&font_hud); - dprint_opt(164, HUD_Y - 5, RGB24(0x15171a), C_NONE, DTEXT_CENTER, - DTEXT_TOP, "%d", player_data->xp_level); - dprint_opt(164, HUD_Y - 6, RGB24(0xabb1ba), C_NONE, DTEXT_CENTER, - DTEXT_TOP, "%d", player_data->xp_level); + dprint(167, HUD_Y - 5, RGB24(0x15171a), "%d", player_data->xp_level); + dprint(167, HUD_Y - 6, RGB24(0xabb1ba), "%d", player_data->xp_level); dfont(&font_rogue); /* Render life bar */ @@ -656,6 +698,14 @@ void render_game(game_t const *g, bool show_hitboxes) /* Render backpack icon */ anim_frame_render(skill_x(5)+2, HUD_Y-33+2, g->hud_backpack_anim.frame); + /* Render combo score */ + extern bopti_image_t img_hud_combo; + fill_height = fround(img_hud_combo.height * g->combo_health); + dsubimage(224, HUD_Y - 9 - fill_height, &img_hud_combo, + 0, img_hud_combo.height - fill_height, img_hud_combo.width, + fill_height, DIMAGE_NONE); + render_arcade(234, HUD_Y-25, DTEXT_CENTER, g->combo, -1); + if(g->menu_time > 0) { int x1 = cubic(-130, 0, g->menu_time, fix(1)); int x2 = DWIDTH - 130 - x1; diff --git a/src/render.h b/src/render.h index 64eec65..14bb471 100644 --- a/src/render.h +++ b/src/render.h @@ -74,3 +74,7 @@ void render_pfg_all2one(pfg_all2one_t const *paths, camera_t const *c, /* Render one of some predefined short strings using an image. */ int render_small_text(int x, int y, int color, char const *text, int size); + +/* Colored arcade font. */ +int render_arcade_dsize(int value); +void render_arcade(int x, int y, int halign, int value, int color_style);