diff --git a/server/src/game.rs b/server/src/game.rs index deab56c5..91027c04 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -175,6 +175,13 @@ impl Game { fn skill_phase_start(mut self) -> Game { self.phase_start = Utc::now(); + + for player in self.players.iter_mut() { + if player.skills_required() != 0 { + player.set_ready(false); + } + } + self.log.push("".to_string()); if ![Phase::Start, Phase::Resolve].contains(&self.phase) { @@ -236,6 +243,8 @@ impl Game { panic!("{:?} unable to add pve mob skill {:?}", e, s); }, } + + self.player_ready(player_id).unwrap(); } self @@ -1094,9 +1103,12 @@ mod tests { assert!(game.player_by_id(y_player.id).unwrap().cryps[0].skill_on_cd(Skill::Stun).is_some()); assert!(game.player_by_id(x_player.id).unwrap().cryps[0].skill_on_cd(Skill::Block).is_none()); - let _x_stun_id = game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::TestTouch).unwrap(); game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + game.player_ready(x_player.id).unwrap(); + game.player_ready(y_player.id).unwrap(); + game = game.resolve_phase_start(); // should auto progress back to skill phase @@ -1108,6 +1120,9 @@ mod tests { let _x_block_id = game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Stun).unwrap(); let _y_touch_id = game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + game.player_ready(x_player.id).unwrap(); + game.player_ready(y_player.id).unwrap(); + game = game.resolve_phase_start(); assert!(game.player_by_id(x_player.id).unwrap().cryps[0].skill_on_cd(Skill::Stun).is_some()); @@ -1127,6 +1142,9 @@ mod tests { let _x_block_id = game.add_skill(x_player.id, x_cryp.id, None, Skill::TestParry).unwrap(); game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestStun).unwrap(); + game.player_ready(x_player.id).unwrap(); + game.player_ready(y_player.id).unwrap(); + game = game.resolve_phase_start(); // should not be stunned because of parry @@ -1158,6 +1176,9 @@ mod tests { game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Ruin).unwrap(); game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).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(); @@ -1205,7 +1226,9 @@ mod tests { game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Taunt).unwrap(); game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); - assert!(game.skill_phase_finished()); + game.player_ready(i_player.id).unwrap(); + game.player_ready(x_player.id).unwrap(); + game = game.resolve_phase_start(); assert!(game.resolved.len() == 4); @@ -1234,6 +1257,9 @@ mod tests { game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).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(); @@ -1251,6 +1277,9 @@ mod tests { game.add_skill(x_player.id, y_cryp.id, Some(j_cryp.id), Skill::TestTouch).unwrap(); assert!(game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::TestTouch).is_err()); + game.player_ready(i_player.id).unwrap(); + game.player_ready(x_player.id).unwrap(); + assert!(game.skill_phase_finished()); game = game.resolve_phase_start(); diff --git a/server/src/instance.rs b/server/src/instance.rs index 29d3b4cf..bd2e8df3 100644 --- a/server/src/instance.rs +++ b/server/src/instance.rs @@ -294,7 +294,10 @@ impl Instance { game = game.start(); - assert!(game.finished()); + if !game.finished() { + panic!("game not finished {:?}", game) + } + let winner = match game.winner() { Some(w) => w, None => panic!("game has no winner {:?}", game),