NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_message.cpp
1#include <game/bases/d_message.hpp>
2#include <game/bases/d_game_com.hpp>
3#include <egg/core/eggArchive.h>
4#include <wchar.h>
5
6static dMessage_c l_dMessage_obj;
7
8dMessage_c::dMessage_c() : mpFileData(nullptr), mpMsgRes(nullptr) {}
9
13
14bool dMessage_c::create(EGG::Heap *heap) {
15 char path[100];
16 if (l_dMessage_obj.mpFileData == nullptr) {
17 dGameCom::AreaLanguageFolder("Message/Message.arc", path);
18
19 void *buffer = l_dMessage_obj.mLoader.request(path, 0, heap);
20 if (buffer == nullptr) {
21 return false;
22 }
23
24 EGG::Archive *archive = EGG::Archive::mount(buffer, heap, 4);
25 EGG::Archive::FileInfo fileInfo;
26 l_dMessage_obj.mpFileData = archive->getFile("wii_mj2d.bmg", &fileInfo);
27 l_dMessage_obj.buildMsgRes(heap);
28 }
29
30 return true;
31}
32
33void dMessage_c::buildMsgRes(EGG::Heap *heap) {
34 mpMsgRes = new (heap, 4) MsgRes_c(mpFileData, nullptr);
35}
36
37wchar_t *dMessage_c::getMsg(ulong messageGroup, ulong messageID) {
38 return l_dMessage_obj.mpMsgRes->getMsg(messageGroup, messageID);
39}
40
42 return l_dMessage_obj.mpMsgRes;
43}
44
45void dMessage_c::numToString(int num, wchar_t *dst, size_t writeLimit, int digitCount, int suppressLeadingZero) {
46 size_t count = 0;
47 int digitPos = digitCount - 1;
48 bool skipOverZeros = suppressLeadingZero == 1;
49
50 while (digitPos >= 0) {
51 int pow10 = 1;
52 for (int exp = 0; exp < digitPos; exp++) {
53 pow10 *= 10;
54 }
55
56 int digit = (num % (pow10 * 10)) / pow10;
57
58 if (digit == 0 && skipOverZeros && digitPos != 0) {
59 dst[count] = L' ';
60 } else {
61 dst[count] = L'0' + digit;
62 skipOverZeros = false;
63 }
64
65 count++;
66 digitPos--;
67 if (writeLimit <= count) {
68 break;
69 }
70 }
71
72 dst[count] = L'\0';
73}
74
75void dMessage_c::numToFullWidth(int num, wchar_t *dst, size_t writeLimit, int digitCount, int suppressLeadingZero) {
76 numToString(num, dst, writeLimit, digitCount, suppressLeadingZero);
78}
79
80void dMessage_c::changetoFullSize(wchar_t *str) {
81 size_t len = wcslen(str);
82 for (size_t i = 0; i < len; i++) {
83 if (str[i] == L' ') {
84 str[i] = 0x3000;
85 } else if (0x21 <= str[i] && str[i] <= 0x7E) {
86 str[i] = 0xFEE0 + str[i];
87 }
88 }
89}
A simple wrapper around EGG::MsgRes.
Definition d_msg_res.hpp:8
Helper class for managing message resources.
Definition d_message.hpp:8
static void numToString(int num, wchar_t *dst, size_t writeLimit, int digitCount, int suppressLeadingZero)
Writes num into dst with digitCount decimal digits, replacing suppressed leading zeros with spaces....
Definition d_message.cpp:45
static wchar_t * getMsg(ulong messageGroup, ulong messageID)
Gets a message from the group number and ID.
Definition d_message.cpp:37
MsgRes_c * mpMsgRes
The message resource instance used to retrieve messages.
Definition d_message.hpp:43
void buildMsgRes(EGG::Heap *heap)
Creates a new MsgRes_c instance from the loaded message resource file.
Definition d_message.cpp:33
static MsgRes_c * getMesRes()
Gets the MsgRes_c instance used.
Definition d_message.cpp:41
~dMessage_c()
Destroys the dMessage_c instance.
Definition d_message.cpp:10
void * mpFileData
The raw message resource file data.
Definition d_message.hpp:42
static void numToFullWidth(int num, wchar_t *dst, size_t writeLimit, int digitCount, int suppressLeadingZero)
Same as numToString, but uses full-width characters.
Definition d_message.cpp:75
static void changetoFullSize(wchar_t *str)
Converts regular ASCII characters in str to full-width characters.
Definition d_message.cpp:80
dMessage_c()
Constructs a new dMessage_c instance.
Definition d_message.cpp:8
static bool create(EGG::Heap *heap)
Loads the message resource file from disk and initializes it.
Definition d_message.cpp:14