mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 21:30:19 -06:00
Add achievement support for Wii and WiiWare
Add a method to detect console ID from an input file and instruct rcheevos to load as Gamecube or Wii accordingly. Also, hash .wads upon loading, to support achievements on WiiWare titles.
This commit is contained in:
@ -11,7 +11,6 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <rcheevos/include/rc_api_info.h>
|
#include <rcheevos/include/rc_api_info.h>
|
||||||
#include <rcheevos/include/rc_hash.h>
|
|
||||||
|
|
||||||
#include "Common/Assert.h"
|
#include "Common/Assert.h"
|
||||||
#include "Common/BitUtils.h"
|
#include "Common/BitUtils.h"
|
||||||
@ -192,14 +191,11 @@ void AchievementManager::LoadGame(const DiscIO::Volume* volume)
|
|||||||
else
|
else
|
||||||
m_title_estimate = "";
|
m_title_estimate = "";
|
||||||
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
|
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
|
||||||
if (volume)
|
|
||||||
{
|
|
||||||
if (!m_loading_volume)
|
if (!m_loading_volume)
|
||||||
{
|
{
|
||||||
m_loading_volume = DiscIO::CreateVolume(volume->GetBlobReader().CopyReader());
|
m_loading_volume = DiscIO::CreateVolume(volume->GetBlobReader().CopyReader());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
std::lock_guard lg{m_filereader_lock};
|
std::lock_guard lg{m_filereader_lock};
|
||||||
rc_hash_filereader volume_reader{
|
rc_hash_filereader volume_reader{
|
||||||
.open = &AchievementManager::FilereaderOpen,
|
.open = &AchievementManager::FilereaderOpen,
|
||||||
@ -215,9 +211,10 @@ void AchievementManager::LoadGame(const DiscIO::Volume* volume)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
u32 console_id = FindConsoleID(volume->GetVolumeType());
|
||||||
rc_client_set_read_memory_function(m_client, MemoryVerifier);
|
rc_client_set_read_memory_function(m_client, MemoryVerifier);
|
||||||
rc_client_begin_identify_and_load_game(m_client, RC_CONSOLE_GAMECUBE, "", NULL,
|
rc_client_begin_identify_and_load_game(m_client, console_id, "", NULL, 0, LoadGameCallback,
|
||||||
0, LoadGameCallback, NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +248,8 @@ std::string AchievementManager::CalculateHash(const std::string& file_path)
|
|||||||
.close = &AchievementManager::FilereaderClose,
|
.close = &AchievementManager::FilereaderClose,
|
||||||
};
|
};
|
||||||
rc_hash_init_custom_filereader(&volume_reader);
|
rc_hash_init_custom_filereader(&volume_reader);
|
||||||
rc_hash_generate_from_file(hash_result, RC_CONSOLE_GAMECUBE, file_path.c_str());
|
u32 console_id = FindConsoleID(GetInstance().m_loading_volume->GetVolumeType());
|
||||||
|
rc_hash_generate_from_file(hash_result, console_id, file_path.c_str());
|
||||||
|
|
||||||
return std::string(hash_result);
|
return std::string(hash_result);
|
||||||
}
|
}
|
||||||
@ -835,6 +833,20 @@ void AchievementManager::FilereaderClose(void* file_handle)
|
|||||||
delete static_cast<FilereaderState*>(file_handle);
|
delete static_cast<FilereaderState*>(file_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 AchievementManager::FindConsoleID(const DiscIO::Platform& platform)
|
||||||
|
{
|
||||||
|
switch (platform)
|
||||||
|
{
|
||||||
|
case DiscIO::Platform::GameCubeDisc:
|
||||||
|
return RC_CONSOLE_GAMECUBE;
|
||||||
|
case DiscIO::Platform::WiiDisc:
|
||||||
|
case DiscIO::Platform::WiiWAD:
|
||||||
|
return RC_CONSOLE_WII;
|
||||||
|
default:
|
||||||
|
return RC_CONSOLE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AchievementManager::LoadDefaultBadges()
|
void AchievementManager::LoadDefaultBadges()
|
||||||
{
|
{
|
||||||
std::lock_guard lg{m_lock};
|
std::lock_guard lg{m_lock};
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <rcheevos/include/rc_api_runtime.h>
|
#include <rcheevos/include/rc_api_runtime.h>
|
||||||
#include <rcheevos/include/rc_api_user.h>
|
#include <rcheevos/include/rc_api_user.h>
|
||||||
#include <rcheevos/include/rc_client.h>
|
#include <rcheevos/include/rc_client.h>
|
||||||
|
#include <rcheevos/include/rc_hash.h>
|
||||||
#include <rcheevos/include/rc_runtime.h>
|
#include <rcheevos/include/rc_runtime.h>
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
@ -199,6 +200,8 @@ private:
|
|||||||
static size_t FilereaderRead(void* file_handle, void* buffer, size_t requested_bytes);
|
static size_t FilereaderRead(void* file_handle, void* buffer, size_t requested_bytes);
|
||||||
static void FilereaderClose(void* file_handle);
|
static void FilereaderClose(void* file_handle);
|
||||||
|
|
||||||
|
static u32 FindConsoleID(const DiscIO::Platform& platform);
|
||||||
|
|
||||||
void LoadDefaultBadges();
|
void LoadDefaultBadges();
|
||||||
static void LoginCallback(int result, const char* error_message, rc_client_t* client,
|
static void LoginCallback(int result, const char* error_message, rc_client_t* client,
|
||||||
void* userdata);
|
void* userdata);
|
||||||
|
@ -623,6 +623,8 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
|
|||||||
if (!Boot_WiiWAD(system, wad))
|
if (!Boot_WiiWAD(system, wad))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
AchievementManager::GetInstance().LoadGame(&wad);
|
||||||
|
|
||||||
SConfig::OnTitleDirectlyBooted(guard);
|
SConfig::OnTitleDirectlyBooted(guard);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user