You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.0 KiB
145 lines
4.0 KiB
//Klasse Player für Spieler einer Uno Runde
|
|
import {CARD_COLORS} from "./uno.js";
|
|
|
|
export default class Player {
|
|
|
|
//Erstellt ein Spieler mit einem Namen und dem Spiel, in dem er teilnimmt
|
|
constructor(name, gameInstanz) {
|
|
|
|
this._game = gameInstanz; //Spiel, worin der Spieler ist
|
|
this._name = name; //Name des Spielers
|
|
this._turn = false; //Ob Spieler gerade am Zug
|
|
this._hand = []; //Deck des Spielers
|
|
this._canPlay = false //Ob spieler gerade Karte legen kann
|
|
this._mustSayUno = false;
|
|
|
|
}
|
|
|
|
//Lässt den Spieler eine Anzahl "amount" an Karten ziehen
|
|
drawCard(amount, nextTurn, anim) {
|
|
if (this.game.stack !== 0) {
|
|
if (!this.game.currentPlayerInstanz.mustSayUno) {
|
|
let cards = this.game.stack;
|
|
this.game.stack = 0;
|
|
if (this.game.cardOnDeck.name === '+4') this.drawCard(cards, true, true); else this.drawCard(cards, false, true);
|
|
return;
|
|
}
|
|
}
|
|
|
|
//Ziehe so viele Karten, wie amount übergeben wurde
|
|
for (let i = 0; i < amount; i++) {
|
|
|
|
if (anim) {
|
|
|
|
setTimeout(() => {
|
|
//Füge die erste Karte aus cardPool der Hand des Spielers hinzu
|
|
this.hand.push(this.game.cardPool[0]);
|
|
//Lösche die erste Karte aus cardPool
|
|
this.game.cardPool.splice(0, 1);
|
|
|
|
|
|
this.game.style.showPlayerDeck(this, false, true, false);
|
|
}, 200 + 500 * (i));
|
|
} else {
|
|
//Füge die erste Karte aus cardPool der Hand des Spielers hinzu
|
|
this.hand.push(this.game.cardPool[0]);
|
|
//Lösche die erste Karte aus cardPool
|
|
this.game.cardPool.splice(0, 1);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
setTimeout(() => {
|
|
this.game.refreshCanPutCard();
|
|
this.game.style.showPlayerDeck(this.game.currentPlayerInstanz, true, false, false);
|
|
if (nextTurn) {
|
|
this.game.nextTurn();
|
|
}
|
|
}, 300 + 500 * amount);
|
|
|
|
|
|
}
|
|
|
|
//Lässt den Spieler eine Karte in seiner Hand legen
|
|
//Parameter: Index vom Deck des Spielers, wo die Karte liegt
|
|
putCard(index) {
|
|
//Karte muss hinterlegt haben, dass sie gelegt werden kann
|
|
if (!this.turn) return;
|
|
if (!this.hand[index].canPut) return;
|
|
if (this.turn === false) return;
|
|
|
|
|
|
//Wenn eine Karte auf dem Tisch liegt
|
|
if (this.game.cardOnDeck != null) {
|
|
|
|
//Wenn eine "NONE" Color Karte gelegt wurde, resette die Farbe auf "NONE"
|
|
if (this.game.cardOnDeck.name === "CC" || this._game.cardOnDeck.name === "+4") this.game.cardOnDeck.color = CARD_COLORS[0];
|
|
|
|
//Füge die Karte dem Pool wieder hinzu
|
|
this.game.cardPool.push(this._game.cardOnDeck);
|
|
}
|
|
|
|
//Karte in der Hand wird auf den Tisch gelegt
|
|
this.game.cardOnDeck = this._hand[index];
|
|
|
|
//Karte wird aus dem Deck des Spielers entfernt
|
|
this.hand.splice(index, 1);
|
|
|
|
//führe Funktion der Karte aus
|
|
this.game.cardOnDeck.putSelf();
|
|
|
|
}
|
|
|
|
sayUno() {
|
|
this._mustSayUno = false;
|
|
}
|
|
|
|
selectColor(CARD_COLOR) {
|
|
|
|
//Todo: Spieler Möglichkeit geben Farbe zu wählen, nicht random
|
|
return CARD_COLOR;
|
|
}
|
|
|
|
//Gibt den Namen eines Spielers zurück
|
|
get name() {
|
|
return this._name;
|
|
}
|
|
|
|
//Gibt zurück, ob der Spieler am Zug ist
|
|
get turn() {
|
|
return this._turn;
|
|
}
|
|
|
|
//Setzt, dass der Spieler gerade am Zug ist oder nicht
|
|
set turn(bool) {
|
|
this._turn = bool;
|
|
}
|
|
|
|
//Gibt zurück, ob der Spieler eine Karte legen kann
|
|
get canPlay() {
|
|
return this._canPlay;
|
|
}
|
|
|
|
set canPlay(bool) {
|
|
this._canPlay = bool;
|
|
}
|
|
|
|
//Gibt das SpielerDeck zurück
|
|
get hand() {
|
|
return this._hand;
|
|
}
|
|
|
|
get game() {
|
|
return this._game;
|
|
}
|
|
|
|
get mustSayUno() {
|
|
return this._mustSayUno;
|
|
}
|
|
|
|
set mustSayUno(bool) {
|
|
this._mustSayUno = bool;
|
|
}
|
|
}
|