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
{
std::string input;
std::string inputString;
jaffar::input_t decodedInput;
uint8_t *stateData;
jaffarCommon::hash::hash_t hash;
};
@ -26,10 +27,11 @@ class PlaybackInstance
static const uint16_t image_height = 240;
public:
void addStep(const std::string &input)
void addStep(const std::string &inputString, const jaffar::input_t decodedInput)
{
stepData_t step;
step.input = input;
step.inputString = inputString;
step.decodedInput = decodedInput;
step.stateData = (uint8_t *)malloc(_emu->getFullStateSize());
jaffarCommon::serializer::Contiguous serializer(step.stateData);
@ -92,18 +94,24 @@ class PlaybackInstance
void initialize(const std::vector<std::string> &sequence)
{
// Getting input decoder
auto inputParser = _emu->getInputParser();
// Building sequence information
for (const auto &input : sequence)
{
// Getting decoded input
const auto decodedInput = inputParser->parseInputString(input);
// Adding new step
addStep(input);
addStep(input, decodedInput);
// Advance state based on the input received
_emu->advanceState(input);
_emu->advanceState(decodedInput);
}
// Adding last step with no input
addStep("<End Of Sequence>");
addStep("<End Of Sequence>", jaffar::input_t());
}
void enableRendering(SDL_Window *window)
@ -149,14 +157,14 @@ class PlaybackInstance
// Load correct overlay images, if using overlay
if (_useOverlay == true)
{
if (step.input.find("A") != std::string::npos) overlayButtonASurface = _overlayButtonASurface;
if (step.input.find("B") != std::string::npos) overlayButtonBSurface = _overlayButtonBSurface;
if (step.input.find("S") != std::string::npos) overlayButtonSelectSurface = _overlayButtonSelectSurface;
if (step.input.find("T") != std::string::npos) overlayButtonStartSurface = _overlayButtonStartSurface;
if (step.input.find("L") != std::string::npos) overlayButtonLeftSurface = _overlayButtonLeftSurface;
if (step.input.find("R") != std::string::npos) overlayButtonRightSurface = _overlayButtonRightSurface;
if (step.input.find("U") != std::string::npos) overlayButtonUpSurface = _overlayButtonUpSurface;
if (step.input.find("D") != std::string::npos) overlayButtonDownSurface = _overlayButtonDownSurface;
if (step.inputString.find("A") != std::string::npos) overlayButtonASurface = _overlayButtonASurface;
if (step.inputString.find("B") != std::string::npos) overlayButtonBSurface = _overlayButtonBSurface;
if (step.inputString.find("S") != std::string::npos) overlayButtonSelectSurface = _overlayButtonSelectSurface;
if (step.inputString.find("T") != std::string::npos) overlayButtonStartSurface = _overlayButtonStartSurface;
if (step.inputString.find("L") != std::string::npos) overlayButtonLeftSurface = _overlayButtonLeftSurface;
if (step.inputString.find("R") != std::string::npos) overlayButtonRightSurface = _overlayButtonRightSurface;
if (step.inputString.find("U") != std::string::npos) overlayButtonUpSurface = _overlayButtonUpSurface;
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
@ -170,7 +178,7 @@ class PlaybackInstance
const auto stateData = getStateData(stepId - 1);
jaffarCommon::deserializer::Contiguous deserializer(stateData);
_emu->deserializeState(deserializer);
_emu->advanceState(getStateInput(stepId - 1));
_emu->advanceState(getDecodedInput(stepId - 1));
}
// Updating image
@ -184,7 +192,7 @@ class PlaybackInstance
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
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];
// 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
@ -220,17 +240,6 @@ class PlaybackInstance
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:
// Internal sequence information

View File

@ -115,7 +115,7 @@ int main(int argc, char *argv[])
nlohmann::json emulatorConfig;
emulatorConfig["Controller 1 Type"] = controller1Type;
emulatorConfig["Controller 2 Type"] = controller2Type;
NESInstance e;
NESInstance e(emulatorConfig);
// Loading ROM File
std::string romFileData;
@ -165,7 +165,7 @@ int main(int argc, char *argv[])
if (disableRender == false) p.renderFrame(currentStep);
// Getting input
const auto &input = p.getStateInput(currentStep);
const auto &inputString = p.getInputString(currentStep);
// Getting state hash
const auto hash = p.getStateHash(currentStep);
@ -180,7 +180,7 @@ int main(int argc, char *argv[])
jaffarCommon::logger::log("[] ----------------------------------------------------------------\n");
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);
// Only print commands if not in reproduce mode