Projectile speed is no longer hard-coded.

This commit is contained in:
Sam 2020-08-06 13:17:38 -05:00
parent 66b0fee3c7
commit 68ecfba291
7 changed files with 49 additions and 8 deletions

View File

@ -63,6 +63,7 @@ pub enum CharacterAbility {
projectile_body: Body,
projectile_light: Option<LightEmitter>,
projectile_gravity: Option<Gravity>,
projectile_speed: f32,
},
Boost {
duration: Duration,
@ -105,6 +106,9 @@ pub enum CharacterAbility {
recover_duration: Duration,
projectile_body: Body,
projectile_light: Option<LightEmitter>,
projectile_gravity: Option<Gravity>,
initial_projectile_speed: f32,
max_projectile_speed: f32,
},
}
@ -272,6 +276,7 @@ impl From<&CharacterAbility> for CharacterState {
projectile_body,
projectile_light,
projectile_gravity,
projectile_speed,
energy_cost: _,
} => CharacterState::BasicRanged(basic_ranged::Data {
exhausted: false,
@ -283,6 +288,7 @@ impl From<&CharacterAbility> for CharacterState {
projectile_body: *projectile_body,
projectile_light: *projectile_light,
projectile_gravity: *projectile_gravity,
projectile_speed: *projectile_speed,
}),
CharacterAbility::Boost { duration, only_up } => CharacterState::Boost(boost::Data {
duration: *duration,
@ -366,6 +372,9 @@ impl From<&CharacterAbility> for CharacterState {
recover_duration,
projectile_body,
projectile_light,
projectile_gravity,
initial_projectile_speed,
max_projectile_speed,
} => CharacterState::ChargedRanged(charged_ranged::Data {
exhausted: false,
energy_drain: *energy_drain,
@ -379,6 +388,9 @@ impl From<&CharacterAbility> for CharacterState {
recover_duration: *recover_duration,
projectile_body: *projectile_body,
projectile_light: *projectile_light,
projectile_gravity: *projectile_gravity,
initial_projectile_speed: *initial_projectile_speed,
max_projectile_speed: *max_projectile_speed,
}),
}
}

View File

@ -187,6 +187,7 @@ impl Tool {
projectile_body: Body::Object(object::Body::Arrow),
projectile_light: None,
projectile_gravity: Some(Gravity(0.2)),
projectile_speed: 100.0,
},
ChargedRanged {
energy_cost: 0,
@ -200,6 +201,9 @@ impl Tool {
recover_duration: Duration::from_millis(500),
projectile_body: Body::Object(object::Body::MultiArrow),
projectile_light: None,
projectile_gravity: Some(Gravity(0.2)),
initial_projectile_speed: 100.0,
max_projectile_speed: 500.0,
},
],
Dagger(_) => vec![
@ -296,6 +300,7 @@ impl Tool {
}),
projectile_gravity: None,
projectile_speed: 100.0,
},
BasicRanged {
energy_cost: 400,
@ -326,6 +331,7 @@ impl Tool {
}),
projectile_gravity: None,
projectile_speed: 100.0,
},
]
}
@ -397,6 +403,7 @@ impl Tool {
..Default::default()
}),
projectile_gravity: None,
projectile_speed: 100.0,
},
]
} else {

View File

@ -46,6 +46,7 @@ pub enum ServerEvent {
light: Option<comp::LightEmitter>,
projectile: comp::Projectile,
gravity: Option<comp::Gravity>,
speed: f32,
},
LandOnGround {
entity: EcsEntity,

View File

@ -21,6 +21,7 @@ pub struct Data {
pub projectile_body: Body,
pub projectile_light: Option<LightEmitter>,
pub projectile_gravity: Option<Gravity>,
pub projectile_speed: f32,
/// Whether the attack fired already
pub exhausted: bool,
}
@ -49,6 +50,7 @@ impl CharacterBehavior for Data {
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
projectile_speed: self.projectile_speed,
exhausted: false,
});
} else if !self.exhausted {
@ -62,6 +64,7 @@ impl CharacterBehavior for Data {
projectile,
light: self.projectile_light,
gravity: self.projectile_gravity,
speed: self.projectile_speed,
});
update.character = CharacterState::BasicRanged(Data {
@ -73,6 +76,7 @@ impl CharacterBehavior for Data {
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
projectile_speed: self.projectile_speed,
exhausted: true,
});
} else if self.recover_duration != Duration::default() {
@ -89,6 +93,7 @@ impl CharacterBehavior for Data {
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
projectile_speed: self.projectile_speed,
exhausted: true,
});
return update;

