/// <summary> /// Tiến hành khiêu chiến giữa 2 người. /// </summary> /// <param name="lower">Người chơi có thứ hạng cao hơn (số nhỏ hơn).</param> /// <param name="upper">Người chơi có thứ hạng thấp hơn (số lớn hơn).</param> /// <param name="lowerId">ID của người chơi thứ hạng cao.</param> /// <param name="lowerRank">Thứ hạng của người chơi thứ hạng cao.</param> /// <returns>True nếu khiêu chiến thành công.</returns> private async Task <bool> DuelAsync(IPacketWriter lower, IPacketWriter upper, long lowerId, int lowerRank) { // Chọn trận trường xà. var p0 = await lower.SetDefaultFormationAsync(10); if (p0 == null) { return(false); } Debug.Assert(p0.CommandId == "42104"); // Gỡ bỏ toàn bộ tướng. var p1 = await lower.RemoveAllHeroesFromFormationAsync(10); if (p1 == null) { return(false); } Debug.Assert(p1.CommandId == "42107"); // Chọn trận truỳ hình (không trống). var p2 = await upper.SetDefaultFormationAsync(13); if (p2 == null) { return(false); } Debug.Assert(p2.CommandId == "42104"); // Khiêu chiến. var p3 = await upper.DuelArenaAsync(lowerId, lowerRank); if (p3 == null) { return(false); } Debug.Assert(p3.CommandId == "64007"); // FIXME: kiểm tra trận có tướng không? // FIXME: kiểm tra thứ hạng thay đổi không? // Chọn lại trận truỳ hình. var p4 = await lower.SetDefaultFormationAsync(13); if (p4 == null) { return(false); } Debug.Assert(p4.CommandId == "42104"); return(true); }