check immunities
This commit is contained in:
parent
82e49c56bf
commit
92ee2ad52e
@ -168,8 +168,17 @@ impl Cryp {
|
|||||||
self.hp.base == 0
|
self.hp.base == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn immune(&self, skill: Skill) -> bool {
|
pub fn immune(&self, skill: Skill) -> (bool, Vec<Effect>) {
|
||||||
self.effects.iter().any(|e| e.effect.immune(skill))
|
let immunities = self.effects.iter()
|
||||||
|
.filter(|e| e.effect.immune(skill))
|
||||||
|
.map(|e| e.effect)
|
||||||
|
.collect::<Vec<Effect>>();
|
||||||
|
|
||||||
|
if immunities.len() > 0 {
|
||||||
|
return (true, immunities);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (false, vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_stunned(&self) -> bool {
|
pub fn is_stunned(&self) -> bool {
|
||||||
|
|||||||
@ -915,7 +915,7 @@ mod tests {
|
|||||||
|
|
||||||
assert!(game.resolved.iter().any(|r| r.skill == Skill::DrainTick));
|
assert!(game.resolved.iter().any(|r| r.skill == Skill::DrainTick));
|
||||||
|
|
||||||
println!("{:#?}", game);
|
// println!("{:#?}", game);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,6 +76,8 @@ pub enum Effect {
|
|||||||
Blind,
|
Blind,
|
||||||
Snare,
|
Snare,
|
||||||
|
|
||||||
|
Empower,
|
||||||
|
|
||||||
// magic
|
// magic
|
||||||
Hex,
|
Hex,
|
||||||
Curse,
|
Curse,
|
||||||
@ -88,7 +90,7 @@ pub enum Effect {
|
|||||||
Silence,
|
Silence,
|
||||||
|
|
||||||
// magic immunity
|
// magic immunity
|
||||||
Immune,
|
Shield,
|
||||||
|
|
||||||
// effects over time
|
// effects over time
|
||||||
Triage,
|
Triage,
|
||||||
@ -105,9 +107,14 @@ impl Effect {
|
|||||||
match self {
|
match self {
|
||||||
Effect::Block => match skill {
|
Effect::Block => match skill {
|
||||||
Skill::Stun |
|
Skill::Stun |
|
||||||
|
Skill::TestStun |
|
||||||
Skill::Attack => true,
|
Skill::Attack => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
},
|
},
|
||||||
|
Effect::Shield => match skill.cast_type() {
|
||||||
|
Damage::Magic => true,
|
||||||
|
Damage::Physical => false,
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,13 +133,18 @@ impl Effect {
|
|||||||
pub fn modifications(&self) -> Vec<Stat> {
|
pub fn modifications(&self) -> Vec<Stat> {
|
||||||
match self {
|
match self {
|
||||||
Effect::Amplify => vec![Stat::SpellDmg],
|
Effect::Amplify => vec![Stat::SpellDmg],
|
||||||
|
Effect::Empower => vec![Stat::PhysDmg],
|
||||||
_ => vec![],
|
_ => vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maybe increase by rng
|
||||||
|
// roll little endian bits
|
||||||
|
// and OR with base stat
|
||||||
pub fn apply(&self, value: u64) -> u64 {
|
pub fn apply(&self, value: u64) -> u64 {
|
||||||
match self {
|
match self {
|
||||||
Effect::Amplify => value << 1,
|
Effect::Amplify => value << 1,
|
||||||
|
Effect::Empower => value << 1,
|
||||||
_ => panic!("{:?} does not have a mod effect", self),
|
_ => panic!("{:?} does not have a mod effect", self),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,7 +211,7 @@ pub enum Skill {
|
|||||||
// -----------------
|
// -----------------
|
||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
Inspire,
|
Empower,
|
||||||
Slay,
|
Slay,
|
||||||
Shield,
|
Shield,
|
||||||
Silence,
|
Silence,
|
||||||
@ -281,7 +293,7 @@ impl Skill {
|
|||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
// Skill::Precision => Some(1),
|
// Skill::Precision => Some(1),
|
||||||
Skill::Inspire => Some(2),
|
Skill::Empower => Some(2),
|
||||||
Skill::Slay => Some(1),
|
Skill::Slay => Some(1),
|
||||||
Skill::Shield => Some(1),
|
Skill::Shield => Some(1),
|
||||||
Skill::Silence => Some(2),
|
Skill::Silence => Some(2),
|
||||||
@ -364,7 +376,7 @@ impl Skill {
|
|||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
// Skill::Precision => 1,
|
// Skill::Precision => 1,
|
||||||
Skill::Inspire => Damage::Physical,
|
Skill::Empower => Damage::Physical,
|
||||||
Skill::Slay => Damage::Physical,
|
Skill::Slay => Damage::Physical,
|
||||||
Skill::Shield => Damage::Magic,
|
Skill::Shield => Damage::Magic,
|
||||||
Skill::Silence => Damage::Magic,
|
Skill::Silence => Damage::Magic,
|
||||||
@ -448,7 +460,7 @@ impl Skill {
|
|||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
// Skill::Precision => 1,
|
// Skill::Precision => 1,
|
||||||
Skill::Inspire => 2,
|
Skill::Empower => 2,
|
||||||
Skill::Slay => 1,
|
Skill::Slay => 1,
|
||||||
Skill::Shield => 1,
|
Skill::Shield => 1,
|
||||||
Skill::Silence => 2,
|
Skill::Silence => 2,
|
||||||
@ -491,6 +503,12 @@ impl Skill {
|
|||||||
|
|
||||||
// return Some(roll);
|
// return Some(roll);
|
||||||
|
|
||||||
|
let (immune, reason) = target.immune(*self);
|
||||||
|
if immune {
|
||||||
|
log.push(format!("{:?} -> {:?} | {:?} immune: {:?}", cryp.name, target.name, self, reason));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
Skill::Attack => attack(cryp, target, log),
|
Skill::Attack => attack(cryp, target, log),
|
||||||
// -----------------
|
// -----------------
|
||||||
@ -531,7 +549,7 @@ impl Skill {
|
|||||||
// Destruction
|
// Destruction
|
||||||
// -----------------
|
// -----------------
|
||||||
Skill::Blast => blast(cryp, target, log),
|
Skill::Blast => blast(cryp, target, log),
|
||||||
Skill::Amplify => amplify(cryp, target, log), // TODO increase magic dmg
|
Skill::Amplify => amplify(cryp, target, log), // increase magic dmg
|
||||||
Skill::Decay => decay(cryp, target, log), // dot
|
Skill::Decay => decay(cryp, target, log), // dot
|
||||||
Skill::DecayTick => decay_tick(cryp, target, log), // hot
|
Skill::DecayTick => decay_tick(cryp, target, log), // hot
|
||||||
Skill::Drain => drain(cryp, target, log),
|
Skill::Drain => drain(cryp, target, log),
|
||||||
@ -544,7 +562,7 @@ impl Skill {
|
|||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
// Skill::Precision => panic!("nyi"),
|
// Skill::Precision => panic!("nyi"),
|
||||||
Skill::Inspire => panic!("nyi"), // increased phys dmg
|
Skill::Empower => empower(cryp, target, log), // increased phys dmg
|
||||||
Skill::Slay => panic!("nyi"), // phys dmg mult by target magic dmg
|
Skill::Slay => panic!("nyi"), // phys dmg mult by target magic dmg
|
||||||
Skill::Shield => panic!("nyi"), // target is immune to magic dmg and fx
|
Skill::Shield => panic!("nyi"), // target is immune to magic dmg and fx
|
||||||
Skill::Silence => silence(cryp, target, log), // target cannot cast spells
|
Skill::Silence => silence(cryp, target, log), // target cannot cast spells
|
||||||
@ -576,6 +594,8 @@ impl Skill {
|
|||||||
Skill::Stun => 2,
|
Skill::Stun => 2,
|
||||||
Skill::Block => 1,
|
Skill::Block => 1,
|
||||||
|
|
||||||
|
Skill::Empower => 2,
|
||||||
|
|
||||||
Skill::Decay => 3,
|
Skill::Decay => 3,
|
||||||
Skill::Drain => 3,
|
Skill::Drain => 3,
|
||||||
Skill::Triage => 3,
|
Skill::Triage => 3,
|
||||||
@ -608,26 +628,18 @@ fn attack(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn stun(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
fn stun(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
||||||
if !target.immune(Skill::Stun) {
|
let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration(), tick: None };
|
||||||
let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration(), tick: None };
|
target.effects.push(stun);
|
||||||
target.effects.push(stun);
|
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration));
|
||||||
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration));
|
|
||||||
} else {
|
|
||||||
log.push(format!("{:?} -> {:?} | {:?} immune", cryp.name, target.name, target.name));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn throw(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
fn throw(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
||||||
if !target.immune(Skill::Throw) {
|
let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration(), tick: None };
|
||||||
let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration(), tick: None };
|
let vulnerable = CrypEffect { effect: Effect::Vulnerable, duration: Skill::Stun.duration(), tick: None };
|
||||||
let vulnerable = CrypEffect { effect: Effect::Vulnerable, duration: Skill::Stun.duration(), tick: None };
|
target.effects.push(stun);
|
||||||
target.effects.push(stun);
|
target.effects.push(vulnerable);
|
||||||
target.effects.push(vulnerable);
|
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration));
|
||||||
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration));
|
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, vulnerable.effect, vulnerable.duration));
|
||||||
log.push(format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, vulnerable.effect, vulnerable.duration));
|
|
||||||
} else {
|
|
||||||
log.push(format!("{:?} -> {:?} | {:?} immune", cryp.name, target.name, target.name));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -643,6 +655,12 @@ fn snare(_cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
|||||||
log.push(format!("{:?} < {:?} for {:?}T", target.name, effect.effect, effect.duration));
|
log.push(format!("{:?} < {:?} for {:?}T", target.name, effect.effect, effect.duration));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn empower(_cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
||||||
|
let effect = CrypEffect { effect: Effect::Empower, duration: Skill::Empower.duration(), tick: None };
|
||||||
|
target.effects.push(effect);
|
||||||
|
log.push(format!("{:?} < {:?} for {:?}T", target.name, effect.effect, effect.duration));
|
||||||
|
}
|
||||||
|
|
||||||
fn heal(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
fn heal(cryp: &mut Cryp, target: &mut Cryp, log: &mut Log) {
|
||||||
let (healing, overhealing) = target.heal(cryp.phys_dmg());
|
let (healing, overhealing) = target.heal(cryp.phys_dmg());
|
||||||
log.push(format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing));
|
log.push(format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user