reimplement animations

This commit is contained in:
ntr
2019-12-18 16:32:29 +10:00
parent 14ddc0b237
commit 90bffcb6b7
8 changed files with 161 additions and 188 deletions
+71 -72
View File
@@ -1596,54 +1596,53 @@ mod tests {
// }
// #[test]
// fn sleep_cooldown_test() {
// let mut game = create_test_game();
#[test]
fn sleep_cooldown_test() {
let mut game = create_test_game();
// let x_player = game.players[0].clone();
// let y_player = game.players[1].clone();
let x_player = game.players[0].clone();
let y_player = game.players[1].clone();
// let x_construct = x_player.constructs[0].clone();
// let y_construct = y_player.constructs[0].clone();
let x_construct = x_player.constructs[0].clone();
let y_construct = y_player.constructs[0].clone();
// for _n in 1..10 {
// // should auto progress back to skill phase
// assert!(game.phase == Phase::Skill);
for _n in 1..10 {
// should auto progress back to skill phase
assert!(game.phase == Phase::Skill);
// // Sleep 2T CD
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
// Sleep 2T CD
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
// game.player_ready(x_player.id).unwrap();
// game.player_ready(y_player.id).unwrap();
// game = game.resolve_phase_start();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start();
// // Sleep 1T CD
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
// Sleep 1T CD
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
// game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Decay).unwrap();
// // game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Attack).unwrap();
// game.player_ready(x_player.id).unwrap();
// game.player_ready(y_player.id).unwrap();
// game = game.resolve_phase_start();
game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Decay).unwrap();
// game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Attack).unwrap();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start();
// // Sleep 0T CD (we use it here)
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_none());
// Sleep 0T CD (we use it here)
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_none());
// game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Sleep).unwrap();
// game.player_ready(x_player.id).unwrap();
// game.player_ready(y_player.id).unwrap();
// game = game.resolve_phase_start();
game.add_skill(x_player.id, x_construct.id, y_construct.id, Skill::Sleep).unwrap();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start();
// // Sleep back to 2T CD
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
// assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
// }
// }
// Sleep back to 2T CD
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Decay).is_none());
assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Sleep).is_some());
}
}
// #[test]
// fn counter_test() {
@@ -1885,52 +1884,52 @@ mod tests {
// }
// }
// #[test]
// fn ko_pve_test() {
// let mut game = create_2v2_test_game();
#[test]
fn ko_pve_test() {
let mut game = create_2v2_test_game();
// let i_player = game.players[0].clone();
// let x_player = game.players[1].clone();
let i_player = game.players[0].clone();
let x_player = game.players[1].clone();
// let i_construct = i_player.constructs[0].clone();
// let j_construct = i_player.constructs[1].clone();
// let x_construct = x_player.constructs[0].clone();
// let y_construct = x_player.constructs[1].clone();
let i_construct = i_player.constructs[0].clone();
let j_construct = i_player.constructs[1].clone();
let x_construct = x_player.constructs[0].clone();
let y_construct = x_player.constructs[1].clone();
// game.add_skill(i_player.id, i_construct.id, x_construct.id, Skill::Attack).unwrap()
// .add_skill(i_player.id, j_construct.id, x_construct.id, Skill::Attack).unwrap()
// .add_skill(x_player.id, x_construct.id, i_construct.id, Skill::Attack).unwrap()
// .add_skill(x_player.id, y_construct.id, i_construct.id, Skill::Attack).unwrap()
// .player_ready(i_player.id).unwrap()
// .player_ready(x_player.id).unwrap();
game.add_skill(i_player.id, i_construct.id, x_construct.id, Skill::Attack).unwrap()
.add_skill(i_player.id, j_construct.id, x_construct.id, Skill::Attack).unwrap()
.add_skill(x_player.id, x_construct.id, i_construct.id, Skill::Attack).unwrap()
.add_skill(x_player.id, y_construct.id, i_construct.id, Skill::Attack).unwrap()
.player_ready(i_player.id).unwrap()
.player_ready(x_player.id).unwrap();
// assert!(game.skill_phase_finished());
// game = game.resolve_phase_start();
assert!(game.skill_phase_finished());
game = game.resolve_phase_start();
// assert!([Phase::Skill, Phase::Finished].contains(&game.phase));
assert!([Phase::Skill, Phase::Finished].contains(&game.phase));
// // kill a construct
// game.player_by_id(i_player.id).unwrap().construct_by_id(i_construct.id).unwrap().green_life.reduce(usize::max_value());
// kill a construct
game.player_by_id(i_player.id).unwrap().construct_by_id(i_construct.id).unwrap().green_life.reduce(usize::max_value());
// assert!(game.player_by_id(i_player.id).unwrap().skills_required() == 1);
// assert!(game.player_by_id(x_player.id).unwrap().skills_required() == 2);
assert!(game.player_by_id(i_player.id).unwrap().skills_required() == 1);
assert!(game.player_by_id(x_player.id).unwrap().skills_required() == 2);
// // add some more skills
// game.add_skill(i_player.id, j_construct.id, x_construct.id, Skill::Attack).unwrap();
// game.add_skill(x_player.id, x_construct.id, j_construct.id, Skill::Attack).unwrap();
// game.add_skill(x_player.id, y_construct.id, j_construct.id, Skill::Attack).unwrap();
// assert!(game.add_skill(x_player.id, x_construct.id, i_construct.id, Skill::Attack).is_err());
// add some more skills
game.add_skill(i_player.id, j_construct.id, x_construct.id, Skill::Attack).unwrap();
game.add_skill(x_player.id, x_construct.id, j_construct.id, Skill::Attack).unwrap();
game.add_skill(x_player.id, y_construct.id, j_construct.id, Skill::Attack).unwrap();
assert!(game.add_skill(x_player.id, x_construct.id, i_construct.id, Skill::Attack).is_err());
// game.player_ready(i_player.id).unwrap();
// game.player_ready(x_player.id).unwrap();
game.player_ready(i_player.id).unwrap();
game.player_ready(x_player.id).unwrap();
// assert!(game.skill_phase_finished());
// game = game.resolve_phase_start();
assert!(game.skill_phase_finished());
game = game.resolve_phase_start();
// assert!(game.player_by_id(i_player.id).unwrap().skills_required() == 1);
// assert!(game.player_by_id(x_player.id).unwrap().skills_required() == 2);
// return;
// }
assert!(game.player_by_id(i_player.id).unwrap().skills_required() == 1);
assert!(game.player_by_id(x_player.id).unwrap().skills_required() == 2);
return;
}
// #[test]
// fn tick_removal_test() {
+51
View File
@@ -1,10 +1,13 @@
use uuid::Uuid;
use std::iter;
use rand::prelude::*;
use construct::{Construct};
use names::{name};
use player::{Player};
use game::{Game};
use skill::{Skill, Cast};
pub fn generate_mob() -> Construct {
let mob = Construct::new()
@@ -28,3 +31,51 @@ pub fn bot_player() -> Player {
Player::new(bot_id, None, &name(), constructs).set_bot(true)
}
pub fn anim_test_game(skill: Skill) -> Game {
let mut rng = thread_rng();
let mut game = Game::new();
game
.set_player_num(2)
.set_player_constructs(3);
let x_id = Uuid::parse_str("8552e0bf-340d-4fc8-b6fc-cccccccccccc").unwrap();
let constructs = iter::repeat_with(||
generate_mob()
.set_account(x_id)
.learn(Skill::Attack))
.take(3)
.collect::<Vec<Construct>>();
let x_player = Player::new(x_id, None, &name(), constructs);
let id = Uuid::new_v4();
let constructs = iter::repeat_with(||
generate_mob()
.set_account(id)
.learn(Skill::Attack))
.take(3)
.collect::<Vec<Construct>>();
let y_player = Player::new(id, None, &name(), constructs);
game
.player_add(x_player).unwrap()
.player_add(y_player).unwrap();
game = game.start();
let x_id = game.players[0].id;
let x_construct = game.players[0].constructs[1].id;
let y_id = game.players[1].id;
let y_construct = game.players[1].constructs[1].id;
let cast = match rng.gen_bool(0.5) {
true => Cast::new(x_construct, x_id, y_construct, skill),
false => Cast::new(y_construct, y_id, x_construct, skill),
};
game.stack.push(cast);
game = game.resolve_phase_start();
return game;
}
+11 -25
View File
@@ -199,20 +199,6 @@ impl Cast {
}
}
// pub fn dev_resolve(a_id: Uuid, b_id: Uuid, skill: Skill) {
// let mut resolutions =vec![];
// let mut a = Construct::new();
// a.id = a_id;
// let mut b = Construct::new();
// b.id = b_id;
// if skill.aoe() { // Send an aoe skill event for anims
// game.event(Event::new(&a, &b).event(Event::AoeSkill { skill }).stages(EventStages::StartEnd));
// }
// return cast_actions(skill, &mut a, &mut b, resolutions);
// }
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum Skill {
Attack,
@@ -894,7 +880,7 @@ fn attack(cast: Cast, game: &mut Game, values: Attack) {
enum Blast { Base, Plus, PlusPlus, Hybrid }
impl Blast {
fn dmg_multi(self) -> usize {
match self {
match self {
Blast::Base => 105,
Blast::Plus => 125,
Blast::PlusPlus => 145,
@@ -931,7 +917,7 @@ impl Chaos {
fn description(self) -> String {
format!("Hits twice for red and blue damage. Damage {:?}% RedPower and BluePower.
Randomly deals 0 to 30% more damage.", self.dmg_multi())
}
}
}
fn chaos(cast: Cast, game: &mut Game, values: Chaos) {
@@ -961,7 +947,7 @@ impl Heal {
}
fn description(self) -> String {
format!("Heals target for {:?}% GreenPower.", self.heal_multiplier())
}
}
}
@@ -1283,7 +1269,7 @@ impl Absorb {
Absorption increases RedPower and BluePower based on damage taken.
Absorption lasts {:?}T. Recharges BlueLife based on {:?}% BluePower.",
self.duration(),
match self {
match self {
Absorb::Base => Absorption::Base.duration(),
Absorb::Plus => Absorption::Plus.duration(),
Absorb::PlusPlus => Absorption::PlusPlus.duration(),
@@ -1297,7 +1283,7 @@ fn absorb(cast: Cast, game: &mut Game, values: Absorb) {
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect {
effect: ConstructEffect {
effect: Effect::Absorb,
duration: values.duration(),
meta: Some(EffectMeta::CastOnHit(values.absorption_skill())) },
@@ -1483,7 +1469,7 @@ fn curse(cast: Cast, game: &mut Game, values: Curse) {
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect {
effect: ConstructEffect {
effect: Effect::Curse,
duration: values.curse_duration(),
meta: Some(EffectMeta::Multiplier(values.curse_multi()))
@@ -1603,10 +1589,10 @@ fn decay(cast: Cast, game: &mut Game, values: Decay) {
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect {
effect: ConstructEffect {
effect: Effect::Wither,
duration: values.wither_duration(),
meta: Some(EffectMeta::Multiplier(values.wither_multiplier()))
meta: Some(EffectMeta::Multiplier(values.wither_multiplier()))
},
}
);
@@ -1653,11 +1639,11 @@ impl Electrify {
Electrify::PlusPlus => Skill::ElectrocutePlusPlus,
}
}
fn duration(self) -> u8 {
match self { Electrify::Base => 1, Electrify::Plus => 1, Electrify::PlusPlus => 2 }
}
fn description(self) -> String {
let electro = match self {
Electrify::Base => Electrocute::Base,
@@ -2228,4 +2214,4 @@ fn triage_tick(cast: Cast, game: &mut Game) {
effect: ConstructEffect { effect: Effect::Triaged, duration: 1, meta: None },
},
);
}
}