mirror of
https://github.com/LNH-team/pico-launcher.git
synced 2026-06-02 17:16:57 +02:00
- AdvancedPaletteManager incorrectly handled negative y positions - FocusManager still had a pointer to a view that was destroyed in the cheats panel. After changing focus, memory got corrupted.
81 lines
2.6 KiB
C++
81 lines
2.6 KiB
C++
#include "common.h"
|
|
#include <string.h>
|
|
#include "PicoLoaderCheatDataFactory.h"
|
|
|
|
pload_cheats_t* PicoLoaderCheatDataFactory::CreateCheatData(const std::unique_ptr<GameCheats>& gameCheats) const
|
|
{
|
|
pload_cheats_t* cheatData = nullptr;
|
|
if (gameCheats)
|
|
{
|
|
u32 totalNumberOfCheats = 0;
|
|
u32 requiredSize = GetCheatEntryRequiredSize(gameCheats.get(), totalNumberOfCheats);
|
|
if (totalNumberOfCheats != 0)
|
|
{
|
|
requiredSize += sizeof(u32) * 2;
|
|
cheatData = (pload_cheats_t*)new u8[requiredSize];
|
|
cheatData->length = requiredSize;
|
|
cheatData->numberOfCheats = totalNumberOfCheats;
|
|
u8* buffer = (u8*)&cheatData->firstCheat;
|
|
GetCheatEntryData(gameCheats.get(), buffer);
|
|
}
|
|
}
|
|
|
|
return cheatData;
|
|
}
|
|
|
|
u32 PicoLoaderCheatDataFactory::GetCheatEntryRequiredSize(const CheatEntry* cheatEntry, u32& totalNumberOfCheats) const
|
|
{
|
|
u32 requiredSize = 0;
|
|
if (cheatEntry->IsCheatCategory())
|
|
{
|
|
u32 numberOfSubEntries = 0;
|
|
auto subEntries = cheatEntry->GetSubEntries(numberOfSubEntries);
|
|
for (u32 i = 0; i < numberOfSubEntries; i++)
|
|
{
|
|
requiredSize += GetCheatEntryRequiredSize(&subEntries[i], totalNumberOfCheats);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (cheatEntry->GetIsCheatActive())
|
|
{
|
|
u32 cheatDataLength = 0;
|
|
cheatEntry->GetCheatData(cheatDataLength);
|
|
requiredSize += sizeof(u32) + ((cheatDataLength + 7) & ~7);
|
|
totalNumberOfCheats++;
|
|
}
|
|
}
|
|
|
|
return requiredSize;
|
|
}
|
|
|
|
void PicoLoaderCheatDataFactory::GetCheatEntryData(const CheatEntry* cheatEntry, u8*& buffer) const
|
|
{
|
|
if (cheatEntry->IsCheatCategory())
|
|
{
|
|
u32 numberOfSubEntries = 0;
|
|
auto subEntries = cheatEntry->GetSubEntries(numberOfSubEntries);
|
|
for (u32 i = 0; i < numberOfSubEntries; i++)
|
|
{
|
|
GetCheatEntryData(&subEntries[i], buffer);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (cheatEntry->GetIsCheatActive())
|
|
{
|
|
u32 cheatDataLength = 0;
|
|
auto cheatData = cheatEntry->GetCheatData(cheatDataLength);
|
|
u32 paddedCheatDataLength = (cheatDataLength + 7) & ~7;
|
|
*(u32*)buffer = paddedCheatDataLength;
|
|
buffer += sizeof(u32);
|
|
memcpy(buffer, cheatData, cheatDataLength);
|
|
if (cheatDataLength != paddedCheatDataLength)
|
|
{
|
|
memset(buffer + cheatDataLength, 0, paddedCheatDataLength - cheatDataLength);
|
|
}
|
|
buffer += paddedCheatDataLength;
|
|
}
|
|
}
|
|
}
|