From 99593874194e510b83004f91dbe71b7d1802890e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Thu, 1 Apr 2021 11:18:03 +0200 Subject: [PATCH] First commit, init application --- .gitignore | 37 ++ .gitlab-ci.yml | 62 +++ .metadata | 10 + README.md | 22 +- android/.gitignore | 11 + android/app/build.gradle | 92 ++++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 30 + .../fluttercheckers/MainActivity.kt | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1913 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1240 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2445 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3866 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5358 bytes android/app/src/main/res/values/styles.xml | 8 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 31 ++ android/gradle.properties | 6 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 15 + icons/build_icons.sh | 51 ++ icons/puissance4.svg | 24 + ios/.gitignore | 32 ++ ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 518 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 45 ++ ios/Runner/Runner-Bridging-Header.h | 1 + lib/board.dart | 155 ++++++ lib/coordinate.dart | 17 + lib/cpu.dart | 116 ++++ lib/cpu_level_page.dart | 90 +++ lib/game_chip.dart | 33 ++ lib/hole_painter.dart | 39 ++ lib/home_page.dart | 85 +++ lib/main.dart | 37 ++ lib/match_page.dart | 310 +++++++++++ lib/player.dart | 7 + pubspec.lock | 146 +++++ pubspec.yaml | 17 + web/icons/Icon-192.png | Bin 0 -> 5358 bytes web/icons/Icon-512.png | Bin 0 -> 17625 bytes web/index.html | 30 + web/manifest.json | 23 + 73 files changed, 2502 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .metadata create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100755 icons/build_icons.sh create mode 100644 icons/puissance4.svg create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/board.dart create mode 100644 lib/coordinate.dart create mode 100644 lib/cpu.dart create mode 100644 lib/cpu_level_page.dart create mode 100644 lib/game_chip.dart create mode 100644 lib/hole_painter.dart create mode 100644 lib/home_page.dart create mode 100644 lib/main.dart create mode 100644 lib/match_page.dart create mode 100644 lib/player.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae1f183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..c797e6e --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,62 @@ +image: cirrusci/flutter:latest + +stages: + - update + - build + - deploy + +update: + stage: update + script: + - flutter packages get + - flutter packages upgrade + interruptible: true + +android:build-debug: + stage: build + script: + # Flutter local configuration + - echo flutter.sdk=$FLUTTER_PATH > android/local.properties + - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties + - echo flutter.buildMode=debug >> android/local.properties + # build flutter app + - flutter build apk + artifacts: + paths: + - build/app/outputs/apk/release + expire_in: 1 week + interruptible: true + +android:build-release: + stage: build + only: + - master + dependencies: + - android:build-debug + script: + # Flutter local configuration + - echo flutter.sdk=$FLUTTER_PATH > android/local.properties + - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties + - echo flutter.buildMode=release >> android/local.properties + # Android signing + - echo "$ANDROID_KEYSTORE_FILE" | base64 -d > android/app/my.keystore + - echo storeFile=my.keystore > android/key.properties + - echo storePassword=$ANDROID_KEYSTORE_PASSWORD >> android/key.properties + - echo keyAlias=$ANDROID_KEY_ALIAS >> android/key.properties + - echo keyPassword=$ANDROID_KEY_PASSWORD >> android/key.properties + # build flutter app + - flutter build apk + artifacts: + paths: + - build/app/outputs/apk/release + expire_in: 1 week + interruptible: true + +android:deploy: + stage: deploy + only: + - master + dependencies: + - android:build-release + script: + - wget ${REPOSITORY_UPDATE_WEBHOOK}?token=${REPOSITORY_TOKEN} diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..4adf4bf --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: f139b11009aeb8ed2a3a3aa8b0066e482709dde3 + channel: stable + +project_type: app diff --git a/README.md b/README.md index 4a66e3e..aa41f0a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,22 @@ -# puissance 4 +# Puissance4 +Four-in-a-row game in Flutter + +## Game modes + +- Player vs Player (only local) +- Player vs Cpu + - Dumb + - Hard + - Hardest +- Demo (Cpu Hard vs Cpu Hardest) + +## Getting Started + +Run the application to play :) + +`flutter run` + +## Contributions + +Contributions of any kind are more than welcome! Feel free to fork and improve the project in any way you want, make a pull request, or open an issue. diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..0a741cb --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..2a4d602 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,92 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def gradleProperties = new Properties() +def gradlePropertiesFile = rootProject.file('gradle.properties') +if (gradlePropertiesFile.exists()) { + gradlePropertiesFile.withReader('UTF-8') { reader -> + gradleProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def appVersionCode = gradleProperties.getProperty('app.versionCode') +if (appVersionCode == null) { + appVersionCode = '1' +} + +def appVersionName = gradleProperties.getProperty('app.versionName') +if (appVersionName == null) { + appVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "org.benoitharrault.puissance4" + minSdkVersion 16 + targetSdkVersion 28 + versionCode appVersionCode.toInteger() + versionName appVersionName + archivesBaseName = "$applicationId" + "_" + "$versionCode" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + debug { + } + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + signingConfig signingConfigs.release + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..11f0e99 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.benoitharrault.puissance4"> + <!-- Flutter needs it to communicate with the running application + to allow setting breakpoints, to provide hot reload, etc. + --> + <uses-permission android:name="android.permission.INTERNET"/> +</manifest> diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2db8d6c --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.benoitharrault.puissance4"> + <!-- io.flutter.app.FlutterApplication is an android.app.Application that + calls FlutterMain.startInitialization(this); in its onCreate method. + In most cases you can leave this as-is, but you if you want to provide + additional functionality it is fine to subclass or reimplement + FlutterApplication and put your custom class here. --> + <application + android:name="io.flutter.app.FlutterApplication" + android:label="puissance4" + android:icon="@mipmap/ic_launcher"> + <activity + android:name=".MainActivity" + android:launchMode="singleTop" + android:theme="@style/LaunchTheme" + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" + android:hardwareAccelerated="true" + android:windowSoftInputMode="adjustResize"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + <!-- Don't delete the meta-data below. + This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> + <meta-data + android:name="flutterEmbedding" + android:value="2" /> + </application> +</manifest> diff --git a/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt b/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt new file mode 100644 index 0000000..c63f773 --- /dev/null +++ b/android/app/src/main/kotlin/dev/benoitharrault/fluttercheckers/MainActivity.kt @@ -0,0 +1,12 @@ +package org.benoitharrault.puissance4 + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity: FlutterActivity() { + override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine); + } +} diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Modify this file to customize your launch splash screen --> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@android:color/white" /> + + <!-- You can insert your own image assets here --> + <!-- <item> + <bitmap + android:gravity="center" + android:src="@mipmap/launch_image" /> + </item> --> +</layer-list> diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae54846b522bf3c03e558b3e5a6969a9d1cd9cb GIT binary patch literal 1913 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 VajcrxxY|J#p{J{#%Q~loCICfCj2Qp` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2d344c1d18c48904fa2b9c703cfd8db2b9c84703 GIT binary patch literal 1240 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_I14-?iy0UsmVq$i?8^I* z3=9mCC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NHH)l{toa7ab<vk1_p*u z28Pg31_uWQ2L}gZV`FV??NDuPPZbph1qDkP8B0qUV`C{dJv|3)ZEJOPa}^a&6%`jH zB?kos8(ld|Z5c~#ZFg;LXAKQ2Wo2g_MF(vKTTOXOH8lqn6+2~R2Mq-~b#*Hh6(<!H z2W@2=4JB)J#RoxZ5B!w=6uJK?b^jQw^e<lTf1=)}V5O%4%FhFp|K-^I4O99Tru08t z>3@XE^FRng`G17U|47yUQL6u=)c!}S|Buo5AEWs{R_lL)?*9b6|B3qllMMbR8U9Z( z`k!L_Kh5lay7~Wfi~kvx|1&NBXIcNxwf~>*^uN&cf05h&V)y^mf&XiR|JR26uM7QO zANIc?;(uf0|E8$_P0{~b;{LbB|8GzH-<SP=Lhk>m#s8<3{GV3(e@6NLSylh%HT<97 z@PB^e|Aj68S5NrAX43z)lmD-q@_+r*|Ldpy-!T3E#u@)N&iub=*8eSY{%@W8f5*cA zI~V`ov;6<QRsRpH`G0uB|05g!pV;>Q<c|NRcKtuS`~R8U|Ih9Jf9df5OGo}+IsX6Z ziT~G5{=aka|NX1~A6)zY@W%f~H~&Ar_5bnh|4;A!e|GQx^9TQ5Kl%Uq>Hjy+{=a?x z|Lu$aAK(1{`1b#&cmF@V|NrH~|1Tf^fBp3T$JhTqzWx9C{r|6@|Ns2{|L4#DfB*jf z|9?zJdm#e@gJnsOUoZnB6B9Et3kxe78#@OlCl@ylFCQPjfS{0&kg%Azgru~Ltb(Gl zvWl8|U{G-IqsNb*Jbn7~@87?Fca{8Kz`(#H>FMGa;?cSH+Vk+s2_nZos^=OW6bsB+ zxkLS3FVl352QC4DcdDmb6)r60Kf)NYL62*T#;qsc(|;Xun{?&*$>N%a-(%11oL_ut z&yMXqfA@<NzRQev5Dj}$E^ySo@Y59!%k3U1UKvfXYu03aU6a*n^v^EaW6{-BU!(RV z^zy9WZ0`~|CJ}sPQ<h|a?RJ|N$vuXy-KQE)%~Y*BCK24V{B)!0X0@jWc`P@Sl)b!v z@Lk1qhqNXCQ}?)XncV-|S+mn!_uc~^F$cYycjuZgr1(`g&S0$Bvt@F}3e9hv26|lw zSIV5}t9rfi-?Yv<oPrrrjgp)HUnon+XlE#4DxY)zlU%`U{%!vcJlFNx@KyWRw!(v~ z4~%y1;+pfkN!=j&Zo>S|<1rujn%`9}GPzge$hEh1fw-ogghRZd$D;Y%_YzhJ@H{pZ zw_)Mi^_-uPf5!uvg1fwV4Cy-;7&c#wJ@@ljzC_*wrd@0{>o=djzL#O0fV|1FhTp$_ z?3u@4XTrfCE5W+!TZDggJmXC>Ax5j2tozjaUb+0*ctm1?rC*Xm?t8`q9?N+dUflMN zYcM;`zE<_a(puq4W~IL;&ZgVi`djl^+s$Ao*u;1<^e4NA-s7X!jKU5VCH&j+XBU5q z*@=eUi$Pz%a|SVGryf|f;ML~7JD*Co&RZLwwtG*P*u2dNfvWpkKWjPF{hrIma(a<y u)1rw&S4(e(u8o+mjFs!3O~uiF8{;=#+3+G|YjrTFobhz^b6Mw<&;$T)Ltk$I literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66985645d09ff2ddf16a8980040b8cde9dabd822 GIT binary patch literal 2445 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 Uy7%H37#J8lUHx3vIVCg!0OTfiO#lD@ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c870678b3e390629b827e52a03c19e7547fe56 GIT binary patch literal 3866 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..704152c09c843a0a90437522ffe11f9b5f5eef04 GIT binary patch literal 5358 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Bd2>3_*8t*cliYI14-?iy0V_W`i(e1oy*o z1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<`Psy$sCLn>~)oy$E% z<m$}hvwf%C)w$Vgcyn$8$7NezfBxRhIccKp*UfmmnbO!Mm`FJvkq8h<=J{lD%wm?r zW4Yvx3==!1XN4xaR%b5?e5~A=ZIaz{(y2qEv!P>wjhjTvL&MLxe_wx_`|{;+pHTnM z^3bpUt)JKPv6n1+b?<%o`||wS`+FA(^tvs+m|-G?h0433uqw&5efbJ6#zhyr|A%gi zTIrzWA0N)cQ8_ox+(%2KDqMeQ(Nv$dd%i!NfBw>6-p{-B8^7~|Is0#aELC3N<~=Jb zBjZQ5){RTGyqN~S7!@tf-GBSzS;xJ{A39x<3`~@z{z_}z@LKwNm$|^PH5a8@92h2C z|7k31Keg;vO6k}8PQ8cQ_p@h7n7w%~CAH$fi5LENw+sA=VqTbNklxbZ7;xdIuw-Ap z)t-wUmtVhbR}t>~?j)R*{ogM7@uG|M3;ryu`MdnL*k7By`?5OPnCvESDX{Ey`=9gt zdS8Fr1-|~a*<zi0&i~jhJSlm#|BQ-L9p8fw3j7lO+x4&Y!gVe-)~0!azZwthU%bEU zU&yVWA1_I8KKQZhvNZ3N84`6#!8ZRIQ*^#LW(1l1>JKqk@>}F@cO9F^Oa%p|7tBoe z&obTRuSq%SE;RS_xd`Rev&>7@X5G8Ib=6ac_*XGkFZr=X*ZyvJsH{Evy1aSKvf9*Q zCV?NhVg~Xh$y%m6ijSU&P6<72xO0uG#;I*#XRU7S%z1WJI=J&-T_k^rb^Z0OXUng6 zn{>w*xu#rPsr0;G)N=j2MO@r=O!1B950vxBzlth6Cj9+b`vGHzFI6+nJvGiZo%^5L zbE5yXt~sI$HGa>M54TJCG3jBjdFs;O3Z|AhU)q$tm(5LTv+b6?**L|xNni5eggD^} z)z+kdef+UWM{<fTs+37RU1Mh-X*K=aj*Y)p7oG~T3+%is%~PuT`-R)jBN}BAPuHB2 zRE<5ImUF^);fdM)PqbKAFG)K+v)iv@S1WJbQ{)`m?SFr=e(Rzs@e|m;PQRzXeXL}| zW{vPI31=R@5$OtgE+kq~_qX->j8z;APs1ciBA!dWH0kmY@S5m0(R{nQ@!o?K0Za}% zg_+KFm&~YieK|*o*J<S?jUrH#9zQI=aLSjVBu?;CCxcU&UZ8*2%2oOWMPetce>Gc8 zy&7rH!tczW5ze?m+H#Ag%sM6xk2QyTF7P^9t-f-`%<nu?A9F(Azm@kE+b0<oTN!n{ zvC=MTnd`cf)xk(gHt)x+4JnI$IX}+M`ll((#B)fZr&ME#*HW2S?vy2F?Nz=17VsNN zE>mT4*vaLvXIE8{icwOQPMJ^|v%`fM9&<95U0I&q_-1RvVulyC^|4nj<s6B7_M*Ru zUD-^TVan?62N60+P7?wI64V;*e?7w#>U@Wzx#-dVc^}-5{;Oa(lFHIhB;0VabYkG+ z#TTU<40bMi_QbQa)N(V!BB8w!=Qc~5eE1R1JVEx~14j;qr)mtsS%<eaFc>$^W1V%Z zW%UNJ6D$hntqxc+d^-BSg29G^aY4*nMz`KovnBeEEL)b&sMA#{(c&x7@_6QJhH}P? z5QZ79Zz>obgUtF=-f%IvCsJYNicY_EYk5~2WIPFIxi9SAQ?Z}Z!MT$m<3tpLFvF>@ z0vb}jD#=$1TO2JJ<}6~!&=Y5<5MXlH$;)tP!I@G9u|rY}IVVz>8op{VE?{ClFy-P- zh6jfu%ox(D{8lnth+e?bQ1sV1BKEArUV(Eg4Av7^8k87N@PZht-EL17bt=VMhd()| z?JD<s--*xtoonjdp6I`Jjk~Y2sk(jPb=Pgu_4od;f6f2@d&P<K*ShW$ww?%o-d$5> zb9)lQ4+jgbXWpA#>q_RHkgroM`XO6*hHq>4pLd=U-^VL&`jpHT6UgMiu%|GrH)eal zlbh`>_be4uH-9smxcq(iW^dNH2VEHUED}v$VUYS?PILF$yQ-fi-*%bir_R7~AT`#~ zzf~zV_L1jdsYj=aIT;uWA~;Ors^V&rU;lSs@->Iafq_lq%>kS58-83fh)z`RVh~`c z?!G<a#IDtI@1E40UMlgv;Qn^zLVspPjn--BL#n?xZq}7{o#vy=z_Nh<?w%_WhWwrh zyvDa?sj@UMJegyq^XW|UJL?Avo0Zn@)!Fp(d)D!1=KUHE&;PLg6Rmk@o%(yhpI0)N z92j_F3ubZg&)LTOdrI;8T+yAsCLe3sb@ARK=}dv_^+78I*>BCM-xnSy68R&MDc~YQ z%%6NE>+M$0Lw0YI<UV)xmGjKWFS&k1dNdwL`gZpEoa(qWrFQ0x3?V8E1(&vMXM5*z zyszueBfE*~mxM6IXij?b!SUVn|10ahJLI01-uJW1hhdJ8)t=gh#G@CLmHh9--V+q5 z{?ork`o|&JhqL(0Iyf4F{Wh1Ue>~S@!lAM#*5aJ?`;vz*nd6TrZ#i^ck%5top?hEB zn~(cHuJY>s@alK$SI&uV*NgnGyU}X(Kc2%uf$_lf3)Abv_Y~VyP2aWi&g+MF|5#0& z|9``e?|&W_Yn`3Vz{1ne{$6LFMC#Y0|9%&g{7stJ{JXpQ`R{xshDN3b_Iet6tv}bk zRf^B~l>h6%r26pG>D#Vb&Q-duqrlL}z_8ooXpM){+&qC-g&Q~A{iXi<{r>v(Cmy*m zJ*Z}wAf10bV8OeGM;GKij1B0B_pvf%{9wq?arf=5bGl01e!Ow6R}ZmGl&#-(Uyehb zvw@${;=M?ye)jf#-xhfuT)W!Uqg{W08Bcac@o@o$`-~qh$eQhcQ?{aJ_5$%Q@n+t& zN4F*O-|=CnVPz28SN1ujKp=Ff%=0Fl;N8v5>|#e)4y=;fc{+}L@w@Gp{MH`UEG>Jp ze7hh+JVV2uf6DE-DotBgvL-E^yQOW5fXcy}D|O?(tY<m!nZf2qY_;<3wc6U>_nf`0 zzx{gH|E+Bd6;cdSe%}1~r~l4^peG-y%|yCZ<;#_&oi>`M=g2VU-goyz&!zKs_3#8) zx5+3oJqToot2tHWp7)1$Zv5+|_oMR7b>?w4urnUGe*5w9HRVgDfBxmYHrqaTJ<ArK zqhDASoZtI4?DgCoxx#bpqRY54^L`64evo0%w@KW~TwkCoYZtxa#^J~JeK{QBw{MQP z``2;Z?{w*xA1o`K+-8@^ZQmyy(iWY?;h^|1OUc^3{qn=lulvtO<sUbC;w#9YzAXRF zX4iE63w`%D-0Lf^?PaK7V~}xt@o?g4`<aV$uigH5-CmVp9^-*md~VgzNAGROsMY<t z?d#)foDJ*@4bIB3*Sr4yn_lwiUyF9!TD9X-EqYrRM64cMTlFwQ#H!MM<&)QIwx@UY zx2iDw{POklnsSLv@-Ls%a<@88+rO;7i(!gv!)(2+_Yyt+ESmgX_fBfU)x13|3{zwo ztd*}Vz5MdQ-^`otwzGvC8Q6A}%eFMH^D3;`_H@dm^}-FCm>aZISC{>Zu-Y-zdCMB9 zyfumpscZ+%eN^A^f4bkj|C+a^aX-yhXGmp#(D**${RY<L7Z1YtL_WXJyu_j~|J}ZO zRqd63*hJ2!v__deNf2x>Voq2t@NCk`k^*h_Rnc3m_d7A1;yX}2E&Bb2)905oe_yWs zEGqx}>}f&`o0tp!wwhVJ39_o#FE2LzmW5@NAftvg!|C)N&l1$*IoKaYnYMVdEI7mP zAjo3%(wg&jF6`y2wmtgsagzKbR|YQ5@;gzx{v>J3-r2bA&Y>!X^9%{5?XqG|xDC8! zvIVxip3Ko8%>F3pddInW@!QvY_!7E`<v{1GhUM}L7K>jp=8wuhzW$s#!#qX?O}?;x z*CR)-KUaJ4=BCqZ8LN!H$0X()@nx_nF_P)C`ktZKu3z$4eC>AmbNr7^7RWIl@QX6( ze$2jY;)loiLJa2_H`FZq%6Fuk`5Eh1j@-nr(Oo|obEFtQJo(EI{Xb=|@cdtfvhlCQ zzenbq-_bbyo6&}g!RyN!DY3JE)E0dE_cliJ_ueq32aybVGRy5QMsHPrugFm5R?j1q zx<_*ogGH^MMxWRJPj^oF)xLZ6=}YATmILbweypAAclX<*6PAm$KFb8md7oLi;YE-% zFUtXT^P{(KUTXfkfhoUdWAPlGH{1KC|DDO%ARX#!we@>fe|X>Lc)R2G4vDvUdvG-P zGc^2rpII%t=XYtTn%{-F|BdC%?v=Lh-B$Uq(BH<IaYN`GTi+)y1gm9vGfq_qS9zZM zb5Jy}?9GY9QYLf850VUJr+*ujTQya5vYq?%|LWgww-@_l^0ORR$#Z=Bw%hN&%wNkZ z$55fZyKU9_pM^{hq8SwKaP<GJ+x_jc{K~b56mrTR#lDd$YPKnxW5cL%^ke7E==#(X z)#dLFH0-eASRnB^;Ds{-n^w(>s+T_>$uO3(sqW)CA^31+eBH(!<;R?EHosP2GPq!@ z|NXu0ImH6wU*>j?<)81*TUhlhY0X>TiQImlpHvGnsM}2_mC-t9IDzZKi&&-k|I*)E z+0ElUpP??gBz)%!$BCh5=hfOXJ!mnQbo->lSxLqFLOUxnPp;>98*Z_z;QhHr_qpTS z)<-^gIkT6+qHMvtO^@6?b7#i|EDxOWJN5%l*{g-zsYloCyYYFUEMq}Xd0gb3ZyDSE zrtUq#J74?lTjL+GKj!|p%WRrces9+)@oZ_P2R}|;>Rx-_=>B}!n&>B;yIt4Kc^+4> z<%_Zs|2?fw-}2JuNv>47|7%aa*msr#Yxz^#?+d!;-q$N-5ciAv?X<~4;luw2|Bs$O zaQ@Kwl1qH=%oA)+hez*bIiQ>PeDRDaoU7aBs*B8ju=t99Uhs9RwR=x-*oJ9=D`V+@ z(toxeeHRwF(L65nJLB&)^En!3Tdj|Kva?<FL))al`Elaj3|@+N>hiWn9N}-<dT!V1 z+PT+V7`!S^h;6fMPLi&R{d7Bq!$IKF^N$C!|I7Wivb!X;=f}l9h97HMK0JKCbGJt6 ztqGSt+~2;U)VJYR6T_5XZfTcyzqj48`?BWo_SNrM8q6AM9T@f~h@89s**8@8sp#!} zkx$sKv*jI8XNbF=s;kt$M%(UemBO`q*FHbp>2zy0L&eW6t=Be(cC;LlHs2PwvA45Z zGhk(_agWvq6Kkdi%U`#xvvYsar+tN|aq_EzzbmFbu~u3B_SQ1Jj}<TYCf?Q$FL-G8 zgeyOsNkGIxZ0@Raw;Z|H&KVt@zwyMk;=hKB3JfA(oRA*K(y)kw!Bvo<i_47R<i@M& zD#;u9g&0odGA!%qQ)4*rWY>umJ`4s7!VFp;7<@XOF&V5}mzQD2aLV4B$H6G@uOgGf zPR@phFBVVU_{xG|MohHyyqMr(BepnRhChbF4Ix@z^{z8y<jDM+m!kABE_s(CL&!;n z89~zPeATiRovhfiOPoPjgn?I;IbjD=LX^s<eakBTF#9GS3T0_1DixIJKDv=XPQLe= z%Hyk7PiB-@u*DTKn6V`ZHzevYH|)@w>cMl4Wr3mLAD1;pI2oS4k~$#qSKYnp(f^ej zZ+JfLX%uHR_#^O-V}A*2g8&1^SB8eE-@g3%r5I81VlAi>!^x0TZ~JTYhvj)1Z1;}2 zJUZgT@L;|gL)-o~83u(b(hV1O3uiLS+AMYm)c9xU`BPA5`|I@w_xB9G>(@&$?Kk-= z%)Iq7LxL3}!_RAs9L?Z{fAH%=%7&k^pP!feYy7z0oZ-b*fp?tEtJ-F4ZrI472<mAh zBwy_2kH7U(@VD}>fW`HHCop~7U(ArQj@c-kaj%$x+?M9Kt~<B!Mwu671Y5+kepQ<j z-)>j+rCj^ZOIC+$DJF&m*O{K_o69ZgW(d$*8C=V5AS?gSOsOyLx&Lze7f1CEl`Ln} zu;5-|q+nsz&k*qLg~zD~7HMTW8F|C~l4a=@^<{77Z~gmHhhZ(Ng2j(QCWoDizwMmJ z*Yo4n$BoRHd51*G>fGJ`2Z;Gv3Mk0jvb5gRKi75V!r0B(WyyzGC%P?rtiJ2;yry&S zB^YWQ7Ho6-Z==0wqw>*ni{^wL-_s$nZ>ytq?Xt(yFa7-8!cetUbx+!9o#LbC`WDZL z`g3Y^n}2R*=bCe6RhK^opZf0g^v_R)7i@{?pF56dpPiVz{%qd~LnjB`fDa3EH)k3A zlD}(}9x}J6YU|;}p$9(3mj1I-G)UTNIy*{f)6EO}j71N=@j3Nw1^@j<{=Ijae%Noa zGCp&%;8#swywG!fjzfEonWWl$cwF(p_oeuOo(;u(u3y*ZZk~ER<9=na-;<5i!V3@n z?fI5k_^0Xi5@}wJThH9W@^e>OZqxj0B$DcWJI%H4?Of@diMn<LPwTFHn(|ouPehqQ zX!LEf?Z4V$iw{Yc&5^vf`|yI<i?~jG5d3lKo$>1ZUyt31*yG^Uyj*7A3NE9R4=)#o zOn6`-7g@J;>%)~7GkPOG$n+mMb7^}-sZ6NDgh(FWpH92ZU#NfK{zd(l=+YjmrIL|z zJ#w<W#J4<I{h~;D`SK^58RC>Csuzn?-towp6;S=jz@b4V-}w6N428`v7)$53ongv2 zHT_a;M<egwEWV<bQ=T0w@iJy}dh+dz$MdgW&b{EV47wOv#<0tOl85@)m%kW=nUYx? zQu&MaTr^1A*nH9BnMR<sQBK(ZV7sd)Hbm~u=GeT)@<i$qlhseQO|EkL-?pa5Z$7hu zhH<gU)KJ%HoQy@g&$1ahDfRHA9c1R3$IHldYX7Cb9d=jy?DdqF?hLToAAeZ>^jBsn zrj#Euc_*?l_BKZz)G7BqZS$+?(_Ew90uS|mZBOtjo>%iPY`$)t?p6LT4hya^r!h<L zG74PKSpKkMs);~|!IdfRg1_XKc^R`gzx|W<{PXnJk0bo9t!QH~l$T;qZfIlVO}<u< zw2-HFY0c_aaxd$2r(Bxz%6_%+lW2}jo83%VDhh>Jl36m$5?2@{o)D4h{<M74Z=vS7 z;z6@c8*!JU_bw|+XXb5YQ<{GvV~Tyq3jR|0YQ?2Hbp%?Bf|eUfX9$?^1Ze5r^$0PT z;`KfM-jrtnl|i#kPtutl>%1Vn#pfm4qNc@f?5<V*iR_cNc&^Xl_`T=CEM6ATil?5L zdfs;X!yP0<PUZ4w{g8Un{^ndzvqR`Qt$Qz6O3F}%_wsK1XXfwQ*y`}eDv^PKfx*+& K&t;ucLK6UAR_(k1 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> + <!-- Show a splash screen on the activity. Automatically removed when + Flutter draws its first frame --> + <item name="android:windowBackground">@drawable/launch_background</item> + </style> +</resources> diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..11f0e99 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.benoitharrault.puissance4"> + <!-- Flutter needs it to communicate with the running application + to allow setting breakpoints, to provide hot reload, etc. + --> + <uses-permission android:name="android.permission.INTERNET"/> +</manifest> diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..3100ad2 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..51eb66b --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true +app.versionName=1.0.0 +app.versionCode=1 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..296b146 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/icons/build_icons.sh b/icons/build_icons.sh new file mode 100755 index 0000000..4d4b438 --- /dev/null +++ b/icons/build_icons.sh @@ -0,0 +1,51 @@ +#! /bin/bash + +# Check dependencies +command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; } +command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; } +command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; } +command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; } + +CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +BASE_DIR="$(dirname "${CURRENT_DIR}")" + +SOURCE="${CURRENT_DIR}/puissance4.svg" +OPTIPNG_OPTIONS="-preserve -quiet -o7" + +# optimize svg +cp ${SOURCE} ${SOURCE}.tmp +scour \ + --remove-descriptive-elements \ + --enable-id-stripping \ + --enable-viewboxing \ + --enable-comment-stripping \ + --nindent=4 \ + -i ${SOURCE}.tmp \ + -o ${SOURCE} +rm ${SOURCE}.tmp + +# build icons +function build_icon() { + ICON_SIZE="$1" + TARGET="$2" + + TARGET_PNG="${TARGET}.png" + + inkscape \ + --export-width=${ICON_SIZE} \ + --export-height=${ICON_SIZE} \ + --export-filename=${TARGET_PNG} \ + ${SOURCE} + + optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG} +} + + +build_icon 72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher +build_icon 48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher +build_icon 96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher +build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher +build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher + +build_icon 192 ${BASE_DIR}/web/icons/Icon-192 +build_icon 512 ${BASE_DIR}/web/icons/Icon-512 diff --git a/icons/puissance4.svg b/icons/puissance4.svg new file mode 100644 index 0000000..f285de3 --- /dev/null +++ b/icons/puissance4.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 28.747 28.747" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="filter6206-7" color-interpolation-filters="sRGB"> + <feGaussianBlur stdDeviation="0.658125"/> + </filter> + </defs> + <g transform="translate(0,-1093.8)"> + <path transform="matrix(1.0781 0 0 1.0641 -.093733 2.7509)" d="m4.4177 1028.2v1.6051h-1.6052v18.192h1.6052v2.1402h18.192v-2.1402h2.1402v-18.192h-2.1402v-1.6051z" fill="#3e2723" filter="url(#filter6206-7)" opacity=".2"/> + <rect x="2.9987" y="1096.8" width="22.749" height="22.749" rx="1.1973" ry="1.1974" fill="#ff5722"/> + <path d="m4.1958 1096.8c-0.66332 0-1.1979 0.5346-1.1979 1.1979v0.3334c0-0.6634 0.53459-1.1979 1.1979-1.1979h20.354c0.66332 0 1.1979 0.5345 1.1979 1.1979v-0.3334c0-0.6633-0.5346-1.1979-1.1979-1.1979z" fill="#fff" opacity=".2"/> + <g transform="matrix(.37344 0 0 .37344 4.7333 1097.4)"> + <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/> + </g> + <g transform="matrix(.36471 0 0 .36471 5.1356 1097.4)"> + <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/> + </g> + <path d="m24.549 1119.5c0.66325 0 1.1979-0.5346 1.1979-1.1979v-0.3333c0 0.6632-0.53461 1.1978-1.1979 1.1978h-20.354c-0.66325 0-1.1979-0.5346-1.1979-1.1978v0.3333c0 0.6633 0.53461 1.1979 1.1979 1.1979z" fill="#3e2723" opacity=".2"/> + </g> + <g transform="matrix(.29602 0 0 .29602 6.7952 6.7952)" stroke-width="1.0667"> + <path d="m0 0h51.2v51.2h-51.2z" fill="none"/> + <path d="m25.587 1.3672c-13.298 0-24.044 10.772-24.044 24.057s10.745 24.057 24.044 24.057 24.07-10.772 24.07-24.057-10.772-24.057-24.07-24.057zm0.01337 42.768c-10.331 0-18.711-8.3799-18.711-18.711 0-10.331 8.3799-18.711 18.711-18.711s18.711 8.3799 18.711 18.711c0 10.331-8.3665 18.711-18.711 18.711z" fill="#fff"/> + </g> +</svg> diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..e96ef60 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..6b4c0f7 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleExecutable</key> + <string>App</string> + <key>CFBundleIdentifier</key> + <string>io.flutter.flutter.app</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>App</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>MinimumOSVersion</key> + <string>8.0</string> +</dict> +</plist> diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8315dbd --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,518 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = "<group>"; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = "<group>"; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = "<group>"; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = "<group>"; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.puissance4; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:Runner.xcodeproj"> + </FileRef> +</Workspace> diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1020" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "97C146ED1CF9000F007C117D" + BuildableName = "Runner.app" + BlueprintName = "Runner" + ReferencedContainer = "container:Runner.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "97C146ED1CF9000F007C117D" + BuildableName = "Runner.app" + BlueprintName = "Runner" + ReferencedContainer = "container:Runner.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "97C146ED1CF9000F007C117D" + BuildableName = "Runner.app" + BlueprintName = "Runner" + ReferencedContainer = "container:Runner.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Profile" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "97C146ED1CF9000F007C117D" + BuildableName = "Runner.app" + BlueprintName = "Runner" + ReferencedContainer = "container:Runner.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:Runner.xcodeproj"> + </FileRef> +</Workspace> diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 QlAxuUp00i_>zopr0K8b=b^rhX literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqpR#^NA%Cx&(BWL`2bFuwD2 zaSX8#TsvjAw@jeOvGY5>_q|>h+1u6fBdexi<)tM8-3iJOH-6e{csS^|t`^`h%M4z^ zvrUsp%yCUni-1dr!HteCeu1-6sf(@4&z-gOX8TrnJhnM~hPD2_`!&xEoBNpM46ZP5 z>RM6Fs4Du%wQt&V4?nF#Au;N4dCxlR<XldO9-6?g%eZUVFOxLhq?If5795yX*H)3r zcr-L!Dsz*&v#QSl(?&xbdB=-h`NEg}1Tfsq{4(uywXxqq5w)$a&)ne^j#c_lpTP8G z*_&ovJMIUWi|u_Gk1ED$Xa95SQ_5@D^>EhFOs+Q*8UNIXwA$#oIyO8|+tqV&R#9*$ zUnSd|Hw&5HJe<YZ<N71*xK-Ib1>-|^3yuFWnr2?uxcNuK(*U^*-n;k6AAGamV&=3x zQTjVJM+cmBEL?H-jDy2s*;QO>QThRLANE|lxz@Sy?+%4F#V^}4%*``0mhkR1xTsnd zsl4K{bVpgeu!#g~y%YEC?D&;me>Lr&{KSK$>&ee#llSpUG=!hMOnEB&rtbEo$NBpo ze0#XwfU{CPz~%7UQ+uQ}ChR*S%%W*wac<_u>)Jc^mA`9MySCxd!B^Kd#zy?>WBq3t zA?<j7a@z02UrV#jFFU2SH1ENFaf?TqF86c<HRj3ddVAgxk5KwL|Js^`@zZL)>x*4_ W$LnK$#EXG}fx*+&&t;ucLK6TGg!*^@ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccbfd967d9697cd4b83225558af2911e9571c9b GIT binary patch literal 1283 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2y{PI<aGhE&WsI>R?dBvs;g z{d;TUyFpPJ%eF4Kv7n|^zp=ULn1t;EM$XP7lUeld*i<WYMHn1eEM+Rk!LA?E!ztJy zD8yIC>OAGhrAO=?vmAmpT<U+jYxid3dVb^0cemaCn{#@yPnp^KJ?}ry{%?H#%xAl{ z8!DE^W+>R*XMV$8#$?-Y`cDL-1XCS@pJejB8Rvppy6eq7etCUAujg?q<WvaP_dQE4 z{y3yycZjut%lnV#r5Q_NT~$>j6J!e{Uv#AAYb{|~a_aH522J@Q@fi&BOpfuWHHbGp zf5x@0=W&%z;t#%xYZ_i1#tsY?XV=JR1*ru$Xe%q8GYMi`*I43cb15zIa$ef*g)OP` zxn+8uo27Eb>{9r}R#PV@sJksCu`zk^$I#qqi)ZJWE@$GC^4#7iY9ct-)8d8n31bVb zX;lK#VjdrPy!sZ;@og0)Rhw5$KOp&F-NcXuofoDxM?Z25Q1Tbd+xYNCT0eV~Php(s z<cV5Oqt_M$Mm(3`W4LW2^O=pEcVCd0)6OHW!U}d3U4JIHF7H4Q=S9Q*f&ljpaicX$ z!zMRzPZfB&W>r(KmiUp+T6+&?C9dbVk>SLWbgX<w;Owuib8E8IxITQlYSWzjwe_o? zU#jS)hV?5lUU-G>@7~0v#&fvx<GF_OUrTZeT5o(*zs?;a!Ie>}_S)%a@u$R+v$Lgb zcLiOYf4R$3h^y$~8P-z=e?C;X^D^2|@K|_BOOua4qui|r8!K13nyLg|73lx<s9^v3 zvz!;@UdMXwyu6)h+Ey2blZUP~$h(=BrA$6PZRxgW&$lFPoN%IEU%xNr>rZXr*ju;F zgx|erIDfsIxhjhHXMvIP?8enx7P6mu>*fc1c=y;ahGSjp;lGuBcQh{SzH#ApT49dK z`Ang8Y6pT&Jlr#3(Hn0W*>~S9f3}}*)^yfuapkkQmiJL7h52FRWrLWr4F+59@QKX* z&iiA|j)#}$b~)uf+UVL>vE{JpQwhGc<u`8Kl#sa+s53)ilYsTF7rV~0@BgWj-}_+F z>;jIHlKqXlCF80s&R_HEmS6Euygc@5k7ASXhVP2g(|73{u6(F=?yx`%zx0!xh0k=> z@2~H(ejI6YT%e^_^d0ZiKSyPK{bY7bNiOgy*`?Sx*{Rj0zP_&O%zjCcZ5wK1&7b$b zS-4u+Re)>xxmODx+IoKSah(vkF4bmQOJ?4@n*L71#9h^eYmdsG-&9-ce|Um#?yRl} zHz)kP-&6SUG5^IIEML~BMqVrRQjA}+dhu305AQAA`6pzU9W{1E>(0+>-l`ogtQT#4 zv{I4dqgB+-Pp<{^Wvq|eKaP}%{%owt&7)o~)wHF}A<4B|UA%w)kz-Te{&=aQJFhvL zcU`h$Qee7tc-{WP?;gh+O*;8F!nyT<D)aZAC7TcAEpl@>Ed4_zXS=)6n^)GSALu(@ zFj_mOP`4*Na%-LC^ZU2XzIy6y&|qkMNLIl0d(*@(Mjs@LFW7h~w7dO(eCMgX;W}ey z)$1FVT(;b{_T{serM4|X+iVsv?@3bGd0_hizGsX6s!a`EBIo^}j%A+F$3@YdzmBZj z*|cUF%e7fvr+yyrOFrYjRQJK&Nt+6#ztwGP_&n*`Q6J-9SNuJG)iEwe+w485%%@SC z)0^p~ht+}=x9!*b3^nYjoiqK*szo(3n7-R@emEuiR&Q1|0|Nttr>mdKI;Vst04OMA Ap8x;= literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 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 KKbLh*2~7ZftovC2 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cde12118dda48d71e01fcb589a74d069c5d7cb5 GIT binary patch literal 1025 zcmeAS@N?(olHy`uVBq!ia0y~yV2}l24mJh`hOo)${0t1tCp=voLn`KMo$i|v6Do4N z{`<b~Ml(xh`LD=b>FK#DR4OpQeBF{oZd^@ytAg%E#Qb2~b^X?|T}6qm0$PzPyj`7G zy_Gu?Tvy63oEqf4uq)x$(ur!5kEj^Gzq`Ntx7tjVxiiC8v%gDvxBLB{bJyoo%T4N0 zVODtQ=;^K!J27NZ$iBu<udg*~FCT{NPxs`yB%kkH^y~kVxl@EEL=|Y%PVng3d}#8q z<uOzJJgdYHcvLY+uqG)m@JPD6bPRpZxu$Va^MN0sr8bOC2?so^*lbvKh};Sgs%$+h z%z0c-{RwkH(}6=il6kTD6)&fCJPV0F<;TF?Bk39J5G@vA`r&eC%fk5NqHDVarDk-x z#vd$NV4viCPRBKQ>KQ4|sNM5<Z%F-|(6+L@mi2H#y-Rk8FvrT>|D|4BlJT3qaC^dy z`Al<PiMy#~=q4m2sI}#?9&Y^C@l7N{dP<V>i+Wy`_(SF_GH?1bcJn2~W`yzIR&v&n zHwq7(^p$5v+Sf3x^?C*FF4e(q*QF|>HkSQxN`4T-liuBTV8bK*O%EQdEA!sxwmOn= z?UScxwmjbZIdxYN+ghe~{*9XrWo&{UU72!%^|WrmE}d^*TJBs<%zjqs`ZenD!Q0Wg z)z!{jsrNI}RyWA{w*5T9?C;-wPVEGH0LQ{N4|eXGuy?QG!nJd+n?Brnto>zY-v1XL z^bO0mMaTI!UQYe^r=s(u>x)yB0SOPXB<H>3tXO586LHe?cEZ!6=k?X@+|Imt;Z5WD zy7))8PqyglPMaOg!<eMimcFg+%}dVdtM<*i@^<glqlSk1ah8#fj-)uHpW86uz%GZJ zw`Vq2PrkAD=<^FRj+H0h?MwOaQ24{w`J9WV3-2mw+thra!*cfH?eczx7q&g<onjPw zjQ4gzN^Pp$O<AJ~_apM$N(OAR^An%#UT;yE(la-|=fm|kN{yx}>(U-fn|rcqYiLo; zi<r*s=eT9%pIz!-&S{>jtaq;Xd#<$P&F$UmocfM*F7Q)L-FK^}@kZzL?dBhoKEIE# zDxCIWncWkao!4w0KVN51@IfQ|xfjc|2d{o4sfadyjXc04r0&GMzV4H7e%%jVlkmGw zj<WvBzklLH_U;>ZE<P&GxmID5uF}h7ebPdivmo=ww_2NX?D2nmX7ukdOgxZNIPZ5^ z&a=hh@6uz7I}T1L(l)+SsQgm!fyQ-9UMtRQp6;h9NB3=Q+b^CRHOpyHfoAp9%MTXU zxm(RSx3th|dD^5SsnY$cpWR!?W#DoBcVyz#M|0+{2w$IlV#1PuNwNR-ePFXu%k;VA q^R|5R?a8lx23>mWT{!KG{qOgR*SIgbw=gg;FnGH9xvX<aXaWFyM)8~g literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 V&a^duV_;xl@O1TaS?83{1OVHl_EP`= literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdc2306c28505ebc0b6c3a359c4d252bf626b9f GIT binary patch literal 1920 zcmeAS@N?(olHy`uVBq!ia0y~yU<e0c4mJh`hQbp!a~K%d-923#Ln>~)y&Ih)5-P#| zVW!hn_Sz3k3oEJ(l$2NuB#v}lXVVFY7O86f&|oJiuOqP0aH~RA??I&i&Fx~Gh8l(} z)eoaGxNo_2GAS)+5J(CTViwYV^R6V_ZvSTM^zU!Vc3T@;Z!RuN^ZRr@kJI}0&$rv} z$Lz9p7ck*rIH8zWw~slvC9?75fjLKG4t}vz2shlH%$M}aP<4hi`(}^q2Tg4T-_?`N z68<ri_j=DrJ0o(9Rawea^kwtMZ-zeJcZ9WOD7b~a*XC<n@>*&2Yw`VYyA3Db@Vdr5 z`|uvtX^AS&I)BTutYn|ls`mZ0f%D`0cW2#VxW{++O?UJT^Q4Kp4V6t8jYX^NpH11t zaI$sks?-bR#y4l!&)DL+Lbu_|&D{peAB#QcJ+e4{ukHDe0>4GQ*9A;t3;DmanLUU* z<IDU_X@=eJec>B3w{}c5{5!pI?u3-@hox73SIc1a@7rM{y^;CMH3RLoH8aG8S9R|C zx+2%CJuKhuZ|&xlAr^Oil@~X>-5Gyms@Z+(S*zaM+u!uzVkW2EU*D#wY(f2zwQfz{ z{k%53FS^hp-Yb{zR$xYRt9Fg}5r-Soyd5hx-sW%3T=HUr{4$vj2NxwX?vM&NW6`#p z|G#)K|3Tf;)21CbBs9m;woc>l6e*9?_43Q)KONo_zvM)b?<$>FI~pFWJKuKrHsgl- zt;V+<P6<vA`MX<Ph2zAs{i!eST?=daZTo)eY}XBI9&<KT&wO4tJ9WbwrS*a_^TRh@ zd!x%0cQneJh5wrC4!_2yeAhiU#5}a(ohBWleyFJNbx6eR!nr)z+UqVS<{mC(UZcAs zukozKy4eZFU9Zh<^gP@pXr{a)uXU@;^|KqMJ&IzCp6$9}+QVIYlXMS%P0&3A!dn*~ z-<8z-tfh<hgv_H$qUS|&URe9QvNxOizWsVV&w)dW8CMw1IC`Av!z+HqjNit88kHj- zvP`dAxAiL9jne1860@euck%yzs5)0ODBpYE*Tb9HYd5^=VfmX9E8?d$echAJY$K79 zpHA|5r&Zo;dH16I!;9`!rcVr??tS<?rheW0^YgspGC2+H_6x*Ce)4|Zs%spvG1c~1 zoX4*@mkT6&wbppf*V&$zpZK{o!!$B#V<c1dEw<iuf1Z856&|OZW8j_WyZR2}0ZpwP zcMh&SFlpO@txaDKU7I_}X~WY<w(MUI^H*_Q<M#e{|E~3V=eqXu7mi)>i}3clqr$}Z z_LoG1Y~P0D^7{=F-<m(@{QIl%ZOhg-Q<8ZM-nm}LKYvB4p*H0@uf$$&dxOTgS;}jc zs-KS3*|a$B?`FdYDcb`JyWVaSzxK)g^M?DcCy74ZP}T4@k5%%pZ)sNm{~ED`c?rgS zv-NU}9t53B$UU5TyEX2H%Yjr|yE_#>7kt#Q->~iBq^au5e@v6%cerQ%D>3px`|b6I zTlhH5;-@I9zl;6tXw&5_aAMs}jw7<k0_7pM>kZa%Ke%>_dBcKzx_feBb}ZT<G5zk2 ziHC3Rnft4e^UVyuhCRFTPRxvBcY2sLWBab)+K(I?9_8Ixki=ub^xILL<MOoTh;4#J z&&?VQYI&LDpRnDy*8lc6Gyio4nWm#*6SnVRZV}INm~**fhqTkql}3CK+r)2t)1UK# zvG0K1UEV{NxgF<h<tn`16tOFg^`3=5#K!gP#UDd8b#;|kZu1)KNmJ+O-_Q2w48NmJ zB<CY--j3aT!pCG~A_~>>v>pWJ)*3t$I24x8o>*eoabA~gV}WGHQEi7ge<OKx{13#` z+L|VI-zc@^`TfmIK(2!8Natq<ofU33{11srx6cx>IBYv(w|>}hhWTF(ca(9yTkCcs z(D;z3cK~NxrSQExudeKJ{%4=6xD^w=9&tW9@3Ml=s-`<#y%UVfxjRJ9YC2Xjs_kHW zP~g(=R3RkSmg!JWn}ESxZ3Fg*jWXZgJD%exx~jBl+n2V2BJJ5c4{tHtaWCk<<Xoqx z9nrb1gQK9e^T4zD-3z>bPkoRVSpVSLt|ZPz-}MQX>tbL1Fg+N1p!lg8vzmvqwwdH9 z-OsZeXWV4?ENzuM@36}qbB=el0`qE`PVbv7vZH{PL$y~yWWDLM>DL=S)Ywj`*(3g| zW|E|+kG!v*`Zs~S5oz2hCq=(TJ}BQN+o(SMO@rpvwG-kmCuyA5$!-0ZpV!`ItFEl8 zbas_0_l@&$k4o9z*P07%nyH*|&i&NN`)_9KOf#@gl`aUdonxx3c5o8wL`{XF#uyQ~ zMb~xo1O87gpIV#Tyi1g~EbvDfzlH7%efBeDOcyJa@|s_qQM*@S`0JO>%xAC5JWQ5~ zyR6@3Kgm+%Tf^3aaff?+O<Q?#`GqAD*1M|Yv;I%`wAHW9rBS{&TX55JNy|w~MXULY z<GxC*D!-+7$$8tcy}WlUn7a<Gv6hWbY<oG2U-u$UX+^!*vx=rVWowD3&ecIyCl<zJ zF3MEt^_l8nUXpTrhtMJ6s$Vf-JL`BX4;#xD8(SZpxpH#ND*OJUI)}C-=`k#?KkJb^ pA##yk(k;XM#AB+TC361o&t1WHXzS_vJq!#C44$rjF6*2UngD_Nh|mB4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccbfd967d9697cd4b83225558af2911e9571c9b GIT binary patch literal 1283 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2y{PI<aGhE&WsI>R?dBvs;g z{d;TUyFpPJ%eF4Kv7n|^zp=ULn1t;EM$XP7lUeld*i<WYMHn1eEM+Rk!LA?E!ztJy zD8yIC>OAGhrAO=?vmAmpT<U+jYxid3dVb^0cemaCn{#@yPnp^KJ?}ry{%?H#%xAl{ z8!DE^W+>R*XMV$8#$?-Y`cDL-1XCS@pJejB8Rvppy6eq7etCUAujg?q<WvaP_dQE4 z{y3yycZjut%lnV#r5Q_NT~$>j6J!e{Uv#AAYb{|~a_aH522J@Q@fi&BOpfuWHHbGp zf5x@0=W&%z;t#%xYZ_i1#tsY?XV=JR1*ru$Xe%q8GYMi`*I43cb15zIa$ef*g)OP` zxn+8uo27Eb>{9r}R#PV@sJksCu`zk^$I#qqi)ZJWE@$GC^4#7iY9ct-)8d8n31bVb zX;lK#VjdrPy!sZ;@og0)Rhw5$KOp&F-NcXuofoDxM?Z25Q1Tbd+xYNCT0eV~Php(s z<cV5Oqt_M$Mm(3`W4LW2^O=pEcVCd0)6OHW!U}d3U4JIHF7H4Q=S9Q*f&ljpaicX$ z!zMRzPZfB&W>r(KmiUp+T6+&?C9dbVk>SLWbgX<w;Owuib8E8IxITQlYSWzjwe_o? zU#jS)hV?5lUU-G>@7~0v#&fvx<GF_OUrTZeT5o(*zs?;a!Ie>}_S)%a@u$R+v$Lgb zcLiOYf4R$3h^y$~8P-z=e?C;X^D^2|@K|_BOOua4qui|r8!K13nyLg|73lx<s9^v3 zvz!;@UdMXwyu6)h+Ey2blZUP~$h(=BrA$6PZRxgW&$lFPoN%IEU%xNr>rZXr*ju;F zgx|erIDfsIxhjhHXMvIP?8enx7P6mu>*fc1c=y;ahGSjp;lGuBcQh{SzH#ApT49dK z`Ang8Y6pT&Jlr#3(Hn0W*>~S9f3}}*)^yfuapkkQmiJL7h52FRWrLWr4F+59@QKX* z&iiA|j)#}$b~)uf+UVL>vE{JpQwhGc<u`8Kl#sa+s53)ilYsTF7rV~0@BgWj-}_+F z>;jIHlKqXlCF80s&R_HEmS6Euygc@5k7ASXhVP2g(|73{u6(F=?yx`%zx0!xh0k=> z@2~H(ejI6YT%e^_^d0ZiKSyPK{bY7bNiOgy*`?Sx*{Rj0zP_&O%zjCcZ5wK1&7b$b zS-4u+Re)>xxmODx+IoKSah(vkF4bmQOJ?4@n*L71#9h^eYmdsG-&9-ce|Um#?yRl} zHz)kP-&6SUG5^IIEML~BMqVrRQjA}+dhu305AQAA`6pzU9W{1E>(0+>-l`ogtQT#4 zv{I4dqgB+-Pp<{^Wvq|eKaP}%{%owt&7)o~)wHF}A<4B|UA%w)kz-Te{&=aQJFhvL zcU`h$Qee7tc-{WP?;gh+O*;8F!nyT<D)aZAC7TcAEpl@>Ed4_zXS=)6n^)GSALu(@ zFj_mOP`4*Na%-LC^ZU2XzIy6y&|qkMNLIl0d(*@(Mjs@LFW7h~w7dO(eCMgX;W}ey z)$1FVT(;b{_T{serM4|X+iVsv?@3bGd0_hizGsX6s!a`EBIo^}j%A+F$3@YdzmBZj z*|cUF%e7fvr+yyrOFrYjRQJK&Nt+6#ztwGP_&n*`Q6J-9SNuJG)iEwe+w485%%@SC z)0^p~ht+}=x9!*b3^nYjoiqK*szo(3n7-R@emEuiR&Q1|0|Nttr>mdKI;Vst04OMA Ap8x;= literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 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 OVDNPHb6Mw<&;$VbO<Vi` literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 U*#tT>FfcH9y85}Sb4q9e0QKHA1^@s6 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 O7(8A5T-G@yGywok=Zg*i literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6a84f41e14e27f4b11f16f9ee39279ac98f8d5ac GIT binary patch literal 3294 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e1f58536026aebc4f1f70e481f6993c9ff088d GIT binary patch literal 3612 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|<Ac4i*LmhOII@ObiSR+@3CuAr*6yf1PJwU}9%v Vnk8dc$iTqB;OXk;vd$@?2>@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> + </dependencies> + <scenes> + <!--View Controller--> + <scene sceneID="EHf-IW-A2E"> + <objects> + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> + <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> + </imageView> + </subviews> + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> + </constraints> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="53" y="375"/> + </scene> + </scenes> + <resources> + <image name="LaunchImage" width="168" height="185"/> + </resources> +</document> diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> + </dependencies> + <scenes> + <!--Flutter View Controller--> + <scene sceneID="tne-QT-ifu"> + <objects> + <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> + </objects> + </scene> + </scenes> +</document> diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..59f3eda --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>puissance4</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>$(FLUTTER_BUILD_NAME)</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>$(FLUTTER_BUILD_NUMBER)</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UILaunchStoryboardName</key> + <string>LaunchScreen</string> + <key>UIMainStoryboardFile</key> + <string>Main</string> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UISupportedInterfaceOrientations~ipad</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UIViewControllerBasedStatusBarAppearance</key> + <false/> +</dict> +</plist> diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..7335fdf --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/lib/board.dart b/lib/board.dart new file mode 100644 index 0000000..36eaa4f --- /dev/null +++ b/lib/board.dart @@ -0,0 +1,155 @@ +import 'package:puissance4/coordinate.dart'; + +import 'match_page.dart'; + +class Board { + List<List<Color>> _boxes = List.generate( + 7, + (i) => List.generate( + 7, + (i) => null, + ), + ); + + Board(); + + Board.from(List<List<Color>> boxes) { + _boxes = boxes; + } + + Color getBox(Coordinate coordinate) => _boxes[coordinate.col][coordinate.row]; + + int getColumnTarget(int col) => _boxes[col].lastIndexOf(null); + + void setBox(Coordinate coordinate, Color player) => + _boxes[coordinate.col][coordinate.row] = player; + + void reset() { + _boxes.forEach((r) => r.forEach((p) => p = null)); + } + + bool checkWinner(Coordinate coordinate, Color player) { + return checkHorizontally(coordinate, player) || + checkVertically(coordinate, player) || + checkDiagonally(coordinate, player); + } + + bool checkHorizontally(Coordinate coordinate, Color player) { + var r = 0; + for (; + coordinate.col + r < 7 && + r < 4 && + getBox(coordinate.copyWith(col: coordinate.col + r)) == player; + ++r) {} + if (r >= 4) { + return true; + } + + var l = 0; + for (; + coordinate.col - l >= 0 && + l < 4 && + getBox(coordinate.copyWith(col: coordinate.col - l)) == player; + ++l) {} + if (l >= 4 || l + r >= 5) { + return true; + } + + return false; + } + + bool checkDiagonally(Coordinate coordinate, Color player) { + var ur = 0; + for (; + coordinate.col + ur < 7 && + coordinate.row + ur < 7 && + ur < 4 && + getBox(coordinate.copyWith( + col: coordinate.col + ur, + row: coordinate.row + ur, + )) == + player; + ++ur) {} + if (ur >= 4) { + return true; + } + var dl = 0; + for (; + coordinate.col - dl >= 0 && + coordinate.row - dl >= 0 && + dl < 4 && + getBox(coordinate.copyWith( + col: coordinate.col - dl, + row: coordinate.row - dl, + )) == + player; + ++dl) {} + if (dl >= 4 || dl + ur >= 5) { + return true; + } + + var dr = 0; + for (; + coordinate.col + dr < 7 && + coordinate.row - dr >= 0 && + dr < 4 && + getBox(coordinate.copyWith( + col: coordinate.col + dr, + row: coordinate.row - dr, + )) == + player; + ++dr) {} + if (dr >= 4) { + return true; + } + + var ul = 0; + for (; + coordinate.col - ul >= 0 && + coordinate.row + ul < 7 && + ul < 4 && + getBox(coordinate.copyWith( + col: coordinate.col - ul, + row: coordinate.row + ul, + )) == + player; + ++ul) {} + if (ul >= 4 || dr + ul >= 5) { + return true; + } + return false; + } + + bool checkVertically(Coordinate coordinate, Color player) { + var u = 0; + for (; + coordinate.row + u < 7 && + u < 4 && + getBox(coordinate.copyWith( + row: coordinate.row + u, + )) == + player; + ++u) {} + if (u >= 4) { + return true; + } + var d = 0; + for (; + coordinate.row - d >= 0 && + d < 4 && + getBox(coordinate.copyWith( + row: coordinate.row - d, + )) == + player; + ++d) {} + if (d >= 4 || d + u >= 5) { + return true; + } + + return false; + } + + Board clone() { + return Board.from(_boxes.map((c) => c.map((b) => b).toList()).toList()); + } +} diff --git a/lib/coordinate.dart b/lib/coordinate.dart new file mode 100644 index 0000000..c8cbca4 --- /dev/null +++ b/lib/coordinate.dart @@ -0,0 +1,17 @@ +class Coordinate { + final int row, col; + + Coordinate( + this.col, + this.row, + ); + + Coordinate copyWith({ + int col, + int row, + }) => + Coordinate( + col ?? this.col, + row ?? this.row, + ); +} diff --git a/lib/cpu.dart b/lib/cpu.dart new file mode 100644 index 0000000..cd5af2c --- /dev/null +++ b/lib/cpu.dart @@ -0,0 +1,116 @@ +import 'dart:math'; + +import 'board.dart'; +import 'coordinate.dart'; +import 'match_page.dart'; + +abstract class Cpu { + final Color color; + final Random _random = Random(DateTime.now().millisecond); + + Cpu(this.color); + + Color get otherPlayer => color == Color.RED ? Color.YELLOW : Color.RED; + + Future<int> chooseCol(Board board); +} + +class DumbCpu extends Cpu { + DumbCpu(Color player) : super(player); + + Color get otherPlayer => color == Color.RED ? Color.YELLOW : Color.RED; + + @override + Future<int> chooseCol(Board board) async { + await Future.delayed(Duration(seconds: _random.nextInt(2))); + int col = _random.nextInt(7); + + return col; + } + + @override + String toString() => 'DUMB CPU'; +} + +class HarderCpu extends Cpu { + HarderCpu(Color player) : super(player); + + @override + Future<int> chooseCol(Board board) async { + final List<double> scores = List.filled(7, 0); + + await Future.delayed(Duration(seconds: 1 + _random.nextInt(2))); + return _compute(board, 0, 1, scores); + } + + int _compute(Board board, int step, int deepness, List<double> scores) { + for (var i = 0; i < 7; ++i) { + final boardCopy = board.clone(); + + final target = boardCopy.getColumnTarget(i); + if (target == -1) { + scores[i] = null; + continue; + } + + final coordinate = Coordinate(i, target); + + boardCopy.setBox(coordinate, color); + if (boardCopy.checkWinner(coordinate, color)) { + scores[i] += deepness / (step + 1); + continue; + } + + for (var j = 0; j < 7; ++j) { + final target = boardCopy.getColumnTarget(j); + if (target == -1) { + continue; + } + + final coordinate = Coordinate(j, target); + + boardCopy.setBox(coordinate, otherPlayer); + if (boardCopy.checkWinner(coordinate, otherPlayer)) { + scores[i] -= deepness / (step + 1); + continue; + } + + if (step + 1 < deepness) { + _compute(board, step + 1, deepness, scores); + } + } + } + + return _getBestScoreIndex(scores); + } + + int _getBestScoreIndex(List<double> scores) { + int bestScoreIndex = scores.indexWhere((s) => s != null); + scores.asMap().forEach((index, score) { + if (score != null && + (score > scores[bestScoreIndex] || + (score == scores[bestScoreIndex] && _random.nextBool()))) { + bestScoreIndex = index; + } + }); + return bestScoreIndex; + } + + @override + String toString() => 'HARDER CPU'; +} + +class HardestCpu extends HarderCpu { + HardestCpu(Color player) : super(player); + + @override + Future<int> chooseCol(Board board) async { + final List<double> scores = List.filled(7, 0); + + await Future.delayed(Duration(seconds: 2 + _random.nextInt(2))); + return _compute(board, 0, 4, scores); + } + + @override + String toString() => 'HARDEST CPU'; +} diff --git a/lib/cpu_level_page.dart b/lib/cpu_level_page.dart new file mode 100644 index 0000000..f116346 --- /dev/null +++ b/lib/cpu_level_page.dart @@ -0,0 +1,90 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:puissance4/cpu.dart'; + +import 'match_page.dart'; + +class CpuLevelPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0, + ), + backgroundColor: Colors.blue, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: <Widget>[ + FlatButton( + color: Colors.yellow, + child: Text( + 'DUMB', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.black), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/match', + arguments: { + 'mode': Mode.PVC, + 'cpu': + DumbCpu(Random().nextBool() ? Color.RED : Color.YELLOW), + }, + ); + }, + ), + FlatButton( + color: Colors.red, + child: Text( + 'HARD', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.white), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/match', + arguments: { + 'mode': Mode.PVC, + 'cpu': HarderCpu( + Random().nextBool() ? Color.RED : Color.YELLOW), + }, + ); + }, + ), + FlatButton( + color: Colors.deepPurpleAccent, + child: Text( + 'HARDEST', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.white), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/match', + arguments: { + 'mode': Mode.PVC, + 'cpu': HardestCpu( + Random().nextBool() ? Color.RED : Color.YELLOW), + }, + ); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/game_chip.dart b/lib/game_chip.dart new file mode 100644 index 0000000..1c737c3 --- /dev/null +++ b/lib/game_chip.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +import 'match_page.dart'; + +class GameChip extends StatelessWidget { + const GameChip({ + Key key, + this.translation, + @required this.color, + }) : super(key: key); + + final Animation<double> translation; + final Color color; + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + transform: Matrix4.translationValues( + 0, + ((translation?.value ?? 1) * 400) - 400, + 0, + ), + height: 40, + width: 40, + child: Material( + shape: CircleBorder(), + color: color == Color.RED ? Colors.red : Colors.yellow, + ), + ), + ); + } +} diff --git a/lib/hole_painter.dart b/lib/hole_painter.dart new file mode 100644 index 0000000..ebabafb --- /dev/null +++ b/lib/hole_painter.dart @@ -0,0 +1,39 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class HolePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final paint = Paint(); + paint.color = Colors.blue; + paint.style = PaintingStyle.fill; + + final center = Offset(size.height / 2, size.width / 2); + + final circleBounds = Rect.fromCircle(center: center, radius: 20); + + final topPath = Path() + ..moveTo(-1, -1) + ..lineTo(-1, (size.height / 2) + 1) + ..arcTo(circleBounds, -pi, pi, false) + ..lineTo(size.width + 1, (size.height / 2) + 1) + ..lineTo(size.width + 1, -1) + ..close(); + final bottomPath = Path() + ..moveTo(-1, size.height) + ..lineTo(-1, (size.height / 2) - 1) + ..arcTo(circleBounds, pi, -pi, false) + ..lineTo(size.width + 1, (size.height / 2) - 1) + ..lineTo(size.width + 1, size.height + 1) + ..close(); + + canvas.drawPath(topPath, paint); + canvas.drawPath(bottomPath, paint); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return false; + } +} diff --git a/lib/home_page.dart b/lib/home_page.dart new file mode 100644 index 0000000..b9c4ffb --- /dev/null +++ b/lib/home_page.dart @@ -0,0 +1,85 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:puissance4/cpu.dart'; + +import 'match_page.dart'; + +class HomePage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.blue, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: <Widget>[ + FlatButton( + color: Colors.green, + child: Text( + 'VS PLAYER', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.white), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/match', + arguments: { + 'mode': Mode.PVP, + }, + ); + }, + ), + FlatButton( + color: Colors.black, + child: Text( + 'VS CPU', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.white), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/cpu-level', + arguments: { + 'mode': Mode.PVC, + }, + ); + }, + ), + FlatButton( + color: Colors.white, + child: Text( + 'DEMO', + style: Theme.of(context) + .textTheme + .display2 + .copyWith(color: Colors.black), + ), + onPressed: () { + final harderCpu = + HarderCpu(Random().nextBool() ? Color.RED : Color.YELLOW); + Navigator.pushNamed( + context, + '/match', + arguments: { + 'mode': Mode.DEMO, + 'cpu': harderCpu, + 'cpu2': HardestCpu(harderCpu.otherPlayer), + }, + ); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..f6f5777 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:puissance4/cpu_level_page.dart'; +import 'package:puissance4/home_page.dart'; +import 'package:puissance4/match_page.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter fiar', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: HomePage(), + onGenerateRoute: (settings) { + final args = settings.arguments as Map<String, dynamic>; + if (settings.name == '/match') { + return MaterialPageRoute( + builder: (context) => MatchPage( + mode: args['mode'], + cpu: args['cpu'], + cpu2: args['cpu2'], + ), + ); + } else if (settings.name == '/cpu-level') { + return MaterialPageRoute( + builder: (context) => CpuLevelPage(), + ); + } + + return null; + }, + ); + } +} diff --git a/lib/match_page.dart b/lib/match_page.dart new file mode 100644 index 0000000..b1ea45a --- /dev/null +++ b/lib/match_page.dart @@ -0,0 +1,310 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:puissance4/coordinate.dart'; + +import 'board.dart'; +import 'cpu.dart'; +import 'game_chip.dart'; +import 'hole_painter.dart'; + +enum Color { + YELLOW, + RED, +} + +enum Mode { + PVP, + PVC, + DEMO, +} + +class MatchPage extends StatefulWidget { + final Mode mode; + final Cpu cpu; + final Cpu cpu2; + + const MatchPage({ + Key key, + this.mode, + this.cpu, + this.cpu2, + }) : super(key: key); + + @override + _MatchPageState createState() => _MatchPageState(); +} + +class _MatchPageState extends State<MatchPage> with TickerProviderStateMixin { + final board = Board(); + Color turn; + Color winner; + + List<List<Animation<double>>> translations = List.generate( + 7, + (i) => List.generate( + 7, + (i) => null, + ), + ); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0, + ), + backgroundColor: Colors.blue, + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Flex( + direction: Axis.vertical, + mainAxisSize: MainAxisSize.max, + children: <Widget>[ + Flexible( + flex: 2, + child: Container( + constraints: BoxConstraints.loose( + Size( + 500, + 532, + ), + ), + child: Padding( + padding: const EdgeInsets.only(top: 32.0), + child: Stack( + overflow: Overflow.clip, + fit: StackFit.loose, + children: <Widget>[ + Positioned.fill( + child: Container( + color: Colors.white, + ), + ), + buildPieces(), + buildBoard(), + ], + ), + ), + ), + ), + Flexible( + flex: 1, + child: Padding( + padding: const EdgeInsets.all(32.0), + child: winner != null + ? Text( + '${winner == Color.RED ? 'RED' : 'YELLOW'} WINS', + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .display3 + .copyWith(color: Colors.white), + ) + : Column( + children: <Widget>[ + Text( + '${turn == Color.RED ? 'RED' : 'YELLOW'} SPEAKS', + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .title + .copyWith(color: Colors.white), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: GameChip(color: turn), + ), + _buildPlayerName(context), + ], + ), + ), + ), + ], + ), + ), + ); + } + + Text _buildPlayerName(BuildContext context) { + String name; + + if (widget.mode == Mode.PVC) { + if (turn == widget.cpu.color) { + name = 'CPU - ${widget.cpu.toString()}'; + } else { + name = 'USER'; + } + } else if (widget.mode == Mode.PVP) { + if (turn == Color.RED) { + name = 'PLAYER1'; + } else { + name = 'PLAYER2'; + } + } else { + if (turn == widget.cpu.color) { + name = 'CPU1 - ${widget.cpu.toString()}'; + } else { + name = 'CPU2 - ${widget.cpu2.toString()}'; + } + } + return Text( + name, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.title.copyWith(color: Colors.white), + ); + } + + @override + void initState() { + super.initState(); + turn = widget.cpu?.otherPlayer ?? + (Random().nextBool() ? Color.RED : Color.YELLOW); + if (widget.mode == Mode.PVC && turn == widget.cpu.color) { + cpuMove(widget.cpu); + } else if (widget.mode == Mode.DEMO) { + if (turn == widget.cpu.color) { + cpuMove(widget.cpu); + } else { + cpuMove(widget.cpu2); + } + } + } + + GridView buildPieces() { + return GridView.custom( + padding: const EdgeInsets.all(0), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 7), + childrenDelegate: SliverChildBuilderDelegate( + (context, i) { + final col = i % 7; + final row = i ~/ 7; + + if (board.getBox(Coordinate(col, row)) == null) { + return SizedBox(); + } + + return GameChip( + translation: translations[col][row], + color: board.getBox(Coordinate(col, row)), + ); + }, + childCount: 49, + ), + ); + } + + GridView buildBoard() { + return GridView.custom( + padding: const EdgeInsets.all(0), + physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 7), + shrinkWrap: true, + childrenDelegate: SliverChildBuilderDelegate( + (context, i) { + final col = i % 7; + + return GestureDetector( + onTap: () { + if (winner == null) { + userMove(col); + } + }, + child: CustomPaint( + size: Size(50, 50), + willChange: false, + painter: HolePainter(), + ), + ); + }, + childCount: 49, + ), + ); + } + + void userMove(int col) { + putChip(col); + if (winner == null && widget.mode == Mode.PVC) { + cpuMove(widget.cpu); + } + } + + void cpuMove(Cpu cpu) async { + int col = await cpu.chooseCol(board); + putChip(col); + + if (winner == null && widget.mode == Mode.DEMO) { + if (turn == widget.cpu.color) { + cpuMove(widget.cpu); + } else { + cpuMove(widget.cpu2); + } + } + } + + void putChip(int col) { + final target = board.getColumnTarget(col); + final player = turn; + + if (target == -1) { + return; + } + + final controller = AnimationController( + vsync: this, + duration: Duration(seconds: 1), + )..addListener(() { + if (mounted) { + setState(() {}); + } + }); + + if (mounted) { + setState(() { + board.setBox(Coordinate(col, target), turn); + turn = turn == Color.RED ? Color.YELLOW : Color.RED; + }); + } + + translations[col][target] = Tween( + begin: 0.0, + end: 1.0, + ).animate(CurvedAnimation( + curve: Curves.bounceOut, + parent: controller, + )) + ..addStatusListener((status) { + if (status == AnimationStatus.completed) { + controller.dispose(); + } + }); + + controller.forward().orCancel; + + if (board.checkWinner(Coordinate(col, target), player)) { + showWinnerDialog(context, player); + } + } + + void showWinnerDialog(BuildContext context, Color player) { + setState(() { + winner = player; + }); + + Future.delayed( + Duration(seconds: 5), + () => mounted ? Navigator.popUntil(context, (r) => r.isFirst) : null, + ); + } + + void resetBoard() { + setState(() { + winner = null; + board.reset(); + }); + } +} diff --git a/lib/player.dart b/lib/player.dart new file mode 100644 index 0000000..f404ece --- /dev/null +++ b/lib/player.dart @@ -0,0 +1,7 @@ +import 'package:puissance4/match_page.dart'; + +abstract class Player { + final Color player; + + Player(this.player); +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..9e492de --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,146 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" +sdks: + dart: ">=2.12.0-0.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..f8cd312 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,17 @@ +name: puissance4 +description: puissance4 +version: 1.0.0+1 + +environment: + sdk: ">=2.2.2 <3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + uses-material-design: true diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..704152c09c843a0a90437522ffe11f9b5f5eef04 GIT binary patch literal 5358 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 K&t;ucLK6UAR_(k1 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..56ffa555e5f945d2ef5be231e3c684ce76de5aa9 GIT binary patch literal 17625 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..2947828 --- /dev/null +++ b/web/index.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta content="IE=Edge" http-equiv="X-UA-Compatible"> + <meta name="description" content="A new Flutter project."> + + <!-- iOS meta tags & icons --> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="apple-mobile-web-status-bar-style" content="black"> + <meta name="apple-mobile-web-app-title" content="puissance4"> + <link rel="apple-touch-icon" href="/icons/Icon-192.png"> + + <title>puissance4</title> + <link rel="manifest" href="/manifest.json"> +</head> +<body> + <!-- This script installs service_worker.js to provide PWA functionality to + application. For more information, see: + https://developers.google.com/web/fundamentals/primers/service-workers --> + <script> + if ('serviceWorker' in navigator) { + window.addEventListener('load', function () { + navigator.serviceWorker.register('/flutter_service_worker.js'); + }); + } + </script> + <script src="main.dart.js" type="application/javascript"></script> +</body> +</html> diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..63275bc --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "puissance4", + "short_name": "puissance4", + "start_url": ".", + "display": "minimal-ui", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "puissance4", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} -- GitLab