Adds support for NES games

This commit is contained in:
Riley Testut 2019-02-01 12:44:32 -08:00
parent 7523102982
commit 1e144e5657
16 changed files with 113 additions and 73 deletions

3
.gitmodules vendored
View File

@ -13,3 +13,6 @@
[submodule "Cores/GBCDeltaCore"] [submodule "Cores/GBCDeltaCore"]
path = Cores/GBCDeltaCore path = Cores/GBCDeltaCore
url = git@github.com:rileytestut/GBCDeltaCore.git url = git@github.com:rileytestut/GBCDeltaCore.git
[submodule "Cores/NESDeltaCore"]
path = Cores/NESDeltaCore
url = git@github.com:rileytestut/NESDeltaCore.git

1
Cores/NESDeltaCore Submodule

@ -0,0 +1 @@
Subproject commit d83e51d06020045adc4403b9d77e604cf46e34f5

View File

@ -97,6 +97,8 @@
BF8DDD241F4F6C880088A21B /* InputCalloutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8DDD231F4F6C880088A21B /* InputCalloutView.swift */; }; BF8DDD241F4F6C880088A21B /* InputCalloutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8DDD231F4F6C880088A21B /* InputCalloutView.swift */; };
BF95E2771E4977BF0030E7AD /* GameMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF95E2761E4977BF0030E7AD /* GameMetadata.swift */; }; BF95E2771E4977BF0030E7AD /* GameMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF95E2761E4977BF0030E7AD /* GameMetadata.swift */; };
BF95E2791E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF95E2781E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift */; }; BF95E2791E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF95E2781E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift */; };
BF98C9822204D9AB006B95AC /* NESDeltaCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF98C9812204D9A1006B95AC /* NESDeltaCore.framework */; };
BF98C9832204D9AB006B95AC /* NESDeltaCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF98C9812204D9A1006B95AC /* NESDeltaCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
BF99A5971DC2F9C400468E9E /* ControllerSkinTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF99A5961DC2F9C400468E9E /* ControllerSkinTableViewCell.swift */; }; BF99A5971DC2F9C400468E9E /* ControllerSkinTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF99A5961DC2F9C400468E9E /* ControllerSkinTableViewCell.swift */; };
BF99C6941D0A9AA600BA92BC /* SNESDeltaCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */; }; BF99C6941D0A9AA600BA92BC /* SNESDeltaCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */; };
BF99C6951D0A9AA600BA92BC /* SNESDeltaCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF99C6951D0A9AA600BA92BC /* SNESDeltaCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@ -140,6 +142,7 @@
BFF0742D1E9DC17500ACDF4A /* GBCDeltaCore.framework in Embed Frameworks */, BFF0742D1E9DC17500ACDF4A /* GBCDeltaCore.framework in Embed Frameworks */,
BFEC732E1AAECC4A00650035 /* Roxas.framework in Embed Frameworks */, BFEC732E1AAECC4A00650035 /* Roxas.framework in Embed Frameworks */,
BF0418151D01E93400E85BCF /* GBADeltaCore.framework in Embed Frameworks */, BF0418151D01E93400E85BCF /* GBADeltaCore.framework in Embed Frameworks */,
BF98C9832204D9AB006B95AC /* NESDeltaCore.framework in Embed Frameworks */,
BF99C6951D0A9AA600BA92BC /* SNESDeltaCore.framework in Embed Frameworks */, BF99C6951D0A9AA600BA92BC /* SNESDeltaCore.framework in Embed Frameworks */,
BF072011219A3A9D00F05DA4 /* ZIPFoundation.framework in Embed Frameworks */, BF072011219A3A9D00F05DA4 /* ZIPFoundation.framework in Embed Frameworks */,
); );
@ -236,6 +239,7 @@
BF8DDD231F4F6C880088A21B /* InputCalloutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputCalloutView.swift; sourceTree = "<group>"; }; BF8DDD231F4F6C880088A21B /* InputCalloutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputCalloutView.swift; sourceTree = "<group>"; };
BF95E2761E4977BF0030E7AD /* GameMetadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameMetadata.swift; sourceTree = "<group>"; }; BF95E2761E4977BF0030E7AD /* GameMetadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameMetadata.swift; sourceTree = "<group>"; };
BF95E2781E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamesDatabaseBrowserViewController.swift; sourceTree = "<group>"; }; BF95E2781E4982A10030E7AD /* GamesDatabaseBrowserViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamesDatabaseBrowserViewController.swift; sourceTree = "<group>"; };
BF98C9812204D9A1006B95AC /* NESDeltaCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = NESDeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BF99A5961DC2F9C400468E9E /* ControllerSkinTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControllerSkinTableViewCell.swift; sourceTree = "<group>"; }; BF99A5961DC2F9C400468E9E /* ControllerSkinTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControllerSkinTableViewCell.swift; sourceTree = "<group>"; };
BF9F4FCE1AAD7B87004C9500 /* DeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BF9F4FCE1AAD7B87004C9500 /* DeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BFAA1FEC1B8AA4FA00495943 /* Settings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; }; BFAA1FEC1B8AA4FA00495943 /* Settings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
@ -272,6 +276,7 @@
BF9F4FCF1AAD7B87004C9500 /* DeltaCore.framework in Frameworks */, BF9F4FCF1AAD7B87004C9500 /* DeltaCore.framework in Frameworks */,
BFEC732D1AAECC4A00650035 /* Roxas.framework in Frameworks */, BFEC732D1AAECC4A00650035 /* Roxas.framework in Frameworks */,
BF99C6941D0A9AA600BA92BC /* SNESDeltaCore.framework in Frameworks */, BF99C6941D0A9AA600BA92BC /* SNESDeltaCore.framework in Frameworks */,
BF98C9822204D9AB006B95AC /* NESDeltaCore.framework in Frameworks */,
BF0418141D01E93400E85BCF /* GBADeltaCore.framework in Frameworks */, BF0418141D01E93400E85BCF /* GBADeltaCore.framework in Frameworks */,
BF072010219A3A9D00F05DA4 /* ZIPFoundation.framework in Frameworks */, BF072010219A3A9D00F05DA4 /* ZIPFoundation.framework in Frameworks */,
BFF0742C1E9DC17500ACDF4A /* GBCDeltaCore.framework in Frameworks */, BFF0742C1E9DC17500ACDF4A /* GBCDeltaCore.framework in Frameworks */,
@ -546,6 +551,7 @@
BF9F4FCD1AAD7B25004C9500 /* Frameworks */ = { BF9F4FCD1AAD7B25004C9500 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
BF98C9812204D9A1006B95AC /* NESDeltaCore.framework */,
BF07200E219A3A9500F05DA4 /* ZIPFoundation.framework */, BF07200E219A3A9500F05DA4 /* ZIPFoundation.framework */,
BFF0742B1E9DC17500ACDF4A /* GBCDeltaCore.framework */, BFF0742B1E9DC17500ACDF4A /* GBCDeltaCore.framework */,
BF0418131D01E93400E85BCF /* GBADeltaCore.framework */, BF0418131D01E93400E85BCF /* GBADeltaCore.framework */,

View File

@ -34,6 +34,20 @@
ReferencedContainer = "container:Cores/DeltaCore/DeltaCore.xcodeproj"> ReferencedContainer = "container:Cores/DeltaCore/DeltaCore.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BF3C12F220438F3F0079A4B5"
BuildableName = "NESDeltaCore.framework"
BlueprintName = "NESDeltaCore"
ReferencedContainer = "container:Cores/NESDeltaCore/NESDeltaCore.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry <BuildActionEntry
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
@ -56,10 +70,10 @@
buildForAnalyzing = "YES"> buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "BFE8E9C91D010AF7009D623D" BlueprintIdentifier = "BF8F2AAD1E9C879300F89F15"
BuildableName = "GBADeltaCore.framework" BuildableName = "GBCDeltaCore.framework"
BlueprintName = "GBADeltaCore" BlueprintName = "GBCDeltaCore"
ReferencedContainer = "container:Cores/GBADeltaCore/GBADeltaCore.xcodeproj"> ReferencedContainer = "container:Cores/GBCDeltaCore/GBCDeltaCore.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
<BuildActionEntry <BuildActionEntry
@ -70,10 +84,10 @@
buildForAnalyzing = "YES"> buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "BF8F2AAD1E9C879300F89F15" BlueprintIdentifier = "BFE8E9C91D010AF7009D623D"
BuildableName = "GBCDeltaCore.framework" BuildableName = "GBADeltaCore.framework"
BlueprintName = "GBCDeltaCore" BlueprintName = "GBADeltaCore"
ReferencedContainer = "container:Cores/GBCDeltaCore/GBCDeltaCore.xcodeproj"> ReferencedContainer = "container:Cores/GBADeltaCore/GBADeltaCore.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
<BuildActionEntry <BuildActionEntry

View File

@ -7,14 +7,17 @@
<FileRef <FileRef
location = "group:Cores/DeltaCore/DeltaCore.xcodeproj"> location = "group:Cores/DeltaCore/DeltaCore.xcodeproj">
</FileRef> </FileRef>
<FileRef
location = "group:Cores/NESDeltaCore/NESDeltaCore.xcodeproj">
</FileRef>
<FileRef <FileRef
location = "group:Cores/SNESDeltaCore/SNESDeltaCore.xcodeproj"> location = "group:Cores/SNESDeltaCore/SNESDeltaCore.xcodeproj">
</FileRef> </FileRef>
<FileRef <FileRef
location = "group:Cores/GBADeltaCore/GBADeltaCore.xcodeproj"> location = "group:Cores/GBCDeltaCore/GBCDeltaCore.xcodeproj">
</FileRef> </FileRef>
<FileRef <FileRef
location = "group:Cores/GBCDeltaCore/GBCDeltaCore.xcodeproj"> location = "group:Cores/GBADeltaCore/GBADeltaCore.xcodeproj">
</FileRef> </FileRef>
<FileRef <FileRef
location = "group:External/Roxas/Roxas.xcodeproj"> location = "group:External/Roxas/Roxas.xcodeproj">

View File

@ -26,7 +26,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate
Settings.registerDefaults() Settings.registerDefaults()
System.supportedSystems.forEach { Delta.register($0.deltaCore) } System.allCases.forEach { Delta.register($0.deltaCore) }
self.configureAppearance() self.configureAppearance()

View File

@ -1,12 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="ssH-mM-uG6"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="ssH-mM-uG6">
<device id="retina4_7" orientation="portrait"> <device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/> <adaptation id="fullscreen"/>
</device> </device>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@ -19,7 +17,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<label key="tableFooterView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delta 0.6.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Str-BY-agW"> <label key="tableFooterView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delta 0.6.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Str-BY-agW">
<rect key="frame" x="0.0" y="673" width="375" height="44"/> <rect key="frame" x="0.0" y="717" width="375" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/> <fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> <color key="textColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
@ -179,12 +177,29 @@
</subviews> </subviews>
</tableViewCellContentView> </tableViewCellContentView>
</tableViewCell> </tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Cell" textLabel="XVO-TO-ncw" style="IBUITableViewCellStyleDefault" id="vIu-iy-kRM">
<rect key="frame" x="0.0" y="419.5" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="vIu-iy-kRM" id="FIZ-uw-fR7">
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="System Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="XVO-TO-ncw">
<rect key="frame" x="16" y="0.0" width="324" height="43.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
</cells> </cells>
</tableViewSection> </tableViewSection>
<tableViewSection headerTitle="Controller Opacity" footerTitle="Determines how translucent the controller appears, if supported by the controller skin." id="SwK-m9-8gt"> <tableViewSection headerTitle="Controller Opacity" footerTitle="Determines how translucent the controller appears, if supported by the controller skin." id="SwK-m9-8gt">
<cells> <cells>
<tableViewCell contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Xxk-vo-eu4"> <tableViewCell contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Xxk-vo-eu4">
<rect key="frame" x="0.0" y="483" width="375" height="44"/> <rect key="frame" x="0.0" y="527" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" tableViewCell="Xxk-vo-eu4" id="vxt-Ex-b4b"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" tableViewCell="Xxk-vo-eu4" id="vxt-Ex-b4b">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/> <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
@ -225,10 +240,10 @@
<tableViewSection headerTitle="3D Touch" id="fdp-8c-oOc"> <tableViewSection headerTitle="3D Touch" id="fdp-8c-oOc">
<cells> <cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Cell" textLabel="c5i-qG-ir9" style="IBUITableViewCellStyleDefault" id="SSL-t4-QZj"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Cell" textLabel="c5i-qG-ir9" style="IBUITableViewCellStyleDefault" id="SSL-t4-QZj">
<rect key="frame" x="0.0" y="611" width="375" height="44"/> <rect key="frame" x="0.0" y="655" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="SSL-t4-QZj" id="hQB-Iy-bzy"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="SSL-t4-QZj" id="hQB-Iy-bzy">
<rect key="frame" x="0.0" y="0.0" width="342" height="43.5"/> <rect key="frame" x="0.0" y="0.0" width="349" height="43.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="App Icon Shortcuts" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="c5i-qG-ir9"> <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="App Icon Shortcuts" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="c5i-qG-ir9">
@ -482,7 +497,7 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4bh-Lf-zgk"> <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4bh-Lf-zgk">
<rect key="frame" x="310" y="6" width="51" height="31"/> <rect key="frame" x="310" y="6.5" width="51" height="31"/>
<connections> <connections>
<action selector="switchGameShortcutsModeWith:" destination="yXS-6u-1AN" eventType="valueChanged" id="bX8-gd-h4g"/> <action selector="switchGameShortcutsModeWith:" destination="yXS-6u-1AN" eventType="valueChanged" id="bX8-gd-h4g"/>
</connections> </connections>

View File

@ -131,7 +131,7 @@ private extension DatabaseManager
self.performBackgroundTask { (context) in self.performBackgroundTask { (context) in
for system in System.supportedSystems for system in System.allCases
{ {
guard let deltaControllerSkin = DeltaCore.ControllerSkin.standardControllerSkin(for: system.gameType) else { continue } guard let deltaControllerSkin = DeltaCore.ControllerSkin.standardControllerSkin(for: system.gameType) else { continue }

View File

@ -15,9 +15,10 @@ extension DeltaCoreProtocol
switch system switch system
{ {
case .nes: return 1...4
case .snes: return 1...4 case .snes: return 1...4
case .gba: return 1...3
case .gbc: return 1...4 case .gbc: return 1...4
case .gba: return 1...3
} }
} }
} }

View File

@ -39,6 +39,13 @@ extension Input
case .controller(.keyboard): case .controller(.keyboard):
let input = KeyboardGameController.Input(input: self)! let input = KeyboardGameController.Input(input: self)!
if input == .escape
{
// The iPad Smart Keyboard doesn't have an escape key, so return lower priority
// to ensure it only appears if there is no other key mapped to the same input.
return 100
}
// We prefer to display keys with special characters (e.g. arrow keys, shift) over regular keys. // We prefer to display keys with special characters (e.g. arrow keys, shift) over regular keys.
// If the input's localizedName == it's string value, we can assume it's a normal key, and return a lower priority. // If the input's localizedName == it's string value, we can assume it's a normal key, and return a lower priority.
// Otherwise, it has a special display character, and so we return a higher priority. // Otherwise, it has a special display character, and so we return a higher priority.

View File

@ -300,7 +300,7 @@ extension GamesViewController: ImportControllerDelegate
{ {
@IBAction private func importFiles() @IBAction private func importFiles()
{ {
var documentTypes = Set(System.supportedSystems.map { $0.gameType.rawValue }) var documentTypes = Set(System.allCases.map { $0.gameType.rawValue })
documentTypes.insert(kUTTypeZipArchive as String) documentTypes.insert(kUTTypeZipArchive as String)
// Add GBA4iOS's exported UTIs in case user has GBA4iOS installed (which may override Delta's UTI declarations) // Add GBA4iOS's exported UTIs in case user has GBA4iOS installed (which may override Delta's UTI declarations)

View File

@ -21,7 +21,7 @@ class ControllerInputsViewController: UIViewController
} }
} }
var system: System = .snes { var system: System = System.allCases[0] {
didSet { didSet {
guard self.system != oldValue else { return } guard self.system != oldValue else { return }
self.updateSystem() self.updateSystem()
@ -167,7 +167,7 @@ private extension ControllerInputsViewController
let popoverMenuController = PopoverMenuController(popoverViewController: navigationController) let popoverMenuController = PopoverMenuController(popoverViewController: navigationController)
self.navigationItem.popoverMenuController = popoverMenuController self.navigationItem.popoverMenuController = popoverMenuController
let items = System.supportedSystems.map { [unowned self, weak popoverMenuController, weak listMenuViewController] system -> MenuItem in let items = System.allCases.map { [unowned self, weak popoverMenuController, weak listMenuViewController] system -> MenuItem in
let item = MenuItem(text: system.localizedShortName, image: #imageLiteral(resourceName: "CheatCodes")) { [weak popoverMenuController, weak listMenuViewController] item in let item = MenuItem(text: system.localizedShortName, image: #imageLiteral(resourceName: "CheatCodes")) { [weak popoverMenuController, weak listMenuViewController] item in
listMenuViewController?.items.forEach { $0.isSelected = ($0 == item) } listMenuViewController?.items.forEach { $0.isSelected = ($0 == item) }
popoverMenuController?.isActive = false popoverMenuController?.isActive = false

View File

@ -106,7 +106,6 @@ extension ControllersSettingsViewController
case "controllerInputsSegue": case "controllerInputsSegue":
let controllerInputsViewController = (segue.destination as! UINavigationController).topViewController as! ControllerInputsViewController let controllerInputsViewController = (segue.destination as! UINavigationController).topViewController as! ControllerInputsViewController
controllerInputsViewController.gameController = self.gameController controllerInputsViewController.gameController = self.gameController
controllerInputsViewController.system = .snes
default: break default: break
} }

View File

@ -186,9 +186,10 @@ private extension Settings
switch system switch system
{ {
case .nes: systemName = "nes"
case .snes: systemName = "snes" case .snes: systemName = "snes"
case .gba: systemName = "gba"
case .gbc: systemName = "gbc" case .gbc: systemName = "gbc"
case .gba: systemName = "gba"
} }
let orientation: String let orientation: String

View File

@ -27,13 +27,6 @@ private extension SettingsViewController
case controllers = "controllersSegue" case controllers = "controllersSegue"
case controllerSkins = "controllerSkinsSegue" case controllerSkins = "controllerSkinsSegue"
} }
enum ControllerSkinsRow: Int
{
case snes
case gba
case gbc
}
} }
class SettingsViewController: UITableViewController class SettingsViewController: UITableViewController
@ -113,13 +106,8 @@ class SettingsViewController: UITableViewController
case Segue.controllerSkins: case Segue.controllerSkins:
let systemControllerSkinsViewController = segue.destination as! SystemControllerSkinsViewController let systemControllerSkinsViewController = segue.destination as! SystemControllerSkinsViewController
let row = ControllerSkinsRow(rawValue: indexPath.row)! let system = System.allCases[indexPath.row]
switch row systemControllerSkinsViewController.system = system
{
case .snes: systemControllerSkinsViewController.system = .snes
case .gba: systemControllerSkinsViewController.system = .gba
case .gbc: systemControllerSkinsViewController.system = .gbc
}
} }
} }
} }
@ -192,7 +180,7 @@ extension SettingsViewController
switch section switch section
{ {
case .controllers: return 1 // Temporarily hide other controller indexes until controller logic is finalized case .controllers: return 1 // Temporarily hide other controller indexes until controller logic is finalized
case .controllerSkins: return System.supportedSystems.count case .controllerSkins: return System.allCases.count
default: default:
if isSectionHidden(section) if isSectionHidden(section)
{ {
@ -227,7 +215,7 @@ extension SettingsViewController
cell.detailTextLabel?.text = nil cell.detailTextLabel?.text = nil
} }
case .controllerSkins: cell.textLabel?.text = System.supportedSystems[indexPath.row].localizedName case .controllerSkins: cell.textLabel?.text = System.allCases[indexPath.row].localizedName
default: break default: break
} }

