1 #pragma once 2 #include "stdafx.h" 3 #include <deque> 4 #include <unordered_map> 5 #include "IInputRecorder.h" 6 #include "BatteryManager.h" 7 #include "Types.h" 8 #include "INotificationListener.h" 9 10 class ZipWriter; 11 class Console; 12 class RewindData; 13 struct CodeInfo; 14 15 class MovieRecorder : public INotificationListener, public IInputRecorder, public IBatteryRecorder, public IBatteryProvider, public std::enable_shared_from_this<MovieRecorder> 16 { 17 private: 18 static const uint32_t MovieFormatVersion = 1; 19 20 shared_ptr<Console> _console; 21 string _filename; 22 string _author; 23 string _description; 24 unique_ptr<ZipWriter> _writer; 25 std::unordered_map<string, vector<uint8_t>> _batteryData; 26 stringstream _inputData; 27 bool _hasSaveState = false; 28 stringstream _saveStateData; 29 30 void GetGameSettings(stringstream &out); 31 void WriteCheat(stringstream &out, CodeInfo &code); 32 void WriteString(stringstream &out, string name, string value); 33 void WriteInt(stringstream &out, string name, uint32_t value); 34 void WriteBool(stringstream &out, string name, bool enabled); 35 36 public: 37 MovieRecorder(shared_ptr<Console> console); 38 virtual ~MovieRecorder(); 39 40 bool Record(RecordMovieOptions options); 41 bool Stop(); 42 43 bool CreateMovie(string movieFile, std::deque<RewindData> &data, uint32_t startPosition, uint32_t endPosition); 44 45 // Inherited via IInputRecorder 46 void RecordInput(vector<shared_ptr<BaseControlDevice>> devices) override; 47 48 // Inherited via IBatteryRecorder 49 virtual void OnLoadBattery(string extension, vector<uint8_t> batteryData) override; 50 51 // Inherited via IBatteryProvider 52 virtual vector<uint8_t> LoadBattery(string extension) override; 53 54 // Inherited via INotificationListener 55 virtual void ProcessNotification(ConsoleNotificationType type, void *parameter) override; 56 }; 57 58 namespace MovieKeys 59 { 60 constexpr const char* MesenVersion = "MesenVersion"; 61 constexpr const char* MovieFormatVersion = "MovieFormatVersion"; 62 constexpr const char* GameFile = "GameFile"; 63 constexpr const char* Sha1 = "SHA1"; 64 constexpr const char* PatchFile = "PatchFile"; 65 constexpr const char* PatchFileSha1 = "PatchFileSHA1"; 66 constexpr const char* PatchedRomSha1 = "PatchedRomSHA1"; 67 constexpr const char* Region = "Region"; 68 constexpr const char* ConsoleType = "ConsoleType"; 69 constexpr const char* Controller1 = "Controller1"; 70 constexpr const char* Controller2 = "Controller2"; 71 constexpr const char* Controller3 = "Controller3"; 72 constexpr const char* Controller4 = "Controller4"; 73 constexpr const char* ExpansionDevice = "ExpansionDevice"; 74 constexpr const char* CpuClockRate = "CpuClockRate"; 75 constexpr const char* ExtraScanlinesBeforeNmi = "ExtraScanlinesBeforeNmi"; 76 constexpr const char* ExtraScanlinesAfterNmi = "ExtraScanlinesAfterNmi"; 77 constexpr const char* OverclockAdjustApu = "OverclockAdjustApu"; 78 constexpr const char* DisablePpu2004Reads = "DisablePpu2004Reads"; 79 constexpr const char* DisablePaletteRead = "DisablePaletteRead"; 80 constexpr const char* DisableOamAddrBug = "DisableOamAddrBug"; 81 constexpr const char* UseNes101Hvc101Behavior = "UseNes101Hvc101Behavior"; 82 constexpr const char* EnableOamDecay = "EnableOamDecay"; 83 constexpr const char* DisablePpuReset = "DisablePpuReset"; 84 constexpr const char* ZapperDetectionRadius = "ZapperDetectionRadius"; 85 constexpr const char* RamPowerOnState = "RamPowerOnState"; 86 constexpr const char* DipSwitches = "DipSwitches"; 87 constexpr const char* InputPollScanline = "InputPollScanline"; 88 };