protected virtual void RewardAndPunish(Room room, Player killer, Player victim)
        {
            if (!killer.Alive || !killer.HasShownOneGeneral())
            {
                return;
            }


            if (!RoomLogic.IsFriendWith(room, killer, victim))
            {
                int n = 1;
                foreach (Player p in room.GetOtherPlayers(victim))
                {
                    if (RoomLogic.IsFriendWith(room, victim, p))
                    {
                        ++n;
                    }
                }
                room.DrawCards(killer, n, "gamerule");
            }
            else
            {
                room.ThrowAllHandCardsAndEquips(killer);
            }
        }
Exemple #2
0
        public override int GetExtra(Room room, Player target)
        {
            if (RoomLogic.HasArmorEffect(room, target, PeaceSpell.ClassName))
            {
                int count = 1;
                foreach (Player p in room.GetOtherPlayers(target))
                {
                    if (RoomLogic.IsFriendWith(room, target, p))
                    {
                        count++;
                    }
                }

                count += target.GetPile("heavenly_army").Count;

                return(count);
            }

            return(0);
        }
Exemple #3
0
        public override bool IsEnabledAtPlay(Room room, Player player)
        {
            if (room.AliveCount() < 4)
            {
                return(false);
            }
            if (player.HasFlag("Global_SummonFailed"))
            {
                return(false);
            }
            if (!player.CanShowGeneral(RoomLogic.InPlayerHeadSkills(player, Name) ? "h" : "d"))
            {
                return(false);
            }
            if (!player.HasShownOneGeneral() && Hegemony.WillbeRole(room, player) == "careerist")
            {
                return(false);
            }
            BattleArraySkill skill = (BattleArraySkill)Engine.GetTriggerSkill(Name);

            if (skill != null)
            {
                ArrayType type = skill.Type;
                switch (type)
                {
                case ArrayType.Siege:
                {
                    if (RoomLogic.WillBeFriendWith(room, player, room.GetNextAlive(player)) &&
                        RoomLogic.WillBeFriendWith(room, player, room.GetLastAlive(player)))
                    {
                        return(false);
                    }
                    if (!RoomLogic.WillBeFriendWith(room, player, room.GetNextAlive(player)))
                    {
                        if (!room.GetNextAlive(player, 2).HasShownOneGeneral() && room.GetNextAlive(player).HasShownOneGeneral())
                        {
                            return(true);
                        }
                    }
                    if (!RoomLogic.WillBeFriendWith(room, player, room.GetLastAlive(player)))
                    {
                        return(!room.GetLastAlive(player, 2).HasShownOneGeneral() && room.GetLastAlive(player).HasShownOneGeneral());
                    }
                    break;
                }

                case ArrayType.Formation:
                {
                    int n     = room.AliveCount(false);
                    int asked = n;
                    for (int i = 1; i < n; ++i)
                    {
                        Player target = room.GetNextAlive(player, i);
                        if (RoomLogic.IsFriendWith(room, player, target))
                        {
                            continue;
                        }
                        else if (!target.HasShownOneGeneral())
                        {
                            return(true);
                        }
                        else
                        {
                            asked = i;
                            break;
                        }
                    }
                    n -= asked;
                    for (int i = 1; i < n; ++i)
                    {
                        Player target = room.GetLastAlive(player, i);
                        if (RoomLogic.IsFriendWith(room, player, target))
                        {
                            continue;
                        }
                        else
                        {
                            return(!target.HasShownOneGeneral());
                        }
                    }
                    break;
                }
                }
            }
            return(false);
        }
        public override double CardValue(TrustedAI ai, Player player, bool use, WrappedCard card, Player.Place place)
        {
            double value = 0;
            Room   room  = ai.Room;

            if (ai.HasSkill("wendao", player))
            {
                if (use)
                {
                    value += 5;
                }
                else
                {
                    if (!player.HasUsed(WendaoCard.ClassName) || room.Current != player)
                    {
                        value -= 10;
                    }
                }
            }
            else
            {
                Player target = null;
                foreach (Player p in room.GetOtherPlayers(player))
                {
                    if (ai.HasSkill("wendao", p))
                    {
                        target = p;
                        break;
                    }
                }

                if (target != null)
                {
                    if (!ai.HasSkill("flamemap", player) || !use)
                    {
                        value -= 7;
                    }
                }
                else
                {
                    foreach (Player p in room.GetOtherPlayers(player))
                    {
                        if (RoomLogic.IsFriendWith(room, player, p))
                        {
                            value += 0.5;
                        }
                    }
                }

                if (!use && player.Hp == 1 && player.HandcardNum <= 1 && place == Player.Place.PlaceEquip)
                {
                    value -= 3;
                }
            }
            if (player.Chained)
            {
                value += 1;
            }

            return(value);
        }
