diff options
-rw-r--r-- | client/game.gd | 3 | ||||
-rw-r--r-- | client/menu/entry.gd | 2 | ||||
-rw-r--r-- | server/protocol/src/lib.rs | 1 | ||||
-rw-r--r-- | server/replaytool/src/main.rs | 62 |
4 files changed, 41 insertions, 27 deletions
diff --git a/client/game.gd b/client/game.gd index 27c545f2..a1b7e538 100644 --- a/client/game.gd +++ b/client/game.gd @@ -353,6 +353,9 @@ func handle_packet(p): get_parent().replace_menu("res://menu/game.tscn", p.uri[0]) "replay_start": is_replay = true + "replay_stop": + if is_replay and OS.has_feature("movie"): + menu.exit() "pause": overlay.timer.paused = p.state Global.game_paused = p.state diff --git a/client/menu/entry.gd b/client/menu/entry.gd index 577161c9..ac16f808 100644 --- a/client/menu/entry.gd +++ b/client/menu/entry.gd @@ -27,6 +27,8 @@ func _ready(): await submenu("res://menu/setup.tscn") else: await submenu("res://menu/main.tscn") + + print("Menu stack empty, quitting game.") get_tree().quit() func quit(): diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index 12b9dfb7..3b87c7b8 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -314,6 +314,7 @@ pub enum PacketC { /// For use in replay sessions only ReplayStart, + ReplayStop, } #[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)] diff --git a/server/replaytool/src/main.rs b/server/replaytool/src/main.rs index 331c6e6d..337152ec 100644 --- a/server/replaytool/src/main.rs +++ b/server/replaytool/src/main.rs @@ -120,7 +120,13 @@ async fn main() -> anyhow::Result<()> { serde_json::to_string(&PacketC::ReplayStart).unwrap().into(), )) .await?; - 'outer: while let Some(Ok(message)) = sock.next().await { + while let Some(Ok(message)) = sock.next().await { + let mut send = async |p: PacketC| { + sock.send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&p).unwrap().into(), + )) + .await + }; match message { tungstenite::Message::Text(line) => { let packet: PacketS = match serde_json::from_str(&line) { @@ -134,28 +140,19 @@ async fn main() -> anyhow::Result<()> { match packet { PacketS::Join { .. } => { - sock.send(tokio_tungstenite::tungstenite::Message::Text( - serde_json::to_string(&PacketC::ServerMessage { - message: Message::Translation { - id: "s.replay.cannot_join".to_owned(), - params: vec![], - }, - error: true, - }) - .unwrap() - .into(), - )) + send(PacketC::ServerMessage { + message: Message::Translation { + id: "s.replay.cannot_join".to_owned(), + params: vec![], + }, + error: true, + }) .await?; } PacketS::Idle { paused: pause } => { // Cannot display server hint like in main server because cant address them to spectators. paused = pause; - sock.send(tokio_tungstenite::tungstenite::Message::Text( - serde_json::to_string(&PacketC::Pause { state: pause }) - .unwrap() - .into(), - )) - .await? + send(PacketC::Pause { state: pause }).await? } PacketS::ReplayTick { dt } => { if paused { @@ -164,18 +161,29 @@ async fn main() -> anyhow::Result<()> { time += dt; while next_event.ts < time { debug!("<- {:?}", next_event.packet); - sock.send(tokio_tungstenite::tungstenite::Message::Text( - serde_json::to_string(&next_event.packet) - .unwrap() - .into(), - )) - .await?; + if !matches!( + next_event.packet, + PacketC::SetIngame { state: false, .. } + ) { + send(next_event.packet).await?; + } - let Some(next) = &file.next_line().await? else { + if let Some(next) = &file.next_line().await? { + next_event = serde_json::from_str::<Event>(next)?; + } else { info!("reached end"); - break 'outer; + send(PacketC::ServerMessage { + message: Message::Text("End of Replay".to_string()), + error: false, + }) + .await?; + send(PacketC::ReplayStop).await?; + next_event = Event { + ts: f64::INFINITY, + packet: PacketC::FlushMap, + }; + continue; }; - next_event = serde_json::from_str::<Event>(next)?; } } x => warn!("unhandled client packet: {x:?}"), |