diff --git a/src/utils/Board.ts b/src/utils/Board.ts index 0e52430..9db1ea5 100644 --- a/src/utils/Board.ts +++ b/src/utils/Board.ts @@ -1 +1,76 @@ -export class Board {} \ No newline at end of file +const fascist_abilities: {[index: string]: any} = { + "5": { + "3": ["ViewPolicies"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + }, + "6": { + "3": ["ViewPolicies"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + }, + "7": { + "2": ["InvestigateParty"], + "3": ["SpecialElection"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + }, + "8": { + "2": ["InvestigateParty"], + "3": ["SpecialElection"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + }, + "9": { + "1": ["InvestigateParty"], + "2": ["InvestigateParty"], + "3": ["SpecialElection"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + }, + "10": { + "1": ["InvestigateParty"], + "2": ["InvestigateParty"], + "3": ["SpecialElection"], + "4": ["Execution"], + "5": ["Execution", "VetoUnlock"] + } +}; + + +export class Board { + private _fascist: number; + private _liberal: number; + private _board: any; + + constructor(player_count: number) { + this._fascist = 0; + this._liberal = 0; + this._board = fascist_abilities[player_count.toString()]; + }; + + get fascist(): number { + return this._fascist; + }; + + get liberal(): number { + return this._liberal; + }; + + public add_policy(party: policy): void { + if (party == `fascist`) { + this._fascist++; + } else { + this._liberal++; + }; + }; + + public has_winner(): policy|"no" { + if (this._liberal == 5) { + return `liberal`; + } else if (this._fascist == 6) { + return `fascist`; + }; + return `no`; + }; +}; \ No newline at end of file diff --git a/src/utils/Game.ts b/src/utils/Game.ts index 6ca9fd8..1d648ab 100644 --- a/src/utils/Game.ts +++ b/src/utils/Game.ts @@ -1,3 +1,16 @@ +/* How many cards are in the deck */ +const DECK = { + total: 17, + fascist: 11, + liberal: 6, +} + +/* How many Fascists are in the game (excluding hitler) */ +const FASCIST_COUNTS: {[index: number]: number} = { + 5:1, 6:1, 7:2, 8:2, 9:3, 10:3 +}; + + export class Game { readonly code: string; public status: game_states; @@ -5,6 +18,8 @@ export class Game { private banned_players: string[]; private _players: players; + private deck: policy[] = []; + public constructor(code: string) { this.code = code; this._players = {}; @@ -56,11 +71,45 @@ export class Game { * @return The error that prevents the game from starting. */ if (this.player_len <= 4) { - return `Cannot start game with less than 4 players.`; + return `Cannot start game with less than 5 players.`; }; return ``; }; + public start(): void { + /** + * Starts the game, this assigns roles and populates the presidential + * queue. (randomly picks the first loop, then repeats that same + * iteration until the game ends) + */ + let players = Object.keys(this._players); + + let hitler = Math.floor(Math.random() * players.length); + this._players[players[hitler]].role = "hitler"; + players.splice(hitler, 1); + + // Assign fascists + for (var i = 0; i <= FASCIST_COUNTS[this.player_len]; i++) { + let player_index = Math.floor(Math.random() * players.length); + this._players[players[player_index]].role = `fascist`; + players.splice(player_index, 1); + }; + + // Everyone else is a liberal + for (var player of players) { + this._players[player].role = `liberal`; + }; + + // Create the deck for the game + for (var i = 0; i <= DECK.total; i++) { + if (i <= DECK.fascist) { + this.deck[i] = `fascist`; + } else { + this.deck[i] = `liberal`; + }; + }; + }; + public toString(): string { let player_count = Object.keys(this._players).length; return `Game(code=${this.code},players=${player_count})`;