aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/game.gd3
-rw-r--r--client/menu/entry.gd2
-rw-r--r--server/protocol/src/lib.rs1
-rw-r--r--server/replaytool/src/main.rs62
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:?}"),