From 2921cc1c3efd546d71f9a22b3306d1ec2fb53c87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Wed, 22 May 2024 18:23:08 +0200
Subject: [PATCH] Normalize game architecture

---
 android/gradle.properties                     |   4 +-
 assets/menu/game-pick-image.png               | Bin 8470 -> 0 bytes
 assets/menu/game-pick-word.png                | Bin 8494 -> 0 bytes
 assets/placeholder.png                        | Bin 2510 -> 0 bytes
 assets/translations/en.json                   |   8 +-
 assets/translations/fr.json                   |   8 +-
 assets/ui/button_back.png                     | Bin 0 -> 3771 bytes
 assets/ui/button_delete_saved_game.png        | Bin 0 -> 5813 bytes
 assets/ui/button_resume_game.png              | Bin 0 -> 3659 bytes
 assets/ui/button_start.png                    | Bin 0 -> 3999 bytes
 assets/ui/game_fail.png                       | Bin 0 -> 3647 bytes
 assets/ui/game_win.png                        | Bin 0 -> 7937 bytes
 assets/ui/placeholder.png                     | Bin 0 -> 170 bytes
 assets/ui/type_pick-image.png                 | Bin 0 -> 6046 bytes
 assets/ui/type_pick-word.png                  | Bin 0 -> 6056 bytes
 .../metadata/android/en-US/changelogs/65.txt  |   1 +
 .../metadata/android/fr-FR/changelogs/65.txt  |   1 +
 images/build_images.sh                        |  67 ------
 lib/config/default_game_settings.dart         |  52 +++++
 lib/config/default_global_settings.dart       |  33 +++
 lib/config/menu.dart                          |  62 +++--
 lib/config/theme.dart                         |  10 +-
 lib/cubit/game_cubit.dart                     | 113 +++++++++
 lib/cubit/game_state.dart                     |  15 ++
 .../{bottom_nav_cubit.dart => nav_cubit.dart} |  22 +-
 lib/cubit/settings_game_cubit.dart            |  72 ++++++
 lib/cubit/settings_game_state.dart            |  15 ++
 lib/cubit/settings_global_cubit.dart          |  60 +++++
 lib/cubit/settings_global_state.dart          |  15 ++
 lib/data/fetch_data_helper.dart               |   4 +-
 lib/main.dart                                 | 106 +++++----
 lib/models/{ => data}/word.dart               |  22 +-
 lib/models/game/game.dart                     | 219 ++++++++++++++++++
 lib/models/settings/settings_game.dart        |  54 +++++
 lib/models/settings/settings_global.dart      |  41 ++++
 lib/provider/data.dart                        | 105 ---------
 lib/ui/game/game_end.dart                     |  52 +++++
 lib/ui/game/game_top.dart                     |  12 +
 lib/ui/games/abstract_game.dart               | 163 -------------
 lib/ui/games/game_pick_image.dart             | 142 ------------
 lib/ui/games/game_pick_word.dart              | 170 --------------
 lib/ui/games/game_selector.dart               |  64 -----
 lib/ui/helpers/app_titles.dart                |  32 +++
 lib/ui/helpers/outlined_text_widget.dart      |  51 ++++
 lib/ui/layouts/game_layout.dart               |  37 +++
 lib/ui/layouts/parameters_layout.dart         | 154 ++++++++++++
 lib/ui/parameters/parameter_image.dart        |  38 +++
 lib/ui/parameters/parameter_painter.dart      | 148 ++++++++++++
 lib/ui/screens/game_page.dart                 |  25 --
 .../{about_page.dart => page_about.dart}      |   8 +-
 lib/ui/screens/page_game.dart                 |  24 ++
 ...{settings_page.dart => page_settings.dart} |  10 +-
 .../{widgets => }/settings/settings_form.dart |   2 +-
 lib/ui/{widgets => }/settings/theme_card.dart |   0
 lib/ui/skeleton.dart                          |  51 ++--
 .../actions/button_delete_saved_game.dart     |  21 ++
 lib/ui/widgets/actions/button_game_quit.dart  |  21 ++
 .../actions/button_game_start_new.dart        |  34 +++
 .../actions/button_resume_saved_game.dart     |  21 ++
 lib/ui/widgets/app_bar.dart                   |  32 ---
 lib/ui/widgets/bottom_nav_bar.dart            |  40 ----
 lib/ui/widgets/game/game_board.dart           |  32 +++
 lib/ui/widgets/game/game_pick_image.dart      |  22 ++
 lib/ui/widgets/game/game_pick_word.dart       |  22 ++
 .../widgets/game/pick_image_game_image.dart   |  43 ++++
 .../widgets/game/pick_image_game_items.dart   |  51 ++++
 lib/ui/widgets/game/pick_image_game_word.dart |  40 ++++
 lib/ui/widgets/game/pick_word_game_image.dart |  35 +++
 .../game/pick_word_game_image_items.dart      |  49 ++++
 lib/ui/widgets/game/pick_word_game_word.dart  |  42 ++++
 .../game/pick_word_game_word_items.dart       |  63 +++++
 lib/ui/widgets/game/score_bar.dart            |  43 ++++
 lib/ui/widgets/global_app_bar.dart            |  83 +++++++
 lib/ui/widgets/header_app.dart                |  23 --
 .../widgets/indicators/score_indicator.dart   |  40 ++++
 lib/utils/color_extensions.dart               |  33 +++
 pubspec.lock                                  |  64 +++--
 pubspec.yaml                                  |  16 +-
 .../app/build_application_resources.sh        |   2 +-
 {icons => resources/app}/featureGraphic.svg   |   0
 {icons => resources/app}/icon.svg             |   0
 resources/build_resources.sh                  |   6 +
 {scripts => resources/data}/.gitignore        |   0
 .../data}/01_download_images.sh               |   0
 .../data}/02_prepare_images.sh                |   0
 .../data}/03_optimize_images.sh               |   0
 .../data}/04_build_images_board.sh            |   0
 .../data}/05_build_assets_list.sh             |   0
 {scripts => resources/data}/words.csv         |   0
 {scripts => resources/data}/words.json        |   0
 resources/ui/build_ui_resources.sh            | 110 +++++++++
 resources/ui/images/button_back.svg           |   2 +
 .../ui/images/button_delete_saved_game.svg    |   2 +
 resources/ui/images/button_resume_game.svg    |   2 +
 resources/ui/images/button_start.svg          |   2 +
 resources/ui/images/game_fail.svg             |   2 +
 resources/ui/images/game_win.svg              |   2 +
 resources/ui/images/placeholder.svg           |   2 +
 .../ui/images/type_pick-image.svg             |   0
 .../ui/images/type_pick-word.svg              |   0
 scripts/cache/.gitkeep                        |   0
 scripts/cache/download/.gitkeep               |   0
 scripts/cache/optimized/.gitkeep              |   0
 scripts/cache/selected/.gitkeep               |   0
 104 files changed, 2268 insertions(+), 1026 deletions(-)
 delete mode 100644 assets/menu/game-pick-image.png
 delete mode 100644 assets/menu/game-pick-word.png
 delete mode 100644 assets/placeholder.png
 create mode 100644 assets/ui/button_back.png
 create mode 100644 assets/ui/button_delete_saved_game.png
 create mode 100644 assets/ui/button_resume_game.png
 create mode 100644 assets/ui/button_start.png
 create mode 100644 assets/ui/game_fail.png
 create mode 100644 assets/ui/game_win.png
 create mode 100644 assets/ui/placeholder.png
 create mode 100644 assets/ui/type_pick-image.png
 create mode 100644 assets/ui/type_pick-word.png
 create mode 100644 fastlane/metadata/android/en-US/changelogs/65.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/65.txt
 delete mode 100755 images/build_images.sh
 create mode 100644 lib/config/default_game_settings.dart
 create mode 100644 lib/config/default_global_settings.dart
 create mode 100644 lib/cubit/game_cubit.dart
 create mode 100644 lib/cubit/game_state.dart
 rename lib/cubit/{bottom_nav_cubit.dart => nav_cubit.dart} (51%)
 create mode 100644 lib/cubit/settings_game_cubit.dart
 create mode 100644 lib/cubit/settings_game_state.dart
 create mode 100644 lib/cubit/settings_global_cubit.dart
 create mode 100644 lib/cubit/settings_global_state.dart
 rename lib/models/{ => data}/word.dart (53%)
 create mode 100644 lib/models/game/game.dart
 create mode 100644 lib/models/settings/settings_game.dart
 create mode 100644 lib/models/settings/settings_global.dart
 delete mode 100644 lib/provider/data.dart
 create mode 100644 lib/ui/game/game_end.dart
 create mode 100644 lib/ui/game/game_top.dart
 delete mode 100644 lib/ui/games/abstract_game.dart
 delete mode 100644 lib/ui/games/game_pick_image.dart
 delete mode 100644 lib/ui/games/game_pick_word.dart
 delete mode 100644 lib/ui/games/game_selector.dart
 create mode 100644 lib/ui/helpers/app_titles.dart
 create mode 100644 lib/ui/helpers/outlined_text_widget.dart
 create mode 100644 lib/ui/layouts/game_layout.dart
 create mode 100644 lib/ui/layouts/parameters_layout.dart
 create mode 100644 lib/ui/parameters/parameter_image.dart
 create mode 100644 lib/ui/parameters/parameter_painter.dart
 delete mode 100644 lib/ui/screens/game_page.dart
 rename lib/ui/screens/{about_page.dart => page_about.dart} (86%)
 create mode 100644 lib/ui/screens/page_game.dart
 rename lib/ui/screens/{settings_page.dart => page_settings.dart} (65%)
 rename lib/ui/{widgets => }/settings/settings_form.dart (96%)
 rename lib/ui/{widgets => }/settings/theme_card.dart (100%)
 create mode 100644 lib/ui/widgets/actions/button_delete_saved_game.dart
 create mode 100644 lib/ui/widgets/actions/button_game_quit.dart
 create mode 100644 lib/ui/widgets/actions/button_game_start_new.dart
 create mode 100644 lib/ui/widgets/actions/button_resume_saved_game.dart
 delete mode 100644 lib/ui/widgets/app_bar.dart
 delete mode 100644 lib/ui/widgets/bottom_nav_bar.dart
 create mode 100644 lib/ui/widgets/game/game_board.dart
 create mode 100644 lib/ui/widgets/game/game_pick_image.dart
 create mode 100644 lib/ui/widgets/game/game_pick_word.dart
 create mode 100644 lib/ui/widgets/game/pick_image_game_image.dart
 create mode 100644 lib/ui/widgets/game/pick_image_game_items.dart
 create mode 100644 lib/ui/widgets/game/pick_image_game_word.dart
 create mode 100644 lib/ui/widgets/game/pick_word_game_image.dart
 create mode 100644 lib/ui/widgets/game/pick_word_game_image_items.dart
 create mode 100644 lib/ui/widgets/game/pick_word_game_word.dart
 create mode 100644 lib/ui/widgets/game/pick_word_game_word_items.dart
 create mode 100644 lib/ui/widgets/game/score_bar.dart
 create mode 100644 lib/ui/widgets/global_app_bar.dart
 delete mode 100644 lib/ui/widgets/header_app.dart
 create mode 100644 lib/ui/widgets/indicators/score_indicator.dart
 create mode 100644 lib/utils/color_extensions.dart
 rename icons/build_application_icons.sh => resources/app/build_application_resources.sh (98%)
 rename {icons => resources/app}/featureGraphic.svg (100%)
 rename {icons => resources/app}/icon.svg (100%)
 create mode 100755 resources/build_resources.sh
 rename {scripts => resources/data}/.gitignore (100%)
 rename {scripts => resources/data}/01_download_images.sh (100%)
 rename {scripts => resources/data}/02_prepare_images.sh (100%)
 rename {scripts => resources/data}/03_optimize_images.sh (100%)
 rename {scripts => resources/data}/04_build_images_board.sh (100%)
 rename {scripts => resources/data}/05_build_assets_list.sh (100%)
 rename {scripts => resources/data}/words.csv (100%)
 rename {scripts => resources/data}/words.json (100%)
 create mode 100755 resources/ui/build_ui_resources.sh
 create mode 100644 resources/ui/images/button_back.svg
 create mode 100644 resources/ui/images/button_delete_saved_game.svg
 create mode 100644 resources/ui/images/button_resume_game.svg
 create mode 100644 resources/ui/images/button_start.svg
 create mode 100644 resources/ui/images/game_fail.svg
 create mode 100644 resources/ui/images/game_win.svg
 create mode 100644 resources/ui/images/placeholder.svg
 rename images/menu/game-pick-image.svg => resources/ui/images/type_pick-image.svg (100%)
 rename images/menu/game-pick-word.svg => resources/ui/images/type_pick-word.svg (100%)
 delete mode 100644 scripts/cache/.gitkeep
 delete mode 100644 scripts/cache/download/.gitkeep
 delete mode 100644 scripts/cache/optimized/.gitkeep
 delete mode 100644 scripts/cache/selected/.gitkeep

diff --git a/android/gradle.properties b/android/gradle.properties
index f7613f2..dfa6ea8 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.1.40
-app.versionCode=64
+app.versionName=0.2.0
+app.versionCode=65
diff --git a/assets/menu/game-pick-image.png b/assets/menu/game-pick-image.png
deleted file mode 100644
index 4f98fea428136e093ec5ed41310bc18ad6bda71a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8470
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
HQ$iB}PGXUF

diff --git a/assets/menu/game-pick-word.png b/assets/menu/game-pick-word.png
deleted file mode 100644
index 0625f5ac0e3428e5c5959f0e66eebc7fced794da..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8494
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
C0O3Xe

diff --git a/assets/placeholder.png b/assets/placeholder.png
deleted file mode 100644
index 9c9e7153c4ac87b54574b24a2cef2d27678c6cd7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2510
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
X?DWC*=;aCq1_lOCS3j3^P6<r_TqS%3

diff --git a/assets/translations/en.json b/assets/translations/en.json
index 7a959c8..bee067f 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -1,14 +1,12 @@
 {
   "app_name": "Word guess",
 
-  "bottom_nav_home": "Game",
-  "bottom_nav_settings": "Settings",
-  "bottom_nav_about": "About",
-
   "settings_title": "Settings",
   "settings_label_theme": "Theme mode",
 
   "about_title": "About",
   "about_content": "Word guess game.",
-  "about_version": "Version: {version}"
+  "about_version": "Version: {version}",
+
+  "": ""
 }
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
index de1e73a..51afd63 100644
--- a/assets/translations/fr.json
+++ b/assets/translations/fr.json
@@ -1,14 +1,12 @@
 {
   "app_name": "Trouve le mot",
 
-  "bottom_nav_home": "Jeu",
-  "bottom_nav_settings": "Réglages",
-  "bottom_nav_about": "Infos",
-
   "settings_title": "Réglages",
   "settings_label_theme": "Thème de couleurs",
 
   "about_title": "Informations",
   "about_content": "Trouve le mot.",
-  "about_version": "Version : {version}"
+  "about_version": "Version : {version}",
+
+  "": ""
 }
diff --git a/assets/ui/button_back.png b/assets/ui/button_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc48ffb1dbb653d9a996f139dfbe02969724bfa5
GIT binary patch
literal 3771
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

literal 0
HcmV?d00001