Exemple #5
0
        //阵亡聊天
        private static void OnDeath(Room room, Player player, object data)
        {
            if (player.ClientId < 0 && data is DeathStruct death)
            {
                //几率1/3聊天
                if (Shuffle.random(1, 3))
                {
                    Client client = room.GetClient(player);
                    //50%随机是发言还是表情
                    bool speak = Shuffle.random(1, 2);
                    if (room.Setting.SpeakForbidden)
                    {
                        speak = false;
                    }

                    DataRow row = Engine.GetLines(client.Profile.NickName);
                    if (speak)
                    {
                        string message = row["death1"].ToString();
                        if (!string.IsNullOrEmpty(message))
                        {
                            if (message.Contains("%1"))
                            {
                                if (death.Damage.From != null)
                                {
                                    message = message.Replace("%1", death.Damage.From.SceenName);
                                }
                                else
                                {
                                    message = string.Empty;
                                }
                            }

                            if (!string.IsNullOrEmpty(message))
                            {
                                room.Speak(client, message);
                            }
                        }
                    }
                    else
                    {
                        string messages = row["death2"].ToString();
                        if (!string.IsNullOrEmpty(messages))
                        {
                            string[] ms = messages.Split('/');
                            room.Emotion(client, ms[0], ms[1]);
                        }
                    }
                }

                //杀死非友方时
                if (death.Damage.From != null && death.Damage.From != player && death.Damage.From.ClientId < 0 &&
                    !RoomLogic.IsFriendWith(room, death.Damage.From, player) && Shuffle.random(1, 3))
                {
                    Client client = room.GetClient(death.Damage.From);
                    //50%随机是发言还是表情
                    bool speak = Shuffle.random(1, 2);
                    if (room.Setting.SpeakForbidden)
                    {
                        speak = false;
                    }

                    DataRow row = Engine.GetLines(client.Profile.NickName);
                    if (speak)
                    {
                        string message = row["kill1"].ToString();
                        if (!string.IsNullOrEmpty(message) && !message.Contains("%1"))
                        {
                            message = message.Replace("%1", player.SceenName);
                            room.Speak(client, message);
                        }
                    }
                    else
                    {
                        string messages = row["kill2"].ToString();
                        if (!string.IsNullOrEmpty(messages))
                        {
                            string[] ms = messages.Split('/');
                            room.Emotion(client, ms[0], ms[1]);
                        }
                    }
                }
            }
        }
Exemple #6
0
        private static void OnUseCard(Room room, Player player, object data)
        {
            if (data is CardUseStruct use)
            {
                if (use.Card.Name == Analeptic.ClassName &&
                    (use.Reason == CardUseStruct.CardUseReason.CARD_USE_REASON_PLAY || room.GetRoomState().GetCurrentCardUsePattern(player) == "@@rende") &&
                    use.Card.Skill != "_zhendu")
                {
                    List <Client> ais = new List <Client>();
                    foreach (Player p in room.GetAlivePlayers())
                    {
                        Client client = room.GetClient(p);
                        if (p.ClientId < 0 && !ais.Contains(client) && RoomLogic.InMyAttackRange(room, player, p) && !RoomLogic.IsFriendWith(room, player, p) &&
                            room.GetClient(player) != client && Shuffle.random(1, 3))
                        {
                            ais.Add(client);
                        }
                    }

                    if (ais.Count == 0)
                    {
                        return;
                    }
                    foreach (Client client in ais)
                    {
                        bool speak = Shuffle.random(1, 2);
                        if (room.Setting.SpeakForbidden)
                        {
                            speak = false;
                        }

                        DataRow row = Engine.GetLines(client.Profile.NickName);
                        if (speak)
                        {
                            string message = row["other_drunk1"].ToString();
                            if (!string.IsNullOrEmpty(message))
                            {
                                message = message.Replace("%1", player.SceenName);
                                room.Speak(client, message);
                            }
                        }
                        else
                        {
                            string messages = row["other_drunk2"].ToString();
                            if (!string.IsNullOrEmpty(messages))
                            {
                                string[] ms = messages.Split('/');
                                room.Emotion(client, ms[0], ms[1]);
                            }
                        }
                    }
                }
                else if (player.ClientId < 0 && use.Card.Name.Contains(Slash.ClassName) &&
                         (use.Reason == CardUseStruct.CardUseReason.CARD_USE_REASON_PLAY || room.GetRoomState().GetCurrentCardUsePattern(player) == "@@rende") &&
                         use.To.Count == 1 && !RoomLogic.IsFriendWith(room, player, use.To[0]) && Shuffle.random(1, 3))
                {
                    Client client = room.GetClient(player);

                    bool speak = Shuffle.random(1, 2);
                    if (room.Setting.SpeakForbidden)
                    {
                        speak = false;
                    }

                    DataRow row = Engine.GetLines(client.Profile.NickName);
                    if (speak)
                    {
                        string message = row["slash_use1"].ToString();
                        if (!string.IsNullOrEmpty(message))
                        {
                            message = message.Replace("%1", use.To[0].SceenName);
                            room.Speak(client, message);
                        }
                    }
                    else
                    {
                        string messages = row["slash_use2"].ToString();
                        if (!string.IsNullOrEmpty(messages))
                        {
                            string[] ms = messages.Split('/');
                            room.Emotion(client, ms[0], ms[1]);
                        }
                    }
                }
            }
        }
