Live location tracking and playback for the game "manhunt"
1use interprocess::local_socket::{GenericNamespaced, Name, ToNsName};
2use manhunt_logic::{GameHistory, GameSettings, GameUiState, LobbyState, PowerUpType};
3use serde::{Deserialize, Serialize};
4
5pub mod prelude {
6 pub use anyhow::{Context, anyhow, bail};
7 pub type Result<T = (), E = anyhow::Error> = std::result::Result<T, E>;
8}
9
10pub use prelude::*;
11
12pub fn get_socket_name(base_name: String) -> Result<Name<'static>> {
13 base_name
14 .to_ns_name::<GenericNamespaced>()
15 .context("Failed to parse socket name")
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub enum LobbyRequest {
20 SwitchTeams(bool),
21 HostStartGame,
22 HostUpdateSettings(GameSettings),
23 Leave,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub enum GameRequest {
28 NextTick,
29 MarkCaught,
30 GetPowerup,
31 UsePowerup,
32 ForcePowerup(PowerUpType),
33 Quit,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub enum TestingRequest {
38 StartLobby(GameSettings),
39 JoinLobby(String),
40 LobbyReq(LobbyRequest),
41 GameReq(GameRequest),
42}
43
44impl From<LobbyRequest> for TestingRequest {
45 fn from(val: LobbyRequest) -> Self {
46 TestingRequest::LobbyReq(val)
47 }
48}
49
50impl From<GameRequest> for TestingRequest {
51 fn from(val: GameRequest) -> Self {
52 TestingRequest::GameReq(val)
53 }
54}
55
56impl TryInto<LobbyRequest> for TestingRequest {
57 type Error = TestingResponse;
58
59 fn try_into(self) -> Result<LobbyRequest, Self::Error> {
60 if let Self::LobbyReq(lr) = self {
61 Ok(lr)
62 } else {
63 Err(TestingResponse::WrongScreen)
64 }
65 }
66}
67
68impl TryInto<GameRequest> for TestingRequest {
69 type Error = TestingResponse;
70
71 fn try_into(self) -> Result<GameRequest, Self::Error> {
72 if let Self::GameReq(gr) = self {
73 Ok(gr)
74 } else {
75 Err(TestingResponse::WrongScreen)
76 }
77 }
78}
79
80#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
81pub enum ScreenUpdate {
82 PreConnect,
83 Lobby,
84 Game,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub enum TestingResponse {
89 Complete,
90 ScreenChanged(ScreenUpdate),
91 LobbyStateUpdate(LobbyState),
92 GameStateUpdate(GameUiState),
93 GameOver(GameHistory),
94 WrongScreen,
95 Error(String),
96}
97
98impl From<GameHistory> for TestingResponse {
99 fn from(val: GameHistory) -> Self {
100 TestingResponse::GameOver(val)
101 }
102}
103
104impl From<anyhow::Error> for TestingResponse {
105 fn from(value: anyhow::Error) -> Self {
106 TestingResponse::Error(value.to_string())
107 }
108}
109
110impl From<ScreenUpdate> for TestingResponse {
111 fn from(val: ScreenUpdate) -> Self {
112 TestingResponse::ScreenChanged(val)
113 }
114}
115
116impl From<LobbyState> for TestingResponse {
117 fn from(val: LobbyState) -> Self {
118 TestingResponse::LobbyStateUpdate(val)
119 }
120}
121
122impl From<GameUiState> for TestingResponse {
123 fn from(val: GameUiState) -> Self {
124 TestingResponse::GameStateUpdate(val)
125 }
126}