cfg: use a default subregion based on the country
This commit is contained in:
		@@ -98,7 +98,8 @@ struct ConsoleModelInfo {
 | 
			
		||||
static_assert(sizeof(ConsoleModelInfo) == 4, "ConsoleModelInfo must be exactly 4 bytes");
 | 
			
		||||
 | 
			
		||||
struct ConsoleCountryInfo {
 | 
			
		||||
    u8 unknown[3];   ///< Unknown data
 | 
			
		||||
    u8 unknown[2];   ///< Unknown data
 | 
			
		||||
    u8 state_code;   ///< The state or province code.
 | 
			
		||||
    u8 country_code; ///< The country code of the console
 | 
			
		||||
};
 | 
			
		||||
static_assert(sizeof(ConsoleCountryInfo) == 4, "ConsoleCountryInfo must be exactly 4 bytes");
 | 
			
		||||
@@ -112,8 +113,9 @@ constexpr UsernameBlock CONSOLE_USERNAME_BLOCK{u"CITRA", 0, 0};
 | 
			
		||||
constexpr BirthdayBlock PROFILE_BIRTHDAY{3, 25}; // March 25th, 2014
 | 
			
		||||
constexpr u8 SOUND_OUTPUT_MODE = SOUND_SURROUND;
 | 
			
		||||
constexpr u8 UNITED_STATES_COUNTRY_ID = 49;
 | 
			
		||||
constexpr u8 WASHINGTON_DC_STATE_ID = 2;
 | 
			
		||||
/// TODO(Subv): Find what the other bytes are
 | 
			
		||||
constexpr ConsoleCountryInfo COUNTRY_INFO{{0, 0, 0}, UNITED_STATES_COUNTRY_ID};
 | 
			
		||||
constexpr ConsoleCountryInfo COUNTRY_INFO{{0, 0}, WASHINGTON_DC_STATE_ID, UNITED_STATES_COUNTRY_ID};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * TODO(Subv): Find out what this actually is, these values fix some NaN uniforms in some games,
 | 
			
		||||
@@ -716,7 +718,7 @@ SoundOutputMode Module::GetSoundOutputMode() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::SetCountryCode(u8 country_code) {
 | 
			
		||||
    ConsoleCountryInfo block = {{0, 0, 0}, country_code};
 | 
			
		||||
    ConsoleCountryInfo block = {{0, 0}, default_subregion[country_code], country_code};
 | 
			
		||||
    SetConfigInfoBlock(CountryInfoBlockID, sizeof(block), 4, &block);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -726,6 +728,17 @@ u8 Module::GetCountryCode() {
 | 
			
		||||
    return block.country_code;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::SetCountryInfo(u8 country_code, u8 state_code) {
 | 
			
		||||
    ConsoleCountryInfo block = {{0, 0}, state_code, country_code};
 | 
			
		||||
    SetConfigInfoBlock(CountryInfoBlockID, sizeof(block), 4, &block);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u8 Module::GetStateCode() {
 | 
			
		||||
    ConsoleCountryInfo block;
 | 
			
		||||
    GetConfigInfoBlock(CountryInfoBlockID, sizeof(block), 8, &block);
 | 
			
		||||
    return block.state_code;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::pair<u32, u64> Module::GenerateConsoleUniqueId() const {
 | 
			
		||||
    CryptoPP::AutoSeededRandomPool rng;
 | 
			
		||||
    const u32 random_number = rng.GenerateWord32(0, 0xFFFF);
 | 
			
		||||
 
 | 
			
		||||
@@ -93,6 +93,35 @@ static const std::array<u16, 187> country_codes = {{
 | 
			
		||||
    C("SM"), C("VA"), C("BM"),                                              // 184-186
 | 
			
		||||
}};
 | 
			
		||||
 | 
			
		||||
// Based on PKHeX's lists of subregions at
 | 
			
		||||
// https://github.com/kwsch/PKHeX/tree/master/PKHeX.Core/Resources/text/locale3DS/subregions
 | 
			
		||||
static const std::array<u8, 187> default_subregion = {{
 | 
			
		||||
    0, 2, 0,  0, 0, 0, 0, 0, // 0-7
 | 
			
		||||
    1, 2, 2,  1, 1, 1, 2, 2, // 8-15
 | 
			
		||||
    2, 1, 2,  1, 2, 2, 2, 1, // 16-23
 | 
			
		||||
    2, 2, 2,  1, 1, 1, 2, 2, // 24-31
 | 
			
		||||
    2, 2, 2,  1, 2, 1, 1, 2, // 32-39
 | 
			
		||||
    2, 2, 2,  2, 1, 1, 2, 2, // 40-47
 | 
			
		||||
    1, 2, 2,  1, 2, 0, 0, 0, // 48-55
 | 
			
		||||
    0, 0, 0,  0, 0, 0, 0, 0, // 56-63
 | 
			
		||||
    2, 2, 2,  2, 2, 1, 2, 6, // 64-71
 | 
			
		||||
    1, 2, 18, 1, 8, 2, 2, 2, // 72-79
 | 
			
		||||
    2, 1, 2,  2, 1, 2, 1, 2, // 80-87
 | 
			
		||||
    1, 1, 1,  1, 1, 1, 2, 2, // 88-95
 | 
			
		||||
    7, 2, 2,  2, 9, 1, 2, 1, // 96-103
 | 
			
		||||
    2, 2, 2,  2, 2, 2, 2, 1, // 104-111
 | 
			
		||||
    1, 1, 1,  1, 1, 1, 1, 1, // 112-119
 | 
			
		||||
    1, 1, 1,  1, 1, 1, 1, 1, // 120-127
 | 
			
		||||
    2, 0, 0,  0, 0, 0, 0, 0, // 128-135
 | 
			
		||||
    2, 0, 0,  0, 0, 0, 0, 0, // 136-143
 | 
			
		||||
    1, 0, 0,  0, 0, 0, 0, 0, // 144-151
 | 
			
		||||
    0, 1, 0,  0, 2, 0, 0, 0, // 152-159
 | 
			
		||||
    2, 0, 0,  0, 0, 0, 0, 0, // 160-167
 | 
			
		||||
    2, 2, 0,  0, 0, 0, 2, 0, // 168-175
 | 
			
		||||
    0, 0, 0,  0, 0, 0, 0, 0, // 176-183
 | 
			
		||||
    1, 1, 1,                 // 184-186
 | 
			
		||||
}};
 | 
			
		||||
 | 
			
		||||
class Module final {
 | 
			
		||||
public:
 | 
			
		||||
    Module();
 | 
			
		||||
@@ -372,6 +401,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the country code in config savegame.
 | 
			
		||||
     * The state code is set to a default value.
 | 
			
		||||
     * @param country_code the country code to set
 | 
			
		||||
     */
 | 
			
		||||
    void SetCountryCode(u8 country_code);
 | 
			
		||||
@@ -382,6 +412,19 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    u8 GetCountryCode();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the country and state codes in config savegame.
 | 
			
		||||
     * @param country_code the country code to set
 | 
			
		||||
     * @param state_code the state code to set
 | 
			
		||||
     */
 | 
			
		||||
    void SetCountryInfo(u8 country_code, u8 state_code);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the state code from config savegame.
 | 
			
		||||
     * @returns the state code
 | 
			
		||||
     */
 | 
			
		||||
    u8 GetStateCode();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Generates a new random console unique id.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user