const app = express();
-const players = [];
+class Game {
+ constructor() {
+ this._players = [];
+ this.next_player_id = 1;
+ }
+
+ add_player(name, character) {
+ this._players.push({id: this.next_player_id,
+ name: name,
+ character: character,
+ captures: [],
+ })
+ this.next_player_id++;
+ }
+
+ remove_player(id) {
+ const index = this._players.findIndex(player => player.id === id);
+ this._players.splice(index, 1);
+ }
+
+ remove_all_players() {
+ this._players = [];
+ this.next_player_id = 1;
+ }
+
+ capture(captor_id, captee_id) {
+ /* TODO: Fix to fail on already-captured players (or to move the
+ * captured player from an old captor to a new—need to clarify in
+ * the API specification which we want here. */
+ let captor = this._players.find(player => player.id === captor_id);
+ captor.captures.push(captee_id);
+ }
+
+ liberate(captee_id) {
+ let captor = this._players.find(player => player.captures.includes(captee_id));
+ captor.captures.splice(captor.captures.indexOf(captee_id), 1);
+ }
+
+ restart() {
+ for (const player of this._players) {
+ player.captures = [];
+ }
+ }
+
+ get characters() {
+ return this._players.map(player => player.character);
+ }
+
+ get empires() {
+ return this._players.map(player => ({id: player.id, captures: player.captures}));
+ }
+
+ get players() {
+ return this._players.map(player => ({id: player.id, name: player.name }));
+ }
+}
+
+game = new Game();
app.use(body_parser.urlencoded({ extended: false }));
app.use(body_parser.json());
-app.get('/', function (requses, response) {
+app.get('/', (request, response) => {
response.send('Hello World!');
});
-app.get('/players', function (request, response) {
- response.send(players);
+app.post('/register', (request, response) => {
+ game.add_player(request.body.name, request.body.character);
+ response.send();
});
+app.post('/deregister/:id', (request, response) => {
+ game.remove_player(parseInt(request.params.id));
+ response.send();
+});
-app.post('/register', function (request, response) {
- players.push({name: request.body.name,
- character: request.body.character});
+app.post('/reset', (request, response) => {
+ game.remove_all_players();
response.send();
});
+app.post('/capture/:captor/:captee', (request, response) => {
+ game.capture(parseInt(request.params.captor), parseInt(request.params.captee));
+ response.send();
+});
+
+app.post('/liberate/:id', (request, response) => {
+ game.liberate(parseInt(request.params.id));
+ response.send();
+});
+
+app.post('/restart', (request, response) => {
+ game.restart(parseInt(request.params.id));
+ response.send();
+});
+
+app.get('/characters', (request, response) => {
+ response.send(game.characters);
+});
+
+app.get('/empires', (request, response) => {
+ response.send(game.empires);
+});
+
+app.get('/players', (request, response) => {
+ response.send(game.players);
+});
+
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});