Death cone death type

This commit is contained in:
zenoamaro committed 2019-06-27 01:47:43 +02:00
1 parent 6dab8504fe
commit 2928336abf
2 files changed
+59 -5

No files matched your search

+4 -3
View File
@@ -5,7 +5,7 @@ import {clamp, deg2rad, parable, randomInt, vec, wrap} from './math.js';
import {createSky} from './sky.js'; import {createSky} from './sky.js';
import {audio, createOsc, playTickSound} from './sound.js'; import {audio, createOsc, playTickSound} from './sound.js';
import {collapseTerrain, createTerrain, isTerrain, landHeight, closestLand} from './terrain.js'; import {collapseTerrain, createTerrain, isTerrain, landHeight, closestLand} from './terrain.js';
import {WEAPON_TYPES, EXPLOSION_TYPES} from './weapons.js'; import {WEAPON_TYPES, EXPLOSION_TYPES, DEATH_SPECS} from './weapons.js';
import {sample} from './utils.js'; import {sample} from './utils.js';
@@ -145,8 +145,9 @@ function update() {
if (!dyingPlayer) {state = 'end-turn'; return} if (!dyingPlayer) {state = 'end-turn'; return}
const {x, y} = dyingPlayer; const {x, y} = dyingPlayer;
const explosionType = sample(Object.values(EXPLOSION_TYPES)); const explosionSpec = sample(DEATH_SPECS);
explosion = explosionType.create({r:25}, x, y); const explosionType = EXPLOSION_TYPES[explosionSpec.type];
explosion = explosionType.create(explosionSpec, x, y);
dyingPlayer.dead = true; dyingPlayer.dead = true;
state = 'explosion'; state = 'explosion';
} }
+55 -2
View File
@@ -1,6 +1,6 @@
import {drawCircle} from './gfx.js'; import {drawCircle, plot} from './gfx.js';
import {clipTerrain} from './terrain.js'; import {clipTerrain} from './terrain.js';
import {within, cycle} from './math.js'; import {within, cycle, random, randomInt} from './math.js';
import {createOsc, audio} from './sound.js'; import {createOsc, audio} from './sound.js';
export function drawExplosion(ctx, x, y, r) { export function drawExplosion(ctx, x, y, r) {
@@ -17,6 +17,12 @@ export const WEAPON_TYPES = [
{id:'large-dirt', name:'Ton of Dirt', explosion:{type:'dirt', r:75}}, {id:'large-dirt', name:'Ton of Dirt', explosion:{type:'dirt', r:75}},
]; ];
export const DEATH_SPECS = [
{type: 'blast', r: 35},
{type: 'dirt', r: 50},
{type: 'dirtCone', r: 100},
];
export const EXPLOSION_TYPES = { export const EXPLOSION_TYPES = {
blast: { blast: {
create(spec, x, y) { create(spec, x, y) {
@@ -75,4 +81,51 @@ export const EXPLOSION_TYPES = {
}, },
damage(explosion, player) {} damage(explosion, player) {}
}, },
dirtCone: {
create(spec, x, y) {
const {r} = spec;
const pattern = [];
const osc = createOsc();
osc.start();
return {type:'dirtCone', x, y, r, cr:0, osc, pattern};
},
stop(explosion) {
const {osc} = explosion;
osc.stop();
},
update(explosion) {
return ++explosion.cr < explosion.r;
},
draw(explosion, foreground) {
const {x, y, cr, osc, pattern} = explosion;
let row = [];
for (let cx=0; cx<=1+cr*2; cx++) {
row.push(randomInt(0, 3) === 0);
}
pattern.push(row);
for (let cy=0; cy<pattern.length; cy++) {
const row = pattern[cy];
for (let cx=0; cx<row.length; cx++) {
if (row[cx]) plot(foreground, x-cy+cx, y-cy, 'burlywood');
}
}
const f = explosion.cr % 2 === 0 ? 220 + explosion.cr : 0;
osc.frequency.setValueAtTime(f, audio.currentTime);
osc.frequency.setValueAtTime(0, audio.currentTime+0.1);
},
clip(explosion, terrain) {
const {x, y, pattern} = explosion;
for (let cy=0; cy<pattern.length; cy++) {
const row = pattern[cy];
for (let cx=0; cx<row.length; cx++) {
if (row[cx]) plot(terrain, x-cy+cx, y-cy, 'burlywood');
}
}
},
damage(explosion, player) {}
},
} }