Browse Source

Initial iOS implementation.

--HG--
branch : minor
Alex Szpakowski 10 years ago
parent
commit
85de3c41fb
47 changed files with 2373 additions and 283 deletions
  1. 3 1
      .hgignore
  2. 1 1
      license.txt
  3. 128 0
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/Contents.json
  4. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  5. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  6. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  7. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  8. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  9. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  10. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  11. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  12. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  13. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  14. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  15. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  16. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  17. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  18. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  19. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  20. BIN
      platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]
  21. 142 0
      platform/xcode/ios/Images.xcassets/LaunchImage.launchimage/Contents.json
  22. 100 0
      platform/xcode/ios/love-ios.plist
  23. BIN
      platform/xcode/ios/lovedocument.icns
  24. 827 235
      platform/xcode/liblove.xcodeproj/project.pbxproj
  25. 7 0
      platform/xcode/liblove.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  26. 86 0
      platform/xcode/liblove.xcodeproj/xcshareddata/xcschemes/liblove-ios.xcscheme
  27. 68 0
      platform/xcode/liblove.xcodeproj/xcshareddata/xcschemes/liblove-macosx.xcscheme
  28. 329 27
      platform/xcode/love.xcodeproj/project.pbxproj
  29. 110 0
      platform/xcode/love.xcodeproj/xcshareddata/xcschemes/love-ios.xcscheme
  30. 86 0
      platform/xcode/love.xcodeproj/xcshareddata/xcschemes/love-macosx.xcscheme
  31. 7 3
      src/common/config.h
  32. 61 0
      src/common/iOS.h
  33. 320 0
      src/common/iOS.mm
  34. 6 6
      src/common/version.h
  35. 37 4
      src/love.cpp
  36. 5 0
      src/modules/audio/openal/Audio.h
  37. 2 0
      src/modules/audio/openal/Pool.cpp
  38. 7 0
      src/modules/audio/openal/Pool.h
  39. 5 0
      src/modules/audio/openal/Source.h
  40. 1 1
      src/modules/filesystem/Filesystem.h
  41. 6 0
      src/modules/filesystem/physfs/Filesystem.cpp
  42. 2 0
      src/modules/love/love.cpp
  43. 5 1
      src/modules/sound/lullaby/ModPlugDecoder.cpp
  44. 6 0
      src/modules/sound/lullaby/ModPlugDecoder.h
  45. 5 1
      src/modules/sound/lullaby/Sound.cpp
  46. 8 0
      src/modules/system/System.cpp
  47. 3 3
      src/modules/timer/sdl/Timer.cpp

+ 3 - 1
.hgignore

@@ -19,7 +19,9 @@ glob:*.ncb
 glob:*.exe
 glob:*.bat
 glob:platform/xcode/Build
-glob:platform/xcode/DerivedData
+glob:platform/xcode/DerivedData
+glob:platform/xcode/ios/include
+glob:platform/xcode/ios/libraries
 glob:*xcuserdata*
 glob:*.DS_Store
 glob:*.dylib

+ 1 - 1
license.txt

@@ -123,7 +123,7 @@ DEALINGS IN THE SOFTWARE.
 
 ---------
 
-This software uses the following LGPL libraries:
+This software uses the following LGPL libraries on Windows, Mac OS X, and Linux:
 
  - libmpg123
      Website: http://www.mpg123.de/

