From 3f9a91846f621883d0b46d2a210440ecd39a487a Mon Sep 17 00:00:00 2001 From: Lexan Smythe-Worthington Date: Wed, 4 Jul 2018 12:36:44 -0700 Subject: [PATCH 01/14] nuke max's old python code, put in the untracked changes i've been making, just an all around good time. --- __init__.py | 3 - ai/__init__.py | 14 - ai/max_ai.py | 10 - ai/simple.js | 26 - ai/simple.py | 52 -- app.js | 82 ++ datatypes.py | 67 -- game.py | 114 --- index.html | 39 + install.md | 33 - internal.py | 88 -- nohup.out | 6 + package-lock.json | 778 +++++++++++++++++- package.json | 25 +- play.py | 13 - .../socket.io.js => static/old_socket.io.js | 0 {web/static/js => static}/planetwars.js | 0 static/test.html | 16 + utils.py | 73 -- views.py | 116 --- web/templates/game.html => views/game.nunjs | 14 +- web/templates/index.html => views/index.nunjs | 2 + web/__init__.py | 0 web/server.py | 120 --- 24 files changed, 941 insertions(+), 750 deletions(-) delete mode 100644 __init__.py delete mode 100644 ai/__init__.py delete mode 100644 ai/max_ai.py delete mode 100644 ai/simple.js delete mode 100644 ai/simple.py create mode 100644 app.js delete mode 100644 datatypes.py delete mode 100644 game.py create mode 100644 index.html delete mode 100644 install.md delete mode 100644 internal.py create mode 100644 nohup.out delete mode 100644 play.py rename web/static/js/socket.io.js => static/old_socket.io.js (100%) rename {web/static/js => static}/planetwars.js (100%) create mode 100644 static/test.html delete mode 100644 utils.py delete mode 100644 views.py rename web/templates/game.html => views/game.nunjs (85%) rename web/templates/index.html => views/index.nunjs (97%) delete mode 100644 web/__init__.py delete mode 100644 web/server.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index fa5dbb7..0000000 --- a/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from planetwars.datatypes import Fleet, Planet, Order -from planetwars.game import PlanetWars -import planetwars.ai diff --git a/ai/__init__.py b/ai/__init__.py deleted file mode 100644 index 70bb65b..0000000 --- a/ai/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from planetwars import PlanetWars - -def planetwars_ai(name): - def planetwars_ai_decorator(f): - PlanetWars.ais[name] = f - return f - return planetwars_ai_decorator - -import planetwars.ai.simple - -try: - import planetwars.ai.elnaril -except SyntaxError: - pass diff --git a/ai/max_ai.py b/ai/max_ai.py deleted file mode 100644 index b0b39ea..0000000 --- a/ai/max_ai.py +++ /dev/null @@ -1,10 +0,0 @@ -from planetwars.datatypes import Order -from planetwars.ai import planetwars_ai -from planetwars.ai.utils import aggro_partition, get_ships - -@planetwars_ai -def max_ai(turn, pid, planets, fleets): - my_planets, their_planets, _ = aggro_partition(pid, planets) - my_strongest = max(my_planets, key=get_ships) - their_weakest = min(their_planets, key=get_ships) - return [Order(my_strongest, their_weakest, my_strongest.ships * 0.75)] diff --git a/ai/simple.js b/ai/simple.js deleted file mode 100644 index 2a3d7bd..0000000 --- a/ai/simple.js +++ /dev/null @@ -1,26 +0,0 @@ -const partition = require('lodash/partition'); - -const { Order } = require('../dataTypes'); -const { aggroPartition, getShips } = require('../utils'); -const { max, min, randomChoice } = require('../base'); - -class StrongToWeak { - play(turn, player, planets, fleets) { - let [myPlanets, theirPlanets] = aggroPartition(player, planets); - let myStrongest = max(myPlanets, getShips); - let theirWeakest = min(theirPlanets, getShips); - return [new Order(myStrongest, theirWeakest, myStrongest.ships * 0.75)]; - } -} - -class Random { - play(turn, player, planets, fleets) { - let mine = (thing) => thing.owner === player; - let [myPlanets, otherPlanets] = partition(planets, mine); - let source = randomChoice(myPlanets); - let dest = randomChoice(otherPlanets); - return [new Order(source, dest, source.ships / 2)]; - } -} - -module.exports = { Random, StrongToWeak }; diff --git a/ai/simple.py b/ai/simple.py deleted file mode 100644 index 172825b..0000000 --- a/ai/simple.py +++ /dev/null @@ -1,52 +0,0 @@ -import random - -from planetwars.ai import planetwars_ai -from planetwars.datatypes import Order -from planetwars.utils import * - -@planetwars_ai("StrongToWeak") -class StrongToWeak: - def play(self, turn, pid, planets, fleets): - my_planets, their_planets, _ = aggro_partition(pid, planets) - my_strongest = max(my_planets, key=get_ships) - their_weakest = min(their_planets, key=get_ships) - return [Order(my_strongest, their_weakest, my_strongest.ships * 0.75)] - -@planetwars_ai("AllToWeak") -class AllToWeak: - def play(self, turn, pid, planets, fleets): - my_planets, their_planets, _ = aggro_partition(pid, planets) - destination = min(their_planets, key=get_ships) - orders = [] - for planet in my_planets: - orders.append(Order(planet, destination, planet.ships * 0.75)) - return orders - -@planetwars_ai("AllToCloseOrWeak") -class AllToCloseOrWeak: - def play(self, turn, pid, planets, fleets): - my_planets, their_planets, neutral_planets = aggro_partition(pid, planets) - other_planets = their_planets + neutral_planets - their_weakest = min(their_planets, key=get_ships) - my_total = sum(map(get_ships, my_planets)) - destination = min(their_planets, key=get_ships) - orders = [] - for planet in my_planets: - if random.random() < 0.5: - def dist_to(other_planet): - return turn_dist(planet, other_planet) - closest = min(other_planets, key=dist_to) - orders.append(Order(planet, closest, planet.ships * 0.75)) - else: - orders.append(Order(planet, their_weakest, planet.ships * 0.75)) - return orders - -@planetwars_ai("Random") -class RandomAI: - def play(self, turn, pid, planets, fleets): - def mine(x): - return x.owner == pid - my_planets, other_planets = partition(mine, planets) - source = random.choice(my_planets) - destination = random.choice(other_planets) - return [Order(source, destination, source.ships / 2)] diff --git a/app.js b/app.js new file mode 100644 index 0000000..f6a0e65 --- /dev/null +++ b/app.js @@ -0,0 +1,82 @@ +var fs = require('fs'); +var bodyParser = require('body-parser') +const express = require('express') +const app = express() +app.set('views', __dirname + '/views'); +app.set('view engine', 'nunjs'); +app.use(bodyParser()) + + +var datatest = {players: ["alice", "bob"] ,planets: "foo, bar, baz", turnsPerSecond: "2",map: "map1"}; + +server = require('http').Server(app); +var io = require('socket.io')(server); + +const { PlanetWars } = require('./game'); +const { TextView } = require('./views'); + +let game = new PlanetWars(process.argv.slice(2), 'map1', 100); +game.addView(new TextView()); +game.play(); + + +games = ['foo', 'bar'] +app.get('/', function(req, res) { + res.render('index') +}) +app.get('/game/:gameID', function(req, res) { + if (games.includes(req.params.gameID)) { + res.render("game", { + gameID: req.params.gameID + }) + } else { + res.redirect('/') + } +}) +app.use("/static", express.static('static')) +app.post('/create-game', function(req, res) { + //res.send(req.params) + res.send(req.body) + + + +}) + +// ...elsewhere, in your app + + + + +var game_conn = io + .of('/game') + .on('connection', function (socket) { +//console.log(socket) +//}) +//game.on('join',function (socket){ +socket.emit('initialize',datatest) +}) + + + + + +function load_map(map_file) { + var planets = [] + var fleets = [] + var mapData + fs.readFile('./maps/' + map_file, function(err, data) { + mapData = data + }) + +} + +function init_game(players, map_name, turns_per_second) { + if (players.length() < 2) { + throw Error("not enough players") + } + var player_names = players + var turn = 0 + turn_duration = 1.0 / turns_per_second +} + +server.listen(4200, () => console.log('planetwars revamped listening on port 4200!')) diff --git a/datatypes.py b/datatypes.py deleted file mode 100644 index ed2ca80..0000000 --- a/datatypes.py +++ /dev/null @@ -1,67 +0,0 @@ -from math import ceil - -from collections import namedtuple - -from planetwars.utils import battle, turn_dist - -ImmutablePlanet = namedtuple("ImmutablePlanet", "id, x, y, owner, ships, growth") -ImmutableFleet = namedtuple("ImmutableFleet", "owner, ships, source, destination, total_turns, remaining_turns") -Order = namedtuple("Order", "source, destination, ships") - -class Planet: - - def __init__(self, id, x, y, owner, ships, growth): - self.id = id - self.x = x - self.y = y - self.owner = owner - self.ships = ships - self.growth = growth - - def freeze(self): - return ImmutablePlanet( - self.id, - self.x, - self.y, - self.owner, - int(self.ships), - self.growth) - - def generate_ships(self): - if self.owner > 0: # Neutral player doesn't gain ships. - self.ships += self.growth - - def battle(self, fleets): - self.owner, self.ships = battle(self, fleets) - -class Fleet: - - def __init__(self, owner, ships, source, destination, - total_turns=None, remaining_turns=None): - self.owner = owner - self.ships = ships - self.source = source - self.destination = destination - if total_turns is None: - self.total_turns = turn_dist(source, destination) - else: - self.total_turns = total_turns - if remaining_turns is None: - self.remaining_turns = self.total_turns - else: - self.remaining_turns = remaining_turns - - def freeze(self): - return ImmutableFleet( - self.owner, - self.ships, - self.source.id if isinstance(self.source, Planet) else self.source, - self.destination.id if isinstance(self.destination, Planet) else self.destination, - self.total_turns, - self.remaining_turns) - - def advance(self): - self.remaining_turns -= 1 - - def has_arrived(self): - return self.remaining_turns <= 0 diff --git a/game.py b/game.py deleted file mode 100644 index 8603c70..0000000 --- a/game.py +++ /dev/null @@ -1,114 +0,0 @@ -import time -from collections import defaultdict - -from planetwars import Fleet, Planet -from planetwars.internal import load_all_maps -from planetwars.utils import count_ships, partition - -class NeutralPlayer: - def play(self, turn, pid, planets, fleets): - return [] - -class PlanetWars: - - ais = {} - maps = load_all_maps() - - def __init__(self, players, map_name, turns_per_second=2): - if len(players) < 2: - raise Exception("A game requires at least two players.") - self.player_names = players - self.players = [NeutralPlayer()] + [PlanetWars.ais[player]() for player in players] - self.map_name = map_name - planets, fleets = PlanetWars.maps[map_name] - self.planets = [Planet(*planet) for planet in planets] - self.fleets = [Fleet(*fleet) for fleet in fleets] - self.views = [] - self.turns_per_second = turns_per_second - self.turn_duration = 1.0 / turns_per_second - self.turn = 0 - - def add_view(self, view): - self.views.append(view) - - def freeze(self): - planets = tuple(planet.freeze() for planet in self.planets) - fleets = tuple(fleet.freeze() for fleet in self.fleets) - return planets, fleets - - def play(self): - planets, fleets = self.freeze() - for view in self.views: - view.initialize(self.turns_per_second, self.planets, self.map_name, self.player_names) - view.update(planets, fleets) - next_turn = time.time() + self.turn_duration - winner = -1 - while winner < 0: - # Wait until time has passed - now = time.time() - if now < next_turn: - time.sleep(next_turn - now) - next_turn += self.turn_duration - # Do the turn - self.do_turn() - # Update views - planets, fleets = self.freeze() - for view in self.views: - view.update(planets, fleets) - # Check for end game. - winner, ship_counts = self.gameover() - for view in self.views: - view.game_over(winner, ship_counts) - - def do_turn(self): - """Performs a single turn of the game.""" - - # Get orders - planets, fleets = self.freeze() - player_orders = [player.play(self.turn, i, planets, fleets) for i, player in enumerate(self.players)] - self.turn += 1 - - # Departure - for player, orders in enumerate(player_orders): - for order in orders: - self.issue_order(player, order) - - # Advancement - for planet in self.planets: - planet.generate_ships() - for fleet in self.fleets: - fleet.advance() - - # Arrival - arrived_fleets, self.fleets = partition(lambda fleet: fleet.has_arrived(), self.fleets) - for planet in self.planets: - planet.battle([fleet for fleet in arrived_fleets if fleet.destination == planet]) - - def issue_order(self, player, order): - if order.source.owner != player: - raise Exception("Player %d issued an order from enemy planet %d." % (player, order.source.id)) - source = self.planets[order.source.id] - ships = int(min(order.ships, source.ships)) - if ships > 0: - destination = self.planets[order.destination.id] - source.ships -= ships - self.fleets.append(Fleet(player, ships, source, destination)) - - def gameover(self): - players = range(1, len(self.players)) - living = list(filter(self.is_alive, players)) - if len(living) == 1: - return living[0], count_ships(self.planets, self.fleets) - elif self.turn >= 200: - ship_counts = count_ships(self.planets, self.fleets) - ship_counts = [(p, s) for p, s in ship_counts if p > 0] - winner = 0 if ship_counts[0][1] == ship_counts[1][1] else ship_counts[0][0] - return winner, ship_counts - else: - return -1, [] - - def is_alive(self, player): - for planet in self.planets: - if planet.owner == player: - return True - return False diff --git a/index.html b/index.html new file mode 100644 index 0000000..e5d9213 --- /dev/null +++ b/index.html @@ -0,0 +1,39 @@ + + + + Socket.IO chat + + + + +
+ +
+ + + + + diff --git a/install.md b/install.md deleted file mode 100644 index ee605ad..0000000 --- a/install.md +++ /dev/null @@ -1,33 +0,0 @@ -# Installation - -These instructions are for a Unix-based environment (specifically Ubuntu in parts). - -## Basic Game - -To run the game and see output using the text interface: - - # Set this to whatever you want. - PARENT_DIR=/var/www - cd $PARENT_DIR - git clone git@github.com:maxbogue/planetwars.git - cd planetwars - python play.py Random Random - -Works with Python 2 or Python 3. - -## Web Server - -To get the web server running on port 4200 (Python 2 only): - - # virtualenv is highly recommended. - virtualenv env - # Add the parent directory to the PYTHONPATH. - echo $PARENT_DIR > env/lib/python2.7/site-packages/www.pth - # Activate our virtualenv. - . env/bin/activate - # libevent is required by gevent. - sudo apt-get install libevent-dev - # Python libraries. - pip install flask gevent gevent-socketio - # Run the server! - python web/server.py diff --git a/internal.py b/internal.py deleted file mode 100644 index cadfb57..0000000 --- a/internal.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Utility functions that are used for things besides game logic.""" - -import os.path -import re - -import planetwars -from planetwars.datatypes import ImmutableFleet, ImmutablePlanet - -MAP_DIR = os.path.join(os.path.dirname(planetwars.__file__), "maps") - -def load_map(map_file): - planets = [] - fleets = [] - with open(map_file) as f: - for line in f: - line = line[:line.find("#")] - tokens = line.split() - if not tokens: - continue - elif tokens[0] == "P": - x = float(tokens[1]) - y = float(tokens[2]) - owner = int(tokens[3]) - ships = int(tokens[4]) - growth = int(tokens[5]) - planets.append(ImmutablePlanet(len(planets), x, y, owner, ships, growth)) - elif tokens[0] == "F": - owner = int(tokens[1]) - ships = int(tokens[2]) - source = int(tokens[3]) - destination = int(tokens[4]) - total_turns = int(tokens[5]) - remaining_turns = int(tokens[6]) - fleets.append(ImmutableFleet(owner, ships, source, destination, - total_turns, remaining_turns)) - return planets, fleets - -def load_all_maps(): - maps = {} - for dirpath, _, filenames in os.walk(MAP_DIR): - for filename in filenames: - map_path = os.path.join(dirpath, filename) - map_name = os.path.splitext(map_path[len(MAP_DIR) + 1:])[0] - maps[map_name] = load_map(map_path) - return maps - -DIGITS = set("0123456789") -ROMAN_NUMERALS = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1} - -def is_digit(s): - if len(s) == 0: - return False - for c in s: - if c not in DIGITS: - return False - return True - -def is_roman_numeral(s): - if len(s) == 0: - return False - for c in s.upper(): - if c not in ROMAN_NUMERALS: - return False - return True - -def roman_to_int(s): - s = s.upper() - if not is_roman_numeral(s): - raise ValueError("Input is not a valid roman numeral: \"%s\"" % s) - n = 0 - for i, c in enumerate(s): - v = ROMAN_NUMERALS[c] - if i < len(s) - 1 and ROMAN_NUMERALS[s[i + 1]] > v: - n -= v - else: - n += v - return n - -def maybe_to_int(s): - if is_digit(s): - return int(s) - elif is_roman_numeral(s): - return roman_to_int(s) - else: - return s - -def natural_key(s): - return [maybe_to_int(t) for t in re.split("(\d+|\s+)", s)] diff --git a/nohup.out b/nohup.out new file mode 100644 index 0000000..5cb0cdc --- /dev/null +++ b/nohup.out @@ -0,0 +1,6 @@ +Wed, 04 Jul 2018 13:57:26 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at app.js:7:9 +Wed, 04 Jul 2018 13:57:26 GMT body-parser deprecated undefined extended: provide extended option at node_modules/body-parser/index.js:105:29 +planetwars revamped listening on port 4200! +Wed, 04 Jul 2018 13:57:37 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at app.js:7:9 +Wed, 04 Jul 2018 13:57:37 GMT body-parser deprecated undefined extended: provide extended option at node_modules/body-parser/index.js:105:29 +planetwars revamped listening on port 4200! diff --git a/package-lock.json b/package-lock.json index 73f8057..ec537c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,787 @@ { - "name": "planetwars", - "version": "1.0.0", + "name": "pw_rewrite", + "version": "0.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "requires": { + "accepts": "1.3.5", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + } + } + }, + "express-generator": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/express-generator/-/express-generator-4.16.0.tgz", + "integrity": "sha1-UB9fCotgh/EizdPr4YMyBknbRiI=", + "requires": { + "commander": "2.13.0", + "ejs": "2.5.7", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "sorted-object": "2.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nunjs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nunjs/-/nunjs-0.0.3.tgz", + "integrity": "sha1-bbF/7UAkQt8OGvUV2i2J0J5uiaE=", + "requires": { + "nunjucks": "0.1.10" + } + }, + "nunjucks": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-0.1.10.tgz", + "integrity": "sha1-jZYIBQM+hX0D0BoiuUOpTnl/MOo=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "requires": { + "debug": "3.1.0", + "engine.io": "3.2.0", + "has-binary2": "1.0.3", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.1.1", + "socket.io-parser": "3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "3.1.0", + "engine.io-client": "3.2.1", + "has-binary2": "1.0.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "sorted-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz", + "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/package.json b/package.json index dd1895e..78d516b 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,19 @@ { - "name": "planetwars", - "version": "1.0.0", - "description": "", - "main": "play.js", + "name": "pw_rewrite", + "version": "0.0.1", + "description": "planet wars but modern", + "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "repository": { - "type": "git", - "url": "git+https://github.com/maxbogue/planetwars.git" - }, "author": "", - "license": "MIT", - "bugs": { - "url": "https://github.com/maxbogue/planetwars/issues" - }, - "homepage": "https://github.com/maxbogue/planetwars#readme", + "license": "ISC", "dependencies": { - "lodash": "^4.17.10" + "body-parser": "^1.18.3", + "express": "^4.16.3", + "express-generator": "^4.16.0", + "lodash": "^4.17.10", + "nunjs": "0.0.3", + "socket.io": "^2.1.1" } } diff --git a/play.py b/play.py deleted file mode 100644 index 08dd1a0..0000000 --- a/play.py +++ /dev/null @@ -1,13 +0,0 @@ -from planetwars import PlanetWars -from planetwars.views import TextView - -def main(): - import sys - p1 = sys.argv[1] - p2 = sys.argv[2] - game = PlanetWars([p1, p2], "map1", 100) - game.add_view(TextView()) - game.play() - -if __name__ == '__main__': - main() diff --git a/web/static/js/socket.io.js b/static/old_socket.io.js similarity index 100% rename from web/static/js/socket.io.js rename to static/old_socket.io.js diff --git a/web/static/js/planetwars.js b/static/planetwars.js similarity index 100% rename from web/static/js/planetwars.js rename to static/planetwars.js diff --git a/static/test.html b/static/test.html new file mode 100644 index 0000000..c1c5d70 --- /dev/null +++ b/static/test.html @@ -0,0 +1,16 @@ + + + + + + + diff --git a/utils.py b/utils.py deleted file mode 100644 index a9b9ef3..0000000 --- a/utils.py +++ /dev/null @@ -1,73 +0,0 @@ -from collections import defaultdict -from math import ceil, sqrt - -def euclidean_distance(x, y): - return sqrt(x * x + y * y) - -def dist(p1, p2): - return euclidean_distance(p1.x - p2.x, p1.y - p2.y) - -def turn_dist(p1, p2): - return ceil(dist(p1, p2)) - -def get_ships(planet_or_fleet): - return planet_or_fleet.ships - -def get_growth(planet): - return planet.growth - -def partition(predicate, ls): - yes = [] - no = [] - for e in ls: - if predicate(e): - yes.append(e) - else: - no.append(e) - return yes, no - -def aggro_partition(player_id, planets): - mine = [] - theirs = [] - neutral = [] - for planet in planets: - if planet.owner == player_id: - mine.append(planet) - elif planet.owner == 0: - neutral.append(planet) - else: - theirs.append(planet) - return mine, theirs, neutral - -def count_ships(planets, fleets): - ship_counter = defaultdict(int) - for planet in planets: - ship_counter[planet.owner] += planet.ships - for fleet in fleets: - ship_counter[fleet.owner] += fleet.ships - return sorted(ship_counter.items(), key=lambda p: p[1], reverse=True) - -def battle(planet, fleets): - """Calculates the result of the given fleets battling at the given planet. - - Note that this does not take into account the destination of the fleets, - or their remaining travel time. - - Arguments: - planet - The planet the fleets will fight at. - fleets - The fleets that will take part in the battle. - - Returns: - new_owner, new_ships - - """ - forces = count_ships([planet], fleets) - if len(forces) == 1: - return forces[0] - else: - ships = forces[0][1] - forces[1][1] - owner = planet.owner - if ships > 0: - # There was actually a change of owner. - owner = forces[0][0] - return owner, ships diff --git a/views.py b/views.py deleted file mode 100644 index 9a98679..0000000 --- a/views.py +++ /dev/null @@ -1,116 +0,0 @@ -import time -from collections import defaultdict -from threading import Lock, Thread - -from planetwars import Planet, Fleet -from planetwars.utils import partition - -class TextView(): - - def __init__(self): - self.old_planets = None - - def print_planet(self, planet, fleets): - def is_dest(fleet): - return fleet.destination == planet.id - def mine(x): - return fleet.owner == planet.owner - fleets = list(filter(is_dest, fleets)) - old_planet = self.old_planets[planet.id] - owner = "N " if planet.owner == 0 else "P%d" % planet.owner - ships = "x%d" % planet.ships - if planet.owner != old_planet.owner: - owner += " (was P%d)" % old_planet.owner - elif planet.ships != old_planet.ships: - ships += " (%+d)" % (planet.ships - old_planet.ships) - print("#%02d: %s %s" % (planet.id, owner, ships)) - by_remaining = defaultdict(list) - for fleet in fleets: - by_remaining[fleet.remaining_turns].append(fleet) - for r in sorted(by_remaining.keys()): - friends, enemies = partition(mine, by_remaining[r]) - friends_sum = sum(fleet.ships for fleet in friends) - enemies_sum = sum(fleet.ships for fleet in enemies) - if friends_sum > 0 and enemies_sum > 0: - print(" ..in %d: +%d, -%d" % (r, friends_sum, enemies_sum)) - elif friends_sum > 0: - print(" ..in %d: +%d" % (r, friends_sum)) - else: - print(" ..in %d: -%d" % (r, enemies_sum)) - - def initialize(self, turns_per_second, planets, map_name, players): - print("%s on %s" % (" vs ".join(players), map_name)) - print("Running at %d turns per second" % turns_per_second) - - def update(self, planets, fleets): - if not self.old_planets: - self.old_planets = planets - print("\nPlanets:") - for planet in planets: - self.print_planet(planet, fleets) - self.old_planets = planets - - def game_over(self, winner, ship_counts): - if winner > 0: - print("Player %d wins!" % winner) - else: - print("Tie!") - print("Final ship counts:") - for player, ships in ship_counts: - if player > 0: - print("Player %d: % 4d" % (player, ships)) - -class RealtimeView: - - def __init__(self, frames_per_second, turns_per_second, *wrapped_views): - self.seconds_per_frame = 1.0 / frames_per_second - self.turns_per_frame = turns_per_second / frames_per_second - self.wrapped_views = wrapped_views - self.planets = [] - self.fleets = [] - self.lock = Lock() - self.winner = -1 - self.thread = Thread(target=self.run) - self.thread.daemon = True - self.thread.start() - - def run(self): - next_frame_time = time.time() - while True: - with self.lock: - if self.planets: - planets = tuple(planet.freeze() for planet in self.planets) - fleets = tuple(fleet.freeze() for fleet in self.fleets) - for view in self.wrapped_views: - view.update(planets, fleets) - self.next_frame() - if self.winner >= 0: - break - next_frame_time += self.seconds_per_frame - sleep_duration = next_frame_time - time.time() - if sleep_duration > 0: - time.sleep(sleep_duration) - for view in self.wrapped_views: - view.game_over(self.winner, self.ship_counts) - - def next_frame(self): - for planet in self.planets: - if planet.owner > 0: - planet.ships += planet.growth * self.turns_per_frame - for fleet in self.fleets: - fleet.remaining_turns -= self.turns_per_frame - self.fleets = [fleet for fleet in self.fleets if fleet.remaining_turns >= 0] - - def initialize(self, *args, **kwargs): - with self.lock: - for view in self.wrapped_views: - view.initialize(*args, **kwargs) - - def update(self, planets, fleets): - with self.lock: - self.planets = [Planet(*planet) for planet in planets] - self.fleets = [Fleet(*fleet) for fleet in fleets] - - def game_over(self, winner, ship_counts): - self.winner = winner - self.ship_counts = ship_counts diff --git a/web/templates/game.html b/views/game.nunjs similarity index 85% rename from web/templates/game.html rename to views/game.nunjs index 35bd312..a3246f6 100644 --- a/web/templates/game.html +++ b/views/game.nunjs @@ -34,18 +34,21 @@ font-size: 13px; } - - + + - + - - - - diff --git a/package-lock.json b/package-lock.json index 94cafd0..aa8e803 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,9 @@ { - "name": "pw_rewrite", - "version": "0.0.1", + "name": "planetwars", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -162,7 +157,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base64-arraybuffer": { "version": "0.1.5", @@ -187,11 +183,6 @@ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", @@ -220,6 +211,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -329,11 +321,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" - }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -352,7 +339,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -366,15 +354,6 @@ "typedarray": "0.0.6" } }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" - } - }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -472,28 +451,11 @@ "esutils": "2.0.2" } }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", - "requires": { - "bluebird": "3.5.1", - "commander": "2.13.0", - "lru-cache": "3.2.0", - "semver": "5.5.0", - "sigmund": "1.0.1" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -816,18 +778,6 @@ } } }, - "express-generator": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/express-generator/-/express-generator-4.16.0.tgz", - "integrity": "sha1-UB9fCotgh/EizdPr4YMyBknbRiI=", - "requires": { - "commander": "2.13.0", - "ejs": "2.5.7", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "sorted-object": "2.0.1" - } - }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -1070,11 +1020,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, "inquirer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", @@ -1181,17 +1126,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "js-beautify": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz", - "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==", - "requires": { - "config-chain": "1.1.11", - "editorconfig": "0.13.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6" - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -1235,14 +1169,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "requires": { - "pseudomap": "1.0.2" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1286,6 +1212,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -1293,12 +1220,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -1331,14 +1260,6 @@ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, "nunjs": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/nunjs/-/nunjs-0.0.3.tgz", @@ -1553,11 +1474,6 @@ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", @@ -1570,7 +1486,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "punycode": { "version": "2.1.1", @@ -1703,7 +1620,8 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "send": { "version": "0.16.2", @@ -1756,11 +1674,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -1855,11 +1768,6 @@ } } }, - "sorted-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz", - "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" - }, "spawn-sync": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", @@ -2042,11 +1950,6 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 876acd6..09d5a14 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "pw_rewrite", - "version": "0.0.1", - "description": "planet wars but modern", + "name": "planetwars", + "version": "1.0.2", + "description": "A space-based strategy game where two AIs fight tooth and nail for control of a galaxy.", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -16,16 +16,23 @@ "silent": true }, "author": "", + "contributors": [ + { + "name": "Max Bogue", + "url": "http://maxbogue.com" + }, + { + "name": "Lexan Smythe-Worthington", + "email": "lexan@4queens.tk" + } + ], "license": "ISC", "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.3", - "express-generator": "^4.16.0", - "js-beautify": "^1.7.5", "lodash": "^4.17.10", "nunjs": "0.0.3", - "socket.io": "^2.1.1", - "uuid": "^3.3.2" + "socket.io": "^2.1.1" }, "devDependencies": { "eslint": "^5.0.1", diff --git a/socketview.js b/socketview.js index 67e783b..85df55a 100644 --- a/socketview.js +++ b/socketview.js @@ -5,12 +5,13 @@ class WebsocketView { } initialize(turnsPerSecond, planets, mapName, players) { - this.socket.emit('initialize', {turnsPerSecond, planets, mapName, players}); + this.socket.emit('initialize', + { turnsPerSecond, planets, mapName, players }); } update(planets, fleets) { - let fleetJson = fleets.map((fleet) => fleet.forJson()); - this.socket.emit('update', [planets, fleetJson]); + let fleetsForJson = fleets.map((fleet) => fleet.forJson()); + this.socket.emit('update', [planets, fleetsForJson]); } gameOver(winner, shipCounts) { @@ -19,4 +20,3 @@ class WebsocketView { } module.exports = { WebsocketView }; - diff --git a/static/test.html b/static/test.html deleted file mode 100644 index c1c5d70..0000000 --- a/static/test.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/views/game.nunjs b/views/game.nunjs index c0fbf76..a3c4a00 100644 --- a/views/game.nunjs +++ b/views/game.nunjs @@ -43,24 +43,20 @@ var canvas = document.getElementById("game"); var ctx = canvas.getContext("2d"); - socket.on("initialize", function(messagedata) { - console.log(messagedata); - var data = messagedata + socket.on("initialize", function(data) { planetwars = new PlanetWars(ctx, data.planets, data.turnsPerSecond); for (var i = 1; i <= data.players.length; i++) { - console.log("p" + i); var p = document.getElementById("p" + i); p.textContent = data.players[i - 1]; p.style.color = PLAYER_COLORS[i][0]; } - document.getElementById("map").textContent = data.map; + document.getElementById("map").textContent = data.mapName; document.getElementById("info").style.display = "block"; }); - socket.on("update", function(msg) { - planetwars.addData(msg); -console.log(msg) + socket.on("update", function(data) { + planetwars.addData(data); }); - socket.on("gameOver", function(msg) { + socket.on("gameOver", function(data) { planetwars.gameOver = true; }); socket.emit("join", gameID); diff --git a/views/index.nunjs b/views/index.nunjs index d5ac27a..b230cdf 100644 --- a/views/index.nunjs +++ b/views/index.nunjs @@ -50,9 +50,7 @@ -

Planet Wars

-

REWRITTEN

-

(not working yet, under construction)

+

PlanetWars

From 090f9db09ec51a3b99c32e5d747b63a805d1acf4 Mon Sep 17 00:00:00 2001 From: lexan Date: Mon, 5 Nov 2018 16:27:36 -0500 Subject: [PATCH 12/14] more style changes --- app.js | 27 +-- base.js | 5 +- package-lock.json | 546 +++++++++++++++++++++++----------------------- package.json | 4 +- 4 files changed, 291 insertions(+), 291 deletions(-) diff --git a/app.js b/app.js index 3184b26..f6d6487 100644 --- a/app.js +++ b/app.js @@ -1,15 +1,11 @@ -//local imports, as requested -const baseUtil = require('./base'); -const { PlanetWars, MAPS, AIS } = require('./game'); -const { WebsocketView } = require('./socketview'); - -//require actual packages const bodyParser = require('body-parser'); const _ = require('lodash'); const express = require('express'); +const baseUtil = require('./base'); +const { PlanetWars, MAPS, AIS } = require('./game'); +const { WebsocketView } = require('./socketview'); -//init some stuff const app = express(); app.set('views', __dirname + '/views'); app.set('view engine', 'nunjs'); @@ -17,16 +13,19 @@ app.use(bodyParser()); const server = require('http').Server(app); const io = require('socket.io')(server); const games = {}; -//publish static files + +// publish static files app.use('/static', express.static('static')); -//render game setup view + +// render game setup view app.get('/', function(req, res) { res.render('index', { 'map_names': _.keys(MAPS), 'ai_names': _.keys(AIS) }); }); -//render gameplay view + +// render gameplay view app.get('/game/:gameID', function(req, res) { if (games[req.params.gameID]) { res.render('game', { @@ -36,7 +35,8 @@ app.get('/game/:gameID', function(req, res) { res.redirect('/'); } }); -//handle game creation + +// handle game creation app.post('/create-game', function(req, res) { let game_id = baseUtil.gameID(); let p1 = req.body.p1; @@ -49,7 +49,8 @@ app.post('/create-game', function(req, res) { games[game_id] = new PlanetWars([p1, p2], m, turnsPerSecond); res.redirect('/game/' + game_id); }); -//tell those sockets what they want to hear + +// tell those sockets what they want to hear io.of('/game').on('connection', function(socket) { socket.on('join', function (data) { let view = new WebsocketView(socket); @@ -59,5 +60,5 @@ io.of('/game').on('connection', function(socket) { } }); }); -//run the whole enchilada! + server.listen(4200); diff --git a/base.js b/base.js index 538937f..42e4cd5 100644 --- a/base.js +++ b/base.js @@ -1,7 +1,6 @@ function gameID () { - let digits = 'abcdef1234567890cw'; - let id = randomChoice(digits) + randomChoice(digits) + randomChoice(digits); - id = id + randomChoice(digits) + randomChoice(digits); + let digits = 'abcdef1234567890'; + let id = randomChoice(digits) + randomChoice(digits) + randomChoice(digits) + randomChoice(digits) + randomChoice(digits); return id; } function max(ls, key) { diff --git a/package-lock.json b/package-lock.json index aa8e803..22e5214 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "planetwars", - "version": "1.0.2", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -25,7 +25,7 @@ "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", "dev": true, "requires": { - "acorn": "5.7.1" + "acorn": "^5.0.3" } }, "after": { @@ -39,10 +39,10 @@ "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ajv-keywords": { @@ -75,7 +75,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-flatten": { @@ -89,7 +89,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -120,9 +120,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "chalk": { @@ -131,11 +131,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -144,7 +144,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -189,15 +189,15 @@ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.2", + "http-errors": "~1.6.3", "iconv-lite": "0.4.23", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "1.6.16" + "type-is": "~1.6.16" }, "dependencies": { "qs": { @@ -213,7 +213,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -234,7 +234,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsite": { @@ -254,9 +254,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { @@ -265,7 +265,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.2" + "color-convert": "^1.9.0" } }, "supports-color": { @@ -274,7 +274,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -297,7 +297,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -348,10 +348,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "content-disposition": { @@ -386,11 +386,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "debug": { @@ -413,8 +413,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.12" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "del": { @@ -423,13 +423,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "depd": { @@ -448,7 +448,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "ee-first": { @@ -466,12 +466,12 @@ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", - "ws": "3.3.3" + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { "debug": { @@ -491,14 +491,14 @@ "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "3.3.3", - "xmlhttprequest-ssl": "1.5.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { @@ -518,10 +518,10 @@ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.7", + "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", "blob": "0.0.4", - "has-binary2": "1.0.3" + "has-binary2": "~1.0.2" } }, "es-abstract": { @@ -530,11 +530,11 @@ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -543,9 +543,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "escape-html": { @@ -565,44 +565,44 @@ "integrity": "sha512-D5nG2rErquLUstgUaxJlWB5+gu+U/3VDY0fk/Iuq8y9CUFy/7Y6oF4N2cR1tV8knzQvciIbfqfohd359xTLIKQ==", "dev": true, "requires": { - "ajv": "6.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-visitor-keys": "1.0.0", - "espree": "4.0.0", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.7.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "5.2.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "1.1.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "string.prototype.matchall": "2.0.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.5.0", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.1.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" }, "dependencies": { "debug": { @@ -622,8 +622,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -638,8 +638,8 @@ "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "acorn": "5.7.1", - "acorn-jsx": "4.1.1" + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" } }, "esprima": { @@ -654,7 +654,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -663,7 +663,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -688,36 +688,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "body-parser": { @@ -726,15 +726,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" } }, "iconv-lite": { @@ -766,7 +766,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -784,9 +784,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "fast-deep-equal": { @@ -813,7 +813,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -822,8 +822,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "finalhandler": { @@ -832,12 +832,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "flat-cache": { @@ -846,10 +846,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "foreach": { @@ -892,12 +892,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globals": { @@ -912,12 +912,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "graceful-fs": { @@ -932,7 +932,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -941,7 +941,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-binary2": { @@ -974,10 +974,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "iconv-lite": { @@ -985,7 +985,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { @@ -1011,8 +1011,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1026,19 +1026,19 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.11", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, "ipaddr.js": { @@ -1076,7 +1076,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -1085,7 +1085,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-promise": { @@ -1100,7 +1100,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.3" + "has": "^1.0.1" } }, "is-resolvable": { @@ -1138,8 +1138,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "json-schema-traverse": { @@ -1160,8 +1160,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lodash": { @@ -1199,7 +1199,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -1214,7 +1214,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1265,7 +1265,7 @@ "resolved": "https://registry.npmjs.org/nunjs/-/nunjs-0.0.3.tgz", "integrity": "sha1-bbF/7UAkQt8OGvUV2i2J0J5uiaE=", "requires": { - "nunjucks": "0.1.10" + "nunjucks": "~0.1.10" } }, "nunjucks": { @@ -1304,7 +1304,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -1313,7 +1313,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "optionator": { @@ -1322,12 +1322,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-shim": { @@ -1347,7 +1347,7 @@ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { @@ -1355,7 +1355,7 @@ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseurl": { @@ -1404,7 +1404,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pluralize": { @@ -1419,9 +1419,9 @@ "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "spawn-sync": "1.0.15", - "which": "1.2.14" + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" }, "dependencies": { "cross-spawn": { @@ -1430,9 +1430,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.2.14" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "lru-cache": { @@ -1441,8 +1441,8 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "which": { @@ -1451,7 +1451,7 @@ "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } } } @@ -1479,7 +1479,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -1522,13 +1522,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "isarray": { @@ -1545,7 +1545,7 @@ "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", "dev": true, "requires": { - "define-properties": "1.1.2" + "define-properties": "^1.1.2" } }, "regexpp": { @@ -1560,8 +1560,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve-from": { @@ -1576,8 +1576,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "rimraf": { @@ -1586,7 +1586,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -1595,7 +1595,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rxjs": { @@ -1629,18 +1629,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } }, "serve-static": { @@ -1648,9 +1648,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -1665,7 +1665,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -1686,7 +1686,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "socket.io": { @@ -1694,12 +1694,12 @@ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", "requires": { - "debug": "3.1.0", - "engine.io": "3.2.0", - "has-binary2": "1.0.3", - "socket.io-adapter": "1.1.1", + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", "socket.io-client": "2.1.1", - "socket.io-parser": "3.2.0" + "socket.io-parser": "~3.2.0" }, "dependencies": { "debug": { @@ -1726,15 +1726,15 @@ "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "3.1.0", - "engine.io-client": "3.2.1", - "has-binary2": "1.0.3", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "3.2.0", + "socket.io-parser": "~3.2.0", "to-array": "0.1.4" }, "dependencies": { @@ -1754,7 +1754,7 @@ "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "requires": { "component-emitter": "1.2.1", - "debug": "3.1.0", + "debug": "~3.1.0", "isarray": "2.0.1" }, "dependencies": { @@ -1774,8 +1774,8 @@ "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", "dev": true, "requires": { - "concat-stream": "1.6.2", - "os-shim": "0.1.3" + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" } }, "sprintf-js": { @@ -1795,8 +1795,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string.prototype.matchall": { @@ -1805,11 +1805,11 @@ "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "regexp.prototype.flags": "1.2.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" } }, "string_decoder": { @@ -1818,7 +1818,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -1827,7 +1827,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -1862,12 +1862,12 @@ "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "lodash": "4.17.10", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "text-table": { @@ -1888,7 +1888,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -1902,7 +1902,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -1911,7 +1911,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -1936,7 +1936,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "util-deprecate": { @@ -1961,7 +1961,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "wordwrap": { @@ -1982,7 +1982,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -1990,9 +1990,9 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "xmlhttprequest-ssl": { diff --git a/package.json b/package.json index 09d5a14..72151b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "planetwars", - "version": "1.0.2", + "version": "0.1.0", "description": "A space-based strategy game where two AIs fight tooth and nail for control of a galaxy.", "main": "app.js", "scripts": { @@ -23,7 +23,7 @@ }, { "name": "Lexan Smythe-Worthington", - "email": "lexan@4queens.tk" + "email": "lexan.smythe@gmail.com" } ], "license": "ISC", From 2df2ed8c9a136a98a940990bfa0f2c9865342576 Mon Sep 17 00:00:00 2001 From: lexan Date: Mon, 5 Nov 2018 16:31:48 -0500 Subject: [PATCH 13/14] Fixed snake-case --- app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index f6d6487..c5a67f5 100644 --- a/app.js +++ b/app.js @@ -38,7 +38,7 @@ app.get('/game/:gameID', function(req, res) { // handle game creation app.post('/create-game', function(req, res) { - let game_id = baseUtil.gameID(); + let gameID = baseUtil.gameID(); let p1 = req.body.p1; let p2 = req.body.p2; let m = req.body.map; @@ -46,8 +46,8 @@ app.post('/create-game', function(req, res) { m = baseUtil.randomChoice(_.keys(MAPS)); } let turnsPerSecond = req.body.tps; - games[game_id] = new PlanetWars([p1, p2], m, turnsPerSecond); - res.redirect('/game/' + game_id); + games[gameID] = new PlanetWars([p1, p2], m, turnsPerSecond); + res.redirect('/game/' + gameID); }); // tell those sockets what they want to hear From c92204a64a4406c2d209cb6f79c427a0b1131e23 Mon Sep 17 00:00:00 2001 From: lexan Date: Tue, 6 Nov 2018 16:50:04 -0500 Subject: [PATCH 14/14] Implemented "AllToCloseOrWeak" AI from the original code --- ai/simple.js | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/ai/simple.js b/ai/simple.js index f656db2..5ca7eb0 100644 --- a/ai/simple.js +++ b/ai/simple.js @@ -1,7 +1,7 @@ const partition = require('lodash/partition'); const { Order } = require('../dataTypes'); -const { aggroPartition, getShips } = require('../utils'); +const { aggroPartition, getShips, turnDist } = require('../utils'); const { max, min, randomChoice } = require('../base'); class StrongToWeak { @@ -22,4 +22,30 @@ class Random { return [new Order(source, dest, source.ships / 2)]; } } -module.exports = { Random, StrongToWeak }; + + +class AllToCloseOrWeak { + + play(turn, player, planets) { + let currentPlanet; + let orders = []; + let [myPlanets, theirPlanets] = aggroPartition(player, planets); + function distTo(otherPlanet){ + return turnDist(currentPlanet,otherPlanet); + } + let theirWeakest = min(theirPlanets, getShips); + myPlanets.forEach(function(planet) { + currentPlanet = planet; + if (Math.random() > 0.5) { + let closest = min(theirPlanets, distTo); + orders.push(new Order(planet, closest, planet.ships * 0.75)); + } else { + + orders.push(new Order(planet, theirWeakest, planet.ships * 0.75)); + + } + }); + + return orders; + } +}module.exports = { Random, StrongToWeak, AllToCloseOrWeak };