View File

@ -10,9 +10,6 @@ use crate::{
use serde::{Deserialize, Serialize};
use std::time::Duration;
const MAX_GRAVITY: f32 = 0.2;
const MIN_GRAVITY: f32 = 0.05;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Data {
/// Whether the attack fired already
@ -38,6 +35,9 @@ pub struct Data {
/// Projectile information
pub projectile_body: Body,
pub projectile_light: Option<LightEmitter>,
pub projectile_gravity: Option<Gravity>,
pub initial_projectile_speed: f32,
pub max_projectile_speed: f32,
}
impl CharacterBehavior for Data {
@ -65,6 +65,9 @@ impl CharacterBehavior for Data {
recover_duration: self.recover_duration,
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
initial_projectile_speed: self.initial_projectile_speed,
max_projectile_speed: self.max_projectile_speed,
});
} else if data.inputs.secondary.is_pressed()
&& self.charge_timer < self.charge_duration
@ -87,6 +90,9 @@ impl CharacterBehavior for Data {
recover_duration: self.recover_duration,
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
initial_projectile_speed: self.initial_projectile_speed,
max_projectile_speed: self.max_projectile_speed,
});
// Consumes energy if there's enough left and RMB is held down
@ -109,6 +115,9 @@ impl CharacterBehavior for Data {
recover_duration: self.recover_duration,
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
initial_projectile_speed: self.initial_projectile_speed,
max_projectile_speed: self.max_projectile_speed,
});
// Consumes energy if there's enough left and RMB is held down
@ -145,9 +154,8 @@ impl CharacterBehavior for Data {
body: self.projectile_body,
projectile,
light: self.projectile_light,
gravity: Some(Gravity(
MAX_GRAVITY - charge_amount * (MAX_GRAVITY - MIN_GRAVITY),
)),
gravity: self.projectile_gravity,
speed: self.initial_projectile_speed + charge_amount * (self.max_projectile_speed - self.initial_projectile_speed),
});
update.character = CharacterState::ChargedRanged(Data {
@ -163,6 +171,9 @@ impl CharacterBehavior for Data {
recover_duration: self.recover_duration,
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
initial_projectile_speed: self.initial_projectile_speed,
max_projectile_speed: self.max_projectile_speed,
});
} else if self.recover_duration != Duration::default() {
// Recovery
@ -182,6 +193,9 @@ impl CharacterBehavior for Data {
.unwrap_or_default(),
projectile_body: self.projectile_body,
projectile_light: self.projectile_light,
projectile_gravity: self.projectile_gravity,
initial_projectile_speed: self.initial_projectile_speed,
max_projectile_speed: self.max_projectile_speed,
});
} else {
// Done

View File

@ -87,6 +87,7 @@ pub fn handle_shoot(
light: Option<LightEmitter>,
projectile: Projectile,
gravity: Option<Gravity>,
speed: f32,
) {
let state = server.state_mut();
@ -97,7 +98,7 @@ pub fn handle_shoot(
.expect("Failed to fetch entity")
.0;
let vel = *dir * 100.0;
let vel = *dir * speed;
// Add an outcome
state

View File

@ -68,7 +68,8 @@ impl Server {
light,
projectile,
gravity,
} => handle_shoot(self, entity, dir, body, light, projectile, gravity),
speed,
} => handle_shoot(self, entity, dir, body, light, projectile, gravity, speed),
ServerEvent::Damage { uid, change } => handle_damage(&self, uid, change),
ServerEvent::Destroy { entity, cause } => handle_destroy(self, entity, cause),
ServerEvent::InventoryManip(entity, manip) => handle_inventory(self, entity, manip),