From eb03fc9d1d42d45b5c21ff32529ebcf10d600835 Mon Sep 17 00:00:00 2001 From: shweet Date: Thu, 12 Nov 2026 23:26:25 -0500 Subject: [PATCH] Wider taskbar scaled to window, bigger fonts and a cheats button --- MODDING.md | 2 +- resources/common/gfx/ui/icons.anm2 | 29 ++++++++-------- resources/common/gfx/ui/icons.png | Bin 8207 -> 14846 bytes src/ui.cpp | 53 +++++++++++++++++------------ src/ui.h | 13 ++++--- 5 files changed, 56 insertions(+), 41 deletions(-) diff --git a/MODDING.md b/MODDING.md index 726ece3..9ca4191 100644 --- a/MODDING.md +++ b/MODDING.md @@ -32,7 +32,7 @@ There's two folders inside resources; "characters" and "font". "font" is just a font containing the font used in the selection screen. That's literally it. -"common" holds files characters share (sounds, particles, the cursor and so on). Whenever a character names a file, the game looks in the character's folder first, then in "common", so a character can use anything there as is, or replace it by having its own file at the same path. This includes the taskbar's icons, `gfx/ui/icons.anm2`: one region per icon, named after its button (`talk`, `mood`, `spawn`, `autofeed`, `home`, `stats`, `catalog`, `settings`, `help`, plus whatever `icon`s the interaction types name). A character with its own `gfx/ui/icons.anm2` gets its own icons. +"common" holds files characters share (sounds, particles, the cursor and so on). Whenever a character names a file, the game looks in the character's folder first, then in "common", so a character can use anything there as is, or replace it by having its own file at the same path. This includes the taskbar's icons, `gfx/ui/icons.anm2`: one region per icon, named after its button (`talk`, `mood`, `spawn`, `autofeed`, `home`, `stats`, `catalog`, `settings`, `cheats`, `help`, plus whatever `icon`s the interaction types name). A character with its own `gfx/ui/icons.anm2` gets its own icons. EVERYTHING ELSE is stored inside character folders in the "characters" folder; one folder per character, named however you like (the folder name is also the name of its save file). This has all data associated with characters. Think of characters more as tailored game experiences rather than literally being just the characters. Not only is there the character graphics, but backgrounds, items, parameters, etc. These are intensely customizable to suit whatever experience you'd like (within the confines of the engine, of course). diff --git a/resources/common/gfx/ui/icons.anm2 b/resources/common/gfx/ui/icons.anm2 index 8988416..d461948 100644 --- a/resources/common/gfx/ui/icons.anm2 +++ b/resources/common/gfx/ui/icons.anm2 @@ -4,20 +4,21 @@ { "path": "icons.png", "regions": [ - {"name": "talk", "crop": [0, 0], "size": [48, 48], "origin": "center"}, - {"name": "mood", "crop": [49, 0], "size": [48, 48], "origin": "center"}, - {"name": "spawn", "crop": [98, 0], "size": [48, 48], "origin": "center"}, - {"name": "autofeed", "crop": [147, 0], "size": [48, 48], "origin": "center"}, - {"name": "home", "crop": [196, 0], "size": [48, 48], "origin": "center"}, - {"name": "rub", "crop": [245, 0], "size": [48, 48], "origin": "center"}, - {"name": "smack", "crop": [294, 0], "size": [48, 48], "origin": "center"}, - {"name": "kiss", "crop": [343, 0], "size": [48, 48], "origin": "center"}, - {"name": "turn", "crop": [0, 49], "size": [48, 48], "origin": "center"}, - {"name": "stats", "crop": [49, 49], "size": [48, 48], "origin": "center"}, - {"name": "catalog", "crop": [98, 49], "size": [48, 48], "origin": "center"}, - {"name": "settings", "crop": [147, 49], "size": [48, 48], "origin": "center"}, - {"name": "help", "crop": [196, 49], "size": [48, 48], "origin": "center"}, - {"name": "close", "crop": [245, 49], "size": [48, 48], "origin": "center"} + {"name": "talk", "crop": [0, 0], "size": [64, 64], "origin": "center"}, + {"name": "mood", "crop": [65, 0], "size": [64, 64], "origin": "center"}, + {"name": "spawn", "crop": [130, 0], "size": [64, 64], "origin": "center"}, + {"name": "autofeed", "crop": [195, 0], "size": [64, 64], "origin": "center"}, + {"name": "home", "crop": [260, 0], "size": [64, 64], "origin": "center"}, + {"name": "rub", "crop": [325, 0], "size": [64, 64], "origin": "center"}, + {"name": "smack", "crop": [390, 0], "size": [64, 64], "origin": "center"}, + {"name": "kiss", "crop": [455, 0], "size": [64, 64], "origin": "center"}, + {"name": "turn", "crop": [0, 65], "size": [64, 64], "origin": "center"}, + {"name": "stats", "crop": [65, 65], "size": [64, 64], "origin": "center"}, + {"name": "catalog", "crop": [130, 65], "size": [64, 64], "origin": "center"}, + {"name": "settings", "crop": [195, 65], "size": [64, 64], "origin": "center"}, + {"name": "help", "crop": [260, 65], "size": [64, 64], "origin": "center"}, + {"name": "close", "crop": [325, 65], "size": [64, 64], "origin": "center"}, + {"name": "cheats", "crop": [390, 65], "size": [64, 64], "origin": "center"} ] } ], diff --git a/resources/common/gfx/ui/icons.png b/resources/common/gfx/ui/icons.png index 1e84258a9ccebb34a9fdf875d7e90325aea96a7b..65396ec9c1cd2a83f5ca1e73a6737254417f72b9 100644 GIT binary patch literal 14846 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 diff --git a/src/ui.cpp b/src/ui.cpp index 3b0487f..15359a8 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -25,23 +25,25 @@ constexpr float INDICATOR_SIZE = 0.35f; constexpr float INDICATOR_SPEED = 2; constexpr float ITEM_SIZE = 96; constexpr float BAR_WIDTH_MIN = 120; -constexpr float BUTTON_SIZE = 64; +constexpr float BUTTON_SIZE_MAX = 96; +constexpr float BUTTON_SIZE_MIN = 56; constexpr float CATALOG_DIVIDER = 2; constexpr float CATALOG_GRID = 0.55f; constexpr float COOLDOWN_ALPHA = 0.6f; constexpr float COOLDOWN_RADIUS = 0.42f; -constexpr float ICON_SIZE = 48; +constexpr float ICON_FRACTION = 0.7f; constexpr float TOGGLE_FADE_FAR = 220; constexpr float TOGGLE_FADE_NEAR = 60; constexpr float TOGGLE_HEIGHT = 28; constexpr float WINDOW_FIT = 0.9f; constexpr float WINDOW_HEIGHT = 680; constexpr float WINDOW_WIDTH = 1000; +constexpr float TASKBAR_FIT = 0.8f; constexpr int BUTTONS_FIXED = 9; constexpr float INFO_GAP = 4; constexpr int COOLDOWN_SEGMENTS = 48; -constexpr const char* PANEL_ICONS[] = {"", "stats", "catalog", "settings"}; -constexpr const char* PANEL_NAMES[] = {"", "Stats", "Catalog", "Settings"}; +constexpr const char* PANEL_ICONS[] = {"", "stats", "catalog", "settings", "cheats"}; +constexpr const char* PANEL_NAMES[] = {"", "Stats", "Catalog", "Settings", "Cheats"}; constexpr float KG_TO_G = 1000; constexpr float KG_TO_LB = 2.20462f; constexpr float LB_TO_OZ = 16; @@ -56,7 +58,7 @@ constexpr float SLIDE_TIME = 0.125f; constexpr float TEXT_BIG = 1.25f; constexpr float TEXT_HEIGHT_LINES = 5; constexpr float TEXT_SMALL = 0.75f; -constexpr float TEXT_WIDTH = 0.4f; +constexpr float TEXT_WIDTH = 0.5f; constexpr float TOOLTIP_WRAP = 24; constexpr float TRIANGLE_SIZE = 0.22f; constexpr float UNDISCOVERED_ALPHA = 0.5f; @@ -412,10 +414,10 @@ bool Ui::icon_button(const char* icon, const char* tooltip, ButtonState state) if (state == BUTTON_ACTIVE) ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered)); ImGui::BeginDisabled(state == BUTTON_DISABLED); - bool isPressed = is_fx(ImGui::Button("##Icon", {BUTTON_SIZE, BUTTON_SIZE})); + bool isPressed = is_fx(ImGui::Button("##Icon", {buttonSize, buttonSize})); ImVec2 min = ImGui::GetItemRectMin(); - float inset = (BUTTON_SIZE - ICON_SIZE) / 2; - icon_draw(icon, {min.x + inset, min.y + inset}, ICON_SIZE, ImGui::GetColorU32(ImGuiCol_Text)); + float inset = buttonSize * (1 - ICON_FRACTION) / 2; + icon_draw(icon, {min.x + inset, min.y + inset}, buttonSize * ICON_FRACTION, ImGui::GetColorU32(ImGuiCol_Text)); ImGui::EndDisabled(); if (state == BUTTON_ACTIVE) ImGui::PopStyleColor(); @@ -485,12 +487,15 @@ void Ui::taskbar_draw(Play& play, ImVec2 screen) widths[i] = std::max(BAR_WIDTH_MIN, ImGui::CalcTextSize(bars[i].c_str()).x + style.FramePadding.x * 4); used += ImGui::CalcTextSize(labels[i]).x + style.ItemSpacing.x + widths[i]; } - int count = BUTTONS_FIXED + (int)data.interactTypes.size(); + int count = BUTTONS_FIXED + (int)data.interactTypes.size() + play.isCheats; + float spacing = (count - 1) * style.ItemSpacing.x; + buttonSize = std::clamp((screen.x * TASKBAR_FIT - style.WindowPadding.x * 2 - spacing) / count, BUTTON_SIZE_MIN, + BUTTON_SIZE_MAX); float nameWidth = ImGui::CalcTextSize(data.name.c_str()).x; - float rowWidth = count * BUTTON_SIZE + (count - 1) * style.ItemSpacing.x; + float rowWidth = count * buttonSize + spacing; float infoWidth = nameWidth + used + style.ItemSpacing.x * INFO_GAP * std::size(labels); float width = std::max(rowWidth, infoWidth) + style.WindowPadding.x * 2; - float height = style.WindowPadding.y * 2 + ImGui::GetFrameHeight() + style.ItemSpacing.y * 2 + BUTTON_SIZE; + float height = style.WindowPadding.y * 2 + ImGui::GetFrameHeight() + style.ItemSpacing.y * 2 + buttonSize; slide_update(taskbarSlide, play.isTaskbarOpen && !play.text.isScene); float shown = std::pow(taskbarSlide, SLIDE_EASE) * height; float x = (screen.x - width) / 2; @@ -539,14 +544,14 @@ void Ui::taskbar_draw(Play& play, ImVec2 screen) (ImGui::GetContentRegionAvail().x - nameWidth - used) / std::size(labels)); for (int i = 0; i < (int)std::size(labels); i++) { - ImGui::SameLine(0, gap / 2); + ImGui::SameLine(0, gap); if (i > 0) { ImVec2 cursor = ImGui::GetCursorScreenPos(); + cursor.x -= gap / 2; ImGui::GetWindowDrawList()->AddLine(cursor, {cursor.x, cursor.y + ImGui::GetFrameHeight()}, ImGui::GetColorU32(ImGuiCol_Separator)); } - ImGui::SameLine(0, gap / 2); ImGui::AlignTextToFramePadding(); ImGui::TextUnformatted(labels[i]); ImGui::SameLine(); @@ -607,9 +612,11 @@ void Ui::taskbar_draw(Play& play, ImVec2 screen) play.cursorType = i; ImGui::PopID(); } - Panel panels[] = {PANEL_STATS, PANEL_CATALOG, PANEL_SETTINGS}; + Panel panels[] = {PANEL_STATS, PANEL_CATALOG, PANEL_SETTINGS, PANEL_CHEATS}; for (Panel each : panels) { + if (each == PANEL_CHEATS && !play.isCheats) + continue; ImGui::SameLine(); if (icon_button(PANEL_ICONS[each], PANEL_NAMES[each], BUTTON_NORMAL)) window_open(play, each); @@ -781,13 +788,12 @@ void Ui::settings_draw(Settings& settings) ImGui::SetItemTooltip("Go back to the character selection screen.\nProgress will be saved."); } -// The body in full (weight and stage, calories and digestion, totals), and the cheats when unlocked. +// The body in full: weight and stage, calories and digestion, and totals. void Ui::stats_draw(Play& play) { Character& data = *play.character; Body& body = play.body; Stats& stats = body.stats; - Traits& traits = data.traits; bool isMax = body.stage >= (int)data.stages.size(); ImGui::PushFont(nullptr, FONT_HEADER_2); @@ -819,12 +825,15 @@ void Ui::stats_draw(Play& play) ImGui::Text("Total Items Spawned: %i", stats.totalSpawned); ImGui::Text("Total Items Consumed: %i", stats.totalConsumed); ImGui::Text("Total Playtime: %s", playtime_format(stats.playtime).c_str()); - if (!play.isCheats) - return; +} - ImGui::PushFont(nullptr, FONT_HEADER_2); - ImGui::SeparatorText("Cheats"); - ImGui::PopFont(); +// Sliders setting the body's stats directly, unlocked by the cheat code. +void Ui::cheats_draw(Play& play) +{ + Character& data = *play.character; + Body& body = play.body; + Stats& stats = body.stats; + Traits& traits = data.traits; is_fx(ImGui::SliderFloat("Calories", &stats.calories, 0, body.capacity_max_get(), "%0.0f kcal")); is_fx(ImGui::SliderFloat("Capacity", &stats.capacity, traits.capacityMin, traits.capacityMax, "%0.0f kcal")); if (is_fx(ImGui::SliderFloat("Weight", &stats.weight, traits.weight, traits.weightMax, "%0.2f kg"))) @@ -960,6 +969,8 @@ void Ui::window_draw(Play& play, Settings& settings, ImVec2 screen) stats_draw(play); else if (panel == PANEL_CATALOG) catalog_draw(play); + else if (panel == PANEL_CHEATS) + cheats_draw(play); else settings_draw(settings); if (ImGui::IsKeyPressed(ImGuiKey_Escape)) diff --git a/src/ui.h b/src/ui.h index 802f3c2..1683440 100644 --- a/src/ui.h +++ b/src/ui.h @@ -4,10 +4,10 @@ #include "save.h" #include -constexpr float FONT_NORMAL = 26; -constexpr float FONT_HEADER_3 = 30; -constexpr float FONT_HEADER_2 = 34; -constexpr float FONT_DIALOGUE = 32; +constexpr float FONT_NORMAL = 30; +constexpr float FONT_HEADER_3 = 34; +constexpr float FONT_HEADER_2 = 40; +constexpr float FONT_DIALOGUE = 38; class Play; @@ -22,7 +22,8 @@ enum Panel PANEL_NONE, PANEL_STATS, PANEL_CATALOG, - PANEL_SETTINGS + PANEL_SETTINGS, + PANEL_CHEATS }; enum ButtonState @@ -68,6 +69,7 @@ public: Commands* commands = nullptr; Measurement* measurement = nullptr; Renderer* renderer = nullptr; + float buttonSize = 0; float taskbarSlide = 1; int characterIndex = 0; int selectedIndex = -1; @@ -89,6 +91,7 @@ private: void taskbar_draw(Play& play, ImVec2 screen); void window_draw(Play& play, Settings& settings, ImVec2 screen); void stats_draw(Play& play); + void cheats_draw(Play& play); void catalog_draw(Play& play); void settings_draw(Settings& settings); void text_draw(Play& play, ImVec2 screen);