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); } }
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; }