diff --git a/GlobalWordRacer/.gitignore b/GlobalWordRacer/.gitignore new file mode 100644 index 0000000..21efc54 --- /dev/null +++ b/GlobalWordRacer/.gitignore @@ -0,0 +1,6 @@ +fastlane/Preview.html +fastlane/report.xml +*.mobileprovision +*.zip +*.ipa +*.cer diff --git a/GlobalWordRacer/Gemfile b/GlobalWordRacer/Gemfile new file mode 100644 index 0000000..3cf0a53 --- /dev/null +++ b/GlobalWordRacer/Gemfile @@ -0,0 +1,17 @@ +source 'https://rubygems.org' do + gem 'fastlane', '2.145.0' +end + +# Install Bundler +#> sudo gem install bundler +#> bundle install +#> bundle exec fastlane +#> bundle exec fastlane ios release + +# It looks like your project isn't set up to do automatic version incrementing +# To enable fastlane to handle automatic version incrementing for you, please follow this guide: +# https://developer.apple.com/library/content/qa/qa1827/_index.html +# Afterwards check out the fastlane docs on how to set up automatic build increments +# https://docs.fastlane.tools/getting-started/ios/beta-deployment/#best-practices +# 📸 Learn more about how to automatically generate localized App Store screenshots: +# https://docs.fastlane.tools/getting-started/ios/screenshots/ diff --git a/GlobalWordRacer/Gemfile.lock b/GlobalWordRacer/Gemfile.lock new file mode 100644 index 0000000..3a438a6 --- /dev/null +++ b/GlobalWordRacer/Gemfile.lock @@ -0,0 +1,179 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + atomos (0.1.3) + aws-eventstream (1.1.0) + aws-partitions (1.298.0) + aws-sdk-core (3.94.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.30.0) + aws-sdk-core (~> 3, >= 3.71.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.61.2) + aws-sdk-core (~> 3, >= 3.83.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.1.2) + aws-eventstream (~> 1.0, >= 1.0.2) + babosa (1.0.3) + claide (1.0.3) + colored (1.2) + colored2 (3.1.2) + commander-fastlane (4.4.6) + highline (~> 1.7.2) + declarative (0.0.10) + declarative-option (0.1.0) + digest-crc (0.5.1) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.5) + emoji_regex (1.0.1) + excon (0.73.0) + faraday (0.17.3) + multipart-post (>= 1.2, < 3) + faraday-cookie_jar (0.0.6) + faraday (>= 0.7.4) + http-cookie (~> 1.0.0) + faraday_middleware (0.13.1) + faraday (>= 0.7.4, < 1.0) + fastimage (2.1.7) + fastlane (2.145.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.2, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander-fastlane (>= 4.4.6, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 2.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 0.17) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 0.13.1) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-api-client (>= 0.29.2, < 0.37.0) + google-cloud-storage (>= 1.15.0, < 2.0.0) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + jwt (~> 2.1.0) + mini_magick (>= 4.9.4, < 5.0.0) + multi_xml (~> 0.5) + multipart-post (~> 2.0.0) + plist (>= 3.1.0, < 4.0.0) + public_suffix (~> 2.0.0) + rubyzip (>= 1.3.0, < 2.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + slack-notifier (>= 2.0.0, < 3.0.0) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-api-client (0.36.4) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.9) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + signet (~> 0.12) + google-cloud-core (1.5.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.3.1) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.0) + google-cloud-storage (1.26.0) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-api-client (~> 0.33) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.12.0) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.14) + highline (1.7.10) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.4.0) + json (2.3.0) + jwt (2.1.0) + memoist (0.16.2) + mini_magick (4.10.1) + mini_mime (1.0.2) + multi_json (1.14.1) + multi_xml (0.6.0) + multipart-post (2.0.0) + nanaimo (0.2.6) + naturally (2.2.0) + os (1.1.0) + plist (3.5.0) + public_suffix (2.0.5) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rouge (2.0.7) + rubyzip (1.3.0) + security (0.1.3) + signet (0.14.0) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + slack-notifier (2.3.2) + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + tty-cursor (0.7.1) + tty-screen (0.7.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) + word_wrap (1.0.0) + xcodeproj (1.16.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.6) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.0) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + fastlane (= 2.145.0)! + +BUNDLED WITH + 2.1.4 diff --git a/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.pbxproj b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..91400d5 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.pbxproj @@ -0,0 +1,677 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + F795E949244A3BC400CA9AF5 /* GridAndSolutions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F795E948244A3BC400CA9AF5 /* GridAndSolutions.swift */; }; + F795E94C244B86E200CA9AF5 /* LetterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F795E94B244B86E200CA9AF5 /* LetterView.swift */; }; + F795E94E244B916D00CA9AF5 /* CurrentSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F795E94D244B916D00CA9AF5 /* CurrentSelectionView.swift */; }; + F795E950244B950D00CA9AF5 /* FoundSolutionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F795E94F244B950D00CA9AF5 /* FoundSolutionsView.swift */; }; + F795E952244B99C300CA9AF5 /* InvalidWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F795E951244B99C300CA9AF5 /* InvalidWordView.swift */; }; + F7F3620C2447DA6300812AED /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3620B2447DA6300812AED /* AppDelegate.swift */; }; + F7F3620E2447DA6300812AED /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3620D2447DA6300812AED /* SceneDelegate.swift */; }; + F7F362122447DA6900812AED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7F362112447DA6900812AED /* Assets.xcassets */; }; + F7F362152447DA6900812AED /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7F362142447DA6900812AED /* Preview Assets.xcassets */; }; + F7F362182447DA6900812AED /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7F362162447DA6900812AED /* LaunchScreen.storyboard */; }; + F7F362232447DA6900812AED /* GlobalWordRacerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F362222447DA6900812AED /* GlobalWordRacerTests.swift */; }; + F7F3622E2447DA6900812AED /* GlobalWordRacerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3622D2447DA6900812AED /* GlobalWordRacerUITests.swift */; }; + F7F3623C244936C300812AED /* GameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3623B244936C300812AED /* GameView.swift */; }; + F7F3623E244936F400812AED /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3623D244936F400812AED /* WelcomeView.swift */; }; + F7F3624024493CF300812AED /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F3623F24493CF300812AED /* MainView.swift */; }; + F7F36243244983FF00812AED /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = F7F36242244983FF00812AED /* Alamofire */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + F7F3621F2447DA6900812AED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F7F362002447DA6300812AED /* Project object */; + proxyType = 1; + remoteGlobalIDString = F7F362072447DA6300812AED; + remoteInfo = GlobalWordRacer; + }; + F7F3622A2447DA6900812AED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F7F362002447DA6300812AED /* Project object */; + proxyType = 1; + remoteGlobalIDString = F7F362072447DA6300812AED; + remoteInfo = GlobalWordRacer; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + F795E948244A3BC400CA9AF5 /* GridAndSolutions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridAndSolutions.swift; sourceTree = ""; }; + F795E94B244B86E200CA9AF5 /* LetterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterView.swift; sourceTree = ""; }; + F795E94D244B916D00CA9AF5 /* CurrentSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentSelectionView.swift; sourceTree = ""; }; + F795E94F244B950D00CA9AF5 /* FoundSolutionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoundSolutionsView.swift; sourceTree = ""; }; + F795E951244B99C300CA9AF5 /* InvalidWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvalidWordView.swift; sourceTree = ""; }; + F7F362082447DA6300812AED /* GlobalWordRacer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GlobalWordRacer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F7F3620B2447DA6300812AED /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + F7F3620D2447DA6300812AED /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + F7F362112447DA6900812AED /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + F7F362142447DA6900812AED /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + F7F362172447DA6900812AED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + F7F362192447DA6900812AED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F7F3621E2447DA6900812AED /* GlobalWordRacerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GlobalWordRacerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + F7F362222447DA6900812AED /* GlobalWordRacerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalWordRacerTests.swift; sourceTree = ""; }; + F7F362242447DA6900812AED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F7F362292447DA6900812AED /* GlobalWordRacerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GlobalWordRacerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + F7F3622D2447DA6900812AED /* GlobalWordRacerUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalWordRacerUITests.swift; sourceTree = ""; }; + F7F3622F2447DA6900812AED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F7F3623B244936C300812AED /* GameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameView.swift; sourceTree = ""; }; + F7F3623D244936F400812AED /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; + F7F3623F24493CF300812AED /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F7F362052447DA6300812AED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F7F36243244983FF00812AED /* Alamofire in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F3621B2447DA6900812AED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F362262447DA6900812AED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F795E947244A3BB100CA9AF5 /* Decodables */ = { + isa = PBXGroup; + children = ( + F795E948244A3BC400CA9AF5 /* GridAndSolutions.swift */, + ); + path = Decodables; + sourceTree = ""; + }; + F795E94A244A3BFD00CA9AF5 /* Views */ = { + isa = PBXGroup; + children = ( + F795E94D244B916D00CA9AF5 /* CurrentSelectionView.swift */, + F795E94F244B950D00CA9AF5 /* FoundSolutionsView.swift */, + F7F3623B244936C300812AED /* GameView.swift */, + F795E951244B99C300CA9AF5 /* InvalidWordView.swift */, + F795E94B244B86E200CA9AF5 /* LetterView.swift */, + F7F3623F24493CF300812AED /* MainView.swift */, + F7F3623D244936F400812AED /* WelcomeView.swift */, + ); + path = Views; + sourceTree = ""; + }; + F7F361FF2447DA6300812AED = { + isa = PBXGroup; + children = ( + F7F3620A2447DA6300812AED /* GlobalWordRacer */, + F7F362212447DA6900812AED /* GlobalWordRacerTests */, + F7F3622C2447DA6900812AED /* GlobalWordRacerUITests */, + F7F362092447DA6300812AED /* Products */, + ); + sourceTree = ""; + }; + F7F362092447DA6300812AED /* Products */ = { + isa = PBXGroup; + children = ( + F7F362082447DA6300812AED /* GlobalWordRacer.app */, + F7F3621E2447DA6900812AED /* GlobalWordRacerTests.xctest */, + F7F362292447DA6900812AED /* GlobalWordRacerUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + F7F3620A2447DA6300812AED /* GlobalWordRacer */ = { + isa = PBXGroup; + children = ( + F7F3620B2447DA6300812AED /* AppDelegate.swift */, + F7F362112447DA6900812AED /* Assets.xcassets */, + F795E947244A3BB100CA9AF5 /* Decodables */, + F7F362192447DA6900812AED /* Info.plist */, + F7F362162447DA6900812AED /* LaunchScreen.storyboard */, + F7F362132447DA6900812AED /* Preview Content */, + F7F3620D2447DA6300812AED /* SceneDelegate.swift */, + F795E94A244A3BFD00CA9AF5 /* Views */, + ); + path = GlobalWordRacer; + sourceTree = ""; + }; + F7F362132447DA6900812AED /* Preview Content */ = { + isa = PBXGroup; + children = ( + F7F362142447DA6900812AED /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + F7F362212447DA6900812AED /* GlobalWordRacerTests */ = { + isa = PBXGroup; + children = ( + F7F362222447DA6900812AED /* GlobalWordRacerTests.swift */, + F7F362242447DA6900812AED /* Info.plist */, + ); + path = GlobalWordRacerTests; + sourceTree = ""; + }; + F7F3622C2447DA6900812AED /* GlobalWordRacerUITests */ = { + isa = PBXGroup; + children = ( + F7F3622D2447DA6900812AED /* GlobalWordRacerUITests.swift */, + F7F3622F2447DA6900812AED /* Info.plist */, + ); + path = GlobalWordRacerUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F7F362072447DA6300812AED /* GlobalWordRacer */ = { + isa = PBXNativeTarget; + buildConfigurationList = F7F362322447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacer" */; + buildPhases = ( + F7F362042447DA6300812AED /* Sources */, + F7F362052447DA6300812AED /* Frameworks */, + F7F362062447DA6300812AED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GlobalWordRacer; + packageProductDependencies = ( + F7F36242244983FF00812AED /* Alamofire */, + ); + productName = GlobalWordRacer; + productReference = F7F362082447DA6300812AED /* GlobalWordRacer.app */; + productType = "com.apple.product-type.application"; + }; + F7F3621D2447DA6900812AED /* GlobalWordRacerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F7F362352447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacerTests" */; + buildPhases = ( + F7F3621A2447DA6900812AED /* Sources */, + F7F3621B2447DA6900812AED /* Frameworks */, + F7F3621C2447DA6900812AED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F7F362202447DA6900812AED /* PBXTargetDependency */, + ); + name = GlobalWordRacerTests; + productName = GlobalWordRacerTests; + productReference = F7F3621E2447DA6900812AED /* GlobalWordRacerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + F7F362282447DA6900812AED /* GlobalWordRacerUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F7F362382447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacerUITests" */; + buildPhases = ( + F7F362252447DA6900812AED /* Sources */, + F7F362262447DA6900812AED /* Frameworks */, + F7F362272447DA6900812AED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F7F3622B2447DA6900812AED /* PBXTargetDependency */, + ); + name = GlobalWordRacerUITests; + productName = GlobalWordRacerUITests; + productReference = F7F362292447DA6900812AED /* GlobalWordRacerUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F7F362002447DA6300812AED /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1140; + ORGANIZATIONNAME = "Andrew Gerst"; + TargetAttributes = { + F7F362072447DA6300812AED = { + CreatedOnToolsVersion = 11.4; + ProvisioningStyle = Automatic; + }; + F7F3621D2447DA6900812AED = { + CreatedOnToolsVersion = 11.4; + ProvisioningStyle = Automatic; + TestTargetID = F7F362072447DA6300812AED; + }; + F7F362282447DA6900812AED = { + CreatedOnToolsVersion = 11.4; + ProvisioningStyle = Automatic; + TestTargetID = F7F362072447DA6300812AED; + }; + }; + }; + buildConfigurationList = F7F362032447DA6300812AED /* Build configuration list for PBXProject "GlobalWordRacer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F7F361FF2447DA6300812AED; + packageReferences = ( + F7F36241244983FF00812AED /* XCRemoteSwiftPackageReference "Alamofire" */, + ); + productRefGroup = F7F362092447DA6300812AED /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F7F362072447DA6300812AED /* GlobalWordRacer */, + F7F3621D2447DA6900812AED /* GlobalWordRacerTests */, + F7F362282447DA6900812AED /* GlobalWordRacerUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F7F362062447DA6300812AED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F7F362182447DA6900812AED /* LaunchScreen.storyboard in Resources */, + F7F362152447DA6900812AED /* Preview Assets.xcassets in Resources */, + F7F362122447DA6900812AED /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F3621C2447DA6900812AED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F362272447DA6900812AED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F7F362042447DA6300812AED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F795E952244B99C300CA9AF5 /* InvalidWordView.swift in Sources */, + F795E94C244B86E200CA9AF5 /* LetterView.swift in Sources */, + F795E94E244B916D00CA9AF5 /* CurrentSelectionView.swift in Sources */, + F7F3620C2447DA6300812AED /* AppDelegate.swift in Sources */, + F7F3620E2447DA6300812AED /* SceneDelegate.swift in Sources */, + F7F3623C244936C300812AED /* GameView.swift in Sources */, + F795E950244B950D00CA9AF5 /* FoundSolutionsView.swift in Sources */, + F7F3624024493CF300812AED /* MainView.swift in Sources */, + F795E949244A3BC400CA9AF5 /* GridAndSolutions.swift in Sources */, + F7F3623E244936F400812AED /* WelcomeView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F3621A2447DA6900812AED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F7F362232447DA6900812AED /* GlobalWordRacerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7F362252447DA6900812AED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F7F3622E2447DA6900812AED /* GlobalWordRacerUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F7F362202447DA6900812AED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F7F362072447DA6300812AED /* GlobalWordRacer */; + targetProxy = F7F3621F2447DA6900812AED /* PBXContainerItemProxy */; + }; + F7F3622B2447DA6900812AED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F7F362072447DA6300812AED /* GlobalWordRacer */; + targetProxy = F7F3622A2447DA6900812AED /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + F7F362162447DA6900812AED /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + F7F362172447DA6900812AED /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + F7F362302447DA6900812AED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + F7F362312447DA6900812AED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = 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; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F7F362332447DA6900812AED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_ASSET_PATHS = "\"GlobalWordRacer/Preview Content\""; + DEVELOPMENT_TEAM = 2DE824Y55C; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = GlobalWordRacer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + F7F362342447DA6900812AED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_ASSET_PATHS = "\"GlobalWordRacer/Preview Content\""; + DEVELOPMENT_TEAM = 2DE824Y55C; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = GlobalWordRacer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + F7F362362447DA6900812AED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VLF9HQZ98F; + INFOPLIST_FILE = GlobalWordRacerTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GlobalWordRacer.app/GlobalWordRacer"; + }; + name = Debug; + }; + F7F362372447DA6900812AED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VLF9HQZ98F; + INFOPLIST_FILE = GlobalWordRacerTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GlobalWordRacer.app/GlobalWordRacer"; + }; + name = Release; + }; + F7F362392447DA6900812AED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VLF9HQZ98F; + INFOPLIST_FILE = GlobalWordRacerUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacerUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = GlobalWordRacer; + }; + name = Debug; + }; + F7F3623A2447DA6900812AED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VLF9HQZ98F; + INFOPLIST_FILE = GlobalWordRacerUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = hnswave.GlobalWordRacerUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = GlobalWordRacer; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F7F362032447DA6300812AED /* Build configuration list for PBXProject "GlobalWordRacer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7F362302447DA6900812AED /* Debug */, + F7F362312447DA6900812AED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F7F362322447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7F362332447DA6900812AED /* Debug */, + F7F362342447DA6900812AED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F7F362352447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7F362362447DA6900812AED /* Debug */, + F7F362372447DA6900812AED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F7F362382447DA6900812AED /* Build configuration list for PBXNativeTarget "GlobalWordRacerUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F7F362392447DA6900812AED /* Debug */, + F7F3623A2447DA6900812AED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + F7F36241244983FF00812AED /* XCRemoteSwiftPackageReference "Alamofire" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Alamofire/Alamofire.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + F7F36242244983FF00812AED /* Alamofire */ = { + isa = XCSwiftPackageProductDependency; + package = F7F36241244983FF00812AED /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = Alamofire; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = F7F362002447DA6300812AED /* Project object */; +} diff --git a/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7378f58 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "Alamofire", + "repositoryURL": "https://github.com/Alamofire/Alamofire.git", + "state": { + "branch": null, + "revision": "fca036f7aeca07124067cb6e0c12b0ad6359e3d4", + "version": "5.1.0" + } + } + ] + }, + "version": 1 +} diff --git a/GlobalWordRacer/GlobalWordRacer/AppDelegate.swift b/GlobalWordRacer/GlobalWordRacer/AppDelegate.swift new file mode 100644 index 0000000..f65e430 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/AppDelegate.swift @@ -0,0 +1,33 @@ +// +// AppDelegate.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/15/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png new file mode 100644 index 0000000..1442336 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png new file mode 100644 index 0000000..076f412 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png new file mode 100644 index 0000000..f23920f Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png new file mode 100644 index 0000000..80fe6e4 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png new file mode 100644 index 0000000..5a20f63 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png new file mode 100644 index 0000000..d32d6d1 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png new file mode 100644 index 0000000..c10bb70 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png new file mode 100644 index 0000000..f23920f Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png new file mode 100644 index 0000000..9b126c5 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png new file mode 100644 index 0000000..f3108ab Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000..f3108ab Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png new file mode 100644 index 0000000..759b5dc Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png new file mode 100644 index 0000000..9dbd793 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000..681394a Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png new file mode 100644 index 0000000..9d135f8 Binary files /dev/null and b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png differ diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/Contents.json b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1c1fe03 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images": [ + { + "filename": "AppIcon-20@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "20x20" + }, + { + "filename": "AppIcon-20@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "20x20" + }, + { + "filename": "AppIcon-20.png", + "idiom": "ipad", + "scale": "1x", + "size": "20x20" + }, + { + "filename": "AppIcon-20@2x.png", + "idiom": "ipad", + "scale": "2x", + "size": "20x20" + }, + { + "filename": "AppIcon-29@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "29x29" + }, + { + "filename": "AppIcon-29@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "29x29" + }, + { + "filename": "AppIcon-40@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "40x40" + }, + { + "filename": "AppIcon-40@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "40x40" + }, + { + "filename": "AppIcon-60@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "60x60" + }, + { + "filename": "AppIcon-60@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "60x60" + }, + { + "filename": "AppIcon-29.png", + "idiom": "ipad", + "scale": "1x", + "size": "29x29" + }, + { + "filename": "AppIcon-29@2x.png", + "idiom": "ipad", + "scale": "2x", + "size": "29x29" + }, + { + "filename": "AppIcon-40.png", + "idiom": "ipad", + "scale": "1x", + "size": "40x40" + }, + { + "filename": "AppIcon-40@2x.png", + "idiom": "ipad", + "scale": "2x", + "size": "40x40" + }, + { + "filename": "AppIcon-76.png", + "idiom": "ipad", + "scale": "1x", + "size": "76x76" + }, + { + "filename": "AppIcon-76@2x.png", + "idiom": "ipad", + "scale": "2x", + "size": "76x76" + }, + { + "filename": "AppIcon-83.5@2x.png", + "idiom": "ipad", + "scale": "2x", + "size": "83.5x83.5" + }, + { + "filename": "AppIcon-1024.png", + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} diff --git a/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/Contents.json b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/Contents.json new file mode 100644 index 0000000..74d6a72 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "author": "xcode", + "version": 1 + } +} diff --git a/GlobalWordRacer/GlobalWordRacer/Base.lproj/LaunchScreen.storyboard b/GlobalWordRacer/GlobalWordRacer/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GlobalWordRacer/GlobalWordRacer/Decodables/GridAndSolutions.swift b/GlobalWordRacer/GlobalWordRacer/Decodables/GridAndSolutions.swift new file mode 100644 index 0000000..fa85e59 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Decodables/GridAndSolutions.swift @@ -0,0 +1,21 @@ +// +// GridAndSolutions.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/17/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import Foundation + +struct GridAndSolutions: Decodable { + + var grid: [[String]] + var solutions: [String] + + enum CodingKeys: String, CodingKey { + case grid + case solutions + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Info.plist b/GlobalWordRacer/GlobalWordRacer/Info.plist new file mode 100644 index 0000000..1a072a9 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Info.plist @@ -0,0 +1,71 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 2 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + hnswave.co + + NSExceptionAllowsInsecureHTTPLoads + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/GlobalWordRacer/GlobalWordRacer/Preview Content/Preview Assets.xcassets/Contents.json b/GlobalWordRacer/GlobalWordRacer/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/GlobalWordRacer/GlobalWordRacer/SceneDelegate.swift b/GlobalWordRacer/GlobalWordRacer/SceneDelegate.swift new file mode 100644 index 0000000..62f459b --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/SceneDelegate.swift @@ -0,0 +1,61 @@ +// +// SceneDelegate.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/15/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import UIKit +import SwiftUI + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + // Create the SwiftUI view that provides the window contents. + let mainView = MainView() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: mainView) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/CurrentSelectionView.swift b/GlobalWordRacer/GlobalWordRacer/Views/CurrentSelectionView.swift new file mode 100644 index 0000000..e8ad6f7 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/CurrentSelectionView.swift @@ -0,0 +1,44 @@ +// +// CurrentSelectionView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/18/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct CurrentSelectionView: View { + + @Binding var text: String + @Binding var hasRoundEnded: Bool + let handler: () -> Void + + var body: some View { + Button(action: { + if (self.text != "") { + self.handler() + } + }) { + Text(hasRoundEnded ? "ROUND OVER" : text.count > 0 ? text.uppercased() : " ") + .fontWeight(.semibold) + .font(.title) + .padding() + .frame(width: UIScreen.main.bounds.width - 60) + .background(hasRoundEnded ? Color.gray : Color.blue) + .foregroundColor(.white) + .cornerRadius(40) + } + .disabled(hasRoundEnded) + .padding(.top, 20) + } + +} + +struct CurrentSelectionView_Previews: PreviewProvider { + + static var previews: some View { + CurrentSelectionView(text: .constant("Quest"), hasRoundEnded: .constant(false), handler: {}) + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/FoundSolutionsView.swift b/GlobalWordRacer/GlobalWordRacer/Views/FoundSolutionsView.swift new file mode 100644 index 0000000..1a907f6 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/FoundSolutionsView.swift @@ -0,0 +1,62 @@ +// +// FoundSolutionsView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/18/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct FoundSolutionsView: View { + + @Binding var list: [String] + @Binding var solutions: [String] + @Binding var hasRoundEnded: Bool + + var body: some View { + VStack { + Text( + hasRoundEnded + ? "Full Solutions List" + : list.count > 0 + ? "\(list.count) Word\(list.count > 1 ? "s": "") Found (\(list.map(self.pointsForWord).reduce(0, +)) Points)" + : "No Words Found" + ) + .foregroundColor(.black) + .fontWeight(.semibold) + .font(.headline) + + ScrollView(.vertical) { + VStack { + ForEach(hasRoundEnded ? solutions.sorted { $0.count > $1.count } : list.reversed(), id: \.self) { word in + HStack { + Text(word) + .foregroundColor(self.hasRoundEnded && self.list.contains(word) ? .green : .black) + Spacer() + Text("\(self.pointsForWord(word))") + .foregroundColor(self.hasRoundEnded && self.list.contains(word) ? .green : .black) + } + } + }.frame(width: UIScreen.main.bounds.width - 60) + } + + Spacer() + } + .frame(width: UIScreen.main.bounds.width - 60, height: 160) + } + + func pointsForWord(_ word: String) -> Int { + let wordPointsDistribution = [0, 0, 0, 10, 20, 40, 80, 120, 140, 220, 300] + return word.count > 11 ? 400 : wordPointsDistribution[word.count] + } + +} + +struct FoundSolutionsView_Previews: PreviewProvider { + + static var previews: some View { + FoundSolutionsView(list: .constant(["Word1", "Word2"]), solutions: .constant(["Word1", "Word2"]), hasRoundEnded: .constant(false)) + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/GameView.swift b/GlobalWordRacer/GlobalWordRacer/Views/GameView.swift new file mode 100644 index 0000000..82b2da6 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/GameView.swift @@ -0,0 +1,114 @@ +// +// GameView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/16/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct GameView: View { + + @Binding var grid: [[String]] + @Binding var solutions: [String] + @State private var currentSelection = "" + @State private var foundSolutions: [String] = [] + @State private var invalidWord = "" + @State private var duplicateWord = "" + @State private var hasRoundEnded = false + @State private var timeRemaining: Int = 30 + let gameTimer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() + let loadNewGameHandler: (_ callback: @escaping () -> Void) -> Void + + var body: some View { + VStack { + Text("Global Word Racer") + .fontWeight(.semibold) + .font(.system(size: 40)) + .frame(width: UIScreen.main.bounds.width, height: 60) + .padding(.top, 80) + .background(Color.blue) + .foregroundColor(.white) + buildBoard() + CurrentSelectionView(text: $currentSelection, hasRoundEnded: $hasRoundEnded, handler: selectionHandler) + Text(timeRemaining > 0 + ? "This Round Ends In \(timeRemaining) Seconds" + : "Next Round Starts In \(16 + timeRemaining) Seconds" + ) + .padding(.top) + .foregroundColor(.black) + .onReceive(gameTimer) { input in + self.timeRemaining -= 1 + if (self.timeRemaining <= 0) { + self.hasRoundEnded = true + self.currentSelection = "" + self.invalidWord = "" + self.duplicateWord = "" + } + if (self.timeRemaining <= -15) { + self.loadNewGameHandler({ + self.timeRemaining = 30 + self.hasRoundEnded = false + self.foundSolutions = [] + }) + } + } + InvalidWordView(word: $invalidWord, duplicate: $duplicateWord) + FoundSolutionsView(list: $foundSolutions, solutions: $solutions, hasRoundEnded: $hasRoundEnded) + Spacer() + } + } + + func buildBoard() -> some View { + VStack(spacing: 20) { + ForEach(grid.indices) { rowIndex in + HStack { + Group { + Spacer() + ForEach(self.grid[rowIndex].indices) { cellIndex in + Group { + LetterView(text: self.$grid[rowIndex][cellIndex], hasRoundEnded: self.$hasRoundEnded, handler: self.letterHandler) + Spacer() + } + } + } + } + } + } + .padding(.top, 20) + } + + func letterHandler(letter: String) -> Void { + currentSelection += letter + } + + func selectionHandler() -> Void { + if (foundSolutions.contains(currentSelection.uppercased())) { + invalidWord = "" + duplicateWord = currentSelection.uppercased() + } else if (solutions.contains(currentSelection.uppercased())) { + invalidWord = "" + duplicateWord = "" + foundSolutions.append(currentSelection.uppercased()) + } else { + invalidWord = currentSelection.uppercased() + duplicateWord = "" + } + currentSelection = "" + } + +} + +struct GameView_Previews: PreviewProvider { + + static var previews: some View { + GameView(grid: .constant([ + ["A", "B", "C", "D"], + ["E", "Qu", "G", "H"], + ["I", "J", "K", "L"], + ["M", "N", "O", "P"] + ]), solutions: .constant([]), loadNewGameHandler: { callback in }) + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/InvalidWordView.swift b/GlobalWordRacer/GlobalWordRacer/Views/InvalidWordView.swift new file mode 100644 index 0000000..3fb2c20 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/InvalidWordView.swift @@ -0,0 +1,36 @@ +// +// InvalidWordView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/18/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct InvalidWordView: View { + + @Binding var word: String + @Binding var duplicate: String + + var body: some View { + Text( + duplicate.count > 0 + ? "\"\(duplicate.uppercased())\" Has Already Been Found!" + : word.count > 0 + ? "\"\(word.uppercased())\" Is Not A Valid Word!" + : " " + ) + .foregroundColor(.red) + .padding() + } + +} + +struct InvalidWordView_Previews: PreviewProvider { + + static var previews: some View { + InvalidWordView(word: .constant("ABCD"), duplicate: .constant("")) + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/LetterView.swift b/GlobalWordRacer/GlobalWordRacer/Views/LetterView.swift new file mode 100644 index 0000000..55e3b6f --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/LetterView.swift @@ -0,0 +1,45 @@ +// +// LetterView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/18/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct LetterView: View { + + @Binding var text: String + @Binding var hasRoundEnded: Bool + let handler: (String) -> Void + + var body: some View { + Button(action: { + self.handler(self.text) + }) { + Text(text) + .fontWeight(.semibold) + .font(.title) + .frame(width: 40) + .padding() + .background(hasRoundEnded ? Color.gray : Color.blue) + .foregroundColor(.white) + .cornerRadius(40) + } + .disabled(hasRoundEnded) + } + +} + +struct LetterView_Previews: PreviewProvider { + + static var previews: some View { + VStack(spacing: 20) { + LetterView(text: .constant("A"), hasRoundEnded: .constant(false), handler: { (letter: String) in }) + LetterView(text: .constant("Qu"), hasRoundEnded: .constant(false), handler: { (letter: String) in }) + LetterView(text: .constant("Z"), hasRoundEnded: .constant(false), handler: { (letter: String) in }) + } + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/MainView.swift b/GlobalWordRacer/GlobalWordRacer/Views/MainView.swift new file mode 100644 index 0000000..c99d2cb --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/MainView.swift @@ -0,0 +1,50 @@ +// +// MainView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/16/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import Alamofire +import SwiftUI + +struct MainView: View { + + @State var showGame = false + @State var grid: [[String]] = [] + @State var solutions: [String] = [] + + var body: some View { + Group { + if showGame { + GameView(grid: $grid, solutions: $solutions, loadNewGameHandler: loadNewGame) + } else { + WelcomeView(showGame: $showGame, loadNewGameHandler: loadNewGame) + } + } + .edgesIgnoringSafeArea(.all) + .background(Color.white) + } + + func loadNewGame(callback: @escaping () -> Void) { + AF.request("http://hnswave.co:8000/grid") + .validate() + .responseDecodable(of: GridAndSolutions.self) { response in + guard let data = response.value else { return } + self.grid = data.grid + self.solutions = data.solutions + self.showGame = true + callback() + } + } + +} + +struct MainView_Previews: PreviewProvider { + + static var previews: some View { + MainView() + } + +} diff --git a/GlobalWordRacer/GlobalWordRacer/Views/WelcomeView.swift b/GlobalWordRacer/GlobalWordRacer/Views/WelcomeView.swift new file mode 100644 index 0000000..585281e --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacer/Views/WelcomeView.swift @@ -0,0 +1,50 @@ +// +// WelcomeView.swift +// GlobalWordRacer +// +// Created by Andrew Gerst on 4/16/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import SwiftUI + +struct WelcomeView: View { + + @Binding var showGame: Bool + let loadNewGameHandler: (_ callback: @escaping () -> Void) -> Void + + var body: some View { + VStack { + Spacer() + + Text("Global Word Racer") + .fontWeight(.semibold) + .font(.system(size: 40)) + .frame(width: UIScreen.main.bounds.width, height: 140) + .background(Color.blue) + .foregroundColor(.white) + + Button( + action: { + self.loadNewGameHandler({}) + }, + label: { + Text("Join Game") + .font(.system(size: 40)) + } + ) + .padding(40) + + Spacer() + } + } + +} + +struct WelcomeView_Previews: PreviewProvider { + + static var previews: some View { + WelcomeView(showGame: .constant(false), loadNewGameHandler: { callback in }) + } + +} diff --git a/GlobalWordRacer/GlobalWordRacerTests/GlobalWordRacerTests.swift b/GlobalWordRacer/GlobalWordRacerTests/GlobalWordRacerTests.swift new file mode 100644 index 0000000..8756466 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacerTests/GlobalWordRacerTests.swift @@ -0,0 +1,34 @@ +// +// GlobalWordRacerTests.swift +// GlobalWordRacerTests +// +// Created by Andrew Gerst on 4/15/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import XCTest +@testable import GlobalWordRacer + +class GlobalWordRacerTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/GlobalWordRacer/GlobalWordRacerTests/Info.plist b/GlobalWordRacer/GlobalWordRacerTests/Info.plist new file mode 100644 index 0000000..7707eb9 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacerTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 2 + + diff --git a/GlobalWordRacer/GlobalWordRacerUITests/GlobalWordRacerUITests.swift b/GlobalWordRacer/GlobalWordRacerUITests/GlobalWordRacerUITests.swift new file mode 100644 index 0000000..12f94f2 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacerUITests/GlobalWordRacerUITests.swift @@ -0,0 +1,44 @@ +// +// GlobalWordRacerUITests.swift +// GlobalWordRacerUITests +// +// Created by Andrew Gerst on 4/15/20. +// Copyright © 2020 Andrew Gerst. All rights reserved. +// + +import XCTest + +class GlobalWordRacerUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { + XCUIApplication().launch() + } + } + } + +} diff --git a/GlobalWordRacer/GlobalWordRacerUITests/Info.plist b/GlobalWordRacer/GlobalWordRacerUITests/Info.plist new file mode 100644 index 0000000..7707eb9 --- /dev/null +++ b/GlobalWordRacer/GlobalWordRacerUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 2 + + diff --git a/GlobalWordRacer/fastlane/Appfile b/GlobalWordRacer/fastlane/Appfile new file mode 100644 index 0000000..1976494 --- /dev/null +++ b/GlobalWordRacer/fastlane/Appfile @@ -0,0 +1,8 @@ +app_identifier("hnswave.GlobalWordRacer") # The bundle identifier of your app +apple_id("andreygerst@gmail.com") # Your Apple email address + +itc_team_id("117748759") # App Store Connect Team ID +team_id("2DE824Y55C") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/GlobalWordRacer/fastlane/Deliverfile b/GlobalWordRacer/fastlane/Deliverfile new file mode 100644 index 0000000..74739f7 --- /dev/null +++ b/GlobalWordRacer/fastlane/Deliverfile @@ -0,0 +1,3 @@ +# The Deliverfile allows you to store various App Store Connect metadata +# For more information, check out the docs +# https://docs.fastlane.tools/actions/deliver/ diff --git a/GlobalWordRacer/fastlane/Fastfile b/GlobalWordRacer/fastlane/Fastfile new file mode 100644 index 0000000..35e1f25 --- /dev/null +++ b/GlobalWordRacer/fastlane/Fastfile @@ -0,0 +1,34 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Push a new release build to the App Store" + lane :release do + update_code_signing_settings( + use_automatic_signing: true + ) + cert + sigh(force: true) + # increment_version_number + increment_build_number + build_app( + scheme: "GlobalWordRacer", + export_xcargs: "-allowProvisioningUpdates" + ) + upload_to_app_store + end +end diff --git a/GlobalWordRacer/fastlane/README.md b/GlobalWordRacer/fastlane/README.md new file mode 100644 index 0000000..3fb29b2 --- /dev/null +++ b/GlobalWordRacer/fastlane/README.md @@ -0,0 +1,29 @@ +fastlane documentation +================ +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +``` +xcode-select --install +``` + +Install _fastlane_ using +``` +[sudo] gem install fastlane -NV +``` +or alternatively using `brew cask install fastlane` + +# Available Actions +## iOS +### ios release +``` +fastlane ios release +``` +Push a new release build to the App Store + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/GlobalWordRacer/fastlane/metadata/copyright.txt b/GlobalWordRacer/fastlane/metadata/copyright.txt new file mode 100644 index 0000000..a3e67da --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/copyright.txt @@ -0,0 +1 @@ +2020 HnS Wave diff --git a/GlobalWordRacer/fastlane/metadata/en-US/apple_tv_privacy_policy.txt b/GlobalWordRacer/fastlane/metadata/en-US/apple_tv_privacy_policy.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/apple_tv_privacy_policy.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/description.txt b/GlobalWordRacer/fastlane/metadata/en-US/description.txt new file mode 100644 index 0000000..3eb2eaf --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/description.txt @@ -0,0 +1 @@ +Score points by finding words in the grid. The longer the word the more points you earn! diff --git a/GlobalWordRacer/fastlane/metadata/en-US/keywords.txt b/GlobalWordRacer/fastlane/metadata/en-US/keywords.txt new file mode 100644 index 0000000..e43d293 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/keywords.txt @@ -0,0 +1 @@ +game, games, puzzle, fun, world, global, word, words, racer diff --git a/GlobalWordRacer/fastlane/metadata/en-US/marketing_url.txt b/GlobalWordRacer/fastlane/metadata/en-US/marketing_url.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/marketing_url.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/name.txt b/GlobalWordRacer/fastlane/metadata/en-US/name.txt new file mode 100644 index 0000000..179d958 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/name.txt @@ -0,0 +1 @@ +Global Word Racer diff --git a/GlobalWordRacer/fastlane/metadata/en-US/privacy_url.txt b/GlobalWordRacer/fastlane/metadata/en-US/privacy_url.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/privacy_url.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/promotional_text.txt b/GlobalWordRacer/fastlane/metadata/en-US/promotional_text.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/promotional_text.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/release_notes.txt b/GlobalWordRacer/fastlane/metadata/en-US/release_notes.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/release_notes.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/subtitle.txt b/GlobalWordRacer/fastlane/metadata/en-US/subtitle.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/subtitle.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/en-US/support_url.txt b/GlobalWordRacer/fastlane/metadata/en-US/support_url.txt new file mode 100644 index 0000000..d4ee4b1 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/en-US/support_url.txt @@ -0,0 +1 @@ +http://hnswave.co/app-store/support.html diff --git a/GlobalWordRacer/fastlane/metadata/primary_category.txt b/GlobalWordRacer/fastlane/metadata/primary_category.txt new file mode 100644 index 0000000..a14e466 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/primary_category.txt @@ -0,0 +1 @@ +Games diff --git a/GlobalWordRacer/fastlane/metadata/primary_first_sub_category.txt b/GlobalWordRacer/fastlane/metadata/primary_first_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/primary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/primary_second_sub_category.txt b/GlobalWordRacer/fastlane/metadata/primary_second_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/primary_second_sub_category.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/review_information/demo_password.txt b/GlobalWordRacer/fastlane/metadata/review_information/demo_password.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/demo_password.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/review_information/demo_user.txt b/GlobalWordRacer/fastlane/metadata/review_information/demo_user.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/demo_user.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/review_information/email_address.txt b/GlobalWordRacer/fastlane/metadata/review_information/email_address.txt new file mode 100644 index 0000000..aed463a --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/email_address.txt @@ -0,0 +1 @@ +gerst20051@gmail.com diff --git a/GlobalWordRacer/fastlane/metadata/review_information/first_name.txt b/GlobalWordRacer/fastlane/metadata/review_information/first_name.txt new file mode 100644 index 0000000..e08a0cf --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/first_name.txt @@ -0,0 +1 @@ +Andrew diff --git a/GlobalWordRacer/fastlane/metadata/review_information/last_name.txt b/GlobalWordRacer/fastlane/metadata/review_information/last_name.txt new file mode 100644 index 0000000..70e6ecb --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/last_name.txt @@ -0,0 +1 @@ +Gerst diff --git a/GlobalWordRacer/fastlane/metadata/review_information/notes.txt b/GlobalWordRacer/fastlane/metadata/review_information/notes.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/notes.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/review_information/phone_number.txt b/GlobalWordRacer/fastlane/metadata/review_information/phone_number.txt new file mode 100644 index 0000000..47d32c7 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/review_information/phone_number.txt @@ -0,0 +1 @@ +704-740-8492 diff --git a/GlobalWordRacer/fastlane/metadata/secondary_category.txt b/GlobalWordRacer/fastlane/metadata/secondary_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/secondary_category.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/secondary_first_sub_category.txt b/GlobalWordRacer/fastlane/metadata/secondary_first_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/secondary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/secondary_second_sub_category.txt b/GlobalWordRacer/fastlane/metadata/secondary_second_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/secondary_second_sub_category.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line1.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line1.txt new file mode 100644 index 0000000..e2b8649 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line1.txt @@ -0,0 +1 @@ +1225 S Church St diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line2.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line2.txt new file mode 100644 index 0000000..fc35769 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line2.txt @@ -0,0 +1 @@ +Apt 406 diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line3.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line3.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/address_line3.txt @@ -0,0 +1 @@ + diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/city_name.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/city_name.txt new file mode 100644 index 0000000..d011f15 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/city_name.txt @@ -0,0 +1 @@ +Charlotte diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/country.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/country.txt new file mode 100644 index 0000000..e0f84d0 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/country.txt @@ -0,0 +1 @@ +United States diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/email_address.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/email_address.txt new file mode 100644 index 0000000..aed463a --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/email_address.txt @@ -0,0 +1 @@ +gerst20051@gmail.com diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/first_name.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/first_name.txt new file mode 100644 index 0000000..e08a0cf --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/first_name.txt @@ -0,0 +1 @@ +Andrew diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/is_displayed_on_app_store.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/is_displayed_on_app_store.txt new file mode 100644 index 0000000..c508d53 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/is_displayed_on_app_store.txt @@ -0,0 +1 @@ +false diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/last_name.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/last_name.txt new file mode 100644 index 0000000..70e6ecb --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/last_name.txt @@ -0,0 +1 @@ +Gerst diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/phone_number.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/phone_number.txt new file mode 100644 index 0000000..47d32c7 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/phone_number.txt @@ -0,0 +1 @@ +704-740-8492 diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/postal_code.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/postal_code.txt new file mode 100644 index 0000000..03a8742 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/postal_code.txt @@ -0,0 +1 @@ +28203 diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/state.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/state.txt new file mode 100644 index 0000000..c8b375b --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/state.txt @@ -0,0 +1 @@ +North Carolina diff --git a/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/trade_name.txt b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/trade_name.txt new file mode 100644 index 0000000..39f9049 --- /dev/null +++ b/GlobalWordRacer/fastlane/metadata/trade_representative_contact_information/trade_name.txt @@ -0,0 +1 @@ +Andrew Gerst diff --git a/GlobalWordRacer/fastlane/screenshots/README.txt b/GlobalWordRacer/fastlane/screenshots/README.txt new file mode 100644 index 0000000..8b015ec --- /dev/null +++ b/GlobalWordRacer/fastlane/screenshots/README.txt @@ -0,0 +1,7 @@ +Put all screenshots you want to use inside the folder of its language (e.g. en-US). +The device type will automatically be recognized using the image resolution. Apple TV screenshots +should be stored in a subdirectory named appleTV with language folders inside of it. iMessage +screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage +with language folders inside of it. + +The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically.