From ca4140c558f6a6333cc9fd61b108b3e8be888aef Mon Sep 17 00:00:00 2001 From: Lucas Kent <97860398+Bulbous-Baboon@users.noreply.github.com> Date: Wed, 4 Jan 2023 13:59:26 -0500 Subject: [PATCH] gaming --- tools/flappy-2048/.gitignore | 1 - tools/flappy-2048/.jshintrc | 19 - tools/flappy-2048/CONTRIBUTING.md | 2 - tools/flappy-2048/LICENSE.txt | 21 - tools/flappy-2048/README.md | 10 - tools/flappy-2048/favicon.ico | Bin 4286 -> 0 bytes tools/flappy-2048/index.html | 92 - tools/flappy-2048/js/animframe_polyfill.js | 26 - tools/flappy-2048/js/application.js | 4 - tools/flappy-2048/js/game_manager.js | 295 ---- tools/flappy-2048/js/grid.js | 84 - tools/flappy-2048/js/html_actuator.js | 165 -- .../flappy-2048/js/keyboard_input_manager.js | 55 - tools/flappy-2048/js/local_score_manager.js | 48 - tools/flappy-2048/js/tile.js | 17 - tools/flappy-2048/meta/apple-touch-icon.png | Bin 5808 -> 0 bytes .../style/fonts/ClearSans-Bold-webfont.eot | Bin 23821 -> 0 bytes .../style/fonts/ClearSans-Bold-webfont.svg | 640 ------- .../style/fonts/ClearSans-Bold-webfont.woff | Bin 27120 -> 0 bytes .../style/fonts/ClearSans-Light-webfont.eot | Bin 25570 -> 0 bytes .../style/fonts/ClearSans-Light-webfont.svg | 670 ------- .../style/fonts/ClearSans-Light-webfont.woff | Bin 28700 -> 0 bytes .../style/fonts/ClearSans-Regular-webfont.eot | Bin 23490 -> 0 bytes .../style/fonts/ClearSans-Regular-webfont.svg | 669 ------- .../fonts/ClearSans-Regular-webfont.woff | Bin 26764 -> 0 bytes tools/flappy-2048/style/fonts/clear-sans.css | 30 - tools/flappy-2048/style/main.css | 703 -------- tools/radius-raid/.gitignore | 7 - tools/radius-raid/LICENSE.md | 20 - tools/radius-raid/README.md | 32 - tools/radius-raid/index.html | 72 - tools/radius-raid/js/audio.js | 40 - tools/radius-raid/js/bullet.js | 100 -- tools/radius-raid/js/button.js | 103 -- tools/radius-raid/js/definitions.js | 831 --------- tools/radius-raid/js/enemy.js | 161 -- tools/radius-raid/js/explosion.js | 51 - tools/radius-raid/js/game.js | 1555 ----------------- tools/radius-raid/js/hero.js | 216 --- tools/radius-raid/js/jsfxr.js | 7 - tools/radius-raid/js/levelpop.js | 58 - tools/radius-raid/js/particle.js | 52 - tools/radius-raid/js/particleemitter.js | 43 - tools/radius-raid/js/powerup.js | 122 -- tools/radius-raid/js/storage.js | 36 - tools/radius-raid/js/text.js | 95 - tools/radius-raid/js/textpop.js | 45 - tools/radius-raid/js/util.js | 101 -- tools/radius-raid/min.html | 107 -- tools/radius-raid/min.zip | Bin 13278 -> 0 bytes tools/test/auto-text-effect/index.html | 19 - tools/test/auto-text-effect/script.js | 22 - tools/test/auto-text-effect/style.css | 38 - tools/test/hoverboard/index.html | 13 - tools/test/hoverboard/script.js | 29 - tools/test/hoverboard/style.css | 34 - 56 files changed, 7560 deletions(-) delete mode 100644 tools/flappy-2048/.gitignore delete mode 100644 tools/flappy-2048/.jshintrc delete mode 100644 tools/flappy-2048/CONTRIBUTING.md delete mode 100644 tools/flappy-2048/LICENSE.txt delete mode 100644 tools/flappy-2048/README.md delete mode 100644 tools/flappy-2048/favicon.ico delete mode 100644 tools/flappy-2048/index.html delete mode 100644 tools/flappy-2048/js/animframe_polyfill.js delete mode 100644 tools/flappy-2048/js/application.js delete mode 100644 tools/flappy-2048/js/game_manager.js delete mode 100644 tools/flappy-2048/js/grid.js delete mode 100644 tools/flappy-2048/js/html_actuator.js delete mode 100644 tools/flappy-2048/js/keyboard_input_manager.js delete mode 100644 tools/flappy-2048/js/local_score_manager.js delete mode 100644 tools/flappy-2048/js/tile.js delete mode 100644 tools/flappy-2048/meta/apple-touch-icon.png delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.eot delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.svg delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.woff delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Light-webfont.eot delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Light-webfont.svg delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Light-webfont.woff delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.eot delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.svg delete mode 100644 tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.woff delete mode 100644 tools/flappy-2048/style/fonts/clear-sans.css delete mode 100644 tools/flappy-2048/style/main.css delete mode 100644 tools/radius-raid/.gitignore delete mode 100644 tools/radius-raid/LICENSE.md delete mode 100644 tools/radius-raid/README.md delete mode 100644 tools/radius-raid/index.html delete mode 100644 tools/radius-raid/js/audio.js delete mode 100644 tools/radius-raid/js/bullet.js delete mode 100644 tools/radius-raid/js/button.js delete mode 100644 tools/radius-raid/js/definitions.js delete mode 100644 tools/radius-raid/js/enemy.js delete mode 100644 tools/radius-raid/js/explosion.js delete mode 100644 tools/radius-raid/js/game.js delete mode 100644 tools/radius-raid/js/hero.js delete mode 100644 tools/radius-raid/js/jsfxr.js delete mode 100644 tools/radius-raid/js/levelpop.js delete mode 100644 tools/radius-raid/js/particle.js delete mode 100644 tools/radius-raid/js/particleemitter.js delete mode 100644 tools/radius-raid/js/powerup.js delete mode 100644 tools/radius-raid/js/storage.js delete mode 100644 tools/radius-raid/js/text.js delete mode 100644 tools/radius-raid/js/textpop.js delete mode 100644 tools/radius-raid/js/util.js delete mode 100644 tools/radius-raid/min.html delete mode 100644 tools/radius-raid/min.zip delete mode 100644 tools/test/auto-text-effect/index.html delete mode 100644 tools/test/auto-text-effect/script.js delete mode 100644 tools/test/auto-text-effect/style.css delete mode 100644 tools/test/hoverboard/index.html delete mode 100644 tools/test/hoverboard/script.js delete mode 100644 tools/test/hoverboard/style.css diff --git a/tools/flappy-2048/.gitignore b/tools/flappy-2048/.gitignore deleted file mode 100644 index 0d31019..0000000 --- a/tools/flappy-2048/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.sass-cache/ diff --git a/tools/flappy-2048/.jshintrc b/tools/flappy-2048/.jshintrc deleted file mode 100644 index 87dbf9a..0000000 --- a/tools/flappy-2048/.jshintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "esnext": true, - "indent": 2, - "maxlen": 80, - "freeze": true, - "camelcase": true, - "unused": true, - "eqnull": true, - "proto": true, - "supernew": true, - "noyield": true, - "evil": true, - "node": true, - "boss": true, - "expr": true, - "loopfunc": true, - "white": true, - "maxdepth": 4 -} diff --git a/tools/flappy-2048/CONTRIBUTING.md b/tools/flappy-2048/CONTRIBUTING.md deleted file mode 100644 index e06deb5..0000000 --- a/tools/flappy-2048/CONTRIBUTING.md +++ /dev/null @@ -1,2 +0,0 @@ -## Contributing -Changes and improvements are more than welcome! Feel free to fork and open a pull request. Please make your changes in a specifically made branch and request to pull on `gh-pages`! If you can, please make sure the game fully works before sending the PR, as that will help speed up the process. diff --git a/tools/flappy-2048/LICENSE.txt b/tools/flappy-2048/LICENSE.txt deleted file mode 100644 index b0dbfa4..0000000 --- a/tools/flappy-2048/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Gabriele Cirulli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/tools/flappy-2048/README.md b/tools/flappy-2048/README.md deleted file mode 100644 index dfd2e79..0000000 --- a/tools/flappy-2048/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Flappy 2048 -Merged [2048](http://gabrielecirulli.github.io/2048/) and [Flappy Bird.](http://en.wikipedia.org/wiki/Flappy_Bird) - -[Play it!](http://hczhcz.github.io/Flappy-2048/) - -## Contributing -Changes and improvements are more than welcome! Feel free to fork and open a pull request. Please make your changes in a specific branch and request to pull into `gh-pages`! If you can, please make sure the game fully works before sending the PR, as that will help speed up the process. - -## License -Flappy-2048 is licensed under the [MIT license.](https://github.com/gabrielecirulli/2048/blob/master/LICENSE.txt) diff --git a/tools/flappy-2048/favicon.ico b/tools/flappy-2048/favicon.ico deleted file mode 100644 index 22109e04a9f44bde18ec7b7a4b7410d0246521bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmZQzU}RuqP*4ET3Jfa*7#PGD7#K7d7#I{77#JKFAmR)R3=9nd3=G2D5Dem@;3IGR z7>>Nz$8hA$7ltEm{?iD9%m&%vi)MEVjqJncj~1{Sj=b?50J~xC0@)1;4;Y``G|28x z1L*(H186tB!+O*{+LbGG30tKz@Bf1^IcXN84}=9zyv13jG4 zABqx}D<8pf=x%|T1+xdF4n^bt|NlX1koAH1$ZBAAfy6=T?tcFRmIl#hKK}-@K?F#y zA@Aq#h&=QV-Gx69=(D;vftY1E~S= zL1utxTo|MmrWU3bW>4siPZ;3`azD&0kY11;5DgLonFHd3FiaiD3>X^}E+Dlq^FeL{ zsRe}@NIytj+MO>TCK!X_6eN$1LFRxIfb@anKxTsYxaOmM3-XJj;2I&Kd!^{Hd1@U3>$l(vN2PTe8!^|ju@D*7Y%m(=r zWF9hx`4yx9rWaWZBo4#K`ao=u`#|{v6b>L7rXM5+!XW>F!GG;WaN5dK|4Gd)a8)P@A4=_;a6lAv#T6oaYEs%cbkv9X^{{(kJ n85kHK{ZLSN(6UbiG8<%v56s#F3=GT-pdkX70G()%ogljbwNh1` diff --git a/tools/flappy-2048/index.html b/tools/flappy-2048/index.html deleted file mode 100644 index a4d7802..0000000 --- a/tools/flappy-2048/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Flappy 2048 - - - - - - - - - - - -
-
-

Flappy 2048

-
-
0
-
0
-
-
-

Jump through the tiles and get to 2048!

- -
-
-

- -
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

- How to play: Press any key to move the tile. When the tile go through a barrier, you get score! -

-
-

- Created by hcz. Based on 2048 by Gabriele Cirulli and Flappy Bird by Dong Nguyen. -

-
-

More 2048 games:

-

Racing 2048, Upside down, Role reversal, Easy ver, 喵 ver, Customizable 2048

