From 59beb243c00c805de796c1d336c31c82d512d0ea Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Fri, 7 Feb 2020 16:01:49 -0800 Subject: [PATCH] Adds Save State and Fast Forward controller skin actions --- Delta/Emulation/ActionInput.swift | 1 + Delta/Emulation/GameViewController.swift | 42 ++++++++++++++++--- .../ControllerInputsViewController.swift | 2 + 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Delta/Emulation/ActionInput.swift b/Delta/Emulation/ActionInput.swift index 7597eaf..1612dc1 100644 --- a/Delta/Emulation/ActionInput.swift +++ b/Delta/Emulation/ActionInput.swift @@ -18,6 +18,7 @@ enum ActionInput: String case quickSave case quickLoad case fastForward + case toggleFastForward } extension ActionInput: Input diff --git a/Delta/Emulation/GameViewController.swift b/Delta/Emulation/GameViewController.swift index 3799552..10f0f14 100644 --- a/Delta/Emulation/GameViewController.swift +++ b/Delta/Emulation/GameViewController.swift @@ -31,6 +31,29 @@ private extension GameViewController } } + struct DefaultInputMapping: GameControllerInputMappingProtocol + { + let gameController: GameController + + var gameControllerInputType: GameControllerInputType { + return self.gameController.inputType + } + + func input(forControllerInput controllerInput: Input) -> Input? + { + if let mappedInput = self.gameController.defaultInputMapping?.input(forControllerInput: controllerInput) + { + return mappedInput + } + + // Only intercept controller skin inputs. + guard controllerInput.type == .controller(.controllerSkin) else { return nil } + + let actionInput = ActionInput(stringValue: controllerInput.stringValue) + return actionInput + } + } + struct SustainInputsMapping: GameControllerInputMappingProtocol { let gameController: GameController @@ -190,7 +213,7 @@ class GameViewController: DeltaCore.GameViewController self.inputsToSustain[AnyInput(input)] = value } } - else if self.emulatorCore?.state == .running + else if let emulatorCore = self.emulatorCore, emulatorCore.state == .running { guard let actionInput = ActionInput(input: input) else { return } @@ -199,6 +222,9 @@ class GameViewController: DeltaCore.GameViewController case .quickSave: self.performQuickSaveAction() case .quickLoad: self.performQuickLoadAction() case .fastForward: self.performFastForwardAction(activate: true) + case .toggleFastForward: + let isFastForwarding = (emulatorCore.rate != emulatorCore.deltaCore.supportedRates.lowerBound) + self.performFastForwardAction(activate: !isFastForwarding) } } } @@ -223,6 +249,7 @@ class GameViewController: DeltaCore.GameViewController case .quickSave: break case .quickLoad: break case .fastForward: self.performFastForwardAction(activate: false) + case .toggleFastForward: break } } } @@ -518,16 +545,19 @@ private extension GameViewController { if gameController.playerIndex != nil { - if let inputMapping = GameControllerInputMapping.inputMapping(for: gameController, gameType: game.type, in: DatabaseManager.shared.viewContext) + let inputMapping: GameControllerInputMappingProtocol + + if let mapping = GameControllerInputMapping.inputMapping(for: gameController, gameType: game.type, in: DatabaseManager.shared.viewContext) { - gameController.addReceiver(self, inputMapping: inputMapping) - gameController.addReceiver(emulatorCore, inputMapping: inputMapping) + inputMapping = mapping } else { - gameController.addReceiver(self) - gameController.addReceiver(emulatorCore) + inputMapping = DefaultInputMapping(gameController: gameController) } + + gameController.addReceiver(self, inputMapping: inputMapping) + gameController.addReceiver(emulatorCore, inputMapping: inputMapping) } else { diff --git a/Delta/Settings/Controllers/ControllerInputsViewController.swift b/Delta/Settings/Controllers/ControllerInputsViewController.swift index 1aaa1ef..2f7b14f 100644 --- a/Delta/Settings/Controllers/ControllerInputsViewController.swift +++ b/Delta/Settings/Controllers/ControllerInputsViewController.swift @@ -223,6 +223,8 @@ private extension ControllerInputsViewController case .fastForward: image = #imageLiteral(resourceName: "FastForward") text = NSLocalizedString("Fast Forward", comment: "") + + case .toggleFastForward: continue } let item = MenuItem(text: text, image: image) { [unowned self] (item) in