586 lines
25 KiB
C++
586 lines
25 KiB
C++
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2022 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef XENIA_KERNEL_XAM_USER_SETTINGS_H_
|
|
#define XENIA_KERNEL_XAM_USER_SETTINGS_H_
|
|
|
|
#include <array>
|
|
#include <set>
|
|
#include <variant>
|
|
#include <vector>
|
|
|
|
#include "xenia/kernel/title_id_utils.h"
|
|
#include "xenia/kernel/xam/user_data.h"
|
|
#include "xenia/kernel/xam/xam.h"
|
|
#include "xenia/kernel/xam/xdbf/gpd_info.h"
|
|
|
|
namespace xe {
|
|
namespace kernel {
|
|
namespace xam {
|
|
|
|
enum class X_USER_PROFILE_SETTING_SOURCE : uint32_t;
|
|
struct X_USER_PROFILE_SETTING;
|
|
|
|
constexpr uint32_t kMaxUserSettingId = 0x58;
|
|
|
|
constexpr uint32_t SettingKey(X_USER_DATA_TYPE type, uint16_t size,
|
|
uint16_t id) {
|
|
return static_cast<uint32_t>(type) << 28 | size << 16 | id;
|
|
}
|
|
|
|
enum class UserSettingId : uint32_t {
|
|
XPROFILE_PERMISSIONS =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0),
|
|
XPROFILE_GAMER_TYPE = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
1), // 0x10040001,
|
|
XPROFILE_GAMER_YAXIS_INVERSION =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 2), // 0x10040002,
|
|
XPROFILE_OPTION_CONTROLLER_VIBRATION =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 3), // 0x10040003,
|
|
XPROFILE_GAMERCARD_ZONE =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 4), // 0x10040004,
|
|
XPROFILE_GAMERCARD_REGION =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 5), // 0x10040005,
|
|
XPROFILE_GAMERCARD_CRED =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 6), // 0x10040006,
|
|
XPROFILE_GAMER_PRESENCE_USER_STATE =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 7), // 0x10040007,
|
|
XPROFILE_GAMERCARD_HAS_VISION =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 8), // 0x10040008,
|
|
|
|
XPROFILE_OPTION_VOICE_MUTED = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0xC), // 0x1004000C,
|
|
XPROFILE_OPTION_VOICE_THRU_SPEAKERS = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0xD), // 0x1004000D,
|
|
XPROFILE_OPTION_VOICE_VOLUME = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0xE), // 0x1004000E,
|
|
|
|
XPROFILE_GAMERCARD_TITLES_PLAYED = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x12), // 0x10040012,
|
|
XPROFILE_GAMERCARD_ACHIEVEMENTS_EARNED = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x13), // 0x10040013,
|
|
XPROFILE_GAMER_DIFFICULTY = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x15), // 0x10040015,
|
|
XPROFILE_GAMER_CONTROL_SENSITIVITY = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x18), // 0x10040018,
|
|
XPROFILE_GAMER_PREFERRED_COLOR_FIRST = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x1D), // 0x1004001D,
|
|
XPROFILE_GAMER_PREFERRED_COLOR_SECOND = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x1E), // 0x1004001E,
|
|
XPROFILE_GAMER_ACTION_AUTO_AIM = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x22), // 0x10040022,
|
|
XPROFILE_GAMER_ACTION_AUTO_CENTER = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x23), // 0x10040023,
|
|
XPROFILE_GAMER_ACTION_MOVEMENT_CONTROL = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x24), // 0x10040024,
|
|
XPROFILE_GAMER_RACE_TRANSMISSION = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x26), // 0x10040026,
|
|
XPROFILE_GAMER_RACE_CAMERA_LOCATION = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x27), // 0x10040027,
|
|
XPROFILE_GAMER_RACE_BRAKE_CONTROL = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x28), // 0x10040028,
|
|
XPROFILE_GAMER_RACE_ACCELERATOR_CONTROL = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x29), // 0x10040029,
|
|
XPROFILE_GAMERCARD_TITLE_CRED_EARNED = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x38), // 0x10040038,
|
|
XPROFILE_GAMERCARD_TITLE_ACHIEVEMENTS_EARNED = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x39), // 0x10040039,
|
|
XPROFILE_GAMER_TIER = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x3A), // 0x1004003A,
|
|
XPROFILE_MESSENGER_SIGNUP_STATE = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3B), // 0x1004003B,
|
|
XPROFILE_MESSENGER_AUTO_SIGNIN = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3C), // 0x1004003C,
|
|
XPROFILE_SAVE_WINDOWS_LIVE_PASSWORD = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3D), // 0x1004003D,
|
|
XPROFILE_FRIENDSAPP_SHOW_BUDDIES = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3E), // 0x1004003E,
|
|
XPROFILE_GAMERCARD_SERVICE_TYPE_FLAGS = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3F), // 0x1004003F,
|
|
XPROFILE_ENABLE_TUTORIALS =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x40), // 0x10040040,
|
|
XPROFILE_ENABLE_SUBTITLES =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x41), // 0x10040041,
|
|
XPROFILE_UNKNOWN_42 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x42), // 0x10040042,
|
|
XPROFILE_UNKNOWN_43 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x43), // 0x10040043,
|
|
XPROFILE_AIM_SENSITIVITY_XAXIS =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x44), // 0x10040044,
|
|
XPROFILE_AIM_SENSITIVITY_YAXIS =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x45), // 0x10040045,
|
|
XPROFILE_UNKNOWN_46 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x46), // 0x10040046,
|
|
XPROFILE_TENURE_LEVEL = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x47), // 0x10040047,
|
|
XPROFILE_TENURE_MILESTONE = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x48), // 0x10040048,
|
|
|
|
XPROFILE_UNKNOWN_49 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x49), // 0x10040049,
|
|
XPROFILE_SHOW_DAMAGE_INDICATORS =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x4A), // 0x1004004A,
|
|
XPROFILE_SUBSCRIPTION_TYPE_LENGTH_IN_MONTHS = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x4B), // 0x1004004B,
|
|
XPROFILE_SUBSCRIPTION_PAYMENT_TYPE = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x4C), // 0x1004004C,
|
|
XPROFILE_PEC_INFO = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x4D), // 0x1004004D,
|
|
XPROFILE_NUI_BIOMETRIC_SIGNIN =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x4E), // 0x1004004E, set by XamUserNuiEnableBiometric
|
|
XPROFILE_GFWL_VADNORMAL = SettingKey(X_USER_DATA_TYPE::INT32,
|
|
sizeof(uint32_t), 0x4F), // 0x1004004F,
|
|
XPROFILE_UNKNOWN_50 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x50), // 0x10040050,
|
|
XPROFILE_MINIMAP_AUTOROTATE =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x51), // 0x10040051,
|
|
XPROFILE_BEACONS_SOCIAL_NETWORK_SHARING = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x52), // 0x10040052,
|
|
XPROFILE_USER_PREFERENCES = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x53), // 0x10040053,
|
|
XPROFILE_XBOXONE_GAMERSCORE =
|
|
SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x57), // 0x10040057, "XboxOneGamerscore" inside dash.xex
|
|
|
|
WEB_EMAIL_FORMAT = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2000), // 0x10042000,
|
|
WEB_FLAGS = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2001), // 0x10042001,
|
|
WEB_SPAM = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2002), // 0x10042002,
|
|
WEB_FAVORITE_GENRE = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2003), // 0x10042003,
|
|
WEB_FAVORITE_GAME = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2004), // 0x10042004,
|
|
WEB_FAVORITE_GAME1 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2005), // 0x10042005,
|
|
WEB_FAVORITE_GAME2 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2006), // 0x10042006,
|
|
WEB_FAVORITE_GAME3 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2007), // 0x10042007,
|
|
WEB_FAVORITE_GAME4 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2008), // 0x10042008,
|
|
WEB_FAVORITE_GAME5 = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x2009), // 0x10042009,
|
|
WEB_PLATFORMS_OWNED = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x200A), // 0x1004200A,
|
|
WEB_CONNECTION_SPEED = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x200B), // 0x1004200B,
|
|
WEB_FLASH = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x200C), // 0x1004200C,
|
|
WEB_VIDEO_PREFERENCE = SettingKey(X_USER_DATA_TYPE::INT32, sizeof(uint32_t),
|
|
0x200D), // 0x1004200D,
|
|
XPROFILE_CRUX_MEDIA_STYLE1 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3EA), // 0x100403EA,
|
|
XPROFILE_CRUX_MEDIA_STYLE2 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3EB), // 0x100403EB,
|
|
XPROFILE_CRUX_MEDIA_STYLE3 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3EC), // 0x100403EC,
|
|
XPROFILE_CRUX_TOP_ALBUM1 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3ED), // 0x100403ED,
|
|
XPROFILE_CRUX_TOP_ALBUM2 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3EE), // 0x100403EE,
|
|
XPROFILE_CRUX_TOP_ALBUM3 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3EF), // 0x100403EF,
|
|
XPROFILE_CRUX_TOP_ALBUM4 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3F0), // 0x100403F0,
|
|
XPROFILE_CRUX_TOP_ALBUM5 = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3F1), // 0x100403F1,
|
|
XPROFILE_CRUX_BKGD_IMAGE = SettingKey(
|
|
X_USER_DATA_TYPE::INT32, sizeof(uint32_t), 0x3F3), // 0x100403F3,
|
|
|
|
XPROFILE_GAMERCARD_USER_LOCATION =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x52, 0x41), // 0x40520041,
|
|
|
|
XPROFILE_GAMERCARD_USER_NAME =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x104, 0x40), // 0x41040040,
|
|
|
|
XPROFILE_GAMERCARD_USER_URL =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x190, 0x42), // 0x41900042,
|
|
XPROFILE_GAMERCARD_USER_BIO = SettingKey(
|
|
X_USER_DATA_TYPE::WSTRING, kMaxUserDataSize, 0x43), // 0x43E80043,
|
|
|
|
XPROFILE_CRUX_BIO = SettingKey(X_USER_DATA_TYPE::WSTRING, kMaxUserDataSize,
|
|
0x3FA), // 0x43E803FA,
|
|
XPROFILE_CRUX_BG_SMALL_PRIVATE =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x3FB), // 0x406403FB,
|
|
XPROFILE_CRUX_BG_LARGE_PRIVATE =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x3FC), // 0x406403FC,
|
|
XPROFILE_CRUX_BG_SMALL_PUBLIC =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x3FD), // 0x406403FD,
|
|
XPROFILE_CRUX_BG_LARGE_PUBLIC =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x3FE), // 0x406403FE
|
|
|
|
XPROFILE_GAMERCARD_PICTURE_KEY =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0xF), // 0x4064000F,
|
|
XPROFILE_GAMERCARD_PERSONAL_PICTURE =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x10), // 0x40640010,
|
|
XPROFILE_GAMERCARD_MOTTO =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x2C, 0x11), // 0x402C0011,
|
|
XPROFILE_GFWL_RECDEVICEDESC =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 200, 0x49), // 0x40C80049,
|
|
|
|
XPROFILE_GFWL_PLAYDEVICEDESC =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 200, 0x4B), // 0x40C8004B,
|
|
XPROFILE_CRUX_MEDIA_PICTURE =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x64, 0x3E8), // 0x406403E8,
|
|
XPROFILE_CRUX_MEDIA_MOTTO =
|
|
SettingKey(X_USER_DATA_TYPE::WSTRING, 0x100, 0x3F6), // 0x410003F6,
|
|
|
|
XPROFILE_GAMERCARD_REP =
|
|
SettingKey(X_USER_DATA_TYPE::FLOAT, sizeof(float), 0xB), // 0x5004000B,
|
|
XPROFILE_GFWL_VOLUMELEVEL =
|
|
SettingKey(X_USER_DATA_TYPE::FLOAT, sizeof(float), 0x4C), // 0x5004004C,
|
|
|
|
XPROFILE_GFWL_RECLEVEL = SettingKey(X_USER_DATA_TYPE::FLOAT, sizeof(float),
|
|
0x4D), // 0x5004004D,
|
|
XPROFILE_GFWL_PLAYDEVICE =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x10, 0x4A), // 0x6010004A,
|
|
|
|
XPROFILE_VIDEO_METADATA =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x20, 0x4A), // 0x6020004A,
|
|
|
|
XPROFILE_CRUX_OFFLINE_ID =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x34, 0x3F2), // 0x603403F2,
|
|
|
|
XPROFILE_UNK_61180050 =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 280, 0x50), // 0x61180050,
|
|
|
|
XPROFILE_JUMP_IN_LIST = SettingKey(X_USER_DATA_TYPE::BINARY, kMaxUserDataSize,
|
|
0x51), // 0x63E80051,
|
|
|
|
XPROFILE_GAMERCARD_PARTY_ADDR =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x62, 0x54), // 0x60620054,
|
|
|
|
XPROFILE_CRUX_TOP_MUSIC =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0xA8, 0x3F5), // 0x60A803F5,
|
|
|
|
XPROFILE_CRUX_TOP_MEDIAID1 =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x10, 0x3F7), // 0x601003F7,
|
|
XPROFILE_CRUX_TOP_MEDIAID2 =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x10, 0x3F8), // 0x601003F8,
|
|
XPROFILE_CRUX_TOP_MEDIAID3 =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x10, 0x3F9), // 0x601003F9,
|
|
|
|
XPROFILE_GAMERCARD_AVATAR_INFO_1 = SettingKey(
|
|
X_USER_DATA_TYPE::BINARY, kMaxUserDataSize, 0x44), // 0x63E80044,
|
|
XPROFILE_GAMERCARD_AVATAR_INFO_2 = SettingKey(
|
|
X_USER_DATA_TYPE::BINARY, kMaxUserDataSize, 0x45), // 0x63E80045,
|
|
XPROFILE_GAMERCARD_PARTY_INFO =
|
|
SettingKey(X_USER_DATA_TYPE::BINARY, 0x100, 0x46), // 0x61000046,
|
|
|
|
XPROFILE_TITLE_SPECIFIC1 = SettingKey(
|
|
X_USER_DATA_TYPE::BINARY, kMaxUserDataSize, 0x3FFF), // 0x63E83FFF,
|
|
XPROFILE_TITLE_SPECIFIC2 = SettingKey(
|
|
X_USER_DATA_TYPE::BINARY, kMaxUserDataSize, 0x3FFE), // 0x63E83FFE,
|
|
XPROFILE_TITLE_SPECIFIC3 = SettingKey(
|
|
X_USER_DATA_TYPE::BINARY, kMaxUserDataSize, 0x3FFD), // 0x63E83FFD,
|
|
|
|
XPROFILE_CRUX_LAST_CHANGE_TIME = SettingKey(
|
|
X_USER_DATA_TYPE::DATETIME, sizeof(uint64_t), 0x3F4), // 0x700803F4,
|
|
XPROFILE_TENURE_NEXT_MILESTONE_DATE =
|
|
SettingKey(X_USER_DATA_TYPE::DATETIME, sizeof(uint64_t),
|
|
0x49), // 0x70080049, aka ProfileDateTimeCreated?
|
|
XPROFILE_LAST_LIVE_SIGNIN =
|
|
SettingKey(X_USER_DATA_TYPE::DATETIME, sizeof(uint64_t),
|
|
0x4F), // 0x7008004F, named "LastOnLIVE" in Velocity
|
|
};
|
|
|
|
inline constexpr std::array<UserSettingId, 115> known_settings = {
|
|
UserSettingId::XPROFILE_PERMISSIONS,
|
|
UserSettingId::XPROFILE_GAMER_TYPE,
|
|
UserSettingId::XPROFILE_GAMER_YAXIS_INVERSION,
|
|
UserSettingId::XPROFILE_OPTION_CONTROLLER_VIBRATION,
|
|
UserSettingId::XPROFILE_GAMERCARD_ZONE,
|
|
UserSettingId::XPROFILE_GAMERCARD_REGION,
|
|
UserSettingId::XPROFILE_GAMERCARD_CRED,
|
|
UserSettingId::XPROFILE_GAMER_PRESENCE_USER_STATE,
|
|
UserSettingId::XPROFILE_GAMERCARD_HAS_VISION,
|
|
UserSettingId::XPROFILE_OPTION_VOICE_MUTED,
|
|
UserSettingId::XPROFILE_OPTION_VOICE_THRU_SPEAKERS,
|
|
UserSettingId::XPROFILE_OPTION_VOICE_VOLUME,
|
|
UserSettingId::XPROFILE_GAMERCARD_TITLES_PLAYED,
|
|
UserSettingId::XPROFILE_GAMERCARD_ACHIEVEMENTS_EARNED,
|
|
UserSettingId::XPROFILE_GAMER_DIFFICULTY,
|
|
UserSettingId::XPROFILE_GAMER_CONTROL_SENSITIVITY,
|
|
UserSettingId::XPROFILE_GAMER_PREFERRED_COLOR_FIRST,
|
|
UserSettingId::XPROFILE_GAMER_PREFERRED_COLOR_SECOND,
|
|
UserSettingId::XPROFILE_GAMER_ACTION_AUTO_AIM,
|
|
UserSettingId::XPROFILE_GAMER_ACTION_AUTO_CENTER,
|
|
UserSettingId::XPROFILE_GAMER_ACTION_MOVEMENT_CONTROL,
|
|
UserSettingId::XPROFILE_GAMER_RACE_TRANSMISSION,
|
|
UserSettingId::XPROFILE_GAMER_RACE_CAMERA_LOCATION,
|
|
UserSettingId::XPROFILE_GAMER_RACE_BRAKE_CONTROL,
|
|
UserSettingId::XPROFILE_GAMER_RACE_ACCELERATOR_CONTROL,
|
|
UserSettingId::XPROFILE_GAMERCARD_TITLE_CRED_EARNED,
|
|
UserSettingId::XPROFILE_GAMERCARD_TITLE_ACHIEVEMENTS_EARNED,
|
|
UserSettingId::XPROFILE_GAMER_TIER,
|
|
UserSettingId::XPROFILE_MESSENGER_SIGNUP_STATE,
|
|
UserSettingId::XPROFILE_MESSENGER_AUTO_SIGNIN,
|
|
UserSettingId::XPROFILE_SAVE_WINDOWS_LIVE_PASSWORD,
|
|
UserSettingId::XPROFILE_FRIENDSAPP_SHOW_BUDDIES,
|
|
UserSettingId::XPROFILE_GAMERCARD_SERVICE_TYPE_FLAGS,
|
|
UserSettingId::XPROFILE_ENABLE_TUTORIALS,
|
|
UserSettingId::XPROFILE_ENABLE_SUBTITLES,
|
|
UserSettingId::XPROFILE_UNKNOWN_42,
|
|
UserSettingId::XPROFILE_UNKNOWN_43,
|
|
UserSettingId::XPROFILE_AIM_SENSITIVITY_XAXIS,
|
|
UserSettingId::XPROFILE_AIM_SENSITIVITY_YAXIS,
|
|
UserSettingId::XPROFILE_UNKNOWN_46,
|
|
UserSettingId::XPROFILE_TENURE_LEVEL,
|
|
UserSettingId::XPROFILE_TENURE_MILESTONE,
|
|
UserSettingId::XPROFILE_UNKNOWN_49,
|
|
UserSettingId::XPROFILE_SHOW_DAMAGE_INDICATORS,
|
|
UserSettingId::XPROFILE_SUBSCRIPTION_TYPE_LENGTH_IN_MONTHS,
|
|
UserSettingId::XPROFILE_SUBSCRIPTION_PAYMENT_TYPE,
|
|
UserSettingId::XPROFILE_PEC_INFO,
|
|
UserSettingId::XPROFILE_NUI_BIOMETRIC_SIGNIN,
|
|
UserSettingId::XPROFILE_GFWL_VADNORMAL,
|
|
UserSettingId::XPROFILE_UNKNOWN_50,
|
|
UserSettingId::XPROFILE_MINIMAP_AUTOROTATE,
|
|
UserSettingId::XPROFILE_BEACONS_SOCIAL_NETWORK_SHARING,
|
|
UserSettingId::XPROFILE_USER_PREFERENCES,
|
|
UserSettingId::XPROFILE_XBOXONE_GAMERSCORE,
|
|
UserSettingId::WEB_EMAIL_FORMAT,
|
|
UserSettingId::WEB_FLAGS,
|
|
UserSettingId::WEB_SPAM,
|
|
UserSettingId::WEB_FAVORITE_GENRE,
|
|
UserSettingId::WEB_FAVORITE_GAME,
|
|
UserSettingId::WEB_FAVORITE_GAME1,
|
|
UserSettingId::WEB_FAVORITE_GAME2,
|
|
UserSettingId::WEB_FAVORITE_GAME3,
|
|
UserSettingId::WEB_FAVORITE_GAME4,
|
|
UserSettingId::WEB_FAVORITE_GAME5,
|
|
UserSettingId::WEB_PLATFORMS_OWNED,
|
|
UserSettingId::WEB_CONNECTION_SPEED,
|
|
UserSettingId::WEB_FLASH,
|
|
UserSettingId::WEB_VIDEO_PREFERENCE,
|
|
UserSettingId::XPROFILE_CRUX_MEDIA_STYLE1,
|
|
UserSettingId::XPROFILE_CRUX_MEDIA_STYLE2,
|
|
UserSettingId::XPROFILE_CRUX_MEDIA_STYLE3,
|
|
UserSettingId::XPROFILE_CRUX_TOP_ALBUM1,
|
|
UserSettingId::XPROFILE_CRUX_TOP_ALBUM2,
|
|
UserSettingId::XPROFILE_CRUX_TOP_ALBUM3,
|
|
UserSettingId::XPROFILE_CRUX_TOP_ALBUM4,
|
|
UserSettingId::XPROFILE_CRUX_TOP_ALBUM5,
|
|
UserSettingId::XPROFILE_CRUX_BKGD_IMAGE,
|
|
UserSettingId::XPROFILE_GAMERCARD_USER_LOCATION,
|
|
UserSettingId::XPROFILE_GAMERCARD_USER_NAME,
|
|
UserSettingId::XPROFILE_GAMERCARD_USER_URL,
|
|
UserSettingId::XPROFILE_GAMERCARD_USER_BIO,
|
|
UserSettingId::XPROFILE_CRUX_BIO,
|
|
UserSettingId::XPROFILE_CRUX_BG_SMALL_PRIVATE,
|
|
UserSettingId::XPROFILE_CRUX_BG_LARGE_PRIVATE,
|
|
UserSettingId::XPROFILE_CRUX_BG_SMALL_PUBLIC,
|
|
UserSettingId::XPROFILE_CRUX_BG_LARGE_PUBLIC,
|
|
UserSettingId::XPROFILE_GAMERCARD_PICTURE_KEY,
|
|
UserSettingId::XPROFILE_GAMERCARD_PERSONAL_PICTURE,
|
|
UserSettingId::XPROFILE_GAMERCARD_MOTTO,
|
|
UserSettingId::XPROFILE_GFWL_RECDEVICEDESC,
|
|
UserSettingId::XPROFILE_GFWL_PLAYDEVICEDESC,
|
|
UserSettingId::XPROFILE_CRUX_MEDIA_PICTURE,
|
|
UserSettingId::XPROFILE_CRUX_MEDIA_MOTTO,
|
|
UserSettingId::XPROFILE_GAMERCARD_REP,
|
|
UserSettingId::XPROFILE_GFWL_VOLUMELEVEL,
|
|
UserSettingId::XPROFILE_GFWL_RECLEVEL,
|
|
UserSettingId::XPROFILE_GFWL_PLAYDEVICE,
|
|
UserSettingId::XPROFILE_VIDEO_METADATA,
|
|
UserSettingId::XPROFILE_CRUX_OFFLINE_ID,
|
|
UserSettingId::XPROFILE_UNK_61180050,
|
|
UserSettingId::XPROFILE_JUMP_IN_LIST,
|
|
UserSettingId::XPROFILE_GAMERCARD_PARTY_ADDR,
|
|
UserSettingId::XPROFILE_CRUX_TOP_MUSIC,
|
|
UserSettingId::XPROFILE_CRUX_TOP_MEDIAID1,
|
|
UserSettingId::XPROFILE_CRUX_TOP_MEDIAID2,
|
|
UserSettingId::XPROFILE_CRUX_TOP_MEDIAID3,
|
|
UserSettingId::XPROFILE_GAMERCARD_AVATAR_INFO_1,
|
|
UserSettingId::XPROFILE_GAMERCARD_AVATAR_INFO_2,
|
|
UserSettingId::XPROFILE_GAMERCARD_PARTY_INFO,
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC1,
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC2,
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC3,
|
|
UserSettingId::XPROFILE_CRUX_LAST_CHANGE_TIME,
|
|
UserSettingId::XPROFILE_TENURE_NEXT_MILESTONE_DATE,
|
|
UserSettingId::XPROFILE_LAST_LIVE_SIGNIN,
|
|
};
|
|
|
|
inline const std::set<UserSettingId> title_writable_settings = {
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC1,
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC2,
|
|
UserSettingId::XPROFILE_TITLE_SPECIFIC3};
|
|
|
|
enum PREFERRED_COLOR_OPTIONS : uint8_t {
|
|
PREFERRED_COLOR_NONE,
|
|
PREFERRED_COLOR_BLACK,
|
|
PREFERRED_COLOR_WHITE,
|
|
PREFERRED_COLOR_YELLOW,
|
|
PREFERRED_COLOR_ORANGE,
|
|
PREFERRED_COLOR_PINK,
|
|
PREFERRED_COLOR_RED,
|
|
PREFERRED_COLOR_PURPLE,
|
|
PREFERRED_COLOR_BLUE,
|
|
PREFERRED_COLOR_GREEN,
|
|
PREFERRED_COLOR_BROWN,
|
|
PREFERRED_COLOR_SILVER
|
|
};
|
|
enum CONTROLLER_VIBRATION_OPTIONS : uint8_t {
|
|
CONTROLLER_VIBRATION_OFF = 0,
|
|
CONTROLLER_VIBRATION_ON = 3
|
|
};
|
|
|
|
enum CONTROL_SENSITIVITY_OPTIONS : uint8_t {
|
|
CONTROL_SENSITIVITY_MEDIUM = 0,
|
|
CONTROL_SENSITIVITY_LOW,
|
|
CONTROL_SENSITIVITY_HIGH
|
|
};
|
|
|
|
enum GAMER_DIFFICULTY_OPTIONS : uint8_t {
|
|
GAMER_DIFFICULTY_NORMAL = 0,
|
|
GAMER_DIFFICULTY_EASY,
|
|
GAMER_DIFFICULTY_HARD
|
|
};
|
|
|
|
enum AUTO_AIM_OPTIONS : uint8_t { AUTO_AIM_OFF = 0, AUTO_AIM_ON };
|
|
|
|
enum AUTO_CENTER_OPTIONS : uint8_t { AUTO_CENTER_OFF = 0, AUTO_CENTER_ON };
|
|
|
|
enum MOVEMENT_CONTROL_OPTIONS : uint8_t {
|
|
MOVEMENT_CONTROL_L_THUMBSTICK = 0,
|
|
MOVEMENT_CONTROL_R_THUMBSTICK
|
|
};
|
|
|
|
enum YAXIS_INVERSION_OPTIONS : uint8_t {
|
|
YAXIS_INVERSION_OFF = 0,
|
|
YAXIS_INVERSION_ON
|
|
};
|
|
|
|
enum TRANSMISSION_OPTIONS : uint8_t {
|
|
TRANSMISSION_AUTO = 0,
|
|
TRANSMISSION_MANUAL
|
|
};
|
|
|
|
enum CAMERA_LOCATION_OPTIONS : uint8_t {
|
|
CAMERA_LOCATION_BEHIND = 0,
|
|
CAMERA_LOCATION_IN_FRONT,
|
|
CAMERA_LOCATION_INSIDE
|
|
};
|
|
|
|
enum BRAKE_CONTROL_OPTIONS : uint8_t {
|
|
BRAKE_CONTROL_TRIGGER = 0,
|
|
BRAKE_CONTROL_BUTTON
|
|
};
|
|
|
|
enum ACCELERATOR_CONTROL_OPTIONS : uint8_t {
|
|
ACCELERATOR_CONTROL_TRIGGER = 0,
|
|
ACCELERATOR_CONTROL_BUTTON
|
|
};
|
|
|
|
struct GamerPictureKey {
|
|
char title_id[8];
|
|
char big_tile_id[8];
|
|
char small_tile_id[8];
|
|
|
|
uint32_t GetTitleId() const {
|
|
return string_util::from_string<uint32_t>(
|
|
std::string(title_id, std::size(title_id)), true);
|
|
}
|
|
|
|
uint32_t GetBigTileId() const {
|
|
return string_util::from_string<uint32_t>(
|
|
std::string(big_tile_id, std::size(big_tile_id)), true);
|
|
}
|
|
|
|
uint32_t GetSmallTileId() const {
|
|
return string_util::from_string<uint32_t>(
|
|
std::string(small_tile_id, std::size(small_tile_id)), true);
|
|
}
|
|
};
|
|
static_assert_size(GamerPictureKey, 0x18);
|
|
|
|
class UserSetting : public UserData {
|
|
public:
|
|
UserSetting(const UserSetting& setting);
|
|
// Ctor for writing from host
|
|
UserSetting(UserSettingId setting_id, UserDataTypes setting_data);
|
|
// Ctor for writing to GPD
|
|
UserSetting(const X_USER_PROFILE_SETTING* profile_setting);
|
|
// Ctor for reading from GPD
|
|
UserSetting(const X_XDBF_GPD_SETTING_HEADER* profile_setting,
|
|
std::span<const uint8_t> extended_data);
|
|
|
|
static std::optional<UserSetting> GetDefaultSetting(uint32_t setting_id);
|
|
void WriteToGuest(X_USER_PROFILE_SETTING* setting_ptr,
|
|
uint32_t& extended_data_address);
|
|
std::vector<uint8_t> Serialize() const;
|
|
|
|
uint32_t get_setting_id() const { return static_cast<uint32_t>(setting_id_); }
|
|
X_USER_PROFILE_SETTING_SOURCE get_setting_source() const {
|
|
return setting_source_;
|
|
}
|
|
|
|
static bool is_setting_valid(uint32_t setting_id) {
|
|
const auto setting = static_cast<AttributeKey>(setting_id);
|
|
|
|
if (setting.id < kMaxUserSettingId) {
|
|
return true;
|
|
}
|
|
|
|
return std::find(known_settings.cbegin(), known_settings.cend(),
|
|
static_cast<UserSettingId>(setting_id)) !=
|
|
known_settings.cend();
|
|
}
|
|
|
|
private:
|
|
UserSettingId setting_id_;
|
|
X_USER_PROFILE_SETTING_SOURCE setting_source_;
|
|
|
|
static bool is_valid_setting(uint32_t title_id,
|
|
const UserSettingId setting_id) {
|
|
if (title_id != kDashboardID && title_writable_settings.count(setting_id)) {
|
|
return true;
|
|
}
|
|
|
|
if (title_id == kDashboardID &&
|
|
!title_writable_settings.count(setting_id)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static bool is_title_specific(uint32_t setting_id) {
|
|
return (setting_id & 0x3F00) == 0x3F00;
|
|
}
|
|
|
|
bool is_title_specific() const {
|
|
return is_title_specific(static_cast<uint32_t>(setting_id_));
|
|
}
|
|
};
|
|
|
|
const static std::array<UserSetting, 3> default_setting_values = {
|
|
UserSetting(UserSettingId::XPROFILE_OPTION_CONTROLLER_VIBRATION, 3),
|
|
UserSetting(
|
|
UserSettingId::XPROFILE_GAMER_TIER,
|
|
X_XAMACCOUNTINFO::AccountSubscriptionTier::kSubscriptionTierGold),
|
|
UserSetting(
|
|
UserSettingId::XPROFILE_GAMERCARD_PICTURE_KEY,
|
|
xe::string_util::read_u16string_and_swap(u"FFFE07D10002000200010002"))};
|
|
|
|
} // namespace xam
|
|
} // namespace kernel
|
|
} // namespace xe
|
|
|
|
#endif // XENIA_KERNEL_XAM_USER_PROFILE_H_
|