diff --git a/android/gradle.properties b/android/gradle.properties index db7a1ee2908d6e94aeb319e1c1b548a8bb245891..14eed3944b547f02179b1b42f4b601f91b7957c0 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 Binary files /dev/null and b/assets/skins/default_button_mark_mine_off.png differ 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 Binary files /dev/null and b/assets/skins/default_button_mark_mine_on.png differ 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 Binary files /dev/null and b/assets/skins/default_tile_flag.png differ 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 Binary files /dev/null and b/assets/skins/default_tile_flag_ko.png differ 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 Binary files /dev/null and b/assets/skins/default_tile_flag_ok.png differ 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 Binary files /dev/null and b/assets/skins/default_tile_mine_not_found.png differ 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 0000000000000000000000000000000000000000..60ec69f6163967c4cd86a7c5123de298689182f8 --- /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 0000000000000000000000000000000000000000..6f741b5ea2b0522dbf8d43262f726a9d86e4702d --- /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 aae2bcba4f5c4a055565bdc501e43ab802c7c377..c57007a1e5f24a31a3900295cb5af3190164cc35 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 0000000000000000000000000000000000000000..f4ab60e003f36d45b8eb0b9854c1a16a9d40cd3d --- /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 0000000000000000000000000000000000000000..c8c4e65b3c76dad95d53e46650e4cf8b29514425 --- /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 0000000000000000000000000000000000000000..5632b14616e723a3642892f857b1c7372f42f577 --- /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 0000000000000000000000000000000000000000..dd83b8f039f3d9b0f03a91a78c547f5c6faa2b5a --- /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 0000000000000000000000000000000000000000..a7db810dcf07cf0d6da6d5afd48c3fb12640d85c --- /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 0000000000000000000000000000000000000000..f637966fac15986616dc3a7c62aaf4fc0fe13cf6 --- /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 e2a6c0dad2cb19c305589d93875fd5bc959bdeae..30b0e1beba83884c68fef89f1799f31f548a4338 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 b5e1d1263d986559bb3ead5b1defaf79c9498da4..f3336057ba084a331e33ea69d5c1d43ea189262a 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 8333c64de56f4bea171098b41fc89afde2d810ce..5b226c80aa6378a47e5e0ef8802940d94ad2b1dc 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 d637afad75b6ffc73ceff166a5f68bc08a3a650f..4f571d83827915d74a6785aafe09250c0dd5b03a 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 39c0be2fa8e96df70f1f4e55e4b61a2a9be8b170..204be18a3d6204578b4c7596fe415b1cca727446 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 743a832d0d6e80344604d465bf4674cb59c1b0a6..39df1a59b026458a737bfd817540a46c3913e2d6 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 03e51b7743f9243613e7b56814a6f9ba8b1b13b3..909c1ed4a1ea9e202d456a8f1af854c664579eb5 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 f57afd81a9fe9091b34d0f271f0797d0475ce325..b6eca0d9a310f699c2be40fd6273acfa381332e9 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 3915ac927c74635e0da63a07d902a9d06fca2292..2b41f4f19fe230f65d2edd16a773e2f321c5f59b 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/