public override bool TargetFilter(Room room, List <Player> targets, Player to_select, Player Self, WrappedCard card) { if (targets.Count > 0 || RoomLogic.IsCardLimited(room, Self, card, HandlingMethod.MethodUse)) { return(false); } Game3v3Camp camp = to_select.Camp; foreach (Player p in room.GetAlivePlayers()) { if (Engine.IsProhibited(room, Self, p, card, targets) != null) { continue; } if (Self.Camp == camp && p.Camp == camp && p.Chained) { return(true); } else if (Self.Camp != camp && p.Camp == camp && !p.Chained) { return(true); } } return(false); }
public override void OnUse(Room room, CardUseStruct card_use) { if (card_use.To.Count == 0) { DoRecast(room, card_use); } else { Player player = card_use.From; CardUseStruct use = new CardUseStruct(card_use.Card, player, new List <Player>()); List <Player> targets = new List <Player>(); Game3v3Camp camp = card_use.To[0].Camp; foreach (Player p in room.GetAlivePlayers()) { if (player.Camp == camp && p.Camp == camp && p.Chained) { targets.Add(p); } else if (player.Camp != camp && p.Camp == camp && !p.Chained) { targets.Add(p); } } foreach (Player p in targets) { Skill skill = Engine.IsProhibited(room, player, p, card_use.Card); if (skill != null) { skill = Engine.GetMainSkill(skill.Name); LogMessage log = new LogMessage { Type = "#SkillAvoid", From = player.Name, Arg = skill.Name, Arg2 = Name }; room.SendLog(log); if (RoomLogic.PlayerHasShownSkill(room, player, skill)) { room.BroadcastSkillInvoke(skill.Name, player); room.NotifySkillInvoked(player, skill.Name); } } else { use.To.Add(p); } } room.SortByActionOrder(ref use); base.OnUse(room, use); } }
public override string GetPreWinner(Room room, Client client) { Player surrender = room.GetPlayers(client.UserId)[0]; List <string> winners = new List <string>(); Game3v3Camp dead_camp = surrender.Camp; foreach (Player p in room.Players) { if (p.Camp != dead_camp) { winners.Add(p.Name); } } return(string.Join("+", winners)); }
//胜利条件 public override string GetWinner(Room room) { if (!string.IsNullOrEmpty(room.PreWinner)) { return(room.PreWinner); } List <string> winners = new List <string>(); List <Player> players = room.GetAlivePlayers(); Game3v3Camp dead_camp = Game3v3Camp.S_CAMP_NONE; foreach (Player p in room.Players) { if (p.GetRoleEnum() == Player.PlayerRole.Lord && !p.Alive) { dead_camp = p.Camp; break; } } if (dead_camp == Game3v3Camp.S_CAMP_WARM) { foreach (Player p in room.Players) { if (p.Camp == Game3v3Camp.S_CAMP_COOL) { winners.Add(p.Name); } } } else if (dead_camp == Game3v3Camp.S_CAMP_COOL) { foreach (Player p in room.Players) { if (p.Camp == Game3v3Camp.S_CAMP_WARM) { winners.Add(p.Name); } } } return(string.Join("+", winners)); }
public override void PrepareForStart(Room room, ref List <Player> room_players, ref List <int> game_cards, ref List <int> m_drawPile) { //生成卡牌 game_cards = Engine.GetGameCards(room.Setting.CardPackage); m_drawPile = game_cards; Shuffle.shuffle(ref m_drawPile); //首先添加4位AI,不需要用到client for (int i = 4; i < 8; i++) { room_players.Add(new Player { Name = string.Format("SGS{0}", i + 1), Seat = i + 1 }); } //根据随机座次 List <List <Game3v3Camp> > camps = new List <List <Game3v3Camp> > { new List <Game3v3Camp> { Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL }, new List <Game3v3Camp> { Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM }, new List <Game3v3Camp> { Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM }, new List <Game3v3Camp> { Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM, Game3v3Camp.S_CAMP_COOL }, }; Random rd = new Random(); int index = rd.Next(0, 4); List <Game3v3Camp> games = camps[index], choose = new List <Game3v3Camp> { Game3v3Camp.S_CAMP_COOL, Game3v3Camp.S_CAMP_WARM }; Game3v3Camp player_camp = choose[rd.Next(2)]; List <Client> clients = new List <Client>(room.Clients); Shuffle.shuffle(ref clients); int player_index = 0; int computer_index = 1; bool warm_lord = false; for (int i = 0; i < room_players.Count; i++) { Player player = room_players[i]; player.Camp = games[i]; if (player.Camp == player_camp) { Client client = clients[player_index]; player_index++; if (client.UserId > 0) { client.Status = Client.GameStatus.online; } player.SceenName = client.Profile.NickName; player.Status = client.Status.ToString(); player.ClientId = client.UserId; } else { player.SceenName = string.Format("computer{0}", computer_index); computer_index++; player.Status = "bot"; player.ClientId = 0; } if (i == 0) { player.Role = "lord"; player.Next = room_players[i + 1].Name; } else if (i == 7) { player.Next = room_players[0].Name; } else { player.Next = room_players[i + 1].Name; } if (player.Camp == Game3v3Camp.S_CAMP_WARM && !warm_lord) { player.Role = "lord"; warm_lord = true; } if (player.GetRoleEnum() != Player.PlayerRole.Lord) { player.Role = "loyalist"; } room.BroadcastProperty(player, "Camp"); room.BroadcastProperty(player, "Role"); } }
private void MessageForward(Client sourcer, MyData data) { MyData message = new MyData { Description = PacketDescription.Hall2Cient, Protocol = data.Protocol }; message.Body = data.Body; switch (data.Protocol) { case protocol.Message2Hall: foreach (Client client in UId2ClientTable.Values) { if (client.GameRoom <= 0) { client.SendMessage(message); } } break; case protocol.Message2Client: Client destination = GetClient(int.Parse(data.Body[2])); if (destination != null) { destination.SendMessage(message); } break; case protocol.Message2Room: message.Description = PacketDescription.Room2Cient; Room room = GetRoom(sourcer.GameRoom); if (room != null) { if (!room.GameStarted || !room.Setting.SpeakForbidden || data.Body.Count == 3) { if (!room.GameStarted) { foreach (Client dest in room.Clients) { if (dest.GameRoom == room.RoomId) { dest.SendMessage(message); } } } else { //假如双方有分冷暖阵营,则只有同阵营之间可以通讯 Game3v3Camp camp = room.GetPlayers(sourcer)[0].Camp; foreach (Client dest in room.Clients) { if (dest.GameRoom == room.RoomId && room.GetPlayers(dest)[0].Camp == camp) { dest.SendMessage(message); } } } } } break; case protocol.MessageSystem: if (sourcer.UserRight >= 3) { foreach (Client client in UId2ClientTable.Values) { client.SendMessage(message); } } break; default: return; } }
public override void OnUse(Room room, CardUseStruct card_use) { if (card_use.To.Count == 0) { DoRecast(room, card_use); } else { Player player = card_use.From; CardUseStruct use = new CardUseStruct(card_use.Card, player, new List <Player>()); List <Player> targets = new List <Player>(); Game3v3Camp camp = card_use.To[0].Camp; foreach (Player p in room.GetAlivePlayers()) { if (player.Camp == camp && p.Camp == camp && p.Chained) { targets.Add(p); } else if (player.Camp != camp && p.Camp == camp && !p.Chained) { targets.Add(p); } } foreach (Player p in targets) { Skill skill = Engine.IsProhibited(room, player, p, card_use.Card); if (skill != null) { skill = Engine.GetMainSkill(skill.Name); LogMessage log = new LogMessage { Type = "#SkillAvoid", From = p.Name, Arg = skill.Name, Arg2 = Name }; room.SendLog(log); if (RoomLogic.PlayerHasShownSkill(room, p, skill)) { room.NotifySkillInvoked(p, skill.Name); GeneralSkin gsk = RoomLogic.GetGeneralSkin(room, p, skill.Name); string genral = gsk.General; int skin_id = gsk.SkinId; string skill_name = skill.Name; int audio = -1; skill.GetEffectIndex(room, p, card_use.Card, ref audio, ref skill_name, ref genral, ref skin_id); if (audio >= -1) { room.BroadcastSkillInvoke(skill_name, "male", audio, genral, skin_id); } } } else { use.To.Add(p); } } room.SortByActionOrder(ref use); base.OnUse(room, use); } }
private void MessageForward(Client sourcer, MyData data) { try { MyData message = new MyData { Description = PacketDescription.Hall2Cient, Protocol = data.Protocol }; message.Body = data.Body; List <Client> clients = new List <Client>(UId2ClientTable.Values); switch (data.Protocol) { case Protocol.Message2Hall: foreach (Client client in clients) { if (client.GameRoom <= 0) { client.SendMessage(message); } } break; case Protocol.Message2Client: if (UId2ClientTable.TryGetValue(int.Parse(data.Body[2]), out Client destination) && destination != null) { destination.SendMessage(message); } break; case Protocol.Message2Room: message.Description = PacketDescription.Room2Cient; Room room = GetRoom(sourcer.GameRoom); if (room != null) { if (!room.GameStarted || !room.Setting.SpeakForbidden || data.Body.Count == 3) { if (!room.GameStarted) { foreach (Client dest in room.Clients) { if (dest.GameRoom == room.RoomId) { dest.SendMessage(message); } } } else { //假如双方有分冷暖阵营,则只有同阵营之间可以通讯 Game3v3Camp camp = room.GetPlayers(sourcer.UserID)[0].Camp; foreach (Client dest in room.Clients) { if (dest.GameRoom == room.RoomId && room.GetPlayers(dest.UserID)[0].Camp == camp) { dest.SendMessage(message); } } } } } break; case Protocol.MessageSystem: if (sourcer.UserRight >= 3) { foreach (Client client in clients) { client.SendMessage(message); } } break; default: return; } } catch (Exception e) { LogHelper.WriteLog(null, e); Debug(string.Format("error on message forward {0} {1}", e.Message, e.TargetSite)); } }