From b4c379ada38d6bc70d2d02d787e54cfed8f4a933 Mon Sep 17 00:00:00 2001
From: pettersr <pettersr@stud.ntnu.no>
Date: Tue, 6 Apr 2021 19:37:05 +0200
Subject: [PATCH] lobby players ready state and UI

---
 .../.idea/caches/build_file_checksums.ser     | Bin 637 -> 637 bytes
 .../Gradle__org_javatuples_javatuples_1_2.xml |  11 ++
 .../android/assets/Menu/1x/PlayerReady.png    | Bin 0 -> 5419 bytes
 .../assets/Menu/1x/PlayerReadyCheck.png       | Bin 0 -> 18802 bytes
 CheckersClient/build.gradle                   |   5 +-
 .../game/controllers/NetworkController.java   |   7 +-
 .../game/controllers/PlayerController.java    |  30 +++-
 .../controllers/commands/cSetPlayerName.java  |  27 +++
 .../controllers/commands/cSetPlayerReady.java |  40 +++++
 .../core/src/com/mygdx/game/model/Lobby.java  |  11 ++
 .../core/src/com/mygdx/game/model/Player.java |  13 ++
 .../src/com/mygdx/game/views/LobbyView.java   | 170 ++++++++++++++----
 .../src/com/mygdx/game/views/MenuView.java    |   4 +-
 .../mygdx/game/views/enums/LobbyAssets.java   |   4 +-
 .../.idea/caches/build_file_checksums.ser     | Bin 636 -> 637 bytes
 ...le__CheckersServer_desktop_desktop_1_0.xml |   9 -
 .../Gradle__org_javatuples_javatuples_1_2.xml |  11 ++
 CheckersServer/build.gradle                   |   6 +-
 .../game/controller/NetworkController.java    |   2 +
 .../controller/commands/cSetPlayerName.java   |  27 +++
 .../controller/commands/cSetPlayerReady.java  |  40 +++++
 .../core/src/com/mygdx/game/model/Lobby.java  |  15 ++
 .../core/src/com/mygdx/game/model/Player.java |  13 ++
 23 files changed, 393 insertions(+), 52 deletions(-)
 create mode 100644 CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
 create mode 100644 CheckersClient/android/assets/Menu/1x/PlayerReady.png
 create mode 100644 CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png
 create mode 100644 CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java
 create mode 100644 CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java
 delete mode 100644 CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml
 create mode 100644 CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
 create mode 100644 CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java
 create mode 100644 CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java

diff --git a/CheckersClient/.idea/caches/build_file_checksums.ser b/CheckersClient/.idea/caches/build_file_checksums.ser
index 13675fdaaed4926c89b045bb8c396fb86f523650..ff2c783aa53bb9b4f4b5276e8b692f30a5ec539a 100644
GIT binary patch
delta 36
tcmey%@|R`843_1N&$&0wVPq8Gy#2Ck{nr2CB`hboI%Zzhn!J|r0su405c2>4

