Пример #1
0
        private OutTurnOperationType ChooseOperations()
        {
            Debug.Log($"[Server] Operation before choosing: {string.Join(",", Operations)}");
            // test every circumstances by priority
            // test for rong
            if (Operations.Any(op => op.Type == OutTurnOperationType.Rong))
            {
                // check if 3 rong
                if (CurrentRoundStatus.CheckThreeRongs(Operations))
                {
                    for (int i = 0; i < Operations.Length; i++)
                    {
                        Operations[i] = new OutTurnOperation
                        {
                            Type          = OutTurnOperationType.RoundDraw,
                            RoundDrawType = RoundDrawType.ThreeRong
                        };
                    }

                    return(OutTurnOperationType.RoundDraw);
                }

                for (int i = 0; i < Operations.Length; i++)
                {
                    if (Operations[i].Type != OutTurnOperationType.Rong)
                    {
                        Operations[i] = new OutTurnOperation {
                            Type = OutTurnOperationType.Skip
                        }
                    }
                    ;
                }

                return(OutTurnOperationType.Rong);
            }

            // check if 4 winds
            if (CurrentRoundStatus.CheckFourWinds())
            {
                Debug.Log($"[Server] Round draw -- Four winds");
                for (int i = 0; i < Operations.Length; i++)
                {
                    Operations[i] = new OutTurnOperation
                    {
                        Type          = OutTurnOperationType.RoundDraw,
                        RoundDrawType = RoundDrawType.FourWinds
                    };
                }

                return(OutTurnOperationType.RoundDraw);
            }

            // check if 4 richis
            if (CurrentRoundStatus.CheckFourRichis())
            {
                Debug.Log($"[Server] Round draw -- Four richis");
                for (int i = 0; i < Operations.Length; i++)
                {
                    Operations[i] = new OutTurnOperation
                    {
                        Type          = OutTurnOperationType.RoundDraw,
                        RoundDrawType = RoundDrawType.FourRichis
                    };
                }

                return(OutTurnOperationType.RoundDraw);
            }

            // check if 4 kongs
            if (CurrentRoundStatus.CheckFourKongs())
            {
                Debug.Log($"[Server] Round draw -- Four kongs");
                for (int i = 0; i < Operations.Length; i++)
                {
                    Operations[i] = new OutTurnOperation
                    {
                        Type          = OutTurnOperationType.RoundDraw,
                        RoundDrawType = RoundDrawType.FourKongs
                    };
                }

                return(OutTurnOperationType.RoundDraw);
            }

            // check if run out of tiles -- leads to a normal round draw
            if (MahjongSet.TilesRemain == gameSettings.MountainReservedTiles)
            {
                // no more tiles to draw and no one choose a rong operation.
                Debug.Log("No more tiles to draw and nobody claims a rong, the round has drawn.");
                for (int i = 0; i < Operations.Length; i++)
                {
                    Operations[i] = new OutTurnOperation
                    {
                        Type          = OutTurnOperationType.RoundDraw,
                        RoundDrawType = RoundDrawType.RoundDraw
                    }
                }
                ;
                return(OutTurnOperationType.RoundDraw);
            }

            // check if some one claimed kong
            if (Operations.Any(op => op.Type == OutTurnOperationType.Kong))
            {
                for (int i = 0; i < Operations.Length; i++)
                {
                    if (Operations[i].Type != OutTurnOperationType.Kong)
                    {
                        Operations[i] = new OutTurnOperation {
                            Type = OutTurnOperationType.Skip
                        }
                    }
                    ;
                }

                return(OutTurnOperationType.Kong);
            }

            // check if some one claimed pong
            if (Operations.Any(op => op.Type == OutTurnOperationType.Pong))
            {
                for (int i = 0; i < Operations.Length; i++)
                {
                    if (Operations[i].Type != OutTurnOperationType.Pong)
                    {
                        Operations[i] = new OutTurnOperation {
                            Type = OutTurnOperationType.Skip
                        }
                    }
                    ;
                }

                return(OutTurnOperationType.Pong);
            }

            // check if some one claimed chow
            if (Operations.Any(op => op.Type == OutTurnOperationType.Chow))
            {
                for (int i = 0; i < Operations.Length; i++)
                {
                    if (Operations[i].Type != OutTurnOperationType.Chow)
                    {
                        Operations[i] = new OutTurnOperation {
                            Type = OutTurnOperationType.Skip
                        }
                    }
                    ;
                }

                return(OutTurnOperationType.Chow);
            }

            // no particular operations -- skip
            return(OutTurnOperationType.Skip);
        }