示例#1
0
        private void MeldInternal(byte who, string meldCode)
        {
            var decoder            = new MeldDecoder(meldCode);
            var playerId           = who;
            var calledFromPlayerId = (playerId + decoder.CalledFromPlayerOffset) % 4;

            if (decoder.MeldType == MeldType.Shuntsu)
            {
                var tilesFromHand = decoder.Tiles.Except(new[] { decoder.CalledTile }).ToList();
                Meld(Node.Chii, playerId, calledFromPlayerId, decoder.CalledTile, tilesFromHand[0], tilesFromHand[1], 0);
            }
            else if (decoder.MeldType == MeldType.Koutsu)
            {
                var tilesFromHand = decoder.Tiles.Except(new[] { decoder.CalledTile }).ToList();
                Meld(Node.Pon, playerId, calledFromPlayerId, decoder.CalledTile, tilesFromHand[0], tilesFromHand[1], 0);
            }
            else if (decoder.MeldType == MeldType.CalledKan)
            {
                var tilesFromHand = decoder.Tiles.Except(new[] { decoder.CalledTile }).ToList();
                Meld(Node.Daiminkan, playerId, calledFromPlayerId, decoder.CalledTile, tilesFromHand[0], tilesFromHand[1], tilesFromHand[2]);
            }
            else if (decoder.MeldType == MeldType.AddedKan)
            {
                var tilesFromHand = decoder.Tiles.Except(new[] { decoder.CalledTile, decoder.AddedTile }).ToList();
                Meld(Node.Shouminkan, playerId, calledFromPlayerId, decoder.CalledTile, decoder.AddedTile, tilesFromHand[0], tilesFromHand[1]);
            }
            else if (decoder.MeldType == MeldType.ClosedKan)
            {
                Meld(Node.Ankan, playerId, playerId, decoder.Tiles[0], decoder.Tiles[1], decoder.Tiles[2], decoder.Tiles[3]);
            }
            else
            {
                Meld(Node.Nuki, playerId, playerId, decoder.Tiles[0], 0, 0, 0);
            }
        }
示例#2
0
        internal Meld(MeldDecoder decoder)
        {
            MeldType = decoder.MeldType;
            Tiles    = decoder.Tiles.OrderBy(t => t).Select(Tile.FromTileId).ToList();

            if (MeldType != MeldType.ClosedKan)
            {
                CalledFromPlayerOffset = decoder.CalledFromPlayerOffset;
                CalledTile             = Tile.FromTileId(decoder.CalledTile);
            }

            if (MeldType == MeldType.AddedKan)
            {
                AddedTile = Tile.FromTileId(decoder.AddedTile);
            }

            IsKan = MeldType == MeldType.CalledKan || MeldType == MeldType.ClosedKan || MeldType == MeldType.AddedKan;
        }