@@ -270,10 +270,6 @@ export const ConnectFourRoutes = async (socket: Socket, io: Namespace) => {
270
270
return ;
271
271
}
272
272
273
- // validate invalid move
274
- if ( move . column < - 1 || move . column >= ConnectFour . columnCount )
275
- return ;
276
-
277
273
if ( gameState . winner_id ) {
278
274
return ;
279
275
}
@@ -311,82 +307,93 @@ export const ConnectFourRoutes = async (socket: Socket, io: Namespace) => {
311
307
throw Error ( `no active player for player ${ player_id } ` ) ;
312
308
}
313
309
314
- for ( let row = ConnectFour . rowCount - 1 ; row >= 0 ; row -- ) {
315
- if (
316
- gameState . board [ row ] [
317
- activePlayer . currentMove . column
318
- ] === null
319
- ) {
320
- gameState . board [ row ] [ activePlayer . currentMove . column ] =
321
- activePlayer . player_id ;
322
- break ;
310
+ if ( activePlayer . currentMove . column !== - 1 ) {
311
+ for ( let row = ConnectFour . rowCount - 1 ; row >= 0 ; row -- ) {
312
+ if (
313
+ gameState . board [ row ] [
314
+ activePlayer . currentMove . column
315
+ ] === null
316
+ ) {
317
+ gameState . board [ row ] [
318
+ activePlayer . currentMove . column
319
+ ] = activePlayer . player_id ;
320
+ break ;
321
+ }
323
322
}
324
- }
325
323
326
- const win = ConnectFour . getWinner ( gameState . board , player_id ) ;
324
+ const win = ConnectFour . getWinner (
325
+ gameState . board ,
326
+ player_id ,
327
+ ) ;
327
328
328
- if ( ! win ) {
329
- const tie = ConnectFour . checkTie ( gameState . board ) ;
329
+ if ( ! win ) {
330
+ const tie = ConnectFour . checkTie ( gameState . board ) ;
331
+
332
+ if ( ! tie ) {
333
+ const moveEndEvent : ConnectFour . MoveEndEvent = {
334
+ type : "move-end" ,
335
+ payload : gameState ,
336
+ } ;
337
+ io . to ( room_id ) . emit (
338
+ moveEndEvent . type ,
339
+ moveEndEvent . payload ,
340
+ ) ;
341
+ } else {
342
+ gameState . board = ConnectFour . emptyBoard ;
343
+ const tieEvent : ConnectFour . TieEvent = {
344
+ type : "tie" ,
345
+ payload : gameState ,
346
+ } ;
347
+ io . to ( room_id ) . emit (
348
+ tieEvent . type ,
349
+ tieEvent . payload ,
350
+ ) ;
351
+ }
352
+
353
+ gameState . player1 . currentMove = null ;
354
+ gameState . player2 . currentMove = null ;
330
355
331
- if ( ! tie ) {
332
- const moveEndEvent : ConnectFour . MoveEndEvent = {
333
- type : "move-end" ,
334
- payload : gameState ,
335
- } ;
336
- io . to ( room_id ) . emit (
337
- moveEndEvent . type ,
338
- moveEndEvent . payload ,
356
+ await RedisClient . hset (
357
+ room_id ,
358
+ stringifyObjectValues < ConnectFour . ServerGameState > (
359
+ gameState ,
360
+ ) ,
339
361
) ;
362
+ return ;
340
363
} else {
341
- gameState . board = ConnectFour . emptyBoard ;
342
- const tieEvent : ConnectFour . TieEvent = {
343
- type : "tie" ,
344
- payload : gameState ,
345
- } ;
346
- io . to ( room_id ) . emit ( tieEvent . type , tieEvent . payload ) ;
364
+ gameState . winner_id = activePlayer . player_id ;
347
365
}
348
-
349
- gameState . player1 . currentMove = null ;
350
- gameState . player2 . currentMove = null ;
351
-
352
- await RedisClient . hset (
353
- room_id ,
354
- stringifyObjectValues < ConnectFour . ServerGameState > (
355
- gameState ,
356
- ) ,
357
- ) ;
358
366
} else {
359
- gameState . winner_id = activePlayer . player_id ;
360
-
361
- const gameEndEvent : ConnectFour . GameEndEvent = {
362
- type : "game-end" ,
363
- payload :
364
- gameState as ConnectFour . GameEndEvent [ "payload" ] ,
365
- } ;
366
- io . to ( room_id ) . emit (
367
- gameEndEvent . type ,
368
- gameEndEvent . payload ,
369
- ) ;
370
-
371
- const [ { player_1, player_2 } ] = await Promise . all ( [
372
- fetchPlayersDetailsForPlayedGame ( room_id ) ,
373
- setWinnerToGame ( room_id , gameState . winner_id ) ,
374
- ] ) ;
367
+ gameState . winner_id =
368
+ activePlayer . player_id === gameState . player1 . player_id
369
+ ? gameState . player2 . player_id
370
+ : gameState . player1 . player_id ;
371
+ }
375
372
376
- await EthersService . endGame (
377
- room_id ,
378
- gameState . winner_id === player_1 . player_id
379
- ? player_1 . wallet_address
380
- : player_2 . wallet_address ,
381
- gameState . winner_id === player_1 . player_id
382
- ? player_2 . wallet_address
383
- : player_1 . wallet_address ,
384
- chain_id ,
385
- ) ;
373
+ const gameEndEvent : ConnectFour . GameEndEvent = {
374
+ type : "game-end" ,
375
+ payload : gameState as ConnectFour . GameEndEvent [ "payload" ] ,
376
+ } ;
377
+ io . to ( room_id ) . emit ( gameEndEvent . type , gameEndEvent . payload ) ;
378
+
379
+ const [ { player_1, player_2 } ] = await Promise . all ( [
380
+ fetchPlayersDetailsForPlayedGame ( room_id ) ,
381
+ setWinnerToGame ( room_id , gameState . winner_id ) ,
382
+ ] ) ;
383
+
384
+ await EthersService . endGame (
385
+ room_id ,
386
+ gameState . winner_id === player_1 . player_id
387
+ ? player_1 . wallet_address
388
+ : player_2 . wallet_address ,
389
+ gameState . winner_id === player_1 . player_id
390
+ ? player_2 . wallet_address
391
+ : player_1 . wallet_address ,
392
+ chain_id ,
393
+ ) ;
386
394
387
- await RedisClient . del ( room_id ) ;
388
- io . socketsLeave ( room_id ) ;
389
- }
395
+ await RedisClient . del ( room_id ) ;
396
+ io . socketsLeave ( room_id ) ;
390
397
} catch ( error ) {
391
398
WSError ( socket , error ) ;
392
399
}
0 commit comments