Files
ctrff-pub/include/ctrff/smdh.hpp
tobid7 b021609c4c Remove palladium out of ctrff
- Why??? cause ahving multiple diffrent libraries all depending on palladium is pain to handle as well as palladium was only used for its datatypes so theres no reason to kepp it for ctrff
2025-12-06 21:23:59 +01:00

142 lines
3.7 KiB
C++

#pragma once
#include <ctrff/binutil.hpp>
#include <ctrff/helper.hpp>
#include <ctrff/types.hpp>
// Basic Info
// language_slots: 16
// valid_language_slots: 12
// rating_slots: 16
// small_icon: 24
// large_icon = 48
namespace ctrff {
// SMDH Size (Note that this needs to be declared here as
// a sizeof(SMDH) will not return the expected size due to
// use of Serializable)
constexpr ctrff::u32 SMDH_Size = 0x36C0;
struct CTRFF_API SMDH {
SMDH() {
std::fill_n(Magic, ctrff::ArraySize(Magic), 0);
std::fill_n(IconSmall, ctrff::ArraySize(IconSmall), 0);
std::fill_n(IconLarge, ctrff::ArraySize(IconLarge), 0);
}
~SMDH() = default;
static SMDH Default();
PD_SHARED(SMDH);
enum Language {
Language_Japanese,
Language_English,
Language_French,
Language_German,
Language_Italian,
Language_Spanish,
Language_Chinese_Simplified,
Language_Korean,
Language_Dutch,
Language_Portuguese,
Language_Russian,
Language_Chinese_Traditional,
// To Overrite Aall Languages
// returns japanese on get funcs
Language_All = 0x47,
};
enum Rating {
Rating_CERO = 0,
Rating_ESRB = 1,
Rating_USK = 3,
Rating_PEGI_GEN = 4,
Rating_PEGI_PTR = 6,
Rating_PEGI_BBFC = 7,
Rating_COB = 8,
Rating_GRB = 9,
Rating_CGSRR = 10,
};
enum Region {
Region_JAPAN = 1 << 0,
Region_NORTH_AMERICA = 1 << 1,
Region_EUROPE = 1 << 2,
Region_AUSTRALIA = 1 << 3,
Region_CHINA = 1 << 4,
Region_KOREA = 1 << 5,
Region_TAIWAN = 1 << 6,
// Not a bitmask, but a value.
Region_FREE = 0x7FFFFFFF,
};
enum Flag {
Flag_VISIBLE = 1 << 0,
Flag_AUTO_BOOT = 1 << 1,
Flag_ALLOW_3D = 1 << 2,
Flag_REQUIRE_EULA = 1 << 3,
Flag_AUTO_SAVE_ON_EXIT = 1 << 4,
Flag_USE_EXTENDED_BANNER = 1 << 5,
Flag_RATING_REQUIED = 1 << 6,
Flag_USE_SAVE_DATA = 1 << 7,
Flag_RECORD_USAGE = 1 << 8,
Flag_DISABLE_SAVE_BACKUPS = 1 << 10,
Flag_NEW_3DS = 1 << 12,
Flag_DEFAULT = Flag_VISIBLE | Flag_ALLOW_3D | Flag_RECORD_USAGE,
};
void Load(const std::string &path) {
std::fstream f(path, std::ios::in | std::ios::binary);
Read(f);
f.close();
}
void Save(const std::string &path) {
std::fstream f(path, std::ios::out | std::ios::binary);
Write(f);
f.close();
}
void Write(std::fstream &f) const;
void Read(std::fstream &f);
void SetIcon(const std::vector<ctrff::u8> &buf);
std::vector<ctrff::u8> GetIcon();
void SetShortTitle(const std::string &t, Language l = Language_All);
void SetLongTitle(const std::string &t, Language l = Language_All);
void SetAuthor(const std::string &t, Language l = Language_All);
std::string GetShortTitle(Language l = Language_All);
std::string GetLongTitle(Language l = Language_All);
std::string GetAuthor(Language l = Language_All);
struct CTRFF_API Title {
Title() {
std::fill_n(ShortTitle, ctrff::ArraySize(ShortTitle), 0);
std::fill_n(LongTitle, ctrff::ArraySize(LongTitle), 0);
std::fill_n(Author, ctrff::ArraySize(Author), 0);
};
ctrff::u16 ShortTitle[0x40];
ctrff::u16 LongTitle[0x80];
ctrff::u16 Author[0x40];
};
struct CTRFF_API Settings {
Settings() { std::fill_n(Ratings, ctrff::ArraySize(Ratings), 0); };
ctrff::u8 Ratings[16];
ctrff::u32 RegionLock = 0;
ctrff::u32 MatchmakerID = 0;
ctrff::u64 MatchmakerBitID = 0;
ctrff::u32 Flags = 0;
ctrff::u16 EulaVersion = 0;
ctrff::u16 Reserved = 0;
ctrff::u32 OptimalBannerFrame = 0;
ctrff::u32 StreetpassID = 0;
};
char Magic[4];
ctrff::u16 Version = 0;
ctrff::u16 Reserved = 0;
Title Titles[16];
Settings Settings;
ctrff::u64 Reserved1 = 0;
ctrff::u16 IconSmall[0x240]; // 24x24
ctrff::u16 IconLarge[0x900]; // 48x48
};
} // namespace ctrff