+ 128 - 0
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,128 @@
+{
+  "images" : [
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "3x"
+    },
+    {
+      "size" : "57x57",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "57x57",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "[email protected]",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "50x50",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "50x50",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "72x72",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "72x72",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "[email protected]",
+      "scale" : "2x"
+    },
+    {
+      "size" : "120x120",
+      "idiom" : "car",
+      "filename" : "[email protected]",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
platform/xcode/ios/Images.xcassets/AppIcon.appiconset/[email protected]


+ 142 - 0
platform/xcode/ios/Images.xcassets/LaunchImage.launchimage/Contents.json

@@ -0,0 +1,142 @@
+{
+  "images" : [
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "minimum-system-version" : "8.0",
+      "subtype" : "736h",
+      "scale" : "3x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "minimum-system-version" : "8.0",
+      "subtype" : "736h",
+      "scale" : "3x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "minimum-system-version" : "8.0",
+      "subtype" : "667h",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "subtype" : "retina4",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "extent" : "full-screen",
+      "subtype" : "retina4",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 100 - 0
platform/xcode/ios/love-ios.plist

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>LoveDocument.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>LÖVE Project</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.love2d.love-game</string>
+			</array>
+		</dict>
+	</array>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIcons</key>
+	<dict/>
+	<key>CFBundleIcons~ipad</key>
+	<dict/>
+	<key>CFBundleIdentifier</key>
+	<string>love.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIFileSharingEnabled</key>
+	<true/>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>opengles-2</string>
+	</array>
+	<key>UIStatusBarStyle</key>
+	<string>UIStatusBarStyleLightContent</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UTExportedTypeDeclarations</key>
+	<array>
+		<dict>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>com.pkware.zip-archive</string>
+			</array>
+			<key>UTTypeDescription</key>
+			<string>LÖVE Project</string>
+			<key>UTTypeIdentifier</key>
+			<string>org.love2d.love-game</string>
+			<key>UTTypeSize320IconFile</key>
+			<string>LoveDocument</string>
+			<key>UTTypeSize64IconFile</key>
+			<string>LoveDocument</string>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>com.apple.ostype</key>
+				<string>LOVE</string>
+				<key>public.filename-extension</key>
+				<array>
+					<string>love</string>
+				</array>
+				<key>public.mime-type</key>
+				<string>application/x-love-game</string>
+			</dict>
+		</dict>
+	</array>
+</dict>
+</plist>

BIN
platform/xcode/ios/lovedocument.icns


File diff suppressed because it is too large
+ 827 - 235
platform/xcode/liblove.xcodeproj/project.pbxproj


+ 7 - 0
platform/xcode/liblove.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:liblove.xcodeproj">
+   </FileRef>
+</Workspace>

+ 86 - 0
platform/xcode/liblove.xcodeproj/xcshareddata/xcschemes/liblove-ios.xcscheme

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0610"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FA0B78DC1A958B90000E1D17"
+               BuildableName = "liblove.a"
+               BlueprintName = "liblove-ios"
+               ReferencedContainer = "container:liblove.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B78DC1A958B90000E1D17"
+            BuildableName = "liblove.a"
+            BlueprintName = "liblove-ios"
+            ReferencedContainer = "container:liblove.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B78DC1A958B90000E1D17"
+            BuildableName = "liblove.a"
+            BlueprintName = "liblove-ios"
+            ReferencedContainer = "container:liblove.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B78DC1A958B90000E1D17"
+            BuildableName = "liblove.a"
+            BlueprintName = "liblove-ios"
+            ReferencedContainer = "container:liblove.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 68 - 0
platform/xcode/liblove.xcodeproj/xcshareddata/xcschemes/liblove-macosx.xcscheme

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0610"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FA577AAE16C7507900860150"
+               BuildableName = "love.framework"
+               BlueprintName = "liblove-macosx"
+               ReferencedContainer = "container:liblove.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA577AAE16C7507900860150"
+            BuildableName = "love.framework"
+            BlueprintName = "liblove-macosx"
+            ReferencedContainer = "container:liblove.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 329 - 27
platform/xcode/love.xcodeproj/project.pbxproj

@@ -21,6 +21,20 @@
 		FA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; };
 		FA0B78D21A95814A000E1D17 /* love.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA0B78D01A95814A000E1D17 /* love.icns */; };
 		FA0B78D31A95814A000E1D17 /* lovedocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA0B78D11A95814A000E1D17 /* lovedocument.icns */; };
+		FA0B7F301A95AC7D000E1D17 /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; };
+		FA5D24821A96CA1800C6FC8F /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24811A96CA1800C6FC8F /* OpenAL.framework */; };
+		FA5D24841A96CA2700C6FC8F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24831A96CA2700C6FC8F /* OpenGLES.framework */; };
+		FA5D24881A96CA8A00C6FC8F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24871A96CA8A00C6FC8F /* UIKit.framework */; };
+		FA5D248A1A96CA9600C6FC8F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */; };
+		FA5D248C1A96CA9E00C6FC8F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */; };
+		FA5D248E1A96CAA700C6FC8F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */; };
+		FA5D24901A96CAAE00C6FC8F /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D248F1A96CAAE00C6FC8F /* ImageIO.framework */; };
+		FA5D24921A96CAB300C6FC8F /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24911A96CAB300C6FC8F /* MobileCoreServices.framework */; };
+		FA5D24941A96CABA00C6FC8F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24931A96CABA00C6FC8F /* libz.dylib */; };
+		FA5D24961A96CAC200C6FC8F /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24951A96CAC200C6FC8F /* CoreMotion.framework */; };
+		FA5D249C1A96CF4300C6FC8F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5D249A1A96CF4300C6FC8F /* Images.xcassets */; };
+		FA5D24C21A96D78000C6FC8F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24C11A96D78000C6FC8F /* Foundation.framework */; };
+		FA5D24D11A96E73300C6FC8F /* liblove.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA0B7EEF1A95924A000E1D17 /* liblove.a */; };
 		FA77A36518F1172600D23AE9 /* jpeg-turbo.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */; };
 		FA9B4A0A16E1579F00074F42 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; };
 		FA9B4A0B16E157B500074F42 /* SDL2.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
@@ -36,6 +50,20 @@
 			remoteGlobalIDString = FA577AAF16C7507900860150;
 			remoteInfo = Framework;
 		};
+		FA0B7EEE1A95924A000E1D17 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = FA0B78DD1A958B90000E1D17;
+			remoteInfo = "liblove-ios";
+		};
+		FA5D24BA1A96D6FC00C6FC8F /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = FA0B78DC1A958B90000E1D17;
+			remoteInfo = "liblove-ios";
+		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -78,7 +106,21 @@
 		FA08F69116C765A200F007B5 /* love.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = love.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		FA0B78D01A95814A000E1D17 /* love.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = love.icns; path = macosx/love.icns; sourceTree = "<group>"; };
 		FA0B78D11A95814A000E1D17 /* lovedocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = lovedocument.icns; path = macosx/lovedocument.icns; sourceTree = "<group>"; };
+		FA0B7F061A95AAF3000E1D17 /* love.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = love.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		FA577A9316C7217800860150 /* liblove.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = liblove.xcodeproj; sourceTree = "<group>"; };
+		FA5D24811A96CA1800C6FC8F /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/OpenAL.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24831A96CA2700C6FC8F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24871A96CA8A00C6FC8F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D248F1A96CAAE00C6FC8F /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24911A96CAB300C6FC8F /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24931A96CABA00C6FC8F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
+		FA5D24951A96CAC200C6FC8F /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreMotion.framework; sourceTree = DEVELOPER_DIR; };
+		FA5D24971A96CE1E00C6FC8F /* love-ios.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "love-ios.plist"; path = "ios/love-ios.plist"; sourceTree = "<group>"; };
+		FA5D249A1A96CF4300C6FC8F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ios/Images.xcassets; sourceTree = "<group>"; };
+		FA5D24C11A96D78000C6FC8F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
 		FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = "jpeg-turbo.framework"; path = "/Library/Frameworks/jpeg-turbo.framework"; sourceTree = "<absolute>"; };
 		FA9B4A0916E1579F00074F42 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2.framework; path = /Library/Frameworks/SDL2.framework; sourceTree = "<absolute>"; };
 		FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = "OpenAL-Soft.framework"; path = "/Library/Frameworks/OpenAL-Soft.framework"; sourceTree = "<absolute>"; };
@@ -97,25 +139,33 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		FA0B7F031A95AAF3000E1D17 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				FA5D24D11A96E73300C6FC8F /* liblove.a in Frameworks */,
+				FA5D24C21A96D78000C6FC8F /* Foundation.framework in Frameworks */,
+				FA5D24961A96CAC200C6FC8F /* CoreMotion.framework in Frameworks */,
+				FA5D24941A96CABA00C6FC8F /* libz.dylib in Frameworks */,
+				FA5D24921A96CAB300C6FC8F /* MobileCoreServices.framework in Frameworks */,
+				FA5D24901A96CAAE00C6FC8F /* ImageIO.framework in Frameworks */,
+				FA5D248E1A96CAA700C6FC8F /* CoreGraphics.framework in Frameworks */,
+				FA5D248C1A96CA9E00C6FC8F /* QuartzCore.framework in Frameworks */,
+				FA5D248A1A96CA9600C6FC8F /* AudioToolbox.framework in Frameworks */,
+				FA5D24881A96CA8A00C6FC8F /* UIKit.framework in Frameworks */,
+				FA5D24841A96CA2700C6FC8F /* OpenGLES.framework in Frameworks */,
+				FA5D24821A96CA1800C6FC8F /* OpenAL.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
 		1058C7A0FEA54F0111CA2CBB /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				FA9B4A0916E1579F00074F42 /* SDL2.framework */,
