From 34eb19e340c7f7224523f2fe93fed1124938f510 Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Sun, 9 Jan 2022 01:02:57 -0600 Subject: [PATCH] Add the Deck object made for Phantom-Ink-Online --- server/src/objects/Deck.ts | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 server/src/objects/Deck.ts diff --git a/server/src/objects/Deck.ts b/server/src/objects/Deck.ts new file mode 100644 index 0000000..ee1429b --- /dev/null +++ b/server/src/objects/Deck.ts @@ -0,0 +1,66 @@ +export class Deck { + private _discard: T[]; + private _unknown: T[]; + private _deck: T[]; + + + constructor(cards: T[]) { + this._deck = cards; + this._discard = []; + this._unknown = []; + }; + + + get size(): number { return this._deck.length; } + + + /** + * Draws X cards from the deck + * + * @param quantity The number of cards to draw + * @throws Error If quantity is <= 0 + * @throws Error If quantity > size + */ + public draw(quantity: number): T[] { + if (quantity <= 0) { + throw new Error(`Cannot get ${quantity} cards.`); + } else if (quantity > this.size) { + throw new Error(`Cannot draw more cards than there are in the deck.`); + }; + + let cards: T[] = []; + + // Draw the cards for the player and move them into the unknown group + for (var i = 0; i < quantity; i++) { + + // Determine the card for the player(s) + let index = Math.floor(Math.random() * this.size); + let card = this._deck[index]; + + // Move it from the arrays + cards.push(card); + this._deck.splice(index, 1); + this._unknown.push(card); + }; + + return cards; + }; + + + /** + * Adds the specific card to the discard pile + * + * @param card The card to add to the discard pile + */ + public discard(card: T) { + this._unknown = this._unknown.filter(x => x != card); + this._discard.push(card); + }; + + + public reset() { + this._deck.push(...this._discard, ...this._unknown); + this._discard = []; + this._unknown = []; + }; +}; \ No newline at end of file