Fixing player

This commit is contained in:
SergioMartin86 2024-07-28 17:07:38 +02:00
parent 501efec81e
commit 97ccbc3174
2 changed files with 40 additions and 31 deletions

View File

@ -15,7 +15,8 @@
struct stepData_t struct stepData_t
{ {
std::string input; std::string inputString;
jaffar::input_t decodedInput;
uint8_t *stateData; uint8_t *stateData;
jaffarCommon::hash::hash_t hash; jaffarCommon::hash::hash_t hash;
}; };
@ -26,10 +27,11 @@ class PlaybackInstance
static const uint16_t image_height = 240; static const uint16_t image_height = 240;
public: public:
void addStep(const std::string &input) void addStep(const std::string &inputString, const jaffar::input_t decodedInput)
{ {
stepData_t step; stepData_t step;
step.input = input; step.inputString = inputString;
step.decodedInput = decodedInput;
step.stateData = (uint8_t *)malloc(_emu->getFullStateSize()); step.stateData = (uint8_t *)malloc(_emu->getFullStateSize());
jaffarCommon::serializer::Contiguous serializer(step.stateData); jaffarCommon::serializer::Contiguous serializer(step.stateData);
@ -92,18 +94,24 @@ class PlaybackInstance
void initialize(const std::vector<std::string> &sequence) void initialize(const std::vector<std::string> &sequence)
{ {
// Getting input decoder
auto inputParser = _emu->getInputParser();
// Building sequence information // Building sequence information
for (const auto &input : sequence) for (const auto &input : sequence)
{ {
// Getting decoded input
const auto decodedInput = inputParser->parseInputString(input);
// Adding new step // Adding new step
addStep(input); addStep(input, decodedInput);
// Advance state based on the input received // Advance state based on the input received
_emu->advanceState(input); _emu->advanceState(decodedInput);
} }
// Adding last step with no input // Adding last step with no input
addStep("<End Of Sequence>"); addStep("<End Of Sequence>", jaffar::input_t());
} }
void enableRendering(SDL_Window *window) void enableRendering(SDL_Window *window)
@ -149,14 +157,14 @@ class PlaybackInstance
// Load correct overlay images, if using overlay // Load correct overlay images, if using overlay
if (_useOverlay == true) if (_useOverlay == true)
{ {
if (step.input.find("A") != std::string::npos) overlayButtonASurface = _overlayButtonASurface; if (step.inputString.find("A") != std::string::npos) overlayButtonASurface = _overlayButtonASurface;
if (step.input.find("B") != std::string::npos) overlayButtonBSurface = _overlayButtonBSurface; if (step.inputString.find("B") != std::string::npos) overlayButtonBSurface = _overlayButtonBSurface;
if (step.input.find("S") != std::string::npos) overlayButtonSelectSurface = _overlayButtonSelectSurface; if (step.inputString.find("S") != std::string::npos) overlayButtonSelectSurface = _overlayButtonSelectSurface;
if (step.input.find("T") != std::string::npos) overlayButtonStartSurface = _overlayButtonStartSurface; if (step.inputString.find("T") != std::string::npos) overlayButtonStartSurface = _overlayButtonStartSurface;
if (step.input.find("L") != std::string::npos) overlayButtonLeftSurface = _overlayButtonLeftSurface; if (step.inputString.find("L") != std::string::npos) overlayButtonLeftSurface = _overlayButtonLeftSurface;
if (step.input.find("R") != std::string::npos) overlayButtonRightSurface = _overlayButtonRightSurface; if (step.inputString.find("R") != std::string::npos) overlayButtonRightSurface = _overlayButtonRightSurface;
if (step.input.find("U") != std::string::npos) overlayButtonUpSurface = _overlayButtonUpSurface; if (step.inputString.find("U") != std::string::npos) overlayButtonUpSurface = _overlayButtonUpSurface;
if (step.input.find("D") != std::string::npos) overlayButtonDownSurface = _overlayButtonDownSurface; if (step.inputString.find("D") != std::string::npos) overlayButtonDownSurface = _overlayButtonDownSurface;
} }
// Since we do not store the blit information (too much memory), we need to load the previous frame and re-run the input // Since we do not store the blit information (too much memory), we need to load the previous frame and re-run the input
@ -170,7 +178,7 @@ class PlaybackInstance
const auto stateData = getStateData(stepId - 1); const auto stateData = getStateData(stepId - 1);
jaffarCommon::deserializer::Contiguous deserializer(stateData); jaffarCommon::deserializer::Contiguous deserializer(stateData);
_emu->deserializeState(deserializer); _emu->deserializeState(deserializer);
_emu->advanceState(getStateInput(stepId - 1)); _emu->advanceState(getDecodedInput(stepId - 1));
} }
// Updating image // Updating image
@ -184,7 +192,7 @@ class PlaybackInstance
return _stepSequence.size(); return _stepSequence.size();
} }
const std::string getInput(const size_t stepId) const const std::string getInputString(const size_t stepId) const
{ {
// Checking the required step id does not exceed contents of the sequence // Checking the required step id does not exceed contents of the sequence
if (stepId > _stepSequence.size()) JAFFAR_THROW_LOGIC("[Error] Attempting to render a step larger than the step sequence"); if (stepId > _stepSequence.size()) JAFFAR_THROW_LOGIC("[Error] Attempting to render a step larger than the step sequence");
@ -193,7 +201,19 @@ class PlaybackInstance
const auto &step = _stepSequence[stepId]; const auto &step = _stepSequence[stepId];
// Returning step input // Returning step input
return step.input; return step.inputString;
}
const jaffar::input_t getDecodedInput(const size_t stepId) const
{
// Checking the required step id does not exceed contents of the sequence
if (stepId > _stepSequence.size()) JAFFAR_THROW_LOGIC("[Error] Attempting to render a step larger than the step sequence");
// Getting step information
const auto &step = _stepSequence[stepId];
// Returning step input
return step.decodedInput;
} }
const uint8_t *getStateData(const size_t stepId) const const uint8_t *getStateData(const size_t stepId) const
@ -220,17 +240,6 @@ class PlaybackInstance
return step.hash; return step.hash;
} }
const std::string getStateInput(const size_t stepId) const
{
// Checking the required step id does not exceed contents of the sequence
if (stepId > _stepSequence.size()) JAFFAR_THROW_LOGIC("[Error] Attempting to render a step larger than the step sequence");
// Getting step information
const auto &step = _stepSequence[stepId];
// Returning step input
return step.input;
}
private: private:
// Internal sequence information // Internal sequence information

View File

@ -115,7 +115,7 @@ int main(int argc, char *argv[])
nlohmann::json emulatorConfig; nlohmann::json emulatorConfig;
emulatorConfig["Controller 1 Type"] = controller1Type; emulatorConfig["Controller 1 Type"] = controller1Type;
emulatorConfig["Controller 2 Type"] = controller2Type; emulatorConfig["Controller 2 Type"] = controller2Type;
NESInstance e; NESInstance e(emulatorConfig);
// Loading ROM File // Loading ROM File
std::string romFileData; std::string romFileData;
@ -165,7 +165,7 @@ int main(int argc, char *argv[])
if (disableRender == false) p.renderFrame(currentStep); if (disableRender == false) p.renderFrame(currentStep);
// Getting input // Getting input
const auto &input = p.getStateInput(currentStep); const auto &inputString = p.getInputString(currentStep);
// Getting state hash // Getting state hash
const auto hash = p.getStateHash(currentStep); const auto hash = p.getStateHash(currentStep);
@ -180,7 +180,7 @@ int main(int argc, char *argv[])
jaffarCommon::logger::log("[] ----------------------------------------------------------------\n"); jaffarCommon::logger::log("[] ----------------------------------------------------------------\n");
jaffarCommon::logger::log("[] Current Step #: %lu / %lu\n", currentStep + 1, sequenceLength); jaffarCommon::logger::log("[] Current Step #: %lu / %lu\n", currentStep + 1, sequenceLength);
jaffarCommon::logger::log("[] Input: %s\n", input.c_str()); jaffarCommon::logger::log("[] Input: %s\n", inputString.c_str());
jaffarCommon::logger::log("[] State Hash: 0x%lX%lX\n", hash.first, hash.second); jaffarCommon::logger::log("[] State Hash: 0x%lX%lX\n", hash.first, hash.second);
// Only print commands if not in reproduce mode // Only print commands if not in reproduce mode