From 3b645b36b76ab914613980b89130a30c9abcc0bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Mon, 4 Apr 2022 21:38:31 +0200
Subject: [PATCH] Check if submitted word is allowed

---
 android/gradle.properties                     |   4 +--
 ...tionnary.txt => words-5-fr-dictionary.txt} |   0
 assets/skins/default_wrong.png                | Bin 0 -> 824 bytes
 icons/build_game_icons.sh                     |   1 +
 icons/skins/default/wrong.svg                 |   2 ++
 lib/provider/data.dart                        |   5 ++++
 lib/utils/game_utils.dart                     |  26 +++++++++++++++---
 lib/utils/random_pick_word.dart               |   8 ++++--
 8 files changed, 38 insertions(+), 8 deletions(-)
 rename assets/files/{words-5-fr-dictionnary.txt => words-5-fr-dictionary.txt} (100%)
 create mode 100644 assets/skins/default_wrong.png
 create mode 100644 icons/skins/default/wrong.svg

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/words-5-fr-dictionnary.txt b/assets/files/words-5-fr-dictionary.txt
similarity index 100%
rename from assets/files/words-5-fr-dictionnary.txt
rename to assets/files/words-5-fr-dictionary.txt
diff --git a/assets/skins/default_wrong.png b/assets/skins/default_wrong.png
new file mode 100644
index 0000000000000000000000000000000000000000..e62d9e1d12dd0382fa4520a0ffb8736e553aa2b9
GIT binary patch
literal 824
zcmeAS@N?(olHy`uVBq!ia0y~yU^oE691IK$4CUL6Z!<73a29w(7Beu&M1U~k*%{Bz
zFfcGkmbgZg1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BgMeLbkx(uF{I+w+d1Av
zcN}<}UurEYI+#;@b&k?<&!dUc9v3}ZJnhC^2BzE{vjh{mC2YLsZGV5THf2xk!GNIj
zxG%en_SIQeYPEcP9L~1!&x(#cOXLr@Zu|SgeCLUo;pc09I<rOj-F&BH{x0wIY?ZJt
zJ@L+*^XFVo-typBK#$lDkG!AyJR%1@@_zdBh@AAu`^nEEa?vC2=Xah3qW=y`xV|{S
zyx30C;pGYSWRcAu<og2mtg;bV93fk2;dasLQ$o+7wkI1U)+YVBQ+36yyG&*KpN=Qf
z_UpRs?(F$7eZmv%g4>LjL<Kqn|J=JDqUw<RWs=1d`<%c{XL?WUP<ZCpBeaRfZ|Vhw
zO_S3kRvoz_arfOxmoz2gi8D|5r2GwaYChp{CPl#MOpDe+$CPNBwJU{!T&}(1T<w)1
zaC3$FA}vMN6!VK}M#4A$`=+ES9ac0tXVQB@{g7z~&)r}){nI`xgo0eQow(cw(r%lk
zu)0NL;@)pA(W)jLIzB0CM)#FLHcboV<W)Lse0dwQl*_h*mmh%?uT7gYBh_M63)@6n
z!^g*SL5hWEcCG<gEO~poQP2AZwuy{0U#<h0e`IoJ&i1V-Ei?L?mx3H->(As8re-8O
zv-6Bgn`6qH@3SWTcz0>3>;(lQ7XRYaEo>9d+8(?Ha(lY1>c_jP$3V<~(@P*4oKuc;
z&$({T%h|#6qx#djcMT#F-+tV(1Z1#^KS!uj*NHY;Rm0OC!a2d}L4g%3Q(Dfxq=V;P
zu+V0o|9lw&H<OIDS07m-arf7bUbcy`pITy7mvp>Yr*5B@tYkbfP*}3AXWtZmpOpE@
zQ*wm=86Nny<jzgmhROFgFjqf4zfy?%ss3uA%}?@I3eEi#xavse&jX>4X4Fj6DtsdJ
zXv%qqly;sAr`**yIkVlXcl#Z<@x>2e$**!}j>or`#C-An`V^Ee7(8A5T-G@yGywqp
C&vr-v

literal 0
HcmV?d00001

diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index 2fddd00..2c7d70c 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -51,6 +51,7 @@ function build_icon_for_skin() {
   build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/empty.svg      ${BASE_DIR}/assets/skins/${SKIN_CODE}_empty.png
   build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/good.svg       ${BASE_DIR}/assets/skins/${SKIN_CODE}_good.png
   build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/misplaced.svg  ${BASE_DIR}/assets/skins/${SKIN_CODE}_misplaced.png
+  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/wrong.svg      ${BASE_DIR}/assets/skins/${SKIN_CODE}_wrong.png
 }
 
 # Game icons
diff --git a/icons/skins/default/wrong.svg b/icons/skins/default/wrong.svg
new file mode 100644
index 0000000..9c89cb2
--- /dev/null
+++ b/icons/skins/default/wrong.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"><defs><linearGradient id="linearGradient1569" x1="26.688" x2="77.95" y1=".40612" y2="99.665" gradientUnits="userSpaceOnUse"><stop stop-color="#b9b9b9" offset="0"/><stop stop-color="#767676" offset="1"/></linearGradient></defs><rect width="100" height="100" ry="2" fill="none"/><rect width="100" height="100" fill="url(#linearGradient1569)" stroke="#5d5d5d" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 6b3bfe9..7d87dc8 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -84,6 +84,11 @@ class Data extends ChangeNotifier {
       notifyListeners();
     }
   }
+  void currentGuessSubmitWrongWord() {
+    print('Adding unknown word');
+    addGuess(_currentGuess);
+    notifyListeners();
+  }
   void addGuess(String word) {
     print('addGuess('+word+')');
     _guesses.add(word);
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index fbbb9ae..5fb4c00 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -61,8 +61,12 @@ class GameUtils {
 
     List<String> tips = List<String>.filled(wordLength, '', growable: false);
 
-    if ((word.length != wordLength) || (candidate.length != wordLength)) {
-        return tips;
+    if (
+      (word.length != wordLength)
+      || (candidate.length != wordLength)
+      || (!RandomPickWord.checkWordExists(candidate))
+    ) {
+        return List<String>.filled(wordLength, 'wrong', growable: false);
     }
 
     String replaceCharAt(String oldString, int index, String newChar) {
@@ -102,11 +106,25 @@ class GameUtils {
 
   static bool submitWord(Data myProvider) {
     print('submitWord');
-    // TODO: check this word is allowed
-    myProvider.currentGuessSubmitWord();
+
+    if (GameUtils.checkCurrentlyGuessedWordExists(myProvider)) {
+      print('Ok word allowed');
+      myProvider.currentGuessSubmitWord();
+    } else {
+      print('Unknown word');
+      myProvider.currentGuessSubmitWrongWord();
+    }
+
     return true;
   }
 
+  static bool checkCurrentlyGuessedWordExists(Data myProvider) {
+    String guessedWord = myProvider.currentGuess;
+    print('Checking word "' + guessedWord + '"...');
+
+    return RandomPickWord.checkWordExists(guessedWord);
+  }
+
   static bool isGameFinished(Data myProvider) {
     print('isGameFinished');
 
diff --git a/lib/utils/random_pick_word.dart b/lib/utils/random_pick_word.dart
index 8b24c5a..56bcdb8 100644
--- a/lib/utils/random_pick_word.dart
+++ b/lib/utils/random_pick_word.dart
@@ -30,10 +30,10 @@ class RandomPickWord {
 
       String wordBaseFilename = 'words-' + length.toString() + '-' + lang;
 
-      // Get full dictionnary (eligible words)
+      // Get full dictionary (eligible words)
       print('Reload dictionary');
       try {
-        String wordsFile = wordBaseFilename + '-' + 'dictionnary';
+        String wordsFile = wordBaseFilename + '-' + 'dictionary';
         var data = await rootBundle.loadString('assets/files/' + wordsFile + '.txt');
         LineSplitter.split(data).forEach((line) {
           if (line.length == length) {
@@ -74,4 +74,8 @@ class RandomPickWord {
 
     print('Picked word: ' + _word);
   }
+
+  static bool checkWordExists(String word) {
+    return dictionary.contains(word);
+  }
 }
-- 
GitLab