mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
2e8c5b4521
It is my opinion that nobody should use NKit disc images without being aware of the drawbacks of them. Since it seems like almost nobody who is using NKit disc images knows what NKit is (hmm, now how could that have happened...?), I am adding a warning to Dolphin so that you can't run NKit disc images without finding out about the drawbacks. In case someone really does want to use NKit disc images, the warning has a "Don't show this again" option. Unfortunately, I can't retroactively add the warning where it's most needed: in Dolphin 5.0, which does not support Wii NKit disc images.
94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
// Copyright 2020 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "DiscIO/VolumeDisc.h"
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "DiscIO/Enums.h"
|
|
|
|
namespace DiscIO
|
|
{
|
|
std::string VolumeDisc::GetGameID(const Partition& partition) const
|
|
{
|
|
char id[6];
|
|
|
|
if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id), partition))
|
|
return std::string();
|
|
|
|
return DecodeString(id);
|
|
}
|
|
|
|
Country VolumeDisc::GetCountry(const Partition& partition) const
|
|
{
|
|
// The 0 that we use as a default value is mapped to Country::Unknown and Region::Unknown
|
|
const u8 country_byte = ReadSwapped<u8>(3, partition).value_or(0);
|
|
const Region region = GetRegion();
|
|
const std::optional<u16> revision = GetRevision();
|
|
|
|
if (CountryCodeToRegion(country_byte, GetVolumeType(), region, revision) != region)
|
|
return TypicalCountryForRegion(region);
|
|
|
|
return CountryCodeToCountry(country_byte, GetVolumeType(), region, revision);
|
|
}
|
|
|
|
Region VolumeDisc::RegionCodeToRegion(std::optional<u32> region_code) const
|
|
{
|
|
if (!region_code)
|
|
return Region::Unknown;
|
|
|
|
const Region region = static_cast<Region>(*region_code);
|
|
return region <= Region::NTSC_K ? region : Region::Unknown;
|
|
}
|
|
|
|
std::string VolumeDisc::GetMakerID(const Partition& partition) const
|
|
{
|
|
char maker_id[2];
|
|
|
|
if (!Read(0x4, sizeof(maker_id), reinterpret_cast<u8*>(&maker_id), partition))
|
|
return std::string();
|
|
|
|
return DecodeString(maker_id);
|
|
}
|
|
|
|
std::optional<u16> VolumeDisc::GetRevision(const Partition& partition) const
|
|
{
|
|
std::optional<u8> revision = ReadSwapped<u8>(7, partition);
|
|
return revision ? *revision : std::optional<u16>();
|
|
}
|
|
|
|
std::string VolumeDisc::GetInternalName(const Partition& partition) const
|
|
{
|
|
char name[0x60];
|
|
if (!Read(0x20, sizeof(name), reinterpret_cast<u8*>(&name), partition))
|
|
return std::string();
|
|
|
|
return DecodeString(name);
|
|
}
|
|
|
|
std::string VolumeDisc::GetApploaderDate(const Partition& partition) const
|
|
{
|
|
char date[16];
|
|
|
|
if (!Read(0x2440, sizeof(date), reinterpret_cast<u8*>(&date), partition))
|
|
return std::string();
|
|
|
|
return DecodeString(date);
|
|
}
|
|
|
|
std::optional<u8> VolumeDisc::GetDiscNumber(const Partition& partition) const
|
|
{
|
|
return ReadSwapped<u8>(6, partition);
|
|
}
|
|
|
|
bool VolumeDisc::IsNKit() const
|
|
{
|
|
constexpr u32 NKIT_MAGIC = 0x4E4B4954; // "NKIT"
|
|
return ReadSwapped<u32>(0x200, PARTITION_NONE) == NKIT_MAGIC;
|
|
}
|
|
|
|
} // namespace DiscIO
|