From c744f783cd0e4af8021aa7ad245dafb75c4f6961 Mon Sep 17 00:00:00 2001 From: clmaisonha Date: Tue, 30 Jun 2020 21:28:52 +0200 Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20d'un=20bouton=20pour=20couper?= =?UTF-8?q?=20le=20son=20-=20R=C3=A9solution=20d'un=20crash=20lors=20de=20?= =?UTF-8?q?la=20mort=20de=20notre=20cible=20-=20R=C3=A9duction=20de=20la?= =?UTF-8?q?=20police=20dans=20certaine=20zone=20-=20R=C3=A9duction=20du=20?= =?UTF-8?q?code=20en=20double=20lors=20de=20la=20cr=C3=A9ation=20d'une=20a?= =?UTF-8?q?ction=20-=20Modification=20de=20la=20cr=C3=A9ation=20des=20sc?= =?UTF-8?q?=C3=A8nes=20dans=20le=20but=20d'impl=C3=A9menter=20la=20langue?= =?UTF-8?q?=20sur=20chaque=20sc=C3=A8ne=20importante=20-=20Chaque=20sc?= =?UTF-8?q?=C3=A8ne=20importante=20a=20comme=20p=C3=A8re=20ManageLang=20qu?= =?UTF-8?q?i=20permet=20la=20cr=C3=A9ation=20des=20drapeaux=20en=20haut=20?= =?UTF-8?q?=C3=A0=20droite=20de=20la=20sc=C3=A8ne=20dans=20le=20but=20de?= =?UTF-8?q?=20changer=20la=20langue=20-=20Lors=20du=20changement=20de=20la?= =?UTF-8?q?ngue,=20on=20cr=C3=A9e=20la=20sc=C3=A8ne=20LoadFile=20dans=20le?= =?UTF-8?q?=20but=20de=20recharger=20les=20fichiers=20avec=20la=20bonne=20?= =?UTF-8?q?langue,=20puis=20on=20rechargche=20la=20sc=C3=A8ne=20actuelle?= =?UTF-8?q?=20-=20Cette=20mani=C3=A8re=20de=20fonctionner=20a=20un=20probl?= =?UTF-8?q?=C3=A8me,=20=C3=A7a=20recr=C3=A9=C3=A9=20la=20sc=C3=A8ne=20ce?= =?UTF-8?q?=20qui=20a=20pour=20finition=20de=20recharger=20le=20jeux=20?= =?UTF-8?q?=C3=A0=200=20(donc=20si=20on=20change=20de=20langue=20apr=C3=A8?= =?UTF-8?q?s=20avoir=20commenc=C3=A9=20=C3=A0=20jouer,=20=C3=A7a=20va=20re?= =?UTF-8?q?charger=20le=20jeux=20=C3=A0=200)=20-=20Gestion=20de=20la=20tou?= =?UTF-8?q?che=20"echap"=20dans=20le=20but=20de=20supprimer=20l'action=20s?= =?UTF-8?q?=C3=A9lectionn=C3=A9e=20(poubelle)=20-=20Meilleur=20gestion=20d?= =?UTF-8?q?es=20mise=20=C3=A0=20jour=20de=20frame,=20le=20jeux=20devraient?= =?UTF-8?q?=20moins=20utiliser=20de=20ressources=20quand=20il=20ne=20se=20?= =?UTF-8?q?passe=20rien=20=C3=A0=20l'=C3=A9cran.=20(Avant=20il=20recalcula?= =?UTF-8?q?it=20les=20lignes=20entre=20les=20actions=20=C3=A0=20chaque=20f?= =?UTF-8?q?rame)=20-=20R=C3=A9slution=20d'un=20probl=C3=A8me=20lorsqu'on?= =?UTF-8?q?=20mettait=20plus=20de=20deux=20conditions=20=C3=A0=20la=20suit?= =?UTF-8?q?e=20(les=20actions=20apr=C3=A8s=20ces=20deux=20conditions=20ne?= =?UTF-8?q?=20s'effectuaient=20pas=20dans=20le=20bon=20ordre)=20-=20Modifi?= =?UTF-8?q?cation=20de=20la=20mani=C3=A8re=20de=20trier=20les=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/assets/en/buttons/mute.png | Bin 0 -> 18595 bytes Code/assets/fr/buttons/mute.png | Bin 0 -> 18595 bytes Code/public/js/level1.min.js | 2 +- Code/public/js/level2.min.js | 2 +- Code/public/js/level3.min.js | 2 +- Code/src/js/level1/Init.js | 5 +- Code/src/js/level2/AddAttack.js | 8 +- Code/src/js/level2/AddCondition.js | 12 +-- Code/src/js/level2/AddMove.js | 8 +- Code/src/js/level2/Boot.js | 141 +--------------------------- Code/src/js/level2/Game.js | 108 +++++++++++++++------ Code/src/js/level2/GamingBoard.js | 4 +- Code/src/js/level2/LoadFile.js | 127 +++++++++++++++++++++++++ Code/src/js/level2/PlusNode.js | 2 +- Code/src/js/level2/RectangleNode.js | 27 +++++- Code/src/js/level2/Robot.js | 2 +- Code/src/js/level2/Type.js | 6 +- Code/src/js/level3/AddNode.js | 17 ++-- Code/src/js/level3/ManageLang.js | 39 ++++++++ 19 files changed, 306 insertions(+), 206 deletions(-) create mode 100644 Code/assets/en/buttons/mute.png create mode 100644 Code/assets/fr/buttons/mute.png create mode 100644 Code/src/js/level2/LoadFile.js create mode 100644 Code/src/js/level3/ManageLang.js diff --git a/Code/assets/en/buttons/mute.png b/Code/assets/en/buttons/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc1960522b8092f3067d86ccb68181d41890c58 GIT binary patch literal 18595 zcmch<2UJwswk=xZAV~>IE)XP#f+7cr5(FeCK|+yJAs|^K=Olunf@BcMNDu`IAeLW3Iawc*F0zs*z zsb&cO_Tv7M5+e|J(>4!C;TJM*O$%QH;sh=3FCOAv&KU%P{IaXDxu3bNjw}Z2DQxF} zwRaQ_^z??K5eWJ7f!=l)cSk>@y`!_MmjdV3vvy9TtAhfknS`#WuD7bAi>qd^kE2nr zo-roa9V6qwd0r7IA1Dha@O1RELk4|SRY5Egs`L#289+wO34VLBt>P!(1J)YQIwR3sFVmwTu2lpD=H}~E`$8*4<}sB z$H7U~Q0>BB*Mi>^I9>ewyk$j10s;br1H^@~KF%U285tQ7Q85uQF(EiY$T!H#&n{5N z%lGU*&Y5l^)Fn=HCea*+?kBd8CL>xUFJsrLLeBoHs-^ao%>FWM{_`f`@r{~{C`}(Q-!-)R6 zw|{xGuW^vKqllrSFZP-b#!=lLu6Xtz1M~GWbo`I0`5$~84*&bh-Y!@_tgj39-%P^a zAOEMR@N;$gHy6Zx@}CZM40QcBhvGi@`%rILRUbz?Kdg^27VGhk*wO#T*pRBKNM18n zF9&RZFCXr<|2o`J&CbtJfm2LWOjJlzQV1nxEG8~1Dkdv|7J#3kqJJK$3xVli=V$ky z4;B|SMoG(xqGi!y|LI_?gR4`}e|x9{M%D@I<7o%W=IUwZ>?q>x<^0FhbaiF5ynOxa zyfBVhY6_e%RAE?I{3>?IvVF&G&MCmC^>e|%pJ zi@AmiDctw}++7Y>44mWdwUD)!ut!Ov#Tt+gzi9)@a%+g%ErsK4Gc#|5g#wLjmK5)*|#A}HL?zdpD4 zZ$AHzk4?N>VT#2#k+^7){p0#Zkhov~k`fZ)5`Vp~?;7anVXo#1v*!E9K;V-9{E@|f z`3RTEa6431)72MZF6ggZW8`@CuU8(f$UiovtR3dho50|r)6s$RueV+Q#S;I|CiBnJ z2DmuFbp0>l_Rqt7u}*#gc0P{E&M?RS&8`sncSHBJ^Z#ED+)3OXCE@5KA%v0Y>3{5@|NVjgb!LoIgxGLfH$UFwzb}PU2`gAvEwg;MA~_Kd$?l$*jXa}UJid%roT5M(hrOLkJR&Tr_908 z$Mv7q|DUh&_Yjc(KVI*@jkf<;Cj7s=L?Sp~@aOgy`LCJb&)?PloW~2emHDIK%Koby z@IQ?|sKBz2)c;QN|9c7f&+B9Vzb1BE%=~fV|AdhK@fN@?+{?f59{ln*Vs!L^UFrjP zP`LPa1p=Y)MN3WDI51~3Hz<_i6MN73XBJo0Sk&JMWyvNrsjORRsN^UQ57S+XPB-Lw zN3W|!^EvUX#YYXI5lz->?{3nJJ*jwj_EF@MH*^W<4xjdW9L9$f9?ONO?S!?pIymQD zPdyy^_S!d;I!muC>ZCa0HSzr!gquFQJqDA~9)g#T?!i9AKcGaQ4^Q*s1@_)dFO)@a z{>GXd|0cX-nb>9=eC?RM694C~Ux#5o<;?K<`ualG$Rxto?1@Abn{OJ1f0d93_kK=M zWBrV{?Fx0SUeAn}6P^{3q1eLfmxF_p$H&LE@+_@)4d?_+DJ-iP;QPaFjr!k89Yj5+ z(SlY_^wGJd6|Y`Ik+@E9ozBR~Nmji6LzACNK;U99M|Z;SgC**B9w_@ew)+u z&!0bUQ1K!N*DJ$(I5I5JRxTU0+ga|*kr;PtG_SKKT9-u-5)z&{Htl-IV-$l*NKRgE zr9zzl{ZpKZMY_X+Z0UCG{D3Gs{p?;aLMbp%TG;AI#}UCJ8v5{}Q{;wUf2MSFC{=%F zwL@1TSQISqGQyjM>{8U_6>{beFMDsi^|q!z!y+S)nVHFz$>x^6MNm#uJK5sP!@|N6 zO}pkNt5P<4@=&7qS5bAd>uC3OvtHTR=|*>r)!pDot!Mt5@e5sX%*UlPtfqdltf_1Y z{4FuRe}1D5Zx+jtP{QxX`mmt^pO}(~3$1iK^qI$sNVIz7T-4@F zbI(JAB9}ErqNW0RPPDJQ?+V3knVs0`=g*15!}_Kx?{bnPD zC6Wn5AMb`__~-5-LG?5?1@j3+>P%zsuA8aunW_R^;+9xiH-A?vQco66(nyJ2I#q{o zF z*7y2zu&&k>rb3oPXhgnY-E3(N5iIe_{hR7rvu$k~C|O=|IEwCCcv3%+hl ziFeIixpL(#xkYOr$}{j})Km2n41yg6s&R;L#g52 zxl*6R_SyRTHx)N3tov*6#!E7W{`k&!PA`WybN1G~fCSwHUgHbR7k9APx8!8bGYsbZ zh+3*MYo);4)US|Mb`a!i*`XD}Ecf2bxWMleX6W2mKk+iT)7aiIFeD^Np(xVPrQ=NV zT}{u9)sZ5~Z~Un}SK!xs^SO2xU!CY`h*u#fB6{=4q{4e|!$RwBX;~R& z&%1^Y3VZx!QVwa@(qV$g;HXD1>$Zo zNw|5Z9)J1r1rdJZ_b)S_E1`a?!+0?bT(X&z|g~Zp2FQWGZQ&?n9oz+N1hcbL#O-M)x{JKcA zGL)M{PR~F5c7J2))_#Cx)%f=Nkf0zkFLy=}@4FMSeyd6sE8ed8S>tUi3{q|oUu`>1 z`E*?ea^5qtER@HjCXjscsf3- z4m+oq$!pMADTcPqvCLDv&V*<|AFY+;srgD@`%H&sqEtLwrX9bQrLC@OLE-qW#%6B& z!QuDOO9qW@CNF+kTUm)Z^wRv?o55CMUd_+jJ~ZZ6yKv#HP5ewVw&#IDWDOldcZk>Q z>}=rnJYFjMd9NoI2HSWGi;C3uIg<~!+J6rhX;63FZwuI(oow>F&yn^lU<=>2bxQX| z;NlZZ57qcJ-=JSVBpNJ*9+_4p4&IkymejxUJT&3UhiA-h?<%;;-#C`va(e!?G*RZ~ z&Va~dYmoS+<=WelzOK5^zF{uIQXR&r7(tuoEC|RCsv!WwRjg~~QNY+L5XqA>F`{ z?Okr4jleRBTxku53Nl=vI>;ZsuXK}aqApF%IQh4X*2Rla@Ij7@ulLrh!j$8g0DreH zKAAiyWBx4THT^ik*ZoPi>u&rGqhOKN_h+<3ju;K4QrHZE)Cw3W5>!t!$T>(@F52M627 zv&*}r5@!#-y*Y0&;q*G&&aDakFf`e$N(wtmh|tN?n2x{`2@~tJ3}5 zxZ9_pT-S*~w_d5aPy&Rs&vLxXRBz;^!OqH9I*}_Z2!}M|+Z~m$`lW~m4+LLnR}^Wo zquA;)i~TpJE8Q>N5hm*Ra{k;zIMbsPp1^k!EAjUHkZws3p@$#u#JaQJ_=!U7^=gKs zoe`;jez?LMwUa_~^5n@%_sm$D)9VQ(xG_BYyPxC2R9t%`i1;Xd}rq<*g;Cnrb0O?GSO z6p!Jh(ud5uzxL;R!)ox-PvG^veECxI-cwQ!ZDV3@jfWH*efseaQ%y_>=HF$ZyI)_g ziZkp_4|3||j|y%uO(-d5GJ+~DLv-f+okBwMx2e(4fo{c^x}^cyxr>|MJ1`L`IwP zM6I1F7Y|QS=;2QNK)SqZ@s&g|=cgG`tFt$LU$3;}mR0$7o5M9~h~kxwQYW$X;m*gB z)z>F(b4=ZPLqRCDs(nY;Q@UKDjN(Ns?=Y!y;%O1#vNvQZ_j|dyxf%8ROJ3Iq+dNOc zBVtn+^lhbbOD|6`MLUbXZv5Pf7cUUKYoRq)+SCR}$;gziTzR1UD!uS>vzN=ehc}fi zZjGluc_KZMoHErGB2|5*Epe>EY?Mh)tNz;hxZt2P>Vw+3T-j^*N?yP9ee0ksG8>bY z$7VN9N{(9>^J9NXi|s$q;Sd)e-45{a5o1ETD2ZzqEn`o2ZnbE>je zk;=#-XrxeG+rd5GxZE&yP$@BmS?aCg{SP!tJ$>duI^_kIt4uLlv(3{tGU@nD9z|0! zOSbAd>v43eE&{5KbsV@|VA<#v>+Uni)RJHM5V5oI>WR&}N{i9$W(&#!owMf;<_T2G z@+91E+r2e=WX$JVUxsoY7mOli&BGV}B+n}(MCto!$kBRhw2b$vTeu#AuzCGeWzV;|BmeET3oOb3oemWj5a9&jT^Ft; zWPF{$pP(vLdPp3f7oolUd8|U)QT-%oeQE-}E1jpteM!&Pxu?8eOi?Y>?Vm<0vXOC# zxxM3^Ce-F*rZ_9RSarPxmDq^sP3Jfx>5;wgEgOaL{<^5nT`w6sPNj`ZOsP`&w8PM8 z&YRd!WYZo-T*YIlO#XV92#I)zMvjdRda2pk=5wwWP1M+60Kgm^ETw(qW%(GH<8yb6 zN<>6NCs%eXN05S$grw`k2iDQDOFfP56UE1ZW(2nFGDMfMMI)LDT&aTFX15)VA(_Re zrD;I;7H`nWbtLoz@hFttxTC8!xuAjPvQh{nR8@IP%pay zKA9_MSD8MZm5>YglKFIi=NYS)mzSoVo}|{9678(c4DO3GG&CJQsv(Uvd{9G32W}$= ze+#p>9$B=sw44!lO5RA^QU0(BQ2Kp~Z`?OIOxWSa)3_2|xW;=h&hho@SDz}jKr&L& zj*^Ra^dWr4Dd%u?H5!3r7hPgC3`b8hY^Qg(=kB)u{`DqPHc1R(>-(1v_x%Uw=JFf| zN1CxV-?!%S{0Hgc*tE&IvMVbE0|Ntxt0`He)0^&4rK^hi8o5A-JhW;N!_Jys9qlcK zeH)*gTx`v(5R4YcEi2>E#Y3Gv+chmNeZ|MeCx6V%mD+Idp2XMP37f}n#dd9D{OLV7 zX%M_-)hq*%c?0XG9-HZ>Mr{zS=%f!Q-YK`+TwU$GpEpQ|A1>i%-5!>kRq8QS-|z;2 zVKa9H*ZucaFBF2NCXJCgzYk$cV@mAw=-0=q+(%@mnC_EBBT1u@&LpNO{)o>?bsgk= zHCHS#)#6(=?~JG{uy|;8ck}#9I$&?%4|#t$@!Xl6n|kc*s_=4T#Gv|fv$`GswzHGd zVjO#zZ3*V--bqWn?LC^6gK9dcrGj>lwrlaxIr2dn++6)82`sNgQ&&pV5>5%)v78TM z`SA1_ro^%IqK=N5n;SoNwpF1Rh-T!8x;jjcwpgK)7^a(oi;D}%$4AD&!I9(ZQ%$LD z6p(aRaW5G)HsIp#FNu$jU+cY~^1e0bmT%*1TS&k-#Z@3YtzO)G#R2`@5-Lul_ zdJH*=-|I&r%@+`#$E%X^^N}NS-QC?@5eb|5IlJ-7RqtL+)?rBcvjjArtt>5JYIhk_ zC=EZ%IRJE{ms{5_HzuyBZgd-q)GNEiMUg&hr{ksJ;UU;yS!M6eg2iH^wDu#3PQbcx zlM!?neAa1WRT~N}$u}$y%tN1G(H}`1viZgTHWiq)p2C@Og_jf*$Em4GFKM&rNF(zP z1)A^~^YhNY0qN;9E{&E;NM6M9k@ziT;xjz4h&4?kqIvo7?v-Ud&!SJu%eD|04H$i* za?*LSo@=kBmD{$XqM~l*=6WV9T@D|i;*iKcMuat~QNEs+>7~_Uz-RU+dc>+Cup2o1 zVTd^DolyO`9>hDbM+DAi)p+$c)1O}35eO$jrfFAcT|`XaWtX_RMSo~6(li(fp1fk< z1@sU2nlsTAG;LJmU8P~&SJNY{LB3D~FE0{~1tQ-o<|RpCL2J^*_hrfg&#a?NKJ6rF)I5 zm#>o4t{JD3oJTVOmAl_9!kUhOxB) zulTU0u0{T|Q}6_R2_*c=1!%#f)7M1eDr)6{RyXtAR(#Y8@n;^{pLijMYiemJ108dr z8Y?O)a%D5%D_(UuNoY568f`ZFuCKJFre;Ag3{qOQ6!w9OwTDls9_rd>05KR!E+BS2>7P~Td8nA^+QKXi;EQGlvc_+4-~H_KEHnSwtC7K zi70n199>J#&hFize94`>Hd=N- zWp8g!F`LPA=>Y|3Sgxit?CjXDvWW&|daOfFiAYFPE5!DR%mqrh>TJPjwObBXiY+miexlE5kt@-r6(v)|mIodD z1o(JVgQlX7Poas#Q||;vc#ur6JSNk0rJO$)8kg_6{NbE%l{$vpK`xQ*V`bE`zveEl z#sZNoX)o#L9nQC!OWffXky-SGh@U(kHO^HkZ`8AfHw?b=N9J-{s?OA)dy6I+5Kf&$hGe+*#y;oDzzkfY0dr^1;C=hp5CPZggQs zW0ZTZEM>>J3b_Oa0&l!+O)hH~-s3nfl@}M@Kflg==|TLUp6()t<}YhSI?p(|D1BPH z#;zxE-+L~Tyl}delj9MOsr6ekym;nkJ8^Rn=GAn8VY&C}Fb5EA&{zgiBREf5$|Z-y z+nZkC(aXsv%F-9>L`2z0SM$B4%F>Q0F6QdGoiI64dH2k;GFde1!lWAHoF2p4$Mb7v zjRvgi{2{0<1^5GR0H9pwzNGG#O9PMWRz6EWB#1i?p?OXa9PMvuSXr?g|Jt`9Bqr_;+E0$U zyE)m6&9iUfV3zby%HlT}2KDCW&&QQA-O`U|Ede`;^%?Q9CnWg&{-L9R#?O{u|M1wE zT8JrIruFynQNx=o0kiH(i^s*st#N($eS?Fq0Ez1UlHrMnh^TbGbxt>9XOy_~_ThR> zyH9tgSQd=nal?+B|3>ecP+Ao6IkM%iOFifE+Ee0~&MzfG|?+C{;Z}H(S(-s&l6G6&&oJ>eZ{2KR)jU56yd9Jx{p1J+$@2 zD)Rmb@$ruz2kumT+llCX_)=#x1vu#MI? zaQMbNr%6(Cxwg5Voqc9pqIBkJcmulwr&(^Vp;zDj*4!JPt56iIhxShzy$RTutcwhq zdC3yN7w$e$eYIMKNzy~}DD>yS)ui!@Q~-jV%kz9>o;WmRt(D(T&?Pjiwvri7%pQo5 zcFa)X@V)7H^_)(&(vekr*mYATVP*z1GqYKFPp8^0D}Aro*1K7yfPWg^?AhjHDDJF@ z-{Ii@X6G9a@M&<=3Eys-T>Ja9Yk*aYPt0D6=S)*2TIU7IIjegzWrT-aa+3HC(Kn|X zKi0}B(XZK5Vu(L=ej&0asFANf*gF4|isjB5y3%&hXDRHQMDCNa_XxfP-fKA^>fODA zQt4Lq7oiCuyZVyEcRzf9i1gd_z73P^NgX63BV)rG2IJ^jUfuhWCD#>$cDMv6zi|uG zareS_x~Z1McrZh)+17L8#ucV1*HU&4y(q-GQg7 ziwcoENhN#dCgE<+xqN>19KPL`Parh;4wYsfsRKQ&cWGOm|MaQno&lQn17!a1~6Utcdh$J5=D zFaMsv)tK)DH8nM)v3qFw6GXH}KoKm0E~u$#_U%3B!?s;WVbV(R6}}7lL0z>LT3h09 z`4QlOL|Mtet+su0p16Q7?_U7IDE|5LiNz=lxRb^OJ6RNeZmUjz0)%n#*IKY||K?;} zk-duD7bOQLC;Q=iWy2fKuTZ|dn$*|eIdj|S<14!7KRydUvxo#CbL-}384v@>4@5^M8No;0x0U|T zt?}EKJc-XC%5@8JuVGS_lCaWHJ=;BN0t7ThnzOb9KaWU0V}+Vu=qAfhOuOwrJurS9 zjR*WQDI|4iK7M4*srjs&+>B|6lSX(mz82vcXRpVP?`u)1tn`mr>7&*XwQl;uZCDCQ zi&Mw?pLtV%KppJ3xW1lrTj(;A;^p4!v;66(6L)#vraHfQPyj?Y_Kl8nKDmlJiLbix z$#Blk>^3)kNqnBDNo#GDSFg-CV}(E#ht+7xu_**chyD7&At?B|@&g&3`R4o%u`#h& z>%?UEoU&{Ns$+@rVMimu{Omwsj{6h_LmXaoQl75YpS0@T0A70gD>uetM3ArURYz+o zqKB;ZmwDmZ0%l)z6Zjgb-D>Jr5?i?Dsc$cX*u{6XpBK z^z)|;mJNn}&;?~aHmY1V_|pFSII6w9{T=Q37W2WP_dj;mZ|3B@He@s*HI+*yD$M3- z0w#YJItd8Z^L88qJkN*UCpIqiu-`xvrqs;~OIEQahGdSe@1lJjgiW-G>asOjKvW%0 z%@p!ruwzW~`Tc939q3kOuQor!SKiZXY{Fww35L8|2EyXvw6}OJHN`}v6taCRy_7fP z%Hu+m`HlBZZf*)tt;-g2d@BaRyu9%rCA$)NmkfkKB?LiBveD15v*!D6b0YuF$>1W^8G1iQ1~{XUt=Q2P>iDr{cF3yP)!G~Bp>ST@$P@TW5fSw z!}(lkP-ao)i)_na$(LMdJ|Mm)R&?D<2u2{Z*J$+h(mbk+|*;ZWc z+Vg7z%YC=L?tHx1^{FR~{r>yQRdxCwgKHI!4=}f<*gsm`B^#|Aa>6gSY~(LnP*Aeu zX$#&Zhfc&R01eVH&MbQ~w^?L-qQ3>hJW+NR$mXUtKiA2-CHYmBI-NEesA=f_hkzW8 zIv(A7gpHPi<*}B~Zb)ihDz5kXAPZfU$WiiUNHs3g4Sep|g`|{}jxCF|<=+?qm&y39 zc*~}}9vu9Lu7?UPU4~V?e2SHI&^>aH2k6^r-|521_sr?g-GsErC6i}RF=pQ6ao76C zuqCwj!j3kjv|M8dU3?=D%SP-Fd8<)vpuonbrZ!!)(|?^ScRFPM3%$-`7>C~P3_5=f znsC22Tn-O5R##p6MCTJZnsT{TdS<-{#ekJ5_gtZ7lkaG79o?AjdJpXab?a~t`}3{k z!meMve*zk(n7xgu9C4v@m+}-}fo8O6$Qu?Gmhr0&H~*u)Qnr`~8p4RX;?A533c24x zgxR^Jyx!06650s_?``xkhh}UAa*By%e4M1HEl?tj#Pz;`b&UsH#=)ft*6?Iv=Y)qO zrSl&@#=!0v+7h;Y8eMJuY!RX`XHLYTKKi5H2PgcN>qnBf z$G0mVI2`CPfeFBgGS}7kO$(rp3i;iZ&C)}m%A~wsP^sn*U`a`^%@zXv1b9;t{^I+ zZv_jv2bXeX>4B*^{F<+6KQ?@MDWu%6WVlq98I~I#+^nm^1q1?q=_qJJ_6`h)v!rT` z_}rBX5N2UzwKzEmt$MXLhQ&S~`|0I_zmpOwD}m0t^7?Ks#DVVIW9LiIJ7Xg3W@$2! z&DAqCgAJ4|=9oBt??pCbfbDs-MIt9>?0e9QwZ6swVJWSpW32nv`m58 zp2*g0$+%{x{B5eim3F*FYM|m4cOd5NMeCvwTljt=5ylwtC8&fHu$p>kD_?9ILziEg z5A1Ky1fJV3Xb--0Nb?!EBhmx&pIMnCll{q{+MzE4_o>20$32NXLGxM!0A;gB!Yj7V zHDox-ZjX0brTHL4orhS4dWlV)YM6?7Bp-YG_$=;zb0UHk3p_Ps5e9@wF{j8ruI{O?A zxTp`axv1-?3>i8Y(=XHP(b7MeAE8>Foz4^8vJ=jT6VtpMm#+SuoV4d+9V4MKPA3F8 zm)P?)v}R37)#R3G(`$ZYA-c(V9PRGx=vR!Lk@4XoreblCZU;!u3Y|RXJCY_8Y9C)T zCYexn%pvzRHdE(r{AR7ItE;?kQ)!N>G_UKt&?uHbfk?6Q)9Zbl65`k%Xr7b}n0V=gA>HK+3L0W9@(Dee5uwAy7}!W?cs5}!ML1jVMr zr~UcTfHy7y3tK@S6Kejlzj$B9JltnKJ?<(=0e2?2r) zeKv68oRM&&!}bJfI0`)Ng%~BYiPrBs>%ETCCma9b8)ntPm~< z;Vn+eK_-}Klt8>P8xz91K*@u|H)v;>Ohr{yh%wPZ66)%S)4~o@T!8v1jY@S4rfcg{ z^73pZe#Si2{Wwx?#G`Xp?3H0ugcdYuXnj{++sRaheqTN5G9h#HwF5K4S^`;Q zHJuDMi{#=WynFX*+G8-TPG$j$xF*SNLDOnpK|Ng^=I`;`-H8r(K>rV*HJb8P?O=z~nvC8@9-?*XP z7&0yWePe3$k?CuIq1li(L7k+_)8k_;ULC!3UVU@A(c(+W-5l9#osTM3YAYKS4=1xO%u0~EaoF)97TVrvTTHBR0P@)RJX92oco$WM(kYxw- zQb78O^t!=ic%kWt-3T}FrZrbmpdov?l0tawdL**;>e7YVMtjuff6`#OlTZ3ldF1r` zKHfjia$b0&z6jFo0dVEPdp;IQA9G{w-)Dv{G9D1kq^y(BC=uHU@b~Wqq+sD?4vKpM zXwq7HpY-(fvK2xk?@7>7l^lIvGfHMtV1g={ZWDA?=QGm6!r}>(qx#2>i3X!g`01fX z0kUK~Sd#9U81RY8XhVnSy~&k}<1;F)eb3^vu(p=qI$BEh zpbvBf3b<300LvW@zAv+F%%EC`wkWw5npRLQr&8y;JZT-mlZlN9tbkGu^q#${DNu7ssPU?irci@3S zd&0oLpmnqhk}w9^mLPsh1zj}XyZJDesE1aq#Lx~}IfW;rVC|rKYmJ^yxex`UkKF6) z?31em?Z-a^w)V9Rfc7WdDWC&_2g4||Wg!h`c?YXY$j*M%Ob-GT>^x{^W5z^icg{cC zdM-Y7vR|%B9Fd;;a&(jyg+dh?B>{ueVnP`6(*vC%#Qp#s>+5y_=a+(6#+{uVunMIB z`AFawONE^Rn71(KN_&_!dfWsAO=v73p5UTYcb))lt$^p{E<9(@St@L z*MT_N+sqiJ&I{ck!*)m@o_H@r3gryblj5jfR~OOsWLa5RP9#z(!)F;t7U2Zrwa@RA zL4J3bcszWKCj1@hlw~@*jE~yegvzKW0$IQL06sMu!Y^~}SZ(?fM37y;6+~;L8v1=i zBSVGj{j-2ees(tRl(`m{m$}ZIN!k{9-)e18A5uvNNAbLRz1OD01@!@zd4 za^s9r3&b`M8`7{hryVTfRi=~?Vwp`ehSX?ZA0I+$;v|O8i}6B}u%kry*y}tUj8w|$ zrl~mnr-gPYR6W9eQZWbf#TtH6zbzfW-@vN2;m{5~iHsdskQ7@U8q1fbl?~g1uf5nR zdC-hUZ!cFtEsC?Z)N-R>C-~fD$8?Yk3~hDUY~g(&IftIX^=^4 zWdfoj@|p44+S<8mH1}r|F5iO0W($UfNY@L=XE?Na_<+Ab$VIwBm%yFcfMt^kLVA1K zdxUSKJB69MP2v6f_o9K@wlB~?48&b24S8jIL3lZN>J+D&l6dHWHyS%@g+3403;b%Y zoRtZ2o)0~h`t={xqaa}dolAOjedB!#E#wP^!5SQJkB_H8A8709z5*-4M^pN6GS-)D zx?(YtkDb$s@6*!Jajiv+ukXTP9aWcqa`1xrCW=E<5PL<~58o3DS}-8-%NfDPAmwwd z)n$p;u)+9qnm&WqrL|*!?gqC0h934G-Xzl+amO)?J#P508&0t$5Op^U29x`%DOO%abQh;vWz^9CLg3 z(4gy_S18W7;r1eM|BE$r!A&xbEsHLsh~7931vTqiDNcHY?J_7fQhTp&6TA+!P@4b01fS`<&m(MAo{Rmfqjx?NCv;PQ^qj{rSmMs(i&wA)Deb*MRjqUS%^FRRwLeQUI zgmKt{$o$Z_{M2SJWLucyXeb?8{UKmqD%|75B^psXe9)*wY8EM=_4$Peap=5#4u`$f z)YUDDi{fK$4fOSaffSXUr@a7qfs~s1v`IvbVF|g4ipuM2c;C^IlH(^$GvdJF06bst zt-%vnQlgKjQYcSPd_Scwm)pbo5)4|_Y?My%H6tps!tFw`jk!fmbc7RfhvVTch z(Zaw@sgGSSV_H$bI4wM)O!xH1r>T*2uS;@?(ONxhtkViTvY;IH)FG;*YlB&G> z@FrxdEe<>)d}A^Q+tVJ%G_cKeb#)Oy+H1UM(+l3O!e>dKWCA2oGdIu9_+zX^rE(q8f6ht{EavsbQGyNPsh zV+5@JJRmlNrhwFm!^&J5X69#Hzqhb`HOt#kdMq*cnV3jjMkv}soa^5hMRXONcU zB#PH@%B|!nVfgmR$5}38kLUppP}6XsS-+o+Ms)vf_U> z&8+5%9cXT=Q;&J{a%COYKbw=^mVZJ;@B{y#lYi`Hymm=vI37W*+Zg|q8N5bI>tU6s z>v%g?lI+ZO0*`;nL`Fu=FD-Rdl;lsWZ~92-5b6bOD;S(7;H8?cB@*CbCLtjK0z?Qr z&Drw^{0kS!u(RXyq`e^mJ+8Mu^esW(;*69R3o*r+a1g=n?|lG(eZnyMvT~4jOoY=S zzAbxr8hw@N!V-Qj>7!OB&r@SMz)dI$cM!#lItql0-fe`vwtMQm81CMX2|~`!bWNZ* zs<-8rb*60yND1@t_31m#8M&EhPEzc!l_Qdgg0?bCHQC;xEZ9n`-L~)!#M+hU!}pN; zsV9okm=$`PntNuBP^8NW^$hAefk}ls`r2|rGQaasj(81(^HljLgc*V!FO#6W%FU)O zW@;G`NQNZnz#v?apQ_66SO}0CC9j+4`cyeGP3J08n`a#J@M_Nssjblw=qvut69`{H z5HH`jLo!boZi9G9FfS$2Af&z{O6yBaH68W-+}WMqB?RWA`Sj#XqA$G>Q{6ELuYX0# zp0AK1;*g=ItR`Jf>^z`BZrv{Q8!+r(l zD1?lASAmZOyk*KDse3HesS@WQdbf9Xt?y=LqD@z@n|f?Gk^qF;Wmdbjt?g!ddN`QJ zG|3&EF^YIHyOv}-q0vNUB;~~O*z}nj{;FPH!r)AniK=Q1`bG>17T&0C3!q6vK}lpG z^m(@1q-pu=mInAzP_A#ehMus39;XWCr-jv3a~fIFS7*|lxdnp&@RFq0ct2YJBMf-% z32}y^%Vz4X{SogScMu)UHyzA&9$Gv;cTV>n7gOlNa6>AV9nmkyO6shpx+nvDfqH&U&f!@-r3=IX_8#A2d<}l$`+$BUSreVU2arX8}!ZT{u91N6jQob z{*b5#e;SknJ1~U7Ms-%U80Aa(gWusb)S2k|`1)R5=p@4BI6(VNk75;uyWhO2aeuBG zue%KCB^e}`0_@y#?Wf}W4;%1?O$a)6yn1Co_346?b`szyP`SxM^1XOn2b`M~!0C&L ziRO-=t!7bGG$NYdC13KDnjT1+bZP*0u+GgH`^&#$7!GfK(d`%+ISD`%n0)cFZAna~8-oq$DZ&Wg z^LD>}?5eYNbxTW2=c^|%fc1+4TClF`pXo>)0@86g3ZU4Nkp1fAZ0z2O=Q4n($tPFO zR@=1e%{(v8VFTvYH8C+!>DmKXBnfH*67;>%PqojU$;DDKJNXUV^9l<8EK6`ShJI401I%rcME|RK=MSuVsP)g@KrS z687tJ@ESb$d4)IwEu$ zX>97?ZWyk*ER`u}@pk(I^hBYSQo#)wjuW`+Wj6(owGgO76(4?NBEX^;dPcysvZE^w ztFRA_NebvydtbYjl~to3T>-eA->fT;ifLmYSXF(xpr4WrZNO zg5cc^aEj|v+==TX1-zz}XW)^iIB0;M1?3A!*)2Mf2h;#wV9GiN2dipbJMRs`oY62c zCcq}e0C;tosLr*}z6C-?d`ikI2x|v{P6n-1<-QE=5pd6e27-g`=RS^9T8QJGBLMrb z&}SAWh+P7J1Pe3R_AFNVJBz@LaXWUr+S)zicHjteG#+@sLGpm)%3Y=PL>eAp!ZqaK z8LTCkNZ!v}=M10vxl%Ao>g?Q$PJ(BkY)4CV&7b=5QL!ruhPbyrj9ONuA$&VJS_c@R z@0q2F{%ACg#zU@xXQM8RFsX5JYiD+t*<6poJ+wAEcB&8x1N2TK+S|_qsfxw)q-xCu z34Uh?_g=&W&m7L|| z#0Pq0UhhD5{PWwJLTf=q(#Q@dX|-Umk`LTg8pl4nwvJme+n!X`C!vS+#dB8A{3*qq zUMt~%KRo3E!2iDCX27XNOG;=>Qm`ws;2ucWodHV%P8hoWXay-D=v} z4SyZk=>HQ9cn-R|DGU42tcMiYOMpwo2A#crI?Y-GnNL4LiTR#swx z>*UA@WgfQhJv}652$kf1IRw=#>RB;q>S)WugT}v<(jZ_RDf(Ln9!t-1LV(y z8Tf7dNxp7xci^lb(62M#fW2iAtUVryBvsWY^Gek&!B?h1lH!BJ5RsS14viB25akaI zu109jX*z)4I9q3pMcpY$F;Ipfwcvu__0WK6JYT9};5GtyBUp)VUw^Z>xJYyQbR78f zI(vHJ%$P5)(ioPEt_iwL-h?^?)?-@$p6J1g+v$ z%w-kilcmdndMk9IE|``uV)0c{5!@Yk%V>>1NRa?J4%oT^KwIlsWH*+k^aY)SEgvoy zxObHHuQ2xt9jA`FpdXr4Fo4MVb+dWSQb*KhA-M6f{ZW>{C6J#CsA=cUhksXSavWfw zI3tR{v6~Z87YUWmP)sDRU%YOb0qyDW>kH!diu9wBkDRUof54S1TyqSB1i_tWF9(gx zmD#{X)CsNOks6!x9T9Y_6(UVcNf``h?Og(}4{alINGj1F?M~J6H*t|F z5lhrq;M+EDe%@gKwh#N|EY#w>8^>#xw&@aOIG7k zQS!+=#|j9RMs?38ywIkE@Q;l-ak^0J);YK&w+#8ttau%BP;qH#Cp;_!8it-K%>z7|N zUVC@C?~*}ilEmC6FX zp(wk6WmRVnQTj>aAo{mlpY7=TR2kJi;%Sb)3MLhs4<<{0v5}PCqn*BAO{Nyjag#GB zJ5DgDSLS&bC6XqbT*(A+U#Hxf!%n<6q!?e6VY$ud9%qndk3&%Qqq(cp9d{0i9w`ka z1rXGpU!oo;BAMFT3k*3=9MP&VUZ}~2H85t=zWe^%r{ChGg5kFj@A1&Y^W^!Q;XVj$ zg4+FqP8p*Hf!jv5owH E04QXZEC2ui literal 0 HcmV?d00001 diff --git a/Code/assets/fr/buttons/mute.png b/Code/assets/fr/buttons/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc1960522b8092f3067d86ccb68181d41890c58 GIT binary patch literal 18595 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 E04QXZEC2ui literal 0 HcmV?d00001 diff --git a/Code/public/js/level1.min.js b/Code/public/js/level1.min.js index 90f50aa..a0dc247 100644 --- a/Code/public/js/level1.min.js +++ b/Code/public/js/level1.min.js @@ -1 +1 @@ -function selectWord(e,t){switch(LANG){case"fr":return t;default:return e}}function newGame(e){-1!==e.scene.getIndex("Game")&&e.scene.remove("Game"),e.scene.add("Game",new Game(e))}function chooseTarget(e,t){let n=2*WIDTH_MAP,a=[];return t.forEach(function(t){if(t!==e){let o=Math.hypot(t.x-e.x,t.y-e.y);n>=o&&(n>o&&(n=o,a=[]),a.push(t))}}),a.length>1?a[Math.floor(Math.random()*(a.length+1))]:a[0]}var listBonus=[],LANG=navigator.language.substr(0,2).toLowerCase(),SPEED_GAME=1;const MYSELF="myself",SHIELD_PER_SECOND=5,COLOR_ATTACK=16711680,COLOR_MOVE=255,COLOR_CONDITION=921102,WIDTH_WINDOW=$(document).width()-20,HEIGHT_WINDOW=$(document).height()-20,WIDTH_MAP=WIDTH_WINDOW=o&&(a>o&&(a=o,n=[]),n.push(t))}}),n.length>1?n[Math.floor(Math.random()*(n.length+1))]:n[0]}var listBonus=[],LANG=navigator.language.substr(0,2).toLowerCase(),SPEED_GAME=1;const MYSELF="myself",SHIELD_PER_SECOND=5,COLOR_ATTACK=16711680,COLOR_MOVE=255,COLOR_CONDITION=921102,WIDTH_WINDOW=$(document).width()-20,HEIGHT_WINDOW=$(document).height()-20,WIDTH_MAP=WIDTH_WINDOW1/3?e>2/3?(e=1,this.percentBonus=1):(e=2/3,this.percentBonus=1.5):(e=1/3,this.percentBonus=2),this.percentRange=e}do(e){return!(!e.haveTarget()||!e.isTargetInRange(this.percentRange))&&e.attackTarget(this.percentBonus)}getFrame(){return 3*this.percentRange-1}}class BonusAttack extends Bonus{constructor(e,t,s,i,h){super(e,t,s,i,"bonusAttack",h)}useOn(e){let t=e.speed;e.setSpeed(t+this.value),this.scene.time.addEvent({delay:this.time,callback:e.setSpeed(t)}),this.destroy()}}class BonusShield extends Bonus{constructor(e,t,s,i,h){super(e,t,s,i,"bonusShield",h)}useOn(e){e.shield.valueMax=e.shield.valueMax+this.value,e.shield.value=e.shield.value+this.val,this.destroy()}}class BonusSpeed extends Bonus{constructor(e,t,s,i,h,a){let r;switch(h){case 1:r="bonusSpeed0";break;case 2:r="bonusSpeed1";break;case 3:default:r="bonusSpeed2"}super(e,t,s,i,r,h),this.time=a}useOn(e){e.increaseSpeed(this.value),this.scene.time.addEvent({delay:this.time,callback:()=>e.decreaseSpeed(this.value)}),this.destroy()}}class Boot extends Phaser.Scene{constructor(e){super("Boot"),this.father=e}preload(){let e=this.add.graphics(),t=this.add.graphics(),s=WIDTH_WINDOW/2-160,i=HEIGHT_WINDOW/2-25;t.fillStyle(2236962,.8),t.fillRect(s,i,320,50),this.load.on("progress",function(t){e.clear(),e.fillStyle(16777215,1),e.fillRect(s+10,i+10,300*t,30)}),this.load.on("complete",function(){e.destroy(),t.destroy()}),this.load.audio("shot","assets/sounds/shot.ogg"),this.load.audio("hit","assets/sounds/hit.ogg"),this.loadImage("en","flags/",!0),this.loadImage("fr","flags/",!0),this.loadImage("bonusSpeed0","bonus/",!0),this.loadImage("bonusSpeed1","bonus/",!0),this.loadImage("bonusSpeed2","bonus/",!0),this.loadSprite("playLetter",550,150,"buttons/"),this.loadSprite("cancel",550,150,"buttons/"),this.loadSprite("add",550,150,"buttons/"),this.loadSprite("home",550,150,"buttons/"),this.loadSprite("next",550,150,"buttons/"),this.loadSprite("retry",550,150,"buttons/"),this.loadSprite("duel",269,262,"buttons/"),this.loadSprite("last",269,262,"buttons/"),this.loadSprite("team",269,262,"buttons/"),this.loadSprite("flag",269,262,"buttons/"),this.loadSprite("map",269,262,"buttons/"),this.loadSprite("play",100,100,"buttons/"),this.loadSprite("bin",100,100,"buttons/"),this.loadSprite("plus",100,100,"buttons/"),this.loadSprite("pencil",100,100,"buttons/"),this.loadSprite("speed",100,100,"buttons/"),this.loadSprite("back",200,200,"buttons/"),this.loadSprite("shortRange",300,150,"buttons/"),this.loadSprite("mediumRange",300,150,"buttons/"),this.loadSprite("longRange",300,150,"buttons/"),this.loadSprite("shield0",300,150,"buttons/"),this.loadSprite("shield33",300,150,"buttons/"),this.loadSprite("shield66",300,150,"buttons/"),this.loadSprite("shield100",300,150,"buttons/"),this.loadSprite("myself",300,150,"buttons/"),this.loadSprite("enemyBot",300,150,"buttons/"),this.loadSprite("bonus",300,150,"buttons/"),this.loadSprite("moveToward",300,150,"buttons/"),this.loadSprite("fleeFrom",300,150,"buttons/"),this.loadSprite("attackNode",180,190,"nodes/",!0),this.loadSprite("moveNode",180,190,"nodes/",!0),this.loadSprite("conditionNode",180,190,"nodes/",!0),this.loadImage("background"),this.loadImage("bullet"),this.loadImage("logoWaria"),this.loadImage("attack","nodes/",!0),this.loadImage("move","nodes/",!0),this.loadImage("condition","nodes/",!0)}create(){this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let e=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"playLetter").setInteractive();e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e)),this.createFlags()}createFlags(){this.diffXFlag=0,this.createFlag("fr"),this.createFlag("en")}createFlag(e){let t=this.add.image(WIDTH_WINDOW-10-this.diffXFlag,10,e).setOrigin(1,0).setInteractive();t.displayHeight=40,t.scaleX=t.scaleY,this.diffXFlag=this.diffXFlag+t.displayWidth+10,t.on("pointerdown",()=>this.setLang(e))}setLang(e){e!==LANG&&(LANG=e,console.log("Set Lang : "+e),this.scene.restart())}clickPlay(e){e.setFrame(2),console.log("Play"),this.father.scene.add("Type",new Type(this.father)),this.scene.start("Type")}loadSprite(e,t,s,i="",h=!1){this.deleteLoad(e),h?this.load.spritesheet(e,"assets/"+i+e+".png",{frameWidth:t,frameHeight:s}):this.load.spritesheet(e,"assets/"+LANG+"/"+i+e+".png",{frameWidth:t,frameHeight:s})}loadImage(e,t="",s=!1){this.deleteLoad(e),s?this.load.image(e,"assets/"+t+e+".png"):this.load.image(e,"assets/"+LANG+"/"+t+e+".png")}deleteLoad(e){this.textures.exists(e)&&this.textures.remove(e)}}class Category{constructor(e="undefined",t=!0,s=!0){this.name=e,this.single=t,this.lBtn=[],this.lValue=[],this.obligatory=s}add(e,t){0!==this.lBtn.length&&this.single&&(this.lBtn[0].clearTint(),this.lValue=[],this.lBtn=[]),this.lValue.push(t),this.lBtn.push(e),e.tint=15718407}getValue(){return this.single?this.lValue[0]:this.lValue}validate(){return!(0===this.lBtn.length&&this.obligatory)}remove(e){let t=this.lBtn.indexOf(e);-1!==t&&(this.lBtn.splice(t,1),this.lValue.splice(t,1)),e.clearTint()}}class Condition{constructor(e,t=!1,s=!1,i,h){this.shieldFilter=t,this.rangeFilter=s,this.shield=i,this.range=h,this.myself=e,this.lNode=[]}addNode(e){this.lNode.push(e)}do(e){if(this.doCondition(e))for(let t=0;te.getX()-t.getX();this.tree.lRect.sort(e),this.tree.lRect.forEach(function(t){void 0!==t.lRect&&t.lRect.sort(e)}),this.gm.modifyNodes(this.tree.getNodes()),this.gm.resume()}changeFrame(e,t=0,s=0){e.setFrame(t+2*s)}createButton(){let e=WIDTH_MAP+WIDTH_WINDOW/10,t=WIDTH_MAP+HEIGHT_WINDOW/10+5,s=HEIGHT_WINDOW/10,i=HEIGHT_WINDOW/15,h=this.add.sprite(10,10,"back").setOrigin(0,0).setInteractive(),a=this.add.sprite(e,t,"play").setOrigin(1,0).setInteractive(),r=this.add.sprite(e-s,t,"speed").setOrigin(1,0).setInteractive();this.pencil=this.add.sprite(e-2*s,t,"pencil").setOrigin(1,0).setInteractive().setVisible(!1),this.bin=this.add.sprite(e-3*s,t,"bin").setOrigin(1,0).setInteractive().setVisible(!1),this.plus=this.add.sprite(e-4*s,t,"plus").setOrigin(1,0).setInteractive().setVisible(!1),this.linePlay=0,this.lineSpeed=0,h.displayHeight=h.displayWidth=i,a.displayHeight=a.displayWidth=i,r.displayHeight=r.displayWidth=i,this.pencil.displayHeight=this.pencil.displayWidth=i,this.bin.displayHeight=this.bin.displayWidth=i,this.plus.displayHeight=this.plus.displayWidth=i,a.on("pointerout",()=>this.changeFrame(a,0,this.linePlay)),a.on("pointerover",()=>this.changeFrame(a,1,this.linePlay)),r.on("pointerout",()=>this.changeFrame(r,0,this.lineSpeed)),r.on("pointerover",()=>this.changeFrame(r,1,this.lineSpeed)),this.creatBtnOutAndOver(h),this.creatBtnOutAndOver(this.pencil),this.creatBtnOutAndOver(this.bin),this.creatBtnOutAndOver(this.plus),a.on("pointerdown",()=>this.clickPlay(a)),r.on("pointerdown",()=>this.clickSpeed(r)),h.on("pointerdown",()=>this.clickBack()),this.pencil.on("pointerdown",()=>this.clickPencil()),this.bin.on("pointerdown",()=>this.clickBin()),this.plus.on("pointerdown",()=>this.clickPlus()),this.input.on("pointerdown",()=>this.clickNode()),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.pauseScene(a))}creatBtnOutAndOver(e){e.on("pointerout",()=>this.changeFrame(e,0)),e.on("pointerover",()=>this.changeFrame(e,1))}clickPlay(e){this.scene.isPaused("GamingBoard")?this.resume():this.pauseScene(e),this.changeFrame(e,1,this.linePlay)}clickSpeed(e){1===SPEED_GAME?(SPEED_GAME=2,this.lineSpeed=1):(SPEED_GAME=1,this.lineSpeed=0),this.changeFrame(e,1,this.lineSpeed)}clickPencil(){console.log("PENCIL"),this.changeFrame(this.pencil,0)}clickBin(){console.log("BIN"),this.tree.delete(this.selected),this.changeFrame(this.bin,0)}clickPlus(){console.log("PLUS"),this.father.scene.add("PlusNode",new PlusNode(this.father,this,this.selected)),this.scene.launch("PlusNode"),this.changeFrame(this.plus,0),this.scene.pause("Game")}clickBack(){console.log("BACK"),SPEED_GAME=1,this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.stop("Game"),this.father.scene.start("Type")}}class GamingBoard extends Phaser.Scene{constructor(e){super("GamingBoard"),this.listRobot=[],listBonus=[],this.father=e,this.end=!1}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP),this.sound.add("shot"),this.sound.add("hit")}create(){listBonus.push(new BonusSpeed("Balle Argent",this,WIDTH_MAP/2,WIDTH_MAP/2,3,2e3)),this.add.image(0,0,"background").alpha=.1;for(let e=0;ethis.resume()),this.time.addEvent({delay:2e3,callback:this.upShield,callbackScope:this})}update(e,t){super.update(e,t),this.listRobot.forEach(function(e){e.read()});for(let e=0;ethis.listRobot[0].addNode(e)),!0;return!1}upShield(){this.listRobot.forEach(e=>e.addShield(SHIELD_PER_SECOND)),this.time.addEvent({delay:1e3/SPEED_GAME,callback:this.upShield,callbackScope:this})}}class HealthBar{constructor(e,t,s,i,h,a,r){this.bar=new Phaser.GameObjects.Graphics(e),this.width=t,this.height=s,this.valueMax=a,this.value=a,this.color=r,this.draw(),this.setX(i),this.setY(h),e.add.existing(this.bar)}decrease(e){this.value-=e;let t=0;return this.value<0&&(t=-this.value,this.value=0),this.draw(),t}increase(e){this.value+=e,this.value>this.valueMax&&(this.value=this.valueMax),this.draw()}setX(e){this.bar.setX(e-this.width/2)}setY(e){this.bar.setY(e)}draw(){this.bar.clear(),this.bar.fillStyle(0),this.bar.fillRect(0,0,this.width,this.height),this.bar.fillStyle(16777215),this.bar.fillRect(2,2,this.width-4,this.height-4);let e=this.value/this.valueMax;e<1/3?this.bar.fillStyle(16711680):this.bar.fillStyle(this.color);let t=Math.floor(e*(this.width-4));this.bar.fillRect(2,2,t,this.height-4)}destroy(){this.bar.destroy()}}class Looser extends Finish{constructor(e){super(e)}create(){super.create(),super.addTitle(selectWord("GAME OVER","PARTIE PERDUE")),super.btnRetry(super.createButton(WIDTH_WINDOW/3,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/1.5,"home"))}}class Missile extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,0,0,t),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move{constructor(e,t=!0){this.toward=e,this.enemyBot=t}do(e){if(this.enemyBot){if(e.verifyTarget())return!0===this.toward?this.moveToward(e):this.fleeFrom(e)}else{let t=chooseTarget(e,listBonus);if(void 0!==t){let s;return(s=!0===this.toward?this.moveToward(e,t):this.fleeFrom(e,t))||(t.useOn(e),listBonus.splice(listBonus.indexOf(t),1)),!0}}return!1}moveToward(e,t=e.target){return e.advanceTo(t)}fleeFrom(e,t=e.target){return e.fleeFrom(t)}getFrame(){let e;return e=this.toward?0:2,this.enemyBot||(e+=1),e}}class PlusNode extends Phaser.Scene{constructor(e,t,s){super("PlusNode"),this.father=e,this.gameR=t,this.selected=s}create(){this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,HEIGHT_WINDOW/2,3487290).setOrigin(0,.5),this.createNode(),this.createButton()}createNode(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW/2,s=WIDTH_WINDOW/3,i=HEIGHT_WINDOW/10,h={font:i.toString()+"px stencil",fill:"#e2e2e2"};this.add.text(e-s,t-i,selectWord("ATTACK","ATTAQUE"),h).setOrigin(.5,.5),this.add.text(e,t-i,selectWord("MOVE","DEPLACEMENT"),h).setOrigin(.5,.5),this.add.text(e+s,t-i,selectWord("CONDITION","CONDITION"),h).setOrigin(.5,.5);let a=this.add.sprite(e-s,t+i,"attack").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("attack"));a.displayHeight=2*i,a.scaleX=a.scaleY,(a=this.add.sprite(e,t+i,"move").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("move"))).displayHeight=2*i,a.scaleX=a.scaleY,(a=this.add.sprite(e+s,t+i,"condition").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("condition"))).displayHeight=2*i,a.scaleX=a.scaleY}click(e){switch(e.toString()){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this.gameR,this.selected));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this.gameR,this.selected));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this.gameR,this.selected))}this.scene.launch("AddNode"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}createButton(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.cancel()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY}cancel(){this.scene.resume("Game"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}}class RectangleNode{constructor(e,t,s,i,...h){switch(i.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(s,e,t,"attackNode"),this.node=new Attack(h[0]),this.canAddNode=!1,this.line=s.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(s,e,t,"moveNode"),this.node=new Move(h[0],h[1]),this.canAddNode=!1,this.line=s.add.graphics();break;case"condition":this.rect=new Phaser.GameObjects.Image(s,e,t,"conditionNode"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=s,this.line=s.add.graphics();break;case"waria":this.rect=new Phaser.GameObjects.Image(s,e,t,"logoWaria").setInteractive(),this.canAddNode=!0,this.lRect=[],this.scene=s,this.scene.add.existing(this.rect);break;default:return void console.log("Création d'un node echoué")}"waria"!==i.toString().toLowerCase()&&this.rect.setFrame(this.node.getFrame()),this.rect.on("pointerdown",()=>this.click()),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_WINDOW/6,this.rect.scaleX=this.rect.scaleY}getSelected(){if(this.rect.isTinted)return this;if(this.canAddNode)for(let e=0;ethis.addLine(e))}addLine(e){e.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNodes(){if(void 0===this.node){let e=[];return this.lRect.forEach(function(t){void 0!==t.node&&(void 0!==t.lRect&&(t.node.clearNodes(),t.lRect.forEach(e=>t.node.addNode(e.node))),e.push(t.node))}),e}}destroy(){this.line.destroy(),this.rect.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}delete(e){let t=this.lRect.indexOf(e);if(-1!==t)return this.lRect.splice(t,1),e.destroy(),!0;for(let t=0;tthis.click())}click(){null===this.circleRange?this.drawRange():this.eraseRange()}addShield(e){this.shield.increase(e)}setX(e){this.x=e,this.circle.setX(this.x),this.life.setX(this.x),this.shield.setX(this.x),this.drawCircleRange()}setY(e){this.y=e,this.life.setY(this.y-this.width),this.shield.setY(this.y-1.5*this.width),this.circle.setY(this.y),this.drawCircleRange()}setTarget(e){this.target=e}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(e,t){}setSpeed(e){this.speed=e}increaseSpeed(e){this.speed+=e}decreaseSpeed(e){this.speed-=e}advanceToTarget(){return this.verifyTarget()&&this.advanceTo(this.target),!1}advanceTo(e){if(this.target.x!==this.x||this.target.y!==this.y){let t=!1,s=!1,i=this.getVelocity(e),h=i[0]+this.x,a=i[1]+this.y;return i[0]>=0&&h>=e.x||i[0]<=0&&h<=e.x?(this.setX(e.x),t=!0):this.setX(this.x+i[0]),i[1]>=0&&a>=e.y||i[1]<=0&&a<=e.y?(this.setY(e.y),s=!0):this.setY(this.y+i[1]),!(t&&s)}return!1}fleeFromTarget(){return!!this.verifyTarget()&&this.fleeFrom(this.target)}fleeFrom(e){if(this.target.x!==this.x||this.target.y!==this.y){let t=this.getVelocity(e);return t[0]>=0&&this.x-this.width/2<=0?this.setX(this.width/2):t[0]<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-t[0]),t[1]>=0&&this.y-this.width/2<=0?this.setY(this.height/2):t[1]<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-t[1]),!0}return!1}getVelocity(e){let t=[],s=e.x-this.x,i=e.y-this.y,h=Math.hypot(s,i);return t[0]=s/h*WIDTH_MAP/1e3*SPEED*this.speed*SPEED_GAME,t[1]=i/h*WIDTH_MAP/1e3*SPEED*this.speed*SPEED_GAME,t}attackTarget(e=0){return!!this.verifyTarget()&&(this.canAttack&&this.attack(this.target,e),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(e,t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.sound.play("shot");let s=this.calcDistance(this.target)*WIDTH_MAP/1e3/SPEED_GAME;this.scene.tweens.add({targets:this.missile,x:e.x,y:e.y,ease:"Linear",duration:s,onComplete:()=>this.finishAttack(e,t)}),this.scene.time.addEvent({delay:Phaser.Math.Between(1e3/SPEED_GAME,3e3/SPEED_GAME),callback:this.reload,callbackScope:this})}finishAttack(e,t){e.beAttack(this.damage*t)&&this.setTarget(null),this.missile.setVisible(!1)}reload(){this.canAttack=!0}beAttack(e){let t=this.shield.decrease(e),s={font:HEIGHT_DAMAGE.toString()+"px stencil",fill:"#ffff00"},i=this.scene.add.text(this.x,this.y,e.toString(),s).setOrigin(0,1);return this.scene.tweens.add({targets:i,x:this.x+30,y:this.y-50,alpha:0,duration:DURATION_DAMAGE,ease:"Sine.easeOut",onComplete:()=>i.destroy()}),this.scene.sound.play("hit"),console.log("HIT"),t>0&&(console.log("Shield Broken"),this.life.decrease(t)),this.die()}isTargetInRange(e=1){return!!this.haveTarget()&&this.calcDistance(this.target)0}die(){return 0===this.life.value&&(null!==this.circleRange&&this.circleRange.destroy(),this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){for(let e=0;ee.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e))}clickPlay(e){newGame(this.father),this.scene.start("Game")}}class Winner extends Finish{constructor(e){super(e)}create(){super.create(),super.addTitle(selectWord("YOU WIN","PARTIE GAGNÉE")),super.btnRetry(super.createButton(WIDTH_WINDOW/4,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/2,"home")),super.btnNext(super.createButton(WIDTH_WINDOW/4*3,"next"))}} \ No newline at end of file +class AddAttack extends AddNode{constructor(e,t,s){super(e,t,s)}create(){console.log("ATTACK"),super.create(this),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : ATTACK","AJOUTER ACTION : ATTAQUE")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/7),selectWord("TARGET FILTERS (OPTIONAL)","FILTRES CIBLES (FACULTATIF)")),super.addButton(WIDTH_WINDOW/2,HEIGHT_WINDOW/3.2,"enemyBot",super.newCategory("target",!0,!0),!1);let e=super.newCategory("range",!0,!0);super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/9),"shortRange",e,1/3),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/9),"mediumRange",e,2/3),super.addButton(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/12),"longRange",e,1)}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"attack",this.lCategory[1].getValue())),super.cancel())}}class AddCondition extends AddNode{constructor(e,t,s){super(e,t,s)}create(){super.create(this),console.log("CONDITION"),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : CONDITION","AJOUTER ACTION : CONDITION")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/7),selectWord("TARGET FILTERS (OPTIONAL)","FILTRES CIBLES (FACULTATIF)"));let e=super.newCategory("target",!0,!0);super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/3.2,"enemyBot",e,!1),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/3.2,"myself",e,!0);let t=super.newCategory("shield",!0,!0);super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/9),"shield0",t,0),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/9),"shield33",t,1/3),super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/12),"shield66",t,2/3),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/12),"shield100",t,1)}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"condition",this.lCategory[0].getValue(),!0,!1,this.lCategory[1].getValue(),0)),super.cancel())}}class AddMove extends AddNode{constructor(e,t,s){super(e,t,s)}create(){console.log("MOVE"),super.create(this),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : MOVE","AJOUTER ACTION : DEPLACEMENT")),super.addTitle(WIDTH_WINDOW/4,HEIGHT_WINDOW/(16/3),selectWord("FLEE OR MOVE ?","RECULER OU AVANCER ?"));let e=super.newCategory("direction",!0,!0);super.addButton(WIDTH_WINDOW/6,HEIGHT_WINDOW/3.2,"fleeFrom",e,!1),super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/3.2,"moveToward",e,!0),super.addTitle(WIDTH_WINDOW/4*3,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?"));let t=super.newCategory("target",!0,!0);super.addButton(WIDTH_WINDOW/6*4,HEIGHT_WINDOW/3.2,"enemyBot",t,!0),super.addButton(WIDTH_WINDOW/6*5,HEIGHT_WINDOW/3.2,"bonus",t,!1)}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"move",this.lCategory[0].getValue(),this.lCategory[1].getValue())),super.cancel())}}class Attack{constructor(e=1){e>1/3?e>2/3?(e=1,this.percentBonus=1):(e=2/3,this.percentBonus=1.5):(e=1/3,this.percentBonus=2),this.percentRange=e}do(e){return!(!e.haveTarget()||!e.isTargetInRange(this.percentRange))&&e.attackTarget(this.percentBonus)}getFrame(){return 3*this.percentRange-1}}class BonusAttack extends Bonus{constructor(e,t,s,i,h){super(e,t,s,i,"bonusAttack",h)}useOn(e){let t=e.speed;e.setSpeed(t+this.value),this.scene.time.addEvent({delay:this.time,callback:e.setSpeed(t)}),this.destroy()}}class BonusShield extends Bonus{constructor(e,t,s,i,h){super(e,t,s,i,"bonusShield",h)}useOn(e){e.shield.valueMax=e.shield.valueMax+this.value,e.shield.value=e.shield.value+this.val,this.destroy()}}class BonusSpeed extends Bonus{constructor(e,t,s,i,h,a){let n;switch(h){case 1:n="bonusSpeed0";break;case 2:n="bonusSpeed1";break;case 3:default:n="bonusSpeed2"}super(e,t,s,i,n,h),this.time=a}useOn(e){e.increaseSpeed(this.value),this.scene.time.addEvent({delay:this.time,callback:()=>e.decreaseSpeed(this.value)}),this.destroy()}}class Boot extends ManageLang{constructor(e){super("Boot",e)}create(){super.create();this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let e=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"playLetter").setInteractive();e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e))}clickPlay(e){console.log("Play"),this.father.scene.add("Type",new Type(this.father)),this.scene.start("Type")}}class Category{constructor(e="undefined",t=!0,s=!0){this.name=e,this.single=t,this.lBtn=[],this.lValue=[],this.obligatory=s}add(e,t){0!==this.lBtn.length&&this.single&&(this.lBtn[0].clearTint(),this.lValue=[],this.lBtn=[]),this.lValue.push(t),this.lBtn.push(e),e.tint=15718407}getValue(){return this.single?this.lValue[0]:this.lValue}validate(){return!(0===this.lBtn.length&&this.obligatory)}remove(e){let t=this.lBtn.indexOf(e);-1!==t&&(this.lBtn.splice(t,1),this.lValue.splice(t,1)),e.clearTint()}}class Condition{constructor(e,t=!1,s=!1,i,h){this.shieldFilter=t,this.rangeFilter=s,this.shield=i,this.range=h,this.myself=e,this.lNode=[]}addNode(e){this.lNode.push(e)}do(e){if(this.doCondition(e))for(let t=0;t{this.clickBin()})}update(e,t){super.update(e,t),this.doLine&&this.tree.updateLine()}finish(){let e;console.log("FINISH"),e=this.gm.winner()?new Winner(this.father):new Looser(this.father),this.father.scene.add("Finish",e),this.scene.pause("Game"),this.scene.launch("Finish")}clickNode(){this.tryClick(),this.selected=this.tree.getSelected(),null!==this.selected&&(this.selected!==this.tree&&(this.pencil.setVisible(!0),this.bin.setVisible(!0)),this.selected.canAddNode&&this.plus.setVisible(!0))}doDrag(e,t,s,i){t.setX(s),t.setY(i)}dragStart(e){console.log("START DRAG"),this.doLine=!0,this.pauseScene(e)}dragEnd(){console.log("END DRAG"),this.doLine=!1}pauseScene(e){this.linePlay=0,this.changeFrame(e,0),this.gm.pause()}resume(){this.linePlay=1;this.tree.sort((e,t)=>e.getX()-t.getX()),this.gm.modifyNodes(this.tree.getNodes()),this.gm.resume()}changeFrame(e,t=0,s=0){e.setFrame(t+2*s)}createButton(){let e=WIDTH_MAP+WIDTH_WINDOW/10,t=WIDTH_MAP+HEIGHT_WINDOW/10+5,s=HEIGHT_WINDOW/10,i=HEIGHT_WINDOW/15,h=this.add.sprite(10,10,"back").setOrigin(0,0).setInteractive(),a=this.add.sprite(e,t,"play").setOrigin(1,0).setInteractive(),n=this.add.sprite(e-s,t,"speed").setOrigin(1,0).setInteractive();this.pencil=this.add.sprite(e-2*s,t,"pencil").setOrigin(1,0).setInteractive().setVisible(!1),this.bin=this.add.sprite(e-3*s,t,"bin").setOrigin(1,0).setInteractive().setVisible(!1),this.plus=this.add.sprite(e-4*s,t,"plus").setOrigin(1,0).setInteractive().setVisible(!1);let r=this.add.sprite(e-5*s,t,"mute").setOrigin(1,0).setInteractive();this.linePlay=0,this.lineSpeed=0,this.father.sound.mute?this.lineMute=1:this.lineMute=0,h.displayHeight=h.displayWidth=i,a.displayHeight=a.displayWidth=i,n.displayHeight=n.displayWidth=i,r.displayHeight=r.displayWidth=i,this.pencil.displayHeight=this.pencil.displayWidth=i,this.bin.displayHeight=this.bin.displayWidth=i,this.plus.displayHeight=this.plus.displayWidth=i,a.on("pointerout",()=>this.changeFrame(a,0,this.linePlay)),a.on("pointerover",()=>this.changeFrame(a,1,this.linePlay)),n.on("pointerout",()=>this.changeFrame(n,0,this.lineSpeed)),n.on("pointerover",()=>this.changeFrame(n,1,this.lineSpeed)),r.on("pointerout",()=>this.changeFrame(r,0,this.lineMute)),r.on("pointerover",()=>this.changeFrame(r,1,this.lineMute)),this.creatBtnOutAndOver(h),this.creatBtnOutAndOver(this.pencil),this.creatBtnOutAndOver(this.bin),this.creatBtnOutAndOver(this.plus),a.on("pointerdown",()=>this.clickPlay(a)),n.on("pointerdown",()=>this.clickSpeed(n)),h.on("pointerdown",()=>this.clickBack()),r.on("pointerdown",()=>this.clickMute(r)),this.pencil.on("pointerdown",()=>this.clickPencil()),this.bin.on("pointerdown",()=>this.clickBin()),this.plus.on("pointerdown",()=>this.clickPlus()),this.input.on("pointerdown",()=>this.clickNode()),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.dragStart(a)),this.input.on("dragend",()=>this.dragEnd())}creatBtnOutAndOver(e){e.on("pointerout",()=>this.changeFrame(e,0)),e.on("pointerover",()=>this.changeFrame(e,1))}clickPlay(e){this.scene.isPaused("GamingBoard")?this.resume():this.pauseScene(e),this.changeFrame(e,1,this.linePlay)}clickSpeed(e){1===SPEED_GAME?(SPEED_GAME=2,this.lineSpeed=1):(SPEED_GAME=1,this.lineSpeed=0),this.changeFrame(e,1,this.lineSpeed)}clickPencil(){console.log("PENCIL"),this.changeFrame(this.pencil,0)}clickBin(){null!==this.selected&&(console.log("BIN"),this.tree.delete(this.selected),this.changeFrame(this.bin,0),this.tryClick())}clickPlus(){console.log("PLUS"),this.father.scene.add("PlusNode",new PlusNode(this.father,this,this.selected)),this.scene.launch("PlusNode"),this.changeFrame(this.plus,0),this.scene.pause("Game")}clickBack(){console.log("BACK"),this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.stop("Game"),this.father.scene.start("Type")}clickMute(e){console.log("MUTE"),this.father.sound.mute?(this.father.sound.mute=!1,this.lineMute=0):(this.father.sound.mute=!0,this.lineMute=1),this.changeFrame(e,1,this.lineMute)}tryClick(){this.pencil.setVisible(!1),this.bin.setVisible(!1),this.plus.setVisible(!1),null!=this.selected&&(this.selected.deselect(),this.selected=null)}}class GamingBoard extends Phaser.Scene{constructor(e){super("GamingBoard"),this.listRobot=[],listBonus=[],this.father=e,this.end=!1}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP),this.sound.add("shot"),this.sound.add("hit")}create(){listBonus.push(new BonusSpeed("Balle Argent",this,WIDTH_MAP/2,WIDTH_MAP/2,3,2e3)),this.add.image(0,0,"background").alpha=.1;for(let e=0;ethis.listRobot[0].addNode(e)),!0;return!1}upShield(){this.listRobot.forEach(e=>e.addShield(SHIELD_PER_SECOND)),this.time.addEvent({delay:1e3/SPEED_GAME,callback:this.upShield,callbackScope:this})}}class HealthBar{constructor(e,t,s,i,h,a,n){this.bar=new Phaser.GameObjects.Graphics(e),this.width=t,this.height=s,this.valueMax=a,this.value=a,this.color=n,this.draw(),this.setX(i),this.setY(h),e.add.existing(this.bar)}decrease(e){this.value-=e;let t=0;return this.value<0&&(t=-this.value,this.value=0),this.draw(),t}increase(e){this.value+=e,this.value>this.valueMax&&(this.value=this.valueMax),this.draw()}setX(e){this.bar.setX(e-this.width/2)}setY(e){this.bar.setY(e)}draw(){this.bar.clear(),this.bar.fillStyle(0),this.bar.fillRect(0,0,this.width,this.height),this.bar.fillStyle(16777215),this.bar.fillRect(2,2,this.width-4,this.height-4);let e=this.value/this.valueMax;e<1/3?this.bar.fillStyle(16711680):this.bar.fillStyle(this.color);let t=Math.floor(e*(this.width-4));this.bar.fillRect(2,2,t,this.height-4)}destroy(){this.bar.destroy()}}class LoadFile extends Phaser.Scene{constructor(e,t,s){super("LoadFile"),this.father=e,this.son=s,this.nameSon=t,this.father.scene.pause(this.nameSon),this.father.scene.stop(this.nameSon),this.father.scene.remove("LoadFile")}preload(){let e=this.add.graphics(),t=this.add.graphics(),s=WIDTH_WINDOW/2-160,i=HEIGHT_WINDOW/2-25;t.fillStyle(2236962,.8),t.fillRect(s,i,320,50),this.load.on("progress",function(t){e.clear(),e.fillStyle(16777215,1),e.fillRect(s+10,i+10,300*t,30)}),this.load.on("complete",()=>{e.destroy(),t.destroy(),-1===this.father.scene.getIndex(this.nameSon)&&this.father.scene.add(this.nameSon,this.son),this.father.scene.start(this.nameSon)}),this.load.audio("shot","assets/sounds/shot.ogg"),this.load.audio("hit","assets/sounds/hit.ogg"),this.loadImage("en","flags/",!0),this.loadImage("fr","flags/",!0),this.loadImage("bonusSpeed0","bonus/",!0),this.loadImage("bonusSpeed1","bonus/",!0),this.loadImage("bonusSpeed2","bonus/",!0),this.loadSprite("playLetter",550,150,"buttons/"),this.loadSprite("cancel",550,150,"buttons/"),this.loadSprite("add",550,150,"buttons/"),this.loadSprite("home",550,150,"buttons/"),this.loadSprite("next",550,150,"buttons/"),this.loadSprite("retry",550,150,"buttons/"),this.loadSprite("duel",269,262,"buttons/"),this.loadSprite("last",269,262,"buttons/"),this.loadSprite("team",269,262,"buttons/"),this.loadSprite("flag",269,262,"buttons/"),this.loadSprite("map",269,262,"buttons/"),this.loadSprite("play",100,100,"buttons/"),this.loadSprite("bin",100,100,"buttons/"),this.loadSprite("plus",100,100,"buttons/"),this.loadSprite("pencil",100,100,"buttons/"),this.loadSprite("speed",100,100,"buttons/"),this.loadSprite("mute",100,100,"buttons/"),this.loadSprite("back",200,200,"buttons/"),this.loadSprite("shortRange",300,150,"buttons/"),this.loadSprite("mediumRange",300,150,"buttons/"),this.loadSprite("longRange",300,150,"buttons/"),this.loadSprite("shield0",300,150,"buttons/"),this.loadSprite("shield33",300,150,"buttons/"),this.loadSprite("shield66",300,150,"buttons/"),this.loadSprite("shield100",300,150,"buttons/"),this.loadSprite("myself",300,150,"buttons/"),this.loadSprite("enemyBot",300,150,"buttons/"),this.loadSprite("bonus",300,150,"buttons/"),this.loadSprite("moveToward",300,150,"buttons/"),this.loadSprite("fleeFrom",300,150,"buttons/"),this.loadSprite("attackNode",180,190,"nodes/",!0),this.loadSprite("moveNode",180,190,"nodes/",!0),this.loadSprite("conditionNode",180,190,"nodes/",!0),this.loadImage("background"),this.loadImage("bullet"),this.loadImage("logoWaria"),this.loadImage("attack","nodes/",!0),this.loadImage("move","nodes/",!0),this.loadImage("condition","nodes/",!0)}loadSprite(e,t,s,i="",h=!1){this.deleteLoad(e),h?this.load.spritesheet(e,"assets/"+i+e+".png",{frameWidth:t,frameHeight:s}):this.load.spritesheet(e,"assets/"+LANG+"/"+i+e+".png",{frameWidth:t,frameHeight:s})}loadImage(e,t="",s=!1){this.deleteLoad(e),s?this.load.image(e,"assets/"+t+e+".png"):this.load.image(e,"assets/"+LANG+"/"+t+e+".png")}deleteLoad(e){this.textures.exists(e)&&this.textures.remove(e)}}class Looser extends Finish{constructor(e){super(e)}create(){super.create(),super.addTitle(selectWord("GAME OVER","PARTIE PERDUE")),super.btnRetry(super.createButton(WIDTH_WINDOW/3,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/1.5,"home"))}}class Missile extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,0,0,t),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move{constructor(e,t=!0){this.toward=e,this.enemyBot=t}do(e){if(this.enemyBot){if(e.verifyTarget())return!0===this.toward?this.moveToward(e):this.fleeFrom(e)}else{let t=chooseTarget(e,listBonus);if(void 0!==t){let s;return(s=!0===this.toward?this.moveToward(e,t):this.fleeFrom(e,t))||(t.useOn(e),listBonus.splice(listBonus.indexOf(t),1)),!0}}return!1}moveToward(e,t=e.target){return e.advanceTo(t)}fleeFrom(e,t=e.target){return e.fleeFrom(t)}getFrame(){let e;return e=this.toward?0:2,this.enemyBot||(e+=1),e}}class PlusNode extends Phaser.Scene{constructor(e,t,s){super("PlusNode"),this.father=e,this.gameR=t,this.selected=s}create(){this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,HEIGHT_WINDOW/2,3487290).setOrigin(0,.5),this.createNode(),this.createButton()}createNode(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW/2,s=WIDTH_WINDOW/3,i=HEIGHT_WINDOW/10,h={font:(i/1.5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(e-s,t-i,selectWord("ATTACK","ATTAQUE"),h).setOrigin(.5,.5),this.add.text(e,t-i,selectWord("MOVE","DEPLACEMENT"),h).setOrigin(.5,.5),this.add.text(e+s,t-i,selectWord("CONDITION","CONDITION"),h).setOrigin(.5,.5);let a=this.add.sprite(e-s,t+i,"attack").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("attack"));a.displayHeight=2*i,a.scaleX=a.scaleY,(a=this.add.sprite(e,t+i,"move").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("move"))).displayHeight=2*i,a.scaleX=a.scaleY,(a=this.add.sprite(e+s,t+i,"condition").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("condition"))).displayHeight=2*i,a.scaleX=a.scaleY}click(e){switch(e.toString()){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this.gameR,this.selected));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this.gameR,this.selected));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this.gameR,this.selected))}this.scene.launch("AddNode"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}createButton(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.cancel()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY}cancel(){this.scene.resume("Game"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}}class RectangleNode{constructor(e,t,s,i,...h){switch(i.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(s,e,t,"attackNode"),this.node=new Attack(h[0]),this.canAddNode=!1,this.line=s.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(s,e,t,"moveNode"),this.node=new Move(h[0],h[1]),this.canAddNode=!1,this.line=s.add.graphics();break;case"condition":this.rect=new Phaser.GameObjects.Image(s,e,t,"conditionNode"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=s,this.line=s.add.graphics();break;case"waria":this.rect=new Phaser.GameObjects.Image(s,e,t,"logoWaria").setInteractive(),this.canAddNode=!0,this.lRect=[],this.scene=s,this.scene.add.existing(this.rect),this.scene.input.setDraggable(this.rect);break;default:return void console.log("Création d'un node echoué")}"waria"!==i.toString().toLowerCase()&&this.rect.setFrame(this.node.getFrame()),this.rect.on("pointerdown",()=>this.click()),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_WINDOW/6,this.rect.scaleX=this.rect.scaleY}getSelected(){if(this.rect.isTinted)return this;if(this.canAddNode)for(let e=0;ethis.addLine(e))}addLine(e){e.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNode(){return this.canAddNode&&(this.node.clearNodes(),this.lRect.forEach(e=>this.node.addNode(e.node)),console.log(this)),this.node}getNodes(){if(void 0===this.node){let e=[];return this.lRect.forEach(function(t){void 0!==t.node&&(t.canAddNode&&(t.node.clearNodes(),t.lRect.forEach(e=>t.node.addNode(e.getNode()))),e.push(t.node))}),e}}sort(e){this.canAddNode&&(this.lRect.sort(e),this.lRect.forEach(function(t){t.canAddNode&&t.sort(e)}))}destroy(){this.line.destroy(),this.rect.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}delete(e){let t=this.lRect.indexOf(e);if(-1!==t)return this.lRect.splice(t,1),e.destroy(),!0;for(let t=0;tthis.click())}click(){null===this.circleRange?this.drawRange():this.eraseRange()}addShield(e){this.shield.increase(e)}setX(e){this.x=e,this.circle.setX(this.x),this.life.setX(this.x),this.shield.setX(this.x),this.drawCircleRange()}setY(e){this.y=e,this.life.setY(this.y-this.width),this.shield.setY(this.y-1.5*this.width),this.circle.setY(this.y),this.drawCircleRange()}setTarget(e){this.target=e}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(e,t){}setSpeed(e){this.speed=e}increaseSpeed(e){this.speed+=e}decreaseSpeed(e){this.speed-=e}advanceToTarget(){return this.verifyTarget()&&this.advanceTo(this.target),!1}advanceTo(e){if(e.x!==this.x||e.y!==this.y){let t=!1,s=!1,i=this.getVelocity(e),h=i[0]+this.x,a=i[1]+this.y;return i[0]>=0&&h>=e.x||i[0]<=0&&h<=e.x?(this.setX(e.x),t=!0):this.setX(this.x+i[0]),i[1]>=0&&a>=e.y||i[1]<=0&&a<=e.y?(this.setY(e.y),s=!0):this.setY(this.y+i[1]),!(t&&s)}return!1}fleeFromTarget(){return!!this.verifyTarget()&&this.fleeFrom(this.target)}fleeFrom(e){if(this.target.x!==this.x||this.target.y!==this.y){let t=this.getVelocity(e);return t[0]>=0&&this.x-this.width/2<=0?this.setX(this.width/2):t[0]<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-t[0]),t[1]>=0&&this.y-this.width/2<=0?this.setY(this.height/2):t[1]<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-t[1]),!0}return!1}getVelocity(e){let t=[],s=e.x-this.x,i=e.y-this.y,h=Math.hypot(s,i);return t[0]=s/h*WIDTH_MAP/1e3*SPEED*this.speed*SPEED_GAME,t[1]=i/h*WIDTH_MAP/1e3*SPEED*this.speed*SPEED_GAME,t}attackTarget(e=0){return!!this.verifyTarget()&&(this.canAttack&&this.attack(this.target,e),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(e,t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.sound.play("shot");let s=this.calcDistance(this.target)*WIDTH_MAP/1e3/SPEED_GAME;this.scene.tweens.add({targets:this.missile,x:e.x,y:e.y,ease:"Linear",duration:s,onComplete:()=>this.finishAttack(e,t)}),this.scene.time.addEvent({delay:Phaser.Math.Between(1e3/SPEED_GAME,3e3/SPEED_GAME),callback:this.reload,callbackScope:this})}finishAttack(e,t){e.beAttack(this.damage*t)&&this.setTarget(null),this.missile.setVisible(!1)}reload(){this.canAttack=!0}beAttack(e){let t=this.shield.decrease(e),s={font:HEIGHT_DAMAGE.toString()+"px stencil",fill:"#ffff00"},i=this.scene.add.text(this.x,this.y,e.toString(),s).setOrigin(0,1);return this.scene.tweens.add({targets:i,x:this.x+30,y:this.y-50,alpha:0,duration:DURATION_DAMAGE,ease:"Sine.easeOut",onComplete:()=>i.destroy()}),this.scene.sound.play("hit"),console.log("HIT"),t>0&&(console.log("Shield Broken"),this.life.decrease(t)),this.die()}isTargetInRange(e=1){return!!this.haveTarget()&&this.calcDistance(this.target)0}die(){return 0===this.life.value&&(null!==this.circleRange&&this.circleRange.destroy(),this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){for(let e=0;ee.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e))}clickPlay(e){newGame(this.father),this.scene.start("Game")}}class Winner extends Finish{constructor(e){super(e)}create(){super.create(),super.addTitle(selectWord("YOU WIN","PARTIE GAGNÉE")),super.btnRetry(super.createButton(WIDTH_WINDOW/4,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/2,"home")),super.btnNext(super.createButton(WIDTH_WINDOW/4*3,"next"))}} \ No newline at end of file diff --git a/Code/public/js/level3.min.js b/Code/public/js/level3.min.js index be11d36..43206f8 100644 --- a/Code/public/js/level3.min.js +++ b/Code/public/js/level3.min.js @@ -1 +1 @@ -class AddNode extends Phaser.Scene{constructor(e,t,s){super("AddNode"),this.father=e,this.gameR=t,this.selected=s,this.lCategory=[]}create(e){let t=HEIGHT_WINDOW/(4/3);this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,t,3487290).setOrigin(0,.5),this.createButtonCancel(),this.createButtonAdd(e)}addButton(e,t,s,i,n,r=new Category,a){let o=this.createButton(e,t,s,i,n);return o.on("pointerdown",()=>this.click(o,r,a)),o}createButton(e,t,s,i,n){let r=this.add.image(e,t,n).setOrigin(.5,.5).setInteractive();return r.on("pointerover",()=>r.setFrame(1)),r.on("pointerout",()=>r.setFrame(0)),r.displayHeight=i,null===s?r.scaleX=r.scaleY:r.displayWidth=s,r}click(e,t,s){e.isTinted?t.remove(e):t.add(e,s)}newCategory(e,t,s){let i=new Category(e,t,s);return this.lCategory.push(i),i}addTitle(e,t,s){let i={font:(HEIGHT_WINDOW/12).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(e,t,s,i).setOrigin(.5,.5)}createButtonCancel(){this.createButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/15),null,HEIGHT_WINDOW/9,"cancel").on("pointerdown",()=>this.cancel())}createButtonAdd(e){this.createButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/15),null,HEIGHT_WINDOW/9,"add").on("pointerdown",()=>e.addNode())}verifyCategory(){for(let e=0;es.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.displayHeight=HEIGHT_WINDOW/9,s.scaleX=s.scaleY,s}btnRetry(e){e.on("pointerdown",()=>this.retry())}retry(){console.log("RETRY"),this.close(),newGame(this.father),this.father.scene.start("Game")}btnHome(e){e.on("pointerdown",()=>this.home())}home(){console.log("HOME"),this.close(),this.father.scene.start("Type")}btnNext(e){e.on("pointerdown",()=>this.next())}next(){console.log("NEXT")}close(){this.sound.stopAll(),this.father.scene.remove("GamingBoard"),this.father.scene.remove("Game"),this.father.scene.remove("Finish")}} \ No newline at end of file +class AddNode extends Phaser.Scene{constructor(e,t,s){super("AddNode"),this.father=e,this.gameR=t,this.selected=s,this.lCategory=[];let i=HEIGHT_WINDOW/14;this.style={font:i.toString()+"px stencil",fill:"#e2e2e2"},this.heightButton=HEIGHT_WINDOW/8}create(e){let t=HEIGHT_WINDOW/(4/3);this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,t,3487290).setOrigin(0,.5),this.createButtonCancel(),this.createButtonAdd(e)}addButton(e,t,s,i=new Category,a){let n=this.createButton(e,t,s);return n.on("pointerdown",()=>this.click(n,i,a)),n}createButton(e,t,s,i=this.heightButton,a=null){let n=this.add.image(e,t,s).setOrigin(.5,.5).setInteractive();return n.on("pointerover",()=>n.setFrame(1)),n.on("pointerout",()=>n.setFrame(0)),n.displayHeight=i,null===a?n.scaleX=n.scaleY:n.displayWidth=a,n}click(e,t,s){e.isTinted?t.remove(e):t.add(e,s)}newCategory(e,t,s){let i=new Category(e,t,s);return this.lCategory.push(i),i}addTitle(e,t,s){this.add.text(e,t,s,this.style).setOrigin(.5,.5)}createButtonCancel(){this.createButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/15),"cancel",HEIGHT_WINDOW/9).on("pointerdown",()=>this.cancel())}createButtonAdd(e){this.createButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/15),"add",HEIGHT_WINDOW/9).on("pointerdown",()=>e.addNode())}verifyCategory(){for(let e=0;es.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.displayHeight=HEIGHT_WINDOW/9,s.scaleX=s.scaleY,s}btnRetry(e){e.on("pointerdown",()=>this.retry())}retry(){console.log("RETRY"),this.close(),newGame(this.father),this.father.scene.start("Game")}btnHome(e){e.on("pointerdown",()=>this.home())}home(){console.log("HOME"),this.close(),this.father.scene.start("Type")}btnNext(e){e.on("pointerdown",()=>this.next())}next(){console.log("NEXT")}close(){this.sound.stopAll(),this.father.scene.remove("GamingBoard"),this.father.scene.remove("Game"),this.father.scene.remove("Finish")}}class ManageLang extends Phaser.Scene{constructor(e,t){super(e),this.name=e,this.father=t,this.otherScenes=[]}addOtherScenes(e){this.otherScenes.push(e)}create(){this.createFlags()}createFlags(){this.diffXFlag=0,this.createFlag("fr"),this.createFlag("en")}createFlag(e){let t=this.add.image(WIDTH_WINDOW-10-this.diffXFlag,10,e).setOrigin(1,0).setInteractive();t.displayHeight=40,t.scaleX=t.scaleY,this.diffXFlag=this.diffXFlag+t.displayWidth+10,t.on("pointerdown",()=>this.setLang(e))}setLang(e){e!==LANG&&(LANG=e,this.father.scene.add("LoadFile",new LoadFile(this.father,this.name)),this.father.scene.start("LoadFile"),this.otherScenes.forEach(e=>this.father.scene.stop(e)))}} \ No newline at end of file diff --git a/Code/src/js/level1/Init.js b/Code/src/js/level1/Init.js index 3572b6f..7c0e40a 100644 --- a/Code/src/js/level1/Init.js +++ b/Code/src/js/level1/Init.js @@ -67,6 +67,5 @@ var config = { }; let father = new Phaser.Game(config); - -father.scene.add('Boot', new Boot(father)); -father.scene.start('Boot'); +father.scene.add('LoadFile', new LoadFile(father, 'Boot', new Boot(father))); +father.scene.start('LoadFile'); diff --git a/Code/src/js/level2/AddAttack.js b/Code/src/js/level2/AddAttack.js index a80fa83..45e960d 100644 --- a/Code/src/js/level2/AddAttack.js +++ b/Code/src/js/level2/AddAttack.js @@ -10,11 +10,11 @@ class AddAttack extends AddNode { super.addTitle(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 3), selectWord("WHO ?", "QUI ?")); super.addTitle(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 7), selectWord("TARGET FILTERS (OPTIONAL)", "FILTRES CIBLES (FACULTATIF)")); - super.addButton(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'enemyBot', super.newCategory('target', true, true), false); + super.addButton(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 5), 'enemyBot', super.newCategory('target', true, true), false); let c2 = super.newCategory('range', true, true); - super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 9), null, HEIGHT_WINDOW / 8, 'shortRange', c2, 1 / 3); - super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 9), null, HEIGHT_WINDOW / 8, 'mediumRange', c2, 2 / 3); - super.addButton(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 12), null, HEIGHT_WINDOW / 8, 'longRange', c2, 1); + super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 9), 'shortRange', c2, 1 / 3); + super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 9), 'mediumRange', c2, 2 / 3); + super.addButton(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 12), 'longRange', c2, 1); } addNode() { diff --git a/Code/src/js/level2/AddCondition.js b/Code/src/js/level2/AddCondition.js index ea7a06f..edbea5d 100644 --- a/Code/src/js/level2/AddCondition.js +++ b/Code/src/js/level2/AddCondition.js @@ -10,13 +10,13 @@ class AddCondition extends AddNode { super.addTitle(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 3), selectWord("WHO ?", "QUI ?")); super.addTitle(WIDTH_WINDOW / 2, HEIGHT_WINDOW / (16 / 7), selectWord("TARGET FILTERS (OPTIONAL)", "FILTRES CIBLES (FACULTATIF)")); let c1 = super.newCategory('target', true, true); - super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'enemyBot', c1, false); - super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'myself', c1, true); + super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 5), 'enemyBot', c1, false); + super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 5), 'myself', c1, true); let c2 = super.newCategory('shield', true, true); - super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 9), null, HEIGHT_WINDOW / 8, 'shield0', c2, 0); - super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 9), null, HEIGHT_WINDOW / 8, 'shield33', c2, 1 / 3); - super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 12), null, HEIGHT_WINDOW / 8, 'shield66', c2, 2 / 3); - super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 12), null, HEIGHT_WINDOW / 8, 'shield100', c2, 1); + super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 9), 'shield0', c2, 0); + super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 9), 'shield33', c2, 1 / 3); + super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 12), 'shield66', c2, 2 / 3); + super.addButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 12), 'shield100', c2, 1); } addNode() { diff --git a/Code/src/js/level2/AddMove.js b/Code/src/js/level2/AddMove.js index 73c8a6d..f851471 100644 --- a/Code/src/js/level2/AddMove.js +++ b/Code/src/js/level2/AddMove.js @@ -9,12 +9,12 @@ class AddMove extends AddNode { super.addTitle(WIDTH_WINDOW / 2, HEIGHT_WINDOW / 16, selectWord("ADD NODE : MOVE", "AJOUTER ACTION : DEPLACEMENT")); super.addTitle(WIDTH_WINDOW / 4, HEIGHT_WINDOW / (16 / 3), selectWord("FLEE OR MOVE ?", "RECULER OU AVANCER ?")); let c1 = super.newCategory('direction', true, true); - super.addButton(WIDTH_WINDOW / 6, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'fleeFrom', c1, false); - super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'moveToward', c1, true); + super.addButton(WIDTH_WINDOW / 6, HEIGHT_WINDOW / (16 / 5), 'fleeFrom', c1, false); + super.addButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 5), 'moveToward', c1, true); super.addTitle(WIDTH_WINDOW / 4 * 3, HEIGHT_WINDOW / (16 / 3), selectWord("WHO ?", "QUI ?")); let c2 = super.newCategory('target', true, true); - super.addButton(WIDTH_WINDOW / 6 * 4, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'enemyBot', c2, true); - super.addButton(WIDTH_WINDOW / 6 * 5, HEIGHT_WINDOW / (16 / 5), null, HEIGHT_WINDOW / 8, 'bonus', c2, false); + super.addButton(WIDTH_WINDOW / 6 * 4, HEIGHT_WINDOW / (16 / 5), 'enemyBot', c2, true); + super.addButton(WIDTH_WINDOW / 6 * 5, HEIGHT_WINDOW / (16 / 5), 'bonus', c2, false); } addNode() { diff --git a/Code/src/js/level2/Boot.js b/Code/src/js/level2/Boot.js index 29c5834..b786969 100644 --- a/Code/src/js/level2/Boot.js +++ b/Code/src/js/level2/Boot.js @@ -1,157 +1,22 @@ -class Boot extends Phaser.Scene { +class Boot extends ManageLang { constructor(father) { - super('Boot'); - this.father = father; - } - - preload() { - let progressBar = this.add.graphics(); - let progressBox = this.add.graphics(); - let width = 320; - let height = 50; - let x = WIDTH_WINDOW / 2 - width / 2; - let y = HEIGHT_WINDOW / 2 - height / 2; - - progressBox.fillStyle(0x222222, 0.8); - progressBox.fillRect(x, y, 320, height); - this.load.on('progress', function (value) { - progressBar.clear(); - progressBar.fillStyle(0xffffff, 1); - progressBar.fillRect(x + 10, y + 10, (width - 20) * value, height - 20); - }); - this.load.on('complete', function () { - progressBar.destroy(); - progressBox.destroy(); - }); - - this.load.audio('shot', 'assets/sounds/shot.ogg'); - this.load.audio('hit', 'assets/sounds/hit.ogg'); - - this.loadImage('en', 'flags/', true); - this.loadImage('fr', 'flags/', true); - - this.loadImage('bonusSpeed0', 'bonus/', true); - this.loadImage('bonusSpeed1', 'bonus/', true); - this.loadImage('bonusSpeed2', 'bonus/', true); - - this.loadSprite('playLetter', 550, 150, 'buttons/'); - this.loadSprite('cancel', 550, 150, 'buttons/'); - this.loadSprite('add', 550, 150, 'buttons/'); - this.loadSprite('home', 550, 150, 'buttons/'); - this.loadSprite('next', 550, 150, 'buttons/'); - this.loadSprite('retry', 550, 150, 'buttons/'); - - this.loadSprite('duel', 269, 262, 'buttons/'); - this.loadSprite('last', 269, 262, 'buttons/'); - this.loadSprite('team', 269, 262, 'buttons/'); - this.loadSprite('flag', 269, 262, 'buttons/'); - this.loadSprite('map', 269, 262, 'buttons/'); - - this.loadSprite('play', 100, 100, 'buttons/'); - this.loadSprite('bin', 100, 100, 'buttons/'); - this.loadSprite('plus', 100, 100, 'buttons/'); - this.loadSprite('pencil', 100, 100, 'buttons/'); - this.loadSprite('speed', 100, 100, 'buttons/'); - this.loadSprite('back', 200, 200, 'buttons/'); - - this.loadSprite('shortRange', 300, 150, 'buttons/'); - this.loadSprite('mediumRange', 300, 150, 'buttons/'); - this.loadSprite('longRange', 300, 150, 'buttons/'); - - this.loadSprite('shield0', 300, 150, 'buttons/'); - this.loadSprite('shield33', 300, 150, 'buttons/'); - this.loadSprite('shield66', 300, 150, 'buttons/'); - this.loadSprite('shield100', 300, 150, 'buttons/'); - - this.loadSprite('myself', 300, 150, 'buttons/'); - this.loadSprite('enemyBot', 300, 150, 'buttons/'); - this.loadSprite('bonus', 300, 150, 'buttons/'); - - this.loadSprite('moveToward', 300, 150, 'buttons/'); - this.loadSprite('fleeFrom', 300, 150, 'buttons/'); - - this.loadSprite('attackNode', 180, 190, 'nodes/', true); - this.loadSprite('moveNode', 180, 190, 'nodes/', true); - this.loadSprite('conditionNode', 180, 190, 'nodes/', true); - - - this.loadImage('background'); - this.loadImage('bullet'); - this.loadImage('logoWaria'); - this.loadImage('attack', 'nodes/', true); - this.loadImage('move', 'nodes/', true); - this.loadImage('condition', 'nodes/', true); + super('Boot', father); } create() { + super.create(); let style = {font: '200px stencil', fill: "#e2e2e2"}; this.add.text(WIDTH_WINDOW / 2, HEIGHT_WINDOW / 3, "WARIA", style).setOrigin(0.5, 0.5); let btn = this.add.sprite(WIDTH_WINDOW / 2, (HEIGHT_WINDOW / 3) * 2, 'playLetter').setInteractive(); - //btn.setFrame(0); btn.on('pointerout', () => btn.setFrame(0)); btn.on('pointerover', () => btn.setFrame(1)); btn.on('pointerdown', () => this.clickPlay(btn)); - - this.createFlags(); - } - - createFlags() { - this.diffXFlag = 0; - this.createFlag('fr'); - this.createFlag('en'); } - createFlag(name) { - let flag = this.add.image(WIDTH_WINDOW - 10 - this.diffXFlag, 10, name).setOrigin(1, 0).setInteractive(); - flag.displayHeight = 40; - flag.scaleX = flag.scaleY; - this.diffXFlag = this.diffXFlag + flag.displayWidth + 10; - flag.on('pointerdown', () => this.setLang(name)); - } - - setLang(lang) { - if (lang !== LANG) { - LANG = lang; - console.log('Set Lang : ' + lang); - - this.scene.restart(); - } - } clickPlay(btn) { - btn.setFrame(2); console.log("Play"); this.father.scene.add('Type', new Type(this.father)); this.scene.start('Type'); } - - loadSprite(name, width, height, folder = '', force = false) { - this.deleteLoad(name); - if (force) { - this.load.spritesheet(name, 'assets/' + folder + name + '.png', { - frameWidth: width, - frameHeight: height - }); - } else { - this.load.spritesheet(name, 'assets/' + LANG + '/' + folder + name + '.png', { - frameWidth: width, - frameHeight: height - }); - } - } - - loadImage(name, folder = '', force = false) { - this.deleteLoad(name); - if (force) { - this.load.image(name, 'assets/' + folder + name + '.png'); - } else { - this.load.image(name, 'assets/' + LANG + '/' + folder + name + '.png'); - } - } - - deleteLoad(name) { - if (this.textures.exists(name)) { - this.textures.remove(name); - } - } } \ No newline at end of file diff --git a/Code/src/js/level2/Game.js b/Code/src/js/level2/Game.js index ed85b5d..c0314a7 100644 --- a/Code/src/js/level2/Game.js +++ b/Code/src/js/level2/Game.js @@ -1,22 +1,25 @@ -class Game extends Phaser.Scene { +class Game extends ManageLang { constructor(father) { - super('Game'); - this.father = father; + super('Game', father); + super.addOtherScenes('GamingBoard'); } - preload() { + create() { + super.create(); + this.doLine = false; + SPEED_GAME = 1; this.gm = new GamingBoard(this); + if (this.father.scene.getIndex('GamingBoard') !== -1) { + this.father.scene.remove('GamingBoard'); + } this.father.scene.add('GamingBoard', this.gm); - } + this.scene.launch('GamingBoard'); + this.scene.pause('GamingBoard'); - create() { this.selected = null; this.createButton(); - this.scene.launch('GamingBoard'); - this.scene.pause('GamingBoard'); - let centerX = WIDTH_WINDOW / 4 * 3; let diffX = WIDTH_WINDOW / 10; this.tree = new RectangleNode(centerX, HEIGHT_WINDOW / 10, this, 'waria'); @@ -33,16 +36,21 @@ class Game extends Phaser.Scene { this.gm.addRobot(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, WIDTH_MAP * 0.9, 0x6666ff, this.gm, MYSELF)); this.gm.addRobot(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.2, WIDTH_MAP * 0.1, 0xff0000, this.gm)); this.gm.addRobot(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, 0xff0000, this.gm)); + + + this.input.keyboard.on('keydown-ESC', () => { + this.clickBin(); + }); } update(time, delta) { super.update(time, delta); - this.tree.updateLine(); + if (this.doLine) + this.tree.updateLine(); } finish() { console.log("FINISH"); - SPEED_GAME = 1; let winner; if (this.gm.winner()) { winner = new Winner(this.father); @@ -58,15 +66,10 @@ class Game extends Phaser.Scene { clickNode() { - this.pencil.setVisible(false); - this.bin.setVisible(false); - this.plus.setVisible(false); - if (this.selected != null) { - this.selected.deselect(); - } + this.tryClick(); this.selected = this.tree.getSelected(); - if (this.selected == null) + if (this.selected === null) return; if (this.selected !== this.tree) { @@ -83,6 +86,19 @@ class Game extends Phaser.Scene { target.setY(dragY); } + dragStart(btn) { + console.log("START DRAG"); + + this.doLine = true; + this.pauseScene(btn); + } + + dragEnd() { + console.log("END DRAG"); + + this.doLine = false; + } + pauseScene(btn) { this.linePlay = 0; @@ -94,13 +110,8 @@ class Game extends Phaser.Scene { resume() { this.linePlay = 1; - const sortDesc = (a, b) => a.getX() - b.getX(); - this.tree.lRect.sort(sortDesc); - this.tree.lRect.forEach(function (element) { - if (element.lRect !== undefined) { - element.lRect.sort(sortDesc); - } - }) + let sortDesc = (a, b) => a.getX() - b.getX(); + this.tree.sort(sortDesc); this.gm.modifyNodes(this.tree.getNodes()); this.gm.resume(); @@ -126,13 +137,21 @@ class Game extends Phaser.Scene { this.bin = this.add.sprite(x - diffX * 3, y, 'bin').setOrigin(1, 0).setInteractive().setVisible(false); this.plus = this.add.sprite(x - diffX * 4, y, 'plus').setOrigin(1, 0).setInteractive().setVisible(false); + let mute = this.add.sprite(x - diffX * 5, y, 'mute').setOrigin(1, 0).setInteractive(); + this.linePlay = 0; this.lineSpeed = 0; + if (this.father.sound.mute) { + this.lineMute = 1; + } else { + this.lineMute = 0; + } back.displayHeight = back.displayWidth = width; play.displayHeight = play.displayWidth = width; speed.displayHeight = speed.displayWidth = width; + mute.displayHeight = mute.displayWidth = width; this.pencil.displayHeight = this.pencil.displayWidth = width; this.bin.displayHeight = this.bin.displayWidth = width; this.plus.displayHeight = this.plus.displayWidth = width; @@ -141,6 +160,8 @@ class Game extends Phaser.Scene { play.on('pointerover', () => this.changeFrame(play, 1, this.linePlay)); speed.on('pointerout', () => this.changeFrame(speed, 0, this.lineSpeed)); speed.on('pointerover', () => this.changeFrame(speed, 1, this.lineSpeed)); + mute.on('pointerout', () => this.changeFrame(mute, 0, this.lineMute)); + mute.on('pointerover', () => this.changeFrame(mute, 1, this.lineMute)); this.creatBtnOutAndOver(back); this.creatBtnOutAndOver(this.pencil); this.creatBtnOutAndOver(this.bin); @@ -149,13 +170,15 @@ class Game extends Phaser.Scene { play.on('pointerdown', () => this.clickPlay(play)); speed.on('pointerdown', () => this.clickSpeed(speed)); back.on('pointerdown', () => this.clickBack()); + mute.on('pointerdown', () => this.clickMute(mute)); this.pencil.on('pointerdown', () => this.clickPencil()); this.bin.on('pointerdown', () => this.clickBin()); this.plus.on('pointerdown', () => this.clickPlus()); this.input.on('pointerdown', () => this.clickNode()); this.input.on('drag', this.doDrag); - this.input.on('dragstart', () => this.pauseScene(play)); + this.input.on('dragstart', () => this.dragStart(play)); + this.input.on('dragend', () => this.dragEnd()); } creatBtnOutAndOver(btn) { @@ -192,10 +215,13 @@ class Game extends Phaser.Scene { } clickBin() { - console.log("BIN"); - this.tree.delete(this.selected); + if (this.selected !== null) { + console.log("BIN"); + this.tree.delete(this.selected); - this.changeFrame(this.bin, 0); + this.changeFrame(this.bin, 0); + this.tryClick(); + } } clickPlus() { @@ -212,11 +238,33 @@ class Game extends Phaser.Scene { clickBack() { console.log("BACK"); - SPEED_GAME = 1; this.father.scene.stop('GamingBoard'); this.father.scene.remove('GamingBoard'); this.father.scene.stop('Game'); this.father.scene.start('Type'); } + + clickMute(btn) { + console.log("MUTE"); + + if (this.father.sound.mute) { + this.father.sound.mute = false; + this.lineMute = 0; + } else { + this.father.sound.mute = true; + this.lineMute = 1; + } + this.changeFrame(btn, 1, this.lineMute); + } + + tryClick() { + this.pencil.setVisible(false); + this.bin.setVisible(false); + this.plus.setVisible(false); + if (this.selected != null) { + this.selected.deselect(); + this.selected = null; + } + } } \ No newline at end of file diff --git a/Code/src/js/level2/GamingBoard.js b/Code/src/js/level2/GamingBoard.js index 4a2360f..900abb6 100644 --- a/Code/src/js/level2/GamingBoard.js +++ b/Code/src/js/level2/GamingBoard.js @@ -14,6 +14,7 @@ class GamingBoard extends Phaser.Scene { } create() { + listBonus.push(new BonusSpeed('Balle Argent', this, WIDTH_MAP / 2, WIDTH_MAP / 2, 3, 2000)); this.add.image(0, 0, 'background').alpha = 0.1; @@ -24,9 +25,8 @@ class GamingBoard extends Phaser.Scene { this.listRobot[0].drawRange(); - this.events.on('resume', () => this.resume()); - this.time.addEvent({delay: 2000, callback: this.upShield, callbackScope: this}); + } update(time, delta) { diff --git a/Code/src/js/level2/LoadFile.js b/Code/src/js/level2/LoadFile.js new file mode 100644 index 0000000..c6df436 --- /dev/null +++ b/Code/src/js/level2/LoadFile.js @@ -0,0 +1,127 @@ +class LoadFile extends Phaser.Scene { + constructor(father, nameSon, son) { + super('LoadFile'); + this.father = father; + this.son = son; + this.nameSon = nameSon; + + this.father.scene.pause(this.nameSon); + this.father.scene.stop(this.nameSon); + this.father.scene.remove('LoadFile'); + } + + preload() { + let progressBar = this.add.graphics(); + let progressBox = this.add.graphics(); + let width = 320; + let height = 50; + let x = WIDTH_WINDOW / 2 - width / 2; + let y = HEIGHT_WINDOW / 2 - height / 2; + + progressBox.fillStyle(0x222222, 0.8); + progressBox.fillRect(x, y, 320, height); + this.load.on('progress', function (value) { + progressBar.clear(); + progressBar.fillStyle(0xffffff, 1); + progressBar.fillRect(x + 10, y + 10, (width - 20) * value, height - 20); + }); + this.load.on('complete', () => { + + progressBar.destroy(); + progressBox.destroy(); + if (this.father.scene.getIndex(this.nameSon) === -1) { + this.father.scene.add(this.nameSon, this.son); + } + this.father.scene.start(this.nameSon); + }); + + this.load.audio('shot', 'assets/sounds/shot.ogg'); + this.load.audio('hit', 'assets/sounds/hit.ogg'); + + this.loadImage('en', 'flags/', true); + this.loadImage('fr', 'flags/', true); + + this.loadImage('bonusSpeed0', 'bonus/', true); + this.loadImage('bonusSpeed1', 'bonus/', true); + this.loadImage('bonusSpeed2', 'bonus/', true); + + this.loadSprite('playLetter', 550, 150, 'buttons/'); + this.loadSprite('cancel', 550, 150, 'buttons/'); + this.loadSprite('add', 550, 150, 'buttons/'); + this.loadSprite('home', 550, 150, 'buttons/'); + this.loadSprite('next', 550, 150, 'buttons/'); + this.loadSprite('retry', 550, 150, 'buttons/'); + + this.loadSprite('duel', 269, 262, 'buttons/'); + this.loadSprite('last', 269, 262, 'buttons/'); + this.loadSprite('team', 269, 262, 'buttons/'); + this.loadSprite('flag', 269, 262, 'buttons/'); + this.loadSprite('map', 269, 262, 'buttons/'); + + this.loadSprite('play', 100, 100, 'buttons/'); + this.loadSprite('bin', 100, 100, 'buttons/'); + this.loadSprite('plus', 100, 100, 'buttons/'); + this.loadSprite('pencil', 100, 100, 'buttons/'); + this.loadSprite('speed', 100, 100, 'buttons/'); + this.loadSprite('mute', 100, 100, 'buttons/'); + this.loadSprite('back', 200, 200, 'buttons/'); + + this.loadSprite('shortRange', 300, 150, 'buttons/'); + this.loadSprite('mediumRange', 300, 150, 'buttons/'); + this.loadSprite('longRange', 300, 150, 'buttons/'); + + this.loadSprite('shield0', 300, 150, 'buttons/'); + this.loadSprite('shield33', 300, 150, 'buttons/'); + this.loadSprite('shield66', 300, 150, 'buttons/'); + this.loadSprite('shield100', 300, 150, 'buttons/'); + + this.loadSprite('myself', 300, 150, 'buttons/'); + this.loadSprite('enemyBot', 300, 150, 'buttons/'); + this.loadSprite('bonus', 300, 150, 'buttons/'); + + this.loadSprite('moveToward', 300, 150, 'buttons/'); + this.loadSprite('fleeFrom', 300, 150, 'buttons/'); + + this.loadSprite('attackNode', 180, 190, 'nodes/', true); + this.loadSprite('moveNode', 180, 190, 'nodes/', true); + this.loadSprite('conditionNode', 180, 190, 'nodes/', true); + + + this.loadImage('background'); + this.loadImage('bullet'); + this.loadImage('logoWaria'); + this.loadImage('attack', 'nodes/', true); + this.loadImage('move', 'nodes/', true); + this.loadImage('condition', 'nodes/', true); + } + + loadSprite(name, width, height, folder = '', force = false) { + this.deleteLoad(name); + if (force) { + this.load.spritesheet(name, 'assets/' + folder + name + '.png', { + frameWidth: width, + frameHeight: height + }); + } else { + this.load.spritesheet(name, 'assets/' + LANG + '/' + folder + name + '.png', { + frameWidth: width, + frameHeight: height + }); + } + } + + loadImage(name, folder = '', force = false) { + this.deleteLoad(name); + if (force) { + this.load.image(name, 'assets/' + folder + name + '.png'); + } else { + this.load.image(name, 'assets/' + LANG + '/' + folder + name + '.png'); + } + } + + deleteLoad(name) { + if (this.textures.exists(name)) { + this.textures.remove(name); + } + } +} \ No newline at end of file diff --git a/Code/src/js/level2/PlusNode.js b/Code/src/js/level2/PlusNode.js index 380cd22..2469db4 100644 --- a/Code/src/js/level2/PlusNode.js +++ b/Code/src/js/level2/PlusNode.js @@ -18,7 +18,7 @@ class PlusNode extends Phaser.Scene { let y = HEIGHT_WINDOW / 2; let diffX = WIDTH_WINDOW / 3; let diffY = HEIGHT_WINDOW / 10; - let sizeText = diffY; + let sizeText = diffY / 1.5; let style = {font: sizeText.toString() + 'px stencil', fill: "#e2e2e2"}; diff --git a/Code/src/js/level2/RectangleNode.js b/Code/src/js/level2/RectangleNode.js index 3d3b593..12c4b61 100644 --- a/Code/src/js/level2/RectangleNode.js +++ b/Code/src/js/level2/RectangleNode.js @@ -28,6 +28,7 @@ class RectangleNode { this.lRect = []; this.scene = scene; this.scene.add.existing(this.rect); + this.scene.input.setDraggable(this.rect); break; default: console.log("Création d'un node echoué"); @@ -99,7 +100,7 @@ class RectangleNode { this.updateLine(true); } - updateLine(force) { + updateLine(force = false) { if ((force === true || this.xLine !== this.rect.x || this.yLine !== this.rect.y) && this.line !== undefined) { this.xLine = this.rect.x; this.yLine = this.rect.y; @@ -116,14 +117,23 @@ class RectangleNode { node.setLine(this.rect.x, this.rect.y + this.rect.displayHeight * 0.9); } + getNode() { + if (this.canAddNode) { + this.node.clearNodes(); + this.lRect.forEach(rect => this.node.addNode(rect.node)); + console.log(this); + } + return this.node; + } + getNodes() { if (this.node === undefined) { let lNodes = []; this.lRect.forEach(function (element) { if (element.node !== undefined) { - if (element.lRect !== undefined) { + if (element.canAddNode) { element.node.clearNodes(); - element.lRect.forEach(rect => element.node.addNode(rect.node)); + element.lRect.forEach(rect => element.node.addNode(rect.getNode())); } lNodes.push(element.node); } @@ -133,6 +143,17 @@ class RectangleNode { } + sort(sortDesc) { + if (this.canAddNode) { + this.lRect.sort(sortDesc); + this.lRect.forEach(function (element) { + if (element.canAddNode) { + element.sort(sortDesc); + } + }) + } + } + destroy() { this.line.destroy(); this.rect.destroy(); diff --git a/Code/src/js/level2/Robot.js b/Code/src/js/level2/Robot.js index 45cdf27..26dd715 100644 --- a/Code/src/js/level2/Robot.js +++ b/Code/src/js/level2/Robot.js @@ -94,7 +94,7 @@ class Robot { } advanceTo(target) { - if (this.target.x !== this.x || this.target.y !== this.y) { + if (target.x !== this.x || target.y !== this.y) { let x = false; let y = false; let velocity = this.getVelocity(target); diff --git a/Code/src/js/level2/Type.js b/Code/src/js/level2/Type.js index a06d3f3..1f65780 100644 --- a/Code/src/js/level2/Type.js +++ b/Code/src/js/level2/Type.js @@ -1,13 +1,13 @@ -class Type extends Phaser.Scene { +class Type extends ManageLang { constructor(father) { - super('Type'); - this.father = father; + super('Type', father); } preload() { } create() { + super.create(); let style = {font: '200px stencil', fill: "#e2e2e2"}; this.add.text(WIDTH_WINDOW / 2, HEIGHT_WINDOW / 4, "WARIA", style).setOrigin(0.5, 1); diff --git a/Code/src/js/level3/AddNode.js b/Code/src/js/level3/AddNode.js index 5ea8ccc..acb14bf 100644 --- a/Code/src/js/level3/AddNode.js +++ b/Code/src/js/level3/AddNode.js @@ -5,6 +5,9 @@ class AddNode extends Phaser.Scene { this.gameR = game; this.selected = selected; this.lCategory = []; + let sizeText = HEIGHT_WINDOW / 14; + this.style = {font: sizeText.toString() + 'px stencil', fill: "#e2e2e2"}; + this.heightButton = HEIGHT_WINDOW / 8; } create(son) { @@ -16,13 +19,13 @@ class AddNode extends Phaser.Scene { } - addButton(x, y, width, height, texture, category = new Category(), value) { - let btn = this.createButton(x, y, width, height, texture); + addButton(x, y, texture, category = new Category(), value) { + let btn = this.createButton(x, y, texture); btn.on('pointerdown', () => this.click(btn, category, value)); return btn; } - createButton(x, y, width, height, texture) { + createButton(x, y, texture, height = this.heightButton, width = null) { let btn = this.add.image(x, y, texture).setOrigin(0.5, 0.5).setInteractive(); btn.on('pointerover', () => btn.setFrame(1)); btn.on('pointerout', () => btn.setFrame(0)); @@ -51,18 +54,16 @@ class AddNode extends Phaser.Scene { } addTitle(x, y, title) { - let sizeText = HEIGHT_WINDOW / 12; - let style = {font: sizeText.toString() + 'px stencil', fill: "#e2e2e2"}; - this.add.text(x, y, title, style).setOrigin(0.5, 0.5); + this.add.text(x, y, title, this.style).setOrigin(0.5, 0.5); } createButtonCancel() { - this.createButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 15), null, HEIGHT_WINDOW / 9, 'cancel') + this.createButton(WIDTH_WINDOW / 3, HEIGHT_WINDOW / (16 / 15), 'cancel', HEIGHT_WINDOW / 9) .on('pointerdown', () => this.cancel()); } createButtonAdd(son) { - this.createButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 15), null, HEIGHT_WINDOW / 9, 'add') + this.createButton(WIDTH_WINDOW / 1.5, HEIGHT_WINDOW / (16 / 15), 'add', HEIGHT_WINDOW / 9) .on('pointerdown', () => son.addNode()); } diff --git a/Code/src/js/level3/ManageLang.js b/Code/src/js/level3/ManageLang.js new file mode 100644 index 0000000..556276d --- /dev/null +++ b/Code/src/js/level3/ManageLang.js @@ -0,0 +1,39 @@ +class ManageLang extends Phaser.Scene { + constructor(name, father) { + super(name); + this.name = name; + this.father = father; + this.otherScenes = []; + } + + addOtherScenes(name) { + this.otherScenes.push(name); + } + + create() { + this.createFlags(); + } + + createFlags() { + this.diffXFlag = 0; + this.createFlag('fr'); + this.createFlag('en'); + } + + createFlag(name) { + let flag = this.add.image(WIDTH_WINDOW - 10 - this.diffXFlag, 10, name).setOrigin(1, 0).setInteractive(); + flag.displayHeight = 40; + flag.scaleX = flag.scaleY; + this.diffXFlag = this.diffXFlag + flag.displayWidth + 10; + flag.on('pointerdown', () => this.setLang(name)); + } + + setLang(lang) { + if (lang !== LANG) { + LANG = lang; + this.father.scene.add('LoadFile', new LoadFile(this.father, this.name)); + this.father.scene.start('LoadFile'); + this.otherScenes.forEach(scene => this.father.scene.stop(scene)); + } + } +} \ No newline at end of file