mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
reducing complexity of character_behavior's run method by extracting logical pieces.
This commit is contained in:
parent
46c580ddfa
commit
93045ba1ee
@ -5,9 +5,9 @@ use specs::{
|
|||||||
|
|
||||||
use common::{
|
use common::{
|
||||||
comp::{
|
comp::{
|
||||||
self, inventory::item::MaterialStatManifest, Beam, Body, CharacterState, Combo, Controller,
|
self, inventory::item::MaterialStatManifest, Beam, Body, CharacterState, Combo,
|
||||||
Density, Energy, Health, Inventory, InventoryManip, Mass, Melee, Mounting, Ori,
|
ControlAction, Controller, Density, Energy, Health, Inventory, InventoryManip, Mass, Melee,
|
||||||
PhysicsState, Poise, PoiseState, Pos, SkillSet, StateUpdate, Stats, Vel,
|
Mounting, Ori, PhysicsState, Poise, PoiseState, Pos, SkillSet, StateUpdate, Stats, Vel,
|
||||||
},
|
},
|
||||||
event::{Emitter, EventBus, LocalEvent, ServerEvent},
|
event::{Emitter, EventBus, LocalEvent, ServerEvent},
|
||||||
outcome::Outcome,
|
outcome::Outcome,
|
||||||
@ -22,37 +22,6 @@ use common::{
|
|||||||
use common_ecs::{Job, Origin, Phase, System};
|
use common_ecs::{Job, Origin, Phase, System};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
fn incorporate_update(
|
|
||||||
join: &mut JoinStruct,
|
|
||||||
mut state_update: StateUpdate,
|
|
||||||
server_emitter: &mut Emitter<ServerEvent>,
|
|
||||||
) {
|
|
||||||
// TODO: if checking equality is expensive use optional field in StateUpdate
|
|
||||||
if *join.char_state != state_update.character {
|
|
||||||
*join.char_state = state_update.character
|
|
||||||
};
|
|
||||||
*join.pos = state_update.pos;
|
|
||||||
*join.vel = state_update.vel;
|
|
||||||
*join.ori = state_update.ori;
|
|
||||||
*join.density = state_update.density;
|
|
||||||
// Note: might be changed every tick by timer anyway
|
|
||||||
if *join.energy != state_update.energy {
|
|
||||||
*join.energy = state_update.energy
|
|
||||||
};
|
|
||||||
join.controller
|
|
||||||
.queued_inputs
|
|
||||||
.append(&mut state_update.queued_inputs);
|
|
||||||
for input in state_update.removed_inputs {
|
|
||||||
join.controller.queued_inputs.remove(&input);
|
|
||||||
}
|
|
||||||
if state_update.swap_equipped_weapons {
|
|
||||||
server_emitter.emit(ServerEvent::InventoryManip(
|
|
||||||
join.entity,
|
|
||||||
InventoryManip::SwapEquippedWeapons,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(SystemData)]
|
#[derive(SystemData)]
|
||||||
pub struct ReadData<'a> {
|
pub struct ReadData<'a> {
|
||||||
entities: Entities<'a>,
|
entities: Entities<'a>,
|
||||||
@ -303,50 +272,14 @@ impl<'a> System<'a> for Sys {
|
|||||||
&read_data.dt,
|
&read_data.dt,
|
||||||
&read_data.msm,
|
&read_data.msm,
|
||||||
);
|
);
|
||||||
let mut state_update = match j.character {
|
let mut state_update = <Sys>::handle_action_of_current_state(action, &j);
|
||||||
CharacterState::Idle => states::idle::Data.handle_event(&j, action),
|
|
||||||
CharacterState::Talk => states::talk::Data.handle_event(&j, action),
|
<Sys>::emit_state_updates(
|
||||||
CharacterState::Climb(data) => data.handle_event(&j, action),
|
&mut server_emitter,
|
||||||
CharacterState::Glide(data) => data.handle_event(&j, action),
|
&mut local_emitter,
|
||||||
CharacterState::GlideWield => {
|
&mut state_update,
|
||||||
states::glide_wield::Data.handle_event(&j, action)
|
);
|
||||||
},
|
<Sys>::incorporate_update(&mut join_struct, state_update, &mut server_emitter);
|
||||||
CharacterState::Stunned(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Sit => {
|
|
||||||
states::sit::Data::handle_event(&states::sit::Data, &j, action)
|
|
||||||
},
|
|
||||||
CharacterState::Dance => {
|
|
||||||
states::dance::Data::handle_event(&states::dance::Data, &j, action)
|
|
||||||
},
|
|
||||||
CharacterState::Sneak => {
|
|
||||||
states::sneak::Data::handle_event(&states::sneak::Data, &j, action)
|
|
||||||
},
|
|
||||||
CharacterState::BasicBlock(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Roll(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Wielding => states::wielding::Data.handle_event(&j, action),
|
|
||||||
CharacterState::Equipping(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::ComboMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::BasicMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::BasicRanged(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Boost(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::DashMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::LeapMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::SpinMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::ChargedMelee(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::ChargedRanged(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::RepeaterRanged(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Shockwave(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::BasicBeam(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::BasicAura(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::Blink(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::BasicSummon(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::SelfBuff(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::SpriteSummon(data) => data.handle_event(&j, action),
|
|
||||||
CharacterState::UseItem(data) => data.handle_event(&j, action),
|
|
||||||
};
|
|
||||||
local_emitter.append(&mut state_update.local_events);
|
|
||||||
server_emitter.append(&mut state_update.server_events);
|
|
||||||
incorporate_update(&mut join_struct, state_update, &mut server_emitter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mounted occurs after control actions have been handled
|
// Mounted occurs after control actions have been handled
|
||||||
@ -366,43 +299,128 @@ impl<'a> System<'a> for Sys {
|
|||||||
&read_data.msm,
|
&read_data.msm,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut state_update = match j.character {
|
let mut state_update = <Sys>::execute_behavior_of_current_state(&j);
|
||||||
CharacterState::Idle => states::idle::Data.behavior(&j),
|
|
||||||
CharacterState::Talk => states::talk::Data.behavior(&j),
|
|
||||||
CharacterState::Climb(data) => data.behavior(&j),
|
|
||||||
CharacterState::Glide(data) => data.behavior(&j),
|
|
||||||
CharacterState::GlideWield => states::glide_wield::Data.behavior(&j),
|
|
||||||
CharacterState::Stunned(data) => data.behavior(&j),
|
|
||||||
CharacterState::Sit => states::sit::Data::behavior(&states::sit::Data, &j),
|
|
||||||
CharacterState::Dance => states::dance::Data::behavior(&states::dance::Data, &j),
|
|
||||||
CharacterState::Sneak => states::sneak::Data::behavior(&states::sneak::Data, &j),
|
|
||||||
CharacterState::BasicBlock(data) => data.behavior(&j),
|
|
||||||
CharacterState::Roll(data) => data.behavior(&j),
|
|
||||||
CharacterState::Wielding => states::wielding::Data.behavior(&j),
|
|
||||||
CharacterState::Equipping(data) => data.behavior(&j),
|
|
||||||
CharacterState::ComboMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::BasicMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::BasicRanged(data) => data.behavior(&j),
|
|
||||||
CharacterState::Boost(data) => data.behavior(&j),
|
|
||||||
CharacterState::DashMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::LeapMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::SpinMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::ChargedMelee(data) => data.behavior(&j),
|
|
||||||
CharacterState::ChargedRanged(data) => data.behavior(&j),
|
|
||||||
CharacterState::RepeaterRanged(data) => data.behavior(&j),
|
|
||||||
CharacterState::Shockwave(data) => data.behavior(&j),
|
|
||||||
CharacterState::BasicBeam(data) => data.behavior(&j),
|
|
||||||
CharacterState::BasicAura(data) => data.behavior(&j),
|
|
||||||
CharacterState::Blink(data) => data.behavior(&j),
|
|
||||||
CharacterState::BasicSummon(data) => data.behavior(&j),
|
|
||||||
CharacterState::SelfBuff(data) => data.behavior(&j),
|
|
||||||
CharacterState::SpriteSummon(data) => data.behavior(&j),
|
|
||||||
CharacterState::UseItem(data) => data.behavior(&j),
|
|
||||||
};
|
|
||||||
|
|
||||||
local_emitter.append(&mut state_update.local_events);
|
<Sys>::emit_state_updates(&mut server_emitter, &mut local_emitter, &mut state_update);
|
||||||
server_emitter.append(&mut state_update.server_events);
|
<Sys>::incorporate_update(&mut join_struct, state_update, &mut server_emitter);
|
||||||
incorporate_update(&mut join_struct, state_update, &mut server_emitter);
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sys {
|
||||||
|
fn execute_behavior_of_current_state(j: &JoinData) -> StateUpdate {
|
||||||
|
match j.character {
|
||||||
|
CharacterState::Idle => states::idle::Data.behavior(&j),
|
||||||
|
CharacterState::Talk => states::talk::Data.behavior(&j),
|
||||||
|
CharacterState::Climb(data) => data.behavior(&j),
|
||||||
|
CharacterState::Glide(data) => data.behavior(&j),
|
||||||
|
CharacterState::GlideWield => states::glide_wield::Data.behavior(&j),
|
||||||
|
CharacterState::Stunned(data) => data.behavior(&j),
|
||||||
|
CharacterState::Sit => states::sit::Data::behavior(&states::sit::Data, &j),
|
||||||
|
CharacterState::Dance => states::dance::Data::behavior(&states::dance::Data, &j),
|
||||||
|
CharacterState::Sneak => states::sneak::Data::behavior(&states::sneak::Data, &j),
|
||||||
|
CharacterState::BasicBlock(data) => data.behavior(&j),
|
||||||
|
CharacterState::Roll(data) => data.behavior(&j),
|
||||||
|
CharacterState::Wielding => states::wielding::Data.behavior(&j),
|
||||||
|
CharacterState::Equipping(data) => data.behavior(&j),
|
||||||
|
CharacterState::ComboMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::BasicMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::BasicRanged(data) => data.behavior(&j),
|
||||||
|
CharacterState::Boost(data) => data.behavior(&j),
|
||||||
|
CharacterState::DashMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::LeapMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::SpinMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::ChargedMelee(data) => data.behavior(&j),
|
||||||
|
CharacterState::ChargedRanged(data) => data.behavior(&j),
|
||||||
|
CharacterState::RepeaterRanged(data) => data.behavior(&j),
|
||||||
|
CharacterState::Shockwave(data) => data.behavior(&j),
|
||||||
|
CharacterState::BasicBeam(data) => data.behavior(&j),
|
||||||
|
CharacterState::BasicAura(data) => data.behavior(&j),
|
||||||
|
CharacterState::Blink(data) => data.behavior(&j),
|
||||||
|
CharacterState::BasicSummon(data) => data.behavior(&j),
|
||||||
|
CharacterState::SelfBuff(data) => data.behavior(&j),
|
||||||
|
CharacterState::SpriteSummon(data) => data.behavior(&j),
|
||||||
|
CharacterState::UseItem(data) => data.behavior(&j),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_action_of_current_state(action: ControlAction, j: &JoinData) -> StateUpdate {
|
||||||
|
match j.character {
|
||||||
|
CharacterState::Idle => states::idle::Data.handle_event(&j, action),
|
||||||
|
CharacterState::Talk => states::talk::Data.handle_event(&j, action),
|
||||||
|
CharacterState::Climb(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Glide(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::GlideWield => states::glide_wield::Data.handle_event(&j, action),
|
||||||
|
CharacterState::Stunned(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Sit => states::sit::Data::handle_event(&states::sit::Data, &j, action),
|
||||||
|
CharacterState::Dance => {
|
||||||
|
states::dance::Data::handle_event(&states::dance::Data, &j, action)
|
||||||
|
},
|
||||||
|
CharacterState::Sneak => {
|
||||||
|
states::sneak::Data::handle_event(&states::sneak::Data, &j, action)
|
||||||
|
},
|
||||||
|
CharacterState::BasicBlock(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Roll(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Wielding => states::wielding::Data.handle_event(&j, action),
|
||||||
|
CharacterState::Equipping(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::ComboMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::BasicMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::BasicRanged(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Boost(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::DashMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::LeapMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::SpinMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::ChargedMelee(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::ChargedRanged(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::RepeaterRanged(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Shockwave(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::BasicBeam(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::BasicAura(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::Blink(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::BasicSummon(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::SelfBuff(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::SpriteSummon(data) => data.handle_event(&j, action),
|
||||||
|
CharacterState::UseItem(data) => data.handle_event(&j, action),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_state_updates(
|
||||||
|
server_emitter: &mut Emitter<ServerEvent>,
|
||||||
|
local_emitter: &mut Emitter<LocalEvent>,
|
||||||
|
state_update: &mut StateUpdate,
|
||||||
|
) {
|
||||||
|
local_emitter.append(&mut state_update.local_events);
|
||||||
|
server_emitter.append(&mut state_update.server_events);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn incorporate_update(
|
||||||
|
join: &mut JoinStruct,
|
||||||
|
mut state_update: StateUpdate,
|
||||||
|
server_emitter: &mut Emitter<ServerEvent>,
|
||||||
|
) {
|
||||||
|
// TODO: if checking equality is expensive use optional field in StateUpdate
|
||||||
|
if *join.char_state != state_update.character {
|
||||||
|
*join.char_state = state_update.character
|
||||||
|
};
|
||||||
|
*join.pos = state_update.pos;
|
||||||
|
*join.vel = state_update.vel;
|
||||||
|
*join.ori = state_update.ori;
|
||||||
|
*join.density = state_update.density;
|
||||||
|
// Note: might be changed every tick by timer anyway
|
||||||
|
if *join.energy != state_update.energy {
|
||||||
|
*join.energy = state_update.energy
|
||||||
|
};
|
||||||
|
join.controller
|
||||||
|
.queued_inputs
|
||||||
|
.append(&mut state_update.queued_inputs);
|
||||||
|
for input in state_update.removed_inputs {
|
||||||
|
join.controller.queued_inputs.remove(&input);
|
||||||
|
}
|
||||||
|
if state_update.swap_equipped_weapons {
|
||||||
|
server_emitter.emit(ServerEvent::InventoryManip(
|
||||||
|
join.entity,
|
||||||
|
InventoryManip::SwapEquippedWeapons,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user