From 0f87f5ad65cf111dc168fcef963ebd3f99f461ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Fri, 23 Jul 2021 21:38:35 +0200 Subject: [PATCH] Finalize gameplay --- android/gradle.properties | 4 +- assets/files/.gitkeep | 0 assets/skins/default_button_mark_mine_off.png | Bin 0 -> 2020 bytes assets/skins/default_button_mark_mine_on.png | Bin 0 -> 4799 bytes .../{default_0.png => default_tile_0.png} | Bin .../{default_1.png => default_tile_1.png} | Bin .../{default_2.png => default_tile_2.png} | Bin .../{default_3.png => default_tile_3.png} | Bin .../{default_4.png => default_tile_4.png} | Bin .../{default_5.png => default_tile_5.png} | Bin .../{default_6.png => default_tile_6.png} | Bin .../{default_7.png => default_tile_7.png} | Bin .../{default_8.png => default_tile_8.png} | Bin assets/skins/default_tile_flag.png | Bin 0 -> 5169 bytes assets/skins/default_tile_flag_ko.png | Bin 0 -> 4865 bytes assets/skins/default_tile_flag_ok.png | Bin 0 -> 5041 bytes ...default_mine.png => default_tile_mine.png} | Bin assets/skins/default_tile_mine_not_found.png | Bin 0 -> 6589 bytes ...t_unknown.png => default_tile_unknown.png} | Bin .../metadata/android/en-US/changelogs/4.txt | 1 + .../metadata/android/fr-FR/changelogs/4.txt | 1 + icons/build_game_icons.sh | 28 +++++-- icons/skins/default/button_mark_mine_off.svg | 2 + icons/skins/default/button_mark_mine_on.svg | 2 + icons/skins/default/{0.svg => tile_0.svg} | 0 icons/skins/default/{1.svg => tile_1.svg} | 0 icons/skins/default/{2.svg => tile_2.svg} | 0 icons/skins/default/{3.svg => tile_3.svg} | 0 icons/skins/default/{4.svg => tile_4.svg} | 0 icons/skins/default/{5.svg => tile_5.svg} | 0 icons/skins/default/{6.svg => tile_6.svg} | 0 icons/skins/default/{7.svg => tile_7.svg} | 0 icons/skins/default/{8.svg => tile_8.svg} | 0 icons/skins/default/tile_flag.svg | 2 + icons/skins/default/tile_flag_ko.svg | 2 + icons/skins/default/tile_flag_ok.svg | 2 + .../skins/default/{mine.svg => tile_mine.svg} | 0 icons/skins/default/tile_mine_not_found.svg | 2 + .../default/{unknown.svg => tile_unknown.svg} | 0 lib/entities/cell.dart | 70 ++++++++++++++---- lib/layout/board.dart | 42 ++++++++++- lib/layout/game.dart | 4 +- lib/provider/data.dart | 27 +++++-- lib/screens/home.dart | 4 +- lib/utils/board_utils.dart | 23 ++++-- lib/utils/game_utils.dart | 5 +- pubspec.lock | 6 +- pubspec.yaml | 1 - 48 files changed, 182 insertions(+), 46 deletions(-) delete mode 100644 assets/files/.gitkeep create mode 100644 assets/skins/default_button_mark_mine_off.png create mode 100644 assets/skins/default_button_mark_mine_on.png rename assets/skins/{default_0.png => default_tile_0.png} (100%) rename assets/skins/{default_1.png => default_tile_1.png} (100%) rename assets/skins/{default_2.png => default_tile_2.png} (100%) rename assets/skins/{default_3.png => default_tile_3.png} (100%) rename assets/skins/{default_4.png => default_tile_4.png} (100%) rename assets/skins/{default_5.png => default_tile_5.png} (100%) rename assets/skins/{default_6.png => default_tile_6.png} (100%) rename assets/skins/{default_7.png => default_tile_7.png} (100%) rename assets/skins/{default_8.png => default_tile_8.png} (100%) create mode 100644 assets/skins/default_tile_flag.png create mode 100644 assets/skins/default_tile_flag_ko.png create mode 100644 assets/skins/default_tile_flag_ok.png rename assets/skins/{default_mine.png => default_tile_mine.png} (100%) create mode 100644 assets/skins/default_tile_mine_not_found.png rename assets/skins/{default_unknown.png => default_tile_unknown.png} (100%) create mode 100644 fastlane/metadata/android/en-US/changelogs/4.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/4.txt create mode 100644 icons/skins/default/button_mark_mine_off.svg create mode 100644 icons/skins/default/button_mark_mine_on.svg rename icons/skins/default/{0.svg => tile_0.svg} (100%) rename icons/skins/default/{1.svg => tile_1.svg} (100%) rename icons/skins/default/{2.svg => tile_2.svg} (100%) rename icons/skins/default/{3.svg => tile_3.svg} (100%) rename icons/skins/default/{4.svg => tile_4.svg} (100%) rename icons/skins/default/{5.svg => tile_5.svg} (100%) rename icons/skins/default/{6.svg => tile_6.svg} (100%) rename icons/skins/default/{7.svg => tile_7.svg} (100%) rename icons/skins/default/{8.svg => tile_8.svg} (100%) create mode 100644 icons/skins/default/tile_flag.svg create mode 100644 icons/skins/default/tile_flag_ko.svg create mode 100644 icons/skins/default/tile_flag_ok.svg rename icons/skins/default/{mine.svg => tile_mine.svg} (100%) create mode 100644 icons/skins/default/tile_mine_not_found.svg rename icons/skins/default/{unknown.svg => tile_unknown.svg} (100%) diff --git a/android/gradle.properties b/android/gradle.properties index db7a1ee..14eed39 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.3 -app.versionCode=3 +app.versionName=0.0.4 +app.versionCode=4 diff --git a/assets/files/.gitkeep b/assets/files/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/assets/skins/default_button_mark_mine_off.png b/assets/skins/default_button_mark_mine_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e94bd696f674b4674317ce8e47ec9f8a88e276fd GIT binary patch literal 2020 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 ZZFXp{(p?((g@J*A!PC{xWt~$(69E2C5C{MO literal 0 HcmV?d00001 diff --git a/assets/skins/default_button_mark_mine_on.png b/assets/skins/default_button_mark_mine_on.png new file mode 100644 index 0000000000000000000000000000000000000000..844e04be955563ec32beef6f661e2d2970e6d636 GIT binary patch literal 4799 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 literal 0 HcmV?d00001 diff --git a/assets/skins/default_0.png b/assets/skins/default_tile_0.png similarity index 100% rename from assets/skins/default_0.png rename to assets/skins/default_tile_0.png diff --git a/assets/skins/default_1.png b/assets/skins/default_tile_1.png similarity index 100% rename from assets/skins/default_1.png rename to assets/skins/default_tile_1.png diff --git a/assets/skins/default_2.png b/assets/skins/default_tile_2.png similarity index 100% rename from assets/skins/default_2.png rename to assets/skins/default_tile_2.png diff --git a/assets/skins/default_3.png b/assets/skins/default_tile_3.png similarity index 100% rename from assets/skins/default_3.png rename to assets/skins/default_tile_3.png diff --git a/assets/skins/default_4.png b/assets/skins/default_tile_4.png similarity index 100% rename from assets/skins/default_4.png rename to assets/skins/default_tile_4.png diff --git a/assets/skins/default_5.png b/assets/skins/default_tile_5.png similarity index 100% rename from assets/skins/default_5.png rename to assets/skins/default_tile_5.png diff --git a/assets/skins/default_6.png b/assets/skins/default_tile_6.png similarity index 100% rename from assets/skins/default_6.png rename to assets/skins/default_tile_6.png diff --git a/assets/skins/default_7.png b/assets/skins/default_tile_7.png similarity index 100% rename from assets/skins/default_7.png rename to assets/skins/default_tile_7.png diff --git a/assets/skins/default_8.png b/assets/skins/default_tile_8.png similarity index 100% rename from assets/skins/default_8.png rename to assets/skins/default_tile_8.png diff --git a/assets/skins/default_tile_flag.png b/assets/skins/default_tile_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..15f2f2f76b687665b134492e44acaef589850bd2 GIT binary patch literal 5169 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 Z$G-TS?h}T~J<~wyJzf1=);T3K0RVcho@)RA literal 0 HcmV?d00001 diff --git a/assets/skins/default_tile_flag_ko.png b/assets/skins/default_tile_flag_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8598af1fd30b3c1bdf524bd815b18d3d1ef9c6 GIT binary patch literal 4865 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 b{-Nu2ce0P^B+Xq63=9mOu6{1-oD!M<ud_8; literal 0 HcmV?d00001 diff --git a/assets/skins/default_tile_flag_ok.png b/assets/skins/default_tile_flag_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..6f87550f930b4ae093d7620d4616f51a4f1139fc GIT binary patch literal 5041 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%0A#mgQ$p6-`N<Zj*Ss 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 E0C#7AQvd(} literal 0 HcmV?d00001 diff --git a/assets/skins/default_mine.png b/assets/skins/default_tile_mine.png similarity index 100% rename from assets/skins/default_mine.png rename to assets/skins/default_tile_mine.png diff --git a/assets/skins/default_tile_mine_not_found.png b/assets/skins/default_tile_mine_not_found.png new file mode 100644 index 0000000000000000000000000000000000000000..a28db91fca96e5a509956ddd81d51bea2cd974c1 GIT binary patch literal 6589 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 UsH-u7fq{X+)78&qol`;+02H{QyZ`_I literal 0 HcmV?d00001 diff --git a/assets/skins/default_unknown.png b/assets/skins/default_tile_unknown.png similarity index 100% rename from assets/skins/default_unknown.png rename to assets/skins/default_tile_unknown.png diff --git a/fastlane/metadata/android/en-US/changelogs/4.txt b/fastlane/metadata/android/en-US/changelogs/4.txt new file mode 100644 index 0000000..60ec69f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/4.txt @@ -0,0 +1 @@ +Finalize minimal gameplay. diff --git a/fastlane/metadata/android/fr-FR/changelogs/4.txt b/fastlane/metadata/android/fr-FR/changelogs/4.txt new file mode 100644 index 0000000..6f741b5 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/4.txt @@ -0,0 +1 @@ +Finalisation du jeu minimal. diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh index aae2bcb..c57007a 100755 --- a/icons/build_game_icons.sh +++ b/icons/build_game_icons.sh @@ -43,19 +43,33 @@ function build_icon() { optipng ${OPTIPNG_OPTIONS} ${TARGET} } -function build_icon_for_skin() { +function build_icons_for_skin() { SKIN_CODE="$1" - build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/mine.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_mine.png - build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/unknown.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_unknown.png + build_icon_for_skin ${SKIN_CODE} button_mark_mine_on + build_icon_for_skin ${SKIN_CODE} button_mark_mine_off + + build_icon_for_skin ${SKIN_CODE} tile_mine + build_icon_for_skin ${SKIN_CODE} tile_mine_not_found + + build_icon_for_skin ${SKIN_CODE} tile_flag + build_icon_for_skin ${SKIN_CODE} tile_flag_ok + build_icon_for_skin ${SKIN_CODE} tile_flag_ko + + build_icon_for_skin ${SKIN_CODE} tile_unknown for VALUE in {0..8}; do - if [ -f "${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg" ]; then - build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${VALUE}.png - fi + build_icon_for_skin ${SKIN_CODE} tile_${VALUE} done } +function build_icon_for_skin() { + SKIN_CODE="$1" + IMAGE_CODE="$2" + + build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${IMAGE_CODE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${IMAGE_CODE}.png +} + # Game icons build_icon ${CURRENT_DIR}/button_back.svg ${BASE_DIR}/assets/icons/button_back.png build_icon ${CURRENT_DIR}/button_start.svg ${BASE_DIR}/assets/icons/button_start.png @@ -71,4 +85,4 @@ build_icon ${CURRENT_DIR}/size_20x20.svg ${BASE_DIR}/assets/icons/size_20x20.png build_icon ${CURRENT_DIR}/skins/empty.svg ${BASE_DIR}/assets/skins/empty.png # Skins -build_icon_for_skin "default" +build_icons_for_skin "default" diff --git a/icons/skins/default/button_mark_mine_off.svg b/icons/skins/default/button_mark_mine_off.svg new file mode 100644 index 0000000..f4ab60e --- /dev/null +++ b/icons/skins/default/button_mark_mine_off.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 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="-.0013123" y="-.0014381" width="93.668" height="93.679" ry="0" fill="#ea9c1f" stroke="#fff" stroke-width=".24146"/><path d="m62.564 39.496c-4.3118 1.5875-7.5974 2.7182-10.487 6.2927-2.5748 3.1852-6.2927 4.2894-10.487 2.1897v11.444h-2.0975v-28.316c0-0.5797 0.46905-1.0487 1.0487-1.0487s1.0487 0.46905 1.0487 1.0487c2.329 3.3859 6.3764 4.1356 10.487 4.195 6.2927 0.09216 10.487 4.195 10.487 4.195zm-18.878 13.913v2.1344c2.4744 0.50594 4.195 1.5793 4.195 2.8309 0 1.737-3.2876 3.1463-7.3413 3.1463s-7.3413-1.4093-7.3413-3.1463c0-1.2516 1.7206-2.3249 4.195-2.8309v-2.1343c-3.8099 0.65962-6.2927 2.5072-6.2927 4.9652 0 3.0869 3.8816 5.2437 9.4389 5.2437s9.4389-2.1569 9.4389-5.2437c0-2.458-2.4826-4.3055-6.2927-4.9652z" fill="#af0303" stroke="#730202" stroke-linejoin="round" stroke-width=".84528"/></svg> diff --git a/icons/skins/default/button_mark_mine_on.svg b/icons/skins/default/button_mark_mine_on.svg new file mode 100644 index 0000000..c8c4e65 --- /dev/null +++ b/icons/skins/default/button_mark_mine_on.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 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="-.0013123" y="-.0014381" width="93.668" height="93.679" ry="0" fill="#ea9c1f" stroke="#fff" stroke-width=".24146"/><path d="m84.054 29.467c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#af0303" stroke="#730202" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/icons/skins/default/0.svg b/icons/skins/default/tile_0.svg similarity index 100% rename from icons/skins/default/0.svg rename to icons/skins/default/tile_0.svg diff --git a/icons/skins/default/1.svg b/icons/skins/default/tile_1.svg similarity index 100% rename from icons/skins/default/1.svg rename to icons/skins/default/tile_1.svg diff --git a/icons/skins/default/2.svg b/icons/skins/default/tile_2.svg similarity index 100% rename from icons/skins/default/2.svg rename to icons/skins/default/tile_2.svg diff --git a/icons/skins/default/3.svg b/icons/skins/default/tile_3.svg similarity index 100% rename from icons/skins/default/3.svg rename to icons/skins/default/tile_3.svg diff --git a/icons/skins/default/4.svg b/icons/skins/default/tile_4.svg similarity index 100% rename from icons/skins/default/4.svg rename to icons/skins/default/tile_4.svg diff --git a/icons/skins/default/5.svg b/icons/skins/default/tile_5.svg similarity index 100% rename from icons/skins/default/5.svg rename to icons/skins/default/tile_5.svg diff --git a/icons/skins/default/6.svg b/icons/skins/default/tile_6.svg similarity index 100% rename from icons/skins/default/6.svg rename to icons/skins/default/tile_6.svg diff --git a/icons/skins/default/7.svg b/icons/skins/default/tile_7.svg similarity index 100% rename from icons/skins/default/7.svg rename to icons/skins/default/tile_7.svg diff --git a/icons/skins/default/8.svg b/icons/skins/default/tile_8.svg similarity index 100% rename from icons/skins/default/8.svg rename to icons/skins/default/tile_8.svg diff --git a/icons/skins/default/tile_flag.svg b/icons/skins/default/tile_flag.svg new file mode 100644 index 0000000..5632b14 --- /dev/null +++ b/icons/skins/default/tile_flag.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"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#e86f04" stroke="#773802" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/icons/skins/default/tile_flag_ko.svg b/icons/skins/default/tile_flag_ko.svg new file mode 100644 index 0000000..dd83b8f --- /dev/null +++ b/icons/skins/default/tile_flag_ko.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"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#e80604" stroke="#770302" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/icons/skins/default/tile_flag_ok.svg b/icons/skins/default/tile_flag_ok.svg new file mode 100644 index 0000000..a7db810 --- /dev/null +++ b/icons/skins/default/tile_flag_ok.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"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#5aaf03" stroke="#027302" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/icons/skins/default/mine.svg b/icons/skins/default/tile_mine.svg similarity index 100% rename from icons/skins/default/mine.svg rename to icons/skins/default/tile_mine.svg diff --git a/icons/skins/default/tile_mine_not_found.svg b/icons/skins/default/tile_mine_not_found.svg new file mode 100644 index 0000000..f637966 --- /dev/null +++ b/icons/skins/default/tile_mine_not_found.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"/><g transform="matrix(1.0346 0 0 1.0346 -1.7311 -1.7312)" fill="#787878" stroke="#444343" stroke-width="1.9331"><path d="m92.148 55.869c-0.626-0.939-1.482-1.519-2.568-1.739l-6.792-1.242c0.368-5.669-0.727-11.035-3.286-16.096l5.853-4.224c0.939-0.663 1.491-1.574 1.657-2.733 0.202-1.086-0.037-2.071-0.718-2.954l-0.469-0.718c-0.626-0.883-1.537-1.427-2.733-1.629-1.031-0.166-2.016 0.092-2.954 0.773l-5.632 4.059c-3.81-4.215-8.347-7.206-13.611-8.973l1.27-7.731c0.202-1.104-0.037-2.126-0.718-3.065-0.626-0.883-1.482-1.427-2.568-1.629l-0.856-0.166c-1.104-0.147-2.126 0.092-3.065 0.718-0.884 0.681-1.427 1.565-1.629 2.65l-1.16 7.427c-2.503-0.221-4.951-0.175-7.344 0.138-1.362 0.055-2.641 0.294-3.838 0.718-0.626 0.147-1.224 0.331-1.795 0.552l-3.451-7.51c-0.46-0.994-1.215-1.693-2.264-2.098-1.031-0.423-2.043-0.405-3.037 0.055l-0.773 0.414c-0.994 0.405-1.73 1.16-2.209 2.264-0.368 1.031-0.313 2.043 0.166 3.037l3.506 7.648c-0.202 0.11-0.405 0.249-0.607 0.414-5.264 3.681-9.019 8.31-11.265 13.888l-6.958-1.546c-1.086-0.276-2.098-0.074-3.037 0.607-0.994 0.534-1.592 1.344-1.795 2.43l-0.246 0.772c-0.203 1.104-0.018 2.172 0.552 3.203 0.626 0.883 1.491 1.463 2.595 1.739l6.626 1.546c-0.736 5.835 0.101 11.329 2.512 16.483l-5.411 3.672c-0.939 0.626-1.537 1.491-1.795 2.595-0.147 1.086 0.092 2.098 0.718 3.037l0.469 0.635c0.626 0.939 1.454 1.537 2.485 1.795 1.16 0.147 2.209-0.092 3.147-0.718l5.135-3.424c3.7 4.583 8.255 7.887 13.667 9.912l-1.242 6.323c-0.202 1.104 9e-3 2.154 0.635 3.147 0.626 0.883 1.482 1.427 2.568 1.629l0.801 0.166c1.086 0.258 2.098 0.101 3.037-0.469 0.939-0.681 1.509-1.574 1.712-2.678l1.242-6.074c6 0.626 11.651-0.285 16.952-2.733l4.003 6.074c0.626 0.939 1.509 1.518 2.651 1.739 1.049 0.258 2.043 0.074 2.982-0.552l0.69-0.387c0.939-0.626 1.537-1.518 1.795-2.678 0.203-1.086-9e-3 -2.098-0.635-3.037l-3.81-5.936c4.583-3.7 7.841-8.255 9.774-13.667l6.875 1.242c1.086 0.202 2.098-9e-3 3.037-0.635 0.883-0.607 1.427-1.463 1.629-2.568l0.166-0.773c0.202-1.103-0.01-2.143-0.636-3.119zm-50.085-15.013c-0.824 1.929-2.217 3.297-4.178 4.102-1.962 0.806-3.92 0.815-5.876 0.028-1.936-0.778-3.299-2.13-4.09-4.056s-0.774-3.853 0.05-5.782c0.844-1.92 2.247-3.284 4.209-4.089 1.962-0.806 3.91-0.819 5.846-0.041 1.956 0.787 3.329 2.144 4.12 4.069 0.79 1.925 0.763 3.848-0.081 5.769z" fill="#787878" stroke="#444343" stroke-width="1.9331"/></g></svg> diff --git a/icons/skins/default/unknown.svg b/icons/skins/default/tile_unknown.svg similarity index 100% rename from icons/skins/default/unknown.svg rename to icons/skins/default/tile_unknown.svg diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart index e2a6c0d..30b0e1b 100644 --- a/lib/entities/cell.dart +++ b/lib/entities/cell.dart @@ -7,6 +7,7 @@ class Cell { bool isMined = false; bool isExplored = false; bool isMarked = false; + bool isExploded = false; int minesCountAround = 0; Cell( @@ -14,17 +15,10 @@ class Cell { ); Container widget(Data myProvider, int row, int col) { - String imageAsset = 'assets/skins/' + myProvider.skin + '_unknown.png'; + bool showSolution = myProvider.gameWin || myProvider.gameFail; - Color backgroundColor = this.getBackgroundColor(); - - if (this.isExplored) { - if (this.isMined) { - imageAsset = 'assets/skins/' + myProvider.skin + '_mine.png'; - } else { - imageAsset = 'assets/skins/' + myProvider.skin + '_' + this.minesCountAround.toString() + '.png'; - } - } + Color backgroundColor = this.getBackgroundColor(myProvider); + String imageAsset = this.getImageAssetName(myProvider.skin, showSolution); return Container( decoration: BoxDecoration( @@ -40,14 +34,64 @@ class Cell { fit: BoxFit.fill, ), onTap: () { - BoardUtils.walkOnCell(myProvider, row, col); - BoardUtils.checkBoardIsSolved(myProvider); + if (!(myProvider.gameWin || myProvider.gameFail)) { + if (myProvider.reportMode) { + BoardUtils.reportCell(myProvider, row, col); + } else { + BoardUtils.walkOnCell(myProvider, row, col); + } + } + BoardUtils.checkGameIsFinished(myProvider); }, ), ); } - Color getBackgroundColor() { + String getImageAssetName(String skin, bool showSolution) { + String imageAsset = 'assets/skins/' + skin + '_tile_unknown.png'; + + if (!showSolution) { + // Running game + if (this.isExplored) { + if (this.isMined) { + // Boom + imageAsset = 'assets/skins/' + skin + '_tile_mine.png'; + } else { + // Show mines count around + imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png'; + } + } else { + if (this.isMarked) { + // Danger! + imageAsset = 'assets/skins/' + skin + '_tile_flag.png'; + } + } + } else { + // Finished game + if (this.isMined) { + if (this.isExploded) { + // Mine exploded + imageAsset = 'assets/skins/' + skin + '_tile_mine.png'; + } else { + // Mine not found + imageAsset = 'assets/skins/' + skin + '_tile_mine_not_found.png'; + } + } else { + // Show all mines counts + imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png'; + } + } + + return imageAsset; + } + + Color getBackgroundColor(Data myProvider) { + if (myProvider.gameWin) { + return Colors.green[300]; + } else if (myProvider.gameFail) { + return Colors.pink[200]; + } + return Colors.white; } } diff --git a/lib/layout/board.dart b/lib/layout/board.dart index b5e1d12..f333605 100644 --- a/lib/layout/board.dart +++ b/lib/layout/board.dart @@ -5,14 +5,16 @@ import '../provider/data.dart'; class Board { static Container buildGameBoard(Data myProvider) { + Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black; + return Container( margin: EdgeInsets.all(2), padding: EdgeInsets.all(2), decoration: BoxDecoration( - color: Colors.black, + color: borderColor, borderRadius: BorderRadius.circular(2), border: Border.all( - color: Colors.black, + color: borderColor, width: 2, ), ), @@ -41,4 +43,40 @@ class Board { ); } + static FlatButton buildToggleFlagModeButton(Data myProvider) { + String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; + + return FlatButton( + child: Container( + child: Image( + image: AssetImage('assets/skins/' + myProvider.skin + '_button_mark_mine_' + reportModeSuffix + '.png'), + fit: BoxFit.fill, + ), + ), + onPressed: () => myProvider.updateReportMode(!myProvider.reportMode), + ); + } + + static Table buildToggleFlagModeLayout(Data myProvider) { + Image paddingBlock = Image( + image: AssetImage('assets/skins/empty.png'), + fit: BoxFit.fill, + ); + + return Table( + defaultColumnWidth: IntrinsicColumnWidth(), + children: [ + TableRow( + children: [ + TableCell(child: paddingBlock), + TableCell(child: paddingBlock), + TableCell(child: buildToggleFlagModeButton(myProvider)), + TableCell(child: paddingBlock), + TableCell(child: paddingBlock), + ], + ), + ], + ); + } + } diff --git a/lib/layout/game.dart b/lib/layout/game.dart index 8333c64..5b226c8 100644 --- a/lib/layout/game.dart +++ b/lib/layout/game.dart @@ -14,7 +14,9 @@ class Game { children: [ Board.buildGameBoard(myProvider), SizedBox(height: 2), - (myProvider.gameWin || myProvider.gameFail) ? Game.buildEndGameMessage(myProvider) : SizedBox(height: 2), + (myProvider.gameWin || myProvider.gameFail) + ? Game.buildEndGameMessage(myProvider) + : Board.buildToggleFlagModeLayout(myProvider) ], ), ); diff --git a/lib/provider/data.dart b/lib/provider/data.dart index d637afa..4f571d8 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -15,9 +15,10 @@ class Data extends ChangeNotifier { String _skin = 'default'; // Game data - bool _stateRunning = false; + bool _gameRunning = false; bool _gameWin = false; bool _gameFail = false; + bool _reportMode = false; int _sizeVertical = null; int _sizeHorizontal = null; List _cells = []; @@ -79,12 +80,22 @@ class Data extends ChangeNotifier { void setCellAsExplored(int row, int col) { _cells[row][col].isExplored = true; + if (_cells[row][col].isMined) { + _cells[row][col].isExploded = true; + }; + + notifyListeners(); + } + + void toggleCellMark(int row, int col) { + _cells[row][col].isMarked = !_cells[row][col].isMarked; + updateReportMode(false); notifyListeners(); } - bool get stateRunning => _stateRunning; - void updateStateRunning(bool stateRunning) { - _stateRunning = stateRunning; + bool get gameRunning => _gameRunning; + void updateGameRunning(bool gameRunning) { + _gameRunning = gameRunning; updateGameWin(false); updateGameFail(false); notifyListeners(); @@ -92,15 +103,19 @@ class Data extends ChangeNotifier { bool get gameWin => _gameWin; void updateGameWin(bool gameWin) { - print('updateGameWin: ' + (gameWin ? 'true' : 'false')); _gameWin = gameWin; notifyListeners(); } bool get gameFail => _gameFail; void updateGameFail(bool gameFail) { - print('updateGameFail: ' + (gameFail ? 'true' : 'false')); _gameFail = gameFail; notifyListeners(); } + + bool get reportMode => _reportMode; + void updateReportMode(bool reportMode) { + _reportMode = reportMode; + notifyListeners(); + } } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 39c0be2..204be18 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -15,7 +15,7 @@ class Home extends StatelessWidget { List<Widget> menuActions = []; - if (myProvider.stateRunning) { + if (myProvider.gameRunning) { menuActions = [ FlatButton( child: Container( @@ -43,7 +43,7 @@ class Home extends StatelessWidget { ), body: SafeArea( child: Center( - child: myProvider.stateRunning + child: myProvider.gameRunning ? Game.buildGameWidget(myProvider) : Parameters.buildParametersSelector(myProvider) ), diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart index 743a832..39df1a5 100644 --- a/lib/utils/board_utils.dart +++ b/lib/utils/board_utils.dart @@ -5,15 +5,20 @@ class BoardUtils { static printGrid(List cells) { print(''); - print('-------'); + String line = '--'; + for (var i = 0; i < cells[0].length; i++) { + line += '-'; + } + print(line); for (var rowIndex = 0; rowIndex < cells.length; rowIndex++) { - String row = ''; + String row = '|'; for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) { row += cells[rowIndex][colIndex].isMined ? 'X' : '.'; } + row += '|'; print(row); } - print('-------'); + print(line); print(''); } @@ -89,8 +94,13 @@ class BoardUtils { return cells; } + static void reportCell(Data myProvider, int row, int col) { + if (!myProvider.cells[row][col].isExplored) { + myProvider.toggleCellMark(row, col); + } + } + static void walkOnCell(Data myProvider, int row, int col) { - print('Walk on cell [' + col.toString() + ',' + row.toString() + ']'); myProvider.setCellAsExplored(row, col); if (myProvider.cells[row][col].minesCountAround == 0) { @@ -154,8 +164,7 @@ class BoardUtils { return minesCountAround; } - static bool checkBoardIsSolved(Data myProvider) { - print('checkBoardIsSolved'); + static bool checkGameIsFinished(Data myProvider) { List cells = myProvider.cells; int sizeHorizontal = cells.length; int sizeVertical = cells[0].length; @@ -166,7 +175,7 @@ class BoardUtils { for (var row = 0; row < sizeVertical; row++) { for (var col = 0; col < sizeHorizontal; col++) { // Walked on a mine - if (cells[row][col].isMined == true && cells[row][col].isExplored == true) { + if (cells[row][col].isExploded == true) { myProvider.updateGameFail(true); return false; } diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index 03e51b7..909c1ed 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -4,13 +4,13 @@ import '../utils/board_utils.dart'; class GameUtils { static void resetGame(Data myProvider) { - myProvider.updateStateRunning(false); + myProvider.updateGameRunning(false); } static void startGame(Data myProvider) { print('Starting game: ' + myProvider.size + ' - ' + myProvider.level); myProvider.updateSize(myProvider.size); - myProvider.updateStateRunning(true); + myProvider.updateGameRunning(true); myProvider.updateCells( BoardUtils.createBoard( myProvider.sizeHorizontal, @@ -19,4 +19,5 @@ class GameUtils { ) ); } + } diff --git a/pubspec.lock b/pubspec.lock index f57afd8..b6eca0d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,7 +28,7 @@ packages: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" clock: dependency: transitive description: @@ -73,7 +73,7 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.7.0" nested: dependency: transitive description: @@ -141,7 +141,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.4.1" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3915ac9..2b41f4f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,5 @@ dev_dependencies: flutter: uses-material-design: true assets: - - assets/files/ - assets/icons/ - assets/skins/ -- GitLab