From 750cfe1630d01310eb8af31bfbabc00eccd054a5 Mon Sep 17 00:00:00 2001
From: Tangent Wantwight <tangent128@gmail.com>
Date: Tue, 26 May 2020 23:32:28 -0400
Subject: [PATCH] Create a PlayerId typedef, don't overload -1 for unassigned.

---
 src/net/LockstepClient.ts | 6 +++---
 src/net/mod.rs            | 8 +++++---
 src/net/server.rs         | 2 +-
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/net/LockstepClient.ts b/src/net/LockstepClient.ts
index 8e64b8e..16655c4 100644
--- a/src/net/LockstepClient.ts
+++ b/src/net/LockstepClient.ts
@@ -42,7 +42,7 @@ export type ClientMessage<LocalInput, State> =
 
 export type ServerMessage<GlobalInput, State> =
     | Packet<MessageTypes.META, Meta>
-    | Packet<MessageTypes.SET_STATE, { u: number, s: Partial<State> }>
+    | Packet<MessageTypes.SET_STATE, { u: number | null, s: Partial<State> }>
     | Packet<MessageTypes.INPUT, { i: GlobalInput }>
     | Packet<MessageTypes.GET_STATE, { c: number }>
 ;
@@ -51,7 +51,7 @@ export type Server<LocalInput, GlobalInput, State> = Callbag<ClientMessage<Local
 
 export abstract class LockstepClient<LocalInput, GlobalInput, State> {
 
-    private playerNumber = -1;
+    private playerNumber: number | null = null;
     private state: LockstepState<LocalInput, GlobalInput, State>;
     private serverTalkback: Server<LocalInput, GlobalInput, State> | null = null;
 
@@ -100,7 +100,7 @@ export abstract class LockstepClient<LocalInput, GlobalInput, State> {
     private sampleInput = () => {
         if (this.serverTalkback) {
             const input = this.gatherInput();
-            if(this.playerNumber >= 0) {
+            if(this.playerNumber !== null) {
                 this.state.addLocalInput(this.playerNumber, input);
                 this.serverTalkback(1, { t: MessageTypes.INPUT, i: input });
             }
diff --git a/src/net/mod.rs b/src/net/mod.rs
index 1525fad..dd8284a 100644
--- a/src/net/mod.rs
+++ b/src/net/mod.rs
@@ -3,6 +3,8 @@ use serde_json::Value;
 
 pub mod server;
 
+pub type PlayerId = usize;
+
 #[derive(Deserialize, Debug)]
 #[serde(tag = "t")]
 pub enum ClientMessage<I = Value, S = Value> {
@@ -14,13 +16,13 @@ pub enum ClientMessage<I = Value, S = Value> {
     GetState { c: usize, s: S },
 }
 
-#[derive(Serialize, Debug)]
+#[derive(Serialize, Debug, Clone)]
 pub struct Meta {
     pub helo: Option<String>,
     pub version: &'static str,
 }
 
-#[derive(Serialize, Debug)]
+#[derive(Serialize, Debug, Clone)]
 #[serde(tag = "t")]
 pub enum ServerMessage<I = Vec<Value>, S = Value> {
     #[serde(rename = "m")]
@@ -29,7 +31,7 @@ pub enum ServerMessage<I = Vec<Value>, S = Value> {
         m: Meta,
     },
     #[serde(rename = "s")]
-    SetState { u: i8, s: S },
+    SetState { u: Option<PlayerId>, s: S },
     #[serde(rename = "i")]
     Input { i: I },
     #[serde(rename = "g")]
diff --git a/src/net/server.rs b/src/net/server.rs
index abde3ef..b74a16d 100644
--- a/src/net/server.rs
+++ b/src/net/server.rs
@@ -16,7 +16,7 @@ where
                 helo: Some("Dedicated base2020 server".into()),
             },
         },
-        ServerMessage::SetState { u: 0, s: json!({}) },
+        ServerMessage::SetState { u: Some(0), s: json!({}) },
     ])
     .map(Ok);