mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 22:09:19 -07:00
a41166bb37
Instead of comparing the game ID, revision, disc number and name, we can compare a hash of important parts of the disc including all the aforementioned data but also additional data such as the FST. The primary reason why I'm making this change is to let us catch more desyncs before they happen, but this should also fix https://bugs.dolphin-emu.org/issues/12115. As a bonus, the UI can now distinguish the case where a client doesn't have the game at all from the case where a client has the wrong version of the game.
110 lines
3.5 KiB
C++
110 lines
3.5 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "Common/Lazy.h"
|
|
#include "DiscIO/Filesystem.h"
|
|
#include "DiscIO/Volume.h"
|
|
#include "DiscIO/VolumeDisc.h"
|
|
|
|
namespace DiscIO
|
|
{
|
|
class BlobReader;
|
|
enum class BlobType;
|
|
enum class Country;
|
|
class FileSystem;
|
|
enum class Language;
|
|
enum class Region;
|
|
enum class Platform;
|
|
|
|
class VolumeGC : public VolumeDisc
|
|
{
|
|
public:
|
|
VolumeGC(std::unique_ptr<BlobReader> reader);
|
|
~VolumeGC();
|
|
bool Read(u64 offset, u64 length, u8* buffer,
|
|
const Partition& partition = PARTITION_NONE) const override;
|
|
const FileSystem* GetFileSystem(const Partition& partition = PARTITION_NONE) const override;
|
|
std::string GetGameTDBID(const Partition& partition = PARTITION_NONE) const override;
|
|
std::map<Language, std::string> GetShortNames() const override;
|
|
std::map<Language, std::string> GetLongNames() const override;
|
|
std::map<Language, std::string> GetShortMakers() const override;
|
|
std::map<Language, std::string> GetLongMakers() const override;
|
|
std::map<Language, std::string> GetDescriptions() const override;
|
|
std::vector<u32> GetBanner(u32* width, u32* height) const override;
|
|
|
|
Platform GetVolumeType() const override;
|
|
bool IsDatelDisc() const override;
|
|
Region GetRegion() const override;
|
|
BlobType GetBlobType() const override;
|
|
u64 GetSize() const override;
|
|
bool IsSizeAccurate() const override;
|
|
u64 GetRawSize() const override;
|
|
const BlobReader& GetBlobReader() const override;
|
|
|
|
std::array<u8, 20> GetSyncHash() const override;
|
|
|
|
private:
|
|
static const u32 GC_BANNER_WIDTH = 96;
|
|
static const u32 GC_BANNER_HEIGHT = 32;
|
|
|
|
struct GCBannerInformation
|
|
{
|
|
char short_name[32]; // Short game title shown in IPL menu
|
|
char short_maker[32]; // Short developer, publisher names shown in IPL menu
|
|
char long_name[64]; // Long game title shown in IPL game start screen
|
|
char long_maker[64]; // Long developer, publisher names shown in IPL game
|
|
// start screen
|
|
char description[128]; // Game description shown in IPL game start screen in
|
|
// two lines.
|
|
};
|
|
|
|
struct GCBanner
|
|
{
|
|
u32 id; // "BNR1" for NTSC, "BNR2" for PAL
|
|
u32 padding[7];
|
|
u16 image[GC_BANNER_WIDTH * GC_BANNER_HEIGHT]; // RGB5A3 96x32 image
|
|
GCBannerInformation information[6]; // information comes in six languages
|
|
// (only one for BNR1 type)
|
|
};
|
|
|
|
struct ConvertedGCBanner
|
|
{
|
|
ConvertedGCBanner();
|
|
~ConvertedGCBanner();
|
|
|
|
std::map<Language, std::string> short_names;
|
|
std::map<Language, std::string> long_names;
|
|
std::map<Language, std::string> short_makers;
|
|
std::map<Language, std::string> long_makers;
|
|
std::map<Language, std::string> descriptions;
|
|
|
|
std::vector<u32> image_buffer;
|
|
u32 image_height = 0;
|
|
u32 image_width = 0;
|
|
};
|
|
|
|
ConvertedGCBanner LoadBannerFile() const;
|
|
ConvertedGCBanner ExtractBannerInformation(const GCBanner& banner_file, bool is_bnr1) const;
|
|
|
|
static const size_t BNR1_SIZE = sizeof(GCBanner) - sizeof(GCBannerInformation) * 5;
|
|
static const size_t BNR2_SIZE = sizeof(GCBanner);
|
|
|
|
Common::Lazy<ConvertedGCBanner> m_converted_banner;
|
|
|
|
Common::Lazy<std::unique_ptr<FileSystem>> m_file_system;
|
|
|
|
std::unique_ptr<BlobReader> m_reader;
|
|
};
|
|
|
|
} // namespace DiscIO
|