View File

@ -11,30 +11,14 @@ import DeltaCore
import SNESDeltaCore import SNESDeltaCore
import GBADeltaCore import GBADeltaCore
import GBCDeltaCore import GBCDeltaCore
import NESDeltaCore
extension GameType enum System: CaseIterable
{
init?(fileExtension: String)
{
switch fileExtension.lowercased()
{
case "smc", "sfc", "fig": self = .snes
case "gba": self = .gba
case "gbc", "gb": self = .gbc
default: return nil
}
}
}
enum System
{ {
case nes
case snes case snes
case gba
case gbc case gbc
case gba
static var supportedSystems: [System] {
return [.snes, .gba, .gbc]
}
} }
extension System extension System
@ -42,27 +26,30 @@ extension System
var localizedName: String { var localizedName: String {
switch self switch self
{ {
case .nes: return NSLocalizedString("Nintendo", comment: "")
case .snes: return NSLocalizedString("Super Nintendo", comment: "") case .snes: return NSLocalizedString("Super Nintendo", comment: "")
case .gba: return NSLocalizedString("Game Boy Advance", comment: "")
case .gbc: return NSLocalizedString("Game Boy Color", comment: "") case .gbc: return NSLocalizedString("Game Boy Color", comment: "")
case .gba: return NSLocalizedString("Game Boy Advance", comment: "")
} }
} }
var localizedShortName: String { var localizedShortName: String {
switch self switch self
{ {
case .nes: return NSLocalizedString("NES", comment: "")
case .snes: return NSLocalizedString("SNES", comment: "") case .snes: return NSLocalizedString("SNES", comment: "")
case .gba: return NSLocalizedString("GBA", comment: "")
case .gbc: return NSLocalizedString("GBC", comment: "") case .gbc: return NSLocalizedString("GBC", comment: "")
case .gba: return NSLocalizedString("GBA", comment: "")
} }
} }
var year: Int { var year: Int {
switch self switch self
{ {
case .nes: return 1985
case .snes: return 1990 case .snes: return 1990
case .gba: return 2001
case .gbc: return 1998 case .gbc: return 1998
case .gba: return 2001
} }
} }
} }
@ -72,21 +59,20 @@ extension System
var deltaCore: DeltaCoreProtocol { var deltaCore: DeltaCoreProtocol {
switch self switch self
{ {
case .nes: return NES.core
case .snes: return SNES.core case .snes: return SNES.core
case .gba: return GBA.core
case .gbc: return GBC.core case .gbc: return GBC.core
case .gba: return GBA.core
} }
} }
}
extension System
{
var gameType: GameType { var gameType: GameType {
switch self switch self
{ {
case .nes: return .nes
case .snes: return .snes case .snes: return .snes
case .gba: return .gba
case .gbc: return .gbc case .gbc: return .gbc
case .gba: return .gba
} }
} }
@ -94,9 +80,25 @@ extension System
{ {
switch gameType switch gameType
{ {
case GameType.nes: self = .nes
case GameType.snes: self = .snes case GameType.snes: self = .snes
case GameType.gba: self = .gba
case GameType.gbc: self = .gbc case GameType.gbc: self = .gbc
case GameType.gba: self = .gba
default: return nil
}
}
}
extension GameType
{
init?(fileExtension: String)
{
switch fileExtension.lowercased()
{
case "nes": self = .nes
case "smc", "sfc", "fig": self = .snes
case "gbc", "gb": self = .gbc
case "gba": self = .gba
default: return nil default: return nil
} }
} }