-				1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
-				A93E6E4810420B4A007D418B /* FreeType.framework */,
-				FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */,
-				A9F16926109E7BAD00FC83D1 /* libmodplug.framework */,
-				FA08F69116C765A200F007B5 /* love.framework */,
-				A93E6E5310420B57007D418B /* Lua.framework */,
-				A9F169A6109E824900FC83D1 /* mpg123.framework */,
-				A9255F51104324D700BA1496 /* Ogg.framework */,
-				FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */,
-				A93E6E4710420B4A007D418B /* OpenGL.framework */,
-				A9D307E9106635C3004FEDF8 /* physfs.framework */,
-				A9255E021043195A00BA1496 /* Vorbis.framework */,
+				FA5D24801A96C97900C6FC8F /* ios */,
+				FA0B7EEC1A959249000E1D17 /* macosx */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -124,6 +174,7 @@
 			isa = PBXGroup;
 			children = (
 				8D1107320486CEB800E47090 /* love.app */,
+				FA0B7F061A95AAF3000E1D17 /* love.app */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -131,10 +182,12 @@
 		29B97314FDCFA39411CA2CEA /* love */ = {
 			isa = PBXGroup;
 			children = (
+				FA5D249A1A96CF4300C6FC8F /* Images.xcassets */,
 				FA577A9D16C7262E00860150 /* Source */,
+				FA5D24A01A96CF7200C6FC8F /* Supporting Files */,
 				1058C7A0FEA54F0111CA2CBB /* Frameworks */,
-				29B97317FDCFA39411CA2CEA /* Resources */,
 				19C28FACFE9D520D11CA2CBB /* Products */,
+				29B97317FDCFA39411CA2CEA /* Resources */,
 				FA577A9316C7217800860150 /* liblove.xcodeproj */,
 			);
 			name = love;
@@ -145,7 +198,6 @@
 			isa = PBXGroup;
 			children = (
 				FAC1A448196F5DC600125284 /* license.txt */,
-				A97E3842132A9EDE00198A2F /* love-macosx.plist */,
 				FA0B78D01A95814A000E1D17 /* love.icns */,
 				FA0B78D11A95814A000E1D17 /* lovedocument.icns */,
 			);
@@ -156,10 +208,31 @@
 			isa = PBXGroup;
 			children = (
 				FA0B78D81A958301000E1D17 /* love.framework */,
+				FA0B7EEF1A95924A000E1D17 /* liblove.a */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
+		FA0B7EEC1A959249000E1D17 /* macosx */ = {
+			isa = PBXGroup;
+			children = (
+				1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+				A93E6E4810420B4A007D418B /* FreeType.framework */,
+				FA77A36418F1172600D23AE9 /* jpeg-turbo.framework */,
+				A9F16926109E7BAD00FC83D1 /* libmodplug.framework */,
+				FA08F69116C765A200F007B5 /* love.framework */,
+				A93E6E5310420B57007D418B /* Lua.framework */,
+				A9F169A6109E824900FC83D1 /* mpg123.framework */,
+				A9255F51104324D700BA1496 /* Ogg.framework */,
+				FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */,
+				A93E6E4710420B4A007D418B /* OpenGL.framework */,
+				A9D307E9106635C3004FEDF8 /* physfs.framework */,
+				FA9B4A0916E1579F00074F42 /* SDL2.framework */,
+				A9255E021043195A00BA1496 /* Vorbis.framework */,
+			);
+			name = macosx;
+			sourceTree = "<group>";
+		};
 		FA577A9D16C7262E00860150 /* Source */ = {
 			isa = PBXGroup;
 			children = (
@@ -168,6 +241,33 @@
 			name = Source;
 			sourceTree = "<group>";
 		};
+		FA5D24801A96C97900C6FC8F /* ios */ = {
+			isa = PBXGroup;
+			children = (
+				FA5D24C11A96D78000C6FC8F /* Foundation.framework */,
+				FA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */,
+				FA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */,
+				FA5D24951A96CAC200C6FC8F /* CoreMotion.framework */,
+				FA5D248F1A96CAAE00C6FC8F /* ImageIO.framework */,
+				FA5D24931A96CABA00C6FC8F /* libz.dylib */,
+				FA5D24911A96CAB300C6FC8F /* MobileCoreServices.framework */,
+				FA5D24811A96CA1800C6FC8F /* OpenAL.framework */,
+				FA5D24831A96CA2700C6FC8F /* OpenGLES.framework */,
+				FA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */,
+				FA5D24871A96CA8A00C6FC8F /* UIKit.framework */,
+			);
+			name = ios;
+			sourceTree = "<group>";
+		};
+		FA5D24A01A96CF7200C6FC8F /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				A97E3842132A9EDE00198A2F /* love-macosx.plist */,
+				FA5D24971A96CE1E00C6FC8F /* love-ios.plist */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -190,6 +290,24 @@
 			productReference = 8D1107320486CEB800E47090 /* love.app */;
 			productType = "com.apple.product-type.application";
 		};
+		FA0B7F051A95AAF3000E1D17 /* love-ios */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = FA0B7F2E1A95AAF4000E1D17 /* Build configuration list for PBXNativeTarget "love-ios" */;
+			buildPhases = (
+				FA0B7F021A95AAF3000E1D17 /* Sources */,
+				FA0B7F031A95AAF3000E1D17 /* Frameworks */,
+				FA0B7F041A95AAF3000E1D17 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				FA5D24BB1A96D6FC00C6FC8F /* PBXTargetDependency */,
+			);
+			name = "love-ios";
+			productName = "love-ios";
+			productReference = FA0B7F061A95AAF3000E1D17 /* love.app */;
+			productType = "com.apple.product-type.application";
+		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
@@ -197,6 +315,11 @@
 			isa = PBXProject;
 			attributes = {
 				LastUpgradeCheck = 0610;
+				TargetAttributes = {
+					FA0B7F051A95AAF3000E1D17 = {
+						CreatedOnToolsVersion = 6.1.1;
+					};
+				};
 			};
 			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */;
 			compatibilityVersion = "Xcode 3.2";
@@ -207,6 +330,7 @@
 				Japanese,
 				French,
 				German,
+				Base,
 			);
 			mainGroup = 29B97314FDCFA39411CA2CEA /* love */;
 			projectDirPath = "";
@@ -219,6 +343,7 @@
 			projectRoot = "";
 			targets = (
 				8D1107260486CEB800E47090 /* love-macosx */,
+				FA0B7F051A95AAF3000E1D17 /* love-ios */,
 			);
 		};
 /* End PBXProject section */
@@ -231,6 +356,13 @@
 			remoteRef = FA0B78D71A958301000E1D17 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
+		FA0B7EEF1A95924A000E1D17 /* liblove.a */ = {
+			isa = PBXReferenceProxy;
+			fileType = archive.ar;
+			path = liblove.a;
+			remoteRef = FA0B7EEE1A95924A000E1D17 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
 /* End PBXReferenceProxy section */
 
 /* Begin PBXResourcesBuildPhase section */
@@ -244,6 +376,14 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		FA0B7F041A95AAF3000E1D17 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				FA5D249C1A96CF4300C6FC8F /* Images.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
@@ -255,20 +395,43 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		FA0B7F021A95AAF3000E1D17 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				FA0B7F301A95AC7D000E1D17 /* love.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXSourcesBuildPhase section */
 
+/* Begin PBXTargetDependency section */
+		FA5D24BB1A96D6FC00C6FC8F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "liblove-ios";
+			targetProxy = FA5D24BA1A96D6FC00C6FC8F /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
 /* Begin XCBuildConfiguration section */
 		C01FCF4B08A954540054247B /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COMBINE_HIDPI_IMAGES = YES;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
+					/Library/Frameworks,
 					"\"$(SRCROOT)/build/Release\"",
 					"\"$(SRCROOT)/build/Debug\"",
 				);
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					/Library/Frameworks/Lua.framework/Headers,
+					/Library/Frameworks/SDL2.framework/Headers,
+				);
 				INFOPLIST_FILE = "macosx/love-macosx.plist";
 				INSTALL_PATH = /Applications;
 				PRODUCT_NAME = love;
