fix forfeit waiting on game phase timeout
This commit is contained in:
parent
5874f040ad
commit
f002e9e283
@ -17,7 +17,7 @@ use events::{EventsTx, Event};
|
|||||||
use player::{Player, Score, player_create};
|
use player::{Player, Score, player_create};
|
||||||
use construct::{Construct, construct_get};
|
use construct::{Construct, construct_get};
|
||||||
use mob::{bot_player, instance_mobs};
|
use mob::{bot_player, instance_mobs};
|
||||||
use game::{Game, Phase, game_get, game_write};
|
use game::{Game, Phase, game_get, game_write, game_update};
|
||||||
use item::{Item};
|
use item::{Item};
|
||||||
use rpc::{RpcMessage};
|
use rpc::{RpcMessage};
|
||||||
use img;
|
use img;
|
||||||
@ -51,7 +51,7 @@ pub enum TimeControl {
|
|||||||
impl TimeControl {
|
impl TimeControl {
|
||||||
fn vbox_time_seconds(&self) -> i64 {
|
fn vbox_time_seconds(&self) -> i64 {
|
||||||
match self {
|
match self {
|
||||||
TimeControl::Standard => 180,
|
TimeControl::Standard => 10,
|
||||||
TimeControl::Slow => 240,
|
TimeControl::Slow => 240,
|
||||||
TimeControl::Practice => panic!("practice vbox seconds called"),
|
TimeControl::Practice => panic!("practice vbox seconds called"),
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ impl TimeControl {
|
|||||||
|
|
||||||
fn game_time_seconds(&self) -> i64 {
|
fn game_time_seconds(&self) -> i64 {
|
||||||
match self {
|
match self {
|
||||||
TimeControl::Standard => 60,
|
TimeControl::Standard => 10,
|
||||||
TimeControl::Slow => 120,
|
TimeControl::Slow => 120,
|
||||||
TimeControl::Practice => panic!("practice game seconds called"),
|
TimeControl::Practice => panic!("practice game seconds called"),
|
||||||
}
|
}
|
||||||
@ -139,28 +139,30 @@ impl Instance {
|
|||||||
.collect::<Vec<Uuid>>()
|
.collect::<Vec<Uuid>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn upkeep(mut self) -> (Instance, Vec<Game>) {
|
pub fn upkeep(mut self) -> (Instance, Option<Game>) {
|
||||||
// time out lobbies that have been open too long
|
// time out lobbies that have been open too long
|
||||||
if self.phase == InstancePhase::Lobby && self.phase_timed_out() {
|
if self.phase == InstancePhase::Lobby && self.phase_timed_out() {
|
||||||
self.finish();
|
self.finish();
|
||||||
return (self, vec![]);
|
return (self, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.phase != InstancePhase::InProgress {
|
if self.phase != InstancePhase::InProgress {
|
||||||
return (self, vec![]);
|
return (self, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.phase_timed_out() {
|
if !self.phase_timed_out() {
|
||||||
return (self, vec![]);
|
return (self, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_games = self
|
let new_game = self
|
||||||
.timed_out_players()
|
.timed_out_players()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|p| self.player_ready(*p).unwrap())
|
.filter_map(|p| self.player_ready(*p).unwrap())
|
||||||
.collect::<Vec<Game>>();
|
.collect::<Vec<Game>>()
|
||||||
|
.into_iter()
|
||||||
|
.next();
|
||||||
|
|
||||||
(self, new_games)
|
(self, new_game)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_name(mut self, name: String) -> Result<Instance, Error> {
|
fn set_name(mut self, name: String) -> Result<Instance, Error> {
|
||||||
@ -731,6 +733,10 @@ pub fn instance_ready(tx: &mut Transaction, account: &Account, instance_id: Uuid
|
|||||||
|
|
||||||
if let Some(game) = instance.player_ready(player_id)? {
|
if let Some(game) = instance.player_ready(player_id)? {
|
||||||
game_write(tx, &game)?;
|
game_write(tx, &game)?;
|
||||||
|
|
||||||
|
// ensures cleanup for warden etc is done
|
||||||
|
game_update(tx, &game)?;
|
||||||
|
|
||||||
instance_update(tx, instance)?;
|
instance_update(tx, instance)?;
|
||||||
return Ok(RpcMessage::GameState(game));
|
return Ok(RpcMessage::GameState(game));
|
||||||
}
|
}
|
||||||
@ -862,12 +868,12 @@ mod tests {
|
|||||||
|
|
||||||
let (mut instance, new_games) = instance.upkeep();
|
let (mut instance, new_games) = instance.upkeep();
|
||||||
|
|
||||||
assert_eq!(new_games.len(), 1);
|
assert!(new_games.is_some());
|
||||||
|
|
||||||
let game = &new_games[0];
|
let game = new_games.unwrap();
|
||||||
assert!(game.finished());
|
assert!(game.finished());
|
||||||
|
|
||||||
instance.game_finished(game).unwrap();
|
instance.game_finished(&game).unwrap();
|
||||||
|
|
||||||
assert_eq!(instance.rounds.len(), 2);
|
assert_eq!(instance.rounds.len(), 2);
|
||||||
assert!(instance.players.iter().all(|p| !p.ready));
|
assert!(instance.players.iter().all(|p| !p.ready));
|
||||||
|
|||||||
@ -131,11 +131,16 @@ fn fetch_games(mut tx: Transaction) -> Result<Transaction, Error> {
|
|||||||
|
|
||||||
fn fetch_instances(mut tx: Transaction) -> Result<Transaction, Error> {
|
fn fetch_instances(mut tx: Transaction) -> Result<Transaction, Error> {
|
||||||
for mut instance in instances_need_upkeep(&mut tx)? {
|
for mut instance in instances_need_upkeep(&mut tx)? {
|
||||||
let (instance, new_games) = instance.upkeep();
|
let (instance, new_game) = instance.upkeep();
|
||||||
for game in new_games {
|
|
||||||
|
if let Some(game) = new_game {
|
||||||
game_write(&mut tx, &game)?;
|
game_write(&mut tx, &game)?;
|
||||||
}
|
|
||||||
instance_update(&mut tx, instance)?;
|
instance_update(&mut tx, instance)?;
|
||||||
|
// ensures cleanup for forfeits etc is done
|
||||||
|
game_update(&mut tx, &game)?;
|
||||||
|
} else {
|
||||||
|
instance_update(&mut tx, instance)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for mut instance in instances_idle(&mut tx)? {
|
for mut instance in instances_idle(&mut tx)? {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user