From 32c81f277e6d5b507b87a8e377912315bd64ce24 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Aug 2025 23:20:32 -0400 Subject: [PATCH] Use fmtlib for job bank and scenario picker descriptions. --- src/game/boe.dlgutil.cpp | 42 +++++++++++++++++++++++++-------------- src/scenario/scenario.hpp | 3 +++ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/game/boe.dlgutil.cpp b/src/game/boe.dlgutil.cpp index 67368ece..c99ba072 100644 --- a/src/game/boe.dlgutil.cpp +++ b/src/game/boe.dlgutil.cpp @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #include "boe.global.hpp" @@ -772,15 +775,15 @@ static void fill_job_bank(cDialog& me, job_bank_t& bank, std::string) { std::string id = std::to_string(i + 1); if(bank.jobs[i] >= 0 && bank.jobs[i] < univ.scenario.quests.size()) { cQuest& quest = univ.scenario.quests[bank.jobs[i]]; - std::string description = quest.descr; + std::vector lines{quest.descr}; if(quest.deadline > 0) { if(quest.deadline_is_relative) - description += " Must be completed in " + std::to_string(quest.deadline) + " days."; - else description += " Must be completed by day " + std::to_string(quest.deadline) + "."; + lines.push_back(fmt::format("Must be completed in {} days.", quest.deadline)); + else lines.push_back(fmt::format("Must be completed by day {}.", quest.deadline)); } - description += " Pay is " + std::to_string(quest.gold) + " gold."; + lines.push_back(fmt::format("Pay is {} gold.", quest.gold)); me["take" + id].show(); - me["job" + id].setText(description); + me["job" + id].setText(fmt::format("{}", fmt::join(lines, " "))); } else { me["take" + id].hide(); me["job" + id].setText(""); @@ -1736,6 +1739,13 @@ void tip_of_day() { } +static const auto scen_descr_tmpl = FMT_COMPILE("" + "{name} v{version_major}.{version_minor}.{version_patch} - |" + " Difficulty: {difficulty}, Rating: {rating} |" + "{teaser1}|" + "{teaser2}" +); + class cChooseScenario { cDialog me{*ResMgr::dialogs.get("pick-scenario")}; std::vector scen_headers; @@ -1755,16 +1765,18 @@ class cChooseScenario { if(scen_headers.size() > (page * 3 + i)) { me["pic" + n].show(); dynamic_cast(me["pic" + n]).setPict(scen_headers[page * 3 + i].intro_pic); - clear_sstr(sout); - sout << scen_headers[page * 3 + i].name; - sout << " v" << int(scen_headers[page * 3 + i].ver[0]); - sout << '.' << int(scen_headers[page * 3 + i].ver[1]); - sout << '.' << int(scen_headers[page * 3 + i].ver[2]); - sout << " - | Difficulty: " << difficulty[scen_headers[page * 3 + i].difficulty]; - sout << ", Rating: " << scen_headers[page * 3 + i].rating; - sout << " |" << scen_headers[page * 3 + i].teaser1; - sout << " |" << scen_headers[page * 3 + i].teaser2; - me["desc" + n].setText(sout.str()); + auto& header = scen_headers[page * 3 + i]; + std::string description = fmt::format(scen_descr_tmpl, + fmt::arg("name", header.name), + fmt::arg("version_major", header.ver[0]), + fmt::arg("version_minor", header.ver[1]), + fmt::arg("version_patch", header.ver[2]), + fmt::arg("difficuly", difficulty[header.difficulty]), + fmt::arg("rating", header.rating), + fmt::arg("teaser1", header.teaser1), + fmt::arg("teaser2", header.teaser2) + ); + me["desc" + n].setText(description); me["start" + n].show(); } else { me["pic" + n].hide(); diff --git a/src/scenario/scenario.hpp b/src/scenario/scenario.hpp index b61ca6ef..d52585b2 100644 --- a/src/scenario/scenario.hpp +++ b/src/scenario/scenario.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "monster.hpp" // For reasons unknown, putting terrain above monster breaks the tests build in MSVC 2013 #include "terrain.hpp" @@ -39,6 +40,8 @@ struct scenario_header_flags { enum eContentRating {G, PG, R, NC17}; +template<> struct fmt::formatter : ostream_formatter {}; + // Used for finding town entrances in the outdoors struct town_entrance_t { location out_sec;