396 lines
13 KiB
JavaScript
396 lines
13 KiB
JavaScript
function coin(value, group) {
|
|
this.value = value;
|
|
this.group = group;
|
|
}
|
|
|
|
function Bonus(group, value) {
|
|
this.value = value;
|
|
this.group = group;
|
|
}
|
|
|
|
function player(name, id) {
|
|
this.score = 0;
|
|
this.roundsWon = 0;
|
|
this.coins = [];
|
|
this.bonus = [];
|
|
this.name = name;
|
|
this.id = id;
|
|
this.selector = '.player.player' + id;
|
|
|
|
this.hasCamelCoin = false;
|
|
|
|
this.calculateScore = function () {
|
|
var score = 0;
|
|
for (var i in this.coins) {
|
|
score += this.coins[i];
|
|
}
|
|
for (var i in this.bonus) {
|
|
score += this.bonus[i].value;
|
|
}
|
|
|
|
if (this.hasCamelCoin) {
|
|
score += 5;
|
|
}
|
|
return this.score = score;
|
|
};
|
|
|
|
this.wonRound = function () {
|
|
this.roundsWon += 1;
|
|
};
|
|
|
|
this.reset = function () {
|
|
this.roundsWon = 0;
|
|
this.score = 0;
|
|
this.coins = [];
|
|
};
|
|
|
|
this.removePoints = function () {
|
|
var playerScore = document.querySelectorAll(this.selector + ' .score');
|
|
for (var i = 0; i < playerScore.length; i++) {
|
|
playerScore[i].remove();
|
|
}
|
|
};
|
|
|
|
|
|
this.drawPoints = function () {
|
|
this.removePoints();
|
|
var scoreDiv = document.querySelector(this.selector);
|
|
for (var i = 0; i < this.score; i++) {
|
|
var score = document.createElement("span");
|
|
score.classList.add('score');
|
|
scoreDiv.appendChild(score)
|
|
}
|
|
};
|
|
|
|
this.addPoint = function () {
|
|
this.score++;
|
|
this.drawPoints();
|
|
}
|
|
}
|
|
|
|
function game(player1, player2, board) {
|
|
this.round = 1;
|
|
this.player1 = player1;
|
|
this.player2 = player2;
|
|
this.activePlayer = null;
|
|
this.board = board;
|
|
this.isOver = false;
|
|
this.selectedCointType = false;
|
|
|
|
this.setActivePlayer = function (playerId) {
|
|
if (playerId == 1) {
|
|
jaipur.activePlayer = this.player1;
|
|
document.querySelector('.player.player1').classList.add("selected");
|
|
document.querySelector('.player.player2').classList.remove("selected");
|
|
jaipur.showAcceptButton();
|
|
} else if (playerId == 2) {
|
|
jaipur.activePlayer = this.player2;
|
|
document.querySelector('.player.player1').classList.remove("selected");
|
|
document.querySelector('.player.player2').classList.add("selected");
|
|
jaipur.showAcceptButton();
|
|
} else {
|
|
document.querySelector('.player.player1').classList.remove("selected");
|
|
document.querySelector('.player.player2').classList.remove("selected");
|
|
jaipur.activePlayer = false;
|
|
}
|
|
|
|
return this.activePlayer;
|
|
};
|
|
|
|
this.init = function () {
|
|
this.initializePlayerButtons();
|
|
this.initializeAcceptButton();
|
|
this.initializeCoins();
|
|
this.initializeCamels();
|
|
};
|
|
|
|
this.reset = function () {
|
|
this.player1.reset();
|
|
this.player2.reset();
|
|
this.isOver = false;
|
|
};
|
|
|
|
/**
|
|
* sprawdza czy runda jest już zakończona (jest 3 lub mniej typów dóbr)
|
|
* @returns {boolean}
|
|
*/
|
|
this.isRoundOver = function () {
|
|
var emptyRows = 0;
|
|
for (var i in board.goods) {
|
|
emptyRows += !board.goods[i].length ? 1 : 0;
|
|
}
|
|
return emptyRows >= 3;
|
|
};
|
|
|
|
this.initializePlayerButtons = function () {
|
|
document.querySelector('.player.player1').addEventListener('click', function () {
|
|
jaipur.setActivePlayer(1)
|
|
});
|
|
document.querySelector('.player.player2').addEventListener('click', function () {
|
|
jaipur.setActivePlayer(2)
|
|
});
|
|
};
|
|
|
|
//pokazuje ikonkę bonusowej monety przy przycisku przydziel
|
|
this.showBonusCoins = function () {
|
|
var selectedCoins = document.querySelectorAll('.coin.selected').length;
|
|
jaipur.hideBonusCoins();
|
|
if (selectedCoins >= 5 && !!jaipur.board.bonus.five.length) {
|
|
document.querySelector('.bonus5').style.display = 'block';
|
|
return;
|
|
}
|
|
if (selectedCoins == 4 && !!jaipur.board.bonus.four.length) {
|
|
document.querySelector('.bonus4').style.display = 'block';
|
|
return;
|
|
}
|
|
if (selectedCoins == 3 && !!jaipur.board.bonus.three.length) {
|
|
document.querySelector('.bonus3').style.display = 'block';
|
|
return;
|
|
}
|
|
|
|
};
|
|
|
|
this.showAcceptButton = function () {
|
|
|
|
if (!!jaipur.activePlayer && !!document.querySelector('.coin.selected') &&
|
|
((document.querySelectorAll('.coin.selected').length >= 2 &&
|
|
['silver', 'gold', 'diamond'].indexOf(jaipur.selectedCointType) > -1
|
|
) || (
|
|
document.querySelectorAll('.coin.selected').length >= 1 &&
|
|
['fabric', 'spice', 'leather'].indexOf(jaipur.selectedCointType) > -1
|
|
)
|
|
)
|
|
) {
|
|
document.querySelector('.accept').style.visibility = 'visible';
|
|
}
|
|
};
|
|
|
|
this.hideAcceptButton = function () {
|
|
document.querySelector('.accept').style.visibility = 'hidden';
|
|
jaipur.hideBonusCoins();
|
|
};
|
|
|
|
this.hideBonusCoins = function () {
|
|
document.querySelector('.bonus5').style.display = 'none';
|
|
document.querySelector('.bonus4').style.display = 'none';
|
|
document.querySelector('.bonus3').style.display = 'none';
|
|
};
|
|
|
|
|
|
this.camelClick = function (player) {
|
|
document.querySelector('.nobody').classList.remove('selected');
|
|
document.querySelector('.player1_camel').classList.remove('selected');
|
|
document.querySelector('.player2_camel').classList.remove('selected');
|
|
|
|
if (player == 1) {
|
|
document.querySelector('.player1_camel').classList.add('selected');
|
|
jaipur.player1.hasCamelCoin = true;
|
|
jaipur.player2.hasCamelCoin = false;
|
|
} else if (player == 2) {
|
|
document.querySelector('.player2_camel').classList.add('selected');
|
|
jaipur.player1.hasCamelCoin = false;
|
|
jaipur.player2.hasCamelCoin = true;
|
|
} else if (player == 0) {
|
|
document.querySelector('.nobody').classList.add('selected');
|
|
jaipur.player1.hasCamelCoin = false;
|
|
jaipur.player2.hasCamelCoin = false;
|
|
|
|
}
|
|
jaipur.player1.calculateScore();
|
|
jaipur.player2.calculateScore();
|
|
jaipur.showScore();
|
|
jaipur.showBonus();
|
|
};
|
|
|
|
this.showBonus = function () {
|
|
document.querySelector('.bonus_section').classList.add('show');
|
|
};
|
|
|
|
|
|
this.coinClick = function () {
|
|
|
|
if (!jaipur.selectedCointType) {
|
|
jaipur.selectedCointType = this.dataset.group;
|
|
}
|
|
|
|
|
|
if (jaipur.selectedCointType == this.dataset.group) {
|
|
|
|
//ustawienie active inactive na wszystkich grupach
|
|
var groups = document.querySelectorAll('.group');
|
|
for (var i = 0; i < groups.length; i++) {
|
|
groups[i].classList.add('inactive');
|
|
}
|
|
|
|
//usuniecie inactive na tej jednej klikniętej grupie
|
|
this.selectedCointType = this.dataset.group;
|
|
document.querySelector('.group.' + this.dataset.group).classList.remove('inactive');
|
|
|
|
if (this.classList.contains('selected')) {
|
|
//wyłaczenie selected na ostatniej wybranym żetonie
|
|
document.querySelector('.coin.selected.' + this.dataset.group).classList.remove('selected');
|
|
|
|
|
|
//usunięcie przycisku przydziel jeśli zdejmujemy żetony i jest ich mniej wybranych niż dwa
|
|
//w przypadku złota, srebra czy diamentów
|
|
if ((document.querySelectorAll('.coin.selected').length < 2 &&
|
|
['silver', 'gold', 'diamond'].indexOf(jaipur.selectedCointType) > -1 )) {
|
|
jaipur.hideAcceptButton();
|
|
}
|
|
|
|
//usunięcie blokady wybranego typu żetonu
|
|
if (document.querySelectorAll('.coin.selected.' + this.dataset.group).length == 0) {
|
|
jaipur.selectedCointType = false;
|
|
for (var i = 0; i < groups.length; i++) {
|
|
groups[i].classList.remove('inactive');
|
|
}
|
|
jaipur.hideAcceptButton();
|
|
}
|
|
jaipur.removeBlankCoin(jaipur.selectedCointType);
|
|
|
|
} else {
|
|
//jesli jest już wybranych 7 lub więcej monet to nie można więcej bo to max
|
|
if (document.querySelectorAll('.coin.selected.' + jaipur.selectedCointType).length >= 7) {
|
|
return false;
|
|
}
|
|
//ustawienie selected na elemencie z kliniętej grupy
|
|
var coinsFromRow = document.querySelectorAll('.coin.' + this.dataset.group + ':not(.selected)');
|
|
[].slice.call(coinsFromRow).pop().classList.add('selected');
|
|
jaipur.showAcceptButton();
|
|
|
|
|
|
//dodanie monety o wartości zero jeśli wybrano wszystkie monety z danej grupy
|
|
if (!!document.querySelectorAll('.coin.' + this.selectedCointType + ':not(.selected)').length == 0) {
|
|
jaipur.addBlankCoin(this.selectedCointType);
|
|
}
|
|
}
|
|
jaipur.showBonusCoins();
|
|
}
|
|
|
|
|
|
};
|
|
|
|
this.addBlankCoin = function (groupName) {
|
|
var blankCoin = document.createElement('span');
|
|
blankCoin.classList.add('coin');
|
|
blankCoin.classList.add(groupName);
|
|
blankCoin.classList.add('blank');
|
|
blankCoin.innerText = '0';
|
|
blankCoin.dataset.group = groupName;
|
|
blankCoin.addEventListener('click', jaipur.coinClick);
|
|
var firstElementInGroup = document.querySelector('.coin.' + groupName);
|
|
document.querySelector('.group.' + groupName).insertBefore(blankCoin, firstElementInGroup);
|
|
};
|
|
|
|
this.removeBlankCoin = function (groupName) {
|
|
if (!!document.querySelector('.coin.blank.' + groupName))
|
|
document.querySelector('.coin.blank.' + groupName).remove();
|
|
};
|
|
|
|
this.showScoreBoard = function () {
|
|
|
|
document.querySelector('.scoreTable').classList.add('visible');
|
|
|
|
|
|
};
|
|
|
|
this.showScore = function () {
|
|
document.querySelector('.player1_score').innerText = jaipur.player1.calculateScore();
|
|
document.querySelector('.player2_score').innerText = jaipur.player2.calculateScore();
|
|
document.querySelector('.score_section').classList.add('show');
|
|
};
|
|
|
|
this.initializeAcceptButton = function () {
|
|
document.querySelector('.accept').addEventListener('click', this.clickAcceptButton)
|
|
};
|
|
|
|
|
|
this.clickAcceptButton = function () {
|
|
|
|
var coins = document.querySelectorAll('.coin.selected');
|
|
|
|
for (var i = 0; i < coins.length; i++) {
|
|
var group = coins[i].dataset.group;
|
|
jaipur.board.goods[group].pop();
|
|
|
|
jaipur.activePlayer.coins.push(parseInt(coins[i].innerText));
|
|
coins[i].remove();
|
|
}
|
|
//przydzielanie bonusu
|
|
var bonus = false;
|
|
if (coins.length == 3) {
|
|
var bonusGroup = 'three';
|
|
bonus = new Bonus(3, jaipur.board.bonus.three.pop()); //{3: jaipur.board.bonus.three.pop()};
|
|
|
|
} else if (coins.length == 4) {
|
|
var bonusGroup = 'four';
|
|
bonus = new Bonus(4, jaipur.board.bonus.four.pop()); //{3: jaipur.board.bonus.three.pop()};
|
|
// bonus = {4: jaipur.board.bonus.four.pop()};
|
|
} else if (coins.length >= 5) {
|
|
var bonusGroup = 'five';
|
|
bonus = new Bonus(5, jaipur.board.bonus.five.pop()); //{3: jaipur.board.bonus.three.pop()};
|
|
// bonus = {5: jaipur.board.bonus.five.pop()};
|
|
}
|
|
|
|
if (!!bonus) {
|
|
jaipur.activePlayer.bonus.push(bonus);
|
|
}
|
|
|
|
|
|
var groups = document.querySelectorAll('.group');
|
|
jaipur.selectedCointType = false;
|
|
for (var i = 0; i < groups.length; i++) {
|
|
groups[i].classList.remove('inactive');
|
|
}
|
|
jaipur.hideAcceptButton();
|
|
jaipur.setActivePlayer(false);
|
|
if (jaipur.isRoundOver()) {
|
|
jaipur.showScoreBoard();
|
|
jaipur.drawBonusCoins();
|
|
}
|
|
|
|
};
|
|
|
|
this.drawBonusCoins = function(){
|
|
for(var i in jaipur.player1.bonus){
|
|
var group = document.querySelector('.player1_bonus .bonus'+jaipur.player1.bonus[i].group);
|
|
var bonusCoin = document.createElement("span");
|
|
group.appendChild(bonusCoin);
|
|
}
|
|
|
|
|
|
for(var i in jaipur.player2.bonus){
|
|
var group = document.querySelector('.player2_bonus .bonus'+jaipur.player2.bonus[i].group);
|
|
var bonusCoin = document.createElement("span");
|
|
group.appendChild(bonusCoin);
|
|
}
|
|
};
|
|
|
|
|
|
this.initializeCamels = function () {
|
|
|
|
document.querySelector('.player1_camel').addEventListener('click', function () {
|
|
jaipur.camelClick(1);
|
|
});
|
|
document.querySelector('.player2_camel').addEventListener('click', function () {
|
|
jaipur.camelClick(2);
|
|
});
|
|
document.querySelector('.nobody').addEventListener('click', function () {
|
|
jaipur.camelClick(0);
|
|
});
|
|
|
|
|
|
};
|
|
|
|
this.initializeCoins = function () {
|
|
var coins = document.querySelectorAll('.coin');
|
|
for (var i = 0; i < coins.length; i++) {
|
|
coins[i].addEventListener('click', jaipur.coinClick);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|