Merge branch 'combos' of ssh://cryps.gg:40022/~/cryps into combos

This commit is contained in:
Mashy 2019-02-20 18:49:11 +10:00
commit 3fc759f854
6 changed files with 62 additions and 61 deletions

View File

@ -175,8 +175,8 @@ module.exports = {
{ name: 'Decay', { name: 'Decay',
description: description:
'afflict a cryp with a blue damage based damage over time debuff' }, 'afflict a cryp with a blue damage based damage over time debuff' },
{ name: 'Drain', { name: 'Siphon',
description: 'drain hp from target cryp with a blue damage based debuff' }, description: 'siphon hp from target cryp with a blue damage based debuff' },
{ name: 'Empower', { name: 'Empower',
description: 'increase the red damage dealt by a cryp' }, description: 'increase the red damage dealt by a cryp' },
{ name: 'Haste', { name: 'Haste',

View File

@ -847,7 +847,7 @@ mod tests {
.learn(Skill::TestTouch) .learn(Skill::TestTouch)
.learn(Skill::TestBlock) .learn(Skill::TestBlock)
.learn(Skill::TestParry) .learn(Skill::TestParry)
.learn(Skill::TestDrain) .learn(Skill::TestSiphon)
.learn(Skill::Empower) .learn(Skill::Empower)
.learn(Skill::Stun) .learn(Skill::Stun)
.learn(Skill::Block) .learn(Skill::Block)
@ -861,7 +861,7 @@ mod tests {
.learn(Skill::TestTouch) .learn(Skill::TestTouch)
.learn(Skill::TestBlock) .learn(Skill::TestBlock)
.learn(Skill::TestParry) .learn(Skill::TestParry)
.learn(Skill::TestDrain) .learn(Skill::TestSiphon)
.learn(Skill::Empower) .learn(Skill::Empower)
.learn(Skill::Stun) .learn(Skill::Stun)
.learn(Skill::Block) .learn(Skill::Block)
@ -1081,7 +1081,7 @@ mod tests {
} }
#[test] #[test]
fn drain_test() { fn siphon_test() {
let mut game = create_test_game(); let mut game = create_test_game();
let x_team = game.teams[0].clone(); let x_team = game.teams[0].clone();
@ -1090,7 +1090,7 @@ mod tests {
let x_cryp = x_team.cryps[0].clone(); let x_cryp = x_team.cryps[0].clone();
let y_cryp = y_team.cryps[0].clone(); let y_cryp = y_team.cryps[0].clone();
let _x_drain_id = game.add_skill(x_team.id, x_cryp.id, Some(y_cryp.id), Skill::TestDrain).unwrap(); let _x_siphon_id = game.add_skill(x_team.id, x_cryp.id, Some(y_cryp.id), Skill::TestSiphon).unwrap();
let _y_touch_id = game.add_skill(y_team.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); let _y_touch_id = game.add_skill(y_team.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap();
game.resolve_phase_start(); game.resolve_phase_start();
@ -1100,7 +1100,7 @@ mod tests {
game.resolve_phase_start(); game.resolve_phase_start();
assert!(game.resolved.iter().any(|r| r.skill == Skill::DrainTick)); assert!(game.resolved.iter().any(|r| r.skill == Skill::SiphonTick));
} }
#[test] #[test]

View File

@ -938,7 +938,7 @@ mod tests {
.learn(Skill::TestTouch) .learn(Skill::TestTouch)
.learn(Skill::TestBlock) .learn(Skill::TestBlock)
.learn(Skill::TestParry) .learn(Skill::TestParry)
.learn(Skill::TestDrain) .learn(Skill::TestSiphon)
.learn(Skill::Empower) .learn(Skill::Empower)
.learn(Skill::Block) .learn(Skill::Block)
.create(); .create();
@ -950,7 +950,7 @@ mod tests {
.learn(Skill::TestTouch) .learn(Skill::TestTouch)
.learn(Skill::TestBlock) .learn(Skill::TestBlock)
.learn(Skill::TestParry) .learn(Skill::TestParry)
.learn(Skill::TestDrain) .learn(Skill::TestSiphon)
.learn(Skill::Empower) .learn(Skill::Empower)
.learn(Skill::Block) .learn(Skill::Block)
.create(); .create();
@ -1194,7 +1194,7 @@ mod tests {
} }
#[test] #[test]
fn drain_test() { fn siphon_test() {
let mut game = create_test_game(); let mut game = create_test_game();
let x_team = game.teams[0].clone(); let x_team = game.teams[0].clone();
@ -1203,13 +1203,13 @@ mod tests {
let x_cryp = x_team.cryps[0].clone(); let x_cryp = x_team.cryps[0].clone();
let y_cryp = y_team.cryps[0].clone(); let y_cryp = y_team.cryps[0].clone();
let x_drain_id = game.add_skill(x_team.id, x_cryp.id, Some(y_team.id), Skill::TestDrain).unwrap(); let x_siphon_id = game.add_skill(x_team.id, x_cryp.id, Some(y_team.id), Skill::TestSiphon).unwrap();
let y_touch_id = game.add_skill(y_team.id, y_cryp.id, Some(x_team.id), Skill::TestTouch).unwrap(); let y_touch_id = game.add_skill(y_team.id, y_cryp.id, Some(x_team.id), Skill::TestTouch).unwrap();
game.target_phase_start(); game.target_phase_start();
game.add_target(x_team.id, x_cryp.id, y_touch_id).unwrap(); game.add_target(x_team.id, x_cryp.id, y_touch_id).unwrap();
game.add_target(y_team.id, y_cryp.id, x_drain_id).unwrap(); game.add_target(y_team.id, y_cryp.id, x_siphon_id).unwrap();
game.resolve_phase_start(); game.resolve_phase_start();
@ -1218,7 +1218,7 @@ mod tests {
game.target_phase_start(); game.target_phase_start();
assert!(game.resolved.iter().any(|r| r.skill == Skill::DrainTick)); assert!(game.resolved.iter().any(|r| r.skill == Skill::SiphonTick));
} }
#[test] #[test]

View File

@ -291,7 +291,7 @@ impl Rpc {
let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?; let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Decay }, tx, &account)?; cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Decay }, tx, &account)?;
cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Blast }, tx, &account)?; cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Blast }, tx, &account)?;
cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Drain }, tx, &account)?; cryp_learn(CrypLearnParams { id: cryp.id, skill: Skill::Siphon }, tx, &account)?;
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?; let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?;

View File

@ -125,9 +125,9 @@ pub enum Effect {
Triage, Triage,
Decay, Decay,
Regen, Regen,
Drain, Siphon,
SpeedDrain, SpeedSiphon,
SpeedIncrease, SpeedIncrease,
Ko, Ko,
@ -249,9 +249,9 @@ impl Effect {
Effect::Triage => Category::BlueBuff, Effect::Triage => Category::BlueBuff,
Effect::Decay => Category::BlueDebuff, Effect::Decay => Category::BlueDebuff,
Effect::Regen => Category::BlueBuff, Effect::Regen => Category::BlueBuff,
Effect::Drain => Category::BlueDebuff, Effect::Siphon => Category::BlueDebuff,
Effect::SpeedDrain => Category::BlueDebuff, Effect::SpeedSiphon => Category::BlueDebuff,
Effect::SpeedIncrease => Category::BlueBuff, Effect::SpeedIncrease => Category::BlueBuff,
Effect::Ko => Category::Ko, Effect::Ko => Category::Ko,
@ -283,7 +283,7 @@ impl Effect {
Effect::Triage => 3, Effect::Triage => 3,
Effect::Decay => 3, Effect::Decay => 3,
Effect::Drain => 2, Effect::Siphon => 2,
_ => { _ => {
println!("{:?} does not have a duration", self); println!("{:?} does not have a duration", self);
@ -360,8 +360,8 @@ pub enum Skill {
Amplify, Amplify,
Decay, // dot Decay, // dot
DecayTick, // dot DecayTick, // dot
Drain, Siphon,
DrainTick, SiphonTick,
Curse, Curse,
Plague, // aoe dot Plague, // aoe dot
Ruin, // aoe Ruin, // aoe
@ -394,7 +394,7 @@ pub enum Skill {
TestStun, TestStun,
TestBlock, TestBlock,
TestParry, TestParry,
TestDrain, TestSiphon,
} }
impl Skill { impl Skill {
@ -443,8 +443,8 @@ impl Skill {
Skill::Amplify => Some(1), Skill::Amplify => Some(1),
Skill::Decay => None, // dot Skill::Decay => None, // dot
Skill::DecayTick => None, Skill::DecayTick => None,
Skill::Drain => Some(1), Skill::Siphon => Some(1),
Skill::DrainTick => None, Skill::SiphonTick => None,
Skill::Curse => Some(1), Skill::Curse => Some(1),
Skill::Plague => Some(1), // aoe dot Skill::Plague => Some(1), // aoe dot
Skill::Ruin => Some(2), // aoe Skill::Ruin => Some(2), // aoe
@ -478,7 +478,7 @@ impl Skill {
Skill::TestTouch => None, Skill::TestTouch => None,
Skill::TestStun => None, Skill::TestStun => None,
Skill::TestBlock => None, Skill::TestBlock => None,
Skill::TestDrain => None, Skill::TestSiphon => None,
Skill::TestParry => None, Skill::TestParry => None,
} }
} }
@ -528,8 +528,8 @@ impl Skill {
Skill::Amplify => Category::Blue, Skill::Amplify => Category::Blue,
Skill::Decay => Category::Blue, // dot Skill::Decay => Category::Blue, // dot
Skill::DecayTick => Category::BlueTick, // hot Skill::DecayTick => Category::BlueTick, // hot
Skill::Drain => Category::Blue, Skill::Siphon => Category::Blue,
Skill::DrainTick => Category::BlueTick, // hot Skill::SiphonTick => Category::BlueTick, // hot
Skill::Curse => Category::Blue, Skill::Curse => Category::Blue,
Skill::Plague => Category::Blue, // aoe dot Skill::Plague => Category::Blue, // aoe dot
Skill::Ruin => Category::Blue, // aoe Skill::Ruin => Category::Blue, // aoe
@ -566,7 +566,7 @@ impl Skill {
Skill::TestStun => Category::Red, Skill::TestStun => Category::Red,
Skill::TestParry => Category::Red, Skill::TestParry => Category::Red,
Skill::TestBlock => Category::Red, Skill::TestBlock => Category::Red,
Skill::TestDrain => Category::Blue, Skill::TestSiphon => Category::Blue,
} }
} }
@ -574,7 +574,7 @@ impl Skill {
match self { match self {
Skill::TriageTick => true, Skill::TriageTick => true,
Skill::DecayTick => true, Skill::DecayTick => true,
Skill::DrainTick => true, Skill::SiphonTick => true,
_ => false, _ => false,
} }
} }
@ -607,8 +607,8 @@ impl Skill {
// general combat // general combat
Skill::DecayTick => 2, // hot Skill::DecayTick => 2, // hot
Skill::Drain => 2, Skill::Siphon => 2,
Skill::DrainTick => 2, // hot Skill::SiphonTick => 2, // hot
Skill::Hex => 2, Skill::Hex => 2,
Skill::Pause => 2, // extend durations Skill::Pause => 2, // extend durations
Skill::Plague => 2, // aoe dot Skill::Plague => 2, // aoe dot
@ -644,7 +644,7 @@ impl Skill {
Skill::TestStun => 5, Skill::TestStun => 5,
Skill::TestBlock => 10, Skill::TestBlock => 10,
Skill::TestParry => 10, Skill::TestParry => 10,
Skill::TestDrain => 10, Skill::TestSiphon => 10,
} }
} }
@ -715,8 +715,8 @@ impl Skill {
Skill::Amplify => amplify(source, target, resolution), // increase magic damage Skill::Amplify => amplify(source, target, resolution), // increase magic damage
Skill::Decay => decay(source, target, resolution), // dot Skill::Decay => decay(source, target, resolution), // dot
Skill::DecayTick => decay_tick(source, target, resolution), // dot Skill::DecayTick => decay_tick(source, target, resolution), // dot
Skill::Drain => drain(source, target, resolution), Skill::Siphon => siphon(source, target, resolution),
Skill::DrainTick => drain_tick(source, target, resolution), // hot Skill::SiphonTick => siphon_tick(source, target, resolution), // hot
Skill::Curse => curse(source, target, resolution), Skill::Curse => curse(source, target, resolution),
Skill::Plague => panic!("nyi"), // dot that spreads every turn Skill::Plague => panic!("nyi"), // dot that spreads every turn
Skill::Ruin => panic!("nyi"), // aoe version of blast Skill::Ruin => panic!("nyi"), // aoe version of blast
@ -751,7 +751,7 @@ impl Skill {
Skill::TestStun => stun(source, target, resolution), Skill::TestStun => stun(source, target, resolution),
Skill::TestBlock => block(source, target, resolution), Skill::TestBlock => block(source, target, resolution),
Skill::TestParry => parry(source, target, resolution), Skill::TestParry => parry(source, target, resolution),
Skill::TestDrain => drain(source, target, resolution), Skill::TestSiphon => siphon(source, target, resolution),
} }
} }
@ -915,28 +915,28 @@ fn curse(_cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Res
return resolution;; return resolution;;
} }
fn drain(cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution { fn siphon(cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution {
let drain = CrypEffect { let siphon = CrypEffect {
effect: Effect::Drain, effect: Effect::Siphon,
duration: Effect::Drain.duration(), duration: Effect::Siphon.duration(),
tick: Some(Cast::new_tick(cryp, target, Skill::DrainTick)), tick: Some(Cast::new_tick(cryp, target, Skill::SiphonTick)),
}; };
resolution.results.push(target.add_effect(Skill::Drain, drain)); resolution.results.push(target.add_effect(Skill::Siphon, siphon));
return resolution;; return resolution;;
} }
fn drain_tick(cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution { fn siphon_tick(cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution {
let amount = cryp.blue_damage(); let amount = cryp.blue_damage();
let drain_damage = target.deal_blue_damage(Skill::DrainTick, amount); let siphon_damage = target.deal_blue_damage(Skill::SiphonTick, amount);
resolution.results.push(drain_damage.clone()); resolution.results.push(siphon_damage.clone());
match drain_damage { match siphon_damage {
ResolutionResult::Damage { amount, mitigation, category: _, immunity } => { ResolutionResult::Damage { amount, mitigation, category: _, immunity } => {
if !immunity.immune { if !immunity.immune {
resolution.results.push(cryp.heal(Skill::Heal, amount)); resolution.results.push(cryp.heal(Skill::Heal, amount));
} }
}, },
_ => panic!("drain tick damage not dealt {:?}", drain_damage), _ => panic!("siphon tick damage not dealt {:?}", siphon_damage),
} }
return resolution; return resolution;

View File

@ -18,7 +18,7 @@ use rpc::{VboxStateParams, VboxAcceptParams, VboxDiscardParams, VboxCombineParam
use skill::{Skill}; use skill::{Skill};
use cryp::{cryp_get, cryp_write}; use cryp::{cryp_get, cryp_write};
#[derive(Debug,Clone,Copy,PartialEq,Eq,Ord,PartialOrd,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum Var { pub enum Var {
Blue, Blue,
Green, Green,
@ -50,6 +50,8 @@ pub enum Var {
Snare, Snare,
Strangle, Strangle,
Strike, Strike,
Siphon,
Survival,
Taunt, Taunt,
Throw, Throw,
Toxic, Toxic,
@ -90,18 +92,17 @@ impl Var {
Var::Snare => Ok(Skill::Snare), Var::Snare => Ok(Skill::Snare),
Var::Strangle => Ok(Skill::Strangle), Var::Strangle => Ok(Skill::Strangle),
// Var::Strike => Ok(Skill::Strike), // Var::Strike => Ok(Skill::Strike),
// Var::Survival => Ok(Skill::Survival),
// Var::Taunt => Ok(Skill::Taunt), // Var::Taunt => Ok(Skill::Taunt),
Var::Throw => Ok(Skill::Throw), Var::Throw => Ok(Skill::Throw),
// Var::Toxic => Ok(Skill::Toxic), // Var::Toxic => Ok(Skill::Toxic),
Var::Triage => Ok(Skill::Triage), Var::Triage => Ok(Skill::Triage),
_ => Err(err_msg("not a usable var")) _ => Err(err_msg("not a usable var"))
} }
} }
} }
#[derive(Debug,Clone,Copy,PartialEq,Eq,Ord,PartialOrd,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
enum ColourCode { enum ColourCode {
RR, RR,
GG, GG,
@ -239,16 +240,16 @@ impl Vbox {
ColourCode::RR => Var::Parry, ColourCode::RR => Var::Parry,
ColourCode::GG => Var::Reflect, ColourCode::GG => Var::Reflect,
ColourCode::BB => Var::Toxic, ColourCode::BB => Var::Toxic,
ColourCode::RG => Var::Shield, // ColourCode::RG => Var::Taunt,
ColourCode::GB => return Err(err_msg("unhandled skill combo")), ColourCode::GB => Var::Shield,
ColourCode::BR => Var::Taunt, ColourCode::BR => return Err(err_msg("unhandled skill combo")),
}, },
Var::Buff => match colour_code { Var::Buff => match colour_code {
ColourCode::RR => Var::Empower, ColourCode::RR => Var::Empower,
ColourCode::GG => Var::Triage, ColourCode::GG => Var::Triage,
ColourCode::BB => Var::Amplify, ColourCode::BB => Var::Amplify,
ColourCode::RG => return Err(err_msg("unhandled skill combo")), ColourCode::RG => Var::Survival,
ColourCode::GB => Var::Purify, ColourCode::GB => return Err(err_msg("unhandled skill combo")),
ColourCode::BR => Var::Haste, ColourCode::BR => Var::Haste,
}, },
Var::Debuff => match colour_code { Var::Debuff => match colour_code {
@ -256,16 +257,16 @@ impl Vbox {
ColourCode::GG => Var::Purge, ColourCode::GG => Var::Purge,
ColourCode::BB => Var::Curse, ColourCode::BB => Var::Curse,
ColourCode::RG => return Err(err_msg("unhandled skill combo")), ColourCode::RG => return Err(err_msg("unhandled skill combo")),
ColourCode::GB => return Err(err_msg("unhandled skill combo")), ColourCode::GB => Var::Siphon,
ColourCode::BR => Var::Slow, // ColourCode::BR => Var::Slow,
}, },
Var::Stun => match colour_code { Var::Stun => match colour_code {
ColourCode::RR => Var::Strangle, ColourCode::RR => Var::Strangle,
ColourCode::GG => Var::Throw, ColourCode::GG => Var::Throw,
ColourCode::BB => Var::Ruin, ColourCode::BB => Var::Ruin,
ColourCode::RG => Var::Silence, // ColourCode::RG => return Err(err_msg("unhandled skill combo")),
ColourCode::GB => return Err(err_msg("unhandled skill combo")), ColourCode::GB => Var::Silence,
ColourCode::BR => Var::Hex, // ColourCode::BR => Var::Hex,
}, },
_ => panic!("wrong base {:?}", base), _ => panic!("wrong base {:?}", base),
}; };
@ -308,7 +309,7 @@ pub fn vbox_write(vbox: Vbox, tx: &mut Transaction) -> Result<Vbox, Error> {
let result = tx let result = tx
.query(query, &[&vbox_bytes, &vbox.id])?; .query(query, &[&vbox_bytes, &vbox.id])?;
let _returned = result.iter().next().expect("no row returned"); result.iter().next().ok_or(err_msg("no vbox row returned"))?;
// println!("{:?} wrote vbox", vbox.id); // println!("{:?} wrote vbox", vbox.id);