@@ -278,13 +441,20 @@
 		C01FCF4C08A954540054247B /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
+					/Library/Frameworks,
 					"\"$(SRCROOT)/build/Release\"",
 					"\"$(SRCROOT)/build/Debug\"",
 				);
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					/Library/Frameworks/Lua.framework/Headers,
+					/Library/Frameworks/SDL2.framework/Headers,
+				);
 				INFOPLIST_FILE = "macosx/love-macosx.plist";
 				INSTALL_PATH = /Applications;
 				PRODUCT_NAME = love;
@@ -295,12 +465,11 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
+				FRAMEWORK_SEARCH_PATHS = "";
 				GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;
@@ -324,8 +493,6 @@
 					"\"$(SRCROOT)/../../src\"",
 					"\"$(SRCROOT)/../../src/libraries\"",
 					"\"$(SRCROOT)/../../src/modules\"",
-					/Library/Frameworks/Lua.framework/Headers,
-					/Library/Frameworks/SDL2.framework/Headers,
 				);
 				INFOPLIST_FILE = "love-Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
@@ -350,13 +517,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				DEPLOYMENT_POSTPROCESSING = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
+				FRAMEWORK_SEARCH_PATHS = "";
 				GCC_INPUT_FILETYPE = automatic;
 				GCC_OPTIMIZATION_LEVEL = 3;
 				GCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;
@@ -382,8 +548,6 @@
 					"\"$(SRCROOT)/../../src\"",
 					"\"$(SRCROOT)/../../src/libraries\"",
 					"\"$(SRCROOT)/../../src/modules\"",
-					/Library/Frameworks/Lua.framework/Headers,
-					/Library/Frameworks/SDL2.framework/Headers,
 				);
 				INFOPLIST_FILE = "love-Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
@@ -406,17 +570,140 @@
 			};
 			name = Release;
 		};
+		FA0B7F261A95AAF4000E1D17 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					ios/include,
+					ios/include/lua,
+					ios/include/SDL2,
+				);
+				INFOPLIST_FILE = "$(SRCROOT)/ios/love-ios.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 6.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				MTL_ENABLE_DEBUG_INFO = YES;
+				PRODUCT_NAME = love;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		FA0B7F271A95AAF4000E1D17 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					ios/include,
+					ios/include/lua,
+					ios/include/SDL2,
+				);
+				INFOPLIST_FILE = "$(SRCROOT)/ios/love-ios.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 6.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				MTL_ENABLE_DEBUG_INFO = NO;
+				PRODUCT_NAME = love;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		FA0B7F281A95AAF4000E1D17 /* Distribution */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					ios/include,
+					ios/include/lua,
+					ios/include/SDL2,
+				);
+				INFOPLIST_FILE = "$(SRCROOT)/ios/love-ios.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 6.0;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				MTL_ENABLE_DEBUG_INFO = NO;
+				PRODUCT_NAME = love;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Distribution;
+		};
 		FA5326C618971A0900F7BBF4 /* Distribution */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				DEPLOYMENT_POSTPROCESSING = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
+				FRAMEWORK_SEARCH_PATHS = "";
 				GCC_INPUT_FILETYPE = automatic;
 				GCC_OPTIMIZATION_LEVEL = 3;
 				GCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;
@@ -442,8 +729,6 @@
 					"\"$(SRCROOT)/../../src\"",
 					"\"$(SRCROOT)/../../src/libraries\"",
 					"\"$(SRCROOT)/../../src/modules\"",
-					/Library/Frameworks/Lua.framework/Headers,
-					/Library/Frameworks/SDL2.framework/Headers,
 				);
 				INFOPLIST_FILE = "love-Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
@@ -469,13 +754,20 @@
 		FA5326C718971A0900F7BBF4 /* Distribution */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
