forked from cafeberry/cafeberry
feat: initial controller tooltips hotswap
This commit is contained in:
@@ -47,9 +47,19 @@
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
wstring controlTooltipsPath = L"";
|
||||
wstring skinName = L"";
|
||||
#endif
|
||||
|
||||
CRITICAL_SECTION UIController::ms_reloadSkinCS;
|
||||
bool UIController::ms_bReloadSkinCSInitialised = false;
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
CRITICAL_SECTION UIController::ms_controllerPollCS;
|
||||
bool UIController::ms_bControllerPollCSInitialised = false;
|
||||
#endif
|
||||
|
||||
DWORD UIController::m_dwTrialTimerLimitSecs=DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME;
|
||||
|
||||
static void RADLINK WarningCallback(void *user_callback_data, Iggy *player, IggyResult code, const char *message)
|
||||
@@ -233,6 +243,12 @@ UIController::UIController()
|
||||
InitializeCriticalSection(&ms_reloadSkinCS);
|
||||
ms_bReloadSkinCSInitialised = true;
|
||||
}
|
||||
|
||||
if(!ms_bControllerPollCSInitialised)
|
||||
{
|
||||
InitializeCriticalSection(&ms_controllerPollCS);
|
||||
ms_bControllerPollCSInitialised = true;
|
||||
}
|
||||
}
|
||||
|
||||
void UIController::SetSysUIShowing(bool bVal)
|
||||
@@ -282,6 +298,14 @@ void UIController::postInit()
|
||||
//
|
||||
loadSkins();
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
m_LastControllerType = UNKNOWN;
|
||||
m_bControllerTypeChanged = false;
|
||||
|
||||
m_controllerPollThread = new C4JThread(controllerPollThreadProc, (void*)this, "Controller poll thread");
|
||||
m_controllerPollThread->Run();
|
||||
#endif
|
||||
|
||||
for(unsigned int i = 0; i < eUIGroup_COUNT; ++i)
|
||||
{
|
||||
m_groups[i] = new UIGroup((EUIGroup)i,i-1);
|
||||
@@ -489,8 +513,112 @@ void UIController::tick()
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
fetchControlTooltipSWF();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
int UIController::controllerPollThreadProc(void* lpParam)
|
||||
{
|
||||
UIController *controller = (UIController *)lpParam;
|
||||
|
||||
while(true)
|
||||
{
|
||||
EControllerType polled = controller->GetControllerType(InputManager.PollControllerType(0));
|
||||
EnterCriticalSection(&ms_controllerPollCS);
|
||||
|
||||
if(polled != EControllerType::UNKNOWN && polled != controller->m_LastControllerType)
|
||||
{
|
||||
controller->m_bControllerTypeChanged = true;
|
||||
|
||||
wstring path = controller->GetControlTooltipsPath(polled);
|
||||
controller->getMovieData(path);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&ms_controllerPollCS);
|
||||
Sleep(250);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
wstring UIController::GetControlTooltipsPath(EControllerType ControllerType)
|
||||
{
|
||||
if(ControllerType == EControllerType::UNSET)
|
||||
{
|
||||
EControllerType ControllerType = GetControllerType(InputManager.PollControllerType(0));
|
||||
}
|
||||
|
||||
switch(ControllerType)
|
||||
{
|
||||
case EControllerType::PS3:
|
||||
return m_fScreenHeight >= 1080.0f
|
||||
? L"ControlTooltips\\HD\\PS3HDControls.swf"
|
||||
: L"ControlTooltips\\PS3Controls.swf";
|
||||
case EControllerType::PS4:
|
||||
return m_fScreenHeight >= 1080.0f
|
||||
? L"ControlTooltips\\HD\\OrbisHDControls.swf"
|
||||
: L"ControlTooltips\\OrbisControls.swf";
|
||||
case EControllerType::XBOXONE:
|
||||
return m_fScreenHeight >= 1080.0f
|
||||
? L"ControlTooltips\\HD\\DurangoHDControls.swf"
|
||||
: L"ControlTooltips\\DurangoControls.swf";
|
||||
case EControllerType::XBOX360:
|
||||
return m_fScreenHeight >= 1080.0f
|
||||
? L"ControlTooltips\\HD\\XboxHDControls.swf"
|
||||
: L"ControlTooltips\\XboxControls.swf";
|
||||
default:
|
||||
return m_fScreenHeight >= 1080.0f
|
||||
? L"ControlTooltips\\HD\\Windows64HDControls.swf"
|
||||
: L"ControlTooltips\\Windows64Controls.swf";
|
||||
}
|
||||
}
|
||||
|
||||
UIController::EControllerType UIController::GetControllerType(const char* controllerType)
|
||||
{
|
||||
if (strcmp(controllerType, "PS3") == 0) return EControllerType::PS3;
|
||||
if (strcmp(controllerType, "PS4") == 0) return EControllerType::PS4;
|
||||
if (strcmp(controllerType, "PS5") == 0) return EControllerType::PS5;
|
||||
if (strcmp(controllerType, "XBOXONE") == 0) return EControllerType::XBOXONE;
|
||||
if (strcmp(controllerType, "XBOX360") == 0) return EControllerType::XBOX360;
|
||||
if (strcmp(controllerType, "SWITCH") == 0) return EControllerType::SWITCH;
|
||||
if (strcmp(controllerType, "GAMECUBE") == 0) return EControllerType::GAMECUBE;
|
||||
if (strcmp(controllerType, "STANDARD") == 0) return EControllerType::STANDARD;
|
||||
|
||||
return EControllerType::UNKNOWN;
|
||||
}
|
||||
|
||||
void UIController::fetchControlTooltipSWF()
|
||||
{
|
||||
if (!m_bControllerTypeChanged)
|
||||
return;
|
||||
|
||||
if (IsReloadingSkin())
|
||||
return;
|
||||
|
||||
EControllerType ControllerType = GetControllerType(InputManager.PollControllerType(0));
|
||||
|
||||
if (ControllerType == EControllerType::UNKNOWN)
|
||||
return; // str1k3r - ignore UNKNOWN, keep last tooltip
|
||||
|
||||
if (ControllerType == m_LastControllerType)
|
||||
{
|
||||
m_bControllerTypeChanged = false;
|
||||
return; // str1k3r - nothing changed, skip reload
|
||||
}
|
||||
|
||||
m_LastControllerType = ControllerType;
|
||||
m_bControllerTypeChanged = false;
|
||||
|
||||
controlTooltipsPath = GetControlTooltipsPath(ControllerType);
|
||||
skinName = (m_fScreenHeight >= 1080.0f) ? L"skinControlTooltipsHD.swf" : L"skinControlTooltips.swf";
|
||||
|
||||
reloadSingleSkin(eLibrary_ControlTooltips, controlTooltipsPath, skinName);
|
||||
}
|
||||
#endif
|
||||
|
||||
void UIController::loadSkins()
|
||||
{
|
||||
wstring platformSkinPath = L"";
|
||||
@@ -503,10 +631,12 @@ void UIController::loadSkins()
|
||||
if(m_fScreenHeight >= 1080.0f)
|
||||
{
|
||||
platformSkinPath = L"skinHDWin.swf";
|
||||
controlTooltipsPath = GetControlTooltipsPath();
|
||||
}
|
||||
else
|
||||
{
|
||||
platformSkinPath = L"skinWin.swf";
|
||||
platformSkinPath = L"skinWin.swf";
|
||||
controlTooltipsPath = GetControlTooltipsPath();
|
||||
}
|
||||
#elif defined _DURANGO
|
||||
if(m_fScreenHeight==1080.0f)
|
||||
@@ -539,6 +669,9 @@ void UIController::loadSkins()
|
||||
m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinHDGraphicsInGame.swf", L"skinHDGraphicsInGame.swf");
|
||||
m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinHDGraphicsTooltips.swf", L"skinHDGraphicsTooltips.swf");
|
||||
m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinHDGraphicsLabels.swf", L"skinHDGraphicsLabels.swf");
|
||||
#ifdef _WINDOWS64
|
||||
m_iggyLibraries[eLibrary_ControlTooltips] = loadSkin(controlTooltipsPath, L"skinControlTooltipsHD.swf");
|
||||
#endif
|
||||
m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinHDLabels.swf", L"skinHDLabels.swf");
|
||||
m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinHDInGame.swf", L"skinHDInGame.swf");
|
||||
m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHDHud.swf", L"skinHDHud.swf");
|
||||
@@ -553,6 +686,9 @@ void UIController::loadSkins()
|
||||
m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinGraphicsInGame.swf", L"skinGraphicsInGame.swf");
|
||||
m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinGraphicsTooltips.swf", L"skinGraphicsTooltips.swf");
|
||||
m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinGraphicsLabels.swf", L"skinGraphicsLabels.swf");
|
||||
#ifdef _WINDOWS64
|
||||
m_iggyLibraries[eLibrary_ControlTooltips] = loadSkin(controlTooltipsPath, L"skinControlTooltips.swf");
|
||||
#endif
|
||||
m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinLabels.swf", L"skinLabels.swf");
|
||||
m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinInGame.swf", L"skinInGame.swf");
|
||||
m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHud.swf", L"skinHud.swf");
|
||||
@@ -567,10 +703,10 @@ IggyLibrary UIController::loadSkin(const wstring &skinPath, const wstring &skinN
|
||||
// 4J Stu - We need to load the platformskin before the normal skin, as the normal skin requires some elements from the platform skin
|
||||
if(!skinPath.empty() && app.hasArchiveFile(skinPath))
|
||||
{
|
||||
byteArray baFile = app.getArchiveFile(skinPath);
|
||||
byteArray baFile = getMovieData(skinPath); // str1k3r - replaced app.getArchiveFile(skinPath); with this to try and prevent any stutters
|
||||
lib = IggyLibraryCreateFromMemoryUTF16( (IggyUTF16 *)skinName.c_str() , (void *)baFile.data, baFile.length, NULL );
|
||||
|
||||
delete[] baFile.data;
|
||||
//delete[] baFile.data;
|
||||
#ifdef _DEBUG
|
||||
IggyMemoryUseInfo memoryInfo;
|
||||
rrbool res;
|
||||
@@ -594,6 +730,36 @@ IggyLibrary UIController::loadSkin(const wstring &skinPath, const wstring &skinN
|
||||
return lib;
|
||||
}
|
||||
|
||||
void UIController::reloadSingleSkin(ELibraries lib, const wstring &skinPath, const wstring &skinName)
|
||||
{
|
||||
if(m_iggyLibraries[lib] != IGGY_INVALID_LIBRARY)
|
||||
{
|
||||
IggyLibraryDestroy(m_iggyLibraries[lib]);
|
||||
m_iggyLibraries[lib] = IGGY_INVALID_LIBRARY;
|
||||
}
|
||||
|
||||
m_iggyLibraries[lib] = loadSkin(skinPath, skinName);
|
||||
|
||||
if(skinName == L"skinControlTooltipsHD.swf" || skinName == L"skinControlTooltips.swf")
|
||||
{
|
||||
for(unsigned int i = 0; i < eUIGroup_COUNT; ++i)
|
||||
{
|
||||
if(m_groups[i]->getTooltips())
|
||||
m_groups[i]->getTooltips()->destroyMovie();
|
||||
if(m_groups[i]->getPressStartToPlay())
|
||||
m_groups[i]->getPressStartToPlay()->destroyMovie();
|
||||
}
|
||||
|
||||
for(unsigned int i = 0; i < eUIGroup_COUNT; ++i)
|
||||
{
|
||||
if(m_groups[i]->getTooltips())
|
||||
m_groups[i]->getTooltips()->reloadMovie(true);
|
||||
if(m_groups[i]->getPressStartToPlay())
|
||||
m_groups[i]->getPressStartToPlay()->reloadMovie(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UIController::ReloadSkin()
|
||||
{
|
||||
// Destroy all scene swf
|
||||
|
||||
Reference in New Issue
Block a user