-
- - Fork me on GitHub - - - - - - - - - - - diff --git a/tools/flappy-2048/js/animframe_polyfill.js b/tools/flappy-2048/js/animframe_polyfill.js deleted file mode 100644 index c45a13e..0000000 --- a/tools/flappy-2048/js/animframe_polyfill.js +++ /dev/null @@ -1,26 +0,0 @@ -(function() { - var lastTime = 0; - var vendors = ['webkit', 'moz']; - for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; - window.cancelAnimationFrame = - window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; - } - - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function(callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function() { callback(currTime + timeToCall); }, - timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - } - - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function(id) { - clearTimeout(id); - }; - } -}()); diff --git a/tools/flappy-2048/js/application.js b/tools/flappy-2048/js/application.js deleted file mode 100644 index a4d310a..0000000 --- a/tools/flappy-2048/js/application.js +++ /dev/null @@ -1,4 +0,0 @@ -// Wait till the browser is ready to render the game (avoids glitches) -window.requestAnimationFrame(function () { - new GameManager(4, KeyboardInputManager, HTMLActuator, LocalScoreManager); -}); diff --git a/tools/flappy-2048/js/game_manager.js b/tools/flappy-2048/js/game_manager.js deleted file mode 100644 index 6591ef0..0000000 --- a/tools/flappy-2048/js/game_manager.js +++ /dev/null @@ -1,295 +0,0 @@ -function GameManager(size, InputManager, Actuator, ScoreManager) { - this.inputManager = new InputManager; - this.scoreManager = new ScoreManager; - this.actuator = new Actuator; - - // hack - if (!Function.prototype.bind) { - Function.prototype.bind = function (oThis) { - var aArgs = Array.prototype.slice.call(arguments, 1), - fToBind = this, - fNOP = function () {}, - fBound = function () { - return fToBind.apply(this instanceof fNOP && oThis - ? this - : oThis || window, - aArgs.concat(Array.prototype.slice.call(arguments))); - }; - - fNOP.prototype = this.prototype; - fBound.prototype = new fNOP(); - - return fBound; - }; - } - - this.inputManager.on("jump", this.jump.bind(this)); - - this.setup(); - - this.timer(); -} - -// Restart the game -GameManager.prototype.restart = function () { - this.actuator.continue(); - this.setup(); -}; - -// Keep playing after winning -GameManager.prototype.keepPlaying = function () { - this.keepPlaying = true; - this.actuator.continue(); -}; - -GameManager.prototype.isGameTerminated = function () { - if (this.over || (this.won && !this.keepPlaying)) { - return true; - } else { - return false; - } -}; - -// Set up the game -GameManager.prototype.setup = function () { - this.score = 0; - this.birdpos = 0.5; - this.birdspd = 0; - this.ab = 1; - this.cd = 1; -}; - -// Set up the initial tiles to start the game with -GameManager.prototype.addStartTiles = function () { - for (var i = 0; i < this.startTiles; i++) { - this.addRandomTile(); - } -}; - -// Adds a tile in a random position -GameManager.prototype.addRandomTile = function () { - if (this.grid.cellsAvailable()) { - var value = Math.random() < 0.9 ? 2 : 4; - var tile = new Tile(this.grid.randomAvailableCell(), value); - - this.grid.insertTile(tile); - } -}; - -// Sends the updated grid to the actuator -GameManager.prototype.actuate = function () { - if (this.scoreManager.get() < this.score) { - this.scoreManager.set(this.score); - } - - this.actuator.actuate(this.grid, { - score: this.score, - bestScore: this.scoreManager.get(), - birdpos: this.birdpos, - ab: this.ab, - cd: this.cd - }); - -}; - -// Save all tile positions and remove merger info -GameManager.prototype.prepareTiles = function () { - this.grid.eachCell(function (x, y, tile) { - if (tile) { - tile.mergedFrom = null; - tile.savePosition(); - } - }); -}; - -// Move a tile and its representation -GameManager.prototype.moveTile = function (tile, cell) { - this.grid.cells[tile.x][tile.y] = null; - this.grid.cells[cell.x][cell.y] = tile; - tile.updatePosition(cell); -}; - -// Move tiles on the grid in the specified direction -GameManager.prototype.move = function (direction) { - // 0: up, 1: right, 2:down, 3: left - var self = this; - - if (this.isGameTerminated()) return; // Don't do anything if the game's over - - var cell, tile; - - var vector = this.getVector(direction); - var traversals = this.buildTraversals(vector); - var moved = false; - - // Save the current tile positions and remove merger information - this.prepareTiles(); - - // Traverse the grid in the right direction and move tiles - traversals.x.forEach(function (x) { - traversals.y.forEach(function (y) { - cell = { x: x, y: y }; - tile = self.grid.cellContent(cell); - - if (tile) { - var positions = self.findFarthestPosition(cell, vector); - var next = self.grid.cellContent(positions.next); - - // Only one merger per row traversal? - if (next && next.value === tile.value && !next.mergedFrom) { - var merged = new Tile(positions.next, tile.value * 2); - merged.mergedFrom = [tile, next]; - - self.grid.insertTile(merged); - self.grid.removeTile(tile); - - // Converge the two tiles' positions - tile.updatePosition(positions.next); - - // Update the score - self.score += merged.value; - - // The mighty 2048 tile - if (merged.value === 2048) self.won = true; - } else { - self.moveTile(tile, positions.farthest); - } - - if (!self.positionsEqual(cell, tile)) { - moved = true; // The tile moved from its original cell! - } - } - }); - }); - - if (moved) { - this.addRandomTile(); - - if (!this.movesAvailable()) { - this.over = true; // Game over! - } - - this.actuate(); - } -}; - -// Get the vector representing the chosen direction -GameManager.prototype.getVector = function (direction) { - // Vectors representing tile movement - var map = { - 0: { x: 0, y: -1 }, // up - 1: { x: 1, y: 0 }, // right - 2: { x: 0, y: 1 }, // down - 3: { x: -1, y: 0 } // left - }; - - return map[direction]; -}; - -// Build a list of positions to traverse in the right order -GameManager.prototype.buildTraversals = function (vector) { - var traversals = { x: [], y: [] }; - - for (var pos = 0; pos < this.size; pos++) { - traversals.x.push(pos); - traversals.y.push(pos); - } - - // Always traverse from the farthest cell in the chosen direction - if (vector.x === 1) traversals.x = traversals.x.reverse(); - if (vector.y === 1) traversals.y = traversals.y.reverse(); - - return traversals; -}; - -GameManager.prototype.findFarthestPosition = function (cell, vector) { - var previous; - - // Progress towards the vector direction until an obstacle is found - do { - previous = cell; - cell = { x: previous.x + vector.x, y: previous.y + vector.y }; - } while (this.grid.withinBounds(cell) && - this.grid.cellAvailable(cell)); - - return { - farthest: previous, - next: cell // Used to check if a merge is required - }; -}; - -GameManager.prototype.movesAvailable = function () { - return this.grid.cellsAvailable() || this.tileMatchesAvailable(); -}; - -// Check for available matches between tiles (more expensive check) -GameManager.prototype.tileMatchesAvailable = function () { - var self = this; - - var tile; - - for (var x = 0; x < this.size; x++) { - for (var y = 0; y < this.size; y++) { - tile = this.grid.cellContent({ x: x, y: y }); - - if (tile) { - for (var direction = 0; direction < 4; direction++) { - var vector = self.getVector(direction); - var cell = { x: x + vector.x, y: y + vector.y }; - - var other = self.grid.cellContent(cell); - - if (other && other.value === tile.value) { - return true; // These two tiles can be merged - } - } - } - } - } - - return false; -}; - -GameManager.prototype.positionsEqual = function (first, second) { - return first.x === second.x && first.y === second.y; -}; - -GameManager.prototype.timer = function () { - var self = this; - - // move - this.birdpos += this.birdspd; - this.birdspd += 0.00015 / (this.birdspd + 0.1); - - if (this.birdpos > 1 && this.birdspd > 0) this.birdspd = -this.birdspd; - if (this.birdpos < -0.25 && this.birdspd < 0) this.birdspd = -this.birdspd; - - this.score += 1 / 64; - - // check - - var steppos = this.score - Math.floor(this.score); - - if (steppos > 5 / 12 && steppos < 11 / 12) { - var range = {0: [-0.15, 0.3], 1: [0.2, 0.55], 2: [0.45, 0.9]}; - if (this.birdpos < range[this.ab][0] || this.birdpos > range[this.ab][1]) { - this.score = steppos; // cut down the integer part - } - } - - if (steppos == 0) { - this.ab = this.cd; - this.cd = Math.floor(Math.random() * 3); - } - - setTimeout(function () {self.timer();}, 384 / Math.sqrt(this.score + 256)); - this.actuate(); -} - -GameManager.prototype.jump = function () { - if (this.birdspd < 0) { - this.birdspd = -0.03; - } else { - this.birdspd = -0.025; - } -} diff --git a/tools/flappy-2048/js/grid.js b/tools/flappy-2048/js/grid.js deleted file mode 100644 index 05fe057..0000000 --- a/tools/flappy-2048/js/grid.js +++ /dev/null @@ -1,84 +0,0 @@ -function Grid(size) { - this.size = size; - - this.cells = []; - - this.build(); -} - -// Build a grid of the specified size -Grid.prototype.build = function () { - for (var x = 0; x < this.size; x++) { - var row = this.cells[x] = []; - - for (var y = 0; y < this.size; y++) { - row.push(null); - } - } -}; - -// Find the first available random position -Grid.prototype.randomAvailableCell = function () { - var cells = this.availableCells(); - - if (cells.length) { - return cells[Math.floor(Math.random() * cells.length)]; - } -}; - -Grid.prototype.availableCells = function () { - var cells = []; - - this.eachCell(function (x, y, tile) { - if (!tile) { - cells.push({ x: x, y: y }); - } - }); - - return cells; -}; - -// Call callback for every cell -Grid.prototype.eachCell = function (callback) { - for (var x = 0; x < this.size; x++) { - for (var y = 0; y < this.size; y++) { - callback(x, y, this.cells[x][y]); - } - } -}; - -// Check if there are any cells available -Grid.prototype.cellsAvailable = function () { - return !!this.availableCells().length; -}; - -// Check if the specified cell is taken -Grid.prototype.cellAvailable = function (cell) { - return !this.cellOccupied(cell); -}; - -Grid.prototype.cellOccupied = function (cell) { - return !!this.cellContent(cell); -}; - -Grid.prototype.cellContent = function (cell) { - if (this.withinBounds(cell)) { - return this.cells[cell.x][cell.y]; - } else { - return null; - } -}; - -// Inserts a tile at its position -Grid.prototype.insertTile = function (tile) { - this.cells[tile.x][tile.y] = tile; -}; - -Grid.prototype.removeTile = function (tile) { - this.cells[tile.x][tile.y] = null; -}; - -Grid.prototype.withinBounds = function (position) { - return position.x >= 0 && position.x < this.size && - position.y >= 0 && position.y < this.size; -}; diff --git a/tools/flappy-2048/js/html_actuator.js b/tools/flappy-2048/js/html_actuator.js deleted file mode 100644 index ddd15a8..0000000 --- a/tools/flappy-2048/js/html_actuator.js +++ /dev/null @@ -1,165 +0,0 @@ -function HTMLActuator() { - this.gridContainer = document.querySelector(".grid-container"); - // this.tileContainer = document.querySelector(".tile-container"); - this.scoreContainer = document.querySelector(".score-container"); - this.bestContainer = document.querySelector(".best-container"); - this.messageContainer = document.querySelector(".game-message"); - this.birdobj = document.querySelector(".tile-bird"); - this.birdinn = document.querySelector(".tile-bird .tile-inner"); - this.blockobja = document.querySelector(".tile-block-a"); - this.blockobjb = document.querySelector(".tile-block-b"); - this.blockobjc = document.querySelector(".tile-block-c"); - this.blockobjd = document.querySelector(".tile-block-d"); - this.blockinna = document.querySelector(".tile-block-a .tile-inner"); - this.blockinnb = document.querySelector(".tile-block-b .tile-inner"); - this.blockinnc = document.querySelector(".tile-block-c .tile-inner"); - this.blockinnd = document.querySelector(".tile-block-d .tile-inner"); -} - -HTMLActuator.prototype.actuate = function (grid, metadata) { - var self = this; - - var classes = ["tile", "tile-bird"]; - - var s = Math.floor(metadata.score); - - if (s > 2048) classes.push("tile-super") - else if (s > 1024) classes.push("tile-2048") - else if (s > 512) classes.push("tile-1024") - else if (s > 256) classes.push("tile-512") - else if (s > 128) classes.push("tile-256") - else if (s > 64) classes.push("tile-128") - else if (s > 32) classes.push("tile-64") - else if (s > 16) classes.push("tile-32") - else if (s > 8) classes.push("tile-16") - else if (s > 4) classes.push("tile-8") - else if (s > 2) classes.push("tile-4") - else classes.push("tile-2"); - - this.applyClasses(this.birdobj, classes); - - var zonesize = this.gridContainer.clientHeight; - var morepos = 0.75 * (metadata.score - s); - - this.birdobj.style.top = metadata.birdpos * zonesize + "px"; - - this.blockobja.style.top = [0.5 , 0 , 0 ][metadata.ab] * zonesize + "px"; - this.blockobjb.style.top = [0.75, 0.75, 0.25][metadata.ab] * zonesize + "px"; - this.blockobjc.style.top = [0.5 , 0 , 0 ][metadata.cd] * zonesize + "px"; - this.blockobjd.style.top = [0.75, 0.75, 0.25][metadata.cd] * zonesize + "px"; - - this.blockobja.style.left = (0.5 - morepos) * zonesize + "px"; - this.blockobjb.style.left = (0.5 - morepos) * zonesize + "px"; - this.blockobjc.style.left = (1.25 - morepos) * zonesize + "px"; - this.blockobjd.style.left = (1.25 - morepos) * zonesize + "px"; - - this.birdinn.textContent = s; - - window.requestAnimationFrame(function () { - self.updateScore(s); - self.updateBestScore(Math.floor(metadata.bestScore)); - }); -}; - -// Continues the game (both restart and keep playing) -HTMLActuator.prototype.continue = function () { - this.clearMessage(); -}; - -HTMLActuator.prototype.clearContainer = function (container) { - while (container.firstChild) { - container.removeChild(container.firstChild); - } -}; - -HTMLActuator.prototype.addTile = function (tile) { - var self = this; - - var wrapper = document.createElement("div"); - var inner = document.createElement("div"); - var position = tile.previousPosition || { x: tile.x, y: tile.y }; - var positionClass = this.positionClass(position); - - // We can't use classlist because it somehow glitches when replacing classes - var classes = ["tile", "tile-" + tile.value, positionClass]; - - if (tile.value > 2048) classes.push("tile-super"); - - this.applyClasses(wrapper, classes); - - inner.classList.add("tile-inner"); - inner.textContent = tile.value; - - if (tile.previousPosition) { - // Make sure that the tile gets rendered in the previous position first - window.requestAnimationFrame(function () { - classes[2] = self.positionClass({ x: tile.x, y: tile.y }); - self.applyClasses(wrapper, classes); // Update the position - }); - } else if (tile.mergedFrom) { - classes.push("tile-merged"); - this.applyClasses(wrapper, classes); - - // Render the tiles that merged - tile.mergedFrom.forEach(function (merged) { - self.addTile(merged); - }); - } else { - classes.push("tile-new"); - this.applyClasses(wrapper, classes); - } - - // Add the inner part of the tile to the wrapper - wrapper.appendChild(inner); - - // Put the tile on the board - // this.tileContainer.appendChild(wrapper); -}; - -HTMLActuator.prototype.applyClasses = function (element, classes) { - element.setAttribute("class", classes.join(" ")); -}; - -HTMLActuator.prototype.normalizePosition = function (position) { - return { x: position.x + 1, y: position.y + 1 }; -}; - -HTMLActuator.prototype.positionClass = function (position) { - position = this.normalizePosition(position); - return "tile-position-" + position.x + "-" + position.y; -}; - -HTMLActuator.prototype.updateScore = function (score) { - //this.clearContainer(this.scoreContainer); - - var difference = score - this.score; - this.score = score; - - if (difference > 0) { - this.scoreContainer.textContent = this.score; - - var addition = document.createElement("div"); - addition.classList.add("score-addition"); - addition.textContent = "+" + difference; - - this.scoreContainer.appendChild(addition); - } -}; - -HTMLActuator.prototype.updateBestScore = function (bestScore) { - this.bestContainer.textContent = bestScore; -}; - -HTMLActuator.prototype.message = function (won) { - var type = won ? "game-won" : "game-over"; - var message = won ? "You win!" : "Game over!"; - - this.messageContainer.classList.add(type); - this.messageContainer.getElementsByTagName("p")[0].textContent = message; -}; - -HTMLActuator.prototype.clearMessage = function () { - // IE only takes one value to remove at a time. - this.messageContainer.classList.remove("game-won"); - this.messageContainer.classList.remove("game-over"); -}; diff --git a/tools/flappy-2048/js/keyboard_input_manager.js b/tools/flappy-2048/js/keyboard_input_manager.js deleted file mode 100644 index 9a55b75..0000000 --- a/tools/flappy-2048/js/keyboard_input_manager.js +++ /dev/null @@ -1,55 +0,0 @@ -function KeyboardInputManager() { - this.events = {}; - - this.listen(); -} - -KeyboardInputManager.prototype.on = function (event, callback) { - if (!this.events[event]) { - this.events[event] = []; - } - this.events[event].push(callback); -}; - -KeyboardInputManager.prototype.emit = function (event, data) { - var callbacks = this.events[event]; - if (callbacks) { - callbacks.forEach(function (callback) { - callback(data); - }); - } -}; - -KeyboardInputManager.prototype.listen = function () { - var self = this; - - function dojump(event) { - var modifiers = event.altKey || event.ctrlKey || event.metaKey || - event.shiftKey; - - if (!modifiers) { - if (event.which >= 8 && event.which < 48) event.preventDefault(); - self.emit("jump"); - } - } - - function dojump2(event) { - event.preventDefault(); - self.emit("jump"); - } - - document.addEventListener("keydown", dojump); - var gameContainer = document.querySelector(".game-container"); - gameContainer.addEventListener("click", dojump2); - gameContainer.addEventListener("touchstart", dojump2); -}; - -KeyboardInputManager.prototype.restart = function (event) { - event.preventDefault(); - this.emit("restart"); -}; - -KeyboardInputManager.prototype.keepPlaying = function (event) { - event.preventDefault(); - this.emit("keepPlaying"); -}; diff --git a/tools/flappy-2048/js/local_score_manager.js b/tools/flappy-2048/js/local_score_manager.js deleted file mode 100644 index 63c0867..0000000 --- a/tools/flappy-2048/js/local_score_manager.js +++ /dev/null @@ -1,48 +0,0 @@ -window.fakeStorage = { - _data: {}, - - setItem: function (id, val) { - return this._data[id] = String(val); - }, - - getItem: function (id) { - return this._data.hasOwnProperty(id) ? this._data[id] : undefined; - }, - - removeItem: function (id) { - return delete this._data[id]; - }, - - clear: function () { - return this._data = {}; - } -}; - -function LocalScoreManager() { - this.key = "bestScoreF"; - - var supported = this.localStorageSupported(); - this.storage = supported ? window.localStorage : window.fakeStorage; -} - -LocalScoreManager.prototype.localStorageSupported = function () { - var testKey = "test"; - var storage = window.localStorage; - - try { - storage.setItem(testKey, "1"); - storage.removeItem(testKey); - return true; - } catch (error) { - return false; - } -}; - -LocalScoreManager.prototype.get = function () { - return this.storage.getItem(this.key) || 0; -}; - -LocalScoreManager.prototype.set = function (score) { - this.storage.setItem(this.key, score); -}; - diff --git a/tools/flappy-2048/js/tile.js b/tools/flappy-2048/js/tile.js deleted file mode 100644 index de08333..0000000 --- a/tools/flappy-2048/js/tile.js +++ /dev/null @@ -1,17 +0,0 @@ -function Tile(position, value) { - this.x = position.x; - this.y = position.y; - this.value = value || 2; - - this.previousPosition = null; - this.mergedFrom = null; // Tracks tiles that merged together -} - -Tile.prototype.savePosition = function () { - this.previousPosition = { x: this.x, y: this.y }; -}; - -Tile.prototype.updatePosition = function (position) { - this.x = position.x; - this.y = position.y; -}; diff --git a/tools/flappy-2048/meta/apple-touch-icon.png b/tools/flappy-2048/meta/apple-touch-icon.png deleted file mode 100644 index 3fd20f6092338ef464e440ec84a34c8850fd5d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5808 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 J%Q~loCIB3?|JMKj diff --git a/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.eot b/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.eot deleted file mode 100644 index 3678ef2a44a124fea90895bfa491093a3f2a11fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23821 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

8&-m-eB`5LPOa_ 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 Mfxi68*|U=z012wQ=>Px# diff --git a/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.svg b/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.svg deleted file mode 100644 index aa985ae..0000000 --- a/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.svg +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.woff b/tools/flappy-2048/style/fonts/ClearSans-Bold-webfont.woff deleted file mode 100644 index 184a945da400fdcae4bc6445ede163079087d18a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27120 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/flappy-2048/style/fonts/ClearSans-Light-webfont.woff b/tools/flappy-2048/style/fonts/ClearSans-Light-webfont.woff deleted file mode 100644 index 44555e04e957649116504d8169f37e8c0936c92a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28700 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 diff --git a/tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.eot b/tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.eot deleted file mode 100644 index b020e058cb0068e68d64444e48ff330fe8ac0410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23490 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.woff b/tools/flappy-2048/style/fonts/ClearSans-Regular-webfont.woff deleted file mode 100644 index 9d58858d809454e026cdebc3e766154ee8727582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26764 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 PmxC%5#-I&T_!t-fH+Sy4 diff --git a/tools/flappy-2048/style/fonts/clear-sans.css b/tools/flappy-2048/style/fonts/clear-sans.css deleted file mode 100644 index de2811d..0000000 --- a/tools/flappy-2048/style/fonts/clear-sans.css +++ /dev/null @@ -1,30 +0,0 @@ -@font-face { - font-family: "Clear Sans"; - src: url("ClearSans-Light-webfont.eot"); - src: url("ClearSans-Light-webfont.eot?#iefix") format("embedded-opentype"), - url("ClearSans-Light-webfont.svg#clear_sans_lightregular") format("svg"), - url("ClearSans-Light-webfont.woff") format("woff"); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "Clear Sans"; - src: url("ClearSans-Regular-webfont.eot"); - src: url("ClearSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), - url("ClearSans-Regular-webfont.svg#clear_sansregular") format("svg"), - url("ClearSans-Regular-webfont.woff") format("woff"); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "Clear Sans"; - src: url("ClearSans-Bold-webfont.eot"); - src: url("ClearSans-Bold-webfont.eot?#iefix") format("embedded-opentype"), - url("ClearSans-Bold-webfont.svg#clear_sansbold") format("svg"), - url("ClearSans-Bold-webfont.woff") format("woff"); - font-weight: 700; - font-style: normal; -} - diff --git a/tools/flappy-2048/style/main.css b/tools/flappy-2048/style/main.css deleted file mode 100644 index 93444b0..0000000 --- a/tools/flappy-2048/style/main.css +++ /dev/null @@ -1,703 +0,0 @@ -@import url(fonts/clear-sans.css); -html, body { - margin: 0; - padding: 0; - background: #faf8ef; - color: #776e65; - font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif; - font-size: 18px; } - -body { - margin: 80px 0; } - -.heading:after { - content: ""; - display: block; - clear: both; } - -h1.title { - max-width: 1px; - white-space: nowrap; - font-size: 50px; - font-weight: bold; - margin: 25px 0 0 0; - display: block; - float: left; } - -@-webkit-keyframes move-up { - 0% { - top: 25px; - opacity: 1; } - - 100% { - top: -50px; - opacity: 0; } } - -@-moz-keyframes move-up { - 0% { - top: 25px; - opacity: 1; } - - 100% { - top: -50px; - opacity: 0; } } - -@keyframes move-up { - 0% { - top: 25px; - opacity: 1; } - - 100% { - top: -50px; - opacity: 0; } } - -.scores-container { - float: right; - text-align: right; } - -.score-container, .best-container { - position: relative; - display: inline-block; - background: #bbada0; - padding: 15px 25px; - font-size: 25px; - height: 25px; - line-height: 47px; - font-weight: bold; - border-radius: 3px; - color: white; - margin-top: 8px; - text-align: center; } - .score-container:after, .best-container:after { - position: absolute; - width: 100%; - top: 10px; - left: 0; - text-transform: uppercase; - font-size: 13px; - line-height: 13px; - text-align: center; - color: #eee4da; } - .score-container .score-addition, .best-container .score-addition { - position: absolute; - right: 30px; - color: red; - font-size: 25px; - line-height: 25px; - font-weight: bold; - color: rgba(119, 110, 101, 0.9); - z-index: 100; - -webkit-animation: move-up 600ms ease-in; - -moz-animation: move-up 600ms ease-in; - animation: move-up 600ms ease-in; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } - -.score-container:after { - content: "Score"; } - -.best-container:after { - content: "Best"; } - -p { - margin-top: 0; - margin-bottom: 10px; - line-height: 1.65; } - -a { - color: #776e65; - font-weight: bold; - text-decoration: underline; - cursor: pointer; } - -strong.important { - text-transform: uppercase; } - -hr { - border: none; - border-bottom: 1px solid #d8d4d0; - margin-top: 20px; - margin-bottom: 30px; } - -.container { - width: 500px; - margin: 0 auto; } - -@-webkit-keyframes fade-in { - 0% { - opacity: 0; } - - 100% { - opacity: 1; } } - -@-moz-keyframes fade-in { - 0% { - opacity: 0; } - - 100% { - opacity: 1; } } - -@keyframes fade-in { - 0% { - opacity: 0; } - - 100% { - opacity: 1; } } - -.game-container { - margin-top: 40px; - position: relative; - padding: 15px; - cursor: default; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - background: #bbada0; - border-radius: 6px; - width: 500px; - height: 500px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - .game-container .game-message { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(238, 228, 218, 0.5); - z-index: 100; - text-align: center; - -webkit-animation: fade-in 800ms ease 1200ms; - -moz-animation: fade-in 800ms ease 1200ms; - animation: fade-in 800ms ease 1200ms; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } - .game-container .game-message p { - font-size: 60px; - font-weight: bold; - height: 60px; - line-height: 60px; - margin-top: 222px; } - .game-container .game-message .lower { - display: block; - margin-top: 59px; } - .game-container .game-message a { - display: inline-block; - background: #8f7a66; - border-radius: 3px; - padding: 0 20px; - text-decoration: none; - color: #f9f6f2; - height: 40px; - line-height: 42px; - margin-left: 9px; } - .game-container .game-message a.keep-playing-button { - display: none; } - .game-container .game-message.game-won { - background: rgba(237, 194, 46, 0.5); - color: #f9f6f2; } - .game-container .game-message.game-won a.keep-playing-button { - display: inline-block; } - .game-container .game-message.game-won, .game-container .game-message.game-over { - display: block; } - -.grid-container { - position: relative; - overflow: hidden; - z-index: 1; } - -.grid-row { - margin-bottom: 15px; } - .grid-row:last-child { - margin-bottom: 0; } - .grid-row:after { - content: ""; - display: block; - clear: both; } - -.grid-cell { - width: 106.25px; - height: 106.25px; - margin-right: 15px; - float: left; - border-radius: 3px; - background: rgba(238, 228, 218, 0.35); } - .grid-cell:last-child { - margin-right: 0; } - -.grid-cell-x { - width: 106.25px; - height: 106.25px; - position: absolute; - border-radius: 3px; - background: rgba(238, 228, 218, 0.35); } - .grid-cell:last-child { - margin-right: 0; } - -.tile-container { - position: absolute; - z-index: 2; } - -.tile, .tile .tile-inner { - width: 107px; - height: 107px; - line-height: 116.25px; } -.tile.tile-position-1-1 { - -webkit-transform: translate(0px, 0px); - -moz-transform: translate(0px, 0px); - transform: translate(0px, 0px); } -.tile.tile-position-1-2 { - -webkit-transform: translate(0px, 121px); - -moz-transform: translate(0px, 121px); - transform: translate(0px, 121px); } -.tile.tile-position-1-3 { - -webkit-transform: translate(0px, 242px); - -moz-transform: translate(0px, 242px); - transform: translate(0px, 242px); } -.tile.tile-position-1-4 { - -webkit-transform: translate(0px, 363px); - -moz-transform: translate(0px, 363px); - transform: translate(0px, 363px); } -.tile.tile-position-2-1 { - -webkit-transform: translate(121px, 0px); - -moz-transform: translate(121px, 0px); - transform: translate(121px, 0px); } -.tile.tile-position-2-2 { - -webkit-transform: translate(121px, 121px); - -moz-transform: translate(121px, 121px); - transform: translate(121px, 121px); } -.tile.tile-position-2-3 { - -webkit-transform: translate(121px, 242px); - -moz-transform: translate(121px, 242px); - transform: translate(121px, 242px); } -.tile.tile-position-2-4 { - -webkit-transform: translate(121px, 363px); - -moz-transform: translate(121px, 363px); - transform: translate(121px, 363px); } -.tile.tile-position-3-1 { - -webkit-transform: translate(242px, 0px); - -moz-transform: translate(242px, 0px); - transform: translate(242px, 0px); } -.tile.tile-position-3-2 { - -webkit-transform: translate(242px, 121px); - -moz-transform: translate(242px, 121px); - transform: translate(242px, 121px); } -.tile.tile-position-3-3 { - -webkit-transform: translate(242px, 242px); - -moz-transform: translate(242px, 242px); - transform: translate(242px, 242px); } -.tile.tile-position-3-4 { - -webkit-transform: translate(242px, 363px); - -moz-transform: translate(242px, 363px); - transform: translate(242px, 363px); } -.tile.tile-position-4-1 { - -webkit-transform: translate(363px, 0px); - -moz-transform: translate(363px, 0px); - transform: translate(363px, 0px); } -.tile.tile-position-4-2 { - -webkit-transform: translate(363px, 121px); - -moz-transform: translate(363px, 121px); - transform: translate(363px, 121px); } -.tile.tile-position-4-3 { - -webkit-transform: translate(363px, 242px); - -moz-transform: translate(363px, 242px); - transform: translate(363px, 242px); } -.tile.tile-position-4-4 { - -webkit-transform: translate(363px, 363px); - -moz-transform: translate(363px, 363px); - transform: translate(363px, 363px); } - -.tile { - position: absolute; - -webkit-transition: 100ms ease-in-out; - -moz-transition: 100ms ease-in-out; - transition: 100ms ease-in-out; - -webkit-transition-property: -webkit-transform; - -moz-transition-property: -moz-transform; - transition-property: transform; } - .tile .tile-inner { - border-radius: 3px; - background: #eee4da; - text-align: center; - font-weight: bold; - z-index: 10; - font-size: 55px; } - .tile.tile-2 .tile-inner { - background: #eee4da; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } - .tile.tile-4 .tile-inner { - background: #ede0c8; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } - .tile.tile-8 .tile-inner { - color: #f9f6f2; - background: #f2b179; } - .tile.tile-16 .tile-inner { - color: #f9f6f2; - background: #f59563; } - .tile.tile-32 .tile-inner { - color: #f9f6f2; - background: #f67c5f; } - .tile.tile-64 .tile-inner { - color: #f9f6f2; - background: #f65e3b; } - .tile.tile-128 .tile-inner { - color: #f9f6f2; - background: #edcf72; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.2381), inset 0 0 0 1px rgba(255, 255, 255, 0.14286); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-128 .tile-inner { - font-size: 25px; } } - .tile.tile-256 .tile-inner { - color: #f9f6f2; - background: #edcc61; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.31746), inset 0 0 0 1px rgba(255, 255, 255, 0.19048); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-256 .tile-inner { - font-size: 25px; } } - .tile.tile-512 .tile-inner { - color: #f9f6f2; - background: #edc850; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.39683), inset 0 0 0 1px rgba(255, 255, 255, 0.2381); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-512 .tile-inner { - font-size: 25px; } } - .tile.tile-1024 .tile-inner { - color: #f9f6f2; - background: #edc53f; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.47619), inset 0 0 0 1px rgba(255, 255, 255, 0.28571); - font-size: 35px; } - @media screen and (max-width: 520px) { - .tile.tile-1024 .tile-inner { - font-size: 15px; } } - .tile.tile-2048 .tile-inner { - color: #f9f6f2; - background: #edc22e; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.55556), inset 0 0 0 1px rgba(255, 255, 255, 0.33333); - font-size: 35px; } - @media screen and (max-width: 520px) { - .tile.tile-2048 .tile-inner { - font-size: 15px; } } - .tile.tile-super .tile-inner { - color: #f9f6f2; - background: #3c3a32; - font-size: 30px; } - @media screen and (max-width: 520px) { - .tile.tile-super .tile-inner { - font-size: 10px; } } - -@-webkit-keyframes appear { - 0% { - opacity: 0; - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 100% { - opacity: 1; - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -@-moz-keyframes appear { - 0% { - opacity: 0; - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 100% { - opacity: 1; - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -@keyframes appear { - 0% { - opacity: 0; - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 100% { - opacity: 1; - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -.tile-new .tile-inner { - -webkit-animation: appear 200ms ease 100ms; - -moz-animation: appear 200ms ease 100ms; - animation: appear 200ms ease 100ms; - -webkit-animation-fill-mode: backwards; - -moz-animation-fill-mode: backwards; - animation-fill-mode: backwards; } - -@-webkit-keyframes pop { - 0% { - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 50% { - -webkit-transform: scale(1.2); - -moz-transform: scale(1.2); - transform: scale(1.2); } - - 100% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -@-moz-keyframes pop { - 0% { - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 50% { - -webkit-transform: scale(1.2); - -moz-transform: scale(1.2); - transform: scale(1.2); } - - 100% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -@keyframes pop { - 0% { - -webkit-transform: scale(0); - -moz-transform: scale(0); - transform: scale(0); } - - 50% { - -webkit-transform: scale(1.2); - -moz-transform: scale(1.2); - transform: scale(1.2); } - - 100% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - transform: scale(1); } } - -.tile-merged .tile-inner { - z-index: 20; - -webkit-animation: pop 200ms ease 100ms; - -moz-animation: pop 200ms ease 100ms; - animation: pop 200ms ease 100ms; - -webkit-animation-fill-mode: backwards; - -moz-animation-fill-mode: backwards; - animation-fill-mode: backwards; } - -.game-intro { - margin-bottom: 0; } - .game-intro .intro-container { - display: inline-block; - float: left; } - -.game-explanation { - margin-top: 50px; } - -@media screen and (max-width: 520px) { - html, body { - font-size: 15px; } - - body { - margin: 20px 0; - padding: 0 20px; } - - h1.title { - max-width: 1px; - white-space: nowrap; - font-size: 27px; - margin-top: 15px; } - - .container { - width: 280px; - margin: 0 auto; } - - .score-container, .best-container { - margin-top: 0; - padding: 15px 10px; - min-width: 40px; } - - .heading { - margin-bottom: 10px; } - - .game-container { - margin-top: 40px; - position: relative; - padding: 10px; - cursor: default; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - background: #bbada0; - border-radius: 6px; - width: 280px; - height: 280px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - .game-container .game-message { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(238, 228, 218, 0.5); - z-index: 100; - text-align: center; - -webkit-animation: fade-in 800ms ease 1200ms; - -moz-animation: fade-in 800ms ease 1200ms; - animation: fade-in 800ms ease 1200ms; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } - .game-container .game-message p { - font-size: 60px; - font-weight: bold; - height: 60px; - line-height: 60px; - margin-top: 222px; } - .game-container .game-message .lower { - display: block; - margin-top: 59px; } - .game-container .game-message a { - display: inline-block; - background: #8f7a66; - border-radius: 3px; - padding: 0 20px; - text-decoration: none; - color: #f9f6f2; - height: 40px; - line-height: 42px; - margin-left: 9px; } - .game-container .game-message a.keep-playing-button { - display: none; } - .game-container .game-message.game-won { - background: rgba(237, 194, 46, 0.5); - color: #f9f6f2; } - .game-container .game-message.game-won a.keep-playing-button { - display: inline-block; } - .game-container .game-message.game-won, .game-container .game-message.game-over { - display: block; } - - .grid-container { - position: relative; - overflow: hidden; - z-index: 1; } - - .grid-row { - margin-bottom: 10px; } - .grid-row:last-child { - margin-bottom: 0; } - .grid-row:after { - content: ""; - display: block; - clear: both; } - - .grid-cell { - width: 57.5px; - height: 57.5px; - margin-right: 10px; - float: left; - border-radius: 3px; - background: rgba(238, 228, 218, 0.35); } - .grid-cell:last-child { - margin-right: 0; } - - .tile-container { - position: absolute; - z-index: 2; } - - .tile, .tile .tile-inner { - width: 58px; - height: 58px; - line-height: 67.5px; } - .tile.tile-position-1-1 { - -webkit-transform: translate(0px, 0px); - -moz-transform: translate(0px, 0px); - transform: translate(0px, 0px); } - .tile.tile-position-1-2 { - -webkit-transform: translate(0px, 67px); - -moz-transform: translate(0px, 67px); - transform: translate(0px, 67px); } - .tile.tile-position-1-3 { - -webkit-transform: translate(0px, 135px); - -moz-transform: translate(0px, 135px); - transform: translate(0px, 135px); } - .tile.tile-position-1-4 { - -webkit-transform: translate(0px, 202px); - -moz-transform: translate(0px, 202px); - transform: translate(0px, 202px); } - .tile.tile-position-2-1 { - -webkit-transform: translate(67px, 0px); - -moz-transform: translate(67px, 0px); - transform: translate(67px, 0px); } - .tile.tile-position-2-2 { - -webkit-transform: translate(67px, 67px); - -moz-transform: translate(67px, 67px); - transform: translate(67px, 67px); } - .tile.tile-position-2-3 { - -webkit-transform: translate(67px, 135px); - -moz-transform: translate(67px, 135px); - transform: translate(67px, 135px); } - .tile.tile-position-2-4 { - -webkit-transform: translate(67px, 202px); - -moz-transform: translate(67px, 202px); - transform: translate(67px, 202px); } - .tile.tile-position-3-1 { - -webkit-transform: translate(135px, 0px); - -moz-transform: translate(135px, 0px); - transform: translate(135px, 0px); } - .tile.tile-position-3-2 { - -webkit-transform: translate(135px, 67px); - -moz-transform: translate(135px, 67px); - transform: translate(135px, 67px); } - .tile.tile-position-3-3 { - -webkit-transform: translate(135px, 135px); - -moz-transform: translate(135px, 135px); - transform: translate(135px, 135px); } - .tile.tile-position-3-4 { - -webkit-transform: translate(135px, 202px); - -moz-transform: translate(135px, 202px); - transform: translate(135px, 202px); } - .tile.tile-position-4-1 { - -webkit-transform: translate(202px, 0px); - -moz-transform: translate(202px, 0px); - transform: translate(202px, 0px); } - .tile.tile-position-4-2 { - -webkit-transform: translate(202px, 67px); - -moz-transform: translate(202px, 67px); - transform: translate(202px, 67px); } - .tile.tile-position-4-3 { - -webkit-transform: translate(202px, 135px); - -moz-transform: translate(202px, 135px); - transform: translate(202px, 135px); } - .tile.tile-position-4-4 { - -webkit-transform: translate(202px, 202px); - -moz-transform: translate(202px, 202px); - transform: translate(202px, 202px); } - - .game-container { - margin-top: 20px; } - - .tile .tile-inner { - font-size: 35px; } - - .game-message p { - font-size: 30px !important; - height: 30px !important; - line-height: 30px !important; - margin-top: 90px !important; } - .game-message .lower { - margin-top: 30px !important; } } diff --git a/tools/radius-raid/.gitignore b/tools/radius-raid/.gitignore deleted file mode 100644 index 516bd27..0000000 --- a/tools/radius-raid/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -main.js -concat.js - -notes.txt - -radius-raid-js13k.sublime-project -radius-raid-js13k.sublime-workspace \ No newline at end of file diff --git a/tools/radius-raid/LICENSE.md b/tools/radius-raid/LICENSE.md deleted file mode 100644 index f0b4175..0000000 --- a/tools/radius-raid/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Jack Rugile - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/tools/radius-raid/README.md b/tools/radius-raid/README.md deleted file mode 100644 index 9e044cb..0000000 --- a/tools/radius-raid/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Radius Raid # - -Radius Raid is a space themed shoot 'em up where you must blast away unrelenting enemies before they destroy you. The game features 13 enemy types, 5 powerups, parallax backgrounds, retro sound effects, and locally stored stats. - -This is an an entry for [js13kGames](http://js13kgames.com) 2013. The theme this year was bad luck, but I didn't work it into my game at all. There are certainly luck and chance factors that affect the gameplay, but those weren't built in for the competition. Check out [Radius Raid](http://js13kgames.com/entries/radius-raid) and all of the other entries at [js13kGames](http://js13kgames.com/entries)! - -**Final Size:** 13,278 bytes - -# Controls # -**Move:** WASD/Arrows -**Aim/Fire:** Mouse -**Autofire:** F -**Pause:** P -**Mute:** M - -# Notes # -I hate having to say this, but from my testing, if you are not running the game in Chrome... you're gonna have a bad time. It works in other browsers, but the frame rate is just not high enough. I didn't want to sacrifice any visuals for this one. Early on, I decided I would rather have it look and play better in one browser than look ok and play ok in many browsers. It is just the state of the games in browsers at the moment and I am ok with that. - -I so badly wanted to use [@rezoner](https://twitter.com/rezoner)'s JavaScript chiptune composer, [CHIRP](http://chirp.rezoner.net/), but I just couldn't fit it in the limit. It really bummed me out. I composed a few ideas and really loved the feel of the music with the game. So upsetting. You should definitely check out the tool, it is amazing and will be incredibly useful for game music in the future! - -# Credits # -**Created By:** [@jackrugile](https://twitter.com/jackrugile) -**Inspiration and Support:** [@rezoner](https://twitter.com/rezoner), [@loktar00](https://twitter.com/loktar00), [@end3r](https://twitter.com/end3r), [@austinhallock](https://twitter.com/austinhallock), [@chandlerprall](https://twitter.com/chandlerprall) -**Audio Processing:** [JSFXR](https://github.com/mneubrand/jsfxr) by [@markusneubrand](https://twitter.com/markusneubrand) -**Game Inspiration and Ideas:** [Asteroids](http://www.atari.com/arcade/asteroids), [Cell Warfare](http://armorgames.com/play/3204/cell-warfare), [Space Pips](http://armorgames.com/play/3097/space-pips), and many more -**HTML5 Canvas Reference:** [HTML5 Canvas Cheat Sheet](https://simon.html5.org/dump/html5-canvas-cheat-sheet.html) -**Game Math Reference:** Billy Lamberta - [Foundation HTML5 Animation with JavaScript](http://lamberta.github.io/html5-animation/) - -# Screenshots # -![Radius Raid Menu](http://jackrugile.com/radius-raid/images/menu-screenshot.png "Radius Raid Menu") - -![Radius Raid Gameplay](http://jackrugile.com/radius-raid/images/gameplay-screenshot.png "Radius Raid Gameplay") diff --git a/tools/radius-raid/index.html b/tools/radius-raid/index.html deleted file mode 100644 index 945f911..0000000 --- a/tools/radius-raid/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - Radius Raid - - - - - -
-
- - - - - - -
-
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/radius-raid/js/audio.js b/tools/radius-raid/js/audio.js deleted file mode 100644 index 2d111c6..0000000 --- a/tools/radius-raid/js/audio.js +++ /dev/null @@ -1,40 +0,0 @@ -$.audio = { - sounds: {}, - references: [], - play: function( sound ) { - if( !$.mute ){ - var audio = $.audio.sounds[ sound ]; - if( audio.length > 1 ){ - audio = $.audio.sounds[ sound ][ Math.floor( $.util.rand( 0, audio.length ) ) ]; - } else { - audio = $.audio.sounds[ sound ][ 0 ]; - } - audio.pool[ audio.tick ].play(); - if( audio.tick < audio.count - 1 ) { - audio.tick++; - } else { - audio.tick = 0; - } - } - } -}; - -for( var k in $.definitions.audio ) { - $.audio.sounds[ k ] = []; - - $.definitions.audio[ k ].params.forEach( function( elem, index, array ) { - $.audio.sounds[ k ].push( { - tick: 0, - count: $.definitions.audio[ k ].count, - pool: [] - } ); - - for( var i = 0; i < $.definitions.audio[ k ].count; i++ ) { - var audio = new Audio(); - audio.src = jsfxr( elem ); - $.audio.references.push( audio ); - $.audio.sounds[ k ][ index ].pool.push( audio ); - } - - } ); -} \ No newline at end of file diff --git a/tools/radius-raid/js/bullet.js b/tools/radius-raid/js/bullet.js deleted file mode 100644 index f062078..0000000 --- a/tools/radius-raid/js/bullet.js +++ /dev/null @@ -1,100 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Bullet = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - this.enemiesHit = []; - this.inView = 0; - $.particleEmitters.push( new $.ParticleEmitter( { - x: this.x, - y: this.y, - count: 1, - spawnRange: 1, - friction: 0.75, - minSpeed: 2, - maxSpeed: 10, - minDirection: 0, - maxDirection: $.twopi, - hue: 0, - saturation: 0 - } ) ); -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Bullet.prototype.update = function( i ) { - /*============================================================================== - Apply Forces - ==============================================================================*/ - this.x += Math.cos( this.direction ) * ( this.speed * $.dt ); - this.y += Math.sin( this.direction ) * ( this.speed * $.dt ); - this.ex = this.x - Math.cos( this.direction ) * this.size; - this.ey = this.y - Math.sin( this.direction ) * this.size; - - /*============================================================================== - Check Collisions - ==============================================================================*/ - var ei = $.enemies.length; - while( ei-- ) { - var enemy = $.enemies[ ei ]; - if( $.util.distance( this.x, this.y, enemy.x, enemy.y ) <= enemy.radius ) { - if( this.enemiesHit.indexOf( enemy.index ) == -1 ){ - $.particleEmitters.push( new $.ParticleEmitter( { - x: this.x, - y: this.y, - count: Math.floor( $.util.rand( 1, 4 ) ), - spawnRange: 0, - friction: 0.85, - minSpeed: 5, - maxSpeed: 12, - minDirection: ( this.direction - $.pi ) - $.pi / 5, - maxDirection: ( this.direction - $.pi ) + $.pi / 5, - hue: enemy.hue - } ) ); - - this.enemiesHit.push( enemy.index ); - enemy.receiveDamage( ei, this.damage ); - - if( this.enemiesHit.length > 3 ) { - $.bullets.splice( i, 1 ); - } - } - if( !this.piercing ) { - $.bullets.splice( i, 1 ); - } - } - } - - /*============================================================================== - Lock Bounds - ==============================================================================*/ - if( !$.util.pointInRect( this.ex, this.ey, 0, 0, $.ww, $.wh ) ) { - $.bullets.splice( i, 1 ); - } - - /*============================================================================== - Update View - ==============================================================================*/ - if( $.util.pointInRect( this.ex, this.ey, -$.screen.x, -$.screen.y, $.cw, $.ch ) ) { - this.inView = 1; - } else { - this.inView = 0; - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Bullet.prototype.render = function( i ) { - if( this.inView ) { - $.ctxmg.beginPath(); - $.ctxmg.moveTo( this.x, this.y ); - $.ctxmg.lineTo( this.ex, this.ey ); - $.ctxmg.lineWidth = this.lineWidth; - $.ctxmg.strokeStyle = this.strokeStyle; - $.ctxmg.stroke(); - } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/button.js b/tools/radius-raid/js/button.js deleted file mode 100644 index 678effa..0000000 --- a/tools/radius-raid/js/button.js +++ /dev/null @@ -1,103 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Button = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - var text = $.text( { - ctx: $.ctxmg, - x: 0, - y: 0, - text: this.title, - hspacing: 1, - vspacing: 0, - halign: 'center', - valign: 'center', - scale: this.scale, - snap: 1, - render: 0 - } ); - this.width = this.lockedWidth; - this.height = this.lockedHeight; - - this.sx = this.x - this.width / 2; - this.sy = this.y - this.height / 2; - this.cx = this.x; - this.cy = this.y; - this.ex = this.x + this.width / 2; - this.ey = this.y + this.height / 2; - this.hovering = 0; - this.ohovering = 0; -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Button.prototype.update = function( i ) { - /*============================================================================== - Check Hover State - ==============================================================================*/ - if( $.util.pointInRect( $.mouse.sx, $.mouse.sy, this.sx, this.sy, this.width, this.height ) ){ - this.hovering = 1; - if( !this.ohovering ) { - $.audio.play( 'hover' ); - } - } else { - this.hovering = 0; - } - this.ohovering = this.hovering; - - /*============================================================================== - Check Click - ==============================================================================*/ - if( this.hovering && $.mouse.down ) { - $.audio.play( 'click' ); - this.action(); - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Button.prototype.render = function( i ) { - if( this.hovering ) { - $.ctxmg.fillStyle = 'hsla(0, 0%, 10%, 1)'; - $.ctxmg.fillRect( Math.floor( this.sx ), Math.floor( this.sy ), this.width, this.height ); - $.ctxmg.strokeStyle = 'hsla(0, 0%, 0%, 1)'; - $.ctxmg.strokeRect( Math.floor( this.sx ) + 0.5, Math.floor( this.sy ) + 0.5, this.width - 1, this.height - 1, 1 ); - $.ctxmg.strokeStyle = 'hsla(0, 0%, 100%, 0.2)'; - $.ctxmg.strokeRect( Math.floor( this.sx ) + 1.5, Math.floor( this.sy ) + 1.5, this.width - 3, this.height - 3, 1 ); - } else { - $.ctxmg.fillStyle = 'hsla(0, 0%, 0%, 1)'; - $.ctxmg.fillRect( Math.floor( this.sx ), Math.floor( this.sy ), this.width, this.height ); - $.ctxmg.strokeStyle = 'hsla(0, 0%, 0%, 1)'; - $.ctxmg.strokeRect( Math.floor( this.sx ) + 0.5, Math.floor( this.sy ) + 0.5, this.width - 1, this.height - 1, 1 ); - $.ctxmg.strokeStyle = 'hsla(0, 0%, 100%, 0.15)'; - $.ctxmg.strokeRect( Math.floor( this.sx ) + 1.5, Math.floor( this.sy ) + 1.5, this.width - 3, this.height - 3, 1 ); - } - - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: this.cx, - y: this.cy, - text: this.title, - hspacing: 1, - vspacing: 0, - halign: 'center', - valign: 'center', - scale: this.scale, - snap: 1, - render: true - } ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.7)'; - if( this.hovering ) { - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 1)'; - } - $.ctxmg.fill(); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.07)'; - $.ctxmg.fillRect( Math.floor( this.sx ) + 2, Math.floor( this.sy ) + 2, this.width - 4, Math.floor( ( this.height - 4 ) / 2 ) ); -}; \ No newline at end of file diff --git a/tools/radius-raid/js/definitions.js b/tools/radius-raid/js/definitions.js deleted file mode 100644 index 6f56ad1..0000000 --- a/tools/radius-raid/js/definitions.js +++ /dev/null @@ -1,831 +0,0 @@ -/*============================================================================== -Definitions -==============================================================================*/ -$.definitions = {}; - -/*============================================================================== -Audio -==============================================================================*/ -$.definitions.audio = { - 'shoot': { - count: 10, - params: [ - [2,,0.2,,0.1753,0.64,,-0.5261,,,,,,0.5522,-0.564,,,,1,,,,,0.25] - ] - }, - 'shootAlt': { - count: 10, - params: [ - [0,,0.16,0.18,0.18,0.47,0.0084,-0.26,,,,,,0.74,-1,,-0.76,,1,,,,,0.15] - ] - }, - 'hit': { - count: 10, - params: [ - [3,,0.0138,,0.2701,0.4935,,-0.6881,,,,,,,,,,,1,,,,,0.25], - [0,,0.0639,,0.2425,0.7582,,-0.6217,,,,,,0.4039,,,,,1,,,,,0.25], - [3,,0.0948,,0.2116,0.7188,,-0.6372,,,,,,,,,,,1,,,0.2236,,0.25] - ] - }, - 'explosion': { - count: 5, - params: [ - [3,,0.1164,0.88,0.37,0.06,,0.1599,,,,-0.0846,0.6485,,,,0.3963,-0.0946,1,,,,,0.25], - [3,,0.2958,0.3173,0.3093,0.0665,,0.1334,,,,,,,,,,,1,,,,,0.25] - ] - }, - 'explosionAlt': { - count: 5, - params: [ - [3,,0.15,0.7523,0.398,0.15,,-0.18,,0.39,0.53,-0.3428,0.6918,,,0.5792,0.6,0.56,1,,,,,0.25] - ] - }, - 'takingDamage': { - count: 5, - params: [ - [3,,0.1606,0.5988,0.2957,0.1157,,-0.3921,,,,,,,,,0.3225,-0.2522,1,,,,,0.25], - [3,,0.1726,0.2496,0.2116,0.0623,,-0.2096,,,,,,,,,0.2665,-0.1459,1,,,,,0.25], - [3,,0.1645,0.7236,0.3402,0.0317,,,,,,,,,,,,,1,,,,,0.25] - ] - }, - 'death': { - count: 1, - params: [ - [3,,0.51,,1,0.1372,,0.02,0.1,,,,0.89,0.7751,,,-0.16,0.32,1,0.3999,0.81,,0.1999,0.15] - ] - }, - 'powerup': { - count: 3, - params: [ - [0,,0.01,,0.4384,0.2,,0.12,0.28,1,0.65,,,0.0419,,,,,1,,,,,0.4] - ] - }, - 'levelup': { - count: 2, - params: [ - [2,1,0.01,,0.84,0.19,,,,0.62,0.7,,,-0.7248,0.8522,,,,1,,,,,0.45] - ] - }, - 'hover': { - count: 10, - params: [ - [0,0.08,0.18,,,0.65,,1,1,,,0.94,1,,,,-0.3,1,1,,,0.3,0.5,0.35] - ] - }, - 'click': { - count: 5, - params: [ - [3,,0.18,,,1,,-1,-1,,,,,,,,,,1,,,0.64,,0.35] - ] - } -}; - -/*============================================================================== -Enemies -==============================================================================*/ -$.definitions.enemies = [ - { // Enemy 0 - horizontal / vertical - value: 5, - speed: 1.5, - life: 1, - radius: 15, - hue: 180, - lockBounds: 1, - setup: function() { - if( this.start == 'top' ){ - this.direction = $.pi / 2; - } else if( this.start == 'right' ) { - this.direction = -$.pi; - } else if( this.start == 'bottom' ) { - this.direction = -$.pi / 2; - } else { - this.direction = 0; - } - }, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - this.vx = Math.cos( this.direction ) * speed; - this.vy = Math.sin( this.direction ) * speed; - } - }, - { // Enemy 1 - diagonal - value: 10, - speed: 1.5, - life: 2, - radius: 15, - hue: 120, - lockBounds: 1, - setup: function() { - var rand = Math.floor( $.util.rand( 0, 2 ) ); - if( this.start == 'top' ){ - this.direction = ( rand ) ? $.pi / 2 + $.pi / 4: $.pi / 2 - $.pi / 4; - } else if( this.start == 'right' ) { - this.direction = ( rand ) ? -$.pi + $.pi / 4 : -$.pi - $.pi / 4; - } else if( this.start == 'bottom' ) { - this.direction = ( rand ) ? -$.pi / 2 + $.pi / 4 : -$.pi / 2 - $.pi / 4; - } else { - this.direction = ( rand ) ? $.pi / 4 : -$.pi / 4; - } - }, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - this.vx = Math.cos( this.direction ) * speed; - this.vy = Math.sin( this.direction ) * speed; - } - }, - { // Enemy 2 - move directly hero - value: 15, - speed: 1.5, - life: 2, - radius: 20, - hue: 330, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - } - }, - { // Enemy 3 - splitter - value: 20, - speed: 0.5, - life: 3, - radius: 50, - hue: 210, - canSpawn: 1, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - }, - death: function() { - if( this.canSpawn ) { - for( var i = 0; i < 4; i++ ) { - var enemy = $.spawnEnemy( this.type ); - enemy.radius = 20; - enemy.canSpawn = 0; - enemy.speed = 1; - enemy.life = 1; - enemy.value = 5; - enemy.x = this.x; - enemy.y = this.y; - if( i == 0 ) { - enemy.x -= 45; - } else if( i == 1 ) { - enemy.x += 45; - } else if( i == 2 ) { - enemy.y -= 45; - } else { - enemy.y += 45; - } - $.enemies.push( enemy ); - } - } - } - }, - { // Enemy 4 - wanderer - value: 25, - speed: 2, - life: 4, - radius: 20, - hue: 30, - lockBounds: 1, - setup: function() { - if( this.start == 'top' ){ - this.direction = $.pi / 2; - } else if( this.start == 'right' ) { - this.direction = -$.pi; - } else if( this.start == 'bottom' ) { - this.direction = -$.pi / 2; - } else { - this.direction = 0; - } - }, - behavior: function() { - var speed = this.speed * $.util.rand( 1, 2 ); - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - this.direction += $.util.rand( -0.15, 0.15 ); - this.vx = Math.cos( this.direction ) * speed; - this.vy = Math.sin( this.direction ) * speed; - } - }, - { // Enemy 5 - stealth, hard to see - move directly hero - value: 30, - speed: 1, - life: 3, - radius: 20, - hue: 0, - saturation: 0, - lightness: 30, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - } - }, - { // Enemy 6 - big strong slow fatty - value: 35, - speed: 0.25, - life: 8, - radius: 80, - hue: 150, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - } - }, - { // Enemy 7 - small weak speedy - value: 40, - speed: 2.5, - life: 1, - radius: 15, - hue: 300, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - direction = direction + Math.cos( $.tick / 50 ) * 1; - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - } - }, - { // Enemy 8 - strong grower, move to hero - value: 45, - speed: 1.5, - growth: 0.1, - life: 6, - radius: 20, - hue: 0, - saturation: 0, - lightness: 100, - behavior: function() { - var speed = this.speed, - growth = this.growth; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - growth = this.growth / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - - if( Math.sqrt(dx * dx + dy * dy ) > 200 ) { - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - this.fillStyle ='hsla(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%, 0.1)'; - this.strokeStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%, 1)'; - } else { - this.vx += $.util.rand( -0.25, 0.25 ); - this.vy += $.util.rand( -0.25, 0.25 ); - this.radius += growth * $.dt; - var hue = $.util.rand( 0, 360 ); - lightness = $.util.rand( 50, 80 ); - this.fillStyle ='hsla(' + hue + ', 100%, ' + lightness + '%, 0.2)'; - this.strokeStyle = 'hsla(' + hue + ', 100%, ' + lightness + '%, 1)'; - } - } - }, - { // Enemy 9 - circle around hero - value: 50, - speed: 0.5, - angleSpeed: 0.015, - life: 2, - radius: 20, - hue: 60, - setup: function() { - var dx = this.x - $.hero.x, - dy = this.y - $.hero.y; - this.angle = Math.atan2( dy, dx ); - this.distance = Math.sqrt( dx * dx + dy * dy ); - if( Math.random() > 0.5 ) { - this.angleSpeed = -this.angleSpeed; - } - }, - behavior: function() { - var speed = this.speed, - angleSpeed = this.angleSpeed; - if( $.slow) { - speed = this.speed / $.slowEnemyDivider; - angleSpeed = this.angleSpeed / $.slowEnemyDivider; - } - - this.distance -= speed * $.dt; - this.angle += angleSpeed * $.dt; - - this.vx = ( ( $.hero.x + Math.cos( this.angle ) * this.distance ) - this.x ) / 50; - this.vy = ( ( $.hero.y + Math.sin( this.angle ) * this.distance ) - this.y ) / 50; - } - }, - { // Enemy 10 - spawner - value: 55, - speed: 1, - life: 3, - radius: 45, - hue: 0, - canSpawn: 1, - spawnTick: 0, - spawnMax: 250, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - - var dx = $.hero.x - this.x, - dy = $.hero.y - this.y, - direction = Math.atan2( dy, dx ); - direction = direction + Math.cos( $.tick / 50 ) * 1; - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - - if( this.canSpawn ) { - if( this.spawnTick < this.spawnMax ) { - this.spawnTick += $.dt; - } else { - this.spawnTick = 0; - var enemy = $.spawnEnemy( this.type ); - enemy.radius = 20; - enemy.canSpawn = 0; - enemy.speed = 3; - enemy.life = 1; - enemy.value = 30; - enemy.x = this.x; - enemy.y = this.y; - $.enemies.push( enemy ); - } - } - } - }, - { // Enemy 11 - random location strong tower - value: 60, - speed: 1.5, - life: 10, - radius: 30, - hue: 90, - setup: function(){ - this.xTarget = $.util.rand( 50, $.ww - 50 ); - this.yTarget = $.util.rand( 50, $.wh - 50 ); - }, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - var dx = this.xTarget - this.x, - dy = this.yTarget - this.y, - direction = Math.atan2( dy, dx ); - if( Math.sqrt( dx * dx + dy * dy) > this.speed ) { - this.vx = Math.cos( direction ) * speed; - this.vy = Math.sin( direction ) * speed; - } else { - this.vx = 0; - this.vy = 0; - } - } - }, - { // Enemy 12 - speedy random direction, no homing - value: 65, - speed: 6, - life: 1, - radius: 5, - hue: 0, - lockBounds: 1, - setup: function() { - this.radius = $.util.rand( 15, 35 ); - this.speed = $.util.rand( 3, 8 ); - if( Math.random() > 0.5 ){ - if( this.start == 'top' ){ - this.direction = $.pi / 2; - } else if( this.start == 'right' ) { - this.direction = -$.pi; - } else if( this.start == 'bottom' ) { - this.direction = -$.pi / 2; - } else { - this.direction = 0; - } - } else { - var rand = Math.floor( $.util.rand( 0, 2 ) ); - if( this.start == 'top' ){ - this.direction = ( rand ) ? $.pi / 2 + $.pi / 4: $.pi / 2 - $.pi / 4; - } else if( this.start == 'right' ) { - this.direction = ( rand ) ? -$.pi + $.pi / 4 : -$.pi - $.pi / 4; - } else if( this.start == 'bottom' ) { - this.direction = ( rand ) ? -$.pi / 2 + $.pi / 4 : -$.pi / 2 - $.pi / 4; - } else { - this.direction = ( rand ) ? $.pi / 4 : -$.pi / 4; - } - } - }, - behavior: function() { - var speed = this.speed; - if( $.slow ) { - speed = this.speed / $.slowEnemyDivider; - } - this.vx = Math.cos( this.direction ) * speed; - this.vy = Math.sin( this.direction ) * speed; - this.hue += 10; - this.lightness = 50; - this.fillStyle = 'hsla(' + this.hue + ', 100%, ' + this.lightness + '%, 0.2)'; - this.strokeStyle = 'hsla(' + this.hue + ', 100%, ' + this.lightness + '%, 1)'; - } - } -]; - -/*============================================================================== -Levels -==============================================================================*/ -$.definitions.levels = []; -var base = 25; -for( var i = 0; i < $.definitions.enemies.length; i++ ){ - var distribution = []; - for( var di = 0; di < i + 1; di++ ) { - var value = ( di == i ) ? Math.floor( ( ( i + 1) * base ) * 0.75 ) : ( i + 1) * base; - value = ( i == 0 ) ? base : value; - distribution.push( value ); - } - $.definitions.levels.push( { - killsToLevel: 10 + ( i + 1 ) * 7, - distribution: distribution - } ); -} - -/*============================================================================== -Powerups -==============================================================================*/ -$.definitions.powerups = [ - { - title: 'HEALTH PACK', - hue: 0, - saturation: 0, - lightness: 100 - }, - { - title: 'SLOW ENEMIES', - hue: 200, - saturation: 0, - lightness: 100 - }, - { - title: 'FAST SHOT', - hue: 100, - saturation: 100, - lightness: 60 - }, - { - title: 'TRIPLE SHOT', - hue: 200, - saturation: 100, - lightness: 60 - }, - { - title: 'PIERCE SHOT', - hue: 0, - saturation: 100, - lightness: 60 - } -]; - -/*============================================================================== -Letters -==============================================================================*/ -$.definitions.letters = { - '1': [ - [ , , 1, , 0 ], - [ , 1, 1, , 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - '2': [ - [ 1, 1, 1, 1, 0 ], - [ , , , , 1 ], - [ , 1, 1, 1, 0 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - '3': [ - [ 1, 1, 1, 1, 0 ], - [ , , , , 1 ], - [ , 1, 1, 1, 1 ], - [ , , , , 1 ], - [ 1, 1, 1, 1, 0 ] - ], - '4': [ - [ 1, , , 1, 0 ], - [ 1, , , 1, 0 ], - [ 1, 1, 1, 1, 1 ], - [ , , , 1, 0 ], - [ , , , 1, 0 ] - ], - '5': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 0 ], - [ , , , , 1 ], - [ 1, 1, 1, 1, 0 ] - ], - '6': [ - [ , 1, 1, 1, 0 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 0 ], - [ 1, , , , 1 ], - [ , 1, 1, 1, 0 ] - ], - '7': [ - [ 1, 1, 1, 1, 1 ], - [ , , , , 1 ], - [ , , , 1, 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ] - ], - '8': [ - [ , 1, 1, 1, 0 ], - [ 1, , , , 1 ], - [ , 1, 1, 1, 0 ], - [ 1, , , , 1 ], - [ , 1, 1, 1, 0 ] - ], - '9': [ - [ , 1, 1, 1, 0 ], - [ 1, , , , 1 ], - [ , 1, 1, 1, 1 ], - [ , , , , 1 ], - [ , 1, 1, 1, 0 ] - ], - '0': [ - [ , 1, 1, 1, 0 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ , 1, 1, 1, 0 ] - ], - 'A': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ] - ], - 'B': [ - [ 1, 1, 1, 1, 0 ], - [ 1, , , 1, 0 ], - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'C': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - 'D': [ - [ 1, 1, 1, , 0 ], - [ 1, , , 1, 0 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'E': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, 1, 1, , 0 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - 'F': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, 1, 1, , 0 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ] - ], - 'G': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, , 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'H': [ - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ] - ], - 'I': [ - [ 1, 1, 1, 1, 1 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - 'J': [ - [ , , , , 1 ], - [ , , , , 1 ], - [ , , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'K': [ - [ 1, , , 1, 0 ], - [ 1, , 1, , 0 ], - [ 1, 1, 1, , 0 ], - [ 1, , , 1, 0 ], - [ 1, , , , 1 ] - ], - 'L': [ - [ 1, , , , 0 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - 'M': [ - [ 1, , , , 1 ], - [ 1, 1, , 1, 1 ], - [ 1, , 1, , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ] - ], - 'N': [ - [ 1, , , , 1 ], - [ 1, 1, , , 1 ], - [ 1, , 1, , 1 ], - [ 1, , , 1, 1 ], - [ 1, , , , 1 ] - ], - 'O': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'P': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, , , , 0 ] - ], - 'Q': [ - [ 1, 1, 1, 1, 0 ], - [ 1, , , 1, 0 ], - [ 1, , , 1, 0 ], - [ 1, , , 1, 0 ], - [ 1, 1, 1, 1, 1 ] - ], - 'R': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ], - [ 1, , , 1, 0 ], - [ 1, , , , 1 ] - ], - 'S': [ - [ 1, 1, 1, 1, 1 ], - [ 1, , , , 0 ], - [ 1, 1, 1, 1, 1 ], - [ , , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'T': [ - [ 1, 1, 1, 1, 1 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ] - ], - 'U': [ - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ] - ], - 'V': [ - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ , 1, , 1, 0 ], - [ , , 1, , 0 ] - ], - 'W': [ - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, , 1, , 1 ], - [ 1, 1, , 1, 1 ], - [ 1, , , , 1 ] - ], - 'X': [ - [ 1, , , , 1 ], - [ , 1, , 1, 0 ], - [ , , 1, , 0 ], - [ , 1, , 1, 0 ], - [ 1, , , , 1 ] - ], - 'Y': [ - [ 1, , , , 1 ], - [ 1, , , , 1 ], - [ 1, 1, 1, 1, 1 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ] - ], - 'Z': [ - [ 1, 1, 1, 1, 1 ], - [ , , , 1, 0 ], - [ , , 1, , 0 ], - [ , 1, , , 0 ], - [ 1, 1, 1, 1, 1 ] - ], - ' ': [ - [ , , , , 0 ], - [ , , , , 0 ], - [ , , , , 0 ], - [ , , , , 0 ], - [ , , , , 0 ] - ], - ',': [ - [ , , , , 0 ], - [ , , , , 0 ], - [ , , , , 0 ], - [ , , 1, , 0 ], - [ , , 1, , 0 ] - ], - '+': [ - [ , , , , 0 ], - [ , , 1, , 0 ], - [ , 1, 1, 1, 0 ], - [ , , 1, , 0 ], - [ , , , , 0 ] - ], - '/': [ - [ , , , , 1 ], - [ , , , 1, 0 ], - [ , , 1, , 0 ], - [ , 1, , , 0 ], - [ 1, , , , 0 ] - ], - ':': [ - [ , , , , 0 ], - [ , , 1, , 0 ], - [ , , , , 0 ], - [ , , 1, , 0 ], - [ , , , , 0 ] - ], - '@': [ - [ 1, 1, 1, 1, 1 ], - [ , , , , 1 ], - [ 1, 1, 1, , 1 ], - [ 1, , 1, , 1 ], - [ 1, 1, 1, 1, 1 ] - ] -}; \ No newline at end of file diff --git a/tools/radius-raid/js/enemy.js b/tools/radius-raid/js/enemy.js deleted file mode 100644 index f7cff1a..0000000 --- a/tools/radius-raid/js/enemy.js +++ /dev/null @@ -1,161 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Enemy = function( opt ) { - // set always and optional - for( var k in opt ) { - this[k] = opt[k]; - } - - // set optional and defaults - this.lightness = $.util.isset( this.lightness ) ? this.lightness : 50; - this.saturation = $.util.isset( this.saturation ) ? this.saturation : 100; - this.setup = this.setup || function(){}; - this.death = this.death || function(){}; - - // set same for all objects - this.index = $.indexGlobal++; - this.inView = this.hitFlag = this.vx = this.vy = 0; - this.lifeMax = opt.life; - this.fillStyle ='hsla(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%, 0.1)'; - this.strokeStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%, 1)'; - /*============================================================================== - Run Setup - ==============================================================================*/ - this.setup(); - - /*============================================================================== - Adjust Level Offset Difficulties - ==============================================================================*/ - if( $.levelDiffOffset > 0 ){ - this.life += $.levelDiffOffset * 0.25; - this.lifeMax = this.life; - this.speed += Math.min( $.hero.vmax, $.levelDiffOffset * 0.25 ); - this.value += $.levelDiffOffset * 5; - } -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Enemy.prototype.update = function( i ) { - /*============================================================================== - Apply Behavior - ==============================================================================*/ - this.behavior(); - - /*============================================================================== - Apply Forces - ==============================================================================*/ - this.x += this.vx * $.dt; - this.y += this.vy * $.dt; - - /*============================================================================== - Lock Bounds - ==============================================================================*/ - if( this.lockBounds && !$.util.arcInRect( this.x, this.y, this.radius + 10, 0, 0, $.ww, $.wh ) ) { - $.enemies.splice( i, 1 ); - } - - /*============================================================================== - Update View - ==============================================================================*/ - if( $.util.arcInRect( this.x, this.y, this.radius, -$.screen.x, -$.screen.y, $.cw, $.ch ) ) { - this.inView = 1; - } else { - this.inView = 0; - } -}; - -/*============================================================================== -Receive Damage -==============================================================================*/ -$.Enemy.prototype.receiveDamage = function( i, val ) { - if( this.inView ) { - $.audio.play( 'hit' ); - } - this.life -= val; - this.hitFlag = 10; - if( this.life <= 0 ) { - if( this.inView ) { - $.explosions.push( new $.Explosion( { - x: this.x, - y: this.y, - radius: this.radius, - hue: this.hue, - saturation: this.saturation - } ) ); - $.particleEmitters.push( new $.ParticleEmitter( { - x: this.x, - y: this.y, - count: 10, - spawnRange: this.radius, - friction: 0.85, - minSpeed: 5, - maxSpeed: 20, - minDirection: 0, - maxDirection: $.twopi, - hue: this.hue, - saturation: this.saturation - } ) ); - $.textPops.push( new $.TextPop( { - x: this.x, - y: this.y, - value: this.value, - hue: this.hue, - saturation: this.saturation, - lightness: 60 - } ) ); - $.rumble.level = 6; - } - this.death(); - $.spawnPowerup( this.x, this.y ); - $.score += this.value; - $.level.kills++; - $.kills++; - $.enemies.splice( i, 1 ); - } -}; - -/*============================================================================== -Render Health -==============================================================================*/ -$.Enemy.prototype.renderHealth = function( i ) { - if( this.inView && this.life > 0 && this.life < this.lifeMax ) { - $.ctxmg.fillStyle = 'hsla(0, 0%, 0%, 0.75)'; - $.ctxmg.fillRect( this.x - this.radius, this.y - this.radius - 6, this.radius * 2, 3 ); - $.ctxmg.fillStyle = 'hsla(' + ( this.life / this.lifeMax ) * 120 + ', 100%, 50%, 0.75)'; - $.ctxmg.fillRect( this.x - this.radius, this.y - this.radius - 6, ( this.radius * 2 ) * ( this.life / this.lifeMax ), 3 ); - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Enemy.prototype.render = function( i ) { - if( this.inView ) { - var mod = $.enemyOffsetMod / 6; - $.util.fillCircle( $.ctxmg, this.x, this.y, this.radius, this.fillStyle ); - $.util.strokeCircle( $.ctxmg, this.x, this.y, this.radius / 4 + Math.cos( mod ) * this.radius / 4, this.strokeStyle, 1.5 ); - $.util.strokeCircle( $.ctxmg, this.x, this.y, this.radius - 0.5, this.strokeStyle, 1 ); - - $.ctxmg.strokeStyle = this.strokeStyle; - $.ctxmg.lineWidth = 4; - $.ctxmg.beginPath(); - $.ctxmg.arc( this.x, this.y, this.radius - 0.5, mod + $.pi, mod + $.pi + $.pi / 2 ); - $.ctxmg.stroke(); - $.ctxmg.beginPath(); - $.ctxmg.arc( this.x, this.y, this.radius - 0.5, mod, mod + $.pi / 2 ); - $.ctxmg.stroke(); - - if( $.slow) { - $.util.fillCircle( $.ctxmg, this.x, this.y, this.radius, 'hsla(' + $.util.rand( 160, 220 ) + ', 100%, 50%, 0.25)' ); - } - if( this.hitFlag > 0 ) { - this.hitFlag -= $.dt; - $.util.fillCircle( $.ctxmg, this.x, this.y, this.radius, 'hsla(' + this.hue + ', ' + this.saturation + '%, 75%, ' + this.hitFlag / 10 + ')' ); - $.util.strokeCircle( $.ctxmg, this.x, this.y, this.radius, 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + $.util.rand( 60, 90) + '%, ' + this.hitFlag / 10 + ')', $.util.rand( 1, 10) ); - } - this.renderHealth(); - } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/explosion.js b/tools/radius-raid/js/explosion.js deleted file mode 100644 index b78dcbb..0000000 --- a/tools/radius-raid/js/explosion.js +++ /dev/null @@ -1,51 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Explosion = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - this.tick = 0; - this.tickMax = 20; - if( $.slow ) { - $.audio.play( 'explosionAlt' ); - } else { - $.audio.play( 'explosion' ); - } -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Explosion.prototype.update = function( i ) { - if( this.tick >= this.tickMax ) { - $.explosions.splice( i, 1 ); - } else { - this.tick += $.dt; - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Explosion.prototype.render = function( i ) { - if( $.util.arcInRect( this.x, this.y, this.radius, -$.screen.x, -$.screen.y, $.cw, $.ch ) ) { - var radius = 1 + ( this.tick / ( this.tickMax / 2 ) ) * this.radius, - lineWidth = $.util.rand( 1, this.radius / 2 ); - $.util.strokeCircle( $.ctxmg, this.x, this.y, radius, 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + $.util.rand( 40, 80 ) + '%, ' + Math.min( 1, Math.max( 0, ( 1 - ( this.tick / this.tickMax ) ) ) ) + ')', lineWidth); - $.ctxmg.beginPath(); - var size = $.util.rand( 1, 1.5 ); - for( var i = 0; i < 20; i++ ) { - var angle = $.util.rand( 0, $.twopi ), - x = this.x + Math.cos( angle ) * radius, - y = this.y + Math.sin( angle ) * radius; - - $.ctxmg.rect( x - size / 2, y - size / 2, size, size ); - } - $.ctxmg.fillStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + $.util.rand( 50, 100 ) + '%, 1)'; - $.ctxmg.fill(); - - $.ctxmg.fillStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, 50%, ' + Math.min( 1, Math.max( 0, ( 0.03 - ( this.tick / this.tickMax ) * 0.03 ) ) ) + ')'; - $.ctxmg.fillRect( -$.screen.x, -$.screen.y, $.cw, $.ch ); - } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/game.js b/tools/radius-raid/js/game.js deleted file mode 100644 index f79678e..0000000 --- a/tools/radius-raid/js/game.js +++ /dev/null @@ -1,1555 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.init = function() { - $.setupStorage(); - $.wrap = document.getElementById( 'wrap' ); - $.wrapInner = document.getElementById( 'wrap-inner' ); - $.cbg1 = document.getElementById( 'cbg1' ); - $.cbg2 = document.getElementById( 'cbg2' ); - $.cbg3 = document.getElementById( 'cbg3' ); - $.cbg4 = document.getElementById( 'cbg4' ); - $.cmg = document.getElementById( 'cmg' ); - $.cfg = document.getElementById( 'cfg' ); - $.ctxbg1 = $.cbg1.getContext( '2d' ); - $.ctxbg2 = $.cbg2.getContext( '2d' ); - $.ctxbg3 = $.cbg3.getContext( '2d' ); - $.ctxbg4 = $.cbg4.getContext( '2d' ); - $.ctxmg = $.cmg.getContext( '2d' ); - $.ctxfg = $.cfg.getContext( '2d' ); - $.cw = $.cmg.width = $.cfg.width = 800; - $.ch = $.cmg.height = $.cfg.height = 600; - $.wrap.style.width = $.wrapInner.style.width = $.cw + 'px'; - $.wrap.style.height = $.wrapInner.style.height = $.ch + 'px'; - $.wrap.style.marginLeft = ( -$.cw / 2 ) - 10 + 'px'; - $.wrap.style.marginTop = ( -$.ch / 2 ) - 10 + 'px'; - $.ww = Math.floor( $.cw * 2 ); - $.wh = Math.floor( $.ch * 2 ); - $.cbg1.width = Math.floor( $.cw * 1.1 ); - $.cbg1.height = Math.floor( $.ch * 1.1 ); - $.cbg2.width = Math.floor( $.cw * 1.15 ); - $.cbg2.height = Math.floor( $.ch * 1.15 ); - $.cbg3.width = Math.floor( $.cw * 1.2 ); - $.cbg3.height = Math.floor( $.ch * 1.2 ); - $.cbg4.width = Math.floor( $.cw * 1.25 ); - $.cbg4.height = Math.floor( $.ch * 1.25 ); - - $.screen = { - x: ( $.ww - $.cw ) / -2, - y: ( $.wh - $.ch ) / -2 - }; - - $.mute = $.storage['mute']; - $.autofire = $.storage['autofire']; - $.slowEnemyDivider = 3; - - $.keys = { - state: { - up: 0, - down: 0, - left: 0, - right: 0, - f: 0, - m: 0, - p: 0 - }, - pressed: { - up: 0, - down: 0, - left: 0, - right: 0, - f: 0, - m: 0, - p: 0 - } - }; - $.okeys = {}; - $.mouse = { - x: $.ww / 2, - y: $.wh / 2, - sx: 0, - sy: 0, - ax: window.innerWidth / 2, - ay: 0, - down: 0 - }; - $.buttons = []; - - $.minimap = { - x: 20, - y: $.ch - Math.floor( $.ch * 0.1 ) - 20, - width: Math.floor( $.cw * 0.1 ), - height: Math.floor( $.ch * 0.1 ), - scale: Math.floor( $.cw * 0.1 ) / $.ww, - color: 'hsla(0, 0%, 0%, 0.85)', - strokeColor: '#3a3a3a' - }, - $.cOffset = { - left: 0, - top: 0 - }; - - $.levelCount = $.definitions.levels.length; - $.states = {}; - $.state = ''; - $.enemies = []; - $.bullets = []; - $.explosions = []; - $.powerups = []; - $.particleEmitters = []; - $.textPops = []; - $.levelPops = []; - $.powerupTimers = []; - - $.resizecb(); - $.bindEvents(); - $.setupStates(); - $.renderBackground1(); - $.renderBackground2(); - $.renderBackground3(); - $.renderBackground4(); - $.renderForeground(); - $.renderFavicon(); - $.setState( 'menu' ); - $.loop(); -}; - -/*============================================================================== -Reset -==============================================================================*/ -$.reset = function() { - $.indexGlobal = 0; - $.dt = 1; - $.lt = 0; - $.elapsed = 0; - $.tick = 0; - - $.gameoverTick = 0; - $.gameoverTickMax = 200; - $.gameoverExplosion = 0; - - $.instructionTick = 0; - $.instructionTickMax = 400; - - $.levelDiffOffset = 0; - $.enemyOffsetMod = 0; - $.slow = 0; - - $.screen = { - x: ( $.ww - $.cw ) / -2, - y: ( $.wh - $.ch ) / -2 - }; - $.rumble = { - x: 0, - y: 0, - level: 0, - decay: 0.4 - }; - - $.mouse.down = 0; - - $.level = { - current: 0, - kills: 0, - killsToLevel: $.definitions.levels[ 0 ].killsToLevel, - distribution: $.definitions.levels[ 0 ].distribution, - distributionCount: $.definitions.levels[ 0 ].distribution.length - }; - - $.enemies.length = 0; - $.bullets.length = 0; - $.explosions.length = 0; - $.powerups.length = 0; - $.particleEmitters.length = 0; - $.textPops.length = 0; - $.levelPops.length = 0; - $.powerupTimers.length = 0; - - for( var i = 0; i < $.definitions.powerups.length; i++ ) { - $.powerupTimers.push( 0 ); - } - - $.kills = 0; - $.bulletsFired = 0; - $.powerupsCollected = 0; - $.score = 0; - - $.hero = new $.Hero(); - - $.levelPops.push( new $.LevelPop( { - level: 1 - } ) ); -}; - -/*============================================================================== -Create Favicon -==============================================================================*/ -$.renderFavicon = function() { - var favicon = document.getElementById( 'favicon' ), - favc = document.createElement( 'canvas' ), - favctx = favc.getContext( '2d' ), - faviconGrid = [ - [ 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1, 1, 1, 1, 1 ], - [ 1, , , , , , , , , , , , , , , 1 ], - [ 1, , , , , , , , , , , , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, 1, 1, 1, , 0 ], - [ 1, , , , , 1, 1, , , 1, 1, 1, 1, 1, , 0 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , 1, 1, , , 1, 1, , , , , 1 ], - [ , , 1, 1, 1, 1, 1, , , 1, 1, , , , , 1 ], - [ , , 1, 1, 1, 1, 1, , , 1, 1, , , , , 1 ], - [ 1, , , , , , , , , , , , , , , 1 ], - [ 1, , , , , , , , , , , , , , , 1 ], - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, , , 1, 1, 1, 1, 1 ] - ]; - favc.width = favc.height = 16; - favctx.beginPath(); - for( var y = 0; y < 16; y++ ) { - for( var x = 0; x < 16; x++ ) { - if( faviconGrid[ y ][ x ] === 1 ) { - favctx.rect( x, y, 1, 1 ); - } - } - } - favctx.fill(); - favicon.href = favc.toDataURL(); -}; - -/*============================================================================== -Render Backgrounds -==============================================================================*/ -$.renderBackground1 = function() { - var gradient = $.ctxbg1.createRadialGradient( $.cbg1.width / 2, $.cbg1.height / 2, 0, $.cbg1.width / 2, $.cbg1.height / 2, $.cbg1.height ); - gradient.addColorStop( 0, 'hsla(0, 0%, 100%, 0.1)' ); - gradient.addColorStop( 0.65, 'hsla(0, 0%, 100%, 0)' ); - $.ctxbg1.fillStyle = gradient; - $.ctxbg1.fillRect( 0, 0, $.cbg1.width, $.cbg1.height ); - - var i = 2000; - while( i-- ) { - $.util.fillCircle( $.ctxbg1, $.util.rand( 0, $.cbg1.width ), $.util.rand( 0, $.cbg1.height ), $.util.rand( 0.2, 0.5 ), 'hsla(0, 0%, 100%, ' + $.util.rand( 0.05, 0.2 ) + ')' ); - } - - var i = 800; - while( i-- ) { - $.util.fillCircle( $.ctxbg1, $.util.rand( 0, $.cbg1.width ), $.util.rand( 0, $.cbg1.height ), $.util.rand( 0.1, 0.8 ), 'hsla(0, 0%, 100%, ' + $.util.rand( 0.05, 0.5 ) + ')' ); - } -} - -$.renderBackground2 = function() { - var i = 80; - while( i-- ) { - $.util.fillCircle( $.ctxbg2, $.util.rand( 0, $.cbg2.width ), $.util.rand( 0, $.cbg2.height ), $.util.rand( 1, 2 ), 'hsla(0, 0%, 100%, ' + $.util.rand( 0.05, 0.15 ) + ')' ); - } -} - -$.renderBackground3 = function() { - var i = 40; - while( i-- ) { - $.util.fillCircle( $.ctxbg3, $.util.rand( 0, $.cbg3.width ), $.util.rand( 0, $.cbg3.height ), $.util.rand( 1, 2.5 ), 'hsla(0, 0%, 100%, ' + $.util.rand( 0.05, 0.1 ) + ')' ); - } -} - -$.renderBackground4 = function() { - var size = 50; - $.ctxbg4.fillStyle = 'hsla(0, 0%, 50%, 0.05)'; - var i = Math.round( $.cbg4.height / size ); - while( i-- ) { - $.ctxbg4.fillRect( 0, i * size + 25, $.cbg4.width, 1 ); - } - i = Math.round( $.cbg4.width / size ); - while( i-- ) { - $.ctxbg4.fillRect( i * size, 0, 1, $.cbg4.height ); - } -} - -/*============================================================================== -Render Foreground -==============================================================================*/ -$.renderForeground = function() { - var gradient = $.ctxfg.createRadialGradient( $.cw / 2, $.ch / 2, $.ch / 3, $.cw / 2, $.ch / 2, $.ch ); - gradient.addColorStop( 0, 'hsla(0, 0%, 0%, 0)' ); - gradient.addColorStop( 1, 'hsla(0, 0%, 0%, 0.5)' ); - $.ctxfg.fillStyle = gradient; - $.ctxfg.fillRect( 0, 0, $.cw, $.ch ); - - $.ctxfg.fillStyle = 'hsla(0, 0%, 50%, 0.1)'; - var i = Math.round( $.ch / 2 ); - while( i-- ) { - $.ctxfg.fillRect( 0, i * 2, $.cw, 1 ); - } - - var gradient2 = $.ctxfg.createLinearGradient( $.cw, 0, 0, $.ch ); - gradient2.addColorStop( 0, 'hsla(0, 0%, 100%, 0.04)' ); - gradient2.addColorStop( 0.75, 'hsla(0, 0%, 100%, 0)' ); - $.ctxfg.beginPath(); - $.ctxfg.moveTo( 0, 0 ); - $.ctxfg.lineTo( $.cw, 0 ); - $.ctxfg.lineTo( 0, $.ch ); - $.ctxfg.closePath(); - $.ctxfg.fillStyle = gradient2; - $.ctxfg.fill(); -} - -/*============================================================================== -User Interface / UI / GUI / Minimap -==============================================================================*/ - -$.renderInterface = function() { - /*============================================================================== - Powerup Timers - ==============================================================================*/ - for( var i = 0; i < $.definitions.powerups.length; i++ ) { - var powerup = $.definitions.powerups[ i ], - powerupOn = ( $.powerupTimers[ i ] > 0 ); - $.ctxmg.beginPath(); - var powerupText = $.text( { - ctx: $.ctxmg, - x: $.minimap.x + $.minimap.width + 90, - y: $.minimap.y + 4 + ( i * 12 ), - text: powerup.title, - hspacing: 1, - vspacing: 1, - halign: 'right', - valign: 'top', - scale: 1, - snap: 1, - render: 1 - } ); - if( powerupOn ) { - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, ' + ( 0.25 + ( ( $.powerupTimers[ i ] / 300 ) * 0.75 ) ) + ')'; - } else { - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.25)'; - } - $.ctxmg.fill(); - if( powerupOn ) { - var powerupBar = { - x: powerupText.ex + 5, - y: powerupText.sy, - width: 110, - height: 5 - }; - $.ctxmg.fillStyle = 'hsl(' + powerup.hue + ', ' + powerup.saturation + '%, ' + powerup.lightness + '%)'; - $.ctxmg.fillRect( powerupBar.x, powerupBar.y, ( $.powerupTimers[ i ] / 300 ) * powerupBar.width, powerupBar.height ); - } - } - - /*============================================================================== - Instructions - ==============================================================================*/ - if( $.instructionTick < $.instructionTickMax ){ - $.instructionTick += $.dt; - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: $.cw / 2 - 10, - y: $.ch - 20, - text: 'MOVE\nAIM/FIRE\nAUTOFIRE\nPAUSE\nMUTE', - hspacing: 1, - vspacing: 17, - halign: 'right', - valign: 'bottom', - scale: 2, - snap: 1, - render: 1 - } ); - if( $.instructionTick < $.instructionTickMax * 0.25 ) { - var alpha = ( $.instructionTick / ( $.instructionTickMax * 0.25 ) ) * 0.5; - } else if( $.instructionTick > $.instructionTickMax - $.instructionTickMax * 0.25 ) { - var alpha = ( ( $.instructionTickMax - $.instructionTick ) / ( $.instructionTickMax * 0.25 ) ) * 0.5; - } else { - var alpha = 0.5; - } - alpha = Math.min( 1, Math.max( 0, alpha ) ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, ' + alpha + ')'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: $.cw / 2 + 10, - y: $.ch - 20, - text: 'WASD/ARROWS\nMOUSE\nF\nP\nM', - hspacing: 1, - vspacing: 17, - halign: 'left', - valign: 'bottom', - scale: 2, - snap: 1, - render: 1 - } ); - if( $.instructionTick < $.instructionTickMax * 0.25 ) { - var alpha = ( $.instructionTick / ( $.instructionTickMax * 0.25 ) ) * 1; - } else if( $.instructionTick > $.instructionTickMax - $.instructionTickMax * 0.25 ) { - var alpha = ( ( $.instructionTickMax - $.instructionTick ) / ( $.instructionTickMax * 0.25 ) ) * 1; - } else { - var alpha = 1; - } - alpha = Math.min( 1, Math.max( 0, alpha ) ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, ' + alpha + ')'; - $.ctxmg.fill(); - } - - /*============================================================================== - Slow Enemies Screen Cover - ==============================================================================*/ - if( $.powerupTimers[ 1 ] > 0 ) { - $.ctxmg.fillStyle = 'hsla(200, 100%, 20%, 0.05)'; - $.ctxmg.fillRect( 0, 0, $.cw, $.ch ); - } - - /*============================================================================== - Health - ==============================================================================*/ - $.ctxmg.beginPath(); - var healthText = $.text( { - ctx: $.ctxmg, - x: 20, - y: 20, - text: 'HEALTH', - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - var healthBar = { - x: healthText.ex + 10, - y: healthText.sy, - width: 110, - height: 10 - }; - $.ctxmg.fillStyle = 'hsla(0, 0%, 20%, 1)'; - $.ctxmg.fillRect( healthBar.x, healthBar.y, healthBar.width, healthBar.height ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.25)'; - $.ctxmg.fillRect( healthBar.x, healthBar.y, healthBar.width, healthBar.height / 2 ); - $.ctxmg.fillStyle = 'hsla(' + $.hero.life * 120 + ', 100%, 40%, 1)'; - $.ctxmg.fillRect( healthBar.x, healthBar.y, $.hero.life * healthBar.width, healthBar.height ); - $.ctxmg.fillStyle = 'hsla(' + $.hero.life * 120 + ', 100%, 75%, 1)'; - $.ctxmg.fillRect( healthBar.x, healthBar.y, $.hero.life * healthBar.width, healthBar.height / 2 ); - - if( $.hero.takingDamage && $.hero.life > 0.01 ) { - $.particleEmitters.push( new $.ParticleEmitter( { - x: -$.screen.x + healthBar.x + $.hero.life * healthBar.width, - y: -$.screen.y + healthBar.y + healthBar.height / 2, - count: 1, - spawnRange: 2, - friction: 0.85, - minSpeed: 2, - maxSpeed: 20, - minDirection: $.pi / 2 - 0.2, - maxDirection: $.pi / 2 + 0.2, - hue: $.hero.life * 120, - saturation: 100 - } ) ); - } - - /*============================================================================== - Progress - ==============================================================================*/ - $.ctxmg.beginPath(); - var progressText = $.text( { - ctx: $.ctxmg, - x: healthBar.x + healthBar.width + 40, - y: 20, - text: 'PROGRESS', - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - var progressBar = { - x: progressText.ex + 10, - y: progressText.sy, - width: healthBar.width, - height: healthBar.height - }; - $.ctxmg.fillStyle = 'hsla(0, 0%, 20%, 1)'; - $.ctxmg.fillRect( progressBar.x, progressBar.y, progressBar.width, progressBar.height ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.25)'; - $.ctxmg.fillRect( progressBar.x, progressBar.y, progressBar.width, progressBar.height / 2 ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 50%, 1)'; - $.ctxmg.fillRect( progressBar.x, progressBar.y, ( $.level.kills / $.level.killsToLevel ) * progressBar.width, progressBar.height ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 1)'; - $.ctxmg.fillRect( progressBar.x, progressBar.y, ( $.level.kills / $.level.killsToLevel ) * progressBar.width, progressBar.height / 2 ); - - if( $.level.kills == $.level.killsToLevel ) { - $.particleEmitters.push( new $.ParticleEmitter( { - x: -$.screen.x + progressBar.x + progressBar.width, - y: -$.screen.y + progressBar.y + progressBar.height / 2, - count: 30, - spawnRange: 5, - friction: 0.95, - minSpeed: 2, - maxSpeed: 25, - minDirection: 0, - minDirection: $.pi / 2 - $.pi / 4, - maxDirection: $.pi / 2 + $.pi / 4, - hue: 0, - saturation: 0 - } ) ); - } - - /*============================================================================== - Score - ==============================================================================*/ - $.ctxmg.beginPath(); - var scoreLabel = $.text( { - ctx: $.ctxmg, - x: progressBar.x + progressBar.width + 40, - y: 20, - text: 'SCORE', - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var scoreText = $.text( { - ctx: $.ctxmg, - x: scoreLabel.ex + 10, - y: 20, - text: $.util.pad( $.score, 6 ), - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 1)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var bestLabel = $.text( { - ctx: $.ctxmg, - x: scoreText.ex + 40, - y: 20, - text: 'BEST', - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var bestText = $.text( { - ctx: $.ctxmg, - x: bestLabel.ex + 10, - y: 20, - text: $.util.pad( Math.max( $.storage['score'], $.score ), 6 ), - hspacing: 1, - vspacing: 1, - halign: 'top', - valign: 'left', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 1)'; - $.ctxmg.fill(); -}; - -$.renderMinimap = function() { - $.ctxmg.fillStyle = $.minimap.color; - $.ctxmg.fillRect( $.minimap.x, $.minimap.y, $.minimap.width, $.minimap.height ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.1)'; - $.ctxmg.fillRect( - Math.floor( $.minimap.x + -$.screen.x * $.minimap.scale ), - Math.floor( $.minimap.y + -$.screen.y * $.minimap.scale ), - Math.floor( $.cw * $.minimap.scale ), - Math.floor( $.ch * $.minimap.scale ) - ); - - //$.ctxmg.beginPath(); - for( var i = 0; i < $.enemies.length; i++ ){ - var enemy = $.enemies[ i ], - x = $.minimap.x + Math.floor( enemy.x * $.minimap.scale ), - y = $.minimap.y + Math.floor( enemy.y * $.minimap.scale ); - if( $.util.pointInRect( x + 1, y + 1, $.minimap.x, $.minimap.y, $.minimap.width, $.minimap.height ) ) { - //$.ctxmg.rect( x, y, 2, 2 ); - $.ctxmg.fillStyle = 'hsl(' + enemy.hue + ', ' + enemy.saturation + '%, 50%)'; - $.ctxmg.fillRect( x, y, 2, 2 ); - } - } - //$.ctxmg.fillStyle = '#f00'; - //$.ctxmg.fill(); - - $.ctxmg.beginPath(); - for( var i = 0; i < $.bullets.length; i++ ){ - var bullet = $.bullets[ i ], - x = $.minimap.x + Math.floor( bullet.x * $.minimap.scale ), - y = $.minimap.y + Math.floor( bullet.y * $.minimap.scale ); - if( $.util.pointInRect( x, y, $.minimap.x, $.minimap.y, $.minimap.width, $.minimap.height ) ) { - $.ctxmg.rect( x, y, 1, 1 ); - } - } - $.ctxmg.fillStyle = '#fff'; - $.ctxmg.fill(); - - $.ctxmg.fillStyle = $.hero.fillStyle; - $.ctxmg.fillRect( $.minimap.x + Math.floor( $.hero.x * $.minimap.scale ), $.minimap.y + Math.floor( $.hero.y * $.minimap.scale ), 2, 2 ); - - $.ctxmg.strokeStyle = $.minimap.strokeColor; - $.ctxmg.strokeRect( $.minimap.x - 0.5, $.minimap.y - 0.5, $.minimap.width + 1, $.minimap.height + 1 ); -}; - -/*============================================================================== -Enemy Spawning -==============================================================================*/ -$.getSpawnCoordinates = function( radius ) { - var quadrant = Math.floor( $.util.rand( 0, 4 ) ), - x, - y, - start; - - if( quadrant === 0){ - x = $.util.rand( 0, $.ww ); - y = -radius; - start = 'top'; - } else if( quadrant === 1 ){ - x = $.ww + radius; - y = $.util.rand( 0, $.wh ); - start = 'right'; - } else if( quadrant === 2 ) { - x = $.util.rand( 0, $.ww ); - y = $.wh + radius; - start = 'bottom'; - } else { - x = -radius; - y = $.util.rand( 0, $.wh ); - start = 'left'; - } - - return { x: x, y: y, start: start }; -}; - -$.spawnEnemy = function( type ) { - var params = $.definitions.enemies[ type ], - coordinates = $.getSpawnCoordinates( params.radius ); - params.x = coordinates.x; - params.y = coordinates.y; - params.start = coordinates.start; - params.type = type; - return new $.Enemy( params ); -}; - -$.spawnEnemies = function() { - var floorTick = Math.floor( $.tick ); - for( var i = 0; i < $.level.distributionCount; i++ ) { - var timeCheck = $.level.distribution[ i ]; - if( $.levelDiffOffset > 0 ){ - timeCheck = Math.max( 1, timeCheck - ( $.levelDiffOffset * 2) ); - } - if( floorTick % timeCheck === 0 ) { - $.enemies.push( $.spawnEnemy( i ) ); - } - } -}; - -/*============================================================================== -Events -==============================================================================*/ -$.mousemovecb = function( e ) { - e.preventDefault(); - $.mouse.ax = e.pageX; - $.mouse.ay = e.pageY; - $.mousescreen(); -}; - -$.mousescreen = function() { - $.mouse.sx = $.mouse.ax - $.cOffset.left; - $.mouse.sy = $.mouse.ay - $.cOffset.top; - $.mouse.x = $.mouse.sx - $.screen.x; - $.mouse.y = $.mouse.sy - $.screen.y; -}; - -$.mousedowncb = function( e ) { - e.preventDefault(); - $.mouse.down = 1; -}; - -$.mouseupcb = function( e ) { - e.preventDefault(); - $.mouse.down = 0; -}; - -$.keydowncb = function( e ) { - var e = ( e.keyCode ? e.keyCode : e.which ); - if( e === 38 || e === 87 ){ $.keys.state.up = 1; } - if( e === 39 || e === 68 ){ $.keys.state.right = 1; } - if( e === 40 || e === 83 ){ $.keys.state.down = 1; } - if( e === 37 || e === 65 ){ $.keys.state.left = 1; } - if( e === 70 ){ $.keys.state.f = 1; } - if( e === 77 ){ $.keys.state.m = 1; } - if( e === 80 ){ $.keys.state.p = 1; } -} - -$.keyupcb = function( e ) { - var e = ( e.keyCode ? e.keyCode : e.which ); - if( e === 38 || e === 87 ){ $.keys.state.up = 0; } - if( e === 39 || e === 68 ){ $.keys.state.right = 0; } - if( e === 40 || e === 83 ){ $.keys.state.down = 0; } - if( e === 37 || e === 65 ){ $.keys.state.left = 0; } - if( e === 70 ){ $.keys.state.f = 0; } - if( e === 77 ){ $.keys.state.m = 0; } - if( e === 80 ){ $.keys.state.p = 0; } -} - -$.resizecb = function( e ) { - var rect = $.cmg.getBoundingClientRect(); - $.cOffset = { - left: rect.left, - top: rect.top - } -} - -$.blurcb = function() { - if( $.state == 'play' ){ - $.setState( 'pause' ); - } -} - -$.bindEvents = function() { - window.addEventListener( 'mousemove', $.mousemovecb ); - window.addEventListener( 'mousedown', $.mousedowncb ); - window.addEventListener( 'mouseup', $.mouseupcb ); - window.addEventListener( 'keydown', $.keydowncb ); - window.addEventListener( 'keyup', $.keyupcb ); - window.addEventListener( 'resize', $.resizecb ); - window.addEventListener( 'blur', $.blurcb ); -}; - -/*============================================================================== -Miscellaneous -==============================================================================*/ -$.clearScreen = function() { - $.ctxmg.clearRect( 0, 0, $.cw, $.ch ); -}; - -$.updateDelta = function() { - var now = Date.now(); - $.dt = ( now - $.lt ) / ( 1000 / 60 ); - $.dt = ( $.dt < 0 ) ? 0.001 : $.dt; - $.dt = ( $.dt > 10 ) ? 10 : $.dt; - $.lt = now; - $.elapsed += $.dt; -}; - -$.updateScreen = function() { - var xSnap, - xModify, - ySnap, - yModify; - - if( $.hero.x < $.cw / 2 ) { - xModify = $.hero.x / $.cw; - } else if( $.hero.x > $.ww - $.cw / 2 ) { - xModify = 1 - ( $.ww - $.hero.x ) / $.cw; - } else { - xModify = 0.5; - } - - if( $.hero.y < $.ch / 2 ) { - yModify = $.hero.y / $.ch; - } else if( $.hero.y > $.wh - $.ch / 2 ) { - yModify = 1 - ( $.wh - $.hero.y ) / $.ch; - } else { - yModify = 0.5; - } - - xSnap = ( ( $.cw * xModify - $.hero.x ) - $.screen.x ) / 30; - ySnap = ( ( $.ch * yModify - $.hero.y ) - $.screen.y ) / 30; - - // ease to new coordinates - $.screen.x += xSnap * $.dt; - $.screen.y += ySnap * $.dt; - - // update rumble levels, keep X and Y changes consistent, apply rumble - if( $.rumble.level > 0 ) { - $.rumble.level -= $.rumble.decay; - $.rumble.level = ( $.rumble.level < 0 ) ? 0 : $.rumble.level; - $.rumble.x = $.util.rand( -$.rumble.level, $.rumble.level ); - $.rumble.y = $.util.rand( -$.rumble.level, $.rumble.level ); - } else { - $.rumble.x = 0; - $.rumble.y = 0; - } - - //$.screen.x -= $.rumble.x; - //$.screen.y -= $.rumble.y; - - // animate background canvas - $.cbg1.style.marginLeft = - -( ( $.cbg1.width - $.cw ) / 2 ) // half the difference from bg to viewport - - ( ( $.cbg1.width - $.cw ) / 2 ) // half the diff again, modified by a percentage below - * ( ( -$.screen.x - ( $.ww - $.cw ) / 2 ) / ( ( $.ww - $.cw ) / 2) ) // viewport offset applied to bg - - $.rumble.x + 'px'; - $.cbg1.style.marginTop = - -( ( $.cbg1.height - $.ch ) / 2 ) - - ( ( $.cbg1.height - $.ch ) / 2 ) - * ( ( -$.screen.y - ( $.wh - $.ch ) / 2 ) / ( ( $.wh - $.ch ) / 2) ) - - $.rumble.y + 'px'; - $.cbg2.style.marginLeft = - -( ( $.cbg2.width - $.cw ) / 2 ) // half the difference from bg to viewport - - ( ( $.cbg2.width - $.cw ) / 2 ) // half the diff again, modified by a percentage below - * ( ( -$.screen.x - ( $.ww - $.cw ) / 2 ) / ( ( $.ww - $.cw ) / 2) ) // viewport offset applied to bg - - $.rumble.x + 'px'; - $.cbg2.style.marginTop = - -( ( $.cbg2.height - $.ch ) / 2 ) - - ( ( $.cbg2.height - $.ch ) / 2 ) - * ( ( -$.screen.y - ( $.wh - $.ch ) / 2 ) / ( ( $.wh - $.ch ) / 2) ) - - $.rumble.y + 'px'; - $.cbg3.style.marginLeft = - -( ( $.cbg3.width - $.cw ) / 2 ) // half the difference from bg to viewport - - ( ( $.cbg3.width - $.cw ) / 2 ) // half the diff again, modified by a percentage below - * ( ( -$.screen.x - ( $.ww - $.cw ) / 2 ) / ( ( $.ww - $.cw ) / 2) ) // viewport offset applied to bg - - $.rumble.x + 'px'; - $.cbg3.style.marginTop = - -( ( $.cbg3.height - $.ch ) / 2 ) - - ( ( $.cbg3.height - $.ch ) / 2 ) - * ( ( -$.screen.y - ( $.wh - $.ch ) / 2 ) / ( ( $.wh - $.ch ) / 2) ) - - $.rumble.y + 'px'; - $.cbg4.style.marginLeft = - -( ( $.cbg4.width - $.cw ) / 2 ) // half the difference from bg to viewport - - ( ( $.cbg4.width - $.cw ) / 2 ) // half the diff again, modified by a percentage below - * ( ( -$.screen.x - ( $.ww - $.cw ) / 2 ) / ( ( $.ww - $.cw ) / 2) ) // viewport offset applied to bg - - $.rumble.x + 'px'; - $.cbg4.style.marginTop = - -( ( $.cbg4.height - $.ch ) / 2 ) - - ( ( $.cbg4.height - $.ch ) / 2 ) - * ( ( -$.screen.y - ( $.wh - $.ch ) / 2 ) / ( ( $.wh - $.ch ) / 2) ) - - $.rumble.y + 'px'; - - $.mousescreen(); -}; - -$.updateLevel = function() { - if( $.level.kills >= $.level.killsToLevel ) { - if( $.level.current + 1 < $.levelCount ){ - $.level.current++; - $.level.kills = 0; - $.level.killsToLevel = $.definitions.levels[ $.level.current ].killsToLevel; - $.level.distribution = $.definitions.levels[ $.level.current ].distribution; - $.level.distributionCount = $.level.distribution.length; - } else { - $.level.current++; - $.level.kills = 0; - // no more level definitions, so take the last level and increase the spawn rate slightly - //for( var i = 0; i < $.level.distributionCount; i++ ) { - //$.level.distribution[ i ] = Math.max( 1, $.level.distribution[ i ] - 5 ); - //} - } - $.levelDiffOffset = $.level.current + 1 - $.levelCount; - $.levelPops.push( new $.LevelPop( { - level: $.level.current + 1 - } ) ); - } -}; - -$.updatePowerupTimers = function() { - // HEALTH - if( $.powerupTimers[ 0 ] > 0 ){ - if( $.hero.life < 1 ) { - $.hero.life += 0.001; - } - if( $.hero.life > 1 ) { - $.hero.life = 1; - } - $.powerupTimers[ 0 ] -= $.dt; - } - - // SLOW ENEMIES - if( $.powerupTimers[ 1 ] > 0 ){ - $.slow = 1; - $.powerupTimers[ 1 ] -= $.dt; - } else { - $.slow = 0; - } - - // FAST SHOT - if( $.powerupTimers[ 2 ] > 0 ){ - $.hero.weapon.fireRate = 2; - $.hero.weapon.bullet.speed = 14; - $.powerupTimers[ 2 ] -= $.dt; - } else { - $.hero.weapon.fireRate = 5; - $.hero.weapon.bullet.speed = 10; - } - - // TRIPLE SHOT - if( $.powerupTimers[ 3 ] > 0 ){ - $.hero.weapon.count = 3; - $.powerupTimers[ 3 ] -= $.dt; - } else { - $.hero.weapon.count = 1; - } - - // PIERCE SHOT - if( $.powerupTimers[ 4 ] > 0 ){ - $.hero.weapon.bullet.piercing = 1; - $.powerupTimers[ 4 ] -= $.dt; - } else { - $.hero.weapon.bullet.piercing = 0; - } -}; - -$.spawnPowerup = function( x, y ) { - if( Math.random() < 0.1 ) { - var min = ( $.hero.life < 0.9 ) ? 0 : 1, - type = Math.floor( $.util.rand( min, $.definitions.powerups.length ) ), - params = $.definitions.powerups[ type ]; - params.type = type; - params.x = x; - params.y = y; - $.powerups.push( new $.Powerup( params ) ); - } -}; - -/*============================================================================== -States -==============================================================================*/ -$.setState = function( state ) { - // handle clean up between states - $.buttons.length = 0; - - if( state == 'menu' ) { - $.mouse.down = 0; - $.mouse.ax = 0; - $.mouse.ay = 0; - - $.reset(); - - var playButton = new $.Button( { - x: $.cw / 2 + 1, - y: $.ch / 2 - 24, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'PLAY', - action: function() { - $.reset(); - $.audio.play( 'levelup' ); - $.setState( 'play' ); - } - } ); - $.buttons.push( playButton ); - - var statsButton = new $.Button( { - x: $.cw / 2 + 1, - y: playButton.ey + 25, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'STATS', - action: function() { - $.setState( 'stats' ); - } - } ); - $.buttons.push( statsButton ); - - var creditsButton = new $.Button( { - x: $.cw / 2 + 1, - y: statsButton.ey + 26, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'CREDITS', - action: function() { - $.setState( 'credits' ); - } - } ) ; - $.buttons.push( creditsButton ); - } - - if( state == 'stats' ) { - $.mouse.down = 0; - - var clearButton = new $.Button( { - x: $.cw / 2 + 1, - y: 426, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'CLEAR DATA', - action: function() { - $.mouse.down = 0; - if( window.confirm( 'Are you sure you want to clear all locally stored game data? This cannot be undone.') ) { - $.clearStorage(); - $.mouse.down = 0; - } - } - } ); - $.buttons.push( clearButton ); - - var menuButton = new $.Button( { - x: $.cw / 2 + 1, - y: clearButton.ey + 25, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'MENU', - action: function() { - $.setState( 'menu' ); - } - } ); - $.buttons.push( menuButton ); - } - - if( state == 'credits' ) { - $.mouse.down = 0; - - var js13kButton = new $.Button( { - x: $.cw / 2 + 1, - y: 476, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'JS13KGAMES', - action: function() { - location.href = 'http://js13kgames.com'; - $.mouse.down = 0; - } - } ); - $.buttons.push( js13kButton ); - - var menuButton = new $.Button( { - x: $.cw / 2 + 1, - y: js13kButton.ey + 25, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'MENU', - action: function() { - $.setState( 'menu' ); - } - } ); - $.buttons.push( menuButton ); - } - - if( state == 'pause' ) { - $.mouse.down = 0; - $.screenshot = $.ctxmg.getImageData( 0, 0, $.cw, $.ch ); - var resumeButton = new $.Button( { - x: $.cw / 2 + 1, - y: $.ch / 2 + 26, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'RESUME', - action: function() { - $.lt = Date.now() + 1000; - $.setState( 'play' ); - } - } ); - $.buttons.push( resumeButton ); - - var menuButton = new $.Button( { - x: $.cw / 2 + 1, - y: resumeButton.ey + 25, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'MENU', - action: function() { - $.mouse.down = 0; - if( window.confirm( 'Are you sure you want to end this game and return to the menu?') ) { - $.mousescreen(); - $.setState( 'menu' ); - } - } - } ); - $.buttons.push( menuButton ); - } - - if( state == 'gameover' ) { - $.mouse.down = 0; - - $.screenshot = $.ctxmg.getImageData( 0, 0, $.cw, $.ch ); - var resumeButton = new $.Button( { - x: $.cw / 2 + 1, - y: 426, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'PLAY AGAIN', - action: function() { - $.reset(); - $.audio.play( 'levelup' ); - $.setState( 'play' ); - } - } ); - $.buttons.push( resumeButton ); - - var menuButton = new $.Button( { - x: $.cw / 2 + 1, - y: resumeButton.ey + 25, - lockedWidth: 299, - lockedHeight: 49, - scale: 3, - title: 'MENU', - action: function() { - $.setState( 'menu' ); - } - } ); - $.buttons.push( menuButton ); - - $.storage['score'] = Math.max( $.storage['score'], $.score ); - $.storage['level'] = Math.max( $.storage['level'], $.level.current ); - $.storage['rounds'] += 1; - $.storage['kills'] += $.kills; - $.storage['bullets'] += $.bulletsFired; - $.storage['powerups'] += $.powerupsCollected; - $.storage['time'] += Math.floor( $.elapsed ); - $.updateStorage(); - } - - // set state - $.state = state; -}; - -$.setupStates = function() { - $.states['menu'] = function() { - $.clearScreen(); - $.updateScreen(); - - var i = $.buttons.length; while( i-- ){ $.buttons[ i ].update( i ) } - i = $.buttons.length; while( i-- ){ $.buttons[ i ].render( i ) } - - $.ctxmg.beginPath(); - var title = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: $.ch / 2 - 100, - text: 'RADIUS RAID', - hspacing: 2, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 10, - snap: 1, - render: 1 - } ); - gradient = $.ctxmg.createLinearGradient( title.sx, title.sy, title.sx, title.ey ); - gradient.addColorStop( 0, '#fff' ); - gradient.addColorStop( 1, '#999' ); - $.ctxmg.fillStyle = gradient; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var bottomInfo = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: $.ch - 172, - text: 'CREATED BY JACK RUGILE FOR JS13KGAMES 2013', - hspacing: 1, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 1, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = '#666'; - $.ctxmg.fill(); - - }; - - $.states['stats'] = function() { - $.clearScreen(); - - $.ctxmg.beginPath(); - var statsTitle = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: 150, - text: 'STATS', - hspacing: 3, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 10, - snap: 1, - render: 1 - } ); - var gradient = $.ctxmg.createLinearGradient( statsTitle.sx, statsTitle.sy, statsTitle.sx, statsTitle.ey ); - gradient.addColorStop( 0, '#fff' ); - gradient.addColorStop( 1, '#999' ); - $.ctxmg.fillStyle = gradient; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var statKeys = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 - 10, - y: statsTitle.ey + 39, - text: 'BEST SCORE\nBEST LEVEL\nROUNDS PLAYED\nENEMIES KILLED\nBULLETS FIRED\nPOWERUPS COLLECTED\nTIME ELAPSED', - hspacing: 1, - vspacing: 17, - halign: 'right', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var statsValues = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 + 10, - y: statsTitle.ey + 39, - text: - $.util.commas( $.storage['score'] ) + '\n' + - ( $.storage['level'] + 1 ) + '\n' + - $.util.commas( $.storage['rounds'] ) + '\n' + - $.util.commas( $.storage['kills'] ) + '\n' + - $.util.commas( $.storage['bullets'] ) + '\n' + - $.util.commas( $.storage['powerups'] ) + '\n' + - $.util.convertTime( ( $.storage['time'] * ( 1000 / 60 ) ) / 1000 ) - , - hspacing: 1, - vspacing: 17, - halign: 'left', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = '#fff'; - $.ctxmg.fill(); - - var i = $.buttons.length; while( i-- ){ $.buttons[ i ].render( i ) } - i = $.buttons.length; while( i-- ){ $.buttons[ i ].update( i ) } - }; - - $.states['credits'] = function() { - $.clearScreen(); - - $.ctxmg.beginPath(); - var creditsTitle = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: 100, - text: 'CREDITS', - hspacing: 3, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 10, - snap: 1, - render: 1 - } ); - var gradient = $.ctxmg.createLinearGradient( creditsTitle.sx, creditsTitle.sy, creditsTitle.sx, creditsTitle.ey ); - gradient.addColorStop( 0, '#fff' ); - gradient.addColorStop( 1, '#999' ); - $.ctxmg.fillStyle = gradient; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var creditKeys = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 - 10, - y: creditsTitle.ey + 49, - text: 'CREATED FOR JS13KGAMES BY\nINSPIRATION AND SUPPORT\n\nAUDIO PROCESSING\nGAME INSPIRATION AND IDEAS\n\nHTML5 CANVAS REFERENCE\n\nGAME MATH REFERENCE', - hspacing: 1, - vspacing: 17, - halign: 'right', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var creditValues = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 + 10, - y: creditsTitle.ey + 49, - text: '@JACKRUGILE\n@REZONER, @LOKTAR00, @END3R,\n@AUSTINHALLOCK, @CHANDLERPRALL\nJSFXR BY @MARKUSNEUBRAND\nASTEROIDS, CELL WARFARE,\nSPACE PIPS, AND MANY MORE\nNIHILOGIC HTML5\nCANVAS CHEAT SHEET\nBILLY LAMBERTA FOUNDATION\nHTML5 ANIMATION WITH JAVASCRIPT', - hspacing: 1, - vspacing: 17, - halign: 'left', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = '#fff'; - $.ctxmg.fill(); - - var i = $.buttons.length; while( i-- ){ $.buttons[ i ].render( i ) } - i = $.buttons.length; while( i-- ){ $.buttons[ i ].update( i ) } - }; - - $.states['play'] = function() { - $.updateDelta(); - $.updateScreen(); - $.updateLevel(); - $.updatePowerupTimers(); - $.spawnEnemies(); - $.enemyOffsetMod += ( $.slow ) ? $.dt / 3 : $.dt; - - // update entities - var i = $.enemies.length; while( i-- ){ $.enemies[ i ].update( i ) } - i = $.explosions.length; while( i-- ){ $.explosions[ i ].update( i ) } - i = $.powerups.length; while( i-- ){ $.powerups[ i ].update( i ) } - i = $.particleEmitters.length; while( i-- ){ $.particleEmitters[ i ].update( i ) } - i = $.textPops.length; while( i-- ){ $.textPops[ i ].update( i ) } - i = $.levelPops.length; while( i-- ){ $.levelPops[ i ].update( i ) } - i = $.bullets.length; while( i-- ){ $.bullets[ i ].update( i ) } - $.hero.update(); - - // render entities - $.clearScreen(); - $.ctxmg.save(); - $.ctxmg.translate( $.screen.x - $.rumble.x, $.screen.y - $.rumble.y ); - i = $.enemies.length; while( i-- ){ $.enemies[ i ].render( i ) } - i = $.explosions.length; while( i-- ){ $.explosions[ i ].render( i ) } - i = $.powerups.length; while( i-- ){ $.powerups[ i ].render( i ) } - i = $.particleEmitters.length; while( i-- ){ $.particleEmitters[ i ].render( i ) } - i = $.textPops.length; while( i-- ){ $.textPops[ i ].render( i ) } - i = $.bullets.length; while( i-- ){ $.bullets[ i ].render( i ) } - $.hero.render(); - $.ctxmg.restore(); - i = $.levelPops.length; while( i-- ){ $.levelPops[ i ].render( i ) } - $.renderInterface(); - $.renderMinimap(); - - // handle gameover - if( $.hero.life <= 0 ) { - var alpha = ( ( $.gameoverTick / $.gameoverTickMax ) * 0.8 ); - alpha = Math.min( 1, Math.max( 0, alpha ) ); - $.ctxmg.fillStyle = 'hsla(0, 100%, 0%, ' + alpha + ')'; - $.ctxmg.fillRect( 0, 0, $.cw, $.ch ); - if( $.gameoverTick < $.gameoverTickMax ){ - $.gameoverTick += $.dt; - } else { - $.setState( 'gameover' ); - } - - if( !$.gameoverExplosion ) { - $.audio.play( 'death' ); - $.rumble.level = 25; - $.explosions.push( new $.Explosion( { - x: $.hero.x + $.util.rand( -10, 10 ), - y: $.hero.y + $.util.rand( -10, 10 ), - radius: 50, - hue: 0, - saturation: 0 - } ) ); - $.particleEmitters.push( new $.ParticleEmitter( { - x: $.hero.x, - y: $.hero.y, - count: 45, - spawnRange: 10, - friction: 0.95, - minSpeed: 2, - maxSpeed: 20, - minDirection: 0, - maxDirection: $.twopi, - hue: 0, - saturation: 0 - } ) ); - for( var i = 0; i < $.powerupTimers.length; i++ ){ - $.powerupTimers[ i ] = 0; - } - $.gameoverExplosion = 1; - } - } - - // update tick - $.tick += $.dt; - - // listen for pause - if( $.keys.pressed.p ){ - $.setState( 'pause' ); - } - - // always listen for autofire toggle - if( $.keys.pressed.f ){ - $.autofire = ~~!$.autofire; - $.storage['autofire'] = $.autofire; - $.updateStorage(); - } - }; - - $.states['pause'] = function() { - $.clearScreen(); - $.ctxmg.putImageData( $.screenshot, 0, 0 ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 0%, 0.4)'; - $.ctxmg.fillRect( 0, 0, $.cw, $.ch ); - - $.ctxmg.beginPath(); - var pauseText = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: $.ch / 2 - 50, - text: 'PAUSED', - hspacing: 3, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 10, - snap: 1, - render: 1 - } ); - var gradient = $.ctxmg.createLinearGradient( pauseText.sx, pauseText.sy, pauseText.sx, pauseText.ey ); - gradient.addColorStop( 0, '#fff' ); - gradient.addColorStop( 1, '#999' ); - $.ctxmg.fillStyle = gradient; - $.ctxmg.fill(); - - var i = $.buttons.length; while( i-- ){ $.buttons[ i ].render( i ) } - i = $.buttons.length; while( i-- ){ $.buttons[ i ].update( i ) } - - if( $.keys.pressed.p ){ - $.setState( 'play' ); - } - }; - - $.states['gameover'] = function() { - $.clearScreen(); - $.ctxmg.putImageData( $.screenshot, 0, 0 ); - - var i = $.buttons.length; while( i-- ){ $.buttons[ i ].update( i ) } - i = $.buttons.length; while( i-- ){ $.buttons[ i ].render( i ) } - - $.ctxmg.beginPath(); - var gameoverTitle = $.text( { - ctx: $.ctxmg, - x: $.cw / 2, - y: 150, - text: 'GAME OVER', - hspacing: 3, - vspacing: 1, - halign: 'center', - valign: 'bottom', - scale: 10, - snap: 1, - render: 1 - } ); - var gradient = $.ctxmg.createLinearGradient( gameoverTitle.sx, gameoverTitle.sy, gameoverTitle.sx, gameoverTitle.ey ); - gradient.addColorStop( 0, '#f22' ); - gradient.addColorStop( 1, '#b00' ); - $.ctxmg.fillStyle = gradient; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var gameoverStatsKeys = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 - 10, - y: gameoverTitle.ey + 51, - text: 'SCORE\nLEVEL\nKILLS\nBULLETS\nPOWERUPS\nTIME', - hspacing: 1, - vspacing: 17, - halign: 'right', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.5)'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - var gameoverStatsValues = $.text( { - ctx: $.ctxmg, - x: $.cw / 2 + 10, - y: gameoverTitle.ey + 51, - text: - $.util.commas( $.score ) + '\n' + - ( $.level.current + 1 ) + '\n' + - $.util.commas( $.kills ) + '\n' + - $.util.commas( $.bulletsFired ) + '\n' + - $.util.commas( $.powerupsCollected ) + '\n' + - $.util.convertTime( ( $.elapsed * ( 1000 / 60 ) ) / 1000 ) - , - hspacing: 1, - vspacing: 17, - halign: 'left', - valign: 'top', - scale: 2, - snap: 1, - render: 1 - } ); - $.ctxmg.fillStyle = '#fff'; - $.ctxmg.fill(); - }; -} - -/*============================================================================== -Loop -==============================================================================*/ -$.loop = function() { - requestAnimFrame( $.loop ); - - // setup the pressed state for all keys - for( var k in $.keys.state ) { - if( $.keys.state[ k ] && !$.okeys[ k ] ) { - $.keys.pressed[ k ] = 1; - } else { - $.keys.pressed[ k ] = 0; - } - } - - // run the current state - $.states[ $.state ](); - - // always listen for mute toggle - if( $.keys.pressed.m ){ - $.mute = ~~!$.mute; - var i = $.audio.references.length; - while( i-- ) { - $.audio.references[ i ].volume = ~~!$.mute; - } - $.storage['mute'] = $.mute; - $.updateStorage(); - } - - // move current keys into old keys - $.okeys = {}; - for( var k in $.keys.state ) { - $.okeys[ k ] = $.keys.state[ k ]; - } -}; - -/*============================================================================== -Start Game on Load -==============================================================================*/ -window.addEventListener( 'load', function() { - document.documentElement.className += ' loaded'; - $.init(); -}); \ No newline at end of file diff --git a/tools/radius-raid/js/hero.js b/tools/radius-raid/js/hero.js deleted file mode 100644 index fd7be62..0000000 --- a/tools/radius-raid/js/hero.js +++ /dev/null @@ -1,216 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Hero = function() { - this.x = $.ww / 2; - this.y = $.wh / 2; - this.vx = 0; - this.vy = 0; - this.vmax = 4; - this.vmax = 6; - this.direction = 0; - this.accel = 0.5; - this.radius = 10; - this.life = 1; - this.takingDamage = 0; - this.fillStyle = '#fff'; - this.weapon = { - fireRate: 5, - fireRateTick: 5, - spread: 0.3, - count: 1, - bullet: { - size: 15, - lineWidth: 2, - damage: 1, - speed: 10, - piercing: 0, - strokeStyle: '#fff' - }, - fireFlag: 0 - }; -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Hero.prototype.update = function() { - if( this.life > 0 ) { - /*============================================================================== - Apply Forces - ==============================================================================*/ - if( $.keys.state.up ) { - this.vy -= this.accel * $.dt; - if( this.vy < -this.vmax ) { - this.vy = -this.vmax; - } - } else if( $.keys.state.down ) { - this.vy += this.accel * $.dt; - if( this.vy > this.vmax ) { - this.vy = this.vmax; - } - } - if( $.keys.state.left ) { - this.vx -= this.accel * $.dt; - if( this.vx < -this.vmax ) { - this.vx = -this.vmax; - } - } else if( $.keys.state.right ) { - this.vx += this.accel * $.dt; - if( this.vx > this.vmax ) { - this.vx = this.vmax; - } - } - - this.vy *= 0.9; - this.vx *= 0.9; - - this.x += this.vx * $.dt; - this.y += this.vy * $.dt; - - /*============================================================================== - Lock Bounds - ==============================================================================*/ - if( this.x >= $.ww - this.radius ) { - this.x = $.ww - this.radius; - } - if( this.x <= this.radius ) { - this.x = this.radius; - } - if( this.y >= $.wh - this.radius ) { - this.y = $.wh - this.radius; - } - if( this.y <= this.radius ) { - this.y = this.radius; - } - - /*============================================================================== - Update Direction - ==============================================================================*/ - var dx = $.mouse.x - this.x, - dy = $.mouse.y - this.y; - this.direction = Math.atan2( dy, dx ); - - /*============================================================================== - Fire Weapon - ==============================================================================*/ - if( this.weapon.fireRateTick < this.weapon.fireRate ){ - this.weapon.fireRateTick += $.dt; - } else { - if( $.autofire || ( !$.autofire && $.mouse.down ) ){ - $.audio.play( 'shoot' ); - if( $.powerupTimers[ 2 ] > 0 || $.powerupTimers[ 3 ] > 0 || $.powerupTimers[ 4 ] > 0) { - $.audio.play( 'shootAlt' ); - } - - this.weapon.fireRateTick = this.weapon.fireRateTick - this.weapon.fireRate; - this.weapon.fireFlag = 6; - - if( this.weapon.count > 1 ) { - var spreadStart = -this.weapon.spread / 2; - var spreadStep = this.weapon.spread / ( this.weapon.count - 1 ); - } else { - var spreadStart = 0; - var spreadStep = 0; - } - - var gunX = this.x + Math.cos( this.direction ) * ( this.radius + this.weapon.bullet.size ); - var gunY = this.y + Math.sin( this.direction ) * ( this.radius + this.weapon.bullet.size ); - - for( var i = 0; i < this.weapon.count; i++ ) { - $.bulletsFired++; - var color = this.weapon.bullet.strokeStyle; - if( $.powerupTimers[ 2 ] > 0 || $.powerupTimers[ 3 ] > 0 || $.powerupTimers[ 4 ] > 0) { - var colors = []; - if( $.powerupTimers[ 2 ] > 0 ) { colors.push( 'hsl(' + $.definitions.powerups[ 2 ].hue + ', ' + $.definitions.powerups[ 2 ].saturation + '%, ' + $.definitions.powerups[ 2 ].lightness + '%)' ); } - if( $.powerupTimers[ 3 ] > 0 ) { colors.push( 'hsl(' + $.definitions.powerups[ 3 ].hue + ', ' + $.definitions.powerups[ 3 ].saturation + '%, ' + $.definitions.powerups[ 3 ].lightness + '%)' ); } - if( $.powerupTimers[ 4 ] > 0 ) { colors.push( 'hsl(' + $.definitions.powerups[ 4 ].hue + ', ' + $.definitions.powerups[ 4 ].saturation + '%, ' + $.definitions.powerups[ 4 ].lightness + '%)' ); } - color = colors[ Math.floor( $.util.rand( 0, colors.length ) ) ]; - } - $.bullets.push( new $.Bullet( { - x: gunX, - y: gunY, - speed: this.weapon.bullet.speed, - direction: this.direction + spreadStart + i * spreadStep, - damage: this.weapon.bullet.damage, - size: this.weapon.bullet.size, - lineWidth: this.weapon.bullet.lineWidth, - strokeStyle: color, - piercing: this.weapon.bullet.piercing - } ) ); - } - } - } - - /*============================================================================== - Check Collisions - ==============================================================================*/ - this.takingDamage = 0; - var ei = $.enemies.length; - while( ei-- ) { - var enemy = $.enemies[ ei ]; - if( enemy.inView && $.util.distance( this.x, this.y, enemy.x, enemy.y ) <= this.radius + enemy.radius ) { - $.particleEmitters.push( new $.ParticleEmitter( { - x: this.x, - y: this.y, - count: 2, - spawnRange: 0, - friction: 0.85, - minSpeed: 2, - maxSpeed: 15, - minDirection: 0, - maxDirection: $.twopi, - hue: 0, - saturation: 0 - } ) ); - this.takingDamage = 1; - this.life -= 0.0075; - $.rumble.level = 3; - if( Math.floor( $.tick ) % 5 == 0 ){ - $.audio.play( 'takingDamage' ); - } - } - } - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Hero.prototype.render = function() { - if( this.life > 0 ) { - if( this.takingDamage ) { - var fillStyle = 'hsla(0, 0%, ' + $.util.rand( 0, 100 ) + '%, 1)'; - $.ctxmg.fillStyle = 'hsla(0, 0%, ' + $.util.rand( 0, 100 ) + '%, ' + $.util.rand( 0.01, 0.15 ) + ')'; - $.ctxmg.fillRect( -$.screen.x, -$.screen.y, $.cw, $.ch ); - } else if( this.weapon.fireFlag > 0 ) { - this.weapon.fireFlag -= $.dt; - var fillStyle = 'hsla(' + $.util.rand( 0, 359 ) + ', 100%, ' + $.util.rand( 20, 80 ) + '%, 1)'; - } else { - var fillStyle = this.fillStyle; - } - - $.ctxmg.save(); - $.ctxmg.translate( this.x, this.y ); - $.ctxmg.rotate( this.direction - $.pi / 4 ); - $.ctxmg.fillStyle = fillStyle; - $.ctxmg.fillRect( 0, 0, this.radius, this.radius ); - $.ctxmg.restore(); - - $.ctxmg.save(); - $.ctxmg.translate( this.x, this.y ); - $.ctxmg.rotate( this.direction - $.pi / 4 + $.twopi / 3 ); - $.ctxmg.fillStyle = fillStyle; - $.ctxmg.fillRect( 0, 0, this.radius, this.radius ); - $.ctxmg.restore(); - - $.ctxmg.save(); - $.ctxmg.translate( this.x, this.y ); - $.ctxmg.rotate( this.direction - $.pi / 4 - $.twopi / 3 ); - $.ctxmg.fillStyle = fillStyle; - $.ctxmg.fillRect( 0, 0, this.radius, this.radius ); - $.ctxmg.restore(); - - $.util.fillCircle( $.ctxmg, this.x, this.y, this.radius - 3, fillStyle ); - } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/jsfxr.js b/tools/radius-raid/js/jsfxr.js deleted file mode 100644 index 4dda70c..0000000 --- a/tools/radius-raid/js/jsfxr.js +++ /dev/null @@ -1,7 +0,0 @@ -function J(){this.B=function(e){for(var f=0;24>f;f++)this[String.fromCharCode(97+f)]=e[f]||0;0.01>this.c&&(this.c=0.01);e=this.b+this.c+this.e;0.18>e&&(e=0.18/e,this.b*=e,this.c*=e,this.e*=e)}} -var W=new function(){this.A=new J;var e,f,d,g,l,z,K,L,M,A,m,N;this.reset=function(){var c=this.A;g=100/(c.f*c.f+0.001);l=100/(c.g*c.g+0.001);z=1-0.01*c.h*c.h*c.h;K=1E-6*-c.i*c.i*c.i;c.a||(m=0.5-c.n/2,N=5E-5*-c.o);L=0a.q?-1020:1020),S=a.p?(2E4*(1-a.p)*(1-a.p)|0)+32:0,ba=a.d,T=a.j/2,ca=0.01*a.k*a.k,E=a.a,F=e,da=1/e,ea=1/f,fa=1/d,a=5/(1+20*a.u*a.u)*(0.01+n);0.8=S&&(V=0,this.reset());A&&++M>=A&&(A=0,g*=L);z+=K;g*=z;g>l&&(g=l,0<$&&(G=!0));h=g;0< -T&&(I+=ca,h*=1+Math.sin(I)*T);h|=0;8>h&&(h=8);E||(m+=N,0>m?m=0:0.5F)switch(v=0,++U){case 1:F=f;break;case 2:F=d}switch(U){case 0:w=v*da;break;case 1:w=1+2*(1-v*ea)*ba;break;case 2:w=1-v*fa;break;case 3:w=0,G=!0}R&&(D+=aa,s=D|0,0>s?s=-s:1023r?r=1E-5:0.1=h&&(p%=h,3==E))for(x=y.length;x--;)y[x]=2*Math.random()-1;switch(E){case 0:b=p/hb?1.27323954*b+0.405284735*b*b:1.27323954*b-0.405284735*b*b;b=0>b?0.225*(b*-b-b)+b:0.225*(b*b-b)+b;break;case 3:b=y[Math.abs(32*p/h|0)]}P&&(x=u,n*=X,0>n?n=0:0.1=q?-32768:32767*q|0}return O}}; -window.jsfxr=function(e){W.A.B(e);var f=W.D();e=new Uint8Array(4*((f+1)/2|0)+44);var f=2*W.C(new Uint16Array(e.buffer,44),f),d=new Uint32Array(e.buffer,0,44);d[0]=1179011410;d[1]=f+36;d[2]=1163280727;d[3]=544501094;d[4]=16;d[5]=65537;d[6]=44100;d[7]=88200;d[8]=1048578;d[9]=1635017060;d[10]=f;for(var f=f+44,d=0,g="data:audio/wav;base64,";d>18]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>> -12&63]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>6&63]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l&63]);d-=f;return g.slice(0,g.length-d)+"==".slice(0,d)}; \ No newline at end of file diff --git a/tools/radius-raid/js/levelpop.js b/tools/radius-raid/js/levelpop.js deleted file mode 100644 index 8b3097f..0000000 --- a/tools/radius-raid/js/levelpop.js +++ /dev/null @@ -1,58 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.LevelPop = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - this.x = $.cw - 20; - this.y = $.ch - 20; - this.tick = 0; - this.tickMax = 240; - this.baseAlpha = 0.2; - if( $.tick != 0 ) { - $.audio.play( 'levelup' ); - } -}; - -/*============================================================================== -Update -==============================================================================*/ -$.LevelPop.prototype.update = function( i ) { - if( this.tick >= this.tickMax ) { - $.levelPops.splice( i, 1 ); - } else { - this.tick += $.dt; - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.LevelPop.prototype.render = function( i ) { - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: this.x, - y: this.y, - text: $.util.pad( this.level, 2 ), - hspacing: 3, - vspacing: 0, - halign: 'right', - valign: 'bottom', - scale: 12, - snap: 1, - render: 1 - } ); - if( this.tick < this.tickMax * 0.25 ) { - var alpha = ( this.tick / ( this.tickMax * 0.25 ) ) * this.baseAlpha; - } else if( this.tick > this.tickMax - this.tickMax * 0.25 ) { - var alpha = ( ( this.tickMax - this.tick ) / ( this.tickMax * 0.25 ) ) * this.baseAlpha; - } else { - var alpha = this.baseAlpha; - } - alpha = Math.min( 1, Math.max( 0, alpha ) ); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, ' + alpha + ')'; - $.ctxmg.fill(); -} \ No newline at end of file diff --git a/tools/radius-raid/js/particle.js b/tools/radius-raid/js/particle.js deleted file mode 100644 index 1e1aa40..0000000 --- a/tools/radius-raid/js/particle.js +++ /dev/null @@ -1,52 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Particle = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Particle.prototype.update = function( i ) { - /*============================================================================== - Apply Forces - ==============================================================================*/ - this.x += Math.cos( this.direction ) * ( this.speed * $.dt ); - this.y += Math.sin( this.direction ) * ( this.speed * $.dt ); - this.ex = this.x - Math.cos( this.direction ) * this.speed; - this.ey = this.y - Math.sin( this.direction ) * this.speed; - this.speed *= this.friction; - - /*============================================================================== - Lock Bounds - ==============================================================================*/ - if( !$.util.pointInRect( this.ex, this.ey, 0, 0, $.ww, $.wh ) || this.speed <= 0.05 ) { - this.parent.splice( i, 1 ); - } - - /*============================================================================== - Update View - ==============================================================================*/ - if( $.util.pointInRect( this.ex, this.ey, -$.screen.x, -$.screen.y, $.cw, $.ch ) ) { - this.inView = 1; - } else { - this.inView = 0; - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Particle.prototype.render = function( i ) { - if( this.inView ) { - $.ctxmg.beginPath(); - $.ctxmg.moveTo( this.x, this.y ); - $.ctxmg.lineTo( this.ex, this.ey ); - $.ctxmg.lineWidth = this.lineWidth; - $.ctxmg.strokeStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + $.util.rand( 50, 100 ) + '%, 1)'; - $.ctxmg.stroke(); - } -} \ No newline at end of file diff --git a/tools/radius-raid/js/particleemitter.js b/tools/radius-raid/js/particleemitter.js deleted file mode 100644 index e3f9f15..0000000 --- a/tools/radius-raid/js/particleemitter.js +++ /dev/null @@ -1,43 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.ParticleEmitter = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - this.particles = []; - for( var i = 0; i < this.count; i++ ) { - var radius = Math.sqrt( Math.random() ) * this.spawnRange, - angle = Math.random() * $.twopi, - x = this.x + Math.cos( angle ) * radius, - y = this.y + Math.sin( angle ) * radius; - this.particles.push( new $.Particle( { - parent: this.particles, - x: x, - y: y, - speed: $.util.rand( this.minSpeed, this.maxSpeed ), - friction: this.friction, - direction: $.util.rand( this.minDirection, this.maxDirection ), - lineWidth: $.util.rand( 0.5, 1.5 ), - hue: this.hue, - saturation: this.saturation - } ) ); - } -}; - -/*============================================================================== -Update -==============================================================================*/ -$.ParticleEmitter.prototype.update = function( i ) { - var i2 = this.particles.length; while( i2-- ){ this.particles[ i2 ].update( i2 ) } - if( this.particles.length <= 0 ) { - $.particleEmitters.splice( i, 1 ); - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.ParticleEmitter.prototype.render = function( i ) { - var i2 = this.particles.length; while( i2-- ){ this.particles[ i2 ].render( i2 ) } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/powerup.js b/tools/radius-raid/js/powerup.js deleted file mode 100644 index 068a2d4..0000000 --- a/tools/radius-raid/js/powerup.js +++ /dev/null @@ -1,122 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.Powerup = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - var text = $.text( { - ctx: $.ctxmg, - x: 0, - y: 0, - text: this.title, - hspacing: 1, - vspacing: 0, - halign: 'top', - valign: 'left', - scale: 1, - snap: 0, - render: 0 - } ); - this.hpadding = 8; - this.vpadding = 8; - this.width = text.width + this.hpadding * 2; - this.height = text.height + this.vpadding * 2; - this.x = this.x - this.width / 2; - this.y = this.y - this.height / 2; - this.direction = $.util.rand( 0, $.twopi ); - this.speed = $.util.rand( 0.5, 2 ); -}; - -/*============================================================================== -Update -==============================================================================*/ -$.Powerup.prototype.update = function( i ) { - /*============================================================================== - Apply Forces - ==============================================================================*/ - this.x += Math.cos( this.direction ) * this.speed * $.dt; - this.y += Math.sin( this.direction ) * this.speed * $.dt; - - /*============================================================================== - Check Bounds - ==============================================================================*/ - if( !$.util.rectInRect( this.x, this.y, this.width, this.height, 0, 0, $.ww, $.wh ) ){ - $.powerups.splice( i, 1 ); - } - - /*============================================================================== - Check Collection Collision - ==============================================================================*/ - if( $.hero.life > 0 && $.util.arcIntersectingRect( $.hero.x, $.hero.y, $.hero.radius + 2, this.x, this.y, this.width, this.height ) ){ - $.audio.play( 'powerup' ); - $.powerupTimers[ this.type ] = 300; - $.particleEmitters.push( new $.ParticleEmitter( { - x: this.x + this.width / 2, - y: this.y + this.height / 2, - count: 15, - spawnRange: 0, - friction: 0.85, - minSpeed: 2, - maxSpeed: 15, - minDirection: 0, - maxDirection: $.twopi, - hue: 0, - saturation: 0 - } ) ); - $.powerups.splice( i, 1 ); - $.powerupsCollected++; - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.Powerup.prototype.render = function( i ) { - - $.ctxmg.fillStyle = '#000'; - $.ctxmg.fillRect( this.x - 2, this.y - 2, this.width + 4, this.height + 4 ); - $.ctxmg.fillStyle = '#555'; - $.ctxmg.fillRect( this.x - 1, this.y - 1, this.width + 2, this.height + 2 ); - - $.ctxmg.fillStyle = '#111'; - $.ctxmg.fillRect( this.x, this.y, this.width, this.height ); - - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: this.x + this.hpadding, - y: this.y + this.vpadding + 1, - text: this.title, - hspacing: 1, - vspacing: 0, - halign: 'top', - valign: 'left', - scale: 1, - snap: 0, - render: true - } ); - $.ctxmg.fillStyle = '#000'; - $.ctxmg.fill(); - - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: this.x + this.hpadding, - y: this.y + this.vpadding, - text: this.title, - hspacing: 1, - vspacing: 0, - halign: 'top', - valign: 'left', - scale: 1, - snap: 0, - render: true - } ); - $.ctxmg.fillStyle = 'hsl(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%)'; - $.ctxmg.fill(); - - $.ctxmg.fillStyle = 'hsla(0, 0%, 100%, 0.2)'; - $.ctxmg.fillRect( this.x, this.y, this.width, this.height / 2 ); - -} \ No newline at end of file diff --git a/tools/radius-raid/js/storage.js b/tools/radius-raid/js/storage.js deleted file mode 100644 index 246d64b..0000000 --- a/tools/radius-raid/js/storage.js +++ /dev/null @@ -1,36 +0,0 @@ -// local storage helpers - source: http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage/3146971#3146971 -Storage.prototype.setObject = function( key, value ) { - this.setItem( key, JSON.stringify( value ) ); -} - -Storage.prototype.getObject = function( key ) { - var value = this.getItem( key ); - return value && JSON.parse( value ); -} - -Storage.prototype.removeObject = function( key ) { - this.removeItem( key ); -} - -$.setupStorage = function() { - $.storage = localStorage.getObject( 'radiusraid' ) || { - 'mute': 0, - 'autofire': 0, - 'score': 0, - 'level': 0, - 'rounds': 0, - 'kills': 0, - 'bullets': 0, - 'powerups': 0, - 'time': 0 - }; -}; - -$.updateStorage = function() { - localStorage.setObject( 'radiusraid', $.storage ); -}; - -$.clearStorage = function() { - localStorage.removeObject( 'radiusraid' ); - $.setupStorage(); -}; \ No newline at end of file diff --git a/tools/radius-raid/js/text.js b/tools/radius-raid/js/text.js deleted file mode 100644 index 216f00f..0000000 --- a/tools/radius-raid/js/text.js +++ /dev/null @@ -1,95 +0,0 @@ -$.textLine = function( opt ) { - var textLength = opt.text.length, - size = 5; - for( var i = 0; i < textLength; i++ ) { - var letter = $.definitions.letters[ ( opt.text.charAt( i ) ) ] || $.definitions.letters[ 'unknown' ]; - for( var y = 0; y < size; y++ ) { - for( var x = 0; x < size; x++ ) { - if( letter[ y ][ x ] === 1 ) { - opt.ctx.rect( opt.x + ( x * opt.scale ) + ( ( size * opt.scale ) + opt.hspacing ) * i, opt.y + y * opt.scale, opt.scale, opt.scale ); - } - } - } - } -}; - -$.text = function( opt ) { - var size = 5, - letterSize = size * opt.scale, - lines = opt.text.split('\n'), - linesCopy = lines.slice( 0 ), - lineCount = lines.length, - longestLine = linesCopy.sort( function ( a, b ) { return b.length - a.length; } )[ 0 ], - textWidth = ( longestLine.length * letterSize ) + ( ( longestLine.length - 1 ) * opt.hspacing ), - textHeight = ( lineCount * letterSize ) + ( ( lineCount - 1 ) * opt.vspacing ); - - var sx = opt.x, - sy = opt.y, - ex = opt.x + textWidth, - ey = opt.y + textHeight; - - if( opt.halign == 'center' ) { - sx = opt.x - textWidth / 2; - ex = opt.x + textWidth / 2; - } else if( opt.halign == 'right' ) { - sx = opt.x - textWidth; - ex = opt.x; - } - - if( opt.valign == 'center' ) { - sy = opt.y - textHeight / 2; - ey = opt.y + textHeight / 2; - } else if( opt.valign == 'bottom' ) { - sy = opt.y - textHeight; - ey = opt.y; - } - - var cx = sx + textWidth / 2, - cy = sy + textHeight / 2; - - if( opt.render ) { - for( var i = 0; i < lineCount; i++ ) { - var line = lines[ i ], - lineWidth = ( line.length * letterSize ) + ( ( line.length - 1 ) * opt.hspacing ), - x = opt.x, - y = opt.y + ( letterSize + opt.vspacing ) * i; - - if( opt.halign == 'center' ) { - x = opt.x - lineWidth / 2; - } else if( opt.halign == 'right' ) { - x = opt.x - lineWidth; - } - - if( opt.valign == 'center' ) { - y = y - textHeight / 2; - } else if( opt.valign == 'bottom' ) { - y = y - textHeight; - } - - if( opt.snap ) { - x = Math.floor( x ); - y = Math.floor( y ); - } - - $.textLine( { - ctx: opt.ctx, - x: x, - y: y, - text: line, - hspacing: opt.hspacing, - scale: opt.scale - } ); - } - } - - return { - sx: sx, - sy: sy, - cx: cx, - cy: cy, - ex: ex, - ey: ey, - width: textWidth, - height: textHeight - } -}; \ No newline at end of file diff --git a/tools/radius-raid/js/textpop.js b/tools/radius-raid/js/textpop.js deleted file mode 100644 index 7097db7..0000000 --- a/tools/radius-raid/js/textpop.js +++ /dev/null @@ -1,45 +0,0 @@ -/*============================================================================== -Init -==============================================================================*/ -$.TextPop = function( opt ) { - for( var k in opt ) { - this[k] = opt[k]; - } - this.alpha = 2; - this.vy = 0; -}; - -/*============================================================================== -Update -==============================================================================*/ -$.TextPop.prototype.update = function( i ) { - this.vy -= 0.05; - this.y += this.vy * $.dt; - this.alpha -= 0.03 * $.dt; - - if( this.alpha <= 0 ){ - $.textPops.splice( i, 1 ); - } -}; - -/*============================================================================== -Render -==============================================================================*/ -$.TextPop.prototype.render = function( i ) { - $.ctxmg.beginPath(); - $.text( { - ctx: $.ctxmg, - x: this.x, - y: this.y, - text: '+' + this.value, - hspacing: 1, - vspacing: 0, - halign: 'center', - valign: 'center', - scale: 2, - snap: 0, - render: 1 - } ); - $.ctxmg.fillStyle = 'hsla(' + this.hue + ', ' + this.saturation + '%, ' + this.lightness + '%, ' + this.alpha + ')'; - $.ctxmg.fill(); -} \ No newline at end of file diff --git a/tools/radius-raid/js/util.js b/tools/radius-raid/js/util.js deleted file mode 100644 index 4753a88..0000000 --- a/tools/radius-raid/js/util.js +++ /dev/null @@ -1,101 +0,0 @@ -/*============================================================================== -Miscellaneous -==============================================================================*/ -window['requestAnimFrame']=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1E3/60)}}(); - -$.util = {}; -$.pi = Math.PI; -$.twopi = $.pi * 2; - -/*============================================================================== -Random Range -==============================================================================*/ -$.util.rand = function( min, max ) { - return Math.random() * ( max - min ) + min; -}; - -/*============================================================================== -Calculations -==============================================================================*/ -$.util.distance = function( p1x, p1y, p2x, p2y ) { - var xDistance = p1x - p2x, - yDistance = p1y - p2y; - return Math.sqrt( Math.pow( xDistance, 2 ) + Math.pow( yDistance, 2 ) ); -}; - -$.util.rectInRect = function( r1x, r1y, r1w, r1h, r2x, r2y, r2w, r2h ) { - return !( r2x > r1x + r1w || - r2x + r2w < r1x || - r2y > r1y + r1h || - r2y + r2h < r1y ); -}; - -$.util.arcInRect = function( ax, ay, ar, rx, ry, rw, rh ) { - return !( ax + ar <= rx || ax - ar >= rx + rw || ay + ar <= ry || ay - ar >= ry + rh ); -}; - -$.util.arcIntersectingRect = function( ax, ay, ar, rx, ry, rw, rh ) { - return !( ax <= rx - ar || ax >= rx + rw + ar || ay <= ry - ar || ay >= ry + rh + ar ); -}; - -$.util.pointInRect = function( px, py, rx, ry, rw, rh ) { - return ( px >= rx && px <= rx + rw && py >= ry && py <= ry + rh ); -}; - -/*============================================================================== -Shapes -==============================================================================*/ -$.util.circle = function( ctx, x, y, radius ) { - var radius = radius <= 0 ? 1 : radius; - ctx.beginPath(); - ctx.arc( x, y, radius, 0, $.twopi, false ); -}; - -$.util.fillCircle = function( ctx, x, y, radius, fillStyle ) { - $.util.circle( ctx, x, y, radius ); - ctx.fillStyle = fillStyle; - ctx.fill(); -}; - -$.util.strokeCircle = function( ctx, x, y, radius, strokeStyle, lineWidth ) { - $.util.circle( ctx, x, y, radius ); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = strokeStyle; - ctx.stroke(); -}; - -/*============================================================================== -Miscellaneous -==============================================================================*/ -$.util.pad = function( amount, digits ){ - amount += ''; - if( amount.length < digits ) { - amount = '0' + amount; - return $.util.pad( amount, digits ); - } else { - return amount; - } -}; - -$.util.convertTime = function( seconds ) { - var minutes = Math.floor( seconds / 60 ); - var seconds = Math.floor( seconds % 60 ); - return $.util.pad( minutes, 2 ) + ':' + $.util.pad( seconds, 2 ); -}; - -$.util.commas = function( nStr ) { - nStr += ''; - var x = nStr.split( '.' ), - x1 = x[ 0 ], - x2 = x.length > 1 ? '.' + x[ 1 ] : '', - rgx = /(\d+)(\d{3})/; - while( rgx.test( x1 ) ) { - x1 = x1.replace( rgx, '$1' + ',' + '$2' ); - } - return x1 + x2; -}; - - -$.util.isset = function( prop ) { - return typeof prop != 'undefined'; -}; \ No newline at end of file diff --git a/tools/radius-raid/min.html b/tools/radius-raid/min.html deleted file mode 100644 index 9053c55..0000000 --- a/tools/radius-raid/min.html +++ /dev/null @@ -1,107 +0,0 @@ -Radius Raid
\ No newline at end of file diff --git a/tools/radius-raid/min.zip b/tools/radius-raid/min.zip deleted file mode 100644 index f777002efe7dc5fff1bdbcf29fa69473a00cfa44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13278 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 IU<~2`04iK_h5!Hn diff --git a/tools/test/auto-text-effect/index.html b/tools/test/auto-text-effect/index.html deleted file mode 100644 index a746f1a..0000000 --- a/tools/test/auto-text-effect/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - Auto Text Effect - - -

Starting...

- -
- - -
- - - - diff --git a/tools/test/auto-text-effect/script.js b/tools/test/auto-text-effect/script.js deleted file mode 100644 index c302628..0000000 --- a/tools/test/auto-text-effect/script.js +++ /dev/null @@ -1,22 +0,0 @@ -const textEl = document.getElementById('text') -const speedEl = document.getElementById('speed') -const text = 'We Love Programming!' -let idx = 1 -let speed = 300 / speedEl.value - -writeText() - -function writeText() { - textEl.innerText = text.slice(0, idx) - - idx++ - - if(idx > text.length) { - idx = 1 - } - - setTimeout(writeText, speed) -} - - -speedEl.addEventListener('input', (e) => speed = 300 / e.target.value) \ No newline at end of file diff --git a/tools/test/auto-text-effect/style.css b/tools/test/auto-text-effect/style.css deleted file mode 100644 index 71fae02..0000000 --- a/tools/test/auto-text-effect/style.css +++ /dev/null @@ -1,38 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap'); - -* { - box-sizing: border-box; -} - -body { - background-color: darksalmon; - font-family: 'Roboto', sans-serif; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100vh; - overflow: hidden; - margin: 0; -} - -div { - position: absolute; - bottom: 20px; - background: rgba(0, 0, 0, 0.1); - padding: 10px 20px; - font-size: 18px; -} - -input { - width: 50px; - padding: 5px; - font-size: 18px; - background-color: darksalmon; - border: none; - text-align: center; -} - -input:focus { - outline: none; -} diff --git a/tools/test/hoverboard/index.html b/tools/test/hoverboard/index.html deleted file mode 100644 index 5020fe3..0000000 --- a/tools/test/hoverboard/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Test - - -
- - - diff --git a/tools/test/hoverboard/script.js b/tools/test/hoverboard/script.js deleted file mode 100644 index e9984c5..0000000 --- a/tools/test/hoverboard/script.js +++ /dev/null @@ -1,29 +0,0 @@ -const container = document.getElementById('container') -const colors = ["c", "#373638", "#373638", "#373638", "#373638"]; -const SQUARES = 1 - -for(let i = 0; i < SQUARES; i++) { - const square = document.createElement('div') - square.classList.add('square') - - square.addEventListener('mouseover', () => setColor(square)) - - square.addEventListener('mouseout', () => removeColor(square)) - - container.appendChild(square) -} - -function setColor(element) { - const color = getRandomColor() - element.style.background = color - element.style.boxShadow = `0 0 2px ${color}, 0 0 10px ${color}` -} - -function removeColor(element) { - element.style.background = '#1d1d1d' - element.style.boxShadow = '0 0 2px #000' -} - -function getRandomColor() { - return colors[Math.floor(Math.random() * colors.length)] -} \ No newline at end of file diff --git a/tools/test/hoverboard/style.css b/tools/test/hoverboard/style.css deleted file mode 100644 index a00382e..0000000 --- a/tools/test/hoverboard/style.css +++ /dev/null @@ -1,34 +0,0 @@ -* { - box-sizing: border-box; -} - -body { - background-color: #111; - display: flex; - align-items: center; - justify-content: center; - height: 100vh; - overflow: hidden; - margin: 0; -} - -.container { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - max-width: 400px; -} - -.square { - background-color: #1d1d1d; - box-shadow: 0 0 2px #000; - height: 32px; - width: 32px; - margin: 2px; - transition: 2s ease; -} - -.square:hover { - transition-duration: 0s; -}