+					/Library/Frameworks,
 					"\"$(SRCROOT)/build/Release\"",
 					"\"$(SRCROOT)/build/Debug\"",
 				);
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					/Library/Frameworks/Lua.framework/Headers,
+					/Library/Frameworks/SDL2.framework/Headers,
+				);
 				INFOPLIST_FILE = "macosx/love-macosx.plist";
 				INSTALL_PATH = /Applications;
 				PRODUCT_NAME = love;
@@ -505,6 +797,16 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		FA0B7F2E1A95AAF4000E1D17 /* Build configuration list for PBXNativeTarget "love-ios" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				FA0B7F261A95AAF4000E1D17 /* Debug */,
+				FA0B7F271A95AAF4000E1D17 /* Release */,
+				FA0B7F281A95AAF4000E1D17 /* Distribution */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 /* End XCConfigurationList section */
 	};
 	rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;

+ 110 - 0
platform/xcode/love.xcodeproj/xcshareddata/xcschemes/love-ios.xcscheme

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0610"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FA0B7F051A95AAF3000E1D17"
+               BuildableName = "love.app"
+               BlueprintName = "love-ios"
+               ReferencedContainer = "container:love.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FA0B7F1D1A95AAF4000E1D17"
+               BuildableName = "love-iosTests.xctest"
+               BlueprintName = "love-iosTests"
+               ReferencedContainer = "container:love.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FA0B7F1D1A95AAF4000E1D17"
+               BuildableName = "love-iosTests.xctest"
+               BlueprintName = "love-iosTests"
+               ReferencedContainer = "container:love.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B7F051A95AAF3000E1D17"
+            BuildableName = "love.app"
+            BlueprintName = "love-ios"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B7F051A95AAF3000E1D17"
+            BuildableName = "love.app"
+            BlueprintName = "love-ios"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FA0B7F051A95AAF3000E1D17"
+            BuildableName = "love.app"
+            BlueprintName = "love-ios"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 86 - 0
platform/xcode/love.xcodeproj/xcshareddata/xcschemes/love-macosx.xcscheme

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0610"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "8D1107260486CEB800E47090"
+               BuildableName = "love.app"
+               BlueprintName = "love-macosx"
+               ReferencedContainer = "container:love.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "8D1107260486CEB800E47090"
+            BuildableName = "love.app"
+            BlueprintName = "love-macosx"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "8D1107260486CEB800E47090"
+            BuildableName = "love.app"
+            BlueprintName = "love-macosx"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "8D1107260486CEB800E47090"
+            BuildableName = "love.app"
+            BlueprintName = "love-macosx"
+            ReferencedContainer = "container:love.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Distribution"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 7 - 3
src/common/config.h

@@ -29,8 +29,12 @@
 #	define LOVE_LINUX 1
 #endif
 #if defined(__APPLE__)
-#	define LOVE_MACOSX 1
-#	include <AvailabilityMacros.h>
+#	include <TargetConditionals.h>
+#	if TARGET_OS_IPHONE
+#		define LOVE_IOS 1
+#	elif TARGET_OS_MAC
+#		define LOVE_MACOSX 1
+#	endif
 #endif
 
 // Endianness.
@@ -71,7 +75,7 @@
 #	define NOMINMAX
 #endif
 
-#if defined(LOVE_MACOSX)
+#if defined(LOVE_MACOSX) || defined(LOVE_IOS)
 #	define LOVE_LEGENDARY_APP_ARGV_HACK
 #endif
 

+ 61 - 0
src/common/iOS.h

@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2006-2015 LOVE Development Team
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ **/
+
+#ifndef LOVE_IOS_H
+#define LOVE_IOS_H
+
+#include "config.h"
+
+#ifdef LOVE_IOS
+
+#include <string>
+
+namespace love
+{
+namespace ios
+{
+
+/**
+ * Gets the filepath of the first detected love file. The main .app Bundle is
+ * searched first, and then the app's Documents folder.
+ **/
+std::string getLoveInResources(bool &fused);
+
+/**
+ * Gets the directory path where files should be stored.
+ **/
+std::string getAppdataDirectory();
+
+/**
+ * Get the home directory (on iOS, this really means the app's sandbox dir.)
+ **/
+std::string getHomeDirectory();
+
+/**
+ * Opens the specified URL with the default program associated with the URL's
+ * scheme.
+ **/
+bool openURL(const std::string &url);
+
+} // ios
+} // love
+
+#endif // LOVE_IOS
+#endif // LOVE_IOS_H

+ 320 - 0
src/common/iOS.mm

