Пример #1
0
        private void NextState()
        {
            if (outTurnOperations.All(op => op.Type == OutTurnOperationType.Skip))
            {
                // no one claimed rong
                var turnDoraAfterDiscard = false;
                var isLingShang          = gameSettings.AllowBeiDoraTsumoAsLingShang;
                CurrentRoundStatus.BreakOneShotsAndFirstTurn();
                ServerBehaviour.Instance.DrawTile(CurrentPlayerIndex, isLingShang, turnDoraAfterDiscard);
                return;
            }

            if (outTurnOperations.Any(op => op.Type == OutTurnOperationType.Rong))
            {
                var tile = new Tile(Suit.Z, 4);
                var turnDoraAfterDiscard = false;
                var isRobKong            = gameSettings.AllowBeiDoraRongAsRobbKong;
                ServerBehaviour.Instance.TurnEnd(CurrentPlayerIndex, tile, false, outTurnOperations, isRobKong,
                                                 turnDoraAfterDiscard);
                return;
            }

            Debug.LogError(
                $"[Server] Logically cannot reach here, operations are {string.Join("|", outTurnOperations)}");
        }
Пример #2
0
        public override void OnServerStateEnter()
        {
            if (CurrentRoundStatus.CurrentPlayerIndex != CurrentPlayerIndex)
            {
                Debug.LogError("CurrentPlayerIndex does not match, this should not happen");
                CurrentRoundStatus.CurrentPlayerIndex = CurrentPlayerIndex;
            }

            firstTime = Time.time;
            // determines the operation to take when turn ends
            operationChosen = ChooseOperations();
            Debug.Log(
                $"The operation chosen by this round is {operationChosen}, operation after choosing: {string.Join(",", Operations)}");
            // if operation is not rong or round-draw, perform richi and test zhenting
            if (operationChosen != OutTurnOperationType.Rong && operationChosen != OutTurnOperationType.RoundDraw)
            {
                CurrentRoundStatus.TryRichi(CurrentPlayerIndex, IsRichiing);
                CurrentRoundStatus.UpdateTempZhenting(CurrentPlayerIndex, DiscardingTile);
                CurrentRoundStatus.UpdateDiscardZhenting();
                CurrentRoundStatus.UpdateRichiZhenting(DiscardingTile);
            }

            // Send messages to clients
            for (int i = 0; i < players.Count; i++)
            {
                var info = new EventMessages.TurnEndInfo
                {
                    PlayerIndex         = i,
                    ChosenOperationType = operationChosen,
                    Operations          = Operations,
                    Points         = CurrentRoundStatus.Points.ToArray(),
                    RichiStatus    = CurrentRoundStatus.RichiStatusArray,
                    RichiSticks    = CurrentRoundStatus.RichiSticks,
                    Zhenting       = CurrentRoundStatus.IsZhenting(i),
                    MahjongSetData = MahjongSet.Data
                };
                var player = CurrentRoundStatus.GetPlayer(i);
                ClientBehaviour.Instance.photonView.RPC("RpcTurnEnd", player, info);
            }

            serverTurnEndTimeOut =
                operationChosen == OutTurnOperationType.Rong || operationChosen == OutTurnOperationType.RoundDraw
                                        ? ServerConstants.ServerTurnEndTimeOutExtra
                                        : ServerConstants.ServerTurnEndTimeOut;
            if (operationChosen == OutTurnOperationType.Chow ||
                operationChosen == OutTurnOperationType.Pong ||
                operationChosen == OutTurnOperationType.Kong)
            {
                CurrentRoundStatus.BreakOneShotsAndFirstTurn();
            }
        }
Пример #3
0
 private void NextState()
 {
     if (outTurnOperations.All(op => op.Type == OutTurnOperationType.Skip))
     {
         // no one claimed a rob kong
         var turnDoraAfterDiscard = Kong.Side != MeldSide.Self;
         CurrentRoundStatus.BreakOneShotsAndFirstTurn();
         ServerBehaviour.Instance.DrawTile(CurrentPlayerIndex, true, turnDoraAfterDiscard);
         return;
     }
     if (outTurnOperations.Any(op => op.Type == OutTurnOperationType.Rong))
     {
         var discardingTile = GetTileFromKong();
         ServerBehaviour.Instance.TurnEnd(CurrentPlayerIndex, discardingTile, false, outTurnOperations, true, false);
         return;
     }
     Debug.LogError($"[Server] Logically cannot reach here, operations are {string.Join("|", outTurnOperations)}");
 }