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 };