@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2006-2015 LOVE Development Team
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ **/
+
+#include "iOS.h"
+
+#ifdef LOVE_IOS
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+#include <vector>
+
+#include <SDL_events.h>
+
+static NSArray *getLovesInDocuments();
+static bool deleteFileInDocuments(NSString *filename);
+
+@interface LOVETableViewController : UITableViewController
+
+- (instancetype)initWithGameList:(NSArray *)list;
+
+@property (nonatomic) NSMutableArray *gameList;
+@property (nonatomic, readonly, copy) NSString *selectedGame;
+
+@end
+
+@implementation LOVETableViewController
+
+- (instancetype)initWithGameList:(NSArray *)list
+{
+	if ((self = [super init]))
+	{
+		_gameList = [[NSMutableArray alloc] initWithArray:list copyItems:YES];
+
+		self.title = @"LÖVE Games";
+		self.navigationItem.rightBarButtonItem = self.editButtonItem;
+	}
+
+	return self;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+	#pragma unused(tableView)
+	#pragma unused(section)
+	// We want to list all games plus the no-game screen.
+	return self.gameList.count + 1;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+	static NSString *cellIdentifier = @"LOVETableCell";
+
+	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
+	if (cell == nil)
+		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
+
+	if (indexPath.row < (NSInteger) self.gameList.count)
+		cell.textLabel.text = self.gameList[indexPath.row];
+	else
+		cell.textLabel.text = @"No-game screen";
+
+	return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+	#pragma unused(tableView)
+	if (indexPath.row < (NSInteger) self.gameList.count)
+		_selectedGame = [(NSString *)(self.gameList[indexPath.row]) copy];
+	else
+	{
+		// We test against nil to check if a game has been selected, so we'll
+		// just use an empty string instead to represent the no-game screen.
+		_selectedGame = @"";
+	}
+}
+
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
+{
+	if (editingStyle != UITableViewCellEditingStyleDelete)
+		return;
+
+	if (indexPath.row >= (NSInteger) self.gameList.count)
+		return;
+
+	NSString *filename = self.gameList[indexPath.row];
+
+	// Delete the file.
+	if (deleteFileInDocuments(filename))
+	{
+		[self.gameList removeObjectAtIndex:indexPath.row];
+		[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+	}
+}
+
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
+{
+	#pragma unused(tableView)
+	// The no-game screen isn't removable.
+	return indexPath.row < (NSInteger) self.gameList.count;
+}
+
+@end
+
+static NSString *getDocumentsDirectory()
+{
+	NSArray *docdirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+	return docdirs[0];
+}
+
+static NSArray *getLovesInDocuments()
+{
+	NSString *documents = getDocumentsDirectory();
+	NSArray *filepaths = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documents error:nil];
+	return [filepaths pathsMatchingExtensions:@[@"love"]];
+}
+
+static bool deleteFileInDocuments(NSString *filename)
+{
+	NSString *documents = getDocumentsDirectory();
+
+	NSString *file = [documents stringByAppendingPathComponent:filename];
+	bool success = [[NSFileManager defaultManager] removeItemAtPath:file error:nil];
+
+	if (success)
+		NSLog(@"Deleted file %@ in Documents folder.", filename);
+
+	return success;
+}
+
+static int dropFileEventFilter(void *userdata, SDL_Event *event)
+{
+	if (event->type != SDL_DROPFILE)
+		return 1;
+
+	NSString *fname = @(event->drop.file);
+	NSFileManager *fmanager = [NSFileManager defaultManager];
+
+	if ([fmanager fileExistsAtPath:fname] && [fname.pathExtension isEqual:@"love"])
+	{
+		NSString *documents = getDocumentsDirectory();
+
+		documents = [[documents stringByStandardizingPath] stringByResolvingSymlinksInPath];
+		fname = [[fname stringByStandardizingPath] stringByResolvingSymlinksInPath];
+
+		// Is the file inside the Documents directory?
+		if ([fname hasPrefix:documents])
+		{
+			LOVETableViewController *vc = (__bridge LOVETableViewController *) userdata;
+
+			// Update the game list.
+			NSArray *games = getLovesInDocuments();
+			vc.gameList = [[NSMutableArray alloc] initWithArray:games copyItems:YES];
+			[vc.tableView reloadData];
+
+			SDL_free(event->drop.file);
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+namespace love
+{
+namespace ios
+{
+
+/**
+ * Displays a full-screen list of available LOVE games for the user to choose.
+ * Returns the index of the selected game from the list. The list of games
+ * includes the no-game screen, and the function will return an index outside
+ * of the array's range if that is selected.
+ **/
+static NSString *showGameList(NSArray *filenames)
+{
+	// Game list view controller.
+	LOVETableViewController *tablecontroller = [[LOVETableViewController alloc] initWithGameList:filenames];
+
+	// Navigation view controller (only used for the header bar right now.)
+	// Contains the game list view/controller.
+	UINavigationController *navcontroller = [[UINavigationController alloc] initWithRootViewController:tablecontroller];
+
+	UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+	window.rootViewController = navcontroller;
+
+	SDL_EventFilter oldfilter = nullptr;
+	void *oldudata = nullptr;
+	SDL_GetEventFilter(&oldfilter, &oldudata);
+
+	// Manually retain the table VC and use it for the event filter userdata.
+	// We need to set a custom event filter to update the table when .love files
+	// are opened by the user.
+	void *tableudata = (void *) CFBridgingRetain(tablecontroller);
+	SDL_SetEventFilter(dropFileEventFilter, tableudata);
+
+	[window makeKeyAndVisible];
+
+	// Process events until a game in the list is selected.
+	NSRunLoop *runloop = [NSRunLoop currentRunLoop];
+	while (tablecontroller.selectedGame == nil)
+	{
+		[runloop runMode:NSDefaultRunLoopMode  beforeDate:[NSDate distantPast]];
+		[runloop runMode:UITrackingRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0/60.0]];
+	}
+
+	// The window will get released and cleaned up once we go out of scope.
+	window.hidden = YES;
+
+	SDL_SetEventFilter(oldfilter, oldudata);
+	CFBridgingRelease(tableudata);
+
+	return tablecontroller.selectedGame;
+}
+
+std::string getLoveInResources(bool &fused)
+{
+	fused = false;
+	std::string path;
+
+	@autoreleasepool
+	{
+		// Start by looking in the main bundle (.app) folder for .love files.
+		NSArray *bundlepaths = [[NSBundle mainBundle] pathsForResourcesOfType:@"love" inDirectory:nil];
+
+		if (bundlepaths.count > 0)
+		{
+			// The game should be fused if we have something here.
+			fused = true;
+			NSLog(@".love files in main Bundle: %@", bundlepaths);
+			return [bundlepaths[0] UTF8String];
+		}
+
+		// Otherwise look in the app's Documents directory. The game won't be
+		// fused.
+		NSArray *filepaths = getLovesInDocuments();
+
+		if (filepaths.count > 0)
+			NSLog(@".love files in Documents: %@", filepaths);
+
+		// Let the user select a game from the un-fused list.
+		NSString *selectedfile = showGameList(filepaths);
+
+		// The string length might be 0 if the no-game screen was selected.
+		if (selectedfile != nil && selectedfile.length > 0)
+		{
+			NSString *documents = getDocumentsDirectory();
+			path = [[documents stringByAppendingPathComponent:selectedfile] UTF8String];
+			NSLog(@"Using unfused .love file: %@", selectedfile);
+		}
+	}
+
+	return path;
+}
+
+std::string getAppdataDirectory()
+{
+	NSSearchPathDirectory searchdir = NSApplicationSupportDirectory;
+	std::string path;
+
+	@autoreleasepool
+	{
+		NSArray *dirs = NSSearchPathForDirectoriesInDomains(searchdir, NSUserDomainMask, YES);
+
+		if (dirs.count > 0)
+			path = [dirs[0] UTF8String];
+	}
+
+	return path;
+}
+
+std::string getHomeDirectory()
+{
+	std::string path;
+
+	@autoreleasepool
+	{
+		path = [NSHomeDirectory() UTF8String];
+	}
+
+	return path;
+}
+
+bool openURL(const std::string &url)
+{
+	bool success = false;
+
+	@autoreleasepool
+	{
+		NSURL *nsurl = [NSURL URLWithString:@(url.c_str())];
+
+		if ([[UIApplication sharedApplication] canOpenURL:nsurl])
+			success = [[UIApplication sharedApplication] openURL:nsurl];
+	}
+
+	return success;
+}
+
+} // ios
+} // love
+
+#endif // LOVE_IOS

+ 6 - 6
src/common/version.h

@@ -26,12 +26,12 @@ namespace love
 
 // Version stuff.
 #define LOVE_VERSION_STRING "0.10.0"
-const int VERSION_MAJOR = 0;
-const int VERSION_MINOR = 10;
-const int VERSION_REV = 0;
-const char *VERSION = LOVE_VERSION_STRING;
-const char *VERSION_COMPATIBILITY[] =  { VERSION, 0 };
-const char *VERSION_CODENAME = "";
+static const int VERSION_MAJOR = 0;
+static const int VERSION_MINOR = 10;
+static const int VERSION_REV = 0;
+static const char *VERSION = LOVE_VERSION_STRING;
+static const char *VERSION_COMPATIBILITY[] =  { VERSION, 0 };
+static const char *VERSION_CODENAME = "";
 
 } // love
 

+ 37 - 4
src/love.cpp

@@ -39,6 +39,10 @@ extern "C" {
 #include "common/OSX.h"
 #endif // LOVE_MACOSX
 
+#ifdef LOVE_IOS
+#include "common/iOS.h"
+#endif
+
 #ifdef LOVE_WINDOWS
 extern "C"
 {
@@ -101,6 +105,7 @@ static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_
 			temp_argv.push_back(std::string(argv[i]));
 	}
 
+#ifdef LOVE_MACOSX
 	// Check for a drop file string.
 	std::string dropfilestr = love::osx::checkDropEvents();
 	if (!dropfilestr.empty())
@@ -108,15 +113,24 @@ static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_
 		temp_argv.insert(temp_argv.begin() + 1, dropfilestr);
 	}
 	else
+#endif
 	{
 		// If it exists, add the love file in love.app/Contents/Resources/ to argv.
-		std::string loveResourcesPath = love::osx::getLoveInResources();
+		std::string loveResourcesPath;
+		bool fused = true;
+#if defined(LOVE_MACOSX)
+		loveResourcesPath = love::osx::getLoveInResources();
+#elif defined(LOVE_IOS)
+		loveResourcesPath = love::ios::getLoveInResources(fused);
+#endif
 		if (!loveResourcesPath.empty())
 		{
-			// Run in pseudo-fused mode.
 			std::vector<std::string>::iterator it = temp_argv.begin();
 			it = temp_argv.insert(it + 1, loveResourcesPath);
-			temp_argv.insert(it + 1, std::string("--fused"));
+
+			// Run in pseudo-fused mode.
+			if (fused)
+				temp_argv.insert(it + 1, std::string("--fused"));
 		}
 	}
 
@@ -147,6 +161,21 @@ static int love_preload(lua_State *L, lua_CFunction f, const char *name)
 
 int main(int argc, char **argv)
 {
+	int retval = 0;
+
+#ifdef LOVE_IOS
+	int orig_argc = argc;
+	char **orig_argv = argv;
+
+	// on iOS we should never programmatically exit the app, so we'll just
+	// "restart" when that is attempted. Games which use threads might cause
+	// some issues if the threads aren't cleaned up properly...
+	while (true)
+	{
+		argc = orig_argc;
+		argv = orig_argv;
+#endif
+
 #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
 	int hack_argc = 0;	char **hack_argv = 0;
 	get_utf8_arguments(hack_argc, hack_argv);
@@ -229,7 +258,6 @@ int main(int argc, char **argv)
 	// Call the returned boot function.
 	lua_call(L, 0, 1);
 
-	int retval = 0;
 	if (lua_isnumber(L, -1))
 		retval = (int) lua_tonumber(L, -1);
 
@@ -243,6 +271,11 @@ int main(int argc, char **argv)
 		delete [] hack_argv;
 	}
 #endif // LOVE_LEGENDARY_UTF8_ARGV_HACK || LOVE_LEGENDARY_APP_ARGV_HACK
+
+#ifdef LOVE_IOS
+	} // while (true)
+#endif
+
 	return retval;
 }
 

