Begin work on the Game class
This commit is contained in:
parent
1edd3a042e
commit
baf74969b4
1 changed files with 81 additions and 0 deletions
81
server/src/objects/Game.ts
Normal file
81
server/src/objects/Game.ts
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
import { determineDirection, FuelCard } from "common";
|
||||
import { promises as fs } from "fs";
|
||||
import { v4 as uuid } from "uuid";
|
||||
import { Player } from "./Player";
|
||||
import { Logger } from "tslog";
|
||||
import { Deck } from "./Deck";
|
||||
import { log } from "../main";
|
||||
import path from "path";
|
||||
|
||||
export class Game {
|
||||
readonly id: string;
|
||||
readonly host: Player;
|
||||
|
||||
private log: Logger;
|
||||
private _deck: Deck<FuelCard>;
|
||||
|
||||
private board: (Player|null)[];
|
||||
private _players: Player[];
|
||||
|
||||
|
||||
constructor(host: Player) {
|
||||
|
||||
// Setup the board
|
||||
this.board = new Array(55).fill(null);
|
||||
this.board[26] = null;
|
||||
this.board[36] = null;
|
||||
|
||||
// Init the player data
|
||||
this.host = host;
|
||||
this._players = [ host ];
|
||||
|
||||
// Instantiate the deck
|
||||
this.loadDeck();
|
||||
|
||||
this.id = uuid();
|
||||
|
||||
this.log = log.getChildLogger({
|
||||
name: this.id,
|
||||
displayLoggerName: true,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Loads the deck from the data file which contains an array of card
|
||||
* definitions.
|
||||
*/
|
||||
private async loadDeck() {
|
||||
let cards = JSON.parse(
|
||||
await fs.readFile(
|
||||
path.join(process.cwd(), "cards.json"),
|
||||
`utf-8`
|
||||
)
|
||||
);
|
||||
this._deck = new Deck(cards);
|
||||
};
|
||||
|
||||
|
||||
/** The deck of the fuel cards */
|
||||
get deck() { return this._deck; };
|
||||
|
||||
/** The players in the game */
|
||||
get players() { return this._players };
|
||||
|
||||
/**
|
||||
* The algorithm to determine which direction the closest ship is, this
|
||||
* uses an integer that can be multiplied by the player's fuel card
|
||||
* magnitude in order to determine the delta for the board index.
|
||||
*
|
||||
* ---
|
||||
*
|
||||
* Possible Return Values:
|
||||
* - `-1` = Away from the Warp Gate
|
||||
* - `0` = Not moving
|
||||
* - `1` = Towards the Warp Gate
|
||||
*/
|
||||
public movementDirection(player: Player): number {
|
||||
let location = this.board.indexOf(player);
|
||||
this.log.debug(`Calculating movement direction for ${player.name}`);
|
||||
return determineDirection(this.board, location);
|
||||
};
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue