Spread a virus in voxel.js.
Might make a good base for a fire or water module as well ;)
// create a virus
var virus = require('voxel-virus')({
// pass a copy of the game
game: game,
// which material index of virus
// can use a material name instead, ie 'obsidian'
// or false to not change the material
material: 0,
// how fast in milliseconds to spread
rate: 3000,
// how many iterations before dying
// set to 0 to never decay (and eventually crash your game)
decay: 10,
// how virulent; between 0 and 1
// 0 wont spread
// 1 spreads to all surrounding blocks
virulence: 0.5,
// how it spreads
// by default it will remove the block
// and spread to surrounding blocks
how: function(block) {
var self = this;
if (self.decay > 0) level++;
self.game.setBlock(block, 0);
self.around(block).forEach(function(b) {
self.infect(b, level);
});
}
});
// on fire, infect block
game.on('fire', function() {
var vec = game.cameraVector();
var pos = game.cameraPosition();
virus.infect(game.raycast(pos, vec, 100).voxel);
});
// on tick, spread the virus
game.on('tick', virus.tick.bind(virus));
Set block
to position of block [0, 0, 0]
to infect. level
is the
current number of iteration the infection is on.
To infect the block you're looking at:
game.on('fire', function() {
var vec = game.cameraVector();
var pos = game.cameraPosition();
virus.infect(game.raycast(pos, vec, 100).voxel);
});
Push the iterations forward. Needs to be added to the game tick to keep in time with the game simulation.
game.on('tick', virus.tick.bind(virus));
Returns block positions around the given block
. Uses virus.virulence
to
randomly not select blocks.
var around = virus.around([0, 0, 0]);
// around equals an array of blocks up, down, left, right, front and back
An array of blocks that are currently infected with time or iteration prepended.
virus.infected = [
[time, block],
[time, block],
// ...
];
With npm do:
npm install voxel-virus
Use browserify to require('voxel-virus')
.
- 0.2.1 - update for [email protected]
- 0.2.0 - infect doesnt default to the block you're looking at
- 0.1.1 - update for [email protected]. infect doesnt ignore air voxels.
- 0.1.0 - initial release
Copyright (c) 2013 Kyle Robinson Young
Licensed under the MIT license.