Allow for song specific module choices and saving/loading of song specific module choices.

This feature should require use_card, this is automatically enabled by default (this may be changed in the next commit) and has one notable bug, which is a significant FPS drop when selecting (or sometimes loading) modules on songs with 3 vocals. (This does NOT impact gameplay past song select to my knowledge)

Huge thanks to somewhatlurker again for coding help and advice as well as just being a sweetie <3
This commit is contained in:
Jay39w
2019-11-12 01:20:02 +00:00
parent 0c1d371044
commit caba4d6d9b
4 changed files with 127 additions and 6 deletions
@@ -10,6 +10,8 @@
const std::string PLAYER_DATA_FILE_NAME = "playerdata.ini";
static WCHAR configPath[256];
int* headitemequip = (int*)0x0000000141804CDC;
int customheaditemequip;
namespace TLAC::Components
{
PlayerDataManager::PlayerDataManager()
@@ -234,7 +236,7 @@ namespace TLAC::Components
config.TryGetValue("player_name", &customPlayerData->PlayerName);
config.TryGetValue("level_name", &customPlayerData->LevelName);
// ScoreSaver copies (can be improved?)
// ScoreSaver copies & declaring non-playerdata values
std::string utf8path = TLAC::framework::GetModuleDirectory() + "/playerdata.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, configPath, 256);
@@ -253,12 +255,16 @@ namespace TLAC::Components
//customPlayerData->ModuleEquip3 = config.GetIntegerValue("module_equip3");
//customPlayerData->ModuleEquip4 = config.GetIntegerValue("module_equip4");
//customPlayerData->ModuleEquip5 = config.GetIntegerValue("module_equip5");
customPlayerData->UsePVEquip = config.GetIntegerValue("use_pv_module_equip");
customPlayerData->ModuleEquipCmn0 = config.GetIntegerValue("module_equip_cmn0");
customPlayerData->ModuleEquipCmn1 = config.GetIntegerValue("module_equip_cmn1");
customPlayerData->ModuleEquipCmn2 = config.GetIntegerValue("module_equip_cmn2");
customPlayerData->ModuleEquipCmn3 = config.GetIntegerValue("module_equip_cmn3");
customPlayerData->ModuleEquipCmn4 = config.GetIntegerValue("module_equip_cmn4");
customPlayerData->ModuleEquipCmn5 = config.GetIntegerValue("module_equip_cmn5");
customPlayerData->ActionVol = config.GetIntegerValue("act_vol");
customPlayerData->ActionSlideVol = config.GetIntegerValue("act_slide_vol");
customheaditemequip = config.GetIntegerValue("head_item");
customPlayerData->ShowExcellentClearBorder = config.GetBooleanValue("border_excellent");
customPlayerData->ShowGreatClearBorder = config.GetBooleanValue("border_great");
customPlayerData->ShowRivalClearBorder = config.GetBooleanValue("border_rival");
@@ -274,15 +280,18 @@ namespace TLAC::Components
* target = value;
};
// only need to run this line once on startup, otherwise cannot increase/decrease in-game
// only need to run this line once on startup, otherwise cannot increase/decrease in-game (or use per-song settings!)
setIfNotEqual(&playerData->vocaloid_point, customPlayerData->VocaloidPoints, 0);
// run once to check if module setting is invalid
setIfNotEqual(&playerData->skin_equip_cmn, customPlayerData->SkinEquip, 0);
setIfNotEqual(&playerData->module_equip_cmn0, customPlayerData->ModuleEquipCmn0, 0);
setIfNotEqual(&playerData->module_equip_cmn1, customPlayerData->ModuleEquipCmn1, 0);
setIfNotEqual(&playerData->module_equip_cmn2, customPlayerData->ModuleEquipCmn2, 0);
setIfNotEqual(&playerData->module_equip_cmn3, customPlayerData->ModuleEquipCmn3, 0);
setIfNotEqual(&playerData->module_equip_cmn4, customPlayerData->ModuleEquipCmn4, 0);
setIfNotEqual(&playerData->module_equip_cmn5, customPlayerData->ModuleEquipCmn5, 0);
setIfNotEqual(headitemequip, customheaditemequip, 0);
setIfNotEqual(&playerData->act_vol, customPlayerData->ActionVol, 100);
setIfNotEqual(&playerData->act_slide_vol, customPlayerData->ActionSlideVol, 100);
std::string* mylistString;
std::vector<std::string> mylistStringVec;
@@ -434,11 +443,36 @@ namespace TLAC::Components
swprintf(val, 32, L"%d", playerData->module_equip_cmn5);
WritePrivateProfileStringW(L"playerdata", L"module_equip_cmn5", val, configPath);
}
if (customPlayerData->ActionVol != playerData->act_vol)
{
customPlayerData->ActionVol = playerData->act_vol;
WCHAR val[32];
swprintf(val, 32, L"%d", playerData->act_vol);
WritePrivateProfileStringW(L"playerdata", L"act_vol", val, configPath);
}
if (customPlayerData->ActionSlideVol != playerData->act_slide_vol)
{
customPlayerData->ActionSlideVol = playerData->act_slide_vol;
WCHAR val[32];
swprintf(val, 32, L"%d", playerData->act_slide_vol);
WritePrivateProfileStringW(L"playerdata", L"act_slide_vol", val, configPath);
}
if (playerData->use_pv_module_equip != 1)
{
playerData->use_pv_module_equip = 1;
}
if (customheaditemequip != *headitemequip)
{
customheaditemequip = *headitemequip;
WCHAR val[32];
swprintf(val, 32, L"%d", *headitemequip);
WritePrivateProfileStringW(L"playerdata", L"head_item", val, configPath);
}
setIfNotEqual(&playerData->level, customPlayerData->LevelNum, 1);
setIfNotEqual(&playerData->level_plate_id, customPlayerData->LevelPlateId, 0);
setIfNotEqual(&playerData->level_plate_effect, customPlayerData->LevelPlateEffect, 0);
setIfNotEqual(&playerData->skin_equip, customPlayerData->SkinEquip, 0);
setIfNotEqual(&playerData->btn_se_equip, customPlayerData->BtnSeEquip, -1);
setIfNotEqual(&playerData->slide_se_equip, customPlayerData->SlideSeEquip, -1);
setIfNotEqual(&playerData->chainslide_se_equip, customPlayerData->ChainslideSeEquip, -1);