├── Vanilla.ttf
├── Cubano-Regular.otf
├── HKTQCard
├── Assets.xcassets
│ ├── Contents.json
│ ├── CardBack
│ │ ├── Contents.json
│ │ ├── Card_Back_1.imageset
│ │ │ ├── Card_Back_01.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_2.imageset
│ │ │ ├── Card_Back_02.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_3.imageset
│ │ │ ├── Card_Back_03.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_4.imageset
│ │ │ ├── Card_Back_04.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_5.imageset
│ │ │ ├── Card_Back_05.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_6.imageset
│ │ │ ├── Card_Back_06.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_7.imageset
│ │ │ ├── Card_Back_07.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_8.imageset
│ │ │ ├── Card_Back_08.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_9.imageset
│ │ │ ├── Card_Back_09.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_10.imageset
│ │ │ ├── Card_Back_10.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_11.imageset
│ │ │ ├── Card_Back_11.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_12.imageset
│ │ │ ├── Card_Back_12.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_13.imageset
│ │ │ ├── Card_Back_13.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_14.imageset
│ │ │ ├── Card_Back_14.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_15.imageset
│ │ │ ├── Card_Back_15.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_16.imageset
│ │ │ ├── Card_Back_16.png
│ │ │ └── Contents.json
│ │ ├── Card_Back_17.imageset
│ │ │ ├── Card_Back_17.png
│ │ │ └── Contents.json
│ │ └── Card_Back_18.imageset
│ │ │ ├── Card_Back_18.png
│ │ │ └── Contents.json
│ ├── CardFront
│ │ ├── Contents.json
│ │ ├── Gem_3.imageset
│ │ │ ├── Float.png
│ │ │ └── Contents.json
│ │ ├── Gem_1.imageset
│ │ │ ├── Anchor.png
│ │ │ └── Contents.json
│ │ ├── Gem_10.imageset
│ │ │ ├── Gem_10.png
│ │ │ └── Contents.json
│ │ ├── Gem_11.imageset
│ │ │ ├── Gem_11.png
│ │ │ └── Contents.json
│ │ ├── Gem_12.imageset
│ │ │ ├── Gem_12.png
│ │ │ └── Contents.json
│ │ ├── Gem_4.imageset
│ │ │ ├── Parrot.png
│ │ │ └── Contents.json
│ │ ├── Gem_5.imageset
│ │ │ ├── Pirate Hat.png
│ │ │ └── Contents.json
│ │ ├── Gem_7.imageset
│ │ │ ├── Ship Wheel.png
│ │ │ └── Contents.json
│ │ ├── Gem_8.imageset
│ │ │ ├── Starfish.png
│ │ │ └── Contents.json
│ │ ├── Gem_9.imageset
│ │ │ ├── Telescope.png
│ │ │ └── Contents.json
│ │ ├── Gem_2.imageset
│ │ │ ├── Coconut Tree.png
│ │ │ └── Contents.json
│ │ └── Gem_6.imageset
│ │ │ ├── Pirate Hook.png
│ │ │ └── Contents.json
│ ├── cloud.imageset
│ │ ├── cloud.png
│ │ └── Contents.json
│ ├── tqbg.imageset
│ │ ├── lawreybg.png
│ │ └── Contents.json
│ ├── Boy Pirate.imageset
│ │ ├── Boy Pirate.png
│ │ └── Contents.json
│ ├── tqsplashpng.imageset
│ │ ├── tqsplashpng.png
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-57x57@1x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ ├── Icon-App-83.5x83.5@2x.png
│ │ └── Contents.json
│ └── LaunchImage.launchimage
│ │ ├── tqsplashpng-2.png
│ │ ├── tqsplashpng-3.png
│ │ └── Contents.json
├── LawreyMCGame-Bridging-Header.h
├── PlayerScore.swift
├── Array+Shuffle.swift
├── Card.swift
├── FCGameCardCollectionViewCell.xib
├── Info.plist
├── AppDelegate.swift
├── FCGameCardCollectionViewCell.swift
├── CNPPopupController.h
├── Device.swift
├── CMCardDealerManager.swift
├── Main.storyboard
├── FCGameBoardCollectionViewController.swift
└── CNPPopupController.m
├── LawreyMCGame.xcodeproj
├── project.xcworkspace
│ ├── xcuserdata
│ │ └── Lawrey.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── Lawrey.xcuserdatad
│ │ ├── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── LawreyMCGame.xcscheme
│ │ └── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
└── project.pbxproj
├── Assets.xcassets
└── AppIcon.appiconset
│ └── Contents.json
├── LICENSE.txt
└── README.md
/Vanilla.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/Vanilla.ttf
--------------------------------------------------------------------------------
/Cubano-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/Cubano-Regular.otf
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/cloud.imageset/cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/cloud.imageset/cloud.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/tqbg.imageset/lawreybg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/tqbg.imageset/lawreybg.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/Boy Pirate.imageset/Boy Pirate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/Boy Pirate.imageset/Boy Pirate.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Float.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Float.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Anchor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Anchor.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Gem_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Gem_10.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Gem_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Gem_11.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Gem_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Gem_12.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Parrot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Parrot.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/tqsplashpng.imageset/tqsplashpng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/tqsplashpng.imageset/tqsplashpng.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Pirate Hat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Pirate Hat.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Ship Wheel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Ship Wheel.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Starfish.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Starfish.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Telescope.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Telescope.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Coconut Tree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Coconut Tree.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Pirate Hook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Pirate Hook.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-2.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-3.png
--------------------------------------------------------------------------------
/HKTQCard/LawreyMCGame-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 | #import "CNPPopupController.h"
6 |
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Card_Back_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Card_Back_01.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Card_Back_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Card_Back_02.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Card_Back_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Card_Back_03.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Card_Back_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Card_Back_04.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Card_Back_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Card_Back_05.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Card_Back_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Card_Back_06.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Card_Back_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Card_Back_07.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Card_Back_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Card_Back_08.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Card_Back_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Card_Back_09.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Card_Back_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Card_Back_10.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Card_Back_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Card_Back_11.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Card_Back_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Card_Back_12.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Card_Back_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Card_Back_13.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Card_Back_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Card_Back_14.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Card_Back_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Card_Back_15.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Card_Back_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Card_Back_16.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Card_Back_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Card_Back_17.png
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Card_Back_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Card_Back_18.png
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/project.xcworkspace/xcuserdata/Lawrey.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/LawreyMCGame.xcodeproj/project.xcworkspace/xcuserdata/Lawrey.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/tqsplashpng.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "ipad",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "ipad",
9 | "filename" : "tqsplashpng.png",
10 | "scale" : "2x"
11 | }
12 | ],
13 | "info" : {
14 | "version" : 1,
15 | "author" : "xcode"
16 | }
17 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/cloud.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "cloud.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/tqbg.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "lawreybg.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/Boy Pirate.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Boy Pirate.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Anchor.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Gem_10.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Gem_11.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Gem_12.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Float.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Parrot.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Coconut Tree.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Pirate Hat.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Pirate Hook.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Ship Wheel.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Starfish.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Telescope.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_01.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_02.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_03.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_04.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_05.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_06.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_07.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_08.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_09.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_10.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_11.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_12.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_13.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_14.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_15.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_16.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_17.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Card_Back_18.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/HKTQCard/PlayerScore.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlayerScore.swift
3 | // ColourMemory
4 | //
5 | // Created by 2359 Lawrence on 16/5/16.
6 | // Copyright © 2016 Lawrence Tan. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct PlayerScore {
12 |
13 | var name : String? = ""
14 | var score : Int? = 0
15 |
16 | init(name: String, score: Int){
17 |
18 | self.name = name
19 | self.score = score
20 |
21 | }
22 |
23 | }
--------------------------------------------------------------------------------
/HKTQCard/Array+Shuffle.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Array+Shuffle.swift
3 | // ColourMemory
4 | //
5 | // Created by Lawrence Tan on 16/5/16.
6 | // Copyright © 2016 Lawrence Tan. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension Array
12 | {
13 | /** Randomizes the order of an array's elements. */
14 | mutating func shuffle()
15 | {
16 | for _ in 0..<8
17 | {
18 | sort { (_,_) in arc4random() < arc4random() }
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | LawreyMCGame.xcscheme
8 |
9 | orderHint
10 | 1
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | ABDD9DA31DA17453008B25F8
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/HKTQCard/Card.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Card.swift
3 | // ColourMemory
4 | //
5 | // Created by Lawrence Tan on 15/5/16.
6 | // Copyright © 2016 Lawrence Tan. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | let kCardBgImageName = "cardBack"
12 |
13 | struct Card {
14 |
15 | var cardId: Int = -1
16 | var imageBack : String = ""
17 | var imageFront : String = ""
18 | var value : Int = 0
19 | var flipped : Bool = false
20 |
21 | init(valueFront: Int, valueBack: Int){
22 |
23 | self.imageFront = "Gem_\(valueFront)"
24 | self.imageBack = "Card_Back_\(valueBack)"
25 |
26 | self.value = valueFront
27 |
28 | self.flipped = false
29 |
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "orientation" : "landscape",
5 | "idiom" : "ipad",
6 | "extent" : "full-screen",
7 | "scale" : "1x"
8 | },
9 | {
10 | "orientation" : "landscape",
11 | "idiom" : "ipad",
12 | "filename" : "tqsplashpng-3.png",
13 | "extent" : "full-screen",
14 | "scale" : "2x"
15 | },
16 | {
17 | "orientation" : "landscape",
18 | "idiom" : "ipad",
19 | "extent" : "full-screen",
20 | "minimum-system-version" : "7.0",
21 | "scale" : "1x"
22 | },
23 | {
24 | "orientation" : "landscape",
25 | "idiom" : "ipad",
26 | "filename" : "tqsplashpng-2.png",
27 | "extent" : "full-screen",
28 | "minimum-system-version" : "7.0",
29 | "scale" : "2x"
30 | }
31 | ],
32 | "info" : {
33 | "version" : 1,
34 | "author" : "xcode"
35 | }
36 | }
--------------------------------------------------------------------------------
/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "ipad",
5 | "size" : "20x20",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "ipad",
10 | "size" : "20x20",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "ipad",
15 | "size" : "29x29",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "ipad",
20 | "size" : "29x29",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "ipad",
25 | "size" : "40x40",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "ipad",
30 | "size" : "40x40",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "ipad",
35 | "size" : "76x76",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "ipad",
40 | "size" : "76x76",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "83.5x83.5",
46 | "scale" : "2x"
47 | }
48 | ],
49 | "info" : {
50 | "version" : 1,
51 | "author" : "xcode"
52 | }
53 | }
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Lawrence Tan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/HKTQCard/FCGameCardCollectionViewCell.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/HKTQCard/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIcons
10 |
11 | CFBundleIcons~ipad
12 |
13 | CFBundleIdentifier
14 | $(PRODUCT_BUNDLE_IDENTIFIER)
15 | CFBundleInfoDictionaryVersion
16 | 6.0
17 | CFBundleName
18 | $(PRODUCT_NAME)
19 | CFBundlePackageType
20 | APPL
21 | CFBundleShortVersionString
22 | 1.0
23 | CFBundleVersion
24 | 8
25 | Fabric
26 |
27 | APIKey
28 | ccecd894afb473edc8152a03eea12a134cb9e970
29 | Kits
30 |
31 |
32 | KitInfo
33 |
34 | KitName
35 | Crashlytics
36 |
37 |
38 |
39 | LSRequiresIPhoneOS
40 |
41 | UIAppFonts
42 |
43 | Cubano-Regular.otf
44 | Vanilla.ttf
45 |
46 | UIMainStoryboardFile
47 | Main
48 | UIRequiredDeviceCapabilities
49 |
50 | armv7
51 |
52 | UIStatusBarHidden~ipad
53 |
54 | UISupportedInterfaceOrientations
55 |
56 | UIInterfaceOrientationLandscapeLeft
57 |
58 | UISupportedInterfaceOrientations~ipad
59 |
60 | UIInterfaceOrientationLandscapeLeft
61 |
62 | UIViewControllerBasedStatusBarAppearance
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/HKTQCard/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // HKTQCard
4 | //
5 | // Created by Lawrence Tan on 3/10/16.
6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 |
20 | return true
21 | }
22 |
23 | func applicationWillResignActive(_ application: UIApplication) {
24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
25 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
26 | }
27 |
28 | func applicationDidEnterBackground(_ application: UIApplication) {
29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | }
32 |
33 | func applicationWillEnterForeground(_ application: UIApplication) {
34 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
35 | }
36 |
37 | func applicationDidBecomeActive(_ application: UIApplication) {
38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
39 | }
40 |
41 | func applicationWillTerminate(_ application: UIApplication) {
42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
43 | }
44 |
45 |
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/HKTQCard/FCGameCardCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FCGameCardCollectionViewCell.swift
3 | // FlipCollectionViewCell
4 | //
5 | // Created by Lawrence Tan on 1/10/16.
6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class FCGameCardCollectionViewCell: UICollectionViewCell {
12 |
13 | let kCardBackTag: Int = 0
14 | let kCardFrontTag: Int = 1
15 |
16 | var cardViews : (frontView: UIImageView, backView: UIImageView)?
17 |
18 | var imgViewFront: UIImageView!
19 | var imgViewBack: UIImageView!
20 |
21 | override func awakeFromNib() {
22 | imgViewFront = self.createCardViewWithImage(imageName: "", tag: self.kCardFrontTag)
23 | imgViewFront.layer.cornerRadius = 2.5
24 | imgViewFront.layer.borderWidth = 5.0
25 | imgViewFront.layer.borderColor = UIColor.black.cgColor
26 | imgViewFront.clipsToBounds = true
27 | imgViewBack = self.createCardViewWithImage(imageName: "", tag: self.kCardBackTag)
28 | imgViewBack.layer.cornerRadius = 2.5
29 | imgViewBack.layer.borderWidth = 5.0
30 | imgViewBack.layer.borderColor = UIColor.white.cgColor
31 | imgViewBack.clipsToBounds = true
32 | cardViews = (frontView: imgViewFront, backView: imgViewBack)
33 | contentView.addSubview(imgViewBack)
34 | }
35 |
36 | func setCardCell(card: Card) {
37 | imgViewFront.image = UIImage(named: card.imageFront)
38 | imgViewBack.image = UIImage(named: card.imageBack)
39 | }
40 |
41 | func flipCardAnimation(indexPath: IndexPath) {
42 |
43 | if (imgViewBack.superview != nil) {
44 | cardViews = (frontView: imgViewFront, backView: imgViewBack)
45 | }else{
46 | cardViews = (frontView: imgViewBack, backView: imgViewFront)
47 | }
48 |
49 | let transitionOptions = UIViewAnimationOptions.transitionFlipFromLeft
50 |
51 | UIView.transition(with: self.contentView, duration: 0.5, options: transitionOptions, animations: {
52 |
53 | self.cardViews!.backView.removeFromSuperview()
54 |
55 | self.contentView.addSubview(self.cardViews!.frontView)
56 |
57 | }, completion: { finished in
58 | print(indexPath)
59 | })
60 |
61 | }
62 |
63 | private func createCardViewWithImage(imageName: String, tag: Int) -> UIImageView {
64 | let newCardImageView = UIImageView(frame: self.frame)
65 | newCardImageView.image = UIImage(named: imageName)
66 | newCardImageView.contentMode = .scaleAspectFill
67 | newCardImageView.tag = tag
68 | return newCardImageView
69 | }
70 |
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
20 |
21 |
22 |
24 |
36 |
37 |
38 |
40 |
52 |
53 |
54 |
56 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/HKTQCard/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "57x57",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-57x57@1x.png",
49 | "scale" : "1x"
50 | },
51 | {
52 | "idiom" : "iphone",
53 | "size" : "57x57",
54 | "scale" : "2x"
55 | },
56 | {
57 | "size" : "60x60",
58 | "idiom" : "iphone",
59 | "filename" : "Icon-App-60x60@2x.png",
60 | "scale" : "2x"
61 | },
62 | {
63 | "size" : "60x60",
64 | "idiom" : "iphone",
65 | "filename" : "Icon-App-60x60@3x.png",
66 | "scale" : "3x"
67 | },
68 | {
69 | "size" : "20x20",
70 | "idiom" : "ipad",
71 | "filename" : "Icon-App-20x20@1x.png",
72 | "scale" : "1x"
73 | },
74 | {
75 | "size" : "20x20",
76 | "idiom" : "ipad",
77 | "filename" : "Icon-App-20x20@2x.png",
78 | "scale" : "2x"
79 | },
80 | {
81 | "size" : "29x29",
82 | "idiom" : "ipad",
83 | "filename" : "Icon-App-29x29@1x.png",
84 | "scale" : "1x"
85 | },
86 | {
87 | "size" : "29x29",
88 | "idiom" : "ipad",
89 | "filename" : "Icon-App-29x29@2x.png",
90 | "scale" : "2x"
91 | },
92 | {
93 | "size" : "40x40",
94 | "idiom" : "ipad",
95 | "filename" : "Icon-App-40x40@1x.png",
96 | "scale" : "1x"
97 | },
98 | {
99 | "size" : "40x40",
100 | "idiom" : "ipad",
101 | "filename" : "Icon-App-40x40@2x.png",
102 | "scale" : "2x"
103 | },
104 | {
105 | "size" : "76x76",
106 | "idiom" : "ipad",
107 | "filename" : "Icon-App-76x76@1x.png",
108 | "scale" : "1x"
109 | },
110 | {
111 | "size" : "76x76",
112 | "idiom" : "ipad",
113 | "filename" : "Icon-App-76x76@2x.png",
114 | "scale" : "2x"
115 | },
116 | {
117 | "size" : "83.5x83.5",
118 | "idiom" : "ipad",
119 | "filename" : "Icon-App-83.5x83.5@2x.png",
120 | "scale" : "2x"
121 | }
122 | ],
123 | "info" : {
124 | "version" : 1,
125 | "author" : "xcode"
126 | }
127 | }
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcschemes/LawreyMCGame.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/HKTQCard/CNPPopupController.h:
--------------------------------------------------------------------------------
1 | //
2 | // CNPPopupController.h
3 | // CNPPopupController
4 | //
5 | // Created by Carson Perrotti on 2014-09-28.
6 | // Copyright (c) 2014 Carson Perrotti. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol CNPPopupControllerDelegate;
12 | @class CNPPopupTheme, CNPPopupButton;
13 |
14 | @interface CNPPopupController : NSObject
15 |
16 | @property (nonatomic, strong) CNPPopupTheme *_Nonnull theme;
17 | @property (nonatomic, weak) id _Nullable delegate;
18 |
19 | - (nonnull instancetype) init __attribute__((unavailable("You cannot initialize through init - please use initWithContents:")));
20 | - (nonnull instancetype)initWithContents:(nonnull NSArray *)contents NS_DESIGNATED_INITIALIZER;
21 |
22 | - (void)presentPopupControllerAnimated:(BOOL)flag;
23 | - (void)dismissPopupControllerAnimated:(BOOL)flag;
24 |
25 | @end
26 |
27 | @protocol CNPPopupControllerDelegate
28 |
29 | @optional
30 | - (void)popupControllerWillPresent:(nonnull CNPPopupController *)controller;
31 | - (void)popupControllerDidPresent:(nonnull CNPPopupController *)controller;
32 | - (void)popupControllerWillDismiss:(nonnull CNPPopupController *)controller;
33 | - (void)popupControllerDidDismiss:(nonnull CNPPopupController *)controller;
34 |
35 | @end
36 |
37 | typedef void(^SelectionHandler) (CNPPopupButton *_Nonnull button);
38 |
39 | @interface CNPPopupButton : UIButton
40 |
41 | @property (nonatomic, copy) SelectionHandler _Nullable selectionHandler;
42 |
43 | @end
44 |
45 | // CNPPopupStyle: Controls how the popup looks once presented
46 | typedef NS_ENUM(NSUInteger, CNPPopupStyle) {
47 | CNPPopupStyleActionSheet = 0, // Displays the popup similar to an action sheet from the bottom.
48 | CNPPopupStyleCentered, // Displays the popup in the center of the screen.
49 | CNPPopupStyleFullscreen // Displays the popup similar to a fullscreen viewcontroller.
50 | };
51 |
52 | // CNPPopupPresentationStyle: Controls how the popup is presented
53 | typedef NS_ENUM(NSInteger, CNPPopupPresentationStyle) {
54 | CNPPopupPresentationStyleFadeIn = 0,
55 | CNPPopupPresentationStyleSlideInFromTop,
56 | CNPPopupPresentationStyleSlideInFromBottom,
57 | CNPPopupPresentationStyleSlideInFromLeft,
58 | CNPPopupPresentationStyleSlideInFromRight
59 | };
60 |
61 | // CNPPopupMaskType
62 | typedef NS_ENUM(NSInteger, CNPPopupMaskType) {
63 | CNPPopupMaskTypeClear,
64 | CNPPopupMaskTypeDimmed
65 | };
66 |
67 | NS_ASSUME_NONNULL_BEGIN
68 | @interface CNPPopupTheme : NSObject
69 |
70 | @property (nonatomic, strong) UIColor *backgroundColor; // Background color of the popup content view (Default white)
71 | @property (nonatomic, assign) CGFloat cornerRadius; // Corner radius of the popup content view (Default 4.0)
72 | @property (nonatomic, assign) UIEdgeInsets popupContentInsets; // Inset of labels, images and buttons on the popup content view (Default 16.0 on all sides)
73 | @property (nonatomic, assign) CNPPopupStyle popupStyle; // How the popup looks once presented (Default centered)
74 | @property (nonatomic, assign) CNPPopupPresentationStyle presentationStyle; // How the popup is presented (Defauly slide in from bottom. NOTE: Only applicable to CNPPopupStyleCentered)
75 | @property (nonatomic, assign) CNPPopupMaskType maskType; // Backgound mask of the popup (Default dimmed)
76 | @property (nonatomic, assign) BOOL dismissesOppositeDirection; // If presented from a direction, should it dismiss in the opposite? (Defaults to NO. i.e. Goes back the way it came in)
77 | @property (nonatomic, assign) BOOL shouldDismissOnBackgroundTouch; // Popup should dismiss on tapping on background mask (Default yes)
78 | @property (nonatomic, assign) BOOL movesAboveKeyboard; // Popup should move up when the keyboard appears (Default yes)
79 | @property (nonatomic, assign) CGFloat contentVerticalPadding; // Spacing between each vertical element (Default 12.0)
80 | @property (nonatomic, assign) CGFloat maxPopupWidth; // Maxiumum width that the popup should be (Default 300)
81 | @property (nonatomic, assign) CGFloat animationDuration; // Duration of presentation animations (Default 0.3s)
82 |
83 | // Factory method to help build a default theme
84 | + (CNPPopupTheme *)defaultTheme;
85 |
86 | @end
87 | NS_ASSUME_NONNULL_END
88 |
--------------------------------------------------------------------------------
/HKTQCard/Device.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Device.swift
3 | // MySingTel
4 | //
5 | // Created by 2359 Lawrence on 4/1/16.
6 | //
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | @objc class Device: NSObject {
13 |
14 | // MARK: Singletons
15 |
16 | static var TheCurrentDevice: UIDevice {
17 | struct Singleton {
18 | static let device = UIDevice.current
19 | }
20 | return Singleton.device
21 | }
22 |
23 | static var TheCurrentDeviceHeight: CGFloat {
24 | struct Singleton {
25 | static let height = UIScreen.main.bounds.size.height
26 | }
27 | return Singleton.height
28 | }
29 |
30 | static var FontSizeToIncreaseBy: CGFloat {
31 | if self.IS_4_7_INCHES(){
32 | return 1
33 | }else if self.IS_5_5_INCHES_OR_LARGER(){
34 | return 2
35 | }else{
36 | return 0
37 | }
38 | }
39 |
40 | // MARK: iOS version
41 |
42 | static func IS_IOS8_OR_ABOVE() -> Bool {
43 | let result = (UIDevice.current.systemVersion as NSString).compare("8.0", options: NSString.CompareOptions.numeric) != ComparisonResult.orderedAscending
44 | return result
45 | }
46 |
47 | // MARK: - Device Size Checks
48 |
49 | enum Heights: CGFloat {
50 | case Inches_3_5 = 480
51 | case Inches_4 = 568
52 | case Inches_4_7 = 667
53 | case Inches_5_5 = 736
54 | }
55 |
56 | static func isSize(height: Heights) -> Bool {
57 | return TheCurrentDeviceHeight == height.rawValue
58 | }
59 |
60 | static func isSizeOrLarger(height: Heights) -> Bool {
61 | return TheCurrentDeviceHeight >= height.rawValue
62 | }
63 |
64 | static func isSizeOrSmaller(height: Heights) -> Bool {
65 | return TheCurrentDeviceHeight <= height.rawValue
66 | }
67 |
68 | static var CURRENT_SIZE: String {
69 | if IS_3_5_INCHES() {
70 | return "3.5 Inches"
71 | } else if IS_4_INCHES() {
72 | return "4 Inches"
73 | } else if IS_4_7_INCHES() {
74 | return "4.7 Inches"
75 | } else if IS_5_5_INCHES() {
76 | return "5.5 Inches"
77 | }
78 | return "\(TheCurrentDeviceHeight) Points"
79 | }
80 |
81 | // MARK: Retina Check
82 |
83 | static func IS_RETINA() -> Bool {
84 | return UIScreen.main.responds(to: #selector(NSDecimalNumberBehaviors.scale))
85 | }
86 |
87 | static func isPhone() -> Bool {
88 | return TheCurrentDevice.userInterfaceIdiom == .phone
89 | }
90 |
91 | // MARK: 3.5 Inch Checks
92 |
93 | static func IS_3_5_INCHES() -> Bool {
94 | return isPhone() && isSize(height: .Inches_3_5)
95 | }
96 |
97 | static func IS_3_5_INCHES_OR_LARGER() -> Bool {
98 | return isPhone() && isSizeOrLarger(height: .Inches_3_5)
99 | }
100 |
101 | static func IS_3_5_INCHES_OR_SMALLER() -> Bool {
102 | return isPhone() && isSizeOrSmaller(height: .Inches_3_5)
103 | }
104 |
105 | // MARK: 4 Inch Checks
106 |
107 | static func IS_4_INCHES() -> Bool {
108 | return isPhone() && isSize(height: .Inches_4)
109 | }
110 |
111 | static func IS_4_INCHES_OR_LARGER() -> Bool {
112 | return isPhone() && isSizeOrLarger(height: .Inches_4)
113 | }
114 |
115 | static func IS_4_INCHES_OR_SMALLER() -> Bool {
116 | return isPhone() && isSizeOrSmaller(height: .Inches_4)
117 | }
118 |
119 | // MARK: 4.7 Inch Checks
120 |
121 | static func IS_4_7_INCHES() -> Bool {
122 | return isPhone() && isSize(height: .Inches_4_7)
123 | }
124 |
125 | static func IS_4_7_INCHES_OR_LARGER() -> Bool {
126 | return isPhone() && isSizeOrLarger(height: .Inches_4_7)
127 | }
128 |
129 | static func IS_4_7_INCHES_OR_SMALLER() -> Bool {
130 | return isPhone() && isSizeOrLarger(height: .Inches_4_7)
131 | }
132 |
133 | // MARK: 5.5 Inch Checks
134 |
135 | static func IS_5_5_INCHES() -> Bool {
136 | return isPhone() && isSize(height: .Inches_5_5)
137 | }
138 |
139 | static func IS_5_5_INCHES_OR_LARGER() -> Bool {
140 | return isPhone() && isSizeOrLarger(height: .Inches_5_5)
141 | }
142 |
143 | static func IS_5_5_INCHES_OR_SMALLER() -> Bool {
144 | return isPhone() && isSizeOrLarger(height: .Inches_5_5)
145 | }
146 |
147 | func changeLabelFontSize (label: UILabel, size: CGFloat) -> UIFont {
148 | let font: UIFont = UIFont(name: label.font.fontName, size: size)!
149 | return font
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/HKTQCard/CMCardDealerManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CMCardDealerManager.swift
3 | // ColourMemory
4 | //
5 | // Created by 2359 Lawrence on 16/5/16.
6 | // Copyright © 2016 Lawrence Tan. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | //Notifications
12 | let kMisMatchNotificationName = "MisMatchedNotification"
13 | let kMatchNotificationName = "MatchedNotification"
14 | let kGameEndNotificationName = "GameEndNotification"
15 |
16 | let kMaxPair = 9
17 | let kDelayTimeInSeconds = Double(1)
18 | let kCorrectPoints = 2
19 | let kIncorrectPoints = -1
20 |
21 | class CMCardDealerManager {
22 |
23 | //Card Cards Result
24 | var result = 0
25 |
26 | //Current Game Variables
27 | var currentActiveDeck = [Card]()
28 | var currentActiveChosenCards = [Card]()
29 | var currentActiveChosenCardsIdx = [IndexPath]()
30 | var flippedCards = [IndexPath]()
31 |
32 | var currentScore = 0
33 | var currentPairsFlipped = 0
34 |
35 | static let singleton = CMCardDealerManager()
36 |
37 | class func sharedInstance() -> CMCardDealerManager {
38 | return singleton
39 | }
40 |
41 | func createDeckOfCards() {
42 |
43 | currentScore = 0
44 | currentActiveDeck.removeAll()
45 | currentActiveChosenCards.removeAll()
46 | currentActiveChosenCardsIdx.removeAll()
47 | flippedCards.removeAll()
48 |
49 | var totalCards = kMaxPair * 2
50 | var gemCardCounter = 1
51 | var backCardCounter = 1
52 |
53 | while(totalCards>0){
54 |
55 | var newCard1 = Card(valueFront: gemCardCounter, valueBack: backCardCounter)
56 | newCard1.cardId = backCardCounter
57 | currentActiveDeck.append(newCard1)
58 | backCardCounter+=1
59 |
60 | var newCard2 = Card(valueFront: gemCardCounter, valueBack: backCardCounter)
61 | newCard2.cardId = backCardCounter
62 | currentActiveDeck.append(newCard2)
63 | gemCardCounter+=1
64 | totalCards-=2
65 | }
66 |
67 | currentActiveDeck.shuffle()
68 |
69 | backCardCounter = 1
70 | for card in currentActiveDeck {
71 | var tempCard = card
72 | tempCard.imageBack = "Card_Back_\(backCardCounter)"
73 | tempCard.cardId = backCardCounter
74 | currentActiveDeck[backCardCounter-1] = tempCard
75 | backCardCounter += 1
76 | }
77 |
78 | }
79 |
80 | func selectCard(card: Card, indexPath: IndexPath) {
81 | if currentActiveChosenCards.count <= 1 {
82 | let chosenCard = card
83 | currentActiveChosenCards.append(chosenCard)
84 | currentActiveChosenCardsIdx.append(indexPath)
85 | flippedCards.append(indexPath)
86 | if currentActiveChosenCards.count == 2 {
87 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
88 | // your function here
89 | self.checkCards()
90 | }
91 |
92 | }
93 | }
94 | }
95 |
96 | // Card Result :
97 | // 0 - First Card, Do Nothing, reload
98 | // 1 - Second Card, Matched, Score, reload
99 | // 2 - Second Card, MisMatch, Minus Score, reload
100 | // 3 - Last Pair, Game End
101 |
102 | private func checkCards() {
103 | let isMatched = checkIfMatch()
104 | if isMatched == true {
105 | currentActiveChosenCards.removeAll()
106 | currentActiveChosenCardsIdx.removeAll()
107 | currentScore += 1
108 | if currentScore == kMaxPair {
109 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil)
110 | }else{
111 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil)
112 | }
113 | }else{
114 | let firstCard = currentActiveChosenCardsIdx[0]
115 | let secondCard = currentActiveChosenCardsIdx[1]
116 | flippedCards = flippedCards.filter({$0 != firstCard})
117 | flippedCards = flippedCards.filter({$0 != secondCard})
118 | currentActiveChosenCards.removeAll()
119 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil)
120 | }
121 | }
122 |
123 | private func checkIfMatch() -> Bool {
124 | let firstCard = currentActiveChosenCards[0]
125 | let secondCard = currentActiveChosenCards[1]
126 | if firstCard.value == secondCard.value {
127 | return true
128 | }
129 | return false
130 | }
131 |
132 | }
133 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LawreyMemoryCardSwift
2 |
3 | 
4 |
5 | # Requirements
6 | Xcode 8.0+, Swift 3.0
7 |
8 | # Usage
9 | You may clone this entire project and run it in Xcode.
10 |
11 | # Purpose
12 | This mini game was developed to bring fun and excitement to a big group of children at a big children's day party. It is played on a big LED screen with Apple TV and it has stirred up the excitement of many children. The game was also built in a Treasure Quest Theme and I am sharing this project to help developers that are in similar situations as me, needed a game, to help you save time in reinventing the wheels.
13 |
14 | # How it works
15 | ## View
16 | ### FCGameBoardCollectionViewController
17 |
18 | This is the main view controller that controls the game board. These are the basic configurations of the game, total time in seconds and states of the game.
19 |
20 | ```
21 | let kMaxTimeInSeconds: Int = 120
22 |
23 | enum GameState: NSInteger {
24 | case Playing
25 | case NotPlaying
26 | case GameEnd
27 | }
28 | ```
29 | This part is where we call the tap of every card. While the game is ongoing, check if its the first or second card, based on each type of card, we apply flip animation and card selectCard function.
30 |
31 | ```
32 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
33 | if currentGameState == .NotPlaying {
34 | currentGameState = .Playing
35 | startTimer()
36 | btnReset.setTitle("Stop", for: .normal)
37 | }
38 | if !cardManager.currentActiveChosenCardsIdx.contains(indexPath) && !cardManager.flippedCards.contains(indexPath){
39 | //showPopupWithStyle(.centered)
40 | let cell = collectionView.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell
41 | let card = cardManager.currentActiveDeck[indexPath.row]
42 | if cardManager.currentActiveChosenCards.count <= 1 {
43 | if cardManager.currentActiveChosenCards.count == 1 {
44 | if cardManager.currentActiveChosenCards[0].cardId != card.cardId {
45 | cell.flipCardAnimation(indexPath: indexPath)
46 | cardManager.selectCard(card: card, indexPath: indexPath)
47 | }
48 | }else{
49 | cell.flipCardAnimation(indexPath: indexPath)
50 | cardManager.selectCard(card: card, indexPath: indexPath)
51 | }
52 | }
53 | }
54 | }
55 | ```
56 | ### FCGameCardCollectionViewCell
57 | This is the Collection View Cell for every single card
58 |
59 | ## Manager
60 | ### CMCardDealerManager
61 | This is the brain of the game.
62 |
63 | We set simple configurations here, MaxPair, DelayInSeconds after each card and points.
64 | ```
65 | let kMaxPair = 9
66 | let kDelayTimeInSeconds = Double(1)
67 | let kCorrectPoints = 2
68 | let kIncorrectPoints = -1
69 | ```
70 | Here we create a deck of randomly-ordered cards
71 |
72 | ```
73 | func createDeckOfCards() {
74 |
75 | currentScore = 0
76 | currentActiveDeck.removeAll()
77 | currentActiveChosenCards.removeAll()
78 | currentActiveChosenCardsIdx.removeAll()
79 | flippedCards.removeAll()
80 |
81 | var totalCards = kMaxPair * 2
82 | var gemCardCounter = 1
83 | var backCardCounter = 1
84 |
85 | while(totalCards>0){
86 |
87 | var newCard1 = Card(valueFront: gemCardCounter, valueBack: backCardCounter)
88 | newCard1.cardId = backCardCounter
89 | currentActiveDeck.append(newCard1)
90 | backCardCounter+=1
91 |
92 | var newCard2 = Card(valueFront: gemCardCounter, valueBack: backCardCounter)
93 | newCard2.cardId = backCardCounter
94 | currentActiveDeck.append(newCard2)
95 | gemCardCounter+=1
96 | totalCards-=2
97 | }
98 |
99 | currentActiveDeck.shuffle()
100 |
101 | backCardCounter = 1
102 | for card in currentActiveDeck {
103 | var tempCard = card
104 | tempCard.imageBack = "Card_Back_\(backCardCounter)"
105 | tempCard.cardId = backCardCounter
106 | currentActiveDeck[backCardCounter-1] = tempCard
107 | backCardCounter += 1
108 | }
109 |
110 | }
111 | ```
112 | Here we deal with a card that is being tapped
113 |
114 | ```
115 | func selectCard(card: Card, indexPath: IndexPath) {
116 | if currentActiveChosenCards.count <= 1 {
117 | let chosenCard = card
118 | currentActiveChosenCards.append(chosenCard)
119 | currentActiveChosenCardsIdx.append(indexPath)
120 | flippedCards.append(indexPath)
121 | if currentActiveChosenCards.count == 2 {
122 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
123 | // your function here
124 | self.checkCards()
125 | }
126 |
127 | }
128 | }
129 | }
130 | ```
131 |
132 | Here we check compare 2 cards once there are 2 cards
133 |
134 | ```
135 | // Card Result :
136 | // 0 - First Card, Do Nothing, reload
137 | // 1 - Second Card, Matched, Score, reload
138 | // 2 - Second Card, MisMatch, Minus Score, reload
139 | // 3 - Last Pair, Game End
140 |
141 | private func checkCards() {
142 | let isMatched = checkIfMatch()
143 | if isMatched == true {
144 | currentActiveChosenCards.removeAll()
145 | currentActiveChosenCardsIdx.removeAll()
146 | currentScore += 1
147 | if currentScore == kMaxPair {
148 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil)
149 | }else{
150 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil)
151 | }
152 | }else{
153 | let firstCard = currentActiveChosenCardsIdx[0]
154 | let secondCard = currentActiveChosenCardsIdx[1]
155 | flippedCards = flippedCards.filter({$0 != firstCard})
156 | flippedCards = flippedCards.filter({$0 != secondCard})
157 | currentActiveChosenCards.removeAll()
158 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil)
159 | }
160 | }
161 |
162 | private func checkIfMatch() -> Bool {
163 | let firstCard = currentActiveChosenCards[0]
164 | let secondCard = currentActiveChosenCards[1]
165 | if firstCard.value == secondCard.value {
166 | return true
167 | }
168 | return false
169 | }
170 | ```
171 |
172 | ## CNPPopupController
173 | I also used this very interesting PopupController by CN to show the slide up dialog box as an end game interaction.
174 |
175 | # Release Notes
176 | Version 1.0
177 | * Only allow cards to be flipped if it is unflipped
178 | * Supports iPad only
179 |
180 | # Credits
181 | * Joanna C (Designer of the individual graphics)
182 | * Joanna S (Testing and conceptualizing it)
183 |
184 | # License
185 | MIT License
186 |
187 | Copyright (c) 2016 Lawrence Tan
188 |
189 | Permission is hereby granted, free of charge, to any person obtaining a copy
190 | of this software and associated documentation files (the "Software"), to deal
191 | in the Software without restriction, including without limitation the rights
192 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
193 | copies of the Software, and to permit persons to whom the Software is
194 | furnished to do so, subject to the following conditions:
195 |
196 | The above copyright notice and this permission notice shall be included in all
197 | copies or substantial portions of the Software.
198 |
199 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
200 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
201 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
202 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
203 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
204 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
205 | SOFTWARE.
206 |
--------------------------------------------------------------------------------
/HKTQCard/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Cubano-Regular
12 |
13 |
14 | Vanilla
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
57 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/HKTQCard/FCGameBoardCollectionViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FCGameBoardCollectionViewController.swift
3 | // FlipCollectionViewCell
4 | //
5 | // Created by Lawrence Tan on 1/10/16.
6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | private let reuseIdentifier = "FCGameCardCollectionViewCell"
12 |
13 | let kMaxTimeInSeconds: Int = 120
14 |
15 | enum GameState: NSInteger {
16 |
17 | case Playing
18 | case NotPlaying
19 | case GameEnd
20 | }
21 |
22 | class FCGameBoardCollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
23 |
24 | var numberOfSeconds: Int = kMaxTimeInSeconds
25 | var timer: Timer?
26 |
27 | let formatter = DateFormatter()
28 | let calendar = Calendar.current
29 | let components: CFCalendarUnit = [.second, .minute]
30 |
31 | @IBOutlet weak var btnReset: UIButton!
32 | @IBOutlet weak var lblTimer: UILabel!
33 | @IBOutlet weak var bgImageView: UIImageView!
34 | @IBOutlet weak var collectionView: UICollectionView!
35 |
36 | var currentGameState: GameState = .NotPlaying
37 | let cardManager = CMCardDealerManager.sharedInstance()
38 | var popupController: CNPPopupController?
39 |
40 | var lblGameover: UILabel?
41 |
42 | override func viewDidLoad() {
43 | super.viewDidLoad()
44 | collectionView!.register(UINib(nibName: "FCGameCardCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier)
45 | NotificationCenter.default.addObserver(self, selector: #selector(self.onMisMatch), name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil)
46 | NotificationCenter.default.addObserver(self, selector: #selector(self.onMatch), name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil)
47 | NotificationCenter.default.addObserver(self, selector: #selector(self.onGameEnd), name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil)
48 | collectionView.backgroundColor = UIColor.clear
49 | btnReset.setTitle("Ready?", for: .normal)
50 |
51 | //243,108,46
52 |
53 | let strokeTextAttributes = [
54 | NSStrokeColorAttributeName : UIColor.white,
55 | NSForegroundColorAttributeName : UIColor(colorLiteralRed: 243.0/255, green: 108/255, blue: 46/255, alpha: 1.0),
56 | NSStrokeWidthAttributeName : -8.0,
57 | ] as [String : Any]
58 |
59 | lblGameover = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 110))
60 | lblGameover?.center = view.center
61 | lblGameover?.textAlignment = .center
62 | lblGameover?.font = UIFont(name: "Vanilla", size: 100)
63 | lblGameover?.text = "Game Over"
64 | lblGameover?.attributedText = NSAttributedString(string: "Game Over", attributes: strokeTextAttributes)
65 | lblGameover?.alpha = 0
66 | view.addSubview(lblGameover!)
67 | }
68 |
69 | override func viewWillAppear(_ animated: Bool) {
70 | super.viewWillAppear(animated)
71 | cardManager.createDeckOfCards()
72 | collectionView?.reloadData()
73 | }
74 |
75 | override var prefersStatusBarHidden: Bool {
76 | return true
77 | }
78 |
79 | // MARK: UICollectionViewDataSource
80 |
81 | func numberOfSections(in collectionView: UICollectionView) -> Int {
82 | return 1
83 | }
84 |
85 |
86 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
87 | return cardManager.currentActiveDeck.count
88 | }
89 |
90 |
91 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
92 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FCGameCardCollectionViewCell
93 | let card = cardManager.currentActiveDeck[indexPath.row]
94 | cell.setCardCell(card: card)
95 | return cell
96 | }
97 |
98 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
99 | if currentGameState == .NotPlaying {
100 | currentGameState = .Playing
101 | startTimer()
102 | btnReset.setTitle("Stop", for: .normal)
103 | }
104 | if !cardManager.currentActiveChosenCardsIdx.contains(indexPath) && !cardManager.flippedCards.contains(indexPath){
105 | //showPopupWithStyle(.centered)
106 | let cell = collectionView.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell
107 | let card = cardManager.currentActiveDeck[indexPath.row]
108 | if cardManager.currentActiveChosenCards.count <= 1 {
109 | if cardManager.currentActiveChosenCards.count == 1 {
110 | if cardManager.currentActiveChosenCards[0].cardId != card.cardId {
111 | cell.flipCardAnimation(indexPath: indexPath)
112 | cardManager.selectCard(card: card, indexPath: indexPath)
113 | }
114 | }else{
115 | cell.flipCardAnimation(indexPath: indexPath)
116 | cardManager.selectCard(card: card, indexPath: indexPath)
117 | }
118 | }
119 | }
120 | }
121 |
122 | func onMatch() {
123 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
124 | // your function here
125 | self.popupController?.dismiss(animated: true)
126 | }
127 | }
128 |
129 | func onMisMatch() {
130 | for indexPath in cardManager.currentActiveChosenCardsIdx {
131 | let cell = collectionView?.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell
132 | cell.flipCardAnimation(indexPath: indexPath)
133 | }
134 | cardManager.currentActiveChosenCardsIdx.removeAll()
135 | }
136 |
137 | @IBAction func onReset(_ sender: AnyObject) {
138 | if currentGameState == .Playing || currentGameState == .GameEnd {
139 | let alertView = UIAlertController(title: "Are you sure?", message: "Reset Game?", preferredStyle: .alert)
140 | let actionYes = UIAlertAction(title: "Yes", style: .default, handler: { (action) in
141 | for unflippedCard in self.cardManager.flippedCards {
142 | let cell = self.collectionView?.cellForItem(at: unflippedCard) as! FCGameCardCollectionViewCell
143 | cell.flipCardAnimation(indexPath: unflippedCard)
144 | }
145 | self.cardManager.createDeckOfCards()
146 | self.collectionView?.reloadData()
147 | self.currentGameState = .NotPlaying
148 | self.stopTimer()
149 | self.numberOfSeconds = kMaxTimeInSeconds
150 | self.btnReset.setTitle("Ready?", for: .normal)
151 | self.lblTimer.text = self.timeFormatted(totalSeconds: self.numberOfSeconds)
152 | UIView.animate(withDuration: 1) {
153 | self.lblGameover?.alpha = 0
154 | }
155 | self.collectionView.isUserInteractionEnabled = true
156 | })
157 | let actionNo = UIAlertAction(title: "No", style: .cancel, handler: { (action) in
158 |
159 | })
160 | alertView.addAction(actionYes)
161 | alertView.addAction(actionNo)
162 | present(alertView, animated: true, completion: nil)
163 | }
164 | }
165 |
166 | func showPopupWithStyle(_ popupStyle: CNPPopupStyle) {
167 |
168 | let paragraphStyle = NSMutableParagraphStyle()
169 | paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping
170 | paragraphStyle.alignment = NSTextAlignment.center
171 |
172 | let title = NSAttributedString(string: "Aye! Aye! You collected \(cardManager.currentScore) treasures in", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 24), NSParagraphStyleAttributeName: paragraphStyle])
173 | let lineOne = NSAttributedString(string: "\(kMaxTimeInSeconds-numberOfSeconds-1) seconds!", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 36), NSParagraphStyleAttributeName: paragraphStyle])
174 |
175 |
176 | let titleLabel = UILabel()
177 | titleLabel.numberOfLines = 0;
178 | titleLabel.attributedText = title
179 | titleLabel.font = UIFont(name: "Cubano-Regular", size: 22)
180 |
181 | let lineOneLabel = UILabel()
182 | lineOneLabel.numberOfLines = 0;
183 | lineOneLabel.attributedText = lineOne;
184 | lineOneLabel.font = UIFont(name: "Cubano-Regular", size: 36)
185 |
186 | let imageView = UIImageView.init(image: UIImage.init(named: "Boy Pirate"))
187 | imageView.frame = CGRect(x: 20, y: lineOneLabel.frame.origin.y+8, width: 132, height: 200)
188 | imageView.contentMode = .scaleAspectFit
189 |
190 |
191 | let popupController = CNPPopupController(contents:[titleLabel, lineOneLabel, imageView])
192 | popupController.theme = CNPPopupTheme.default()
193 | popupController.theme.popupStyle = popupStyle
194 | popupController.delegate = self
195 | self.popupController = popupController
196 | popupController.present(animated: true)
197 | }
198 |
199 | // MARK: Timer
200 |
201 | func startTimer() {
202 | timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateTimer), userInfo: nil, repeats: true)
203 | }
204 |
205 | func stopTimer() {
206 | timer?.invalidate()
207 | }
208 |
209 | func updateTimer() {
210 | if numberOfSeconds >= 0 {
211 | lblTimer.text = timeFormatted(totalSeconds: numberOfSeconds)
212 | numberOfSeconds-=1
213 | }else{
214 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil)
215 | stopTimer()
216 | }
217 | }
218 |
219 | private func timeFormatted(totalSeconds: Int) -> String {
220 | let seconds: Int = totalSeconds % 60
221 | let minutes: Int = (totalSeconds / 60) % 60
222 | return String(format: "%02d:%02d", minutes, seconds)
223 | }
224 |
225 | func onGameEnd() {
226 | stopTimer()
227 | showPopupWithStyle(.centered)
228 | btnReset.setTitle("Reset", for: .normal)
229 | currentGameState = .GameEnd
230 | UIView.animate(withDuration: 1) {
231 | self.lblGameover?.alpha = 1
232 | }
233 | self.collectionView.isUserInteractionEnabled = false
234 | }
235 | }
236 |
237 | extension FCGameBoardCollectionViewController : CNPPopupControllerDelegate {
238 |
239 | func popupControllerWillDismiss(_ controller: CNPPopupController) {
240 | print("Popup controller will be dismissed")
241 | }
242 |
243 | func popupControllerDidPresent(_ controller: CNPPopupController) {
244 | print("Popup controller presented")
245 | }
246 |
247 | }
248 |
--------------------------------------------------------------------------------
/HKTQCard/CNPPopupController.m:
--------------------------------------------------------------------------------
1 | //
2 | // CNPPopupController.m
3 | // CNPPopupController
4 | //
5 | // Created by Carson Perrotti on 2014-09-28.
6 | // Copyright (c) 2014 Carson Perrotti. All rights reserved.
7 | //
8 |
9 | #import "CNPPopupController.h"
10 |
11 | #define CNP_SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
12 | #define CNP_IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
13 |
14 | static inline UIViewAnimationOptions UIViewAnimationCurveToAnimationOptions(UIViewAnimationCurve curve)
15 | {
16 | return curve << 16;
17 | }
18 |
19 | @interface CNPPopupController ()
20 |
21 | @property (nonatomic, strong) UIWindow *applicationWindow;
22 | @property (nonatomic, strong) UIView *maskView;
23 | @property (nonatomic, strong) UITapGestureRecognizer *backgroundTapRecognizer;
24 | @property (nonatomic, strong) UIView *popupView;
25 | @property (nonatomic, strong) NSArray *views;
26 | @property (nonatomic) BOOL dismissAnimated;
27 |
28 | @end
29 |
30 | @implementation CNPPopupController
31 |
32 |
33 | - (instancetype)initWithContents:(NSArray *)contents {
34 | self = [super init];
35 | if (self) {
36 |
37 | self.views = contents;
38 |
39 | self.popupView = [[UIView alloc] initWithFrame:CGRectZero];
40 | self.popupView.backgroundColor = [UIColor whiteColor];
41 | self.popupView.clipsToBounds = YES;
42 |
43 | self.maskView = [[UIView alloc] initWithFrame:self.applicationWindow.bounds];
44 | self.maskView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7];
45 | self.backgroundTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBackgroundTapGesture:)];
46 | self.backgroundTapRecognizer.delegate = self;
47 | [self.maskView addGestureRecognizer:self.backgroundTapRecognizer];
48 | [self.maskView addSubview:self.popupView];
49 |
50 | self.theme = [CNPPopupTheme defaultTheme];
51 |
52 | [self addPopupContents];
53 |
54 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
55 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
56 |
57 | [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
58 | [[NSNotificationCenter defaultCenter] addObserver:self
59 | selector:@selector(orientationWillChange)
60 | name:UIApplicationWillChangeStatusBarOrientationNotification
61 | object:nil];
62 | [[NSNotificationCenter defaultCenter] addObserver:self
63 | selector:@selector(orientationChanged)
64 | name:UIApplicationDidChangeStatusBarOrientationNotification
65 | object:nil];
66 | }
67 | return self;
68 | }
69 |
70 | - (instancetype)init {
71 | self = [self initWithContents:@[]];
72 | return self;
73 | }
74 |
75 | - (void)dealloc {
76 | [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
77 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
78 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
79 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];
80 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil];
81 | }
82 |
83 | - (void)orientationWillChange {
84 |
85 | [UIView animateWithDuration:self.theme.animationDuration animations:^{
86 | self.maskView.frame = self.applicationWindow.bounds;
87 | self.popupView.center = [self endingPoint];
88 | }];
89 | }
90 |
91 | - (void)orientationChanged {
92 |
93 | UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
94 | CGFloat angle = CNP_UIInterfaceOrientationAngleOfOrientation(statusBarOrientation);
95 | CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
96 |
97 | [UIView animateWithDuration:self.theme.animationDuration animations:^{
98 | self.maskView.frame = self.applicationWindow.bounds;
99 | self.popupView.center = [self endingPoint];
100 | if (CNP_SYSTEM_VERSION_LESS_THAN(@"8.0")) {
101 | self.popupView.transform = transform;
102 | }
103 | }];
104 | }
105 |
106 | CGFloat CNP_UIInterfaceOrientationAngleOfOrientation(UIInterfaceOrientation orientation)
107 | {
108 | CGFloat angle;
109 |
110 | switch (orientation)
111 | {
112 | case UIInterfaceOrientationPortraitUpsideDown:
113 | angle = M_PI;
114 | break;
115 | case UIInterfaceOrientationLandscapeLeft:
116 | angle = -M_PI_2;
117 | break;
118 | case UIInterfaceOrientationLandscapeRight:
119 | angle = M_PI_2;
120 | break;
121 | default:
122 | angle = 0.0;
123 | break;
124 | }
125 |
126 | return angle;
127 | }
128 |
129 |
130 | #pragma mark - Theming
131 |
132 | - (void)applyTheme {
133 | if (self.theme.popupStyle == CNPPopupStyleFullscreen) {
134 | self.theme.presentationStyle = CNPPopupPresentationStyleFadeIn;
135 | }
136 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) {
137 | self.theme.presentationStyle = CNPPopupPresentationStyleSlideInFromBottom;
138 | }
139 | self.popupView.layer.cornerRadius = self.theme.popupStyle == CNPPopupStyleCentered?self.theme.cornerRadius:0;
140 | self.popupView.backgroundColor = self.theme.backgroundColor;
141 | UIColor *maskBackgroundColor;
142 | if (self.theme.popupStyle == CNPPopupStyleFullscreen) {
143 | maskBackgroundColor = self.popupView.backgroundColor;
144 | }
145 | else {
146 | maskBackgroundColor = self.theme.maskType == CNPPopupMaskTypeClear?[UIColor clearColor] : [UIColor colorWithWhite:0.0 alpha:0.7];
147 | }
148 | self.maskView.backgroundColor = maskBackgroundColor;
149 | }
150 |
151 | #pragma mark - Popup Building
152 |
153 | - (void)addPopupContents {
154 | for (UIView *view in self.views)
155 | {
156 | [self.popupView addSubview:view];
157 | }
158 | }
159 |
160 | - (CGSize)calculateContentSizeThatFits:(CGSize)size andUpdateLayout:(BOOL)update
161 | {
162 | UIEdgeInsets inset = self.theme.popupContentInsets;
163 | size.width -= (inset.left + inset.right);
164 | size.height -= (inset.top + inset.bottom);
165 |
166 | CGSize result = CGSizeMake(0, inset.top);
167 | for (UIView *view in self.popupView.subviews)
168 | {
169 | view.autoresizingMask = UIViewAutoresizingNone;
170 | if (!view.hidden)
171 | {
172 | CGSize _size = view.frame.size;
173 | if (CGSizeEqualToSize(_size, CGSizeZero))
174 | {
175 | _size = [view sizeThatFits:size];
176 | _size.width = size.width;
177 | if (update) view.frame = CGRectMake(inset.left, result.height, _size.width, _size.height);
178 | }
179 | else {
180 | if (update) {
181 | view.frame = CGRectMake(0, result.height, _size.width, _size.height);
182 | }
183 | }
184 | result.height += _size.height + self.theme.contentVerticalPadding;
185 | result.width = MAX(result.width, _size.width);
186 | }
187 | }
188 |
189 | result.height -= self.theme.contentVerticalPadding;
190 | result.width += inset.left + inset.right;
191 | result.height = MIN(INFINITY, MAX(0.0f, result.height + inset.bottom));
192 | if (update) {
193 | for (UIView *view in self.popupView.subviews) {
194 | view.frame = CGRectMake((result.width - view.frame.size.width) * 0.5, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
195 | }
196 | self.popupView.frame = CGRectMake(0, 0, result.width, result.height);
197 | }
198 | return result;
199 | }
200 |
201 | - (CGSize)sizeThatFits:(CGSize)size
202 | {
203 | return [self calculateContentSizeThatFits:size andUpdateLayout:NO];
204 | }
205 |
206 | #pragma mark - Keyboard
207 |
208 | - (void)keyboardWillShow:(NSNotification*)notification
209 | {
210 | if (self.theme.movesAboveKeyboard) {
211 | CGRect frame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
212 | frame = [self.popupView convertRect:frame fromView:nil];
213 | NSTimeInterval duration = [(notification.userInfo)[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
214 | UIViewAnimationCurve curve = [(notification.userInfo)[UIKeyboardAnimationCurveUserInfoKey] integerValue];
215 |
216 | [self keyboardWithEndFrame:frame willShowAfterDuration:duration withOptions:UIViewAnimationCurveToAnimationOptions(curve)];
217 | }
218 | }
219 |
220 | - (void)keyboardWithEndFrame:(CGRect)keyboardFrame willShowAfterDuration:(NSTimeInterval)duration withOptions:(UIViewAnimationOptions)options
221 | {
222 | CGRect popupViewIntersection = CGRectIntersection(self.popupView.frame, keyboardFrame);
223 |
224 | if (popupViewIntersection.size.height > 0) {
225 | CGRect maskViewIntersection = CGRectIntersection(self.maskView.frame, keyboardFrame);
226 |
227 | [UIView animateWithDuration:duration delay:0.0f options:options animations:^{
228 | self.popupView.center = CGPointMake(self.popupView.center.x, (CGRectGetHeight(self.maskView.frame) - maskViewIntersection.size.height) / 2);
229 | } completion:nil];
230 | }
231 | }
232 |
233 | - (void)keyboardWillHide:(NSNotification*)notification
234 | {
235 | if (self.theme.movesAboveKeyboard) {
236 | CGRect frame = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
237 | frame = [self.popupView convertRect:frame fromView:nil];
238 | NSTimeInterval duration = [(notification.userInfo)[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
239 | UIViewAnimationCurve curve = [(notification.userInfo)[UIKeyboardAnimationCurveUserInfoKey] integerValue];
240 |
241 | [self keyboardWithStartFrame:frame willHideAfterDuration:duration withOptions:UIViewAnimationCurveToAnimationOptions(curve)];
242 | }
243 | }
244 |
245 | - (void)keyboardWithStartFrame:(CGRect)keyboardFrame willHideAfterDuration:(NSTimeInterval)duration withOptions:(UIViewAnimationOptions)options
246 | {
247 | [UIView animateWithDuration:duration delay:0.0f options:options animations:^{
248 | self.popupView.center = [self endingPoint];
249 | } completion:nil];
250 | }
251 |
252 | #pragma mark - Presentation
253 |
254 | - (void)presentPopupControllerAnimated:(BOOL)flag {
255 |
256 | if ([self.delegate respondsToSelector:@selector(popupControllerWillPresent:)]) {
257 | [self.delegate popupControllerWillPresent:self];
258 | }
259 |
260 | // Keep a record of if the popup was presented with animation
261 | self.dismissAnimated = flag;
262 |
263 | [self applyTheme];
264 | [self calculateContentSizeThatFits:CGSizeMake([self popupWidth], self.maskView.bounds.size.height) andUpdateLayout:YES];
265 | self.popupView.center = [self originPoint];
266 | [self.applicationWindow addSubview:self.maskView];
267 | self.maskView.alpha = 0;
268 | [UIView animateWithDuration:flag?self.theme.animationDuration:0.0 animations:^{
269 | self.maskView.alpha = 1.0;
270 | self.popupView.center = [self endingPoint];;
271 | } completion:^(BOOL finished) {
272 | self.popupView.userInteractionEnabled = YES;
273 | if ([self.delegate respondsToSelector:@selector(popupControllerDidPresent:)]) {
274 | [self.delegate popupControllerDidPresent:self];
275 | }
276 | }];
277 | }
278 |
279 | - (void)dismissPopupControllerAnimated:(BOOL)flag {
280 | if ([self.delegate respondsToSelector:@selector(popupControllerWillDismiss:)]) {
281 | [self.delegate popupControllerWillDismiss:self];
282 | }
283 | [UIView animateWithDuration:flag?self.theme.animationDuration:0.0 animations:^{
284 | self.maskView.alpha = 0.0;
285 | self.popupView.center = [self dismissedPoint];;
286 | } completion:^(BOOL finished) {
287 | [self.maskView removeFromSuperview];
288 | if ([self.delegate respondsToSelector:@selector(popupControllerDidDismiss:)]) {
289 | [self.delegate popupControllerDidDismiss:self];
290 | }
291 | }];
292 | }
293 |
294 | - (CGPoint)originPoint {
295 | CGPoint origin;
296 | switch (self.theme.presentationStyle) {
297 | case CNPPopupPresentationStyleFadeIn:
298 | origin = self.maskView.center;
299 | break;
300 | case CNPPopupPresentationStyleSlideInFromBottom:
301 | origin = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height);
302 | break;
303 | case CNPPopupPresentationStyleSlideInFromLeft:
304 | origin = CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y);
305 | break;
306 | case CNPPopupPresentationStyleSlideInFromRight:
307 | origin = CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y);
308 | break;
309 | case CNPPopupPresentationStyleSlideInFromTop:
310 | origin = CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height);
311 | break;
312 | default:
313 | origin = self.maskView.center;
314 | break;
315 | }
316 | return origin;
317 | }
318 |
319 | - (CGPoint)endingPoint {
320 | CGPoint center;
321 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) {
322 | center = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height-(self.popupView.bounds.size.height * 0.5));
323 | }
324 | else {
325 | center = self.maskView.center;
326 | }
327 | return center;
328 | }
329 |
330 | - (CGPoint)dismissedPoint {
331 | CGPoint dismissed;
332 | switch (self.theme.presentationStyle) {
333 | case CNPPopupPresentationStyleFadeIn:
334 | dismissed = self.maskView.center;
335 | break;
336 | case CNPPopupPresentationStyleSlideInFromBottom:
337 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height):CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height);
338 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) {
339 | dismissed = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height);
340 | }
341 | break;
342 | case CNPPopupPresentationStyleSlideInFromLeft:
343 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y):CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y);
344 | break;
345 | case CNPPopupPresentationStyleSlideInFromRight:
346 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y):CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y);
347 | break;
348 | case CNPPopupPresentationStyleSlideInFromTop:
349 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height):CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height);
350 | break;
351 | default:
352 | dismissed = self.maskView.center;
353 | break;
354 | }
355 | return dismissed;
356 | }
357 |
358 | - (CGFloat)popupWidth {
359 | CGFloat width = self.theme.maxPopupWidth;
360 | if ((self.theme.popupStyle == CNPPopupStyleActionSheet && !CNP_IS_IPAD ) || self.theme.popupStyle == CNPPopupStyleFullscreen) {
361 | width = self.maskView.bounds.size.width;
362 | }
363 | return width;
364 | }
365 |
366 | #pragma mark - UIGestureRecognizerDelegate
367 |
368 | - (void)handleBackgroundTapGesture:(id)sender {
369 | if (self.theme.shouldDismissOnBackgroundTouch) {
370 | [self.popupView endEditing:YES];
371 | [self dismissPopupControllerAnimated:self.dismissAnimated];
372 | }
373 | }
374 |
375 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
376 | {
377 | if ([touch.view isDescendantOfView:self.popupView])
378 | return NO;
379 | return YES;
380 | }
381 |
382 | - (UIWindow *)applicationWindow {
383 | return [UIApplication sharedApplication].keyWindow;
384 | }
385 |
386 | @end
387 |
388 | #pragma mark - CNPPopupButton Methods
389 |
390 | @implementation CNPPopupButton
391 |
392 | - (instancetype)initWithFrame:(CGRect)frame {
393 | self = [super initWithFrame:frame];
394 | if (self) {
395 | [self addTarget:self action:@selector(buttonTouched) forControlEvents:UIControlEventTouchUpInside];
396 | }
397 | return self;
398 | }
399 |
400 | - (void)buttonTouched {
401 | if (self.selectionHandler) {
402 | self.selectionHandler(self);
403 | }
404 | }
405 |
406 | @end
407 |
408 | #pragma mark - CNPPopupTheme Methods
409 |
410 | @implementation CNPPopupTheme
411 |
412 | + (CNPPopupTheme *)defaultTheme {
413 | CNPPopupTheme *defaultTheme = [[CNPPopupTheme alloc] init];
414 | defaultTheme.backgroundColor = [UIColor whiteColor];
415 | defaultTheme.cornerRadius = 4.0f;
416 | defaultTheme.popupContentInsets = UIEdgeInsetsMake(16.0f, 16.0f, 16.0f, 16.0f);
417 | defaultTheme.popupStyle = CNPPopupStyleCentered;
418 | defaultTheme.presentationStyle = CNPPopupPresentationStyleSlideInFromBottom;
419 | defaultTheme.dismissesOppositeDirection = NO;
420 | defaultTheme.maskType = CNPPopupMaskTypeDimmed;
421 | defaultTheme.shouldDismissOnBackgroundTouch = YES;
422 | defaultTheme.movesAboveKeyboard = YES;
423 | defaultTheme.contentVerticalPadding = 16.0f;
424 | defaultTheme.maxPopupWidth = 300.0f;
425 | defaultTheme.animationDuration = 0.3f;
426 | return defaultTheme;
427 | }
428 |
429 | @end
430 |
--------------------------------------------------------------------------------
/LawreyMCGame.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | ABDD9DA81DA17453008B25F8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */; };
11 | ABDD9DAF1DA17453008B25F8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */; };
12 | ABDD9DBD1DA17481008B25F8 /* Card.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DBB1DA17481008B25F8 /* Card.swift */; };
13 | ABDD9DBE1DA17481008B25F8 /* PlayerScore.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */; };
14 | ABDD9DC21DA17488008B25F8 /* CNPPopupController.m in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */; };
15 | ABDD9DC61DA1749A008B25F8 /* Array+Shuffle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */; };
16 | ABDD9DC71DA1749A008B25F8 /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC41DA1749A008B25F8 /* Device.swift */; };
17 | ABDD9DC81DA1749A008B25F8 /* CMCardDealerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */; };
18 | ABDD9DCC1DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */; };
19 | ABDD9DCD1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */; };
20 | ABDD9DCE1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */; };
21 | ABDD9DD01DA174F3008B25F8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */; };
22 | ABFCBC701DA4023A00A1DE00 /* Vanilla.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */; };
23 | ABFCBC721DA403F100A1DE00 /* Cubano-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */; };
24 | /* End PBXBuildFile section */
25 |
26 | /* Begin PBXFileReference section */
27 | ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LawreyMCGame.app; sourceTree = BUILT_PRODUCTS_DIR; };
28 | ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
29 | ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
30 | ABDD9DB31DA17453008B25F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
31 | ABDD9DBB1DA17481008B25F8 /* Card.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Card.swift; sourceTree = ""; };
32 | ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerScore.swift; sourceTree = ""; };
33 | ABDD9DBF1DA17487008B25F8 /* LawreyMCGame-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "LawreyMCGame-Bridging-Header.h"; path = "HKTQCard/LawreyMCGame-Bridging-Header.h"; sourceTree = ""; };
34 | ABDD9DC01DA17488008B25F8 /* CNPPopupController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNPPopupController.h; sourceTree = ""; };
35 | ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNPPopupController.m; sourceTree = ""; };
36 | ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Shuffle.swift"; sourceTree = ""; };
37 | ABDD9DC41DA1749A008B25F8 /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; };
38 | ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMCardDealerManager.swift; sourceTree = ""; };
39 | ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FCGameBoardCollectionViewController.swift; sourceTree = ""; };
40 | ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FCGameCardCollectionViewCell.swift; sourceTree = ""; };
41 | ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FCGameCardCollectionViewCell.xib; sourceTree = ""; };
42 | ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; };
43 | ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Vanilla.ttf; sourceTree = ""; };
44 | ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Cubano-Regular.otf"; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | ABDD9DA11DA17453008B25F8 /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXFrameworksBuildPhase section */
56 |
57 | /* Begin PBXGroup section */
58 | ABDD9D9B1DA17453008B25F8 = {
59 | isa = PBXGroup;
60 | children = (
61 | ABDD9DBF1DA17487008B25F8 /* LawreyMCGame-Bridging-Header.h */,
62 | ABF161051DBFA67800352B20 /* Fonts */,
63 | ABDD9DA61DA17453008B25F8 /* HKTQCard */,
64 | ABDD9DA51DA17453008B25F8 /* Products */,
65 | );
66 | sourceTree = "";
67 | };
68 | ABDD9DA51DA17453008B25F8 /* Products */ = {
69 | isa = PBXGroup;
70 | children = (
71 | ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */,
72 | );
73 | name = Products;
74 | sourceTree = "";
75 | };
76 | ABDD9DA61DA17453008B25F8 /* HKTQCard */ = {
77 | isa = PBXGroup;
78 | children = (
79 | ABDD9DC01DA17488008B25F8 /* CNPPopupController.h */,
80 | ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */,
81 | ABDD9DBA1DA1747A008B25F8 /* Helper */,
82 | ABDD9DB91DA17473008B25F8 /* Model */,
83 | ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */,
84 | ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */,
85 | ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */,
86 | ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */,
87 | ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */,
88 | ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */,
89 | ABDD9DB31DA17453008B25F8 /* Info.plist */,
90 | );
91 | path = HKTQCard;
92 | sourceTree = "";
93 | };
94 | ABDD9DB91DA17473008B25F8 /* Model */ = {
95 | isa = PBXGroup;
96 | children = (
97 | ABDD9DBB1DA17481008B25F8 /* Card.swift */,
98 | ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */,
99 | );
100 | name = Model;
101 | sourceTree = "";
102 | };
103 | ABDD9DBA1DA1747A008B25F8 /* Helper */ = {
104 | isa = PBXGroup;
105 | children = (
106 | ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */,
107 | ABDD9DC41DA1749A008B25F8 /* Device.swift */,
108 | ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */,
109 | );
110 | name = Helper;
111 | sourceTree = "";
112 | };
113 | ABF161051DBFA67800352B20 /* Fonts */ = {
114 | isa = PBXGroup;
115 | children = (
116 | ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */,
117 | ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */,
118 | );
119 | name = Fonts;
120 | sourceTree = "";
121 | };
122 | /* End PBXGroup section */
123 |
124 | /* Begin PBXNativeTarget section */
125 | ABDD9DA31DA17453008B25F8 /* LawreyMCGame */ = {
126 | isa = PBXNativeTarget;
127 | buildConfigurationList = ABDD9DB61DA17453008B25F8 /* Build configuration list for PBXNativeTarget "LawreyMCGame" */;
128 | buildPhases = (
129 | ABDD9DA01DA17453008B25F8 /* Sources */,
130 | ABDD9DA11DA17453008B25F8 /* Frameworks */,
131 | ABDD9DA21DA17453008B25F8 /* Resources */,
132 | );
133 | buildRules = (
134 | );
135 | dependencies = (
136 | );
137 | name = LawreyMCGame;
138 | productName = HKTQCard;
139 | productReference = ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */;
140 | productType = "com.apple.product-type.application";
141 | };
142 | /* End PBXNativeTarget section */
143 |
144 | /* Begin PBXProject section */
145 | ABDD9D9C1DA17453008B25F8 /* Project object */ = {
146 | isa = PBXProject;
147 | attributes = {
148 | LastSwiftUpdateCheck = 0800;
149 | LastUpgradeCheck = 0800;
150 | ORGANIZATIONNAME = "2359 Media Pte Ltd";
151 | TargetAttributes = {
152 | ABDD9DA31DA17453008B25F8 = {
153 | CreatedOnToolsVersion = 8.0;
154 | DevelopmentTeam = BXU3B85A8F;
155 | LastSwiftMigration = 0800;
156 | ProvisioningStyle = Manual;
157 | };
158 | };
159 | };
160 | buildConfigurationList = ABDD9D9F1DA17453008B25F8 /* Build configuration list for PBXProject "LawreyMCGame" */;
161 | compatibilityVersion = "Xcode 3.2";
162 | developmentRegion = English;
163 | hasScannedForEncodings = 0;
164 | knownRegions = (
165 | en,
166 | Base,
167 | );
168 | mainGroup = ABDD9D9B1DA17453008B25F8;
169 | productRefGroup = ABDD9DA51DA17453008B25F8 /* Products */;
170 | projectDirPath = "";
171 | projectRoot = "";
172 | targets = (
173 | ABDD9DA31DA17453008B25F8 /* LawreyMCGame */,
174 | );
175 | };
176 | /* End PBXProject section */
177 |
178 | /* Begin PBXResourcesBuildPhase section */
179 | ABDD9DA21DA17453008B25F8 /* Resources */ = {
180 | isa = PBXResourcesBuildPhase;
181 | buildActionMask = 2147483647;
182 | files = (
183 | ABDD9DAF1DA17453008B25F8 /* Assets.xcassets in Resources */,
184 | ABDD9DCE1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib in Resources */,
185 | ABFCBC721DA403F100A1DE00 /* Cubano-Regular.otf in Resources */,
186 | ABFCBC701DA4023A00A1DE00 /* Vanilla.ttf in Resources */,
187 | ABDD9DD01DA174F3008B25F8 /* Main.storyboard in Resources */,
188 | );
189 | runOnlyForDeploymentPostprocessing = 0;
190 | };
191 | /* End PBXResourcesBuildPhase section */
192 |
193 | /* Begin PBXSourcesBuildPhase section */
194 | ABDD9DA01DA17453008B25F8 /* Sources */ = {
195 | isa = PBXSourcesBuildPhase;
196 | buildActionMask = 2147483647;
197 | files = (
198 | ABDD9DC21DA17488008B25F8 /* CNPPopupController.m in Sources */,
199 | ABDD9DA81DA17453008B25F8 /* AppDelegate.swift in Sources */,
200 | ABDD9DCC1DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift in Sources */,
201 | ABDD9DC81DA1749A008B25F8 /* CMCardDealerManager.swift in Sources */,
202 | ABDD9DBE1DA17481008B25F8 /* PlayerScore.swift in Sources */,
203 | ABDD9DC71DA1749A008B25F8 /* Device.swift in Sources */,
204 | ABDD9DC61DA1749A008B25F8 /* Array+Shuffle.swift in Sources */,
205 | ABDD9DBD1DA17481008B25F8 /* Card.swift in Sources */,
206 | ABDD9DCD1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift in Sources */,
207 | );
208 | runOnlyForDeploymentPostprocessing = 0;
209 | };
210 | /* End PBXSourcesBuildPhase section */
211 |
212 | /* Begin XCBuildConfiguration section */
213 | ABDD9DB41DA17453008B25F8 /* Debug */ = {
214 | isa = XCBuildConfiguration;
215 | buildSettings = {
216 | ALWAYS_SEARCH_USER_PATHS = NO;
217 | CLANG_ANALYZER_NONNULL = YES;
218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
219 | CLANG_CXX_LIBRARY = "libc++";
220 | CLANG_ENABLE_MODULES = YES;
221 | CLANG_ENABLE_OBJC_ARC = YES;
222 | CLANG_WARN_BOOL_CONVERSION = YES;
223 | CLANG_WARN_CONSTANT_CONVERSION = YES;
224 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
225 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
226 | CLANG_WARN_EMPTY_BODY = YES;
227 | CLANG_WARN_ENUM_CONVERSION = YES;
228 | CLANG_WARN_INFINITE_RECURSION = YES;
229 | CLANG_WARN_INT_CONVERSION = YES;
230 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
231 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
232 | CLANG_WARN_UNREACHABLE_CODE = YES;
233 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
234 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
235 | COPY_PHASE_STRIP = NO;
236 | DEBUG_INFORMATION_FORMAT = dwarf;
237 | ENABLE_STRICT_OBJC_MSGSEND = YES;
238 | ENABLE_TESTABILITY = YES;
239 | GCC_C_LANGUAGE_STANDARD = gnu99;
240 | GCC_DYNAMIC_NO_PIC = NO;
241 | GCC_NO_COMMON_BLOCKS = YES;
242 | GCC_OPTIMIZATION_LEVEL = 0;
243 | GCC_PREPROCESSOR_DEFINITIONS = (
244 | "DEBUG=1",
245 | "$(inherited)",
246 | );
247 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
248 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
249 | GCC_WARN_UNDECLARED_SELECTOR = YES;
250 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
251 | GCC_WARN_UNUSED_FUNCTION = YES;
252 | GCC_WARN_UNUSED_VARIABLE = YES;
253 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
254 | MTL_ENABLE_DEBUG_INFO = YES;
255 | ONLY_ACTIVE_ARCH = YES;
256 | SDKROOT = iphoneos;
257 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
258 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
259 | TARGETED_DEVICE_FAMILY = 2;
260 | };
261 | name = Debug;
262 | };
263 | ABDD9DB51DA17453008B25F8 /* Release */ = {
264 | isa = XCBuildConfiguration;
265 | buildSettings = {
266 | ALWAYS_SEARCH_USER_PATHS = NO;
267 | CLANG_ANALYZER_NONNULL = YES;
268 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
269 | CLANG_CXX_LIBRARY = "libc++";
270 | CLANG_ENABLE_MODULES = YES;
271 | CLANG_ENABLE_OBJC_ARC = YES;
272 | CLANG_WARN_BOOL_CONVERSION = YES;
273 | CLANG_WARN_CONSTANT_CONVERSION = YES;
274 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
275 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
276 | CLANG_WARN_EMPTY_BODY = YES;
277 | CLANG_WARN_ENUM_CONVERSION = YES;
278 | CLANG_WARN_INFINITE_RECURSION = YES;
279 | CLANG_WARN_INT_CONVERSION = YES;
280 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
281 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
282 | CLANG_WARN_UNREACHABLE_CODE = YES;
283 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
284 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
285 | COPY_PHASE_STRIP = NO;
286 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
287 | ENABLE_NS_ASSERTIONS = NO;
288 | ENABLE_STRICT_OBJC_MSGSEND = YES;
289 | GCC_C_LANGUAGE_STANDARD = gnu99;
290 | GCC_NO_COMMON_BLOCKS = YES;
291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
293 | GCC_WARN_UNDECLARED_SELECTOR = YES;
294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
295 | GCC_WARN_UNUSED_FUNCTION = YES;
296 | GCC_WARN_UNUSED_VARIABLE = YES;
297 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
298 | MTL_ENABLE_DEBUG_INFO = NO;
299 | SDKROOT = iphoneos;
300 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
301 | TARGETED_DEVICE_FAMILY = 2;
302 | VALIDATE_PRODUCT = YES;
303 | };
304 | name = Release;
305 | };
306 | ABDD9DB71DA17453008B25F8 /* Debug */ = {
307 | isa = XCBuildConfiguration;
308 | buildSettings = {
309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
310 | CLANG_ENABLE_MODULES = YES;
311 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
312 | DEVELOPMENT_TEAM = BXU3B85A8F;
313 | FRAMEWORK_SEARCH_PATHS = (
314 | "$(inherited)",
315 | "$(PROJECT_DIR)",
316 | );
317 | INFOPLIST_FILE = "$(SRCROOT)/HKTQCard/Info.plist";
318 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
319 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
320 | PRODUCT_BUNDLE_IDENTIFIER = com.lawrey.lawreymcgame;
321 | PRODUCT_NAME = "$(TARGET_NAME)";
322 | PROVISIONING_PROFILE = "fbc7d51e-5257-4ba0-aafd-6159d91cc1ed";
323 | PROVISIONING_PROFILE_SPECIFIER = "Wildcard In House";
324 | SWIFT_OBJC_BRIDGING_HEADER = "HKTQCard/LawreyMCGame-Bridging-Header.h";
325 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
326 | SWIFT_VERSION = 3.0;
327 | TARGETED_DEVICE_FAMILY = 2;
328 | };
329 | name = Debug;
330 | };
331 | ABDD9DB81DA17453008B25F8 /* Release */ = {
332 | isa = XCBuildConfiguration;
333 | buildSettings = {
334 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
335 | CLANG_ENABLE_MODULES = YES;
336 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: 2359 Media Pte Ltd";
337 | DEVELOPMENT_TEAM = BXU3B85A8F;
338 | FRAMEWORK_SEARCH_PATHS = (
339 | "$(inherited)",
340 | "$(PROJECT_DIR)",
341 | );
342 | INFOPLIST_FILE = "$(SRCROOT)/HKTQCard/Info.plist";
343 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
344 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
345 | PRODUCT_BUNDLE_IDENTIFIER = com.lawrey.lawreymcgame;
346 | PRODUCT_NAME = "$(TARGET_NAME)";
347 | PROVISIONING_PROFILE = "fbc7d51e-5257-4ba0-aafd-6159d91cc1ed";
348 | PROVISIONING_PROFILE_SPECIFIER = "Wildcard In House";
349 | SWIFT_OBJC_BRIDGING_HEADER = "HKTQCard/LawreyMCGame-Bridging-Header.h";
350 | SWIFT_VERSION = 3.0;
351 | TARGETED_DEVICE_FAMILY = 2;
352 | };
353 | name = Release;
354 | };
355 | /* End XCBuildConfiguration section */
356 |
357 | /* Begin XCConfigurationList section */
358 | ABDD9D9F1DA17453008B25F8 /* Build configuration list for PBXProject "LawreyMCGame" */ = {
359 | isa = XCConfigurationList;
360 | buildConfigurations = (
361 | ABDD9DB41DA17453008B25F8 /* Debug */,
362 | ABDD9DB51DA17453008B25F8 /* Release */,
363 | );
364 | defaultConfigurationIsVisible = 0;
365 | defaultConfigurationName = Release;
366 | };
367 | ABDD9DB61DA17453008B25F8 /* Build configuration list for PBXNativeTarget "LawreyMCGame" */ = {
368 | isa = XCConfigurationList;
369 | buildConfigurations = (
370 | ABDD9DB71DA17453008B25F8 /* Debug */,
371 | ABDD9DB81DA17453008B25F8 /* Release */,
372 | );
373 | defaultConfigurationIsVisible = 0;
374 | defaultConfigurationName = Release;
375 | };
376 | /* End XCConfigurationList section */
377 | };
378 | rootObject = ABDD9D9C1DA17453008B25F8 /* Project object */;
379 | }
380 |
--------------------------------------------------------------------------------