delta 36
tcmey%@|R`843;@_Z&Yub!^kKw+2EM{gW0A3o@nmlT7Nld+vK&37XV1o5>NmD

diff --git a/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml b/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
new file mode 100644
index 0000000..791ccad
--- /dev/null
+++ b/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.javatuples:javatuples:1.2">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/507312ac4b601204a72a83380badbca82683dd36/javatuples-1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/a7495f5370bdfcf46c6f3c6ed0badf52877aa467/javatuples-1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/CheckersClient/android/assets/Menu/1x/PlayerReady.png b/CheckersClient/android/assets/Menu/1x/PlayerReady.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cba8dc27d25bb4393a58b1f401141977f44b434
GIT binary patch
literal 5419
zcmeAS@N?(olHy`uVBq!ia0y~yVCZFFV9?`WV_;wqy*BG90|NtRfk$L90|U1Z2s2)~
zTla^7LFBHdi(^Q|oVT&uB_g4-_QkGW_pU@ewzAYpfTOofVSyl<KuOzz#k##*>)eh;
zvX+;%7P=oTyng-Nn+I>s?Kn46`JCkS>yi8xuU>TYYpD1gm}qd!B2mSqSwiCS6Gl(<
zmrJbgz6=iy|2l8~4pHs7uiTlmbbg*Y>ACB5+1I`Gf4|q){ErunwUKiVo^i;<A+t9&
zZuhMwfvE0!EkP&C;2_&{gC2oZ?i`_q{TFXOHhss3!f9!hZ(p6|Sg0G^WyHG1AzEs#
zssE~0L$}On*Vo<a6Nu`MFH>qsD5zb$d0DDg({r|I*VnB(aF4a;xX+#!;?i?Xr9~Kf
zw0xTm-I=~3HrPU4ltUz4yUucz#imOtGJ6(ZjNJV9_Uu<XncL@Xejv-+aKmxq3)xb=
z{NpnfI-YJ_?HIW2;q*<07j;(`9y(%Oz+;@r-OL)$7$26!6WDSo==rBU?sexvE#Abi
zI!=`LHk^2No48`4#fvV!_O6Gf9WL{8-?(yAF8+6cVcLA9-LI^sf0yQz4sl~mniCWt
z<vQ6)damixDEXormKE}K$28jPZbvAzEGkQFJl6Ck?^KRXVz+LG$%W)|f-gTR-V^`A
z=Fd}DB6eGoMLFT@w)vXYuWqyCSTrd~-?aIh^VoUyi~=!ZD{1fS{y))K#f$IRuI*TG
zg5&6=t$#e8{L2q2JDnX~{y^e6Ux1Xy+G`C{4gc@BxJaW-@qCPs9M6r1%m#sG=ie;d
z6cK&x4bxARCp|GD=0+Tnl22yOwO`0t;47<f=gv`nIUBZ1m0Qj|z5D5_&eu0hoA-Rs
zzb3tJb4f+&%^j7(`&aa`Sh3G*&Utow!xgRU&wNXZR42?XpRw%uUlS{d9R@ZM54iNT
z-H(J82QJW%*6H+h;rQu)m}QT*w_sG%DWB~943*nWZ3^DDZez8!f4%pi$(&zn+D>rS
z_muKAsa{u)bpN{j#jV#L-+MVdOjcOi#<}<BbN%=CzgEWUIb}S3@J~O!^#AeO9ktKS
z?@3bgS3lq+DPJa~vAAw(ao$7Y`;!dLsa#>Vwq0mkn51<}wcW#P#kr?z*XK&_5LGnE
z{_tSqalb!h=dT+{ez<?re%~E|=}W8&-jwJqW=*nN`}O$J9R<rysII)Eao}K>X>yYL
zmcHm)wi?U72^g{b^z>H>n9}=6{Jh(ed36Ps)PL49Z1|$$%-`T6EI571jhUOA&fc2L
zro)qdNhkMM|Bi{(&krtG_bvEV)!`&J?T*tdUlz@*dUSbR=*zaG?2v`09*Jy8s7nsY
z)UbOWHHSmN$9c<&^UpUFPsj{=uw^^*{~vzoue<|X%J*ciVDL5A>CvL~IJC~hIP|K;
zlnJtjrCx8nHf`ml5Gn7XnG23JR!nf8r14j(GidMcughY?&U;MTpY^as{AF}NPfJ3|
zvTKHC7;_aQe+f1zon1D`M(efB>lr)Q_rK|Gy}R$gs!cV`BEtV0T0_>C?rSLypTP51
z$8n<g(=(cBjd~6<lqBpf2^UTiFYDa1L2&-*Ls35E#og(GMy&=WMgnplX3LiKwen0h
zl-#AXPw+vg*^(U&Q&)Ajd}x)NyIi2_T~8_BId4Ip{&Uf#6QADiIccD+*QM$-<9UKz
zThkkd4cDU=Y)^Sxwf*OhX`#=bo4(MEG&ALAdHluln4IU7G?!Y($YpIdpWl5*NJ!o^
z#ZGzYLS7#4w3nvh2fzPjuGoIn`pq5Fd2P!1hN0Z1e?O%>*ibxG#d&YqhNzxttDntO
z{OmR9XdsW%oSSdmck%C!xxfE?cj>uLhnki2?@Y@1m|)4#RkN(X)l%Ey`RR{SZ=IA9
zNGkp&r~A74^W?jH*56HbWXi7m{Cl;S*0mK1;&(os_B~O2;OMcyKN?Oi-W_?*oT{kt
zsa|3Axp|=y!6I=IT#FKpAK1J4)Tc;IHM_p-THS^36zw`MO|g1&r)(}?Y@dKu;JuXM
zvmMbPT^*m4Oj((V)0Ok<j0C>2<~N&{h}`s=dBb(*{~xwt3q5%p=eg>e-?U|q`S8ir
z<K^oAx28_|fAY+w7bW3L`iomT)CGcH<Oj?Neg1szgIQJ<mTT=?6UsN7eYJ;!*ZR4#
zzMbrknw2}f#e^a>Ocm^$Lb(N>&pE$f`s`_ZTT5!*Z780uHY;*Z@OIHqUB{I%S~A)*
zqFsK^|MlS93jGKPIi843A;-V!@fU3``>NQYSGoP?j%lTgM{92F`ozQ>=Hs>Y1B;Vb
z^ltW_@wfjcthm10^GWh-r#$`S3-kDP+~>{EVU9n^&z}F{?q#d}209BKy!Ccx=f74X
zC0O~8QPo#`@u9~D=Pk5Wnfki9S4rk=YtP&HuVe1@oN~`(PL#BYo#*o;(?NpoqE?o4
z%vHwB0OK@2&J6-t7H{rEHL1;?`|UwiWTJo?Yx4h1%9p;+wr$>99d%#w#=Qw9wycRQ
z=5^wtceh;eF#3|GlOp-Sd{6kEyhyLsK!z@kD-2G%q$hSQ4Rw&d`B3FuhHk{BM_;E)
z9!On1GtM;Oy7&KQDQnMluVHch7boOWyU0d}v8&<kt;trCQa*{_Jg(8Bvzo(xO&H4z
z<&ziQ9r^h@zL4=mMsSp4Ldp^ofozp`8LWRijx2eTG?P!gQ+jEuvC-du>(xHBN*k&j
zw!2yxr@5=Jv+hcd-FL-TH~%GSyyE}6;#om_-Q3f=!+MT2Ma^uJS|H*!`zTLg+pD){
zKg4OZGA>-*$}PSpBYA0zbZ0q#t?7jm2acZf{<G)Jqy*kj?;9y$=IQSPe^!eec&4!`
zN=aIBRk6os<IV-VXZSwnyw<s)kj3y=@6*O~;p5&-FZ^oy;~9%O;^$~SofwvRX|Bio
z+#ZY5+;{k_zpFS3wd)iwcTW*FbZpRk>VD|cIt9sBFW+oRirTqi!lmly-RvrXvzEV+
z30Sj3Bdyc3Y`v7_{rwF~dw<<_6Zf6SpAsK_P)(YD_nzlR+dST1uIG}9|B(?<DR1U?
z@95@=eYdTx#HK`fXL_{#QZ0Yzqct<BY18iVH~ioCeF>D0@OO1gv@!UY6kfHo@W#%w
zEWWXBcYnrOeT-OAZ?Ph&Fqp}#B{i<o=DE+Y^rTF$&C8xvO_p6!7kgAJHzspy?9K;q
zw`0S7y6<f+n!|8evD)3Z%e6%>fFn|J$&asZb{*ZM(D47|>c3OOD<7U?5#Mmr=5&>f
zFe~eIuYe_MR2~><Fbn&qSu(m5i(eAlwOuuEmi>>;*Au>+xXpMp_QLgWgNOI7_}Hy+
ze3JY+A!n1Jz+_Luk3Vm1Yh1L#{!77oV|kYYpBN6DeQ_y=E#}Fe)PKLcBXzfn_j?Mi
zJwK6WsifY)7{_;6=JR+YHF;B$g4Z$VG5mNFBCaHPpzF(9TN$y+hiNt`y0f#pR!=>c
zu+`<@b?Y}VrV(3Krx(YnINRn#nc6D{d5AxH$fW7CW`mA~VsJ0Jl;e}+zYCVU|C{?^
z(}v^!r~O~ae`vu01N~;*wK3P9%}M{9y5Pd6&Q~$_)R)fKaprGTut%VbYM*x_Z{+2o
z(vvBE22(UQy0Y$JvlrTDkR^Yf5#+)dtGzmVrW~_S*4J(>6lQu8v*OOTt97^3j~;pI
z72{%bCDc;<ti)a34c(9IV{^CNt>3z^;_fEXO|H9BBRRiUh)!NPiEn?sg;L8ReMQTR
ztMRALY+d@qAz}LKk{9w*u20y=(fGlA<8%8dD{KCKy7`!?+%$nV@^g1^)-*l&b(&G@
zchpDhSMi#@>;4USUvZYjlQ*8Z`=D&HtoiiYXINbCEs5Y;pvTd*hV}a_9fj>W_U9d>
zXUH%4{cekwv-Aw_k4*mD3Ll!8G(?;hUeW)wv8dF_$LNdA%zO`qBYY3uA6#_seG0cf
z%bPn7K00!quq!c|mpD1KiA%viCBy6ehT>?Eh1`kzPStO5Z}{1~Y1t;F4Q#QUX0C?6
zWWBv6+8yVpIWx_$OS$7bTYSca5?!u@Jp#|(uFT-|c(42PGFPe9m8Tnu74GlNS+_Ez
z{I}}K*k^|%H=KLFd`^X$O>dtH_he08mi&L^(MoNTY^Kdjc8%(8FudR(lJT0ir=<GK
zp2kAX#DCj&ocX`iOwe)7lY7+`Jk}C(MZQg5b974C*`j47^P3Cv@BZyj;jk~fv2%M$
z_@c{#lNSn4s&)UjY-&$=^kLtH{}MM?ygzV{;dR1{V=uSdC>Nb#VXWDymA|Sw>{+D$
zq`BgZ=byz!WpOOGSox;v^BKF2->+isy-Im}iOWFj;prnyPo}9|vcDtzLgt32$=}?`
zy7!m(=bT{r?<w=fZGpjsuUlV#-ZzD1Qr`vDxxyNZaW$9DJKs6@=KX}t8~=4&P(6BN
zb|Sm=Y3@4z2`mDVlA`|-WbZsSzjWpwpVd3bNPcPeS<x+RraC+)18m;>>&#>N!FRWQ
zt*KA`tA?CR-W{$t-p&g1>013f_TaPGE2li;a8|T7ZmoQ0;=N<xTBiHomvnCNVm9qs
zvh2o*1r;(+uk742TefW7;k~8b*E?Lux~}-Y_IHp;ZJ+4ZeOG?`S+(hpmZsW2g-ByT
zmNkX_-}2ZdOaHvjCQ_3qZ**Q~g6^D4VO&#cZoK_m<;PQ~;w&#(`Oq-5YG3U9+&y-$
z_%~Wj`lA!fc#37A+bJGBt$F!UZzHZ0FFP18f4zvfL12u?@5yT&xp!#lKArI+V(CT!
z9o^JFtilWxJiC70*!tt1x$lymOoa-j;;C<T%v#*Q!?5s&^uqsj{+r#ISeUt{*6w@j
z)uiHgVCU9jjt8W2i?ioBuj9R2Z8_`TVNs1Mua$pG-&&Ag7XN<UHFsO~n0_{Yp1-m&
zmv3$RXK7KpzGRxXoT1pWJ1KP~y)q_Udp`V>D9USM@P1aizSO5Xdr_&#p&H)}JB@qW
zEmgO)RM*Vh_*0lAhizj2S>LZKOX71Bdw)%Nxl-!F7Ewu_EzS#8m&U9szEjQ`yXWC<
zw@C|MDIB}-fOXa0wXs2~{>iv9=7#Gz^mN9$NYALAV#V{pJRveHKH;l@T3PzTu1`h<
zj9p)af8NOZ-+0bpS+*C;#>Wm*&KdUQc1XPsTHW6NB_(wdtFMr5z<jH#lQYix>t!A}
zqOx@TWRK-0qRTcdD$H3d)ny-kuj$Lp-;wD)52d#-i0^%He|_p1V{WraJXhPg+l>_T
z7?ONF^CvS-VKCDC)j8X@^?S@o(e<$`FMphWu)N~!qOaHLqb9N+zmhAZlP<-wv!!Zp
z$gWS#Vh41;n#*04ejX8g%4OZh7caL&UPw`#KVQk8;kaq!fheW*|4M`IHfT<5yK*^9
zcA@tvR)!lkpEvBXXGs!05mpuVw<0FdpSNSOTX%`cPjQd@sfU&1cWYmGC)ZRJtTy3t
z;q#iv&L>muSl07g<T$i+`#(>GUY<4A)sG&DuiRd5vM|g!VAH(&rY;Zj@6P!+#X;%F
ziVp=Vu3w*e=G8o{7K8uJ<-Xn}MyJ-VIr{x*VU>~WbkC`7_x^tT@il5rr&P$cgB(li
zx6VGe=d|p*=dW5z)THz_yj2f>-P>x(@9>B5K6jV;r;V%I`Q^(G9-Wt?t*Np0oqaZw
zgF=&#*5B;~r+uzSzd7-x>Cn12wU7D(9|UmB>QPJUP;s6qJoC!rY=LRN?CkF`syth{
z<!~0G)*S=+@7L~b?9|{pab)k-zUeH5!ns$>H@B<R9d1~5$w84vv1CKR(U@$jYg6xS
zQR<F1NH#lp!8glXHC@l@OOw<7<xC>7zNu!-C%98tJl`C8ncXe$Oq})B-FzO~4^<|w
z%Y8M3A2v*CN^Pu~_<QHC#)*07g#+#j{=DH_(eZ}ss<_F_q{F`#Yzc^+&hk<0MBf=>
z?&E>7&t{7SA3HS1`r*E%EoYUr{Z72S{jRovoqx)~C6DJ++?f<1*03h@No&3B#|mDr
z@;nQ+X}iDA<Ugb&-@I<m+Y72QA|zNPgLRB&WN8&_o^$8d?H6k<E}YE8JoTdJC*Go%
zYYvZOCwDz%e3#}^`(h{m#Q<-2j+n`_9<n+<t4$AcEjYZ%@XFpZ%imac)%3=<DLX6g
z3elZq@$9Bgz>~8ozHPkQV*GYy`a5o@WoWH#-?QWD#;~qVYoXa)3#9npGMzeG`Ge{3
z{qM89J~2D&UA*4vRn5hR0wq^^?=2`hYx7#JSvNe*M^#Zw!1*HM(>AA;{Dr;0oPQVY
zem-N3aJj-g&Q>4iy0QZ?aXHIAZJsd8(r-%UqoXX`3u8XC6i;_*jjGKv6<rv0TK+?n
z)raTX9C%jr{Z<f@tysRZ^19;pMMo@k*2n6;K4md)*}11{L)3(%K1^T4X#Z*Vovya%
z3-iK$zB_&7cdxRg+vJ>OtRIux=SDA26S=x}QNk;CsoSjQ#gAv+I<QB-<!AV%(w;=s
zmbw|d3mlqG$G$4xseUJ-Z|&I`Ke*GQquqAdPF21u_to;Xu&Bf{tsQsdRqq7Py}0+~
zkC+QW)!{cDujeuUp*>|;{*Jvf7kGy02D`3f@ojsVbGWCWZ^5Qz&yDM*SI<6t?&p<H
zN4*MGA3pcB-S%HqO&+VA&GDXFDh=-fUX`3QICsg1P3zp!DNlXG-S;TR-FY9yxU%%(
zv8g^=Hp=qWUXyHH@qf0Kat5QwlboHr5zVKA;(q&mN_u?k-O(e@F8PT3oK<<P?Dg8y
zZrKqDe-%Y0uxyNZeM@87vn?9FMlst9ew|yPU%~t1L_|xy<nH+^*;VGI&B=*hdTWij
z&bFqd4H3RiSlw6oa(-2vv@kw>{;tv~b`x%gWZ7r0%6+}x<+X9wC4nCw1y2c2@RLqZ
z42&0GTJ^fH`q?wh)}OaF+{}1fwBVQg&x_w@>`~o(nxo66M|f7@fxV~K-^z=&TV=2+
zZF~C`yTzCK6S=mttUI{u{g&8}969q8gA%Ug40AUA)A>D3b+MyZ$-kR=dWJmV@_&A=
z+Vtmm0RvCiaVO~+*`95BjIDv<b*<^&Ssw@0#CP3D|KcbpvMz1iLI0FlRVlY3*(NQF
z*NzFadsnD$6uN1_4W8}CkM!@je%$cw!V=CEzsnoff0C89U~GLNvO0WC*w@Tzp=%=h
zDjQ}eo@opJq-S})qd?qY+1X5v-6|T_S#JIATgo->xGiV)tC`j5>K}6L)H!A)J)UIJ
zFkzjt+;puX{W&Y!%dUhh(b3?Jt>*ap{&!Qq_s8$STUTY+73aTtIWJv(-Rc?JbYJlw
zWc}OgWcTPtn(<MidVXDPhX|?kXZ=F8Nf8bU{rc}Xc3N(VU-BqF$nI{iX~rwdL+OkL
z&T+jn)6aIVtCDh2x*j~gYr>oh#Vw)ov#OGQO7<;EPJE)D5}={|IBfYzrN6?bMScF}
lw-igQ{BO?W^x{8*#mo8Tp{qk4F)%PNc)I$ztaD0e0s!e9Mxp=!

literal 0
HcmV?d00001

diff --git a/CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png b/CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b34127c2981fd699b19bfc0c757400edbf0904f
GIT binary patch
literal 18802
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

literal 0
HcmV?d00001

diff --git a/CheckersClient/build.gradle b/CheckersClient/build.gradle
index 9d02976..dfc747b 100644
--- a/CheckersClient/build.gradle
+++ b/CheckersClient/build.gradle
@@ -13,8 +13,6 @@ buildscript {
         classpath 'com.android.tools.build:gradle:3.5.4'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
 
-
-
     }
 }
 
@@ -53,6 +51,7 @@ project(":desktop") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
 
@@ -79,6 +78,7 @@ project(":android") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
 
@@ -92,5 +92,6 @@ project(":core") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
\ No newline at end of file
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
index bb21226..9ab85c7 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
@@ -11,6 +11,9 @@ import com.mygdx.game.model.Lobby;
 import com.mygdx.game.model.Player;
 import com.mygdx.game.views.tokens.PlayerAvatar;
 
+import org.javatuples.Pair;
+import org.javatuples.Tuple;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -27,7 +30,7 @@ public class NetworkController {
         client.start();
         try {
             //192.168.87.34
-            String IP4_LAN_ADDRESS = "192.168.10.154";
+            String IP4_LAN_ADDRESS = "192.168.87.23";
             client.connect(10000, IP4_LAN_ADDRESS, 54555, 54777);
         } catch (IOException e) {
             e.printStackTrace();
@@ -53,6 +56,8 @@ public class NetworkController {
         kryo.register(cLobbyDelete.class, 23);
         kryo.register(cLobbyGetList.class, 24);
         kryo.register(cSetIndexAvatar.class, 25);
+        kryo.register(cSetPlayerReady.class, 26);
+        kryo.register(cSetPlayerName.class, 27);
     }
 
     public Client getClient() { return client; }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
index f2410d9..14b1461 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
@@ -1,14 +1,18 @@
 package com.mygdx.game.controllers;
 
+import com.badlogic.gdx.utils.Null;
 import com.esotericsoftware.kryonet.Connection;
 import com.esotericsoftware.kryonet.Listener;
 import com.mygdx.game.controllers.commands.*;
 import com.mygdx.game.model.Lobby;
 import com.mygdx.game.model.Player;
 
+import org.javatuples.Pair;
+
 import java.util.ArrayList;
 import java.util.LinkedList;
 
+
 public class PlayerController {
 
     private NetworkController net;
@@ -45,12 +49,20 @@ public class PlayerController {
 
     public void lobbyGetList(){ sendCommand(new cLobbyGetList()); }
 
+    public void setLobbyPlayerReady(boolean isPlayerReady){
+        sendCommand(new cSetPlayerReady(isPlayerReady, lobby.getID(), player.getID()));
+    }
+
     public void connectPlayer(int avatarIndex){ sendCommand(new cPlayerJoin(avatarIndex));}
 
     public void createLobby(String name, int MAX_PLAYERS){ sendCommand(new cLobbyCreate(name, MAX_PLAYERS)); }
 
     public void updateIndexAvatar(int indexAvatar){ sendCommand(new cSetIndexAvatar(indexAvatar)); }
 
+    public void playerSetName(String name) {
+        sendCommand(new cSetPlayerName(name));
+    }
+
     public void deleteLobby(int id){ sendCommand(new cLobbyDelete(id)); }
 
     public void joinLobby(int id){ sendCommand(new cLobbyJoin(id)); }
@@ -69,6 +81,22 @@ public class PlayerController {
 
     public void setLobbies(ArrayList<Lobby> lobbies){ this.lobbies = lobbies; }
 
+    public boolean isOwningPlayerInLobby(){
+        try{
+            if(lobby==null){
+                return false;
+            }
+            else if(lobby.getID() == -1){
+                return false;
+            }
+            else{
+                return true;
+            }
+        }catch (NullPointerException e){
+            return false;
+        }
+    }
+
     public PlayerController getPlayerController(){ return this; }
 
     public NetworkController getNetWorkController() { return net; }
@@ -76,6 +104,4 @@ public class PlayerController {
     public Command getLastCommand(){ return receivedCommands.getFirst(); }
 
 
-
-
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java
new file mode 100644
index 0000000..6866c7b
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java
@@ -0,0 +1,27 @@
+package com.mygdx.game.controllers.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.model.Lobby;
+import com.mygdx.game.model.Player;
+
+import org.javatuples.Pair;
+
+
+public class cSetPlayerName extends Command{
+
+    public cSetPlayerName() { super("cLobbyJoin"); }
+
+    public cSetPlayerName(String name) {
+        super("cLobbyJoin", name);
+    }
+
+    @Override
+    public void execute(PlayerController playerController, Connection connection){
+        if(data instanceof String){
+            String name = (String) data;
+            playerController.getPlayer().setPlayerName(name);
+            System.out.printf("Player name is updated on server. %s \n", name);
+        }
+    }
+}
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java
new file mode 100644
index 0000000..24e7acf
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java
@@ -0,0 +1,40 @@
+package com.mygdx.game.controllers.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.model.Lobby;
+import com.mygdx.game.model.Player;
+
+import org.javatuples.Pair;
+
+
+public class cSetPlayerReady extends Command{
+
+    public cSetPlayerReady() { super("cLobbyJoin"); }
+
+    private int lobbyID;
+    private int playerID;
+
+    public cSetPlayerReady(boolean isPlayerReady, int lobbyID) {
+        super("cSetPlayerReady", isPlayerReady);
+        this.lobbyID = lobbyID;
+        this.playerID = playerID;
+    }
+
+    public cSetPlayerReady(boolean isPlayerReady, int lobbyID, int playerID) {
+        super("cSetPlayerReady", isPlayerReady);
+        this.lobbyID = lobbyID;
+        this.playerID = playerID;
+    }
+
+    @Override
+    public void execute(PlayerController playerController, Connection connection){
+        if(data instanceof Boolean){
+            boolean isPlayerReady = (Boolean) data;
+            if(playerID == playerController.getPlayer().getID()) playerController.getPlayer().setIsPlayerReady(isPlayerReady);
+            playerController.getLobby().getPlayerByID(playerID).setIsPlayerReady(isPlayerReady);
+            //System.out.println("value of playerID" + playerID);
+            System.out.printf("Player status updated. Is player %d currently ready? %b \n", playerID, isPlayerReady);
+        }
+    }
+}
diff --git a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
index 4b170d6..70d1e05 100644
--- a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
+++ b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
@@ -34,6 +34,17 @@ public class Lobby {
         return name;
     }
 
+    public Player getPlayerByID(int playerID){
+
+        Player returnPlayer = null;
+
+        for (Player player : players){
+            if (player.getID() == playerID) returnPlayer = player;
+        }
+
+        return returnPlayer;
+    }
+
     public int getMaxPlayers(){
         return MAX_PLAYERS;
     }
diff --git a/CheckersClient/core/src/com/mygdx/game/model/Player.java b/CheckersClient/core/src/com/mygdx/game/model/Player.java
index e8200a4..1a3a7c9 100644
--- a/CheckersClient/core/src/com/mygdx/game/model/Player.java
+++ b/CheckersClient/core/src/com/mygdx/game/model/Player.java
@@ -5,6 +5,7 @@ public class Player {
     private int ID;
     private int indexAvatar;
     private String playerName;
+    private boolean isPlayerReady;
 
     public Player(){}
 
@@ -43,4 +44,16 @@ public class Player {
     public void setPlayerName(String playerName) {
         this.playerName = playerName;
     }
+
+    public String getPlayerName(){
+        return this.playerName;
+    }
+
+    public void setIsPlayerReady(boolean isPlayerReady) {
+        this.isPlayerReady = isPlayerReady;
+    }
+
+    public boolean getIsPlayerReady(){
+        return this.isPlayerReady;
+    }
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
index dce43f9..5b5464d 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
@@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.InputListener;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.scenes.scene2d.ui.Button;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
 import com.badlogic.gdx.scenes.scene2d.ui.List;
 import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
@@ -44,12 +45,13 @@ public class LobbyView extends View{
     private boolean startRocketTransition;
 
     private Button createLobbyButton;
-    private Button lobbyListBackButton;
+    private Button findLobbyButton;
     private Button joinLobbyButton;
     private Button lobbyBackButton;
     private Button lobbyListRefreshButton;
     private Button lobbyRefreshButton;
-    private Button findLobbyButton;
+    private Button lobbyListBackButton;
+    private Button playerReadyButton;
     private Button setUserNameButton;
     private Button startLobbyButton;
 
@@ -73,11 +75,12 @@ public class LobbyView extends View{
 
     private TextField lobbyCreateTextField;
 
-    private SelectBox<Integer> lobbyCreateSizeSelectBox;
+    private Image playerReady;
+    private ImageButton playerReadyCheckButton;
 
+    private SelectBox<Integer> lobbyCreateSizeSelectBox;
     private ShapeRenderer shapeRenderer;
 
-
     public LobbyView(GameViewManager gvm, final PlayerController playerController, AssetManager assetManager, final Stage stage, Skin skin, ArrayList<PlayerAvatar> availableAvatars) {
         super(gvm, playerController, assetManager, stage, skin);
 
@@ -96,16 +99,22 @@ public class LobbyView extends View{
         buttonClickAudio = (Sound) assetManager.get(MenuAssets.BUTTON_CLICK_AUDIO.path, MenuAssets.BUTTON_CLICK_AUDIO.classType);
         Texture lobbyListTexture = (Texture) assetManager.get(LobbyAssets.LOBBYLIST.path, LobbyAssets.LOBBYLIST.classType);
 
+        Image playerReady = new Image(assetManager.get(LobbyAssets.PLAYER_READY.path, Texture.class));
+        final Image playerReadyCheck = new Image((Texture) assetManager.get(LobbyAssets.PLAYER_READY_CHECK.path, Texture.class));
+
+        playerReadyCheckButton = new ImageButton(playerReadyCheck.getDrawable());
+        playerReadyCheckButton.setPosition(col_width*6, row_height*2);
+
+        backgroundImage = new Image(background);
         rocketImage = new Image(rocketTexture);
-        exhaustImage = new Image(exhaustTexture);
         rocketImage.setPosition(col_width*8.5f, row_height*4f);
         rocketImage.setSize(col_width*1, row_height*2.5f);
+        exhaustImage = new Image(exhaustTexture);
         exhaustImage.setSize(col_width*0.6f, row_height*2f);
         exhaustImage.setPosition(rocketImage.getX()+rocketImage.getWidth()/2-exhaustImage.getWidth()/2, rocketImage.getY()-exhaustImage.getHeight());
 
         lobbyListBubbleImage = new Image(lobbyListTexture);
         lobbyListBubbleImage.setPosition(col_width*0.25f, row_height*5.5f);
-        backgroundImage = new Image(background);
 
         outputLabel = new Label("Press a Button",skin,"black");
         outputLabel.setSize(Gdx.graphics.getWidth(),row_height);
@@ -135,6 +144,10 @@ public class LobbyView extends View{
         lobbyRefreshButton.setSize(col_width*1f,(float)(row_height*0.65));
         lobbyRefreshButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
 
+        playerReadyButton = new TextButton("Refresh",skin,"small");
+        playerReadyButton.setSize(col_width*1f,(float)(row_height*0.65));
+        playerReadyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*-1);
+
         lobbyBackButton = new TextButton("Back",skin,"small");
         lobbyBackButton.setSize(col_width*1f,(float)(row_height*0.65));
         lobbyBackButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
@@ -203,6 +216,23 @@ public class LobbyView extends View{
                 outputLabel.setText("createLobbyButton");
             }
         });
+        playerReadyCheckButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                return true;
+            }
+            @Override
+            public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                outputLabel.setText("Player Ready");
+                playerController.setLobbyPlayerReady(true);
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("playerReadyCheckButton");
+            }
+        });
+
         findLobbyButton.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
@@ -351,6 +381,23 @@ public class LobbyView extends View{
             }
         });
 
+        playerReadyButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                return true;
+            }
+            @Override
+            public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                outputLabel.setText("Lobby refreshed!");
+                lobbyRefresh();
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("lobbyRefreshButton");
+            }
+        });
+
         lobbyCreateTextField.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
@@ -507,6 +554,7 @@ public class LobbyView extends View{
         lobbyListRefresh();
     }
 
+
     float[] player1Pos = {col_width*3.75f, row_height*2};
     float[] player2Pos = {col_width*3.5f, row_height*1.5f};
 
@@ -516,13 +564,32 @@ public class LobbyView extends View{
     float[] player5Pos = {col_width*5, row_height*2};
     float[] player6Pos = {col_width*4.8f, row_height*1.5f};
 
+    float[] player7Pos = {col_width*5.7f, row_height*2};
+    float[] player8Pos = {col_width*5.5f, row_height*1.5f};
+
+    float[] player1LabelPos = {col_width*0.5f, row_height*9.8f};
+    float[] player2LabelPos = {col_width*0.5f, row_height*9.3f};
+
+    float[] player3LabelPos = {col_width*0.5f, row_height*8.8f};
+    float[] player4LabelPos = {col_width*0.5f, row_height*8.3f};
+
+    float[] player5LabelPos = {col_width*0.5f, row_height*7.8f};
+    float[] player6LabelPos = {col_width*0.5f, row_height*7.3f};
+
+    float[] player7LabelPos = {col_width*0.5f, row_height*6.8f};
+    float[] player8LabelPos = {col_width*0.5f, row_height*6.3f};
+
     private Lobby lobby;
     private ArrayList<Player> playersInLobby;
-    ArrayList<float[]> playerPositions= new ArrayList<>(Arrays.asList(player1Pos, player2Pos, player3Pos, player4Pos, player5Pos, player6Pos));;
+    ArrayList<float[]> playerPositions= new ArrayList<>(Arrays.asList(player1Pos, player2Pos, player3Pos, player4Pos, player5Pos, player6Pos, player7Pos, player8Pos));;
+    ArrayList<float[]> playerLabelPositions= new ArrayList<>(Arrays.asList(player1LabelPos, player2LabelPos, player3LabelPos, player4LabelPos, player5LabelPos, player6LabelPos, player7LabelPos, player8LabelPos));;
 
     private final ArrayList<PlayerAvatar> availableAvatars;
     private ArrayList<PlayerAvatar> lobbyAvatars = new ArrayList<>();
 
+    private ArrayList<Image> playerReadyImages = new ArrayList<>();
+    private ArrayList<Label> lobbyLabels= new ArrayList<>();
+
     private void lobbyRefresh(){
         if(playerController.getLobby() == null) {
             System.out.println("Error during lobby refresh: not in a lobby");
@@ -531,20 +598,53 @@ public class LobbyView extends View{
             lobbyAvatars.clear();
             lobby = playerController.getLobby();
             playersInLobby = lobby.getPlayers();
+
+            if(!playerController.isOwningPlayerInLobby() && !playerController.getPlayer().getIsPlayerReady()) playerReadyCheckButton.remove();
+            else stage.addActor(playerReadyCheckButton);
+
+            for (Label label : lobbyLabels) label.remove();
+            for (Image image : playerReadyImages) image.remove();
             //System.out.println("My avatar Index: "+ playerController.getPlayer().getIndexAvatar());
             //System.out.println("Number of players in lobby: "+ lobby.getPlayers().size());
-
+            System.out.printf(">Current Lobby Size:\t%d\n", lobby.getPlayers().size());
             for(int i = 0; i<playersInLobby.size(); i++){
-                //System.out.println("This players ID: "+ playersInLobby.get(i).getID() + " avatarIndex: "+ playersInLobby.get(i).getIndexAvatar());
-                PlayerAvatar pa = availableAvatars.get(playersInLobby.get(i).getIndexAvatar());
-                pa.setScale(0.3f, 0.3f);
-                pa.setOrigin(0, 0);
-                pa.setPosition(playerPositions.get(i)[0], playerPositions.get(i)[1]);
-                lobbyAvatars.add(pa);
+                Player player = playersInLobby.get(i);
+                System.out.printf("   >PlayerName:%s\tID:%d\n", player.getPlayerName(), player.getID());
+                PlayerAvatar playerAvatar =availableAvatars.get(player.getIndexAvatar());
+
+                playerAvatar.setScale(0.3f, 0.3f);
+                playerAvatar.setOrigin(0, 0);
+                playerAvatar.setPosition(playerPositions.get(i)[0], playerPositions.get(i)[1]);
+                lobbyAvatars.add(playerAvatar);
+
+                Label label = new Label("Player"+i+":\t%d" + player.getPlayerName() + "\t", skin, "black");
+                label.setColor(1, 0, 0, 1);
+                label.scaleBy(1.5f);
+                label.setPosition(playerLabelPositions.get(i)[0], playerLabelPositions.get(i)[1]);
+
+                lobbyLabels.add(label);
+
+                if(player.getIsPlayerReady()) {
+                    Image image = new Image(assetManager.get(LobbyAssets.PLAYER_READY.path, Texture.class));
+                    image.setPosition(label.getX()+image.getWidth()+col_width*1f, label.getY()-image.getHeight()/2+label.getHeight()/2);
+                    playerReadyImages.add(image);
+
+                    System.out.println("ready???");
+                }
+                else{
+                    System.out.println("Player is not ready..");
+                }
+
+                stage.addActor(lobbyLabels.get(i));
+            }
+            for (Image image : playerReadyImages){
+                stage.addActor(image);
             }
         }
     }
 
+
+
     private void showLobbyWindow(){
         clearActors();
         mainUIActors.add(lobbyBackButton);
@@ -554,6 +654,7 @@ public class LobbyView extends View{
             stage.addActor(actor);
         }
     }
+
     private void showMainLobbyWindow(){
         clearActors();
         mainUIActors.add(createLobbyButton);
@@ -573,6 +674,7 @@ public class LobbyView extends View{
         sound.dispose();
          */
     }
+
     @Override
     public void handleInput() {
         if(Gdx.input.isTouched()) {
@@ -581,13 +683,31 @@ public class LobbyView extends View{
         }
     }
 
+    @Override
+    public void render(float dt) {
+        Gdx.gl.glClearColor(1, 1, 1, 1);
+
+        stage.draw();
+        stage.getBatch().begin();
+        for(PlayerAvatar playerAvatar : lobbyAvatars){
+            if(updateAvatarTimer>= updateAvatarFrequency){
+                playerAvatar.updateTexture();
+            }
+            playerAvatar.draw(stage.getBatch());
+        }
+        if(updateAvatarTimer>= updateAvatarFrequency){
+            updateAvatarTimer=0;
+        }
+        stage.getBatch().end();
+        drawGrid();
+    }
+
     float updateAvatarTimer = 0;
     float updateAvatarFrequency = 0.120f; //update every 250ms
     float refreshLobbyTimer = 1;
 
     @Override
-    public void render(float dt) {
-        Gdx.gl.glClearColor(1, 1, 1, 1);
+    public void update(float dt) {
 
         updateAvatarTimer+= dt;
 
@@ -610,23 +730,9 @@ public class LobbyView extends View{
         else if(startRocketTransition){
 
         }
-        stage.draw();
-        stage.getBatch().begin();
-        for(PlayerAvatar playerAvatar : lobbyAvatars){
-            if(updateAvatarTimer>= updateAvatarFrequency){
-                playerAvatar.updateTexture();
-            }
-            playerAvatar.draw(stage.getBatch());
-        }
-        if(updateAvatarTimer>= updateAvatarFrequency){
-            updateAvatarTimer=0;
-        }
-        stage.getBatch().end();
-        drawGrid();
-    }
 
-    @Override
-    public void update(float dt) {
+
+
         stage.act(dt);
         handleInput();
     }
diff --git a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
index 3051fb3..11608a9 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
@@ -237,6 +237,7 @@ public class MenuView extends View{
                     transitionAudio.play(0.50f);
                     startFadeFromBlankToWhite = true;
                     whiteImage.setZIndex(stage.getActors().size);
+                    playerController.playerSetName(usernameTextField.getText());
                     playerController.updateIndexAvatar(currentIndexAvatar);
                 }
                 return true;
@@ -254,8 +255,7 @@ public class MenuView extends View{
             public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
                 buttonClickAudio.play(0.8f);
                 if(usernameTextField.getText().isEmpty()){
-                    playerController.getPlayer().setPlayerName(usernameTextField.getText());
-                    outputLabel.setText("");
+                    outputLabel.setText(usernameTextField.getText());
                 }
             }
         });
diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java
index b57ecc4..43ae7de 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java
@@ -7,7 +7,9 @@ public enum LobbyAssets {
     LOBBYLIST("Menu/1x/LobbyList.png", Texture.class),
     BACKGROUND("Menu/1x/LobbyMenu@1x.png", Texture.class),
     ROCKET("Menu/1x/Rocket_Main@1x.png", Texture.class),
-    ROCKETEXHAUST("Menu/1x/Rocket_Exhaust@1x.png", Texture.class);
+    ROCKETEXHAUST("Menu/1x/Rocket_Exhaust@1x.png", Texture.class),
+    PLAYER_READY_CHECK("Menu/1x/PlayerReadyCheck.png", Texture.class),
+    PLAYER_READY("Menu/1x/PlayerReady.png", Texture.class);
 
     public final String path;
     public final Class classType;
diff --git a/CheckersServer/.idea/caches/build_file_checksums.ser b/CheckersServer/.idea/caches/build_file_checksums.ser
index 480a5d2f508b4aad98032d39a6cb4fff257b0c33..47d0d86c7d85efaa967a18f7352fc5005063ac72 100644
GIT binary patch
delta 78
zcmeyv@|R`843_1N7i>1pVPq7roVH=t3%g%e&u&~;*D!If;pDZ9vI1F*i%nv`EIZ*o
lb>`$36O64V-(oZn&~&zn2`x@7Dvk+AEh$MYnk>nb3;?6{B1-@O

delta 77
zcmey%@`q)@43@boCgg0K!^kM``+?xs1#6E->M3jY{M@otZSq=1S%K=+jrAQ}oQHih
j%J|OgTFN;27NY^bhO<>nXmM&$aZGVZs-fj%DW+rqQ)3_|

diff --git a/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml b/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml
deleted file mode 100644
index 369215d..0000000
--- a/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<component name="libraryTable">
-  <library name="Gradle: CheckersServer.desktop.desktop-1.0">
-    <CLASSES>
-      <root url="jar://$PROJECT_DIR$/desktop/build/libs/desktop-1.0.jar!/" />
-    </CLASSES>
-    <JAVADOC />
-    <SOURCES />
-  </library>
-</component>
\ No newline at end of file
diff --git a/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml b/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
new file mode 100644
index 0000000..791ccad
--- /dev/null
+++ b/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+  <library name="Gradle: org.javatuples:javatuples:1.2">
+    <CLASSES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/507312ac4b601204a72a83380badbca82683dd36/javatuples-1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/a7495f5370bdfcf46c6f3c6ed0badf52877aa467/javatuples-1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/CheckersServer/build.gradle b/CheckersServer/build.gradle
index 5c2215d..d8825f5 100644
--- a/CheckersServer/build.gradle
+++ b/CheckersServer/build.gradle
@@ -12,9 +12,6 @@ buildscript {
     dependencies {
         classpath 'com.android.tools.build:gradle:4.1.3'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
-
-
-
     }
 }
 
@@ -53,6 +50,7 @@ project(":desktop") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
 
@@ -79,6 +77,7 @@ project(":android") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
 
@@ -92,5 +91,6 @@ project(":core") {
         api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
 
         implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1"
+        implementation group: "org.javatuples", name: 'javatuples', version: "1.2"
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
index 7174984..eaac707 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
@@ -155,6 +155,8 @@ public class NetworkController {
         kryo.register(cLobbyDelete.class, 23);
         kryo.register(cLobbyGetList.class, 24);
         kryo.register(cSetIndexAvatar.class, 25);
+        kryo.register(cSetPlayerReady.class, 26);
+        kryo.register(cSetPlayerName.class, 27);
     }
 
     public NetworkController getNetworkController() { return this; }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java
new file mode 100644
index 0000000..323be48
--- /dev/null
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java
@@ -0,0 +1,27 @@
+package com.mygdx.game.controller.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controller.NetworkController;
+import com.mygdx.game.model.Lobby;
+import com.mygdx.game.model.Player;
+
+import org.javatuples.Pair;
+
+public class cSetPlayerName extends Command{
+
+    public cSetPlayerName() { super("cLobbyJoin"); }
+
+    public cSetPlayerName(String name) {
+        super("cLobbyJoin", name);
+    }
+
+    @Override
+    public void execute(NetworkController net, Connection connection){
+        if(data instanceof String){
+            String name = (String) data;
+            net.getPlayer(connection.getID()).setPlayerName(name);
+            connection.sendTCP(this);
+            System.out.printf("Player name is updated. %s \n", name);
+        }
+    }
+}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java
new file mode 100644
index 0000000..46535d8
--- /dev/null
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java
@@ -0,0 +1,40 @@
+package com.mygdx.game.controller.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controller.NetworkController;
+import com.mygdx.game.model.Lobby;
+import com.mygdx.game.model.Player;
+
+import org.javatuples.Pair;
+
+public class cSetPlayerReady extends Command{
+
+    public cSetPlayerReady() { super("cLobbyJoin"); }
+
+    private int lobbyID;
+    private int playerID;
+
+    public cSetPlayerReady(boolean isPlayerReady, int lobbyID) {
+        super("cSetPlayerReady", isPlayerReady);
+        this.lobbyID = lobbyID;
+        this.playerID = playerID;
+    }
+
+    public cSetPlayerReady(boolean isPlayerReady, int lobbyID, int playerID) {
+        super("cSetPlayerReady", isPlayerReady);
+        this.lobbyID = lobbyID;
+        this.playerID = playerID;
+    }
+
+    @Override
+    public void execute(NetworkController net, Connection connection){
+        if(data instanceof Boolean){
+            boolean isPlayerReady = (Boolean) data;
+
+            for (Connection c : net.getConnections(net.getLobby(lobbyID))) {
+                c.sendTCP(new cSetPlayerReady(isPlayerReady, lobbyID, connection.getID()));
+            }
+            System.out.printf("Player status updated. Is player %d currently ready? %b \n", playerID, isPlayerReady);
+        }
+    }
+}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
index 57eb0c9..1d3463b 100644
--- a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
+++ b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
@@ -50,6 +50,21 @@ public class Lobby {
         return set;
     }
 
+    public Player getPlayerByID(int playerID){
+
+        Player returnPlayer = null;
+
+        for (Player player : players){
+            if (player.getID() == playerID) returnPlayer = player;
+        }
+
+        return returnPlayer;
+    }
+
+    public ArrayList<Player> getPlayers(){
+        return players;
+    }
+
     public int getPlayersCount(){ return players.size(); }
 
     @Override
diff --git a/CheckersServer/core/src/com/mygdx/game/model/Player.java b/CheckersServer/core/src/com/mygdx/game/model/Player.java
index 2797bc0..4d983c3 100644
--- a/CheckersServer/core/src/com/mygdx/game/model/Player.java
+++ b/CheckersServer/core/src/com/mygdx/game/model/Player.java
@@ -5,6 +5,7 @@ public class Player {
     private int ID;
     private int indexAvatar;
     private String playerName;
+    private boolean isPlayerReady;
 
     public Player(){}
 
@@ -43,4 +44,16 @@ public class Player {
     public void setPlayerName(String playerName) {
         this.playerName = playerName;
     }
+
+    public String getPlayerName(){
+        return this.playerName;
+    }
+
+    public void setIsPlayerReady(boolean isPlayerReady) {
+        this.isPlayerReady = isPlayerReady;
+    }
+
+    public boolean getIsPlayerReady(){
+        return this.isPlayerReady;
+    }
 }
-- 
GitLab