Complete native rewrite of the web-based SoliCards game as a SwiftUI multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+. Three solitaire variants (Klondike, Spider, FreeCell) with full game rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels, SwiftData persistence, VoiceOver accessibility, and 57 unit tests. Key features: - MVVM + Protocol-Oriented Strategy architecture - DragGesture with coordinate-space hit-testing (long press + drag) - Smart zoom: cards auto-size to fit screen based on deepest column - Landscape: 30% bigger cards with scrollable overflow (iOS) - macOS: 120pt card cap, 92% height buffer for window resizing - Auto-save, game resume, statistics tracking via SwiftData - Privacy manifest, app icon, String Catalog, zero dependencies Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
824 lines
46 KiB
Plaintext
824 lines
46 KiB
Plaintext
// !$*UTF8*$!
|
|
{
|
|
archiveVersion = 1;
|
|
classes = {
|
|
};
|
|
objectVersion = 77;
|
|
objects = {
|
|
|
|
/* Begin PBXBuildFile section */
|
|
05F732433249D0777BFE8F91 /* KlondikeRulesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B31155959181B8D516A82096 /* KlondikeRulesTests.swift */; };
|
|
0D292BDC30C9D09CF4677FFA /* SpiderBoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2065F4D438686C32E01E449F /* SpiderBoardView.swift */; };
|
|
0DB00631BF90F0626BAE21CD /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C60AA0F17A17B13707CB0228 /* SettingsViewModel.swift */; };
|
|
12A564800C8BAED47DAD0C47 /* GameState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3488A79053BB9BF5BF6C39 /* GameState.swift */; };
|
|
171B8FB2868AAE8D3198B05E /* CardStylePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF9D48C269BE378EF381ADF6 /* CardStylePickerView.swift */; };
|
|
19E266494C3F614EEEC6539B /* GameVariant.swift in Sources */ = {isa = PBXBuildFile; fileRef = F31B3F7875D68C0BA0B8FB54 /* GameVariant.swift */; };
|
|
1A5B631C600469C9F28CF783 /* DraggedCardsOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C01DD3D6B3B0DEA17B94C81C /* DraggedCardsOverlay.swift */; };
|
|
29B7A35FE0C531B8CF8BF814 /* GameStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E9415DE47EA69B52839CA5 /* GameStateTests.swift */; };
|
|
2A123DBA7BA8AB08CADD6BDF /* CardLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2E837BB1ADC907A8F991A0 /* CardLayout.swift */; };
|
|
34CB07FE798181D502428D1D /* Array+Card.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DAC2213D876C2E0F48CBB3 /* Array+Card.swift */; };
|
|
37D0960283347728B64A2FB4 /* MoveValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38D83697D866ACA495ED4B8 /* MoveValidator.swift */; };
|
|
3997014B0E7EA0A651AB0216 /* FreeCellRulesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8A7187F45271D5F9FBB0A07 /* FreeCellRulesTests.swift */; };
|
|
3D6A93AB14AEAD9E65BB181D /* SpiderRulesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC022E983E9801D0A3A448B4 /* SpiderRulesTests.swift */; };
|
|
3E5C08ACC630D771613ECA16 /* MainMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6AE9622A04A543946250427 /* MainMenuView.swift */; };
|
|
40A295F6F752B57C290C49C5 /* SoliCardsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2123C4E1A2A72E80EC1123A5 /* SoliCardsApp.swift */; };
|
|
42FC69591B33DD5370784036 /* CardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA638FEAAD15EBE1E78FFE14 /* CardView.swift */; };
|
|
43F316092B0C12D7A7276309 /* CardBackPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB728E0216832C7887E0B0E4 /* CardBackPickerView.swift */; };
|
|
452209A28A7E2AA36CDFEFCA /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8595FFC9DDE3EA38CE0A617B /* PrivacyInfo.xcprivacy */; };
|
|
4BF879FC8DB20D9ED32D4738 /* AutoCompleterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A81A01510385FC02760FB4 /* AutoCompleterTests.swift */; };
|
|
537755217C0912F24EE2F5C6 /* NewGameSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1321C0FD7F644967F371B7A /* NewGameSheet.swift */; };
|
|
5550A93B56A7BE882A1C7303 /* PersistenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAA573DB9A21FE34ECFF6794 /* PersistenceManager.swift */; };
|
|
55A796BFBF38FBA8B6C6808F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9810F299E93134997859B2BD /* ContentView.swift */; };
|
|
56B286A65F7D8845885E9AF1 /* MoveAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E568D8FC36EF5D9937E0F97 /* MoveAction.swift */; };
|
|
56D2056F3CA46D09F2D94F10 /* StatisticsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634429F416F1A484018E084E /* StatisticsView.swift */; };
|
|
586EA99FAD450DB90C430CA0 /* GamePhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 488C04322FF37B821C662516 /* GamePhase.swift */; };
|
|
5B89DF181690B09ED9204598 /* GameViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B4677EC6C93B738F443D86 /* GameViewModel.swift */; };
|
|
5D4B0E1123A7870248DA8360 /* AutoCompleter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115321F0A0475538BA016151 /* AutoCompleter.swift */; };
|
|
5E2EA0FE1F0216236DF6BE56 /* FreeCellBoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7880E1D80183ABCFBF49F4 /* FreeCellBoardView.swift */; };
|
|
60111A0FEC2BB3227E4E02E4 /* ScoreBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5C2150140E0A5A3C4CD18D0 /* ScoreBarView.swift */; };
|
|
64E9B99DFBCD0F1D59F3D890 /* Difficulty.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64A7B696016187523AD7277 /* Difficulty.swift */; };
|
|
6585CAA4B2AD823C1F6C20DE /* GameTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BABA5FED1321ABA0A2F55 /* GameTheme.swift */; };
|
|
65E127C9C91486AF86F9A693 /* SoundManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DD303449EB1172C9B52E624 /* SoundManager.swift */; };
|
|
65E698A14BC2C0E659A46128 /* MoveValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4901135D3529A476DEF089F /* MoveValidatorTests.swift */; };
|
|
7084235B866C1493AC18A061 /* Rank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9B49166D2E8BE0D9AA2B46 /* Rank.swift */; };
|
|
70C69A048BE67CDD84E38B26 /* StatsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D4A7ACB3BD58FB808D7F89 /* StatsViewModel.swift */; };
|
|
79BCE98C4E8F851A36D4F753 /* KlondikeRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22BD39F68FBBFFB35FCB0EC5 /* KlondikeRules.swift */; };
|
|
7D5D7789D2BA535A59EFE6EA /* CardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7D93BC01A3997DD183D368 /* CardTests.swift */; };
|
|
800459364BF6FD875D15171D /* DropTargetPreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D311E1FE85DB24EA48404B /* DropTargetPreferenceKey.swift */; };
|
|
81B92CA2BDA948B74EEDA6B9 /* VictoryOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCE1E3886FE8A8FA0DD3C54A /* VictoryOverlayView.swift */; };
|
|
8E4A7DFD89F451F7499F2684 /* RulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FAD6B4305ABFB4769DE792 /* RulesView.swift */; };
|
|
8F37719FF9A39485718BAD78 /* KlondikeBoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403990D89B8854B6A45A44A2 /* KlondikeBoardView.swift */; };
|
|
A4BD7013B7979EA922BA5041 /* CardStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE2B9027264A1134D2B65DC /* CardStackView.swift */; };
|
|
A5D797208B75A1C7D23AFB64 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB81C7AA5EDF842B3D841907 /* Assets.xcassets */; };
|
|
A68F6A65F5897179FA3632BF /* TimerService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A61A63D3A6077A80ED09B24 /* TimerService.swift */; };
|
|
AA99FA31E0F4094CBE06FFAF /* Deck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16BEB4EF07C82D8B2A89D260 /* Deck.swift */; };
|
|
B7A5F011A7C538B27F382FB5 /* GameSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF99A0055488CAE6E45D4A3 /* GameSnapshot.swift */; };
|
|
BA010A1D6573E1DA0D182EF8 /* CardLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA7C39CE680C4AFC5D7959BC /* CardLocation.swift */; };
|
|
BAD817F065BBAAC4B7C89043 /* GameBoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E14435814D19CE147D6D408 /* GameBoardView.swift */; };
|
|
CBEE7677D3E2D9A9CFAA90D0 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B25C883D3B49CADA34775F1 /* SettingsView.swift */; };
|
|
CFDAB7D49E3D6CBB420F4CF1 /* HintResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 864D497FD148C1DCA5761247 /* HintResult.swift */; };
|
|
D00C18D126362C368802C9E3 /* Card.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72E42967DA3AA21AEE42F177 /* Card.swift */; };
|
|
D24334636360CE9659A3040A /* GameRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4991B4E4B3E6B9AC2EDA629F /* GameRecord.swift */; };
|
|
D4520E37CA093BDA7DBAB7F5 /* DifficultyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58632F749B766B0E79DD0152 /* DifficultyTests.swift */; };
|
|
D75EE30A448E01FD3A2EAD0A /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 714F0FD173ED0BC8E680E85A /* Localizable.xcstrings */; };
|
|
D780D65841792E26E9208B8D /* GameRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F1DE1DBC8F3FFC732DA618 /* GameRules.swift */; };
|
|
D9E61277B5EA0772F7B28BFF /* ThemePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23DEF0FCB8B782702D108DF3 /* ThemePickerView.swift */; };
|
|
DC0D004F619DE9C61C6AF585 /* PrefsRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1391353BDCE5C135A9FA1F0A /* PrefsRecord.swift */; };
|
|
E15025574906B1F1C9A03C8F /* SpiderRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C4319F36333564A75A3FEB0 /* SpiderRules.swift */; };
|
|
E9ED2A8341168D2915B4F495 /* DeckTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF0B14B437E3A3475278EC5 /* DeckTests.swift */; };
|
|
F02DBFB48DB80D36451D436B /* FreeCellRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ABFB6829A8D0B281CCD3E9 /* FreeCellRules.swift */; };
|
|
F3AA49C17343374CF1B82FF7 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396230FC7779389B46BE1246 /* ThemeManager.swift */; };
|
|
F4C3C28A20ECA87EC97FD2DC /* Suit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116E45BE9C698645A16CF6F3 /* Suit.swift */; };
|
|
F713DA5821F2B37B2019CA1D /* StatsRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66617C01DF8B874B51A55295 /* StatsRecord.swift */; };
|
|
FD1C9241508230FD8E553981 /* GameRulesFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A1B8A570F6B4F573E29FCA /* GameRulesFactory.swift */; };
|
|
FDCB1D9771FAC46DCE25A6A6 /* HapticManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B4ED587E94AC6FAE79FDAE8 /* HapticManager.swift */; };
|
|
/* End PBXBuildFile section */
|
|
|
|
/* Begin PBXContainerItemProxy section */
|
|
0457F9A25F53E04E37959F48 /* PBXContainerItemProxy */ = {
|
|
isa = PBXContainerItemProxy;
|
|
containerPortal = 867199988082B6D71FDDE2D8 /* Project object */;
|
|
proxyType = 1;
|
|
remoteGlobalIDString = 82669FCF0B13F7341360B265;
|
|
remoteInfo = SoliCards;
|
|
};
|
|
/* End PBXContainerItemProxy section */
|
|
|
|
/* Begin PBXFileReference section */
|
|
04FAD6B4305ABFB4769DE792 /* RulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulesView.swift; sourceTree = "<group>"; };
|
|
0A61A63D3A6077A80ED09B24 /* TimerService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerService.swift; sourceTree = "<group>"; };
|
|
0B4ED587E94AC6FAE79FDAE8 /* HapticManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticManager.swift; sourceTree = "<group>"; };
|
|
0C4319F36333564A75A3FEB0 /* SpiderRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpiderRules.swift; sourceTree = "<group>"; };
|
|
115321F0A0475538BA016151 /* AutoCompleter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleter.swift; sourceTree = "<group>"; };
|
|
116E45BE9C698645A16CF6F3 /* Suit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Suit.swift; sourceTree = "<group>"; };
|
|
1391353BDCE5C135A9FA1F0A /* PrefsRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsRecord.swift; sourceTree = "<group>"; };
|
|
16BEB4EF07C82D8B2A89D260 /* Deck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Deck.swift; sourceTree = "<group>"; };
|
|
1B25C883D3B49CADA34775F1 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
|
|
1EE2B9027264A1134D2B65DC /* CardStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardStackView.swift; sourceTree = "<group>"; };
|
|
2065F4D438686C32E01E449F /* SpiderBoardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpiderBoardView.swift; sourceTree = "<group>"; };
|
|
2123C4E1A2A72E80EC1123A5 /* SoliCardsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoliCardsApp.swift; sourceTree = "<group>"; };
|
|
22BD39F68FBBFFB35FCB0EC5 /* KlondikeRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlondikeRules.swift; sourceTree = "<group>"; };
|
|
23DEF0FCB8B782702D108DF3 /* ThemePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerView.swift; sourceTree = "<group>"; };
|
|
25D311E1FE85DB24EA48404B /* DropTargetPreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropTargetPreferenceKey.swift; sourceTree = "<group>"; };
|
|
26A1B8A570F6B4F573E29FCA /* GameRulesFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameRulesFactory.swift; sourceTree = "<group>"; };
|
|
26F1DE1DBC8F3FFC732DA618 /* GameRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameRules.swift; sourceTree = "<group>"; };
|
|
2BF99A0055488CAE6E45D4A3 /* GameSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSnapshot.swift; sourceTree = "<group>"; };
|
|
2E568D8FC36EF5D9937E0F97 /* MoveAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveAction.swift; sourceTree = "<group>"; };
|
|
396230FC7779389B46BE1246 /* ThemeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = "<group>"; };
|
|
3DD303449EB1172C9B52E624 /* SoundManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoundManager.swift; sourceTree = "<group>"; };
|
|
403990D89B8854B6A45A44A2 /* KlondikeBoardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlondikeBoardView.swift; sourceTree = "<group>"; };
|
|
488C04322FF37B821C662516 /* GamePhase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GamePhase.swift; sourceTree = "<group>"; };
|
|
4991B4E4B3E6B9AC2EDA629F /* GameRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameRecord.swift; sourceTree = "<group>"; };
|
|
4B7D93BC01A3997DD183D368 /* CardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardTests.swift; sourceTree = "<group>"; };
|
|
4E2E837BB1ADC907A8F991A0 /* CardLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardLayout.swift; sourceTree = "<group>"; };
|
|
58632F749B766B0E79DD0152 /* DifficultyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DifficultyTests.swift; sourceTree = "<group>"; };
|
|
5E14435814D19CE147D6D408 /* GameBoardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameBoardView.swift; sourceTree = "<group>"; };
|
|
634429F416F1A484018E084E /* StatisticsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticsView.swift; sourceTree = "<group>"; };
|
|
66617C01DF8B874B51A55295 /* StatsRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsRecord.swift; sourceTree = "<group>"; };
|
|
6C9B49166D2E8BE0D9AA2B46 /* Rank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rank.swift; sourceTree = "<group>"; };
|
|
714F0FD173ED0BC8E680E85A /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
|
|
72E42967DA3AA21AEE42F177 /* Card.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Card.swift; sourceTree = "<group>"; };
|
|
7561129FE301D2A5E3652648 /* SoliCards.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = SoliCards.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
7E57D0CF303B42DD18A317F1 /* SoliCardsTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = SoliCardsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
8595FFC9DDE3EA38CE0A617B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
|
864D497FD148C1DCA5761247 /* HintResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HintResult.swift; sourceTree = "<group>"; };
|
|
94A81A01510385FC02760FB4 /* AutoCompleterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleterTests.swift; sourceTree = "<group>"; };
|
|
9810F299E93134997859B2BD /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
|
A64A7B696016187523AD7277 /* Difficulty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Difficulty.swift; sourceTree = "<group>"; };
|
|
A7DAC2213D876C2E0F48CBB3 /* Array+Card.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Card.swift"; sourceTree = "<group>"; };
|
|
A8ABFB6829A8D0B281CCD3E9 /* FreeCellRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreeCellRules.swift; sourceTree = "<group>"; };
|
|
A8E9415DE47EA69B52839CA5 /* GameStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameStateTests.swift; sourceTree = "<group>"; };
|
|
AAA573DB9A21FE34ECFF6794 /* PersistenceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceManager.swift; sourceTree = "<group>"; };
|
|
AE7880E1D80183ABCFBF49F4 /* FreeCellBoardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreeCellBoardView.swift; sourceTree = "<group>"; };
|
|
B1321C0FD7F644967F371B7A /* NewGameSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewGameSheet.swift; sourceTree = "<group>"; };
|
|
B31155959181B8D516A82096 /* KlondikeRulesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlondikeRulesTests.swift; sourceTree = "<group>"; };
|
|
B8D4A7ACB3BD58FB808D7F89 /* StatsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsViewModel.swift; sourceTree = "<group>"; };
|
|
BC022E983E9801D0A3A448B4 /* SpiderRulesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpiderRulesTests.swift; sourceTree = "<group>"; };
|
|
C01DD3D6B3B0DEA17B94C81C /* DraggedCardsOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggedCardsOverlay.swift; sourceTree = "<group>"; };
|
|
C0B4677EC6C93B738F443D86 /* GameViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameViewModel.swift; sourceTree = "<group>"; };
|
|
C38D83697D866ACA495ED4B8 /* MoveValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveValidator.swift; sourceTree = "<group>"; };
|
|
C4901135D3529A476DEF089F /* MoveValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveValidatorTests.swift; sourceTree = "<group>"; };
|
|
C5C2150140E0A5A3C4CD18D0 /* ScoreBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScoreBarView.swift; sourceTree = "<group>"; };
|
|
C60AA0F17A17B13707CB0228 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
|
|
C8A7187F45271D5F9FBB0A07 /* FreeCellRulesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreeCellRulesTests.swift; sourceTree = "<group>"; };
|
|
CA7C39CE680C4AFC5D7959BC /* CardLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardLocation.swift; sourceTree = "<group>"; };
|
|
CB728E0216832C7887E0B0E4 /* CardBackPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardBackPickerView.swift; sourceTree = "<group>"; };
|
|
CCE1E3886FE8A8FA0DD3C54A /* VictoryOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VictoryOverlayView.swift; sourceTree = "<group>"; };
|
|
CD2BABA5FED1321ABA0A2F55 /* GameTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameTheme.swift; sourceTree = "<group>"; };
|
|
CD3488A79053BB9BF5BF6C39 /* GameState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameState.swift; sourceTree = "<group>"; };
|
|
DA638FEAAD15EBE1E78FFE14 /* CardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardView.swift; sourceTree = "<group>"; };
|
|
DB81C7AA5EDF842B3D841907 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
E6AE9622A04A543946250427 /* MainMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuView.swift; sourceTree = "<group>"; };
|
|
EF9D48C269BE378EF381ADF6 /* CardStylePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardStylePickerView.swift; sourceTree = "<group>"; };
|
|
F31B3F7875D68C0BA0B8FB54 /* GameVariant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameVariant.swift; sourceTree = "<group>"; };
|
|
FDF0B14B437E3A3475278EC5 /* DeckTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeckTests.swift; sourceTree = "<group>"; };
|
|
/* End PBXFileReference section */
|
|
|
|
/* Begin PBXGroup section */
|
|
08AF7AF8C77BED3EFA6A9AEA /* Statistics */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
634429F416F1A484018E084E /* StatisticsView.swift */,
|
|
);
|
|
path = Statistics;
|
|
sourceTree = "<group>";
|
|
};
|
|
0FF95606A40279B4D3390FBA = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
2182AF78CEA93B7431E85608 /* SoliCards */,
|
|
D4605BF9A1E255A1F2E44B4F /* SoliCardsTests */,
|
|
9CCB9EC5C71BA2DF24919C93 /* Products */,
|
|
);
|
|
sourceTree = "<group>";
|
|
};
|
|
2182AF78CEA93B7431E85608 /* SoliCards */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
9810F299E93134997859B2BD /* ContentView.swift */,
|
|
2123C4E1A2A72E80EC1123A5 /* SoliCardsApp.swift */,
|
|
E4D19DAEAABB74B9FDD84B73 /* Extensions */,
|
|
3B2FB59B0E86B8F19E698694 /* GameEngine */,
|
|
FF9DBC6C605DE18ED6DA5E1C /* Models */,
|
|
2D71FE366319D21065F80CFD /* Persistence */,
|
|
3271C08BF426FD74787C6217 /* Resources */,
|
|
A1D36CB5F370E4F3906E319A /* Services */,
|
|
A8376EC525EE5E88D4517BA1 /* Theme */,
|
|
C6C973AB5DCD1C0E766F633A /* ViewModels */,
|
|
F84CF6704CBB01C0C9875CE2 /* Views */,
|
|
);
|
|
path = SoliCards;
|
|
sourceTree = "<group>";
|
|
};
|
|
2D71FE366319D21065F80CFD /* Persistence */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
4991B4E4B3E6B9AC2EDA629F /* GameRecord.swift */,
|
|
AAA573DB9A21FE34ECFF6794 /* PersistenceManager.swift */,
|
|
1391353BDCE5C135A9FA1F0A /* PrefsRecord.swift */,
|
|
66617C01DF8B874B51A55295 /* StatsRecord.swift */,
|
|
);
|
|
path = Persistence;
|
|
sourceTree = "<group>";
|
|
};
|
|
3271C08BF426FD74787C6217 /* Resources */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
DB81C7AA5EDF842B3D841907 /* Assets.xcassets */,
|
|
714F0FD173ED0BC8E680E85A /* Localizable.xcstrings */,
|
|
8595FFC9DDE3EA38CE0A617B /* PrivacyInfo.xcprivacy */,
|
|
AB3F10466EA26B5E0B5827A8 /* Sounds */,
|
|
);
|
|
path = Resources;
|
|
sourceTree = "<group>";
|
|
};
|
|
3B2FB59B0E86B8F19E698694 /* GameEngine */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
115321F0A0475538BA016151 /* AutoCompleter.swift */,
|
|
A8ABFB6829A8D0B281CCD3E9 /* FreeCellRules.swift */,
|
|
26F1DE1DBC8F3FFC732DA618 /* GameRules.swift */,
|
|
26A1B8A570F6B4F573E29FCA /* GameRulesFactory.swift */,
|
|
CD3488A79053BB9BF5BF6C39 /* GameState.swift */,
|
|
22BD39F68FBBFFB35FCB0EC5 /* KlondikeRules.swift */,
|
|
C38D83697D866ACA495ED4B8 /* MoveValidator.swift */,
|
|
0C4319F36333564A75A3FEB0 /* SpiderRules.swift */,
|
|
);
|
|
path = GameEngine;
|
|
sourceTree = "<group>";
|
|
};
|
|
45A518EB42C0CDB893716BBE /* Settings */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
CB728E0216832C7887E0B0E4 /* CardBackPickerView.swift */,
|
|
EF9D48C269BE378EF381ADF6 /* CardStylePickerView.swift */,
|
|
1B25C883D3B49CADA34775F1 /* SettingsView.swift */,
|
|
23DEF0FCB8B782702D108DF3 /* ThemePickerView.swift */,
|
|
);
|
|
path = Settings;
|
|
sourceTree = "<group>";
|
|
};
|
|
7A41E8DA0C1CCBC6C102E3A0 /* ViewModels */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
);
|
|
path = ViewModels;
|
|
sourceTree = "<group>";
|
|
};
|
|
9CCB9EC5C71BA2DF24919C93 /* Products */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
7561129FE301D2A5E3652648 /* SoliCards.app */,
|
|
7E57D0CF303B42DD18A317F1 /* SoliCardsTests.xctest */,
|
|
);
|
|
name = Products;
|
|
sourceTree = "<group>";
|
|
};
|
|
A1D36CB5F370E4F3906E319A /* Services */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
0B4ED587E94AC6FAE79FDAE8 /* HapticManager.swift */,
|
|
3DD303449EB1172C9B52E624 /* SoundManager.swift */,
|
|
0A61A63D3A6077A80ED09B24 /* TimerService.swift */,
|
|
);
|
|
path = Services;
|
|
sourceTree = "<group>";
|
|
};
|
|
A5353C257EB10EB9526C6E39 /* Menu */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
E6AE9622A04A543946250427 /* MainMenuView.swift */,
|
|
B1321C0FD7F644967F371B7A /* NewGameSheet.swift */,
|
|
04FAD6B4305ABFB4769DE792 /* RulesView.swift */,
|
|
);
|
|
path = Menu;
|
|
sourceTree = "<group>";
|
|
};
|
|
A8376EC525EE5E88D4517BA1 /* Theme */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
CD2BABA5FED1321ABA0A2F55 /* GameTheme.swift */,
|
|
396230FC7779389B46BE1246 /* ThemeManager.swift */,
|
|
);
|
|
path = Theme;
|
|
sourceTree = "<group>";
|
|
};
|
|
AB3F10466EA26B5E0B5827A8 /* Sounds */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
);
|
|
path = Sounds;
|
|
sourceTree = "<group>";
|
|
};
|
|
C6C973AB5DCD1C0E766F633A /* ViewModels */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
C0B4677EC6C93B738F443D86 /* GameViewModel.swift */,
|
|
C60AA0F17A17B13707CB0228 /* SettingsViewModel.swift */,
|
|
B8D4A7ACB3BD58FB808D7F89 /* StatsViewModel.swift */,
|
|
);
|
|
path = ViewModels;
|
|
sourceTree = "<group>";
|
|
};
|
|
D4605BF9A1E255A1F2E44B4F /* SoliCardsTests */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
DB86ADC0F0581A7B56EBE28E /* GameEngine */,
|
|
E5E67911DEBB2793B3D8F1AD /* Models */,
|
|
7A41E8DA0C1CCBC6C102E3A0 /* ViewModels */,
|
|
);
|
|
path = SoliCardsTests;
|
|
sourceTree = "<group>";
|
|
};
|
|
DA0714078CFC7F8BCD993F8C /* Game */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
1EE2B9027264A1134D2B65DC /* CardStackView.swift */,
|
|
DA638FEAAD15EBE1E78FFE14 /* CardView.swift */,
|
|
C01DD3D6B3B0DEA17B94C81C /* DraggedCardsOverlay.swift */,
|
|
25D311E1FE85DB24EA48404B /* DropTargetPreferenceKey.swift */,
|
|
AE7880E1D80183ABCFBF49F4 /* FreeCellBoardView.swift */,
|
|
5E14435814D19CE147D6D408 /* GameBoardView.swift */,
|
|
403990D89B8854B6A45A44A2 /* KlondikeBoardView.swift */,
|
|
C5C2150140E0A5A3C4CD18D0 /* ScoreBarView.swift */,
|
|
2065F4D438686C32E01E449F /* SpiderBoardView.swift */,
|
|
CCE1E3886FE8A8FA0DD3C54A /* VictoryOverlayView.swift */,
|
|
);
|
|
path = Game;
|
|
sourceTree = "<group>";
|
|
};
|
|
DB86ADC0F0581A7B56EBE28E /* GameEngine */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
94A81A01510385FC02760FB4 /* AutoCompleterTests.swift */,
|
|
C8A7187F45271D5F9FBB0A07 /* FreeCellRulesTests.swift */,
|
|
A8E9415DE47EA69B52839CA5 /* GameStateTests.swift */,
|
|
B31155959181B8D516A82096 /* KlondikeRulesTests.swift */,
|
|
C4901135D3529A476DEF089F /* MoveValidatorTests.swift */,
|
|
BC022E983E9801D0A3A448B4 /* SpiderRulesTests.swift */,
|
|
);
|
|
path = GameEngine;
|
|
sourceTree = "<group>";
|
|
};
|
|
E4D19DAEAABB74B9FDD84B73 /* Extensions */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
A7DAC2213D876C2E0F48CBB3 /* Array+Card.swift */,
|
|
4E2E837BB1ADC907A8F991A0 /* CardLayout.swift */,
|
|
);
|
|
path = Extensions;
|
|
sourceTree = "<group>";
|
|
};
|
|
E5E67911DEBB2793B3D8F1AD /* Models */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
4B7D93BC01A3997DD183D368 /* CardTests.swift */,
|
|
FDF0B14B437E3A3475278EC5 /* DeckTests.swift */,
|
|
58632F749B766B0E79DD0152 /* DifficultyTests.swift */,
|
|
);
|
|
path = Models;
|
|
sourceTree = "<group>";
|
|
};
|
|
F84CF6704CBB01C0C9875CE2 /* Views */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
DA0714078CFC7F8BCD993F8C /* Game */,
|
|
A5353C257EB10EB9526C6E39 /* Menu */,
|
|
45A518EB42C0CDB893716BBE /* Settings */,
|
|
08AF7AF8C77BED3EFA6A9AEA /* Statistics */,
|
|
);
|
|
path = Views;
|
|
sourceTree = "<group>";
|
|
};
|
|
FF9DBC6C605DE18ED6DA5E1C /* Models */ = {
|
|
isa = PBXGroup;
|
|
children = (
|
|
72E42967DA3AA21AEE42F177 /* Card.swift */,
|
|
CA7C39CE680C4AFC5D7959BC /* CardLocation.swift */,
|
|
16BEB4EF07C82D8B2A89D260 /* Deck.swift */,
|
|
A64A7B696016187523AD7277 /* Difficulty.swift */,
|
|
488C04322FF37B821C662516 /* GamePhase.swift */,
|
|
2BF99A0055488CAE6E45D4A3 /* GameSnapshot.swift */,
|
|
F31B3F7875D68C0BA0B8FB54 /* GameVariant.swift */,
|
|
864D497FD148C1DCA5761247 /* HintResult.swift */,
|
|
2E568D8FC36EF5D9937E0F97 /* MoveAction.swift */,
|
|
6C9B49166D2E8BE0D9AA2B46 /* Rank.swift */,
|
|
116E45BE9C698645A16CF6F3 /* Suit.swift */,
|
|
);
|
|
path = Models;
|
|
sourceTree = "<group>";
|
|
};
|
|
/* End PBXGroup section */
|
|
|
|
/* Begin PBXNativeTarget section */
|
|
82669FCF0B13F7341360B265 /* SoliCards */ = {
|
|
isa = PBXNativeTarget;
|
|
buildConfigurationList = F6C31F00417F79A014C90960 /* Build configuration list for PBXNativeTarget "SoliCards" */;
|
|
buildPhases = (
|
|
8C4FBA4AEB4F83B6D76C3868 /* Sources */,
|
|
00D9BFDDDE0AF0067CA90858 /* Resources */,
|
|
);
|
|
buildRules = (
|
|
);
|
|
dependencies = (
|
|
);
|
|
name = SoliCards;
|
|
packageProductDependencies = (
|
|
);
|
|
productName = SoliCards;
|
|
productReference = 7561129FE301D2A5E3652648 /* SoliCards.app */;
|
|
productType = "com.apple.product-type.application";
|
|
};
|
|
C27736B4220A23D60C765E3E /* SoliCardsTests */ = {
|
|
isa = PBXNativeTarget;
|
|
buildConfigurationList = 6F270CC209153B7149368FF8 /* Build configuration list for PBXNativeTarget "SoliCardsTests" */;
|
|
buildPhases = (
|
|
00839BE9C0947FF6620A82FC /* Sources */,
|
|
);
|
|
buildRules = (
|
|
);
|
|
dependencies = (
|
|
CE28FBA2CF52896AC36A1F13 /* PBXTargetDependency */,
|
|
);
|
|
name = SoliCardsTests;
|
|
packageProductDependencies = (
|
|
);
|
|
productName = SoliCardsTests;
|
|
productReference = 7E57D0CF303B42DD18A317F1 /* SoliCardsTests.xctest */;
|
|
productType = "com.apple.product-type.bundle.unit-test";
|
|
};
|
|
/* End PBXNativeTarget section */
|
|
|
|
/* Begin PBXProject section */
|
|
867199988082B6D71FDDE2D8 /* Project object */ = {
|
|
isa = PBXProject;
|
|
attributes = {
|
|
BuildIndependentTargetsInParallel = YES;
|
|
LastUpgradeCheck = 1630;
|
|
TargetAttributes = {
|
|
};
|
|
};
|
|
buildConfigurationList = 6AE5403E93959B4E9E707F1D /* Build configuration list for PBXProject "SoliCards" */;
|
|
developmentRegion = en;
|
|
hasScannedForEncodings = 0;
|
|
knownRegions = (
|
|
Base,
|
|
en,
|
|
);
|
|
mainGroup = 0FF95606A40279B4D3390FBA;
|
|
minimizedProjectReferenceProxies = 1;
|
|
preferredProjectObjectVersion = 77;
|
|
productRefGroup = 9CCB9EC5C71BA2DF24919C93 /* Products */;
|
|
projectDirPath = "";
|
|
projectRoot = "";
|
|
targets = (
|
|
82669FCF0B13F7341360B265 /* SoliCards */,
|
|
C27736B4220A23D60C765E3E /* SoliCardsTests */,
|
|
);
|
|
};
|
|
/* End PBXProject section */
|
|
|
|
/* Begin PBXResourcesBuildPhase section */
|
|
00D9BFDDDE0AF0067CA90858 /* Resources */ = {
|
|
isa = PBXResourcesBuildPhase;
|
|
buildActionMask = 2147483647;
|
|
files = (
|
|
A5D797208B75A1C7D23AFB64 /* Assets.xcassets in Resources */,
|
|
D75EE30A448E01FD3A2EAD0A /* Localizable.xcstrings in Resources */,
|
|
452209A28A7E2AA36CDFEFCA /* PrivacyInfo.xcprivacy in Resources */,
|
|
);
|
|
runOnlyForDeploymentPostprocessing = 0;
|
|
};
|
|
/* End PBXResourcesBuildPhase section */
|
|
|
|
/* Begin PBXSourcesBuildPhase section */
|
|
00839BE9C0947FF6620A82FC /* Sources */ = {
|
|
isa = PBXSourcesBuildPhase;
|
|
buildActionMask = 2147483647;
|
|
files = (
|
|
4BF879FC8DB20D9ED32D4738 /* AutoCompleterTests.swift in Sources */,
|
|
7D5D7789D2BA535A59EFE6EA /* CardTests.swift in Sources */,
|
|
E9ED2A8341168D2915B4F495 /* DeckTests.swift in Sources */,
|
|
D4520E37CA093BDA7DBAB7F5 /* DifficultyTests.swift in Sources */,
|
|
3997014B0E7EA0A651AB0216 /* FreeCellRulesTests.swift in Sources */,
|
|
29B7A35FE0C531B8CF8BF814 /* GameStateTests.swift in Sources */,
|
|
05F732433249D0777BFE8F91 /* KlondikeRulesTests.swift in Sources */,
|
|
65E698A14BC2C0E659A46128 /* MoveValidatorTests.swift in Sources */,
|
|
3D6A93AB14AEAD9E65BB181D /* SpiderRulesTests.swift in Sources */,
|
|
);
|
|
runOnlyForDeploymentPostprocessing = 0;
|
|
};
|
|
8C4FBA4AEB4F83B6D76C3868 /* Sources */ = {
|
|
isa = PBXSourcesBuildPhase;
|
|
buildActionMask = 2147483647;
|
|
files = (
|
|
34CB07FE798181D502428D1D /* Array+Card.swift in Sources */,
|
|
5D4B0E1123A7870248DA8360 /* AutoCompleter.swift in Sources */,
|
|
D00C18D126362C368802C9E3 /* Card.swift in Sources */,
|
|
43F316092B0C12D7A7276309 /* CardBackPickerView.swift in Sources */,
|
|
2A123DBA7BA8AB08CADD6BDF /* CardLayout.swift in Sources */,
|
|
BA010A1D6573E1DA0D182EF8 /* CardLocation.swift in Sources */,
|
|
A4BD7013B7979EA922BA5041 /* CardStackView.swift in Sources */,
|
|
171B8FB2868AAE8D3198B05E /* CardStylePickerView.swift in Sources */,
|
|
42FC69591B33DD5370784036 /* CardView.swift in Sources */,
|
|
55A796BFBF38FBA8B6C6808F /* ContentView.swift in Sources */,
|
|
AA99FA31E0F4094CBE06FFAF /* Deck.swift in Sources */,
|
|
64E9B99DFBCD0F1D59F3D890 /* Difficulty.swift in Sources */,
|
|
1A5B631C600469C9F28CF783 /* DraggedCardsOverlay.swift in Sources */,
|
|
800459364BF6FD875D15171D /* DropTargetPreferenceKey.swift in Sources */,
|
|
5E2EA0FE1F0216236DF6BE56 /* FreeCellBoardView.swift in Sources */,
|
|
F02DBFB48DB80D36451D436B /* FreeCellRules.swift in Sources */,
|
|
BAD817F065BBAAC4B7C89043 /* GameBoardView.swift in Sources */,
|
|
586EA99FAD450DB90C430CA0 /* GamePhase.swift in Sources */,
|
|
D24334636360CE9659A3040A /* GameRecord.swift in Sources */,
|
|
D780D65841792E26E9208B8D /* GameRules.swift in Sources */,
|
|
FD1C9241508230FD8E553981 /* GameRulesFactory.swift in Sources */,
|
|
B7A5F011A7C538B27F382FB5 /* GameSnapshot.swift in Sources */,
|
|
12A564800C8BAED47DAD0C47 /* GameState.swift in Sources */,
|
|
6585CAA4B2AD823C1F6C20DE /* GameTheme.swift in Sources */,
|
|
19E266494C3F614EEEC6539B /* GameVariant.swift in Sources */,
|
|
5B89DF181690B09ED9204598 /* GameViewModel.swift in Sources */,
|
|
FDCB1D9771FAC46DCE25A6A6 /* HapticManager.swift in Sources */,
|
|
CFDAB7D49E3D6CBB420F4CF1 /* HintResult.swift in Sources */,
|
|
8F37719FF9A39485718BAD78 /* KlondikeBoardView.swift in Sources */,
|
|
79BCE98C4E8F851A36D4F753 /* KlondikeRules.swift in Sources */,
|
|
3E5C08ACC630D771613ECA16 /* MainMenuView.swift in Sources */,
|
|
56B286A65F7D8845885E9AF1 /* MoveAction.swift in Sources */,
|
|
37D0960283347728B64A2FB4 /* MoveValidator.swift in Sources */,
|
|
537755217C0912F24EE2F5C6 /* NewGameSheet.swift in Sources */,
|
|
5550A93B56A7BE882A1C7303 /* PersistenceManager.swift in Sources */,
|
|
DC0D004F619DE9C61C6AF585 /* PrefsRecord.swift in Sources */,
|
|
7084235B866C1493AC18A061 /* Rank.swift in Sources */,
|
|
8E4A7DFD89F451F7499F2684 /* RulesView.swift in Sources */,
|
|
60111A0FEC2BB3227E4E02E4 /* ScoreBarView.swift in Sources */,
|
|
CBEE7677D3E2D9A9CFAA90D0 /* SettingsView.swift in Sources */,
|
|
0DB00631BF90F0626BAE21CD /* SettingsViewModel.swift in Sources */,
|
|
40A295F6F752B57C290C49C5 /* SoliCardsApp.swift in Sources */,
|
|
65E127C9C91486AF86F9A693 /* SoundManager.swift in Sources */,
|
|
0D292BDC30C9D09CF4677FFA /* SpiderBoardView.swift in Sources */,
|
|
E15025574906B1F1C9A03C8F /* SpiderRules.swift in Sources */,
|
|
56D2056F3CA46D09F2D94F10 /* StatisticsView.swift in Sources */,
|
|
F713DA5821F2B37B2019CA1D /* StatsRecord.swift in Sources */,
|
|
70C69A048BE67CDD84E38B26 /* StatsViewModel.swift in Sources */,
|
|
F4C3C28A20ECA87EC97FD2DC /* Suit.swift in Sources */,
|
|
F3AA49C17343374CF1B82FF7 /* ThemeManager.swift in Sources */,
|
|
D9E61277B5EA0772F7B28BFF /* ThemePickerView.swift in Sources */,
|
|
A68F6A65F5897179FA3632BF /* TimerService.swift in Sources */,
|
|
81B92CA2BDA948B74EEDA6B9 /* VictoryOverlayView.swift in Sources */,
|
|
);
|
|
runOnlyForDeploymentPostprocessing = 0;
|
|
};
|
|
/* End PBXSourcesBuildPhase section */
|
|
|
|
/* Begin PBXTargetDependency section */
|
|
CE28FBA2CF52896AC36A1F13 /* PBXTargetDependency */ = {
|
|
isa = PBXTargetDependency;
|
|
target = 82669FCF0B13F7341360B265 /* SoliCards */;
|
|
targetProxy = 0457F9A25F53E04E37959F48 /* PBXContainerItemProxy */;
|
|
};
|
|
/* End PBXTargetDependency section */
|
|
|
|
/* Begin XCBuildConfiguration section */
|
|
09C2A01D89409D6B798959DA /* Debug */ = {
|
|
isa = XCBuildConfiguration;
|
|
buildSettings = {
|
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
|
CURRENT_PROJECT_VERSION = 1;
|
|
GENERATE_INFOPLIST_FILE = YES;
|
|
INFOPLIST_KEY_CFBundleDisplayName = SoliCards;
|
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.card-games";
|
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
|
INFOPLIST_KEY_UIRequiresFullScreen = NO;
|
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
LD_RUNPATH_SEARCH_PATHS = (
|
|
"$(inherited)",
|
|
"@executable_path/Frameworks",
|
|
);
|
|
MARKETING_VERSION = 1.0.0;
|
|
PRODUCT_BUNDLE_IDENTIFIER = com.solicards.app;
|
|
SDKROOT = auto;
|
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
|
SUPPORTS_MACCATALYST = NO;
|
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
|
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
};
|
|
name = Debug;
|
|
};
|
|
3703194FF4D985541587656D /* Release */ = {
|
|
isa = XCBuildConfiguration;
|
|
buildSettings = {
|
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
GENERATE_INFOPLIST_FILE = YES;
|
|
LD_RUNPATH_SEARCH_PATHS = (
|
|
"$(inherited)",
|
|
"@executable_path/Frameworks",
|
|
"@loader_path/Frameworks",
|
|
);
|
|
PRODUCT_BUNDLE_IDENTIFIER = com.solicards.tests;
|
|
SDKROOT = auto;
|
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
|
SUPPORTS_MACCATALYST = NO;
|
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
|
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SoliCards.app/SoliCards";
|
|
};
|
|
name = Release;
|
|
};
|
|
57E91C868A14077EF84052C1 /* Debug */ = {
|
|
isa = XCBuildConfiguration;
|
|
buildSettings = {
|
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
GENERATE_INFOPLIST_FILE = YES;
|
|
LD_RUNPATH_SEARCH_PATHS = (
|
|
"$(inherited)",
|
|
"@executable_path/Frameworks",
|
|
"@loader_path/Frameworks",
|
|
);
|
|
PRODUCT_BUNDLE_IDENTIFIER = com.solicards.tests;
|
|
SDKROOT = auto;
|
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
|
SUPPORTS_MACCATALYST = NO;
|
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
|
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SoliCards.app/SoliCards";
|
|
};
|
|
name = Debug;
|
|
};
|
|
6964E173671E2805B5C3C50E /* 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
|
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;
|
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
GCC_DYNAMIC_NO_PIC = NO;
|
|
GCC_NO_COMMON_BLOCKS = YES;
|
|
GCC_OPTIMIZATION_LEVEL = 0;
|
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
"$(inherited)",
|
|
"DEBUG=1",
|
|
);
|
|
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 = 17.0;
|
|
MACOSX_DEPLOYMENT_TARGET = 14.0;
|
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
|
MTL_FAST_MATH = YES;
|
|
ONLY_ACTIVE_ARCH = YES;
|
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
SDKROOT = auto;
|
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
SWIFT_VERSION = 6.0;
|
|
};
|
|
name = Debug;
|
|
};
|
|
C48643C0D86B6F2505BC1E97 /* Release */ = {
|
|
isa = XCBuildConfiguration;
|
|
buildSettings = {
|
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
|
CURRENT_PROJECT_VERSION = 1;
|
|
GENERATE_INFOPLIST_FILE = YES;
|
|
INFOPLIST_KEY_CFBundleDisplayName = SoliCards;
|
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.card-games";
|
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
|
INFOPLIST_KEY_UIRequiresFullScreen = NO;
|
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
LD_RUNPATH_SEARCH_PATHS = (
|
|
"$(inherited)",
|
|
"@executable_path/Frameworks",
|
|
);
|
|
MARKETING_VERSION = 1.0.0;
|
|
PRODUCT_BUNDLE_IDENTIFIER = com.solicards.app;
|
|
SDKROOT = auto;
|
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
|
SUPPORTS_MACCATALYST = NO;
|
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
|
|
SWIFT_COMPILATION_MODE = wholemodule;
|
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
};
|
|
name = Release;
|
|
};
|
|
DCF01AC30957B9AA76361647 /* 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
|
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;
|
|
ENABLE_USER_SCRIPT_SANDBOXING = 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 = 17.0;
|
|
MACOSX_DEPLOYMENT_TARGET = 14.0;
|
|
MTL_ENABLE_DEBUG_INFO = NO;
|
|
MTL_FAST_MATH = YES;
|
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
SDKROOT = auto;
|
|
SWIFT_COMPILATION_MODE = wholemodule;
|
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
SWIFT_VERSION = 6.0;
|
|
};
|
|
name = Release;
|
|
};
|
|
/* End XCBuildConfiguration section */
|
|
|
|
/* Begin XCConfigurationList section */
|
|
6AE5403E93959B4E9E707F1D /* Build configuration list for PBXProject "SoliCards" */ = {
|
|
isa = XCConfigurationList;
|
|
buildConfigurations = (
|
|
6964E173671E2805B5C3C50E /* Debug */,
|
|
DCF01AC30957B9AA76361647 /* Release */,
|
|
);
|
|
defaultConfigurationIsVisible = 0;
|
|
defaultConfigurationName = Debug;
|
|
};
|
|
6F270CC209153B7149368FF8 /* Build configuration list for PBXNativeTarget "SoliCardsTests" */ = {
|
|
isa = XCConfigurationList;
|
|
buildConfigurations = (
|
|
57E91C868A14077EF84052C1 /* Debug */,
|
|
3703194FF4D985541587656D /* Release */,
|
|
);
|
|
defaultConfigurationIsVisible = 0;
|
|
defaultConfigurationName = Debug;
|
|
};
|
|
F6C31F00417F79A014C90960 /* Build configuration list for PBXNativeTarget "SoliCards" */ = {
|
|
isa = XCConfigurationList;
|
|
buildConfigurations = (
|
|
09C2A01D89409D6B798959DA /* Debug */,
|
|
C48643C0D86B6F2505BC1E97 /* Release */,
|
|
);
|
|
defaultConfigurationIsVisible = 0;
|
|
defaultConfigurationName = Debug;
|
|
};
|
|
/* End XCConfigurationList section */
|
|
};
|
|
rootObject = 867199988082B6D71FDDE2D8 /* Project object */;
|
|
}
|