public async void StatusChangeHandler(Status status) { Console.WriteLine("StatusChangedHandler"); if (status.nCaller == 0) { bFrom = true; iFrom = status.ButtonId; pieceFrom = status.piece; StateHasChanged(); } if (status.nCaller != 0 && status.bHarvest) { var action = new GameAction(gameId, playerBoard.companionBonus, Player.Identity, playerBoard.harvestList); var result = await gameService.SubmitAction(action); if (result.nResponseCode == 1) { await JSRuntime.InvokeVoidAsync("doAnimateArray", (object)playerBoard.harvestIdList); await Task.Delay(100); // wait for javascript to grab the images // updating components before animation completes // so the pieces dissappear from the board game.NGameStatus = result.nGameStatus; playerBoard.ConfirmHarvest(); playerBoard.Update(game.NGameStatus); otherBoard.Update(game.NGameStatus); await Task.Delay(900); // rest of time it takes for animation to complete. UpdateScores(result.nScore1, result.nScore2); bPollServer = true; turnService.SetGameStatus(game.GameId, game.NGameStatus); TurnMessage = "Please wait"; StateHasChanged(); } } if (status.nCaller != 0 && bFrom) { bFrom = false; truck.ClearHighlighting(); int sourcePosition = pieceFrom.NPosition; // save source position so we can refill it later var action = new GameAction(1, status.ButtonId - (status.nCaller - 1) * 25 - 5, pieceFrom.PieceId, game.GameId, Player.Identity); var result = await gameService.SubmitAction(action); if (result.nResponseCode == 1) { // animate // this call returns immediately but the javascript method sets up an // animation that takes 1000ms to complete await JSRuntime.InvokeVoidAsync("tileAnimate", iFrom, status.ButtonId); await Task.Delay(100); // wait for javascript to grab the image // remove old piece from truck list // so the piece dissappears from the board truck.Update(game.NGameStatus, pieceFrom); await Task.Delay(900); // rest of time it takes for animation to complete. // flip piece if required if (action.nActionArguement % 5 != pieceFrom.NPosition) { pieceFrom.NPieceStatus = (pieceFrom.NPieceStatus | 2); // set bit 2 - star side down } // set pieceFrom new position and owner pieceFrom.NPosition = action.nActionArguement; pieceFrom.NOwner = Player.NPlayer; // updating components after animation completes // so the piece reappears at the destination game.NGameStatus = result.nGameStatus; playerBoard.Update(game.NGameStatus, pieceFrom); otherBoard.Update(game.NGameStatus); // first check if the game is over if ((game.NGameStatus & 2) == 0) { TurnMessage = "Game Over"; } else { bPollServer = true; TurnMessage = "Please wait"; } turnService.SetGameStatus(game.GameId, game.NGameStatus); // add new piece await RefillTruck(sourcePosition); StateHasChanged(); } } }