+ 5 - 0
src/modules/audio/openal/Audio.h

@@ -37,8 +37,13 @@
 
 // OpenAL
 #ifdef LOVE_APPLE_USE_FRAMEWORKS // Frameworks have different include paths.
+#ifdef LOVE_IOS
+#include <OpenAL/alc.h>
+#include <OpenAL/al.h>
+#else
 #include <OpenAL-Soft/alc.h>
 #include <OpenAL-Soft/al.h>
+#endif
 #else
 #include <AL/alc.h>
 #include <AL/al.h>

+ 2 - 0
src/modules/audio/openal/Pool.cpp

@@ -56,7 +56,9 @@ Pool::Pool()
 	// Create the mutex.
 	mutex = thread::newMutex();
 
+#ifdef AL_SOFT_direct_channels
 	ALboolean hasext = alIsExtensionPresent("AL_SOFT_direct_channels");
+#endif
 
 	// Make all sources available initially.
 	for (int i = 0; i < totalSources; i++)

+ 7 - 0
src/modules/audio/openal/Pool.h

@@ -33,9 +33,16 @@
 
 // OpenAL
 #ifdef LOVE_APPLE_USE_FRAMEWORKS
+#ifdef LOVE_IOS
+#include <OpenAL/alc.h>
+#include <OpenAL/al.h>
+#include <OpenAL/oalMacOSX_OALExtensions.h>
+#include <OpenAL/oalStaticBufferExtension.h>
+#else
 #include <OpenAL-Soft/alc.h>
 #include <OpenAL-Soft/al.h>
 #include <OpenAL-Soft/alext.h>
+#endif
 #else
 #include <AL/alc.h>
 #include <AL/al.h>

+ 5 - 0
src/modules/audio/openal/Source.h

@@ -30,8 +30,13 @@
 
 // OpenAL
 #ifdef LOVE_APPLE_USE_FRAMEWORKS
+#ifdef LOVE_IOS
+#include <OpenAL/alc.h>
+#include <OpenAL/al.h>
+#else
 #include <OpenAL-Soft/alc.h>
 #include <OpenAL-Soft/al.h>
