diff --git a/assets/fr.json b/assets/fr.json
index 666d21d..38c9105 100644
--- a/assets/fr.json
+++ b/assets/fr.json
@@ -1 +1 @@
-{"locale":"unknown","translations":{"4894728399261164928":"Si vous aimez {$START_TAG_STRONG}EveryBoard{$CLOSE_TAG_STRONG}, suivez-nous !","6153797048311741939":"Paramètres utilisateurs","6838770899052870929":"Si vous avez oublié votre mot de passe ou souhaitez le changer, cliquez sur le bouton suivant :","1636934520301910285":"Réinitialiser le mot de passe","8403075591877274055":"Entrez votre message ici","2187377168518132372":"Soyez courtois","8447591012079458095":"Réduire le chat","3331424259701651496":"Afficher le chat ({$INTERPOLATION})","5112659486997490676":"pas de nouveau message","6373233342627633860":"1 nouveau message","5075342719298110640":"{$PH} nouveaux messages","1735231057781616406":"Nombre de colonnes : ","2821179408673282599":"Accueil","6017042194813294080":"Jouer en ligne","4190634170116728013":"Créer une partie","5801676690179723464":"Rejoindre une partie","2615338817912103674":"Jouer hors ligne","3468367367164457633":"Apprendre les règles","7164690325767499813":"{$INTERPOLATION} de {$INTERPOLATION_1}","172167399786281724":"{$INTERPOLATION} contre {$INTERPOLATION_1}","5678362140621139107":"{$INTERPOLATION} (en attente d'adversaire)","4930506384627295710":"Paramètres","4086606389696938932":"Compte","7507948636555938109":"Se déconnecter","2336550011721758066":"Connexion","4768749765465246664":"Email","1431416938026210429":"Mot de passe","4917036382252417719":"Se connecter avec Google","850080272338290812":"Pas de compte ?","2012659005494284050":"Mot de passe oublié ?","4371680625121499898":"Réinitialiser votre mot de passe","3301086086650990787":"Créer un compte","77522255637065336":"Erreur de connexion","6005801113696805305":"Le partie de revanche se charge. Veuillez attendre, cela ne devrait pas prendre longtemps.","6595008830732269870":"Page introuvable","4204327513039663989":"Cette page n'existe pas.","7017932994058745268":"Création d'une partie en ligne. Veuillez attendre, cela ne devrait pas prendre longtemps.","7680170577317084701":"Chercher un jeu","5561648955936795459":"Utilisez des mécaniques simples pour pousser 6 pièces adverses hors du plateau !","6379805581447060110":"Un jeu très simple, mais, saurez-vous gagner à chaque fois ?","5716165296000343717":"La version irlandaise de la famille de jeu Tafl ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","2776505193142258762":"Éliminez tous vos ennemis sur un plateau qui rapetisse petit à petit !","2248512434888126204":"Mettez deux de vos pièces sur la plateau à chaque tour, et soyez le premier à en aligner six !","1528017893097093154":"Cachez toutes vos pièces avant votre adversaire, ou risquez d'être découvert !","4487850967365387707":"Passez votre balle jusqu'à l'autre bout du plateau pour remporter la partie !","1337301714912876574":"Déposez vos pièces et déplacez les afin d'aligner deux pièces de la même couleur au travers du plateau pour gagner !","1207528295664437538":"Empilez vos pièces pour en contrôler un maximum et gagner !","7930050431770016664":"Un morpion amélioré où les pièces peuvent en encapsuler d'autres pour éviter la défaite.","8971165322320863634":"Un jeu inspiré de l'antiquité. Soyez le premier à percer les lignes adverses !","1787395418772268592":"Un jeu hexagonal d'alignement. Insérez vos pièces sur le plateau pour capturer les pièces de l'adversaire !","6676975125770922470":"Le plus vieux jeu de stratégie encore joué. Un jeu de contrôle de territoire","7267838821174516266":"Un jeu d'alignement hexagonal avec de drôles de \"diagonales\" !","4865500405661191388":"Vous contrôlez une colonie d'insectes. Utilisez les capacités de vos insectes pour bloquer la reine de votre adversaire afin de gagner !","3910056094130316471":"Votre but est simple : atteindre la dernière ligne. Mais la pièce que vous déplacez dépend du mouvement de votre adversaire !","8831529968086851272":"Cousin du jeu de Dame, capturez les pièces adverses, libérez les vôtres, et immobilisez l'adversaire pour gagner la partie !","8165475229121998889":"Regroupez vos pièces pour gagner. Mais les mouvements possibles changent constamment !","8346622786152147853":"Gagnez des points en capturant des pièces, mais en ne contrôlant que celles dans votre camp !","8186407897395128360":"Poussez et écrasez les pièces de votre adversaire en utilisant les forces magnétiques !","287142221400627248":"Le classique Puissance 4 !","7007940005713233193":"Posez une pièces, ensuite tournez un quadrant. Le premier à aligner 5 pièces gagne !","3362876946788995618":"Vous pouvez aligner 5 pièces pour gagner, ou vous pouvez aussi gagner en capturant 10 pièces de votre adversaire !","1621892382051781255":"Superposez vos pièces et utilisez deux mécaniques de jeux pour conserver vos pièces. Le premier joueur qui n'a plus de pièce perd !","3383193846061013912":"Faites un alignement gagnant. La difficulté : vous ne choisissez pas la pièce que vous placez !","7277920626199847666":"Dupliquez-vous pour conquérir le plateau !","3529667957993318888":"Alignez 5 de vos pièces sur un plateau dont les pièces glissent !","6046365494353024298":"Prenez en sandwich les pièces adverses pour dominer le plateau !","1827371853303540301":"Soyez le premier à immobiliser une pyramide de l'adversaire !","1409973335731836872":"Soyez le premier à pousser une montagne hors du plateau !","5737474371494262748":"Placez vos pièces hexagonales les unes à côté des autres et soyez le premier à créer une des trois formes requises pour gagner !","1177593339964527523":"La version lapone de la famille de jeux Tafl ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","6432141756227180076":"Alignez vos 4 pièces ou placez les en carré pour gagner !","265614119354246271":"Alignez 5 pièces de votre couleur en ligne droite, mais attention, les pièces peuvent s'empiler !","387599343584202424":"Une version du Go sur des cases triangulaires !","3778423604946977624":"Le jeu de plateau des Vikings ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","6188072401668860107":"Une version moderne du jeu de stratégie africain connu!","8852931932150400681":"Le plus répandu des jeux de la famille Mancala.","1675508830863089385":"Le plus répandu des jeux de la famille Mancala à plusieurs tours.","7926456268600574942":"Alignez vos pièces pour marquer des points, mais attention aux retournements de pièces !","3012694567108651369":"Cette valeur est obligatoire","4408456168772857996":"{$PH} est trop petit, le minimum est {$PH_1}","701935636628882602":"{$PH} est trop grand, le maximum est {$PH_1}","5607669932062416162":"Par défaut","2018922024247045709":"Largeur","7080802734755670775":"Graines par maison","1086558575410854374":"Nourrir la maison d'origine","1571603835358328677":"Nourrir est obligatoire","7654623560547531779":"Passer par le magasin","8576122948092687879":"Continuer la distribution après que la dernière graine soit tombée dans le magasin","356626260857129297":"Continuer la distribution jusqu'à une capture ou à une maison vide","9195784792324730674":"Le trône central est quitté définitivement","2524296888634788857":"Les bords sont l'ennemi du roi","2642196868516331796":"Le trône central peut encercler le roi","3540730147473795195":"Le roi loin du trône central peut être sandwiché","3329390039243374527":"L'envahisseur commence","3033623772164647792":"Hauteur","287623417167941506":"Handicap","6402320009813668873":"13 x 13","4066004856246691695":"9 x 9","718535138834335364":"Puissance 4","1525715186822490677":"Awalé","8844589419403065948":"Quarto","8322068603814456434":"Tablut","3244681266393689381":"Reversi","7297944290589265560":"Go","8208823537494951803":"Encapsule","4883858894354428469":"Siam","5046769358659448397":"Sahara","7602922439944541721":"Pylos","773015283188822187":"Kamisado","8323142856025602350":"Quixo","8191425615273627117":"Dvonn","7644192101130519142":"Epaminondas","5348930337239726346":"Nombre de rangées vides","7516610645583911732":"Nombre de rangées de soldats","2969677193390047071":"19 x 19","4541467181400942955":"Gipf","1147571728036986329":"Coerceo","3553471239341143775":"Six","240931235644942730":"Lines of Action","3574809577617204460":"Pentago","5816181883959997447":"Abalone","5094417734463136297":"Yinsh","4497962271113144657":"Apagos","947579386294731197":"Brandhub","4214831981215024999":"Conspirateurs","4371580300145721044":"Échecs Martiens","5306696079242551443":"Hnefatafl","692005285727565478":"Lasca","8745205959337703089":"Connect Six","7128132932954450153":"Pente","6202245590217996824":"Teeko","4321462166273172721":"Kalah","809030787784855848":"Diaballik","1493565703246564578":"Ba-awa","2597247746010343961":"Squarz","2686476818050661110":"Hexodia","6233664534580457703":"Trigo","1760292529513431093":"Trexo","6220801899147470326":"Hive","2246994058243837093":"Diam","3008721792091269753":"Lodestone","2218572265318708454":"Création de compte","9018459935889527317":"Un email de confirmation vous sera envoyé pour valider votre compte.","5248717555542428023":"Nom d'utilisateur","8783355485855708287":"Le mot de passe doit faire au moins 6 caractères","3412247232926911550":"Vous avez déjà un compte ?","2565164139557117651":"Réinitialisation de mot de passe","2687175749283802253":"Un email vous sera envoyé avec les instructions pour réinitialiser votre mot de passe.","6808826847039952270":"L'email a été envoyé, veuillez suivre les instructions qui s'y trouvent.","1519954996184640001":"Erreur","6535780676661833462":"Erreur lors de la création du compte","3204200407244124341":"Créer un compte avec Google","7656395805241225659":"Parties","5674286808255988565":"Créer","2299187798995800780":"Chat","4643591148728960560":"Jeu","3710582909570607859":"Premier joueur","4060021930998903329":"Deuxième joueur","8503767092684163333":"Tour","689957366051097321":"En attente d'adversaire","7103588127254721505":"Thème","2826581353496868063":"Langue","413116577994876478":"Clair","3892161059518616136":"Foncé","8940072639524140983":"L'email a été envoyé","141258547622133215":"Pour finaliser votre compte, vous devez choisir un nom d'utilisateur.","7631774219107043658":"Votre compte est maintenant finalisé, vous pouvez retourner à {$START_LINK}la liste des jeux{$CLOSE_LINK}.","293336831363270094":"Choisir un nom d'utilisateur","6996804354508674341":"Vérification du compte","2730621369346437278":"Pour finaliser votre compte, vous devez cliquer sur le lien qui a été envoyé sur votre adresse email ({$INTERPOLATION}). Cet email peut être arrivé dans vos spams.","4295852829952528556":"Après avoir vérifié votre email, clickez sur le bouton suivant :","881022283381326299":"Finaliser la vérification d'email","921630192161780240":"Si vous n'avez pas reçu d'email de vérification, cliquez sur le bouton suivant :","4592546836544908536":"Ré-envoyer l'email de vérification","3862672024084051383":"Vous n'avez pas vérifié votre email ! Cliquez sur le lien dans l'email de vérification.","2009811124619716606":"Créer un jeu en ligne","7868391487776969346":"Voir toutes les parties en ligne","8564202903947049539":"Jouer","6899134966533859260":"Apprendre","5723949445116321937":"EveryBoard","6808393327735679948":"EveryBoard est un site qui permet de jouer et d'apprendre les règles de nombreux jeux de stratégie combinatoire à information parfaite.{$LINE_BREAK} On comprend donc là dedans les jeux ne faisant intervenir ni hasard, ni agilité, ni informations cachées, et uniquement des jeux deux joueurs et tours par tours.","2129768251160483742":"Ce n'est pas votre tour !","443650994975920138":"Ce jeu ({$PH}) n'existe pas.","777716481777788338":"La partie que vous essayez de rejoindre n'existe pas.","7285945849261218681":"Cette partie est terminée.","7800061171704298797":"Humain","3795472118461355324":"Choisissez les options","3272612818120648715":"{$INTERPOLATION} points","8647687729200262691":"Match nul","2981217201452500939":"Commencer une nouvelle partie","342909021169073473":"Commencer avec cette configuration","960848013465225718":"Vous avez gagné","1041065984971815594":"Vous avez perdu","1836885699974320953":"{$PH} (Joueur {$PH_1}) a gagné","7464693809033181033":"L'IA a effectué un mouvement illégal ! C'est une situation inattendue dont nous avons pris note. Nous essayons de résoudre cela au plus vite. En attendant, considérez que vous avez gagné !","6267418979719843573":"Passer son tour","6128115494237258310":"Reprendre un coup","1944212987695444934":"Tour n°{$INTERPOLATION}","2993214884777755957":"Joueur {$INTERPOLATION}","5675185658977082941":"Joueur {$PH}","8487548203433588213":"{$PH} a gagné","5468318552081538104":"C'est à votre tour.","3724541577412345595":"C'est au tour de {$INTERPOLATION}","3492340771384313804":"Abandonner","5705819340084039896":"Proposer un match nul","1601597703777069856":"{$INTERPOLATION} a épuisé son temps. Vous avez gagné.","7814033294193818165":"Vous avez épuisé votre temps.","7003355968351203755":"Demander à reprendre un coup","4830863788651301313":"Vous avez accepté un match nul.","5730736324595001106":"Votre proposition de match nul a été acceptée.","5277703651684233917":"Un match nul a été convenu.","2826140657122926749":"Vous avez abandonné.","2324913504104154958":"{$INTERPOLATION} a épuisé son temps.","4624707315308487849":"Retour à la liste des parties","7250880851290385128":"{$INTERPOLATION} a abandonné.","7815479892408473764":"Vous avez gagné.","5096328327178345486":"05:00","4506170566742059239":"00:30","860662988722297223":"Vous avez perdu.","6165538570244502951":"Victoire de {$INTERPOLATION}.","4073116770334354573":"Blitz","3120304451891406993":"Durée maximale d'un tour : ","7590013429208346303":"Personnalisée","3154403333894623756":"Temps personnalisé","6773728044030876768":"Durée maximale d'une partie : {$START_TAG_STRONG}{$INTERPOLATION} par joueur{$CLOSE_TAG_STRONG}","1612262766071402559":"Proposer la configuration","6482290849972032593":"Annuler la partie","4247449258896721566":"Adversaires","2561597132169540579":"Les adversaires potentiels qui rejoignent la partie apparaîtront ici. Si personne n'arrive, vous pouvez :","1406698782162165226":"Chercher d'autres parties","5070629625537228486":"Jouer contre une IA","5056292777668083757":"Cliquez sur l'adversaire contre lequel vous souhaitez jouer.","594218318757354614":"Durée maximale d'une partie : {$START_TAG_OUTPUT}{$INTERPOLATION} par joueur{$CLOSE_TAG_OUTPUT}","8953033926734869941":"Nom","3193976279273491157":"Actions","8698515801873408462":"Sélectionner","326145407473587685":"Changer la configuration","9099721398759347967":"Proposition de configuration pour {$INTERPOLATION}","7416818230860591701":"Vous avez été choisi comme adversaire{$LINE_BREAK}{$INTERPOLATION} est en train de modifier la configuration.","6747612030990351046":"{$INTERPOLATION} propose de faire une partie {$INTERPOLATION_1}","3649232689954543597":"un tour dure maximum {$START_TAG_STRONG}{$INTERPOLATION}{$CLOSE_TAG_STRONG}","8496859383343230204":"vous jouez en premier","8194858011161710862":"le premier joueur est tiré au hasard","1012784993066568401":"Accepter et commencer","7852346564484185703":"la partie dure maximum {$START_TAG_STRONG}{$INTERPOLATION} par joueur{$CLOSE_TAG_STRONG}","7265061399015519876":"Un instant...","7215535622740824911":"{$INTERPOLATION} joue en premier","4218388977213486334":"{$INTERPOLATION} a proposé une configuration à {$INTERPOLATION_1}.","5068486659312004369":"{$INTERPOLATION} est en train de configurer la partie.","3923856758825729241":"Création d'une partie de {$INTERPOLATION}","7709161982270147002":"Premier joueur aléatoire","5246623381325349376":"Vous commencez","7738132709044699358":"{$INTERPOLATION} commence","4492847529610715272":"L'adversaire commence","8926567047186783072":"Temps standard","4412958068611913614":"personnalisée","4002042094548821129":"rapide","4301395065979241317":"standard","3852843717175527075":"La partie a été annulée !","3008420115644088420":"Configuration","7137133530752645682":"{$PH} a quitté la partie, veuillez choisir un autre adversaire.","6594123400599013490":"Étape finie !","5395533573244657143":"Cette étape n'attends pas de mouvements de votre part.","7583363829279229518":"Félicitations, vous avez fini le tutoriel.","1930146585049479552":"Vous ne pouvez pas cliquer, ceci est une démo.","2201596715619103633":"Vous ne pouvez pas déplacer de pièce porteuse.","6439401135646542284":"Échec","6650633628037596693":"Essayez à nouveau","8720977247725652816":"Vu","6962699013778688473":"Continuer","4563965495368336177":"Passer","7757774343229747209":"Jouer localement","6620520011512200697":"Voir la solution","2467835697178117742":"Vous ne pouvez pas déplacer plus de {$PH} de vos pièces !","4278049889323552316":"Vous n'avez pas assez de pièce pour pousser ce groupe !","8378144418238149992":"Vous ne pouvez pas pousser cette/ces pièce(s) car elle est bloquée par l'une des vôtres !","7864006988432394989":"Cette ligne contient des pièces de l'adversaire ou des cases vides, ceci est interdit.","507376328570453826":"Ce mouvement est impossible, certaines case d'atterrissage sont occupées.","6088417909306773667":"Cette case n'est pas alignée avec la ligne actuellement formée.","7060616157443124451":"Nombre de pièces à capturer pour gagner","1103013531201615772":"Taille maximale d'un groupe poussant","8893431763975992974":"Plateau initial et but du jeu","4780631467843839550":"Configuration des règles","5878048397926852057":"À l'Abalone, le but du jeu est d'être le premier joueur à pousser 6 pièces adverses en dehors du plateau. Voyons voir comment !","4612562967450553112":"Déplacer une pièce","5190193689067477069":"Chaque tour, déplacez une, deux ou trois pièces, soit le long de leur alignement, soit par un pas de côté. Pour vos déplacement vous avez donc au maximum à choisir parmi 6 directions. Les trois pièces à déplacer doivent être alignées et immédiatement voisines et atterrir sur des cases vides (sauf pour pousser, ce que nous verrons plus tard). Pour effectuer un déplacement, cliquez sur une de vos pièces, puis cliquez sur une flèche pour choisir sa direction.
Vous jouez Foncé, faites n'importe quel mouvement !","3762527362373672599":"Bravo !","272253201636921624":"Pousser","2330775081318125963":"Pour pousser une pièce de l'adversaire, vous devez déplacer au moins deux de vos pièces. Pour pousser deux pièces, vous devez déplacer trois de vos pièces. Si une de vos pièces est placée juste après une pièce adverse que vous poussez, pousser sera alors interdit. Vous ne pouvez pas déplacer plus de trois pièces.
Une seule \"poussée\" vers la droite est possible ici, trouvez la (vous jouez Foncé).","1578933364998292635":"Pour faire une translation d'un groupe de pièces, vous devez sélectionner la première pièce, puis sélectionner la dernière, puis cliquer sur une des 4 directions latérales dans laquelle le groupe peut bouger sans toucher de pièces adverses.
Allez-y, faites une translation.","3110387991397245428":"Ceci n'est pas une translation, c'est une poussée, essayez une translation.","4948237861189298097":"Bravo ! Vous savez tout ce qu'il faut pour commencer une partie !","2565981183757255753":"Vous verrez en créant votre première partie, que vous pouvez configurer deux choses.
Premièrement, le nombre de captures nécessaires pour gagner. La valeur par défaut est 6, la changer permet de changer la durée des parties.
Dernièrement, la taille maximale d'un groupe déplacé. Cette valeur et à 3 par défaut, mais si vous voulez une partie plus chaotique et amusante, vous pouvez augmenter ce nombre et jouer une version alternative plus \"puissante\" !
","4382056880714150954":"Les pièces ne peuvent se déplacer que vers le bas !","6303549979055320494":"Cette case est déjà complète, vous ne pouvez pas y ajouter une pièce !","4038709557650879610":"Vous n'avez plus de pièces dans cette case, choisissez-en une qui contient au moins une de vos pièces !","7840393692836937676":"Il ne reste plus de pièces de cette couleur à poser !","139135108801629927":"Il n'y a pas de transfert possible pour cette case !","8322338146903087210":"À Apagos, il y a 4 cases, chacune contient un nombre fixe d'emplacements pouvant contenir des pièces. Chaque joueur commence avec 10 pièces. Les pièces foncées appartiennent au premier joueur, les claires aux deuxième. Le jeu fini quand personne ne sais jouer. Le joueur possédant le plus de pièce dans la case la plus à droite gagne !","4304656288372447065":"Pose","4169063394256604189":"Un des deux types de coup est la pose. Pour en faire une, vous devez cliquer sur une flèche, qu'elle soit de votre couleur ou de celle de l'adversaire. Si la case choisie est l'une des trois les plus à gauche, elle échangera sa place avec celle juste à sa droite.
Vous jouez Clair. Posez une pièce sur l'une de ces trois cases.","8402696305361715603":"Transfert","1035614445063065926":"L'autre type de mouvement est le transfert.
Choisissez une de vos pièces sur le plateau en cliquant sur la case qui la contient ;
Choisissez sa destination en cliquant sur la flèche au dessus de celle-ci pour finir le transfert.
Cela peut seulement être fait avec une de vos pièces, d'une case à une autre case plus basse.
Vous jouez Foncé, faites un transfert!","2553091915151695430":"Ce coup est une pose ! Veuillez faire un transfert !","4189334243342030215":"Vous devez égréner une maison qui n'est pas vide.","8846202449877054997":"Vous devez nourrir mais ne le faites pas.","6065363643959580719":"Info bonus : Kalah a été crée aux U.S.A en 1940 par William Julius Champion Jr.","3167543473532430011":"Le Kalah","3586015705184533702":"Les maisons à l'extrême gauche et droite, non alignées avec les autres, sont les Kalah, le vôtre est à gauche, celui de l'adversaire à droite. Quand vous distribuez, avant de passer de votre maison la plus à gauche à la maison la plus à gauche de l'adversaire, vous devez déposer une graine dans votre Kalah. Mais vous ne devrez pas distribuer dans le Kalah adverse. Quand vous capturez, les graines sont déposées dans votre Kalah.
Vous jouez Foncé. Faites un mouvement qui passe par votre Kalah puis par les maisons adverses.","108833396164233870":"Voilà, trois maisons on été remplies en plus de votre Kalah.","7327320572157893918":"Raté. Distribuez une des trois maisons du bas les plus à gauche.","5657099545651336771":"Quand votre distribution finit dans le Kalah, vous êtes autorisé à distribuer à nouveau.
Vous jouez Foncé, faites la distribution qui termine dans votre Kalah, puis une seconde distribution !","1468463450299215954":"Ce coup ne distribue qu'une seule maison, faites une distribution qui finit dans le Kalah puis une deuxième !","723370864893318309":"Quand votre dernière graine finit dans une de vos maisons vides, si la maison en face est remplie, alors vous capturez le graines de ces deux maisons. Sur ce plateau, c'est faisable.
Vous jouez Foncé, faites une capture !","1044092391656953455":"Vous n'avez pas capturé, réessayez !","960197745594900358":"À n'importe quel moment, si un joueur a plus de 24 graines dans son Kalah, il gagne. Cela peut arriver avant que le plateau soit vide, mais, il y a un autre moyen. Quand vous n'avez plus aucune graine dans vos maison, le jeu s'arrête et votre adversaire prends toutes les graines restantes de ses maisons. Ici, votre adversaire n'a besoin que d'un point en plus pour gagner, et il l'aura au prochain tour si vous ne faites rien.
Vous jouez Foncé, gagnez !","7013769989797891949":"Puisqu'il n'y a plus de graines dans les maisons adverses, vous avez capturé toutes vos graines. Félicitations, vous avez gagné !","902849596357033257":"Raté, vous avez donné un graine à l'adversaire ! Réessayez !","2949583224863920715":"Égrénage","8108647656025671310":"Le mouvement principal aux mancalas est la distribution. Voyons voir comment les graines sont distribuées. Vous jouez Foncé, les 6 maisons du bas sont les vôtres.
Quand vous distribuez une maison, les graines qu'elle contient sont égrenées dans le sens horaire, une graine par maison.
Cliquez sur la maison la plus à droite !","8909995708712093055":"Voilà, regardez les 4 maisons suivant la maison choisie dans le sens horaire, elle comptent maintenant une graine en plus. C’est comme cela que les graines se distribuent, une à une à partir de la maison suivante dans le sens horaire depuis la maison d’où elles viennent.","8587148937080588417":"Raté. Distribuez la maison en bas à droite.","8109801868756013772":"Gros égrénage","6143584678937647226":"Quand il y a assez de graines pour faire un tour complet, quelque chose d’autre se passe.
Vous jouez Foncé. Distribuez la maison qui contient 12 graines.","498712253814253582":"Voyez, la maison distribuée n’a pas été reremplie et la distribution a continué immédiatement à la maison suivante (qui contient donc deux graines) !","6009621890963077533":"Capture simple","8492785011380422172":"Après une distribution, si la dernière graine tombe dans une maison du camp adverse et qu'il y a maintenant deux ou trois graines dans cette maison, le joueur capture ces deux ou trois graines.
Vous jouez Foncé, faites une capture !","1449179615423109818":"Bravo ! Il s'agissait ici d'une capture simple, voyons maintenant une capture composée.","9012344731580734627":"Raté. Vous n'avez rien capturé. Essayez à nouveau.","3104604410220998192":"Capture composée","4514452777310919130":"En distribuant la maison la plus à gauche, vous terminerez dans la deuxième maison la plus à gauche, qui en contient maintenant 2, donc ce sera une capture. Mais maintenant, la maison juste à gauche en contient 3, ce qui est également capturable, donc cette maison sera capturée aussi !
Vous jouez Foncé, faites une capture !","830087202472977218":"Bravo, vous gagnez 3 points dans la première maison plus 2 dans la seconde !","7123653594948067002":"Score","7183112140529419891":"MCTS","437214181691581058":"Capture interrompue","7194484246142571256":"En cliquant sur votre maison la plus à gauche, vous atterrissez sur la 3ème maison, qui est capturable.
Vous jouez Foncé, faites une capture !","2820925339032006267":"Constatez que la 2ème maison n’étant pas capturable, la capture a été interrompue et vous n’avez pas pu capturer la 1ère maison.","5352377142224231024":"Capture chez l'adversaire uniquement","8733312107623328684":"Vous jouez Foncé. Essayez de capturer les deux maisons les plus à gauche de l’adversaire.","1347673606182808434":"Bravo ! Constatez que la capture s'est interrompue en arrivant dans votre territoire car on ne peut pas capturer ses propres maisons !","7890197140479173967":"Vous n'avez capturé qu'une seule maison, recommencez !","2796272222228002710":"Ne pas affamer","4974882008918401392":"Vous avez une très belle capture qui semble possible. Il semble que vous puissiez capturer tous les pions de l’adversaire !
Vous jouez Foncé. Lancez-vous !","2671440213973633925":"Malheureusement, vous ne pouvez pas capturer, car sinon l’adversaire ne pourrait pas jouer après vous. À ces moments là, le mouvement est autorisé mais la capture n’est pas effectuée !","6033788914683606777":"Nourrir est obligatoire","1521992636044776742":"\"Affamer\" est interdit, c'est-à-dire que si votre adversaire n'a plus de graines et que vous savez lui en donner au moins une, vous êtes obligé de le faire.
\n Vous jouez Foncé. Donnez une graine à votre adversaire !","6607296153653792913":"Bravo ! Notez que vous pouvez choisir de lui en donner le moins possible si cela vous arrange mieux. C’est souvent un bon moyen d’avoir des captures faciles !","2281492801612237310":"Fin de partie","6064716171153653290":"Une partie est gagnée dès qu’un des deux joueurs a capturé 25 graines, car il a plus de la moitié de leur total.
Vous jouez Foncé, distribuez la maison la plus à gauche.","4966070806582905191":"Aussi, dès qu'un joueur ne peut plus jouer, l’autre joueur capture toutes les graines dans son propre camp. Ici, c'était à vous de jouer et au joueur suivant de récolter toutes les graines restantes, en mettant ainsi fin à la partie.","6243517581301426418":"Partager les graines finales équitablement","796568684338354748":"Ba-awa équitable","6179314931812970793":"Info bonus: Ba-awa, aussi appellé Adi, est joué principalement au Ghana.","2932513123180634807":"Distribution à plusieur tours","1218183221112518220":"Cependant, la distribution ne s'arrête que quand la dernière graine est déposée dans une maison qui contient (avant déposage) zéro ou trois graines.
Vous jouez Foncé, faites un mouvement comme cela !","4875172921761216929":"Donc, après atterissage dans la maison avec 2 graines (puis 3), un second tour a commencé.","6145120372687543421":"Captures pendant la distribution","3249311152250368197":"Si, durant une distribution, vous passez pas une de vos maison qui contient 3 graines, et déposez une quatrième graine, vous capturez la maison immédiatement, puis continuez la distribution !
Vous jouez Foncé, faites un tel mouvement !","9198664076697170304":"Félicitations, vous capturez 4 graines.","5715964665371191258":"Si, durant une distribution, vous passez pas une maison de l'adversaire qui contient 3 graines, et déposez une quatrième, l'adversaire capture la maison immédiatement, pendant que vous continuez la distribution.
Vous jouez Foncé, faites un tel mouvement !","1192652665972488441":"VOilà, l'adversaire a capturé 4 graines.","4239012084263051063":"Cependant, si votre dernière graine est déposée dans une maison de l'adversaire qui contient 3 graines (4 avec votre graine), vous capturez immédiatement la maison !
Vous jouez Foncé, faites un tel mouvement !","3868200086323207176":"À la fin d'un tour, si le nombre total de graines tombe à 8 ou moins, le premier joueur (Foncé) capture les graines restantes.
Vous jouez Foncé, terminez le jeu en capturant !","2821967115826330186":"Voilà, vous capturez toutes les graines restantes.","8840015526202664476":"Vous devez distribuer une de vos maisons.","6011590532570079359":"Votre pion doit atterrir sur l'un des six triangles les plus proches de même couleur que la case sur laquelle il est.","117738177627572036":"Vous n'avez pas assez de tuiles à échanger pour capturer cette pièce. Choisissez une de vos pièces et déplacez-la.","6928762188180587282":"Votre premier clic doit être sur une de vos pièce pour la déplacer, ou sur une pièce de l'adversaire pour l'échanger contre deux tuiles.","7341385722923686160":"Vous ne pouvez pas capturer sur une case vide.","5853742640794164153":"Utiliser un petit plateau","1137390440747939689":"Vous ne pouvez pas capturer vos propres pièces.","8275758037847807394":"Le Coerceo se joue sur un plateau comme ceci, composé de tuiles hexagonales, comportant chacune 6 triangles. Les triangles sont les cases où les pièces se déplacent tout le long de la partie. Les tuiles sont séparable du reste du plateau (vous verrez comment plus tard). Les pièces foncées appartiennent au premier joueur et ne se déplaceront toute la partie que sur les cases foncées, les pièces claire appartiennent au second joueur et ne se déplaceront également que sur les cases claires. Le but du jeu au Coerceo est de capturer toutes les pièces de l'adversaire.","2354817630223808522":"Deplacement","9151826160725505568":"Pour effectuer un déplacement, il faut :\n \n
Cliquer sur l'une de vos pièces.
\n
Cliquer sur l'une des cases triangulaires encadrées en jaune.
\n \n Vous pouvez passer à travers les pièces adverses.
\n Vous jouez en premier, vous jouez donc Foncé, faites n'importe quel déplacement.","3313068005460528101":"Bravo, voyons ensuite les captures.","5216257512116603462":"Captures","4864789526486078372":"Chaque pièce a trois cases triangulaires voisines (2 sur les bords).\n Quand toutes les cases voisines sauf une sont occupées, et qu'une pièce de l'adversaire vient se déplacer sur cette dernière case libre, votre pièce est capturée !\n Cependant, il est possible pour un joueur de se placer entre 3 pièces adverses (ou 2 contre un bord) sans être capturé.
\n Vous jouez Clair, effectuez une capture","1766583918856668821":"Raté, vous n'avez pas capturé de pièce !","8225905705628695723":"Gagner une tuile","9136644118167529369":"Quand une tuile est quittée, elle devient potentiellement enlevable du plateau.\n Pour qu'elle soit enlevée, il faut qu'au moins trois de ses bords soient libres, et qu'ils soient l'un à côté de l'autre.\n Notez que si une tuile vide et voisine d'une tuile qu'on vient de retirer devient retirable, elle sera retirée.\n Par exemple, ci-dessous, en quittant sa tuile le pion foncé le plus haut ne déconnectera pas celle-ci !\n Mais en quittant la tuile en bas à gauche, deux tuiles seront enlevées.
\n Vous jouez Foncé, effectuez un mouvement pour récupérer deux tuiles.","7294424193498666339":"Raté, vous n'avez pas récupérer les deux tuiles que vous pouviez, essayez à nouveau !","1625619525907045191":"Échanger une tuile","7295193204515268317":"Dès que vous avez au moins une tuile, vous pourrez le voir sur la gauche du plateau.\n Dès que vous en avez deux, vous pouvez, en cliquant sur une pièce adverse, la capturer immédiatement au lieu de déplacer une de vos pièces.\n Cet action vous coûtera deux tuiles.\n Si une ou plusieurs tuile sont retirées pendant ce tour, personne ne les récupérera.
\n Vous jouez Clair, gagnez du temps et capturez directement la dernière pièce adverse !","6149833006202189547":"C'est bien gentil de se déplacer mais en cliquant sur la pièce vous l'aurez immédiatement !","4449916170244566677":"Capture spéciale","8878891269019803":"Dès qu'une tuile est enlevée du plateau pendant votre tour, certaines pièces de l'adversaire peuvent n'avoir plus aucune case voisine libre, elle seront alors capturées !\n Si cela arrivait à l'une de vos pièces, celle-ci resterait cependant sur le plateau.
\n Un coup démontrant ces deux choses est faisable pour le joueur clair, faites-le !","710072872152309867":"Bravo ! Voyez, votre pièce n'a plus de case voisine libre après avoir récupéré la tuile, mais est restée car c'était votre tour.\n Celle de l'adversaire a disparu car la capture de la tuile lui a enlevé sa dernière case voisine libre !","8182472154276317003":"Pièces > Menaces > Tuiles","7668715639068435496":"Captures > Libertés","4996962520612005595":"Pièces > Tuiles > Libertés","8560978883976627945":"Alignement","1631778170068001983":"Connect Six se joue sur un plateau de 19x19, sur lequel des pièces sont placées sur les intersections. Le but du jeu est d'aligner six de vos pièces.","4094188563872795571":"Premier tour","3956994434107981140":"Au premier tour, le premier joueur place une seule pièce.
Vous jouez Foncé, placez votre première pièce en cliquant sur une intersection.","9212980897131132135":"Les tours suivant","4174912343371620775":"Pour tous les tours qui suivent, les joueurs placent deux pièces.
Vous jouez Clair, faites le mouvement gagnant.","4237198021995785268":"Votre pièce doit atterrir sur la case voisine.","6331318865941875967":"Vous ne pouvez pas déposer une pièce pendant la phase de déplacement.","1634970085488730747":"Vous ne pouvez pas déplacer une pièce avant que les deux joueurs n'aient déposés toutes leurs pièces.","320724128460521577":"Un saut doit se faire au dessus d'une pièce, pas au dessus d'une case vide.","6834108574871302489":"Vous devez déposer votre pièce dans la zone centrale du plateau.","8451838259581996755":"Un saut doit atterrir à deux cases de sa position initiale, et doit être en ligne droite dans n'importe quelle direction.","309495911608325428":"Vous passez deux fois par la même case dans votre mouvement. Ce n'est pas autorisé.","4649711232397678200":"Sauts","2678466693137107679":"Conspirateurs se joue sur un plateau 17x17. Le but du jeu et de placer toutes vos pièces dans des cachettes, qui sont des cases spéciales sur les bords du plateau. Remarquez la zone centrale du plateau, où chaque joueur placera initialement ses pièces.","5390926924373994130":"Phase initiale","3249808638587981433":"Dans la phase initiale du jeu, chaque joueur dépose ses 20 pièces, une à chaque tour, dans la zone centrale du plateau. Cette phase n'autorise aucun autre mouvement.
Vous jouez Foncé, déposez l'une de vos pièces dans la zone centrale.","6144661124534225012":"Mouvement simple","8533679028139934991":"Une fois que toutes les pièces ont été placées, deux types de déplacements peuvent être effectués. Le premier est un déplacement simple dans n'importe quelle direction, orthogonale ou diagonale, d'une distance de un.
Vous jouez Foncé. Cliquez sur l'une de vos pièces pour effectuer un tel mouvement.","2743282536649096025":"Vous avez effectué un saut, et non un déplacement simple. Essayez à nouveau !","5311709353029708811":"Sauts","2921068171153120605":"L'autre type de mouvement est le saut. Une pièce peut sauter au dessus d'une pièce voisine dans n'importe quelle direction, tant qu'elle atterri directement sur la case après celle-ci, dans la même direction.
Vous jouez Foncé. Effectuez un saut en cliquant sur l'une de vos pièces qui peut sauter, et ensuite sur la case de destination. Il est possible que vous deviez cliquer une seconde fois sur la case destination pour confirmer votre saut, si votre pièce est toujours entourée (nous verrons ensuite pourquoi cela est utile).","7444294966169001535":"Vous n'avez pas effectué un saut. Essayez à nouveau !","2724052802065983013":"Vous ne pouvez pas déplacer la pièce qui tient la balle.","5364606037550605842":"Vous devez déplacer la pièce d'exactement une case orthogonalement.","2737840191812588251":"Le chemin de cette passe est obstrué.","6962674839842537174":"Une passe doit être faite le long d'une ligne droite, orthogonalement ou verticalement.","7841459528155785625":"Vous ne pouvez faire qu'une seule passe par tour.","898651979160418937":"Vous ne pouvez faire que deux translations par tour, pas trois.","2023900957694052396":"Vous ne pouvez pas passer la balle à l'adversaire. Vous devez choisir une de vos pièces.","6598638598311685089":"Le but à Diaballik est d'amener votre balle, représentée par le petit cercle, du côté adverse (c'est-à-dire, là où ses pièces se situent initialement). La balle est actuellement détenue par votre pièce centrale.","488799603315113699":"Translations","1549947696122814495":"Durant un tour, vous êtes autorisés à faire jusque trois actions, qui incluent au plus deux translations. Une translations est un déplacement orthogonal d'une pièce qui ne tient pas la balle.
Déplacez votre pièce la plus à gauche d'une case. Une fois que vous avez fait cela, cliquez sur le bouton vert qui apparaîtra en bas à drote du plateau, afin d'indiquer que vous avez fini votre tour.","4552397654536129176":"Passer","4859534391622035346":"Une autre action que vous pouvez faire, pas plus d'une fois par tour, est une passe. Vous pouvez passer la balle en cliquant sur la pièce qui tient balle, ensuite sur une autre de vos pièce qui peut la recevoir. Une passe doit être faite le long d'une ligne droite non obstruée.
Ici, en jouant Foncé, vous pouvez faire deux translations et une passe afin de gagner la partie, faites-le !","351600669711653781":"Bloquer l'adversaire","5111602140043708281":"Il y a une règle spéciale contre l'anti-jeu. Si un joueur forme une ligne contiguë, avec une pièce dans chaque colonne, il empêche l'adversaire d'atteindre sa ligne de victoire. Si l'adversaire est en contact avec trois pièces dans un tel cas, cette personne gagne immédiatement la partie.
Ici, en jouant Clair, votre opposant vous bloque et est déjà en contact avec deux de vos pièces. Si vous pouvez le toucher avec une troisième pièce, vous gagnez. Faites-le !","6691085433163106876":"Tous les mouvements","8328626778107972059":"MCTS (3 seulement)","2268888865744326832":"MCTS (pas de duplications)","5930186357813280917":"MCTS (3, pas de duplication)","1337900792840930042":"Distance ({$PH})","514608014907395319":"Enchaîner les sauts en un seul mouvement","2017314282165555162":"Les sauts peuvent être enchaînés quand c'est possible. Vous pouvez décider s'il faut continuer un saut où l'arrêter à tout moment. Pour finir un saut, cliquez une seconde fois sur votre pièce. Sinon, continuez simplement à cliquer sur la case suivante. Une fois qu'il n'est plus possible de continuer à sauter, votre déplacement se termine sans avoir besoin de cliquer sur votre pièce une seconde fois.
Vous jouez Foncé et vous pouvez effectuer un triple saut ! Faites-le.","7823212119691946554":"Bravo ! Vous savez maintenant tout ce qu'il faut pour jouer à ce jeu. Souvenez-vous: pour gagner, vous devez placer toutes vos pièces à l'abri avant votre adversaire.","5361555826660205972":"Vous n'avez pas effectué un triple saut. Essayez à nouveau !","3460005588993308010":"Vous n'avez plus de pièces de ce type.","1718016291859374582":"Vous ne pouvez pas jouer ici : cette case est déjà pleine.","8802049007421476454":"Vous ne pouvez pas ajouter de pièces dans la case ciblée, car elle contiendrait plus de 4 pièces.","3031759944936090505":"Pour déplacer des pièces du plateau, vous devez les déplacer sur une case voisine.","290467566247457693":"Vous devez d'abord sélectionner une pièce hors du plateau, ou une pièce étant sur une case du plateau pour la déplacer.","354630056284498570":"Plateau initial et pièces des joueurs","8818359317795688141":"Le plateau de Diam est un plateau circulaire composé de 8 cases. Chaque joueur possède 8 pièces : 4 d'une couleur, et 4 d'une autre couleur. Initialement, le plateau est vide. Toutes les pièces restantes sont montrées sur les côté du plateau : les pièces de Foncé sur la gauche, les pièces de Clair sur la droite.","6692453785979358274":"À Diam, le but est d'aligner deux de vos pièces, ayant exactement la même couleurs, sur des cases diamétralement opposées, au dessus d'au moins une pièce. Notez qu'ici, Foncé ne gagne pas car ses pièces ne sont pas au dessus d'une autre pièce. Vous jouez Clair. Ici, vous pouvez gagner en déposant une de vos pièces dans la case la plus à gauche. Vous pouvez le faire en cliquant sur la pièce correspondante à côté du plateau, et ensuite sur la case où vous souhaitez déposer votre pièce.
Vous jouez Clair, gagnez la partie !","6480264860477304836":"Raté, vous devez déposer votre pièce sur la case la plus à gauche, en utilisant la pièce de la même couleur que celle que vous avez déjà sur le plateau.","9079191930805040030":"Types de mouvements","357682192015415742":"Vous pouvez effectuer deux types de mouvement : soit déposer une de vos pièces comme vous l'avez fait à l'étape précédente, soit déplacer une de vos pièces sur le plateau, sur une case voisine. Vous pouvez choisir n'importe laquelle de vos pièces, même s'il y a déjà d'autres pièces au dessus. Une seule condition s'applique : ne pas créer une pile de plus de 4 pièces. Quand vous sélectionnez une pièce avec d'autres dessus, toutes les autres pièces se déplacent avec la votre.
Vous jouez Foncé, essayez de déplacer une de vos pièces déjà sur le plateau.","4809034034760688818":"Raté, essayez de déplacer une de vos pièces qui se situe déjà sur le plateau.","8650632621721803918":"Cas spécial","62569781199384353":"Il peut arriver que lors d'un tour, les deux joueurs se retrouvent avec des pièces alignées pour la victoire. Si c'est le cas, le joueur avec l'alignement le plus élevé gagne.
Ici, en jouant Foncé, vous pouvez gagner en effectuant un tel mouvement, faites le !","3765076912748475454":"Raté, essayez de déplacer une pile de pièces vers la gauche.","7535479567631818273":"Simplet","5012524143343727947":"Veuillez choisir une des piles vous appartenant.","5275339386917095598":"Veuillez choisir une pile qui n'est pas vide.","5544760040431913662":"Cette pile ne peut pas se déplacer car les 6 cases voisines sont occupées. Veuillez choisir une pièce avec strictement moins de 6 pièces voisines.","5029201799654426347":"Cette pièce ne peut pas se déplacer car il est impossible qu'elle termine son déplacement sur une autre pièce.","75731290119916717":"La distance effectuée par le mouvement doit correspondre à la taille de la pile de pièces.","8101145555087657570":"Le déplacement doit se terminer sur une case occupée.","9221962864929282978":"Une pile doit se déplacer en ligne droite.","5010267418211867946":"Déplacement","364149588471541692":"Au Dvonn, chaque case hexagonale comporte une pile de pièces.\n Si aucun nombre n'est indiqué sur une pile, c'est qu'elle ne comporte qu'une pièce.\n Le nombre écrit sur une pile correspond au nombre de pièces empilées et donc le nombre de points qu’elle rapporte à son propriétaire.\n Son propriétaire est celui dont une pièce est au sommet de la pile.\n Seul son propriétaire peut déplacer la pile.\n Il ne peut pas la déplacer si elle est entourée par 6 autres piles.\n Il la déplace d’autant de cases que sa hauteur, en ligne droite, et doit atterrir sur une case occupée.\n Cette ligne droite ne peut pas passer le long de l'arête de deux cases voisines, comme le ferait un déplacement vertical.\n Il y a donc six directions possibles.\n Le joueur avec les piles foncées commence.
\n Vous jouez avec Foncé, cliquez sur une pile puis déplacez la d'une case.","8769382369391878948":"Déconnection","4625150132268018420":"Les pièces avec un éclair sont appelées « sources ».\n Quand une pile n’est plus directement ou indirectement connectée à une source, elle est enlevée du plateau.
\n Vous jouez Foncé, essayez de déconnecter une pile de 4 pièces de votre adversaire. Il y a deux façons de le faire, l'une étant mieux que l'autre : essayez de trouver celle-là !","2017860068625343028":"Vous avez bien déconnecté la pile de 4 pièces de votre adversaire, mais lors du mouvement suivant il sera capable de se déplacer sur votre nouvelle pile et de gagner le jeu ! Il existe un meilleur mouvement pour vous, essayez de le trouver.","4457528534020479150":"Bravo, vous avez déconnecté 4 pièces de votre adversaire, et votre opposant ne peut pas atteindre votre nouvelle pile !\n Votre opposant perd donc 5 points : 4 de la pile déconnectée, et un de la pile sur laquelle vous vous êtes déplacé.\n Les piles déconnectées ne seront plus visible au tour suivant.","5374556513202485808":"Se déplacer sur une source","8343021305033605057":"Vous pouvez déplacer vos piles sur n'importe quelle pile.\n Vous pouvez donc prendre contrôle d'une source en déplaçant une de vos piles dessus.\n De cette façon, vous savez que cette pile ne peut jamais être déconnectée, car elle contient une source.
\n Vous jouez Foncé et pouvez prendre contrôle d'une source, faites-le !","6422219434767688772":"Bravo ! Cependant, notez que votre adversaire pourrait plus tard prendre possession d'une de vos piles qui contient une source, faites donc attention quand vous prenez le contrôle d'une source !","2060914977510915101":"Vous n'avez pas pris possession d'une source, essayez à nouveau.","5741584858319850896":"Passer","3832185042961281952":"Il peut arriver que vous n'ayez aucun mouvement possible.\n Si c'est le cas, et si votre adversaire peut toujours effectuer un mouvement, vous devez passer votre tour.
\n Cette situation arrive ici a Foncé.","4959059457063090536":"Quand plus aucun mouvement n’est possible, la partie est finie et le joueur avec le plus de points gagne.
\n Vous jouez Foncé, faites votre dernier mouvement !","2963709509031109432":"Bravo, vous avez même gagné 6 - 0 !","8876232297721386956":"Mauvaise idée, en déplaçant votre pile sur la source, vous auriez gagné votre pièce et gagné un point.","5456673610183497320":"Piles","6059738106874378452":"Vous n'avez plus de pièces de ce type.","2129733726620651846":"Vous devez placer votre pièce sur une case vide ou sur une pièce plus petite.","5649666705061470825":"Veuillez choisir une de vos pièces parmi les pièces restantes.","5001561383056924621":"Veuillez sélectionner une de vos pièces restantes, ou une case sur le plateau où vous avez la pièce la plus grande.","2209428336874697936":"Vous effectuez un déplacement, choisissez votre case de destination.","3734443501087651549":"Nombre de différentes tailles de pièces","893013149323570447":"Nombre de pièces pour chaque taille","7821413127222759201":"Le but du jeu à Encapsule est d'aligner trois de vos pièces. Ici, Foncé gagne.","9069271074421658276":"Placement","6720382486946228687":"Ceci est le plateau de départ.
\n Vous jouez Foncé. Choisissez une des pièces sur le côté du plateau et placez la sur le plateau.","864238899096934560":"Un autre type de coup à Encapsule est de déplacer une de ses pièces déjà sur le plateau.
\n Vous jouez Foncé. Cliquez sur votre pièce foncée et puis sur n'importe quel emplacement vide du plateau.","7502910762990406647":"Spécificité","3463587376927829861":"À Encapsule, les pièces s'encapsulent les unes sur les autres. Il est donc possible d'avoir jusqu'à trois pièces par case ! Cependant, seulement la plus grosse pièce de chaque case compte : il n'est pas possible de gagner avec une pièce « cachée » par une pièce plus grande. De même, il n'est pas possible de déplacer une pièce qui est recouverte par une autre pièce plus grande. Finalement, il est interdit de recouvrir une pièce avec une autre pièce plus petite. Ici, Foncé peut gagner à ce tour de plusieurs façons.
Vous jouez Foncé, essayez de gagner en effectuant un déplacement, et non un placement (c'est à dire en déposant une nouvelle pièce).","6204412729347708092":"Vous avez gagné, mais le but de l'exercice est de gagner en faisant un déplacement !","360730166369316579":"Attaque","5530182224164938313":"La distance de déplacement de votre phalange la fait sortir du plateau.","9197994342964027306":"Il y a quelque chose dans le chemin de votre phalange.","5389576774289628382":"Votre phalange doit être plus grande que celle qu'elle tente de capturer.","8675949818775194064":"Vous avez pris une phalange de {$PH} pièces de long et l'avez déplacé de {$PH_1} pas. Les phalanges ne peuvent pas se déplacer de plus de pas que leur longueur.","5151115756771676188":"Cette case n'est pas alignée avec la direction de la phalange.","5279717712059022209":"Une phalange ne peut pas contenir de pièce hors du plateau.","3733956045714659124":"Une phalange ne peut pas contenir de case vide.","2183903120219891237":"Une phalange ne peut pas contenir de pièce de l'adversaire.","5986717000369124597":"Pièce > Domination de colonne > Alignement > Présence en colonne","4563771339790181195":"Positionnel","8733936607898144583":"Plateau initial","3763163349245523745":"Ceci est le plateau de départ. La ligne tout en haut est la ligne de départ de Clair. La ligne tout en bas est la ligne de départ de Foncé.","6716022766676912093":"Après plusieurs déplacements, si au début de son tour de jeu, un joueur a plus de pièces sur la ligne de départ de l'adversaire que l'adversaire n'en a sur la ligne de départ du joueur, ce joueur gagne. Ici, c'est au tour de Foncé de jouer, il a donc gagné.","2623510393491755816":"Dans ce cas ci, c'est au tour de Clair, et celui-ci gagne, car il a deux pièces sur la ligne de départ de Foncé, et Foncé n'en a qu'une sur la ligne de départ de Clair.","2973098153638160177":"Voici le plateau de départ, c'est à Foncé de commencer. Commençons simplement par un déplacement d'une seule pièce :
Cliquez sur une pièce.
Cliquez sur une case voisine libre.
Vous jouez Foncé, déplacez une pièce.","3304007702447669410":"Félicitations, vous avez un pas d'avance, ce n'est malheureusement pas l'exercice.","5177233781165886499":"Voilà, c'est comme ça qu'on déplace une seule pièce.","3060866055407923547":"Déplacement de phalange","6553475319799851486":"Une ligne de plusieurs pièces est appellée une phalange. Voyons maintenant comment déplacer une phalange le long d'une ligne :
Cliquez sur la première pièce de la phalange.
Cliquez sur une des cases encadrées en jaune; vous pouvez bouger votre phalange au maximum d'autant de pas que sa longueur.
Vous jouez Foncé, déplacez une phalange !","108222118450000526":"Raté ! Vous n'avez bougé qu'une pièce.","9139891273410430459":"Bravo ! Les pièces déplacées doivent être horizontalement, verticalement, ou diagonalement alignées. Le déplacement doit se faire le long de cette ligne, en avant ou en arrière. Il ne peut y avoir ni pièces adverses ni trous dans la phalange.","5270412400264809136":"Pour capturer une phalange de l'adversaire, il faut que celle-ci soit alignée avec la phalange en déplacement, et strictement plus courte. La première pièce de votre phalange doit atterrir sur la première pièce rencontrée de la phalange à capturer. Vous jouez Foncé, capturez une phalange.","5979772757820095272":"Bravo, vous avez réussi. Constatez que la phalange diagonale n'étant pas alignée avec la notre, sa longueur supérieure n'empêche pas de capturer ses pièces dans un autre alignement. ","4418812710815829575":"Raté, vous n'avez pas capturé la phalange.","7226802484619632640":"Une capture ne peut que se faire si 4 pièces de votre couleur sont alignées, ce n'est pas le cas.","6918785733984182442":"Veuillez choisir une capture valide qui contient 4 pièces ou plus.","6602326768713192004":"Il vous reste des captures à effectuer.","2434818181880718873":"Les pièces doivent être placée sur une case du bord du plateau.","7875793227562861246":"Veuillez choisir une direction valide pour le déplacement.","1164530071087410710":"Veuillez choisir un placement avec une direction.","1848361274892061756":"Veuillez effectuer un placement sur une ligne non complète.","1025279631840419081":"Veuillez sélectionner une autre case de la capture que vous souhaitez prendre, celle-ci appartient à deux captures.","8708684300793667483":"Veuillez sélectionner une autre case, toutes les lignes pour ce placement sont complètes.","5510421842359017901":"Le but du jeu est de capturer les pièces de l'adversaire afin qu'il ne puisse plus jouer.\n Voici la configuration initiale du plateau.\n Chaque joueur a 12 pièces en réserve et 3 sur le plateau.\n Dès qu'à son tour un joueur n'a plus de pièces dans sa réserve, il ne sait plus jouer et perd.\n Le premier joueur possède les pièces foncées, le deuxième les pièces claires.","3717573037096411853":"Les pièces ne peuvent entrer sur le plateau que par l'extérieur. Pour insérer une nouvelle pièce :\n \n
Cliquez sur une case sur le bord du plateau.
\n
Si cette case était occupée, cliquez ensuite sur la flèche représentant la direction dans laquelle pousser la/les pièces déjà présentes dans la rangée.
\n
\n Une poussée est interdite dans une rangée complète.
\n Vous jouez Foncé, insérez une pièce.","7511966090954669277":"Pour faire une capture, il faut aligner 4 de ses propres pièces, qui seront les 4 premières capturées.\n Il y a plusieurs choses à savoir sur une capture :\n \n
Quand 4 pièces sont capturées, toutes les pièces directement alignées avec ces 4 pièces le sont également.
\n
Dès qu'il y a une case vide dans la ligne, la capture s'arrête.
\n
Vos pièces capturées rejoignent votre réserve.\n Celles de l'adversaire par contre sont réellement capturées et ne rejoignent pas sa réserve.
\n
Si vous créez une ligne de 4 pièces de l'adversaire, c'est au début de son tour qu'il pourra les capturer.\n Ceci implique que votre tour se passe en trois phases :\n \n
Choisir la/les capture(s) crée(s) par le dernier mouvement de votre adversaire.
\n
Faire votre poussée.
\n
Choisir la/les ligne(s) à capturer que vous venez de créer (en cliquant dessus).
\n \n
\n \n Vous jouez Foncé, une capture est faisable, faites-la !","8768850104658663274":"Bravo, vous avez récupéré 4 de vos pièces, mais ce n'est pas la capture la plus utile.\n Voyons maintenant la vraie utilité d'une capture.","624120683333042102":"Ici, il est possible de capturer de trois façons différentes.\n \n
L'une ne permet aucune capture de pièce adverse.
\n
L'autre permet une capture de pièce adverse.
\n
La dernière en permet deux.
\n \n \n Vous jouez Foncé, capturez le plus de pièce de votre adversaire.","9167352512805148919":"Bravo, vous avez récupéré 4 de vos pièces et capturé 2 pièces de l'adversaire.\n Le maximum possible étant 3 par capture.","3200525134996933550":"Raté, la capture optimale capture 2 pièces adverses.","1160906405303068410":"Ici, vous aurez une capture à faire au début de votre tour.\n Elle a été provoquée par un mouvement de votre adversaire lors de son tour de jeu\n (bien que ce plateau soit fictif à des fins pédagogiques).\n En effectuant ensuite le bon mouvement, vous pourrez faire deux captures supplémentaires !\n Gardez à l'esprit que le plus utile d'une capture, est de capturer les pièces adverses !
\n Vous jouez Foncé, capturez le plus de pièces adverses.","2182334345707735267":"Bravo, vous avez récupéré 12 de vos pièces et capturé 2 pièces de l'adversaire.","4244295242962463153":"Raté, la meilleure capture prends 2 des pièces de votre adversaire.","4172293183843503071":"Ce mouvement est un ko, vous devez jouer ailleurs avant de pouvoir rejouer sur cette intersection.","4133892808569917446":"Nous somme dans la phase de comptage, vous devez marquer les pierres comme mortes ou vivantes, ou bien accepter l'état actuel du plateau en passant votre tour.","4683884757780403263":"Vous ne pouvez pas accepter avant la phase de comptage.","7258684846942631624":"Cette intersection est déjà occupée.","3878972107071324960":"Vous ne pouvez pas vous suicider.","1472088308118018916":"Informations préalables","5815912088945784390":"Le jeu de Go se joue sur un plateau appelé Goban, et les pierres sont placées sur les intersections.\n Le plateau traditionnel fait 19x19 intersections, mais le 13x13 est implémenté sur ce site.\n (Pour des parties plus courtes, le 9x9 et 5x5 existent, mais ne sont pas encore disponibles).\n Pour ce tutoriel, nous utiliserons de plus petits plateaux à des fins pédagogiques.","1490005275934813623":"Le but du jeu est d'avoir le plus de points en fin de partie. On appelle territoires les intersections inoccupées et isolées du reste du Goban par les pierres d'un seul joueur. Ici, Foncé a 9 territoires à gauche, le joueur clair en a 8 à droite. La zone en haut au milieu n'appartient à personne. Le score d'un joueur en fin de partie correspond à la somme de ses territoires et captures.","2047079418793425161":"Une pierre isolée, comme la pierre claire au milieu, a 4 intersections voisines (et non 8, car on ne compte pas les diagonales).\n Il est dit d'un groupe de pierres qui a exactement deux cases voisines libres, que ce groupe a deux libertés.\n Si Foncé joue sur la dernière liberté de la pierre claire, cette pierre est enlevée du goban (capturée) et rapporte un point à Foncé.
\n Vous jouez Foncé. Il ne reste plus qu'une liberté à la pierre claire, capturez la.","4986672646268662936":"Bravo, vous avez gagné un point.","8619305565260847147":"Raté, réessayez en jouant sur l'une des intersections immédiatement voisines de la pierre claire.","8946006948417629723":"Capture de plusieurs pierres","3197348089105327020":"Des pierres connectées horizontalement ou verticalement doivent être capturées ensemble, et ne sont pas capturables séparement.
\n Vous jouez Foncé. Ici, le groupe clair n'a plus qu'une liberté, capturez ce groupe.","2022880801532921915":"Bravo, vous avez gagné trois points, et formé un territoire.","4825992977460901236":"Raté, vous n'avez pas capturé le groupe, jouez sur la dernière liberté de ce groupe.","6220902431017372113":"Suicide","4548165606059240492":"Au Go le suicide est interdit.\n Quand mettre une pierre sur une intersection ferait que le groupe de votre dernière pierre n'a aucune liberté et ne capture aucune pierre, alors jouer cette intersection serait un suicide, et est donc interdit.\n Ici, l'intersection en haut à gauche est un suicide pour Clair.\n En bas à droite, un suicide pour Foncé, et en bas à gauche n'est un suicide pour aucun joueur.","2066383177849177665":"Vie et mort (mort)","3595592714473441808":"De la règle de capture découle la notion de vie et de mort :\n des pierres mortes sont des pierres que l'on est sûr de pouvoir capturer (sans rien y perdre ailleurs).\n Tandis que des pierres vivantes sont des pierres que l'on ne peut plus espérer capturer.\n D'après la règle de capture, Foncé peut jouer à l'intérieur du territoire de Clair et le capturer.\n On dit dans ce cas que Clair n'a qu'un œil (sa dernière liberté) et qu'il est mort (même si pas encore capturé).\n En fin de partie, les pierres mortes sont comptées comme captures, et les cases qu'elles occupent comme territoires.","6721138878022657917":"Vie et mort (yeux)","1084604724991997052":"Ici, Clair ne pouvant jouer ni en haut à gauche, ni en bas à gauche, il ne pourra jamais capturer Foncé.\n On dit alors que Foncé a deux yeux (l'œil en haut à gauche et celui en bas à gauche) et qu'il est vivant.","8745919880228059784":"Seki","5496499515779223328":"Si Foncé joue sur la colonne du milieu, Clair jouera sur l'autre intersection libre de la colonne du milieu, et capturera Clair.\n De même, si Clair joue sur la colonne du milieu, Foncé jouera sur l'autre intersection libre de la colonne du milieu et capturera Foncé.\n Autrement dit, personne n'a intérêt à jouer au milieu.\n Dans ce cas, on dit que les pierres du milieu sont vivantes par Seki, et que les deux intersections du milieu sont des intersections neutres.","7812956328094242544":"Ko","6420048221002682719":"Un joueur, en posant une pierre, ne doit pas redonner au goban un état identique à l'un de ceux qu'il lui avait déjà donné, ce afin d'empêcher qu'une partie soit sans fin.
\n Vous jouez Foncé, capturez la pierre claire.","1862851019657740194":"Maintenant, si Clair essaye de recapturer la pierre que Foncé vient de poser, il rendrait au goban son état précédent, ouvrant la porte à une partie sans fin.\n L'emplacement de cette pièce est donc marqué d'un carré rouge, pour rappeler que c'est une intersection interdite.\n Cette règle s'appelle le Ko.\n Toute l'astuce pour Clair consiste, à essayer de créer une menace suffisamment grave pour que Foncé ait intérêt à y répondre immédiatement, et n'ait pas le temps de protéger sa dernière pierre, afin que Clair puisse la recapturer juste après.","84181370484059161":"Quand un joueur estime qu'il n'a plus intérêt à placer une pierre, il l'indique en passant son tour.\n La phase de jeu s'arrête lorsque les deux joueurs passent consécutivement, on passe alors en phase de comptage.\n On marque alors les groupes morts en cliquant dessus.\n Chaque intersection du territoire d'un joueur lui rapporte un point.\n Le gagnant est celui qui a le plus de points.
\n Vous jouez Foncé. Une dernière pierre est morte, marquez-la.","4959862943655130220":"Bravo, Foncé a 15 territoires et 3 pierres claire mortes mais encore présentes, appelées prisonnier en fin de partie.\n Les emplacements où les prisonniers sont comptent comme territoire pour Foncé.\n Clair a 8 territoires et 1 prisonnier.\n Le résultat est donc 18 - 9 en faveur de Foncé.","2798807656507405918":"Standard","35620818119550087":"Hexagonal","5525890868343399241":"Trigo est une adaptation triangulaire du jeu de Go. Le Go est présent sur Everyboard, vous pouvez aller en apprendre les règles here. Ce tutorial ne va que montrer les petites différences que cette expérimentation introduit.","3616229206195726198":"Libertés","8074559405875826310":"Étant donné que le plateau est triangulaire, les pièces n'ont qu'une liberté dans les coins.","5242120872569966381":"Étant donné que le plateau est triangulaire, les pièces on seulement deux libertés sur les bords. Quand les pièces touchent les bords avec seulement leurs coins, comme celles sur la droite, elles ne sont pas vraiment sur les bords","7135410296040646228":"Étant donné que le plateau est triangulaire, les pièces on trois libertés quand elles ne touchent pas les bords.","9089012671848915244":"Étant donné que le plateau est trianguliare, les groupes de deux pièces n'ont qu'une liberté en plus (faisant d'un atari un shisho par défaut).","6217706486990855046":"Raté, recommencez.","4791280679911297134":"La reine ne peut se déplacer que sur une des cases voisines.","1639583872704216434":"Le scarabée ne peut se déplacer que sur une des cases voisines.","7402975532187036733":"La sauterelle doit se déplacer en ligne droite.","5523450052915914627":"La sauterelle doit sauter au dessus d'autres pièces, sans passer au dessus d'une case vide.","8771557289052450532":"L'araignée doit se déplacer sur des cases voisines.","3098163088355072426":"L'araignée doit se déplacer autour des pièces avec lesquelles elle est en contact direct.","7928136093693713176":"L'araignée ne peut pas passer deux fois au même endroit durant le même mouvement.","2053370063642446913":"La reine doit être déposée sur le plateau afin de pouvoir déplacer une pièce.","5380773634484088090":"Cette pièce n'est pas autorisée à grimper sur d'autres pièces.","8284939639567724336":"Vous ne pouvez pas scinder la ruche.","4146942272384883649":"Cette pièce doit être capable de glisser jusqu'à sa destination.","4339124628235355617":"Vous devez placer la reine à votre quatrième tour au plus tard.","7948763683129821975":"Vous ne pouvez pas déposer une pièce à côté d'une pile adverse.","8046013978585107003":"Vous devez toujours déposer votre pièce sur une case vide.","106536486701689545":"La pièce que vous introduisez doit être connectée à la ruche.","3008604417903239806":"Hive est un jeu sans plateau, où les pièces sont placées l'une à côté des autres en un bloc contigu, appelé la ruche. Chaque joueur dispose de 11 pièces, représentant divers insectes.","4039332567259986532":"But du jeu","6900505086205524561":"Le but du jeu est d'entourer complètement la reine adverse. Une fois que qu'une reine est entourée par 6 pièces, peu importe le propriétaire de ces pièces, le jeu s'arrête. Le joueur avec une reine qui n'est pas entourée gagne. Si les deux reines sont complètement entourées au même tour, il y a match nul. Ici, Foncé a gagné.","1124156761679970164":"Placer la première et seconde pièce","2065654476590106098":"Il y a deux types d'actions: déposer une pièce et déplacer une pièce. Initialement, le plateau est vide et il nous faudra donc déposer une pièce sur le plateau. Pour la première pièce, il n'y a pas de restriction de placement : vous pouvez choisir n'importe quelle pièce et la mettre sur le plateau. La deuxième pièce, introduite par Clair, devra être placée sur une case voisine de la première pièce. Pour déposer une pièce, sélectionner la pièce de votre choix parmis vos pièces restantes (en dessous du plateau), et cliquez ensuite sur la case où vous voulez la déposer.
Vous jouez Foncé et commencez la partie, placez une pièce sur le plateau.","4766965064757095472":"Placer des pièces après le deuxième tour","4687115502403685230":"Après le deuxième tour, vous êtes toujours autorisé à déposer des pièces quand vous le désirez, à condition de respecter deux conditions :
votre pièce doit être connectée à la ruche ;
la case sur laquelle vous déposez votre pièce ne peut pas toucher une pile adverse
Vous jouez Foncé, introduisez une pièce sur le plateau.","2751556568646013753":"Déplacer les pièces : la reine","1929474568921893905":"Une fois que votre reine est placée sur le plateau, vous pouvez déplacer vos pièces. Vous devez placer votre reine au plus tard à votre quatrième tour. Chaque insecte se déplace d'une façon différente, et les déplacements doivent respecter deux conditions :
la ruche doit toujours former un bloc contigu ;
les pièces doivent être capables de glisser jusqu'à leur destination (à l'exception du scarabée et de la sauterelle, comme nous le verrons plus tard).
La reine peut se déplacer vers n'importe quelle case voisine libre. Pour déplacer une pièce, cliquez dessus et cliquez ensuite sur sa destination. Les destinations possibles sont mises en évidence.
Vous jouez Foncé, déplacez votre reine.","8573010608388393091":"Déplacer le scarabée","6645197773482117918":"Le scarabée se déplace comme la reine, mais est autorisé à grimper sur les autres pièces ! Il n'a donc pas besoin d'adhérer à la restriction des glissades. Notez que vous ne pouvez pas introduire le scarabée en le déposant sur une autre pièce, cela ne peut être effectué qu'en déplaçant un scarabée déjà sur le plateau. Une pièce avec un scarabée au dessus n'est pas autorisée à se déplacer. Une pile est considérée comme appartenant au joueur ayant le scarabée sur son dessus.
Vous jouez Foncé, bloquez la reine adverse en grimpant dessus !","6641485598833513426":"Inspecter les piles","8679169125111911637":"Quand des pièces sont empilées, vous pouvez inspecter la pile afin de voir quelles pièces se trouvent sous le scarabée. Cela fonctionne également avec les piles controlées par l'adversaire. Pour ce faire, cliquez simplement sur une pile afin de voir sa composition.
Vous jouez Foncé et votre adversaire a un scarabée au dessus d'une de vos pièces, cliquez dessus.","6207423912703337741":"Déplacer la sauterelle","6824181934070796921":"La sauterelle saute au dessus d'une ou plusieurs pièces en ligne droite, et s'arrête à la première case vide. Elle ne peut pas sauter au dessus de cases vides, et peut uniquement se déplacer en sautant. Car elle saute, elle ne doit pas adhérer à la restriction des glissades.
Vous jouez Foncé. Sautez au-dessus de trois pièces avec votre sauterelle !","5124714891438504376":"Déplacer la fourmi légionnaire","2899217750291886948":"La fourmi légionnaire est une pièce puissante : elle peut se déplacer n'importe où dans la ruche tant qu'elle respecte la règle des glissades et la règle de la ruche unique !
Vous jouez Foncé. Votre reine est bloquée, déplacez votre fourmi afin de la libérer !","7623079085925548808":"Vous n'avez pas libéré votre reine, essayez à nouveau !","3777509045596617031":"Déplacer l'araignée","2739227784886826925":"Finalement, l'araignée peut se déplacer d'exactement 3 cases. Elle n'est pas autorisée à passer deux fois par la même case au lors d'un tour. L'araignée se déplace le long des autres pièces : elle ne peut que se déplacer autour des pièces avec lesquelles elle est en contact direct. Ici par exemple, l'araignée de Foncé ne peut pas aller vers la gauche comme premier déplacement. Cela signifie que l'araignée ne peut pas temporairement séparer la ruche. Pour déplacer une araignée, sélectionnez-en une et cliquez sur les trois cases qui composent son mouvement.
Vous jouez Foncé, déplacez votre araignée.","3146815812493244221":"Restrictions","7714176760825514669":"Clarifions les deux restrictions durant les mouvements.
Toutes les pièces de la ruche doivent être connectées de façon à ne former qu'une seule ruche. Il se peut que durant un mouvement, la pièce glissée se déconnecte temporairement de la ruche, mais après le mouvement il ne doit y avoir qu'une seule ruche.
À l'exception des sauterelles et des scarabées, tous les mouvements doivent être faits en glissant les pièces, sans devoir écarter d'autres pièces de la ruche.
","7503459122405953820":"Passer son tour","3226372248582035130":"Finalement, il est possible que vous ne soyez pas capable d'effectuer un mouvement. Quand c'est le cas, vous devez passer votre tour. Ici, Foncé doit passer : la reine ne peut bouger sans déconnecter la ruche, le scarabée est bloqué en dessous d'un autre scarabée, et introduire une pièce ne peut se faire sans la mettre en contact avec une pièce adverse.","3643526530572280396":"La pièce n'est pas de la couleur à jouer.","945155491646703687":"Vous ne pouvez vous déplacer que vers l'avant orthogonalement ou diagonalement.","551820034442685617":"Ce mouvement est obstrué.","1699965787783859469":"Vous devez jouer avec la pièce déjà sélectionnée.","5017168027824461530":"Au Kamisado, il y a deux façons de gagner : soit en plaçant une de vos pièces sur la ligne de départ de\n l'adversaire, soit en forçant l'adversaire à faire un coup qui bloque la partie.\n Ici, Foncé gagne car il a sa pièce brune sur la ligne de départ du joueur clair, en haut à gauche.","5394640330288068198":"Plateau de départ et déplacement initial","8508262450449373253":"Voici le plateau de départ.\n Au Kamisado, les pièces ne peuvent se déplacer que vers l'avant, verticalement ou diagonalement.\n Vous jouez en premier, donc avec les pièces foncées, vous pouvez faire votre premier déplacement.
\n Vous jouez Foncé. Cliquez sur la pièce de votre choix, et cliquez sur sa case d'arrivée.","3923056974694699821":"Parfait ! Notez bien que chacune de vos pièces a une couleur différente.","460652905180615593":"Considérons maintenant le coup du joueur clair, après le déplacement de la pièce bleue.\n Tous les déplacements après le déplacement initial se font obligatoirement à partir de la pièce correspondant\n à la couleur sur laquelle le dernier déplacement s'est terminé.\n Ici, le déplacement précédent s'étant terminé sur une case rose, c'est donc au pion rose de se déplacer.\n Il est d'ailleurs déjà sélectionné, vous ne devez donc plus cliquer dessus.
\n Vous jouez Clair, déplacez-votre pièce jusqu'à la case bleue.","8902613702570774815":"Vous n'avez pas avancé votre pièce rose sur une case bleue !","6535171484072867925":"Blocage","2649088566668591407":"Foncé s'est déplacé sur une autre case rose, et vous oblige donc à déplacer votre pièce rose.\n Cependant, votre pièce rose est bloquée ! Dans ce cas ci, vous êtes obligé de passer votre tour.\n Foncé devra jouer son prochain tour en déplaçant lui-même sa pièce rose.","8029874053731693714":"Victoire par blocage","7208401461859346704":"À tout moment, si un joueur provoque un blocage total du jeu, il perd.\n C'est-à-dire que si un joueur oblige son adversaire à déplacer une pièce que l'adversaire ne peut bouger,\n et que lui-même ne peut pas déplacer sa pièce de la même couleur, il perd.\n Ici, en jouant avec les pions foncés,\n vous pouvez obliger votre adversaire à provoquer cette situation et donc l'obliger à perdre !
\n Vous jouez Foncé, analysej le plateau et effectuez le mouvement gagnant.","3072006962189197081":"Parfait !\n Votre adversaire est obligé d'avancer son pion vert sur la case orange, vous obligeant à joueur avec votre pion orange.\n Dès lors, votre pion orange sera bloqué et vous devrez donc passer votre tour.\n Votre adversaire devra ensuite aussi passer son tour car son pion orange est aussi bloqué :\n la partie est totalement bloquée.\n Dans ce cas, le dernier joueur à avoir déplacé une pièce perd la partie.\n Ici, votre adversaire a déplacé sa pièce verte en dernier, vous êtes donc vainqueur !","4481226927895530871":"Les captures doivent être des sauts de deux pas en diagonale ! Regardez les indications en vert pour vous aider !","924257200871471773":"Les déplacements doivent être des simples pas en diagonale !","8938938109993892899":"Vous ne pouvez pas sauter au dessus d'une même case plusieurs fois !","3581037377692107358":"Vous ne pouvez pas aller en arrière avec une pièce normale !","2164034395199252113":"Vous ne pouvez pas capturer une case vide, ni sauter par dessus !","1347067654692503433":"Vous devez capturer quand c'est possible !","3183138660002989080":"Vous devez finir cette capture !","8274439231274366704":"Lasca : les origines","3954016636522783040":"Lasca est un jeu basé sur le jeu de dames, créé en 1911 par Emanuel Lasker, champion du monde d'échecs. Lasca se joue sur un plateau de 7x7 cases, chaque joueur a 11 pièces.","4475600219932113977":"Le but de Lasca est, comme aux dames, de rendre l'adversaire incapable de jouer, soit en capturant toutes ses pièces, soit en les bloquant.","1534367694207535197":"Pas","5101419651122121441":"Un simple pas est un déplacement d'une case en diagonale, en avant, vers la gauche ou la droite. Pour faire un déplacement cliquez sur une pièce au choix, puis sur sa case d'arrivée.
Vous jouez Foncé, faites le premier mouvement.","7013110290486741787":"Une capture arrive quand vous sautez diagonalement par dessus une pièce adverse et atterrissez immédiatement derrière. Vous devez capturer quand vous le pouvez. C'est le cas ici : cliquez sur la pièce qui doit capturer, et ensuite sur sa destination
Vous jouez Foncé, faites une capture !","3662184238859847370":"Félicitations, constatez que la pièce capturée n'as pas été enlevée du plateau, mais placée en dessous de la pièce qui l'a capturé.","8288645478824152244":"Si, après le début de la capture, la pièce que vous venez de bouger peut encore capturer une autre pièce, elle doit le faire tant qu'elle le peut. Pour ce faire, vous devez juste cliquer sur sa destination suivante. Notez que vous ne pouvez pas sauter deux fois au dessus de la même pile.
Vous jouez Foncé, une double capture est possible, faites-la.","2693455583384082674":"Promotion","3052116389115675860":"Vous n'avez pas choisi la bonne pile, et vous n'avez pas causé de promotion.","4252782057421264089":"Déplacement des Officiers","2042191715997917496":"Quand une pile atteint la dernière ligne, son commandeur devient officier, et gagne la capacité de se déplacer en marche arrière, ce qui est illégal pour les autres pièces ! Une de vos pièces pourrait être promue ce tour-ci.
Vous jouez Foncé. Faites-le.","8730503950999903830":"Les officiers peuvent se déplacer et capturer en arrière ainsi qu'en avant.
Vous jouez Foncé, déplacez votre officier !","7994037258587314442":"Vous n'avez pas déplacé votre officier.","318262165361158083":"Contrôle","7668804973365582935":"Contrôle et domination","6522624192206928831":"La capture minoritaire est autorisée !","4604841825883708598":"Si vous avez plusieurs choix de captures, vous êtes autorisé à choisir n'importe lequel. Par exemple, si un des choix ne capture qu'une pièce, et l'autre en capture deux, vous pouvez choisir celui que vous préférez.","6689969573280113485":"Cette pièce ne peut pas bouger !","6387863170048380356":"Vous devez vous effectuer un déplacement de longueur égale au nombre de pièces présente sur la ligne de votre déplacement.","3931959709762726685":"Vous ne pouvez pas passer au dessus d'une pièce de l'adversaire.","1376498600372177047":"Cette pièce n'a aucun mouvement possible, choisissez-en une autre.","6241913890536717263":"À Lines of Actions, le but est de regrouper toutes vos pièces de façon contigües, orthogonalement et/ou diagonalement.\n Ici, Foncé gagne la partie :\n ses pièces ne forment qu'un seul groupe, alors que les pièces de Clair forment trois groupes.","1803258759101178992":"Voici le plateau de départ.\n Les déplacements s'effectuent orthogonalement ou diagonalement.\n La longueur d'un déplacement est égale au nombre de pièces présentes dans la ligne du déplacement.\n Notez la présence d'un indicateur d'aide qui indique où une pièce peut atterrir quand vous la sélectionnez.
\n Vous jouez Foncé, faites le premier déplacement !","4640173099284920351":"Sauts","7761420664051286760":"Lors d'un déplacement, il est possible de sauter au dessus de ses propres pièces.\n Mais il est interdit de sauter au dessus des pièces de l'adversaire.
\n Effectuez un saut au dessus de l'une de vos pièces avec la configuration suivante.","5427407556156621327":"Vous n'avez pas sauté au dessus d'une de vos pièces.","9103512134624014654":"Voici une configuration différente. Sélectionnez la pièce foncée au milieu (ligne 4, colonne 4)\n et observez bien les déplacements possibles.\n
\n
Horizontalement, elle se déplace d'une case car elle est seule sur cette ligne.
\n
Verticalement, elle se déplace de trois cases car il y a en tout trois pièces sur cette ligne verticale.\n Mais elle ne peut qu'aller vers le haut, car vers le bas la case d'atterrissage est occupée par une autre de vos pièces.
\n
Diagonalement, un seul mouvement est possible : sur la diagonale qui contient trois pièces, dans la seule\n direction où on ne doit pas sauter au dessus d'une pièce adverse.\n Sur l'autre diagonale, il y a trop de pièces pour que le déplacement se termine sur le plateau.
\n Effectuez un de ces déplacements.","2794355525571555595":"Ce n'était pas un des déplacements attendus","5036745511795758114":"Si un déplacement se termine sur une pièce adverse, celle-ci est capturée et disparait du plateau.\n Votre déplacement par contre ne peut pas se terminer sur une de vos pièces.\n Attention, avoir moins de pièces à Lines of Action rend plus atteignable la condition de victoire,\n car il est plus facile de regrouper un petit nombre de pièces !\n D'ailleurs, s'il reste une seule pièce à un joueur, il gagne la partie.
\n Dans la configuration suivante, avec Foncé, essayez de capturer une pièce.","2751983125977182742":"Égalité","7055933300672028135":"Dans le cas spécial où un mouvement résulte en une connexion complète des pièces des deux joueurs,\n simultanément, alors la partie se termine par une égalité.
\n Vous jouez Foncé, forcez l'égalité en un coup.","4594736386763524275":"La coordonnée de départ ne peut pas être hors du plateau","8024507002452740554":"La coordonnée de fin ne peut pas être hors du plateau","4409865504289904426":"Les drônes doivent se déplacer de un ou deux pas dans n'importe quelle direction.","4174188766565583979":"Choisissez une pièce de votre propre territoire pour la déplacer.","4126120518252508337":"Ce mouvement n'est ni une promotion valide ni une capture valide.","820589591452307194":"Vous ne pouvez pas faire un mouvement inverse au dernier coup.","101461993624237538":"Le but des Échecs Martiens est d'avoir le plus de points à la fin de la partie. À chaque pièce est assignée une valeur, quand vous capturez une pièce, vous gagnez sa valeur. Le plateau est divisé en deux par une ligne rouge appellée \"le canal\". Il y a un côté pour chaque joueur, vous ne contrôlez que les pièces de votre côté du canal. La couleur des pièces n'est là que pour vous aider, les pièces changent de couleur en traversant le canal.","8633649754808970040":"Les pièces","4066930341904859929":"Les pièces sont foncées du côté du premier joueur, les claires du côté du second. Il y a trois types de pièces:
Les reines: représentées par des cercles avec 3 points ;
Les drônes: représentés par des cercles avec 2 points ;
Les pions: représentés par des cercles avec un point.
","2033063585111632444":"Déplacer les pions","4687071087997357225":"Les pions valent un point. Ils peuvent se déplacer d'un pas sur l'une des diagonales.
Vous jouez Foncé, bougez un pion.","5961522758680599293":"Ceci n'est pas un pion ","6187825194726438285":"Déplacer les drônes","4279721125731228701":"Les drônes valent deux points. Ils peuvent se déplacer de un ou deux pas dans n'importe quelle direction, en ligne droite, sans sauter au dessus d'autres pièces.
Vous jouez Foncé, déplacez un drône.","412189766091253797":"Ceci n'est pas un drône !","731242877035493751":"Déplacer les reines","2106860890585726458":"Les reines valent trois points. Elles peuvent se déplacer d'autant de pas que souhaité dans n'importe quelle direction, en ligne droite, sans sauter au dessus d'autres pièces.
Vous jouez Clair, déplacez une reine.","3206825395681468712":"Ceci n'est pas une reine !","6164047187960612635":"Quand une pièce traverse le canal et atterrit sur une autre pièce, vous la capturez et gagnez la valeur de la pièce, cependant vous en perdez le contrôle car elle a traversé le canal !
Une capture est possible pour Clair, faites-la.","6741042150149637612":"Bravo ! En capturant ce pion, vous gagnez un point.","2144586366556831652":"Promotion","9082504092683509261":"Il est parfois possible de faire ce qu'on appelle une promotion. Quand vous n'avez pas un type de pièce, vous pouvez fusionner deux pièces pour additionner leur valeur et obtenir une nouvelle pièce. Premier exemple, si vous n'avez pas de drône, vous pouvez fusionner deux de vos pions en un drône. Pour ce faire, déplacez un de vos pions sur un autre.
Un tel coup est possible pour Clair, faites-le.","8941261285468529448":"Ce n'est pas une promotion !","1012300757521682008":"L'autre sorte de promotion est de fusionner un drône et un pion, pour obtenir une reine.
Un tel mouvement est possible pour Clair. Faites-le.","304909585169663876":"Lancer le compte à rebour","8898741439943904413":"Quand la partie ne semble aller nulle part, vous pouvez lancer le compte à rebour, en cliquant sur l'horloge à droite avant de faire votre mouvement. Une fois votre mouvement fait, seul 7 autres pourront être fait.
Vous jouez Foncé, lancez le compte à rebour.","6784225180868580907":"Vous n'avez pas lancé le compte à rebour !","976279093722548167":"Redémarrer le compte à rebour","3901600798817118089":"Si le compte à rebour a été lancé, chaque capture remet le compteur à 7.
Vous jouez Foncé, faites une capture pour redémarrer le compte à rebour.","7392280182595989107":"Ce n'est pas une capture? la partie est maintenant finie, réessayez !","4805475752093007535":"Fin au temps","3700959958039999617":"7 Tours après le lancement du compte à rebour, le joueur qui a le plus de point gagne. Si les joueurs ont autant de point, c'est un match nul.
Vous jouez Clair, faites le dernier mouvement.","1679797944253761486":"Fin par le vide","7700786423442894185":"Quand un joueur déplace sa dernière pièce dans le territoire adverse, la partie prend fin. Si les deux joueurs ont le même nombre de points, le dernier joueur gagne !
Clair peut gagner de cette façon, faites-le !","5831506127438574716":"Votre pièce est toujours dans votre territoire !","7020322239499292850":"Les pions doivent se déplacer d'une case en diagonale.","7419338702295170530":"Vous devez changer la face de votre pierre magnétique avant de la redéposer sur le plateau.","8683881271933340082":"Tant qu'il reste des plaques de pression, vous devez placer les pièces que vous avez capturé dessus.","3917449010922856612":"Vous devez placer votre pierre magnétique sur une case qui ne s'est pas effondrée !","2350186243435301157":"Vous avez placé trop de pièces sur la même plaque de pression, qui ne dispose pas d'assez d'espace.","4296510202733075370":"Vous devez placer vos captures sur les plaques de pression, situées autour du plateau.","8506636863437595095":"Vous ne pouvez pas encore placer de captures, vous devez d'abord placer votre pierre magnétique sur le plateau !","5605685662838531265":"Lodestone se joue sur un plateau 8x8, qui contient ce qui s'appelle des plaques de pression sur son pourtour, où les pièces capturées seront placées. Le plateau initial est montré ci-contre. Le but du jeu est d'être le seul joueur restant avec des pièces sur le plateau. Pour y arriver, vous allez devoir pousser les pièces de votre adversaire hors du plateau, ou les écraser avec vos pièces. Vous le ferez avec une pierre magnétique.","2109934310949694886":"Sélectionner une pierre magnétique","2559162009573450567":"Afin d'effectuer un déplacement, vous devez placer votre pierre magnétique sur le plateau. Votre pierre magnétique dispose de deux faces:
sa face répulsive qui poussera les pièces adverses (tel qu'indiqué par les triangles pointant vers d'extérieur, à la couleur de votre adversaire) ;
sa face attractive qui attirera vos pièces (tel qu'indiqué par les triangles pointant vers l'intérieur, à votre couleur).
Votre pierre magnétique peut être disposée pour déplacer les pièces de façon orthogonale ou diagonale. Tous les côtés et orientations disponibles de votre pierre magnétique sont montrés en dessous du plateau.
Vous jouez Foncé. Sélectionnez la pierre magnétique qui repousse les pièces de votre adversaire diagonalement.","2963285511284379717":"Ce n'est pas la bonne pierre magnétique, essayez à nouveau.","7572976598676202841":"La pierre magnétique répulsive","3639714905640085837":"Lorsque vous placez une pierre magnétique sur le plateau, elle déplacera toutes les pièces sur lesquelles elle agit (en fonction de sa direction et de son orientation) simultanément. Voyons d'abord comment la pierre magnétique répulsive agit sur les pièces. Toutes les pièces de l'adversaire qui sont alignées avec la pierre magnétique, tel qu'indiqué par l'orientation des triangles, seront éloignées d'une case depuis la pierre magnétique. Une pièce de l'adversaire est bloquée si elle croise le chemin d'une de vos pièces, d'une pierre magnétique, ou d'une autre pièce bloquée. Finalement, si une pièce de l'adversaire tombe du plateau, elle est considérée comme capturée.","609421287344629004":"La pierre magnétique attractive","1840990354301535750":"Quand la pierre magnétique est placée sur sa face attractive, elle attirera vos pièces d'une case dans sa direction. Si une de vos pièce croise le chemin d'une pierre magnétique ou d'une pièce bloquée, elle sera elle-même bloquée. Si elle croise le chemin d'une pièce adverse, celle-ci sera capturée.","5747624424535894902":"Retourner la pierre magnétique","6611993830828980213":"Notez qu'après chaque mouvement vous devez retourner votre pierre magnétique : si elle était sur sa face répulsive, vous devez l'utiliser sur sa face attractive, et inversément. Aussi, vous pouvez placer votre pierre magnétique sur la même case qu'à son tour précédent.","1164074897639591703":"En résumé, il est possible de capturer les pièces de l'adversaire de deux façons :
avec une pierre magnétique sur sa face répulsive, en poussant les pièces adverses hors du plateau ;
avec une pierre magnétique sur sa face attractive, en attirant vos pièces pour qu'elles écrasent les pièces adverses.
Une fois qu'une pierre magnétique est placée et que les pièces ont été déplacées et/ou capturées, si des pièces adverses ont été capturées, vous devez les placer sur les plaques de pressions, situées autour du plateau. Pour ce faire, cliquez sur une case libre de la plaque de pression de votre choix pour chaque capture. Vous pouvez annuler ce placement en cliquant sur une pièce récemment placée sur plaque de pression.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce adverse, et placez vos captures sur des plaques de pression.","443433725102640869":"Premier effondrement d'une plaque de pression","7283094782812908030":"Quand une plaque de pression est complète, elle s'effondrera et prendra avec elle une ligne ou une colonne entière du plateau ! Toutes les pièces qui étaient sur les cases correspondantes sont considérées perdues, mais ne seront pas placées sur les plaques de pression. Vous avez ici un plateau avec une plaque de pression qui nécéssite une pièce supplémentaire pour s'effondrer.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce, et remplissez la plaque de pression pour qu'elle s'effondre.","3196264140433706433":"Vous devez effectuer une capture et la placer sur la plaque de pression au dessus du plateau pour qu'elle s'effondre !","5914083969570610852":"Second effondrement d'une plaque de pression","1857692339690561929":"Une fois qu'une plaque de pression s'est effondrée, une seconde plaque de pression, plus petite, prend sa place. C'est le cas ici, où seulement 3 cases sont disponibles sur la plaque de pression supérieure.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce, et remplissez la plaque de pression supérieure pour qu'elle s'effondre.","3910287826025606484":"Vous devez effectuer une capture et la placer sur la plaque de pression supérieure pour qu'elle s'effondre une deuxième fois !","6264951416361363939":"Plateau minimal","4748774984823369879":"Après deux effondrements d'une plaque de pression, il n'y a plus de plaque de pression disponible sur ce côté. Si toutes les plaques de pressions se sont effondrées, le plateau est réduit à un plateau 4x4.","3538909383339704235":"Faire tomber une pierre magnétique","2420281248578493085":"À tout moment durant le jeu, si votre pierre magnétique se trouve sur une case qui s'effondre avec une plaque de pression, vous pourrez sélectionner n'importe quelle face de votre pierre magnétique lors de votre prochain tour.
Sur ce plateau, en jouant Foncé, vous pouvez placer votre pierre magnétique et faire s'effondrer une plaque de pression de façon à ce que votre pierre magnétique tombe également. Cela vous permettra de choisir plus librement le côté de votre pierre magnétique lors de votre prochain tour. Faites-le !","387688094870283606":"Bravo ! Lors de votre prochain tour, vous pourrez placer votre pierre magnétique sur n'importe quel côté.","99397540840628948":"Pour être vainqueur, vous devez éliminer toutes les pièces adverses.
Ici, vous pouvez gagner en un seul mouvement, faites-le !","1645842992024065193":"Ce n'est pas le mouvement gagnant. Essayez encore.","4012808273739972279":"{$PH} est un Mancala. Mancala est le nom d'une famille de jeux de plateau datant au moins du troisième siècle. Les mancalas sont des jeux de distribution (égrenage) et capture. Leur but est de capturer le plus de graines. Les cases sont appelées des maisons. Celles sur l'extrême gauche et droite sont appellées les magasins, ils contiennent les graines que chaque joueur a capturé. Comme vous jouez Foncé, vos 6 maisons sont celles du bas.","9104781897718296194":"Info bonus : l'Awalé est le plus populaire des mancalas.","6266016430504496647":"Veuillez placer votre pièce dans une colonne incomplète.","4036586801649294358":"Le plateau du Puissance 4 fait 7 colonnes et 6 rangées et est initialement vide.\n Le premier joueur joue Foncé, le deuxième joue Clair.\n Le but du du jeu est d'être le premier joueur à aligner 4 de ses pièces (horizontalement, verticalement, ou diagonalement).","8975478230679810486":"Déposez une pièce","8376425958935569592":"Cliquez sur n’importe quelle case d’une colonne.","5836753691261182816":"Comme vous voyez, la pièce va toujours tomber tout en bas de la colonne.","1116173898665219180":"Victoire","7759745104864966912":"Quand vous posez une dernière pièce dans une case, le jeu fini. Dans cette configuration vous pouvez gagner.
Vous jouez Clair, faites le mouvement gagnant !","3614265026318366150":"Vous avez activement fait gagner votre adversaire !","6535908388530528403":"Mauvais choix, votre adversaire va gagner au prochain tour quelle que soit la pièce déposée !","6434791622277704389":"Priorité de droite","529510153551286303":"Incrémentation","6180360850656792663":"Plateau complet","8400174784913655582":"Minimax","45739481977493163":"Taille","69616505141416052":"Hexodia se joue sur un plateau hexagonal, votre but est d'aligner 6 de vos pièces.","6858407546093916748":"Au premier tour, le premier joueur joue une seule pièce.
Vous jouez Foncé, placez votre première pièce en cliquant sur une case.","3416240052398580752":"Diagonales Hexagonales","25408930270688683":"Mais un genre original de diagonales existe aussi à Hexodia. Ici, Foncé a fait un alignement dans chacunes de ces trois directions, la victoire ne reste possible que dans une seule.
Vous jouez Foncé, faites le coup gagnant.","5880375817695791500":"Vous jouez Foncé.\n Placez votre pion de façon à aligner horizontalement 4 de vos pièces.","2383238937544977536":"Voilà, vous avez gagné !","8360761958716876836":"Raté, vous n'avez pas aligné 4 pièces et perdu votre occasion de gagner.","7608929788238552566":"Autre Victoire","5935897420698942151":"Vous pouvez également aligner 4 pions diagonalement ou verticalement","6103371171681226169":"Si le quadrant à tourner est neutre, utilisez un mouvement sans rotation.","960314962671621462":"Aucun quadrant n'étant neutre, vous devez choisir un quadrant à faire tourner.","6958056470119838689":"Le plateau du Pentago est composé de 6x6 cases, et est subdivisé en quatre quadrants, ceux-ci pouvant effectuer des rotations.","821589059503120913":"Le but du Pentago est d'aligner 5 de vos pièces. Dans le plateau ci-dessous, Foncé gagne.","6954191985152707764":"Chacun à son tour, les joueurs posent une pièce sur le plateau, et effectuent éventuellement une rotation d'un quadrant. Tant qu'il existe des quadrants neutres, c'est à dire des quadrants qui ne changeraient pas après avoir été tournés, l'option de ne pas effectuer de rotation est acceptée. Pour ce faire il faut cliquer sur le rond barré qui apparaît au centre du plateau quand c'est possible.
Vous jouez Foncé, faites un mouvement simple.","1640662905904405955":"Vous avez effectué un mouvement avec rotation, cette étape du didacticiel concerne les tours sans rotations !","8330321104835134748":"Mouvement avec rotation","2438755881589163638":"Après avoir déposé une pièce, des flèches apparaîtront sur les quadrants non neutres.
\n Vous jouez Foncé, placez une pièce sur un quadrant et effectuez une rotation !","5427363142376983767":"Vous avez effectué un mouvement sans rotation, recommencez !","2426029962112596303":"Bravo ! Note : si tout les quadrants sont neutres après que vous ayez déposé votre pièce, il n'y aura pas de rotation !","3823427068887903090":"Pierres capturées nécessaires pour gagner","1997992313730455534":"Nombre de pièces alignées nécessaires pour gagner","6974294157928395807":"Nombre de pièces déposées par tour","2370571702661444910":"Taille des captures","481364308060927522":"Pente se joue sur un plateau 19x19, sur lequel on dépose les pierres aux intersections des cases. Le but du jeu est d'aligner 5 de vos pièces, ou de capturer 10 pièces de votre adversaire. Initialement, une pièce du joueur clair est placée au centre du plateau.","4134686113968191036":"Durant vos tour, vous devez déposer une pièce sur n'importe quelle case vide. Il n'y a pas d'autre restriction.
Vous jouez Foncé, déposez une pièce.","55131761932515685":"Durant vos quatre premiers tours, vous devez déposer une pièce sur n'importe quelle case vide. Il n'y a pas d'autre restriction.
Vous jouez Foncé, déposez une pièce.","6622643035593861381":"Vous pouvez capturer exactement deux pièces de votre adversaire en les prenant en sandwich entre deux de vos pièces.
Vous jouez Clair et pouvez capturer, faites-le !","5697357351132552791":"Placer en position de sandwich","4745154919636452326":"Vous pouvez placer une de vos pièces à côté d'une autre de vos pièces, là où elle serait en sandwich entre deux pièces adverses. C'est un mouvement sûr.
Vous jouez Clair et avez la possibilité de faire un tel mouvement, faites-le !","5109014320867695717":"Souvenez-vous, vous pouver gagner soit en alignant 5 de vos pièces, soit en capturant 10 pièces de votre adversaire. Ici, en tant que Clair, vous avez déjà capturé 8 pièces adverses et vous n'avez besoin que de deux pièces supplémentaires pour gagner.
Vous jouez Clair, vous pouvez gagner de deux façon différentes. Gagnez !","682762602217958961":"Vous devez déplacer vos pièces vers le haut.","2162535855239454361":"Votre pièce doit atterrir sur le plateau ou sur 4 autres pièces.","70110199629015603":"Vous ne pouvez pas capturer.","1880810010962851052":"Votre première capture est invalide.","8839913211108039860":"Votre seconde capture est invalide.","2207725255932699379":"Vous devez capturer une ou deux pièces, pas plus.","3567680797279323593":"Au Pylos, le but est d'être le dernier à jouer.\n Pour cela, il faut économiser ses pièces.\n Dès qu'un joueur dépose sa dernière pièce, il perd immédiatement la partie.\n Voici à quoi ressemble le plateau initial, un plateau de 4 x 4 cases.\n Celui-ci deviendra une pyramide petit à petit.\n Ce plateau sera rempli par les pièces dans votre réserve. Chaque joueur a 15 pièces.","6012873055176768317":"Quand c'est votre tour, vous avez toujours l'option de déposer une de vos pièces sur une case vide.\n Les rectangles gris sont les cases sur lesquelles vous pouvez déposez vos pièces.
\n Cliquez sur une de ces cases pour déposer une pièce.","460049283627942483":"Voilà, aussi simplement que ça.","9085516039614786121":"Grimper","7544559714308131014":"Quand 4 pièces forment un carré, il est possible de placer une cinquième pièce dessus.\n Cependant, à ce moment là, se crée une opportunité d'économiser une pièce en \"grimpant\" au lieu de déposer.\n Pour grimper :\n \n
Cliquez sur une de vos pièces libres et plus basse que la case d'atterrissage.
\n
Cliquez sur une case vide plus haute.
\n \n Vous jouez Foncé, allez-y et grimpez !","7055621102989388488":"Bravo ! \n Notes importantes :\n \n
On ne peut déplacer une pièce qui est en dessous d'une autre.
\n
Naturellement, on ne peut pas déplacer les pièces adverses.
\n
Un déplacement ne peut se faire que quand la case d'arrivée est plus haute que la case de départ.
\n ","8336049305072615544":"Carré","517712097339838490":"Quand la pièce que vous venez de poser est la quatrième d'un carré de pièces de votre couleur,\n vous pouvez choisir alors n'importe où sur le plateau une où deux de vos pièces.\n Cette(ces) pièce(s) sera(seront) enlevée(s) du plateau, vous permettant de les économiser.\n Une pièce choisie pour être enlevée ne peut pas être en dessous d'autres pièces.\n Une pièce choisie peut être la pièce que vous venez de placer.
\n Vous jouez Foncé. Formez un carré, cliquez sur une des quatres pièces, puis cliquez sur le V en bas à droite pour finaliser votre mouvement.","4722414845520402682":"Bravo, vous avez économisé une pièce. Note, vous pouvez annuler la sélection en cliquant à nouveau sur la pièce.","5218035582670205877":"Vous jouez Foncé.
\n Faites comme à l'étape précédente, mais cliquez cette fois sur deux pièces différentes avant de valider.","8313533670567464817":"Raté, vous n'avez capturé qu'une pièce.","5608779123109622436":"Raté, vous n'avez capturé aucune pièce.","3455768301736755830":"Bravo, vous avez économisé deux pièces.","5796940069053691279":"Vous devez donner une pièce à l'adversaire.","2211348294853632908":"Cette pièce est déjà sur le plateau.","6246016939611902421":"Vous ne pouvez pas donner la pièce qui était dans vos mains.","2864332255120486791":"Niveau du joueur Un","6804516002090214742":"Niveau du joueur Deux","760255515343953338":"Quarto est un jeu d'alignement. Le but est d'aligner quatre pièces qui possèdent au moins un point commun :
leur couleur (claire ou foncée),
leur taille (grande ou petite),
leur motif (vide ou à point),
leur forme (ronde ou carrée).
Ici, nous avons un plateau avec une victoire par alignement de pièces foncées. Notez que le spièces n'appartiennent à aucun joueur.","5869780110608474933":"Placement","3421981370095781630":"Chaque placement se fait en deux étapes : placer la pièce que vous avez en main (dans le petit carré) en cliquant sur une case du plateau, et choisir une pièce que l'adversaire devra placer, en cliquant sur une des pièces dans le carré pointillé. Si vous préférez, l'ordre inverse est également possible. Gardez juste à l'esprit que le deuxième clic valide le mouvement.
Effectuez un mouvement.","2296943727359810458":"Parfait !","7849803408372436927":"Situation","4119107654622098665":"Nous avons ici une situation délicate.
Analysez bien le plateau et jouez votre coup, en faisant particulièrement attention de ne pas permettre à l'adversaire de l'emporter au prochain coup.","4715207105849605918":"Bien joué !","8424758512320418629":"Raté ! Votre adversaire peut soit aligner:
les carrés horizontalement sur la troisième ligne ou verticalement sur la troisième colonne ;
les petites pièces horizontalement sur la première ligne ou verticalement sur la deuxième ou troisième colonne ;
les pièces vides horizontalement sur la première ligne ou verticalement sur la première colonne ;
les pièces claires diagonalement.
","5648428630068792235":"Une partie de Quarto peut être configurée pour la rendre plus compliquée pour un ou deux des joueurs. Quand vous créez une partie et que vous voulez changer la configuration originale, vous pouvez ajouter un niveau à un ou plusieurs joueurs. Quand votre niveau augmente, cela devient plus facile pour vous de gagner. Donc, si le premier joueur est plus faible à ce jeu, faites le jouer au niveau deux et la partie sera plus intéréssante. Au niveau deux, un joueur peut gagner en groupant des pièces avec un critère commun sur un carré de 2x2. Sur ce plateau, Clair peu gagner en formant un carré.
Vous jouez Clair, gagnez.","2467449610168621115":"Raté, vous auriez pu gagner en formant un carré.","8819839276456625538":"Case invalide, cliquez sur une case de l'extérieur du plateau.","1849305746346487286":"Au Quixo, le but du jeu est d'aligner 5 de vos pièces.\n Le premier joueur contrôle les pièces foncées, le deuxième les claires.\n Le plateau est constitué de 25 pièces réparties en un carré de 5x5.\n Chaque pièce a un face neutre, une face claire et une face foncée.","7664600147441568899":"A quoi ressemble un mouvement (sans animation)","8312224573535963288":"Quand c'est à votre tour de jouer :\n \n
Cliquez sur une de vos pièces ou une pièce neutre, il est interdit de choisir une pièce de l'adversaire.\n Notez que vous ne pouvez choisir qu'une pièce sur le bord du plateau.
\n
Choisissez une direction dans laquelle l'envoyer (en cliquant sur la flèche).
\n \n Il faudra imaginer que la pièce que vous avez choisie a été déplacée jusqu'au bout du plateau dans la direction choisie.\n Une fois arrivée au bout, toutes les pièces vont se glisser d'une case dans la direction inverse à celle qu'a pris votre pièce.\n Après cela, si elle était neutre, la pièce devient la votre et prend votre couleur.
\n Pour exemple, prenez la pièce neutre tout en bas à droite, déplacez la tout à gauche (vous jouez Clair).","2349397111027092779":"Voyez comment les quatre pièces foncées ont été déplacées d'une case vers la droite.\n La pièce neutre a été déplacé de 4 pièces vers la gauche est est devenue claire.","767359644489302732":"Vous savez déjà tout ce qu'il faut pour jouer, il ne manque qu'une spécificité.\n Si vous créez une ligne de 5 pièces vous appartenant, vous gagnez.\n Si vous créez une ligne de 5 pièces de l'adversaire, vous perdez.\n Si vous créez les deux, vous perdez aussi !
\n Ce plateau permet de gagner, essayez.\n Vous jouez Clair.","6387064828361949367":"Vous avez sauté trop loin ! La longueur maximum d'un saut est de {$PH} pas!","323770883664351270":"Longueur d'un saut","4941408928262720844":"Squarz est un jeu de contrôle de plateau. Voici le plateau initial. Le but est d'avoir une majorité de vos pièces sur le plateau à la fin de la partie.","6981861179855327687":"Duplication","5489405522962962283":"Bravo, vous avez gagné !","2829152398724302132":"Votre mouvement doit au moins retourner une pièce.","8006607638702407149":"Les pièces du Reversi sont double face, une face foncée pour le premier joueur, une face claire pour le deuxième.\n Quand une pièce est retournée, elle change de propriétaire.\n Le joueur possédant le plus de pièces en fin de partie gagne.\n Ici, Foncé a 28 points et le joueur clair en a 36, le joueur clair a donc gagné.","5285597397338861824":"Au début de la partie, les pièces sont placées comme ceci.\n Pour qu'un coup soit légal il faut qu'il prenne en sandwich minimum une pièce adverse entre la pièce que vous posez et une de vos pièces.
\n Foncé joue en premier, faites n'importe quel mouvement en cliquant pour déposer votre pièce.","7280078972566788741":"Un mouvement peut également capturer une plus grande ligne, et plusieurs lignes à la fois.
Vous jouez Clair. Joueez en bas à gauche pour voir un exemple de capture.","863291659187903950":"Un peu plus en bas et un peu plus à gauche, s'il vous plaît.","1243885947284298199":"Passer son tour","3839030392804080169":"Si, à son tour de jeu, un joueur n'a aucun mouvement lui permettant de capturer une pièce, il est obligé de passer son tour.\n Si d'aventure le joueur suivant ne savait pas jouer non plus, la partie terminerait avant que le plateau ne soit rempli, et les points seraient décomptés de la façon habituelle.","1982783281923413187":"On ne peux rebondir que sur les cases foncées.","1906861201256399546":"Vous ne pouvez rebondir que sur les cases vides.","366304395805128715":"Vous devez d'abord choisir une de vos pyramides.","6312339673351478538":"Vous devez choisir une de vos pyramides.","2094727233255278649":"Ces deux cases ne sont pas voisines.","5908478672900888285":"Ces deux cases n'ont pas de voisin commun.","7194810718741841575":"Vous pouvez vous déplacer maximum de 2 cases, pas de {$PH}.","7379617497808564008":"Le Sâhârâ se joue sur un plateau dont chaque case est triangulaire.\n Chaque joueur contrôle six pyramides.","7604175652954490413":"Au Sâhârâ, le but du jeu est d'immobiliser une des pyramides de l'adversaire. Pour ce faire il faut occuper toutes les cases voisines de celle-ci. Ici, le joueur clair a perdu car sa pyramide tout à gauche est immobilisée.","1300852626039829767":"Simple pas","3700643537935262310":"Un des deux types de mouvement que vous pouvez faire est la duplication. Quand vous en faites un, vous créez une nouvelle pièce. Pour ce faire, sélectionnez une de vos pièces, et cliquez sur une de vos pièces, puis sur une case voisine à celle-ci. Vous jouez Foncé, faites un simple pas.","2864359495844920670":"C'était un saut, essayez de faire une duplication.","4273222196833633277":"C'était une duplication, essayez un saut maintenant.","1771050228270959005":"Le deuxième type de mouvement que vous pouvez faire est un saut. Quand vous en faites un, votre pièce quitte sa case d'origine et atterit deux cases plus loin. Pour faire ceci, sélectionnez une de vos pièces, et cliquez sur sa case d'atterrissage, deux cases plus loin. Vous jouez Clair, faites un saut.","831056729992738373":"Quand une de vos pièces arrive sur une case, les pièces adjacentes voisines deviennent les vôtres. C'est ce qu'on appelle une capture.
Vous jouez Clair, faites une capture.","9048883519751617241":"Quand un des joueurs ne peut plus jouer, la partie se termine, et le joueur avec le plus de pièces gagne. Ici, vous pouvez faire le dernier mouvement et gagner.
Vous jouez Clair, faites-le !","3808135421251943457":"Mauvais choix, en faisant ce saut vous avez permis à l'adversaire de gagner.
Essayez à nouveau !","3615756484359681386":"Pour parvenir à immobiliser l'adversaire, il faut déplacer ses pyramides.\n Quand une pyramide partage ses arêtes avec des cases claires, elle peut se déplacer dessus (appelons ceci, faire un pas simple).\n Pour effectuer un mouvement :\n \n
Cliquez sur une de vos pyramides.
\n
Cliquez ensuite sur une des deux ou trois cases voisines, pour y déplacer votre pyramide.
\n \n Vous jouez Foncé, faites un simple pas.","6109976694950516137":"Vous avez fait un double pas, c'est très bien, mais c'est l'exercice suivant !","7415904984868552706":"Double pas","8606604811382882198":"Quand une pyramide partage ses arêtes avec des cases foncées, vous pouvez la déplacer de deux pas.\n Pour ce faire :\n \n
Cliquez sur la pyramide à déplacer (celle tout au centre).
\n
Cliquez directement sur l'une des 6 destinations possibles en deux pas :\n les 6 cases claires voisines des 3 cases foncées voisines de votre pyramide.
\n \n Vous jouez Foncé, faites un pas double.","5302904876941698020":"Raté ! Vous avez fait un simple pas.","5162969671337604607":"Vous ne pouvez plus insérer, toutes vos pièces sont déjà sur le plateau !","2237663589140902242":"Vous ne pouvez pas pousser, vous n'avez pas assez de forces","6414951217478686255":"Vous devez déplacer votre pièce ou effectuer une rotation.","2533760570032755409":"Votre poussée est invalide : elle n'est pas droite, ne pousse rien, ou sort du plateau.","6641065739366631527":"Vous devez sélectionner une destination valide (mise en évidence sur le plateau) pour votre pièce.","3129880366808972802":"Vous devez sélectionner une orientation pour votre pièce en cliquant sur une des flèches.","4789301325429521721":"Nombre de pièces par joueur","6496295523512347479":"Nombre de montagnes bonus","8745202933853690845":"Le but du Siam est d'être le premier à pousser une montagne hors du plateau. Le plateau de départ en contient trois, au centre, et aucun pion n'est initialement sur le plateau. Durant son tour de jeu un joueur peut effectuer l'une des actions suivantes :
Faire entrer une pièce sur le plateau.
Changer l'orientation d'une de ses pièces.
Déplacer une de ses pièces et éventuellement la réorienter.
Sortir un de ses pions du plateau.
","5290831626966707862":"On ne peut pas rotationner une pièce hors du plateau: {$PH}","3925814099582230333":"Les SiamMove doivent terminer ou commencer sur le plateau: {$PH}","5519545750670700019":"Les SiamMove doivent avoir moveDirection et landingOrientation identique quand une pièce sort du plateau: {$PH}","4040000701091542987":"Insérer une pièce","4877870999512279099":"Chaque joueur a en tout 5 pièces. Tant qu'il vous reste des pièces de réserves sur le côté du plateau, vous pouvez en insérer une. Pour ce faire :
Sélectionnez une pièces depuis votre réserve, située à côté du plateau.
Cliquez sur une des cases mises en avant pour sélectionner une case de destination pour votre pièce.
Sélectionnez une orientation pour votre pièce en cliquant sur une des flèches apparues sur le plateau.
Vous jouez Foncé, insérez une pièce sur le plateau.","4137959840028416520":"Nous distinguerons ici \"déplacer\" et \"pousser\".Un déplacement de pièce se fait de sa case de départ à une case vide voisine horizontalement ou verticalement. Il est également possible de faire sortir une pièce du plateau. Pour déplacer une pièce :
Cliquez dessus.
Cliquez sur la destination voulue de la pièce. Vous pouvez aussi cliquer une seconde fois sur votre pièce pour changer son orientation sans la déplacer.
Sélectionnez une orientation pour votre pièce en cliquant sur une des flèches apparues sur le plateau.
Vous jouez Foncé. Essayez de déplacer votre pièce se trouvant déjà sur le plateau d'une case vers le haut et de l'orienter vers la gauche.","1302903286060317619":"Bravo, vous avez fait un dérapage !","6800736002193770248":"Sortir une pièce","5868523312663011403":"Sortir une pièce du plateau est plus simple, préciser son orientation d'arrivée n'est pas nécessaire.
Vous jouez Foncé, sortez cette pièce du plateau !","423861981305705638":"Bravo, même si dans le contexte c'était plutôt un mouvement inutile.","2311226881614577495":"Raté, la pièce est encore sur le plateau.","1863585492531844895":"Quand la case d'arrivée de votre déplacement est occupée, on parle de \"pousser\". Pour pousser des pièces d'un joueur, plusieurs critères doivent être vérifiés :
Votre pièce doit déjà être orientée dans le sens de la poussée.
Dans la ligne que vous poussez, le nombre de pièces (à vous et à l'adversaire) orientée dans le sens de la poussée doit être strictement supérieur au nombre de pièces qui y font face.
Regardez attentivement le plateau. Sur la première ligne, vous ne pouvez pas pousser car il y a exactement une pièce dans la direction opposée. Sur la deuxième ligne, vous pouvez pousser car il y a deux pièces contre une.
Vous jouez Foncé. Verticalement, vous pouvez pousser avec votre pièce au centre, car il n'y a pas de résistance sur cet axe. Faites-le.","1762973675800865905":"Pour pousser une montane, vous avez besoin d'un pièce pousseuse par montagne. Chaque résistant (pièce dans la direction opposée) annule la force d'une pousseuse. En résumé, s'il n'y a pas de montagne vous devez avoir strictement plus de pousseurs que de résistants. S'il y a une montagne, vous devez avoir autant de pousseurs qu'il y a de résistants et montagnes. Sur le plateau, vous pouvez, en tant que Foncé, pousser la montagne de la première ligne. Sur la deuxième et troisième, vous ne pouvez pas pousser à cause des pièces et montagnes résistantes. Sur la quatrième ligne, vous pouvez pousser car il y a une pousseuse de plus que de pièces résistantes.
Vous jouez Foncé, poussez sur la quatrième ligne.","709861006710076010":"Bravo ! Notez que ce mouvement vous fait perdre, comme vous allez le voir dans l'étape suivante.","5917097999963707548":"Pour rappel, la partie se termine quand une montagne est poussée hors du plateau. Si vous l'avez poussé et que personne ne vous barre la route, vous êtes le vainqueur. Cependant, si vous poussez un adversaire orienté dans la même direction que vous, il sera considéré vainqueur. En revanche, si un adversaire est plus proche de la montagne, mais mal orienté, la victoire sera vôtre.
Ici, en jouant Foncé, vous pouvez pousser une montagne hors du plateau et soit gagner, soit perdre. Choisissez consciencieusement !","8309748811457759789":"Raté, vous avez perdu.","2035984245529775458":"Vous ne pouvez pas encore effectuer de déplacement. Choisissez une case où déposer une pièce.","5972149122807464966":"Plusieurs groupes ont la même taille, vous devez en choisir un à garder.","586640917828080274":"Vous ne pouvez pas choisir un groupe à garder lorsqu'un est plus petit que l'autre.","8942923511988910642":"Vous ne pouvez plus déposer de pièces, choisissez d'abord une pièce à déplacer.","1582776814244416485":"Vous devez choisir un des plus grands groupes pour le conserver.","3079321797470229596":"Vous ne pouvez choisir une pièce vide, choisissez un des plus grands groupes.","4110234759792602964":"Vous devez faire atterrir cette pièce à côté d'une autre pièce.","7208567678509553256":"Ce mouvement ne déconnecte pas du jeu de pièces adverses ! Réessayez avec une autre pièce !","6058377963019501239":"Vous avez perdu une de vos pièce pendant ce mouvement, il y a un moyen de déconnecter une pièce adversaire sans perdre aucune pièce, recommencez !","1815943775702363568":"Le Six est une jeu sans plateau, où les pièces sont placées les unes à côtés des autres, en un bloc continu. Chaque joueur a 21 pièces à lui, 2 étant déjà placée sur le plateau. Le but principal du jeu est de former l'une des trois formes gagnantes avec vos pièces.","1323662052932112829":"Victoire (ligne)","4554770606444065239":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous alignez six de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","2466439893530767761":"Victoire (rond)","4365332414018101911":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous dessinez un cercle avec 6 de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","3255477892845543355":"Bravo ! Notez que la présence ou non d'une pièce à l'intérieur du rond ne change rien.","4644119482430965077":"Victoire (triangle)","5836697956170776107":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous dessinez un triangle avec 6 de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","8968454720078127329":"Deuxième phase","7184945664924176112":"Quand après 40 tours, toutes vos pièces sont placées, on passe en deuxième phase.\n Il faut maintenant déplacer ses pièces, en prenant garde à ne pas enlever une pièce qui empêchait l'adversaire de gagner.\n Dorénavant, si après un déplacement, un ou plusieurs groupe de pièces est déconnecté du plus grand groupe de pièces, ces petits groupes de pièces sont enlevés définitivement du jeu.
\n Vous jouez Foncé, effectuez un déplacement qui déconnecte une pièce de votre adversaire.","6404013542075961070":"Bravo, vous avez fait perdre une pièce à votre adversaire et vous vous êtes rapproché potentiellement de la victoire !","4819564470925108710":"Victoire par déconnection","3845114702040437383":"Lors de la seconde phase de jeu, en plus des victoires normales (ligne, rond, triangle), on peux gagner par déconnection.\n Si à un moment du jeu, l'un des deux joueurs n'a plus assez de pièce pour gagner (il en a donc moins de 6), la partie s'arrête.\n Celui qui a le plus de pièces a gagné, et en cas d'égalité, c'est match nul.
\n Ici, vous pouvez gagner (vous jouez Foncé). Faites-le !","631151175449209373":"Déconnection spéciale","6890637892579669718":"Lors d'une déconnection, de deux à plusieurs groupes peuvent faire la même taille,\n auquel cas, un clic en plus sera nécessaire pour indiquer lequel vous souhaitez garder.
\n Vous jouez Foncé, coupez le plateau en deux parties égales.","4762560256027932544":"Ce mouvement n'as pas coupé le plateau en deux parties égales.","4274208426593680443":"Raté. Vous avez coupé le plateau en deux parties, mais avez gardé la partie où vous êtes en minorité. Vous avez donc perdu ! Essayez à nouveau.","2976149661707388406":"Fuite > Pièces > Contrôle","4456476499852991526":"Vous ne pouvez pas atterrir sur une case occupée.","299718976758118618":"Une fois que vous avez quitté le trône central, vous ne pouvez pas y retourner.","1513340614663053294":"Les soldats n'ont pas le droit de se poser sur le trône.","4065705313723361978":"Il y a une pièce entre la pièce que vous avez choisie et sa case d'atterissage.","189691672447950321":"Vous devez vous déplacer sur une case voisine.","6790757046240382671":"Les mouvements aux jeux de Tafl doivent être orthogonaux.","7623537877233304257":"Pièces > Contrôle","1760148711911088235":"Pièces > Influence","3372037160964274985":"Pièces","7559617831371314788":"Brandhub est la version irlandaise du jeu de Tafl, la famille de jeu de stratégie Viking. Le but du jeu est différent pour chaque joueur. Les attaquants jouent en premier. Leurs pièces (foncées) sont près des bords. Leur but est de capturer le roi, qui est au centre du plateau. Les défenseurs jouent en deuxième. Leurs pièces (claires) sont au milieu. Leur but est que le roi atteigne l'un des 4 trônes dans les coins. Notez que la case sur laquelle le roi commence, au centre du plateau, est aussi un trône.","4948014485926272515":"Toutes les pièces se déplacent de la même façon. Comme la tour aux échecs, une pièce peut bouger :
D'autant de cases que souhaité ;
Sans passer par dessus une autre pièce ni s'arrêter sur une autre pièce ;
Horizontalement ou verticalement ;
Seul le roi peut s'arrêter sur l'un des coins ;
Une fois que le roi a quitté le trône central, plus aucunes pièces ne peut s'arrêter dessus, mais toutes peuvent le survoler.
Pour déplacer une pièce, cliquez dessus puis sur sa destination.
Vous jouez Foncé, faites le premier coup.","7366607587345821534":"Capturer un simple soldat","4542556047957483359":"Toutes les pièces, attaquantes comme défenseuses, sont des soldats, à l'exception du roi. Pour les capturer, il faut en prendre une en sandwich entre deux de vos pièces. En s'approchant trop, un soldat de l'envahisseur s'est mis en danger.
Vous jouez Clair. Capturez le soldat.","1504890408061490574":"Bravo, ça lui apprendra !","9035153077895210009":"Raté, vous avez manqué une occasion de capturer une pièce adverse.","1349136475821045956":"Un deuxième moyen de capturer un soldat est de le prendre en sandwich contre un trône vide. Le roi a quitté son poste, et mis en danger un de ses soldats.
Vous jouez Foncé. Capturez le soldat.","6149168030196118189":"Bravo, un défenseur en moins, mais gardez quand même un œil sur le roi, c'est le plus important.","2625274275364629010":"Raté, vous n'avez pas fait le mouvement demandé.","8078344255720503228":"Capturer le roi sur son trône","1735534781216205320":"Pour capturer le roi quand il est sur son trône, les 4 cases voisines au roi (horizontalement et verticalement) doivent être occupées par vos pions.
Vous jouez Foncé. Capturez le roi.","3068385624186077540":"Capturer le roi","6006281576137172714":"Pour capturer le roi, deux soldats ne sont pas suffisant, il en faut plus. Pour la première solution, il faut simplement que les 4 cases voisines (horizontalement et verticalement) soient occupées par vos soldats. Ceci fonctionne également si le roi est assis sur son trône.
Vous jouez Foncé, capturez le roi.","2543567724882527416":"Raté, vous avez laissé fuir le roi.","4897090029478298745":"Capturer le roi à côté de son trône","8145627268762433482":"Un autre moyen de capturer le roi est d'utiliser trois soldats plus le trône central pour entourer le roi des 4 côtés.
Vous jouez Foncé. Capturez le roi.","8429826787913397956":"Un autre moyen de capturer le roi est de l'immobiliser à 3 contre un bord. Notez qu'un roi n'est pas capturable sur une case voisine à un trône.
Vous jouez Foncé, capturez le roi.","4169759104868172929":"Tablut est la version Lapone du jeu de Tafl, une famille de jeu de stratégie. Le but du jeu pour les deux joueurs n'est pas le même. L'attaquant joue en premier, ses pièces (foncées) sont placées proches des bords. Son but est de capturer le roi, qui est tout au centre du plateau. Le défenseur joue en deuxième, ses pièces (claires) sont au centre. Son but est de placer le roi sur l'un des 4 trônes situés dans les coins. Notez que la case où est le roi au début du jeu, au centre du plateau, est également un trône.","1347435830524797455":"Teeko Standard","6407662856197686253":"Les pièces se téléportent","560394398723321416":"Teleport Teeko","3648165339236868481":"Le but du jeu est d'aligner vos 4 pièces, ou de les placer en carré.","5528013857873835184":"Après avoir déposé vos quatre pièces, vous devez déplacer une de vos pièces à un emplacement voisin vide, orthogonalement ou diagonalement. Le but reste le même : être le premier à créer une ligne ou un carré.
Vous jouez Foncé, déplacez une pièce.","6991053095147622953":"Sur ce plateau, vous pouvez gagner en formant un carré.
Vous jouez Foncé, gagnez.","4133557660322432859":"Bravo, vous avez gagné ! Souvenez-vous que vous pouvez aussi gagner en créant une ligne.","1739222080553143193":"Ces deux cases ne sont pas voisines !","4853714910007564389":"Il n'y a pas moyen de placer une pièce ici !","7841599074494103882":"Vous ne pouvez pas déposer de pièce sur seulement une autre pièce !","4138926893172482803":"Vous ne pouvez pas déposer de pièce sur deux piles de hauteurs différentes !","1296355206706368557":"Au Trexo, le but du jeu est d'aligner 5 pièces de votre couleur dans une ligne horizontale, verticale, ou diagonale. Mais les joueurs déposent des tuiles constituées de deux pièces, une pour chaque joueur !","6011148802067949079":"Déposer une tuile","2972240786684210487":"Quand vous déposez une tuile, elle doit être mise sur deux pièces au même niveau, ou à même le plateau, mais ces deux pièces ne peuvent pas faire partie de la même tuile. En d'autres mots elle doit soit être immédiatement sur le plateau, soit à cheval sur deux tuiles de même hauteur. Pour ce faire, cliquez d'abord sur l'endroit où vous voulez déposer la pièce de l'adversaire, puis sur la case voisine où vous voulez mettre votre pièce.
Vous jouez Foncé, allez-y.","6262113904872794006":"Placer une pièce sur d'autres pièces","882687674117366349":"Vous pouvez superposer les tuiles. Pour ce faire vous devez respecter deux règles :
Les deux pièces doivent être au même niveau.
Vous ne pouvez pas déposer votre tuile sur une seule tuile.
Vous jouez Foncé, placez une tuile en hauteur.","8122888205935746981":"Raté, vous avez mis cette pièce au niveau du plateau, veuillez placer une tuile sur les deux autres tuiles.","3210337788599026628":"Pour gagner au Trexo, vous devez aligner 5 de vos pièces. Seule la pièce en haut d'une pile compte, les pièces cachées ne sont plus une menace, et une victoire peut inclure des pièces de hauteurs différentes. Puisque vous déposez les pièces adverses en premier, si vous créez un alignement avec les pièces adverses, vous perdez, même si vous alignez aussi 5 de vos pièces.
Vous jouez Foncé, gagnez.","2462375977615446954":"Le roi est mort, longue vie au roi. Bravo, vous avez gagné la partie.","6061494208056217209":"Capturer le roi loin de son trône","1214950240176247246":"Quand le roi n'est ni sur son trône central, ni à côté de celui-ci, il peut être capturé comme un soldat.
Vous jouez Foncé. Capturez le roi.","7072625163028579495":"Hnefatafl est la version lapone du jeu de Tafl, la famille de jeu de stratégie Viking. Le but du jeu est différent pour chaque joueur. Les attaquants jouent en premier. Leurs pièces (foncées) sont près des bords. Leur but est de capturer le roi, qui est au centre du plateau. Les défenseurs jouent en deuxième. Leurs pièces (claires) sont au milieu. Leur but est que le roi atteigne l'un des 4 trônes dans les coins. Notez que la case sur laquelle le roi commence, au centre du plateau, est aussi un trône.","439785126864846458":"Toutes les pièces se déplacent de la même façon. De façon équivalente aux tours aux échecs, une pièce se déplace :
D'autant de cases qu'elle veut.
Sans passer à travers ou s'arrêter sur une autre pièce.
Horizontalement ou verticalement.
Seul le roi peut s'arrêter sur un trône.
Pour déplacer une pièce, cliquez dessus, puis sur sa destination.
Vous jouez Foncé, faites le premier mouvement.","9155303779171419902":"Vous ne pouvez pas placer d'anneau sans placer de marqueurs après le dixième tour.","1259286853143283501":"Vous ne pouvez pas placer vos marqueurs avant d'avoir placé tous vos anneaux.","923761852987939376":"La direction de votre mouvement est invalide: un mouvement se fait le long d'une ligne droite.","4828021707700375959":"Vous ne pouvez que capturer vos propres marqueurs.","8518184052895338328":"Vous devez choisir un de vos propres anneaux à déplacer.","5102601060485644767":"Votre anneau doit terminer son mouvement sur une case vide.","1286643089876989148":"Un anneau ne peut passer qu'au dessus des marqueurs ou de cases vides, pas au dessus d'un autre anneau.","3047973571712211401":"Votre déplacement doit s'arrêter à la première case vide après un groupe de marqueurs.","5146449464465539521":"Quand vous capturez des marqueurs, vous devez reprendre l'un de vos anneaux en cliquant dessus.","7525019515401716113":"Raté ! Vous devez aligner 5 marqueurs de votre couleur pour pouvoir les capturer, ainsi que pour récupérer un anneau.","4464967427027571359":"Raté ! Vous pouvez capturer deux anneaux en tout, en procédant à deux captures de 5 de vos marqueurs. Réessayez.","6448631040503247025":"Le but du jeu à Yinsh est de capturer trois anneaux en tout. Le nombre d'anneaux capturés est indiqué en haut à gauche pour Foncé, et en bas à droite pour le joueur clair. Ici, Foncé a gagné la partie. Notez que sur le plateau vous avez deux types des pièces pour chaque joueur : des anneaux (pièces creuses) et des marqueurs (pièces pleines).","6047690275464996632":"Plateau initial et phase de placement","3619666883540312330":"Le plateau initial est vide.\n Au début de la partie, chaque joueur place à son tour un de ses anneaux.\n Cette phase s'arrête lorsque que tous les anneaux ont été placés.
\n Vous jouez Foncé, placez un de vos anneaux en cliquant sur la case du plateau où vous désirez le placer.","6117091506461787133":"Placer un marqueur","2622897751178992678":"Une fois la phase initiale terminée et tous vos anneaux présents sur le plateau, il vous faut placer des marqueurs sur le plateau.\n Pour ce faire, placez un marqueur dans un de vos anneaux en cliquant sur cet anneau.\n Ensuite, l'anneau doit se déplacer en ligne droite dans n'importe quelle direction.\n Un anneau ne peut pas, lors de son mouvement, passer à travers d'autres anneaux.\n Si vous passez au dessus d'un groupe de marqueurs, votre mouvement doit s'arrêter à la première case vide qui suit ce groupe.\n Tous les marqueurs du groupe sont alors retournés et changent de couleur.
\n Vous jouez Foncé, effectuez un mouvement.","4761648797342068775":"Récupérer un anneau en alignant 5 marqueurs","8100703918510255362":"Finalement, la seule mécanique qu'il vous manque est de pouvoir récupérer des anneaux afin de marquer des points.\n Pour cela, il faut que vous alignez 5 marqueurs de votre couleur.\n Vous pouvez alors récupérer ces marqueurs en cliquant dessus, et ensuite récupérer un de vos anneaux en cliquant dessus.\n Vous avez alors un point de plus.\n Vous êtes obligés d'effectuer une capture quand elle se présente.
\n Vous jouez Foncé, effectuez une capture !","4758113906566791089":"Captures composées","4474897538192187001":"Il est possible que lors d'un tour, vous ayez la possibilité de choisir entre plusieurs captures,\n ou même d'effectuer plusieurs captures !\n Lorsque, lors de la sélection d'une capture, le marqueur sur lequel vous avez cliqué appartient à deux captures, il vous faudra cliquer sur un second marqueur pour lever toute ambiguité.
\n Ici, en tant que Foncé, vous pouvez récupérer deux anneaux, faites-le !","7542102025019708759":"Votre mouvement doit être en ligne droite ! Votre mouvement doit être orthogonal ou diagonal !","7484306131506665789":"Vous avez choisi une pièce adverse. Vous devez choisir une de vos pièces.","7236012742212037533":"Vous devez cliquer sur une case vide.","8686180677883367844":"Vous devez cliquer sur une case vide.","8905154297816550312":"Votre case d'arrivée doit être vide ou contenir une pièce de l'adversaire.","2056314675813734949":"Vous ne pouvez pas passer votre tour.","2698327260846195509":"Vous devez déposer votre pièce sur une case vide.","5019447873100403310":"Vous êtes obligés de passer votre tour.","5966391152315784819":"Vous avez sélectionné une case vide, vous devez sélectionner l'une de vos pièces.","1153768241274180865":"Le mouvement ne peut pas être statique, choisissez une case de départ et d'arrivée différentes.","4047787446065773376":"Il manque certains champs dans le formulaire, vérifiez que vous avez complété tous les champs.","7065414996126753833":"Ce nom d'utilisateur est déjà utilisé.","301565970318735798":"Cette addresse email est déjà utilisée.","3098841477756660384":"Cette addresse email est invalide.","2330128434446069317":"Vous avez entré des identifiants invalides.","321667206564180755":"Vos identifiants sont invalides ou ont expiré, essayez à nouveau.","2159810188120268887":"Votre mot de passe est trop faible, utilisez un mot de passe plus fort.","2368572652596435161":"Il y a eu trop de requêtes depuis votre appareil. Vous êtes temporairement bloqué suite à une activité inhabituelle. Réessayez plus tard.","8414332856711181199":"Vous avez fermé la fenêtre d'authentification sans finaliser votre connexion.","6900649527685820563":"La fenêtre d'authentification a été bloquée. Essayez à nouveau après avoir désactivé votre bloqueur de popup.","4550935601489856530":"Votre nom d'utilisateur ne peut pas être vide.","3618174181025506941":"Ce nom d'utilisateur est déjà utilisé, veuillez en utiliser un autre.","5527862698509020204":"Cette partie n'existe pas !","75196759111440200":"Vous n'êtes pas autorisé à envoyer un message ici.","4052977957517792171":"Ce message est interdit.","5968000276977717351":"Une erreur inattendue est arrivée. Nous l'avons notée et essayerons de la réparer au plus vite.","3878208315329190575":"C'est le mauvais type de jeu !","682801679843744749":"{$PH} heures","5250062810079582285":"1 heure","5664431632313592621":"{$PH} minutes","5764931367607989415":"1 minute","580867446647473930":"{$PH} secondes","4999829279268672917":"1 seconde","621011316051372308":"0 seconde","5033601776243148314":"{$PH} et {$PH_1}","2025949389316561274":"Vous êtes déjà en train de jouer une autre partie.","3355072499279505626":"Vous êtes déjà le créateur d'une autre partie.","5005469579079717737":"Vous êtes déjà sélectionné comme adversaire dans une autre partie.","7540734974309484940":"Vous êtes déjà candidat dans une autre partie.","2152425747573072542":"Vous observez déjà une autre partie.","4517991218544205155":"Vous observez cette partie, vous ne pouvez pas jouer.","7360329324887745743":"Vous devez répondre à la requête de votre adversaire.","7083786305815159719":"Votre adversaire demande à reprendre un coup.","2898142484935641522":"reprendre un coup","7538850744297505720":"Votre adversaire vous propose un match nul.","9006692347877947091":"match nul","1922042518455293613":"Proposer une revanche","8683762452219964182":"Votre adversaire propose une revanche.","4486051017462631053":"revanche","8905995985388209337":"Accepter","7378878529334768232":"Refuser","2875203763744324408":"Votre requête ({$INTERPOLATION}) a été refusée. {$START_TAG_FA_ICON}{$CLOSE_TAG_FA_ICON}","1802530168433258138":"Votre requête ({$INTERPOLATION}) a été envoyée. {$START_TAG_FA_ICON}{$CLOSE_TAG_FA_ICON}"}}
\ No newline at end of file
+{"locale":"unknown","translations":{"4894728399261164928":"Si vous aimez {$START_TAG_STRONG}EveryBoard{$CLOSE_TAG_STRONG}, suivez-nous !","6153797048311741939":"Paramètres utilisateurs","6838770899052870929":"Si vous avez oublié votre mot de passe ou souhaitez le changer, cliquez sur le bouton suivant :","1636934520301910285":"Réinitialiser le mot de passe","8403075591877274055":"Entrez votre message ici","2187377168518132372":"Soyez courtois","8447591012079458095":"Réduire le chat","3331424259701651496":"Afficher le chat ({$INTERPOLATION})","5112659486997490676":"pas de nouveau message","6373233342627633860":"1 nouveau message","5075342719298110640":"{$PH} nouveaux messages","1735231057781616406":"Nombre de colonnes : ","2821179408673282599":"Accueil","6017042194813294080":"Jouer en ligne","4190634170116728013":"Créer une partie","5801676690179723464":"Rejoindre une partie","2615338817912103674":"Jouer hors ligne","3468367367164457633":"Apprendre les règles","7164690325767499813":"{$INTERPOLATION} de {$INTERPOLATION_1}","172167399786281724":"{$INTERPOLATION} contre {$INTERPOLATION_1}","5678362140621139107":"{$INTERPOLATION} (en attente d'adversaire)","4930506384627295710":"Paramètres","4086606389696938932":"Compte","7507948636555938109":"Se déconnecter","2336550011721758066":"Connexion","4768749765465246664":"Email","1431416938026210429":"Mot de passe","4917036382252417719":"Se connecter avec Google","850080272338290812":"Pas de compte ?","2012659005494284050":"Mot de passe oublié ?","4371680625121499898":"Réinitialiser votre mot de passe","3301086086650990787":"Créer un compte","77522255637065336":"Erreur de connexion","6005801113696805305":"Le partie de revanche se charge. Veuillez attendre, cela ne devrait pas prendre longtemps.","6595008830732269870":"Page introuvable","4204327513039663989":"Cette page n'existe pas.","7017932994058745268":"Création d'une partie en ligne. Veuillez attendre, cela ne devrait pas prendre longtemps.","7680170577317084701":"Chercher un jeu","5561648955936795459":"Utilisez des mécaniques simples pour pousser 6 pièces adverses hors du plateau !","6379805581447060110":"Un jeu très simple, mais, saurez-vous gagner à chaque fois ?","5716165296000343717":"La version irlandaise de la famille de jeu Tafl ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","2776505193142258762":"Éliminez tous vos ennemis sur un plateau qui rapetisse petit à petit !","2248512434888126204":"Mettez deux de vos pièces sur la plateau à chaque tour, et soyez le premier à en aligner six !","1528017893097093154":"Cachez toutes vos pièces avant votre adversaire, ou risquez d'être découvert !","4487850967365387707":"Passez votre balle jusqu'à l'autre bout du plateau pour remporter la partie !","1337301714912876574":"Déposez vos pièces et déplacez les afin d'aligner deux pièces de la même couleur au travers du plateau pour gagner !","1207528295664437538":"Empilez vos pièces pour en contrôler un maximum et gagner !","7930050431770016664":"Un morpion amélioré où les pièces peuvent en encapsuler d'autres pour éviter la défaite.","8971165322320863634":"Un jeu inspiré de l'antiquité. Soyez le premier à percer les lignes adverses !","1787395418772268592":"Un jeu hexagonal d'alignement. Insérez vos pièces sur le plateau pour capturer les pièces de l'adversaire !","6676975125770922470":"Le plus vieux jeu de stratégie encore joué. Un jeu de contrôle de territoire","7267838821174516266":"Un jeu d'alignement hexagonal avec de drôles de \"diagonales\" !","4865500405661191388":"Vous contrôlez une colonie d'insectes. Utilisez les capacités de vos insectes pour bloquer la reine de votre adversaire afin de gagner !","3910056094130316471":"Votre but est simple : atteindre la dernière ligne. Mais la pièce que vous déplacez dépend du mouvement de votre adversaire !","8831529968086851272":"Cousin du jeu de Dame, capturez les pièces adverses, libérez les vôtres, et immobilisez l'adversaire pour gagner la partie !","8165475229121998889":"Regroupez vos pièces pour gagner. Mais les mouvements possibles changent constamment !","8346622786152147853":"Gagnez des points en capturant des pièces, mais en ne contrôlant que celles dans votre camp !","8186407897395128360":"Poussez et écrasez les pièces de votre adversaire en utilisant les forces magnétiques !","287142221400627248":"Le classique Puissance 4 !","7007940005713233193":"Posez une pièces, ensuite tournez un quadrant. Le premier à aligner 5 pièces gagne !","3362876946788995618":"Vous pouvez aligner 5 pièces pour gagner, ou vous pouvez aussi gagner en capturant 10 pièces de votre adversaire !","1621892382051781255":"Superposez vos pièces et utilisez deux mécaniques de jeux pour conserver vos pièces. Le premier joueur qui n'a plus de pièce perd !","3383193846061013912":"Faites un alignement gagnant. La difficulté : vous ne choisissez pas la pièce que vous placez !","7277920626199847666":"Dupliquez-vous pour conquérir le plateau !","3529667957993318888":"Alignez 5 de vos pièces sur un plateau dont les pièces glissent !","6046365494353024298":"Prenez en sandwich les pièces adverses pour dominer le plateau !","1827371853303540301":"Soyez le premier à immobiliser une pyramide de l'adversaire !","1409973335731836872":"Soyez le premier à pousser une montagne hors du plateau !","5737474371494262748":"Placez vos pièces hexagonales les unes à côté des autres et soyez le premier à créer une des trois formes requises pour gagner !","1177593339964527523":"La version lapone de la famille de jeux Tafl ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","6432141756227180076":"Alignez vos 4 pièces ou placez les en carré pour gagner !","265614119354246271":"Alignez 5 pièces de votre couleur en ligne droite, mais attention, les pièces peuvent s'empiler !","387599343584202424":"Une version du Go sur des cases triangulaires !","3778423604946977624":"Le jeu de plateau des Vikings ! Les envahisseurs doivent capturer le roi, tandis que les défenseurs doivent le faire s'échapper !","6188072401668860107":"Une version moderne du jeu de stratégie africain connu!","8852931932150400681":"Le plus répandu des jeux de la famille Mancala.","1675508830863089385":"Le plus répandu des jeux de la famille Mancala à plusieurs tours.","7926456268600574942":"Alignez vos pièces pour marquer des points, mais attention aux retournements de pièces !","3012694567108651369":"Cette valeur est obligatoire","4408456168772857996":"{$PH} est trop petit, le minimum est {$PH_1}","701935636628882602":"{$PH} est trop grand, le maximum est {$PH_1}","5607669932062416162":"Par défaut","2018922024247045709":"Largeur","7080802734755670775":"Graines par maison","1086558575410854374":"Nourrir la maison d'origine","1571603835358328677":"Nourrir est obligatoire","7654623560547531779":"Passer par le magasin","8576122948092687879":"Continuer la distribution après que la dernière graine soit tombée dans le magasin","356626260857129297":"Continuer la distribution jusqu'à une capture ou à une maison vide","9195784792324730674":"Le trône central est quitté définitivement","2524296888634788857":"Les bords sont l'ennemi du roi","2642196868516331796":"Le trône central peut encercler le roi","3540730147473795195":"Le roi loin du trône central peut être sandwiché","3329390039243374527":"L'envahisseur commence","3033623772164647792":"Hauteur","287623417167941506":"Handicap","6402320009813668873":"13 x 13","4066004856246691695":"9 x 9","718535138834335364":"Puissance 4","1525715186822490677":"Awalé","8844589419403065948":"Quarto","8322068603814456434":"Tablut","3244681266393689381":"Reversi","7297944290589265560":"Go","8208823537494951803":"Encapsule","4883858894354428469":"Siam","5046769358659448397":"Sahara","7602922439944541721":"Pylos","773015283188822187":"Kamisado","8323142856025602350":"Quixo","8191425615273627117":"Dvonn","7644192101130519142":"Epaminondas","5348930337239726346":"Nombre de rangées vides","7516610645583911732":"Nombre de rangées de soldats","2969677193390047071":"19 x 19","4541467181400942955":"Gipf","1147571728036986329":"Coerceo","3553471239341143775":"Six","240931235644942730":"Lines of Action","3574809577617204460":"Pentago","5816181883959997447":"Abalone","5094417734463136297":"Yinsh","4497962271113144657":"Apagos","947579386294731197":"Brandhub","4214831981215024999":"Conspirateurs","4371580300145721044":"Échecs Martiens","5306696079242551443":"Hnefatafl","692005285727565478":"Lasca","8745205959337703089":"Connect Six","7128132932954450153":"Pente","6202245590217996824":"Teeko","4321462166273172721":"Kalah","809030787784855848":"Diaballik","1493565703246564578":"Ba-awa","2597247746010343961":"Squarz","2686476818050661110":"Hexodia","6233664534580457703":"Trigo","1760292529513431093":"Trexo","6220801899147470326":"Hive","2246994058243837093":"Diam","3008721792091269753":"Lodestone","2218572265318708454":"Création de compte","9018459935889527317":"Un email de confirmation vous sera envoyé pour valider votre compte.","5248717555542428023":"Nom d'utilisateur","8783355485855708287":"Le mot de passe doit faire au moins 6 caractères","3412247232926911550":"Vous avez déjà un compte ?","2565164139557117651":"Réinitialisation de mot de passe","2687175749283802253":"Un email vous sera envoyé avec les instructions pour réinitialiser votre mot de passe.","6808826847039952270":"L'email a été envoyé, veuillez suivre les instructions qui s'y trouvent.","1519954996184640001":"Erreur","6535780676661833462":"Erreur lors de la création du compte","3204200407244124341":"Créer un compte avec Google","7656395805241225659":"Parties","5674286808255988565":"Créer","2299187798995800780":"Chat","4643591148728960560":"Jeu","3710582909570607859":"Premier joueur","4060021930998903329":"Deuxième joueur","8503767092684163333":"Tour","689957366051097321":"En attente d'adversaire","7103588127254721505":"Thème","2826581353496868063":"Langue","413116577994876478":"Clair","3892161059518616136":"Foncé","8940072639524140983":"L'email a été envoyé","141258547622133215":"Pour finaliser votre compte, vous devez choisir un nom d'utilisateur.","7631774219107043658":"Votre compte est maintenant finalisé, vous pouvez retourner à {$START_LINK}la liste des jeux{$CLOSE_LINK}.","293336831363270094":"Choisir un nom d'utilisateur","6996804354508674341":"Vérification du compte","2730621369346437278":"Pour finaliser votre compte, vous devez cliquer sur le lien qui a été envoyé sur votre adresse email ({$INTERPOLATION}). Cet email peut être arrivé dans vos spams.","4295852829952528556":"Après avoir vérifié votre email, clickez sur le bouton suivant :","881022283381326299":"Finaliser la vérification d'email","921630192161780240":"Si vous n'avez pas reçu d'email de vérification, cliquez sur le bouton suivant :","4592546836544908536":"Ré-envoyer l'email de vérification","3862672024084051383":"Vous n'avez pas vérifié votre email ! Cliquez sur le lien dans l'email de vérification.","2009811124619716606":"Créer un jeu en ligne","7868391487776969346":"Voir toutes les parties en ligne","8564202903947049539":"Jouer","6899134966533859260":"Apprendre","5723949445116321937":"EveryBoard","6808393327735679948":"EveryBoard est un site qui permet de jouer et d'apprendre les règles de nombreux jeux de stratégie combinatoire à information parfaite.{$LINE_BREAK} On comprend donc là dedans les jeux ne faisant intervenir ni hasard, ni agilité, ni informations cachées, et uniquement des jeux deux joueurs et tours par tours.","2129768251160483742":"Ce n'est pas votre tour !","443650994975920138":"Ce jeu ({$PH}) n'existe pas.","777716481777788338":"La partie que vous essayez de rejoindre n'existe pas.","7285945849261218681":"Cette partie est terminée.","7800061171704298797":"Humain","3795472118461355324":"Choisissez les options","3272612818120648715":"{$INTERPOLATION} points","8647687729200262691":"Match nul","2981217201452500939":"Commencer une nouvelle partie","342909021169073473":"Commencer avec cette configuration","960848013465225718":"Vous avez gagné","1041065984971815594":"Vous avez perdu","1836885699974320953":"{$PH} (Joueur {$PH_1}) a gagné","7464693809033181033":"L'IA a effectué un mouvement illégal ! C'est une situation inattendue dont nous avons pris note. Nous essayons de résoudre cela au plus vite. En attendant, considérez que vous avez gagné !","6267418979719843573":"Passer son tour","6128115494237258310":"Reprendre un coup","1944212987695444934":"Tour n°{$INTERPOLATION}","2993214884777755957":"Joueur {$INTERPOLATION}","5675185658977082941":"Joueur {$PH}","8487548203433588213":"{$PH} a gagné","5468318552081538104":"C'est à votre tour.","3724541577412345595":"C'est au tour de {$INTERPOLATION}","3492340771384313804":"Abandonner","5705819340084039896":"Proposer un match nul","1601597703777069856":"{$INTERPOLATION} a épuisé son temps. Vous avez gagné.","7814033294193818165":"Vous avez épuisé votre temps.","7003355968351203755":"Demander à reprendre un coup","4830863788651301313":"Vous avez accepté un match nul.","5730736324595001106":"Votre proposition de match nul a été acceptée.","5277703651684233917":"Un match nul a été convenu.","2826140657122926749":"Vous avez abandonné.","2324913504104154958":"{$INTERPOLATION} a épuisé son temps.","4624707315308487849":"Retour à la liste des parties","7250880851290385128":"{$INTERPOLATION} a abandonné.","7815479892408473764":"Vous avez gagné.","5096328327178345486":"05:00","4506170566742059239":"00:30","860662988722297223":"Vous avez perdu.","6165538570244502951":"Victoire de {$INTERPOLATION}.","4073116770334354573":"Blitz","3120304451891406993":"Durée maximale d'un tour : ","7590013429208346303":"Personnalisée","3154403333894623756":"Temps personnalisé","6773728044030876768":"Durée maximale d'une partie : {$START_TAG_STRONG}{$INTERPOLATION} par joueur{$CLOSE_TAG_STRONG}","1612262766071402559":"Proposer la configuration","6482290849972032593":"Annuler la partie","4247449258896721566":"Adversaires","2561597132169540579":"Les adversaires potentiels qui rejoignent la partie apparaîtront ici. Si personne n'arrive, vous pouvez :","1406698782162165226":"Chercher d'autres parties","5070629625537228486":"Jouer contre une IA","5056292777668083757":"Cliquez sur l'adversaire contre lequel vous souhaitez jouer.","594218318757354614":"Durée maximale d'une partie : {$START_TAG_OUTPUT}{$INTERPOLATION} par joueur{$CLOSE_TAG_OUTPUT}","8953033926734869941":"Nom","3193976279273491157":"Actions","8698515801873408462":"Sélectionner","326145407473587685":"Changer la configuration","9099721398759347967":"Proposition de configuration pour {$INTERPOLATION}","7416818230860591701":"Vous avez été choisi comme adversaire{$LINE_BREAK}{$INTERPOLATION} est en train de modifier la configuration.","6747612030990351046":"{$INTERPOLATION} propose de faire une partie {$INTERPOLATION_1}","3649232689954543597":"un tour dure maximum {$START_TAG_STRONG}{$INTERPOLATION}{$CLOSE_TAG_STRONG}","8496859383343230204":"vous jouez en premier","8194858011161710862":"le premier joueur est tiré au hasard","1012784993066568401":"Accepter et commencer","7852346564484185703":"la partie dure maximum {$START_TAG_STRONG}{$INTERPOLATION} par joueur{$CLOSE_TAG_STRONG}","7265061399015519876":"Un instant...","7215535622740824911":"{$INTERPOLATION} joue en premier","4218388977213486334":"{$INTERPOLATION} a proposé une configuration à {$INTERPOLATION_1}.","5068486659312004369":"{$INTERPOLATION} est en train de configurer la partie.","3923856758825729241":"Création d'une partie de {$INTERPOLATION}","7709161982270147002":"Premier joueur aléatoire","5246623381325349376":"Vous commencez","7738132709044699358":"{$INTERPOLATION} commence","4492847529610715272":"L'adversaire commence","8926567047186783072":"Temps standard","4412958068611913614":"personnalisée","4002042094548821129":"rapide","4301395065979241317":"standard","3852843717175527075":"La partie a été annulée !","3008420115644088420":"Configuration","7137133530752645682":"{$PH} a quitté la partie, veuillez choisir un autre adversaire.","6594123400599013490":"Étape finie !","5395533573244657143":"Cette étape n'attends pas de mouvements de votre part.","7583363829279229518":"Félicitations, vous avez fini le tutoriel.","1930146585049479552":"Vous ne pouvez pas cliquer, ceci est une démo.","2201596715619103633":"Vous ne pouvez pas déplacer de pièce porteuse.","6439401135646542284":"Échec","6650633628037596693":"Essayez à nouveau","8720977247725652816":"Vu","6962699013778688473":"Continuer","4563965495368336177":"Passer","7757774343229747209":"Jouer localement","6620520011512200697":"Voir la solution","2467835697178117742":"Vous ne pouvez pas déplacer plus de {$PH} de vos pièces !","4278049889323552316":"Vous n'avez pas assez de pièce pour pousser ce groupe !","8378144418238149992":"Vous ne pouvez pas pousser cette/ces pièce(s) car elle est bloquée par l'une des vôtres !","7864006988432394989":"Cette ligne contient des pièces de l'adversaire ou des cases vides, ceci est interdit.","507376328570453826":"Ce mouvement est impossible, certaines case d'atterrissage sont occupées.","6088417909306773667":"Cette case n'est pas alignée avec la ligne actuellement formée.","7060616157443124451":"Nombre de pièces à capturer pour gagner","1103013531201615772":"Taille maximale d'un groupe poussant","1280308994802128299":"Abalone Mortel","8893431763975992974":"Plateau initial et but du jeu","4780631467843839550":"Configuration des règles","5878048397926852057":"À l'Abalone, le but du jeu est d'être le premier joueur à pousser 6 pièces adverses en dehors du plateau. Voyons voir comment !","4612562967450553112":"Déplacer une pièce","5190193689067477069":"Chaque tour, déplacez une, deux ou trois pièces, soit le long de leur alignement, soit par un pas de côté. Pour vos déplacement vous avez donc au maximum à choisir parmi 6 directions. Les trois pièces à déplacer doivent être alignées et immédiatement voisines et atterrir sur des cases vides (sauf pour pousser, ce que nous verrons plus tard). Pour effectuer un déplacement, cliquez sur une de vos pièces, puis cliquez sur une flèche pour choisir sa direction.
Vous jouez Foncé, faites n'importe quel mouvement !","3762527362373672599":"Bravo !","272253201636921624":"Pousser","2330775081318125963":"Pour pousser une pièce de l'adversaire, vous devez déplacer au moins deux de vos pièces. Pour pousser deux pièces, vous devez déplacer trois de vos pièces. Si une de vos pièces est placée juste après une pièce adverse que vous poussez, pousser sera alors interdit. Vous ne pouvez pas déplacer plus de trois pièces.
Une seule \"poussée\" vers la droite est possible ici, trouvez la (vous jouez Foncé).","1578933364998292635":"Pour faire une translation d'un groupe de pièces, vous devez sélectionner la première pièce, puis sélectionner la dernière, puis cliquer sur une des 4 directions latérales dans laquelle le groupe peut bouger sans toucher de pièces adverses.
Allez-y, faites une translation.","3110387991397245428":"Ceci n'est pas une translation, c'est une poussée, essayez une translation.","4948237861189298097":"Bravo ! Vous savez tout ce qu'il faut pour commencer une partie !","2565981183757255753":"Vous verrez en créant votre première partie, que vous pouvez configurer deux choses.
Premièrement, le nombre de captures nécessaires pour gagner. La valeur par défaut est 6, la changer permet de changer la durée des parties.
Dernièrement, la taille maximale d'un groupe déplacé. Cette valeur et à 3 par défaut, mais si vous voulez une partie plus chaotique et amusante, vous pouvez augmenter ce nombre et jouer une version alternative plus \"puissante\" !
","4382056880714150954":"Les pièces ne peuvent se déplacer que vers le bas !","6303549979055320494":"Cette case est déjà complète, vous ne pouvez pas y ajouter une pièce !","4038709557650879610":"Vous n'avez plus de pièces dans cette case, choisissez-en une qui contient au moins une de vos pièces !","7840393692836937676":"Il ne reste plus de pièces de cette couleur à poser !","139135108801629927":"Il n'y a pas de transfert possible pour cette case !","8322338146903087210":"À Apagos, il y a 4 cases, chacune contient un nombre fixe d'emplacements pouvant contenir des pièces. Chaque joueur commence avec 10 pièces. Les pièces foncées appartiennent au premier joueur, les claires aux deuxième. Le jeu fini quand personne ne sais jouer. Le joueur possédant le plus de pièce dans la case la plus à droite gagne !","4304656288372447065":"Pose","4169063394256604189":"Un des deux types de coup est la pose. Pour en faire une, vous devez cliquer sur une flèche, qu'elle soit de votre couleur ou de celle de l'adversaire. Si la case choisie est l'une des trois les plus à gauche, elle échangera sa place avec celle juste à sa droite.
Vous jouez Clair. Posez une pièce sur l'une de ces trois cases.","8402696305361715603":"Transfert","1035614445063065926":"L'autre type de mouvement est le transfert.
Choisissez une de vos pièces sur le plateau en cliquant sur la case qui la contient ;
Choisissez sa destination en cliquant sur la flèche au dessus de celle-ci pour finir le transfert.
Cela peut seulement être fait avec une de vos pièces, d'une case à une autre case plus basse.
Vous jouez Foncé, faites un transfert!","2553091915151695430":"Ce coup est une pose ! Veuillez faire un transfert !","4189334243342030215":"Vous devez égréner une maison qui n'est pas vide.","8846202449877054997":"Vous devez nourrir mais ne le faites pas.","6065363643959580719":"Info bonus : Kalah a été crée aux U.S.A en 1940 par William Julius Champion Jr.","3167543473532430011":"Le Kalah","3586015705184533702":"Les maisons à l'extrême gauche et droite, non alignées avec les autres, sont les Kalah, le vôtre est à gauche, celui de l'adversaire à droite. Quand vous distribuez, avant de passer de votre maison la plus à gauche à la maison la plus à gauche de l'adversaire, vous devez déposer une graine dans votre Kalah. Mais vous ne devrez pas distribuer dans le Kalah adverse. Quand vous capturez, les graines sont déposées dans votre Kalah.
Vous jouez Foncé. Faites un mouvement qui passe par votre Kalah puis par les maisons adverses.","108833396164233870":"Voilà, trois maisons on été remplies en plus de votre Kalah.","7327320572157893918":"Raté. Distribuez une des trois maisons du bas les plus à gauche.","5657099545651336771":"Quand votre distribution finit dans le Kalah, vous êtes autorisé à distribuer à nouveau.
Vous jouez Foncé, faites la distribution qui termine dans votre Kalah, puis une seconde distribution !","1468463450299215954":"Ce coup ne distribue qu'une seule maison, faites une distribution qui finit dans le Kalah puis une deuxième !","723370864893318309":"Quand votre dernière graine finit dans une de vos maisons vides, si la maison en face est remplie, alors vous capturez le graines de ces deux maisons. Sur ce plateau, c'est faisable.
Vous jouez Foncé, faites une capture !","1044092391656953455":"Vous n'avez pas capturé, réessayez !","960197745594900358":"À n'importe quel moment, si un joueur a plus de 24 graines dans son Kalah, il gagne. Cela peut arriver avant que le plateau soit vide, mais, il y a un autre moyen. Quand vous n'avez plus aucune graine dans vos maison, le jeu s'arrête et votre adversaire prends toutes les graines restantes de ses maisons. Ici, votre adversaire n'a besoin que d'un point en plus pour gagner, et il l'aura au prochain tour si vous ne faites rien.
Vous jouez Foncé, gagnez !","7013769989797891949":"Puisqu'il n'y a plus de graines dans les maisons adverses, vous avez capturé toutes vos graines. Félicitations, vous avez gagné !","902849596357033257":"Raté, vous avez donné un graine à l'adversaire ! Réessayez !","2949583224863920715":"Égrénage","8108647656025671310":"Le mouvement principal aux mancalas est la distribution. Voyons voir comment les graines sont distribuées. Vous jouez Foncé, les 6 maisons du bas sont les vôtres.
Quand vous distribuez une maison, les graines qu'elle contient sont égrenées dans le sens horaire, une graine par maison.
Cliquez sur la maison la plus à droite !","8909995708712093055":"Voilà, regardez les 4 maisons suivant la maison choisie dans le sens horaire, elle comptent maintenant une graine en plus. C’est comme cela que les graines se distribuent, une à une à partir de la maison suivante dans le sens horaire depuis la maison d’où elles viennent.","8587148937080588417":"Raté. Distribuez la maison en bas à droite.","8109801868756013772":"Gros égrénage","6143584678937647226":"Quand il y a assez de graines pour faire un tour complet, quelque chose d’autre se passe.
Vous jouez Foncé. Distribuez la maison qui contient 12 graines.","498712253814253582":"Voyez, la maison distribuée n’a pas été reremplie et la distribution a continué immédiatement à la maison suivante (qui contient donc deux graines) !","6009621890963077533":"Capture simple","8492785011380422172":"Après une distribution, si la dernière graine tombe dans une maison du camp adverse et qu'il y a maintenant deux ou trois graines dans cette maison, le joueur capture ces deux ou trois graines.
Vous jouez Foncé, faites une capture !","1449179615423109818":"Bravo ! Il s'agissait ici d'une capture simple, voyons maintenant une capture composée.","9012344731580734627":"Raté. Vous n'avez rien capturé. Essayez à nouveau.","3104604410220998192":"Capture composée","4514452777310919130":"En distribuant la maison la plus à gauche, vous terminerez dans la deuxième maison la plus à gauche, qui en contient maintenant 2, donc ce sera une capture. Mais maintenant, la maison juste à gauche en contient 3, ce qui est également capturable, donc cette maison sera capturée aussi !
Vous jouez Foncé, faites une capture !","830087202472977218":"Bravo, vous gagnez 3 points dans la première maison plus 2 dans la seconde !","7123653594948067002":"Score","7183112140529419891":"MCTS","437214181691581058":"Capture interrompue","7194484246142571256":"En cliquant sur votre maison la plus à gauche, vous atterrissez sur la 3ème maison, qui est capturable.
Vous jouez Foncé, faites une capture !","2820925339032006267":"Constatez que la 2ème maison n’étant pas capturable, la capture a été interrompue et vous n’avez pas pu capturer la 1ère maison.","5352377142224231024":"Capture chez l'adversaire uniquement","8733312107623328684":"Vous jouez Foncé. Essayez de capturer les deux maisons les plus à gauche de l’adversaire.","1347673606182808434":"Bravo ! Constatez que la capture s'est interrompue en arrivant dans votre territoire car on ne peut pas capturer ses propres maisons !","7890197140479173967":"Vous n'avez capturé qu'une seule maison, recommencez !","2796272222228002710":"Ne pas affamer","4974882008918401392":"Vous avez une très belle capture qui semble possible. Il semble que vous puissiez capturer tous les pions de l’adversaire !
Vous jouez Foncé. Lancez-vous !","2671440213973633925":"Malheureusement, vous ne pouvez pas capturer, car sinon l’adversaire ne pourrait pas jouer après vous. À ces moments là, le mouvement est autorisé mais la capture n’est pas effectuée !","6033788914683606777":"Nourrir est obligatoire","1521992636044776742":"\"Affamer\" est interdit, c'est-à-dire que si votre adversaire n'a plus de graines et que vous savez lui en donner au moins une, vous êtes obligé de le faire.
\n Vous jouez Foncé. Donnez une graine à votre adversaire !","6607296153653792913":"Bravo ! Notez que vous pouvez choisir de lui en donner le moins possible si cela vous arrange mieux. C’est souvent un bon moyen d’avoir des captures faciles !","2281492801612237310":"Fin de partie","6064716171153653290":"Une partie est gagnée dès qu’un des deux joueurs a capturé 25 graines, car il a plus de la moitié de leur total.
Vous jouez Foncé, distribuez la maison la plus à gauche.","4966070806582905191":"Aussi, dès qu'un joueur ne peut plus jouer, l’autre joueur capture toutes les graines dans son propre camp. Ici, c'était à vous de jouer et au joueur suivant de récolter toutes les graines restantes, en mettant ainsi fin à la partie.","6243517581301426418":"Partager les graines finales équitablement","796568684338354748":"Ba-awa équitable","6179314931812970793":"Info bonus: Ba-awa, aussi appellé Adi, est joué principalement au Ghana.","2932513123180634807":"Distribution à plusieur tours","1218183221112518220":"Cependant, la distribution ne s'arrête que quand la dernière graine est déposée dans une maison qui contient (avant déposage) zéro ou trois graines.
Vous jouez Foncé, faites un mouvement comme cela !","4875172921761216929":"Donc, après atterissage dans la maison avec 2 graines (puis 3), un second tour a commencé.","6145120372687543421":"Captures pendant la distribution","3249311152250368197":"Si, durant une distribution, vous passez pas une de vos maison qui contient 3 graines, et déposez une quatrième graine, vous capturez la maison immédiatement, puis continuez la distribution !
Vous jouez Foncé, faites un tel mouvement !","9198664076697170304":"Félicitations, vous capturez 4 graines.","5715964665371191258":"Si, durant une distribution, vous passez pas une maison de l'adversaire qui contient 3 graines, et déposez une quatrième, l'adversaire capture la maison immédiatement, pendant que vous continuez la distribution.
Vous jouez Foncé, faites un tel mouvement !","1192652665972488441":"VOilà, l'adversaire a capturé 4 graines.","4239012084263051063":"Cependant, si votre dernière graine est déposée dans une maison de l'adversaire qui contient 3 graines (4 avec votre graine), vous capturez immédiatement la maison !
Vous jouez Foncé, faites un tel mouvement !","3868200086323207176":"À la fin d'un tour, si le nombre total de graines tombe à 8 ou moins, le premier joueur (Foncé) capture les graines restantes.
Vous jouez Foncé, terminez le jeu en capturant !","2821967115826330186":"Voilà, vous capturez toutes les graines restantes.","8840015526202664476":"Vous devez distribuer une de vos maisons.","6011590532570079359":"Votre pion doit atterrir sur l'un des six triangles les plus proches de même couleur que la case sur laquelle il est.","117738177627572036":"Vous n'avez pas assez de tuiles à échanger pour capturer cette pièce. Choisissez une de vos pièces et déplacez-la.","6928762188180587282":"Votre premier clic doit être sur une de vos pièce pour la déplacer, ou sur une pièce de l'adversaire pour l'échanger contre deux tuiles.","7341385722923686160":"Vous ne pouvez pas capturer sur une case vide.","5853742640794164153":"Utiliser un petit plateau","1137390440747939689":"Vous ne pouvez pas capturer vos propres pièces.","8275758037847807394":"Le Coerceo se joue sur un plateau comme ceci, composé de tuiles hexagonales, comportant chacune 6 triangles. Les triangles sont les cases où les pièces se déplacent tout le long de la partie. Les tuiles sont séparable du reste du plateau (vous verrez comment plus tard). Les pièces foncées appartiennent au premier joueur et ne se déplaceront toute la partie que sur les cases foncées, les pièces claire appartiennent au second joueur et ne se déplaceront également que sur les cases claires. Le but du jeu au Coerceo est de capturer toutes les pièces de l'adversaire.","2354817630223808522":"Deplacement","9151826160725505568":"Pour effectuer un déplacement, il faut :\n \n
Cliquer sur l'une de vos pièces.
\n
Cliquer sur l'une des cases triangulaires encadrées en jaune.
\n \n Vous pouvez passer à travers les pièces adverses.
\n Vous jouez en premier, vous jouez donc Foncé, faites n'importe quel déplacement.","3313068005460528101":"Bravo, voyons ensuite les captures.","5216257512116603462":"Captures","4864789526486078372":"Chaque pièce a trois cases triangulaires voisines (2 sur les bords).\n Quand toutes les cases voisines sauf une sont occupées, et qu'une pièce de l'adversaire vient se déplacer sur cette dernière case libre, votre pièce est capturée !\n Cependant, il est possible pour un joueur de se placer entre 3 pièces adverses (ou 2 contre un bord) sans être capturé.
\n Vous jouez Clair, effectuez une capture","1766583918856668821":"Raté, vous n'avez pas capturé de pièce !","8225905705628695723":"Gagner une tuile","9136644118167529369":"Quand une tuile est quittée, elle devient potentiellement enlevable du plateau.\n Pour qu'elle soit enlevée, il faut qu'au moins trois de ses bords soient libres, et qu'ils soient l'un à côté de l'autre.\n Notez que si une tuile vide et voisine d'une tuile qu'on vient de retirer devient retirable, elle sera retirée.\n Par exemple, ci-dessous, en quittant sa tuile le pion foncé le plus haut ne déconnectera pas celle-ci !\n Mais en quittant la tuile en bas à gauche, deux tuiles seront enlevées.
\n Vous jouez Foncé, effectuez un mouvement pour récupérer deux tuiles.","7294424193498666339":"Raté, vous n'avez pas récupérer les deux tuiles que vous pouviez, essayez à nouveau !","1625619525907045191":"Échanger une tuile","7295193204515268317":"Dès que vous avez au moins une tuile, vous pourrez le voir sur la gauche du plateau.\n Dès que vous en avez deux, vous pouvez, en cliquant sur une pièce adverse, la capturer immédiatement au lieu de déplacer une de vos pièces.\n Cet action vous coûtera deux tuiles.\n Si une ou plusieurs tuile sont retirées pendant ce tour, personne ne les récupérera.
\n Vous jouez Clair, gagnez du temps et capturez directement la dernière pièce adverse !","6149833006202189547":"C'est bien gentil de se déplacer mais en cliquant sur la pièce vous l'aurez immédiatement !","4449916170244566677":"Capture spéciale","8878891269019803":"Dès qu'une tuile est enlevée du plateau pendant votre tour, certaines pièces de l'adversaire peuvent n'avoir plus aucune case voisine libre, elle seront alors capturées !\n Si cela arrivait à l'une de vos pièces, celle-ci resterait cependant sur le plateau.
\n Un coup démontrant ces deux choses est faisable pour le joueur clair, faites-le !","710072872152309867":"Bravo ! Voyez, votre pièce n'a plus de case voisine libre après avoir récupéré la tuile, mais est restée car c'était votre tour.\n Celle de l'adversaire a disparu car la capture de la tuile lui a enlevé sa dernière case voisine libre !","8182472154276317003":"Pièces > Menaces > Tuiles","7668715639068435496":"Captures > Libertés","4996962520612005595":"Pièces > Tuiles > Libertés","8560978883976627945":"Alignement","1631778170068001983":"Connect Six se joue sur un plateau de 19x19, sur lequel des pièces sont placées sur les intersections. Le but du jeu est d'aligner six de vos pièces.","4094188563872795571":"Premier tour","3956994434107981140":"Au premier tour, le premier joueur place une seule pièce.
Vous jouez Foncé, placez votre première pièce en cliquant sur une intersection.","9212980897131132135":"Les tours suivant","4174912343371620775":"Pour tous les tours qui suivent, les joueurs placent deux pièces.
Vous jouez Clair, faites le mouvement gagnant.","4237198021995785268":"Votre pièce doit atterrir sur la case voisine.","6331318865941875967":"Vous ne pouvez pas déposer une pièce pendant la phase de déplacement.","1634970085488730747":"Vous ne pouvez pas déplacer une pièce avant que les deux joueurs n'aient déposés toutes leurs pièces.","320724128460521577":"Un saut doit se faire au dessus d'une pièce, pas au dessus d'une case vide.","6834108574871302489":"Vous devez déposer votre pièce dans la zone centrale du plateau.","8451838259581996755":"Un saut doit atterrir à deux cases de sa position initiale, et doit être en ligne droite dans n'importe quelle direction.","309495911608325428":"Vous passez deux fois par la même case dans votre mouvement. Ce n'est pas autorisé.","4649711232397678200":"Sauts","2678466693137107679":"Conspirateurs se joue sur un plateau 17x17. Le but du jeu et de placer toutes vos pièces dans des cachettes, qui sont des cases spéciales sur les bords du plateau. Remarquez la zone centrale du plateau, où chaque joueur placera initialement ses pièces.","5390926924373994130":"Phase initiale","3249808638587981433":"Dans la phase initiale du jeu, chaque joueur dépose ses 20 pièces, une à chaque tour, dans la zone centrale du plateau. Cette phase n'autorise aucun autre mouvement.
Vous jouez Foncé, déposez l'une de vos pièces dans la zone centrale.","6144661124534225012":"Mouvement simple","8533679028139934991":"Une fois que toutes les pièces ont été placées, deux types de déplacements peuvent être effectués. Le premier est un déplacement simple dans n'importe quelle direction, orthogonale ou diagonale, d'une distance de un.
Vous jouez Foncé. Cliquez sur l'une de vos pièces pour effectuer un tel mouvement.","2743282536649096025":"Vous avez effectué un saut, et non un déplacement simple. Essayez à nouveau !","5311709353029708811":"Sauts","2921068171153120605":"L'autre type de mouvement est le saut. Une pièce peut sauter au dessus d'une pièce voisine dans n'importe quelle direction, tant qu'elle atterri directement sur la case après celle-ci, dans la même direction.
Vous jouez Foncé. Effectuez un saut en cliquant sur l'une de vos pièces qui peut sauter, et ensuite sur la case de destination. Il est possible que vous deviez cliquer une seconde fois sur la case destination pour confirmer votre saut, si votre pièce est toujours entourée (nous verrons ensuite pourquoi cela est utile).","7444294966169001535":"Vous n'avez pas effectué un saut. Essayez à nouveau !","2724052802065983013":"Vous ne pouvez pas déplacer la pièce qui tient la balle.","5364606037550605842":"Vous devez déplacer la pièce d'exactement une case orthogonalement.","2737840191812588251":"Le chemin de cette passe est obstrué.","6962674839842537174":"Une passe doit être faite le long d'une ligne droite, orthogonalement ou verticalement.","7841459528155785625":"Vous ne pouvez faire qu'une seule passe par tour.","898651979160418937":"Vous ne pouvez faire que deux translations par tour, pas trois.","2023900957694052396":"Vous ne pouvez pas passer la balle à l'adversaire. Vous devez choisir une de vos pièces.","6598638598311685089":"Le but à Diaballik est d'amener votre balle, représentée par le petit cercle, du côté adverse (c'est-à-dire, là où ses pièces se situent initialement). La balle est actuellement détenue par votre pièce centrale.","488799603315113699":"Translations","1549947696122814495":"Durant un tour, vous êtes autorisés à faire jusque trois actions, qui incluent au plus deux translations. Une translations est un déplacement orthogonal d'une pièce qui ne tient pas la balle.
Déplacez votre pièce la plus à gauche d'une case. Une fois que vous avez fait cela, cliquez sur le bouton vert qui apparaîtra en bas à drote du plateau, afin d'indiquer que vous avez fini votre tour.","4552397654536129176":"Passer","4859534391622035346":"Une autre action que vous pouvez faire, pas plus d'une fois par tour, est une passe. Vous pouvez passer la balle en cliquant sur la pièce qui tient balle, ensuite sur une autre de vos pièce qui peut la recevoir. Une passe doit être faite le long d'une ligne droite non obstruée.
Ici, en jouant Foncé, vous pouvez faire deux translations et une passe afin de gagner la partie, faites-le !","351600669711653781":"Bloquer l'adversaire","5111602140043708281":"Il y a une règle spéciale contre l'anti-jeu. Si un joueur forme une ligne contiguë, avec une pièce dans chaque colonne, il empêche l'adversaire d'atteindre sa ligne de victoire. Si l'adversaire est en contact avec trois pièces dans un tel cas, cette personne gagne immédiatement la partie.
Ici, en jouant Clair, votre opposant vous bloque et est déjà en contact avec deux de vos pièces. Si vous pouvez le toucher avec une troisième pièce, vous gagnez. Faites-le !","6691085433163106876":"Tous les mouvements","8328626778107972059":"MCTS (3 seulement)","2268888865744326832":"MCTS (pas de duplications)","5930186357813280917":"MCTS (3, pas de duplication)","1337900792840930042":"Distance ({$PH})","514608014907395319":"Enchaîner les sauts en un seul mouvement","2017314282165555162":"Les sauts peuvent être enchaînés quand c'est possible. Vous pouvez décider s'il faut continuer un saut où l'arrêter à tout moment. Pour finir un saut, cliquez une seconde fois sur votre pièce. Sinon, continuez simplement à cliquer sur la case suivante. Une fois qu'il n'est plus possible de continuer à sauter, votre déplacement se termine sans avoir besoin de cliquer sur votre pièce une seconde fois.
Vous jouez Foncé et vous pouvez effectuer un triple saut ! Faites-le.","7823212119691946554":"Bravo ! Vous savez maintenant tout ce qu'il faut pour jouer à ce jeu. Souvenez-vous: pour gagner, vous devez placer toutes vos pièces à l'abri avant votre adversaire.","5361555826660205972":"Vous n'avez pas effectué un triple saut. Essayez à nouveau !","3460005588993308010":"Vous n'avez plus de pièces de ce type.","1718016291859374582":"Vous ne pouvez pas jouer ici : cette case est déjà pleine.","8802049007421476454":"Vous ne pouvez pas ajouter de pièces dans la case ciblée, car elle contiendrait plus de 4 pièces.","3031759944936090505":"Pour déplacer des pièces du plateau, vous devez les déplacer sur une case voisine.","290467566247457693":"Vous devez d'abord sélectionner une pièce hors du plateau, ou une pièce étant sur une case du plateau pour la déplacer.","354630056284498570":"Plateau initial et pièces des joueurs","8818359317795688141":"Le plateau de Diam est un plateau circulaire composé de 8 cases. Chaque joueur possède 8 pièces : 4 d'une couleur, et 4 d'une autre couleur. Initialement, le plateau est vide. Toutes les pièces restantes sont montrées sur les côté du plateau : les pièces de Foncé sur la gauche, les pièces de Clair sur la droite.","6692453785979358274":"À Diam, le but est d'aligner deux de vos pièces, ayant exactement la même couleurs, sur des cases diamétralement opposées, au dessus d'au moins une pièce. Notez qu'ici, Foncé ne gagne pas car ses pièces ne sont pas au dessus d'une autre pièce. Vous jouez Clair. Ici, vous pouvez gagner en déposant une de vos pièces dans la case la plus à gauche. Vous pouvez le faire en cliquant sur la pièce correspondante à côté du plateau, et ensuite sur la case où vous souhaitez déposer votre pièce.
Vous jouez Clair, gagnez la partie !","6480264860477304836":"Raté, vous devez déposer votre pièce sur la case la plus à gauche, en utilisant la pièce de la même couleur que celle que vous avez déjà sur le plateau.","9079191930805040030":"Types de mouvements","357682192015415742":"Vous pouvez effectuer deux types de mouvement : soit déposer une de vos pièces comme vous l'avez fait à l'étape précédente, soit déplacer une de vos pièces sur le plateau, sur une case voisine. Vous pouvez choisir n'importe laquelle de vos pièces, même s'il y a déjà d'autres pièces au dessus. Une seule condition s'applique : ne pas créer une pile de plus de 4 pièces. Quand vous sélectionnez une pièce avec d'autres dessus, toutes les autres pièces se déplacent avec la votre.
Vous jouez Foncé, essayez de déplacer une de vos pièces déjà sur le plateau.","4809034034760688818":"Raté, essayez de déplacer une de vos pièces qui se situe déjà sur le plateau.","8650632621721803918":"Cas spécial","62569781199384353":"Il peut arriver que lors d'un tour, les deux joueurs se retrouvent avec des pièces alignées pour la victoire. Si c'est le cas, le joueur avec l'alignement le plus élevé gagne.
Ici, en jouant Foncé, vous pouvez gagner en effectuant un tel mouvement, faites le !","3765076912748475454":"Raté, essayez de déplacer une pile de pièces vers la gauche.","7535479567631818273":"Simplet","5012524143343727947":"Veuillez choisir une des piles vous appartenant.","5275339386917095598":"Veuillez choisir une pile qui n'est pas vide.","5544760040431913662":"Cette pile ne peut pas se déplacer car les 6 cases voisines sont occupées. Veuillez choisir une pièce avec strictement moins de 6 pièces voisines.","5029201799654426347":"Cette pièce ne peut pas se déplacer car il est impossible qu'elle termine son déplacement sur une autre pièce.","75731290119916717":"La distance effectuée par le mouvement doit correspondre à la taille de la pile de pièces.","8101145555087657570":"Le déplacement doit se terminer sur une case occupée.","9221962864929282978":"Une pile doit se déplacer en ligne droite.","5010267418211867946":"Déplacement","364149588471541692":"Au Dvonn, chaque case hexagonale comporte une pile de pièces.\n Si aucun nombre n'est indiqué sur une pile, c'est qu'elle ne comporte qu'une pièce.\n Le nombre écrit sur une pile correspond au nombre de pièces empilées et donc le nombre de points qu’elle rapporte à son propriétaire.\n Son propriétaire est celui dont une pièce est au sommet de la pile.\n Seul son propriétaire peut déplacer la pile.\n Il ne peut pas la déplacer si elle est entourée par 6 autres piles.\n Il la déplace d’autant de cases que sa hauteur, en ligne droite, et doit atterrir sur une case occupée.\n Cette ligne droite ne peut pas passer le long de l'arête de deux cases voisines, comme le ferait un déplacement vertical.\n Il y a donc six directions possibles.\n Le joueur avec les piles foncées commence.
\n Vous jouez avec Foncé, cliquez sur une pile puis déplacez la d'une case.","8769382369391878948":"Déconnection","4625150132268018420":"Les pièces avec un éclair sont appelées « sources ».\n Quand une pile n’est plus directement ou indirectement connectée à une source, elle est enlevée du plateau.
\n Vous jouez Foncé, essayez de déconnecter une pile de 4 pièces de votre adversaire. Il y a deux façons de le faire, l'une étant mieux que l'autre : essayez de trouver celle-là !","2017860068625343028":"Vous avez bien déconnecté la pile de 4 pièces de votre adversaire, mais lors du mouvement suivant il sera capable de se déplacer sur votre nouvelle pile et de gagner le jeu ! Il existe un meilleur mouvement pour vous, essayez de le trouver.","4457528534020479150":"Bravo, vous avez déconnecté 4 pièces de votre adversaire, et votre opposant ne peut pas atteindre votre nouvelle pile !\n Votre opposant perd donc 5 points : 4 de la pile déconnectée, et un de la pile sur laquelle vous vous êtes déplacé.\n Les piles déconnectées ne seront plus visible au tour suivant.","5374556513202485808":"Se déplacer sur une source","8343021305033605057":"Vous pouvez déplacer vos piles sur n'importe quelle pile.\n Vous pouvez donc prendre contrôle d'une source en déplaçant une de vos piles dessus.\n De cette façon, vous savez que cette pile ne peut jamais être déconnectée, car elle contient une source.
\n Vous jouez Foncé et pouvez prendre contrôle d'une source, faites-le !","6422219434767688772":"Bravo ! Cependant, notez que votre adversaire pourrait plus tard prendre possession d'une de vos piles qui contient une source, faites donc attention quand vous prenez le contrôle d'une source !","2060914977510915101":"Vous n'avez pas pris possession d'une source, essayez à nouveau.","5741584858319850896":"Passer","3832185042961281952":"Il peut arriver que vous n'ayez aucun mouvement possible.\n Si c'est le cas, et si votre adversaire peut toujours effectuer un mouvement, vous devez passer votre tour.
\n Cette situation arrive ici a Foncé.","4959059457063090536":"Quand plus aucun mouvement n’est possible, la partie est finie et le joueur avec le plus de points gagne.
\n Vous jouez Foncé, faites votre dernier mouvement !","2963709509031109432":"Bravo, vous avez même gagné 6 - 0 !","8876232297721386956":"Mauvaise idée, en déplaçant votre pile sur la source, vous auriez gagné votre pièce et gagné un point.","5456673610183497320":"Piles","6059738106874378452":"Vous n'avez plus de pièces de ce type.","2129733726620651846":"Vous devez placer votre pièce sur une case vide ou sur une pièce plus petite.","5649666705061470825":"Veuillez choisir une de vos pièces parmi les pièces restantes.","5001561383056924621":"Veuillez sélectionner une de vos pièces restantes, ou une case sur le plateau où vous avez la pièce la plus grande.","2209428336874697936":"Vous effectuez un déplacement, choisissez votre case de destination.","3734443501087651549":"Nombre de différentes tailles de pièces","893013149323570447":"Nombre de pièces pour chaque taille","7821413127222759201":"Le but du jeu à Encapsule est d'aligner trois de vos pièces. Ici, Foncé gagne.","9069271074421658276":"Placement","6720382486946228687":"Ceci est le plateau de départ.
\n Vous jouez Foncé. Choisissez une des pièces sur le côté du plateau et placez la sur le plateau.","864238899096934560":"Un autre type de coup à Encapsule est de déplacer une de ses pièces déjà sur le plateau.
\n Vous jouez Foncé. Cliquez sur votre pièce foncée et puis sur n'importe quel emplacement vide du plateau.","7502910762990406647":"Spécificité","3463587376927829861":"À Encapsule, les pièces s'encapsulent les unes sur les autres. Il est donc possible d'avoir jusqu'à trois pièces par case ! Cependant, seulement la plus grosse pièce de chaque case compte : il n'est pas possible de gagner avec une pièce « cachée » par une pièce plus grande. De même, il n'est pas possible de déplacer une pièce qui est recouverte par une autre pièce plus grande. Finalement, il est interdit de recouvrir une pièce avec une autre pièce plus petite. Ici, Foncé peut gagner à ce tour de plusieurs façons.
Vous jouez Foncé, essayez de gagner en effectuant un déplacement, et non un placement (c'est à dire en déposant une nouvelle pièce).","6204412729347708092":"Vous avez gagné, mais le but de l'exercice est de gagner en faisant un déplacement !","360730166369316579":"Attaque","5530182224164938313":"La distance de déplacement de votre phalange la fait sortir du plateau.","9197994342964027306":"Il y a quelque chose dans le chemin de votre phalange.","5389576774289628382":"Votre phalange doit être plus grande que celle qu'elle tente de capturer.","8675949818775194064":"Vous avez pris une phalange de {$PH} pièces de long et l'avez déplacé de {$PH_1} pas. Les phalanges ne peuvent pas se déplacer de plus de pas que leur longueur.","5151115756771676188":"Cette case n'est pas alignée avec la direction de la phalange.","5279717712059022209":"Une phalange ne peut pas contenir de pièce hors du plateau.","3733956045714659124":"Une phalange ne peut pas contenir de case vide.","2183903120219891237":"Une phalange ne peut pas contenir de pièce de l'adversaire.","5986717000369124597":"Pièce > Domination de colonne > Alignement > Présence en colonne","4563771339790181195":"Positionnel","8733936607898144583":"Plateau initial","3763163349245523745":"Ceci est le plateau de départ. La ligne tout en haut est la ligne de départ de Clair. La ligne tout en bas est la ligne de départ de Foncé.","6716022766676912093":"Après plusieurs déplacements, si au début de son tour de jeu, un joueur a plus de pièces sur la ligne de départ de l'adversaire que l'adversaire n'en a sur la ligne de départ du joueur, ce joueur gagne. Ici, c'est au tour de Foncé de jouer, il a donc gagné.","2623510393491755816":"Dans ce cas ci, c'est au tour de Clair, et celui-ci gagne, car il a deux pièces sur la ligne de départ de Foncé, et Foncé n'en a qu'une sur la ligne de départ de Clair.","2973098153638160177":"Voici le plateau de départ, c'est à Foncé de commencer. Commençons simplement par un déplacement d'une seule pièce :
Cliquez sur une pièce.
Cliquez sur une case voisine libre.
Vous jouez Foncé, déplacez une pièce.","3304007702447669410":"Félicitations, vous avez un pas d'avance, ce n'est malheureusement pas l'exercice.","5177233781165886499":"Voilà, c'est comme ça qu'on déplace une seule pièce.","3060866055407923547":"Déplacement de phalange","6553475319799851486":"Une ligne de plusieurs pièces est appellée une phalange. Voyons maintenant comment déplacer une phalange le long d'une ligne :
Cliquez sur la première pièce de la phalange.
Cliquez sur une des cases encadrées en jaune; vous pouvez bouger votre phalange au maximum d'autant de pas que sa longueur.
Vous jouez Foncé, déplacez une phalange !","108222118450000526":"Raté ! Vous n'avez bougé qu'une pièce.","9139891273410430459":"Bravo ! Les pièces déplacées doivent être horizontalement, verticalement, ou diagonalement alignées. Le déplacement doit se faire le long de cette ligne, en avant ou en arrière. Il ne peut y avoir ni pièces adverses ni trous dans la phalange.","5270412400264809136":"Pour capturer une phalange de l'adversaire, il faut que celle-ci soit alignée avec la phalange en déplacement, et strictement plus courte. La première pièce de votre phalange doit atterrir sur la première pièce rencontrée de la phalange à capturer. Vous jouez Foncé, capturez une phalange.","5979772757820095272":"Bravo, vous avez réussi. Constatez que la phalange diagonale n'étant pas alignée avec la notre, sa longueur supérieure n'empêche pas de capturer ses pièces dans un autre alignement. ","4418812710815829575":"Raté, vous n'avez pas capturé la phalange.","7226802484619632640":"Une capture ne peut que se faire si 4 pièces de votre couleur sont alignées, ce n'est pas le cas.","6918785733984182442":"Veuillez choisir une capture valide qui contient 4 pièces ou plus.","6602326768713192004":"Il vous reste des captures à effectuer.","2434818181880718873":"Les pièces doivent être placée sur une case du bord du plateau.","7875793227562861246":"Veuillez choisir une direction valide pour le déplacement.","1164530071087410710":"Veuillez choisir un placement avec une direction.","1848361274892061756":"Veuillez effectuer un placement sur une ligne non complète.","1025279631840419081":"Veuillez sélectionner une autre case de la capture que vous souhaitez prendre, celle-ci appartient à deux captures.","8708684300793667483":"Veuillez sélectionner une autre case, toutes les lignes pour ce placement sont complètes.","5510421842359017901":"Le but du jeu est de capturer les pièces de l'adversaire afin qu'il ne puisse plus jouer.\n Voici la configuration initiale du plateau.\n Chaque joueur a 12 pièces en réserve et 3 sur le plateau.\n Dès qu'à son tour un joueur n'a plus de pièces dans sa réserve, il ne sait plus jouer et perd.\n Le premier joueur possède les pièces foncées, le deuxième les pièces claires.","3717573037096411853":"Les pièces ne peuvent entrer sur le plateau que par l'extérieur. Pour insérer une nouvelle pièce :\n \n
Cliquez sur une case sur le bord du plateau.
\n
Si cette case était occupée, cliquez ensuite sur la flèche représentant la direction dans laquelle pousser la/les pièces déjà présentes dans la rangée.
\n
\n Une poussée est interdite dans une rangée complète.
\n Vous jouez Foncé, insérez une pièce.","7511966090954669277":"Pour faire une capture, il faut aligner 4 de ses propres pièces, qui seront les 4 premières capturées.\n Il y a plusieurs choses à savoir sur une capture :\n \n
Quand 4 pièces sont capturées, toutes les pièces directement alignées avec ces 4 pièces le sont également.
\n
Dès qu'il y a une case vide dans la ligne, la capture s'arrête.
\n
Vos pièces capturées rejoignent votre réserve.\n Celles de l'adversaire par contre sont réellement capturées et ne rejoignent pas sa réserve.
\n
Si vous créez une ligne de 4 pièces de l'adversaire, c'est au début de son tour qu'il pourra les capturer.\n Ceci implique que votre tour se passe en trois phases :\n \n
Choisir la/les capture(s) crée(s) par le dernier mouvement de votre adversaire.
\n
Faire votre poussée.
\n
Choisir la/les ligne(s) à capturer que vous venez de créer (en cliquant dessus).
\n \n
\n \n Vous jouez Foncé, une capture est faisable, faites-la !","8768850104658663274":"Bravo, vous avez récupéré 4 de vos pièces, mais ce n'est pas la capture la plus utile.\n Voyons maintenant la vraie utilité d'une capture.","624120683333042102":"Ici, il est possible de capturer de trois façons différentes.\n \n
L'une ne permet aucune capture de pièce adverse.
\n
L'autre permet une capture de pièce adverse.
\n
La dernière en permet deux.
\n \n \n Vous jouez Foncé, capturez le plus de pièce de votre adversaire.","9167352512805148919":"Bravo, vous avez récupéré 4 de vos pièces et capturé 2 pièces de l'adversaire.\n Le maximum possible étant 3 par capture.","3200525134996933550":"Raté, la capture optimale capture 2 pièces adverses.","1160906405303068410":"Ici, vous aurez une capture à faire au début de votre tour.\n Elle a été provoquée par un mouvement de votre adversaire lors de son tour de jeu\n (bien que ce plateau soit fictif à des fins pédagogiques).\n En effectuant ensuite le bon mouvement, vous pourrez faire deux captures supplémentaires !\n Gardez à l'esprit que le plus utile d'une capture, est de capturer les pièces adverses !
\n Vous jouez Foncé, capturez le plus de pièces adverses.","2182334345707735267":"Bravo, vous avez récupéré 12 de vos pièces et capturé 2 pièces de l'adversaire.","4244295242962463153":"Raté, la meilleure capture prends 2 des pièces de votre adversaire.","4172293183843503071":"Ce mouvement est un ko, vous devez jouer ailleurs avant de pouvoir rejouer sur cette intersection.","4133892808569917446":"Nous somme dans la phase de comptage, vous devez marquer les pierres comme mortes ou vivantes, ou bien accepter l'état actuel du plateau en passant votre tour.","4683884757780403263":"Vous ne pouvez pas accepter avant la phase de comptage.","7258684846942631624":"Cette intersection est déjà occupée.","3878972107071324960":"Vous ne pouvez pas vous suicider.","1472088308118018916":"Informations préalables","5815912088945784390":"Le jeu de Go se joue sur un plateau appelé Goban, et les pierres sont placées sur les intersections.\n Le plateau traditionnel fait 19x19 intersections, mais le 13x13 est implémenté sur ce site.\n (Pour des parties plus courtes, le 9x9 et 5x5 existent, mais ne sont pas encore disponibles).\n Pour ce tutoriel, nous utiliserons de plus petits plateaux à des fins pédagogiques.","1490005275934813623":"Le but du jeu est d'avoir le plus de points en fin de partie. On appelle territoires les intersections inoccupées et isolées du reste du Goban par les pierres d'un seul joueur. Ici, Foncé a 9 territoires à gauche, le joueur clair en a 8 à droite. La zone en haut au milieu n'appartient à personne. Le score d'un joueur en fin de partie correspond à la somme de ses territoires et captures.","2047079418793425161":"Une pierre isolée, comme la pierre claire au milieu, a 4 intersections voisines (et non 8, car on ne compte pas les diagonales).\n Il est dit d'un groupe de pierres qui a exactement deux cases voisines libres, que ce groupe a deux libertés.\n Si Foncé joue sur la dernière liberté de la pierre claire, cette pierre est enlevée du goban (capturée) et rapporte un point à Foncé.
\n Vous jouez Foncé. Il ne reste plus qu'une liberté à la pierre claire, capturez la.","4986672646268662936":"Bravo, vous avez gagné un point.","8619305565260847147":"Raté, réessayez en jouant sur l'une des intersections immédiatement voisines de la pierre claire.","8946006948417629723":"Capture de plusieurs pierres","3197348089105327020":"Des pierres connectées horizontalement ou verticalement doivent être capturées ensemble, et ne sont pas capturables séparement.
\n Vous jouez Foncé. Ici, le groupe clair n'a plus qu'une liberté, capturez ce groupe.","2022880801532921915":"Bravo, vous avez gagné trois points, et formé un territoire.","4825992977460901236":"Raté, vous n'avez pas capturé le groupe, jouez sur la dernière liberté de ce groupe.","6220902431017372113":"Suicide","4548165606059240492":"Au Go le suicide est interdit.\n Quand mettre une pierre sur une intersection ferait que le groupe de votre dernière pierre n'a aucune liberté et ne capture aucune pierre, alors jouer cette intersection serait un suicide, et est donc interdit.\n Ici, l'intersection en haut à gauche est un suicide pour Clair.\n En bas à droite, un suicide pour Foncé, et en bas à gauche n'est un suicide pour aucun joueur.","2066383177849177665":"Vie et mort (mort)","3595592714473441808":"De la règle de capture découle la notion de vie et de mort :\n des pierres mortes sont des pierres que l'on est sûr de pouvoir capturer (sans rien y perdre ailleurs).\n Tandis que des pierres vivantes sont des pierres que l'on ne peut plus espérer capturer.\n D'après la règle de capture, Foncé peut jouer à l'intérieur du territoire de Clair et le capturer.\n On dit dans ce cas que Clair n'a qu'un œil (sa dernière liberté) et qu'il est mort (même si pas encore capturé).\n En fin de partie, les pierres mortes sont comptées comme captures, et les cases qu'elles occupent comme territoires.","6721138878022657917":"Vie et mort (yeux)","1084604724991997052":"Ici, Clair ne pouvant jouer ni en haut à gauche, ni en bas à gauche, il ne pourra jamais capturer Foncé.\n On dit alors que Foncé a deux yeux (l'œil en haut à gauche et celui en bas à gauche) et qu'il est vivant.","8745919880228059784":"Seki","5496499515779223328":"Si Foncé joue sur la colonne du milieu, Clair jouera sur l'autre intersection libre de la colonne du milieu, et capturera Clair.\n De même, si Clair joue sur la colonne du milieu, Foncé jouera sur l'autre intersection libre de la colonne du milieu et capturera Foncé.\n Autrement dit, personne n'a intérêt à jouer au milieu.\n Dans ce cas, on dit que les pierres du milieu sont vivantes par Seki, et que les deux intersections du milieu sont des intersections neutres.","7812956328094242544":"Ko","6420048221002682719":"Un joueur, en posant une pierre, ne doit pas redonner au goban un état identique à l'un de ceux qu'il lui avait déjà donné, ce afin d'empêcher qu'une partie soit sans fin.
\n Vous jouez Foncé, capturez la pierre claire.","1862851019657740194":"Maintenant, si Clair essaye de recapturer la pierre que Foncé vient de poser, il rendrait au goban son état précédent, ouvrant la porte à une partie sans fin.\n L'emplacement de cette pièce est donc marqué d'un carré rouge, pour rappeler que c'est une intersection interdite.\n Cette règle s'appelle le Ko.\n Toute l'astuce pour Clair consiste, à essayer de créer une menace suffisamment grave pour que Foncé ait intérêt à y répondre immédiatement, et n'ait pas le temps de protéger sa dernière pierre, afin que Clair puisse la recapturer juste après.","84181370484059161":"Quand un joueur estime qu'il n'a plus intérêt à placer une pierre, il l'indique en passant son tour.\n La phase de jeu s'arrête lorsque les deux joueurs passent consécutivement, on passe alors en phase de comptage.\n On marque alors les groupes morts en cliquant dessus.\n Chaque intersection du territoire d'un joueur lui rapporte un point.\n Le gagnant est celui qui a le plus de points.
\n Vous jouez Foncé. Une dernière pierre est morte, marquez-la.","4959862943655130220":"Bravo, Foncé a 15 territoires et 3 pierres claire mortes mais encore présentes, appelées prisonnier en fin de partie.\n Les emplacements où les prisonniers sont comptent comme territoire pour Foncé.\n Clair a 8 territoires et 1 prisonnier.\n Le résultat est donc 18 - 9 en faveur de Foncé.","2798807656507405918":"Standard","35620818119550087":"Hexagonal","5525890868343399241":"Trigo est une adaptation triangulaire du jeu de Go. Le Go est présent sur Everyboard, vous pouvez aller en apprendre les règles here. Ce tutorial ne va que montrer les petites différences que cette expérimentation introduit.","3616229206195726198":"Libertés","8074559405875826310":"Étant donné que le plateau est triangulaire, les pièces n'ont qu'une liberté dans les coins.","5242120872569966381":"Étant donné que le plateau est triangulaire, les pièces on seulement deux libertés sur les bords. Quand les pièces touchent les bords avec seulement leurs coins, comme celles sur la droite, elles ne sont pas vraiment sur les bords","7135410296040646228":"Étant donné que le plateau est triangulaire, les pièces on trois libertés quand elles ne touchent pas les bords.","9089012671848915244":"Étant donné que le plateau est trianguliare, les groupes de deux pièces n'ont qu'une liberté en plus (faisant d'un atari un shisho par défaut).","6217706486990855046":"Raté, recommencez.","4791280679911297134":"La reine ne peut se déplacer que sur une des cases voisines.","1639583872704216434":"Le scarabée ne peut se déplacer que sur une des cases voisines.","7402975532187036733":"La sauterelle doit se déplacer en ligne droite.","5523450052915914627":"La sauterelle doit sauter au dessus d'autres pièces, sans passer au dessus d'une case vide.","8771557289052450532":"L'araignée doit se déplacer sur des cases voisines.","3098163088355072426":"L'araignée doit se déplacer autour des pièces avec lesquelles elle est en contact direct.","7928136093693713176":"L'araignée ne peut pas passer deux fois au même endroit durant le même mouvement.","2053370063642446913":"La reine doit être déposée sur le plateau afin de pouvoir déplacer une pièce.","5380773634484088090":"Cette pièce n'est pas autorisée à grimper sur d'autres pièces.","8284939639567724336":"Vous ne pouvez pas scinder la ruche.","4146942272384883649":"Cette pièce doit être capable de glisser jusqu'à sa destination.","4339124628235355617":"Vous devez placer la reine à votre quatrième tour au plus tard.","7948763683129821975":"Vous ne pouvez pas déposer une pièce à côté d'une pile adverse.","8046013978585107003":"Vous devez toujours déposer votre pièce sur une case vide.","106536486701689545":"La pièce que vous introduisez doit être connectée à la ruche.","3008604417903239806":"Hive est un jeu sans plateau, où les pièces sont placées l'une à côté des autres en un bloc contigu, appelé la ruche. Chaque joueur dispose de 11 pièces, représentant divers insectes.","4039332567259986532":"But du jeu","6900505086205524561":"Le but du jeu est d'entourer complètement la reine adverse. Une fois que qu'une reine est entourée par 6 pièces, peu importe le propriétaire de ces pièces, le jeu s'arrête. Le joueur avec une reine qui n'est pas entourée gagne. Si les deux reines sont complètement entourées au même tour, il y a match nul. Ici, Foncé a gagné.","1124156761679970164":"Placer la première et seconde pièce","2065654476590106098":"Il y a deux types d'actions: déposer une pièce et déplacer une pièce. Initialement, le plateau est vide et il nous faudra donc déposer une pièce sur le plateau. Pour la première pièce, il n'y a pas de restriction de placement : vous pouvez choisir n'importe quelle pièce et la mettre sur le plateau. La deuxième pièce, introduite par Clair, devra être placée sur une case voisine de la première pièce. Pour déposer une pièce, sélectionner la pièce de votre choix parmis vos pièces restantes (en dessous du plateau), et cliquez ensuite sur la case où vous voulez la déposer.
Vous jouez Foncé et commencez la partie, placez une pièce sur le plateau.","4766965064757095472":"Placer des pièces après le deuxième tour","4687115502403685230":"Après le deuxième tour, vous êtes toujours autorisé à déposer des pièces quand vous le désirez, à condition de respecter deux conditions :
votre pièce doit être connectée à la ruche ;
la case sur laquelle vous déposez votre pièce ne peut pas toucher une pile adverse
Vous jouez Foncé, introduisez une pièce sur le plateau.","2751556568646013753":"Déplacer les pièces : la reine","1929474568921893905":"Une fois que votre reine est placée sur le plateau, vous pouvez déplacer vos pièces. Vous devez placer votre reine au plus tard à votre quatrième tour. Chaque insecte se déplace d'une façon différente, et les déplacements doivent respecter deux conditions :
la ruche doit toujours former un bloc contigu ;
les pièces doivent être capables de glisser jusqu'à leur destination (à l'exception du scarabée et de la sauterelle, comme nous le verrons plus tard).
La reine peut se déplacer vers n'importe quelle case voisine libre. Pour déplacer une pièce, cliquez dessus et cliquez ensuite sur sa destination. Les destinations possibles sont mises en évidence.
Vous jouez Foncé, déplacez votre reine.","8573010608388393091":"Déplacer le scarabée","6645197773482117918":"Le scarabée se déplace comme la reine, mais est autorisé à grimper sur les autres pièces ! Il n'a donc pas besoin d'adhérer à la restriction des glissades. Notez que vous ne pouvez pas introduire le scarabée en le déposant sur une autre pièce, cela ne peut être effectué qu'en déplaçant un scarabée déjà sur le plateau. Une pièce avec un scarabée au dessus n'est pas autorisée à se déplacer. Une pile est considérée comme appartenant au joueur ayant le scarabée sur son dessus.
Vous jouez Foncé, bloquez la reine adverse en grimpant dessus !","6641485598833513426":"Inspecter les piles","8679169125111911637":"Quand des pièces sont empilées, vous pouvez inspecter la pile afin de voir quelles pièces se trouvent sous le scarabée. Cela fonctionne également avec les piles controlées par l'adversaire. Pour ce faire, cliquez simplement sur une pile afin de voir sa composition.
Vous jouez Foncé et votre adversaire a un scarabée au dessus d'une de vos pièces, cliquez dessus.","6207423912703337741":"Déplacer la sauterelle","6824181934070796921":"La sauterelle saute au dessus d'une ou plusieurs pièces en ligne droite, et s'arrête à la première case vide. Elle ne peut pas sauter au dessus de cases vides, et peut uniquement se déplacer en sautant. Car elle saute, elle ne doit pas adhérer à la restriction des glissades.
Vous jouez Foncé. Sautez au-dessus de trois pièces avec votre sauterelle !","5124714891438504376":"Déplacer la fourmi légionnaire","2899217750291886948":"La fourmi légionnaire est une pièce puissante : elle peut se déplacer n'importe où dans la ruche tant qu'elle respecte la règle des glissades et la règle de la ruche unique !
Vous jouez Foncé. Votre reine est bloquée, déplacez votre fourmi afin de la libérer !","7623079085925548808":"Vous n'avez pas libéré votre reine, essayez à nouveau !","3777509045596617031":"Déplacer l'araignée","2739227784886826925":"Finalement, l'araignée peut se déplacer d'exactement 3 cases. Elle n'est pas autorisée à passer deux fois par la même case au lors d'un tour. L'araignée se déplace le long des autres pièces : elle ne peut que se déplacer autour des pièces avec lesquelles elle est en contact direct. Ici par exemple, l'araignée de Foncé ne peut pas aller vers la gauche comme premier déplacement. Cela signifie que l'araignée ne peut pas temporairement séparer la ruche. Pour déplacer une araignée, sélectionnez-en une et cliquez sur les trois cases qui composent son mouvement.
Vous jouez Foncé, déplacez votre araignée.","3146815812493244221":"Restrictions","7714176760825514669":"Clarifions les deux restrictions durant les mouvements.
Toutes les pièces de la ruche doivent être connectées de façon à ne former qu'une seule ruche. Il se peut que durant un mouvement, la pièce glissée se déconnecte temporairement de la ruche, mais après le mouvement il ne doit y avoir qu'une seule ruche.
À l'exception des sauterelles et des scarabées, tous les mouvements doivent être faits en glissant les pièces, sans devoir écarter d'autres pièces de la ruche.
","7503459122405953820":"Passer son tour","3226372248582035130":"Finalement, il est possible que vous ne soyez pas capable d'effectuer un mouvement. Quand c'est le cas, vous devez passer votre tour. Ici, Foncé doit passer : la reine ne peut bouger sans déconnecter la ruche, le scarabée est bloqué en dessous d'un autre scarabée, et introduire une pièce ne peut se faire sans la mettre en contact avec une pièce adverse.","3643526530572280396":"La pièce n'est pas de la couleur à jouer.","945155491646703687":"Vous ne pouvez vous déplacer que vers l'avant orthogonalement ou diagonalement.","551820034442685617":"Ce mouvement est obstrué.","1699965787783859469":"Vous devez jouer avec la pièce déjà sélectionnée.","5017168027824461530":"Au Kamisado, il y a deux façons de gagner : soit en plaçant une de vos pièces sur la ligne de départ de\n l'adversaire, soit en forçant l'adversaire à faire un coup qui bloque la partie.\n Ici, Foncé gagne car il a sa pièce brune sur la ligne de départ du joueur clair, en haut à gauche.","5394640330288068198":"Plateau de départ et déplacement initial","8508262450449373253":"Voici le plateau de départ.\n Au Kamisado, les pièces ne peuvent se déplacer que vers l'avant, verticalement ou diagonalement.\n Vous jouez en premier, donc avec les pièces foncées, vous pouvez faire votre premier déplacement.
\n Vous jouez Foncé. Cliquez sur la pièce de votre choix, et cliquez sur sa case d'arrivée.","3923056974694699821":"Parfait ! Notez bien que chacune de vos pièces a une couleur différente.","460652905180615593":"Considérons maintenant le coup du joueur clair, après le déplacement de la pièce bleue.\n Tous les déplacements après le déplacement initial se font obligatoirement à partir de la pièce correspondant\n à la couleur sur laquelle le dernier déplacement s'est terminé.\n Ici, le déplacement précédent s'étant terminé sur une case rose, c'est donc au pion rose de se déplacer.\n Il est d'ailleurs déjà sélectionné, vous ne devez donc plus cliquer dessus.
\n Vous jouez Clair, déplacez-votre pièce jusqu'à la case bleue.","8902613702570774815":"Vous n'avez pas avancé votre pièce rose sur une case bleue !","6535171484072867925":"Blocage","2649088566668591407":"Foncé s'est déplacé sur une autre case rose, et vous oblige donc à déplacer votre pièce rose.\n Cependant, votre pièce rose est bloquée ! Dans ce cas ci, vous êtes obligé de passer votre tour.\n Foncé devra jouer son prochain tour en déplaçant lui-même sa pièce rose.","8029874053731693714":"Victoire par blocage","7208401461859346704":"À tout moment, si un joueur provoque un blocage total du jeu, il perd.\n C'est-à-dire que si un joueur oblige son adversaire à déplacer une pièce que l'adversaire ne peut bouger,\n et que lui-même ne peut pas déplacer sa pièce de la même couleur, il perd.\n Ici, en jouant avec les pions foncés,\n vous pouvez obliger votre adversaire à provoquer cette situation et donc l'obliger à perdre !
\n Vous jouez Foncé, analysej le plateau et effectuez le mouvement gagnant.","3072006962189197081":"Parfait !\n Votre adversaire est obligé d'avancer son pion vert sur la case orange, vous obligeant à joueur avec votre pion orange.\n Dès lors, votre pion orange sera bloqué et vous devrez donc passer votre tour.\n Votre adversaire devra ensuite aussi passer son tour car son pion orange est aussi bloqué :\n la partie est totalement bloquée.\n Dans ce cas, le dernier joueur à avoir déplacé une pièce perd la partie.\n Ici, votre adversaire a déplacé sa pièce verte en dernier, vous êtes donc vainqueur !","4481226927895530871":"Les captures doivent être des sauts de deux pas en diagonale ! Regardez les indications en vert pour vous aider !","924257200871471773":"Les déplacements doivent être des simples pas en diagonale !","8938938109993892899":"Vous ne pouvez pas sauter au dessus d'une même case plusieurs fois !","3581037377692107358":"Vous ne pouvez pas aller en arrière avec une pièce normale !","2164034395199252113":"Vous ne pouvez pas capturer une case vide, ni sauter par dessus !","1347067654692503433":"Vous devez capturer quand c'est possible !","3183138660002989080":"Vous devez finir cette capture !","8274439231274366704":"Lasca : les origines","3954016636522783040":"Lasca est un jeu basé sur le jeu de dames, créé en 1911 par Emanuel Lasker, champion du monde d'échecs. Lasca se joue sur un plateau de 7x7 cases, chaque joueur a 11 pièces.","4475600219932113977":"Le but de Lasca est, comme aux dames, de rendre l'adversaire incapable de jouer, soit en capturant toutes ses pièces, soit en les bloquant.","1534367694207535197":"Pas","5101419651122121441":"Un simple pas est un déplacement d'une case en diagonale, en avant, vers la gauche ou la droite. Pour faire un déplacement cliquez sur une pièce au choix, puis sur sa case d'arrivée.
Vous jouez Foncé, faites le premier mouvement.","7013110290486741787":"Une capture arrive quand vous sautez diagonalement par dessus une pièce adverse et atterrissez immédiatement derrière. Vous devez capturer quand vous le pouvez. C'est le cas ici : cliquez sur la pièce qui doit capturer, et ensuite sur sa destination
Vous jouez Foncé, faites une capture !","3662184238859847370":"Félicitations, constatez que la pièce capturée n'as pas été enlevée du plateau, mais placée en dessous de la pièce qui l'a capturé.","8288645478824152244":"Si, après le début de la capture, la pièce que vous venez de bouger peut encore capturer une autre pièce, elle doit le faire tant qu'elle le peut. Pour ce faire, vous devez juste cliquer sur sa destination suivante. Notez que vous ne pouvez pas sauter deux fois au dessus de la même pile.
Vous jouez Foncé, une double capture est possible, faites-la.","2693455583384082674":"Promotion","3052116389115675860":"Vous n'avez pas choisi la bonne pile, et vous n'avez pas causé de promotion.","4252782057421264089":"Déplacement des Officiers","2042191715997917496":"Quand une pile atteint la dernière ligne, son commandeur devient officier, et gagne la capacité de se déplacer en marche arrière, ce qui est illégal pour les autres pièces ! Une de vos pièces pourrait être promue ce tour-ci.
Vous jouez Foncé. Faites-le.","8730503950999903830":"Les officiers peuvent se déplacer et capturer en arrière ainsi qu'en avant.
Vous jouez Foncé, déplacez votre officier !","7994037258587314442":"Vous n'avez pas déplacé votre officier.","318262165361158083":"Contrôle","7668804973365582935":"Contrôle et domination","6522624192206928831":"La capture minoritaire est autorisée !","4604841825883708598":"Si vous avez plusieurs choix de captures, vous êtes autorisé à choisir n'importe lequel. Par exemple, si un des choix ne capture qu'une pièce, et l'autre en capture deux, vous pouvez choisir celui que vous préférez.","6689969573280113485":"Cette pièce ne peut pas bouger !","6387863170048380356":"Vous devez vous effectuer un déplacement de longueur égale au nombre de pièces présente sur la ligne de votre déplacement.","3931959709762726685":"Vous ne pouvez pas passer au dessus d'une pièce de l'adversaire.","1376498600372177047":"Cette pièce n'a aucun mouvement possible, choisissez-en une autre.","6241913890536717263":"À Lines of Actions, le but est de regrouper toutes vos pièces de façon contigües, orthogonalement et/ou diagonalement.\n Ici, Foncé gagne la partie :\n ses pièces ne forment qu'un seul groupe, alors que les pièces de Clair forment trois groupes.","1803258759101178992":"Voici le plateau de départ.\n Les déplacements s'effectuent orthogonalement ou diagonalement.\n La longueur d'un déplacement est égale au nombre de pièces présentes dans la ligne du déplacement.\n Notez la présence d'un indicateur d'aide qui indique où une pièce peut atterrir quand vous la sélectionnez.
\n Vous jouez Foncé, faites le premier déplacement !","4640173099284920351":"Sauts","7761420664051286760":"Lors d'un déplacement, il est possible de sauter au dessus de ses propres pièces.\n Mais il est interdit de sauter au dessus des pièces de l'adversaire.
\n Effectuez un saut au dessus de l'une de vos pièces avec la configuration suivante.","5427407556156621327":"Vous n'avez pas sauté au dessus d'une de vos pièces.","9103512134624014654":"Voici une configuration différente. Sélectionnez la pièce foncée au milieu (ligne 4, colonne 4)\n et observez bien les déplacements possibles.\n
\n
Horizontalement, elle se déplace d'une case car elle est seule sur cette ligne.
\n
Verticalement, elle se déplace de trois cases car il y a en tout trois pièces sur cette ligne verticale.\n Mais elle ne peut qu'aller vers le haut, car vers le bas la case d'atterrissage est occupée par une autre de vos pièces.
\n
Diagonalement, un seul mouvement est possible : sur la diagonale qui contient trois pièces, dans la seule\n direction où on ne doit pas sauter au dessus d'une pièce adverse.\n Sur l'autre diagonale, il y a trop de pièces pour que le déplacement se termine sur le plateau.
\n Effectuez un de ces déplacements.","2794355525571555595":"Ce n'était pas un des déplacements attendus","5036745511795758114":"Si un déplacement se termine sur une pièce adverse, celle-ci est capturée et disparait du plateau.\n Votre déplacement par contre ne peut pas se terminer sur une de vos pièces.\n Attention, avoir moins de pièces à Lines of Action rend plus atteignable la condition de victoire,\n car il est plus facile de regrouper un petit nombre de pièces !\n D'ailleurs, s'il reste une seule pièce à un joueur, il gagne la partie.
\n Dans la configuration suivante, avec Foncé, essayez de capturer une pièce.","2751983125977182742":"Égalité","7055933300672028135":"Dans le cas spécial où un mouvement résulte en une connexion complète des pièces des deux joueurs,\n simultanément, alors la partie se termine par une égalité.
\n Vous jouez Foncé, forcez l'égalité en un coup.","4594736386763524275":"La coordonnée de départ ne peut pas être hors du plateau","8024507002452740554":"La coordonnée de fin ne peut pas être hors du plateau","4409865504289904426":"Les drônes doivent se déplacer de un ou deux pas dans n'importe quelle direction.","4174188766565583979":"Choisissez une pièce de votre propre territoire pour la déplacer.","4126120518252508337":"Ce mouvement n'est ni une promotion valide ni une capture valide.","820589591452307194":"Vous ne pouvez pas faire un mouvement inverse au dernier coup.","101461993624237538":"Le but des Échecs Martiens est d'avoir le plus de points à la fin de la partie. À chaque pièce est assignée une valeur, quand vous capturez une pièce, vous gagnez sa valeur. Le plateau est divisé en deux par une ligne rouge appellée \"le canal\". Il y a un côté pour chaque joueur, vous ne contrôlez que les pièces de votre côté du canal. La couleur des pièces n'est là que pour vous aider, les pièces changent de couleur en traversant le canal.","8633649754808970040":"Les pièces","4066930341904859929":"Les pièces sont foncées du côté du premier joueur, les claires du côté du second. Il y a trois types de pièces:
Les reines: représentées par des cercles avec 3 points ;
Les drônes: représentés par des cercles avec 2 points ;
Les pions: représentés par des cercles avec un point.
","2033063585111632444":"Déplacer les pions","4687071087997357225":"Les pions valent un point. Ils peuvent se déplacer d'un pas sur l'une des diagonales.
Vous jouez Foncé, bougez un pion.","5961522758680599293":"Ceci n'est pas un pion ","6187825194726438285":"Déplacer les drônes","4279721125731228701":"Les drônes valent deux points. Ils peuvent se déplacer de un ou deux pas dans n'importe quelle direction, en ligne droite, sans sauter au dessus d'autres pièces.
Vous jouez Foncé, déplacez un drône.","412189766091253797":"Ceci n'est pas un drône !","731242877035493751":"Déplacer les reines","2106860890585726458":"Les reines valent trois points. Elles peuvent se déplacer d'autant de pas que souhaité dans n'importe quelle direction, en ligne droite, sans sauter au dessus d'autres pièces.
Vous jouez Clair, déplacez une reine.","3206825395681468712":"Ceci n'est pas une reine !","6164047187960612635":"Quand une pièce traverse le canal et atterrit sur une autre pièce, vous la capturez et gagnez la valeur de la pièce, cependant vous en perdez le contrôle car elle a traversé le canal !
Une capture est possible pour Clair, faites-la.","6741042150149637612":"Bravo ! En capturant ce pion, vous gagnez un point.","2144586366556831652":"Promotion","9082504092683509261":"Il est parfois possible de faire ce qu'on appelle une promotion. Quand vous n'avez pas un type de pièce, vous pouvez fusionner deux pièces pour additionner leur valeur et obtenir une nouvelle pièce. Premier exemple, si vous n'avez pas de drône, vous pouvez fusionner deux de vos pions en un drône. Pour ce faire, déplacez un de vos pions sur un autre.
Un tel coup est possible pour Clair, faites-le.","8941261285468529448":"Ce n'est pas une promotion !","1012300757521682008":"L'autre sorte de promotion est de fusionner un drône et un pion, pour obtenir une reine.
Un tel mouvement est possible pour Clair. Faites-le.","304909585169663876":"Lancer le compte à rebour","8898741439943904413":"Quand la partie ne semble aller nulle part, vous pouvez lancer le compte à rebour, en cliquant sur l'horloge à droite avant de faire votre mouvement. Une fois votre mouvement fait, seul 7 autres pourront être fait.
Vous jouez Foncé, lancez le compte à rebour.","6784225180868580907":"Vous n'avez pas lancé le compte à rebour !","976279093722548167":"Redémarrer le compte à rebour","3901600798817118089":"Si le compte à rebour a été lancé, chaque capture remet le compteur à 7.
Vous jouez Foncé, faites une capture pour redémarrer le compte à rebour.","7392280182595989107":"Ce n'est pas une capture? la partie est maintenant finie, réessayez !","4805475752093007535":"Fin au temps","3700959958039999617":"7 Tours après le lancement du compte à rebour, le joueur qui a le plus de point gagne. Si les joueurs ont autant de point, c'est un match nul.
Vous jouez Clair, faites le dernier mouvement.","1679797944253761486":"Fin par le vide","7700786423442894185":"Quand un joueur déplace sa dernière pièce dans le territoire adverse, la partie prend fin. Si les deux joueurs ont le même nombre de points, le dernier joueur gagne !
Clair peut gagner de cette façon, faites-le !","5831506127438574716":"Votre pièce est toujours dans votre territoire !","7020322239499292850":"Les pions doivent se déplacer d'une case en diagonale.","7419338702295170530":"Vous devez changer la face de votre pierre magnétique avant de la redéposer sur le plateau.","8683881271933340082":"Tant qu'il reste des plaques de pression, vous devez placer les pièces que vous avez capturé dessus.","3917449010922856612":"Vous devez placer votre pierre magnétique sur une case qui ne s'est pas effondrée !","2350186243435301157":"Vous avez placé trop de pièces sur la même plaque de pression, qui ne dispose pas d'assez d'espace.","4296510202733075370":"Vous devez placer vos captures sur les plaques de pression, situées autour du plateau.","8506636863437595095":"Vous ne pouvez pas encore placer de captures, vous devez d'abord placer votre pierre magnétique sur le plateau !","5605685662838531265":"Lodestone se joue sur un plateau 8x8, qui contient ce qui s'appelle des plaques de pression sur son pourtour, où les pièces capturées seront placées. Le plateau initial est montré ci-contre. Le but du jeu est d'être le seul joueur restant avec des pièces sur le plateau. Pour y arriver, vous allez devoir pousser les pièces de votre adversaire hors du plateau, ou les écraser avec vos pièces. Vous le ferez avec une pierre magnétique.","2109934310949694886":"Sélectionner une pierre magnétique","2559162009573450567":"Afin d'effectuer un déplacement, vous devez placer votre pierre magnétique sur le plateau. Votre pierre magnétique dispose de deux faces:
sa face répulsive qui poussera les pièces adverses (tel qu'indiqué par les triangles pointant vers d'extérieur, à la couleur de votre adversaire) ;
sa face attractive qui attirera vos pièces (tel qu'indiqué par les triangles pointant vers l'intérieur, à votre couleur).
Votre pierre magnétique peut être disposée pour déplacer les pièces de façon orthogonale ou diagonale. Tous les côtés et orientations disponibles de votre pierre magnétique sont montrés en dessous du plateau.
Vous jouez Foncé. Sélectionnez la pierre magnétique qui repousse les pièces de votre adversaire diagonalement.","2963285511284379717":"Ce n'est pas la bonne pierre magnétique, essayez à nouveau.","7572976598676202841":"La pierre magnétique répulsive","3639714905640085837":"Lorsque vous placez une pierre magnétique sur le plateau, elle déplacera toutes les pièces sur lesquelles elle agit (en fonction de sa direction et de son orientation) simultanément. Voyons d'abord comment la pierre magnétique répulsive agit sur les pièces. Toutes les pièces de l'adversaire qui sont alignées avec la pierre magnétique, tel qu'indiqué par l'orientation des triangles, seront éloignées d'une case depuis la pierre magnétique. Une pièce de l'adversaire est bloquée si elle croise le chemin d'une de vos pièces, d'une pierre magnétique, ou d'une autre pièce bloquée. Finalement, si une pièce de l'adversaire tombe du plateau, elle est considérée comme capturée.","609421287344629004":"La pierre magnétique attractive","1840990354301535750":"Quand la pierre magnétique est placée sur sa face attractive, elle attirera vos pièces d'une case dans sa direction. Si une de vos pièce croise le chemin d'une pierre magnétique ou d'une pièce bloquée, elle sera elle-même bloquée. Si elle croise le chemin d'une pièce adverse, celle-ci sera capturée.","5747624424535894902":"Retourner la pierre magnétique","6611993830828980213":"Notez qu'après chaque mouvement vous devez retourner votre pierre magnétique : si elle était sur sa face répulsive, vous devez l'utiliser sur sa face attractive, et inversément. Aussi, vous pouvez placer votre pierre magnétique sur la même case qu'à son tour précédent.","1164074897639591703":"En résumé, il est possible de capturer les pièces de l'adversaire de deux façons :
avec une pierre magnétique sur sa face répulsive, en poussant les pièces adverses hors du plateau ;
avec une pierre magnétique sur sa face attractive, en attirant vos pièces pour qu'elles écrasent les pièces adverses.
Une fois qu'une pierre magnétique est placée et que les pièces ont été déplacées et/ou capturées, si des pièces adverses ont été capturées, vous devez les placer sur les plaques de pressions, situées autour du plateau. Pour ce faire, cliquez sur une case libre de la plaque de pression de votre choix pour chaque capture. Vous pouvez annuler ce placement en cliquant sur une pièce récemment placée sur plaque de pression.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce adverse, et placez vos captures sur des plaques de pression.","443433725102640869":"Premier effondrement d'une plaque de pression","7283094782812908030":"Quand une plaque de pression est complète, elle s'effondrera et prendra avec elle une ligne ou une colonne entière du plateau ! Toutes les pièces qui étaient sur les cases correspondantes sont considérées perdues, mais ne seront pas placées sur les plaques de pression. Vous avez ici un plateau avec une plaque de pression qui nécéssite une pièce supplémentaire pour s'effondrer.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce, et remplissez la plaque de pression pour qu'elle s'effondre.","3196264140433706433":"Vous devez effectuer une capture et la placer sur la plaque de pression au dessus du plateau pour qu'elle s'effondre !","5914083969570610852":"Second effondrement d'une plaque de pression","1857692339690561929":"Une fois qu'une plaque de pression s'est effondrée, une seconde plaque de pression, plus petite, prend sa place. C'est le cas ici, où seulement 3 cases sont disponibles sur la plaque de pression supérieure.
Vous jouez Foncé. Effectuez un mouvement qui capture au moins une pièce, et remplissez la plaque de pression supérieure pour qu'elle s'effondre.","3910287826025606484":"Vous devez effectuer une capture et la placer sur la plaque de pression supérieure pour qu'elle s'effondre une deuxième fois !","6264951416361363939":"Plateau minimal","4748774984823369879":"Après deux effondrements d'une plaque de pression, il n'y a plus de plaque de pression disponible sur ce côté. Si toutes les plaques de pressions se sont effondrées, le plateau est réduit à un plateau 4x4.","3538909383339704235":"Faire tomber une pierre magnétique","2420281248578493085":"À tout moment durant le jeu, si votre pierre magnétique se trouve sur une case qui s'effondre avec une plaque de pression, vous pourrez sélectionner n'importe quelle face de votre pierre magnétique lors de votre prochain tour.
Sur ce plateau, en jouant Foncé, vous pouvez placer votre pierre magnétique et faire s'effondrer une plaque de pression de façon à ce que votre pierre magnétique tombe également. Cela vous permettra de choisir plus librement le côté de votre pierre magnétique lors de votre prochain tour. Faites-le !","387688094870283606":"Bravo ! Lors de votre prochain tour, vous pourrez placer votre pierre magnétique sur n'importe quel côté.","99397540840628948":"Pour être vainqueur, vous devez éliminer toutes les pièces adverses.
Ici, vous pouvez gagner en un seul mouvement, faites-le !","1645842992024065193":"Ce n'est pas le mouvement gagnant. Essayez encore.","4012808273739972279":"{$PH} est un Mancala. Mancala est le nom d'une famille de jeux de plateau datant au moins du troisième siècle. Les mancalas sont des jeux de distribution (égrenage) et capture. Leur but est de capturer le plus de graines. Les cases sont appelées des maisons. Celles sur l'extrême gauche et droite sont appellées les magasins, ils contiennent les graines que chaque joueur a capturé. Comme vous jouez Foncé, vos 6 maisons sont celles du bas.","9104781897718296194":"Info bonus : l'Awalé est le plus populaire des mancalas.","6266016430504496647":"Veuillez placer votre pièce dans une colonne incomplète.","4036586801649294358":"Le plateau du Puissance 4 fait 7 colonnes et 6 rangées et est initialement vide.\n Le premier joueur joue Foncé, le deuxième joue Clair.\n Le but du du jeu est d'être le premier joueur à aligner 4 de ses pièces (horizontalement, verticalement, ou diagonalement).","8975478230679810486":"Déposez une pièce","8376425958935569592":"Cliquez sur n’importe quelle case d’une colonne.","5836753691261182816":"Comme vous voyez, la pièce va toujours tomber tout en bas de la colonne.","1116173898665219180":"Victoire","7759745104864966912":"Quand vous posez une dernière pièce dans une case, le jeu fini. Dans cette configuration vous pouvez gagner.
Vous jouez Clair, faites le mouvement gagnant !","3614265026318366150":"Vous avez activement fait gagner votre adversaire !","6535908388530528403":"Mauvais choix, votre adversaire va gagner au prochain tour quelle que soit la pièce déposée !","6434791622277704389":"Priorité de droite","529510153551286303":"Incrémentation","6180360850656792663":"Plateau complet","8400174784913655582":"Minimax","45739481977493163":"Taille","69616505141416052":"Hexodia se joue sur un plateau hexagonal, votre but est d'aligner 6 de vos pièces.","6858407546093916748":"Au premier tour, le premier joueur joue une seule pièce.
Vous jouez Foncé, placez votre première pièce en cliquant sur une case.","3416240052398580752":"Diagonales Hexagonales","25408930270688683":"Mais un genre original de diagonales existe aussi à Hexodia. Ici, Foncé a fait un alignement dans chacunes de ces trois directions, la victoire ne reste possible que dans une seule.
Vous jouez Foncé, faites le coup gagnant.","5880375817695791500":"Vous jouez Foncé.\n Placez votre pion de façon à aligner horizontalement 4 de vos pièces.","2383238937544977536":"Voilà, vous avez gagné !","8360761958716876836":"Raté, vous n'avez pas aligné 4 pièces et perdu votre occasion de gagner.","7608929788238552566":"Autre Victoire","5935897420698942151":"Vous pouvez également aligner 4 pions diagonalement ou verticalement","6103371171681226169":"Si le quadrant à tourner est neutre, utilisez un mouvement sans rotation.","960314962671621462":"Aucun quadrant n'étant neutre, vous devez choisir un quadrant à faire tourner.","6958056470119838689":"Le plateau du Pentago est composé de 6x6 cases, et est subdivisé en quatre quadrants, ceux-ci pouvant effectuer des rotations.","821589059503120913":"Le but du Pentago est d'aligner 5 de vos pièces. Dans le plateau ci-dessous, Foncé gagne.","6954191985152707764":"Chacun à son tour, les joueurs posent une pièce sur le plateau, et effectuent éventuellement une rotation d'un quadrant. Tant qu'il existe des quadrants neutres, c'est à dire des quadrants qui ne changeraient pas après avoir été tournés, l'option de ne pas effectuer de rotation est acceptée. Pour ce faire il faut cliquer sur le rond barré qui apparaît au centre du plateau quand c'est possible.
Vous jouez Foncé, faites un mouvement simple.","1640662905904405955":"Vous avez effectué un mouvement avec rotation, cette étape du didacticiel concerne les tours sans rotations !","8330321104835134748":"Mouvement avec rotation","2438755881589163638":"Après avoir déposé une pièce, des flèches apparaîtront sur les quadrants non neutres.
\n Vous jouez Foncé, placez une pièce sur un quadrant et effectuez une rotation !","5427363142376983767":"Vous avez effectué un mouvement sans rotation, recommencez !","2426029962112596303":"Bravo ! Note : si tout les quadrants sont neutres après que vous ayez déposé votre pièce, il n'y aura pas de rotation !","3823427068887903090":"Pierres capturées nécessaires pour gagner","1997992313730455534":"Nombre de pièces alignées nécessaires pour gagner","6974294157928395807":"Nombre de pièces déposées par tour","2370571702661444910":"Taille des captures","481364308060927522":"Pente se joue sur un plateau 19x19, sur lequel on dépose les pierres aux intersections des cases. Le but du jeu est d'aligner 5 de vos pièces, ou de capturer 10 pièces de votre adversaire. Initialement, une pièce du joueur clair est placée au centre du plateau.","4134686113968191036":"Durant vos tour, vous devez déposer une pièce sur n'importe quelle case vide. Il n'y a pas d'autre restriction.
Vous jouez Foncé, déposez une pièce.","55131761932515685":"Durant vos quatre premiers tours, vous devez déposer une pièce sur n'importe quelle case vide. Il n'y a pas d'autre restriction.
Vous jouez Foncé, déposez une pièce.","6622643035593861381":"Vous pouvez capturer exactement deux pièces de votre adversaire en les prenant en sandwich entre deux de vos pièces.
Vous jouez Clair et pouvez capturer, faites-le !","5697357351132552791":"Placer en position de sandwich","4745154919636452326":"Vous pouvez placer une de vos pièces à côté d'une autre de vos pièces, là où elle serait en sandwich entre deux pièces adverses. C'est un mouvement sûr.
Vous jouez Clair et avez la possibilité de faire un tel mouvement, faites-le !","5109014320867695717":"Souvenez-vous, vous pouver gagner soit en alignant 5 de vos pièces, soit en capturant 10 pièces de votre adversaire. Ici, en tant que Clair, vous avez déjà capturé 8 pièces adverses et vous n'avez besoin que de deux pièces supplémentaires pour gagner.
Vous jouez Clair, vous pouvez gagner de deux façon différentes. Gagnez !","682762602217958961":"Vous devez déplacer vos pièces vers le haut.","2162535855239454361":"Votre pièce doit atterrir sur le plateau ou sur 4 autres pièces.","70110199629015603":"Vous ne pouvez pas capturer.","1880810010962851052":"Votre première capture est invalide.","8839913211108039860":"Votre seconde capture est invalide.","2207725255932699379":"Vous devez capturer une ou deux pièces, pas plus.","3567680797279323593":"Au Pylos, le but est d'être le dernier à jouer.\n Pour cela, il faut économiser ses pièces.\n Dès qu'un joueur dépose sa dernière pièce, il perd immédiatement la partie.\n Voici à quoi ressemble le plateau initial, un plateau de 4 x 4 cases.\n Celui-ci deviendra une pyramide petit à petit.\n Ce plateau sera rempli par les pièces dans votre réserve. Chaque joueur a 15 pièces.","6012873055176768317":"Quand c'est votre tour, vous avez toujours l'option de déposer une de vos pièces sur une case vide.\n Les rectangles gris sont les cases sur lesquelles vous pouvez déposez vos pièces.
\n Cliquez sur une de ces cases pour déposer une pièce.","460049283627942483":"Voilà, aussi simplement que ça.","9085516039614786121":"Grimper","7544559714308131014":"Quand 4 pièces forment un carré, il est possible de placer une cinquième pièce dessus.\n Cependant, à ce moment là, se crée une opportunité d'économiser une pièce en \"grimpant\" au lieu de déposer.\n Pour grimper :\n \n
Cliquez sur une de vos pièces libres et plus basse que la case d'atterrissage.
\n
Cliquez sur une case vide plus haute.
\n \n Vous jouez Foncé, allez-y et grimpez !","7055621102989388488":"Bravo ! \n Notes importantes :\n \n
On ne peut déplacer une pièce qui est en dessous d'une autre.
\n
Naturellement, on ne peut pas déplacer les pièces adverses.
\n
Un déplacement ne peut se faire que quand la case d'arrivée est plus haute que la case de départ.
\n ","8336049305072615544":"Carré","517712097339838490":"Quand la pièce que vous venez de poser est la quatrième d'un carré de pièces de votre couleur,\n vous pouvez choisir alors n'importe où sur le plateau une où deux de vos pièces.\n Cette(ces) pièce(s) sera(seront) enlevée(s) du plateau, vous permettant de les économiser.\n Une pièce choisie pour être enlevée ne peut pas être en dessous d'autres pièces.\n Une pièce choisie peut être la pièce que vous venez de placer.
\n Vous jouez Foncé. Formez un carré, cliquez sur une des quatres pièces, puis cliquez sur le V en bas à droite pour finaliser votre mouvement.","4722414845520402682":"Bravo, vous avez économisé une pièce. Note, vous pouvez annuler la sélection en cliquant à nouveau sur la pièce.","5218035582670205877":"Vous jouez Foncé.
\n Faites comme à l'étape précédente, mais cliquez cette fois sur deux pièces différentes avant de valider.","8313533670567464817":"Raté, vous n'avez capturé qu'une pièce.","5608779123109622436":"Raté, vous n'avez capturé aucune pièce.","3455768301736755830":"Bravo, vous avez économisé deux pièces.","5796940069053691279":"Vous devez donner une pièce à l'adversaire.","2211348294853632908":"Cette pièce est déjà sur le plateau.","6246016939611902421":"Vous ne pouvez pas donner la pièce qui était dans vos mains.","2864332255120486791":"Niveau du joueur Un","6804516002090214742":"Niveau du joueur Deux","760255515343953338":"Quarto est un jeu d'alignement. Le but est d'aligner quatre pièces qui possèdent au moins un point commun :
leur couleur (claire ou foncée),
leur taille (grande ou petite),
leur motif (vide ou à point),
leur forme (ronde ou carrée).
Ici, nous avons un plateau avec une victoire par alignement de pièces foncées. Notez que le spièces n'appartiennent à aucun joueur.","5869780110608474933":"Placement","3421981370095781630":"Chaque placement se fait en deux étapes : placer la pièce que vous avez en main (dans le petit carré) en cliquant sur une case du plateau, et choisir une pièce que l'adversaire devra placer, en cliquant sur une des pièces dans le carré pointillé. Si vous préférez, l'ordre inverse est également possible. Gardez juste à l'esprit que le deuxième clic valide le mouvement.
Effectuez un mouvement.","2296943727359810458":"Parfait !","7849803408372436927":"Situation","4119107654622098665":"Nous avons ici une situation délicate.
Analysez bien le plateau et jouez votre coup, en faisant particulièrement attention de ne pas permettre à l'adversaire de l'emporter au prochain coup.","4715207105849605918":"Bien joué !","8424758512320418629":"Raté ! Votre adversaire peut soit aligner:
les carrés horizontalement sur la troisième ligne ou verticalement sur la troisième colonne ;
les petites pièces horizontalement sur la première ligne ou verticalement sur la deuxième ou troisième colonne ;
les pièces vides horizontalement sur la première ligne ou verticalement sur la première colonne ;
les pièces claires diagonalement.
","5648428630068792235":"Une partie de Quarto peut être configurée pour la rendre plus compliquée pour un ou deux des joueurs. Quand vous créez une partie et que vous voulez changer la configuration originale, vous pouvez ajouter un niveau à un ou plusieurs joueurs. Quand votre niveau augmente, cela devient plus facile pour vous de gagner. Donc, si le premier joueur est plus faible à ce jeu, faites le jouer au niveau deux et la partie sera plus intéréssante. Au niveau deux, un joueur peut gagner en groupant des pièces avec un critère commun sur un carré de 2x2. Sur ce plateau, Clair peu gagner en formant un carré.
Vous jouez Clair, gagnez.","2467449610168621115":"Raté, vous auriez pu gagner en formant un carré.","8819839276456625538":"Case invalide, cliquez sur une case de l'extérieur du plateau.","1849305746346487286":"Au Quixo, le but du jeu est d'aligner 5 de vos pièces.\n Le premier joueur contrôle les pièces foncées, le deuxième les claires.\n Le plateau est constitué de 25 pièces réparties en un carré de 5x5.\n Chaque pièce a un face neutre, une face claire et une face foncée.","7664600147441568899":"A quoi ressemble un mouvement (sans animation)","8312224573535963288":"Quand c'est à votre tour de jouer :\n \n
Cliquez sur une de vos pièces ou une pièce neutre, il est interdit de choisir une pièce de l'adversaire.\n Notez que vous ne pouvez choisir qu'une pièce sur le bord du plateau.
\n
Choisissez une direction dans laquelle l'envoyer (en cliquant sur la flèche).
\n \n Il faudra imaginer que la pièce que vous avez choisie a été déplacée jusqu'au bout du plateau dans la direction choisie.\n Une fois arrivée au bout, toutes les pièces vont se glisser d'une case dans la direction inverse à celle qu'a pris votre pièce.\n Après cela, si elle était neutre, la pièce devient la votre et prend votre couleur.
\n Pour exemple, prenez la pièce neutre tout en bas à droite, déplacez la tout à gauche (vous jouez Clair).","2349397111027092779":"Voyez comment les quatre pièces foncées ont été déplacées d'une case vers la droite.\n La pièce neutre a été déplacé de 4 pièces vers la gauche est est devenue claire.","767359644489302732":"Vous savez déjà tout ce qu'il faut pour jouer, il ne manque qu'une spécificité.\n Si vous créez une ligne de 5 pièces vous appartenant, vous gagnez.\n Si vous créez une ligne de 5 pièces de l'adversaire, vous perdez.\n Si vous créez les deux, vous perdez aussi !
\n Ce plateau permet de gagner, essayez.\n Vous jouez Clair.","6387064828361949367":"Vous avez sauté trop loin ! La longueur maximum d'un saut est de {$PH} pas!","323770883664351270":"Longueur d'un saut","4941408928262720844":"Squarz est un jeu de contrôle de plateau. Voici le plateau initial. Le but est d'avoir une majorité de vos pièces sur le plateau à la fin de la partie.","6981861179855327687":"Duplication","5489405522962962283":"Bravo, vous avez gagné !","2829152398724302132":"Votre mouvement doit au moins retourner une pièce.","8006607638702407149":"Les pièces du Reversi sont double face, une face foncée pour le premier joueur, une face claire pour le deuxième.\n Quand une pièce est retournée, elle change de propriétaire.\n Le joueur possédant le plus de pièces en fin de partie gagne.\n Ici, Foncé a 28 points et le joueur clair en a 36, le joueur clair a donc gagné.","5285597397338861824":"Au début de la partie, les pièces sont placées comme ceci.\n Pour qu'un coup soit légal il faut qu'il prenne en sandwich minimum une pièce adverse entre la pièce que vous posez et une de vos pièces.
\n Foncé joue en premier, faites n'importe quel mouvement en cliquant pour déposer votre pièce.","7280078972566788741":"Un mouvement peut également capturer une plus grande ligne, et plusieurs lignes à la fois.
Vous jouez Clair. Joueez en bas à gauche pour voir un exemple de capture.","863291659187903950":"Un peu plus en bas et un peu plus à gauche, s'il vous plaît.","1243885947284298199":"Passer son tour","3839030392804080169":"Si, à son tour de jeu, un joueur n'a aucun mouvement lui permettant de capturer une pièce, il est obligé de passer son tour.\n Si d'aventure le joueur suivant ne savait pas jouer non plus, la partie terminerait avant que le plateau ne soit rempli, et les points seraient décomptés de la façon habituelle.","1982783281923413187":"On ne peux rebondir que sur les cases foncées.","1906861201256399546":"Vous ne pouvez rebondir que sur les cases vides.","366304395805128715":"Vous devez d'abord choisir une de vos pyramides.","6312339673351478538":"Vous devez choisir une de vos pyramides.","2094727233255278649":"Ces deux cases ne sont pas voisines.","5908478672900888285":"Ces deux cases n'ont pas de voisin commun.","7194810718741841575":"Vous pouvez vous déplacer maximum de 2 cases, pas de {$PH}.","7379617497808564008":"Le Sâhârâ se joue sur un plateau dont chaque case est triangulaire.\n Chaque joueur contrôle six pyramides.","7604175652954490413":"Au Sâhârâ, le but du jeu est d'immobiliser une des pyramides de l'adversaire. Pour ce faire il faut occuper toutes les cases voisines de celle-ci. Ici, le joueur clair a perdu car sa pyramide tout à gauche est immobilisée.","1300852626039829767":"Simple pas","3700643537935262310":"Un des deux types de mouvement que vous pouvez faire est la duplication. Quand vous en faites un, vous créez une nouvelle pièce. Pour ce faire, sélectionnez une de vos pièces, et cliquez sur une de vos pièces, puis sur une case voisine à celle-ci. Vous jouez Foncé, faites un simple pas.","2864359495844920670":"C'était un saut, essayez de faire une duplication.","4273222196833633277":"C'était une duplication, essayez un saut maintenant.","1771050228270959005":"Le deuxième type de mouvement que vous pouvez faire est un saut. Quand vous en faites un, votre pièce quitte sa case d'origine et atterit deux cases plus loin. Pour faire ceci, sélectionnez une de vos pièces, et cliquez sur sa case d'atterrissage, deux cases plus loin. Vous jouez Clair, faites un saut.","831056729992738373":"Quand une de vos pièces arrive sur une case, les pièces adjacentes voisines deviennent les vôtres. C'est ce qu'on appelle une capture.
Vous jouez Clair, faites une capture.","9048883519751617241":"Quand un des joueurs ne peut plus jouer, la partie se termine, et le joueur avec le plus de pièces gagne. Ici, vous pouvez faire le dernier mouvement et gagner.
Vous jouez Clair, faites-le !","3808135421251943457":"Mauvais choix, en faisant ce saut vous avez permis à l'adversaire de gagner.
Essayez à nouveau !","3615756484359681386":"Pour parvenir à immobiliser l'adversaire, il faut déplacer ses pyramides.\n Quand une pyramide partage ses arêtes avec des cases claires, elle peut se déplacer dessus (appelons ceci, faire un pas simple).\n Pour effectuer un mouvement :\n \n
Cliquez sur une de vos pyramides.
\n
Cliquez ensuite sur une des deux ou trois cases voisines, pour y déplacer votre pyramide.
\n \n Vous jouez Foncé, faites un simple pas.","6109976694950516137":"Vous avez fait un double pas, c'est très bien, mais c'est l'exercice suivant !","7415904984868552706":"Double pas","8606604811382882198":"Quand une pyramide partage ses arêtes avec des cases foncées, vous pouvez la déplacer de deux pas.\n Pour ce faire :\n \n
Cliquez sur la pyramide à déplacer (celle tout au centre).
\n
Cliquez directement sur l'une des 6 destinations possibles en deux pas :\n les 6 cases claires voisines des 3 cases foncées voisines de votre pyramide.
\n \n Vous jouez Foncé, faites un pas double.","5302904876941698020":"Raté ! Vous avez fait un simple pas.","5162969671337604607":"Vous ne pouvez plus insérer, toutes vos pièces sont déjà sur le plateau !","2237663589140902242":"Vous ne pouvez pas pousser, vous n'avez pas assez de forces","6414951217478686255":"Vous devez déplacer votre pièce ou effectuer une rotation.","2533760570032755409":"Votre poussée est invalide : elle n'est pas droite, ne pousse rien, ou sort du plateau.","6641065739366631527":"Vous devez sélectionner une destination valide (mise en évidence sur le plateau) pour votre pièce.","3129880366808972802":"Vous devez sélectionner une orientation pour votre pièce en cliquant sur une des flèches.","4789301325429521721":"Nombre de pièces par joueur","6496295523512347479":"Nombre de montagnes bonus","8745202933853690845":"Le but du Siam est d'être le premier à pousser une montagne hors du plateau. Le plateau de départ en contient trois, au centre, et aucun pion n'est initialement sur le plateau. Durant son tour de jeu un joueur peut effectuer l'une des actions suivantes :
Faire entrer une pièce sur le plateau.
Changer l'orientation d'une de ses pièces.
Déplacer une de ses pièces et éventuellement la réorienter.
Sortir un de ses pions du plateau.
","5290831626966707862":"On ne peut pas rotationner une pièce hors du plateau: {$PH}","3925814099582230333":"Les SiamMove doivent terminer ou commencer sur le plateau: {$PH}","5519545750670700019":"Les SiamMove doivent avoir moveDirection et landingOrientation identique quand une pièce sort du plateau: {$PH}","4040000701091542987":"Insérer une pièce","4877870999512279099":"Chaque joueur a en tout 5 pièces. Tant qu'il vous reste des pièces de réserves sur le côté du plateau, vous pouvez en insérer une. Pour ce faire :
Sélectionnez une pièces depuis votre réserve, située à côté du plateau.
Cliquez sur une des cases mises en avant pour sélectionner une case de destination pour votre pièce.
Sélectionnez une orientation pour votre pièce en cliquant sur une des flèches apparues sur le plateau.
Vous jouez Foncé, insérez une pièce sur le plateau.","4137959840028416520":"Nous distinguerons ici \"déplacer\" et \"pousser\".Un déplacement de pièce se fait de sa case de départ à une case vide voisine horizontalement ou verticalement. Il est également possible de faire sortir une pièce du plateau. Pour déplacer une pièce :
Cliquez dessus.
Cliquez sur la destination voulue de la pièce. Vous pouvez aussi cliquer une seconde fois sur votre pièce pour changer son orientation sans la déplacer.
Sélectionnez une orientation pour votre pièce en cliquant sur une des flèches apparues sur le plateau.
Vous jouez Foncé. Essayez de déplacer votre pièce se trouvant déjà sur le plateau d'une case vers le haut et de l'orienter vers la gauche.","1302903286060317619":"Bravo, vous avez fait un dérapage !","6800736002193770248":"Sortir une pièce","5868523312663011403":"Sortir une pièce du plateau est plus simple, préciser son orientation d'arrivée n'est pas nécessaire.
Vous jouez Foncé, sortez cette pièce du plateau !","423861981305705638":"Bravo, même si dans le contexte c'était plutôt un mouvement inutile.","2311226881614577495":"Raté, la pièce est encore sur le plateau.","1863585492531844895":"Quand la case d'arrivée de votre déplacement est occupée, on parle de \"pousser\". Pour pousser des pièces d'un joueur, plusieurs critères doivent être vérifiés :
Votre pièce doit déjà être orientée dans le sens de la poussée.
Dans la ligne que vous poussez, le nombre de pièces (à vous et à l'adversaire) orientée dans le sens de la poussée doit être strictement supérieur au nombre de pièces qui y font face.
Regardez attentivement le plateau. Sur la première ligne, vous ne pouvez pas pousser car il y a exactement une pièce dans la direction opposée. Sur la deuxième ligne, vous pouvez pousser car il y a deux pièces contre une.
Vous jouez Foncé. Verticalement, vous pouvez pousser avec votre pièce au centre, car il n'y a pas de résistance sur cet axe. Faites-le.","1762973675800865905":"Pour pousser une montane, vous avez besoin d'un pièce pousseuse par montagne. Chaque résistant (pièce dans la direction opposée) annule la force d'une pousseuse. En résumé, s'il n'y a pas de montagne vous devez avoir strictement plus de pousseurs que de résistants. S'il y a une montagne, vous devez avoir autant de pousseurs qu'il y a de résistants et montagnes. Sur le plateau, vous pouvez, en tant que Foncé, pousser la montagne de la première ligne. Sur la deuxième et troisième, vous ne pouvez pas pousser à cause des pièces et montagnes résistantes. Sur la quatrième ligne, vous pouvez pousser car il y a une pousseuse de plus que de pièces résistantes.
Vous jouez Foncé, poussez sur la quatrième ligne.","709861006710076010":"Bravo ! Notez que ce mouvement vous fait perdre, comme vous allez le voir dans l'étape suivante.","5917097999963707548":"Pour rappel, la partie se termine quand une montagne est poussée hors du plateau. Si vous l'avez poussé et que personne ne vous barre la route, vous êtes le vainqueur. Cependant, si vous poussez un adversaire orienté dans la même direction que vous, il sera considéré vainqueur. En revanche, si un adversaire est plus proche de la montagne, mais mal orienté, la victoire sera vôtre.
Ici, en jouant Foncé, vous pouvez pousser une montagne hors du plateau et soit gagner, soit perdre. Choisissez consciencieusement !","8309748811457759789":"Raté, vous avez perdu.","2035984245529775458":"Vous ne pouvez pas encore effectuer de déplacement. Choisissez une case où déposer une pièce.","5972149122807464966":"Plusieurs groupes ont la même taille, vous devez en choisir un à garder.","586640917828080274":"Vous ne pouvez pas choisir un groupe à garder lorsqu'un est plus petit que l'autre.","8942923511988910642":"Vous ne pouvez plus déposer de pièces, choisissez d'abord une pièce à déplacer.","1582776814244416485":"Vous devez choisir un des plus grands groupes pour le conserver.","3079321797470229596":"Vous ne pouvez choisir une pièce vide, choisissez un des plus grands groupes.","4110234759792602964":"Vous devez faire atterrir cette pièce à côté d'une autre pièce.","7208567678509553256":"Ce mouvement ne déconnecte pas du jeu de pièces adverses ! Réessayez avec une autre pièce !","6058377963019501239":"Vous avez perdu une de vos pièce pendant ce mouvement, il y a un moyen de déconnecter une pièce adversaire sans perdre aucune pièce, recommencez !","1815943775702363568":"Le Six est une jeu sans plateau, où les pièces sont placées les unes à côtés des autres, en un bloc continu. Chaque joueur a 21 pièces à lui, 2 étant déjà placée sur le plateau. Le but principal du jeu est de former l'une des trois formes gagnantes avec vos pièces.","1323662052932112829":"Victoire (ligne)","4554770606444065239":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous alignez six de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","2466439893530767761":"Victoire (rond)","4365332414018101911":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous dessinez un cercle avec 6 de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","3255477892845543355":"Bravo ! Notez que la présence ou non d'une pièce à l'intérieur du rond ne change rien.","4644119482430965077":"Victoire (triangle)","5836697956170776107":"Sur ce plateau, en plaçant votre pièce au bon endroit, vous dessinez un triangle avec 6 de vos pièces, et gagnez la partie.
\n Trouvez la victoire, Vous jouez Foncé.","8968454720078127329":"Deuxième phase","7184945664924176112":"Quand après 40 tours, toutes vos pièces sont placées, on passe en deuxième phase.\n Il faut maintenant déplacer ses pièces, en prenant garde à ne pas enlever une pièce qui empêchait l'adversaire de gagner.\n Dorénavant, si après un déplacement, un ou plusieurs groupe de pièces est déconnecté du plus grand groupe de pièces, ces petits groupes de pièces sont enlevés définitivement du jeu.
\n Vous jouez Foncé, effectuez un déplacement qui déconnecte une pièce de votre adversaire.","6404013542075961070":"Bravo, vous avez fait perdre une pièce à votre adversaire et vous vous êtes rapproché potentiellement de la victoire !","4819564470925108710":"Victoire par déconnection","3845114702040437383":"Lors de la seconde phase de jeu, en plus des victoires normales (ligne, rond, triangle), on peux gagner par déconnection.\n Si à un moment du jeu, l'un des deux joueurs n'a plus assez de pièce pour gagner (il en a donc moins de 6), la partie s'arrête.\n Celui qui a le plus de pièces a gagné, et en cas d'égalité, c'est match nul.
\n Ici, vous pouvez gagner (vous jouez Foncé). Faites-le !","631151175449209373":"Déconnection spéciale","6890637892579669718":"Lors d'une déconnection, de deux à plusieurs groupes peuvent faire la même taille,\n auquel cas, un clic en plus sera nécessaire pour indiquer lequel vous souhaitez garder.
\n Vous jouez Foncé, coupez le plateau en deux parties égales.","4762560256027932544":"Ce mouvement n'as pas coupé le plateau en deux parties égales.","4274208426593680443":"Raté. Vous avez coupé le plateau en deux parties, mais avez gardé la partie où vous êtes en minorité. Vous avez donc perdu ! Essayez à nouveau.","2976149661707388406":"Fuite > Pièces > Contrôle","4456476499852991526":"Vous ne pouvez pas atterrir sur une case occupée.","299718976758118618":"Une fois que vous avez quitté le trône central, vous ne pouvez pas y retourner.","1513340614663053294":"Les soldats n'ont pas le droit de se poser sur le trône.","4065705313723361978":"Il y a une pièce entre la pièce que vous avez choisie et sa case d'atterissage.","189691672447950321":"Vous devez vous déplacer sur une case voisine.","6790757046240382671":"Les mouvements aux jeux de Tafl doivent être orthogonaux.","7623537877233304257":"Pièces > Contrôle","1760148711911088235":"Pièces > Influence","3372037160964274985":"Pièces","7559617831371314788":"Brandhub est la version irlandaise du jeu de Tafl, la famille de jeu de stratégie Viking. Le but du jeu est différent pour chaque joueur. Les attaquants jouent en premier. Leurs pièces (foncées) sont près des bords. Leur but est de capturer le roi, qui est au centre du plateau. Les défenseurs jouent en deuxième. Leurs pièces (claires) sont au milieu. Leur but est que le roi atteigne l'un des 4 trônes dans les coins. Notez que la case sur laquelle le roi commence, au centre du plateau, est aussi un trône.","4948014485926272515":"Toutes les pièces se déplacent de la même façon. Comme la tour aux échecs, une pièce peut bouger :
D'autant de cases que souhaité ;
Sans passer par dessus une autre pièce ni s'arrêter sur une autre pièce ;
Horizontalement ou verticalement ;
Seul le roi peut s'arrêter sur l'un des coins ;
Une fois que le roi a quitté le trône central, plus aucunes pièces ne peut s'arrêter dessus, mais toutes peuvent le survoler.
Pour déplacer une pièce, cliquez dessus puis sur sa destination.
Vous jouez Foncé, faites le premier coup.","7366607587345821534":"Capturer un simple soldat","4542556047957483359":"Toutes les pièces, attaquantes comme défenseuses, sont des soldats, à l'exception du roi. Pour les capturer, il faut en prendre une en sandwich entre deux de vos pièces. En s'approchant trop, un soldat de l'envahisseur s'est mis en danger.
Vous jouez Clair. Capturez le soldat.","1504890408061490574":"Bravo, ça lui apprendra !","9035153077895210009":"Raté, vous avez manqué une occasion de capturer une pièce adverse.","1349136475821045956":"Un deuxième moyen de capturer un soldat est de le prendre en sandwich contre un trône vide. Le roi a quitté son poste, et mis en danger un de ses soldats.
Vous jouez Foncé. Capturez le soldat.","6149168030196118189":"Bravo, un défenseur en moins, mais gardez quand même un œil sur le roi, c'est le plus important.","2625274275364629010":"Raté, vous n'avez pas fait le mouvement demandé.","8078344255720503228":"Capturer le roi sur son trône","1735534781216205320":"Pour capturer le roi quand il est sur son trône, les 4 cases voisines au roi (horizontalement et verticalement) doivent être occupées par vos pions.
Vous jouez Foncé. Capturez le roi.","3068385624186077540":"Capturer le roi","6006281576137172714":"Pour capturer le roi, deux soldats ne sont pas suffisant, il en faut plus. Pour la première solution, il faut simplement que les 4 cases voisines (horizontalement et verticalement) soient occupées par vos soldats. Ceci fonctionne également si le roi est assis sur son trône.
Vous jouez Foncé, capturez le roi.","2543567724882527416":"Raté, vous avez laissé fuir le roi.","4897090029478298745":"Capturer le roi à côté de son trône","8145627268762433482":"Un autre moyen de capturer le roi est d'utiliser trois soldats plus le trône central pour entourer le roi des 4 côtés.
Vous jouez Foncé. Capturez le roi.","8429826787913397956":"Un autre moyen de capturer le roi est de l'immobiliser à 3 contre un bord. Notez qu'un roi n'est pas capturable sur une case voisine à un trône.
Vous jouez Foncé, capturez le roi.","4169759104868172929":"Tablut est la version Lapone du jeu de Tafl, une famille de jeu de stratégie. Le but du jeu pour les deux joueurs n'est pas le même. L'attaquant joue en premier, ses pièces (foncées) sont placées proches des bords. Son but est de capturer le roi, qui est tout au centre du plateau. Le défenseur joue en deuxième, ses pièces (claires) sont au centre. Son but est de placer le roi sur l'un des 4 trônes situés dans les coins. Notez que la case où est le roi au début du jeu, au centre du plateau, est également un trône.","1347435830524797455":"Teeko Standard","6407662856197686253":"Les pièces se téléportent","560394398723321416":"Teleport Teeko","3648165339236868481":"Le but du jeu est d'aligner vos 4 pièces, ou de les placer en carré.","5528013857873835184":"Après avoir déposé vos quatre pièces, vous devez déplacer une de vos pièces à un emplacement voisin vide, orthogonalement ou diagonalement. Le but reste le même : être le premier à créer une ligne ou un carré.
Vous jouez Foncé, déplacez une pièce.","6991053095147622953":"Sur ce plateau, vous pouvez gagner en formant un carré.
Vous jouez Foncé, gagnez.","4133557660322432859":"Bravo, vous avez gagné ! Souvenez-vous que vous pouvez aussi gagner en créant une ligne.","1739222080553143193":"Ces deux cases ne sont pas voisines !","4853714910007564389":"Il n'y a pas moyen de placer une pièce ici !","7841599074494103882":"Vous ne pouvez pas déposer de pièce sur seulement une autre pièce !","4138926893172482803":"Vous ne pouvez pas déposer de pièce sur deux piles de hauteurs différentes !","1296355206706368557":"Au Trexo, le but du jeu est d'aligner 5 pièces de votre couleur dans une ligne horizontale, verticale, ou diagonale. Mais les joueurs déposent des tuiles constituées de deux pièces, une pour chaque joueur !","6011148802067949079":"Déposer une tuile","2972240786684210487":"Quand vous déposez une tuile, elle doit être mise sur deux pièces au même niveau, ou à même le plateau, mais ces deux pièces ne peuvent pas faire partie de la même tuile. En d'autres mots elle doit soit être immédiatement sur le plateau, soit à cheval sur deux tuiles de même hauteur. Pour ce faire, cliquez d'abord sur l'endroit où vous voulez déposer la pièce de l'adversaire, puis sur la case voisine où vous voulez mettre votre pièce.
Vous jouez Foncé, allez-y.","6262113904872794006":"Placer une pièce sur d'autres pièces","882687674117366349":"Vous pouvez superposer les tuiles. Pour ce faire vous devez respecter deux règles :
Les deux pièces doivent être au même niveau.
Vous ne pouvez pas déposer votre tuile sur une seule tuile.
Vous jouez Foncé, placez une tuile en hauteur.","8122888205935746981":"Raté, vous avez mis cette pièce au niveau du plateau, veuillez placer une tuile sur les deux autres tuiles.","3210337788599026628":"Pour gagner au Trexo, vous devez aligner 5 de vos pièces. Seule la pièce en haut d'une pile compte, les pièces cachées ne sont plus une menace, et une victoire peut inclure des pièces de hauteurs différentes. Puisque vous déposez les pièces adverses en premier, si vous créez un alignement avec les pièces adverses, vous perdez, même si vous alignez aussi 5 de vos pièces.
Vous jouez Foncé, gagnez.","2462375977615446954":"Le roi est mort, longue vie au roi. Bravo, vous avez gagné la partie.","6061494208056217209":"Capturer le roi loin de son trône","1214950240176247246":"Quand le roi n'est ni sur son trône central, ni à côté de celui-ci, il peut être capturé comme un soldat.
Vous jouez Foncé. Capturez le roi.","7072625163028579495":"Hnefatafl est la version lapone du jeu de Tafl, la famille de jeu de stratégie Viking. Le but du jeu est différent pour chaque joueur. Les attaquants jouent en premier. Leurs pièces (foncées) sont près des bords. Leur but est de capturer le roi, qui est au centre du plateau. Les défenseurs jouent en deuxième. Leurs pièces (claires) sont au milieu. Leur but est que le roi atteigne l'un des 4 trônes dans les coins. Notez que la case sur laquelle le roi commence, au centre du plateau, est aussi un trône.","439785126864846458":"Toutes les pièces se déplacent de la même façon. De façon équivalente aux tours aux échecs, une pièce se déplace :
D'autant de cases qu'elle veut.
Sans passer à travers ou s'arrêter sur une autre pièce.
Horizontalement ou verticalement.
Seul le roi peut s'arrêter sur un trône.
Pour déplacer une pièce, cliquez dessus, puis sur sa destination.
Vous jouez Foncé, faites le premier mouvement.","9155303779171419902":"Vous ne pouvez pas placer d'anneau sans placer de marqueurs après le dixième tour.","1259286853143283501":"Vous ne pouvez pas placer vos marqueurs avant d'avoir placé tous vos anneaux.","923761852987939376":"La direction de votre mouvement est invalide: un mouvement se fait le long d'une ligne droite.","4828021707700375959":"Vous ne pouvez que capturer vos propres marqueurs.","8518184052895338328":"Vous devez choisir un de vos propres anneaux à déplacer.","5102601060485644767":"Votre anneau doit terminer son mouvement sur une case vide.","1286643089876989148":"Un anneau ne peut passer qu'au dessus des marqueurs ou de cases vides, pas au dessus d'un autre anneau.","3047973571712211401":"Votre déplacement doit s'arrêter à la première case vide après un groupe de marqueurs.","5146449464465539521":"Quand vous capturez des marqueurs, vous devez reprendre l'un de vos anneaux en cliquant dessus.","7525019515401716113":"Raté ! Vous devez aligner 5 marqueurs de votre couleur pour pouvoir les capturer, ainsi que pour récupérer un anneau.","4464967427027571359":"Raté ! Vous pouvez capturer deux anneaux en tout, en procédant à deux captures de 5 de vos marqueurs. Réessayez.","6448631040503247025":"Le but du jeu à Yinsh est de capturer trois anneaux en tout. Le nombre d'anneaux capturés est indiqué en haut à gauche pour Foncé, et en bas à droite pour le joueur clair. Ici, Foncé a gagné la partie. Notez que sur le plateau vous avez deux types des pièces pour chaque joueur : des anneaux (pièces creuses) et des marqueurs (pièces pleines).","6047690275464996632":"Plateau initial et phase de placement","3619666883540312330":"Le plateau initial est vide.\n Au début de la partie, chaque joueur place à son tour un de ses anneaux.\n Cette phase s'arrête lorsque que tous les anneaux ont été placés.
\n Vous jouez Foncé, placez un de vos anneaux en cliquant sur la case du plateau où vous désirez le placer.","6117091506461787133":"Placer un marqueur","2622897751178992678":"Une fois la phase initiale terminée et tous vos anneaux présents sur le plateau, il vous faut placer des marqueurs sur le plateau.\n Pour ce faire, placez un marqueur dans un de vos anneaux en cliquant sur cet anneau.\n Ensuite, l'anneau doit se déplacer en ligne droite dans n'importe quelle direction.\n Un anneau ne peut pas, lors de son mouvement, passer à travers d'autres anneaux.\n Si vous passez au dessus d'un groupe de marqueurs, votre mouvement doit s'arrêter à la première case vide qui suit ce groupe.\n Tous les marqueurs du groupe sont alors retournés et changent de couleur.
\n Vous jouez Foncé, effectuez un mouvement.","4761648797342068775":"Récupérer un anneau en alignant 5 marqueurs","8100703918510255362":"Finalement, la seule mécanique qu'il vous manque est de pouvoir récupérer des anneaux afin de marquer des points.\n Pour cela, il faut que vous alignez 5 marqueurs de votre couleur.\n Vous pouvez alors récupérer ces marqueurs en cliquant dessus, et ensuite récupérer un de vos anneaux en cliquant dessus.\n Vous avez alors un point de plus.\n Vous êtes obligés d'effectuer une capture quand elle se présente.
\n Vous jouez Foncé, effectuez une capture !","4758113906566791089":"Captures composées","4474897538192187001":"Il est possible que lors d'un tour, vous ayez la possibilité de choisir entre plusieurs captures,\n ou même d'effectuer plusieurs captures !\n Lorsque, lors de la sélection d'une capture, le marqueur sur lequel vous avez cliqué appartient à deux captures, il vous faudra cliquer sur un second marqueur pour lever toute ambiguité.
- You're playing Dark, click on a stack and move it by one space.`, _DvonnRules__WEBPACK_IMPORTED_MODULE_7__.DvonnRules.get().getInitialState(), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_0__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(3, 0)).get(), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStepMessage__WEBPACK_IMPORTED_MODULE_8__.TutorialStepMessage.CONGRATULATIONS()), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_3__.TutorialStep.fromPredicate($localize`Disconnection`, $localize`Pieces with a lightning strike are called "sources".
+ You're playing Dark, click on a stack and move it by one space.`, _DvonnRules__WEBPACK_IMPORTED_MODULE_7__.DvonnRules.get().getInitialState(), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_1__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 0), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(3, 0)).get(), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStepMessage__WEBPACK_IMPORTED_MODULE_8__.TutorialStepMessage.CONGRATULATIONS()), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_4__.TutorialStep.fromPredicate($localize`Disconnection`, $localize`Pieces with a lightning strike are called "sources".
When a stack is not directly nor indirectly connected to a source, it is removed from the board.
- You're playing Dark, try to disconnect the stack of 4 pieces from your opponent. There are two ways of doing that, one is better than the other: try to find that one!`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_1__.DvonnState([[NN, NN, X1, SO, __, __, __, __, __, __, __], [NN, __, O1, __, __, __, __, __, __, __, __], [__, __, X4, __, __, __, __, X1, SO, __, __], [__, __, __, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_0__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 1), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0)).get(), (move, _previous, _result) => {
- if (move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(3, 0))) {
- return _everyboard_lib__WEBPACK_IMPORTED_MODULE_6__.MGPValidation.failure($localize`You have successfully disconnected the stack of 4 pieces of your opponent, but on the next move your opponent will be able to move on your new stack, and to win the game! There exists a better outcome of this situation, try to find it.`);
+ You're playing Dark, try to disconnect the stack of 4 pieces from your opponent. There are two ways of doing that, one is better than the other: try to find that one!`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_2__.DvonnState([[NN, NN, X1, SO, __, __, __, __, __, __, __], [NN, __, O1, __, __, __, __, __, __, __, __], [__, __, X4, __, __, __, __, X1, SO, __, __], [__, __, __, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_1__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 1), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 0)).get(), (move, _previous, _result) => {
+ if (move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(3, 0))) {
+ return _everyboard_lib__WEBPACK_IMPORTED_MODULE_0__.MGPValidation.failure($localize`You have successfully disconnected the stack of 4 pieces of your opponent, but on the next move your opponent will be able to move on your new stack, and to win the game! There exists a better outcome of this situation, try to find it.`);
} else {
- _everyboard_lib__WEBPACK_IMPORTED_MODULE_6__.Utils.assert(move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0)), 'player made an impossible move'); // this is the only valid move remaining
- return _everyboard_lib__WEBPACK_IMPORTED_MODULE_6__.MGPValidation.SUCCESS;
+ _everyboard_lib__WEBPACK_IMPORTED_MODULE_0__.Utils.assert(move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 0)), 'player made an impossible move'); // this is the only valid move remaining
+ return _everyboard_lib__WEBPACK_IMPORTED_MODULE_0__.MGPValidation.SUCCESS;
}
}, $localize`Nice, you have disconnected 4 pieces of your opponent, and your new stack cannot be reached by your opponent!
Your opponent therefore lost 5 points: 4 from the disconnected stack, and one from the stack on which you moved.
- Disconnected stacks will not be visible at the next turn.`), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_3__.TutorialStep.fromPredicate($localize`Moving on a source`, $localize`You are allowed to move your stacks on any other stack.
+ Disconnected stacks will not be visible at the next turn.`), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_4__.TutorialStep.fromPredicate($localize`Moving on a source`, $localize`You are allowed to move your stacks on any other stack.
This means that you can take control of a source by moving one of your stack on top of it.
This way, you know that this stack may never be disconnected, as it contains a source.
- You're playing Dark and you can take control of a source, do it!`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_1__.DvonnState([[NN, NN, SO, X1, __, __, __, __, __, __, __], [NN, O1, O1, __, __, __, __, __, __, __, __], [__, X1, O1, X1, __, __, O1, X2, SO, __, __], [__, __, X1, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_0__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 1), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0)).get(), (move, _previous, _result) => {
- if (move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0))) {
- return _everyboard_lib__WEBPACK_IMPORTED_MODULE_6__.MGPValidation.SUCCESS;
+ You're playing Dark and you can take control of a source, do it!`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_2__.DvonnState([[NN, NN, SO, X1, __, __, __, __, __, __, __], [NN, O1, O1, __, __, __, __, __, __, __, __], [__, X1, O1, X1, __, __, O1, X2, SO, __, __], [__, __, X1, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false), src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_1__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 1), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 0)).get(), (move, _previous, _result) => {
+ if (move.getEnd().equals(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_3__.Coord(2, 0))) {
+ return _everyboard_lib__WEBPACK_IMPORTED_MODULE_0__.MGPValidation.SUCCESS;
} else {
- return _everyboard_lib__WEBPACK_IMPORTED_MODULE_6__.MGPValidation.failure($localize`You have not taken possession of a source, try again.`);
+ return _everyboard_lib__WEBPACK_IMPORTED_MODULE_0__.MGPValidation.failure($localize`You have not taken possession of a source, try again.`);
}
- }, $localize`Congratulations! However, note that your opponent could later take possession of one of your stack that contains a source, so watch out when you take control of sources!`), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_3__.TutorialStep.informational($localize`Passing`, $localize`It can happen that you have no possible move to make.
+ }, $localize`Congratulations! However, note that your opponent could later take possession of one of your stack that contains a source, so watch out when you take control of sources!`), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_4__.TutorialStep.informational($localize`Passing`, $localize`It can happen that you have no possible move to make.
If this is the case, and if your opponent can still move, you must pass your turn.
- This is a situation that occurs here for Dark.`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_1__.DvonnState([[NN, NN, SO, __, __, __, __, __, __, __, __], [NN, __, O2, __, __, __, __, __, __, __, __], [__, __, X2, __, __, __, __, X2, SO, O4, __], [__, __, __, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false)), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_3__.TutorialStep.fromMove(src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStepMessage__WEBPACK_IMPORTED_MODULE_8__.TutorialStepMessage.END_OF_THE_GAME(), $localize`When no more move is possible for both players, the game ends and the player with the most points wins.
You're playing Dark, make your last move.`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_1__.DvonnState([[NN, NN, SO, __, __, __, __, __, __, __, __], [NN, __, O1, __, __, __, __, __, __, __, __], [__, __, __, __, __, __, __, __, SO, O4, __], [__, __, __, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false), [src_app_games_dvonn_DvonnMove__WEBPACK_IMPORTED_MODULE_0__.DvonnMove.from(new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 1), new src_app_jscaip_Coord__WEBPACK_IMPORTED_MODULE_2__.Coord(2, 0)).get()], $localize`Congratulations, you won 6 - 0!`, $localize`Bad idea, by moving on the source you would have won a point.`)];
+ This is a situation that occurs here for Dark.`, new src_app_games_dvonn_DvonnState__WEBPACK_IMPORTED_MODULE_2__.DvonnState([[NN, NN, SO, __, __, __, __, __, __, __, __], [NN, __, O2, __, __, __, __, __, __, __, __], [__, __, X2, __, __, __, __, X2, SO, O4, __], [__, __, __, __, __, __, __, __, __, __, NN], [__, __, __, __, __, __, __, __, __, NN, NN]], 0, false)), src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStep__WEBPACK_IMPORTED_MODULE_4__.TutorialStep.fromMove(src_app_components_wrapper_components_tutorial_game_wrapper_TutorialStepMessage__WEBPACK_IMPORTED_MODULE_8__.TutorialStepMessage.END_OF_THE_GAME(), $localize`When no more move is possible for both players, the game ends and the player with the most points wins.
;\n\n public getHexaPoints(): string {\n return this.hexaLayout.getHexaPoints();\n }\n\n public getCenterAtXY(x: number, y: number): Coord {\n const coord: Coord = new Coord(x, y);\n return this.getCenterAt(coord);\n }\n\n public getCenterAt(coord: Coord): Coord {\n return this.hexaLayout.getCenterAt(coord);\n }\n\n public getHexaCenterTranslationAt(coord: Coord): string {\n return this.getHexaCenterTranslationAtXY(coord.x, coord.y);\n }\n\n public getHexaCenterTranslationAtXY(x: number, y: number): string {\n const centerAtXY: Coord = this.getCenterAtXY(x, y);\n return this.getSVGTranslationAt(centerAtXY);\n }\n\n}\n","import { Component } from '@angular/core';\nimport { Coord } from 'src/app/jscaip/Coord';\nimport { Move } from 'src/app/jscaip/Move';\nimport { GameComponent } from './GameComponent';\nimport { GameState } from 'src/app/jscaip/state/GameState';\nimport { Table } from 'src/app/jscaip/TableUtils';\nimport { SuperRules } from 'src/app/jscaip/Rules';\nimport { EmptyRulesConfig, RulesConfig } from 'src/app/jscaip/RulesConfigUtil';\n\n@Component({ template: '' })\nexport abstract class TriangularGameComponent,\n M extends Move,\n S extends GameState,\n P,\n C extends RulesConfig = EmptyRulesConfig,\n L = void>\n extends GameComponent\n{\n public override SPACE_SIZE: number = 100;\n\n public board: Table
;\n\n protected getTriangleCornerCoordsAtXY(x: number, y: number): Coord[] {\n if ((x + y) % 2 === 0) {\n return this.getUpwardCoordinate();\n } else {\n return this.getDownwardCoordinate();\n }\n }\n\n public getTrianglePointsAt(coord: Coord): string {\n return this.getTrianglePointsAtXY(coord.x, coord.y);\n }\n\n public getTrianglePointsAtXY(x: number, y: number): string {\n const coords: Coord[] = this.getTriangleCornerCoordsAtXY(x, y);\n return this.mapCoordsToPoints(coords);\n }\n\n public getTriangleTranslationCoord(coord: Coord): Coord {\n const translationX: number = 0.5 * coord.x * this.SPACE_SIZE;\n const translationY: number = coord.y * this.SPACE_SIZE;\n return new Coord(translationX, translationY);\n }\n\n public getTriangleTranslationAt(coord: Coord): string {\n return this.getTriangleTranslationAtXY(coord.x, coord.y);\n }\n\n public getTriangleTranslationAtXY(x: number, y: number): string {\n const coord: Coord = new Coord(x, y);\n const translation: Coord = this.getTriangleTranslationCoord(coord);\n return this.getSVGTranslationAt(translation);\n }\n\n private getDownwardCoordinate(): Coord[] {\n const left: number = 0;\n const middle: number = this.SPACE_SIZE / 2;\n const right: number = this.SPACE_SIZE;\n const top: number = 0;\n const bottom: number = this.SPACE_SIZE;\n const leftCorner: Coord = new Coord(left, top);\n const middleCorner: Coord = new Coord(middle, bottom);\n const rightCorner: Coord = new Coord(right, top);\n return [leftCorner, middleCorner, rightCorner, leftCorner];\n }\n\n private getUpwardCoordinate(): Coord[] {\n const left: number = 0;\n const middle: number = this.SPACE_SIZE / 2;\n const right: number = this.SPACE_SIZE;\n const top: number = 0;\n const bottom: number = this.SPACE_SIZE;\n const leftCorner: Coord = new Coord(left, bottom);\n const middleCorner: Coord = new Coord(middle, top);\n const rightCorner: Coord = new Coord(right, bottom);\n return [leftCorner, middleCorner, rightCorner, leftCorner];\n }\n\n public getPyramidPointsAt(coord: Coord): string {\n return this.getPyramidPointsAtXY(coord.x, coord.y);\n }\n\n public getPyramidPointsAtXY(x: number, y: number): string {\n if ((x + y) % 2 === 1) {\n return this.getDownwardPyramidPoints();\n } else {\n return this.getUpwardPyramidPoints();\n }\n }\n\n private getDownwardPyramidCoords(): Coord[] {\n const width: number = this.SPACE_SIZE;\n const halfWidth: number = this.SPACE_SIZE / 2;\n const UP_LEFT: Coord = new Coord(0, 0);\n const UP_RIGHT: Coord = new Coord(width, 0);\n const DOWN_CENTER: Coord = new Coord(halfWidth, width);\n const CENTER: Coord = new Coord(halfWidth, halfWidth);\n return [\n UP_LEFT,\n DOWN_CENTER,\n CENTER,\n UP_LEFT,\n CENTER,\n UP_RIGHT,\n UP_LEFT,\n UP_RIGHT,\n DOWN_CENTER,\n CENTER,\n UP_RIGHT,\n ];\n }\n\n private getDownwardPyramidPoints(): string {\n const coords: Coord[] = this.getDownwardPyramidCoords();\n return this.mapCoordsToPoints(coords);\n }\n\n private mapCoordsToPoints(coords: Coord[]): string {\n return coords\n .map((coord: Coord) => coord.toSVGPoint())\n .join(', ');\n }\n\n private getUpwardPyramidCoords(): Coord[] {\n const halfWidth: number = this.SPACE_SIZE / 2;\n const width: number = this.SPACE_SIZE;\n const DOWN_LEFT: Coord = new Coord(0, width);\n const DOWN_RIGHT: Coord = new Coord(width, width);\n const UP_CENTER: Coord = new Coord(halfWidth, 0);\n const CENTER: Coord = new Coord(halfWidth, halfWidth);\n return [\n DOWN_LEFT,\n UP_CENTER,\n CENTER,\n DOWN_LEFT,\n CENTER,\n DOWN_RIGHT,\n DOWN_LEFT,\n DOWN_RIGHT,\n UP_CENTER,\n CENTER,\n DOWN_RIGHT,\n ];\n }\n\n private getUpwardPyramidPoints(): string {\n const coords: Coord[] = this.getUpwardPyramidCoords();\n return this.mapCoordsToPoints(coords);\n }\n\n}\n","import { Comparable } from '@everyboard/lib';\nimport { Move } from '../../../jscaip/Move';\nimport { Component } from '@angular/core';\nimport { GameStateWithTable } from 'src/app/jscaip/state/GameStateWithTable';\nimport { SuperRules } from 'src/app/jscaip/Rules';\nimport { RectangularGameComponent } from '../rectangular-game-component/RectangularGameComponent';\nimport { Coord } from 'src/app/jscaip/Coord';\nimport { GobanConfig } from 'src/app/jscaip/GobanConfig';\nimport { GobanUtils } from 'src/app/jscaip/GobanUtils';\n\n/**\n * This component is used for games that are played on a Goban.\n * It helps displaying hoshis.\n */\n@Component({\n template: '',\n})\nexport abstract class GobanGameComponent,\n M extends Move,\n S extends GameStateWithTable
,\n P extends NonNullable,\n C extends GobanConfig = GobanConfig,\n L = void>\n extends RectangularGameComponent\n{\n\n public hoshis: Coord[] = [];\n /**\n * Creates the hoshis, filling in the `hoshis` field with the hoshis based on the board size.\n * Must be called after `this.board` has been set, usually in `updateBoard`.\n */\n public createHoshis(): void {\n const height: number = this.getHeight();\n const width: number = this.getWidth();\n this.hoshis = GobanUtils.getHoshis(width, height);\n }\n\n}\n","import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';\nimport { BaseGameComponent } from 'src/app/components/game-components/game-component/GameComponent';\nimport { Coord } from 'src/app/jscaip/Coord';\nimport { GobanUtils } from 'src/app/jscaip/GobanUtils';\n\n@Component({\n selector: '[app-blank-goban]',\n templateUrl: './blank-goban.component.svg',\n styleUrls: ['../../game-component/game-component.scss'],\n})\nexport class BlankGobanComponent extends BaseGameComponent implements OnChanges {\n\n @Input() width: number;\n @Input() height: number;\n @Output() clickCallBack: EventEmitter = new EventEmitter();\n public hoshis: Coord[] = [];\n\n public ngOnChanges(): void {\n return this.createHoshis();\n }\n\n public onClick(x: number, y: number): void {\n return this.clickCallBack.emit(new Coord(x, y));\n }\n\n /**\n * Creates the hoshis, filling in the `hoshis` field with the hoshis based on the board size.\n * Must be called after `this.board` has been set, usually in `updateBoard`.\n */\n public createHoshis(): void {\n this.hoshis = GobanUtils.getHoshis(this.width, this.height);\n }\n\n}\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n","import { Component } from '@angular/core';\nimport { RectangularGameComponent } from '../rectangular-game-component/RectangularGameComponent';\nimport { SuperRules } from 'src/app/jscaip/Rules';\nimport { Move } from 'src/app/jscaip/Move';\nimport { GameStateWithTable } from 'src/app/jscaip/state/GameStateWithTable';\nimport { Coord } from 'src/app/jscaip/Coord';\nimport { EmptyRulesConfig, RulesConfig } from 'src/app/jscaip/RulesConfigUtil';\n\nexport interface ModeConfig {\n\n offsetRatio: number;\n\n horizontalWidthRatio: number;\n\n pieceHeightRatio: number;\n\n parallelogramHeight: number,\n\n abstractBoardSize: number,\n}\n\n@Component({\n template: '',\n})\nexport abstract class ParallelogramGameComponent,\n M extends Move,\n S extends GameStateWithTable
,\n P extends NonNullable,\n C extends RulesConfig = EmptyRulesConfig,\n L = void>\n extends RectangularGameComponent\n{\n public getParallelogramCoords(mode: ModeConfig): Coord[] {\n const parallelogramHeight: number = mode.parallelogramHeight;\n const parallelogramWidth: number = parallelogramHeight * mode.horizontalWidthRatio;\n const parallelogramOffset: number = parallelogramHeight * mode.offsetRatio;\n const x1: number = parallelogramWidth;\n const y1: number = 0;\n const x2: number = parallelogramWidth - parallelogramOffset;\n const y2: number = parallelogramHeight;\n const x3: number = - parallelogramOffset;\n const y3: number = parallelogramHeight;\n return [\n new Coord(0, 0),\n new Coord(x1, y1),\n new Coord(x2, y2),\n new Coord(x3, y3),\n ];\n }\n /**\n * @param x the x coord on the state of the piece to draw\n * @param y the y coord on the state of the piece to draw\n * @param z the z coord on the state of the piece to draw\n * @param mode the mode in which the component is to be drawn\n * @returns the coord(x, y) of the upper left parallelogram to draw on the SVG;\n */\n protected getCoordTranslation(x: number, y: number, z: number, mode: ModeConfig): Coord {\n const spaceHeight: number = mode.parallelogramHeight;\n const spaceWidth: number = spaceHeight * mode.horizontalWidthRatio;\n const spaceOffset: number = mode.offsetRatio * spaceHeight;\n const numberOfOffset: number = mode.abstractBoardSize - y;\n const xBase: number = (x * spaceWidth) + (numberOfOffset * spaceOffset);\n const yBase: number = (y * spaceHeight) - (mode.pieceHeightRatio * spaceHeight * z);\n return new Coord(xBase, yBase);\n }\n}\n","import { Move } from '../../../jscaip/Move';\nimport { Component } from '@angular/core';\nimport { GameStateWithTable } from 'src/app/jscaip/state/GameStateWithTable';\nimport { GameComponent } from '../game-component/GameComponent';\nimport { Table } from 'src/app/jscaip/TableUtils';\nimport { SuperRules } from 'src/app/jscaip/Rules';\nimport { EmptyRulesConfig, RulesConfig } from 'src/app/jscaip/RulesConfigUtil';\nimport { ViewBox } from '../GameComponentUtils';\n\n@Component({\n template: '',\n})\nexport abstract class RectangularGameComponent,\n M extends Move,\n S extends GameStateWithTable
,\n P extends NonNullable,\n C extends RulesConfig = EmptyRulesConfig,\n L = void>\n extends GameComponent\n{\n\n public board: Table
;\n\n public getWidth(): number {\n return this.getState().getWidth();\n }\n\n public getHeight(): number {\n return this.getState().getHeight();\n }\n\n public getViewBox(): ViewBox {\n const width: number = this.getWidth() * this.SPACE_SIZE;\n const height: number = this.getHeight() * this.SPACE_SIZE;\n const halfStroke: number = 0.5 * this.STROKE_WIDTH;\n return ViewBox\n .fromLimits(0, width, 0, height)\n .expandAll(halfStroke);\n }\n\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-account',\n templateUrl: './account.component.html',\n})\nexport class AccountComponent {\n\n public constructor() {}\n\n}\n","
\n
User settings
\n
\n
\n
Resetting password
\n
\n
If you forgot your password or want to change it, click on the following button:
\n \n
\n
\n","import { Component, Input, OnDestroy, ElementRef, ViewChild, OnInit, AfterViewChecked } from '@angular/core';\nimport { ChatService } from '../../../services/ChatService';\nimport { Message, MessageDocument } from '../../../domain/Message';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { faReply, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { FirestoreCollectionObserver } from 'src/app/dao/FirestoreCollectionObserver';\nimport { MinimalUser } from 'src/app/domain/MinimalUser';\nimport { Subscription } from 'rxjs';\nimport { Debug } from 'src/app/utils/Debug';\nimport { Utils } from '@everyboard/lib';\n\n@Component({\n selector: 'app-chat',\n templateUrl: './chat.component.html',\n})\n@Debug.log\nexport class ChatComponent implements OnInit, AfterViewChecked, OnDestroy {\n\n @Input() public chatId!: string;\n @Input() public turn?: number;\n public userMessage: string = '';\n\n public connected: boolean = false;\n public chat: Message[] = [];\n public readMessages: number = 0;\n public unreadMessagesText: string = '';\n public showUnreadMessagesButton: boolean = false;\n public visible: boolean = true;\n\n public faReply: IconDefinition = faReply;\n\n private isNearBottom: boolean = true;\n private notYetScrolled: boolean = true;\n\n private chatSubscription!: Subscription; // initialized in ngOnInit\n\n @ViewChild('chatDiv')\n private readonly chatDiv: ElementRef;\n\n public constructor(private readonly chatService: ChatService,\n private readonly connectedUserService: ConnectedUserService)\n {\n }\n public ngOnInit(): void {\n Utils.assert(this.chatId != null && this.chatId !== '', 'No chat to join mentionned');\n this.loadChatContent();\n }\n public ngAfterViewChecked(): void {\n this.scrollToBottomIfNeeded();\n }\n public loadChatContent(): void {\n const updateMessages: (messages: MessageDocument[]) => void = (messages: MessageDocument[]) => {\n this.updateMessages(messages.flatMap((doc: MessageDocument) => {\n if (doc.data.postedTime == null) {\n // This is a local update that does not contain the time yet, ignore it\n return [];\n }\n return [doc.data];\n }));\n };\n const callback: FirestoreCollectionObserver = new FirestoreCollectionObserver(\n updateMessages,\n updateMessages,\n () => {\n // We don't care about deleted messages\n });\n this.chatSubscription = this.chatService.subscribeToMessages(this.chatId, callback);\n }\n public updateMessages(newMessages: Message[]): void {\n this.chat = this.chat.concat(newMessages);\n const nbMessages: number = this.chat.length;\n if (this.visible && this.isNearBottom) {\n this.readMessages = nbMessages;\n this.updateUnreadMessagesText(0);\n this.scrollToBottom();\n } else {\n this.updateUnreadMessagesText(nbMessages - this.readMessages);\n }\n }\n private updateUnreadMessagesText(unreadMessages: number): void {\n if (this.visible && this.isNearBottom === false) {\n this.showUnreadMessagesButton = true;\n } else {\n this.showUnreadMessagesButton = false;\n }\n\n if (unreadMessages === 0) {\n this.unreadMessagesText = $localize`no new message`;\n this.showUnreadMessagesButton = false;\n } else if (unreadMessages === 1) {\n this.unreadMessagesText = $localize`1 new message`;\n } else {\n this.unreadMessagesText = $localize`${unreadMessages} new messages`;\n }\n }\n private scrollToBottomIfNeeded(): void {\n if (this.visible) {\n if (this.isNearBottom || this.notYetScrolled) {\n this.scrollToBottom();\n }\n }\n }\n public updateCurrentScrollPosition(): void {\n const threshold: number = 10;\n const position: number = this.chatDiv.nativeElement.scrollTop + this.chatDiv.nativeElement.offsetHeight;\n const height: number = this.chatDiv.nativeElement.scrollHeight;\n this.isNearBottom = position > height - threshold;\n }\n public scrollToBottom(): void {\n if (this.chatDiv == null) {\n return;\n }\n this.updateUnreadMessagesText(0);\n this.scrollTo(this.chatDiv.nativeElement.scrollHeight);\n this.notYetScrolled = false;\n }\n public scrollTo(position: number): void {\n this.chatDiv.nativeElement.scroll({\n top: position,\n left: 0,\n behavior: 'smooth',\n });\n }\n public async sendMessage(): Promise {\n const content: string = this.userMessage;\n this.userMessage = ''; // clears it first to seem more responsive\n const sender: MinimalUser = this.connectedUserService.user.get().toMinimalUser();\n await this.chatService.sendMessage(this.chatId, sender, content, this.turn);\n }\n public ngOnDestroy(): void {\n this.chatSubscription.unsubscribe();\n }\n public switchChatVisibility(): void {\n if (this.visible) {\n this.visible = false;\n } else {\n this.visible = true;\n this.updateUnreadMessagesText(0);\n this.scrollToBottom();\n this.readMessages = this.chat.length;\n }\n }\n}\n","
\n {{ part.data.playerOne.name }}\n \n Waiting for opponent\n \n
\n
{{ part.data.turn+1 }}
\n
\n \n
\n
\n
\n\n
\n \n
\n\n
\n
\n
\n \n
\n
\n
\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-local-game-creation',\n templateUrl: './local-game-creation.component.html',\n})\nexport class LocalGameCreationComponent {\n\n public constructor(public router: Router) {\n }\n\n public async pickGame(pickedGame: string): Promise {\n await this.router.navigate(['local/' + pickedGame]);\n }\n}\n","\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { ConnectedUserService, AuthUser } from 'src/app/services/ConnectedUserService';\nimport { MGPValidation } from '@everyboard/lib';\nimport { faEye, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'app-login',\n templateUrl: './login.component.html',\n})\nexport class LoginComponent implements OnInit, OnDestroy {\n\n public faEye: IconDefinition = faEye;\n\n public errorMessage: string;\n\n public loginForm: FormGroup = new FormGroup({\n email: new FormControl(),\n password: new FormControl(),\n });\n\n private userSubscription!: Subscription; // Initialized in ngOnInit\n\n public constructor(public router: Router,\n public connectedUserService: ConnectedUserService)\n {\n }\n public ngOnInit(): void {\n this.userSubscription = this.connectedUserService.subscribeToUser(async(user: AuthUser) => {\n if (user !== AuthUser.NOT_CONNECTED) {\n await this.redirect();\n }\n });\n }\n public async loginWithEmail(value: {email: string, password: string}): Promise {\n const result: MGPValidation = await this.connectedUserService.doEmailLogin(value.email, value.password);\n if (result.isFailure()) {\n this.errorMessage = result.getReason();\n }\n }\n public async loginWithGoogle(): Promise {\n const result: MGPValidation = await this.connectedUserService.doGoogleLogin();\n if (result.isFailure()) {\n this.errorMessage = result.getReason();\n }\n }\n private async redirect(): Promise {\n return this.router.navigate(['/lobby']);\n }\n public canLogin(): boolean {\n const email: string = this.loginForm.value.email ?? '';\n const password: string = this.loginForm.value.password ?? '';\n if (email === '' || password === '') {\n return false;\n }\n return true;\n }\n public ngOnDestroy(): void {\n this.userSubscription.unsubscribe();\n }\n}\n","
\n
Log in
\n \n
\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-next-game-loading',\n templateUrl: './next-game-loading.component.html',\n})\nexport class NextGameLoadingComponent {\n}\n","
The replay game is loading, please wait, it should not take long.
\n","import { Component } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-not-found',\n templateUrl: './not-found.component.html',\n})\nexport class NotFoundComponent {\n\n public message: string;\n\n public constructor(readonly route: ActivatedRoute) {\n this.message = route.snapshot.paramMap.get('message') ?? $localize`This page does not exist.`;\n }\n}\n","
\n
Not found
\n
{{ message }}
\n
\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ConnectedUserService, AuthUser } from 'src/app/services/ConnectedUserService';\nimport { GameService } from 'src/app/services/GameService';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\nimport { GameInfo } from '../pick-game/pick-game.component';\nimport { GameWrapperMessages } from '../../wrapper-components/GameWrapper';\nimport { CurrentGameService } from 'src/app/services/CurrentGameService';\n\n@Component({\n selector: 'app-online-game-creation',\n template: '
Creating online game, please wait, it should not take long.
',\n})\nexport class OnlineGameCreationComponent implements OnInit {\n\n public constructor(private readonly route: ActivatedRoute,\n private readonly router: Router,\n private readonly connectedUserService: ConnectedUserService,\n private readonly currentGameService: CurrentGameService,\n private readonly messageDisplayer: MessageDisplayer,\n private readonly gameService: GameService) {\n }\n public async ngOnInit(): Promise {\n await this.createGameAndRedirectOrShowError(this.extractGameFromURL());\n }\n private extractGameFromURL(): string {\n return Utils.getNonNullable(this.route.snapshot.paramMap.get('compo'));\n }\n private async createGameAndRedirectOrShowError(game: string): Promise {\n const authUser: AuthUser = this.connectedUserService.user.get();\n Utils.assert(authUser.isConnected(), 'User must be connected and have a username to reach this page');\n if (this.gameExists(game) === false) {\n await this.router.navigate(['/notFound', GameWrapperMessages.NO_MATCHING_GAME(game)], { skipLocationChange: true });\n return false;\n }\n const canCreateOnlineGame: MGPValidation = this.currentGameService.canUserCreate();\n if (canCreateOnlineGame.isSuccess()) {\n const gameId: string = await this.gameService.createGame(game);\n await this.router.navigate(['/play', game, gameId]);\n return true;\n } else {\n this.messageDisplayer.infoMessage(canCreateOnlineGame.getReason());\n await this.router.navigate(['/lobby']);\n return false;\n }\n }\n private gameExists(gameName: string): boolean {\n const optionalGameInfo: MGPOptional = GameInfo.getByUrlName(gameName);\n return optionalGameInfo.isPresent();\n }\n}\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { CurrentGameService } from 'src/app/services/CurrentGameService';\nimport { MGPValidation } from '@everyboard/lib';\n\n@Component({\n selector: 'app-online-game-selection',\n templateUrl: './online-game-selection.component.html',\n})\nexport class OnlineGameSelectionComponent {\n\n public constructor(public readonly router: Router,\n public readonly currentGameService: CurrentGameService,\n public readonly messageDisplayer: MessageDisplayer) {\n }\n\n public async pickGame(pickedGame: string): Promise {\n const canUserJoin: MGPValidation = this.currentGameService.canUserCreate();\n if (canUserJoin.isSuccess()) {\n await this.router.navigate(['/play', pickedGame]);\n } else {\n this.messageDisplayer.criticalMessage(canUserJoin.getReason());\n }\n }\n}\n","\n","/* eslint-disable no-multi-spaces */\nimport { Component, EventEmitter, Output, Type } from '@angular/core';\nimport { MGPOptional, Utils } from '@everyboard/lib';\n\nimport { ApagosTutorial } from 'src/app/games/apagos/ApagosTutorial';\nimport { ApagosRules } from 'src/app/games/apagos/ApagosRules';\nimport { AbaloneComponent } from 'src/app/games/abalone/abalone.component';\nimport { ApagosComponent } from 'src/app/games/apagos/apagos.component';\nimport { AwaleComponent } from 'src/app/games/mancala/awale/awale.component';\nimport { AwaleRules } from 'src/app/games/mancala/awale/AwaleRules';\nimport { AwaleTutorial } from 'src/app/games/mancala/awale/AwaleTutorial';\nimport { AbaloneTutorial } from 'src/app/games/abalone/AbaloneTutorial';\nimport { AbaloneRules } from 'src/app/games/abalone/AbaloneRules';\n\nimport { BaAwaComponent } from 'src/app/games/mancala/ba-awa/ba-awa.component';\nimport { BaAwaRules } from 'src/app/games/mancala/ba-awa/BaAwaRules';\nimport { BaAwaTutorial } from 'src/app/games/mancala/ba-awa/BaAwaTutorial';\nimport { BrandhubComponent } from 'src/app/games/tafl/brandhub/brandhub.component';\nimport { BrandhubTutorial } from 'src/app/games/tafl/brandhub/BrandhubTutorial';\nimport { BrandhubRules } from 'src/app/games/tafl/brandhub/BrandhubRules';\n\nimport { ConnectSixComponent } from 'src/app/games/connect-six/connect-six.component';\nimport { ConnectSixTutorial } from 'src/app/games/connect-six/ConnectSixTutorial';\nimport { ConnectSixRules } from 'src/app/games/connect-six/ConnectSixRules';\nimport { ConspirateursTutorial } from 'src/app/games/conspirateurs/ConspirateursTutorial';\nimport { ConspirateursRules } from 'src/app/games/conspirateurs/ConspirateursRules';\n\nimport { DiamRules } from 'src/app/games/diam/DiamRules';\nimport { DiamTutorial } from 'src/app/games/diam/DiamTutorial';\n\nimport { CoerceoComponent } from 'src/app/games/coerceo/coerceo.component';\nimport { CoerceoTutorial } from 'src/app/games/coerceo/CoerceoTutorial';\nimport { CoerceoRules } from 'src/app/games/coerceo/CoerceoRules';\nimport { ConspirateursComponent } from 'src/app/games/conspirateurs/conspirateurs.component';\n\nimport { DiaballikComponent } from 'src/app/games/diaballik/diaballik.component';\nimport { DiaballikTutorial } from 'src/app/games/diaballik/DiaballikTutorial';\nimport { DiaballikRules } from 'src/app/games/diaballik/DiaballikRules';\nimport { DiamComponent } from 'src/app/games/diam/diam.component';\nimport { DvonnTutorial } from 'src/app/games/dvonn/DvonnTutorial';\nimport { DvonnRules } from 'src/app/games/dvonn/DvonnRules';\nimport { DvonnComponent } from 'src/app/games/dvonn/dvonn.component';\n\nimport { EncapsuleComponent } from 'src/app/games/encapsule/encapsule.component';\nimport { EncapsuleTutorial } from 'src/app/games/encapsule/EncapsuleTutorial';\nimport { EncapsuleRules } from 'src/app/games/encapsule/EncapsuleRules';\nimport { EpaminondasComponent } from 'src/app/games/epaminondas/epaminondas.component';\nimport { EpaminondasTutorial } from 'src/app/games/epaminondas/EpaminondasTutorial';\nimport { EpaminondasRules } from 'src/app/games/epaminondas/EpaminondasRules';\n\nimport { GipfComponent } from 'src/app/games/gipf/gipf.component';\nimport { GipfRules } from 'src/app/games/gipf/GipfRules';\nimport { GipfTutorial } from 'src/app/games/gipf/GipfTutorial';\nimport { GoComponent } from 'src/app/games/gos/go/go.component';\nimport { GoRules } from 'src/app/games/gos/go/GoRules';\nimport { GoTutorial } from 'src/app/games/gos/go/GoTutorial';\n\nimport { HexodiaComponent } from 'src/app/games/hexodia/hexodia.component';\nimport { HexodiaTutorial } from 'src/app/games/hexodia/HexodiaTutorial';\nimport { HexodiaRules } from 'src/app/games/hexodia/HexodiaRules';\nimport { HiveComponent } from 'src/app/games/hive/hive.component';\nimport { HiveTutorial } from 'src/app/games/hive/HiveTutorial';\nimport { HiveRules } from 'src/app/games/hive/HiveRules';\nimport { HnefataflRules } from 'src/app/games/tafl/hnefatafl/HnefataflRules';\nimport { HnefataflTutorial } from 'src/app/games/tafl/hnefatafl/HnefataflTutorial';\nimport { HnefataflComponent } from 'src/app/games/tafl/hnefatafl/hnefatafl.component';\n\nimport { KalahComponent } from 'src/app/games/mancala/kalah/kalah.component';\nimport { KalahTutorial } from 'src/app/games/mancala/kalah/KalahTutorial';\nimport { KalahRules } from 'src/app/games/mancala/kalah/KalahRules';\nimport { KamisadoComponent } from 'src/app/games/kamisado/kamisado.component';\nimport { KamisadoTutorial } from 'src/app/games/kamisado/KamisadoTutorial';\nimport { KamisadoRules } from 'src/app/games/kamisado/KamisadoRules';\n\nimport { LascaComponent } from 'src/app/games/lasca/lasca.component';\nimport { LascaRules } from 'src/app/games/lasca/LascaRules';\nimport { LascaTutorial } from 'src/app/games/lasca/LascaTutorial';\nimport { LinesOfActionComponent } from 'src/app/games/lines-of-action/lines-of-action.component';\nimport { LinesOfActionTutorial } from 'src/app/games/lines-of-action/LinesOfActionTutorial';\nimport { LinesOfActionRules } from 'src/app/games/lines-of-action/LinesOfActionRules';\nimport { LodestoneTutorial } from 'src/app/games/lodestone/LodestoneTutorial';\nimport { LodestoneComponent } from 'src/app/games/lodestone/lodestone.component';\nimport { LodestoneRules } from 'src/app/games/lodestone/LodestoneRules';\n\nimport { MartianChessTutorial } from 'src/app/games/martian-chess/MartianChessTutorial';\nimport { MartianChessRules } from 'src/app/games/martian-chess/MartianChessRules';\nimport { MartianChessComponent } from 'src/app/games/martian-chess/martian-chess.component';\n\nimport { P4Component } from 'src/app/games/p4/p4.component';\nimport { P4Tutorial } from 'src/app/games/p4/P4Tutorial';\nimport { P4Rules } from 'src/app/games/p4/P4Rules';\nimport { PentagoComponent } from 'src/app/games/pentago/pentago.component';\nimport { PentagoTutorial } from 'src/app/games/pentago/PentagoTutorial';\nimport { PentagoRules } from 'src/app/games/pentago/PentagoRules';\nimport { PenteComponent } from 'src/app/games/pente/pente.component';\nimport { PenteTutorial } from 'src/app/games/pente/PenteTutorial';\nimport { PenteRules } from 'src/app/games/pente/PenteRules';\nimport { PylosComponent } from 'src/app/games/pylos/pylos.component';\nimport { PylosTutorial } from 'src/app/games/pylos/PylosTutorial';\nimport { PylosRules } from 'src/app/games/pylos/PylosRules';\n\nimport { QuartoComponent } from 'src/app/games/quarto/quarto.component';\nimport { QuartoTutorial } from 'src/app/games/quarto/QuartoTutorial';\nimport { QuartoRules } from 'src/app/games/quarto/QuartoRules';\nimport { QuixoComponent } from 'src/app/games/quixo/quixo.component';\nimport { QuixoTutorial } from 'src/app/games/quixo/QuixoTutorial';\nimport { QuixoRules } from 'src/app/games/quixo/QuixoRules';\n\nimport { ReversiComponent } from 'src/app/games/reversi/reversi.component';\nimport { ReversiTutorial } from 'src/app/games/reversi/ReversiTutorial';\nimport { ReversiRules } from 'src/app/games/reversi/ReversiRules';\n\nimport { SaharaComponent } from 'src/app/games/sahara/sahara.component';\nimport { SaharaTutorial } from 'src/app/games/sahara/SaharaTutorial';\nimport { SaharaRules } from 'src/app/games/sahara/SaharaRules';\nimport { SiamComponent } from 'src/app/games/siam/siam.component';\nimport { SiamTutorial } from 'src/app/games/siam/SiamTutorial';\nimport { SiamRules } from 'src/app/games/siam/SiamRules';\nimport { SixComponent } from 'src/app/games/six/six.component';\nimport { SixTutorial } from 'src/app/games/six/SixTutorial';\nimport { SixRules } from 'src/app/games/six/SixRules';\nimport { SquarzComponent } from 'src/app/games/squarz/squarz.component';\nimport { SquarzTutorial } from 'src/app/games/squarz/SquarzTutorial';\nimport { SquarzRules } from 'src/app/games/squarz/SquarzRules';\n\nimport { TablutComponent } from 'src/app/games/tafl/tablut/tablut.component';\nimport { TablutTutorial } from 'src/app/games/tafl/tablut/TablutTutorial';\nimport { TablutRules } from 'src/app/games/tafl/tablut/TablutRules';\nimport { TeekoComponent } from 'src/app/games/teeko/teeko.component';\nimport { TeekoRules } from 'src/app/games/teeko/TeekoRules';\nimport { TeekoTutorial } from 'src/app/games/teeko/TeekoTutorial';\nimport { TrexoComponent } from 'src/app/games/trexo/trexo.component';\nimport { TrexoRules } from 'src/app/games/trexo/TrexoRules';\nimport { TrexoTutorial } from 'src/app/games/trexo/TrexoTutorial';\nimport { TrigoComponent } from 'src/app/games/gos/trigo/trigo.component';\nimport { TrigoRules } from 'src/app/games/gos/trigo/TrigoRules';\nimport { TrigoTutorial } from 'src/app/games/gos/trigo/TrigoTutorial';\n\nimport { YinshComponent } from 'src/app/games/yinsh/yinsh.component';\nimport { YinshTutorial } from 'src/app/games/yinsh/YinshTutorial';\nimport { YinshRules } from 'src/app/games/yinsh/YinshRules';\n\nimport { AbstractGameComponent } from '../../game-components/game-component/GameComponent';\nimport { AbstractRules } from 'src/app/jscaip/Rules';\nimport { Localized } from 'src/app/utils/LocaleUtils';\nimport { Tutorial } from '../../wrapper-components/tutorial-game-wrapper/TutorialStep';\nimport { RulesConfigDescription } from '../../wrapper-components/rules-configuration/RulesConfigDescription';\nimport { RulesConfig } from 'src/app/jscaip/RulesConfigUtil';\nimport { GameState } from 'src/app/jscaip/state/GameState';\nimport { ThemeService } from 'src/app/services/ThemeService';\n\nclass GameDescription {\n\n public static readonly ABALONE: Localized = () => $localize`Use simple mechanics to push 6 of the opponent's pieces out of the board!`;\n\n public static readonly APAGOS: Localized = () => $localize`Very simple game, but, will you be able to win everytime?`;\n\n public static readonly AWALE: Localized = () => $localize`The most widespread of the Mancalas.`;\n\n public static readonly BA_AWA: Localized = () => $localize`The most widespread multiple-lap Mancala.`;\n\n public static readonly BRANDHUB: Localized = () => $localize`The Irish version of the Tafl game family! Invaders must capture the king, defender must make him escape!`;\n\n public static readonly COERCEO: Localized = () => $localize`Get rid of all of your opponent's pieces on a board that shrinks little by little!`;\n\n public static readonly CONNECT_SIX: Localized = () => $localize`Put two pieces on the board at each turn, and be the first to align six pieces!`;\n\n public static readonly CONSPIRATEURS: Localized = () => $localize`Hide all of your pieces before your opponent does, or risk to be discovered!`;\n\n public static readonly DIABALLIK: Localized = () => $localize`Pass the ball up to the side of the opponent to win the game!`;\n\n public static readonly DIAM: Localized = () => $localize`Drop your pieces and move them around to align two pieces of the same color across the board to win!`;\n\n public static readonly DVONN: Localized = () => $localize`Stack your pieces and control as many stacks as you can to win!`;\n\n public static readonly ENCAPSULE: Localized = () => $localize`An enhanced tic-tac-toe where piece can encapsule other and prevent them to win.`;\n\n public static readonly EPAMINONDAS: Localized = () => $localize`An antiquity-war inspired game. Be the first to pierce your opponent's lines!`;\n\n public static readonly GIPF: Localized = () => $localize`A hexagonal game of alignment. Insert your pieces on the board to capture your opponent's pieces!`;\n\n public static readonly GO: Localized = () => $localize`The oldest strategy game still practiced widely. A territory control game.`;\n\n public static readonly HEXODIA: Localized = () => $localize`A hexagonal alignment game with weird \"diagonals\"!`;\n\n public static readonly HIVE: Localized = () => $localize`You are in charge of a hive full of insects. Use the abilities of your insects to block the opponent's queen in order to win!`;\n\n public static readonly HNEFATAFL: Localized = () => $localize`The Viking board game! Invaders must capture the king, defender must make him escape!`;\n\n public static readonly KALAH: Localized = () => $localize`A modern version of the famous African strategy game!`;\n\n public static readonly KAMISADO: Localized = () => $localize`Your goal is simple: reach the last line. But the piece you move depends on your opponent's last move!`;\n\n public static readonly LASCA: Localized = () => $localize`Similar to checkers, capture opponent's pieces, free your own, and immobilize your opponent to win the game!`;\n\n public static readonly LINES_OF_ACTION: Localized = () => $localize`Regroup your pieces to win. But your possible moves will often change!`;\n\n public static readonly LODESTONE: Localized = () => $localize`Push and crush your opponent's pieces using magnetic forces!`;\n\n public static readonly MARTIAN_CHESS: Localized = () => $localize`Win points by capturing pieces, but you only control pieces on your side of the board!`;\n\n public static readonly P4: Localized = () => $localize`The classical 4 in a row game!`;\n\n public static readonly PENTAGO: Localized = () => $localize`Drop a piece, then rotate a quadrant. The first player to align 5 pieces wins!`;\n\n public static readonly PENTE: Localized = () => $localize`You can align 5 pieces to win, or you can capture 10 pieces of your opponent to win!`;\n\n public static readonly PYLOS: Localized = () => $localize`Overlay your pieces and use two game mechanics to conserve your pieces. First player to run out of pieces loses!`;\n\n public static readonly QUARTO: Localized = () => $localize`Create a winning alignment. The problem: you don't pick the piece that you're placing on the board!`;\n\n public static readonly QUIXO: Localized = () => $localize`Align 5 of your pieces on a board where pieces slide!`;\n\n public static readonly REVERSI: Localized = () => $localize`Sandwich your opponent's pieces to dominate the board!`;\n\n public static readonly SAHARA: Localized = () => $localize`Immobilize one of your opponent's pyramids before your opponent does!`;\n\n public static readonly SIAM: Localized = () => $localize`Be the first to push a mountain out of the board!`;\n\n public static readonly SIX: Localized = () => $localize`Put your hexagonal pieces next to another one, and create one of the 3 victorious shapes to win!`;\n\n public static readonly SQUARZ: Localized = () => $localize`Duplicate yourself to conquer the board!`;\n\n public static readonly TABLUT: Localized = () => $localize`Lapland version of the Tafl game family! Invaders must capture the king, defender must make him escape!`;\n\n public static readonly TEEKO: Localized = () => $localize`Align your 4 pieces or form a square with them to win!`;\n\n public static readonly TREXO: Localized = () => $localize`Align 5 pieces of your color in a row, but beware, the pieces can be put on top of other pieces!`;\n\n public static readonly TRI_GO: Localized = () => $localize`A version of Go on triangular spaces!`;\n\n public static readonly YINSH: Localized = () => $localize`Align your pieces to score points, but beware, pieces can flip!`;\n\n}\n\nexport class GameInfo {\n\n private static ALL_GAMES: GameInfo[] = []; // Initialized like a singleton\n\n // Games sorted by creation date\n public static getAllGames(): GameInfo[] {\n if (GameInfo.ALL_GAMES.length === 0) {\n GameInfo.fillAllGames();\n }\n return GameInfo.ALL_GAMES;\n }\n\n // eslint-disable-next-line max-lines-per-function\n private static fillAllGames(): void {\n GameInfo.ALL_GAMES = [\n new GameInfo($localize`Four in a Row`, 'P4', P4Component, new P4Tutorial(), P4Rules.get(), new Date('2018-08-28'), GameDescription.P4() ), // * Martin\n new GameInfo($localize`Awalé`, 'Awale', AwaleComponent, new AwaleTutorial(), AwaleRules.get(), new Date('2018-11-29'), GameDescription.AWALE() ), // 93 days after P4 * Martin\n new GameInfo($localize`Quarto`, 'Quarto', QuartoComponent, new QuartoTutorial(), QuartoRules.get(), new Date('2018-12-09'), GameDescription.QUARTO() ), // 10 days after Awale * Martin\n new GameInfo($localize`Tablut`, 'Tablut', TablutComponent, new TablutTutorial(), TablutRules.get(), new Date('2018-12-27'), GameDescription.TABLUT() ), // 26 days after Quarto * Martin\n\n new GameInfo($localize`Reversi`, 'Reversi', ReversiComponent, new ReversiTutorial(), ReversiRules.get(), new Date('2019-01-16'), GameDescription.REVERSI() ), // 20 days after Tablut * Martin\n new GameInfo($localize`Go`, 'Go', GoComponent, new GoTutorial(), GoRules.get(), new Date('2019-12-21'), GameDescription.GO() ), // 11 months after Reversi * Martin\n new GameInfo($localize`Encapsule`, 'Encapsule', EncapsuleComponent, new EncapsuleTutorial(), EncapsuleRules.get(), new Date('2019-12-30'), GameDescription.ENCAPSULE() ), // 9 days after Go * Martin\n\n new GameInfo($localize`Siam`, 'Siam', SiamComponent, new SiamTutorial(), SiamRules.get(), new Date('2020-01-11'), GameDescription.SIAM() ), // 12 days after Encapsule * Martin\n new GameInfo($localize`Sahara`, 'Sahara', SaharaComponent, new SaharaTutorial(), SaharaRules.get(), new Date('2020-02-29'), GameDescription.SAHARA() ), // 49 days after Siam * Martin\n new GameInfo($localize`Pylos`, 'Pylos', PylosComponent, new PylosTutorial(), PylosRules.get(), new Date('2020-10-02'), GameDescription.PYLOS() ), // 7 months after Sahara * Martin\n new GameInfo($localize`Kamisado`, 'Kamisado', KamisadoComponent, new KamisadoTutorial(), KamisadoRules.get(), new Date('2020-10-03'), GameDescription.KAMISADO() ), // 26 days after joining * Quentin\n new GameInfo($localize`Quixo`, 'Quixo', QuixoComponent, new QuixoTutorial(), QuixoRules.get(), new Date('2020-10-15'), GameDescription.QUIXO() ), // 13 days after Pylos * Martin\n new GameInfo($localize`Dvonn`, 'Dvonn', DvonnComponent, new DvonnTutorial(), DvonnRules.get(), new Date('2020-10-21'), GameDescription.DVONN() ), // 18 days after Kamisado * Quentin\n\n new GameInfo($localize`Epaminondas`, 'Epaminondas', EpaminondasComponent, new EpaminondasTutorial(), EpaminondasRules.get(), new Date('2021-01-16'), GameDescription.EPAMINONDAS() ), // 22 days after Quixo * Martin\n new GameInfo($localize`Gipf`, 'Gipf', GipfComponent, new GipfTutorial(), GipfRules.get(), new Date('2021-02-22'), GameDescription.GIPF() ), // 4 months after Dvonn * Quentin\n new GameInfo($localize`Coerceo`, 'Coerceo', CoerceoComponent, new CoerceoTutorial(), CoerceoRules.get(), new Date('2021-03-21'), GameDescription.COERCEO() ), // 76 days after Epaminondas * Martin\n new GameInfo($localize`Six`, 'Six', SixComponent, new SixTutorial(), SixRules.get(), new Date('2021-04-08'), GameDescription.SIX() ), // 18 days after Coerceo * Martin\n new GameInfo($localize`Lines of Action`, 'LinesOfAction', LinesOfActionComponent, new LinesOfActionTutorial(), LinesOfActionRules.get(), new Date('2021-04-28'), GameDescription.LINES_OF_ACTION()), // 65 days after Gipf * Quentin\n new GameInfo($localize`Pentago`, 'Pentago', PentagoComponent, new PentagoTutorial(), PentagoRules.get(), new Date('2021-05-23'), GameDescription.PENTAGO() ), // 25 days after Six * Martin\n new GameInfo($localize`Abalone`, 'Abalone', AbaloneComponent, new AbaloneTutorial(), AbaloneRules.get(), new Date('2021-07-13'), GameDescription.ABALONE() ), // 71 days after Pentago * Martin\n new GameInfo($localize`Yinsh`, 'Yinsh', YinshComponent, new YinshTutorial(), YinshRules.get(), new Date('2021-07-31'), GameDescription.YINSH() ), // 94 days after LinesOfAction * Quentin\n new GameInfo($localize`Apagos`, 'Apagos', ApagosComponent, new ApagosTutorial(), ApagosRules.get(), new Date('2021-11-04'), GameDescription.APAGOS() ), // 4 month after Abalone * Martin\n new GameInfo($localize`Diam`, 'Diam', DiamComponent, new DiamTutorial(), DiamRules.get(), new Date('2021-11-30'), GameDescription.DIAM() ), // 4 months after Yinsh * Quentin\n new GameInfo($localize`Brandhub`, 'Brandhub', BrandhubComponent, new BrandhubTutorial(), BrandhubRules.get(), new Date('2021-12-07'), GameDescription.BRANDHUB() ), // 33 days after Apagos * Martin\n new GameInfo($localize`Conspirateurs`, 'Conspirateurs', ConspirateursComponent, new ConspirateursTutorial(), ConspirateursRules.get(), new Date('2021-12-30'), GameDescription.CONSPIRATEURS() ), // 30 days after Diam * Quentin\n\n new GameInfo($localize`Lodestone`, 'Lodestone', LodestoneComponent, new LodestoneTutorial(), LodestoneRules.get(), new Date('2022-06-24'), GameDescription.LODESTONE() ), // * Quentin\n new GameInfo($localize`Martian Chess`, 'MartianChess', MartianChessComponent, new MartianChessTutorial(), MartianChessRules.get(), new Date('2022-07-01'), GameDescription.MARTIAN_CHESS() ), // * Martin\n new GameInfo($localize`Hnefatafl`, 'Hnefatafl', HnefataflComponent, new HnefataflTutorial(), HnefataflRules.get(), new Date('2022-09-21'), GameDescription.HNEFATAFL() ), // * Martin\n\n new GameInfo($localize`Hive`, 'Hive', HiveComponent, new HiveTutorial(), HiveRules.get(), new Date('2023-04-02'), GameDescription.HIVE() ), // * Quentin\n new GameInfo($localize`Trexo`, 'Trexo', TrexoComponent, new TrexoTutorial(), TrexoRules.get(), new Date('2023-04-23'), GameDescription.TREXO() ), // * Martin\n new GameInfo($localize`Lasca`, 'Lasca', LascaComponent, new LascaTutorial(), LascaRules.get(), new Date('2023-05-11'), GameDescription.LASCA() ), // * Martin\n new GameInfo($localize`Connect Six`, 'ConnectSix', ConnectSixComponent, new ConnectSixTutorial(), ConnectSixRules.get(), new Date('2023-05-13'), GameDescription.CONNECT_SIX() ), // * Martin\n new GameInfo($localize`Pente`, 'Pente', PenteComponent, new PenteTutorial(), PenteRules.get(), new Date('2023-05-20'), GameDescription.PENTE() ), // * Quentin\n new GameInfo($localize`Teeko`, 'Teeko', TeekoComponent, new TeekoTutorial(), TeekoRules.get(), new Date('2023-07-30'), GameDescription.TEEKO() ), // * Martin\n new GameInfo($localize`Kalah`, 'Kalah', KalahComponent, new KalahTutorial(), KalahRules.get(), new Date('2023-09-07'), GameDescription.KALAH() ), // * Martin\n new GameInfo($localize`Diaballik`, 'Diaballik', DiaballikComponent, new DiaballikTutorial(), DiaballikRules.get(), new Date('2023-11-18'), GameDescription.DIABALLIK() ), // * Quentin\n\n new GameInfo($localize`Ba-awa`, 'BaAwa', BaAwaComponent, new BaAwaTutorial(), BaAwaRules.get(), new Date('2024-01-28'), GameDescription.BA_AWA() ), // * Martin\n new GameInfo($localize`Squarz`, 'Squarz', SquarzComponent, new SquarzTutorial(), SquarzRules.get(), new Date('2024-05-08'), GameDescription.SQUARZ() ), // * Martin\n new GameInfo($localize`Hexodia`, 'Hexodia', HexodiaComponent, new HexodiaTutorial(), HexodiaRules.get(), new Date('2024-06-26'), GameDescription.HEXODIA() ), // * Martin\n new GameInfo($localize`Trigo`, 'Trigo', TrigoComponent, new TrigoTutorial(), TrigoRules.get(), new Date('2024-06-29'), GameDescription.TRI_GO() ), // * Martin\n ].sort((a: GameInfo, b: GameInfo) => a.name.localeCompare(b.name));\n // After Apagos: median = 26d; average = 53d\n // 9d 10d 12d 13d 18d - 18d 20d 22d 25d 26d - (26d) - 49d 65d 71d 76d 93d - 94j 4m 4m 7m 11m\n }\n\n public static getByUrlName(urlName: string): MGPOptional {\n const games: GameInfo[] = GameInfo.getAllGames().filter((gameInfo: GameInfo) => gameInfo.urlName === urlName);\n Utils.assert(games.length <= 1, `There should only be one game matching $urlName!`);\n if (games.length === 0) {\n return MGPOptional.empty();\n } else {\n return MGPOptional.of(games[0]);\n }\n }\n\n public static getStateProvider(urlName: string): MGPOptional<(config: MGPOptional) => GameState> {\n return GameInfo.getByUrlName(urlName).map((info: GameInfo) => {\n return (config: MGPOptional) => {\n return info.rules.getInitialState(config);\n };\n });\n }\n\n public constructor(public readonly name: string,\n public readonly urlName: string,\n public readonly component: Type,\n public readonly tutorial: Tutorial,\n public readonly rules: AbstractRules,\n public readonly creationDate: Date,\n public readonly description: string,\n public readonly display: boolean = true)\n {\n }\n\n public getRulesConfigDescription(): MGPOptional> {\n return this.rules.getRulesConfigDescription();\n }\n\n public getRulesConfig(): MGPOptional {\n const description: MGPOptional> = this.getRulesConfigDescription();\n if (description.isPresent()) {\n return MGPOptional.of(description.get().getDefaultConfig().config);\n } else {\n return MGPOptional.empty();\n }\n }\n\n}\n\n@Component({\n selector: 'app-pick-game',\n templateUrl: './pick-game.component.html',\n})\nexport class PickGameComponent {\n\n public readonly games: GameInfo[] = GameInfo.getAllGames();\n\n public readonly theme: 'dark' | 'light';\n\n public matchingGames: GameInfo[] = this.games;\n\n @Output() pickGame: EventEmitter = new EventEmitter();\n\n public constructor(themeService: ThemeService) {\n this.theme = themeService.getTheme();\n }\n\n public selectGame(gameName: string): void {\n this.pickGame.emit(gameName);\n }\n\n public search(input: EventTarget | null): void {\n const searchTerm: string = (input as HTMLInputElement).value;\n this.matchingGames = this.games.filter((info: GameInfo) =>\n this.normalize(info.name).includes(this.normalize(searchTerm)));\n }\n\n private normalize(term: string): string {\n return term.toLowerCase() // we want to be case insensitive\n .replace(/ /g, '') // we want to be space insensitive\n // we also want to be diacritic-insensitive, but we have to resort to black magic incantations for that\n .normalize('NFKD').replace(/[^\\w]/g, '');\n // Explanation: normalize('NFKD') performs \"compatibility\n // decomposition\", basically splitting the diacritic from the character\n // into two different code points, e.g., é is split between ´ and e, at\n // the Unicode level. The replace part removes the code points that are\n // not characters, thereby removing all diacritics. This is not the work\n // of Morgoth as one may think, but regular Unicode manipulation.\n }\n}\n","\n
\n
\n
\n
\n
{{ game.name }}
\n
\n
\n \n
\n
\n
\n
\n","import { Component } from '@angular/core';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { MGPFallible, MGPValidation } from '@everyboard/lib';\nimport { faEye, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport * as FireAuth from '@firebase/auth';\n\n@Component({\n selector: 'app-register',\n templateUrl: './register.component.html',\n})\nexport class RegisterComponent {\n\n public faEye: IconDefinition = faEye;\n\n public errorMessage: string;\n\n public registrationForm: FormGroup = new FormGroup({\n email: new FormControl(),\n username: new FormControl(),\n password: new FormControl(),\n });\n\n public constructor(public connectedUserService: ConnectedUserService,\n public router: Router)\n {\n }\n public async registerWithEmail(): Promise {\n const username: string | null = this.registrationForm.value.username;\n const email: string | null = this.registrationForm.value.email;\n const password: string | null = this.registrationForm.value.password;\n if (username == null || email == null || password == null) {\n this.errorMessage = $localize`There are missing fields in the registration form, please check that you filled in all fields.`;\n } else {\n const registrationResult: MGPFallible =\n await this.connectedUserService.doRegister(username, email, password);\n if (registrationResult.isSuccess()) {\n const emailResult: MGPValidation =\n await this.connectedUserService.sendEmailVerification();\n if (emailResult.isSuccess()) {\n await this.router.navigate(['/verify-account']);\n } else {\n this.errorMessage = emailResult.getReason();\n }\n } else {\n this.errorMessage = registrationResult.getReason();\n }\n }\n }\n public async registerWithGoogle(): Promise {\n const result: MGPValidation = await this.connectedUserService.doGoogleLogin();\n if (result.isSuccess()) {\n await this.router.navigate(['/verify-account']);\n } else {\n this.errorMessage = result.getReason();\n }\n }\n public getPasswordHelpClass(): string {\n const password: string = this.registrationForm.value.password;\n if (password == null || password === '') {\n return '';\n }\n if (password.length < 6) {\n return 'is-danger';\n }\n return 'is-success';\n }\n public canRegister(): boolean {\n const password: string = this.registrationForm.value.password ?? '';\n const email: string = this.registrationForm.value.email ?? '';\n const username: string = this.registrationForm.value.username ?? '';\n if (email === '' || username === '' || password === '' || password.length < 6) {\n return false;\n }\n return true;\n }\n}\n","
\n
Registering
\n \n
\n","import { Component } from '@angular/core';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\n\n@Component({\n selector: 'app-reset-password',\n templateUrl: './reset-password.component.html',\n})\nexport class ResetPasswordComponent {\n\n public constructor(public connectedUserService: ConnectedUserService) {}\n\n public success: boolean = false;\n public errorMessage: MGPOptional = MGPOptional.empty();\n public email: string = '';\n\n public async resetPassword(): Promise {\n Utils.assert(this.email !== '', 'No email was entered, but it should not be possible to submit the form then!');\n this.errorMessage = MGPOptional.empty();\n this.success = false;\n const result: MGPValidation = await this.connectedUserService.sendPasswordResetEmail(this.email);\n if (result.isSuccess()) {\n this.success = true;\n } else {\n this.errorMessage = MGPOptional.of(result.getReason());\n }\n }\n}\n","
\n
Password reset
\n
\n
\n \n
\n
\n
\n
\n \n
An email will be sent with instruction to reset your password.
\n
The email has been sent, please follow the instructions from that email.
\n
\n
\n
\n
\n \n
\n
Error
\n
{{ errorMessage.get() }}
\n
\n
\n","import { Component } from '@angular/core';\nimport { ThemeService } from 'src/app/services/ThemeService';\nimport { UserSettingsService } from 'src/app/services/UserSettingsService';\n\ntype SettingOption = { value: string, name: string }\n\n@Component({\n selector: 'app-settings',\n templateUrl: './settings.component.html',\n})\nexport class SettingsComponent {\n\n public readonly availableLanguages: SettingOption[] = [\n { value: 'fr', name: 'Français' },\n { value: 'en', name: 'English' },\n ];\n public readonly availableThemes: SettingOption[] = [\n { value: 'light', name: $localize`Light` },\n { value: 'dark', name: $localize`Dark` },\n ];\n public currentTheme: string;\n public currentLanguage: string;\n\n public constructor(private readonly userSettingsService: UserSettingsService,\n themeService: ThemeService) {\n this.currentTheme = themeService.getTheme();\n this.currentLanguage = this.userSettingsService.getLanguage();\n }\n public changeLanguage(event: Event): void {\n const target: HTMLSelectElement = event.target as HTMLSelectElement;\n this.userSettingsService.changeLanguage(target.value);\n this.reload();\n }\n public changeTheme(event: Event): void {\n const target: HTMLSelectElement = event.target as HTMLSelectElement;\n this.userSettingsService.changeTheme(target.value);\n this.reload();\n }\n private reload(): void {\n // Reload app to apply changes\n window.open(window.location.href, '_self');\n }\n}\n","
\n
User settings
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-tutorial-game-creation',\n templateUrl: './tutorial-game-creation.component.html',\n})\nexport class TutorialGameCreationComponent {\n\n public constructor(public router: Router) {\n }\n\n public async pickGame(pickedGame: string): Promise {\n await this.router.navigate(['/tutorial/', pickedGame]);\n }\n}\n","\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { Subscription } from 'rxjs';\nimport { ConnectedUserService, AuthUser } from 'src/app/services/ConnectedUserService';\nimport { MGPValidation } from '@everyboard/lib';\n\n/**\n * Component to verify an account.\n * The meaning of verifying an account depends on the type of account:\n * - for an email account, it means resending the verification email\n * - for a google account, it means entering a username\n */\n@Component({\n selector: 'app-verify-account',\n templateUrl: './verify-account.component.html',\n})\nexport class VerifyAccountComponent implements OnInit, OnDestroy {\n\n public verificationType: 'send-email' | 'enter-username' | null = null;\n\n public success: boolean = false;\n\n public triedToFinalize: boolean = false;\n\n public errorMessage: string;\n\n public emailAddress: string;\n\n private userSubscription: Subscription;\n\n public usernameForm: FormGroup = new FormGroup({\n username: new FormControl(),\n });\n\n public constructor(private readonly connectedUserService: ConnectedUserService,\n public router: Router)\n {\n }\n public async ngOnInit(): Promise {\n this.userSubscription = this.connectedUserService.subscribeToUser(\n async(user: AuthUser) => {\n this.emailAddress = user.email.get();\n // We know that if this page is shown, something needs to be done to finalize the account\n if (user.username.isAbsent()) {\n // If the user has no username, it will need to be defined\n this.verificationType = 'enter-username';\n } else {\n // Otherwise, it means the user needs to verify its email\n this.verificationType = 'send-email';\n if (this.triedToFinalize && user.verified === false) {\n // The user already clicked on the \"finalize\" button but hasn't verified the email!\n this.errorMessage = $localize`You have not verified your email! Click on the link in the verification email.`;\n }\n if (user.verified) {\n // The user is now verified\n await this.router.navigate(['/lobby']);\n }\n }\n });\n }\n public async pickUsername(formContent: { username: string }): Promise {\n const result: MGPValidation = await this.connectedUserService.setUsername(formContent.username);\n if (result.isSuccess()) {\n this.success = true;\n } else {\n this.errorMessage = result.getReason();\n }\n }\n public async sendEmailVerification(): Promise {\n const result: MGPValidation = await this.connectedUserService.sendEmailVerification();\n if (result.isSuccess()) {\n this.success = true;\n } else {\n this.errorMessage = result.getReason();\n }\n }\n public async finalizeEmailVerification(): Promise {\n this.triedToFinalize = true;\n await this.connectedUserService.reloadUser();\n window.open(window.location.href, '_self');\n }\n public ngOnDestroy(): void {\n if (this.userSubscription != null && this.userSubscription.unsubscribe != null) {\n this.userSubscription.unsubscribe();\n }\n }\n}\n","
\n
\n
Account verification
\n\n
\n
In order to finalize your account, you must click on the link that you should have received on your email address ({{ emailAddress }}). The email could be in your spam folder.
\n\n
\n
Once you have verified your email, click on the following button:
\n \n
\n\n
\n
If you have not received the verification email, click on the following button:
\n \n
\n\n
The email has been sent
\n
\n\n \n
\n
In order to finalize your account, you must choose a username.
\n \n
\n
Your account has now been finalized, you can go back to the list of games.
\n \n
\n
\n
{{ errorMessage }}
\n
\n
\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ThemeService } from 'src/app/services/ThemeService';\nimport { GameInfo } from '../pick-game/pick-game.component';\nimport { faNetworkWired, faDesktop, faBookOpen, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { MGPOptional, MGPValidation } from '@everyboard/lib';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { CurrentGameService } from 'src/app/services/CurrentGameService';\n\n@Component({\n selector: 'app-welcome',\n templateUrl: './welcome.component.html',\n})\nexport class WelcomeComponent {\n public readonly numberOfColumns: number = 5;\n public readonly games: GameInfo[][] = [];\n public readonly theme: 'dark' | 'light';\n public readonly iconOnlineGame: IconDefinition = faNetworkWired;\n public readonly iconLocalGame: IconDefinition = faDesktop;\n public readonly iconTutorial: IconDefinition = faBookOpen;\n\n public gameInfoDetails: MGPOptional = MGPOptional.empty();\n\n public constructor(public readonly router: Router,\n public readonly messageDisplayer: MessageDisplayer,\n public readonly currentGameService: CurrentGameService,\n themeService: ThemeService)\n {\n this.theme = themeService.getTheme();\n const allGames: GameInfo[] = GameInfo.getAllGames();\n let column: number = 0;\n for (let i: number = 0; i < allGames.length; i++) {\n if (i < this.numberOfColumns) {\n this.games.push([]);\n }\n this.games[column].push(allGames[i]);\n column = (column + 1) % this.numberOfColumns;\n }\n }\n\n public async createGame(game?: string): Promise {\n const canCreateGame: MGPValidation = this.currentGameService.canUserCreate();\n if (canCreateGame.isSuccess()) {\n if (game == null) {\n return this.router.navigate(['/play']);\n } else {\n return this.router.navigate(['/play', game]);\n }\n } else {\n this.messageDisplayer.criticalMessage(canCreateGame.getReason());\n return false;\n }\n }\n\n public async createLocalGame(game: string): Promise {\n return this.router.navigate(['/local', game]);\n }\n\n public createTutorial(game: string): Promise {\n return this.router.navigate(['/tutorial', game]);\n }\n\n public pickGame(game: string): void {\n this.gameInfoDetails = GameInfo.getByUrlName(game);\n }\n\n public closeInfo(): void {\n this.gameInfoDetails = MGPOptional.empty();\n }\n}\n","\n
\n
EveryBoard
\n
EveryBoard is a website to play and learn the rules of various abstract strategy games with perfect information. \n Such games are games that do not include any randomness, agility, or hidden information.\n These games are played by two players, turn by turn.
\n\n \n\n","import { ActivatedRoute } from '@angular/router';\nimport { MGPOptional, Utils } from '@everyboard/lib';\nimport { BaseComponent } from '../BaseComponent';\nimport { GameInfo } from '../normal-component/pick-game/pick-game.component';\n\nexport abstract class BaseWrapperComponent extends BaseComponent {\n\n public constructor(public readonly activatedRoute: ActivatedRoute) {\n super();\n }\n\n protected getGameUrlName(): string {\n return Utils.getNonNullable(this.activatedRoute.snapshot.paramMap.get('compo'));\n }\n\n protected getGameName(): MGPOptional {\n // May be empty if the game does not actually exist\n return GameInfo.getByUrlName(this.getGameUrlName()).map((info: GameInfo) => info.name);\n }\n\n}\n","import { Component, ComponentRef, Type, ViewChild, ViewContainerRef } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { Comparable, MGPFallible, MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { Move } from '../../jscaip/Move';\nimport { GameInfo } from '../normal-component/pick-game/pick-game.component';\nimport { Player, PlayerOrNone } from 'src/app/jscaip/Player';\nimport { Localized } from 'src/app/utils/LocaleUtils';\nimport { AbstractGameComponent } from '../game-components/game-component/GameComponent';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { RulesConfig, RulesConfigUtils } from 'src/app/jscaip/RulesConfigUtil';\nimport { RulesConfigDescription } from './rules-configuration/RulesConfigDescription';\nimport { BaseWrapperComponent } from './BaseWrapperComponent';\n\nexport class GameWrapperMessages {\n\n public static readonly NOT_YOUR_TURN: Localized = () => $localize`It is not your turn!`;\n\n public static readonly GAME_HAS_ENDED: Localized = () => $localize`This game has ended.`;\n\n public static NO_MATCHING_GAME(gameName: string): string {\n return $localize`This game (${gameName}) does not exist.`;\n }\n\n}\n\n@Component({ template: '' })\nexport abstract class GameWrapper
extends BaseWrapperComponent {\n\n // This holds the #board html element\n @ViewChild('board', { read: ViewContainerRef })\n public boardRef: ViewContainerRef | null = null;\n\n public gameComponent: AbstractGameComponent;\n\n public players: MGPOptional
[] = [MGPOptional.empty(), MGPOptional.empty()];\n\n /**\n * The role of the player, i.e., ZERO if we are the first player, ONE if we are the second player,\n * and NONE if we are observing\n */\n public role: PlayerOrNone = PlayerOrNone.NONE;\n\n public endGame: boolean = false;\n\n private isMoveAttemptOngoing: boolean = false;\n\n public Player: typeof Player = Player;\n\n public constructor(activatedRoute: ActivatedRoute,\n protected readonly connectedUserService: ConnectedUserService,\n protected readonly router: Router,\n protected readonly messageDisplayer: MessageDisplayer)\n {\n super(activatedRoute);\n }\n\n public abstract onLegalUserMove(move: Move, scores?: [number, number]): Promise;\n\n public abstract getPlayer(): P;\n\n private getMatchingComponent(gameName: string): MGPOptional> {\n const optionalGameInfo: MGPOptional = GameInfo.getByUrlName(gameName);\n return optionalGameInfo.map((gameInfo: GameInfo) => gameInfo.component);\n }\n\n /**\n * This method is to be called only after view init.\n * It will create the game component and initialize its node.\n * It returns true if successful, or false if this is not a valid game.\n */\n protected async createMatchingGameComponent(): Promise {\n const componentType: MGPOptional> =\n await this.getMatchingComponentAndNavigateOutIfAbsent();\n if (componentType.isPresent()) {\n // This waits for the config to be chosen\n const config: MGPOptional = await this.getConfig();\n await this.createGameComponent(componentType.get());\n this.gameComponent.config = config;\n this.gameComponent.node = this.gameComponent.rules.getInitialNode(config);\n await this.setRole(this.role);\n await this.gameComponent.updateBoardAndRedraw(false);\n return true;\n } else {\n return false;\n }\n }\n\n private async getMatchingComponentAndNavigateOutIfAbsent(): Promise>> {\n const urlName: string = this.getGameUrlName();\n const component: MGPOptional> = this.getMatchingComponent(urlName);\n if (component.isAbsent()) {\n await this.router.navigate(['/notFound', GameWrapperMessages.NO_MATCHING_GAME(urlName)], { skipLocationChange: true });\n return MGPOptional.empty();\n } else {\n return component;\n }\n }\n\n private async createGameComponent(component: Type): Promise {\n Utils.assert(this.boardRef != null, 'Board element should be present');\n\n const componentRef: ComponentRef =\n Utils.getNonNullable(this.boardRef).createComponent(component);\n this.gameComponent = componentRef.instance;\n\n // chooseMove is called by the game component when a move is done\n this.gameComponent.chooseMove = (m: Move): Promise => {\n // the game wrapper can then act accordingly to the chosen move.\n return this.receiveValidMove(m);\n };\n // canUserPlay is called upon a click by the user\n this.gameComponent.canUserPlay = (elementName: string): Promise => {\n return this.canUserPlay(elementName);\n };\n this.gameComponent.isPlayerTurn = (): boolean => {\n return this.isPlayerTurn();\n };\n // Mostly for interception by TutorialGameWrapper\n this.gameComponent.cancelMoveOnWrapper = (reason?: string): Promise => {\n return this.onCancelMove(reason);\n };\n }\n\n public async setRole(role: PlayerOrNone): Promise {\n this.role = role;\n if (role.isNone()) {\n this.gameComponent.setPointOfView(Player.ZERO);\n } else {\n this.gameComponent.setPointOfView(role);\n }\n await this.showCurrentState(false); // Trigger redrawing of the board (might need to be rotated 180°)\n }\n\n public async setInteractive(interactive: boolean, updateBoard: boolean = true): Promise {\n const interactivityChanged: boolean = this.gameComponent.isInteractive() !== interactive;\n if (interactivityChanged) {\n this.gameComponent.setInteractive(interactive);\n if (updateBoard) {\n await this.gameComponent.updateBoardAndRedraw(false);\n }\n }\n }\n\n public async receiveValidMove(move: Move): Promise {\n const config: MGPOptional = await this.getConfig();\n const legality: MGPFallible =\n this.gameComponent.rules.isLegal(move, this.gameComponent.node.gameState, config);\n if (legality.isFailure()) {\n await this.gameComponent.cancelMove(legality.getReason());\n return MGPValidation.ofFallible(legality);\n }\n this.gameComponent.cancelMoveAttempt();\n this.isMoveAttemptOngoing = false;\n await this.onLegalUserMove(move);\n return MGPValidation.SUCCESS;\n }\n\n public async onCancelMove(_reason?: string): Promise {\n this.isMoveAttemptOngoing = false;\n }\n\n public async getConfig(): Promise> {\n const urlName: string = this.getGameUrlName();\n return RulesConfigUtils.getGameDefaultConfig(urlName);\n }\n\n public async canUserPlay(_clickedElementName: string): Promise {\n if (this.isPlayerTurn() === false) {\n return MGPValidation.failure(GameWrapperMessages.NOT_YOUR_TURN());\n }\n if (this.endGame) {\n return MGPValidation.failure(GameWrapperMessages.GAME_HAS_ENDED());\n }\n if (this.isMoveAttemptOngoing === false) {\n // It is the first click\n this.gameComponent.hideLastMove();\n this.isMoveAttemptOngoing = true;\n }\n return MGPValidation.SUCCESS;\n }\n\n public isPlayerTurn(): boolean {\n if (this.role.isNone()) {\n return false;\n }\n if (this.gameComponent == null) {\n // This can happen if called before the component has been set up\n return false;\n }\n const turn: number = this.gameComponent.getTurn();\n const indexPlayer: number = turn % 2;\n const player: P = this.getPlayer();\n if (this.players[indexPlayer].isPresent()) {\n return this.players[indexPlayer].equalsValue(player);\n } else {\n return true;\n }\n }\n\n public getBoardHighlight(): string[] {\n if (this.endGame) {\n return ['endgame-bg'];\n } else if (this.isPlayerTurn()) {\n const turn: number = this.gameComponent.getTurn();\n const player: Player = Player.ofTurn(turn % 2);\n return [player.getHTMLClass('-bg')];\n } else {\n return [];\n }\n }\n\n /**\n * Called when there is a need to put the current board to original state, meaning:\n * 1. ongoing move attempt must be canceled (cancelMoveAttempt)\n * 2. any previous move must be hidden (hideLastMove)\n * 3. after the board is changed, we now show the correct previous move (showLastMove)\n * @param triggerAnimation a boolean set to true if there is a need to trigger the animation of the last move\n */\n protected async showCurrentState(triggerAnimation: boolean): Promise {\n this.gameComponent.cancelMoveAttempt();\n this.gameComponent.hideLastMove();\n if (this.gameComponent.node.previousMove.isPresent()) {\n await this.showNewMove(triggerAnimation);\n } else {\n // We have no previous move to animate\n await this.gameComponent.updateBoardAndRedraw(false);\n }\n }\n\n /**\n * Used when a new move is done:\n * 1. by user click, locally\n * 2. by opponent online\n * 3. by the AI\n * @param triggerAnimation a boolean set to true if there is a need to trigger the animation of the last move\n */\n protected async showNewMove(triggerAnimation: boolean): Promise {\n await this.gameComponent.updateBoard(triggerAnimation);\n await this.gameComponent.showLastMoveAndRedraw();\n }\n\n public getRulesConfigDescription(): MGPOptional> {\n const urlName: string = this.getGameUrlName();\n return this.getRulesConfigDescriptionByName(urlName);\n }\n\n private getRulesConfigDescriptionByName(gameName: string): MGPOptional> {\n const gameInfos: MGPOptional = GameInfo.getByUrlName(gameName);\n if (gameInfos.isAbsent()) {\n return MGPOptional.empty();\n } else {\n return gameInfos.get().getRulesConfigDescription();\n }\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, OnChanges, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core';\nimport { MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\nimport { GameWrapper } from '../../wrapper-components/GameWrapper';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { Move } from 'src/app/jscaip/Move';\nimport { PlayerOrNone } from 'src/app/jscaip/Player';\nimport { TutorialGameWrapperMessages } from '../tutorial-game-wrapper/tutorial-game-wrapper.component';\nimport { AbstractNode } from 'src/app/jscaip/AI/GameNode';\n\nexport type DemoNodeInfo = {\n name: string, // The name of the game\n node: AbstractNode, // The demo node\n click: MGPOptional, // An element to click\n}\n\n@Component({\n selector: 'app-demo-card',\n template: `
`,\n})\nexport class DemoCardWrapperComponent extends GameWrapper implements AfterViewInit, OnChanges {\n\n @Input() public demoNodeInfo: DemoNodeInfo;\n\n @ViewChild('board', { read: ViewContainerRef })\n public override boardRef: ViewContainerRef | null = null;\n\n private gameComponentIsSetup: boolean = false;\n\n public constructor(activatedRoute: ActivatedRoute,\n connectedUserService: ConnectedUserService,\n router: Router,\n messageDisplayer: MessageDisplayer,\n private readonly cdr: ChangeDetectorRef)\n {\n super(activatedRoute, connectedUserService, router, messageDisplayer);\n }\n\n public async ngAfterViewInit(): Promise {\n window.setTimeout(async() => {\n await this.createMatchingGameComponent();\n this.gameComponent.node = this.demoNodeInfo.node;\n // The component needs to be interactive in order to show all possible stylistic elements\n await this.setInteractive(true);\n // The board needs to be updated to render the changed node, setRole will do it\n await this.setRole(this.gameComponent.getCurrentPlayer());\n // Need to detect changes before potentially clicking,\n // and otherwise we'll get an angular exception in our tests\n this.cdr.detectChanges();\n // We perform a click if necessary\n if (this.demoNodeInfo.click.isPresent()) {\n const element: Element = Utils.getNonNullable(document.querySelector(this.demoNodeInfo.click.get()));\n element.dispatchEvent(new Event('click'));\n // Update the view after the click\n this.cdr.detectChanges();\n }\n this.gameComponentIsSetup = true;\n await this.setRole(PlayerOrNone.NONE);\n }, 1);\n }\n\n public async ngOnChanges(_changes: SimpleChanges): Promise {\n // This function is triggered when the parent component modifies the @Input of this one\n // And also it is called on creation, then, this.gameComponent is not set yet\n if (this.gameComponent != null) {\n // When it is, we want to manually update the board with the new infos and display them\n this.gameComponent.node = this.demoNodeInfo.node;\n await this.gameComponent.updateBoardAndRedraw(false);\n }\n }\n\n protected override getGameUrlName(): string {\n // Unlike all other BaseWrapperComponent those will share one page: everyboard.org/demo\n // Hence we cannot read the name of the game via the URL\n return this.demoNodeInfo.name;\n }\n\n public async onLegalUserMove(_move: Move, _scores?: [number, number] | undefined): Promise {\n Utils.assert(false, 'DemoCardWrapper should not call applyLegalMove, as it does no move');\n }\n\n public override getPlayer(): string {\n // Note, this code is never reached, as getPlayer only get called by GameWrapper when needed\n // and it is only needed in GameWrapper.canUserPlay (that is overriden here)\n // and in getBoardHighlight, unused in demo cards.\n return 'no-player';\n }\n\n public override async canUserPlay(_clickedElementName: string): Promise {\n if (this.gameComponentIsSetup) {\n // This is when some user try to click on a demo\n return MGPValidation.failure(TutorialGameWrapperMessages.THIS_IS_A_DEMO());\n } else {\n // This click is done by ourselves, to set up the game component for the demo\n return MGPValidation.SUCCESS;\n }\n }\n\n}\n","import { Component, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\n\nimport { AbstractNode, GameNode, GameNodeStats } from 'src/app/jscaip/AI/GameNode';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { GameWrapper } from 'src/app/components/wrapper-components/GameWrapper';\nimport { Move } from 'src/app/jscaip/Move';\nimport { MGPFallible, MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\nimport { GameState } from 'src/app/jscaip/state/GameState';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { Player } from 'src/app/jscaip/Player';\nimport { GameStatus } from 'src/app/jscaip/GameStatus';\nimport { Debug } from 'src/app/utils/Debug';\nimport { RulesConfig, RulesConfigUtils } from 'src/app/jscaip/RulesConfigUtil';\nimport { AIOptions, AIStats, AbstractAI } from 'src/app/jscaip/AI/AI';\nimport { GameInfo } from '../../normal-component/pick-game/pick-game.component';\nimport { SuperRules } from 'src/app/jscaip/Rules';\nimport { DemoNodeInfo } from '../demo-card-wrapper/demo-card-wrapper.component';\n\n@Component({\n selector: 'app-local-game-wrapper',\n templateUrl: './local-game-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@Debug.log\nexport class LocalGameWrapperComponent extends GameWrapper implements AfterViewInit {\n\n public static readonly AI_TIMEOUT: number = 1500;\n\n public aiOptions: [string, string] = ['none', 'none'];\n\n public playerSelection: [string, string] = ['human', 'human'];\n\n public winnerMessage: MGPOptional = MGPOptional.empty();\n\n public displayAIMetrics: boolean = false;\n\n public configIsSet: boolean = false;\n\n public configDemo: DemoNodeInfo;\n\n public rulesConfig: MGPOptional = MGPOptional.empty();\n\n private readonly configBS: BehaviorSubject> = new BehaviorSubject(MGPOptional.empty());\n private readonly configObs: Observable> = this.configBS.asObservable();\n\n public constructor(activatedRoute: ActivatedRoute,\n connectedUserService: ConnectedUserService,\n router: Router,\n messageDisplayer: MessageDisplayer,\n private readonly cdr: ChangeDetectorRef)\n {\n super(activatedRoute, connectedUserService, router, messageDisplayer);\n this.players = [MGPOptional.of(this.playerSelection[0]), MGPOptional.of(this.playerSelection[1])];\n this.role = Player.ZERO; // The user is playing, not observing\n this.setDefaultRulesConfig();\n }\n\n // Will set the default rules config.\n // Will set it to MGPOptional.empty() if the game doesn't exist, but an error will be handled by another function.\n // ConfiglessRules have MGPOptional.empty() value.\n private setDefaultRulesConfig(): void {\n const urlName: string = this.getGameUrlName();\n this.rulesConfig = RulesConfigUtils.getGameDefaultConfig(urlName);\n }\n\n public getCreatedNodes(): number {\n return GameNodeStats.createdNodes;\n }\n\n public getMinimaxTime(): number {\n return AIStats.aiTime;\n }\n\n public ngAfterViewInit(): void {\n window.setTimeout(async() => {\n const createdSuccessfully: boolean = await this.createMatchingGameComponent();\n if (createdSuccessfully) {\n await this.restartGame();\n this.cdr.detectChanges();\n }\n }, 1);\n }\n\n public async updatePlayer(player: Player): Promise {\n this.players[player.getValue()] = MGPOptional.of(this.playerSelection[player.getValue()]);\n if (this.playerSelection[1] === 'human' && this.playerSelection[0] !== 'human') {\n await this.setInteractive(false);\n await this.setRole(Player.ONE);\n } else {\n await this.setInteractive(true);\n await this.setRole(Player.ZERO);\n }\n await this.proposeAIToPlay();\n }\n\n public async onLegalUserMove(move: Move): Promise {\n const config: MGPOptional = await this.getConfig();\n this.gameComponent.node = this.gameComponent.rules.choose(this.gameComponent.node, move, config).get();\n await this.applyNewMove();\n }\n\n private async updateWrapper(): Promise {\n const config: MGPOptional = await this.getConfig();\n const gameStatus: GameStatus = this.gameComponent.rules.getGameStatus(this.gameComponent.node, config);\n if (gameStatus.isEndGame) {\n this.endGame = true;\n if (gameStatus.winner.isPlayer()) {\n const winner: string = $localize`Player ${gameStatus.winner.getValue() + 1}`;\n const loser: Player = gameStatus.winner.getOpponent();\n const loserValue: number = loser.getValue();\n if (this.players[gameStatus.winner.getValue()].equalsValue('human')) {\n // When human wins\n if (this.players[loserValue].equalsValue('human')) {\n this.winnerMessage = MGPOptional.of($localize`${ winner } won`);\n } else {\n this.winnerMessage = MGPOptional.of($localize`You won`);\n }\n } else {\n // When AI wins\n if (this.players[loserValue].equalsValue('human')) {\n this.winnerMessage = MGPOptional.of($localize`You lost`);\n } else {\n this.winnerMessage = MGPOptional.of($localize`${this.players[gameStatus.winner.getValue()].get()} (Player ${gameStatus.winner.getValue() + 1}) won`);\n }\n }\n }\n }\n this.cdr.detectChanges();\n }\n\n public async proposeAIToPlay(): Promise {\n const currentPlayerIsHuman: boolean = await this.hasSelectedAI() === false;\n await this.setInteractive(currentPlayerIsHuman);\n if (currentPlayerIsHuman === false) {\n // It is AI's turn, let it play after a small delay\n const playingAI: MGPOptional<{ ai: AbstractAI, options: AIOptions }> = this.getPlayingAI();\n if (playingAI.isPresent()) {\n window.setTimeout(async() => {\n const config: MGPOptional = await this.getConfig();\n const gameIsOngoing: boolean =\n this.gameComponent.rules.getGameStatus(this.gameComponent.node, config) === GameStatus.ONGOING;\n if (gameIsOngoing) {\n await this.doAIMove(playingAI.get().ai, playingAI.get().options);\n }\n }, LocalGameWrapperComponent.AI_TIMEOUT);\n }\n // If playingAI is absent, that means the user selected an AI without selecting options yet\n // We do nothing in this case.\n }\n }\n\n /**\n * @returns false if the game is finished\n * false if no AI is selected\n * true if an AI is selected even if its option is not selected yet\n */\n private async hasSelectedAI(): Promise {\n const config: MGPOptional = await this.getConfig();\n if (this.gameComponent.rules.getGameStatus(this.gameComponent.node, config).isEndGame) {\n // No AI is playing when the game is finished\n return false;\n }\n\n const playerIndex: number = this.gameComponent.getTurn() % 2;\n return this.playerSelection[playerIndex] !== 'human';\n }\n\n private lastMoveWasAI(): boolean {\n const playerIndex: number = (this.gameComponent.getTurn() - 1) % 2;\n return this.playerSelection[playerIndex] !== 'human';\n }\n\n private getPlayingAI(): MGPOptional<{ ai: AbstractAI, options: AIOptions }> {\n const playerIndex: number = this.gameComponent.getTurn() % 2;\n const aiOpt: MGPOptional = this.getAI(playerIndex);\n if (aiOpt.isPresent()) {\n const ai: AbstractAI = aiOpt.get();\n const optionsName: string = this.aiOptions[playerIndex];\n const matchingOptions: MGPOptional =\n MGPOptional.ofNullable(ai.availableOptions.find((options: AIOptions) => {\n return options.name === optionsName;\n }));\n // If the option is not selected\n // then it is not a PLAYING AI yet, just a selected AI\n // and user must still select the AI's options\n return matchingOptions.map((options: AIOptions) => {\n return { ai, options };\n });\n } else {\n return MGPOptional.empty();\n }\n }\n\n /**\n * @param playerIndex 0 or 1 (the index of the current player)\n * @returns MGPOptional.empty() if no AI is selected\n * MGPOptional.of(some AI) if an AI is selected, even if AI has its options unchosen\n */\n private getAI(playerIndex: number): MGPOptional {\n return MGPOptional.ofNullable(\n this.gameComponent.availableAIs.find((a: AbstractAI) => {\n return this.players[playerIndex].equalsValue(a.name);\n }));\n }\n\n public getStateProvider(): MGPOptional<(config: MGPOptional) => GameState> {\n return GameInfo.getStateProvider(this.getGameUrlName());\n }\n\n public async doAIMove(playingAI: AbstractAI, options: AIOptions): Promise {\n // called only when it's AI's Turn\n const ruler: SuperRules = this.gameComponent.rules;\n const config: MGPOptional = await this.getConfig();\n const gameStatus: GameStatus = ruler.getGameStatus(this.gameComponent.node, config);\n Utils.assert(gameStatus === GameStatus.ONGOING, 'AI should not try to play when game is over!');\n const aiMove: Move = playingAI.chooseNextMove(this.gameComponent.node, options, config);\n const nextNode: MGPFallible = ruler.choose(this.gameComponent.node, aiMove, config);\n if (nextNode.isSuccess()) {\n this.gameComponent.hideLastMove();\n this.gameComponent.node = nextNode.get();\n await this.applyNewMove();\n return MGPValidation.SUCCESS;\n } else {\n return this.handleAIError(playingAI, aiMove, nextNode.getReason());\n }\n }\n\n private async applyNewMove(): Promise {\n const lastMoveWasAI: boolean = this.lastMoveWasAI();\n await this.showNewMove(lastMoveWasAI);\n await this.updateWrapper();\n await this.proposeAIToPlay();\n this.cdr.detectChanges();\n }\n\n private async handleAIError(playingAI: AbstractAI, illegalMove: Move, error: string): Promise {\n this.messageDisplayer.criticalMessage($localize`The AI chose an illegal move! This is an unexpected situation that we logged, we will try to solve this as soon as possible. In the meantime, consider that you won!`);\n return Utils.logError('LocalGameWrapper', 'AI chose illegal move', {\n game: this.getGameUrlName(),\n name: playingAI.name,\n move: illegalMove.toString(),\n reason: error,\n });\n }\n\n public availableAIOptions(player: number): AIOptions[] {\n return this.getAI(player).get().availableOptions;\n }\n\n public canTakeBack(): boolean {\n if (this.players[0].equalsValue('human')) {\n return this.gameComponent.getTurn() > 0;\n } else if (this.players[1].equalsValue('human')) {\n return this.gameComponent.getTurn() > 1;\n } else {\n return false;\n }\n }\n\n public async takeBack(): Promise {\n this.gameComponent.node = this.gameComponent.node.parent.get();\n if (this.isTurnOfPlayingAI()) {\n Utils.assert(this.gameComponent.node.parent.isPresent(),\n 'Cannot take back in first turn when AI is Player.ZERO');\n this.gameComponent.node = this.gameComponent.node.parent.get();\n }\n await this.showCurrentState(false);\n }\n\n private isTurnOfPlayingAI(): boolean {\n return this.getPlayingAI().isPresent();\n }\n\n public async restartGame(): Promise {\n const config: MGPOptional = await this.getConfig();\n this.gameComponent.node = this.gameComponent.rules.getInitialNode(config);\n this.gameComponent.cancelMoveAttempt();\n this.gameComponent.hideLastMove();\n await this.gameComponent.updateBoardAndRedraw(false);\n this.endGame = false;\n this.winnerMessage = MGPOptional.empty();\n await this.proposeAIToPlay();\n }\n\n public override getPlayer(): string {\n return 'human';\n }\n\n public override async onCancelMove(reason?: string): Promise {\n await super.onCancelMove(reason);\n if (this.gameComponent.node.previousMove.isPresent()) {\n const move: Move = this.gameComponent.node.previousMove.get();\n await this.gameComponent.showLastMove(move);\n }\n }\n\n public override async getConfig(): Promise> {\n let subcription: MGPOptional = MGPOptional.empty();\n const rulesConfigPromise: Promise =\n new Promise((resolve: (value: RulesConfig) => void) => {\n subcription = MGPOptional.of(\n this.configObs.subscribe((response: MGPOptional) => {\n if (response.isPresent()) {\n resolve(response.get());\n }\n }),\n );\n });\n const rulesConfig: RulesConfig = await rulesConfigPromise;\n // Subscription will never be empty at this point\n // but this is needed to prevent linter from complaining that:\n // \"subscription is used before it is set\"\n subcription.get().unsubscribe();\n return MGPOptional.of(rulesConfig);\n }\n\n public updateConfig(rulesConfig: MGPOptional): void {\n this.rulesConfig = rulesConfig;\n // If there is no config for this game, then rulesConfig value will be MGPOptional.empty()\n if (rulesConfig.isPresent()) {\n this.setConfigDemo(rulesConfig.get());\n if (Object.keys(rulesConfig.get()).length === 0) {\n // There is nothing to configure for this game!\n this.markConfigAsFilled();\n }\n }\n }\n\n public markConfigAsFilled(): void {\n this.configIsSet = true;\n this.configBS.next(this.rulesConfig);\n this.cdr.detectChanges();\n }\n\n public displayAIInfo(): boolean {\n return localStorage.getItem('displayAIInfo') === 'true';\n }\n\n private setConfigDemo(config: RulesConfig): void {\n const stateProvider: MGPOptional<(config: MGPOptional) => GameState> = this.getStateProvider();\n if (stateProvider.isPresent()) {\n const node: AbstractNode = new GameNode(stateProvider.get()(MGPOptional.of(config)));\n this.configDemo = {\n click: MGPOptional.empty(),\n name: this.getGameUrlName(),\n node,\n };\n this.cdr.detectChanges();\n }\n }\n\n public getConfigDemo(): DemoNodeInfo {\n return this.configDemo;\n }\n\n}\n","
\n","import { Injectable } from '@angular/core';\nimport { faBackwardStep, faFlag, faRepeat, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { MGPOptional, Utils, Set } from '@everyboard/lib';\nimport { MinimalUser } from 'src/app/domain/MinimalUser';\nimport { GameEventReply, GameEventRequest, RequestType } from 'src/app/domain/Part';\nimport { ConnectedUserService } from 'src/app/services/ConnectedUserService';\nimport { Localized } from 'src/app/utils/LocaleUtils';\n\nexport interface RequestInfo {\n requestType: RequestType,\n textForRequest: Localized,\n textForReply: Localized,\n name: Localized,\n icon: IconDefinition,\n}\n\n/**\n * The request manager manages the requests and replies.\n * It keeps state about whether a current request has been sent or is waiting for a reply.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OGWCRequestManagerService {\n\n public static requestInfos: Record = {\n 'TakeBack': {\n requestType: 'TakeBack',\n textForRequest: () => $localize`Ask to take back one move`,\n textForReply: () => $localize`Your opponent is asking for a take back.`,\n name: () => $localize`take back`,\n icon: faBackwardStep,\n },\n 'Draw': {\n requestType: 'Draw',\n textForRequest: () => $localize`Propose a draw`,\n textForReply: () => $localize`Your opponent is proposing a draw.`,\n name: () => $localize`draw`,\n icon: faFlag,\n },\n 'Rematch': {\n requestType: `Rematch`,\n textForRequest: () => $localize`Propose a rematch`,\n textForReply: () => $localize`Your opponent is proposing a rematch.`,\n name: () => $localize`rematch`,\n icon: faRepeat,\n },\n };\n\n private requestAwaitingReply: MGPOptional = MGPOptional.empty();\n private lastDeniedRequest: MGPOptional = MGPOptional.empty();\n private forbiddenRequests: Set = new Set();\n\n public constructor(private readonly connectedUserService: ConnectedUserService) {\n }\n\n public onGameStart(): void {\n // Upon game start, clear out requests\n this.requestAwaitingReply = MGPOptional.empty();\n this.lastDeniedRequest = MGPOptional.empty();\n this.forbiddenRequests = new Set();\n }\n public onReceivedMove(): void {\n // Upon a new turn, the player can again request anything\n this.forbiddenRequests = new Set();\n this.lastDeniedRequest = MGPOptional.empty();\n }\n public onReceivedRequest(request: GameEventRequest): void {\n Utils.assert(this.requestAwaitingReply.isAbsent(), 'Should not receive two requests in a row!');\n this.requestAwaitingReply = MGPOptional.of(request);\n }\n /**\n * Called when a reply is received.\n * @returns true if the request has been accepted and must be handled by the OGWC\n */\n public async onReceivedReply(reply: GameEventReply): Promise {\n this.requestAwaitingReply = MGPOptional.empty();\n switch (reply.reply) {\n case 'Accept':\n // The request has been accepted by the opponent, we give it back to OGWC\n return true;\n case 'Reject':\n // When one of our requests is rejected, we cannot make this request until the next turn\n const user: MinimalUser = this.connectedUserService.user.get().toMinimalUser();\n if (reply.user.id !== user.id) {\n // Opponent denied our request\n this.lastDeniedRequest = MGPOptional.of(reply.requestType);\n this.forbiddenRequests = this.forbiddenRequests.addElement(reply.requestType);\n }\n return false;\n }\n }\n public canMakeRequest(request: RequestType): boolean {\n // If a request is awaiting a reply, no other request can be made until replied\n if (this.requestAwaitingReply.isPresent()) return false;\n // If the request is forbidden, we cannot make it\n if (this.forbiddenRequests.contains(request)) return false;\n return true;\n }\n public getUnrespondedRequestFrom(user: MinimalUser): MGPOptional {\n // Different from canMakeRequest, as we can play if our requests have not been answered for example.\n if (this.requestAwaitingReply.isPresent() && this.requestAwaitingReply.get().user.id === user.id) {\n return MGPOptional.of(this.requestAwaitingReply.get().requestType);\n } else {\n return MGPOptional.empty();\n }\n }\n public getCurrentRequest(): MGPOptional {\n return this.requestAwaitingReply;\n }\n public deniedRequest(): MGPOptional {\n return this.lastDeniedRequest;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GameEventMove, GameEventAction } from '../../../domain/Part';\nimport { CountDownComponent } from '../../normal-component/count-down/count-down.component';\nimport { ConfigRoom } from 'src/app/domain/ConfigRoom';\nimport { Player } from 'src/app/jscaip/Player';\nimport { MinimalUser } from 'src/app/domain/MinimalUser';\nimport { MGPOptional, Utils } from '@everyboard/lib';\nimport { PlayerNumberMap } from 'src/app/jscaip/PlayerMap';\n\n/**\n * The time manager manages clocks of each player.\n * There are two main scenarios to consider:\n * 1. we join at the beginning of a game, or\n * 2. we join mid-game.\n * On top of that, it is important to remember that time can be added to a player.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OGWCTimeManagerService {\n\n // The turn clocks of each player\n private turnClocks: [CountDownComponent, CountDownComponent]; // Initialized by setClocks\n // The global clocks of each player\n private globalClocks: [CountDownComponent, CountDownComponent]; // Initialized by setClocks\n // All clocks managed by this time manager\n private allClocks: CountDownComponent[]; // Initialized by setClocks\n /*\n * The configRoom, which is set when starting the clocks.\n * We need it to know the maximal game and move durations.\n */\n private configRoom: MGPOptional = MGPOptional.empty();\n\n // The players, as we need to map between minimal users and player values\n private players: MGPOptional[] = [MGPOptional.empty(), MGPOptional.empty()];\n // The global time taken by each player since the beginning of the part\n private readonly takenGlobalTime: PlayerNumberMap = PlayerNumberMap.of(0, 0);\n\n // The global time added to each player\n private readonly extraGlobalTime: PlayerNumberMap = PlayerNumberMap.of(0, 0);\n\n // The turn time available for each player. Distinct from the clocks so it stays constant within a turn\n private readonly availableTurnTime: PlayerNumberMap = PlayerNumberMap.of(0, 0);\n\n // The time at which the current move started\n private lastMoveStartMs: MGPOptional = MGPOptional.empty();\n\n public setClocks(turnClocks: [CountDownComponent, CountDownComponent],\n globalClocks: [CountDownComponent, CountDownComponent])\n : void\n {\n this.turnClocks = turnClocks;\n this.globalClocks = globalClocks;\n this.allClocks = turnClocks.concat(globalClocks);\n }\n\n // At the beginning of a game, set up clocks and remember when the game started\n public onGameStart(configRoom: ConfigRoom, players: MGPOptional[]): void {\n this.configRoom = MGPOptional.of(configRoom);\n this.players = players;\n for (const player of Player.PLAYERS) {\n // We need to initialize the service's data\n // Otherwise if we go to another page and come back, the service stays alive and the data is off\n this.takenGlobalTime.put(player, 0);\n this.extraGlobalTime.put(player, 0);\n this.availableTurnTime.put(player, this.getMoveDurationInMs());\n // And we setup the clocks\n this.globalClocks[player.getValue()].setDuration(this.getPartDurationInMs());\n this.turnClocks[player.getValue()].setDuration(this.getMoveDurationInMs());\n }\n // We want the clocks to be paused, as we will only activate the required ones\n for (const clock of this.allClocks) {\n clock.start();\n clock.pause();\n }\n }\n\n private getPartDurationInMs(): number {\n return this.configRoom.get().totalPartDuration * 1000;\n }\n\n private getMoveDurationInMs(): number {\n return this.configRoom.get().maximalMoveDuration * 1000;\n }\n\n public onReceivedAction(action: GameEventAction): void {\n switch (action.action) {\n case 'AddTurnTime':\n this.addTurnTime(this.playerOfMinimalUser(action.user));\n break;\n case 'AddGlobalTime':\n this.addGlobalTime(this.playerOfMinimalUser(action.user));\n break;\n case 'StartGame':\n this.lastMoveStartMs = MGPOptional.of(action.time);\n break;\n case 'EndGame':\n this.onGameEnd();\n break;\n }\n }\n\n public playerOfMinimalUser(user: MinimalUser): Player {\n if (this.players[0].equalsValue(user)) {\n return Player.ZERO;\n } else {\n Utils.assert(this.players[1].equalsValue(user), 'MinimalUser should match player one');\n return Player.ONE;\n }\n }\n\n public onReceivedMove(move: GameEventMove): void {\n const player: Player = this.playerOfMinimalUser(move.user);\n\n const moveTimeMs: number = move.time;\n const takenMoveTimeMs: number = this.getMsElapsedSinceLastMoveStart(moveTimeMs);\n this.lastMoveStartMs = MGPOptional.of(moveTimeMs);\n this.takenGlobalTime.add(player, takenMoveTimeMs);\n this.availableTurnTime.add(player, - takenMoveTimeMs);\n\n // Now is the time to update the other player's clock\n // They may get updated through later action such as time additions\n const nextPlayer: Player = player.getOpponent();\n this.availableTurnTime.put(nextPlayer, this.getMoveDurationInMs());\n const nextPlayerTakenGlobalTime: number = this.takenGlobalTime.get(nextPlayer);\n const nextPlayerAdaptedGlobalTime: number = this.getPartDurationInMs() - nextPlayerTakenGlobalTime;\n this.globalClocks[nextPlayer.getValue()].changeDuration(nextPlayerAdaptedGlobalTime);\n }\n\n private getMsElapsedSinceLastMoveStart(moveTimeMs: number): number {\n return moveTimeMs - this.lastMoveStartMs.get();\n }\n\n // Stops all clocks that are running\n public onGameEnd(): void {\n for (const clock of this.allClocks) {\n if (clock.isStarted()) {\n clock.stop();\n }\n }\n // Finally, we update the clocks to make sure we show the correct time\n this.updateClocks();\n }\n\n // Pauses all clocks before handling new events\n public beforeEventsBatch(gameEnd: boolean): void {\n if (gameEnd === false) {\n this.pauseAllClocks();\n }\n }\n\n // Continue the current player clock after receiving events\n public afterEventsBatch(gameEnd: boolean, player: Player, currentTimeMs: number): void {\n this.updateClocks();\n if (gameEnd === false) {\n // The drift is how long has passed since the last event occurred\n // It can be only a few ms, or a much longer time in case we join mid-game\n const driftMs: number = this.getMsElapsedSinceLastMoveStart(currentTimeMs);\n // We need to subtract the time to take the drift into account\n this.turnClocks[player.getValue()].subtract(driftMs);\n this.globalClocks[player.getValue()].subtract(driftMs);\n this.resumeClocks(player);\n }\n }\n\n // Resumes the clocks of player. Public for testing purposes only.\n public resumeClocks(player: Player): void {\n this.turnClocks[player.getValue()].resume();\n this.globalClocks[player.getValue()].resume();\n }\n\n // Add turn time to the opponent of a player\n private addTurnTime(player: Player): void {\n const secondsToAdd: number = 30;\n this.availableTurnTime.add(player.getOpponent(), secondsToAdd * 1000);\n }\n\n // Add time to the global clock of the opponent of a player\n private addGlobalTime(player: Player): void {\n const secondsToAdd: number = 5 * 60;\n this.extraGlobalTime.add(player.getOpponent(), secondsToAdd * 1000);\n }\n\n // Update clocks with the available time\n private updateClocks(): void {\n for (const player of Player.PLAYERS) {\n this.turnClocks[player.getValue()].changeDuration(this.availableTurnTime.get(player));\n const playerTakenGlobalTime: number = this.takenGlobalTime.get(player);\n const globalTime: number =\n this.getPartDurationInMs() + this.extraGlobalTime.get(player) - playerTakenGlobalTime;\n this.globalClocks[player.getValue()].changeDuration(globalTime);\n }\n }\n\n // Pauses all clocks that are running\n private pauseAllClocks(): void {\n for (const clock of this.allClocks) {\n if (clock.isIdle() === false) {\n clock.pause();\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Router, Event } from '@angular/router';\nimport { Mutex } from 'async-mutex';\nimport { Subscription } from 'rxjs';\n\nimport { JSONValue, MGPFallible, MGPOptional, MGPValidation, Utils } from '@everyboard/lib';\nimport { ConnectedUserService, AuthUser } from 'src/app/services/ConnectedUserService';\nimport { GameService } from 'src/app/services/GameService';\nimport { Move } from '../../../jscaip/Move';\nimport { Part, PartDocument, GameEvent, GameEventMove, GameEventReply, RequestType } from '../../../domain/Part';\nimport { CountDownComponent } from '../../normal-component/count-down/count-down.component';\nimport { CurrentGame } from '../../../domain/User';\nimport { GameWrapper, GameWrapperMessages } from '../GameWrapper';\nimport { ConfigRoom } from 'src/app/domain/ConfigRoom';\nimport { Player, PlayerOrNone } from 'src/app/jscaip/Player';\nimport { GameState } from 'src/app/jscaip/state/GameState';\nimport { MessageDisplayer } from 'src/app/services/MessageDisplayer';\nimport { GameInfo } from '../../normal-component/pick-game/pick-game.component';\nimport { Localized } from 'src/app/utils/LocaleUtils';\nimport { MinimalUser } from 'src/app/domain/MinimalUser';\nimport { CurrentGameService } from 'src/app/services/CurrentGameService';\nimport { GameEventService } from 'src/app/services/GameEventService';\nimport { AbstractNode, GameNode } from 'src/app/jscaip/AI/GameNode';\nimport { OGWCTimeManagerService } from './OGWCTimeManagerService';\nimport { GameStatus } from 'src/app/jscaip/GameStatus';\nimport { OGWCRequestManagerService, RequestInfo } from './OGWCRequestManagerService';\nimport { PlayerNumberMap } from 'src/app/jscaip/PlayerMap';\nimport { RulesConfig } from 'src/app/jscaip/RulesConfigUtil';\nimport { Debug } from 'src/app/utils/Debug';\nimport { ServerTimeService } from 'src/app/services/ServerTimeService';\nimport { UserService } from 'src/app/services/UserService';\n\nexport class OnlineGameWrapperMessages {\n\n public static readonly NO_MATCHING_PART: Localized = () => $localize`The game you tried to join does not exist.`;\n\n public static readonly CANNOT_PLAY_AS_OBSERVER: Localized = () => $localize`You are an observer in this game, you cannot play.`;\n\n public static readonly MUST_ANSWER_REQUEST: Localized = () => $localize`You must answer your opponent's request.`;\n}\n\n@Component({\n selector: 'app-online-game-wrapper',\n templateUrl: './online-game-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@Debug.log\nexport class OnlineGameWrapperComponent extends GameWrapper implements OnInit, OnDestroy {\n\n // GameWrapping's Template\n @ViewChild('chronoZeroGlobal') public chronoZeroGlobal: CountDownComponent;\n @ViewChild('chronoOneGlobal') public chronoOneGlobal: CountDownComponent;\n @ViewChild('chronoZeroTurn') public chronoZeroTurn: CountDownComponent;\n @ViewChild('chronoOneTurn') public chronoOneTurn: CountDownComponent;\n\n // link between GameWrapping's template and remote opponent\n public currentPart: PartDocument | null = null;\n public currentPartId!: string; // Initialized in ngOnInit\n public gameStarted: boolean = false;\n public opponent: MinimalUser | null = null;\n public authUser!: AuthUser; // Initialized in ngOnInit\n public currentUser: MinimalUser | null = null;\n\n public configRoom: ConfigRoom;\n public currentGame: MGPOptional = MGPOptional.empty();\n private userLinkedToThisPart: boolean = true;\n\n private routerEventsSubscription!: Subscription; // Initialized in ngOnInit\n private userSubscription!: Subscription; // Initialized in ngOnInit\n private partSubscription: Subscription = new Subscription();\n private gameEventsSubscription: Subscription = new Subscription();\n private currentGameSubscription: Subscription = new Subscription();\n\n public readonly OFFLINE_FONT_COLOR: { [key: string]: string } = { color: 'lightgrey' };\n\n public readonly globalTimeMessage: string = $localize`05:00`;\n public readonly turnTimeMessage: string = $localize`00:30`;\n\n public readonly requestInfos: Record = OGWCRequestManagerService.requestInfos;\n public readonly allRequests: RequestType[] = ['TakeBack', 'Draw', 'Rematch'];\n\n private moveSentButNotReceivedYet: boolean = false;\n\n public constructor(activatedRoute: ActivatedRoute,\n connectedUserService: ConnectedUserService,\n router: Router,\n messageDisplayer: MessageDisplayer,\n private readonly currentGameService: CurrentGameService,\n private readonly gameService: GameService,\n private readonly gameEventService: GameEventService,\n private readonly timeManager: OGWCTimeManagerService,\n private readonly requestManager: OGWCRequestManagerService,\n private readonly serverTimeService: ServerTimeService,\n private readonly userService: UserService,\n private readonly cdr: ChangeDetectorRef)\n {\n super(activatedRoute, connectedUserService, router, messageDisplayer);\n }\n\n private extractPartIdFromURL(): string {\n return Utils.getNonNullable(this.activatedRoute.snapshot.paramMap.get('id'));\n }\n\n public isPlaying(): boolean {\n return this.role.isPlayer();\n }\n\n public override getPlayer(): MinimalUser {\n return this.authUser.toMinimalUser();\n }\n\n private async redirectIfPartOrGameIsInvalid(): Promise {\n const urlName: string = this.getGameUrlName();\n const gameExists: boolean = GameInfo.getByUrlName(urlName).isPresent();\n if (gameExists) {\n const partValidity: MGPValidation =\n await this.gameService.getGameValidity(this.currentPartId, urlName);\n if (partValidity.isFailure()) {\n this.routerEventsSubscription.unsubscribe();\n const message: string = OnlineGameWrapperMessages.NO_MATCHING_PART();\n await this.router.navigate(['/notFound', message], { skipLocationChange: true } );\n }\n } else {\n this.routerEventsSubscription.unsubscribe();\n const message: string = GameWrapperMessages.NO_MATCHING_GAME(urlName);\n await this.router.navigate(['/notFound', message], { skipLocationChange: true } );\n }\n }\n\n private setCurrentPartIdOrRedirect(): Promise {\n this.currentPartId = this.extractPartIdFromURL();\n return this.redirectIfPartOrGameIsInvalid();\n }\n\n public async ngOnInit(): Promise {\n\n this.routerEventsSubscription = this.router.events.subscribe(async(ev: Event) => {\n if (ev instanceof NavigationEnd) {\n await this.setCurrentPartIdOrRedirect();\n }\n });\n this.userSubscription = this.connectedUserService.subscribeToUser(async(user: AuthUser) => {\n // player should be authenticated and have a username to be here\n this.authUser = user;\n });\n\n await this.setCurrentPartIdOrRedirect();\n // onCurrentGameUpdate needs to access to currentPartId, so it must do it after setCurrentPartIdOrRedirect\n this.currentGameSubscription = this.currentGameService.subscribeToCurrentGame(\n (async(part: MGPOptional) => {\n await this.onCurrentGameUpdate(part);\n }));\n }\n\n /**\n * Here you can only be an observer or a player\n * (creator, candidate and chosen opponent being only for non started game)\n * If you are player, it is impossible that you start creating/joining a part\n * If you are observer, you can join this part as observer in another tab\n * then, if you quit this tab, you become unlinked to this part in here\n * then, if you start creating a game, this tab should go back to the lobby\n * because user that are playing should not see other players playing\n */\n private async onCurrentGameUpdate(part: MGPOptional): Promise {\n if (part.isPresent()) {\n const newPart: CurrentGame = part.get();\n if (newPart.role === 'Observer' || newPart.id === this.currentPartId) {\n // if we learn that other tabs are observer\n // or that other tabs are from the same part\n // then nothing is to be done here\n this.currentGame = part;\n } else {\n // we learn that we are active in another part (typically creating another game) so we quit\n this.userLinkedToThisPart = false;\n await this.router.navigate(['/lobby']);\n }\n } else {\n this.currentGame = MGPOptional.empty();\n }\n this.cdr.detectChanges();\n }\n\n public async startGame(configRoom: ConfigRoom): Promise {\n Utils.assert(this.gameStarted === false, 'Should not start already started game');\n this.configRoom = configRoom;\n\n this.gameStarted = true;\n window.setTimeout(async() => {\n // the small waiting is there to make sure that the chronos are loaded by view\n const createdSuccessfully: boolean = await this.createMatchingGameComponent();\n this.timeManager.setClocks([this.chronoZeroTurn, this.chronoOneTurn],\n [this.chronoZeroGlobal, this.chronoOneGlobal]);\n Utils.assert(createdSuccessfully, 'Game should be created successfully, otherwise part-creation would have redirected');\n Utils.assert(this.gameComponent !== null, 'Game component should exist');\n this.gameComponent.config = MGPOptional.of(configRoom.rulesConfig);\n await this.startPart();\n }, 2);\n }\n\n private async startPart(): Promise {\n // Trigger the first update manually, so that we will have info on the part before receiving any moves\n // This is useful when we join a part in the middle.\n const part: Part = await this.gameService.getExistingGame(this.currentPartId);\n this.currentPart = new PartDocument(this.currentPartId, part);\n\n // We subscribe to the part only at this point.\n // Once we receive the notification that the part started, we will subscribe to the events\n this.partSubscription =\n this.gameService.subscribeToChanges(this.currentPartId, async(p: MGPOptional) => {\n Utils.assert(p.isPresent(), 'OnlineGameWrapper observed a part being deleted, this should not happen');\n this.currentPart = new PartDocument(this.currentPartId, p.get());\n });\n this.subscribeToEvents();\n }\n\n private async onGameStart(): Promise {\n await this.initializePlayersData(this.currentPart as PartDocument);\n const turn: number = this.gameComponent.getTurn();\n Utils.assert(turn === 0, 'turn should always be 0 upon game start');\n this.timeManager.onGameStart(this.configRoom, this.players);\n this.requestManager.onGameStart();\n this.cdr.detectChanges();\n }\n\n private subscribeToEvents(): void {\n // The game has started, we can subscribe to the events to receive moves etc.\n // We don't want to do it sooner, as the clocks need to be started before receiving any move\n // Importantly, we can receive more than one event at a time.\n // This is in particular used to deal with joining a game in the middle:\n // we don't want to apply all clock actions then\n const mutex: Mutex = new Mutex(); // Need to ensure we receive events one at a time\n const callback: (events: GameEvent[]) => Promise = async(events: GameEvent[]): Promise => {\n if (events.length === 0) return; // Only happens in the test suite\n await mutex.runExclusive(async() => {\n const numberOfMoves: number = events.filter((g: GameEvent) => g.eventType === 'Move').length;\n let numberOfMovesDone: number = 0;\n this.beforeEventsBatch();\n for (const event of events) {\n switch (event.eventType) {\n case 'Move':\n const isLastMove: boolean = (numberOfMovesDone + 1 === numberOfMoves);\n await this.onReceivedMove(event, isLastMove);\n numberOfMovesDone += 1;\n break;\n case 'Request':\n this.requestManager.onReceivedRequest(event);\n break;\n case 'Reply':\n const mustHandle: boolean = await this.requestManager.onReceivedReply(event);\n if (mustHandle) {\n await this.handleReply(event);\n }\n break;\n default:\n Utils.expectToBe(event.eventType, 'Action', 'Event should be an action');\n this.timeManager.onReceivedAction(event);\n if (event.action === 'EndGame') await this.onGameEnd();\n else if (event.action === 'StartGame') await this.onGameStart();\n break;\n }\n }\n await this.afterEventsBatch();\n this.cdr.detectChanges();\n });\n };\n this.gameEventsSubscription = this.gameEventService.subscribeToEvents(this.currentPartId, callback);\n }\n\n private async handleReply(reply: GameEventReply): Promise {\n switch (reply.requestType) {\n case 'TakeBack':\n const accepter: Player = this.timeManager.playerOfMinimalUser(reply.user);\n await this.takeBackToPreviousPlayerTurn(accepter.getOpponent());\n break;\n case 'Rematch':\n await this.router.navigate(['/nextGameLoading']);\n const urlName: string = this.getGameUrlName();\n await this.router.navigate(['/play', urlName, reply.data]);\n break;\n case 'Draw':\n // Nothing to do as the part will be updated with the draw\n break;\n }\n }\n\n private async onGameEnd(): Promise {\n await this.currentGameService.removeCurrentGame();\n await this.setInteractive(false);\n this.endGame = true;\n this.cdr.detectChanges();\n }\n\n private async onReceivedMove(moveEvent: GameEventMove, isLastMoveOfBatch: boolean): Promise {\n if (this.moveSentButNotReceivedYet) {\n // This is our move, we have already shown it\n // So we do nothing to show it again.\n this.moveSentButNotReceivedYet = false;\n } else {\n // This is not our move, it is either the move of the opponent, or we are observing.\n // In any case, we have to show and animate it.\n const move: Move = this.gameComponent.encoder.decode(moveEvent.move);\n await this.applyMove(move, isLastMoveOfBatch);\n }\n // Need to handle the rest irrespective of which move we received\n await this.setCurrentPlayerAccordingToCurrentTurn();\n this.timeManager.onReceivedMove(moveEvent);\n this.requestManager.onReceivedMove();\n this.cdr.detectChanges();\n }\n\n private async setCurrentPlayerAccordingToCurrentTurn(): Promise {\n this.currentUser = this.players[this.gameComponent.getTurn() % 2].get();\n await this.setInteractive(\n this.currentUser.name === this.getPlayer().name,\n false,\n );\n }\n\n private beforeEventsBatch(): void {\n this.timeManager.beforeEventsBatch(this.endGame);\n }\n\n private async afterEventsBatch(): Promise {\n const player: Player = Player.ofTurn(this.gameComponent.getTurn());\n const serverTimeMs: number = await this.serverTimeService.getServerTimeInMs();\n this.timeManager.afterEventsBatch(this.endGame, player, serverTimeMs);\n }\n\n private async takeBackToPreviousPlayerTurn(player: Player): Promise {\n // Take back once, in any case\n this.gameComponent.node = this.gameComponent.node.parent.get();\n if (this.gameComponent.getCurrentPlayer() !== player) {\n Utils.assert(this.gameComponent.getTurn() > 0, 'Should not allow player that never played to take back');\n // Take back a second time to make sure it end up on player's turn\n this.gameComponent.node = this.gameComponent.node.parent.get();\n }\n await this.setCurrentPlayerAccordingToCurrentTurn();\n const triggerAnimation: boolean = this.gameComponent.getTurn() === 0;\n await this.showCurrentState(triggerAnimation);\n }\n\n public canResign(): boolean {\n Utils.assert(this.isPlaying(), 'Non playing should not call canResign');\n if (this.endGame) {\n return false;\n }\n const hasOpponent: boolean = this.opponent != null;\n return hasOpponent;\n }\n\n public requestAvailable(request: RequestType): boolean {\n switch (request) {\n case 'TakeBack':\n return this.canAskTakeBack();\n case 'Draw':\n return this.canProposeDraw();\n default:\n Utils.expectToBe(request, 'Rematch');\n return this.canProposeRematch();\n }\n }\n\n public mustReply(): boolean {\n return this.getRequestAwaitingReplyFromUs().isPresent();\n }\n\n public getRequestAwaitingReplyFromUs(): MGPOptional {\n Utils.assert(this.role.isPlayer(), 'User should be playing');\n return this.requestManager.getUnrespondedRequestFrom(Utils.getNonNullable(this.opponent));\n }\n\n public getRequestAwaitingReplyFromOpponent(): MGPOptional {\n Utils.assert(this.role.isPlayer(), 'User should be playing');\n return this.requestManager.getUnrespondedRequestFrom(Utils.getNonNullable(this.currentUser));\n }\n\n public deniedRequest(): MGPOptional {\n return this.requestManager.deniedRequest();\n }\n\n public canPass(): boolean {\n Utils.assert(this.isPlaying(), 'Non playing should not call canPass');\n if (this.endGame) return false;\n if (this.currentUser?.name !== this.getPlayer().name) return false;\n return this.gameComponent.canPass;\n }\n\n private canAskTakeBack(): boolean {\n Utils.assert(this.isPlaying(), 'Non playing should not call canAskTakeBack');\n Utils.assert(this.currentPart != null, 'should not call canAskTakeBack when currentPart is not defined yet');\n // Cannot do a request in end game\n if (this.endGame) return false;\n // Cannot do a take back request before we played\n const currentPart: PartDocument = Utils.getNonNullable(this.currentPart);\n if (currentPart.data.turn <= this.role.getValue()) return false;\n // Otherwise, it depends on the request manager\n return this.requestManager.canMakeRequest('TakeBack');\n }\n\n private canProposeDraw(): boolean {\n Utils.assert(this.isPlaying(), 'Non playing should not call canProposeDraw');\n // Cannot propose draw in end game\n if (this.endGame) return false;\n // Otherwise, it depends on the request manager\n return this.requestManager.canMakeRequest('Draw');\n }\n\n private canProposeRematch(): boolean {\n return this.endGame && this.requestManager.canMakeRequest('Rematch');\n }\n\n public override async canUserPlay(clickedElementName: string): Promise {\n if (this.role.isNone()) {\n const message: string = OnlineGameWrapperMessages.CANNOT_PLAY_AS_OBSERVER();\n return MGPValidation.failure(message);\n }\n const result: MGPValidation = await super.canUserPlay(clickedElementName);\n if (result.isFailure()) {\n return result; // NOT_YOUR_TURN or GAME_HAS_ENDED are checked here\n } else if (this.mustReply()) {\n return MGPValidation.failure(OnlineGameWrapperMessages.MUST_ANSWER_REQUEST());\n } else {\n return MGPValidation.SUCCESS;\n }\n }\n\n private async initializePlayersData(part: PartDocument): Promise {\n this.players = [\n MGPOptional.of(part.data.playerZero),\n MGPOptional.ofNullable(part.data.playerOne),\n ];\n Utils.assert(part.data.playerOne != null, 'should not initializePlayersData when players data is not received');\n await this.setCurrentPlayerAccordingToCurrentTurn();\n await this.setRealObserverRole();\n }\n\n private async setRealObserverRole(): Promise {\n if (this.players[0].equalsValue(this.getPlayer())) {\n await this.setRole(Player.ZERO);\n this.opponent = this.players[1].get();\n } else if (this.players[1].equalsValue(this.getPlayer())) {\n await this.setRole(Player.ONE);\n this.opponent = this.players[0].get();\n } else {\n await this.setRole(PlayerOrNone.NONE);\n }\n await this.currentGameService.updateCurrentGame({\n ...this.currentGame.get(),\n role: this.role.isNone() ? 'Observer' : 'Player',\n });\n }\n\n public async onLegalUserMove(move: Move): Promise {\n // First, show the move in the component\n await this.applyMove(move, false); // Move was already animated by its game component, no need to animate again\n // Then, send the move\n const config: MGPOptional = await this.getConfig();\n const gameStatus: GameStatus = this.gameComponent.rules.getGameStatus(this.gameComponent.node, config);\n const encodedMove: JSONValue = this.gameComponent.encoder.encode(move);\n const partId: string = this.currentPartId;\n const scores: MGPOptional = this.gameComponent.scores;\n this.moveSentButNotReceivedYet = true;\n if (gameStatus.isEndGame) {\n await this.gameService.addMoveAndEndGame(partId, encodedMove, scores, gameStatus.winner);\n } else {\n await this.gameService.addMove(partId, encodedMove, scores);\n }\n }\n\n private async applyMove(move: Move, triggerAnimation: boolean): Promise {\n const oldNode: AbstractNode = this.gameComponent.node;\n const state: GameState = oldNode.gameState;\n const config: MGPOptional = await this.getConfig();\n const legality: MGPFallible = this.gameComponent.rules.isLegal(move, state, config);\n Utils.assert(legality.isSuccess(), 'OGWC.applyMove called with an illegal move');\n const stateAfterMove: GameState = this.gameComponent.rules.applyLegalMove(move, state, config, legality.get());\n this.gameComponent.node = new GameNode(stateAfterMove, MGPOptional.of(oldNode), MGPOptional.of(move));\n await this.showNewMove(triggerAnimation);\n }\n\n private async notifyTimeoutVictory(victoriousPlayer: MinimalUser, loser: MinimalUser): Promise {\n await this.gameService.notifyTimeout(this.currentPartId, victoriousPlayer, loser);\n }\n\n // Called by the resign button\n public async resign(): Promise {\n await this.gameService.resign(this.currentPartId);\n }\n\n // Called by the clocks\n public async reachedOutOfTime(player: Player): Promise {\n if (this.isPlaying() === false) {\n return;\n }\n const opponent: MinimalUser = Utils.getNonNullable(this.opponent);\n if (player === this.role) {\n await this.notifyTimeoutVictory(opponent, this.authUser.toMinimalUser());\n } else {\n await this.notifyTimeoutVictory(this.authUser.toMinimalUser(), opponent);\n }\n }\n\n // Called by the corresponding button\n public async propose(request: RequestType): Promise {\n Utils.assert(this.role.isPlayer(), 'cannot propose request if not player');\n switch (request) {\n case 'Rematch':\n return this.gameService.proposeRematch(this.currentPartId);\n case 'Draw':\n return this.gameService.proposeDraw(this.currentPartId);\n default:\n Utils.expectToBe(request, 'TakeBack');\n return this.gameService.askTakeBack(this.currentPartId);\n }\n }\n\n // Called by the 'accept' button\n public async accept(): Promise {\n Utils.assert(this.role.isPlayer(), 'cannot accept request if not player');\n const request: RequestType = this.requestManager.getCurrentRequest().get().requestType;\n switch (request) {\n case 'Rematch':\n return this.gameService.acceptRematch(this.currentPartId);\n case 'Draw':\n return this.gameService.acceptDraw(this.currentPartId);\n default:\n Utils.expectToBe(request, 'TakeBack');\n return this.gameService.acceptTakeBack(this.currentPartId);\n }\n }\n\n // Called by the 'reject' button\n public async reject(): Promise {\n Utils.assert(this.role.isPlayer(), 'cannot reject request if not player');\n const request: RequestType = this.requestManager.getCurrentRequest().get().requestType;\n switch (request) {\n case 'Rematch':\n return this.gameService.rejectRematch(this.currentPartId);\n case 'Draw':\n return this.gameService.refuseDraw(this.currentPartId);\n default:\n Utils.expectToBe(request, 'TakeBack');\n return this.gameService.refuseTakeBack(this.currentPartId);\n }\n }\n\n // Called by the 'AddGlobalTime' button\n public addGlobalTime(): Promise {\n return this.gameService.addGlobalTime(this.currentPartId);\n }\n\n // Called by the 'AddTurnTime' button\n public addTurnTime(): Promise {\n return this.gameService.addTurnTime(this.currentPartId);\n }\n\n public override async onCancelMove(reason?: string): Promise {\n await super.onCancelMove(reason);\n if (this.gameComponent.node.previousMove.isPresent()) {\n const move: Move = this.gameComponent.node.previousMove.get();\n await this.gameComponent.showLastMove(move);\n }\n this.cdr.detectChanges();\n }\n\n public async ngOnDestroy(): Promise {\n this.routerEventsSubscription.unsubscribe();\n this.userSubscription.unsubscribe();\n this.currentGameSubscription.unsubscribe();\n if (this.isPlaying() === false && this.userLinkedToThisPart && this.connectedUserService.user.isPresent()) {\n await this.currentGameService.removeCurrentGame();\n }\n if (this.gameStarted) {\n this.partSubscription.unsubscribe();\n this.gameEventsSubscription.unsubscribe();\n }\n }\n\n public override async getConfig(): Promise> {\n const rulesConfig: RulesConfig = this.configRoom.rulesConfig;\n return MGPOptional.of(rulesConfig);\n }\n\n}\n","\n\n\n
\n
\n
\n
\n
{{ getGameName().getOrElse('') }}
\n
Turn n°{{ currentPart.getTurn() + 1 }}
\n
\n It is your turn.\n It is {{ currentUser?.name }}'s turn.\n