Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        //胜利条件
        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));
        }
Exemplo n.º 5
0
        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");
            }
        }
Exemplo n.º 6
0
        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;
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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));
            }
        }