summaryrefslogtreecommitdiffstats
path: root/src/server/core.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-29 17:18:34 +0100
committersalmonik <salmonik@tuta.io>2026-10-29 17:18:34 +0100
commitd9f1fe513e6f7696809d3a9b4d44ca485fe99c97 (patch)
tree9da99200fdfe004a47056d10340b3f59c7ccc52e /src/server/core.rs
parentv2.0.0: reset plays audit to a generic per-game schema (diff)
downloadzagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.tar.gz
zagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.zip
v2.1.0: add European roulette with split bets and wheel animation
Diffstat (limited to 'src/server/core.rs')
-rw-r--r--src/server/core.rs77
1 files changed, 50 insertions, 27 deletions
diff --git a/src/server/core.rs b/src/server/core.rs
index 7231577..2ce8b2b 100644
--- a/src/server/core.rs
+++ b/src/server/core.rs
@@ -85,11 +85,11 @@ impl ServerCore {
85 } 85 }
86 } 86 }
87 "PLAY_START" => { 87 "PLAY_START" => {
88 if parts.len() != 3 { 88 if parts.len() != 3 && parts.len() != 4 {
89 "ERROR Invalid PLAY_START format. Usage: PLAY_START <game_type> <bet_amount>" 89 "ERROR Invalid PLAY_START format. Usage: PLAY_START <game_type> <bet_amount> [payload]"
90 .to_string() 90 .to_string()
91 } else { 91 } else {
92 self.handle_play_start(state, parts[1], parts[2]) 92 self.handle_play_start(state, parts[1], parts[2], parts.get(3).copied())
93 } 93 }
94 } 94 }
95 "REGISTER" => { 95 "REGISTER" => {
@@ -187,6 +187,7 @@ impl ServerCore {
187 state: &ConnectionState, 187 state: &ConnectionState,
188 game_type: &str, 188 game_type: &str,
189 bet_amount_str: &str, 189 bet_amount_str: &str,
190 payload: Option<&str>,
190 ) -> String { 191 ) -> String {
191 let Some(user) = state.user.as_deref() else { 192 let Some(user) = state.user.as_deref() else {
192 return "ERROR Not logged in".to_string(); 193 return "ERROR Not logged in".to_string();
@@ -216,7 +217,8 @@ impl ServerCore {
216 } 217 }
217 218
218 let game_state = game.prepare_state(user, bet_amount as u64); 219 let game_state = game.prepare_state(user, bet_amount as u64);
219 let new_state = match game.process_action(&game_state, "spin", &[]) { 220 let params: Vec<&str> = payload.into_iter().collect();
221 let new_state = match game.process_action(&game_state, "spin", &params) {
220 Ok(state) => state, 222 Ok(state) => state,
221 Err(error) => return game_error(error), 223 Err(error) => return game_error(error),
222 }; 224 };
@@ -239,26 +241,6 @@ impl ServerCore {
239 } 241 }
240 }; 242 };
241 243
242 let reels = result
243 .result_data
244 .get("reels")
245 .cloned()
246 .unwrap_or_default();
247 let win_type = result
248 .result_data
249 .get("win_type")
250 .cloned()
251 .unwrap_or_default();
252 let win_lines = result
253 .result_data
254 .get("win_lines")
255 .cloned()
256 .unwrap_or_else(|| "-".to_string());
257 let win_cells = result
258 .result_data
259 .get("win_cells")
260 .cloned()
261 .unwrap_or_else(|| "-".to_string());
262 let details = 244 let details =
263 serde_json::to_string(&result.result_data).unwrap_or_else(|_| "{}".to_string()); 245 serde_json::to_string(&result.result_data).unwrap_or_else(|_| "{}".to_string());
264 246
@@ -273,9 +255,50 @@ impl ServerCore {
273 ) { 255 ) {
274 Ok(new_balance) => { 256 Ok(new_balance) => {
275 let _ = self.sessions.remove_session(&session_id); 257 let _ = self.sessions.remove_session(&session_id);
276 format!( 258 if game_type == "roulette" {
277 "GAME_RESULT {session_id} {winnings} {bet_amount} {new_balance} {reels} {win_type} {win_lines} {win_cells}" 259 let number = result
278 ) 260 .result_data
261 .get("number")
262 .cloned()
263 .unwrap_or_default();
264 let color = result
265 .result_data
266 .get("color")
267 .cloned()
268 .unwrap_or_default();
269 let bets = result
270 .result_data
271 .get("bets")
272 .cloned()
273 .unwrap_or_else(|| "{}".to_string());
274 format!(
275 "ROULETTE_RESULT {session_id} {winnings} {bet_amount} {new_balance} {number} {color} {bets}"
276 )
277 } else {
278 let reels = result
279 .result_data
280 .get("reels")
281 .cloned()
282 .unwrap_or_default();
283 let win_type = result
284 .result_data
285 .get("win_type")
286 .cloned()
287 .unwrap_or_default();
288 let win_lines = result
289 .result_data
290 .get("win_lines")
291 .cloned()
292 .unwrap_or_else(|| "-".to_string());
293 let win_cells = result
294 .result_data
295 .get("win_cells")
296 .cloned()
297 .unwrap_or_else(|| "-".to_string());
298 format!(
299 "GAME_RESULT {session_id} {winnings} {bet_amount} {new_balance} {reels} {win_type} {win_lines} {win_cells}"
300 )
301 }
279 } 302 }
280 Err(error) => { 303 Err(error) => {
281 let _ = self.sessions.remove_session(&session_id); 304 let _ = self.sessions.remove_session(&session_id);