Exemple #7
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();
            Player        win_player = players[0];

            if (players.Count == 1)
            {
                if (!win_player.General1Showed)
                {
                    room.ShowGeneral(win_player, true, false, false);
                }
                if (!win_player.General2Showed)
                {
                    room.ShowGeneral(win_player, false, false, false);
                }
                foreach (Player p in room.Players)
                {
                    if (RoomLogic.IsFriendWith(room, win_player, p))
                    {
                        winners.Add(p.Name);
                    }
                }
            }
            else
            {
                bool   has_diff_kingdoms = false;
                string left_kingdom      = null;
                foreach (Player p in players)
                {
                    left_kingdom = General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]);
                    foreach (Player p2 in players)
                    {
                        if (p == p2)
                        {
                            continue;
                        }
                        if (p.HasShownOneGeneral() && p2.HasShownOneGeneral() && !RoomLogic.IsFriendWith(room, p, p2))
                        {
                            has_diff_kingdoms = true;
                            break;// if both shown but not friend, hehe.
                        }
                        if ((p.HasShownOneGeneral() && !p2.HasShownOneGeneral() && !RoomLogic.WillBeFriendWith(room, p2, p)) ||
                            (!p.HasShownOneGeneral() && p2.HasShownOneGeneral() && !RoomLogic.WillBeFriendWith(room, p, p2)))
                        {
                            has_diff_kingdoms = true;
                            break;// if either shown but not friend, hehe.
                        }
                        if (!p.HasShownOneGeneral() && !p2.HasShownOneGeneral())
                        {
                            if (Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]
                                != Engine.GetGeneral(p2.ActualGeneral1, room.Setting.GameMode).Kingdom[0])
                            {
                                has_diff_kingdoms = true;
                                break;  // if neither shown and not friend, hehe.
                            }
                        }
                    }
                    if (has_diff_kingdoms)
                    {
                        break;
                    }
                }

                bool all_live_shown = true;
                if (!has_diff_kingdoms)
                {                      //check all shown before judging careerist, cos same skills could change kindom such as dragonphoenix
                    foreach (Player p in players)
                    {
                        if (!p.HasShownOneGeneral())
                        {
                            all_live_shown = false;
                        }
                    }
                }

                if (!has_diff_kingdoms && !all_live_shown)
                { // judge careerist
                    List <string> lords = new List <string>();
                    int           all   = 0;
                    foreach (Player p in room.Players)
                    {
                        if (p.HasShownOneGeneral())
                        {
                            if (p.Kingdom == left_kingdom && p.Role != "careerist")
                            {
                                all++;
                            }
                        }
                        else if (General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]) == left_kingdom)
                        {
                            all++;
                        }
                    }

                    foreach (Player p in room.Players)
                    {
                        if (Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).IsLord())
                        {
                            if (p.Alive && p.General1Showed)                //the lord has shown
                            {
                                lords.Add(General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]));
                            }
                            else if (!p.Alive && p.Kingdom == left_kingdom)   //the lord is dead, all careerist
                            {
                                return(null);
                            }
                            else if (p.Alive && !p.HasShownOneGeneral() && all > room.Players.Count / 2) //the lord not yet shown
                            {
                                return(null);
                            }
                        }
                    }
                    if (lords.Count == 0 && all > room.Players.Count / 2)       //careerist exists
                    {
                        has_diff_kingdoms = true;
                    }
                }

                if (has_diff_kingdoms)
                {
                    return(null);                      //if has enemy, hehe
                }
                // if run here, all are friend.
                foreach (Player p in players)
                {
                    if (!p.General1Showed)
                    {
                        room.ShowGeneral(p, true, false, false); // dont trigger event
                    }
                    if (!p.General2Showed)
                    {
                        room.ShowGeneral(p, false, false, false);
                    }
                }

                foreach (Player p in room.Players)
                {
                    if (RoomLogic.IsFriendWith(room, win_player, p))
                    {
                        winners.Add(p.Name);
                    }
                }
            }

            return(string.Join("+", winners));
        }
