diff --git a/README.md b/README.md index 8109648..5f294f2 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,32 @@ Grandstand's 80s tabletop classic revisited Built for (and to test) my [EccentricEngine](https://github.com/JustinPinner/EccentricEngine) JS game engine +![Alt Text](https://github.com/JustinPinner/astrowars/blob/master/AstroWars3.gif) + +To get started, either clone the [EccentricEngine repo](https://github.com/JustinPinner/EccentricEngine) OR install it from the npm package registry by running `npm -i eccentric-engine` + +If you chose to clone the [EccentricEngine repo](https://github.com/JustinPinner/EccentricEngine) instead of installing from npm, you'll need to make sure to comment out all the `import { Something } from 'eccentric-engine/Engine';` statements (run a global search in your editor for `from 'eccentric-engine/Engine'`) and change the relative path statements to match your local directory structure, e.g. +`import { Something } from '../your/path/to/EccentricEngine/src/engine/engine';` + demo gif -[Play a dev build here](https://justinpinner.github.io/astrowars/default.html) **Warning:** there will be bugs +## Instructions -Instructions ---- * Space: Start * Left/Right Arrow keys: Should be obvs, but just in case... move left and right * Enter: Fire + +[Play a dev build here](https://justinpinner.github.io/astrowars/default.html) **Warning:** there will be bugs + +## Versions + +1.0.2 +===== +* Uses updated (v1.0.3) [EccentricEngine](https://github.com/JustinPinner/EccentricEngine) +* Adds initial implementation of bonus phase gameplay +* Added string padding for displaying score and bonus digits +* Added game-over condition +* Added engine debugging option - add a `?debug` search parameter to the game URL to activate logging to your browser's dev console +* Added game clocking mechanism - if you score over 99999 points you'll get extra lives +* Removed some hardcoded strings for game phase checks +* Added a `playerObjects` getter to `AWEngine` to simplify extracting player objects from EccentricEngine's `gameObjects` collection diff --git a/package-lock.json b/package-lock.json index 0f282a7..1df8fca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "astrowars", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -173,19 +173,14 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -199,14 +194,14 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", @@ -365,9 +360,9 @@ } }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "big.js": { "version": "5.2.2", @@ -380,9 +375,9 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", + "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==" }, "bn.js": { "version": "4.11.8", @@ -521,21 +516,22 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" @@ -570,12 +566,22 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -592,9 +598,9 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, "chrome-trace-event": { "version": "1.0.2", @@ -635,20 +641,15 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -672,9 +673,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", + "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==" }, "commondir": { "version": "1.0.1", @@ -803,22 +804,35 @@ } }, "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", + "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", "dev": true, "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.14", + "postcss": "^7.0.17", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-local-by-default": "^3.0.2", "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.0", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } } }, "cssesc": { @@ -828,9 +842,9 @@ "dev": true }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "date-now": { "version": "0.1.4", @@ -933,19 +947,19 @@ } }, "eccentric-engine": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/eccentric-engine/-/eccentric-engine-1.0.2.tgz", - "integrity": "sha512-b5WyBxYGxbp6IfTPq/IffhAfl/cY4zAuPDthy/S1aVqM+em4BW51u0MLpvWoRpVkzcEnU4iCK7GD2JTLMj9+/Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/eccentric-engine/-/eccentric-engine-1.0.3.tgz", + "integrity": "sha512-23HQk5cBb3WAPNTRNNA0VQEl3jISUJbpsJTIc2wOWwAY9IEzwqmsOcWlEp/AhVvSXCfpYoMRGQRGTVhOV4gY9w==", "requires": { - "uuid": "^3.3.2", - "webpack": "^4.32.2", - "webpack-cli": "^3.3.2" + "uuid": "^3.3.3", + "webpack": "^4.41.0", + "webpack-cli": "^3.3.9" } }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -956,15 +970,20 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } @@ -1010,9 +1029,9 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "events": { "version": "3.0.0", @@ -1215,24 +1234,14 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } } }, "flush-write-stream": { @@ -1764,9 +1773,9 @@ } }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-stream": { "version": "4.1.0", @@ -1814,13 +1823,23 @@ } }, "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } } }, "global-prefix": { @@ -1836,9 +1855,9 @@ } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "has-flag": { "version": "3.0.0", @@ -1915,12 +1934,6 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", @@ -1960,10 +1973,10 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -1975,9 +1988,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -2341,9 +2354,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -2427,9 +2440,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -2441,7 +2454,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -2453,7 +2466,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -2476,11 +2489,6 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2569,9 +2577,9 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "requires": { "p-try": "^2.0.0" } @@ -2595,19 +2603,19 @@ "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -2628,9 +2636,9 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", @@ -2683,9 +2691,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -2698,15 +2706,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -2720,14 +2719,15 @@ } }, "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" } }, "postcss-modules-scope": { @@ -2741,12 +2741,12 @@ } }, "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", + "icss-utils": "^4.0.0", "postcss": "^7.0.6" } }, @@ -2762,9 +2762,9 @@ } }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true }, "process": { @@ -2773,9 +2773,9 @@ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -2916,9 +2916,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "resolve-cwd": { "version": "2.0.0", @@ -2935,6 +2935,18 @@ "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } } }, "resolve-from": { @@ -2953,9 +2965,9 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -3001,14 +3013,14 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" }, "set-blocking": { "version": "2.0.0", @@ -3016,9 +3028,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -3188,9 +3200,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3279,12 +3291,13 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "string_decoder": { @@ -3296,11 +3309,11 @@ } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } }, "strip-eof": { @@ -3309,19 +3322,31 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -3332,13 +3357,13 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "terser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", - "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", + "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -3349,19 +3374,18 @@ } }, "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "dependencies": { @@ -3382,9 +3406,9 @@ } }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "requires": { "setimmediate": "^1.0.4" } @@ -3433,9 +3457,9 @@ } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tty-browserify": { "version": "0.0.0", @@ -3448,35 +3472,14 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { @@ -3494,9 +3497,9 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } @@ -3538,9 +3541,9 @@ } }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "uri-js": { "version": "4.2.2", @@ -3582,6 +3585,13 @@ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "util-deprecate": { @@ -3590,9 +3600,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8-compile-cache": { "version": "2.0.3", @@ -3600,12 +3610,9 @@ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, "watchpack": { "version": "1.6.0", @@ -3618,58 +3625,57 @@ } }, "webpack": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.33.0.tgz", - "integrity": "sha512-ggWMb0B2QUuYso6FPZKUohOgfm+Z0sVFs8WwWuSH1IAvkWs428VDNmOlAxvHGTB9Dm/qOB/qtE5cRx5y01clxw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz", + "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" } }, "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -3704,45 +3710,13 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -3751,9 +3725,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", @@ -3761,33 +3735,32 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 34c83a7..b192167 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "astrowars", - "version": "1.0.1", + "version": "1.0.2", "description": "", "private": true, "scripts": { @@ -19,13 +19,13 @@ }, "homepage": "https://github.com/JustinPinner/astrowars#readme", "devDependencies": { - "css-loader": "^2.1.0", - "style-loader": "^0.23.1", - "webpack": "^4.28.3", - "webpack-cli": "^3.2.0" + "css-loader": "^3.2.0", + "style-loader": "^1.0.0", + "webpack": "^4.41.0", + "webpack-cli": "^3.3.9" }, "dependencies": { - "eccentric-engine": "^1.0.2", - "uuid": "^3.3.2" + "eccentric-engine": "^1.0.3", + "uuid": "^3.3.3" } } diff --git a/src/js/behaviour/alienActions.js b/src/js/behaviour/alienActions.js index 6ffc709..0f0f671 100644 --- a/src/js/behaviour/alienActions.js +++ b/src/js/behaviour/alienActions.js @@ -1,3 +1,5 @@ +import { moveInstructions } from '../model/cellBasedMovement'; + // write alien behaviours here // these functions will be bound into GameObject instances with .bind(this, this) // so remember to change this.state if/when needed @@ -18,37 +20,6 @@ const stateNames = { flash: 'flashState' }; -const horizontalMove = { - right: 1, // right - left: -1 // left -}; - -const verticalMove = { - up: 1, // up - down: -1 // down -}; - -const verticalMoveDown = { - down: -1 // down -}; - -const moveInstructions = { - leftRight: { - horizontal: horizontalMove, - }, - upDown: { - vertical: verticalMove - }, - diagonal: { - horizontal: horizontalMove, - vertical: verticalMove - }, - diagonalDown: { - horizontal: horizontalMove, - vertical: verticalMoveDown - }, -}; - const nextAvailableCell = (alien, moveInstruction, canWrap) => { let relativeColumn = 0; let relativeRow = 0; diff --git a/src/js/behaviour/gameActions.js b/src/js/behaviour/gameActions.js index ea2b86c..2a868fd 100644 --- a/src/js/behaviour/gameActions.js +++ b/src/js/behaviour/gameActions.js @@ -24,25 +24,47 @@ const initGameBoard = (gameEngine) => { } }; -const displayDigits = (gameEngine, intScore) => { +const displayDigits = (gameEngine, intValue, displayLeadingZeroes) => { if (!gameEngine.gameBoard) { return; } + + // protect against 6+ digit value (roll back to 0) + const valToDisplay = (intValue > Number(String(9).repeat(gameEngine.gameBoard.columns))) ? 0 : intValue; + const padChar = (displayLeadingZeroes ? '0' : '_'); + const maxLength = gameEngine.gameBoard.columns; + const padded = gameEngine.formatter.leftPad(valToDisplay, padChar, maxLength); + + const digits = padded.split(''); const digitRow = 10; - const stringNum = intScore.toString(); - for (let d=0; d < stringNum.length; d+=1) { - const pad = gameEngine.gameBoard.columns - stringNum.length - 1; - const col = pad + d; + + for (let col=0; col < gameEngine.gameBoard.columns; col += 1) { const cell = gameEngine.gameBoard.board[digitRow][col]; - const digit = (cell.contents[0] && cell.contents[0].isDigit) ? cell.contents[0] : cell.addObject(new Digit( - gameEngine.config.digit, - { - x: cell.x, - y: cell.y - }, - gameEngine - )); - digit.value = Number(stringNum.substr(d, 1)); + if (!isNaN(digits[col])) { + const cellDigit = cell.contents.length > 0 ? + cell.contents.filter(function(obj){return obj.isDigit;})[0] : + new Digit( + gameEngine.config.digit, + { + x: cell.x, + y: cell.y + }, + gameEngine + ); + cellDigit.value = digits[col]; + if (cell.contents.length < 1) { + cell.contents.push(cellDigit); + } + } else { + if (cell.contents && cell.contents.length > 0) { + for (const obj in cell.contents) { + if (cell.contents[obj].isDigit) { + gameEngine.deleteObjectById(cell.contents[obj].id); + cell.contents.pop(obj); + } + } + } + } } }; @@ -55,9 +77,19 @@ const showLives = (gameEngine) => { }; const showScore = (gameEngine) => { + if (gameEngine.playerPoints > Number(String(9).repeat(gameEngine.gameBoard.columns))) { + gameEngine.eventSystem.dispatchEvent(engine.id, {action: "CLOCKED"}); + gameEngine.playerPoints = 0; + gameEngine.playerLives += 3; + } displayDigits(gameEngine, gameEngine.playerPoints); }; +const showBonus = (gameEngine) => { + const withLeadingDigits = false; + displayDigits(gameEngine, gameEngine.playerBonus, withLeadingDigits); +} + const spawnCommandShips = (gameEngine, qty) => { // command ships occupy the row below the score (9 by default) // in the first phase they don't do anything though, so don't include @@ -111,7 +143,7 @@ const spawnPlayerCapsule = (gameEngine) => { } else { const snp = gameEngine.snapshotLoad(); const playerObjs = snp && snp.data && snp.data.gameObjects.filter(function(obj) {return obj.isPlayerCapsule}); - playerColumn = playerObjs.length > 0 ? playerObjs[0].currentCell.column : playerCapsuleConfig.startColumn; + playerColumn = playerObjs && playerObjs.length > 0 ? playerObjs[0].currentCell.column : playerCapsuleConfig.startColumn; } const cell = gameEngine.gameBoard.board[playerCapsuleRow][playerColumn]; const playerCapsule = new PlayerCapsule( @@ -123,6 +155,9 @@ const spawnPlayerCapsule = (gameEngine) => { gameEngine ); cell.addObject(playerCapsule); + if (gameEngine.currentPhase == 4 && !gameEngine.interstitial) { + gameEngine.eventSystem.dispatchEvent(playerCapsule.id, {target: 'FSM', action: 'SET', state: playerCapsule.fsm.states.launch}); + } }; const spawnPlayerBase = (gameEngine) => { @@ -147,7 +182,7 @@ const spawnPlayerBase = (gameEngine) => { const reset = (gameEngine) => { // remove all game objects - gameEngine.gameObjects = []; + gameEngine.disposeAllObjects(); // reset the gameboard initGameBoard(gameEngine); // reset score @@ -169,9 +204,11 @@ const initDemoMode = (gameEngine) => { const runInterstitial = (gameEngine) => { const beginNextPhase = 'BEGINNEXTPHASE'; + const snp = gameEngine.snapshotSave(); switch (gameEngine.currentPhase) { - case 0: + case gameEngine.config.phases().demo.id: reset(gameEngine); + gameEngine.interstitial = true; showLives(gameEngine); spawnPlayerBase(gameEngine); spawnPlayerCapsule(gameEngine); @@ -181,16 +218,18 @@ const runInterstitial = (gameEngine) => { action: 'HOLD', value: 3000, onTimeUp: (engine) => { + engine.interstitial = false; engine.eventSystem.dispatchEvent(engine.id, {action: beginNextPhase}); } } ); break; - case 1: - case 2: - case 3: - const snp = gameEngine.snapshotSave(); + case gameEngine.config.phases().assault.id: + case gameEngine.config.phases().dive.id: + case gameEngine.config.phases().command.id: + case gameEngine.config.phases().bonus.id: reset(gameEngine); + gameEngine.interstitial = true; gameEngine.playerLives = snp.data.playerLives; showLives(gameEngine); spawnCommandShips(gameEngine); @@ -209,28 +248,45 @@ const runInterstitial = (gameEngine) => { value: 3000, onTimeUp: (engine) => { engine.restore(); + engine.interstitial = false; engine.eventSystem.dispatchEvent(engine.id, {action: beginNextPhase}); } } ); break; - case 4: - debugger; + case gameEngine.config.phases().gameover.id: + reset(gameEngine); + gameEngine.interstitial = true; + gameEngine.playerPoints = snp.data.playerPoints; + showScore(gameEngine); + gameEngine.eventSystem.dispatchEvent( + gameEngine.id, + { + action: 'HOLD', + value: 3000, + onTimeUp: (engine) => { + engine.interstitial = false; + engine.eventSystem.dispatchEvent(engine.id, {action: beginNextPhase}); + } + } + ); + break; } }; const nextPhase = (gameEngine) => { - // testing specific phases from start... - // if (gameEngine.currentPhase == 0) { - // gameEngine.currentPhase = 2; // start at phase 3 - // } - const score = gameEngine.playerPoints || 0; - const phase = gameEngine.currentPhase || 0; - const lives = gameEngine.playerLives || 5; + if (gameEngine.currentPhase == gameEngine.config.phases().gameover.id) { + initDemoMode(gameEngine); + return; + } + const score = gameEngine.playerPoints; + const phase = gameEngine.currentPhase; + const lives = gameEngine.playerLives; reset(gameEngine); gameEngine.playerPoints = score; - gameEngine.currentPhase = (phase > 4) ? 1: phase + 1; + gameEngine.currentPhase = (phase > 3) ? 1: phase + 1; gameEngine.playerLives = lives; + gameEngine.playerBonus = 0; showScore(gameEngine); spawnCommandShips(gameEngine); spawnWarships(gameEngine); @@ -240,6 +296,9 @@ const nextPhase = (gameEngine) => { export { showScore, + showLives, + showBonus, + reset, initDemoMode, spawnWarships, spawnCommandShips, diff --git a/src/js/behaviour/playerActions.js b/src/js/behaviour/playerActions.js index c1e2a0d..8074190 100644 --- a/src/js/behaviour/playerActions.js +++ b/src/js/behaviour/playerActions.js @@ -1,9 +1,19 @@ +import { + horizontalMove, + verticalMove +} from '../model/cellBasedMovement'; +import { + showBonus +} from './gameActions'; const timing = {}; const stateNames = { baseFollow: 'baseFollow', - baseScroll: 'baseScroll', + baseStartScroll: 'baseStartScroll', + baseScrolling: 'baseScrolling', + baseDocked: 'baseDocked', + baseCrashed: 'baseCrashed', playerBombed: 'playerBombed', dockingSuccess: 'dockingComplete', dockingFailed: 'dockingFailed', @@ -13,13 +23,14 @@ const stateNames = { playerFlash: 'playerFlash', capsuleLaunch: 'capsuleLaunch', capsuleDescent: 'capsuleDescent', - capsuleDock: 'capsuleDock', - capsuleCrash: 'capsuleCrash' + capsuleDocked: 'capsuleDocked', + capsuleCrashed: 'capsuleCrashed', + capsuleAscent: 'capsuleAscent' }; const baseFollowState = { name: stateNames.baseFollow, - nextStates: [stateNames.playerBombed, stateNames.baseScroll], + nextStates: [stateNames.playerBombed, stateNames.baseStartScroll], detectCollisions: true, execute: (playerBase) => { const playerCapsule = playerBase.engine.getObjectByType('playerCapsule'); @@ -33,13 +44,54 @@ const baseFollowState = { } }; -const baseScrollState = { - name: 'baseScroll', - nextStates: [stateNames.dockingSuccess, stateNames.dockingFailed], +const baseStartScrollState = { + name: 'baseStartScroll', + nextStates: [stateNames.baseScrolling], detectCollisions: true, execute: (playerBase) => { - // move left/right - // drop bomb maybe + // enable vertical screen wrap + const canWrap = { + horizontal: true, + vertical: false + }; + playerBase.engine.timers.add('BASESCROLL', null, 500, playerBase.moveRight.bind(playerBase), canWrap); + playerBase.engine.timers.start('BASESCROLL'); + playerBase.fsm.transition(playerBase.fsm.states.scrolling); + } +}; + +const baseScrollingState = { + name: 'baseScrolling', + nextStates: [stateNames.baseDocked, stateNames.baseCrashed], + detectCollisions: true, + execute: (playerBase) => { + // do nothing - the timer created in baseStartScrollState will execute the moveRight code for us + } +}; + +const baseDockedState = { + name: stateNames.baseDocked, + nextStates: [stateNames.baseFollow], + detectCollisions: false, + processPlayerInputs: false, + execute: (playerBase) => { + playerBase.engine.playerPoints += playerBase.engine.playerBonus; + playerBase.fsm.transition(playerBase.fsm.states.follow); + } +}; + +const baseCrashedState = { + name: stateNames.baseCrashed, + nextStates: [stateNames.baseFollow], + detectCollisions: false, + processPlayerInputs: false, + execute: (playerBase) => { + // TODO: + // Show bonus score + // Show total score + // Switch base to follow mode + // Switch capsule to live mode + // Begin next phase } }; @@ -68,7 +120,7 @@ const playerDieState = { processPlayerInputs: false, execute: (player) => { // re-spawn (if there are sufficient lives remaining) - if (player.engine.config.game.playerLives > 0) { + if (player.engine.playerLives > 0) { player.engine.eventSystem.dispatchEvent(player.engine.id, {action: 'PLAYERRESPAWN'}); } else { player.engine.eventSystem.dispatchEvent(player.engine.id, {action: 'GAMEOVER'}); @@ -78,9 +130,12 @@ const playerDieState = { const playerBaseFSMStates = { follow: baseFollowState, - scroll: baseScrollState, + scrollStart: baseStartScrollState, + scrolling: baseScrollingState, flash: playerFlashState, die: playerDieState, + docked: baseDockedState, + crashed: baseCrashedState, default: baseFollowState }; @@ -101,9 +156,6 @@ const capsuleRespawnState = { detectCollisions: false, processPlayerInputs: false, execute: (playerCapsule) => { - // TODO: - // move capsule to centre column - // decrement remaining lives // transition to live state playerCapsule.fsm.transition(capsuleLiveState); } @@ -126,45 +178,95 @@ const capsuleHitState = { const capsuleLaunchState = { name: stateNames.capsuleLaunch, - nextStates: [stateNames.capsuleDescent], + nextStates: [stateNames.capsuleAscent], detectCollisions: false, processPlayerInputs: false, execute: (playerCapsule) => { - // TODO: - // Centre capsule and base - // Launch capsule // Set bonus points to maximum - // Switch to descent mode at apogee + // Launch capsule + if (playerCapsule.canMoveVertically(verticalMove.up)) { + playerCapsule.engine.timers.add('CAPSULEASCENT', null, 1000, playerCapsule.moveUp.bind(playerCapsule)); + playerCapsule.engine.timers.start('CAPSULEASCENT'); + playerCapsule.fsm.transition(playerCapsule.fsm.states.ascent); + } + } +}; + +const capsuleAscentState = { + name: stateNames.capsuleAscent, + nextStates: [stateNames.capsuleDescent], + detectCollisions: false, + processPlayerInputs: false, + execute: (playerCapsule) => { + if (playerCapsule.currentCell.row < playerCapsule.engine.gameBoard.rows - 2) { + return; + } + const playerBase = playerCapsule.engine.playerBase; + playerCapsule.engine.timers.cancel('CAPSULEASCENT'); + playerCapsule.engine.timers.add('CAPSULEDESCENT', null, 2000, playerCapsule.moveDown.bind(playerCapsule)); + playerCapsule.engine.timers.start('CAPSULEDESCENT'); + playerCapsule.engine.playerBonus = 5000; + showBonus(playerCapsule.engine); + playerBase.fsm.transition(playerBase.fsm.states.scrollStart); + playerCapsule.fsm.transition(playerCapsule.fsm.states.descent); } }; const capsuleDescentState = { - name: stateNames.capsuleLaunch, - nextStates: [stateNames.capsuleDock, stateNames.capsuleCrash], + name: stateNames.capsuleDescent, + nextStates: [stateNames.capsuleDocked, stateNames.capsuleCrashed], detectCollisions: true, processPlayerInputs: true, execute: (playerCapsule) => { - // TODO: - // Switch base to scroll mode - // Enable capsule collision detection - // Begin descent - // Begin bonus points countdown - // Switch to crash mode at bottom row + const playerBase = playerCapsule.engine.playerBase; + // decrement bonus points + playerCapsule.engine.playerBonus -= 1; + showBonus(playerCapsule.engine); + if (playerCapsule.engine.playerBonus < 1) { + playerCapsule.engine.timers.cancel('CAPSULEDESCENT'); + playerCapsule.engine.timers.cancel('BASESCROLL'); + // transition to crashed state + playerCapsule.fsm.transition(playerCapsule.fsm.states.crashed); + playerBase.fsm.transition(playerBase.fsm.states.crashed); + } else if (playerCapsule.currentCell.row <= 1) { + playerCapsule.engine.timers.cancel('CAPSULEDESCENT'); + playerCapsule.engine.timers.cancel('BASESCROLL'); + if (playerBase.currentCell.column == playerBase.currentCell.column) { + // transition to docked state + playerCapsule.fsm.transition(playerCapsule.fsm.states.docked); + playerBase.fsm.transition(playerBase.fsm.states.docked); + } else { + // transition to crashed state + playerCapsule.engine.playerBonus = 0; + playerCapsule.fsm.transition(playerCapsule.fsm.states.crashed); + playerBase.fsm.transition(playerBase.fsm.states.crashed); + } + } } }; -const capsuleDockState = { - name: stateNames.capsuleLaunch, - nextStates: [stateNames.capsuleDock, stateNames.capsuleCrash], +const capsuleDockedState = { + name: stateNames.capsuleDocked, + nextStates: [], + detectCollisions: false, + processPlayerInputs: false, + execute: (playerCapsule) => { + // Bonus points (if any) are added to the score by the base when it enters docked state + } +}; + +const capsuleCrashedState = { + name: stateNames.capsuleCrashed, + nextStates: [stateNames.capsuleLive], detectCollisions: false, processPlayerInputs: false, execute: (playerCapsule) => { // TODO: - // Switch base to scroll mode - // Enable capsule collision detection - // Begin descent - // Begin bonus points countdown - // Switch to crash mode at bottom row + // Show bonus score + // Show total score + // Switch base to follow mode + // Switch capsule to live mode + // Begin next phase } }; @@ -174,11 +276,13 @@ const playerCapsuleFSMStates = () => { live: capsuleLiveState, launch: capsuleLaunchState, descent: capsuleDescentState, - dock: capsuleDockState, + docked: capsuleDockedState, + crashed: capsuleCrashedState, die: playerDieState, respawn: capsuleRespawnState, hit: capsuleHitState, - flash: playerFlashState + flash: playerFlashState, + ascent: capsuleAscentState }; }; @@ -187,6 +291,7 @@ const onPlayerUpdate = (playerObj) => { playerObj.fsm.execute(); } processPlayerInputs(playerObj); + playerObj.updatePosition(); }; const playerBaseUpdate = (playerBaseObject) => { @@ -196,11 +301,6 @@ const playerBaseUpdate = (playerBaseObject) => { } }; -const direction = { - left: -1, - right: 1 -}; - const inputTimeoutElapsed = () => { const now = Date.now(); const lastTime = (timing.moveToColumn && timing.moveToColumn.last) ? timing.moveToColumn.last : now; @@ -219,6 +319,7 @@ const processPlayerInputs = (playerObj) => { if (!playerObj.fsm.currentState.processPlayerInputs) { return; } + if (playerObj.engine.gamepad) { const status = playerObj.engine.gamepad.status; const buttons = playerObj.engine.gamepad.buttons; @@ -227,10 +328,10 @@ const processPlayerInputs = (playerObj) => { if (buttons.start) { debugger; } - if (sticks.left.left && inputTimeoutElapsed() && playerObj.canMoveHorizontally(direction.left)) { + if (sticks.left.left && inputTimeoutElapsed() && playerObj.canMoveHorizontally(horizontalMove.left)) { playerObj.moveLeft(); } - if (sticks.left.right && inputTimeoutElapsed() && playerObj.canMoveHorizontally(direction.right)) { + if (sticks.left.right && inputTimeoutElapsed() && playerObj.canMoveHorizontally(horizontalMove.right)) { playerObj.moveRight(); } if (buttons.a) { @@ -242,21 +343,20 @@ const processPlayerInputs = (playerObj) => { } } - if (playerObj.engine.keyHandler.pressed.left && inputTimeoutElapsed() && playerObj.canMoveHorizontally(direction.left)) { + if (playerObj.engine.keyHandler.pressed.left && inputTimeoutElapsed() && playerObj.canMoveHorizontally(horizontalMove.left)) { playerObj.moveLeft(); - } else if (playerObj.engine.keyHandler.pressed.right && inputTimeoutElapsed() && playerObj.canMoveHorizontally(direction.right)) { + } else if (playerObj.engine.keyHandler.pressed.right && inputTimeoutElapsed() && playerObj.canMoveHorizontally(horizontalMove.right)) { playerObj.moveRight(); } + if (playerObj.engine.keyHandler.pressed.enter) { - if (playerObj.state == 'landing') { + if (playerObj.fsm && playerObj.fsm.currentState && playerObj.fsm.currentState == playerObj.fsm.states.capsuleDescent) { playerObj.thrust(); } else { playerObj.shoot(); } } - playerObj.updatePosition(); - }; export { diff --git a/src/js/config/config.js b/src/js/config/config.js index 6ad4c7c..4f2fb8f 100644 --- a/src/js/config/config.js +++ b/src/js/config/config.js @@ -37,6 +37,9 @@ class Config { get phases() { return this._game.phases; }; + get debugEngine() { + return this._game.debugEngine; + } } export { diff --git a/src/js/config/game.js b/src/js/config/game.js index 64e671d..ea24a23 100644 --- a/src/js/config/game.js +++ b/src/js/config/game.js @@ -3,7 +3,7 @@ import { phase } from './phase'; import { showScore, - // gameStart, + showLives, runInterstitial, spawnWarships, nextPhase @@ -12,6 +12,7 @@ import { processor as keyProcessor } from '../ui/keyProcessor'; export const game = () => { return { + debugEngine: (location.search.indexOf('debug') > -1) ? true : false, version: 0.1, fps: 30, canvasses: { @@ -99,12 +100,14 @@ export const game = () => { } break; - case 'ADDPLAYERPOINTS': - engine.playerPoints = engine.playerPoints ? engine.playerPoints += evt.value : evt.value ; + case 'ADDPLAYERPOINTS': + const addVal = evt.value ? (!isNaN(evt.value) ? evt.value : 0) : 0; + engine.playerPoints = engine.playerPoints ? engine.playerPoints += addVal : addVal ; showScore(engine); break; case 'PLAYERBOMBED': + engine.eventSystem.dispatchEvent(engine.id, {action: 'TAKELIFE'}); for (const obj in engine.objects) { const gameObject = engine.objects[obj]; if (gameObject.isAlien && gameObject.fsm) { @@ -118,7 +121,7 @@ export const game = () => { gameObject.disposable = true; } } - engine.config.game.playerLives -= 1; + showLives(engine); break; case 'PLAYEROVERRUN': @@ -126,6 +129,7 @@ export const game = () => { console.log('Error in PLAYEROVERRUN: missing event source and/or target objects'); return; } + engine.eventSystem.dispatchEvent(engine.id, {action: 'TAKELIFE'}); const alien = evt.source; const player = evt.target; const playerBase = engine.getObjectByType('playerBase'); @@ -143,19 +147,20 @@ export const game = () => { alien.fsm.transition(alien.fsm.states.flash); player.fsm.transition(player.fsm.states.flash); playerBase && playerBase.fsm.transition(playerBase.fsm.states.flash); + showLives(engine); break; case 'ALIENDEATH': - const phase = engine.config.phases(engine.currentPhase); + const currentPhase = engine.config.phases(engine.currentPhase); switch (evt.value) { case 'warship': - if (engine.spawnedWarships && engine.spawnedWarships < phase.alienTotal('warship')) { + if (engine.spawnedWarships && engine.spawnedWarships < currentPhase.alienTotal('warship')) { // spawn a new warship spawnWarships(engine, 1); } break; case 'commandShip': - if (engine.spawnedCommandShips && engine.spawnedCommandShips < phase.alienTotal('commandShip')) { + if (engine.spawnedCommandShips && engine.spawnedCommandShips < currentPhase.alienTotal('commandShip')) { // spawn a new commandship spawnCommandShips(engine, 1); } @@ -164,27 +169,27 @@ export const game = () => { break; case 'PLAYERRESPAWN': - // TODO! - for (const obj in engine.objects) { - const gameObject = engine.objects[obj]; - if (gameObject.isPlayer) { - const currentCell = gameObject.currentCell; - if (currentCell.row != gameObject.conf.startRow || currentCell.column != gameObject.conf.startColumn) { - // reset row/column - currentCell.removeObject(gameObject); - // engine.gameBoard.board[gameObject.currentCell.row][gameObject.currentCell.column].gameObject = {}; - const startCell = engine.gameBoard.board[gameObject.conf.startRow][gameObject.conf.startColumn]; - startCell.clearObjects(); - startCell.addObject(gameObject); - gameObject.coordinates.x = startCell.x; - gameObject.coordinates.y = startCell.y; - } - gameObject.canDraw = true; - engine.eventSystem.dispatchEvent(gameObject.id, {target: 'FSM', action: 'SET', state: gameObject.fsm.states.live}); - if (gameObject.isPlayerCapsule) { - engine.eventSystem.dispatchEvent(engine.id, {action: 'RESUMEOBJECTS'}); - } - } + showScore(engine); + const playerObjects = engine.playerObjects; + for (const obj in playerObjects) { + // for (const obj in engine.objects) { + const gameObject = playerObjects[obj]; + const currentCell = gameObject.currentCell; + if (currentCell.row != gameObject.conf.startRow || currentCell.column != gameObject.conf.startColumn) { + // reset row/column + currentCell.removeObject(gameObject); + // engine.gameBoard.board[gameObject.currentCell.row][gameObject.currentCell.column].gameObject = {}; + const startCell = engine.gameBoard.board[gameObject.conf.startRow][gameObject.conf.startColumn]; + startCell.clearObjects(); + startCell.addObject(gameObject); + gameObject.coordinates.x = startCell.x; + gameObject.coordinates.y = startCell.y; + } + gameObject.canDraw = true; + engine.eventSystem.dispatchEvent(gameObject.id, {target: 'FSM', action: 'SET', state: gameObject.fsm.states.live}); + if (gameObject.isPlayerCapsule) { + engine.eventSystem.dispatchEvent(engine.id, {action: 'RESUMEOBJECTS'}); + } } break; @@ -228,6 +233,26 @@ export const game = () => { break; case 4: // if counter/bonus = 0, or capsule crashed, or docked, phase is complete + let isComplete = false; + const playerCapsule = engine.playerCapsule; + const playerBase = engine.playerBase; + if (playerCapsule && playerCapsule.fsm) { + switch (playerCapsule.fsm.currentState) { + case playerCapsule.fsm.states.docked || playerCapsule.fsm.states.crashed: + isComplete = true; + break; + } + } + if (!isComplete && (playerBase && playerBase.fsm)) { + switch(playerBase.fsm.currentState) { + case playerBase.fsm.states.docked || playerBase.fsm.states.crashed: + isComplete = true; + break; + } + } + if (isComplete) { + engine.eventSystem.dispatchEvent(engine.id, {action: 'ENDCURRENTPHASE'}); + } break; } break; @@ -247,19 +272,24 @@ export const game = () => { break; case 'GAMEOVER': - for (const obj in engine.objects) { - const gameObject = engine.objects[obj]; - if (gameObject.isPlayer || gameObject.isAlien || gameObject.isProjectile) { - gameObject.disposable = true; - } - if (gameObject.isDigit) { - gameObject.fsm.transition(gameObject.fsm.states.flash); - } + engine.currentPhase = engine.config.phases().gameover.id; + if (engine.config.game.phases(engine.currentPhase).interstitialAtEnd) { + runInterstitial(engine); + } else { + nextPhase(engine); } - break; + break; + + case 'ADDLIFE': + engine.playerLives += 1; + break; + + case 'TAKELIFE': + engine.playerLives -= 1; + break; } } - + if (evt && evt.callback) { if (evt.callbackArgs) { evt.callback(evt.callbackArgs); diff --git a/src/js/config/phase.js b/src/js/config/phase.js index e79bdc1..2118f7b 100644 --- a/src/js/config/phase.js +++ b/src/js/config/phase.js @@ -2,11 +2,41 @@ import { alienFSMStates } from '../behaviour/alienActions'; -export const phase = (phase) => { - switch (phase) { - case 0: +const phases = { + 'gameover': { + 'id': -1, + 'name': 'GameOver' + }, + 'demo': { + 'id': 0, + 'name': 'Demo' + }, + 'assault': { + 'id': 1, + 'name': 'Assault' + }, + 'dive': { + 'id': 2, + 'name': 'Dive' + }, + 'command': { + 'id': 3, + 'name': 'Dive' + }, + 'bonus': { + 'id': 4, + 'name': 'Bonus' + } +}; + +export const phase = (phaseId) => { + if (phaseId == undefined || isNaN(phaseId)) { + return phases; + } + switch (phaseId) { + case phases.demo.id: return { - name: 'demo', + name: phases.demo.name, alienTotal: (alienType) => { return (alienType == 'warship') ? 4 : 3; }, @@ -19,9 +49,9 @@ export const phase = (phase) => { }, interstitialAtEnd: true }; - case 1: + case phases.assault.id: return { - name: 'assault', + name: phases.assault.name, alienTotal: (alienType) => { return (alienType == 'warship') ? 30 : 3; }, @@ -34,9 +64,9 @@ export const phase = (phase) => { }, interstitialAtEnd: true }; - case 2: + case phases.dive.id: return { - name: 'dive', + name: phases.dive.name, alienTotal: (alienType) => { return (alienType == 'warship') ? 15 : 0; }, @@ -49,9 +79,9 @@ export const phase = (phase) => { }, interstitialAtEnd: true }; - case 3: + case phases.command.id: return { - name: 'command', + name: phases.command.name, alienTotal: (alienType) => { return (alienType == 'commandShip') ? 3 : 0; }, @@ -64,9 +94,20 @@ export const phase = (phase) => { }, interstitialAtEnd: true }; - case 4: + case phases.bonus.id: + return { + name: phases.bonus.name, + alienTotal: () => { + return 0; + }, + alienConcurrent: () => { + return 0; + }, + interstitialAtEnd: true + }; + case phases.gameover.id: return { - name: 'bonus', + name: phases.gameover.name, alienTotal: () => { return 0; }, diff --git a/src/js/custom/engine.js b/src/js/custom/engine.js index b88b3d5..2213be1 100644 --- a/src/js/custom/engine.js +++ b/src/js/custom/engine.js @@ -1,4 +1,5 @@ import { Engine } from 'eccentric-engine/Engine'; +// import { Engine } from '../../../../EccentricEngine/src/engine/engine'; class AWEngine extends Engine { constructor(cfg, lfcyc) { @@ -8,6 +9,26 @@ class AWEngine extends Engine { this.playerPoints = 0; this.playerLives = 0; this.currentPhase = 0; + this.playerBonus = 0; + } + get playerCapsule() { + const capsuleObjs = this.gameObjects.filter(function(obj) { return obj.isPlayerCapsule; }); + return capsuleObjs && capsuleObjs.length > 0 && capsuleObjs[0]; + } + get playerBase() { + const baseObjs = this.gameObjects.filter(function(obj) { return obj.isPlayerBase; }); + return baseObjs && baseObjs.length > 0 && baseObjs[0]; + } + get playerObjects() { + const capsule = this.playerCapsule; + const base = this.playerBase; + return [capsule, base]; + } +} + +AWEngine.prototype.disposeAllObjects = function() { + for (const obj in this.gameObjects) { + this.gameObjects[obj].disposable = true; } } diff --git a/src/js/model/cellBasedGameObject.js b/src/js/model/cellBasedGameObject.js index bea3ee8..e6d6818 100644 --- a/src/js/model/cellBasedGameObject.js +++ b/src/js/model/cellBasedGameObject.js @@ -1,5 +1,11 @@ import { GameObject } from 'eccentric-engine/Engine'; +// import { GameObject } from '../../../../EccentricEngine/src/model/gameObject'; + +import { + horizontalMove, + verticalMove +} from './cellBasedMovement'; // A super-class derived from a generic GameObject that all our custom // game objects will extend. @@ -19,7 +25,7 @@ class CellBasedGameObject extends GameObject { } } -// some behaviours that are common to all our custom objects (may be overridden by descendant classes) +// some behaviours that are common to all our custom objects (may be overridden by descendent classes) CellBasedGameObject.prototype.selectSprite = function(cell) { // draw sprite image based on default or row/col position @@ -47,31 +53,45 @@ CellBasedGameObject.prototype.moveToCell = function (cell) { CellBasedGameObject.prototype.canMoveVertically = function (dir, canWrap) { switch (dir) { - case 1: // up + case verticalMove.up: return (this.currentCell.row < this.engine.gameBoard.rows - 1) || canWrap; - case -1: // down + case verticalMove.down: return (this.currentCell.row > 1) || canWrap; } }; CellBasedGameObject.prototype.canMoveHorizontally = function (dir, canWrap) { switch (dir) { - case -1: // left + case horizontalMove.left: return (this.currentCell.column > 0) || canWrap; - case 1: // right + case horizontalMove.right: return (this.currentCell.column < this.engine.gameBoard.columns - 1) || canWrap; } }; -CellBasedGameObject.prototype.moveLeft = function() { - const maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, -1, 0); +CellBasedGameObject.prototype.moveLeft = function(canWrap) { + const maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, horizontalMove.left, verticalMove.none, canWrap); + if (maybeNeighbourCell) { + this.moveToCell(maybeNeighbourCell); + } +} + +CellBasedGameObject.prototype.moveRight = function(canWrap) { + let maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, horizontalMove.right, verticalMove.none, canWrap); + if (maybeNeighbourCell) { + this.moveToCell(maybeNeighbourCell); + } +} + +CellBasedGameObject.prototype.moveUp = function(canWrap) { + const maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, horizontalMove.none, verticalMove.up, canWrap); if (maybeNeighbourCell) { this.moveToCell(maybeNeighbourCell); } } -CellBasedGameObject.prototype.moveRight = function() { - let maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, 1, 0); +CellBasedGameObject.prototype.moveDown = function(canWrap) { + const maybeNeighbourCell = this.engine.gameBoard.cellNeighbour(this.currentCell, horizontalMove.none, verticalMove.down, canWrap); if (maybeNeighbourCell) { this.moveToCell(maybeNeighbourCell); } diff --git a/src/js/model/cellBasedMovement.js b/src/js/model/cellBasedMovement.js new file mode 100644 index 0000000..6985daf --- /dev/null +++ b/src/js/model/cellBasedMovement.js @@ -0,0 +1,35 @@ +// some definitions for movement within a cell-based game world + +export const horizontalMove = { + right: 1, + left: -1, + none: 0 +}; + +export const verticalMove = { + up: 1, + down: -1, + none: 0 +}; + +export const verticalMoveDown = { + down: verticalMove.down +}; + +export const moveInstructions = { + leftRight: { + horizontal: horizontalMove, + }, + upDown: { + vertical: verticalMove + }, + diagonal: { + horizontal: horizontalMove, + vertical: verticalMove + }, + diagonalDown: { + horizontal: horizontalMove, + vertical: verticalMoveDown + }, +}; + diff --git a/src/js/model/players.js b/src/js/model/players.js index 1ccf4f0..1aecdf5 100644 --- a/src/js/model/players.js +++ b/src/js/model/players.js @@ -1,6 +1,12 @@ import { PlayerMissile } from '../model/projectiles'; import { CellBasedGameObject } from '../model/cellBasedGameObject'; +import { + horizontalMove, + verticalMove, + horizontalMoveDown, + moveInstructions, +} from './cellBasedMovement'; const playerCapsuleEventListener = (thisObj, evt) => { if (evt.target && evt.target == 'FSM' && evt.state) { @@ -30,36 +36,38 @@ class Player extends CellBasedGameObject { } Player.prototype.canMoveVertically = function (dir) { + let canMove = false; switch (dir) { - case 1: // up - if (this.isPlayerCapsule && this.engine.currentPhase == 3 && this.state == 'launch') { - return true; - } + case verticalMove.up: + canMove = ( + this.isPlayerCapsule && + this.engine.currentPhase == 4 && + this.fsm && this.fsm.currentState && this.fsm.currentState.name == 'capsuleLaunch' && + this.currentCell.row < 6 + ); break - case -1: // down - if (this.isPlayerCapsule && this.engine.currentPhase == 3 && this.state == 'landing') { - return true; - } + case verticalMove.down: + canMove = ( + this.isPlayerCapsule && + this.engine.currentPhase == 4 && + this.fsm && this.fsm.currentState && this.fsm.currentState.name == 'capsuleDescent' && + this.currentCell.row > 1 + ); break; } - return false; + return canMove; }; Player.prototype.canMoveHorizontally = function (dir) { - if (this.isPlayerBase && this.engine.currentPhase == 3 && this.state == 'scroll') { - switch (dir) { - case -1: // left - return false; - case 1: // right - return true; - } + let canMove = false; + if (this.isPlayerBase && this.engine.currentPhase == 4 && this.state == 'scroll') { + // only allow scrolling in a left-to-right direction + canMove = dir == horizontalMove.right; + } else { + // only allow horizontal movement if we're within the gameBoard's borders + canMove = (dir == horizontalMove.left && this.currentCell.column > 0) || (dir == horizontalMove.right && this.currentCell.column < this.engine.gameBoard.columns - 1); } - switch (dir) { - case -1: // left - return this.currentCell.column > 0; - case 1: // right - return this.currentCell.column < this.engine.gameBoard.columns - 1; - } + return canMove; }; class PlayerCapsule extends Player {