Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Util from '../util';
- import CardsGame from './cardsgame';
- import Deck from './deck';
- import GameTable from './gametable';
- import CurrentTurn from './currentturn';
- import cards from '../../assets/cartes';
- /**
- * Représente les règles du jeu Bâtisseurs: Moyen-Age
- */
- export default class BatisseursMoyAge extends CardsGame {
- /**
- * Constructeur
- * @param {Object[]} Tableau des cartes du jeu
- * @class
- */
- constructor(cards) {
- super("BATISSEURS_MOY-AGE","Bâtisseurs Moyen-Âge", cards, 3);
- this.actionNames = ["getWorker", "getBuilding", "getGold", "putWorker", "buyAction"];
- }
- //PAS UTILISEE
- /**
- * Liste des matériaux possibles
- * @returns {[string,string,string,string]}
- */
- static getMaterials() {
- "use strict";
- return ["pierre", "tuile", "savoir", "bois"];
- }
- //PAS UTILISEE
- /**
- * Vérifie que le salaire d'un ouvrier correspond à sa qualification
- * @param {number} salary Salaire d'un ouvrier
- * @param {string} level Niveau de l'ouvrier (apprenti, manoeuvre, compagnon, maître
- * @returns {boolean} true si salaire est correct pour le niveau de l'ouvrier, false sinon
- */
- validateSalaryByLevel(salary, level) {
- return true;
- }
- //PAS UTILISEE
- /**
- * Vérifie qu'une carte requiert un nombre positif d'au moins un matériau valide
- * @param {Object} card Carte du jeu
- * @returns {boolean} true si matériau requis, false sinon
- */
- needsMaterials(card) {
- let hasMaterial = false;
- BatisseursMoyAge.getMaterials().map(function (material) {
- if (card.hasOwnProperty(material) && parseInt(card[material]) > 0) {
- hasMaterial = true;
- }
- });
- return hasMaterial;
- }
- /**
- * Vérifie qu'une carte de famille "ouvrier" est valide; sinon retourne un message d'erreur explicite
- * @param {Object} card Carte du jeu
- * @returns {Object} retourne {error: boolean, message: string}, si erreur détectée : error = true, message contient une explication de l'erreur
- */
- validateBatisseursMAOuvrier(card) {
- let result = {error: false, message: ""};
- let isValid = true;
- let messages = "";
- if (card.famille === "ouvrier") {
- let niveau = card.niveau;
- if (!(niveau === "apprenti" || niveau === "manoeuvre" || niveau === "compagnon" || niveau === "maître")) {
- messages += ("niveau invalide, id de la carte:" + card.id + "\n");
- isValid = false;
- }
- else { // L'attribut niveau est Ok
- let salaire = card.salaire;
- if (niveau === "apprenti") {
- if (salaire !== 2) { isValid = false; messages += ("salaire invalide, id de la carte" + card.id + "\n");}
- }
- else if (niveau === "manœuvre") {
- if (salaire !== 3) { isValid = false; messages += ("salaire invalide, id de la carte" + card.id + "\n");}
- }
- else if (niveau === "compagnon") {
- if (salaire !== 4) { isValid = false; messages += ("salaire invalide, id de la carte" + card.id + "\n");}
- }
- else if (niveau === "maître") {
- if (salaire !== 5) { isValid = false; messages += ("salaire invalide, id de la carte" + card.id + "\n");}
- }
- else { // Le salaire a bien été vérif
- let valeurSalaire = 0;
- if (card.hasOwnProperty("pierre") && card.pierre > 0 && card.pierre < 4) {valeurSalaire += card.pierre;}
- if (card.hasOwnProperty("bois") && card.bois > 0 && card.bois < 4) {valeurSalaire += card.bois;}
- if (card.hasOwnProperty("savoir") && card.savoir > 0 && card.savoir < 4) {valeurSalaire += card.savoir;}
- if (card.hasOwnProperty("tuile") && card.tuile > 0 && card.tuile < 4) {valeurSalaire += card.tuile;}
- if (valeurSalaire !== salaire) { isValid = false; messages += ("valeur du salaire incorrecte, id de la carte:" + card.id + "\n");}
- }
- }
- }
- result[0] = isValid;
- result[1] = messages;
- return result;
- }
- /**
- * Vérifie qu'une carte de famille "bâtiment" est valide; sinon retourne un message d'erreur explicite
- * @param {Object} card Carte du jeu
- * @returns {Object} retourne {error: boolean, message: string}, si erreur détectée : error = true, message contient une explication de l'erreur
- */
- validateBatisseursMABatiment(card) {
- let result = {error: false, message: ""};
- let isValid = true;
- let messages = "";
- if (card.famille === "bâtiment") {
- if (card.label.length === 0 || !card.label) {isValid = false; messages += ("label vide, id de la carte:" + card.id + "\n");}
- if (card.gains <= 0) { isValid = false; messages += ("gains inférieurs à 1, id de la carte:" + card.id + "\n");}
- if (card.pv < 0) { isValid = false; messages += ("pv inférieurs à 0, id de la carte:" + card.id + "\n");}
- if (card.hasOwnProperty("pierre") && (!(card.pierre > 0 && card.pierre < 6))) {
- isValid = false; messages += ("valeur propriete pierre incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("bois") && (!(card.bois > 0 && card.bois < 6))) {
- isValid = false; messages += ("valeur propriete bois incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("savoir") && (!(card.savoir > 0 && card.savoir < 6))) {
- isValid = false; messages += ("valeur propriete savoir incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("tuile") && (!(card.tuile > 0 && card.tuile < 6))) {
- isValid = false; messages += ("valeur propriete tuile incorrecte, id de la carte:" + card.id + "\n");
- }
- }
- result[0] = isValid;
- result[1] = messages;
- return result;
- }
- /**
- * Vérifie qu'une carte de famille "machine" est valide; sinon retourne un message d'erreur explicite
- * @param {Object} card Carte du jeu
- * @returns {Object} retourne {error: boolean, message: string}, si erreur détectée : error = true, message contient une explication de l'erreur
- */
- validateBatisseursMAMachine(card) {
- let result = {error: false, message: ""};
- let isValid = true;
- let messages = "";
- if (card.famille === "machine") {
- if (card.label.length === 0 || !card.label) {isValid = false; messages += ("label vide, id de la carte:" + card.id + "\n");}
- if (!(card.pv === 1 || card.pv === 2)) { isValid = false; messages += ("pv non égal à 1 ou 2, id de la carte:" + card.id + "\n");}
- if((card.production === 2 && card.pv !== 1) || (card.production === 3 && card.pv !== 2)){
- isValid = false;
- messages += ("valeur de matière ne correpond pas avec pv, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("pierre") && (!(card.pierre > 0 && card.pierre < 3))) {
- isValid = false; messages += ("valeur propriete pierre incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("bois") && (!(card.bois > 0 && card.bois < 3))) {
- isValid = false; messages += ("valeur propriete bois incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("savoir") && (!(card.savoir > 0 && card.savoir < 3))) {
- isValid = false; messages += ("valeur propriete savoir incorrecte, id de la carte:" + card.id + "\n");
- }
- if (card.hasOwnProperty("tuile") && (!(card.tuile > 0 && card.tuile < 3))) {
- isValid = false; messages += ("valeur propriete tuile incorrecte, id de la carte:" + card.id + "\n");
- }
- }
- result[0] = isValid;
- result[1] = messages;
- return result;
- }
- /**
- * Appelle les différentes fonctions de validation d'une carte en fonction de sa famille
- * @param {Object} card Carte du jeu
- * @returns {Object} retourne {error: boolean, message: string}, si erreur détectée : error = true, message contient une explication de l'erreur
- */
- validationBatisseursMA(card) {
- if(card.famille === "ouvrier"){
- return this.validateBatisseursMAOuvrier(card);
- }else if(card.famille === "bâtiment"){
- return this.validateBatisseursMABatiment(card);
- }else {
- return this.validateBatisseursMAMachine(card);
- }
- /*let result = {error: false, message: ""};
- // Les 3 fonctions de validation DU BATISSEUR
- let resultOuvrier = this.validateBatisseursMAOuvrier(card);
- let resultBatiment = this.validateBatisseursMABatiment(card);
- let resultMachine = this.validateBatisseursMAMachine(card);
- // Calcul du resultat des vérifications
- result[0] = resultOuvrier[0] && resultBatiment[0] && resultMachine[0];
- result[1] = resultOuvrier[1] + resultBatiment[1] + resultMachine[1];
- return result;*/
- }
- /**
- * Appel à la validation générale d'un jeu de cartes, en lui passant la fonction spécifique de validation du jeu
- * @returns {string} chaine de caractères listant toutes les erreurs détectées dans les cartes du jeu séparées par un saut de ligne
- */
- validate() {
- // Appel de la fonction de validation générale de la "classe mere" CardsGame
- // La fonction de validation relative au batisseur sera appelé par la suite.
- return super.validate(this.validationBatisseursMA);
- }
- //PAS UTILISEE
- /**
- * Calcule le nombre d'actions requises pour affecter un ou plusieurs ouvriers sur un même bâtiment durant le même tour par le joueur courant
- * @param {number} nbr Nombre d'ouvriers à affecter
- * @returns {number} Nombre d'actions requises
- */
- getNbrActionsForWorkersOnSameBuildingAndSameTurn(nbr){
- let result = 1;
- return result;
- }
- //PAS UTILISEE
- /**
- * Calcule le nombre d'écus à recevoir pour une ou plusieurs actions vendues
- * @param {number} nbr Nombre d'actions vendues
- * @returns {number} Nombre d'écus à recevoir
- */
- getNbrEcusForNbrActions(nbr){
- return 0;
- }
- /**
- * Effectue la mise en place du jeu Bâtisseurs: Moyen-Age
- * @param {Game} game Partie en cours
- */
- initialize(game) {
- this.generateHashCode(game);
- //Initialiser le premier tour
- game.currentTurn = new CurrentTurn(3);
- this.initWorkerDeck(game);
- this.initBuildingDeck(game);
- this.initGold(game);
- }
- /**
- * Ajoute 10 écus à chaque joueur
- * @param {Game} game Partie en cours
- */
- initGold(game) {
- game.players.forEach((player) => {
- player.inventory.push({ecus: 10});
- });
- }
- /**
- * Créer un deck avec tous les ouvriers
- * @param {Game} game Partie en cours
- */
- initWorkerDeck(game){
- let workerDeck = new Deck(cards);
- workerDeck.cards = workerDeck.getCards({famille:"ouvrier"});
- workerDeck.shuffle();
- game.decks[1] = workerDeck;
- game.decks[1].cards.forEach((card) => {
- this.validationBatisseursMA(card);
- });
- }
- /**
- * Créer un deck avec tous les batiments
- * @param {Game} game Partie en cours
- */
- initBuildingDeck(game){
- let buildingDeck = new Deck(cards);
- buildingDeck.cards = buildingDeck.getCards({famille:"bâtiment"}).concat(buildingDeck.getCards({famille:"machine"}));
- buildingDeck.shuffle();
- game.decks[0] = buildingDeck;
- game.decks[0].cards.forEach((card) => {
- this.validationBatisseursMA(card);
- });
- }
- /**
- * Génere un hashcode
- */
- generateHashCode(game) {
- let randomString = Util.randomString(20);
- let label = game.cardsGame.label;
- let timeStamp = new Date().getTime();
- let hashcode = Util.hashCode(randomString + label + timeStamp);
- game.hashCode = hashcode;
- }
- //PAS UTILISEE, on appel les méthodes de vérif DIRECT dans l'execute (voir ci-dessous) correspondant
- /**
- * Vérifie si l'action est autorisée pour le joueur en cours
- * @param {Game} game Partie en cours
- * @param {string} actionName Nom de l'action à vérifier
- * @param {Object} args Paramètres facultatifs de l'action à effectuer
- * @returns {boolean} true si action autorisée, false sinon
- */
- isValidAction(game, actionName, args) {
- if (this.actionNames.indexOf(actionName) < -1) { return false;} // L'action n'existe pas
- if (actionName === "getWorker") { return this.verifGetWorker(game, args);}
- else if (actionName === "getBuilding") { return this.verifGetBuilding(game, args);}
- else if (actionName === "getGold") { return this.verifGetGold(game, args);}
- else if (actionName === "putWorker") { return this.verifPutWorker(game, args);}
- else if (actionName === "buyAction") { return this.verifBuyAction(game, args);}
- return false;
- }
- verifGetWorker(game, args) {
- let bool = game.decks[1].cards.some((value) => {
- return value.id === args.workerId;
- });
- if(bool === false || game.currentTurn.nbrActions === 0){
- bool = false;
- }else{
- bool = true;
- }
- return bool;
- }
- verifGetBuilding(game, args) {
- let bool = game.decks[0].cards.some((value) => {
- return value.id === args.buildingId;
- });
- if(bool === false || game.currentTurn.nbrActions === 0){
- return false;
- }else{
- return true;
- }
- }
- verifGetGold(game, args) {
- return game.currentTurn.nbrActions >= args.amount;
- }
- verifPutWorker(game, args) {
- return game.currentTurn.nbrActions >= 1;
- }
- verifBuyAction(game, args) {
- let player = game.players[game.currentPlayer-1];
- let nbreGold = player.inventory.find(item => item.ecus !== undefined).ecus;
- if (nbreGold >= 5) {
- return true;
- } else { return false;}
- }
- /**
- * Effectue une action pour le joueur en cours
- * @param {Game} game Partie en cours
- * @param {string} actionName Nom de l'action à vérifier
- * @param {Object} args Paramètres facultatifs de l'action à effectuer
- * @returns {boolean} true si action autorisée, false sinon
- */
- doAction(game, actionName, args) {
- // Action valide ??
- // Si action valide, execution de la fonction correspondante
- if (actionName === "getWorker") {this.executeGetWorker(game, args);}
- if (actionName === "getBuilding") {this.executeGetBuilding(game, args);}
- if (actionName === "getGold") {this.executeGetGold(game, args);}
- if (actionName === "putWorker") {this.executePutWorker(game, args);}
- if (actionName === "buyAction") {this.executeBuyAction(game, args);}
- this.afterAction(game, actionName, args);
- }
- executeGetWorker(game, args) {
- if (this.verifGetWorker(game, args)) {
- let workerObj = game.decks[1].getCardById(args.workerId);
- game.decks[1].removeCard(args.workerId);
- game.players[game.currentPlayer-1].gameTable.addSet(workerObj, true);
- game.currentTurn.pushAction("getWorker", args); //ajoute dans l'action dans l'historique des actions
- }
- }
- executeGetBuilding(game, args) {
- if (this.verifGetBuilding(game, args)) {
- let buildingObj = game.decks[0].getCardById(args.buildingId);
- game.decks[0].removeCard(args.buildingId);
- game.players[game.currentPlayer - 1].gameTable.addSet(buildingObj, true);
- game.currentTurn.pushAction("getBuilding", args);
- }
- }
- executeGetGold(game, args) {
- if (this.verifGetGold(game, args)) {
- // args.amount [Amount] : Le nombre d'action depensé pour l'action
- // Combien de gold a ajouter :
- let amountToAdd = 0;
- if (args.amount === 1) {
- amountToAdd = 1;
- }
- else if (args.amount === 2) {
- amountToAdd = 3;
- }
- else {
- amountToAdd = 6;
- }
- // Joueur courant
- let player = game.players[game.currentPlayer - 1];
- // Son nombre de gold
- let currentGoldAmount = player.inventory.find(item => item.ecus !== undefined).ecus;
- // Ajout du nombre de gold
- player.inventory.find(item => item.ecus !== undefined).ecus = currentGoldAmount + amountToAdd;
- // Enlever le nombre d'action correspondant
- game.currentTurn.nbrActions = game.currentTurn.nbrActions - args.amount;
- game.currentTurn.pushAction("getGold", args);
- }
- }
- executePutWorker(game, args) {
- if (this.verifPutWorker(game, args)) {
- let countWorkerOnSameBuilding = 0;
- let player = game.players[game.currentPlayer - 1];
- let workerCard = player.gameTable.getCardById(args.workerId);
- let completedWorkerCard = game.cardsGame.getCardById(workerCard.id);
- // Si il a la propriete salaire ( ex: machine ne l'a pas )
- if (completedWorkerCard.hasOwnProperty("salaire")) {
- player.inventory.find(item => item.ecus !== undefined).ecus -= game.cardsGame.getCardById(completedWorkerCard.id).salaire;
- }
- player.gameTable.removeSet(workerCard.id);
- player.gameTable.addCardToSet(args.buildingId, workerCard); //ajoute une carte ouvrière au même set que l'identifiant du batiment
- this.checkBuildindFinished(game, args.buildingId);
- game.currentTurn.actions.forEach(function (action) { //je parcours toutes les actions du tour actuel du joueur courant
- if (action.args.buildingId === args.buildingId) {
- countWorkerOnSameBuilding++; //incrémente s'il y a le batiment donné en paramètre
- }
- });
- if (countWorkerOnSameBuilding === 0) { //le cas où on a pas encore affecté d'ouvriers sur le batiment ce tour ci
- game.currentTurn.nbrActions -= 1;
- } else if (countWorkerOnSameBuilding === 1) { //le cas où on a déjà affecté un ouvrier sur le batiment ce tour ci
- game.currentTurn.nbrActions -= 2;
- } else if (countWorkerOnSameBuilding === 2) { //le cas où on a déjà affecté deux ouvriers sur le batiment ce tour ci
- game.currentTurn.nbrActions -= 3;
- }
- game.currentTurn.pushAction("putWorker", args);
- }
- }
- executeBuyAction(game, args) {
- if (this.verifBuyAction(game, args)) {
- let player = game.players[game.currentPlayer - 1];
- game.currentTurn.addNbrActions(1);
- player.inventory.find(item => item.ecus !== undefined).ecus -= 5;
- game.currentTurn.pushAction("buyAction", args);
- }
- }
- /**
- * Vérifie toutes les ressources nécessaires pour terminer le chantier sont disponibles et dans ce cas transforme le chantier en bâtiment
- * @param {Game} game Partie en cours
- * @param {string} buildingId Identifiant d'un chantier sur lequel un ouvrier vient d'être affecté
- */
- checkBuildindFinished(game, buildingId){
- let id = buildingId;
- // Tout a 0 par default
- let bois = 0, pierre = 0, savoir = 0, tuile = 0;
- let player = game.players[game.currentPlayer - 1];
- var buildingCard = game.cardsGame.getCardById(buildingId);
- // Attribution des composants requis
- if (buildingCard.bois != null) {bois = buildingCard.bois;} //laisser != car vérifie juste la valeur, pas le type!
- if (buildingCard.pierre != null) {pierre = buildingCard.pierre;}
- if (buildingCard.savoir != null) {savoir = buildingCard.savoir;}
- if (buildingCard.tuile != null) {tuile = buildingCard.tuile;}
- // Pour chaque carte du tas qui n'est pas un batiment,
- // On soustrait les atributs selons les specs des ouvriers
- let heap = game.players[game.currentPlayer-1].gameTable.getHeap(id);
- heap.forEach((card) => {
- if (card.id !== buildingCard.id && card.famille === "ouvrier" || card.famille === "machine") {
- let completeCard = game.cardsGame.getCardById(card.id);
- if (card.famille === "machine") {
- if (completeCard.production.hasOwnProperty("pierre")) {pierre -= completeCard.production.pierre;}
- if (completeCard.production.hasOwnProperty("bois")) {bois -= completeCard.production.bois;}
- if (completeCard.production.hasOwnProperty("savoir")) {savoir -= completeCard.production.savoir;}
- if (completeCard.production.hasOwnProperty("tuile")) {tuile -= completeCard.production.tuile;}
- }
- else { // Cas où c'est un ouvrier
- if (completeCard.hasOwnProperty("bois")) {
- bois -= completeCard.bois;
- }
- if (completeCard.hasOwnProperty("pierre")) {
- pierre -= completeCard.pierre;
- }
- if (completeCard.hasOwnProperty("savoir")) {
- savoir -= completeCard.savoir;
- }
- if (completeCard.hasOwnProperty("tuile")) {
- tuile -= completeCard.tuile;
- }
- }
- }
- });
- // Si le batiment est terminé ( assez de ressources dans le set du gametable )
- if (bois <= 0 && tuile <= 0 && savoir <= 0 && pierre <= 0) { // Le batiment est fini
- // payer le joueur de la valeur du batiment
- var currentPlayer = game.players[game.currentPlayer-1];
- let currentGoldAmount = currentPlayer.inventory.find(item => item.ecus !== undefined).ecus;
- if (buildingCard.hasOwnProperty("gains")) {
- currentPlayer.inventory.find(item => item.ecus !== undefined).ecus = currentGoldAmount + buildingCard.gains;
- }
- // enlever le set en question
- currentPlayer.gameTable.removeSet(buildingId);
- heap.forEach((card) => {
- if (card.famille === "ouvrier") {
- currentPlayer.gameTable.addSet(card, true);
- }
- else { // batiment/machine
- let completeCard = game.cardsGame.getCardById(card.id);
- if (card.id === buildingCard.id) {
- currentPlayer.score = currentPlayer.score + completeCard.pv;
- }
- currentPlayer.gameTable.addSet(card, false); // face caché car fini
- }
- });
- }
- }
- /**
- * Effectue les opérations nécessaires après qu'une action ai été effectuée dont la vérification si la partie est terminée
- * @param {Game} game Partie en cours
- * @param {string} actionName Nom de l'action à vérifier
- * @param {Object} args Paramètres facultatifs de l'action à effectuer
- * @returns {boolean} true si action autorisée, false sinon
- */
- afterAction(game, actionName, args) {
- this.checkIsFinished(game); // La game est finie si oui=> TODO mettre fin a la game
- }
- /**
- * Vérifie les conditions de fin de partie sont respectées
- * @param {Game} game Partie en cours
- * @returns {boolean} true si jeu doit être terminé, false sinon
- */
- checkIsFinished(game) {
- if (game.players.some(player => player.score > 16) && game.currentPlayer === game.players.length) {
- game.isFinished = true;
- return true;
- }
- }
- /**
- * Classement des joueurs triés selon leur score final
- * @param {Game} game Partie en cours
- * @returns {Object[]} Tableau d'objets {user: User, pv: number, ecus: number, score: number} où score = pv + (1pv par tranche de 10 écus)
- */
- getRanking(game) {
- let result = [];
- let sortedTab = game.players.sort(function (a, b) {
- return this.sortScore(a,b);
- });
- sortedTab.forEach((player) => {
- let nbPvPerTenEcus = Math.round(player.inventory.find(item => item.ecus !== undefined).ecus / 10);
- result.push({user:player.user, pv:player.score, ecus:player.inventory.find(item => item.ecus !== undefined).ecus, score:player.score + nbPvPerTenEcus});
- });
- return result;
- }
- /**
- * Compare deux joueurs selon leur score final
- * @param {Player} playerA Joueur A
- * @param {Player} playerB Joueur B
- * @returns {number} 1 si score final de A > B, 0 si scores finaux égaux, -1 si score final de B > A
- */
- sortScore(playerA, playerB) {
- let a = playerA.score;
- let b = playerB.score;
- let result = 0;
- if(a === b){
- a = playerA.pv;
- b = playerB.pv;
- if (a === b) {
- a = playerA.ecus;
- b = playerB.ecus;
- }
- }
- return a - b;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement