Files
devilutionX/Source/DiabloUI/selok.cpp
T
Gleb Mazovetskiy 41f43ea3f5 Support unpacked MPQs from devilutionx-mpq-tools
https://github.com/diasurgical/devilutionx-mpq-tools produces an unpacked MPQ
with all the graphics converted to CLX and the unused files removed.
This is primarily useful on RAM-constrained platforms, such as PS2,
because it eliminates the MPQ overhead.

Adds a build option to load from such unpacked directories instead of the MPQ.

These directories are searched for in the same locations
where the MPQs would be searched for otherwise.

Example directory layout:

* /usr/local/share/diasurgical/devilutionx/diabdat/ -- unpacked and converted diabdat.mpq
* /usr/local/share/diasurgical/devilutionx/hellfire/ -- unpacked and converted hellfire MPQs (all of them merged into 1 directory)
* /usr/local/share/diasurgical/devilutionx/fonts/ -- unpacked fonts.mpq
* /usr/local/share/diasurgical/devilutionx/pl/ -- unpacked pl.mpq

These directory structure is produced by calling `unpack_and_minify_mpq`
2022-10-11 18:00:57 +01:00

88 lines
2.3 KiB
C++

#include "DiabloUI/selok.h"
#include "DiabloUI/diabloui.h"
#include "control.h"
#include "engine/render/text_render.hpp"
#include "utils/language.h"
#include "utils/utf8.hpp"
namespace devilution {
namespace {
char dialogText[256];
} // namespace
bool selok_endMenu;
std::vector<std::unique_ptr<UiListItem>> vecSelOkDialogItems;
std::vector<std::unique_ptr<UiItemBase>> vecSelOkDialog;
#define MESSAGE_WIDTH 400
void selok_Free()
{
ArtBackground = std::nullopt;
vecSelOkDialogItems.clear();
vecSelOkDialog.clear();
}
void selok_Select(int /*value*/)
{
selok_endMenu = true;
}
void selok_Esc()
{
selok_endMenu = true;
}
void UiSelOkDialog(const char *title, const char *body, bool background)
{
if (!background) {
UiLoadBlackBackground();
} else {
if (!gbIsSpawn) {
LoadBackgroundArt("ui_art\\mainmenu");
} else {
LoadBackgroundArt("ui_art\\swmmenu");
}
}
UiAddBackground(&vecSelOkDialog);
UiAddLogo(&vecSelOkDialog);
const Point uiPosition = GetUIRectangle().position;
if (title != nullptr) {
SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 };
vecSelOkDialog.push_back(std::make_unique<UiArtText>(title, rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3));
SDL_Rect rect2 = { (Sint16)(uiPosition.x + 140), (Sint16)(uiPosition.y + 210), 560, 168 };
vecSelOkDialog.push_back(std::make_unique<UiArtText>(dialogText, rect2, UiFlags::FontSize24 | UiFlags::ColorUiSilver));
} else {
SDL_Rect rect1 = { (Sint16)(uiPosition.x + 140), (Sint16)(uiPosition.y + 197), 560, 168 };
vecSelOkDialog.push_back(std::make_unique<UiArtText>(dialogText, rect1, UiFlags::FontSize24 | UiFlags::ColorUiSilver));
}
vecSelOkDialogItems.push_back(std::make_unique<UiListItem>(_("OK"), 0));
vecSelOkDialog.push_back(std::make_unique<UiList>(vecSelOkDialogItems, 1, uiPosition.x + 230, (uiPosition.y + 390), 180, 35, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold));
CopyUtf8(dialogText, WordWrapString(body, MESSAGE_WIDTH, GameFont24), sizeof(dialogText));
UiInitList(nullptr, selok_Select, selok_Esc, vecSelOkDialog, false);
selok_endMenu = false;
while (!selok_endMenu) {
UiClearScreen();
UiRenderItems(vecSelOkDialog);
UiPollAndRender();
}
selok_Free();
}
} // namespace devilution