Fixed sword AI after contextualized sword abilities.

This commit is contained in:
Sam 2022-10-22 15:59:25 -04:00
parent 8cfe62e6dc
commit e1f76e0127
2 changed files with 79 additions and 188 deletions

View File

@ -121,7 +121,12 @@ impl CharacterBehavior for Data {
}; };
handle_orientation(data, &mut update, 1.0, None); handle_orientation(data, &mut update, 1.0, None);
handle_move(data, &mut update, 0.7); let move_eff = if self.stage_section.is_some() {
0.7
} else {
1.0
};
handle_move(data, &mut update, move_eff);
let interrupted = handle_interrupts(data, &mut update, Some(ability_input)); let interrupted = handle_interrupts(data, &mut update, Some(ability_input));
let strike_data = self.strike_data(); let strike_data = self.strike_data();

View File

@ -596,97 +596,81 @@ impl<'a> AgentData<'a> {
match stance(agent.action_state.int_counter) { match stance(agent.action_state.int_counter) {
SwordStance::Balanced => { SwordStance::Balanced => {
// Balanced finisher // Balanced finisher
set_sword_ability(0, 0); set_sword_ability(0, 8);
}, },
SwordStance::Offensive => { SwordStance::Offensive => {
// Offensive combo // Offensive combo
set_sword_ability(0, 1); set_sword_ability(0, 0);
// Offensive advance // Offensive advance
set_sword_ability(1, 3); set_sword_ability(1, 9);
// Offensive finisher // Offensive finisher
set_sword_ability(2, 2); set_sword_ability(2, 8);
// Balanced finisher
set_sword_ability(3, 0);
}, },
SwordStance::Defensive => { SwordStance::Defensive => {
// Defensive combo // Defensive combo
set_sword_ability(0, 12); set_sword_ability(0, 3);
// Defensive retreat // Defensive retreat
set_sword_ability(1, 14); set_sword_ability(1, 9);
// Defensive bulwark // Defensive bulwark
set_sword_ability(2, 13); set_sword_ability(2, 10);
// Balanced finisher
set_sword_ability(3, 0);
}, },
SwordStance::Mobility => { SwordStance::Mobility => {
// Mobility combo // Mobility combo
set_sword_ability(0, 23); set_sword_ability(0, 6);
// Mobility feint // Mobility feint
set_sword_ability(1, 24); set_sword_ability(1, 9);
// Mobility agility // Mobility agility
set_sword_ability(2, 25); set_sword_ability(2, 10);
// Balanced finisher
set_sword_ability(3, 0);
}, },
SwordStance::Crippling => { SwordStance::Crippling => {
// Crippling combo // Crippling combo
set_sword_ability(0, 4); set_sword_ability(0, 1);
// Crippling finisher // Crippling finisher
set_sword_ability(1, 5); set_sword_ability(1, 8);
// Crippling strike // Crippling strike
set_sword_ability(2, 6); set_sword_ability(2, 9);
// Crippling gouge // Crippling gouge
set_sword_ability(3, 7); set_sword_ability(3, 10);
// Offensive advance
set_sword_ability(4, 3);
}, },
SwordStance::Cleaving => { SwordStance::Cleaving => {
// Cleaving combo // Cleaving combo
set_sword_ability(0, 8); set_sword_ability(0, 2);
// Cleaving finisher // Cleaving finisher
set_sword_ability(1, 9); set_sword_ability(1, 8);
// Cleaving spin // Cleaving spin
set_sword_ability(2, 10); set_sword_ability(2, 10);
// Cleaving dive // Cleaving dive
set_sword_ability(3, 11); set_sword_ability(3, 9);
// Offensive advance
set_sword_ability(4, 3);
}, },
SwordStance::Parrying => { SwordStance::Parrying => {
// Parrying combo // Parrying combo
set_sword_ability(0, 15); set_sword_ability(0, 4);
// Parrying parry // Parrying parry
set_sword_ability(1, 16); set_sword_ability(1, 10);
// Parrying riposte // Parrying riposte
set_sword_ability(2, 17); set_sword_ability(2, 9);
// Parrying counter // Parrying counter
set_sword_ability(3, 18); set_sword_ability(3, 8);
// Defensive retreat
set_sword_ability(4, 14);
}, },
SwordStance::Heavy => { SwordStance::Heavy => {
// Heavy combo // Heavy combo
set_sword_ability(0, 19); set_sword_ability(0, 5);
// Heavy finisher // Heavy finisher
set_sword_ability(1, 20); set_sword_ability(1, 8);
// Heavy pommelstrike // Heavy pommelstrike
set_sword_ability(2, 21); set_sword_ability(2, 10);
// Heavy fortitude // Heavy fortitude
set_sword_ability(3, 22); set_sword_ability(3, 9);
// Defensive bulwark
set_sword_ability(4, 13);
}, },
SwordStance::Reaching => { SwordStance::Reaching => {
// Reaching combo // Reaching combo
set_sword_ability(0, 26); set_sword_ability(0, 7);
// Reaching charge // Reaching charge
set_sword_ability(1, 27); set_sword_ability(1, 9);
// Reaching flurry // Reaching flurry
set_sword_ability(2, 28); set_sword_ability(2, 8);
// Reaching skewer // Reaching skewer
set_sword_ability(3, 29); set_sword_ability(3, 10);
// Mobility agility
set_sword_ability(4, 25);
}, },
} }
agent.action_state.initialized = true; agent.action_state.initialized = true;
@ -757,35 +741,15 @@ impl<'a> AgentData<'a> {
} }
}; };
const BALANCED_FINISHER: FinisherMeleeData = FinisherMeleeData {
range: 2.5,
angle: 12.5,
energy: 30.0,
combo: 10,
};
const OFFENSIVE_ADVANCE: ComboMeleeData = ComboMeleeData {
min_range: 6.0,
max_range: 10.0,
angle: 20.0,
energy: 10.0,
};
const DEFENSIVE_RETREAT: ComboMeleeData = ComboMeleeData {
min_range: 0.0,
max_range: 3.0,
angle: 35.0,
energy: 10.0,
};
const DEFENSIVE_BULWARK: SelfBuffData = SelfBuffData {
buff: BuffKind::ProtectingWard,
energy: 40.0,
};
const MOBILITY_AGILITY: SelfBuffData = SelfBuffData {
buff: BuffKind::Hastened,
energy: 40.0,
};
match stance(agent.action_state.int_counter) { match stance(agent.action_state.int_counter) {
SwordStance::Balanced => { SwordStance::Balanced => {
const BALANCED_FINISHER: FinisherMeleeData = FinisherMeleeData {
range: 2.5,
angle: 12.5,
energy: 30.0,
combo: 10,
};
if self if self
.skill_set .skill_set
.has_skill(Skill::Sword(SwordSkill::BalancedFinisher)) .has_skill(Skill::Sword(SwordSkill::BalancedFinisher))
@ -809,6 +773,12 @@ impl<'a> AgentData<'a> {
angle: 30.0, angle: 30.0,
energy: 4.0, energy: 4.0,
}; };
const OFFENSIVE_ADVANCE: ComboMeleeData = ComboMeleeData {
min_range: 6.0,
max_range: 10.0,
angle: 20.0,
energy: 10.0,
};
const OFFENSIVE_FINISHER: FinisherMeleeData = FinisherMeleeData { const OFFENSIVE_FINISHER: FinisherMeleeData = FinisherMeleeData {
range: 2.0, range: 2.0,
angle: 10.0, angle: 10.0,
@ -822,31 +792,15 @@ impl<'a> AgentData<'a> {
} else if !in_stance(SwordStance::Offensive) { } else if !in_stance(SwordStance::Offensive) {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else { } else {
let used_finisher = if self let used_finisher = if OFFENSIVE_FINISHER.could_use(attack_data, self)
.skill_set && OFFENSIVE_FINISHER.use_desirable(tgt_data, self)
.has_skill(Skill::Sword(SwordSkill::OffensiveFinisher))
{ {
if OFFENSIVE_FINISHER.could_use(attack_data, self) controller.push_basic_input(InputKind::Ability(2));
&& OFFENSIVE_FINISHER.use_desirable(tgt_data, self)
{
controller.push_basic_input(InputKind::Ability(2));
advance(
agent,
controller,
OFFENSIVE_FINISHER.range,
OFFENSIVE_FINISHER.angle,
);
true
} else {
false
}
} else if BALANCED_FINISHER.could_use(attack_data, self) {
controller.push_basic_input(InputKind::Ability(3));
advance( advance(
agent, agent,
controller, controller,
BALANCED_FINISHER.range, OFFENSIVE_FINISHER.range,
BALANCED_FINISHER.angle, OFFENSIVE_FINISHER.angle,
); );
true true
} else { } else {
@ -888,6 +842,16 @@ impl<'a> AgentData<'a> {
angle: 35.0, angle: 35.0,
energy: 3.0, energy: 3.0,
}; };
const DEFENSIVE_RETREAT: ComboMeleeData = ComboMeleeData {
min_range: 0.0,
max_range: 3.0,
angle: 35.0,
energy: 10.0,
};
const DEFENSIVE_BULWARK: SelfBuffData = SelfBuffData {
buff: BuffKind::ProtectingWard,
energy: 40.0,
};
const BASIC_BLOCK: BlockData = BlockData { const BASIC_BLOCK: BlockData = BlockData {
angle: 55.0, angle: 55.0,
range: 5.0, range: 5.0,
@ -938,16 +902,6 @@ impl<'a> AgentData<'a> {
} else if DEFENSIVE_BULWARK.could_use(self) && DEFENSIVE_BULWARK.use_desirable(self) } else if DEFENSIVE_BULWARK.could_use(self) && DEFENSIVE_BULWARK.use_desirable(self)
{ {
controller.push_basic_input(InputKind::Ability(2)); controller.push_basic_input(InputKind::Ability(2));
} else if BALANCED_FINISHER.could_use(attack_data, self)
&& BALANCED_FINISHER.use_desirable(tgt_data, self)
{
controller.push_basic_input(InputKind::Ability(3));
advance(
agent,
controller,
BALANCED_FINISHER.range,
BALANCED_FINISHER.angle,
);
} else if try_block() { } else if try_block() {
controller.push_basic_input(InputKind::Block); controller.push_basic_input(InputKind::Block);
} else if DEFENSIVE_RETREAT.could_use(attack_data, self) && rng.gen::<f32>() < 0.2 { } else if DEFENSIVE_RETREAT.could_use(attack_data, self) && rng.gen::<f32>() < 0.2 {
@ -992,6 +946,10 @@ impl<'a> AgentData<'a> {
angle: 35.0, angle: 35.0,
energy: 10.0, energy: 10.0,
}; };
const MOBILITY_AGILITY: SelfBuffData = SelfBuffData {
buff: BuffKind::Hastened,
energy: 40.0,
};
const DESIRED_ENERGY: f32 = 50.0; const DESIRED_ENERGY: f32 = 50.0;
let mut try_roll = || { let mut try_roll = || {
@ -1026,16 +984,6 @@ impl<'a> AgentData<'a> {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else if MOBILITY_AGILITY.could_use(self) && MOBILITY_AGILITY.use_desirable(self) { } else if MOBILITY_AGILITY.could_use(self) && MOBILITY_AGILITY.use_desirable(self) {
controller.push_basic_input(InputKind::Ability(2)); controller.push_basic_input(InputKind::Ability(2));
} else if BALANCED_FINISHER.could_use(attack_data, self)
&& BALANCED_FINISHER.use_desirable(tgt_data, self)
{
controller.push_basic_input(InputKind::Ability(3));
advance(
agent,
controller,
BALANCED_FINISHER.range,
BALANCED_FINISHER.angle,
);
} else if try_roll() { } else if try_roll() {
controller.inputs.move_dir = (tgt_data.pos.0 - self.pos.0) controller.inputs.move_dir = (tgt_data.pos.0 - self.pos.0)
.xy() .xy()
@ -1146,14 +1094,6 @@ impl<'a> AgentData<'a> {
CRIPPLING_COMBO.max_range, CRIPPLING_COMBO.max_range,
CRIPPLING_COMBO.angle, CRIPPLING_COMBO.angle,
); );
} else if OFFENSIVE_ADVANCE.could_use(attack_data, self) {
controller.push_basic_input(InputKind::Ability(4));
advance(
agent,
controller,
OFFENSIVE_ADVANCE.max_range,
OFFENSIVE_ADVANCE.angle,
);
} else { } else {
advance( advance(
agent, agent,
@ -1263,14 +1203,6 @@ impl<'a> AgentData<'a> {
CLEAVING_COMBO.max_range, CLEAVING_COMBO.max_range,
CLEAVING_COMBO.angle, CLEAVING_COMBO.angle,
); );
} else if OFFENSIVE_ADVANCE.could_use(attack_data, self) {
controller.push_basic_input(InputKind::Ability(4));
advance(
agent,
controller,
OFFENSIVE_ADVANCE.max_range,
OFFENSIVE_ADVANCE.angle,
);
} else { } else {
advance( advance(
agent, agent,
@ -1317,35 +1249,8 @@ impl<'a> AgentData<'a> {
} }
}; };
if tgt_data
.buffs
.map_or(false, |b| b.contains(BuffKind::Parried))
{
agent.action_state.condition = true;
}
if agent.action_state.condition {
agent.action_state.timer += read_data.dt.0;
}
if agent.action_state.timer > 0.5 {
agent.action_state.condition = false;
agent.action_state.timer = 0.0;
}
if self.energy.current() < DESIRED_ENERGY { if self.energy.current() < DESIRED_ENERGY {
fallback_tactics(agent, controller); fallback_tactics(agent, controller);
} else if agent.action_state.condition
&& agent.action_state.timer > 0.25
&& DEFENSIVE_RETREAT.could_use(attack_data, self)
{
controller.push_basic_input(InputKind::Ability(4));
if matches!(self.char_state.stage_section(), Some(StageSection::Buildup)) {
advance(
agent,
controller,
DEFENSIVE_RETREAT.max_range,
DEFENSIVE_RETREAT.angle,
);
}
} else if !in_stance(SwordStance::Parrying) { } else if !in_stance(SwordStance::Parrying) {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else if matches!( } else if matches!(
@ -1382,14 +1287,12 @@ impl<'a> AgentData<'a> {
); );
} else if PARRYING_COMBO.could_use(attack_data, self) { } else if PARRYING_COMBO.could_use(attack_data, self) {
controller.push_basic_input(InputKind::Primary); controller.push_basic_input(InputKind::Primary);
if !agent.action_state.condition { advance(
advance( agent,
agent, controller,
controller, PARRYING_COMBO.max_range,
PARRYING_COMBO.max_range, PARRYING_COMBO.angle,
PARRYING_COMBO.angle, );
);
}
} else { } else {
advance( advance(
agent, agent,
@ -1400,14 +1303,12 @@ impl<'a> AgentData<'a> {
} }
} else if PARRYING_COMBO.could_use(attack_data, self) { } else if PARRYING_COMBO.could_use(attack_data, self) {
controller.push_basic_input(InputKind::Primary); controller.push_basic_input(InputKind::Primary);
if !agent.action_state.condition { advance(
advance( agent,
agent, controller,
controller, PARRYING_COMBO.max_range,
PARRYING_COMBO.max_range, PARRYING_COMBO.angle,
PARRYING_COMBO.angle, );
);
}
} else { } else {
advance( advance(
agent, agent,
@ -1454,15 +1355,6 @@ impl<'a> AgentData<'a> {
if self.energy.current() < DESIRED_ENERGY { if self.energy.current() < DESIRED_ENERGY {
fallback_tactics(agent, controller); fallback_tactics(agent, controller);
} else if !agent.action_state.condition
&& DEFENSIVE_BULWARK.could_use(self)
&& DEFENSIVE_BULWARK.use_desirable(self)
{
if in_stance(SwordStance::Heavy) {
controller.push_basic_input(InputKind::Ability(0));
} else {
controller.push_basic_input(InputKind::Ability(4));
}
} else if !in_stance(SwordStance::Heavy) { } else if !in_stance(SwordStance::Heavy) {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else if HEAVY_FORTITUDE.could_use(self) } else if HEAVY_FORTITUDE.could_use(self)
@ -1529,12 +1421,6 @@ impl<'a> AgentData<'a> {
if self.energy.current() < DESIRED_ENERGY { if self.energy.current() < DESIRED_ENERGY {
fallback_tactics(agent, controller); fallback_tactics(agent, controller);
} else if MOBILITY_AGILITY.could_use(self) && MOBILITY_AGILITY.use_desirable(self) {
if in_stance(SwordStance::Reaching) {
controller.push_basic_input(InputKind::Ability(0));
} else {
controller.push_basic_input(InputKind::Ability(4));
}
} else if !in_stance(SwordStance::Reaching) { } else if !in_stance(SwordStance::Reaching) {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else if matches!(self.char_state, CharacterState::DashMelee(s) if s.stage_section != StageSection::Recover) } else if matches!(self.char_state, CharacterState::DashMelee(s) if s.stage_section != StageSection::Recover)