struct Program : Lock, Emulator::Platform { Application::Namespace tr{"Program"}; //program.cpp auto create() -> void; auto main() -> void; auto quit() -> void; //platform.cpp auto open(uint id, string name, vfs::file::mode mode, bool required) -> shared_pointer override; auto load(uint id, string name, string type, vector options = {}) -> Emulator::Platform::Load override; auto videoFrame(const uint32* data, uint pitch, uint width, uint height, uint scale) -> void override; auto audioFrame(const double* samples, uint channels) -> void override; auto inputPoll(uint port, uint device, uint input) -> int16 override; auto inputRumble(uint port, uint device, uint input, bool enable) -> void override; //game.cpp auto load() -> void; auto loadFile(string location) -> vector; auto loadSuperFamicom(string location) -> bool; auto loadGameBoy(string location) -> bool; auto loadBSMemory(string location) -> bool; auto loadSufamiTurboA(string location) -> bool; auto loadSufamiTurboB(string location) -> bool; auto save() -> void; auto reset() -> void; auto unload() -> void; auto verified() const -> bool; vector rso; //game-pak.cpp auto openPakSuperFamicom(string name, vfs::file::mode mode) -> shared_pointer; auto openPakGameBoy(string name, vfs::file::mode mode) -> shared_pointer; auto openPakBSMemory(string name, vfs::file::mode mode) -> shared_pointer; auto openPakSufamiTurboA(string name, vfs::file::mode mode) -> shared_pointer; auto openPakSufamiTurboB(string name, vfs::file::mode mode) -> shared_pointer; //game-rom.cpp auto openRomSuperFamicom(string name, vfs::file::mode mode) -> shared_pointer; auto openRomGameBoy(string name, vfs::file::mode mode) -> shared_pointer; auto openRomBSMemory(string name, vfs::file::mode mode) -> shared_pointer; auto openRomSufamiTurboA(string name, vfs::file::mode mode) -> shared_pointer; auto openRomSufamiTurboB(string name, vfs::file::mode mode) -> shared_pointer; //paths.cpp auto path(string type, string location, string extension = "") -> string; auto gamePath() -> string; auto cheatPath() -> string; auto statePath() -> string; auto screenshotPath() -> string; //states.cpp struct State { string name; uint64_t date; static const uint Signature; }; auto availableStates(string type) -> vector; auto hasState(string filename) -> bool; auto loadStateData(string filename) -> vector; auto loadState(string filename) -> bool; auto saveState(string filename) -> bool; auto saveUndoState() -> bool; auto saveRedoState() -> bool; auto removeState(string filename) -> bool; auto renameState(string from, string to) -> bool; //movies.cpp struct Movie { enum Mode : uint { Inactive, Playing, Recording } mode = Mode::Inactive; serializer state; vector input; } movie; auto movieMode(Movie::Mode) -> void; auto moviePlay() -> void; auto movieRecord(bool fromBeginning) -> void; auto movieStop() -> void; //rewind.cpp struct Rewind { enum Mode : uint { Playing, Rewinding } mode = Mode::Playing; vector history; uint length = 0; uint frequency = 0; uint counter = 0; //in frames } rewind; auto rewindMode(Rewind::Mode) -> void; auto rewindReset() -> void; auto rewindRun() -> void; //video.cpp auto updateVideoDriver(Window parent) -> void; auto updateVideoExclusive() -> void; auto updateVideoBlocking() -> void; auto updateVideoFlush() -> void; auto updateVideoMonitor() -> void; auto updateVideoFormat() -> void; auto updateVideoShader() -> void; auto updateVideoEffects() -> void; auto toggleVideoFullScreen() -> void; auto toggleVideoPseudoFullScreen() -> void; //audio.cpp auto updateAudioDriver(Window parent) -> void; auto updateAudioExclusive() -> void; auto updateAudioDevice() -> void; auto updateAudioBlocking() -> void; auto updateAudioDynamic() -> void; auto updateAudioFrequency() -> void; auto updateAudioLatency() -> void; auto updateAudioEffects() -> void; //input.cpp auto updateInputDriver(Window parent) -> void; //utility.cpp auto showMessage(string text) -> void; auto showFrameRate(string text) -> void; auto updateStatus() -> void; auto captureScreenshot() -> bool; auto inactive() -> bool; auto focused() -> bool; //patch.cpp auto appliedPatch() const -> bool; auto applyPatchIPS(vector& data, string location) -> bool; auto applyPatchBPS(vector& data, string location) -> bool; //hacks.cpp auto hackCompatibility() -> void; auto hackPatchMemory(vector& data) -> void; //filter.cpp auto filterSelect(uint& width, uint& height, uint scale) -> Filter::Render; //viewport.cpp auto viewportSize(uint& width, uint& height, uint scale) -> void; auto viewportRefresh() -> void; public: struct Game { explicit operator bool() const { return (bool)location; } string option; string location; string manifest; Markup::Node document; boolean patched; boolean verified; }; struct SuperFamicom : Game { string title; string region; vector program; vector data; vector expansion; vector firmware; } superFamicom; struct GameBoy : Game { vector program; } gameBoy; struct BSMemory : Game { vector program; } bsMemory; struct SufamiTurbo : Game { vector program; } sufamiTurboA, sufamiTurboB; vector gameQueue; uint32_t palette[32768]; uint32_t paletteDimmed[32768]; struct Screenshot { const uint32* data = nullptr; uint pitch = 0; uint width = 0; uint height = 0; uint scale = 0; } screenshot; bool frameAdvanceLock = false; uint64 autoSaveTime; uint64 statusTime; string statusMessage; string statusFrameRate; bool startFullScreen = false; struct Mute { enum : uint { Always = 1 << 1, Unfocused = 1 << 2, FastForward = 1 << 3, Rewind = 1 << 4, };}; uint mute = 0; bool fastForwarding = false; bool rewinding = false; }; extern Program program;