duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

game_database.h (3955B)


      1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
      2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
      3 
      4 #pragma once
      5 #include "core/types.h"
      6 #include "util/cd_image_hasher.h"
      7 #include <bitset>
      8 #include <map>
      9 #include <string>
     10 #include <string_view>
     11 #include <vector>
     12 
     13 class CDImage;
     14 
     15 struct Settings;
     16 
     17 namespace GameDatabase {
     18 enum class CompatibilityRating : u8
     19 {
     20   Unknown = 0,
     21   DoesntBoot = 1,
     22   CrashesInIntro = 2,
     23   CrashesInGame = 3,
     24   GraphicalAudioIssues = 4,
     25   NoIssues = 5,
     26   Count,
     27 };
     28 
     29 enum class Trait : u32
     30 {
     31   ForceInterpreter,
     32   ForceSoftwareRenderer,
     33   ForceSoftwareRendererForReadbacks,
     34   ForceRoundUpscaledTextureCoordinates,
     35   ForceAccurateBlending,
     36   ForceInterlacing,
     37   DisableAutoAnalogMode,
     38   DisableTrueColor,
     39   DisableUpscaling,
     40   DisableTextureFiltering,
     41   DisableSpriteTextureFiltering,
     42   DisableScaledDithering,
     43   DisableForceNTSCTimings,
     44   DisableWidescreen,
     45   DisablePGXP,
     46   DisablePGXPCulling,
     47   DisablePGXPTextureCorrection,
     48   DisablePGXPColorCorrection,
     49   DisablePGXPDepthBuffer,
     50   DisablePGXPPreserveProjFP,
     51   DisablePGXPOn2DPolygons,
     52   ForcePGXPVertexCache,
     53   ForcePGXPCPUMode,
     54   ForceRecompilerMemoryExceptions,
     55   ForceRecompilerICache,
     56   ForceRecompilerLUTFastmem,
     57   IsLibCryptProtected,
     58 
     59   Count
     60 };
     61 
     62 struct Entry
     63 {
     64   // TODO: Make string_view.
     65   std::string serial;
     66   std::string title;
     67   std::string genre;
     68   std::string developer;
     69   std::string publisher;
     70   std::string compatibility_version_tested;
     71   std::string compatibility_comments;
     72   u64 release_date;
     73   u8 min_players;
     74   u8 max_players;
     75   u8 min_blocks;
     76   u8 max_blocks;
     77   u16 supported_controllers;
     78   CompatibilityRating compatibility;
     79 
     80   std::bitset<static_cast<int>(Trait::Count)> traits{};
     81   std::optional<s16> display_active_start_offset;
     82   std::optional<s16> display_active_end_offset;
     83   std::optional<s8> display_line_start_offset;
     84   std::optional<s8> display_line_end_offset;
     85   std::optional<DisplayCropMode> display_crop_mode;
     86   std::optional<DisplayDeinterlacingMode> display_deinterlacing_mode;
     87   std::optional<GPULineDetectMode> gpu_line_detect_mode;
     88   std::optional<u32> dma_max_slice_ticks;
     89   std::optional<u32> dma_halt_ticks;
     90   std::optional<u32> gpu_fifo_size;
     91   std::optional<u32> gpu_max_run_ahead;
     92   std::optional<float> gpu_pgxp_tolerance;
     93   std::optional<float> gpu_pgxp_depth_threshold;
     94 
     95   std::string disc_set_name;
     96   std::vector<std::string> disc_set_serials;
     97 
     98   ALWAYS_INLINE bool HasTrait(Trait trait) const { return traits[static_cast<int>(trait)]; }
     99 
    100   void ApplySettings(Settings& settings, bool display_osd_messages) const;
    101 
    102   std::string GenerateCompatibilityReport() const;
    103 };
    104 
    105 void EnsureLoaded();
    106 void Unload();
    107 
    108 const Entry* GetEntryForDisc(CDImage* image);
    109 const Entry* GetEntryForGameDetails(const std::string& id, u64 hash);
    110 const Entry* GetEntryForSerial(std::string_view serial);
    111 std::string GetSerialForDisc(CDImage* image);
    112 std::string GetSerialForPath(const char* path);
    113 
    114 const char* GetTraitName(Trait trait);
    115 const char* GetTraitDisplayName(Trait trait);
    116 
    117 const char* GetCompatibilityRatingName(CompatibilityRating rating);
    118 const char* GetCompatibilityRatingDisplayName(CompatibilityRating rating);
    119 
    120 /// Map of track hashes for image verification
    121 struct TrackData
    122 {
    123   TrackData(std::string serial_, std::string revision_str_, uint32_t revision_)
    124     : serial(std::move(serial_)), revision_str(std::move(revision_str_)), revision(revision_)
    125   {
    126   }
    127 
    128   friend bool operator==(const TrackData& left, const TrackData& right)
    129   {
    130     // 'revisionString' is deliberately ignored in comparisons as it's redundant with comparing 'revision'! Do not
    131     // change!
    132     return left.serial == right.serial && left.revision == right.revision;
    133   }
    134 
    135   std::string serial;
    136   std::string revision_str;
    137   u32 revision;
    138 };
    139 
    140 using TrackHashesMap = std::multimap<CDImageHasher::Hash, TrackData>;
    141 const TrackHashesMap& GetTrackHashesMap();
    142 void EnsureTrackHashesMapLoaded();
    143 
    144 } // namespace GameDatabase