diff --git a/android/gradle.properties b/android/gradle.properties index 14eed3944b547f02179b1b42f4b601f91b7957c0..aa51064abebb79ba519e600afb7af23779154d4e 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=0.0.4 -app.versionCode=4 +app.versionName=0.0.5 +app.versionCode=5 diff --git a/assets/icons/colors_5.png b/assets/icons/colors_5.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0a276e105a79aa25ca36f6cc4d2f69c77df81f Binary files /dev/null and b/assets/icons/colors_5.png differ diff --git a/assets/icons/colors_6.png b/assets/icons/colors_6.png new file mode 100644 index 0000000000000000000000000000000000000000..2a63916ed00f0570bedd1647e34706d041fbec44 Binary files /dev/null and b/assets/icons/colors_6.png differ diff --git a/assets/icons/colors_7.png b/assets/icons/colors_7.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc1669a1d89ed225cc4624319ff01558ab987b4 Binary files /dev/null and b/assets/icons/colors_7.png differ diff --git a/assets/icons/colors_8.png b/assets/icons/colors_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b660ef3e29aefc5c940a327aaf7a22d76a73bb23 Binary files /dev/null and b/assets/icons/colors_8.png differ diff --git a/assets/skins/default_empty.png b/assets/skins/default_0.png similarity index 74% rename from assets/skins/default_empty.png rename to assets/skins/default_0.png index b5261e3248aa6c8ea427463b0a70a3b5d2241bb1..e543c1a9c0a2f38128c5a48437dcb75ceeaa23e2 100644 Binary files a/assets/skins/default_empty.png and b/assets/skins/default_0.png differ diff --git a/assets/skins/default_1.png b/assets/skins/default_1.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac7e9dc99ea6cf1e0a0126615e0217ec140023 Binary files /dev/null and b/assets/skins/default_1.png differ diff --git a/assets/skins/default_2.png b/assets/skins/default_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cca70ea9b7cb61319c79a07d8567ae9707f29a8a Binary files /dev/null and b/assets/skins/default_2.png differ diff --git a/assets/skins/default_3.png b/assets/skins/default_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4ccd82edd6dea24e3f73a9794d735a268cc11b Binary files /dev/null and b/assets/skins/default_3.png differ diff --git a/assets/skins/default_4.png b/assets/skins/default_4.png new file mode 100644 index 0000000000000000000000000000000000000000..86a9c87e0459697060a91571714765c0078a1403 Binary files /dev/null and b/assets/skins/default_4.png differ diff --git a/assets/skins/default_5.png b/assets/skins/default_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4f1cb57586355b4e443d8e6e4d17fc7053f2d1 Binary files /dev/null and b/assets/skins/default_5.png differ diff --git a/assets/skins/default_6.png b/assets/skins/default_6.png new file mode 100644 index 0000000000000000000000000000000000000000..4a620e27de46cc9db3742e7d60a5d2e4c8094a4e Binary files /dev/null and b/assets/skins/default_6.png differ diff --git a/assets/skins/default_7.png b/assets/skins/default_7.png new file mode 100644 index 0000000000000000000000000000000000000000..988d6fc485453b4f4c0c5c306809eec93a611718 Binary files /dev/null and b/assets/skins/default_7.png differ diff --git a/assets/skins/default_8.png b/assets/skins/default_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5cc615ca867c90f0004097308dc83d9ae496df Binary files /dev/null and b/assets/skins/default_8.png differ diff --git a/fastlane/metadata/android/en-US/changelogs/5.txt b/fastlane/metadata/android/en-US/changelogs/5.txt new file mode 100644 index 0000000000000000000000000000000000000000..64563db3a687f0bfbad0240a821a6f21907ab370 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/5.txt @@ -0,0 +1 @@ +Add minimal playable game diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 60b134f0732fd67df916f29433510c797b4baa32..21652882fcb9c8b88a8a570ba86e7ee8a9fcd8e5 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,3 +1,3 @@ -Jeweled Game: +Jeweled: Simple and classic Jeweled game. \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/5.txt b/fastlane/metadata/android/fr-FR/changelogs/5.txt new file mode 100644 index 0000000000000000000000000000000000000000..8ebcd9c2a63dad44f05914fec43513d75b9e603d --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/5.txt @@ -0,0 +1 @@ +Ajout d'un gameplay minimal diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index c862dd0d8fa7a5f9c2a7d704069bfe1535513d9b..5b75511ccd068af99452bffcace0c774f296b9a0 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -1,3 +1,3 @@ Jeweled : -Jeu simple et classique d'associations \ No newline at end of file +Jeu simple et classique d'associations diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt index e24645b53531b76ec20b106c1e57ccbc17e4e238..f5d1552325391f2f9a0380479b7e8f8c13e9ff70 100644 --- a/fastlane/metadata/android/fr-FR/short_description.txt +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -1 +1 @@ -Jeweled, jeu d'associations \ No newline at end of file +Jeweled, jeu d'associations diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt index 32220f76f7f4138fb016241052ba6592e756f7c4..ca1e85b880a19f855f8bf25188b52507266a95d4 100644 --- a/fastlane/metadata/android/fr-FR/title.txt +++ b/fastlane/metadata/android/fr-FR/title.txt @@ -1 +1 @@ -Jeweled \ No newline at end of file +Jeweled diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh index ccdf140bd227347654b54b2393f3ce87d12a6ef6..b76b62867716279b7a29197581a669474da3f2b4 100755 --- a/icons/build_game_icons.sh +++ b/icons/build_game_icons.sh @@ -29,6 +29,7 @@ AVAILABLE_GAME_IMAGES=" AVAILABLES_GAME_SETTINGS=" level:easy,medium,hard,nightmare size:small,medium,large,extra + colors:5,6,7,8 " # Skins @@ -38,7 +39,15 @@ AVAILABLE_SKINS=" # Images per skin SKIN_IMAGES=" - empty + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 " ####################################################### diff --git a/icons/colors_5.svg b/icons/colors_5.svg new file mode 100644 index 0000000000000000000000000000000000000000..2f218e9986906d5f873c0ff7dbfce088b3a102bf --- /dev/null +++ b/icons/colors_5.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#97c05c" stroke="#000" stroke-width="2"/><g transform="translate(-1.0061 .33115)" aria-label="5"><path d="m63.315 55.063q0 2.2656-0.85938 4.2188-0.83984 1.9336-2.4609 3.3203-1.7969 1.4844-4.1406 2.207-2.3242 0.70312-5.3125 0.70312-3.4961-0.01953-5.918-0.56641-2.4023-0.52734-3.9258-1.1914v-6.4258h0.82031q1.7773 1.0547 3.8281 1.7578t4.082 0.70312q1.2305 0 2.6562-0.27344 1.4453-0.29297 2.2852-1.0352 0.66406-0.60547 0.99609-1.2305 0.35156-0.625 0.35156-1.9336 0-1.0156-0.46875-1.7383-0.44922-0.74219-1.1719-1.1914-1.0547-0.64453-2.5391-0.83984-1.4844-0.21484-2.6953-0.21484-1.7578 0-3.3789 0.3125-1.6016 0.29297-2.8125 0.58594h-0.85938v-16.406h20.684v5.5664h-13.633v4.7461q0.60547-0.03906 1.5234-0.05859 0.9375-0.03906 1.6406-0.03906 2.4023 0 4.2773 0.46875 1.8945 0.44922 3.2617 1.2695 1.7773 1.0742 2.7734 2.8516 0.99609 1.7578 0.99609 4.4336z"/></g><rect x="67.01" y="67.01" width="29.323" height="29.323" fill="#ff6f43" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="36.339" width="29.323" height="29.323" fill="#ffce2c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="5.6672" width="29.323" height="29.323" fill="#359c35" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="5.6672" width="29.323" height="29.323" fill="#708cfd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="5.6671" y="5.6672" width="29.323" height="29.323" fill="#e63a3f" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/></svg> diff --git a/icons/colors_6.svg b/icons/colors_6.svg new file mode 100644 index 0000000000000000000000000000000000000000..6df1641a1ea326ff73fc5de9229f6722ac9acd11 --- /dev/null +++ b/icons/colors_6.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#f29c38" stroke="#000" stroke-width="2"/><g transform="translate(3.8694 .21001)" aria-label="6"><path d="m59.025 55.399q0 2.2461-0.82031 4.2188t-2.3047 3.3203q-1.582 1.4453-3.6719 2.207-2.0703 0.76172-4.8633 0.76172-2.6172 0-4.7852-0.70312-2.1484-0.72266-3.6914-2.1875-1.7773-1.6797-2.7148-4.3359t-0.9375-6.3477q0-3.8281 0.87891-6.7969t2.8711-5.2539q1.9141-2.1875 4.9609-3.3984 3.0664-1.2109 7.2852-1.2109 1.4258 0 3.125 0.19531t2.207 0.29297v5.7227h-0.74219q-0.52734-0.25391-1.7969-0.56641-1.25-0.33203-2.8516-0.33203-3.75 0-5.8398 1.8359t-2.5195 5.1172q1.5039-0.89844 3.1641-1.4453 1.6797-0.56641 3.6133-0.56641 1.6992 0 3.1445 0.39062 1.4648 0.39062 2.7148 1.25 1.6211 1.1328 2.5977 3.0469 0.97656 1.9141 0.97656 4.7852zm-8.8867 4.3945q0.60547-0.66406 0.95703-1.5625 0.37109-0.91797 0.37109-2.4805 0-1.4258-0.41016-2.3242-0.41016-0.91797-1.1328-1.4648-0.70312-0.54688-1.6602-0.74219-0.95703-0.21484-1.9727-0.21484-0.85938 0-1.7969 0.19531-0.9375 0.19531-1.7188 0.48828 0 0.19531-0.01953 0.64453t-0.01953 1.1328q0 2.4023 0.46875 3.9648 0.48828 1.543 1.2891 2.3633 0.54688 0.60547 1.2891 0.89844 0.74219 0.27344 1.6016 0.27344 0.64453 0 1.4258-0.29297t1.3281-0.87891z"/></g><rect x="36.339" y="67.01" width="29.323" height="29.323" fill="#a13cb1" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="67.01" width="29.323" height="29.323" fill="#ff6f43" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="36.339" width="29.323" height="29.323" fill="#ffce2c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="5.6672" width="29.323" height="29.323" fill="#359c35" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="5.6672" width="29.323" height="29.323" fill="#708cfd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="5.6671" y="5.6672" width="29.323" height="29.323" fill="#e63a3f" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/></svg> diff --git a/icons/colors_7.svg b/icons/colors_7.svg new file mode 100644 index 0000000000000000000000000000000000000000..7870bc74ae13133a080de2f02397413b9d611458 --- /dev/null +++ b/icons/colors_7.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#cd5542" stroke="#000" stroke-width="2"/><g transform="translate(3.9378 .2393)" aria-label="7"><path d="m58.459 42.001-13.164 23.301h-8.3594l13.672-23.516h-14.941v-5.5664h22.793z"/></g><rect x="5.6671" y="67.01" width="29.323" height="29.323" fill="#38ffff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="67.01" width="29.323" height="29.323" fill="#a13cb1" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="67.01" width="29.323" height="29.323" fill="#ff6f43" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="36.339" width="29.323" height="29.323" fill="#ffce2c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="5.6672" width="29.323" height="29.323" fill="#359c35" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="5.6672" width="29.323" height="29.323" fill="#708cfd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="5.6671" y="5.6672" width="29.323" height="29.323" fill="#e63a3f" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/></svg> diff --git a/icons/colors_8.svg b/icons/colors_8.svg new file mode 100644 index 0000000000000000000000000000000000000000..37f394909f7ecc1b5e53a34c304d99742ce6c149 --- /dev/null +++ b/icons/colors_8.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#6041b0" stroke="#000" stroke-width="2"/><g transform="translate(4.1624 .2393)" aria-label="8"><path d="m59.123 57.177q0 3.8672-3.3008 6.3281-3.2812 2.4609-9.0234 2.4609-3.2227 0-5.5273-0.66406-2.3047-0.66406-3.8086-1.8359-1.4844-1.1523-2.207-2.6953-0.70312-1.543-0.70312-3.3203 0-2.1875 1.2695-3.8672 1.2891-1.6992 4.4336-2.9688v-0.11719q-2.5391-1.1719-3.7305-2.9492t-1.1914-4.1211q0-3.457 3.2031-5.6641 3.2031-2.207 8.3398-2.207 5.3906 0 8.4375 2.0117 3.0664 1.9922 3.0664 5.332 0 2.0703-1.2891 3.6914t-3.9453 2.7539v0.11719q3.0469 1.1523 4.5117 3.1055t1.4648 4.6094zm-8.0664-13.438q0-1.4844-1.1523-2.3633-1.1328-0.87891-3.0273-0.87891-0.70312 0-1.4453 0.17578-0.72266 0.17578-1.3281 0.50781-0.56641 0.33203-0.9375 0.87891-0.37109 0.52734-0.37109 1.2109 0 1.1523 0.64453 1.7969 0.66406 0.64453 2.1484 1.2891 0.54688 0.23438 1.4844 0.58594 0.95703 0.33203 2.3047 0.76172 0.89844-1.0547 1.2891-1.8945 0.39062-0.83984 0.39062-2.0703zm0.60547 13.77q0-1.4062-0.70312-2.1289t-2.8906-1.6602q-0.64453-0.29297-1.875-0.72266-1.2305-0.42969-2.0703-0.74219-0.83984 0.76172-1.5234 1.8555-0.66406 1.0742-0.66406 2.4219 0 2.0312 1.4453 3.2422 1.4648 1.1914 3.8086 1.1914 0.625 0 1.4648-0.17578 0.83984-0.19531 1.4453-0.58594 0.70312-0.44922 1.1328-1.0547 0.42969-0.60547 0.42969-1.6406z"/></g><rect x="5.6671" y="36.339" width="29.323" height="29.323" fill="#f2739d" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="5.6671" y="67.01" width="29.323" height="29.323" fill="#38ffff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="67.01" width="29.323" height="29.323" fill="#a13cb1" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="67.01" width="29.323" height="29.323" fill="#ff6f43" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="36.339" width="29.323" height="29.323" fill="#ffce2c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="67.01" y="5.6672" width="29.323" height="29.323" fill="#359c35" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="36.339" y="5.6672" width="29.323" height="29.323" fill="#708cfd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/><rect x="5.6671" y="5.6672" width="29.323" height="29.323" fill="#e63a3f" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width=".76239"/></svg> diff --git a/icons/skins/default/empty.svg b/icons/skins/default/0.svg similarity index 61% rename from icons/skins/default/empty.svg rename to icons/skins/default/0.svg index 3999633fc33857ce7e886751d61b279424c55492..c55c649001b0dca8cbbafc1642dfbadceee2acda 100644 --- a/icons/skins/default/empty.svg +++ b/icons/skins/default/0.svg @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8"?> -<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#c5c5c5" stroke="#505050" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.6"/></svg> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/1.svg b/icons/skins/default/1.svg new file mode 100644 index 0000000000000000000000000000000000000000..8381dc683edf57b61a76592657048ade871d5d2b --- /dev/null +++ b/icons/skins/default/1.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#E63A3F" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/2.svg b/icons/skins/default/2.svg new file mode 100644 index 0000000000000000000000000000000000000000..8306614e2c8e5e185dbda8a4beda053e997c1253 --- /dev/null +++ b/icons/skins/default/2.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#708CFD" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/3.svg b/icons/skins/default/3.svg new file mode 100644 index 0000000000000000000000000000000000000000..5b6298b56f9ecd3a5246089baa7160f5703ff11e --- /dev/null +++ b/icons/skins/default/3.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#359C35" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/4.svg b/icons/skins/default/4.svg new file mode 100644 index 0000000000000000000000000000000000000000..b48f42546499c1814212276aff6b246184aac69e --- /dev/null +++ b/icons/skins/default/4.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#FFCE2C" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/5.svg b/icons/skins/default/5.svg new file mode 100644 index 0000000000000000000000000000000000000000..68b76105c5f6d865e00d35f0818c0d0479fb9217 --- /dev/null +++ b/icons/skins/default/5.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#FF6F43" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/6.svg b/icons/skins/default/6.svg new file mode 100644 index 0000000000000000000000000000000000000000..da1c8ae7de74db75f978e8dd601ad54d6bcd8752 --- /dev/null +++ b/icons/skins/default/6.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#A13CB1" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/7.svg b/icons/skins/default/7.svg new file mode 100644 index 0000000000000000000000000000000000000000..da0f69c5ee5270e1ebd493aca091ca884a5c5db8 --- /dev/null +++ b/icons/skins/default/7.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#38FFFF" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/icons/skins/default/8.svg b/icons/skins/default/8.svg new file mode 100644 index 0000000000000000000000000000000000000000..0b637b32322121de2d1cd1f4b717443f3674d10b --- /dev/null +++ b/icons/skins/default/8.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="#F2739D" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".5" stroke-width="2.6"/></svg> diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart new file mode 100644 index 0000000000000000000000000000000000000000..d5f45d912e86655d41637524ded1168c722b96db --- /dev/null +++ b/lib/entities/cell.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:jeweled_game/provider/data.dart'; +import 'package:jeweled_game/utils/board_utils.dart'; + +class Cell { + String value = '0'; + + Cell( + this.value, + ); + + /* + * Build widget for board cell, with interactions + * @TODO: remove parameters + */ + Container widget(Data myProvider, int row, int col) { + String imageAsset = this.getImageAssetName(myProvider); + + return Container( + child: GestureDetector( + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 100), + transitionBuilder: (Widget child, Animation<double> animation) { + return ScaleTransition(child: child, scale: animation); + }, + child: Image( + image: AssetImage(imageAsset), + fit: BoxFit.fill, + key: ValueKey<int>(imageAsset.hashCode), + ), + ), + onTap: () { + if (!myProvider.isGameFinished) { + BoardUtils.tapOnCell(myProvider, row, col); + } + }, + ), + ); + } + + /* + * Compute image asset name, from skin and cell value/state + */ + String getImageAssetName(Data myProvider) { + String imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_' + this.value + '.png'; + + return imageAsset; + } +} diff --git a/lib/layout/board.dart b/lib/layout/board.dart index 0355470905931c472f2ab37621f8942db2ef8e02..8d207d1ab50f7c5dcabd99cddaf90d1625c2ecdd 100644 --- a/lib/layout/board.dart +++ b/lib/layout/board.dart @@ -15,18 +15,19 @@ class Board { } static Table buildGameTileset(Data myProvider) { - int boardSize = 5; + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; return Table( defaultColumnWidth: IntrinsicColumnWidth(), children: [ - for (var row = 0; row < boardSize; row++) + for (var row = 0; row < boardSizeVertical; row++) TableRow( children: [ - for (var col = 0; col < boardSize; col++) + for (var col = 0; col < boardSizeHorizontal; col++) Column( children: [ - Text('[' + col.toString() + ',' + row.toString() + "]"), + myProvider.getCell(row, col).widget(myProvider, row, col), ], ), ], diff --git a/lib/layout/game.dart b/lib/layout/game.dart index 36fe226d9907db3c9fb6d273efbf9624fd8a7526..12df4e31f338377d6ccb7888d77ac36534fa4778 100644 --- a/lib/layout/game.dart +++ b/lib/layout/game.dart @@ -35,7 +35,7 @@ class Game { Column( children: [ Text( - 'SCORE', + myProvider.score.toString(), style: TextStyle( fontSize: 40, fontWeight: FontWeight.w600, @@ -43,7 +43,7 @@ class Game { ), ), Text( - 'TARGET', + myProvider.movesCount.toString(), style: TextStyle( fontSize: 15, fontWeight: FontWeight.w600, @@ -55,7 +55,7 @@ class Game { Column( children: [ Text( - 'INFOS', + myProvider.availableBlocksCount.toString(), style: TextStyle( fontSize: 20, fontWeight: FontWeight.w600, @@ -72,27 +72,23 @@ class Game { static TextButton buildQuitGameButton(Data myProvider) { return TextButton( - child: Container( - child: Image( - image: AssetImage('assets/icons/button_back.png'), - fit: BoxFit.fill, - ), + child: Image( + image: AssetImage('assets/icons/button_back.png'), + fit: BoxFit.fill, ), onPressed: () => GameUtils.quitGame(myProvider), ); } static Container buildEndGameMessage(Data myProvider) { - String decorationImageAssetName = ''; - if (myProvider.gameWon()) { - decorationImageAssetName = 'assets/icons/game_win.png'; - } else { - decorationImageAssetName = 'assets/icons/game_fail.png'; - } + String decorationImageAssetName = 'assets/icons/game_fail.png'; - Image decorationImage = Image( - image: AssetImage(decorationImageAssetName), - fit: BoxFit.fill, + Widget decorationWidget = TextButton( + child: Image( + image: AssetImage(decorationImageAssetName), + fit: BoxFit.fill, + ), + onPressed: () => null, ); return Container( @@ -104,13 +100,13 @@ class Game { TableRow( children: [ Column( - children: [decorationImage], + children: [decorationWidget], ), Column( children: [buildQuitGameButton(myProvider)], ), Column( - children: [decorationImage], + children: [decorationWidget], ), ], ), diff --git a/lib/provider/data.dart b/lib/provider/data.dart index dd6968337e1d7fa6d2489f2c2dd6dceb62fba98f..bbeabe581bfbbcd9c8ad5317ae2be7321dac704e 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -1,14 +1,16 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; +import 'package:jeweled_game/entities/cell.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Data extends ChangeNotifier { - // Configuration available values - List _availableParameters = ['level', 'size', 'skin']; + // Configuration available parameters + List _availableParameters = ['level', 'size', 'colors', 'skin']; List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare']; List _availableSizeValues = ['small', 'medium', 'large', 'extra']; + List _availableColorsValues = ['5', '6', '7', '8']; List _availableSkinValues = ['default']; List get availableParameters => _availableParameters; @@ -21,6 +23,8 @@ class Data extends ChangeNotifier { String _parameterLevelDefault = 'medium'; String _parameterSize = ''; String _parameterSizeDefault = 'medium'; + String _parameterColors = ''; + String _parameterColorsDefault = '6'; String _parameterSkin = ''; String _parameterSkinDefault = 'default'; @@ -32,15 +36,32 @@ class Data extends ChangeNotifier { // Game data bool _assetsPreloaded = false; bool _gameIsRunning = false; + bool _gameIsFinished = false; + int _sizeVertical = 0; + int _sizeHorizontal = 0; + int _colorsCount = 0; + List<List<Cell>> _cells = []; String _currentState = ''; + int _availableBlocksCount = 0; + int _score = 0; + int _movesCount = 0; void updateParameterLevel(String parameterLevel) { _parameterLevel = parameterLevel; notifyListeners(); } + int get sizeVertical => _sizeVertical; + int get sizeHorizontal => _sizeHorizontal; void updateParameterSize(String parameterSize) { _parameterSize = parameterSize; + updateBoardSize(getBoardSizeFromParameter(parameterSize)); + notifyListeners(); + } + + void updateParameterColors(String parameterColors) { + _parameterColors = parameterColors; + updateColorsCount(getColorsCountFromParameter(parameterColors)); notifyListeners(); } @@ -52,11 +73,21 @@ class Data extends ChangeNotifier { String getParameterValue(String parameterCode) { switch (parameterCode) { case 'level': - return _parameterLevel; + { + return _parameterLevel; + } case 'size': - return _parameterSize; + { + return _parameterSize; + } + case 'colors': + { + return _parameterColors; + } case 'skin': - return _parameterSkin; + { + return _parameterSkin; + } } return ''; } @@ -64,11 +95,21 @@ class Data extends ChangeNotifier { List getParameterAvailableValues(String parameterCode) { switch (parameterCode) { case 'level': - return _availableLevelValues; + { + return _availableLevelValues; + } case 'size': - return _availableSizeValues; + { + return _availableSizeValues; + } + case 'colors': + { + return _availableColorsValues; + } case 'skin': - return _availableSkinValues; + { + return _availableSkinValues; + } } return []; } @@ -76,13 +117,24 @@ class Data extends ChangeNotifier { void setParameterValue(String parameterCode, String parameterValue) async { switch (parameterCode) { case 'level': - updateParameterLevel(parameterValue); + { + updateParameterLevel(parameterValue); + } break; case 'size': - updateParameterSize(parameterValue); + { + updateParameterSize(parameterValue); + } + break; + case 'colors': + { + updateParameterColors(parameterValue); + } break; case 'skin': - updateParameterSkin(parameterValue); + { + updateParameterSkin(parameterValue); + } break; } final prefs = await SharedPreferences.getInstance(); @@ -93,16 +145,79 @@ class Data extends ChangeNotifier { final prefs = await SharedPreferences.getInstance(); setParameterValue('level', prefs.getString('level') ?? _parameterLevelDefault); setParameterValue('size', prefs.getString('size') ?? _parameterSizeDefault); + setParameterValue('colors', prefs.getString('colors') ?? _parameterColorsDefault); setParameterValue('skin', prefs.getString('skin') ?? _parameterSkinDefault); } + String getBoardSizeFromParameter(String parameterSize) { + switch (parameterSize) { + case 'small': + { + return '6x6'; + } + case 'medium': + { + return '10x10'; + } + case 'large': + { + return '14x14'; + } + case 'extra': + { + return '20x20'; + } + } + return getBoardSizeFromParameter(_parameterSizeDefault); + } + + int getColorsCountFromParameter(String parameterColors) { + switch (parameterColors) { + case '5': + { + return 5; + } + case '6': + { + return 6; + } + case '7': + { + return 7; + } + case '8': + { + return 8; + } + } + return getColorsCountFromParameter(_parameterColorsDefault); + } + + void updateBoardSize(String boardSize) { + _sizeHorizontal = int.parse(boardSize.split('x')[0]); + _sizeVertical = int.parse(boardSize.split('x')[1]); + } + + int get colorsCount => _colorsCount; + void updateColorsCount(int colorsCount) { + _colorsCount = colorsCount; + } + String get currentState => _currentState; String computeCurrentGameState() { + String cellsValues = ''; + for (var rowIndex = 0; rowIndex < _cells.length; rowIndex++) { + for (var colIndex = 0; colIndex < _cells[rowIndex].length; colIndex++) { + cellsValues += _cells[rowIndex][colIndex].value; + } + } + var currentState = { 'level': _parameterLevel, 'size': _parameterSize, 'skin': _parameterSkin, + 'board': cellsValues, }; return json.encode(currentState); @@ -151,19 +266,61 @@ class Data extends ChangeNotifier { _assetsPreloaded = assetsPreloaded; } - bool get gameIsRunning => _gameIsRunning; - bool get isGameFinished => !_gameIsRunning; + List<List<Cell>> get cells => _cells; + void updateCells(List<List<Cell>> cells) { + _cells = cells; + notifyListeners(); + } + + Cell getCell(int row, int col) { + return cells[row][col]; + } + + String getCellValue(int row, int col) { + return getCell(row, col).value; + } + + updateCellValue(int col, int row, String value) { + _cells[row][col].value = value; + notifyListeners(); + } + + bool get isGameRunning => _gameIsRunning; void updateGameIsRunning(bool gameIsRunning) { _gameIsRunning = gameIsRunning; notifyListeners(); } - bool gameWon() { - return isGameFinished; + bool get isGameFinished => _gameIsFinished; + void updateGameIsFinished(bool gameIsFinished) { + _gameIsFinished = gameIsFinished; + notifyListeners(); + } + + int get availableBlocksCount => _availableBlocksCount; + void updateAvailableBlocksCount(int availableBlocksCount) { + _availableBlocksCount = availableBlocksCount; + notifyListeners(); + } + + int get score => _score; + void increaseScore(int increment) { + _score += increment; + notifyListeners(); + } + + int get movesCount => _movesCount; + void increaseMovesCount() { + _movesCount++; + notifyListeners(); } void resetGame() { _gameIsRunning = false; + _gameIsFinished = false; + _availableBlocksCount = 0; + _score = 0; + _movesCount = 0; notifyListeners(); } } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 0ea0de43131b42d6bb76ce3d97de600a74d805b7..ca3fb6d8119092b52d20bf7df20a69d2da5e434d 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -42,7 +42,15 @@ class _HomeState extends State<Home> { gameImages.forEach((image) => assets.add('assets/icons/' + image + '.png')); List skinImages = [ - 'empty', + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', ]; myProvider.availableSkinValues.forEach((skin) => skinImages @@ -63,7 +71,7 @@ class _HomeState extends State<Home> { List<Widget> menuActions = []; - if (myProvider.gameIsRunning) { + if (myProvider.isGameRunning) { menuActions = [ TextButton( child: Container( @@ -91,7 +99,7 @@ class _HomeState extends State<Home> { ), body: SafeArea( child: Center( - child: myProvider.gameIsRunning + child: myProvider.isGameRunning ? Game.buildGameWidget(myProvider) : Parameters.buildParametersSelector(myProvider), ), diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart new file mode 100644 index 0000000000000000000000000000000000000000..f2707978a4278362d3b2e544f4c62ba1087d11c6 --- /dev/null +++ b/lib/utils/board_utils.dart @@ -0,0 +1,217 @@ +import 'dart:math'; + +import 'package:jeweled_game/entities/cell.dart'; +import 'package:jeweled_game/provider/data.dart'; + +class BoardUtils { + static printGrid(List cells) { + print(''); + print('-------'); + for (var rowIndex = 0; rowIndex < cells.length; rowIndex++) { + String row = ''; + for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) { + row += cells[rowIndex][colIndex].value; + } + print(row); + } + print('-------'); + print(''); + } + + static createNewBoard(Data myProvider) { + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; + int maxValue = myProvider.colorsCount; + + var rand = new Random(); + + List<List<Cell>> grid = []; + for (var rowIndex = 0; rowIndex < boardSizeVertical; rowIndex++) { + List<Cell> row = []; + for (var colIndex = 0; colIndex < boardSizeHorizontal; colIndex++) { + int value = 1 + rand.nextInt(maxValue); + row.add(Cell(value.toString())); + } + grid.add(row); + } + printGrid(grid); + + myProvider.resetGame(); + myProvider.updateCells(grid); + myProvider.updateAvailableBlocksCount(getAvailableBlocks(myProvider).length); + } + + // static List createBoardFromSavedState(Data myProvider, String savedBoard) { + // List<List<Cell?>> board = []; + // int boardSize = pow((savedBoard.length / 6), 1 / 2).round(); + // String boardSizeAsString = boardSize.toString() + 'x' + boardSize.toString(); + // myProvider.updateParameterSize(boardSizeAsString); + + // int index = 0; + // for (var rowIndex = 0; rowIndex < boardSize; rowIndex++) { + // List<Cell?> row = []; + // for (var colIndex = 0; colIndex < boardSize; colIndex++) { + // String value = savedBoard[index++]; + + // Cell cell = Cell(value); + + // row.add(cell); + // } + // board.add(row); + // } + + // printGrid(board); + + // return board; + // } + + static List<List<int>> getSiblingCells( + Data myProvider, row, col, List<List<int>> siblingCells) { + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; + + String referenceValue = myProvider.getCellValue(row, col); + + for (var deltaRow = -1; deltaRow <= 1; deltaRow++) { + for (var deltaCol = -1; deltaCol <= 1; deltaCol++) { + if (deltaCol == 0 || deltaRow == 0) { + int candidateRow = row + deltaRow; + int candidateCol = col + deltaCol; + + if ((candidateRow >= 0 && candidateRow < boardSizeVertical) && + (candidateCol >= 0 && candidateCol < boardSizeHorizontal)) { + if (myProvider.getCellValue(candidateRow, candidateCol) == referenceValue) { + bool alreadyFound = false; + for (var index = 0; index < siblingCells.length; index++) { + if ((siblingCells[index][0] == candidateRow) && + (siblingCells[index][1] == candidateCol)) { + alreadyFound = true; + } + } + if (!alreadyFound) { + siblingCells.add([candidateRow, candidateCol]); + siblingCells = + getSiblingCells(myProvider, candidateRow, candidateCol, siblingCells); + } + } + } + } + } + } + + return siblingCells; + } + + static List getAvailableBlocks(Data myProvider) { + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; + + List blocks = []; + + for (var row = 0; row < boardSizeVertical; row++) { + for (var col = 0; col < boardSizeHorizontal; col++) { + if (myProvider.getCellValue(row, col) != '0') { + // if current cell not already in a found block + bool alreadyFound = false; + blocks.forEach((foundBlock) { + foundBlock.forEach((foundBlockCell) { + if ((foundBlockCell[0] == row) && (foundBlockCell[1] == col)) { + alreadyFound = true; + } + }); + }); + if (!alreadyFound) { + List<List<int>> block = getSiblingCells(myProvider, row, col, []); + if (block.length >= 3) { + blocks.add(block); + } + } + } + } + } + + return blocks; + } + + static bool checkBoardIsBlocked(Data myProvider) { + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; + + for (var row = 0; row < boardSizeVertical; row++) { + for (var col = 0; col < boardSizeHorizontal; col++) { + if (myProvider.getCellValue(row, col) != '0') { + List<List<int>> block = getSiblingCells(myProvider, row, col, []); + if (block.length >= 3) { + // found one block => ok, not locked + return false; + } + } + } + } + + print('Board is locked'); + return true; + } + + static String getFillValue(Data myProvider, int row, int col) { + var rand = new Random(); + int maxValue = myProvider.colorsCount; + int value = 1 + rand.nextInt(maxValue); + + return value.toString(); + } + + static moveCellsDown(Data myProvider) { + int boardSizeHorizontal = myProvider.sizeHorizontal; + int boardSizeVertical = myProvider.sizeVertical; + + for (int row = 0; row < boardSizeVertical; row++) { + for (int col = 0; col < boardSizeHorizontal; col++) { + if (myProvider.getCellValue(row, col) == '0') { + for (int r = row; r > 0; r--) { + myProvider.updateCellValue(col, r, myProvider.getCellValue(r - 1, col)); + } + myProvider.updateCellValue(col, 0, getFillValue(myProvider, row, col)); + } + } + } + } + + static deleteCell(Data myProvider, int row, int col) { + myProvider.updateCellValue(col, row, '0'); + } + + static void deleteBlock(Data myProvider, List<List<int>> block) { + // Sort cells from top to bottom + block.sort((cell1, cell2) => cell1[0].compareTo(cell2[0])); + // Delete all cells + block.forEach((element) { + deleteCell(myProvider, element[0], element[1]); + }); + // Gravity! + moveCellsDown(myProvider); + } + + static int getScoreFromBlock(int blockSize) { + return 3 * (blockSize - 2); + } + + static void tapOnCell(Data myProvider, int row, int col) { + String cellValue = myProvider.getCellValue(row, col); + print('Tap on cell[' + col.toString() + '][' + row.toString() + ']: ' + cellValue); + + if (cellValue != '0') { + List<List<int>> block = getSiblingCells(myProvider, row, col, []); + if (block.length >= 3) { + deleteBlock(myProvider, block); + myProvider.increaseMovesCount(); + myProvider.increaseScore(block.length); + myProvider.updateAvailableBlocksCount(getAvailableBlocks(myProvider).length); + } + } + + if (checkBoardIsBlocked(myProvider)) { + myProvider.updateGameIsFinished(true); + } + } +} diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index 9ece9ceccbd2a2629e223ad2a7aee71e63d3139b..3515d2fad48b19c56491eb47bcf233ce76174fe0 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -1,4 +1,6 @@ import 'package:jeweled_game/provider/data.dart'; +import 'package:jeweled_game/utils/board_utils.dart'; +// import 'package:jeweled_game/utils/board_utils.dart'; class GameUtils { static Future<void> quitGame(Data myProvider) async { @@ -11,6 +13,7 @@ class GameUtils { print('- size: ' + myProvider.parameterSize); myProvider.resetGame(); + BoardUtils.createNewBoard(myProvider); myProvider.updateGameIsRunning(true); } @@ -27,6 +30,8 @@ class GameUtils { myProvider.setParameterValue('size', savedState['size']); myProvider.setParameterValue('skin', savedState['skin']); + // myProvider.updateCells( + // BoardUtils.createBoardFromSavedState(myProvider, savedState['board'])); myProvider.updateGameIsRunning(true); } catch (e) { print('Failed to resume game. Will start new one instead.'); diff --git a/pubspec.lock b/pubspec.lock index c6a8d1d185d50a811c7dc375a759a3567d303e2f..522d85c693519cf8c73e0e5a03f0cf286f72956c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -134,7 +134,7 @@ packages: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" path_provider_windows: dependency: transitive description: