From 82cba6552792652fe70f0f8d7e38ecd8011b869e Mon Sep 17 00:00:00 2001 From: zenoamaro Date: Thu, 27 Jun 2019 00:51:27 +0200 Subject: [PATCH] Death explosions --- main.js | 36 ++++++++++++++++++++++-------------- math.js | 4 ---- terrain.js | 2 +- utils.js | 6 ++++++ weapons.js | 13 +++++++------ 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/main.js b/main.js index e6a74d3..192a458 100644 --- a/main.js +++ b/main.js @@ -6,6 +6,7 @@ import {createSky} from './sky.js'; import {audio, createOsc} from './sound.js'; import {collapseTerrain, createTerrain, isTerrain, landHeight, closestLand} from './terrain.js'; import {WEAPON_TYPES, EXPLOSION_TYPES} from './weapons.js'; +import {sample} from './utils.js'; let state = 'start-turn'; @@ -100,16 +101,13 @@ function update() { } else if (state === 'explosion') { - const {weapon} = projectile; - const explosionType = EXPLOSION_TYPES[weapon.explosion.type]; + const explosionType = EXPLOSION_TYPES[explosion.type]; if (!explosionType.update(explosion)) { explosionType.clip(explosion, terrain); explosionType.stop(explosion); - for (let player of players) { - if (player.energy > 0) { - player.energy -= explosionType.damage(explosion, player) || 0; - } + for (let player of players) if (!player.dead) { + player.energy -= explosionType.damage(explosion, player) || 0; } explosion = null; state = 'land-collapse'; @@ -117,14 +115,17 @@ function update() { } else if (state === 'land-collapse') { - collapseTerrain(terrain, projectile.x, 100); // FIXME: Hardcoded radius - projectile = null; + const target = explosion ||projectile; + if (target) { + collapseTerrain(terrain, target.x, 100); // FIXME: Hardcoded radius + } state = 'land-players'; } else if (state === 'land-players') { let stable = true; for (let player of players) { + if (player.dead) continue; const y = closestLand(terrain, player.x, player.y); if (player.y !== y) { player.y++; @@ -135,7 +136,14 @@ function update() { } else if (state === 'destroy-players') { - state = 'end-turn'; + const dyingPlayer = players.find(x => x.energy<=0 && !x.dead); + if (!dyingPlayer) {state = 'end-turn'; return} + + const {x, y} = dyingPlayer; + const explosionType = sample(Object.values(EXPLOSION_TYPES)); + explosion = explosionType.create({r:25}, x, y); + dyingPlayer.dead = true; + state = 'explosion'; } else if (state === 'end-turn') { @@ -146,8 +154,9 @@ function update() { currentPlayer = wrap(0, currentPlayer+1, players.length); player = players[currentPlayer]; if (i++ === players.length) state = 'game-over'; - } while (player.energy <= 0) + } while (player.dead) + projectile = null; state = 'start-turn'; } @@ -165,8 +174,8 @@ function draw() { } function drawPlayer(player) { - const {x, y, a, c, energy} = player; - if (energy <= 0) return; + const {x, y, a, c, dead} = player; + if (dead) return; const [px, py] = vec(x, y-3, a+180, 3); drawLine(foreground, x, y-3, Math.round(px), Math.round(py), c); drawRect(foreground, x-3, y-2, 6, 3, c); @@ -187,8 +196,7 @@ function fadeProjectiles(amount) { } function drawExplosions() { - const {weapon} = projectile; - const explosionType = EXPLOSION_TYPES[weapon.explosion.type]; + const explosionType = EXPLOSION_TYPES[explosion.type]; explosionType.draw(explosion, foreground); } diff --git a/math.js b/math.js index 3eacde0..a719799 100644 --- a/math.js +++ b/math.js @@ -14,10 +14,6 @@ export function randomInt(min, max) { return Math.round(random(min, max)); } -export function sample(arr) { - return arr[randomInt(0, arr.length-1)]; -} - export function clamp(min, x, max) { return Math.max(min, Math.min(x, max)); } diff --git a/terrain.js b/terrain.js index 52d2454..71973a0 100644 --- a/terrain.js +++ b/terrain.js @@ -1,4 +1,4 @@ -import {createCanvas, drawRect, clipCanvas, plot} from './gfx.js'; +import {createCanvas, drawRect, clipCanvas} from './gfx.js'; import {coords2index} from './math.js'; let cachedImageData; diff --git a/utils.js b/utils.js index 3a55566..b6055e8 100644 --- a/utils.js +++ b/utils.js @@ -1,3 +1,9 @@ +import {randomInt} from './math.js'; + +export function sample(arr) { + return arr[randomInt(0, arr.length-1)]; +} + export function nextId() { // @ts-ignore const id = nextId.id || 0; diff --git a/weapons.js b/weapons.js index 3e4a893..4c1f330 100644 --- a/weapons.js +++ b/weapons.js @@ -9,10 +9,10 @@ export function drawExplosion(ctx, x, y, r) { } export const WEAPON_TYPES = [ - // {id:'baby-missile', name:'Baby Missile', explosion:{type:'blast', r:5}}, - // {id:'missile', name:'Missile', explosion:{type:'blast', r:10}}, - // {id:'baby-nuke', name:'Baby Nuke', explosion:{type:'blast', r:50}}, - // {id:'nuke', name:'Nuke', explosion:{type:'blast', r:100}}, + {id:'baby-missile', name:'Baby Missile', explosion:{type:'blast', r:5}}, + {id:'missile', name:'Missile', explosion:{type:'blast', r:10}}, + {id:'baby-nuke', name:'Baby Nuke', explosion:{type:'blast', r:50}}, + {id:'nuke', name:'Nuke', explosion:{type:'blast', r:100}}, {id:'dirt', name:'Dirt', explosion:{type:'dirt', r:25}}, {id:'large-dirt', name:'Ton of Dirt', explosion:{type:'dirt', r:75}}, ]; @@ -23,7 +23,7 @@ export const EXPLOSION_TYPES = { const {r} = spec; const osc = createOsc(); osc.start(); - return {x, y, r, cr:0, osc}; + return {type:'blast', x, y, r, cr:0, osc}; }, update(explosion) { return ++explosion.cr < explosion.r; @@ -53,7 +53,7 @@ export const EXPLOSION_TYPES = { const {r} = spec; const osc = createOsc(); osc.start(); - return {x, y, r, cr:0, osc}; + return {type:'dirt', x, y, r, cr:0, osc}; }, stop(explosion) { const {osc} = explosion; @@ -66,6 +66,7 @@ export const EXPLOSION_TYPES = { const {x, y, cr, osc} = explosion; const f = explosion.cr % 2 === 0 ? 220 + explosion.cr : 0; osc.frequency.setValueAtTime(f, audio.currentTime); + osc.frequency.setValueAtTime(0, audio.currentTime+1); drawExplosion(foreground, x, y, cr); }, clip(explosion, terrain) {