diff --git a/CardSharp/GameComponents/Desk.cs b/CardSharp/GameComponents/Desk.cs index 02a59b1..afef671 100644 --- a/CardSharp/GameComponents/Desk.cs +++ b/CardSharp/GameComponents/Desk.cs @@ -19,7 +19,7 @@ public class Desk : MessageSenderBase, IDesk, IEquatable #endregion - private readonly Dictionary _playersDictionary = new Dictionary(); + private Dictionary _playersDictionary = new Dictionary(); private readonly StandardParser _standardParser; @@ -114,6 +114,7 @@ public bool Start() if (Players.Count() != Constants.MaxPlayer) return false; + RandomizePlayers(); SendCards(); SendCardsMessage(); AddMessage("现在可以使用 [加倍/超级加倍/明牌] 之类的命令."); @@ -215,11 +216,11 @@ public void BoardcastCards() if (CurrentPlayer.FirstBlood) { CurrentPlayer.FirstBlood = false; - AddMessage($"{CurrentPlayer.ToAtCode()}请开始你的表演"); + AddMessage($"{CurrentPlayer.ToAtCodeWithRole()}请开始你的表演"); } else { - AddMessageLine($"{CurrentPlayer.ToAtCode()}请出牌"); + AddMessageLine($"{CurrentPlayer.ToAtCodeWithRole()}请出牌"); } else AddMessage($"{CurrentRule.ToString()}-{LastCards.ToFormatString()} {CurrentPlayer.ToAtCode()}请出牌"); @@ -299,6 +300,13 @@ public void FinishGame() Desks.Remove(DeskId); } + public void RandomizePlayers() + { + var players = new List(PlayerList); + players.Shuffle(); + _playersDictionary = players.ToDictionary(player => player.PlayerId); + } + public void SendToAllPlayers(string message) { PlayerList.ForEach(player => player.AddMessage(message)); diff --git a/CardSharp/GameComponents/Player.cs b/CardSharp/GameComponents/Player.cs index 54b420b..d29a91f 100644 --- a/CardSharp/GameComponents/Player.cs +++ b/CardSharp/GameComponents/Player.cs @@ -54,6 +54,23 @@ public virtual string ToAtCode() #endif } + public string ToAtCodeWithRole() + { + return $"{RoleToString()}[CQ:at,qq={PlayerId}]"; + } + + private string RoleToString() + { + switch (Type) + { + case PlayerType.Farmer: + return "农民"; + case PlayerType.Landlord: + return "地主"; + default: + throw new ArgumentOutOfRangeException(); + } + } public void SendCards(Desk desk) { diff --git a/CardSharp/GameSteps/CommandParser.cs b/CardSharp/GameSteps/CommandParser.cs index 887dd9c..268f152 100644 --- a/CardSharp/GameSteps/CommandParser.cs +++ b/CardSharp/GameSteps/CommandParser.cs @@ -13,7 +13,7 @@ public CommandParser(Desk desk) public void Prepare(Desk desk) { - desk.AddMessage($"请{desk.CurrentPlayer.ToAtCode()}出牌"); + desk.AddMessage($"请{desk.CurrentPlayer.ToAtCodeWithRole()}出牌"); RunHostedCheck(desk); } @@ -58,7 +58,7 @@ private void ParsePlayerSubmitCard(Desk desk, Player player, string command) player.SendCards(desk); if (CheckPlayerWin(desk)) return; if (player.Cards.Count <= Constants.BoardcastCardNumThreshold) - desk.AddMessageLine($"{player.ToAtCode()} 只剩{player.Cards.Count}张牌啦~"); + desk.AddMessageLine($"{player.ToAtCodeWithRole()} 只剩{player.Cards.Count}张牌啦~"); if (desk.SuddenDeathEnabled) desk.AddMessageLine("WARNING: SUDDEN DEATH ENABLED"); @@ -156,7 +156,7 @@ private bool ParseStandardCommand(Desk desk, Player player, string command) return true; case "全场牌数": desk.AddMessage(string.Join(Environment.NewLine, - desk.PlayerList.Select(p => $"{p.ToAtCode()}: {p.Cards.Count}"))); + desk.PlayerList.Select(p => $"{p.ToAtCodeWithRole()}: {p.Cards.Count}"))); return true; case "弃牌": player.GiveUp = true; @@ -200,11 +200,11 @@ private bool RunHostedCheck(Desk desk) switch (exists) { case true: - desk.AddMessageLine($" {cp.ToAtCode()} 托管出牌 {cards.ToFormatString()}"); + desk.AddMessageLine($" {cp.ToAtCodeWithRole()} 托管出牌 {cards.ToFormatString()}"); Parse(desk, cp, $"出{string.Join("", cards.Select(card => card.ToString()))}"); return true; case false: - desk.AddMessageLine($" {cp.ToAtCode()} 托管过牌"); + desk.AddMessageLine($" {cp.ToAtCodeWithRole()} 托管过牌"); Parse(desk, cp, "pass"); return true; } diff --git a/CardSharp/GameSteps/LandlordDiscuss.cs b/CardSharp/GameSteps/LandlordDiscuss.cs index 47b8813..9d820a1 100644 --- a/CardSharp/GameSteps/LandlordDiscuss.cs +++ b/CardSharp/GameSteps/LandlordDiscuss.cs @@ -17,7 +17,7 @@ public LandlordDiscuss(IEnumerable landlordCards, Desk desk) var player = desk.GetPlayerFromIndex(CurrentIndex); desk.AddMessage($"开始游戏, {player.ToAtCode()}你要抢地主吗?[抢地主/不抢]"); if (player is FakePlayer) { - Parse(desk, player, "抢"); + Parse(desk, player, "不抢"); } } @@ -103,10 +103,13 @@ public void Parse(Desk desk, Player player, string command) case "抢你妈的飞旋回踢张大麻子苟枫凌他当妈rbq": MoveNext(); desk.AddMessage( - $"{player.ToAtCode()}不抢地主, {desk.GetPlayerFromIndex(CurrentIndex).ToAtCode()}你要抢地主嘛?"); + $"{player.ToAtCode()}不抢地主, {desk.CurrentPlayer.ToAtCode()}你要抢地主嘛?"); _count++; break; } + if (desk.CurrentPlayer is FakePlayer) { + Parse(desk, player, "不抢"); + } } } } \ No newline at end of file diff --git a/CardSharp/GameSteps/StandardParser.cs b/CardSharp/GameSteps/StandardParser.cs index 31f63a7..cd0bce5 100644 --- a/CardSharp/GameSteps/StandardParser.cs +++ b/CardSharp/GameSteps/StandardParser.cs @@ -38,7 +38,7 @@ public void Parse(Desk desk, Player player, string command) desk.AddMessage(@"= 命令列表 = /////没牌的直接添加机器人好友(有牌的最好也添加)机器人会自动同意请求\\\\\ -Plugin by Cy. +Powered by Cy. 命令说明: 带有[D]的命令 还未开发完成 带有[B]的命令 是测试功能,可能会更改 @@ -62,7 +62,7 @@ 带有[R]的命令 是正式功能,'一般'不会做更改 [B]|结束游戏|:只有参与游戏的人可以使用 [R]|获取积分|:获取积分,12小时可获取10000分。 [R]|我的信息|:你的积分 -[B]|记牌器|:消耗500积分,显示每种牌在场上还剩下多少张 +[B]|记牌器|:显示每种牌在场上还剩下多少张 [B]|安静出牌启用|:所有信息都会私聊发送 [B]|安静出牌禁用|:所有信息不都会私聊发送 diff --git a/CardSharp/GameSteps/WaitingParser.cs b/CardSharp/GameSteps/WaitingParser.cs index 41cce60..7660d86 100644 --- a/CardSharp/GameSteps/WaitingParser.cs +++ b/CardSharp/GameSteps/WaitingParser.cs @@ -22,6 +22,11 @@ public void Parse(Desk desk, Player player, string command) desk.RemovePlayer(player); break; case "开始游戏": + if (desk.Players.All(p => p is FakePlayer)) + { + desk.AddMessage("仨机器人可不行哟~"); + return; + } if (desk.PlayerList.Count == 3) desk.Start(); else