From a53942249c82ae8c17bd2f89271430b16a0f9412 Mon Sep 17 00:00:00 2001 From: "A.M. Rowsell" Date: Thu, 9 Apr 2026 23:59:13 -0400 Subject: [PATCH] font: extensive tweaks, looks much better --- assets/fonts/Tomorrow_Night.ttf | Bin 0 -> 399403 bytes src/main.c | 2 +- src/render.c | 45 ++++++++++++++++++-------------- src/settings.h | 11 ++++++++ 4 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 assets/fonts/Tomorrow_Night.ttf diff --git a/assets/fonts/Tomorrow_Night.ttf b/assets/fonts/Tomorrow_Night.ttf new file mode 100644 index 0000000000000000000000000000000000000000..204c2f62fa1da8f9454b17c762a65fb43c57280e GIT binary patch literal 399403 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index 030fa6d..4db5160 100644 --- a/src/main.c +++ b/src/main.c @@ -508,7 +508,7 @@ static void game_loop(void) { // sound load_audio_assets(&gs); // font - Font fontTTF = LoadFontEx("./assets/fonts/Royal_Decree_Bold.ttf", 14, 0, 250); + Font fontTTF = LoadFontEx("./assets/fonts/Tomorrow_Night.ttf", 24, NULL, 0); // Initialize first floor rng_seed(12345); init_floor(&gs, 1); diff --git a/src/render.c b/src/render.c index 9d5571f..3868474 100644 --- a/src/render.c +++ b/src/render.c @@ -153,7 +153,7 @@ void render_ui(const Player *p, Font *font) { int bar_height = 16; // HP Label, above bar - DrawTextEx(*font, "HP", (Vector2){bar_x, bar_y - 11}, 14, NAR_CHAR_SPACE, text_dim); + DrawTextEx(*font, "HP", (Vector2){bar_x, bar_y - 17}, BIG_FONT, NAR_CHAR_SPACE, text_dim); // HP Bar background DrawRectangle(bar_x, bar_y, bar_width, bar_height, (Color){20, 15, 15, 255}); @@ -179,7 +179,8 @@ void render_ui(const Player *p, Font *font) { char hp_text[32]; snprintf(hp_text, sizeof(hp_text), "%d/%d", p->hp, p->max_hp); int hp_text_w = MeasureText(hp_text, 12); - DrawTextEx(*font, hp_text, (Vector2){bar_x + (bar_width - hp_text_w) / 2.0f, bar_y + 2}, 12, NAR_CHAR_SPACE, WHITE); + DrawTextEx(*font, hp_text, (Vector2){bar_x + (bar_width - hp_text_w) / 2.0f, bar_y + 2}, MEDIUM_FONT, + SMALL_CHAR_SPACE, WHITE); // Status effects int effect_x = bar_x; @@ -214,7 +215,7 @@ void render_ui(const Player *p, Font *font) { if (p->effects[i].duration > 0) { char eff_text[16]; snprintf(eff_text, sizeof(eff_text), "%s%d", eff_label, p->effects[i].duration); - DrawTextEx(*font, eff_text, (Vector2){effect_x, effect_y}, 9, NAR_CHAR_SPACE, eff_color); + DrawTextEx(*font, eff_text, (Vector2){effect_x, effect_y}, SMALL_FONT, NAR_CHAR_SPACE, eff_color); effect_x += 28; } } @@ -246,7 +247,7 @@ void render_ui(const Player *p, Font *font) { int equip_y = hud_y + 8; // Weapon slot - DrawTextEx(*font, "WEAPON", (Vector2){equip_x, equip_y}, 12, NAR_CHAR_SPACE, text_dim); + DrawTextEx(*font, "WEAPON", (Vector2){equip_x, equip_y}, MEDIUM_FONT, NAR_CHAR_SPACE, text_dim); if (p->has_weapon) { const char *weapon_name = item_get_name(&p->equipped_weapon); if (weapon_name) { @@ -260,7 +261,7 @@ void render_ui(const Player *p, Font *font) { } // Armor slot - DrawTextEx(*font, "ARMOR", (Vector2){equip_x, equip_y + 26}, 9, NAR_CHAR_SPACE, text_dim); + DrawTextEx(*font, "ARMOR", (Vector2){equip_x, equip_y + 26}, MEDIUM_FONT, NAR_CHAR_SPACE, text_dim); if (p->has_armor) { const char *armor_name = item_get_name(&p->equipped_armor); if (armor_name) { @@ -275,9 +276,9 @@ void render_ui(const Player *p, Font *font) { int ctrl_x = section3_end + 20; int ctrl_y = hud_y + 14; - DrawTextEx(*font, "[WASD] Move [G] Pickup [I] Inventory [U] Use", (Vector2){ctrl_x, ctrl_y}, 11, - NORM_CHAR_SPACE, (Color){139, 119, 89, 255}); - DrawTextEx(*font, "[E] Equip [D] Drop [Q] Quit", (Vector2){ctrl_x, ctrl_y + 16}, 11, NORM_CHAR_SPACE, + DrawTextEx(*font, "[WASD] Move [G] Pickup [I] Inventory [U] Use", (Vector2){ctrl_x, ctrl_y}, MEDIUM_FONT, + MED_CHAR_SPACE, (Color){139, 119, 89, 255}); + DrawTextEx(*font, "[E] Equip [D] Drop [Q] Quit", (Vector2){ctrl_x, ctrl_y + 16}, MEDIUM_FONT, MED_CHAR_SPACE, (Color){139, 119, 89, 255}); // INV count in top-right corner of HUD @@ -309,7 +310,8 @@ void render_action_log(const char log[5][128], int count, int head, Font *font) // Title bar DrawRectangle(log_x + 4, log_y + 4, log_width - 8, 16, (Color){30, 25, 20, 255}); - DrawTextEx(*font, "MESSAGE LOG", (Vector2){log_x + 8, log_y + 6}, 10, NAR_CHAR_SPACE, (Color){180, 160, 130, 255}); + DrawTextEx(*font, "MESSAGE LOG", (Vector2){log_x + 8, log_y + 6}, MEDIUM_FONT, NAR_CHAR_SPACE, + (Color){180, 160, 130, 255}); // Separator line under title DrawLine(log_x + 4, log_y + 22, log_x + log_width - 5, log_y + 22, log_border_dark); @@ -342,7 +344,7 @@ void render_action_log(const char log[5][128], int count, int head, Font *font) void render_inventory_overlay(const Player *p, int selected, Font *font) { // Overlay dimensions int ov_width = 360; - int ov_height = 300; + int ov_height = 320; Rectangle overlay = {(float)(SCREEN_WIDTH - ov_width) / 2, (float)(SCREEN_HEIGHT - ov_height) / 2 - 60, (float)ov_width, (float)ov_height}; DrawRectangleRec(overlay, (Color){12, 12, 12, 252}); @@ -351,13 +353,14 @@ void render_inventory_overlay(const Player *p, int selected, Font *font) { // Title const char *title = "INVENTORY"; int title_w = MeasureText(title, 24); - DrawTextEx(*font, title, (Vector2){overlay.x + (overlay.width - title_w) / 2, overlay.y + 12}, 24, NORM_CHAR_SPACE, - WHITE); + Vector2 t_w = MeasureTextEx(*font, title, 30, NORM_CHAR_SPACE); + DrawTextEx(*font, title, (Vector2){overlay.x + (overlay.width - t_w.x) / 2, overlay.y + 10}, HUGE_FONT, + NORM_CHAR_SPACE, WHITE); // Draw each inventory slot char slot_text[64]; int row_height = 26; - int start_y = overlay.y + 50; + int start_y = overlay.y + 40; for (int i = 0; i < MAX_INVENTORY; i++) { int y_pos = start_y + (i * row_height); @@ -374,14 +377,15 @@ void render_inventory_overlay(const Player *p, int selected, Font *font) { // Slot number snprintf(slot_text, sizeof(slot_text), "%d.", i + 1); - DrawTextEx(*font, slot_text, (Vector2){overlay.x + 16, y_pos + 4}, 14, NORM_CHAR_SPACE, (Color){80, 80, 80, 255}); + DrawTextEx(*font, slot_text, (Vector2){overlay.x + 16, y_pos + 4}, MEDIUM_FONT, SMALL_CHAR_SPACE, + (Color){80, 80, 80, 255}); // Item name const char *name = item_get_name(item); if (name) { Color name_color = (item->type == ITEM_POTION) ? (Color){255, 140, 140, 255} - : (item->type == ITEM_WEAPON) ? (Color){255, 255, 140, 255} - : (Color){140, 140, 255, 255}; + : (item->type == ITEM_WEAPON) ? (Color){255, 255, 140, 255} + : (Color){140, 140, 255, 255}; DrawTextEx(*font, name, (Vector2){overlay.x + 45, y_pos + 4}, 14, NORM_CHAR_SPACE, name_color); } // Power @@ -397,15 +401,16 @@ void render_inventory_overlay(const Player *p, int selected, Font *font) { } else { // Empty slot snprintf(slot_text, sizeof(slot_text), "%d.", i + 1); - DrawTextEx(*font, slot_text, (Vector2){overlay.x + 16, y_pos + 4}, 14, NORM_CHAR_SPACE, (Color){40, 40, 40, 255}); + DrawTextEx(*font, slot_text, (Vector2){overlay.x + 16, y_pos + 4}, MEDIUM_FONT, SMALL_CHAR_SPACE, + (Color){40, 40, 40, 255}); } } // Instructions at bottom const char *hint = "[1-0] Select [E] Equip [U] Use [D] Drop [I/ESC] Close"; - int hint_w = MeasureText(hint, 12); - DrawTextEx(*font, hint, (Vector2){overlay.x + (overlay.width - hint_w) / 2, overlay.y + overlay.height - 22}, 12, - NORM_CHAR_SPACE, (Color){65, 65, 65, 255}); + Vector2 hint_w = MeasureTextEx(*font, hint, NORM_FONT, NAR_CHAR_SPACE); + DrawTextEx(*font, hint, (Vector2){overlay.x + (overlay.width - hint_w.x) / 2, overlay.y + overlay.height - 22}, + NORM_FONT, NAR_CHAR_SPACE, (Color){80, 80, 80, 255}); } static Color label_color(FloatingText *ft, int alpha) { diff --git a/src/settings.h b/src/settings.h index 6d6a2c5..b47591e 100644 --- a/src/settings.h +++ b/src/settings.h @@ -10,7 +10,18 @@ // Font constants #define NORM_CHAR_SPACE 4.0f +#define MED_CHAR_SPACE 2.5f +#define SMALL_CHAR_SPACE 1.6f #define NAR_CHAR_SPACE 1.0f +#define CRAMPED_CHAR_SPACE 0.5f + +#define TINY_FONT 8 +#define SMALL_FONT 10 +#define NORM_FONT 12 +#define MEDIUM_FONT 14 +#define LARGE_FONT 18 +#define BIG_FONT 22 +#define HUGE_FONT 30 // Game Limits #define MAX_ENEMIES 64