From 2f25f2fc70a96f8ec0987f9ce26e0aaf54058c9e Mon Sep 17 00:00:00 2001 From: mkwong98 Date: Wed, 11 Aug 2021 09:52:55 +0800 Subject: [PATCH] Add HD pack conditions for matching which sprite palette is being used The condition names are sppalette0, sppalette1, sppalette2, sppalette3 --- Core/HdData.h | 1 + Core/HdPackConditions.h | 49 +++++++++++++++++++++++++++++++++++++++++ Core/HdPackLoader.cpp | 32 +++++++++++++++++++++++++++ Core/HdPpu.cpp | 1 + 4 files changed, 83 insertions(+) diff --git a/Core/HdData.h b/Core/HdData.h index afaea444..dc76338c 100644 --- a/Core/HdData.h +++ b/Core/HdData.h @@ -90,6 +90,7 @@ struct HdPpuTileInfo : public HdTileKey uint8_t BgColor; uint8_t SpriteColor; uint8_t PpuBackgroundColor; + uint32_t PaletteOffset; uint8_t OAMIndex; }; diff --git a/Core/HdPackConditions.h b/Core/HdPackConditions.h index b35a7241..e11ac4d0 100644 --- a/Core/HdPackConditions.h +++ b/Core/HdPackConditions.h @@ -135,6 +135,55 @@ struct HdPackBgPriorityCondition : public HdPackCondition } }; +struct HdPackSpPalette0Condition : public HdPackCondition +{ + string GetConditionName() override { return "sppalette0"; } + string ToString() override { return ""; } + bool IsExcludedFromFile() override { return true; } + + bool InternalCheckCondition(HdScreenInfo* screenInfo, int x, int y, HdPpuTileInfo* tile) override + { + return tile && ((0x03 & (tile->PaletteOffset >> 2)) == 0x00); + } +}; + +struct HdPackSpPalette1Condition : public HdPackCondition +{ + string GetConditionName() override { return "sppalette1"; } + string ToString() override { return ""; } + bool IsExcludedFromFile() override { return true; } + + bool InternalCheckCondition(HdScreenInfo* screenInfo, int x, int y, HdPpuTileInfo* tile) override + { + return tile && ((0x03 & (tile->PaletteOffset >> 2)) == 0x01); + } +}; + +struct HdPackSpPalette2Condition : public HdPackCondition +{ + string GetConditionName() override { return "sppalette2"; } + string ToString() override { return ""; } + bool IsExcludedFromFile() override { return true; } + + bool InternalCheckCondition(HdScreenInfo* screenInfo, int x, int y, HdPpuTileInfo* tile) override + { + return tile && ((0x03 & (tile->PaletteOffset >> 2)) == 0x02); + } +}; + +struct HdPackSpPalette3Condition : public HdPackCondition +{ + string GetConditionName() override { return "sppalette3"; } + string ToString() override { return ""; } + bool IsExcludedFromFile() override { return true; } + + bool InternalCheckCondition(HdScreenInfo* screenInfo, int x, int y, HdPpuTileInfo* tile) override + { + return tile && ((0x03 & (tile->PaletteOffset >> 2)) == 0x03); + } +}; + + struct HdPackMemoryCheckCondition : public HdPackBaseMemoryCondition { HdPackMemoryCheckCondition() { _useCache = true; } diff --git a/Core/HdPackLoader.cpp b/Core/HdPackLoader.cpp index 3d7d7b93..cddfaa5e 100644 --- a/Core/HdPackLoader.cpp +++ b/Core/HdPackLoader.cpp @@ -273,6 +273,38 @@ void HdPackLoader::InitializeGlobalConditions() HdPackCondition* invBgpriority = new HdPackBgPriorityCondition(); invBgpriority->Name = "!bgpriority"; _data->Conditions.push_back(unique_ptr(invBgpriority)); + + HdPackCondition* sppalette0 = new HdPackSpPalette0Condition(); + sppalette0->Name = "sppalette0"; + _data->Conditions.push_back(unique_ptr(sppalette0)); + + HdPackCondition* invSppalette0 = new HdPackSpPalette0Condition(); + invSppalette0->Name = "!sppalette0"; + _data->Conditions.push_back(unique_ptr(invSppalette0)); + + HdPackCondition* sppalette1 = new HdPackSpPalette1Condition(); + sppalette1->Name = "sppalette1"; + _data->Conditions.push_back(unique_ptr(sppalette1)); + + HdPackCondition* invSppalette1 = new HdPackSpPalette1Condition(); + invSppalette1->Name = "!sppalette1"; + _data->Conditions.push_back(unique_ptr(invSppalette1)); + + HdPackCondition* sppalette2 = new HdPackSpPalette2Condition(); + sppalette2->Name = "sppalette2"; + _data->Conditions.push_back(unique_ptr(sppalette2)); + + HdPackCondition* invSppalette2 = new HdPackSpPalette2Condition(); + invSppalette2->Name = "!sppalette2"; + _data->Conditions.push_back(unique_ptr(invSppalette2)); + + HdPackCondition* sppalette3 = new HdPackSpPalette3Condition(); + sppalette3->Name = "sppalette3"; + _data->Conditions.push_back(unique_ptr(sppalette3)); + + HdPackCondition* invSppalette3 = new HdPackSpPalette3Condition(); + invSppalette3->Name = "!sppalette3"; + _data->Conditions.push_back(unique_ptr(invSppalette3)); } void HdPackLoader::ProcessOverscanTag(vector &tokens) diff --git a/Core/HdPpu.cpp b/Core/HdPpu.cpp index 41bf45cb..92946d11 100644 --- a/Core/HdPpu.cpp +++ b/Core/HdPpu.cpp @@ -96,6 +96,7 @@ void HdPpu::DrawPixel() } else { tileInfo.Sprite[j].SpriteColor = ReadPaletteRAM(sprite.PaletteOffset + tileInfo.Sprite[j].SpriteColorIndex); } + tileInfo.Sprite[j].PaletteOffset = sprite.PaletteOffset; tileInfo.Sprite[j].PpuBackgroundColor = tileInfo.Tile.PpuBackgroundColor; tileInfo.Sprite[j].BgColorIndex = tileInfo.Tile.BgColorIndex;