Skip to content

Commit 027e997

Browse files
committed
transporter change, transporter cant transport transporters targets... Fix double tick
1 parent 8840e69 commit 027e997

File tree

6 files changed

+107
-22
lines changed

6 files changed

+107
-22
lines changed

client/src/resources/lang/en_us.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@
428428

429429
"wiki.entry.role.transporter.title": "Transporter",
430430
"wiki.entry.role.transporter.abilities":"* Transport two players with each other.",
431-
"wiki.entry.role.transporter.attributes":"* Transporting a target swaps all visitors to them; for example, all visitors that visit target A will instead visit target B, and vice versa\n* You can transport yourself",
431+
"wiki.entry.role.transporter.attributes":"* Transporting a target swaps all visitors to them; for example, all visitors that visit target A will instead visit target B, and vice versa\n* You can transport yourself* Your targets do not change due to other transporters (your targets wont change due to your own transport either)",
432432

433433
"wiki.entry.role.sheriff.title": "Sheriff",
434434
"wiki.entry.role.sheriff.abilities":"* Interrogate a player to find out if they're innocent or suspicious",

server/src/game/mod.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -263,25 +263,30 @@ impl Game {
263263
pub mod test {
264264
use rand::{thread_rng, seq::SliceRandom};
265265

266-
use super::{Game, settings::Settings, role_list::{create_random_roles, RoleOutline}, player::{PlayerReference, test::mock_player}, phase::PhaseStateMachine, team::Teams};
266+
use super::{Game, settings::Settings, role_list::{create_random_roles, RoleOutline}, player::{PlayerReference, test::mock_player}, phase::PhaseStateMachine, team::Teams, RejectStartReason};
267267

268-
pub fn mock_game(mut settings: Settings, number_of_players: usize) -> Game {
268+
pub fn mock_game(settings: Settings, number_of_players: usize) -> Result<Game, RejectStartReason> {
269+
270+
//check settings are not completly off the rails
271+
if [
272+
settings.phase_times.evening, settings.phase_times.morning,
273+
settings.phase_times.discussion, settings.phase_times.voting,
274+
settings.phase_times.judgement, settings.phase_times.testimony,
275+
settings.phase_times.night,
276+
].iter().all(|t| *t == 0) {
277+
return Err(RejectStartReason::ZeroTimeGame);
278+
}
279+
269280
let mut roles = match create_random_roles(&settings.excluded_roles, &settings.role_list){
270281
Some(roles) => {
271282
roles
272283
},
273284
None => {
274-
let mut new_list = vec![];
275-
for _ in 0..number_of_players{
276-
new_list.push(RoleOutline::Any);
277-
}
278-
settings.role_list = new_list;
279-
settings.excluded_roles = vec![];
280-
create_random_roles(&settings.excluded_roles, &settings.role_list).expect("All any with no exclusions should have open roles")
285+
return Err(RejectStartReason::RoleListCannotCreateRoles);
281286
}
282287
};
283288
roles.shuffle(&mut thread_rng());
284-
289+
285290
let mut players = Vec::new();
286291
for player_index in 0..number_of_players {
287292
let new_player = mock_player(
@@ -293,7 +298,7 @@ pub mod test {
293298
);
294299
players.push(new_player);
295300
}
296-
drop(roles);
301+
drop(roles); // Ensure we don't use the order of roles anywhere
297302

298303
let mut game = Game{
299304
ticking: true,
@@ -308,13 +313,14 @@ pub mod test {
308313
player_ref.send_join_game_data(&mut game);
309314
}
310315

316+
//on role creation needs to be called after all players roles are known
311317
for player_ref in PlayerReference::all_players(&game){
312318
let role_data_copy = player_ref.role_state(&game).clone();
313319
player_ref.set_role(&mut game, role_data_copy);
314320
}
315321

316322
Teams::on_team_creation(&mut game);
317-
318-
game
323+
324+
Ok(game)
319325
}
320326
}

server/src/game/role/transporter.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::game::end_game_condition::EndGameCondition;
88
use crate::game::visit::Visit;
99
use crate::game::Game;
1010
use crate::game::team::Team;
11-
use super::{Priority, RoleStateImpl};
11+
use super::{Priority, RoleStateImpl, Role};
1212

1313
#[derive(Clone, Debug, Serialize, Default)]
1414
pub struct Transporter;
@@ -44,6 +44,7 @@ impl RoleStateImpl for Transporter {
4444

4545
for player_ref in PlayerReference::all_players(game){
4646
if player_ref == actor_ref {continue;}
47+
if player_ref.role(game) == Role::Transporter {continue;}
4748

4849
let new_visits = player_ref.night_visits(game).clone().into_iter().map(|mut v|{
4950
if v.target == first_visit.target {

server/src/listener.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ impl Listener{
3333
const DESIRED_FRAME_TIME: Duration = Duration::from_millis(1000);
3434

3535
tokio::spawn(async move {
36-
let mut last_tick = tokio::time::Instant::now();
36+
let mut frame_start_time = tokio::time::Instant::now();
3737
loop {
38-
let delta_time;
38+
let delta_time = frame_start_time.elapsed();
39+
frame_start_time = tokio::time::Instant::now();
3940

4041
if let Ok(mut listener) = listener.lock() {
4142
let mut closed_lobbies = Vec::new();
4243

43-
delta_time = last_tick.elapsed();
44-
last_tick = tokio::time::Instant::now();
44+
4545

4646
let Listener { ref mut lobbies, ref mut players } = *listener;
4747

@@ -74,7 +74,7 @@ impl Listener{
7474
return;
7575
}
7676

77-
tokio::time::sleep(DESIRED_FRAME_TIME.saturating_sub(delta_time)).await;
77+
tokio::time::sleep(DESIRED_FRAME_TIME.saturating_sub(tokio::time::Instant::now() - frame_start_time)).await;
7878
}
7979
});
8080
}

server/tests/kit/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@ pub mod _init {
6565
role_list.push(RoleOutline::Any);
6666
}
6767

68-
let mut game = mock_game(Settings {
68+
let mut game = match mock_game(Settings {
6969
role_list,
7070
..Default::default()
71-
}, roles.len());
71+
}, roles.len()){
72+
Ok(game) => game,
73+
Err(err) => panic!("Failed to create game: {:?}", err),
74+
};
7275

7376
let mut players = Vec::new();
7477

server/tests/role.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,3 +618,78 @@ fn transporter_cant_transport_dead() {
618618
assert_not_contains!(thomas.get_messages(), ChatMessage::Transported);
619619
assert_not_contains!(townie.get_messages(), ChatMessage::Transported);
620620
}
621+
622+
#[test]
623+
fn double_transport() {
624+
kit::scenario!(game in Night 1 where
625+
mafioso: Mafioso,
626+
627+
townie_a: Sheriff,
628+
townie_b: Jailor,
629+
630+
trans_a: Transporter,
631+
trans_b: Transporter
632+
);
633+
634+
assert!(mafioso.set_night_target(townie_a));
635+
636+
assert!(trans_a.set_night_targets(vec![townie_a, townie_b]));
637+
assert!(trans_b.set_night_targets(vec![townie_b, townie_a]));
638+
639+
game.next_phase();
640+
assert!(!townie_a.alive());
641+
assert!(townie_b.alive());
642+
}
643+
644+
645+
#[test]
646+
fn double_transport_single_player() {
647+
kit::scenario!(game in Night 1 where
648+
mafioso: Mafioso,
649+
650+
townie_a: Sheriff,
651+
townie_b: Jailor,
652+
townie_c: Vigilante,
653+
654+
trans_a: Transporter,
655+
trans_b: Transporter
656+
);
657+
658+
assert!(mafioso.set_night_target(townie_a));
659+
660+
assert!(trans_a.set_night_targets(vec![townie_a, townie_b]));
661+
assert!(trans_b.set_night_targets(vec![townie_a, townie_c]));
662+
663+
664+
game.next_phase();
665+
assert!(townie_a.alive());
666+
assert!(!townie_b.alive());
667+
assert!(townie_c.alive());
668+
}
669+
670+
#[test]
671+
fn double_transport_three_players() {
672+
kit::scenario!(game in Night 1 where
673+
mafioso: Mafioso,
674+
675+
townie_a: Sheriff,
676+
townie_b: Jailor,
677+
townie_c: Vigilante,
678+
679+
trans_a: Transporter,
680+
trans_b: Transporter,
681+
trans_c: Transporter
682+
);
683+
684+
assert!(mafioso.set_night_target(townie_a));
685+
686+
assert!(trans_a.set_night_targets(vec![townie_a, townie_b]));
687+
assert!(trans_b.set_night_targets(vec![townie_a, townie_c]));
688+
assert!(trans_c.set_night_targets(vec![townie_b, townie_c]));
689+
690+
691+
game.next_phase();
692+
assert!(townie_a.alive());
693+
assert!(townie_b.alive());
694+
assert!(!townie_c.alive());
695+
}

0 commit comments

Comments
 (0)