Skip to content

Commit

Permalink
Move entity_def_key into ActionState
Browse files Browse the repository at this point in the history
  • Loading branch information
rukai committed Sep 5, 2020
1 parent fbc1fe8 commit 1709907
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 67 deletions.
4 changes: 2 additions & 2 deletions canon_collision/src/collision/collision_box.rs
Expand Up @@ -17,13 +17,13 @@ pub fn collision_check(entities: &Entities, entity_definitions: &KeyedContextVec

'entity_atk: for (entity_atk_i, entity_atk) in entities.iter() {
let entity_atk_xy = entity_atk.public_bps_xy(entities, entity_definitions, surfaces);
let entity_atk_def = &entity_definitions[entity_atk.entity_def_key()];
let entity_atk_def = &entity_definitions[entity_atk.state.entity_def_key.as_ref()];
let frame_atk = entity_atk.relative_frame(entity_atk_def, surfaces);
let colboxes_atk = frame_atk.get_hitboxes();
for (entity_defend_i, entity_defend) in entities.iter() {
let entity_defend_xy = entity_defend.public_bps_xy(entities, entity_definitions, surfaces);
if entity_atk_i != entity_defend_i && entity_atk.can_hit(entity_defend) && entity_atk.hitlist().iter().all(|x| *x != entity_defend_i) {
let entity_defend_def = &entity_definitions[entity_defend.entity_def_key()];
let entity_defend_def = &entity_definitions[entity_defend.state.entity_def_key.as_ref()];
let frame_defend = entity_defend.relative_frame(entity_defend_def, surfaces);

'hitbox_atk: for colbox_atk in &colboxes_atk {
Expand Down
4 changes: 3 additions & 1 deletion canon_collision/src/entity/components/action_state.rs
Expand Up @@ -8,6 +8,7 @@ use rand::Rng;

#[derive(Clone, Serialize, Deserialize)]
pub struct ActionState {
pub entity_def_key: String,
pub action: u64,
pub frame: i64, // TODO: u64
pub frame_no_restart: i64,
Expand All @@ -16,8 +17,9 @@ pub struct ActionState {
}

impl ActionState {
pub fn new<T: ToPrimitive>(action: T) -> ActionState {
pub fn new<T: ToPrimitive>(entity_def_key: String, action: T) -> ActionState {
ActionState {
entity_def_key,
action: action.to_u64().unwrap(),
frame: 0,
frame_no_restart: 0,
Expand Down
4 changes: 2 additions & 2 deletions canon_collision/src/entity/components/body.rs
Expand Up @@ -160,7 +160,7 @@ impl Body {
}
Location::ItemHeldByPlayer (entity_i) => {
if let Some(player) = entities.get(entity_i) {
if let Some(action_frame) = player.get_entity_frame(&entity_defs[player.entity_def_key()]) {
if let Some(action_frame) = player.get_entity_frame(&entity_defs[player.state.entity_def_key.as_ref()]) {
let (x, y) = player.public_bps_xy(entities, entity_defs, surfaces);
if let Some(item_hold) = action_frame.item_hold.as_ref() {
(
Expand Down Expand Up @@ -197,7 +197,7 @@ impl Body {
let z = match self.location {
Location::ItemHeldByPlayer (entity_i) => {
if let Some(player) = entities.get(entity_i) {
player.get_entity_frame(&entity_defs[player.entity_def_key()])
player.get_entity_frame(&entity_defs[player.state.entity_def_key.as_ref()])
.and_then(|action_frame| action_frame.item_hold.as_ref())
.map(|item_hold| player.relative_f(item_hold.translation_z))
.unwrap_or(0.0)
Expand Down
7 changes: 3 additions & 4 deletions canon_collision/src/entity/item.rs
Expand Up @@ -28,7 +28,6 @@ pub enum MessageItem {
#[derive(Clone, Serialize, Deserialize)]
pub struct Item {
pub owner_id: Option<usize>,
pub entity_def_key: String,
pub body: Body,
}

Expand Down Expand Up @@ -98,7 +97,7 @@ impl Item {
}

pub fn bps_xy(&self, context: &StepContext, state: &ActionState) -> (f32, f32) {
let action_frame = state.get_entity_frame(&context.entity_defs[self.entity_def_key.as_ref()]);
let action_frame = state.get_entity_frame(&context.entity_defs[state.entity_def_key.as_ref()]);
self.body.public_bps_xy(&context.entities, &context.entity_defs, action_frame, &context.surfaces, state)
}

Expand Down Expand Up @@ -145,7 +144,7 @@ impl Item {

pub fn debug_print(&self, entities: &KeyedContextVec<EntityDef>, state: &ActionState, debug: &DebugEntity, i: EntityKey) -> Vec<String> {
let mut lines = vec!();
let entity = &entities[self.entity_def_key.as_ref()];
let entity = &entities[state.entity_def_key.as_ref()];
if debug.physics {
lines.push(self.body.debug_string(i));
}
Expand All @@ -165,7 +164,7 @@ impl Item {
match self.body.location {
Location::ItemHeldByPlayer (player_i) => {
entities.get(player_i)
.and_then(|player| player.get_entity_frame(&entity_defs[player.entity_def_key()]))
.and_then(|player| player.get_entity_frame(&entity_defs[player.state.entity_def_key.as_ref()]))
.and_then(|action_frame| action_frame.item_hold.as_ref())
.and_then(|item_hold| Some(Quaternion::new(
item_hold.quaternion_x,
Expand Down
23 changes: 7 additions & 16 deletions canon_collision/src/entity/mod.rs
Expand Up @@ -83,7 +83,7 @@ impl Entity {
}

pub fn public_bps_xy(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> (f32, f32) {
let action_frame = self.get_entity_frame(&entity_defs[self.entity_def_key()]);
let action_frame = self.get_entity_frame(&entity_defs[self.state.entity_def_key.as_ref()]);
match &self.ty {
EntityType::Player (player) => player.body.public_bps_xy(entities, entity_defs, action_frame, surfaces, &self.state),
EntityType::Item (item) => item.body.public_bps_xy(entities, entity_defs, action_frame, surfaces, &self.state),
Expand All @@ -93,7 +93,7 @@ impl Entity {

/// only used for rendering
pub fn public_bps_xyz(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> (f32, f32, f32) {
let action_frame = self.get_entity_frame(&entity_defs[self.entity_def_key()]);
let action_frame = self.get_entity_frame(&entity_defs[self.state.entity_def_key.as_ref()]);
match &self.ty {
EntityType::Player (player) => player.body.public_bps_xyz(entities, entity_defs, action_frame, surfaces, &self.state),
EntityType::Item (item) => item.body.public_bps_xyz(entities, entity_defs, action_frame, surfaces, &self.state),
Expand Down Expand Up @@ -211,15 +211,6 @@ impl Entity {
self.process_action_result(action_result);
}

// TODO: move into ActionState
pub fn entity_def_key(&self) -> &str {
match &self.ty {
EntityType::Player (player) => player.entity_def_key.as_ref(),
EntityType::Item (item) => item.entity_def_key.as_ref(),
EntityType::Projectile (projectile) => projectile.entity_def_key.as_ref(),
}
}

pub fn frame_angle(&self, entity_def: &EntityDef, surfaces: &[Surface]) -> f32 {
if let Some(entity_frame) = self.get_entity_frame(entity_def) {
match &self.ty {
Expand Down Expand Up @@ -295,7 +286,7 @@ impl Entity {

pub fn item_grab_box(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> Option<Rect> {
let (x, y) = self.public_bps_xy(entities, entity_defs, surfaces);
let entity_def = &entity_defs[self.entity_def_key()];
let entity_def = &entity_defs[self.state.entity_def_key.as_ref()];
let frame = self.relative_frame(entity_def, surfaces);
frame.item_grab_box.map(|rect| rect.offset(x, y))
}
Expand Down Expand Up @@ -353,7 +344,7 @@ impl Entity {

pub fn render(&self, selected_colboxes: HashSet<usize>, entity_selected: bool, debug: DebugEntity, entity_i: EntityKey, entity_history: &[Entities], entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> RenderEntity {
let fighter_color = graphics::get_team_color3(self.team());
let entity_def = &entity_defs[self.entity_def_key()];
let entity_def = &entity_defs[self.state.entity_def_key.as_ref()];

let vector_arrows = if let EntityType::Player (player) = &self.ty {
player.vector_arrows(&debug)
Expand Down Expand Up @@ -398,9 +389,9 @@ impl Entity {
}

fn render_frame(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> RenderEntityFrame {
let entity_def = &entity_defs[self.entity_def_key()];
let entity_def = &entity_defs[self.state.entity_def_key.as_ref()];
RenderEntityFrame {
entity_def_key: self.entity_def_key().to_string(),
entity_def_key: self.state.entity_def_key.clone(),
model_name: entity_def.name.clone(),
frame_bps: self.public_bps_xy(entities, entity_defs, surfaces),
render_bps: self.public_bps_xyz(entities, entity_defs, surfaces),
Expand All @@ -415,7 +406,7 @@ impl Entity {
}

fn render_angle(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface]) -> Quaternion<f32> {
let entity_def = &entity_defs[self.entity_def_key()];
let entity_def = &entity_defs[self.state.entity_def_key.as_ref()];
match &self.ty {
EntityType::Item (item) => {
if let Some(render_angle) = item.held_render_angle(entities, entity_defs) {
Expand Down
38 changes: 21 additions & 17 deletions canon_collision/src/entity/player.rs
Expand Up @@ -46,7 +46,6 @@ pub enum MessagePlayer {

#[derive(Clone, Serialize, Deserialize)]
pub struct Player {
pub entity_def_key: String,
pub id: usize, // unique id among players
pub team: usize,
pub body: Body,
Expand Down Expand Up @@ -79,7 +78,7 @@ pub struct Player {
}

impl Player {
pub fn new(entity_def_key: String, team: usize, id: usize, stage: &Stage, package: &Package, rules: &Rules) -> Player {
pub fn new(entity_def_key: &str, team: usize, id: usize, stage: &Stage, package: &Package, rules: &Rules) -> Player {
// get the spawn point
let spawn = if stage.spawn_points.len() == 0 {
None
Expand Down Expand Up @@ -149,7 +148,6 @@ impl Player {
),
id,
team,
entity_def_key,

// Only use for debug display
stick: None,
Expand All @@ -158,18 +156,18 @@ impl Player {
}

pub fn bps_xy(&self, context: &StepContext, state: &ActionState) -> (f32, f32) {
let action_frame = state.get_entity_frame(&context.entity_defs[self.entity_def_key.as_ref()]);
let action_frame = state.get_entity_frame(&context.entity_defs[state.entity_def_key.as_ref()]);
self.body.public_bps_xy(&context.entities, &context.entity_defs, action_frame, &context.surfaces, state)
}

pub fn public_bps_xy(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface], state: &ActionState) -> (f32, f32) {
let action_frame = state.get_entity_frame(&entity_defs[self.entity_def_key.as_ref()]);
let action_frame = state.get_entity_frame(&entity_defs[state.entity_def_key.as_ref()]);
self.body.public_bps_xy(entities, entity_defs, action_frame, surfaces, state)
}

pub fn grabbing_xy(&self, entities: &Entities, entity_defs: &KeyedContextVec<EntityDef>, surfaces: &[Surface], state: &ActionState) -> (f32, f32) {
let (x, y) = self.public_bps_xy(entities, entity_defs, surfaces, state);
if let Some(entity_frame) = state.get_entity_frame(&entity_defs[self.entity_def_key.as_ref()]) {
if let Some(entity_frame) = state.get_entity_frame(&entity_defs[state.entity_def_key.as_ref()]) {
(x + self.relative_f(entity_frame.grabbing_x), y + entity_frame.grabbing_y)
} else {
(x, y)
Expand Down Expand Up @@ -247,7 +245,7 @@ impl Player {
1.0
};

let action_frame = state.get_entity_frame(&context.entity_defs[self.entity_def_key.as_ref()]);
let action_frame = state.get_entity_frame(&context.entity_defs[state.entity_def_key.as_ref()]);
let kb_vel = self.body.launch(context, state, action_frame, hitbox, hurtbox, entity_atk_i, kb_vel_mult);

if let Location::Airbourne { .. } = self.body.location {
Expand Down Expand Up @@ -884,14 +882,16 @@ impl Player {
ty: EntityType::Projectile(
Projectile {
owner_id: Some(self.id),
entity_def_key: "TorielFireball.cbor".to_string(),
speed: 0.6,
angle: if self.body.face_right { 0.0 } else { PI },
x: x + self.relative_f(10.0),
y: y + 10.0,
}
),
state: ActionState::new(ProjectileAction::Spawn),
state: ActionState::new(
"TorielFireball.cbor".to_string(),
ProjectileAction::Spawn
),
});
}
}
Expand All @@ -903,14 +903,16 @@ impl Player {
ty: EntityType::Projectile(
Projectile {
owner_id: Some(self.id),
entity_def_key: "PerfectlyGenericProjectile.cbor".to_string(),
speed: 0.6,
angle: if self.body.face_right { 0.0 } else { PI },
x: x + self.relative_f(10.0),
y: y + 10.0,
}
),
state: ActionState::new(ProjectileAction::Spawn),
state: ActionState::new(
"PerfectlyGenericProjectile.cbor".to_string(),
ProjectileAction::Spawn
),
});
}
}
Expand All @@ -924,11 +926,13 @@ impl Player {
ty: EntityType::Item(
Item {
owner_id: None,
entity_def_key: "PerfectlyGenericObject.cbor".to_string(),
body: Body::new(Location::Airbourne { x, y }, true),
}
),
state: ActionState::new(ItemAction::Fall),
state: ActionState::new(
"PerfectlyGenericObject.cbor".to_string(),
ItemAction::Fall
),
});
}
}
Expand Down Expand Up @@ -2171,7 +2175,7 @@ impl Player {
}

pub fn debug_print(&self, fighters: &KeyedContextVec<EntityDef>, player_input: &PlayerInput, state: &ActionState, debug: &DebugEntity, index: EntityKey) -> Vec<String> {
let fighter = &fighters[self.entity_def_key.as_ref()];
let fighter = &fighters[state.entity_def_key.as_ref()];
let mut lines: Vec<String> = vec!();
if debug.physics {
lines.push(self.body.debug_string(index));
Expand Down Expand Up @@ -2212,10 +2216,10 @@ impl Player {
lines
}

pub fn result(&self) -> RawPlayerResult {
pub fn result(&self, state: &ActionState) -> RawPlayerResult {
let mut result = self.result.clone();
result.final_damage = Some(self.body.damage);
result.ended_as_fighter = Some(self.entity_def_key.clone());
result.ended_as_fighter = Some(state.entity_def_key.clone());
result.team = self.team;
result
}
Expand Down Expand Up @@ -2365,7 +2369,7 @@ impl Player {
pub fn render(&self, entities: &Entities, fighters: &KeyedContextVec<EntityDef>, surfaces: &[Surface], state: &ActionState) -> RenderPlayer {
let shield = if self.is_shielding(state) {
let fighter_color = graphics::get_team_color3(self.team);
let fighter = &fighters[self.entity_def_key.as_ref()];
let fighter = &fighters[state.entity_def_key.as_ref()];

if let &Some(ref shield) = &fighter.shield {
let c = &fighter_color;
Expand Down
3 changes: 1 addition & 2 deletions canon_collision/src/entity/projectile.rs
Expand Up @@ -18,7 +18,6 @@ pub enum ProjectileAction {
#[derive(Clone, Serialize, Deserialize)]
pub struct Projectile {
pub owner_id: Option<usize>,
pub entity_def_key: String,
pub angle: f32,
pub speed: f32,
pub x: f32,
Expand Down Expand Up @@ -91,7 +90,7 @@ impl Projectile {

pub fn debug_print(&self, entities: &KeyedContextVec<EntityDef>, state: &ActionState, debug: &DebugEntity, i: EntityKey) -> Vec<String> {
let mut lines = vec!();
let entity = &entities[self.entity_def_key.as_ref()];
let entity = &entities[state.entity_def_key.as_ref()];
if debug.physics {
lines.push(format!("Entity: {:?} location: {:?} angle: {:.5}",
i, (self.x, self.y), self.angle));
Expand Down

0 comments on commit 1709907

Please sign in to comment.