Even better fireballs

This commit is contained in:
timokoesters 2020-03-23 22:52:35 +01:00
parent 9d47fd8c3e
commit fbb24e7c8a
3 changed files with 18 additions and 12 deletions

View File

@ -123,15 +123,15 @@ impl ToolData {
CastFireball {
projectile: Projectile {
hit_ground: vec![
projectile::Effect::Explode { power: 1.5 },
projectile::Effect::Explode { power: 1.4 },
projectile::Effect::Vanish,
],
hit_wall: vec![
projectile::Effect::Explode { power: 1.5 },
projectile::Effect::Explode { power: 1.4 },
projectile::Effect::Vanish,
],
hit_entity: vec![
projectile::Effect::Explode { power: 1.5 },
projectile::Effect::Explode { power: 1.4 },
projectile::Effect::Vanish,
],
time_left: Duration::from_secs(20),

View File

@ -47,7 +47,7 @@ impl CharacterBehavior for Data {
dir: data.inputs.look_dir,
body: self.projectile_body,
light: Some(LightEmitter {
col: (0.0, 1.0, 0.3).into(),
col: (0.72, 0.11, 0.11).into(),
..Default::default()
}),
projectile,

View File

@ -236,6 +236,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Opti
// Color terrain
let mut touched_blocks = Vec::new();
let color_range = power * 2.7;
for _ in 0..RAYS {
let dir = Vec3::new(
rand::random::<f32>() - 0.5,
@ -246,7 +247,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Opti
let _ = ecs
.read_resource::<TerrainGrid>()
.ray(pos, pos + dir * power * 2.5)
.ray(pos, pos + dir * color_range)
.until(|_| rand::random::<f32>() < 0.05)
.for_each(|pos| touched_blocks.push(pos))
.cast();
@ -254,13 +255,18 @@ pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Opti
let terrain = ecs.read_resource::<TerrainGrid>();
let mut block_change = ecs.write_resource::<BlockChange>();
for pos in touched_blocks {
if let Ok(block) = terrain.get(pos) {
for block_pos in touched_blocks {
if let Ok(block) = terrain.get(block_pos) {
let diff2 = block_pos.map(|b| b as f32).distance_squared(pos);
let fade = (1.0 - diff2 / color_range.powi(2)).max(0.0);
if let Some(mut color) = block.get_color() {
color[0] /= 2;
color[1] /= 3;
color[2] /= 3;
block_change.set(pos, Block::new(block.kind(), color));
let r = color[0] as f32 + (fade * (color[0] as f32 * 0.5 - color[0] as f32));
let g = color[1] as f32 + (fade * (color[1] as f32 * 0.3 - color[1] as f32));
let b = color[2] as f32 + (fade * (color[2] as f32 * 0.3 - color[2] as f32));
color[0] = r as u8;
color[1] = g as u8;
color[2] = b as u8;
block_change.set(block_pos, Block::new(block.kind(), color));
}
}
}
@ -270,7 +276,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Opti
let dir = Vec3::new(
rand::random::<f32>() - 0.5,
rand::random::<f32>() - 0.5,
rand::random::<f32>() - 0.5,
rand::random::<f32>() - 0.15,
)
.normalized();