From edee7a88d609b8795e87906605947cae75ba9037 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Mon, 4 Apr 2022 22:45:51 +0200
Subject: [PATCH] Improve check end game (win/fail)

---
 android/gradle.properties  |   4 ++--
 assets/icons/game_fail.png | Bin 0 -> 3621 bytes
 icons/build_game_icons.sh  |   1 +
 icons/game_fail.svg        |   2 ++
 lib/layout/game.dart       |  17 +++++++++++------
 lib/layout/parameters.dart |   2 +-
 lib/provider/data.dart     |  15 +++++++++++++++
 lib/screens/home.dart      |   2 +-
 lib/utils/game_utils.dart  |  11 -----------
 9 files changed, 33 insertions(+), 21 deletions(-)
 create mode 100644 assets/icons/game_fail.png
 create mode 100644 icons/game_fail.svg

diff --git a/android/gradle.properties b/android/gradle.properties
index 14eed39..aa51064 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/game_fail.png b/assets/icons/game_fail.png
new file mode 100644
index 0000000000000000000000000000000000000000..155f9118fde35f06a8b84ed7fbf24b66e9d70e99
GIT binary patch
literal 3621
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
Bp?m-U

literal 0
HcmV?d00001

diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index 2c7d70c..e6aa241 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -58,6 +58,7 @@ function build_icon_for_skin() {
 build_icon ${CURRENT_DIR}/button_back.svg   ${BASE_DIR}/assets/icons/button_back.png
 build_icon ${CURRENT_DIR}/button_help.svg   ${BASE_DIR}/assets/icons/button_help.png
 build_icon ${CURRENT_DIR}/button_start.svg  ${BASE_DIR}/assets/icons/button_start.png
+build_icon ${CURRENT_DIR}/game_fail.svg     ${BASE_DIR}/assets/icons/game_fail.png
 build_icon ${CURRENT_DIR}/game_win.svg      ${BASE_DIR}/assets/icons/game_win.png
 build_icon ${CURRENT_DIR}/key.svg           ${BASE_DIR}/assets/icons/key.png
 
diff --git a/icons/game_fail.svg b/icons/game_fail.svg
new file mode 100644
index 0000000..2922fd7
--- /dev/null
+++ b/icons/game_fail.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=".44662" y=".89101" width="92.772" height="91.894" ry="11.689" fill="#d11717" stroke="#fff" stroke-width=".238"/><path d="m71.624 59.304c3.5089 3.5089 3.5089 9.0561 0 12.565-1.6976 1.6976-3.9623 2.6034-6.2261 2.6034s-4.5275-0.90569-6.2261-2.6034l-12.452-12.452-12.452 12.452c-1.6976 1.6976-3.9623 2.6034-6.2261 2.6034s-4.5275-0.90569-6.2261-2.6034c-3.5089-3.5089-3.5089-9.0561 0-12.565l12.452-12.452-12.452-12.452c-3.5089-3.5089-3.5089-9.0561 0-12.565s9.0561-3.5089 12.565 0l12.452 12.452 12.452-12.452c3.5089-3.5089 9.0561-3.5089 12.565 0s3.5089 9.0561 0 12.565l-12.452 12.452z" fill="#e7e7e7" stroke-width=".20213"/></svg>
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index d305e99..8f7de82 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -10,7 +10,7 @@ import '../utils/game_utils.dart';
 class Game {
 
   static Container buildGameWidget(Data myProvider) {
-    bool gameIsFinished = GameUtils.isGameFinished(myProvider);
+    bool gameIsFinished = myProvider.isGameFinished();
 
     return Container(
       child: Column(
@@ -27,8 +27,8 @@ class Game {
     );
   }
 
-  static TextButton buildRestartGameButton(Data myProvider) {
-    return TextButton(
+  static FlatButton buildRestartGameButton(Data myProvider) {
+    return FlatButton(
       child: Container(
         child: Image(
           image: AssetImage('assets/icons/button_back.png'),
@@ -40,10 +40,15 @@ class Game {
   }
 
   static Container buildEndGameMessage(Data myProvider) {
+    String decorationImageAssetName = '';
+    if (myProvider.gameWon) {
+      decorationImageAssetName = 'assets/icons/game_win.png';
+    } else {
+      decorationImageAssetName = 'assets/icons/game_fail.png';
+    }
+
     Image decorationImage = Image(
-      image: AssetImage(
-        'assets/icons/game_win.png'
-      ),
+      image: AssetImage(decorationImageAssetName),
       fit: BoxFit.fill
     );
 
diff --git a/lib/layout/parameters.dart b/lib/layout/parameters.dart
index 3a2ae03..a151ad0 100644
--- a/lib/layout/parameters.dart
+++ b/lib/layout/parameters.dart
@@ -48,7 +48,7 @@ class Parameters {
               decorationImage,
               Column(
                 children: [
-                  TextButton(
+                  FlatButton(
                     child: Container(
                       child: Image(
                         image: AssetImage('assets/icons/button_start.png'),
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 7d87dc8..e692318 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -26,6 +26,7 @@ class Data extends ChangeNotifier {
 
   // Game data
   bool _gameIsRunning = false;
+  bool _foundWord = false;
   String _word = '';
   final int _recentWordsCount = 20;
   List _recentWords = [];
@@ -79,6 +80,7 @@ class Data extends ChangeNotifier {
         print('wrong');
       } else {
         print('ok found');
+        _foundWord = true;
       }
       addGuess(_currentGuess);
       notifyListeners();
@@ -95,6 +97,8 @@ class Data extends ChangeNotifier {
     _currentGuess = '';
   }
 
+  bool get gameWon => _foundWord;
+
   getParameterValue(String parameterCode) {
     switch(parameterCode) {
       case 'lang': { return _lang; }
@@ -151,6 +155,16 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
+  bool isGameFinished() {
+    print('isGameFinished');
+
+    if (_foundWord || (_guesses.length > (_maxGuessesCount - 1))) {
+      return true;
+    }
+
+    return false;
+  }
+
   String get word => _word;
 
   void updateWord(String word) {
@@ -170,6 +184,7 @@ class Data extends ChangeNotifier {
     _word = '';
     _guesses = [];
     _currentGuess = '';
+    _foundWord = false;
     notifyListeners();
   }
 
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 03c6cd9..1381d16 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -31,7 +31,7 @@ class _HomeState extends State<Home> {
 
     if (myProvider.gameIsRunning) {
       menuActions = [
-        TextButton(
+        FlatButton(
           child: Container(
             decoration: BoxDecoration(
               borderRadius: BorderRadius.circular(4),
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index 5fb4c00..ec5d24a 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -125,15 +125,4 @@ class GameUtils {
     return RandomPickWord.checkWordExists(guessedWord);
   }
 
-  static bool isGameFinished(Data myProvider) {
-    print('isGameFinished');
-
-    if (myProvider.guesses.length > 0) {
-      if (myProvider.guesses[myProvider.guesses.length - 1] == myProvider.word) {
-        return true;
-      }
-    }
-    return false;
-  }
-
 }
-- 
GitLab