diff --git a/assets/ui/button_delete_saved_game.png b/assets/ui/button_delete_saved_game.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e4f217689b11e444b7163557d7e5d68f3bbfe7d
GIT binary patch
literal 5813
zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Bd2>3_*8t*cliYI14-?iy0W?oEaG8oERJS
zYjH3zFi4iTMwA5Sr<If^7Ns(jmzV2h=4BTrCl;jY<rk&TerF@az#!)2>EaktaqDet
zW=TlsF5mref9v*MJul|s5FjP6Mc%7f;YPzYGh@!rIxBci+3+hhYfSFY-IioOQ`(iK
zrOwRBSR+M_b7t_&=MF*~OM*N-R%vlQpZh*UwdnOc=~Y3jDxtsEZJi#mvikkX;QRYZ
z_a)XJ?>2nK$}q3%cj3kVPb#KOy+13U+O|5bH1S&7E1A1t3<VN*%1*SMn6|^$HhJq>
zHTQ=2>o3;#8$MT&Gd%vgRkGPHWorHYy9qzC1hwy4Hox5NpY|(PnBhQS!EHrprD!et
zjfWk!rFMPhRgO;nHGA=iZ*p>sTH3c~7MHO1PJAwOntzSa)Et?EUS>SZ4Zr#GvY)bt
zOZSHBsm%IZ!oJgXTkQmvjL^xm3)XzPWd8G)Zt}-e27b|Bx{o8CE<OCy)UwlkXYRH=
z^I3j`mIhvnN`A55DB*`guu7BRn~<tp$7i#CJ2u?E`sC%gX>a3#I#06AGCK85$1p7Y
z$d97gwMR@@45a3ny>1fjNSu+dAo7n?j_mm}o{AsOB)oVd!g%H=>)xKg=a;?As*;l$
z)1GNm8z*0BHOV`yZ_>vw$9CC`?v<+V`H!bCofW=Q)*F6qxnXjqx;y8G`)dD$o7C+u
zy!qJ3Z>-*av}pFfwRc%ooVz;rQoRZ1WcD5H{u^?cR-f~<NET<z;x?K-{cUVx2LFS&
ziwkSDwX?f7O~2F4u;18ij_1)9#&;aaPj-sj{;<O6)#TYF9d&vJkqy;)t!kTQ?ODPc
z#gY*yT42L1%(}yPRg+)Z-B_bQ|AtwAuEZA9FmC@Z`oQd5?q6<EMxTq~iwztb)DMWf
zm-pS8yI)|znjD9t6MaQz$Q)2sa&kAHzWLOq>905gicM3u*L{}o;d>x?dV%lanU?xL
zPggO`5N`fsVA!DEczaL2Eo0Ba<&zCH8{D6=D4kQeD)`{z?ey;=i9rnhPEUXSWfkF5
zW%{D|yK1iFWTpzCQ~PfwJlb~ucK2N~9{t;!MJ6*<gsEh_FFK~B)mE`_Qd4GIY%$2J
z#+-RM_g6o2`=@jG`TK+*hVx1c+bcKK3NSD*IxsM>99Y7jz`)SJz`(%7z`(&kDd$1j
zj*s^orrE7G_pW$dA8}@jo=#R)`f`Ws3$ibozPvRfSzv+ZqKvQEI?ul9ohgstF3Wte
z_>Iv2{0mF;biVYy^J`pJc(TfOSDB8w%f;RG2j?_1__FWx{&(chUitKW%26Aq#A-*b
z)N8uCa%I{&s~1sAcNNsV6@4W4&u(qxyGQnk?;IP{68?DqHoX5(H}b}sxHn~SQoHZF
zyT)m8&;Hr8BmLc_e?Ryf8rs`mXR~c&_-Dd5_hR!*-t9M<t<JQ~*7>ql?$5p42jUG3
z{QMvDZBAc*sv8;UCR2UEJu+&|j`BmZ>kpJOGTBtzi87z^vvPY<=j}94-Yv^snQ3?O
zrd&T)dv@Ji+bb3yieE~Z9`kx>E41xgLfswp9Xsnd_6Z9-IH;8V(Ob!=SozESOUsK-
ze94=ZF@ama=&xniv~~Zc?i8$v`XkF{$noL8M62b?4fd^i{qt0ZZ!T|nQ1zw*fw_^_
z4()sM>eKYOOtH!ZA<_?j+}jzvdPjI@;5rHCSJt*4=Qc3#i|v{@O}%FA$rW9fF1&tO
z9A9vA@1-AGU(DJTxGXAoYDKL1XUiIOg#*p5k9fEl--XN;bz9lbFSb5i|JCbF)v5ZM
zbhdxtRP<sBnZ1VPMcaE876wKJfdhIX>t)Xvp3n^VF|p_T68*HRPk&X3w9gk`pMI|X
z;>+qQip6#Lg=c3Aii><VntDfI{qfHmE$ZhVRA`89*S*f4x-0TL_wy^E7bVM?&+?uX
zJS)oaAZ>w?(XUC#<~~U`-R)B?@BioB!EK_x@wIx?vy7^6fdg|3a*t|HJ8@>;cgeoC
z{x5r9AB_?HV9CsQhvj8y;*r&o8$MLaZ2x>YR_+)pqnyzuu{|35LbQU9UHq`npGUZO
z>edbX91qO2)|xWA?yY+=$x$h**|{ztM6>8){EYqQALqrVzAE%9Q2Q_XLHeJ>XX%d?
z-7{{_kB$4XifiZpKfAwlYE<VJGxXm5cEa}O(l2{W)J@Dy+)cs@n(khdjQiPj;kujO
zs}p+uZx%4re)O~!U&%Q^KxrDw!sOd4&t<M!u<?{odWp*07!AACZ!JN3S+)Q7*fgjs
zRrpwo?f=PJnwsu5$6#5{&%LwHrk~uPcJ7q%<Iwr){|;yBv<S1zOb~Er-0;zV(~ENV
zl|0KfDR@f+-@5ZGxNv6L+K{z6XToady|`-kXmb;TLIYEh=7tBNTmNj>5+M=%>Gs{(
zXVX3B-Hq*;xn%M-_al24-+WqfznMXyK`4A#S=z$<KY^(RUs=<QXZatDtX*j)zx%DA
z(cj98`5Y_^j3ON~uT5p``@h%3=Ed{NvySfnx#rnU^Xt5Vuis56ui{ub!*;95lblHt
zS`+#odv0<UI)34@ZMLJl;>jylv_5aVG$Ymhzz#mSz*h`R793p-Klti<Hd>d5xCxtV
z+?-Lh^s0b%ichs`VC0J(>PKJm>ISY@>v{M0%lo{#8@XP}B~SgnpgQYr^D(dFFms7r
z$%2<YpXXv~VBk_YTNNh}_VumN)Vl%PlUAIZyX3j+r|W;+w<jN6nC{wH6nNnO$N%+B
zzePTkmfgElx9GC8>l}|u5s@>Lm5jec&2yVS{{yFN1cUjH*N)3wev4jG{N10W{Z6;q
zzIW=eoa&Hpi6iMtz&4d-*1S}B{=>-J>E@=Ec`IK2Hq*H0KXq!!+SilB+OBvVtxt(|
zUC#bW;o<YkZnqvSDY%*~_VD*f{ZQ9zk@M3_TNZ3QCG%_5>&goP%?wf-KUZG6Q5m+#
zro`f%XJ%*X8H;?^pPkoF$_H59{_|4CZ1?t8a*4*(o%>h5nj!Xe>ovpH+bJdGk-LJ{
zNUjjPB)f8#du5u_=F^!C4E!87!<;9l`aiataq9Y=w@c2g*O0N^6Z^5wxoAn6W8{-3
zeL6MYy0e%Hf=+Nu$Wu*oEt~Y{@67u-!t3u(`ok2kNc-L4>!IH@Iyav%Ef(9$!qmX9
zE&KDoLl#|!&#mNf-=3_;EpyYYN=~=&(zi9icA1+?r%ifPxp%G_gKl_=_vS5k-*Y~X
zG*io3yy$nzyj}eQ-(_D!{XBgkScGN570!u;B5^j$jOI+y4>#N|*zb9MvESK~^L4}0
z`gbO4U%ORYW#!vY^?c8wkkHG*3mm;Z@do`b-}*|9)xI`eaCe2rUVe@T3@e`RtFZc)
z-G8dU=-<YZyY2)Wzt`+$uNWnAYqo9K6oy5=k8BWI^l;juW$CA9FRJrgRx7sXkMr!%
z?<amg)b1|c$M&1Mfnn9xKMALI{XM}q_2Cnl-)9~b>@)W$jeBw9n@-tZmelxw<fUnc
zwcI%c+yj;UjBYEZy^WZdA7J^crYC7`{U772mQPl9yc2qT!CQpoLd5ytii_V){4d;Z
zAQSmWv*u6mn^T__zG@MUZ#&|BXjY$)!mqD-Iu)mkSACznL)}SemTt`7RT8hSUj7~W
ze97Cm)i2E(7-ooUTsAF}iA!Hj+^y7CNo2XzuMd{`E6*)_67l9s`W&@}up1_S-r7Bi
zdd0?|A6+xk`}ozU27mF4U%UzoYOcY;4v}$2T9M1ls$N~zNr^Hq{dwfcx<@bH>M*|0
z^fz+7tz7X+{>Rt(VeXr!eckM``OtYsZU&|uZo&aV(n}=mmoKk5aAWxuHrvJO<}dpE
zgd2nk4Bz(#if`@BJpV{#zroj^JwFmM7#$d{XE3d}Umv^MIa5&fyKGMP3#Dg!b=E!C
zVNBWYbww?9^@_FYdKcwfm&#ytXmHD9(prCY<)JHki%PCp)cU5jKAN*a^zhQB!hJ#x
zKU8bpuG7fc9lI>@O4xcf?GsI63@im3Y9E#CRBMP@IU#WAp1<y%%eJ-unEf$r;UgKY
z-XPA+n^^=r*RH>&aW7kEUz#NU{_V@8)`Z;s*E%iB=(r3E1EbUxmJ4bUQH6iM?A*I#
zc6h)dt&9@u<s1%E=Ow-T`ZesSn#@kkYwvRRUfJ()ZQI+eX^ZckRuf=g*|A)$q3YR*
zQ&T<Xx;~c(S~NxR`2KU^w`W*6Gi3Rx&Uydde!AH0RQ(sqy4$~f&eOffG$m@9@8;c)
zce63dTxVhNd!b_Gb9<h%^p#Gd&Ww7`zX9IMIRfTiu`0f>?9Q$5;$j=A<OeKUrPkEh
zZ?wF?)WFbtfn`FmjH&BhxAXC42ZGcDYoa3UOCB(1{+*!AvLnkkOZ4ZwfIZWvBsNK$
zW?ykNA^1s_!7D))T?UQ|8NLl+5tFsFU0a{}-`9Md*Y{?F%95P2xWX0&Cp*naQO~D_
z&K2Lc^-l5C`EU82I&m{FSuEx3h<d5(tCSf!F=&2Zw@y*QV$KDwC)!q7xf<nf<=?`f
z(2#A)SSY=GLxQIyqwT|1=U;c@Mc?oL^}ar0-PTuE-Gm)hA5FZwo;!5Isw)Y}w>Vj)
zL3+GR8F%$R@37qx^7XrP+a~YBa-!LFu8ecvf4^4xOS@N%VQcb~trkn>=GC-s6Zjss
z@}S!`K`t{;8k(NP6jZi0rS9I^CtN!Js!pvFEfc+9>BJy(<wTT>TKztsFCV7&r5;IE
zVq(>0;CK+^>u{`*|LEknUss;)=joK+znCY~?YFnJvxQT`uO-ubyAL1fPvcgdHBCzA
z@dGuG1=q8fURC|QFmKl@J)XC%{R(e+5+|=IYGF`XshU~nVI6zwl+LTG3CHc4K}l|{
zn!^7pao#@v?p|M_dRjy^Xo_}<x+lnV2CuA>Q8GabWi>CR<Vv;je|}sCO4i4+m~MHS
zGP2ssZ(VUHY*lDtNRm$_Q)W8HY`vU50SE1sqK4b&Z&|Z5&pIM#12~t32ww=0i4AjG
zdsXs~AX7%K>*_U@`7=%X56TvRoI5>>$t#K3^tNo5(JRimIa(g8mxwL_o8+o`dz0An
zDNmPHPio?gVh}j6bXLQrEfU_Dn^M?aR|zf63aqwrws2y&_$Xk~l~1x4y>1mYiDWzR
zP7~t>g<O;`!&{^ETbr$HpSte2loIl?EVuWZAX7laRkM|$*NZhg7x^k2o#inn_B1&2
ztyMb^QWP63>bCyk{T%a$(@NV4S{Um7c;?T(l6A&n0V@OJoNFv5&rV941>coC6vuRB
zdc+Nttx})8K`HZrkT1j9y~0va)yuW54P)l5zZY>hjw#@fugFc=yD#VHGl3kW<;!4s
ze9O#vX<t<Je$1Pz_(qjM^^VJpuUG7TFAj9#y~Y{EAn@Q{29t|Mp;!9u^Ak(kHcV%T
zT6&ZBsj|x>AE867pa|<!Q%H)dfBCHZt7OFNx;dQD_ku*%-t=y$$qwr73BS4g%ZxI&
zswDPMHz`nvrOs+tF;#iVQ<m0iQZl#u&TKj-@J*;;n#HswVGDeHFWJ4FrDC^jMW`Jp
zUw(HN7Wn<|N!x0J+^SE@|HXoRIbm|PXV%dhAxqy~S>vU8H0sW=l~A=4cKprVspXR#
zF1Ao{!%Ln-ea1^`7lv|GYptscsNOC$(c*Un-xdai1Ai~FEUDQz=Vx`c#zvLjMXB;X
zU9N(|PkpP`y4!o>XS&YZCIoUT>#PRf%b{&k_SGjJUbUe=P21Xe&W}U8zR8t@FIi^H
zJ@eZft3xJhrMqYS+Oq5T@`uwlt()KPy^8Jf1-0v$j48i68yOTD+SDBOT{J1JoAC9Q
zVCa%ytBngh=g!=@#^s{?lv9!-R`Et}5_Lt^inLbs>@O>SS+dP^dqH`yj?nSTb%}<P
zdd=%R=hS9>ce}5^z_DO0=Zy914lh43L6vE7-?D(|W>M*r8&p4E5Zf5Ib*ap**{1?t
zUT@kKuxM}H%Fo7sXUFZny>Y3jU2c>6B#)?TOWxl;z@%Ox;%$&MbHz$F>#f({EsIlN
z;CL`W?LpkfFL##yZMhh9dQ!v0wXG{+pRJk1=>F-e-P)%o%NNv(dzn4hy)kV;gxJMf
z^X|D@azy@#FIlnqnUcrOWqGe}#Lhav%;><Nx#EuFGR_@>MaO0Z%3gTzbNe;^iN82E
zy_ndeu<7gHz4w++wGd9d`Pj;X)dXVgf`wLd+Ie+NB|xRuX%oiK>z`-k#Ma&o^W9S2
z6U3cx;f^0C3j?FfC6+6p6;U!5ug^MDadP<rL)Z16!rpTysIJW|=MrFGxuDm%?cJ}S
zRov6_X1E7R7Zr7Cgiqi9C%~~y_QB<-6Z*N;9hVmRb8MYbrt_xzy%@^|{!-ijx!E7z
z=T(XBys@b^FxcVAB*!&M>XBC0_Q;oc?+$5ZP;fYWGvVKq{hLY*F5B#A_Te&k#Z>$D
z&BAu3UE4F}<~?3>zxIOOXT=jt%?y2u)`>W(^<?U?=iXkTx`3V0p`q>cqU-#L2b1Rs
zJmuZwyL|Sq!rxhH+;eV3+WdXF`GGYnqtsHq#dd!V2G5^rb;S3pf^G4IDeIJsSVSc_
z9*AgM5;EDf)<Z3D>+`i5_E*)e_&!_^rm>|q>(I8Di#GIWxn)lGtZ7$hxU6t=`qHN!
zr+=N`etXp0)XbOBWZJI6z_S9WwV7vrymMff-gIg~=3(wtAC`!zT*=v{*>KD$`Bc;m
z_o!98DB}Z64WN+%CI$rt4hB%Ghk=EGL4bk5fq{X6k%44R#w?ZuRo2TqyPqY&2PgE)
zZX4{$IUnT1^&n8=_U<_wySfg>^=z~gy`N(M9uE2WkXJ45_ufv1wOZ%jY9Cp`Ft6nl
zH#^skx7!t%DkKlr`y2xat?DrLO!?i!@a#xJybsp{PlMM@`hT4o_B^@!>uj=tVS~HF
z{z{$IC;jh+`ZI)uUEBZX#j+wFz6XMQA1>-XU32NecX6hI8H@DY5{nr88#M3PuR8bc
zHD|!w`JZ<FTkJVQ;lSSM_IHk*{i#_WEZFe);;M$nkuy{dtX*uc`2Wn4ZTEuQ7}n3)
z^Q8G#uCQTX!)?32*`FqTyPx}+i>ctxwThoSMNAFV>;5j*Qz@3NU!urVaaAl;U-SO{
zS7vHF1*>n(Z(gl^#x=4#=WVPj!|5Q6m+Tft8gA><Zu3pJy0de6>NY)92Hn;(ClfcS
z%Ku1UYJA3<clg<q3le#k|3Bqm+%qHY{}jz{&!0^C-kvPf_>41e_pue9GuLd{vUu9u
zY~cnkl`ifosm1kPx;J0+o@AMIck+FSzr|X+3m3aPo841jWZ`K$w`|FTioe%B&Inm>
zbIs46LU!vGs_*~Hvf;tRS96YRep)>}G^wdkZQU26u=JyI)$Omz-QG5xVVXc@;<2pc
zA1h1#NHO@nTX{bBl0>0Z@9h^}?m4#<nIbM;nlt%F?9%(&D}U)eHu!nK+5C^ze&xz%
zF?Y9zoO`^&*1V0OG$Z-k#kb~hmh%JZKEx`^q&{eDydCv(;nvV&E9MKWS<1UsI{WxJ
zfdzc~*J)~gT6glQtl80@tzoQlPpq=oxp<0|@053Q4t}}4oMSl)gACht*-eU@mUc~^
z|6+BMU)s#af1Q6ce=q1=Si!P=@Be~pb+L{N(SO<&XZ!v<yK(E$oyDuTH=Bh#f3c0J
z;qZfP&Soy#j^wWDzPc?YYyJ0T28IhcAO4>{z?&XC@$dx(1_lOCS3j3^P6<r_Ijo&w

literal 0
HcmV?d00001

diff --git a/assets/ui/button_resume_game.png b/assets/ui/button_resume_game.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2ea0a02d05e42377eb551a4b51428b511a32f5d
GIT binary patch
literal 3659
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

literal 0
HcmV?d00001

diff --git a/assets/ui/button_start.png b/assets/ui/button_start.png
new file mode 100644
index 0000000000000000000000000000000000000000..6845e2f5c21598ab61f1684d2075aeec0334bf23
GIT binary patch
literal 3999
zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Bd2>3_*8t*cliYI14-?iy0W?oEaG8oERJS
zYjH3zFi4iTMwA5Sr<If^7Ns(jmzV2h=4BTrCl;jY<rk&TerF@az`(EL>EaktaqI2e
z$P$rIxnstUXI9R7EWpv-#JpG`Z-GKbj|K;qU}2g_;By%!7Nyl*4h}4WZeoH{0?nA)
z1cWvzdOMY!P-9sn!J+t4W$x0=la^jq^iE$Hcc}i=Hcvm6BPFXY-3|R}`{xU%oZkKQ
zzv@c!@4j|%@ng`KI`4<~|1+O6dK=S3uWi-4cx8s!3N7Dg#tmZAWTz=kQ?(23-;#Rz
zA<K^Cs}BCDN}Fn^5SZ-q)2{h)j{WlW_4bSA-SNM6(OPk<i8cqr>%^Ohl1Y)b3ghC>
zZ<@NmaLI->FK4}o*QqWOUNAFb!m3Lzgy)`4UDtO_I_~Rk$MrId3!W!NMhh=~p7it0
z$}Mj4cKzRP2Q}15PJNcJf6KE==1kci`I+9F^090FS0iS;^_ha*Y&~1e1M(*3KChiN
z@2Fvsw^+oH7#S1SxUMwUpX0%rOS2YFb2l+b-q5JL*=AFt_i6*x4>RAYb}@W)IXtPm
zN7DG?6?UPAzWW^FH4NicKhId9z<BC)Pjb?y9d{%(b~q$$ICJdN&8NnHO185kd^;j4
zapkh%42MM<-W+>Uw6oNOKT`WZyuOI^x`!wEmz>M~XRfjINX69iU-rg|IfSNiRa;9G
z*D3JdSQO>9RCAFxlgO1V>;4#U<ySZCi8z|RYs0qEpYJ&z$V@!E(lEiH&t>(_InnX`
z|GXM>)?S?cHzr|2gG^=j{A=l%XWQ$%8|)OXN0~@yD5UqTjxw3M-KT_O!L^y+7yMw_
zdDv*(wOQr&)f{5>Jv3tD&}dxZbXauT_O;FpZDLjbHn$ve<KYWnnk_8-h4-w<KIeux
zQk$>8W}NYlA@xJP-RqlCkMHp@o)ec8HZ*YX{4mr1g@A%h`{`o~7*qupKHGGQ^+o-I
zpkP%tRt?VgSDqDpvzo$bkXIYiEZEF6<w)D+D(3lrH|E^_Typ*d8xL22i1uQs6%!X{
z`aSJ6sV<DLWn<OgnpQcjcKIc%&rPih1sF8AL0k?71qK!d0fuHK1qKEI1_llW1{MYe
zCI$vZh6V-(2L=X&@C3%oeBsIx0uGWsmJxo7w=KE!fPc}7`Ns{5<~{b`n<l^T-k<-!
z^*ENX-{W3>+&pH<$K6++yjty?pwM75W5@cAHl2Qz=Qr!79Vl<DlT-ZiWSRGuP35Xh
z%#2G;zgQc7^5)t7rw{HI75}avwcVKeVI#w($20YfR!qM=F|U2U@f-1!NB5LkIG8+C
z{#b`h+qqZbVSc;sLb<rf883x6gjotAZtS^x)HdMChw^3L=Pa&?^jnzO{(+5?$wI+D
z*YEAd59Q0=|4G=Fykz3*hf*!vOcs1^Oqc7jWTYQhBs@)1oQaK5hUuH%{b@{F4j-vb
z%vWq;V|=q?)9Lf4TlahuS**byJ=Y<aFUI|WLc`n2y7I=mhyJf#WOM!grd2jyCx{(v
zX6VyCaKm)rmcJ=hvDaR#ShQ`XR8&t$*kzZKH>Z9%y0T=}hId;O1aCOqI`KblQD*zb
ztxQZ7GZ^Nz2Xz>4z2v)S_oNw-e#znUg;WmJcK0pTaAr6zm=Irb?LFIm<K8))cJ`H1
z*{WDLgc2`ox@_`rHdBir(+&TIa5ML4(SPSQWL{#wC%*E$jJ>04<%?Gpvw9ZsFuqYd
z@XjN2J8On}Xq2~c`4P_QWRv6b<!%==>YobbP-odNm!a_bI&QHAbAR*{9dzBfzS^Mo
zRuSuc1qX)P9037W6=pH;d_Ft7<kNB`sfU#@5rJ_x!lu*;hHxk-GTzEGnvvn2vCG5N
zQoga3;gZmTxu<rCMLnGCq*uH<e#*^q9{#mmkGqQ`o46U5s5)5ROfCI#ZTd&1?Qy>^
zE6dMcK0R=XVuLU1j+<>9N-8V0G9IZve6&X6_akW*js$N;7omky|MP2~QnvNy&^e_Z
zFh#LJmPO#@^#wN*mc>4l{Ib2(vB{+(AyT5th-Je@2BoeAmy5S({xJGFTRrFXxBKBo
zE_BB&<uGU2un;7tw|;r$?#V4{HFp2J{Gor+3)S~rEiz0u0vH5ce`xx92mhB=-Jrp~
zNW+=InnR%|u&$_e!=gL)A4~M!oY%LAhcQQ|!DBz$8|l{k<joly4lJ_i5PiBH<a}LL
zfxwno+ZNrazZdw>^=Gt5D%kBJirXJeU-agUnp5DvbxceS4ANW*i#VqLSY-2db4Fp;
zCa3*@Z4BRp9G)!tbLG_JCYKk>FMuLTw_&m9)1`@D?p&`FU;w#}UFTG@ea8~d-`$D~
z5T69Z-1X?*I|*br3#-6pjpyN$S07k(XZC;7%14*wQzNG+HYjr|EaJEr?v*)(!?p6u
zHj^UTAZA8|hA%1xGonwbJNi0LZ|Mk_Qmn|pGGQ5qxfJhyk<{{su9c7WC2=q?F41)A
z^lMpUbNqbJl;tvOS{MWzW+^QZ3yJP)7g?(D`-K7n%Y?i@xxWi9ERy-;9r$f+BZGj$
zF4xK%K@VMj%Ktyz${@f1GD`_!mS+5vn@1J*-u=@e`gE&(#JlV^1_6gnu0OBp8Xof7
z8z+$S^LqnGL`fxO+U3pit(;ZSPdtK^I2Ncd$}G|NUjKc@VVRpuj8oJaI+U)MNoFJm
zXnmcV{Wmd=e_cl_gMfpa(guHH_DYs0-A3gvj2sI}7+r)Em9`#vW$yY$RFkEFVUys&
z<o}kd>si&RW7|O*gr0<6iQc<0@5?n44hF_2%1v9v>utU~lmv4QsW;k3*RE#-YfP;7
znKqUEdmTTcLPHIUg~<ACdDTb$B!Cne^WG{`I;+LVrpF0#g`Mk-TiFTi6~`PHI28KL
z9eU?<vYpxf?sucQoi8YS<hT=e`=v+hmrd$tV{%~leOb%kPpYY}NlM^^tL(Wqe^1cm
zU|@9F`MToM@`+*gf8Xxq;$fVk*T7-zxcT&}j8n%><lQZJ|7vwJC^8PN&wG%u_P=V;
z%-7e~=C{Z`J;K4!;IFiH(aD5GpnP#)cjMiEIz?Beo&KRB#N?s<C+(kpVz^=N7m>2`
zkIAnme+;x?nQ$%G-f;7rxCnW@H!d9C6Qp+AG9O>$!0?hKzIN}qBH7gojGdqV0B6#b
z?W+n5#8@WOAAEb@?ex9>Cht8}V4}nl;CFEA9PV9jOniSVa}fI3z)&RMu%yZQ(B~Zs
z9^Bvl!NPX4bL-=aiVa)1-hF1`Ue{ecAtiryJ429&L(7Bb8VepcG3?}2NILk|*!>@?
zIMah!As4yztk1k^wQb#@Cd#C-=7HX%xPz?>L1GR|7N1dHW39X6f!$WisWJT5Pv}Vt
z91vs`SovVz-_Si9nyjzSm;3*uX$iL;%Y;b`N-X>TxJ`a)r5wohuF)uxU7pFJi$O{3
z&O4dFy6A&<qgQl1aAt59aA;|go)Y75_`bE8#t&w(xf4<kwlef-H8hLd+4uQrY=L6K
zVorri<~y#**_Hn0dUtVK)9TQi4~h-CtOXOAUfbMWpUe7v*P~{B#vH{4j)UpT*LDUM
zEEWkbP;8jXlHq!=m7z=2VM){PJI6J42sn5#b%Ye8zwL28*vcRz<k0dU-u+-J!z5vc
zBTd#9lo_;l2slVFbwn1($Cdd!5K9$_0T&?^uiWD`m!@B9;nLp0?UVt^$6rAvZxeD*
z$ZR$Jaz1w>({>H{rGnDI8MFLN4{<XtQFK_jZlYMVYH+@JB5V1LR~1z+6Ih)<5)9fq
z=Fi`g^>uFK_E@FuHnY^;X}d)zI-KWRptoLJ_lMhO-%ov~7bbc;v#|dEcXWBiA3aki
zF2<_32IKJ4E}ZpGo(f56I~}a8ir#hi{kbLvE};Xp=lPqO>RlHvmW*Z<yHmO5!M~0s
zZpIw_hRwGHPn)r1H^(0mztehuo_JWnPkZZ{T&2BVWV!TMHcV#V*{1O|dEGYegXUZB
zEs<ULvWZ(S`rzCh>p2`-7`}-&T%13@ZNuq#H|K6I=c-GM<(9RX?d-qaN;QYI{3EB-
z|4=g~4n`U8hI7G6Wl5i`<Bv{0{;&AUvvU?wyQ3mr=!!chvx+m_h-t8uI(SgjYyM6~
zlO*Bz0{+DhoEW5ypB^aP%{u>XyLC;jkgsJ#=LScH-xtdrH=I3ef5f;=?X9-s35ABg
zl_hs8XS3Enm=w^ylU3G%f%}bY_54akTd5k67>)-QZ1&mhJkIs*gs=TY6M0!CRz{iW
z)Az2{*)Gu)T~L33OOIv3g^(8sth`ZDYI`2&^)K@L9ax~)z*6}2>P2DcU>*O0)%-K7
zzFYL(o8`9thmwVW!y}(t@mW9jOnAF{|Lbol-xI0|o=Sq+KG9PY8*C~suAXx2{i%h9
zw=e51U)lT9X70SdM$(sMaJJ7Hj<9OvFS*%$Sb-rxOy{%CZ@;fHzTbOt4lH1B-DtF`
zQOa`GD;Jl?W^-~)5&{|~-6#mlf3Vqp8s~-gyXVi=HqdbJl<~^dd%pR8JLiKED`>NG
z;^j$4H{}Z|>^w1}!I9BRY3B`z`-%=_TQ9!;+7QLV6Tp)HAu{~+nQAMRjEsex^HpDc
zm5^D$vQ6dX*RN;4<g_#N?5H`M3TpFuwzi#qyYsz(f_wI_XKxdHnj7{cN}j(cwSS*4
z!@PUo2DOSpy5EW@t{-c5-|=Kvp0oDmbKO5&43hSLH*ZOMe{SagsSGyX-BxT=V|e13
zGf#2$`HJ<sIUj^X+}>4F+Ov<7neEAuSvT6;de8m%x3+S>FN0gy)Sn_;h7-6qH)UyV
zz9dq&e9iqp1~XAFO~bg_v+~XCOL$LzIGU6!HUH)Q2<3+0Ty9>w=!6sV-nBcjTuQO>
z_mP_(ef(nc{;8kui!=nrrOVW+^#`ACU~y>j|F`+)oTzB;#qXwl+|6}h#q*38tx1Qs
znm1qIY$$p5=Z}cp-#q_+dfXS>)}PS|zS8AUYs@BL@nd>iOjWC9+t(ZGQg*Lqia4?V
z;x09v*{2V$XDl#@P&>SN=bb;Zu7zGpxuwN;tKj4sBR09cw_=Qp1(X<mv)e1|UFs5=
zYIADa=ZM+Q-*H?xSF5%5qP5!e(?2xA&M(wpjy||)+q<59PkrpBU);7e(V@Ip$EBg{
z-O3!J^8ukV{|cM7b>C0ll2JA%drh*s?~eIv7XNR#66M9oaP82h!$wCoZTVc2{I)Q(
zTW#fqipKg|zr)RE#y{Qs-F@LtQRjx}pTg%0VmJTneYESE>ny3uY@tgtwP8Asq`!K&
lEvIwV^?3pe3@1O-7bx?!&g0fT#lXP8;OXk;vd$@?2>?3){G9**

literal 0
HcmV?d00001

diff --git a/assets/ui/game_fail.png b/assets/ui/game_fail.png
new file mode 100644
index 0000000000000000000000000000000000000000..93f2801f9d6bb2ce508e1293cd64d6ff2e9970ec
GIT binary patch
literal 3647
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
a*}uy$dF>W!zRtkFz~JfX=d#Wzp$P!#%#zLk

literal 0
HcmV?d00001

diff --git a/assets/ui/game_win.png b/assets/ui/game_win.png
new file mode 100644
index 0000000000000000000000000000000000000000..876334279c1711b349a62131a33607eecf924eb6
GIT binary patch
literal 7937
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
P3=9mOu6{1-oD!M<Ur^e&

literal 0
HcmV?d00001

diff --git a/assets/ui/placeholder.png b/assets/ui/placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..814df31be6ddc4275ebe4490c79365578dbef1f0
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0y~yU^oE6jLZxS3>iZITo@P_I14-?iy0WCPk}I_+{y{!
z3=9mCC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NHH)lFbDXAxc>kDfB6yV
z6ATOtj3q&S!3+-1Zlp0VFi3m4IEF|_zCCEj$iTpGNa6SLI9~n)1_lO(0v(|P42<pU
Q7vF(+p00i_>zopr0K3yKtN;K2

literal 0
HcmV?d00001

diff --git a/assets/ui/type_pick-image.png b/assets/ui/type_pick-image.png
new file mode 100644
index 0000000000000000000000000000000000000000..216e7d24926beb60c9806f5404a313cb62778ffb
GIT binary patch
literal 6046
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
BD=7c~

literal 0
HcmV?d00001

diff --git a/assets/ui/type_pick-word.png b/assets/ui/type_pick-word.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c816e62f246aa7fc2762cae52090547b74cb1c2
GIT binary patch
literal 6056
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

literal 0
HcmV?d00001

diff --git a/fastlane/metadata/android/en-US/changelogs/65.txt b/fastlane/metadata/android/en-US/changelogs/65.txt
new file mode 100644
index 0000000..d4afd51
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/65.txt
@@ -0,0 +1 @@
+Improve/normalize game architecture.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/65.txt b/fastlane/metadata/android/fr-FR/changelogs/65.txt
new file mode 100644
index 0000000..6a9871a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/65.txt
@@ -0,0 +1 @@
+Amélioration/normalisation de l'architecture du jeu.
diff --git a/images/build_images.sh b/images/build_images.sh
deleted file mode 100755
index c963984..0000000
--- a/images/build_images.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#! /bin/bash
-
-# Check dependencies
-command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
-command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
-command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
-command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; }
-
-CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
-BASE_DIR="$(dirname "${CURRENT_DIR}")"
-
-CONVERT_OPTIONS="-alpha off +dither -colors 256 -depth 4"
-OPTIPNG_OPTIONS="-preserve -quiet -o7"
-
-# optimize svg
-function optimize_svg() {
-  SOURCE="$1"
-
-  cp ${SOURCE} ${SOURCE}.tmp
-  scour \
-      --remove-descriptive-elements \
-      --enable-id-stripping \
-      --enable-viewboxing \
-      --enable-comment-stripping \
-      --nindent=4 \
-      -i ${SOURCE}.tmp \
-      -o ${SOURCE}
-  rm ${SOURCE}.tmp
-}
-
-# build image
-function build_image() {
-  SOURCE="$1"
-  TARGET_PNG="$2"
-  IMAGE_WIDTH="$3"
-  IMAGE_HEIGHT="$4"
-
-  inkscape \
-      --export-width=${IMAGE_WIDTH} \
-      --export-height=${IMAGE_HEIGHT} \
-      --export-filename=${TARGET_PNG} \
-      ${SOURCE}
-}
-
-# optimize image
-function optimize_image() {
-  IMAGE_FILE="$1"
-
-  convert "${IMAGE_FILE}" ${CONVERT_OPTIONS} "${IMAGE_FILE}"
-  optipng ${OPTIPNG_OPTIONS} ${IMAGE_FILE}
-}
-
-# build menu image
-function build_menu_image() {
-  IMAGE_NAME="$1"
-
-  INPUT_SVG="${CURRENT_DIR}/menu/${IMAGE_NAME}.svg"
-  OUTPUT_PNG="${BASE_DIR}/assets/menu/${IMAGE_NAME}.png"
-
-  optimize_svg "${INPUT_SVG}"
-  build_image "${INPUT_SVG}" "${OUTPUT_PNG}" 640 640
-  optimize_image "${OUTPUT_PNG}"
-}
-
-
-build_menu_image "game-pick-image"
-build_menu_image "game-pick-word"
diff --git a/lib/config/default_game_settings.dart b/lib/config/default_game_settings.dart
new file mode 100644
index 0000000..f6ae267
--- /dev/null
+++ b/lib/config/default_game_settings.dart
@@ -0,0 +1,52 @@
+import 'package:wordguessing/utils/tools.dart';      
+
+class DefaultGameSettings {
+  // available game parameters codes
+  static const String parameterCodeGameType = 'type';
+  static const String parameterCodeLangValue = 'lang';
+  static const List<String> availableParameters = [
+    parameterCodeGameType,
+    parameterCodeLangValue,
+  ];
+
+  // game type: available values
+  static const String gameTypeValuePickWord = 'pick-word';
+  static const String gameTypeValuePickImage = 'pick-image';
+  static const List<String> allowedGameTypeValues = [
+    gameTypeValuePickWord,
+    gameTypeValuePickImage,
+  ];
+  // game type: default value
+  static const String defaultGameTypeValue = gameTypeValuePickWord;
+
+  // lang: available values
+  static const String langValueFr = 'fr';
+  static const String langValueEn = 'en';
+  static const List<String> allowedLangValues = [
+    langValueFr,
+    langValueEn,
+  ];
+  // lang: default value
+  static const String defaultLangValue = langValueFr;
+
+  // available values from parameter code
+  static List<String> getAvailableValues(String parameterCode) {
+    switch (parameterCode) {
+      case parameterCodeGameType:
+        return DefaultGameSettings.allowedGameTypeValues;
+      case parameterCodeLangValue:
+        return DefaultGameSettings.allowedLangValues;
+    }
+
+    printlog('Did not find any available value for game parameter "$parameterCode".');
+    return [];
+  }
+
+  // parameters displayed with assets (instead of painter)
+  static List<String> displayedWithAssets = [
+    parameterCodeGameType,
+  ];
+
+  static const int itemsCount = 4;
+  static const int recentWordsCount = 20;
+}
diff --git a/lib/config/default_global_settings.dart b/lib/config/default_global_settings.dart
new file mode 100644
index 0000000..2b98f69
--- /dev/null
+++ b/lib/config/default_global_settings.dart
@@ -0,0 +1,33 @@
+import 'package:wordguessing/utils/tools.dart';      
+
+class DefaultGlobalSettings {
+  // available global parameters codes
+  static const String parameterCodeSkin = 'skin';
+  static const List<String> availableParameters = [
+    parameterCodeSkin,
+  ];
+
+  // skin: available values
+  static const String skinValueDefault = 'default';
+  static const List<String> allowedSkinValues = [
+    skinValueDefault,
+  ];
+  // skin: default value
+  static const String defaultSkinValue = skinValueDefault;
+
+  // available values from parameter code
+  static List<String> getAvailableValues(String parameterCode) {
+    switch (parameterCode) {
+      case parameterCodeSkin:
+        return DefaultGlobalSettings.allowedSkinValues;
+    }
+
+    printlog('Did not find any available value for global parameter "$parameterCode".');
+    return [];
+  }
+
+  // parameters displayed with assets (instead of painter)
+  static List<String> displayedWithAssets = [
+    //
+  ];
+}
diff --git a/lib/config/menu.dart b/lib/config/menu.dart
index 13081ea..3d55d36 100644
--- a/lib/config/menu.dart
+++ b/lib/config/menu.dart
@@ -1,53 +1,51 @@
-import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:unicons/unicons.dart';
 
-import 'package:wordguessing/ui/screens/about_page.dart';
-import 'package:wordguessing/ui/screens/game_page.dart';
-import 'package:wordguessing/ui/screens/settings_page.dart';
+import 'package:wordguessing/ui/screens/page_about.dart';
+import 'package:wordguessing/ui/screens/page_game.dart';
+import 'package:wordguessing/ui/screens/page_settings.dart';
 
 class MenuItem {
-  final String code;
   final Icon icon;
   final Widget page;
 
   const MenuItem({
-    required this.code,
     required this.icon,
     required this.page,
   });
 }
 
 class Menu {
-  static List<MenuItem> items = [
-    const MenuItem(
-      code: 'bottom_nav_home',
-      icon: Icon(UniconsLine.home),
-      page: GamePage(),
-    ),
-    const MenuItem(
-      code: 'bottom_nav_settings',
-      icon: Icon(UniconsLine.setting),
-      page: SettingsPage(),
-    ),
-    const MenuItem(
-      code: 'bottom_nav_about',
-      icon: Icon(UniconsLine.info_circle),
-      page: AboutPage(),
-    ),
-  ];
+  static const indexGame = 0;
+  static const menuItemGame = MenuItem(
+    icon: Icon(UniconsLine.home),
+    page: PageGame(),
+  );
 
-  static Widget getPageWidget(int pageIndex) {
-    return Menu.items.elementAt(pageIndex).page;
+  static const indexSettings = 1;
+  static const menuItemSettings = MenuItem(
+    icon: Icon(UniconsLine.setting),
+    page: PageSettings(),
+  );
+
+  static const indexAbout = 2;
+  static const menuItemAbout = MenuItem(
+    icon: Icon(UniconsLine.info_circle),
+    page: PageAbout(),
+  );
+
+  static Map<int, MenuItem> items = {
+    indexGame: menuItemGame,
+    indexSettings: menuItemSettings,
+    indexAbout: menuItemAbout,
+  };
+
+  static bool isIndexAllowed(int pageIndex) {
+    return items.keys.contains(pageIndex);
   }
 
-  static List<BottomNavigationBarItem> getMenuItems() {
-    return Menu.items
-        .map((MenuItem item) => BottomNavigationBarItem(
-              icon: item.icon,
-              label: tr(item.code),
-            ))
-        .toList();
+  static Widget getPageWidget(int pageIndex) {
+    return items[pageIndex]?.page ?? menuItemGame.page;
   }
 
   static int itemsCount = Menu.items.length;
diff --git a/lib/config/theme.dart b/lib/config/theme.dart
index be39034..74f532f 100644
--- a/lib/config/theme.dart
+++ b/lib/config/theme.dart
@@ -39,11 +39,9 @@ final ColorScheme lightColorScheme = ColorScheme.light(
   secondary: primarySwatch.shade500,
   onSecondary: Colors.white,
   error: errorColor,
-  background: textSwatch.shade200,
-  onBackground: textSwatch.shade500,
   onSurface: textSwatch.shade500,
   surface: textSwatch.shade50,
-  surfaceVariant: Colors.white,
+  surfaceContainerHighest: Colors.white,
   shadow: textSwatch.shade900.withOpacity(.1),
 );
 
@@ -52,11 +50,9 @@ final ColorScheme darkColorScheme = ColorScheme.dark(
   secondary: primarySwatch.shade500,
   onSecondary: Colors.white,
   error: errorColor,
-  background: const Color(0xFF171724),
-  onBackground: textSwatch.shade400,
   onSurface: textSwatch.shade300,
   surface: const Color(0xFF262630),
-  surfaceVariant: const Color(0xFF282832),
+  surfaceContainerHighest: const Color(0xFF282832),
   shadow: textSwatch.shade900.withOpacity(.2),
 );
 
@@ -192,5 +188,3 @@ final ThemeData darkTheme = lightTheme.copyWith(
     ),
   ),
 );
-
-final ThemeData appTheme = darkTheme;
diff --git a/lib/cubit/game_cubit.dart b/lib/cubit/game_cubit.dart
new file mode 100644
index 0000000..bd4ccf1
--- /dev/null
+++ b/lib/cubit/game_cubit.dart
@@ -0,0 +1,113 @@
+import 'package:equatable/equatable.dart';
+import 'package:flutter/material.dart';
+import 'package:hydrated_bloc/hydrated_bloc.dart';
+
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/models/settings/settings_game.dart';
+import 'package:wordguessing/models/settings/settings_global.dart';
+
+part 'game_state.dart';
+
+class GameCubit extends HydratedCubit<GameState> {
+  GameCubit()
+      : super(GameState(
+          currentGame: Game.createEmpty(),
+        ));
+
+  void updateState(Game game) {
+    emit(GameState(
+      currentGame: game,
+    ));
+  }
+
+  void refresh() {
+    final Game game = Game(
+      // Settings
+      gameSettings: state.currentGame.gameSettings,
+      globalSettings: state.currentGame.globalSettings,
+      // State
+      isRunning: state.currentGame.isRunning,
+      isStarted: state.currentGame.isStarted,
+      isFinished: state.currentGame.isFinished,
+      animationInProgress: state.currentGame.animationInProgress,
+      // Base data
+      word: state.currentGame.word,
+      otherWords: state.currentGame.otherWords,
+      images: state.currentGame.images,
+      // Game data
+      recentWordsKeys: state.currentGame.recentWordsKeys,
+      questionsCount: state.currentGame.questionsCount,
+      goodAnswers: state.currentGame.goodAnswers,
+      wrongAnswers: state.currentGame.wrongAnswers,
+    );
+    // game.dump();
+
+    updateState(game);
+  }
+
+  void startNewGame({
+    required GameSettings gameSettings,
+    required GlobalSettings globalSettings,
+  }) {
+    final Game newGame = Game.createNew(
+      // Settings
+      gameSettings: gameSettings,
+      globalSettings: globalSettings,
+    );
+
+    updateState(newGame);
+    nextWord();
+
+    newGame.dump();
+
+    updateState(newGame);
+    refresh();
+  }
+
+  void quitGame() {
+    state.currentGame.isRunning = false;
+    refresh();
+  }
+
+  void resumeSavedGame() {
+    state.currentGame.isRunning = true;
+    refresh();
+  }
+
+  void deleteSavedGame() {
+    state.currentGame.isRunning = false;
+    state.currentGame.isFinished = true;
+    refresh();
+  }
+
+  void nextWord() {
+    state.currentGame.pickNewWord();
+    refresh();
+  }
+
+  void checkWord(word) {
+    if (state.currentGame.word.key == word.key) {
+      state.currentGame.goodAnswers++;
+      nextWord();
+    } else {
+      state.currentGame.wrongAnswers++;
+    }
+    refresh();
+  }
+
+  @override
+  GameState? fromJson(Map<String, dynamic> json) {
+    final Game currentGame = json['currentGame'] as Game;
+
+    return GameState(
+      currentGame: currentGame,
+    );
+  }
+
+  @override
+  Map<String, dynamic>? toJson(GameState state) {
+    return <String, dynamic>{
+      'currentGame': state.currentGame.toJson(),
+    };
+  }
+}
diff --git a/lib/cubit/game_state.dart b/lib/cubit/game_state.dart
new file mode 100644
index 0000000..00e2116
--- /dev/null
+++ b/lib/cubit/game_state.dart
@@ -0,0 +1,15 @@
+part of 'game_cubit.dart';
+
+@immutable
+class GameState extends Equatable {
+  const GameState({
+    required this.currentGame,
+  });
+
+  final Game currentGame;
+
+  @override
+  List<dynamic> get props => <dynamic>[
+        currentGame,
+      ];
+}
diff --git a/lib/cubit/bottom_nav_cubit.dart b/lib/cubit/nav_cubit.dart
similarity index 51%
rename from lib/cubit/bottom_nav_cubit.dart
rename to lib/cubit/nav_cubit.dart
index 96d5a69..889605d 100644
--- a/lib/cubit/bottom_nav_cubit.dart
+++ b/lib/cubit/nav_cubit.dart
@@ -2,26 +2,32 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
 
 import 'package:wordguessing/config/menu.dart';
 
-class BottomNavCubit extends HydratedCubit<int> {
-  BottomNavCubit() : super(0);
+class NavCubit extends HydratedCubit<int> {
+  NavCubit() : super(0);
 
   void updateIndex(int index) {
-    if (isIndexAllowed(index)) {
+    if (Menu.isIndexAllowed(index)) {
       emit(index);
     } else {
-      goToHomePage();
+      goToGamePage();
     }
   }
 
-  bool isIndexAllowed(int index) {
-    return (index >= 0) && (index < Menu.itemsCount);
+  void goToGamePage() {
+    emit(Menu.indexGame);
   }
 
-  void goToHomePage() => emit(0);
+  void goToSettingsPage() {
+    emit(Menu.indexSettings);
+  }
+
+  void goToAboutPage() {
+    emit(Menu.indexAbout);
+  }
 
   @override
   int fromJson(Map<String, dynamic> json) {
-    return 0;
+    return Menu.indexGame;
   }
 
   @override
diff --git a/lib/cubit/settings_game_cubit.dart b/lib/cubit/settings_game_cubit.dart
new file mode 100644
index 0000000..d7d0210
--- /dev/null
+++ b/lib/cubit/settings_game_cubit.dart
@@ -0,0 +1,72 @@
+import 'package:equatable/equatable.dart';
+import 'package:flutter/material.dart';
+import 'package:hydrated_bloc/hydrated_bloc.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/models/settings/settings_game.dart';
+
+part 'settings_game_state.dart';
+
+class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
+  GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault()));
+
+  void setValues({
+    String? gameType,
+    String? lang,
+  }) {
+    emit(
+      GameSettingsState(
+        settings: GameSettings(
+          gameType: gameType ?? state.settings.gameType,
+          lang: lang ?? state.settings.lang,
+        ),
+      ),
+    );
+  }
+
+  String getParameterValue(String code) {
+    switch (code) {
+      case DefaultGameSettings.parameterCodeGameType:
+        return GameSettings.getGameTypeValueFromUnsafe(state.settings.gameType);
+      case DefaultGameSettings.parameterCodeLangValue:
+        return GameSettings.getLangValueFromUnsafe(state.settings.lang);
+    }
+
+    return '';
+  }
+
+  void setParameterValue(String code, String value) {
+    final String gameType = code == DefaultGameSettings.parameterCodeGameType
+        ? value
+        : getParameterValue(DefaultGameSettings.parameterCodeGameType);
+    final String lang = code == DefaultGameSettings.parameterCodeLangValue
+        ? value
+        : getParameterValue(DefaultGameSettings.parameterCodeLangValue);
+
+    setValues(
+      gameType: gameType,
+      lang: lang,
+    );
+  }
+
+  @override
+  GameSettingsState? fromJson(Map<String, dynamic> json) {
+    final String gameType = json[DefaultGameSettings.parameterCodeGameType] as String;
+    final String lang = json[DefaultGameSettings.parameterCodeLangValue] as String;
+
+    return GameSettingsState(
+      settings: GameSettings(
+        gameType: gameType,
+        lang: lang,
+      ),
+    );
+  }
+
+  @override
+  Map<String, dynamic>? toJson(GameSettingsState state) {
+    return <String, dynamic>{
+      DefaultGameSettings.parameterCodeGameType: state.settings.gameType,
+      DefaultGameSettings.parameterCodeLangValue: state.settings.lang,
+    };
+  }
+}
diff --git a/lib/cubit/settings_game_state.dart b/lib/cubit/settings_game_state.dart
new file mode 100644
index 0000000..5acd85b
--- /dev/null
+++ b/lib/cubit/settings_game_state.dart
@@ -0,0 +1,15 @@
+part of 'settings_game_cubit.dart';
+
+@immutable
+class GameSettingsState extends Equatable {
+  const GameSettingsState({
+    required this.settings,
+  });
+
+  final GameSettings settings;
+
+  @override
+  List<dynamic> get props => <dynamic>[
+        settings,
+      ];
+}
diff --git a/lib/cubit/settings_global_cubit.dart b/lib/cubit/settings_global_cubit.dart
new file mode 100644
index 0000000..9b3f660
--- /dev/null
+++ b/lib/cubit/settings_global_cubit.dart
@@ -0,0 +1,60 @@
+import 'package:equatable/equatable.dart';
+import 'package:flutter/material.dart';
+import 'package:hydrated_bloc/hydrated_bloc.dart';
+
+import 'package:wordguessing/config/default_global_settings.dart';
+import 'package:wordguessing/models/settings/settings_global.dart';
+
+part 'settings_global_state.dart';
+
+class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> {
+  GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault()));
+
+  void setValues({
+    String? skin,
+  }) {
+    emit(
+      GlobalSettingsState(
+        settings: GlobalSettings(
+          skin: skin ?? state.settings.skin,
+        ),
+      ),
+    );
+  }
+
+  String getParameterValue(String code) {
+    switch (code) {
+      case DefaultGlobalSettings.parameterCodeSkin:
+        return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin);
+    }
+    return '';
+  }
+
+  void setParameterValue(String code, String value) {
+    final String skin = (code == DefaultGlobalSettings.parameterCodeSkin)
+        ? value
+        : getParameterValue(DefaultGlobalSettings.parameterCodeSkin);
+
+    setValues(
+      skin: skin,
+    );
+  }
+
+  @override
+  GlobalSettingsState? fromJson(Map<String, dynamic> json) {
+    final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String;
+
+    return GlobalSettingsState(
+      settings: GlobalSettings(
+        skin: skin,
+      ),
+    );
+  }
+
+  @override
+  Map<String, dynamic>? toJson(GlobalSettingsState state) {
+    return <String, dynamic>{
+      DefaultGlobalSettings.parameterCodeSkin: state.settings.skin,
+    };
+  }
+}
diff --git a/lib/cubit/settings_global_state.dart b/lib/cubit/settings_global_state.dart
new file mode 100644
index 0000000..ebcddd7
--- /dev/null
+++ b/lib/cubit/settings_global_state.dart
@@ -0,0 +1,15 @@
+part of 'settings_global_cubit.dart';
+
+@immutable
+class GlobalSettingsState extends Equatable {
+  const GlobalSettingsState({
+    required this.settings,
+  });
+
+  final GlobalSettings settings;
+
+  @override
+  List<dynamic> get props => <dynamic>[
+        settings,
+      ];
+}
diff --git a/lib/data/fetch_data_helper.dart b/lib/data/fetch_data_helper.dart
index 848f824..7e27529 100644
--- a/lib/data/fetch_data_helper.dart
+++ b/lib/data/fetch_data_helper.dart
@@ -1,5 +1,5 @@
 import 'package:wordguessing/data/game_data.dart';
-import 'package:wordguessing/models/word.dart';
+import 'package:wordguessing/models/data/word.dart';
 import 'package:wordguessing/utils/tools.dart';
 
 class FetchDataHelper {
@@ -38,7 +38,7 @@ class FetchDataHelper {
     }
   }
 
-  List<Word> getWords(String lang, int count) {
+  List<Word> getWords({required String lang, required int count}) {
     if (_words.isEmpty || lang != _lang) {
       init(lang);
     }
diff --git a/lib/main.dart b/lib/main.dart
index 5dac5d3..3a627ad 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -2,20 +2,23 @@ import 'dart:io';
 
 import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:hive/hive.dart';
 import 'package:hydrated_bloc/hydrated_bloc.dart';
 import 'package:path_provider/path_provider.dart';
-import 'package:provider/provider.dart';
 
+import 'package:wordguessing/config/default_game_settings.dart';
 import 'package:wordguessing/config/theme.dart';
-import 'package:wordguessing/cubit/bottom_nav_cubit.dart';
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/cubit/nav_cubit.dart';
+import 'package:wordguessing/cubit/settings_game_cubit.dart';
+import 'package:wordguessing/cubit/settings_global_cubit.dart';
 import 'package:wordguessing/cubit/theme_cubit.dart';
-import 'package:wordguessing/provider/data.dart';
 import 'package:wordguessing/ui/skeleton.dart';
 
 void main() async {
-  /// Initialize packages
+  // Initialize packages
   WidgetsFlutterBinding.ensureInitialized();
   await EasyLocalization.ensureInitialized();
   final Directory tmpDir = await getTemporaryDirectory();
@@ -24,18 +27,17 @@ void main() async {
     storageDirectory: tmpDir,
   );
 
-  runApp(
-    EasyLocalization(
-      path: 'assets/translations',
-      supportedLocales: const <Locale>[
-        Locale('en'),
-        Locale('fr'),
-      ],
-      fallbackLocale: const Locale('en'),
-      useFallbackTranslations: true,
-      child: const MyApp(),
-    ),
-  );
+  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
+      .then((value) => runApp(EasyLocalization(
+            path: 'assets/translations',
+            supportedLocales: const <Locale>[
+              Locale('en'),
+              Locale('fr'),
+            ],
+            fallbackLocale: const Locale('en'),
+            useFallbackTranslations: true,
+            child: const MyApp(),
+          )));
 }
 
 class MyApp extends StatelessWidget {
@@ -43,36 +45,62 @@ class MyApp extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
+    final List<String> assets = getImagesAssets();
+    for (String asset in assets) {
+      precacheImage(AssetImage(asset), context);
+    }
+
     return MultiBlocProvider(
       providers: [
-        BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()),
+        BlocProvider<NavCubit>(create: (context) => NavCubit()),
         BlocProvider<ThemeCubit>(create: (context) => ThemeCubit()),
+        BlocProvider<GameCubit>(create: (context) => GameCubit()),
+        BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()),
+        BlocProvider<GameSettingsCubit>(create: (context) => GameSettingsCubit()),
       ],
       child: BlocBuilder<ThemeCubit, ThemeModeState>(
-          builder: (BuildContext context, ThemeModeState state) {
-        return ChangeNotifierProvider(
-          create: (BuildContext context) => Data(),
-          child: Consumer<Data>(
-            builder: (context, data, child) {
-              return MaterialApp(
-                title: 'Jeux de mots et lettres',
-                home: const SkeletonScreen(),
+        builder: (BuildContext context, ThemeModeState state) {
+          return MaterialApp(
+            title: 'Jeux de mots et lettres',
+            home: const SkeletonScreen(),
 
-                // Theme stuff
-                theme: lightTheme,
-                darkTheme: darkTheme,
-                themeMode: state.themeMode,
+            // Theme stuff
+            theme: lightTheme,
+            darkTheme: darkTheme,
+            themeMode: state.themeMode,
 
-                // Localization stuff
-                localizationsDelegates: context.localizationDelegates,
-                supportedLocales: context.supportedLocales,
-                locale: context.locale,
-                debugShowCheckedModeBanner: false,
-              );
-            },
-          ),
-        );
-      }),
+            // Localization stuff
+            localizationsDelegates: context.localizationDelegates,
+            supportedLocales: context.supportedLocales,
+            locale: context.locale,
+            debugShowCheckedModeBanner: false,
+          );
+        },
+      ),
     );
   }
+
+  List<String> getImagesAssets() {
+    final List<String> assets = [];
+
+    final List<String> gameImages = [
+      'button_back',
+      'button_delete_saved_game',
+      'button_resume_game',
+      'button_start',
+      'game_fail',
+      'game_win',
+      'placeholder',
+    ];
+
+    for (String gameType in DefaultGameSettings.allowedGameTypeValues) {
+      gameImages.add('${DefaultGameSettings.parameterCodeGameType}_$gameType');
+    }
+
+    for (String image in gameImages) {
+      assets.add('assets/ui/$image.png');
+    }
+
+    return assets;
+  }
 }
diff --git a/lib/models/word.dart b/lib/models/data/word.dart
similarity index 53%
rename from lib/models/word.dart
rename to lib/models/data/word.dart
index bd5dfc3..f6b29e9 100644
--- a/lib/models/word.dart
+++ b/lib/models/data/word.dart
@@ -9,16 +9,24 @@ class Word {
     required this.images,
   });
 
-  Map<String, dynamic> toJson() {
-    return {
-      'key': key,
-      'text': text,
-      'images': images.toString(),
-    };
+  factory Word.createEmpty() {
+    return const Word(
+      key: '',
+      text: '',
+      images: [],
+    );
   }
 
   @override
   String toString() {
-    return toJson().toString();
+    return '$Word(${toJson()})';
+  }
+
+  Map<String, dynamic>? toJson() {
+    return <String, dynamic>{
+      'key': key,
+      'text': text,
+      'images': images,
+    };
   }
 }
diff --git a/lib/models/game/game.dart b/lib/models/game/game.dart
new file mode 100644
index 0000000..7ea682d
--- /dev/null
+++ b/lib/models/game/game.dart
@@ -0,0 +1,219 @@
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/data/fetch_data_helper.dart';
+import 'package:wordguessing/models/data/word.dart';
+import 'package:wordguessing/models/settings/settings_game.dart';
+import 'package:wordguessing/models/settings/settings_global.dart';
+import 'package:wordguessing/utils/tools.dart';
+
+class Game {
+  Game({
+    // Settings
+    required this.gameSettings,
+    required this.globalSettings,
+
+    // State
+    this.isRunning = false,
+    this.isStarted = false,
+    this.isFinished = false,
+    this.animationInProgress = false,
+
+    // Base data
+    required this.word,
+    required this.otherWords,
+    required this.images,
+
+    // Game data
+    this.recentWordsKeys = const [],
+    this.questionsCount = 0,
+    this.goodAnswers = 0,
+    this.wrongAnswers = 0,
+  });
+
+  // Settings
+  final GameSettings gameSettings;
+  final GlobalSettings globalSettings;
+
+  // State
+  bool isRunning;
+  bool isStarted;
+  bool isFinished;
+  bool animationInProgress;
+
+  // Base data
+  Word word;
+  List<Word> otherWords;
+  List<Word> images;
+
+  // Game data
+  List<String> recentWordsKeys;
+  int questionsCount;
+  int goodAnswers;
+  int wrongAnswers;
+
+  factory Game.createEmpty() {
+    return Game(
+      // Settings
+      gameSettings: GameSettings.createDefault(),
+      globalSettings: GlobalSettings.createDefault(),
+      // Base data
+      word: Word.createEmpty(),
+      otherWords: [],
+      images: [],
+      // Game data
+      recentWordsKeys: [],
+    );
+  }
+
+  factory Game.createNew({
+    GameSettings? gameSettings,
+    GlobalSettings? globalSettings,
+  }) {
+    final GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault();
+    final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
+
+    return Game(
+      // Settings
+      gameSettings: newGameSettings,
+      globalSettings: newGlobalSettings,
+      // State
+      isRunning: true,
+      // Base data
+      word: Word.createEmpty(),
+      otherWords: [],
+      images: [],
+      // Game data
+      recentWordsKeys: [],
+    );
+  }
+
+  bool get canBeResumed => isStarted && !isFinished;
+
+  bool get gameWon => isRunning && isStarted && isFinished;
+
+  void updateWord(Word newWord) {
+    word = newWord;
+    if (newWord.key != '') {
+      recentWordsKeys.insert(0, newWord.key);
+      recentWordsKeys = recentWordsKeys.take(DefaultGameSettings.recentWordsCount).toList();
+    }
+  }
+
+  void pickNewWord() {
+    switch (gameSettings.gameType) {
+      case DefaultGameSettings.gameTypeValuePickImage:
+        pickDataForGamePickImage();
+        break;
+      case DefaultGameSettings.gameTypeValuePickWord:
+        pickDataForGamePickWord();
+        break;
+      default:
+    }
+
+    questionsCount++;
+  }
+
+  bool isRecentlyPicked(String key) {
+    return recentWordsKeys.contains(key);
+  }
+
+  void pickDataForGamePickImage() {
+    Word word;
+
+    int attempts = 0;
+    do {
+      final List<Word> words = FetchDataHelper().getWords(
+        lang: gameSettings.lang,
+        count: DefaultGameSettings.itemsCount,
+      );
+
+      word = words.take(1).toList()[0];
+
+      if ((words.length == DefaultGameSettings.itemsCount) && !isRecentlyPicked(word.key)) {
+        updateWord(word);
+
+        final List<Word> pickedImages = [];
+        for (var element in words) {
+          pickedImages.add(element);
+        }
+
+        images = pickedImages;
+      }
+
+      attempts++;
+    } while (word != word && attempts < 10);
+  }
+
+  void pickDataForGamePickWord() {
+    Word word;
+
+    int attempts = 0;
+    do {
+      final List<Word> words = FetchDataHelper().getWords(
+        lang: gameSettings.lang,
+        count: DefaultGameSettings.itemsCount,
+      );
+
+      word = words.take(1).toList()[0];
+
+      if ((words.length >= DefaultGameSettings.itemsCount) && !isRecentlyPicked(word.key)) {
+        updateWord(word);
+        otherWords = words.skip(1).toList();
+        images = [word];
+      }
+
+      attempts++;
+    } while (word != word && attempts < 10);
+  }
+
+  void dump() {
+    printlog('');
+    printlog('## Current game dump:');
+    printlog('');
+    printlog('$Game:');
+    printlog('  Settings');
+    gameSettings.dump();
+    globalSettings.dump();
+    printlog('  State');
+    printlog('    isRunning: $isRunning');
+    printlog('    isStarted: $isStarted');
+    printlog('    isFinished: $isFinished');
+    printlog('    animationInProgress: $animationInProgress');
+    printlog('  Base data');
+    printlog('    word: $word');
+    printlog('    otherWords: $otherWords');
+    printlog('    images: $images');
+    printlog('  Game data');
+    printlog('    recentWordsKeys: $recentWordsKeys');
+    printlog('    questionsCount: $questionsCount');
+    printlog('    goodAnswers: $goodAnswers');
+    printlog('    wrongAnswers: $wrongAnswers');
+    printlog('');
+  }
+
+  @override
+  String toString() {
+    return '$Game(${toJson()})';
+  }
+
+  Map<String, dynamic>? toJson() {
+    return <String, dynamic>{
+      // Settings
+      'gameSettings': gameSettings.toJson(),
+      'globalSettings': globalSettings.toJson(),
+      // State
+      'isRunning': isRunning,
+      'isStarted': isStarted,
+      'isFinished': isFinished,
+      'animationInProgress': animationInProgress,
+      // Base data
+      'word': word.toJson(),
+      'otherWords': otherWords,
+      'images': images,
+      // Game data
+      'recentWordsKeys': recentWordsKeys,
+      'questionsCount': questionsCount,
+      'goodAnswers': goodAnswers,
+      'wrongAnswers': wrongAnswers,
+    };
+  }
+}
diff --git a/lib/models/settings/settings_game.dart b/lib/models/settings/settings_game.dart
new file mode 100644
index 0000000..09272f4
--- /dev/null
+++ b/lib/models/settings/settings_game.dart
@@ -0,0 +1,54 @@
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/utils/tools.dart';
+
+class GameSettings {
+  final String gameType;
+  final String lang;
+
+  GameSettings({
+    required this.gameType,
+    required this.lang,
+  });
+
+  static String getGameTypeValueFromUnsafe(String gameType) {
+    if (DefaultGameSettings.allowedGameTypeValues.contains(gameType)) {
+      return gameType;
+    }
+
+    return DefaultGameSettings.defaultGameTypeValue;
+  }
+
+  static String getLangValueFromUnsafe(String lang) {
+    if (DefaultGameSettings.allowedLangValues.contains(lang)) {
+      return lang;
+    }
+
+    return DefaultGameSettings.defaultLangValue;
+  }
+
+  factory GameSettings.createDefault() {
+    return GameSettings(
+      gameType: DefaultGameSettings.defaultGameTypeValue,
+      lang: DefaultGameSettings.defaultLangValue,
+    );
+  }
+
+  void dump() {
+    printlog('$GameSettings:');
+    printlog('  ${DefaultGameSettings.parameterCodeGameType}: $gameType');
+    printlog('  ${DefaultGameSettings.parameterCodeLangValue}: $lang');
+    printlog('');
+  }
+
+  @override
+  String toString() {
+    return '$GameSettings(${toJson()})';
+  }
+
+  Map<String, dynamic>? toJson() {
+    return <String, dynamic>{
+      DefaultGameSettings.parameterCodeGameType: gameType,
+      DefaultGameSettings.parameterCodeLangValue: lang,
+    };
+  }
+}
diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart
new file mode 100644
index 0000000..3072b1f
--- /dev/null
+++ b/lib/models/settings/settings_global.dart
@@ -0,0 +1,41 @@
+import 'package:wordguessing/config/default_global_settings.dart';
+import 'package:wordguessing/utils/tools.dart';
+
+class GlobalSettings {
+  String skin;
+
+  GlobalSettings({
+    required this.skin,
+  });
+
+  static String getSkinValueFromUnsafe(String skin) {
+    if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) {
+      return skin;
+    }
+
+    return DefaultGlobalSettings.defaultSkinValue;
+  }
+
+  factory GlobalSettings.createDefault() {
+    return GlobalSettings(
+      skin: DefaultGlobalSettings.defaultSkinValue,
+    );
+  }
+
+  void dump() {
+    printlog('$GlobalSettings:');
+    printlog('  ${DefaultGlobalSettings.parameterCodeSkin}: $skin');
+    printlog('');
+  }
+
+  @override
+  String toString() {
+    return '$GlobalSettings(${toJson()})';
+  }
+
+  Map<String, dynamic>? toJson() {
+    return <String, dynamic>{
+      DefaultGlobalSettings.parameterCodeSkin: skin,
+    };
+  }
+}
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
deleted file mode 100644
index 476ed71..0000000
--- a/lib/provider/data.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-import 'package:flutter/foundation.dart';
-
-import 'package:wordguessing/models/word.dart';
-
-enum GameType { pickWord, pickImage }
-
-class Data extends ChangeNotifier {
-  GameType? _gameType;
-
-  // Language
-  String _lang = '';
-
-  // randomization
-  Word? _word;
-  List<Word> _otherWords = [];
-  List<Word> _images = [];
-  final int _recentWordsCount = 20;
-  List<String> _recentWordsKeys = [];
-
-  // game data
-  int _questionsCount = 0;
-  int _goodAnswers = 0;
-  int _wrongAnswers = 0;
-
-  GameType? get gameType => _gameType;
-
-  void updateGameType(GameType gameType) {
-    _gameType = gameType;
-    notifyListeners();
-  }
-
-  void resetGameType() {
-    _gameType = null;
-    notifyListeners();
-  }
-
-  String get lang => _lang;
-
-  void updateLang(String value) {
-    _lang = value;
-    notifyListeners();
-  }
-
-  Word? get word => _word;
-
-  void updateWord(Word? newWord) {
-    _word = newWord;
-    if ((newWord != null) && (newWord.key != '')) {
-      _recentWordsKeys.insert(0, newWord.key);
-      _recentWordsKeys = _recentWordsKeys.take(_recentWordsCount).toList();
-    }
-    notifyListeners();
-  }
-
-  bool isRecentlyPicked(String word) {
-    return _recentWordsKeys.contains(word);
-  }
-
-  List<Word> get otherWords => _otherWords;
-
-  void updateOtherWords(List<Word> words) {
-    _otherWords = words;
-    notifyListeners();
-  }
-
-  List<Word> get images => _images;
-
-  void updateImages(List<Word> images) {
-    _images = images;
-    notifyListeners();
-  }
-
-  void resetGame() {
-    resetGameType();
-    updateLang('');
-    updateQuestionsCount(0);
-    updateGoodAnswers(0);
-    updateWrongAnswers(0);
-    updateWord(null);
-    updateOtherWords([]);
-    updateImages([]);
-    notifyListeners();
-  }
-
-  int get questionsCount => _questionsCount;
-
-  void updateQuestionsCount(int value) {
-    _questionsCount = value;
-    notifyListeners();
-  }
-
-  int get goodAnswers => _goodAnswers;
-
-  void updateGoodAnswers(int value) {
-    _goodAnswers = value;
-    notifyListeners();
-  }
-
-  int get wrongAnswers => _wrongAnswers;
-
-  void updateWrongAnswers(int value) {
-    _wrongAnswers = value;
-    notifyListeners();
-  }
-}
diff --git a/lib/ui/game/game_end.dart b/lib/ui/game/game_end.dart
new file mode 100644
index 0000000..f760ccf
--- /dev/null
+++ b/lib/ui/game/game_end.dart
@@ -0,0 +1,52 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/actions/button_game_quit.dart';
+
+class GameEndWidget extends StatelessWidget {
+  const GameEndWidget({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        final Image decorationImage = Image(
+          image: AssetImage(
+              currentGame.gameWon ? 'assets/ui/game_win.png' : 'assets/ui/game_fail.png'),
+          fit: BoxFit.fill,
+        );
+
+        return Container(
+          margin: const EdgeInsets.all(2),
+          padding: const EdgeInsets.all(2),
+          child: Table(
+            defaultColumnWidth: const IntrinsicColumnWidth(),
+            children: [
+              TableRow(
+                children: [
+                  Column(
+                    children: [decorationImage],
+                  ),
+                  Column(
+                    children: [
+                      currentGame.animationInProgress == true
+                          ? decorationImage
+                          : const QuitGameButton()
+                    ],
+                  ),
+                  Column(
+                    children: [decorationImage],
+                  ),
+                ],
+              ),
+            ],
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/game/game_top.dart b/lib/ui/game/game_top.dart
new file mode 100644
index 0000000..480f5c7
--- /dev/null
+++ b/lib/ui/game/game_top.dart
@@ -0,0 +1,12 @@
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/ui/widgets/game/score_bar.dart';
+
+class GameTopWidget extends StatelessWidget {
+  const GameTopWidget({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return const ScoreBarWidget();
+  }
+}
diff --git a/lib/ui/games/abstract_game.dart b/lib/ui/games/abstract_game.dart
deleted file mode 100644
index 84b45fe..0000000
--- a/lib/ui/games/abstract_game.dart
+++ /dev/null
@@ -1,163 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-
-import 'package:wordguessing/provider/data.dart';
-
-class GameAbstract extends StatelessWidget {
-  const GameAbstract({super.key});
-
-  final int countWords = 4;
-
-  void startGame(Data myProvider, String lang) {
-    myProvider.updateLang(lang);
-    nextWord(myProvider);
-  }
-
-  void nextWord(Data myProvider) {
-    pickData(myProvider);
-    myProvider.updateQuestionsCount(myProvider.questionsCount + 1);
-  }
-
-  void pickData(Data myProvider) {}
-
-  void checkWord(Data myProvider, word) {
-    if (myProvider.word?.key == word.key) {
-      myProvider.updateGoodAnswers(myProvider.goodAnswers + 1);
-      nextWord(myProvider);
-    } else {
-      myProvider.updateWrongAnswers(myProvider.wrongAnswers + 1);
-    }
-  }
-
-  Widget buildScoreItemContainer(String text, Color blockColor) {
-    // Darken block color to get border color
-    const double amount = 0.2;
-    final hsl = HSLColor.fromColor(blockColor);
-    final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));
-    final Color borderColor = hslDark.toColor();
-
-    return Container(
-      margin: const EdgeInsets.symmetric(horizontal: 15),
-      padding: const EdgeInsets.all(5),
-      decoration: BoxDecoration(
-        color: blockColor,
-        borderRadius: BorderRadius.circular(4),
-        border: Border.all(
-          color: borderColor,
-          width: 4,
-        ),
-      ),
-      child: Text(
-        text,
-        style: const TextStyle(
-          fontSize: 25,
-          fontWeight: FontWeight.w600,
-          color: Colors.black,
-        ),
-      ),
-    );
-  }
-
-  String getGoodAnswersString(Data myProvider) {
-    final int count = myProvider.questionsCount - 1;
-    return '👍 ${myProvider.goodAnswers}/$count';
-  }
-
-  String getWrongAnswersString(Data myProvider) {
-    final int count = myProvider.questionsCount - 1;
-    return '🚩 ${myProvider.wrongAnswers}/$count';
-  }
-
-  Widget buildScoreContainer(Data myProvider) {
-    return Container(
-      padding: const EdgeInsets.all(5),
-      child: Row(
-        mainAxisSize: MainAxisSize.min,
-        mainAxisAlignment: MainAxisAlignment.center,
-        children: [
-          buildScoreItemContainer(
-            getGoodAnswersString(myProvider),
-            Colors.green,
-          ),
-          const SizedBox(width: 20),
-          buildScoreItemContainer(
-            getWrongAnswersString(myProvider),
-            Colors.orange,
-          ),
-        ],
-      ),
-    );
-  }
-
-  Widget buildStartGameBlock(Data myProvider) {
-    return Column(
-      mainAxisSize: MainAxisSize.min,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        ElevatedButton(
-          style: ElevatedButton.styleFrom(
-            foregroundColor: Colors.teal,
-            backgroundColor: Colors.teal,
-            padding: const EdgeInsets.all(35),
-          ),
-          child: const Text(
-            "🇫🇷",
-            style: TextStyle(
-              fontSize: 60,
-              color: Colors.black,
-            ),
-          ),
-          onPressed: () => startGame(myProvider, 'fr'),
-        ),
-        const SizedBox(height: 15),
-        ElevatedButton(
-          style: ElevatedButton.styleFrom(
-            foregroundColor: Colors.teal,
-            backgroundColor: Colors.teal,
-            padding: const EdgeInsets.all(35),
-          ),
-          child: const Text(
-            "🇬🇧",
-            style: TextStyle(
-              fontSize: 60,
-              color: Colors.black,
-            ),
-          ),
-          onPressed: () => startGame(myProvider, 'en'),
-        ),
-      ],
-    );
-  }
-
-  List<Widget> buildPageContent(Data myProvider) {
-    return <Widget>[];
-  }
-
-  Widget buildPage(BuildContext context) {
-    final Data myProvider = Provider.of<Data>(context);
-
-    return SizedBox.expand(
-      child: FittedBox(
-        fit: BoxFit.contain,
-        alignment: Alignment.center,
-        child: SizedBox(
-          height: (MediaQuery.of(context).size.height),
-          width: (MediaQuery.of(context).size.width),
-          child: Center(
-            child: Column(
-              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisSize: MainAxisSize.max,
-              children: buildPageContent(myProvider),
-            ),
-          ),
-        ),
-      ),
-    );
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return buildPage(context);
-  }
-}
diff --git a/lib/ui/games/game_pick_image.dart b/lib/ui/games/game_pick_image.dart
deleted file mode 100644
index d6530fe..0000000
--- a/lib/ui/games/game_pick_image.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:wordguessing/data/fetch_data_helper.dart';
-import 'package:wordguessing/models/word.dart';
-import 'package:wordguessing/provider/data.dart';
-import 'package:wordguessing/ui/games/abstract_game.dart';
-
-class GamePickImagePage extends GameAbstract {
-  const GamePickImagePage({super.key});
-
-  @override
-  pickData(Data myProvider) {
-    Word word;
-
-    int attempts = 0;
-    do {
-      final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords);
-
-      word = words.take(1).toList()[0];
-
-      if ((words.length == countWords) && !myProvider.isRecentlyPicked(word.key)) {
-        myProvider.updateWord(word);
-
-        final List<Word> images = [];
-        for (var element in words) {
-          images.add(element);
-        }
-
-        myProvider.updateImages(images);
-      }
-
-      attempts++;
-    } while (myProvider.word != word && attempts < 10);
-  }
-
-  Widget buildImageContainer(Data myProvider, Word word) {
-    const double imageSize = 130;
-
-    String imageAsset = 'assets/placeholder.png';
-    if ((word.images.isNotEmpty)) {
-      imageAsset = 'assets/images/${word.images[0]}';
-    }
-
-    return TextButton(
-      child: Container(
-        decoration: BoxDecoration(
-          borderRadius: BorderRadius.circular(8),
-          border: Border.all(
-            color: Colors.blue.shade200,
-            width: 8,
-          ),
-        ),
-        margin: const EdgeInsets.all(2),
-        child: Image(
-          image: AssetImage(imageAsset),
-          width: imageSize,
-          height: imageSize,
-          fit: BoxFit.fill,
-        ),
-      ),
-      onPressed: () {
-        checkWord(myProvider, word);
-      },
-    );
-  }
-
-  Widget buildImageItemsBlock(Data myProvider) {
-    final List<Word> images = myProvider.images;
-
-    if (images.length != countWords) {
-      return const SizedBox.shrink();
-    }
-
-    images.sort((a, b) => a.key.compareTo(b.key));
-
-    return Column(
-      mainAxisSize: MainAxisSize.min,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildImageContainer(myProvider, images[0]),
-            buildImageContainer(myProvider, images[1]),
-          ],
-        ),
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildImageContainer(myProvider, images[2]),
-            buildImageContainer(myProvider, images[3]),
-          ],
-        )
-      ],
-    );
-  }
-
-  Widget buildTextItemBlock(Data myProvider) {
-    final Word? word = myProvider.word;
-
-    if (word == null) {
-      return const SizedBox.shrink();
-    }
-
-    return Container(
-      decoration: BoxDecoration(
-        color: Colors.blue.shade800,
-        borderRadius: BorderRadius.circular(6),
-        border: Border.all(
-          color: Colors.white,
-          width: 6,
-        ),
-      ),
-      child: Padding(
-        padding: const EdgeInsets.all(12),
-        child: Text(
-          word.text,
-          style: const TextStyle(
-            fontSize: 30,
-            fontWeight: FontWeight.w600,
-            color: Colors.white,
-          ),
-        ),
-      ),
-    );
-  }
-
-  @override
-  List<Widget> buildPageContent(Data myProvider) {
-    return <Widget>[
-      buildTextItemBlock(myProvider),
-      const SizedBox(height: 2),
-      ((myProvider.word == null) || (myProvider.word?.key == ''))
-          ? buildStartGameBlock(myProvider)
-          : buildScoreContainer(myProvider),
-      const SizedBox(height: 2),
-      buildImageItemsBlock(myProvider),
-    ];
-  }
-}
diff --git a/lib/ui/games/game_pick_word.dart b/lib/ui/games/game_pick_word.dart
deleted file mode 100644
index 6d68235..0000000
--- a/lib/ui/games/game_pick_word.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:wordguessing/data/fetch_data_helper.dart';
-import 'package:wordguessing/models/word.dart';
-import 'package:wordguessing/provider/data.dart';
-import 'package:wordguessing/ui/games/abstract_game.dart';
-
-class GamePickWordPage extends GameAbstract {
-  const GamePickWordPage({super.key});
-
-  @override
-  void pickData(Data myProvider) {
-    Word word;
-
-    int attempts = 0;
-    do {
-      final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords);
-
-      word = words.take(1).toList()[0];
-
-      if ((words.length >= countWords) && !myProvider.isRecentlyPicked(word.key)) {
-        myProvider.updateWord(word);
-        myProvider.updateOtherWords(words.skip(1).toList());
-        myProvider.updateImages([word]);
-      }
-
-      attempts++;
-    } while (myProvider.word != word && attempts < 10);
-  }
-
-  Widget buildImageContainer(String image) {
-    const double imageSize = 130;
-
-    String imageAsset = 'assets/placeholder.png';
-    if (image != '') {
-      imageAsset = 'assets/images/$image';
-    }
-
-    return Container(
-      margin: const EdgeInsets.all(2),
-      decoration: BoxDecoration(
-        borderRadius: BorderRadius.circular(8),
-        border: Border.all(
-          color: Colors.blue.shade200,
-          width: 8,
-        ),
-      ),
-      child: Image(
-        image: AssetImage(imageAsset),
-        width: imageSize,
-        height: imageSize,
-        fit: BoxFit.fill,
-      ),
-    );
-  }
-
-  Widget buildImageItemsBlock(Word? currentWord) {
-    return Column(
-      mainAxisSize: MainAxisSize.min,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildImageContainer(currentWord?.images[0] ?? ''),
-            buildImageContainer(currentWord?.images[1] ?? ''),
-          ],
-        ),
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildImageContainer(currentWord?.images[2] ?? ''),
-            buildImageContainer(currentWord?.images[3] ?? ''),
-          ],
-        )
-      ],
-    );
-  }
-
-  Widget buildTextContainer(Data myProvider, Word word) {
-    return Container(
-      margin: const EdgeInsets.all(2),
-      decoration: BoxDecoration(
-        color: Colors.blue[800],
-        borderRadius: BorderRadius.circular(6),
-        border: Border.all(
-          color: Colors.white,
-          width: 6,
-        ),
-      ),
-      child: TextButton(
-        style: TextButton.styleFrom(
-          padding: const EdgeInsets.all(15),
-        ),
-        child: Text(
-          word.text,
-          style: const TextStyle(
-            fontSize: 20,
-            fontWeight: FontWeight.w600,
-            color: Colors.white,
-          ),
-        ),
-        onPressed: () {
-          checkWord(myProvider, word);
-        },
-      ),
-    );
-  }
-
-  Widget buildTextItemsBlock(Data myProvider) {
-    Word? word = myProvider.word;
-    List<Word> otherWords = myProvider.otherWords;
-
-    if ((word == null) || (otherWords.length != (countWords - 1))) {
-      return const Column();
-    }
-
-    List<Word> words = [
-      word,
-      otherWords[0],
-      otherWords[1],
-      otherWords[2],
-    ];
-
-    words.sort((a, b) => a.key.compareTo(b.key));
-
-    return Column(
-      mainAxisSize: MainAxisSize.min,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildTextContainer(myProvider, words[0]),
-            const SizedBox(width: 10),
-            buildTextContainer(myProvider, words[1]),
-          ],
-        ),
-        const SizedBox(height: 5),
-        Row(
-          mainAxisSize: MainAxisSize.min,
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: [
-            buildTextContainer(myProvider, words[2]),
-            const SizedBox(width: 10),
-            buildTextContainer(myProvider, words[3]),
-          ],
-        )
-      ],
-    );
-  }
-
-  @override
-  List<Widget> buildPageContent(Data myProvider) {
-    return <Widget>[
-      (myProvider.images.isNotEmpty)
-          ? buildImageItemsBlock(myProvider.images[0])
-          : const SizedBox.shrink(),
-      const SizedBox(height: 2),
-      ((myProvider.word == null) || (myProvider.word?.key == ''))
-          ? buildStartGameBlock(myProvider)
-          : buildScoreContainer(myProvider),
-      const SizedBox(height: 2),
-      buildTextItemsBlock(myProvider),
-    ];
-  }
-}
diff --git a/lib/ui/games/game_selector.dart b/lib/ui/games/game_selector.dart
deleted file mode 100644
index 882d952..0000000
--- a/lib/ui/games/game_selector.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-
-import 'package:wordguessing/provider/data.dart';
-
-class GameSelector extends StatelessWidget {
-  const GameSelector({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    final Data myProvider = Provider.of<Data>(context);
-
-    Widget buildMenuItemContainer(String code, Color color) {
-      const double imageSize = 150;
-
-      final String imageAsset = 'assets/menu/$code.png';
-
-      return Container(
-        margin: const EdgeInsets.all(2),
-        decoration: BoxDecoration(
-          borderRadius: BorderRadius.circular(8),
-          border: Border.all(
-            color: color,
-            width: 12,
-          ),
-        ),
-        child: GestureDetector(
-          child: Image(
-            image: AssetImage(imageAsset),
-            width: imageSize,
-            height: imageSize,
-            fit: BoxFit.fill,
-          ),
-          onTap: () {
-            myProvider.resetGame();
-            switch (code) {
-              case 'game-pick-word':
-                myProvider.updateGameType(GameType.pickWord);
-                break;
-              case 'game-pick-image':
-                myProvider.updateGameType(GameType.pickImage);
-                break;
-              default:
-            }
-          },
-        ),
-      );
-    }
-
-    Widget content = Center(
-      child: Column(
-        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-        crossAxisAlignment: CrossAxisAlignment.center,
-        mainAxisSize: MainAxisSize.max,
-        children: <Widget>[
-          buildMenuItemContainer('game-pick-word', Colors.pink),
-          buildMenuItemContainer('game-pick-image', Colors.yellow),
-        ],
-      ),
-    );
-
-    return content;
-  }
-}
diff --git a/lib/ui/helpers/app_titles.dart b/lib/ui/helpers/app_titles.dart
new file mode 100644
index 0000000..b98107b
--- /dev/null
+++ b/lib/ui/helpers/app_titles.dart
@@ -0,0 +1,32 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+
+class AppHeader extends StatelessWidget {
+  const AppHeader({super.key, required this.text});
+
+  final String text;
+
+  @override
+  Widget build(BuildContext context) {
+    return Text(
+      tr(text),
+      textAlign: TextAlign.start,
+      style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
+    );
+  }
+}
+
+class AppTitle extends StatelessWidget {
+  const AppTitle({super.key, required this.text});
+
+  final String text;
+
+  @override
+  Widget build(BuildContext context) {
+    return Text(
+      tr(text),
+      textAlign: TextAlign.start,
+      style: Theme.of(context).textTheme.titleLarge!.apply(fontWeightDelta: 2),
+    );
+  }
+}
diff --git a/lib/ui/helpers/outlined_text_widget.dart b/lib/ui/helpers/outlined_text_widget.dart
new file mode 100644
index 0000000..bcc628a
--- /dev/null
+++ b/lib/ui/helpers/outlined_text_widget.dart
@@ -0,0 +1,51 @@
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/utils/color_extensions.dart';
+
+class OutlinedText extends StatelessWidget {
+  const OutlinedText({
+    super.key,
+    required this.text,
+    required this.fontSize,
+    required this.textColor,
+    this.outlineColor,
+  });
+
+  final String text;
+  final double fontSize;
+  final Color textColor;
+  final Color? outlineColor;
+
+  @override
+  Widget build(BuildContext context) {
+    final double delta = fontSize / 30;
+
+    return Text(
+      text,
+      style: TextStyle(
+        inherit: true,
+        fontSize: fontSize,
+        fontWeight: FontWeight.w600,
+        color: textColor,
+        shadows: [
+          Shadow(
+            offset: Offset(-delta, -delta),
+            color: outlineColor ?? textColor.darken(),
+          ),
+          Shadow(
+            offset: Offset(delta, -delta),
+            color: outlineColor ?? textColor.darken(),
+          ),
+          Shadow(
+            offset: Offset(delta, delta),
+            color: outlineColor ?? textColor.darken(),
+          ),
+          Shadow(
+            offset: Offset(-delta, delta),
+            color: outlineColor ?? textColor.darken(),
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/ui/layouts/game_layout.dart b/lib/ui/layouts/game_layout.dart
new file mode 100644
index 0000000..e4db92c
--- /dev/null
+++ b/lib/ui/layouts/game_layout.dart
@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/game/game_end.dart';
+import 'package:wordguessing/ui/game/game_top.dart';
+import 'package:wordguessing/ui/widgets/game/game_board.dart';
+
+class GameLayout extends StatelessWidget {
+  const GameLayout({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        return Container(
+          alignment: AlignmentDirectional.topCenter,
+          padding: const EdgeInsets.all(4),
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              const GameTopWidget(),
+              const SizedBox(height: 8),
+              const GameBoardWidget(),
+              const Expanded(child: SizedBox.shrink()),
+              currentGame.isFinished ? const GameEndWidget() : const SizedBox.shrink(),
+            ],
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/layouts/parameters_layout.dart b/lib/ui/layouts/parameters_layout.dart
new file mode 100644
index 0000000..ff114f3
--- /dev/null
+++ b/lib/ui/layouts/parameters_layout.dart
@@ -0,0 +1,154 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/config/default_global_settings.dart';
+import 'package:wordguessing/cubit/settings_game_cubit.dart';
+import 'package:wordguessing/cubit/settings_global_cubit.dart';
+import 'package:wordguessing/ui/parameters/parameter_image.dart';
+import 'package:wordguessing/ui/parameters/parameter_painter.dart';
+import 'package:wordguessing/ui/widgets/actions/button_delete_saved_game.dart';
+import 'package:wordguessing/ui/widgets/actions/button_game_start_new.dart';
+import 'package:wordguessing/ui/widgets/actions/button_resume_saved_game.dart';
+
+class ParametersLayout extends StatelessWidget {
+  const ParametersLayout({super.key, required this.canResume});
+
+  final bool canResume;
+
+  final double separatorHeight = 8.0;
+
+  @override
+  Widget build(BuildContext context) {
+    final List<Widget> lines = [];
+
+    // Game settings
+    for (String code in DefaultGameSettings.availableParameters) {
+      lines.add(Row(
+        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+        children: buildParametersLine(
+          code: code,
+          isGlobal: false,
+        ),
+      ));
+
+      lines.add(SizedBox(height: separatorHeight));
+    }
+
+    lines.add(SizedBox(height: separatorHeight));
+
+    if (canResume == false) {
+      // Start new game
+      lines.add(const Expanded(
+        child: StartNewGameButton(),
+      ));
+    } else {
+      // Resume game
+      lines.add(const Expanded(
+        child: ResumeSavedGameButton(),
+      ));
+      // Delete saved game
+      lines.add(SizedBox.square(
+        dimension: MediaQuery.of(context).size.width / 4,
+        child: const DeleteSavedGameButton(),
+      ));
+    }
+
+    lines.add(SizedBox(height: separatorHeight));
+
+    // Global settings
+    for (String code in DefaultGlobalSettings.availableParameters) {
+      lines.add(Row(
+        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+        children: buildParametersLine(
+          code: code,
+          isGlobal: true,
+        ),
+      ));
+
+      lines.add(SizedBox(height: separatorHeight));
+    }
+
+    return Column(
+      children: lines,
+    );
+  }
+
+  List<Widget> buildParametersLine({
+    required String code,
+    required bool isGlobal,
+  }) {
+    final List<Widget> parameterButtons = [];
+
+    final List<String> availableValues = isGlobal
+        ? DefaultGlobalSettings.getAvailableValues(code)
+        : DefaultGameSettings.getAvailableValues(code);
+
+    if (availableValues.length <= 1) {
+      return [];
+    }
+
+    for (String value in availableValues) {
+      final Widget parameterButton = BlocBuilder<GameSettingsCubit, GameSettingsState>(
+        builder: (BuildContext context, GameSettingsState gameSettingsState) {
+          return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
+            builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
+              final GameSettingsCubit gameSettingsCubit =
+                  BlocProvider.of<GameSettingsCubit>(context);
+              final GlobalSettingsCubit globalSettingsCubit =
+                  BlocProvider.of<GlobalSettingsCubit>(context);
+
+              final String currentValue = isGlobal
+                  ? globalSettingsCubit.getParameterValue(code)
+                  : gameSettingsCubit.getParameterValue(code);
+
+              final bool isActive = (value == currentValue);
+
+              final double displayWidth = MediaQuery.of(context).size.width;
+              final double itemWidth = displayWidth / availableValues.length - 26;
+
+              final bool displayedWithAssets =
+                  DefaultGlobalSettings.displayedWithAssets.contains(code) ||
+                      DefaultGameSettings.displayedWithAssets.contains(code);
+
+              return TextButton(
+                child: Container(
+                  child: displayedWithAssets
+                      ? SizedBox.square(
+                          dimension: itemWidth,
+                          child: ParameterImage(
+                            code: code,
+                            value: value,
+                            isSelected: isActive,
+                          ),
+                        )
+                      : CustomPaint(
+                          size: Size(itemWidth, itemWidth),
+                          willChange: false,
+                          painter: ParameterPainter(
+                            code: code,
+                            value: value,
+                            isSelected: isActive,
+                            gameSettings: gameSettingsState.settings,
+                            globalSettings: globalSettingsState.settings,
+                          ),
+                          isComplex: true,
+                        ),
+                ),
+                onPressed: () {
+                  isGlobal
+                      ? globalSettingsCubit.setParameterValue(code, value)
+                      : gameSettingsCubit.setParameterValue(code, value);
+                },
+              );
+            },
+          );
+        },
+      );
+
+      parameterButtons.add(parameterButton);
+    }
+
+    return parameterButtons;
+  }
+}
diff --git a/lib/ui/parameters/parameter_image.dart b/lib/ui/parameters/parameter_image.dart
new file mode 100644
index 0000000..fc4b576
--- /dev/null
+++ b/lib/ui/parameters/parameter_image.dart
@@ -0,0 +1,38 @@
+import 'package:flutter/material.dart';
+
+class ParameterImage extends StatelessWidget {
+  const ParameterImage({
+    super.key,
+    required this.code,
+    required this.value,
+    required this.isSelected,
+  });
+
+  final String code;
+  final String value;
+  final bool isSelected;
+
+  static const Color buttonBackgroundColor = Colors.white;
+  static const Color buttonBorderColorActive = Colors.blue;
+  static const Color buttonBorderColorInactive = Colors.white;
+  static const double buttonBorderWidth = 8.0;
+  static const double buttonBorderRadius = 8.0;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      decoration: BoxDecoration(
+        color: buttonBackgroundColor,
+        borderRadius: BorderRadius.circular(buttonBorderRadius),
+        border: Border.all(
+          color: isSelected ? buttonBorderColorActive : buttonBorderColorInactive,
+          width: buttonBorderWidth,
+        ),
+      ),
+      child: Image(
+        image: AssetImage('assets/ui/${code}_$value.png'),
+        fit: BoxFit.fill,
+      ),
+    );
+  }
+}
diff --git a/lib/ui/parameters/parameter_painter.dart b/lib/ui/parameters/parameter_painter.dart
new file mode 100644
index 0000000..9fe8dae
--- /dev/null
+++ b/lib/ui/parameters/parameter_painter.dart
@@ -0,0 +1,148 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/models/settings/settings_game.dart';
+import 'package:wordguessing/models/settings/settings_global.dart';
+import 'package:wordguessing/utils/tools.dart';
+
+class ParameterPainter extends CustomPainter {
+  const ParameterPainter({
+    required this.code,
+    required this.value,
+    required this.isSelected,
+    required this.gameSettings,
+    required this.globalSettings,
+  });
+
+  final String code;
+  final String value;
+  final bool isSelected;
+  final GameSettings gameSettings;
+  final GlobalSettings globalSettings;
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    // force square
+    final double canvasSize = min(size.width, size.height);
+
+    const Color borderColorEnabled = Colors.blue;
+    const Color borderColorDisabled = Colors.white;
+
+    // "enabled/disabled" border
+    final paint = Paint();
+    paint.style = PaintingStyle.stroke;
+    paint.color = isSelected ? borderColorEnabled : borderColorDisabled;
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 10;
+    canvas.drawRect(
+        Rect.fromPoints(const Offset(0, 0), Offset(canvasSize, canvasSize)), paint);
+
+    // content
+    switch (code) {
+      case DefaultGameSettings.parameterCodeLangValue:
+        paintLangParameterItem(value, canvas, canvasSize);
+        break;
+      default:
+        printlog('Unknown parameter: $code/$value');
+        paintUnknownParameterItem(value, canvas, canvasSize);
+    }
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+
+  // "unknown" parameter -> simple block with text
+  void paintUnknownParameterItem(
+    final String value,
+    final Canvas canvas,
+    final double size,
+  ) {
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3;
+
+    paint.color = Colors.grey;
+    paint.style = PaintingStyle.fill;
+    canvas.drawRect(Rect.fromPoints(const Offset(0, 0), Offset(size, size)), paint);
+
+    final textSpan = TextSpan(
+      text: '?\n$value',
+      style: const TextStyle(
+        color: Colors.black,
+        fontSize: 18,
+        fontWeight: FontWeight.bold,
+      ),
+    );
+    final textPainter = TextPainter(
+      text: textSpan,
+      textDirection: TextDirection.ltr,
+      textAlign: TextAlign.center,
+    );
+    textPainter.layout();
+    textPainter.paint(
+      canvas,
+      Offset(
+        (size - textPainter.width) * 0.5,
+        (size - textPainter.height) * 0.5,
+      ),
+    );
+  }
+
+  void paintLangParameterItem(
+    final String value,
+    final Canvas canvas,
+    final double size,
+  ) {
+    Color backgroundColor = Colors.grey;
+    String text = '';
+
+    switch (value) {
+      case DefaultGameSettings.langValueFr:
+        text = '🇫🇷';
+        backgroundColor = Colors.teal;
+        break;
+      case DefaultGameSettings.langValueEn:
+        text = '🇬🇧';
+        backgroundColor = Colors.teal;
+        break;
+      default:
+        printlog('Wrong value for lang parameter value: $value');
+    }
+
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3;
+
+    // Colored background
+    paint.color = backgroundColor;
+    paint.style = PaintingStyle.fill;
+    canvas.drawRect(Rect.fromPoints(const Offset(0, 0), Offset(size, size)), paint);
+
+    // centered text value
+    final textSpan = TextSpan(
+      text: text,
+      style: TextStyle(
+        color: Colors.black,
+        fontSize: size / 2.6,
+        fontWeight: FontWeight.bold,
+      ),
+    );
+    final textPainter = TextPainter(
+      text: textSpan,
+      textDirection: TextDirection.ltr,
+      textAlign: TextAlign.center,
+    );
+    textPainter.layout();
+    textPainter.paint(
+      canvas,
+      Offset(
+        (size - textPainter.width) * 0.5,
+        (size - textPainter.height) * 0.5,
+      ),
+    );
+  }
+}
diff --git a/lib/ui/screens/game_page.dart b/lib/ui/screens/game_page.dart
deleted file mode 100644
index df3c843..0000000
--- a/lib/ui/screens/game_page.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-
-import 'package:wordguessing/provider/data.dart';
-import 'package:wordguessing/ui/games/game_pick_image.dart';
-import 'package:wordguessing/ui/games/game_pick_word.dart';
-import 'package:wordguessing/ui/games/game_selector.dart';
-
-class GamePage extends StatelessWidget {
-  const GamePage({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    final Data myProvider = Provider.of<Data>(context);
-
-    switch (myProvider.gameType) {
-      case GameType.pickImage:
-        return const GamePickImagePage();
-      case GameType.pickWord:
-        return const GamePickWordPage();
-      default:
-        return const GameSelector();
-    }
-  }
-}
diff --git a/lib/ui/screens/about_page.dart b/lib/ui/screens/page_about.dart
similarity index 86%
rename from lib/ui/screens/about_page.dart
rename to lib/ui/screens/page_about.dart
index 05d1932..9ea18e9 100644
--- a/lib/ui/screens/about_page.dart
+++ b/lib/ui/screens/page_about.dart
@@ -2,10 +2,10 @@ import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:package_info_plus/package_info_plus.dart';
 
-import 'package:wordguessing/ui/widgets/header_app.dart';
+import 'package:wordguessing/ui/helpers/app_titles.dart';
 
-class AboutPage extends StatelessWidget {
-  const AboutPage({super.key});
+class PageAbout extends StatelessWidget {
+  const PageAbout({super.key});
 
   @override
   Widget build(BuildContext context) {
@@ -17,7 +17,7 @@ class AboutPage extends StatelessWidget {
         mainAxisSize: MainAxisSize.max,
         children: <Widget>[
           const SizedBox(height: 8),
-          const AppHeader(text: 'about_title'),
+          const AppTitle(text: 'about_title'),
           const Text('about_content').tr(),
           FutureBuilder<PackageInfo>(
             future: PackageInfo.fromPlatform(),
diff --git a/lib/ui/screens/page_game.dart b/lib/ui/screens/page_game.dart
new file mode 100644
index 0000000..402d3c0
--- /dev/null
+++ b/lib/ui/screens/page_game.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/layouts/game_layout.dart';
+import 'package:wordguessing/ui/layouts/parameters_layout.dart';
+
+class PageGame extends StatelessWidget {
+  const PageGame({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        return currentGame.isRunning
+            ? const GameLayout()
+            : ParametersLayout(canResume: currentGame.canBeResumed);
+      },
+    );
+  }
+}
diff --git a/lib/ui/screens/settings_page.dart b/lib/ui/screens/page_settings.dart
similarity index 65%
rename from lib/ui/screens/settings_page.dart
rename to lib/ui/screens/page_settings.dart
index df50c14..a727739 100644
--- a/lib/ui/screens/settings_page.dart
+++ b/lib/ui/screens/page_settings.dart
@@ -1,10 +1,10 @@
 import 'package:flutter/material.dart';
 
-import 'package:wordguessing/ui/widgets/header_app.dart';
-import 'package:wordguessing/ui/widgets/settings/settings_form.dart';
+import 'package:wordguessing/ui/helpers/app_titles.dart';
+import 'package:wordguessing/ui/settings/settings_form.dart';
 
-class SettingsPage extends StatelessWidget {
-  const SettingsPage({super.key});
+class PageSettings extends StatelessWidget {
+  const PageSettings({super.key});
 
   @override
   Widget build(BuildContext context) {
@@ -16,7 +16,7 @@ class SettingsPage extends StatelessWidget {
         mainAxisSize: MainAxisSize.max,
         children: <Widget>[
           SizedBox(height: 8),
-          AppHeader(text: 'settings_title'),
+          AppTitle(text: 'settings_title'),
           SizedBox(height: 8),
           SettingsForm(),
         ],
diff --git a/lib/ui/widgets/settings/settings_form.dart b/lib/ui/settings/settings_form.dart
similarity index 96%
rename from lib/ui/widgets/settings/settings_form.dart
rename to lib/ui/settings/settings_form.dart
index cb59277..bb30d8d 100644
--- a/lib/ui/widgets/settings/settings_form.dart
+++ b/lib/ui/settings/settings_form.dart
@@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:unicons/unicons.dart';
 
-import 'package:wordguessing/ui/widgets/settings/theme_card.dart';
+import 'package:wordguessing/ui/settings/theme_card.dart';
 
 class SettingsForm extends StatefulWidget {
   const SettingsForm({super.key});
diff --git a/lib/ui/widgets/settings/theme_card.dart b/lib/ui/settings/theme_card.dart
similarity index 100%
rename from lib/ui/widgets/settings/theme_card.dart
rename to lib/ui/settings/theme_card.dart
diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart
index bc0a8a0..f3f33c4 100644
--- a/lib/ui/skeleton.dart
+++ b/lib/ui/skeleton.dart
@@ -1,49 +1,34 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_swipe/flutter_swipe.dart';
-import 'package:provider/provider.dart';
 
 import 'package:wordguessing/config/menu.dart';
-import 'package:wordguessing/cubit/bottom_nav_cubit.dart';
-import 'package:wordguessing/provider/data.dart';
-import 'package:wordguessing/ui/widgets/app_bar.dart';
-import 'package:wordguessing/ui/widgets/bottom_nav_bar.dart';
+import 'package:wordguessing/cubit/nav_cubit.dart';
+import 'package:wordguessing/ui/widgets/global_app_bar.dart';
 
-class SkeletonScreen extends StatefulWidget {
+class SkeletonScreen extends StatelessWidget {
   const SkeletonScreen({super.key});
 
-  @override
-  State<SkeletonScreen> createState() => _SkeletonScreenState();
-}
-
-class _SkeletonScreenState extends State<SkeletonScreen> {
   @override
   Widget build(BuildContext context) {
-    final Data myProvider = Provider.of<Data>(context);
-
     return Scaffold(
+      appBar: const GlobalAppBar(),
       extendBodyBehindAppBar: false,
-      appBar: StandardAppBar(myProvider: myProvider),
-      body: Swiper(
-        itemCount: Menu.itemsCount,
-        itemBuilder: (BuildContext context, int index) {
-          return Menu.getPageWidget(index);
-        },
-        pagination: SwiperPagination(
-          margin: const EdgeInsets.all(0),
-          builder: SwiperCustomPagination(
-            builder: (BuildContext context, SwiperPluginConfig config) {
-              return BottomNavBar(swipeController: config.controller);
-            },
-          ),
+      body: Material(
+        color: Theme.of(context).colorScheme.surface,
+        child: BlocBuilder<NavCubit, int>(
+          builder: (BuildContext context, int pageIndex) {
+            return Padding(
+              padding: const EdgeInsets.only(
+                top: 8,
+                left: 2,
+                right: 2,
+              ),
+              child: Menu.getPageWidget(pageIndex),
+            );
+          },
         ),
-        onIndexChanged: (newPageIndex) {
-          BlocProvider.of<BottomNavCubit>(context).updateIndex(newPageIndex);
-        },
-        outer: true,
-        loop: false,
       ),
-      backgroundColor: Theme.of(context).colorScheme.background,
+      backgroundColor: Theme.of(context).colorScheme.surface,
     );
   }
 }
diff --git a/lib/ui/widgets/actions/button_delete_saved_game.dart b/lib/ui/widgets/actions/button_delete_saved_game.dart
new file mode 100644
index 0000000..0bf51b1
--- /dev/null
+++ b/lib/ui/widgets/actions/button_delete_saved_game.dart
@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+
+class DeleteSavedGameButton extends StatelessWidget {
+  const DeleteSavedGameButton({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return TextButton(
+      child: const Image(
+        image: AssetImage('assets/ui/button_delete_saved_game.png'),
+        fit: BoxFit.fill,
+      ),
+      onPressed: () {
+        BlocProvider.of<GameCubit>(context).deleteSavedGame();
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/actions/button_game_quit.dart b/lib/ui/widgets/actions/button_game_quit.dart
new file mode 100644
index 0000000..db54a2b
--- /dev/null
+++ b/lib/ui/widgets/actions/button_game_quit.dart
@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+
+class QuitGameButton extends StatelessWidget {
+  const QuitGameButton({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return TextButton(
+      child: const Image(
+        image: AssetImage('assets/ui/button_back.png'),
+        fit: BoxFit.fill,
+      ),
+      onPressed: () {
+        BlocProvider.of<GameCubit>(context).quitGame();
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/actions/button_game_start_new.dart b/lib/ui/widgets/actions/button_game_start_new.dart
new file mode 100644
index 0000000..dede701
--- /dev/null
+++ b/lib/ui/widgets/actions/button_game_start_new.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/cubit/settings_game_cubit.dart';
+import 'package:wordguessing/cubit/settings_global_cubit.dart';
+
+class StartNewGameButton extends StatelessWidget {
+  const StartNewGameButton({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameSettingsCubit, GameSettingsState>(
+      builder: (BuildContext context, GameSettingsState gameSettingsState) {
+        return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
+          builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
+            return TextButton(
+              child: const Image(
+                image: AssetImage('assets/ui/button_start.png'),
+                fit: BoxFit.fill,
+              ),
+              onPressed: () {
+                BlocProvider.of<GameCubit>(context).startNewGame(
+                  gameSettings: gameSettingsState.settings,
+                  globalSettings: globalSettingsState.settings,
+                );
+              },
+            );
+          },
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/actions/button_resume_saved_game.dart b/lib/ui/widgets/actions/button_resume_saved_game.dart
new file mode 100644
index 0000000..4e26624
--- /dev/null
+++ b/lib/ui/widgets/actions/button_resume_saved_game.dart
@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+
+class ResumeSavedGameButton extends StatelessWidget {
+  const ResumeSavedGameButton({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return TextButton(
+      child: const Image(
+        image: AssetImage('assets/ui/button_resume_game.png'),
+        fit: BoxFit.fill,
+      ),
+      onPressed: () {
+        BlocProvider.of<GameCubit>(context).resumeSavedGame();
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/app_bar.dart b/lib/ui/widgets/app_bar.dart
deleted file mode 100644
index 73038ec..0000000
--- a/lib/ui/widgets/app_bar.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:wordguessing/provider/data.dart';
-import 'package:wordguessing/ui/widgets/header_app.dart';
-
-class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
-  const StandardAppBar({super.key, required this.myProvider});
-
-  final Data myProvider;
-
-  @override
-  Widget build(BuildContext context) {
-    final List<Widget> menuActions = [];
-
-    if (myProvider.gameType != null) {
-      menuActions.add(
-        IconButton(
-          icon: const Icon(Icons.loop),
-          onPressed: () => myProvider.resetGame(),
-        ),
-      );
-    }
-
-    return AppBar(
-      title: const AppHeader(text: 'app_name'),
-      actions: menuActions,
-    );
-  }
-
-  @override
-  Size get preferredSize => const Size.fromHeight(50);
-}
diff --git a/lib/ui/widgets/bottom_nav_bar.dart b/lib/ui/widgets/bottom_nav_bar.dart
deleted file mode 100644
index 4e1d708..0000000
--- a/lib/ui/widgets/bottom_nav_bar.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_swipe/flutter_swipe.dart';
-
-import 'package:wordguessing/config/menu.dart';
-import 'package:wordguessing/cubit/bottom_nav_cubit.dart';
-
-class BottomNavBar extends StatelessWidget {
-  const BottomNavBar({super.key, required this.swipeController});
-
-  final SwiperController swipeController;
-
-  @override
-  Widget build(BuildContext context) {
-    return Card(
-      margin: const EdgeInsets.all(0),
-      elevation: 4,
-      shadowColor: Theme.of(context).colorScheme.shadow,
-      color: Theme.of(context).colorScheme.surfaceVariant,
-      shape: const ContinuousRectangleBorder(),
-      child: BlocBuilder<BottomNavCubit, int>(
-        builder: (BuildContext context, int state) {
-          return BottomNavigationBar(
-            currentIndex: state,
-            onTap: (int index) {
-              context.read<BottomNavCubit>().updateIndex(index);
-              swipeController.move(index);
-            },
-            type: BottomNavigationBarType.fixed,
-            elevation: 0,
-            backgroundColor: Colors.transparent,
-            selectedItemColor: Theme.of(context).colorScheme.primary,
-            unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color,
-            items: Menu.getMenuItems(),
-          );
-        },
-      ),
-    );
-  }
-}
diff --git a/lib/ui/widgets/game/game_board.dart b/lib/ui/widgets/game/game_board.dart
new file mode 100644
index 0000000..45ae0e8
--- /dev/null
+++ b/lib/ui/widgets/game/game_board.dart
@@ -0,0 +1,32 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/game/game_pick_image.dart';
+import 'package:wordguessing/ui/widgets/game/game_pick_word.dart';
+
+class GameBoardWidget extends StatelessWidget {
+  const GameBoardWidget({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: BlocBuilder<GameCubit, GameState>(
+        builder: (BuildContext context, GameState gameState) {
+          final Game currentGame = gameState.currentGame;
+
+          switch (currentGame.gameSettings.gameType) {
+            case DefaultGameSettings.gameTypeValuePickImage:
+              return const GamePickImagePage();
+            case DefaultGameSettings.gameTypeValuePickWord:
+              return const GamePickWordPage();
+            default:
+              return const SizedBox.shrink();
+          }
+        },
+      ),
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/game_pick_image.dart b/lib/ui/widgets/game/game_pick_image.dart
new file mode 100644
index 0000000..d15b284
--- /dev/null
+++ b/lib/ui/widgets/game/game_pick_image.dart
@@ -0,0 +1,22 @@
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/ui/widgets/game/pick_image_game_items.dart';
+import 'package:wordguessing/ui/widgets/game/pick_image_game_word.dart';
+
+class GamePickImagePage extends StatelessWidget {
+  const GamePickImagePage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return const Column(
+      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisSize: MainAxisSize.max,
+      children: [
+        PickImageGameWordContainer(),
+        SizedBox(height: 8),
+        PickImageGameItemsContainer(),
+      ],
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/game_pick_word.dart b/lib/ui/widgets/game/game_pick_word.dart
new file mode 100644
index 0000000..fc22b7b
--- /dev/null
+++ b/lib/ui/widgets/game/game_pick_word.dart
@@ -0,0 +1,22 @@
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/ui/widgets/game/pick_word_game_image_items.dart';
+import 'package:wordguessing/ui/widgets/game/pick_word_game_word_items.dart';
+
+class GamePickWordPage extends StatelessWidget {
+  const GamePickWordPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return const Column(
+      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisSize: MainAxisSize.max,
+      children: [
+        PickWordGameImageItemsContainer(),
+        SizedBox(height: 8),
+        PickWordGameWordItemsContainer(),
+      ],
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_image_game_image.dart b/lib/ui/widgets/game/pick_image_game_image.dart
new file mode 100644
index 0000000..dbf46fe
--- /dev/null
+++ b/lib/ui/widgets/game/pick_image_game_image.dart
@@ -0,0 +1,43 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/data/word.dart';
+
+class PickImageGameImageContainer extends StatelessWidget {
+  const PickImageGameImageContainer({super.key, required this.word});
+
+  final Word word;
+
+  @override
+  Widget build(BuildContext context) {
+    const double imageSize = 130;
+
+    String imageAsset = 'assets/ui/placeholder.png';
+    if ((word.images.isNotEmpty)) {
+      imageAsset = 'assets/images/${word.images[0]}';
+    }
+
+    return TextButton(
+      child: Container(
+        decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(8),
+          border: Border.all(
+            color: Colors.blue.shade200,
+            width: 8,
+          ),
+        ),
+        margin: const EdgeInsets.all(2),
+        child: Image(
+          image: AssetImage(imageAsset),
+          width: imageSize,
+          height: imageSize,
+          fit: BoxFit.fill,
+        ),
+      ),
+      onPressed: () {
+        BlocProvider.of<GameCubit>(context).checkWord(word);
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_image_game_items.dart b/lib/ui/widgets/game/pick_image_game_items.dart
new file mode 100644
index 0000000..4ff8245
--- /dev/null
+++ b/lib/ui/widgets/game/pick_image_game_items.dart
@@ -0,0 +1,51 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/data/word.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/game/pick_image_game_image.dart';
+
+class PickImageGameItemsContainer extends StatelessWidget {
+  const PickImageGameItemsContainer({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+        final List<Word> images = currentGame.images;
+
+        if (images.length != DefaultGameSettings.itemsCount) {
+          return const SizedBox.shrink();
+        }
+
+        images.sort((a, b) => a.key.compareTo(b.key));
+
+        return Column(
+          mainAxisSize: MainAxisSize.min,
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickImageGameImageContainer(word: images[0]),
+                PickImageGameImageContainer(word: images[1]),
+              ],
+            ),
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickImageGameImageContainer(word: images[2]),
+                PickImageGameImageContainer(word: images[3]),
+              ],
+            )
+          ],
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_image_game_word.dart b/lib/ui/widgets/game/pick_image_game_word.dart
new file mode 100644
index 0000000..efc1aab
--- /dev/null
+++ b/lib/ui/widgets/game/pick_image_game_word.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+
+class PickImageGameWordContainer extends StatelessWidget {
+  const PickImageGameWordContainer({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        return Container(
+          decoration: BoxDecoration(
+            color: Colors.blue.shade800,
+            borderRadius: BorderRadius.circular(6),
+            border: Border.all(
+              color: Colors.white,
+              width: 6,
+            ),
+          ),
+          child: Padding(
+            padding: const EdgeInsets.all(12),
+            child: Text(
+              currentGame.word.text,
+              style: const TextStyle(
+                fontSize: 30,
+                fontWeight: FontWeight.w600,
+                color: Colors.white,
+              ),
+            ),
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_word_game_image.dart b/lib/ui/widgets/game/pick_word_game_image.dart
new file mode 100644
index 0000000..705450c
--- /dev/null
+++ b/lib/ui/widgets/game/pick_word_game_image.dart
@@ -0,0 +1,35 @@
+import 'package:flutter/material.dart';
+
+
+class PickWordGameImageContainer extends StatelessWidget {
+  const PickWordGameImageContainer({super.key, required this.image});
+
+  final String image;
+
+  @override
+  Widget build(BuildContext context) {
+    const double imageSize = 130;
+
+    String imageAsset = 'assets/ui/placeholder.png';
+    if (image != '') {
+      imageAsset = 'assets/images/$image';
+    }
+
+    return Container(
+      margin: const EdgeInsets.all(2),
+      decoration: BoxDecoration(
+        borderRadius: BorderRadius.circular(8),
+        border: Border.all(
+          color: Colors.blue.shade200,
+          width: 8,
+        ),
+      ),
+      child: Image(
+        image: AssetImage(imageAsset),
+        width: imageSize,
+        height: imageSize,
+        fit: BoxFit.fill,
+      ),
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_word_game_image_items.dart b/lib/ui/widgets/game/pick_word_game_image_items.dart
new file mode 100644
index 0000000..c0e91cf
--- /dev/null
+++ b/lib/ui/widgets/game/pick_word_game_image_items.dart
@@ -0,0 +1,49 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/data/word.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/game/pick_word_game_image.dart';
+
+class PickWordGameImageItemsContainer extends StatelessWidget {
+  const PickWordGameImageItemsContainer({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        if (currentGame.images.isEmpty) {
+          return const SizedBox.shrink();
+        }
+
+        final Word word = currentGame.images[0];
+
+        return Column(
+          mainAxisSize: MainAxisSize.min,
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickWordGameImageContainer(image: word.images[0]),
+                PickWordGameImageContainer(image: word.images[1]),
+              ],
+            ),
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickWordGameImageContainer(image: word.images[2]),
+                PickWordGameImageContainer(image: word.images[3]),
+              ],
+            )
+          ],
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_word_game_word.dart b/lib/ui/widgets/game/pick_word_game_word.dart
new file mode 100644
index 0000000..1a2ad03
--- /dev/null
+++ b/lib/ui/widgets/game/pick_word_game_word.dart
@@ -0,0 +1,42 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/data/word.dart';
+
+class PickWordGameWordContainer extends StatelessWidget {
+  const PickWordGameWordContainer({super.key, required this.word});
+
+  final Word word;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: const EdgeInsets.all(2),
+      decoration: BoxDecoration(
+        color: Colors.blue[800],
+        borderRadius: BorderRadius.circular(6),
+        border: Border.all(
+          color: Colors.white,
+          width: 6,
+        ),
+      ),
+      child: TextButton(
+        style: TextButton.styleFrom(
+          padding: const EdgeInsets.all(15),
+        ),
+        child: Text(
+          word.text,
+          style: const TextStyle(
+            fontSize: 20,
+            fontWeight: FontWeight.w600,
+            color: Colors.white,
+          ),
+        ),
+        onPressed: () {
+          BlocProvider.of<GameCubit>(context).checkWord(word);
+        },
+      ),
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/pick_word_game_word_items.dart b/lib/ui/widgets/game/pick_word_game_word_items.dart
new file mode 100644
index 0000000..8cc0027
--- /dev/null
+++ b/lib/ui/widgets/game/pick_word_game_word_items.dart
@@ -0,0 +1,63 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/config/default_game_settings.dart';
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/data/word.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/game/pick_word_game_word.dart';
+
+class PickWordGameWordItemsContainer extends StatelessWidget {
+  const PickWordGameWordItemsContainer({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        Word? word = currentGame.word;
+        List<Word> otherWords = currentGame.otherWords;
+
+        if (otherWords.length != (DefaultGameSettings.itemsCount - 1)) {
+          return const Column();
+        }
+
+        List<Word> words = [
+          word,
+          otherWords[0],
+          otherWords[1],
+          otherWords[2],
+        ];
+
+        words.sort((a, b) => a.key.compareTo(b.key));
+
+        return Column(
+          mainAxisSize: MainAxisSize.min,
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickWordGameWordContainer(word: words[0]),
+                const SizedBox(width: 10),
+                PickWordGameWordContainer(word: words[1]),
+              ],
+            ),
+            const SizedBox(height: 5),
+            Row(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                PickWordGameWordContainer(word: words[2]),
+                const SizedBox(width: 10),
+                PickWordGameWordContainer(word: words[3]),
+              ],
+            )
+          ],
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/game/score_bar.dart b/lib/ui/widgets/game/score_bar.dart
new file mode 100644
index 0000000..f194767
--- /dev/null
+++ b/lib/ui/widgets/game/score_bar.dart
@@ -0,0 +1,43 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/widgets/indicators/score_indicator.dart';
+
+class ScoreBarWidget extends StatelessWidget {
+  const ScoreBarWidget({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        final Game currentGame = gameState.currentGame;
+
+        final int count = currentGame.questionsCount - 1;
+
+        final String goodAnswersString = '👍 ${currentGame.goodAnswers}/$count';
+        final String wrongAnswersString = '🚩 ${currentGame.wrongAnswers}/$count';
+
+        return Container(
+          padding: const EdgeInsets.all(5),
+          child: Row(
+            mainAxisSize: MainAxisSize.min,
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              ScoreIndicator(
+                text: goodAnswersString,
+                blockColor: Colors.green,
+              ),
+              const SizedBox(width: 20),
+              ScoreIndicator(
+                text: wrongAnswersString,
+                blockColor: Colors.orange,
+              ),
+            ],
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/ui/widgets/global_app_bar.dart b/lib/ui/widgets/global_app_bar.dart
new file mode 100644
index 0000000..540f87e
--- /dev/null
+++ b/lib/ui/widgets/global_app_bar.dart
@@ -0,0 +1,83 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'package:wordguessing/config/menu.dart';
+import 'package:wordguessing/cubit/game_cubit.dart';
+import 'package:wordguessing/cubit/nav_cubit.dart';
+import 'package:wordguessing/models/game/game.dart';
+import 'package:wordguessing/ui/helpers/app_titles.dart';
+
+class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
+  const GlobalAppBar({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<GameCubit, GameState>(
+      builder: (BuildContext context, GameState gameState) {
+        return BlocBuilder<NavCubit, int>(
+          builder: (BuildContext context, int pageIndex) {
+            final Game currentGame = gameState.currentGame;
+
+            final List<Widget> menuActions = [];
+
+            if (currentGame.isRunning && !currentGame.isFinished) {
+              menuActions.add(TextButton(
+                child: const Image(
+                  image: AssetImage('assets/ui/button_back.png'),
+                  fit: BoxFit.fill,
+                ),
+                onPressed: () {},
+                onLongPress: () {
+                  BlocProvider.of<GameCubit>(context).quitGame();
+                },
+              ));
+            } else {
+              if (pageIndex == Menu.indexGame) {
+                // go to Settings page
+                menuActions.add(ElevatedButton(
+                  onPressed: () {
+                    context.read<NavCubit>().goToSettingsPage();
+                  },
+                  style: ElevatedButton.styleFrom(
+                    shape: const CircleBorder(),
+                  ),
+                  child: Menu.menuItemSettings.icon,
+                ));
+
+                // go to About page
+                menuActions.add(ElevatedButton(
+                  onPressed: () {
+                    context.read<NavCubit>().goToAboutPage();
+                  },
+                  style: ElevatedButton.styleFrom(
+                    shape: const CircleBorder(),
+                  ),
+                  child: Menu.menuItemAbout.icon,
+                ));
+              } else {
+                // back to Home page
+                menuActions.add(ElevatedButton(
+                  onPressed: () {
+                    context.read<NavCubit>().goToGamePage();
+                  },
+                  style: ElevatedButton.styleFrom(
+                    shape: const CircleBorder(),
+                  ),
+                  child: Menu.menuItemGame.icon,
+                ));
+              }
+            }
+
+            return AppBar(
+              title: const AppHeader(text: 'app_name'),
+              actions: menuActions,
+            );
+          },
+        );
+      },
+    );
+  }
+
+  @override
+  Size get preferredSize => const Size.fromHeight(50);
+}
diff --git a/lib/ui/widgets/header_app.dart b/lib/ui/widgets/header_app.dart
deleted file mode 100644
index bf54b77..0000000
--- a/lib/ui/widgets/header_app.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-
-class AppHeader extends StatelessWidget {
-  const AppHeader({super.key, required this.text});
-
-  final String text;
-
-  @override
-  Widget build(BuildContext context) {
-    return Row(
-      mainAxisAlignment: MainAxisAlignment.start,
-      crossAxisAlignment: CrossAxisAlignment.start,
-      children: [
-        Text(
-          tr(text),
-          textAlign: TextAlign.start,
-          style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
-        ),
-      ],
-    );
-  }
-}
diff --git a/lib/ui/widgets/indicators/score_indicator.dart b/lib/ui/widgets/indicators/score_indicator.dart
new file mode 100644
index 0000000..b6e4ecd
--- /dev/null
+++ b/lib/ui/widgets/indicators/score_indicator.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+
+import 'package:wordguessing/utils/color_extensions.dart';
+
+class ScoreIndicator extends StatelessWidget {
+  const ScoreIndicator({
+    super.key,
+    required this.text,
+    required this.blockColor,
+  });
+
+  final String text;
+  final Color blockColor;
+
+  @override
+  Widget build(BuildContext context) {
+    final Color borderColor = blockColor.darken();
+
+    return Container(
+      margin: const EdgeInsets.symmetric(horizontal: 15),
+      padding: const EdgeInsets.all(5),
+      decoration: BoxDecoration(
+        color: blockColor,
+        borderRadius: BorderRadius.circular(4),
+        border: Border.all(
+          color: borderColor,
+          width: 4,
+        ),
+      ),
+      child: Text(
+        text,
+        style: const TextStyle(
+          fontSize: 25,
+          fontWeight: FontWeight.w600,
+          color: Colors.black,
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/utils/color_extensions.dart b/lib/utils/color_extensions.dart
new file mode 100644
index 0000000..4e55e33
--- /dev/null
+++ b/lib/utils/color_extensions.dart
@@ -0,0 +1,33 @@
+import 'dart:ui';
+
+extension ColorExtension on Color {
+  Color darken([int percent = 40]) {
+    assert(1 <= percent && percent <= 100);
+    final value = 1 - percent / 100;
+    return Color.fromARGB(
+      alpha,
+      (red * value).round(),
+      (green * value).round(),
+      (blue * value).round(),
+    );
+  }
+
+  Color lighten([int percent = 40]) {
+    assert(1 <= percent && percent <= 100);
+    final value = percent / 100;
+    return Color.fromARGB(
+      alpha,
+      (red + ((255 - red) * value)).round(),
+      (green + ((255 - green) * value)).round(),
+      (blue + ((255 - blue) * value)).round(),
+    );
+  }
+
+  Color avg(Color other) {
+    final red = (this.red + other.red) ~/ 2;
+    final green = (this.green + other.green) ~/ 2;
+    final blue = (this.blue + other.blue) ~/ 2;
+    final alpha = (this.alpha + other.alpha) ~/ 2;
+    return Color.fromARGB(alpha, red, green, blue);
+  }
+}
diff --git a/pubspec.lock b/pubspec.lock
index e9215a5..e0ab96e 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -61,10 +61,10 @@ packages:
     dependency: "direct main"
     description:
       name: easy_localization
-      sha256: "432698c31a488dd64c56d4759f20d04844baba5e9e4f2cb1abb9676257918b17"
+      sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.6"
+    version: "3.0.7"
   easy_logger:
     dependency: transitive
     description:
@@ -106,31 +106,23 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_bloc
-      sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
+      sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
       url: "https://pub.dev"
     source: hosted
-    version: "8.1.5"
+    version: "8.1.6"
   flutter_lints:
     dependency: "direct dev"
     description:
       name: flutter_lints
-      sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
+      sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.2"
+    version: "4.0.0"
   flutter_localizations:
     dependency: transitive
     description: flutter
     source: sdk
     version: "0.0.0"
-  flutter_swipe:
-    dependency: "direct main"
-    description:
-      name: flutter_swipe
-      sha256: dc6541bac3a0545ce15a3fa15913f6250532062960bf6b0ad4562d02f14a8545
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.0.1"
   flutter_web_plugins:
     dependency: transitive
     description: flutter
@@ -172,18 +164,18 @@ packages:
     dependency: transitive
     description:
       name: intl
-      sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
+      sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
       url: "https://pub.dev"
     source: hosted
-    version: "0.18.1"
+    version: "0.19.0"
   lints:
     dependency: transitive
     description:
       name: lints
-      sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
+      sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.0"
+    version: "4.0.0"
   material_color_utilities:
     dependency: transitive
     description:
@@ -196,10 +188,10 @@ packages:
     dependency: transitive
     description:
       name: meta
-      sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
+      sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
       url: "https://pub.dev"
     source: hosted
-    version: "1.11.0"
+    version: "1.12.0"
   nested:
     dependency: transitive
     description:
@@ -225,7 +217,7 @@ packages:
     source: hosted
     version: "3.0.0"
   path:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: path
       sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
@@ -244,18 +236,18 @@ packages:
     dependency: transitive
     description:
       name: path_provider_android
-      sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
+      sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.4"
+    version: "2.2.5"
   path_provider_foundation:
     dependency: transitive
     description:
       name: path_provider_foundation
-      sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
+      sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.2"
+    version: "2.4.0"
   path_provider_linux:
     dependency: transitive
     description:
@@ -284,10 +276,10 @@ packages:
     dependency: transitive
     description:
       name: platform
-      sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
+      sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.4"
+    version: "3.1.5"
   plugin_platform_interface:
     dependency: transitive
     description:
@@ -297,7 +289,7 @@ packages:
     source: hosted
     version: "2.1.8"
   provider:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: provider
       sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
@@ -316,18 +308,18 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_android
-      sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
+      sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.2.3"
   shared_preferences_foundation:
     dependency: transitive
     description:
       name: shared_preferences_foundation
-      sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
+      sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.5"
+    version: "2.4.0"
   shared_preferences_linux:
     dependency: transitive
     description:
@@ -433,10 +425,10 @@ packages:
     dependency: transitive
     description:
       name: win32
-      sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
+      sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
       url: "https://pub.dev"
     source: hosted
-    version: "5.5.0"
+    version: "5.5.1"
   xdg_directories:
     dependency: transitive
     description:
@@ -446,5 +438,5 @@ packages:
     source: hosted
     version: "1.0.4"
 sdks:
-  dart: ">=3.3.0 <4.0.0"
-  flutter: ">=3.19.0"
+  dart: ">=3.4.0 <4.0.0"
+  flutter: ">=3.22.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index d93b5e6..749d20f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -2,7 +2,8 @@ name: wordguessing
 description: A wordguessing game application.
 
 publish_to: "none"
-version: 0.1.40+64
+
+version: 0.2.0+65
 
 environment:
   sdk: "^3.0.0"
@@ -11,27 +12,27 @@ dependencies:
   flutter:
     sdk: flutter
 
+  # base
   easy_localization: ^3.0.1
   equatable: ^2.0.5
   flutter_bloc: ^8.1.1
-  flutter_swipe: ^1.0.1
   hive: ^2.2.3
   hydrated_bloc: ^9.0.0
   package_info_plus: ^8.0.0
-  path: ^1.9.0
   path_provider: ^2.0.11
-  provider: ^6.0.5
   unicons: ^2.1.1
 
+  # specific
+  # (none)
+
 dev_dependencies:
-  flutter_lints: ^3.0.1
+  flutter_lints: ^4.0.0
 
 flutter:
   uses-material-design: true
   assets:
     - assets/images/
-    - assets/menu/
-    - assets/placeholder.png
+    - assets/ui/
     - assets/translations/
 
   fonts:
@@ -45,3 +46,4 @@ flutter:
           weight: 400
         - asset: assets/fonts/Nunito-Light.ttf
           weight: 300
+
diff --git a/icons/build_application_icons.sh b/resources/app/build_application_resources.sh
similarity index 98%
rename from icons/build_application_icons.sh
rename to resources/app/build_application_resources.sh
index 27dbe26..6d67b8f 100755
--- a/icons/build_application_icons.sh
+++ b/resources/app/build_application_resources.sh
@@ -6,7 +6,7 @@ command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not ins
 command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
 
 CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
-BASE_DIR="$(dirname "${CURRENT_DIR}")"
+BASE_DIR="$(dirname "$(dirname "${CURRENT_DIR}")")"
 
 SOURCE_ICON="${CURRENT_DIR}/icon.svg"
 SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg"
diff --git a/icons/featureGraphic.svg b/resources/app/featureGraphic.svg
similarity index 100%
rename from icons/featureGraphic.svg
rename to resources/app/featureGraphic.svg
diff --git a/icons/icon.svg b/resources/app/icon.svg
similarity index 100%
rename from icons/icon.svg
rename to resources/app/icon.svg
diff --git a/resources/build_resources.sh b/resources/build_resources.sh
new file mode 100755
index 0000000..774953c
--- /dev/null
+++ b/resources/build_resources.sh
@@ -0,0 +1,6 @@
+#! /bin/bash
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+
+${CURRENT_DIR}/app/build_application_resources.sh
+${CURRENT_DIR}/ui/build_ui_resources.sh
diff --git a/scripts/.gitignore b/resources/data/.gitignore
similarity index 100%
rename from scripts/.gitignore
rename to resources/data/.gitignore
diff --git a/scripts/01_download_images.sh b/resources/data/01_download_images.sh
similarity index 100%
rename from scripts/01_download_images.sh
rename to resources/data/01_download_images.sh
diff --git a/scripts/02_prepare_images.sh b/resources/data/02_prepare_images.sh
similarity index 100%
rename from scripts/02_prepare_images.sh
rename to resources/data/02_prepare_images.sh
diff --git a/scripts/03_optimize_images.sh b/resources/data/03_optimize_images.sh
similarity index 100%
rename from scripts/03_optimize_images.sh
rename to resources/data/03_optimize_images.sh
diff --git a/scripts/04_build_images_board.sh b/resources/data/04_build_images_board.sh
similarity index 100%
rename from scripts/04_build_images_board.sh
rename to resources/data/04_build_images_board.sh
diff --git a/scripts/05_build_assets_list.sh b/resources/data/05_build_assets_list.sh
similarity index 100%
rename from scripts/05_build_assets_list.sh
rename to resources/data/05_build_assets_list.sh
diff --git a/scripts/words.csv b/resources/data/words.csv
similarity index 100%
rename from scripts/words.csv
rename to resources/data/words.csv
diff --git a/scripts/words.json b/resources/data/words.json
similarity index 100%
rename from scripts/words.json
rename to resources/data/words.json
diff --git a/resources/ui/build_ui_resources.sh b/resources/ui/build_ui_resources.sh
new file mode 100755
index 0000000..4f365ed
--- /dev/null
+++ b/resources/ui/build_ui_resources.sh
@@ -0,0 +1,110 @@
+#! /bin/bash
+
+# Check dependencies
+command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
+command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
+command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "$(dirname "${CURRENT_DIR}")")"
+ASSETS_DIR="${BASE_DIR}/assets"
+
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+ICON_SIZE=192
+
+#######################################################
+
+# Game images (svg files found in `images` folder)
+AVAILABLE_GAME_IMAGES=""
+if [ -d "${CURRENT_DIR}/images" ]; then
+  AVAILABLE_GAME_IMAGES="$(find "${CURRENT_DIR}/images" -type f -name "*.svg" | awk -F/ '{print $NF}' | cut -d"." -f1 | sort)"
+fi
+
+# Skins (subfolders found in `skins` folder)
+AVAILABLE_SKINS=""
+if [ -d "${CURRENT_DIR}/skins" ]; then
+  AVAILABLE_SKINS="$(find "${CURRENT_DIR}/skins" -mindepth 1 -type d | awk -F/ '{print $NF}')"
+fi
+
+# Images per skin (svg files found recursively in `skins` folder and subfolders)
+SKIN_IMAGES=""
+if [ -d "${CURRENT_DIR}/skins" ]; then
+  SKIN_IMAGES="$(find "${CURRENT_DIR}/skins" -type f -name "*.svg" | awk -F/ '{print $NF}' | cut -d"." -f1 | sort | uniq)"
+fi
+
+#######################################################
+
+# optimize svg
+function optimize_svg() {
+  SOURCE="$1"
+
+  cp ${SOURCE} ${SOURCE}.tmp
+  scour \
+      --remove-descriptive-elements \
+      --enable-id-stripping \
+      --enable-viewboxing \
+      --enable-comment-stripping \
+      --nindent=4 \
+      --quiet \
+      -i ${SOURCE}.tmp \
+      -o ${SOURCE}
+  rm ${SOURCE}.tmp
+}
+
+# build icons
+function build_image() {
+  SOURCE="$1"
+  TARGET="$2"
+
+  echo "Building ${TARGET}"
+
+  if [ ! -f "${SOURCE}" ]; then
+    echo "Missing file: ${SOURCE}"
+    exit 1
+  fi
+
+  optimize_svg "${SOURCE}"
+
+  mkdir -p "$(dirname "${TARGET}")"
+
+  inkscape \
+      --export-width=${ICON_SIZE} \
+      --export-height=${ICON_SIZE} \
+      --export-filename=${TARGET} \
+      "${SOURCE}"
+
+  optipng ${OPTIPNG_OPTIONS} "${TARGET}"
+}
+
+function build_image_for_skin() {
+  SKIN_CODE="$1"
+
+  # skin images
+  for SKIN_IMAGE in ${SKIN_IMAGES}
+  do
+    build_image ${CURRENT_DIR}/skins/${SKIN_CODE}/${SKIN_IMAGE}.svg ${ASSETS_DIR}/skins/${SKIN_CODE}_${SKIN_IMAGE}.png
+  done
+}
+
+#######################################################
+
+# Delete existing generated images
+if [ -d "${ASSETS_DIR}/ui" ]; then
+  find ${ASSETS_DIR}/ui -type f -name "*.png" -delete
+fi
+if [ -d "${ASSETS_DIR}/skins" ]; then
+  find ${ASSETS_DIR}/skins -type f -name "*.png" -delete
+fi
+
+# build game images
+for GAME_IMAGE in ${AVAILABLE_GAME_IMAGES}
+do
+  build_image ${CURRENT_DIR}/images/${GAME_IMAGE}.svg ${ASSETS_DIR}/ui/${GAME_IMAGE}.png
+done
+
+# build skins images
+for SKIN in ${AVAILABLE_SKINS}
+do
+  build_image_for_skin "${SKIN}"
+done
+
diff --git a/resources/ui/images/button_back.svg b/resources/ui/images/button_back.svg
new file mode 100644
index 0000000..2622a57
--- /dev/null
+++ b/resources/ui/images/button_back.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="#e41578" stroke="#fff" stroke-width=".238"/><path d="m59.387 71.362c1.1248 1.1302 4.0012 1.1302 4.0012 0v-45.921c0-1.1316-2.8832-1.1316-4.0121 0l-37.693 20.918c-1.1289 1.1248-1.1479 2.9551-0.02171 4.084z" fill="#fefeff" stroke="#930e4e" stroke-linecap="round" stroke-linejoin="round" stroke-width="8.257"/><path d="m57.857 68.048c0.96243 0.96706 3.4236 0.96706 3.4236 0v-39.292c0-0.96825-2.467-0.96825-3.4329 0l-32.252 17.898c-0.96594 0.96243-0.9822 2.5285-0.01858 3.4945z" fill="#fefeff" stroke="#feffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4.314"/></svg>
diff --git a/resources/ui/images/button_delete_saved_game.svg b/resources/ui/images/button_delete_saved_game.svg
new file mode 100644
index 0000000..ac7eefe
--- /dev/null
+++ b/resources/ui/images/button_delete_saved_game.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="#ee7d49" stroke="#fff" stroke-width=".238"/><path d="m61.07 35.601-1.7399 27.837c-0.13442 2.1535-1.9205 3.8312-4.0781 3.8312h-16.84c-2.1576 0-3.9437-1.6777-4.0781-3.8312l-1.7399-27.837h-2.6176c-0.84621 0-1.5323-0.68613-1.5323-1.5323 0-0.84655 0.68613-1.5323 1.5323-1.5323h33.711c0.84621 0 1.5323 0.68578 1.5323 1.5323 0 0.84621-0.68613 1.5323-1.5323 1.5323zm-3.2617 0h-21.953l1.4715 26.674c0.05985 1.0829 0.95531 1.9305 2.0403 1.9305h14.929c1.085 0 1.9804-0.84757 2.0403-1.9305zm-10.977 3.0647c0.78977 0 1.4301 0.6403 1.4301 1.4301v19.614c0 0.78977-0.6403 1.4301-1.4301 1.4301s-1.4301-0.6403-1.4301-1.4301v-19.614c0-0.78977 0.6403-1.4301 1.4301-1.4301zm-6.1293 0c0.80004 0 1.4588 0.62935 1.495 1.4286l0.89647 19.719c0.03182 0.70016-0.50998 1.2933-1.2101 1.3255-0.01915 7.02e-4 -0.03831 1e-3 -0.05781 1e-3 -0.74462 0-1.3596-0.58215-1.4003-1.3261l-1.0757-19.719c-0.0407-0.74701 0.53188-1.3852 1.2786-1.4259 0.02462-0.0014 0.04926-2e-3 0.07388-2e-3zm12.259 0c0.74804 0 1.3541 0.60609 1.3541 1.3541 0 0.02462-3.28e-4 0.04926-0.0017 0.07388l-1.0703 19.618c-0.04379 0.80106-0.70597 1.4281-1.5081 1.4281-0.74804 0-1.3541-0.60609-1.3541-1.3541 0-0.02462 3.49e-4 -0.04925 0.0017-0.07388l1.0703-19.618c0.04379-0.80106 0.70597-1.4281 1.5081-1.4281zm-10.216-12.259h8.1728c2.2567 0 4.086 1.8293 4.086 4.086v2.0433h-16.344v-2.0433c0-2.2567 1.8293-4.086 4.086-4.086zm0.20453 3.0647c-0.67725 0-1.2259 0.54863-1.2259 1.2259v1.8388h10.215v-1.8388c0-0.67725-0.54863-1.2259-1.2259-1.2259z" fill="#fff" fill-rule="evenodd" stroke="#bd4812" stroke-width=".75383"/></svg>
diff --git a/resources/ui/images/button_resume_game.svg b/resources/ui/images/button_resume_game.svg
new file mode 100644
index 0000000..6ad8b64
--- /dev/null
+++ b/resources/ui/images/button_resume_game.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="#49a1ee" stroke="#fff" stroke-width=".238"/><path d="m39.211 31.236c-0.84086-0.84489-2.9911-0.84489-2.9911 0v34.329c0 0.84594 2.1554 0.84594 2.9993 0l28.178-15.637c0.84392-0.84086 0.85812-2.2091 0.01623-3.053z" fill="#fefeff" stroke="#105ca1" stroke-linecap="round" stroke-linejoin="round" stroke-width="6.1726"/><path d="m40.355 33.714c-0.71948-0.72294-2.5594-0.72294-2.5594 0v29.373c0 0.72383 1.8442 0.72383 2.5663 0l24.11-13.38c0.7221-0.71948 0.73426-1.8902 0.01389-2.6124z" fill="#fefeff" stroke="#feffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.225"/><path d="m28.369 66.919v-37.591" fill="#105ca2" stroke="#105ca2" stroke-linecap="round" stroke-width="4.0337"/></svg>
diff --git a/resources/ui/images/button_start.svg b/resources/ui/images/button_start.svg
new file mode 100644
index 0000000..e9d49d2
--- /dev/null
+++ b/resources/ui/images/button_start.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="#49a1ee" stroke="#fff" stroke-width=".238"/><path d="m34.852 25.44c-1.1248-1.1302-4.0012-1.1302-4.0012 0v45.921c0 1.1316 2.8832 1.1316 4.0121 0l37.693-20.918c1.1289-1.1248 1.1479-2.9551 0.02171-4.084z" fill="#fefeff" stroke="#105ca1" stroke-linecap="round" stroke-linejoin="round" stroke-width="8.257"/><path d="m36.382 28.754c-0.96243-0.96706-3.4236-0.96706-3.4236 0v39.292c0 0.96825 2.467 0.96825 3.4329 0l32.252-17.898c0.96594-0.96243 0.9822-2.5285 0.01858-3.4945z" fill="#fefeff" stroke="#feffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4.314"/></svg>
diff --git a/resources/ui/images/game_fail.svg b/resources/ui/images/game_fail.svg
new file mode 100644
index 0000000..2922fd7
--- /dev/null
+++ b/resources/ui/images/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/resources/ui/images/game_win.svg b/resources/ui/images/game_win.svg
new file mode 100644
index 0000000..fe20923
--- /dev/null
+++ b/resources/ui/images/game_win.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"><g transform="matrix(.17604 0 0 .17604 7.9341 1.7716)"><path d="m101.92 496.35c-1.8555 0-3.7109-0.69532-5.1484-2.0898-2.9297-2.8438-3-7.5234-0.15234-10.453l9.1875-9.4648c2.8438-2.9297 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4648c-1.4492 1.4961-3.375 2.2461-5.3047 2.2461z" fill="#ff4e61"/><path d="m201.65 133.26c-1.8516 0-3.7109-0.69531-5.1445-2.0898-2.9297-2.8438-3-7.5234-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5195-3 10.449-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#ff4e61"/><path d="m413.8 100.39c-1.8555 0-3.7109-0.69141-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9297 2.8398 3 7.5234 0.15625 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m413.8 463.77c-1.8555 0-3.7109-0.69532-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m63.07 112.91c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4687c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9258 2.8438 2.9961 7.5234 0.15234 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m12.309 278.82c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1875-9.4688c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4453 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#2dc471"/><path d="m216.29 278.49-23.996 12.996c-6.2226 3.3711-13.496-2.0742-12.309-9.2148l4.582-27.523c0.47266-2.8359-0.4375-5.7266-2.4375-7.7344l-19.414-19.496c-5.0352-5.0547-2.2578-13.863 4.7031-14.906l26.824-4.0156c2.7656-0.41407 5.1524-2.1992 6.3867-4.7812l12-25.043c3.1133-6.4922 12.102-6.4922 15.215 0l11.996 25.043c1.2383 2.582 3.625 4.3672 6.3867 4.7812l26.828 4.0156c6.957 1.043 9.7344 9.8516 4.6992 14.906l-19.41 19.496c-2 2.0078-2.9141 4.8984-2.4414 7.7344l4.582 27.523c1.1914 7.1406-6.082 12.586-12.305 9.2148l-23.996-12.996c-2.4727-1.3398-5.4258-1.3398-7.8945 0z" fill="#ffd02f"/><path d="m220.24 512c-4.082 0-7.3906-3.3086-7.3906-7.3906v-115.59c0-4.082 3.3086-7.3945 7.3906-7.3945s7.3906 3.3125 7.3906 7.3945v115.59c0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#5c73bc"/><path d="m220.3 357.42h-0.11328c-4.082 0-7.3945-3.3125-7.3945-7.3945s3.3086-7.3906 7.3945-7.3906h0.11328c4.082 0 7.3906 3.3086 7.3906 7.3906s-3.3086 7.3945-7.3906 7.3945z" fill="#5c73bc"/><path d="m220.3 332h-0.14838c-4.082-0.0156-7.375-3.3398-7.3594-7.4219 0.0195-4.0742 3.3242-7.3594 7.3906-7.3594h0.14848c4.082 0.0156 7.375 3.3398 7.3594 7.4219-0.0156 4.0703-3.3242 7.3594-7.3906 7.3594z" fill="#fa0"/><path d="m87.234 230.89c-1.9297 0-3.8555-0.75-5.3047-2.2422l-79.34-81.738c-2.8438-2.9297-2.7773-7.6094 0.15234-10.449 2.9297-2.8438 7.6094-2.7734 10.453 0.15235l79.344 81.738c2.8438 2.9258 2.7734 7.6094-0.15625 10.449-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#ff4e61"/><path d="m113.95 258.5c-1.8633 0-3.7266-0.69922-5.1641-2.1055-2.9219-2.8516-2.9766-7.5312-0.125-10.453l0.082-0.082c2.8516-2.918 7.5312-2.9766 10.453-0.12109 2.9219 2.8516 2.9766 7.5312 0.12109 10.453l-0.0781 0.082c-1.4492 1.4805-3.3672 2.2266-5.2891 2.2266z" fill="#fa0"/><path d="m131.4 276.48c-1.8555 0-3.7109-0.69531-5.1484-2.0898-2.9258-2.8438-2.9961-7.5234-0.15235-10.449l0.0781-0.0859c2.8476-2.9297 7.5273-2.9961 10.453-0.15235 2.9297 2.8438 3 7.5234 0.15625 10.453l-0.082 0.082c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m353.24 227.99c-1.8555 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l79.34-81.734c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-79.344 81.734c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m326.52 255.6c-1.9141 0-3.8242-0.73828-5.2695-2.2109l-0.082-0.082c-2.8633-2.9141-2.8203-7.5938 0.0899-10.453 2.9141-2.8633 7.5938-2.8203 10.453 0.0898l0.082 0.082c2.8594 2.9141 2.8203 7.5938-0.0937 10.453-1.4375 1.4141-3.3086 2.1211-5.1797 2.1211z" fill="#ff4e61"/><path d="m309.07 273.58c-1.9297 0-3.8555-0.75-5.3047-2.2422l-0.082-0.082c-2.8398-2.9297-2.7734-7.6094 0.15625-10.453s7.6094-2.7734 10.453 0.15234l0.082 0.082c2.8398 2.9297 2.7734 7.6094-0.15625 10.453-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#fa0"/><path d="m300.65 116.69c-1.2422 0-2.5-0.3125-3.6523-0.97266-3.5469-2.0234-4.7812-6.5391-2.7578-10.082l56.863-99.652c2.0234-3.543 6.5352-4.7773 10.082-2.7539 3.5469 2.0234 4.7812 6.5391 2.7578 10.082l-56.863 99.652c-1.3633 2.3867-3.8594 3.7266-6.4297 3.7266z" fill="#62d38f"/><path d="m281.52 150.33c-1.293 0-2.5977-0.33593-3.7891-1.0469l-0.0976-0.0586c-3.5-2.0938-4.6445-6.6328-2.5469-10.137 2.0938-3.5078 6.6328-4.6445 10.137-2.5508l0.0977 0.0586c3.5039 2.0938 4.6445 6.6328 2.5508 10.137-1.3867 2.3164-3.8359 3.5976-6.3516 3.5976z" fill="#fa0"/><path d="m269.02 172.25c-1.3008 0-2.6172-0.34375-3.8086-1.0625l-0.0977-0.0586c-3.4961-2.1094-4.6211-6.6523-2.5156-10.148 2.1094-3.4961 6.6523-4.6172 10.148-2.5117l0.0976 0.0586c3.4961 2.1094 4.6211 6.6523 2.5117 10.148-1.3867 2.3008-3.832 3.5742-6.3359 3.5742z" fill="#2dc471"/><path d="m139.96 116.69c-2.5703 0-5.0664-1.3398-6.4297-3.7305l-56.863-99.648c-2.0234-3.5469-0.78906-8.0586 2.7539-10.082 3.5469-2.0234 8.0625-0.79297 10.086 2.7539l56.863 99.648c2.0234 3.5469 0.78906 8.0625-2.7539 10.086-1.1562 0.66016-2.4141 0.97266-3.6562 0.97266z" fill="#5c73bc"/><path d="m159.09 150.33c-2.5078 0-4.957-1.2773-6.3438-3.582-2.1016-3.5-0.96875-8.043 2.5273-10.145l0.10157-0.0586c3.5-2.1016 8.0391-0.97266 10.141 2.5273 2.1055 3.5 0.97266 8.0391-2.5273 10.145l-0.0977 0.0586c-1.1914 0.71484-2.5039 1.0547-3.8008 1.0547z" fill="#ff4e61"/><path d="m171.6 172.25c-2.5 0-4.9375-1.2656-6.3281-3.5625-2.1172-3.4922-1-8.0352 2.4883-10.152l0.0977-0.0586c3.4961-2.1133 8.0391-1 10.156 2.4922 2.1133 3.4922 1 8.0352-2.4922 10.152l-0.0977 0.0586c-1.1992 0.72656-2.5195 1.0703-3.8242 1.0703z" fill="#fa0"/><path d="m402.14 357.28-15.523 11.602c-4.0234 3.0117-9.6523-0.043-9.5234-5.1641l0.5039-19.75c0.0508-2.0352-0.87109-3.9648-2.4688-5.1641l-15.508-11.621c-4.0234-3.0156-2.9453-9.4726 1.8242-10.93l18.391-5.6094c1.8906-0.57812 3.3906-2.082 4-4.0156l5.9375-18.785c1.5391-4.875 7.8359-5.8125 10.652-1.5898l10.863 16.285c1.1211 1.6758 2.9688 2.6797 4.9414 2.6797l19.18 0.0117c4.9766 4e-3 7.7891 5.8828 4.7578 9.9492l-11.676 15.672c-1.2031 1.6172-1.5586 3.7383-0.94922 5.6719l5.918 18.797c1.5312 4.875-3.0273 9.4453-7.7148 7.7344l-18.078-6.5977c-1.8594-0.67969-3.9258-0.37109-5.5273 0.82422z" fill="#ffd02f"/><path d="m261.51 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-57.23 22.832-95.922 41.984-118.3 20.828-24.332 41.613-35.023 42.488-35.469 3.6406-1.8477 8.0898-0.39063 9.9336 3.2539 1.8438 3.6367 0.39453 8.0781-3.2422 9.9297-0.3125 0.16016-19.5 10.164-38.367 32.395-25.227 29.719-38.016 66.121-38.016 108.2 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#ff4e61"/><path d="m102.86 397.35 11.766 15.605c3.0547 4.0469 9.2852 2.7305 10.547-2.2266l4.8633-19.113c0.5-1.9648 1.9102-3.5547 3.7695-4.2461l18.039-6.707c4.6797-1.7383 5.3906-8.25 1.207-11.016l-16.141-10.672c-1.6602-1.1016-2.6914-2.9726-2.7578-5.0039l-0.61719-19.75c-0.15625-5.1211-5.9492-7.832-9.7969-4.5859l-14.84 12.516c-1.5312 1.2891-3.5781 1.7227-5.4726 1.1562l-18.422-5.5c-4.7773-1.4258-9.0703 3.4102-7.2617 8.1836l6.9688 18.41c0.71875 1.8945 0.48438 4.0352-0.625 5.7188l-10.77 16.348c-2.793 4.2422 0.34375 9.9375 5.3125 9.6445l19.145-1.1406c1.9727-0.11719 3.875 0.77343 5.0859 2.3789z" fill="#ffd02f"/><path d="m179.02 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-30.059-6.6797-57.559-19.852-81.734-1.9531-3.5859-0.62891-8.0742 2.957-10.027 3.5859-1.9531 8.0742-0.62891 10.027 2.9531 14.363 26.375 21.648 56.254 21.648 88.809 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#fa0"/><path d="m268.93 55.898c0-11.285-8.8828-20.434-19.836-20.434-10.957 0-19.836 9.1484-19.836 20.434 0 11.285 8.8789 20.438 19.836 20.438 10.953 0 19.836-9.1523 19.836-20.438z" fill="#ffd02f"/><path d="m373.08 446.81c0-11.285-8.8789-20.434-19.832-20.434-10.957 0-19.836 9.1484-19.836 20.434s8.8789 20.434 19.836 20.434c10.953 0 19.832-9.1484 19.832-20.434z" fill="#5c73bc"/><path d="m44.129 450.86c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387 0 9.0547 7.1211 16.391 15.906 16.391 8.7891 0 15.91-7.3359 15.91-16.391z" fill="#62d38f"/><path d="m88.172 288.35c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387s7.1211 16.391 15.906 16.391c8.7891 0 15.91-7.3398 15.91-16.391z" fill="#5c73bc"/><g fill="#ff4e61"><path d="m210.84 16.391c0-9.0547-7.1211-16.391-15.906-16.391-8.7891 0-15.91 7.3359-15.91 16.391 0 9.0508 7.1211 16.387 15.91 16.387 8.7852 0 15.906-7.3359 15.906-16.387z"/><path d="m365.23 152.88c0-9.0508-7.125-16.391-15.91-16.391-8.7852 0-15.91 7.3398-15.91 16.391s7.125 16.387 15.91 16.387c8.7852 0 15.91-7.3359 15.91-16.387z"/><path d="m139.96 32.746c-1.8555 0-3.7109-0.69141-5.1484-2.0898-2.9297-2.8438-3-7.5195-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5234-3 10.449-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1875 9.4688c-1.4492 1.4922-3.3789 2.2422-5.3047 2.2422z"/></g></g></svg>
diff --git a/resources/ui/images/placeholder.svg b/resources/ui/images/placeholder.svg
new file mode 100644
index 0000000..23ace81
--- /dev/null
+++ b/resources/ui/images/placeholder.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"/>
diff --git a/images/menu/game-pick-image.svg b/resources/ui/images/type_pick-image.svg
similarity index 100%
rename from images/menu/game-pick-image.svg
rename to resources/ui/images/type_pick-image.svg
diff --git a/images/menu/game-pick-word.svg b/resources/ui/images/type_pick-word.svg
similarity index 100%
rename from images/menu/game-pick-word.svg
rename to resources/ui/images/type_pick-word.svg
diff --git a/scripts/cache/.gitkeep b/scripts/cache/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/scripts/cache/download/.gitkeep b/scripts/cache/download/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/scripts/cache/optimized/.gitkeep b/scripts/cache/optimized/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/scripts/cache/selected/.gitkeep b/scripts/cache/selected/.gitkeep
deleted file mode 100644
index e69de29..0000000
-- 
GitLab