+#endif
 #else
 #include <AL/alc.h>
 #include <AL/al.h>

+ 1 - 1
src/modules/filesystem/Filesystem.h

@@ -41,7 +41,7 @@
 #	define LOVE_PATH_SEPARATOR "/"
 #	define LOVE_MAX_PATH _MAX_PATH
 #else
-#	ifdef LOVE_MACOSX
+#	if defined(LOVE_MACOSX) || defined(LOVE_IOS)
 #		define LOVE_APPDATA_FOLDER "LOVE"
 #	elif defined(LOVE_LINUX)
 #		define LOVE_APPDATA_FOLDER "love"

+ 6 - 0
src/modules/filesystem/physfs/Filesystem.cpp

@@ -46,6 +46,10 @@
 #	include <unistd.h>
 #endif
 
+#ifdef LOVE_IOS
+#	include "common/iOS.h"
+#endif
+
 namespace
 {
 	size_t getDriveDelim(const std::string &input)
@@ -422,6 +426,8 @@ std::string Filesystem::getAppdataDirectory()
 		std::string udir = getUserDirectory();
 		udir.append("/Library/Application Support");
 		appdata = normalize(udir);
+#elif defined(LOVE_IOS)
+		appdata = normalize(love::ios::getAppdataDirectory());
 #elif defined(LOVE_LINUX)
 		char *xdgdatahome = getenv("XDG_DATA_HOME");
 		if (!xdgdatahome)

+ 2 - 0
src/modules/love/love.cpp

@@ -230,6 +230,8 @@ int luaopen_love(lua_State * L)
 	lua_pushstring(L, "Windows");
 #elif defined(LOVE_MACOSX)
 	lua_pushstring(L, "OS X");
+#elif defined(LOVE_IOS)
+	lua_pushstring(L, "iOS");
 #elif defined(LOVE_LINUX)
 	lua_pushstring(L, "Linux");
 #else

+ 5 - 1
src/modules/sound/lullaby/ModPlugDecoder.cpp

@@ -17,9 +17,11 @@
  *    misrepresented as being the original software.
  * 3. This notice may not be removed or altered from any source distribution.
  **/
-#include "common/config.h"
+
 #include "ModPlugDecoder.h"
 
+#ifndef LOVE_NO_MODPLUG
+
 #include "common/Exception.h"
 
 namespace love
@@ -145,3 +147,5 @@ int ModPlugDecoder::getBitDepth() const
 } // lullaby
 } // sound
 } // love
+
+#endif // LOVE_NO_MODPLUG

+ 6 - 0
src/modules/sound/lullaby/ModPlugDecoder.h

@@ -21,6 +21,10 @@
 #ifndef LOVE_SOUND_LULLABY_MODPLUG_DECODER_H
 #define LOVE_SOUND_LULLABY_MODPLUG_DECODER_H
 
+#include "common/config.h"
+
+#ifndef LOVE_NO_MODPLUG
+
 // LOVE
 #include "common/Data.h"
 #include "Decoder.h"
@@ -62,4 +66,6 @@ private:
 } // sound
 } // love
 
+#endif // LOVE_NO_MODPLUG
+
 #endif // LOVE_SOUND_LULLABY_MODPLUG_DECODER_H

+ 5 - 1
src/modules/sound/lullaby/Sound.cpp

@@ -69,8 +69,12 @@ sound::Decoder *Sound::newDecoder(love::filesystem::FileData *data, int bufferSi
 	sound::Decoder *decoder = 0;
 
 	// Find a suitable decoder here, and return it.
-	if (ModPlugDecoder::accepts(ext))
+	if (false)
+		/* nothing */;
+#ifndef LOVE_NO_MODPLUG
+	else if (ModPlugDecoder::accepts(ext))
 		decoder = new ModPlugDecoder(data, ext, bufferSize);
+#endif // LOVE_NO_MODPLUG
 #ifndef LOVE_NOMPG123
 	else if (Mpg123Decoder::accepts(ext))
 		decoder = new Mpg123Decoder(data, ext, bufferSize);

+ 8 - 0
src/modules/system/System.cpp

@@ -24,6 +24,8 @@
 
 #if defined(LOVE_MACOSX)
 #include <CoreServices/CoreServices.h>
+#elif defined(LOVE_IOS)
+#include "common/iOS.h"
 #elif defined(LOVE_LINUX)
 #include <spawn.h>
 //#include <stdlib.h>
@@ -60,6 +62,8 @@ std::string System::getOS() const
 {
 #if defined(LOVE_MACOSX)
 	return "OS X";
+#elif defined(LOVE_IOS)
+	return "iOS";
 #elif defined(LOVE_WINDOWS)
 	return "Windows";
 #elif defined(LOVE_LINUX)
@@ -91,6 +95,10 @@ bool System::openURL(const std::string &url) const
 	CFRelease(cfurl);
 	return success;
 
+#elif defined(LOVE_IOS)
+
+	return love::ios::openURL(url);
+
 #elif defined(LOVE_LINUX)
 
 	pid_t pid;

+ 3 - 3
src/modules/timer/sdl/Timer.cpp

@@ -30,7 +30,7 @@
 
 #if defined(LOVE_WINDOWS)
 #include <windows.h>
-#elif defined(LOVE_MACOSX)
+#elif defined(LOVE_MACOSX) || defined(LOVE_IOS)
 #include <mach/mach_time.h>
 #include <sys/time.h>
 #elif defined(LOVE_LINUX)
@@ -134,7 +134,7 @@ double Timer::getAverageDelta() const
 
 double Timer::getTimerPeriod()
 {
-#if defined(LOVE_MACOSX)
+#if defined(LOVE_MACOSX) || defined(LOVE_IOS)
 	mach_timebase_info_data_t info;
 	mach_timebase_info(&info);
 	return (double) info.numer / (double) info.denom / 1000000000.0;
@@ -165,7 +165,7 @@ double Timer::getTime() const
 #endif
 		mt = getTimeOfDay();
 	return mt;
-#elif defined(LOVE_MACOSX)
+#elif defined(LOVE_MACOSX) || defined(LOVE_IOS)
 	return (double) mach_absolute_time() * timerPeriod;
 #elif defined(LOVE_WINDOWS)
 	LARGE_INTEGER microTime;

Some files were not shown because too many files changed in this diff