1use geng::net::{Message, Traffic};
2use geng::prelude::*;
3
4mod app;
5mod lobby;
6
7pub use app::run;
8pub use lobby::*;
9#[cfg(not(target_arch = "wasm32"))]
10pub mod server;
11#[cfg(not(target_arch = "wasm32"))]
12pub use server::*;
13
14pub trait Model: Diff + Message {
15 type PlayerId: Message + Clone;
16 type Message: Message;
17 type Event: Message + Clone;
18 const TICKS_PER_SECOND: f32;
19 fn new_player(&mut self, events: &mut Vec<Self::Event>) -> Self::PlayerId;
20 fn drop_player(&mut self, events: &mut Vec<Self::Event>, player_id: &Self::PlayerId);
21 fn handle_message(
22 &mut self,
23 events: &mut Vec<Self::Event>,
24 player_id: &Self::PlayerId,
25 message: Self::Message,
26 ) -> Vec<Self::Event>;
27 fn tick(&mut self, events: &mut Vec<Self::Event>);
28}
29
30#[derive(Serialize, Deserialize, Debug)]
31pub enum ServerMessage<T: Model> {
32 PlayerId(T::PlayerId),
33 Delta(#[serde(bound = "")] <T as Diff>::Delta),
34 Full(#[serde(bound = "")] T),
35 Events(Vec<T::Event>),
36}
37
38pub struct Remote<T: Model> {
39 connection: RefCell<geng::net::client::Connection<ServerMessage<T>, T::Message>>,
40 model: RefCell<T>,
41}
42
43impl<T: Model> Remote<T> {
44 pub fn update(&self) -> Vec<T::Event> {
45 let mut model = self.model.borrow_mut();
46 let mut events = Vec::new();
47 for message in self.connection.borrow_mut().new_messages() {
48 match message.unwrap() {
49 ServerMessage::Full(state) => *model = state,
50 ServerMessage::Delta(delta) => model.update(&delta),
51 ServerMessage::PlayerId(_) => unreachable!(),
52 ServerMessage::Events(e) => events.extend(e),
53 }
54 }
55 events
56 }
57 pub fn get(&self) -> Ref<T> {
58 self.model.borrow()
59 }
60 pub fn send(&self, message: T::Message) {
61 self.connection.borrow_mut().send(message);
62 }
63 pub fn traffic(&self) -> Traffic {
64 self.connection.borrow().traffic()
65 }
66}