Exemple #8
0
        public override ScoreStruct GetDamageScore(DamageStruct _damage, DamageStruct.DamageStep step = DamageStruct.DamageStep.Caused)
        {
            DamageStruct damage = new DamageStruct(_damage.Card, _damage.From, _damage.To, _damage.Damage, _damage.Nature)
            {
                Reason         = _damage.Reason,
                Steped         = _damage.Steped,
                Transfer       = _damage.Transfer,
                TransferReason = _damage.TransferReason,
                Chain          = _damage.Chain
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, step);
            }

            Player from = damage.From;
            Player to   = damage.To;

            if (damage.Steped < DamageStruct.DamageStep.Caused)
            {
                damage.Steped = DamageStruct.DamageStep.Caused;
            }

            ScoreStruct result_score = new ScoreStruct
            {
                Damage   = damage,
                DoDamage = true
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, DamageStruct.DamageStep.Done);
            }
            damage.Steped       = DamageStruct.DamageStep.Done;
            result_score.Damage = damage;

            List <ScoreStruct> scores = new List <ScoreStruct>();
            bool deadly = false;

            if (damage.Damage > 0 && !to.Removed)
            {
                double value = 0;
                value = Math.Min(damage.Damage, to.Hp) * 3.5;
                if (IsWeak(to))
                {
                    value += 4;
                    if (damage.Damage > to.Hp)
                    {
                        if (!CanSave(to, damage.Damage - to.Hp + 1))
                        {
                            int over_damage = damage.Damage - to.Hp;
                            for (int i = 1; i <= over_damage; i++)
                            {
                                double x = HasSkill("buqu", to) ? 1 / Math.Pow(i, 2) : (double)8 / Math.Pow(i, 2);
                                value += x;
                            }
                        }
                        else
                        {
                            deadly = true;
                        }
                    }
                }

                //刚直应该这里就停止计算
                if (HasSkill("gangzhi", to))
                {
                    if (IsFriend(to))
                    {
                        value = -value;
                    }
                    if (priority_enemies.Contains(to) && value > 0)
                    {
                        value *= 1.5;
                    }
                    if (to.GetRoleEnum() == Player.PlayerRole.Lord)
                    {
                        value *= 1.2;
                    }
                    result_score.DoDamage = false;
                    result_score.Score    = value;
                    return(result_score);
                }

                if (!to.Removed && CanResist(to, damage.Damage))
                {
                    result_score.Score = 3;
                }
                if (IsFriend(to))
                {
                    value = -value;
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value -= 3;
                        }
                        else if (!RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value -= 2;
                        }
                    }
                }
                else
                {
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value += 2.5;
                        }
                        else if (IsFriend(damage.From) && !RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value += 4;
                        }
                    }
                }

                foreach (SkillEvent e in skill_events.Values)
                {
                    if (e.Name != damage.Reason)
                    {
                        value += e.GetDamageScore(this, damage).Score;
                    }
                }
                if (priority_enemies.Contains(to) && value > 0)
                {
                    value *= 1.5;
                }

                //ai debug log

                /*
                 * if ((RoomLogic.IsFriendWith(room, self, to) || IsFriend(to)) && value > 0)
                 * {
                 *  string damage_from = damage.From != null ? string.Format("{0},{1} has skills {2}", damage.From.General1Showed ? damage.From.ActualGeneral1 : "hidden head",
                 *      damage.From.General2Showed ? damage.From.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.From))) : "no damage from";
                 *  string damage_str = string.Format("nature {0} count {1} reason {2}", damage.Nature == DamageStruct.DamageNature.Normal ? "normal" : damage.Nature == DamageStruct.DamageNature.Fire ?
                 *      "fire" : "thunder", damage.Damage, damage.Card != null ? damage.Card.Name : damage.Reason);
                 *  string damage_to = string.Format("{0},{1} has skills {2}", damage.To.General1Showed ? damage.To.ActualGeneral1 : "hidden head",
                 *      damage.To.General2Showed ? damage.To.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.To)));
                 *  string self_str = string.Format("{0},{1}", self.ActualGeneral1, self.ActualGeneral2);
                 *
                 *  File.AppendAllText("ai_damage_log.txt", string.Format("{0} judge damage {1} against {2} {6} and value is {3} and ai judge target is my {4} and I'm {5}\r\n",
                 *      damage_from, damage_str, damage_to, value, IsFriend(self, to) ? "friend" : "enemy", self_str, to.Chained ? "chained" : string.Empty));
                 * }
                 */

                result_score.Score = value;
            }
            scores.Add(result_score);

            if (damage.Card != null && from != null && !damage.Transfer)
            {
                if (damage.Card.Name.Contains(Slash.ClassName) && from.HasWeapon(IceSword.ClassName) && !to.IsNude())
                {
                    ScoreStruct score = FindCards2Discard(from, to, string.Empty, "he", HandlingMethod.MethodDiscard, 2, true);
                    scores.Add(score);
                }
            }

            CompareByScore(ref scores);
            return(scores[0]);
        }