summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock229
-rw-r--r--Cargo.toml2
-rw-r--r--client/game.gd7
-rw-r--r--client/multiplayer.gd8
-rw-r--r--server/Cargo.toml3
-rw-r--r--server/examples/client.rs4
-rw-r--r--server/protocol/Cargo.toml9
-rw-r--r--server/protocol/src/lib.rs (renamed from server/src/protocol.rs)23
-rw-r--r--server/replaytool/Cargo.toml18
-rw-r--r--server/replaytool/src/main.rs153
-rw-r--r--server/src/bin/graph.rs2
-rw-r--r--server/src/customer/mod.rs8
-rw-r--r--server/src/customer/movement.rs3
-rw-r--r--server/src/customer/pathfinding.rs6
-rw-r--r--server/src/data.rs6
-rw-r--r--server/src/entity/conveyor.rs3
-rw-r--r--server/src/entity/mod.rs4
-rw-r--r--server/src/game.rs19
-rw-r--r--server/src/interaction.rs2
-rw-r--r--server/src/lib.rs1
-rw-r--r--server/src/main.rs7
-rw-r--r--server/src/state.rs7
22 files changed, 479 insertions, 45 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 75007582..fd1b6eff 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -188,6 +188,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+
+[[package]]
name = "cpufeatures"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -258,6 +274,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
+name = "errno"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
name = "fake"
version = "2.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -268,12 +294,33 @@ dependencies = [
]
[[package]]
+name = "fastrand"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+
+[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
name = "futures-core"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -395,6 +442,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
+name = "hurrycurry-protocol"
+version = "0.1.0"
+dependencies = [
+ "glam",
+ "serde",
+]
+
+[[package]]
+name = "hurrycurry-replaytool"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "env_logger",
+ "futures-util",
+ "hurrycurry-protocol",
+ "log",
+ "rand 0.9.0-alpha.1",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tokio-tungstenite",
+]
+
+[[package]]
name = "hurrycurry-server"
version = "0.2.0"
dependencies = [
@@ -403,7 +475,7 @@ dependencies = [
"env_logger",
"fake",
"futures-util",
- "glam",
+ "hurrycurry-protocol",
"log",
"pollster",
"rand 0.9.0-alpha.1",
@@ -444,6 +516,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
+name = "linux-raw-sys"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
name = "lock_api"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -486,6 +564,23 @@ dependencies = [
]
[[package]]
+name = "native-tls"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
+dependencies = [
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -505,6 +600,56 @@ dependencies = [
]
[[package]]
+name = "once_cell"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
+name = "openssl"
+version = "0.10.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.102"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
name = "parking_lot"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -540,6 +685,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
name = "pollster"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -675,18 +826,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
+name = "rustix"
+version = "0.38.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
name = "ryu"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
+name = "schannel"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
+name = "security-framework"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
name = "serde"
version = "1.0.204"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -799,6 +995,18 @@ dependencies = [
]
[[package]]
+name = "tempfile"
+version = "3.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "rustix",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
name = "thiserror"
version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -849,6 +1057,16 @@ dependencies = [
]
[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
name = "tokio-tungstenite"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -856,7 +1074,9 @@ checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd"
dependencies = [
"futures-util",
"log",
+ "native-tls",
"tokio",
+ "tokio-native-tls",
"tungstenite",
]
@@ -872,6 +1092,7 @@ dependencies = [
"http",
"httparse",
"log",
+ "native-tls",
"rand 0.8.5",
"sha1",
"thiserror",
@@ -909,6 +1130,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 156820ec..c3c2d759 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,3 +1,3 @@
[workspace]
-members = ["server"]
+members = ["server/replaytool", "server", "server/protocol"]
resolver = "2"
diff --git a/client/game.gd b/client/game.gd
index 4e0bfe52..b6646407 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -33,6 +33,7 @@ var tile_collide: Array = []
var tile_interact: Array = []
var map_names: Array = []
var in_lobby := false
+var is_replay := false
var is_joined := false
var join_sent := false
@@ -53,6 +54,7 @@ func _ready():
if !Global.on_vulkan():
environment.environment.tonemap_exposure = 0.5
+ mp.replay_start.connect(func(): is_replay = true)
mp.connection_closed.connect(func(reason: String):
Global.error_message = reason;
get_parent().replace_menu("res://menu/error.tscn")
@@ -249,11 +251,12 @@ func _process(delta):
marker.position = Global.interpolate(marker.position, marker_target, delta * 30.)
update_center()
+ if is_replay: mp.send_replay_tick(delta)
+
if Global.get_setting("debug_info"):
debug_label.show()
debug_label.text = "%d FPS" % Engine.get_frames_per_second()
- else:
- debug_label.hide()
+ else: debug_label.hide()
func get_tile_collision(pos: Vector2i) -> bool:
var t = map.get_tile_name(pos)
diff --git a/client/multiplayer.gd b/client/multiplayer.gd
index 8df00034..aa895b69 100644
--- a/client/multiplayer.gd
+++ b/client/multiplayer.gd
@@ -51,6 +51,7 @@ signal set_ingame(state: bool, lobby: bool)
signal score(demands_failed: int, demands_completed: int, points: int, time_remaining: float)
signal hide_score()
signal server_message(text: String)
+signal replay_start()
signal connection_closed(reason: String)
@@ -242,6 +243,7 @@ func handle_packet(bytes: PackedByteArray):
"server_message":
var text = decoded["text"]
server_message.emit(text)
+ "replay_start": replay_start.emit()
_:
push_error("Unrecognized packet type: %s" % packet_type)
@@ -279,6 +281,12 @@ func send_chat(message: String):
}
})
+func send_replay_tick(dt: float):
+ send_packet({
+ "type": "replay_tick",
+ "dt": dt
+ })
+
func send_leave():
send_packet({
"type": "leave",
diff --git a/server/Cargo.toml b/server/Cargo.toml
index 6b9037ac..da084855 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -5,7 +5,6 @@ edition = "2021"
default-run = "hurrycurry-server"
[dependencies]
-glam = { version = "0.28.0", features = ["serde"] }
log = "0.4.22"
env_logger = "0.11.3"
anyhow = "1.0.86"
@@ -20,3 +19,5 @@ shlex = "1.3.0"
clap = { version = "4.5.8", features = ["derive"] }
fake = "2.9.2"
pollster = "0.3.0"
+
+hurrycurry-protocol = { path = "protocol" }
diff --git a/server/examples/client.rs b/server/examples/client.rs
index 487c9738..70b1bb00 100644
--- a/server/examples/client.rs
+++ b/server/examples/client.rs
@@ -15,15 +15,13 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+use hurrycurry_protocol::{glam::Vec2, PacketC, PacketS};
use std::{
io::{stdin, BufRead, BufReader, Write},
net::TcpStream,
thread,
};
-use glam::Vec2;
-use hurrycurry_server::protocol::{PacketC, PacketS};
-
fn main() {
let mut sock = TcpStream::connect("127.0.0.1:27031").unwrap();
diff --git a/server/protocol/Cargo.toml b/server/protocol/Cargo.toml
new file mode 100644
index 00000000..8fc63121
--- /dev/null
+++ b/server/protocol/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "hurrycurry-protocol"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+serde = { version = "1.0.204", features = ["derive"] }
+glam = { version = "0.28.0", features = ["serde"] }
+
diff --git a/server/src/protocol.rs b/server/protocol/src/lib.rs
index fc8abda4..36a496a0 100644
--- a/server/src/protocol.rs
+++ b/server/protocol/src/lib.rs
@@ -15,9 +15,11 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::data::Gamedata;
use glam::{IVec2, Vec2};
use serde::{Deserialize, Serialize};
+use std::collections::HashSet;
+
+pub use glam;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
@@ -36,6 +38,16 @@ pub struct RecipeIndex(pub usize);
#[serde(transparent)]
pub struct DemandIndex(pub usize);
+#[derive(Debug, Clone, Serialize, Deserialize, Default)]
+#[rustfmt::skip]
+pub struct ClientGamedata {
+ pub item_names: Vec<String>,
+ pub tile_names: Vec<String>,
+ pub tile_collide: Vec<bool>,
+ pub tile_interact: Vec<bool>,
+ pub map_names: HashSet<String>,
+}
+
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketS {
@@ -67,6 +79,10 @@ pub enum PacketS {
ReplaceHand {
item: Option<ItemIndex>,
},
+ /// For use in replay sessions only
+ ReplayTick {
+ dt: f64,
+ },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -84,7 +100,7 @@ pub enum PacketC {
id: PlayerID,
},
Data {
- data: Gamedata,
+ data: ClientGamedata,
},
AddPlayer {
id: PlayerID,
@@ -144,6 +160,9 @@ pub enum PacketC {
Error {
message: String,
},
+
+ /// For use in replay sessions only
+ ReplayStart,
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy)]
diff --git a/server/replaytool/Cargo.toml b/server/replaytool/Cargo.toml
new file mode 100644
index 00000000..e6c1cc23
--- /dev/null
+++ b/server/replaytool/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "hurrycurry-replaytool"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+log = "0.4.22"
+env_logger = "0.11.3"
+anyhow = "1.0.86"
+serde = { version = "1.0.204", features = ["derive"] }
+tokio = { version = "1.38.0", features = ["full"] }
+serde_json = "1.0.120"
+tokio-tungstenite = { version = "0.23.1", features = ["native-tls"] }
+futures-util = "0.3.30"
+rand = "0.9.0-alpha.1"
+clap = { version = "4.5.8", features = ["derive"] }
+
+hurrycurry-protocol = { path = "../protocol" }
diff --git a/server/replaytool/src/main.rs b/server/replaytool/src/main.rs
new file mode 100644
index 00000000..eae75676
--- /dev/null
+++ b/server/replaytool/src/main.rs
@@ -0,0 +1,153 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+use anyhow::anyhow;
+use clap::Parser;
+use futures_util::{SinkExt, StreamExt};
+use hurrycurry_protocol::{PacketC, PacketS};
+use log::{debug, info, warn, LevelFilter};
+use serde::{Deserialize, Serialize};
+use std::{path::PathBuf, time::Instant};
+use tokio::{
+ fs::File,
+ io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter},
+ net::TcpListener,
+};
+use tokio_tungstenite::tungstenite::Message;
+
+#[derive(Parser)]
+enum Args {
+ Record { url: String, output: PathBuf },
+ Replay { input: PathBuf },
+}
+
+#[derive(Serialize, Deserialize)]
+struct Event {
+ ts: f64,
+ packet: PacketC,
+}
+
+#[tokio::main]
+async fn main() -> anyhow::Result<()> {
+ env_logger::builder()
+ .filter_level(LevelFilter::Info)
+ .parse_env("LOG")
+ .init();
+
+ let args = Args::parse();
+
+ match args {
+ Args::Record { url, output } => {
+ let mut file = BufWriter::new(File::create(&output).await?);
+ info!("connecting to {url:?}...");
+ let (mut sock, _) = tokio_tungstenite::connect_async(url).await?;
+ info!("starting recording.");
+ let start = Instant::now();
+
+ while let Some(Ok(message)) = sock.next().await {
+ match message {
+ Message::Text(line) => {
+ let packet: PacketC = match serde_json::from_str(&line) {
+ Ok(p) => p,
+ Err(e) => {
+ warn!("invalid packet: {e}");
+ break;
+ }
+ };
+ debug!("<- {packet:?}");
+ file.write_all(
+ format!(
+ "{}\n",
+ serde_json::to_string(&Event {
+ ts: start.elapsed().as_secs_f64(),
+ packet: packet
+ })
+ .unwrap()
+ )
+ .as_bytes(),
+ )
+ .await?
+ }
+ Message::Close(_) => break,
+ _ => (),
+ }
+ }
+ }
+ Args::Replay { input } => {
+ let ws_listener = TcpListener::bind("0.0.0.0:27032").await?;
+ info!("listening for websockets on {}", ws_listener.local_addr()?);
+
+ loop {
+ let mut file = BufReader::new(File::open(&input).await?).lines();
+ let mut next_event =
+ serde_json::from_str::<Event>(&file.next_line().await?.ok_or(anyhow!("eof"))?)?;
+ let mut time = 0.;
+
+ info!("ready");
+ let (sock, addr) = ws_listener.accept().await?;
+ let Ok(mut sock) = tokio_tungstenite::accept_async(sock).await else {
+ warn!("invalid ws handshake");
+ continue;
+ };
+ info!("{addr} connected via ws");
+
+ sock.send(tokio_tungstenite::tungstenite::Message::Text(
+ serde_json::to_string(&PacketC::ReplayStart).unwrap(),
+ ))
+ .await?;
+ while let Some(Ok(message)) = sock.next().await {
+ match message {
+ Message::Text(line) => {
+ let packet: PacketS = match serde_json::from_str(&line) {
+ Ok(p) => p,
+ Err(e) => {
+ warn!("invalid packet: {e}");
+ break;
+ }
+ };
+ debug!("<- {packet:?}");
+
+ match packet {
+ PacketS::ReplayTick { dt } => {
+ 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(),
+ ))
+ .await?;
+
+ let Some(next) = &file.next_line().await? else {
+ info!("reached end");
+ break;
+ };
+ next_event = serde_json::from_str::<Event>(next)?;
+ }
+ }
+ _ => (),
+ }
+ }
+ Message::Close(_) => break,
+ _ => (),
+ }
+ }
+ info!("{addr} left");
+ }
+ }
+ }
+ Ok(())
+}
diff --git a/server/src/bin/graph.rs b/server/src/bin/graph.rs
index ace1b676..888119aa 100644
--- a/server/src/bin/graph.rs
+++ b/server/src/bin/graph.rs
@@ -16,10 +16,10 @@
*/
use anyhow::{anyhow, Result};
+use hurrycurry_protocol::{ItemIndex, RecipeIndex};
use hurrycurry_server::{
data::{DataIndex, Demand},
interaction::Recipe,
- protocol::{ItemIndex, RecipeIndex},
};
#[tokio::main]
diff --git a/server/src/customer/mod.rs b/server/src/customer/mod.rs
index 191f9e3b..10788206 100644
--- a/server/src/customer/mod.rs
+++ b/server/src/customer/mod.rs
@@ -18,14 +18,10 @@
pub mod movement;
mod pathfinding;
-use crate::{
- data::Gamedata,
- game::Tile,
- protocol::{DemandIndex, Message, PacketS, PlayerID},
-};
+use crate::{data::Gamedata, game::Tile};
use anyhow::{anyhow, Result};
use fake::{faker, Fake};
-use glam::IVec2;
+use hurrycurry_protocol::{glam::IVec2, DemandIndex, Message, PacketS, PlayerID};
use log::debug;
use movement::MovementBase;
use pathfinding::{find_path, Path};
diff --git a/server/src/customer/movement.rs b/server/src/customer/movement.rs
index ca7afdbe..34ed5b16 100644
--- a/server/src/customer/movement.rs
+++ b/server/src/customer/movement.rs
@@ -16,8 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::protocol::PacketS;
-use glam::{IVec2, Vec2};
+use hurrycurry_protocol::{glam::{IVec2, Vec2}, PacketS};
use std::collections::HashSet;
const PLAYER_SIZE: f32 = 0.4;
diff --git a/server/src/customer/pathfinding.rs b/server/src/customer/pathfinding.rs
index 743515b9..29ee4e00 100644
--- a/server/src/customer/pathfinding.rs
+++ b/server/src/customer/pathfinding.rs
@@ -16,8 +16,10 @@
*/
use super::movement::MovementBase;
-use crate::protocol::PacketS;
-use glam::{IVec2, Vec2};
+use hurrycurry_protocol::{
+ glam::{IVec2, Vec2},
+ PacketS,
+};
use log::debug;
use std::{
cmp::Ordering,
diff --git a/server/src/data.rs b/server/src/data.rs
index bca7f543..9fd3e95c 100644
--- a/server/src/data.rs
+++ b/server/src/data.rs
@@ -19,10 +19,12 @@
use crate::{
entity::{construct_entity, Entity, EntityDecl},
interaction::Recipe,
- protocol::{DemandIndex, ItemIndex, RecipeIndex, TileIndex},
};
use anyhow::{anyhow, bail, Result};
-use glam::{IVec2, Vec2};
+use hurrycurry_protocol::{
+ glam::{IVec2, Vec2},
+ DemandIndex, ItemIndex, RecipeIndex, TileIndex,
+};
use serde::{Deserialize, Serialize};
use std::{
collections::{HashMap, HashSet},
diff --git a/server/src/entity/conveyor.rs b/server/src/entity/conveyor.rs
index 0a73b55c..4d11ffe1 100644
--- a/server/src/entity/conveyor.rs
+++ b/server/src/entity/conveyor.rs
@@ -19,10 +19,9 @@ use super::EntityT;
use crate::{
data::Gamedata,
game::{interact_effect, Tile},
- protocol::{ItemLocation, PacketC},
};
use anyhow::{anyhow, Result};
-use glam::IVec2;
+use hurrycurry_protocol::{glam::IVec2, ItemLocation, PacketC};
use std::collections::{HashMap, VecDeque};
#[derive(Debug, Default, Clone)]
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs
index 5cb3ed0f..925ed5f4 100644
--- a/server/src/entity/mod.rs
+++ b/server/src/entity/mod.rs
@@ -16,10 +16,10 @@
*/
pub mod conveyor;
-use crate::{data::Gamedata, game::Tile, protocol::PacketC};
+use crate::{data::Gamedata, game::Tile};
use anyhow::{anyhow, Result};
use conveyor::Conveyor;
-use glam::IVec2;
+use hurrycurry_protocol::{glam::IVec2, PacketC};
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
diff --git a/server/src/game.rs b/server/src/game.rs
index 851d485c..32fb7ac9 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -20,16 +20,16 @@ use crate::{
data::Gamedata,
entity::{Entity, EntityT},
interaction::{interact, tick_slot, InteractEffect, TickEffect},
- protocol::{
- ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex,
- },
};
use anyhow::{anyhow, bail, Result};
-use glam::{IVec2, Vec2};
+use hurrycurry_protocol::{
+ glam::{IVec2, Vec2},
+ ClientGamedata, ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex,
+ TileIndex,
+};
use log::{info, warn};
use std::{
collections::{HashMap, VecDeque},
- ops::Deref,
sync::Arc,
time::{Duration, Instant},
};
@@ -164,7 +164,13 @@ impl Game {
pub fn prime_client(&self) -> Vec<PacketC> {
let mut out = Vec::new();
out.push(PacketC::Data {
- data: self.data.deref().to_owned(),
+ data: ClientGamedata {
+ item_names: self.data.item_names.clone(),
+ tile_names: self.data.tile_names.clone(),
+ tile_collide: self.data.tile_collide.clone(),
+ tile_interact: self.data.tile_interact.clone(),
+ map_names: self.data.map_names.clone(),
+ },
});
for (&id, player) in &self.players {
out.push(PacketC::AddPlayer {
@@ -408,6 +414,7 @@ impl Game {
item,
})
}
+ PacketS::ReplayTick { .. } => bail!("packet not supported in this session"),
}
if self.points != points_before {
diff --git a/server/src/interaction.rs b/server/src/interaction.rs
index 25b96813..b3f6af8c 100644
--- a/server/src/interaction.rs
+++ b/server/src/interaction.rs
@@ -18,8 +18,8 @@
use crate::{
data::Gamedata,
game::{Involvement, Item},
- protocol::{ItemIndex, TileIndex},
};
+use hurrycurry_protocol::{ItemIndex, TileIndex};
use log::info;
use serde::{Deserialize, Serialize};
diff --git a/server/src/lib.rs b/server/src/lib.rs
index a6d29c03..6d0d4e26 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -21,5 +21,4 @@ pub mod data;
pub mod entity;
pub mod game;
pub mod interaction;
-pub mod protocol;
pub mod state;
diff --git a/server/src/main.rs b/server/src/main.rs
index 99834fbd..4c6bcc34 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -18,6 +18,8 @@
use anyhow::{anyhow, Result};
use clap::Parser;
use futures_util::{SinkExt, StreamExt};
+use hurrycurry_protocol::{PacketC, PacketS, PlayerID};
+use hurrycurry_server::{data::DATA_DIR, state::State};
use log::{debug, info, warn, LevelFilter};
use std::{path::PathBuf, process::exit, str::FromStr, sync::Arc, time::Duration};
use tokio::{
@@ -27,11 +29,6 @@ use tokio::{
time::interval,
};
use tokio_tungstenite::tungstenite::Message;
-use hurrycurry_server::{
- data::DATA_DIR,
- protocol::{PacketC, PacketS, PlayerID},
- state::State,
-};
#[derive(Parser)]
struct Args {
diff --git a/server/src/state.rs b/server/src/state.rs
index 72d3e911..5af6f181 100644
--- a/server/src/state.rs
+++ b/server/src/state.rs
@@ -17,13 +17,10 @@
*/
use std::time::Duration;
-use crate::{
- data::DataIndex,
- game::Game,
- protocol::{Message, PacketC, PacketS, PlayerID},
-};
+use crate::{data::DataIndex, game::Game};
use anyhow::{anyhow, bail, Result};
use clap::{Parser, ValueEnum};
+use hurrycurry_protocol::{Message, PacketC, PacketS, PlayerID};
use log::debug;
use tokio::sync::broadcast::Sender;