+typedef struct netmsg_scoreboard netmsg_scoreboard;
+enum{ k_inetmsg_scoreboard = 5 };
+struct netmsg_scoreboard{
+ u16 inetmsg_id;
+
+ u32 board_count;
+ struct netmsg_board
+ {
+ char data[27*13];
+ }
+ boards[ vg_list_size(track_infos) ];
+}
+static scoreboard_client_data = {
+ .inetmsg_id = k_inetmsg_scoreboard,
+ .board_count = vg_list_size(track_infos)
+};
+/* probably about 10k */
+
+/* server control 100 */
+
+
+/* player updates 200 */
+
+#define NETMSG_BOUNDARY_BIT 0x8000
+#define NETMSG_GATE_BOUNDARY_BIT 0x4000
+#define NETMSG_BOUNDARY_MASK (NETMSG_BOUNDARY_BIT|NETMSG_GATE_BOUNDARY_BIT)
+
+typedef struct netmsg_playerframe netmsg_playerframe;
+enum{ k_inetmsg_playerframe = 200 };
+struct netmsg_playerframe{
+ u16 inetmsg_id;
+ f64 timestamp;
+
+ u8 client, subsystem,
+ instance_id;
+ u16 boundary_hash; /* used for animating correctly through gates, teleport..
+ msb is a flip flop for teleporting
+ second msb is flip flop for gate
+
+TODO: disable oblique clipping on cam mtx when rendering remote players
+ also render over the portal stencil? somehow.
+
+ detransform, interp, retransform. render in dest world. */
+
+ u8 animdata[];
+};
+
+typedef struct netmsg_playerjoin netmsg_playerjoin;
+enum{ k_inetmsg_playerjoin = 201 };
+struct netmsg_playerjoin{
+ u16 inetmsg_id;
+ u8 index;
+};
+
+typedef struct netmsg_playerleave netmsg_playerleave;
+enum{ k_inetmsg_playerleave = 202 };
+struct netmsg_playerleave{
+ u16 inetmsg_id;
+ u8 index;