Exemplo n.º 1
0
        public override void OnUse(Room room, CardUseStruct card_use)
        {
            Player        source  = card_use.From;
            List <Player> targets = new List <Player>();

            if (card_use.To.Count == 0)
            {
                List <Player> all_players = room.GetOtherPlayers(card_use.From);
                foreach (Player player in all_players)
                {
                    Skill skill = RoomLogic.IsProhibited(room, source, player, 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.NotifySkillInvoked(player, skill.Name);
                            GeneralSkin gsk        = RoomLogic.GetGeneralSkin(room, player, skill.Name);
                            string      genral     = gsk.General;
                            int         skin_id    = gsk.SkinId;
                            string      skill_name = skill.Name;
                            int         audio      = -1;
                            skill.GetEffectIndex(room, player, 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
                        {
                            int    audio      = -1;
                            string skill_name = skill.Name;
                            string genral     = string.Empty;
                            int    skin_id    = 0;
                            skill.GetEffectIndex(room, null, card_use.Card, ref audio, ref skill_name, ref genral, ref skin_id);
                        }
                    }
                    else
                    {
                        targets.Add(player);
                    }
                }
            }
            else
            {
                targets = card_use.To;
            }

            card_use.To = targets;

            base.OnUse(room, card_use);
        }
Exemplo n.º 2
0
 public override void OnUninstall(Room room, Player player, WrappedCard card)
 {
     if (!RoomLogic.PlayerHasShownSkill(room, player, "zhiheng"))
     {
         player.ClearHistory("ZhihengCard");
     }
     base.OnUninstall(room, player, card);
 }
Exemplo n.º 3
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.º 4
0
        public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            bool invoke = RoomLogic.PlayerHasShownSkill(room, player, Name) ? true : room.AskForSkillInvoke(player, Name, data, info.SkillPosition);

            if (invoke)
            {
                room.BroadcastSkillInvoke(Name, player, info.SkillPosition);
                return(info);
            }
            return(new TriggerStruct());
        }
Exemplo n.º 5
0
        public override bool OnSkillInvoke(TrustedAI ai, Player player, object data)
        {
            if (ai.WillShowForAttack())
            {
                Room room   = ai.Room;
                int  adjust = RoomLogic.PlayerHasShownSkill(room, player, "mashu_madai") ? 0 : -1;

                foreach (Player p in room.GetOtherPlayers(player))
                {
                    if (!ai.IsFriend(p) && RoomLogic.DistanceTo(room, player, p) + adjust <= 1)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemplo n.º 6
0
        public override void OnUse(Room room, CardUseStruct card_use)
        {
            Player        source  = card_use.From;
            List <Player> targets = new List <Player>();

            if (card_use.To.Count == 0)
            {
                List <Player> all_players = room.GetOtherPlayers(card_use.From);
                foreach (Player player in all_players)
                {
                    Skill skill = RoomLogic.IsProhibited(room, source, player, 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
                    {
                        targets.Add(player);
                    }
                }
            }
            else
            {
                targets = card_use.To;
            }

            card_use.To = targets;

            base.OnUse(room, card_use);
        }
Exemplo n.º 7
0
        public virtual TriggerStruct Cost(Room room, ref object data, TriggerStruct info)
        {
            Player target = room.FindPlayer(info.Invoker, true);

            if (RoomLogic.HasArmorEffect(room, target, Name, false) &&
                (frequency == Frequency.Compulsory || room.AskForSkillInvoke(target, Name, data)))
            {
                return(info);
            }

            List <string> all     = new List <string>();
            bool          show    = false;
            bool          protect = true;

            foreach (ViewHasSkill vhskill in Engine.ViewHas(room, target, Name, "armor"))
            {
                Skill mskill = Engine.GetMainSkill(vhskill.Name);
                if (RoomLogic.PlayerHasShownSkill(room, target, mskill))
                {
                    protect = false;
                    if (frequency == Frequency.Compulsory)
                    {
                        show = true;
                    }
                }
                all.Add(mskill.Name);
            }
            if (protect)
            {
                target.SetFlags("Global_askForSkillCost");
            }

            if (all.Count > 0)
            {
                List <TriggerStruct> skills = new List <TriggerStruct>();
                foreach (string sk in all)
                {
                    TriggerStruct skill = new TriggerStruct(sk, target)
                    {
                        ResultTarget = info.ResultTarget
                    };
                    skills.Add(skill);
                }
                TriggerStruct result = room.AskForSkillTrigger(target, "armorskill", skills, !show, data);

                if (string.IsNullOrEmpty(result.SkillName))
                {
                    return(result);
                }
                else
                {
                    TriggerSkill result_skill = Engine.GetTriggerSkill(result.SkillName);
                    if (result_skill != null)
                    {
                        if (show || all.Count > 1 || room.AskForSkillInvoke(target, result_skill.Name, data, result.SkillPosition))
                        {
                            return(result);
                        }
                    }
                    else if (show || all.Count > 1 || room.AskForSkillInvoke(target, result_skill.Name, data, result.SkillPosition))
                    {
                        return(info);
                    }
                }
            }
            return(new TriggerStruct());
        }
Exemplo n.º 8
0
        public bool Trigger(TriggerEvent triggerEvent, Room room, Player target, ref object data)
        {
            // push it to event stack
            if (!string.IsNullOrEmpty(room.PreWinner))
            {
                return(true);
            }

            _m_trigger_id++;
            int trigger_id = _m_trigger_id;

            trigger_count.Add(trigger_id, new Dictionary <string, int>());

            bool broken = false;
            List <TriggerSkill> will_trigger       = new List <TriggerSkill>();
            List <TriggerSkill> triggerable_tested = new List <TriggerSkill>();
            List <TriggerSkill> rules = new List <TriggerSkill>(); // we can't get a GameRule with Engine::getTriggerSkill() :(
            Dictionary <Player, List <TriggerStruct> > trigger_who = new Dictionary <Player, List <TriggerStruct> >();
            List <TriggerSkill> triggered = new List <TriggerSkill>();
            Dictionary <Player, List <TriggerStruct> > already_triggered = new Dictionary <Player, List <TriggerStruct> >();

            do
            {
                List <TriggerSkill> skills = skill_table.ContainsKey(triggerEvent) ? new List <TriggerSkill>(skill_table[triggerEvent]) : new List <TriggerSkill>();
                trigger_who.Clear();
                foreach (TriggerSkill skill in skills)
                {
                    if (!triggered.Contains(skill))
                    {
                        if (skill is GameRule)
                        {
                            if (will_trigger.Count == 0 ||
                                skill.GetDynamicPriority(triggerEvent) == will_trigger[will_trigger.Count - 1].GetDynamicPriority(triggerEvent))
                            {
                                will_trigger.Add(skill);
                                if (trigger_who.ContainsKey(rule_player))
                                {
                                    trigger_who[rule_player].Add(new TriggerStruct(skill.Name));       // Don't assign game rule to some player.
                                }
                                else
                                {
                                    trigger_who[rule_player] = new List <TriggerStruct> {
                                        new TriggerStruct(skill.Name)
                                    }
                                };

                                rules.Add(skill);
                            }
                            else if (skill.GetDynamicPriority(triggerEvent) != will_trigger[will_trigger.Count - 1].GetDynamicPriority(triggerEvent))
                            {
                                break;
                            }

                            triggered.Insert(0, skill);
                        }
                        else
                        {
                            if (will_trigger.Count == 0 ||
                                skill.GetDynamicPriority(triggerEvent) == will_trigger[will_trigger.Count - 1].GetDynamicPriority(triggerEvent))
                            {
                                skill.Record(triggerEvent, room, target, ref data);        //to record something for next.
                                List <TriggerStruct> triggerSkillList = skill.Triggerable(triggerEvent, room, target, ref data);

                                foreach (TriggerStruct skill_struct in triggerSkillList)
                                {
                                    TriggerStruct tskill = skill_struct;
                                    if (tskill.Times != 1)
                                    {
                                        tskill.Times = 1;                               //make sure times == 1
                                    }
                                    TriggerSkill trskill = Engine.GetTriggerSkill(tskill.SkillName);
                                    Player       p       = room.FindPlayer(tskill.Invoker, true);
                                    if (trskill != null)
                                    {
                                        will_trigger.Add(trskill);
                                        if (trigger_who.ContainsKey(p))
                                        {
                                            trigger_who[p].Add(tskill);
                                        }
                                        else
                                        {
                                            trigger_who[p] = new List <TriggerStruct> {
                                                tskill
                                            }
                                        };
                                    }
                                }
                            }
                            else if (skill.GetDynamicPriority(triggerEvent) != will_trigger[will_trigger.Count - 1].GetDynamicPriority(triggerEvent))
                            {
                                break;
                            }

                            triggered.Insert(0, skill);
                        }
                    }
                    if (!triggerable_tested.Contains(skill))
                    {
                        triggerable_tested.Add(skill);
                    }
                }

                if (will_trigger.Count > 0)
                {
                    will_trigger.Clear();
                    foreach (Player p in room.GetAllPlayers(true))
                    {
                        if (!trigger_who.ContainsKey(p))
                        {
                            continue;
                        }
                        //List<TriggerStruct> already_triggered = new List<TriggerStruct>();
                        Dictionary <Player, List <TriggerStruct> > refuse = new Dictionary <Player, List <TriggerStruct> >();
                        while (true)
                        {
                            List <TriggerStruct> who_skills = trigger_who.ContainsKey(p) ? new List <TriggerStruct>(trigger_who[p]) : new List <TriggerStruct>();
                            if (who_skills.Count == 0)
                            {
                                break;
                            }
                            TriggerStruct name = new TriggerStruct();
                            foreach (TriggerStruct skill in who_skills)
                            {
                                TriggerSkill tskill = Engine.GetTriggerSkill(skill.SkillName);
                                if (tskill != null && tskill.Global && tskill.SkillFrequency == Skill.Frequency.Compulsory)
                                {
                                    TriggerStruct name_copy = skill;
                                    if (skill.Targets.Count > 0)
                                    {
                                        name_copy.ResultTarget = skill.Targets[0];
                                    }
                                    name = name_copy;       // a new trick to deal with all "record-skill" or "compulsory-global",
                                                            // they should always be triggered first.
                                    break;
                                }
                            }

                            if (string.IsNullOrEmpty(name.SkillName))
                            {
                                if (p != null && !p.HasShownAllGenerals())
                                {
                                    p.SetFlags("Global_askForSkillCost");           // TriggerOrder need protect
                                }
                                if (who_skills.Count == 1 && (p == null || who_skills[0].SkillName.Contains("global-fake-move")))
                                {
                                    TriggerStruct name_copy = who_skills[0];
                                    if (who_skills[0].Targets.Count > 0)
                                    {
                                        name_copy.ResultTarget = who_skills[0].Targets[0];
                                    }
                                    name = name_copy;
                                }
                                else if (p != null)
                                {
                                    string reason = "GameRule:TriggerOrder";
                                    foreach (TriggerStruct skill in who_skills)
                                    {
                                        if (triggerEvent == TriggerEvent.EventPhaseStart && skill.SkillName.Contains("GameRule_AskForGeneralShow"))
                                        {
                                            reason = "GameRule:TurnStart";
                                            break;
                                        }
                                    }
                                    name = room.AskForSkillTrigger(p, reason, who_skills, true, data);
                                }
                                else
                                {
                                    name = who_skills[who_skills.Count - 1];
                                }
                                if (p != null && p.HasFlag("Global_askForSkillCost"))
                                {
                                    p.SetFlags("-Global_askForSkillCost");
                                }
                            }

                            if (string.IsNullOrEmpty(name.SkillName))
                            {
                                break;
                            }

                            TriggerSkill result_skill = Engine.GetTriggerSkill(name.SkillName);
                            Player       skill_target = room.FindPlayer(name.ResultTarget, true);
                            if (skill_target == null && target != null)
                            {
                                skill_target      = target;
                                name.ResultTarget = target.Name;
                            }

                            if (name.Targets.Count > 0)
                            {
                                bool deplicated = false;
                                List <TriggerStruct> already = already_triggered.ContainsKey(p) ? new List <TriggerStruct>(already_triggered[p]) : new List <TriggerStruct>();
                                foreach (TriggerStruct already_s in already)                            //类似铁骑对多目标发动的触发技
                                {                                                                       //若先选择了对后位角色发动,则直接跳过前位的其他角色
                                    if (already_s.Equals(name) && already_s.Targets.Count > 0)
                                    {
                                        Player        triggered_target = room.FindPlayer(already_s.ResultTarget, true);
                                        Player        _target          = room.FindPlayer(name.ResultTarget, true);
                                        List <Player> all = room.GetAllPlayers(true);
                                        if (all.IndexOf(_target) > all.IndexOf(triggered_target))
                                        {
                                            already_triggered[p][already.IndexOf(already_s)] = name;
                                            deplicated = true;
                                            break;
                                        }
                                    }
                                }
                                if (!deplicated)
                                {
                                    if (already_triggered.ContainsKey(p))
                                    {
                                        already_triggered[p].Add(name);
                                    }
                                    else
                                    {
                                        already_triggered[p] = new List <TriggerStruct> {
                                            name
                                        }
                                    };
                                }
                            }
                            else
                            {
                                if (already_triggered.ContainsKey(p))
                                {
                                    already_triggered[p].Add(name);
                                }
                                else
                                {
                                    already_triggered[p] = new List <TriggerStruct> {
                                        name
                                    }
                                };
                            }

                            //----------------------------------------------- TriggerSkill::cost
                            bool do_effect = false;

                            if (p != null && !RoomLogic.PlayerHasShownSkill(room, p, result_skill))
                            {
                                p.SetFlags("Global_askForSkillCost");           // SkillCost need protect
                            }
                            string mark = string.Format("{0}_{1}_{2}", name.SkillName, p.Name, skill_target != null ? skill_target.Name : "null");
                            if (!trigger_count[trigger_id].ContainsKey(mark))
                            {
                                trigger_count[trigger_id][mark] = 1;
                            }
                            else
                            {
                                trigger_count[trigger_id][mark]++;
                            }
                            TriggerStruct cost = name;
                            cost.Times = trigger_count[trigger_id][mark];

                            TriggerStruct cost_str = result_skill.Cost(triggerEvent, room, skill_target, ref data, p, cost);
                            result_skill = Engine.GetTriggerSkill(cost_str.SkillName);

                            if (result_skill != null)
                            {
                                do_effect = true;
                                if (p != null)
                                {
                                    bool compulsory_shown = false;
                                    if (result_skill.SkillFrequency == Skill.Frequency.Compulsory && RoomLogic.PlayerHasShownSkill(room, p, result_skill))
                                    {
                                        compulsory_shown = true;
                                    }
                                    bool show = room.ShowSkill(p, result_skill.Name, cost_str.SkillPosition);
                                    if (!compulsory_shown && show)
                                    {
                                        p.SetTag("JustShownSkill", result_skill.Name);
                                    }
                                }
                            }

                            if (p != null && p.HasFlag("Global_askForSkillCost"))                      // for next time
                            {
                                p.SetFlags("-Global_askForSkillCost");
                            }

                            //----------------------------------------------- TriggerSkill::effect
                            if (do_effect)
                            {
                                Player invoker = room.FindPlayer(cost_str.Invoker, true);       //it may point to another skill, such as EightDiagram to bazhen
                                skill_target = room.FindPlayer(cost_str.ResultTarget, true);
                                broken       = result_skill.Effect(triggerEvent, room, skill_target, ref data, invoker, cost_str);
                                if (broken)
                                {
                                    //if (room.Setting.GameMode == "Hegemony")
                                    //    room.Debug(string.Format("{0}-{1}", triggerEvent, result_skill.Name));
                                    p.RemoveTag("JustShownSkill");
                                    break;
                                }
                            }
                            else
                            {
                                if (refuse.ContainsKey(p))
                                {
                                    refuse[p].Add(name);
                                }
                                else
                                {
                                    refuse[p] = new List <TriggerStruct> {
                                        name
                                    }
                                };
                            }
                            //-----------------------------------------------
                            p.RemoveTag("JustShownSkill");

                            trigger_who.Clear();
                            foreach (TriggerSkill skill in triggered)
                            {
                                if (skill is GameRule)
                                {
                                    //room->tryPause();
                                    continue; // dont assign them to some person.
                                }
                                else
                                {
                                    //room->tryPause();
                                    if (skill.GetDynamicPriority(triggerEvent) == triggered[0].GetDynamicPriority(triggerEvent))
                                    {
                                        List <TriggerStruct> triggerSkillList = skill.Triggerable(triggerEvent, room, target, ref data);
                                        foreach (Player _p in room.Players)
                                        {
                                            foreach (TriggerStruct _skill in triggerSkillList)
                                            {
                                                if (_p.Name != _skill.Invoker)
                                                {
                                                    continue;
                                                }

                                                bool refuse_before = false;
                                                if (refuse.ContainsKey(_p))
                                                {
                                                    foreach (TriggerStruct refused in refuse[_p])
                                                    {
                                                        if (_skill.Equals(refused) && _skill.Targets.Count == 0)
                                                        {
                                                            refuse_before = true;
                                                            break;
                                                        }
                                                    }
                                                }
                                                if (refuse_before)
                                                {
                                                    break;
                                                }

                                                TriggerStruct tskill = _skill;
                                                if (tskill.Times != 1)
                                                {
                                                    tskill.Times = 1;                               //make sure times == 1
                                                }
                                                TriggerSkill trskill = Engine.GetTriggerSkill(tskill.SkillName);
                                                if (trskill != null)
                                                {
                                                    if (trigger_who.ContainsKey(_p))
                                                    {
                                                        trigger_who[_p].Add(tskill);
                                                    }
                                                    else
                                                    {
                                                        trigger_who[_p] = new List <TriggerStruct> {
                                                            tskill
                                                        }
                                                    };
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }

                            foreach (TriggerStruct already_s in already_triggered[p])
                            {
                                List <TriggerStruct> who_skills_q = trigger_who.ContainsKey(p) ? new List <TriggerStruct>(trigger_who[p]) : new List <TriggerStruct>();
                                foreach (TriggerStruct re_skill in who_skills_q)
                                {
                                    if (already_s.Equals(re_skill))         //类似铁骑、烈弓多目标的触发技
                                    {                                       //筛选剩余未发动的目标
                                        if (already_s.Targets.Count > 0 && re_skill.Targets.Count > 0 && re_skill.Targets.Contains(already_s.ResultTarget))
                                        {
                                            List <string> targets = new List <string>(re_skill.Targets);
                                            for (int i = 0; i <= targets.IndexOf(already_s.ResultTarget); i++)
                                            {
                                                re_skill.Targets.Remove(targets[i]);
                                            }

                                            if (re_skill.Targets.Count > 0)
                                            {
                                                TriggerStruct re_skill2 = already_s;
                                                re_skill2.Targets      = re_skill.Targets;
                                                re_skill2.ResultTarget = null;
                                                trigger_who[p][trigger_who[p].IndexOf(re_skill)] = re_skill2;
                                                break;
                                            }
                                        }
                                        trigger_who[p].Remove(re_skill);
                                        break;
                                    }
                                }
                            }
                        }
                        if (broken)
                        {
                            break;
                        }
                    }
                }
                if (broken)
                {
                    break;
                }
            } while (skill_table.ContainsKey(triggerEvent) && skill_table[triggerEvent].Count != triggerable_tested.Count && string.IsNullOrEmpty(room.PreWinner));

            // @todo_Slob: for drawing cards when game starts -- stupid design of triggering no player!
            if (!broken && trigger_who.ContainsKey(rule_player) && trigger_who[rule_player].Count > 0)
            {
                List <TriggerStruct> triggers = new List <TriggerStruct>(trigger_who[rule_player]);
                foreach (TriggerStruct s in triggers)
                {
                    if (!string.IsNullOrEmpty(room.PreWinner))
                    {
                        break;
                    }

                    TriggerSkill skill = null;
                    foreach (TriggerSkill rule in rules)
                    {                      // because we cannot get a GameRule with Engine::getTriggerSkill()
                        if (rule.Name == s.SkillName)
                        {
                            skill = rule;
                            break;
                        }
                    }

                    TriggerStruct skill_cost = skill.Cost(triggerEvent, room, target, ref data, null, s);
                    if (!string.IsNullOrEmpty(skill_cost.SkillName))
                    {
                        broken = skill.Effect(triggerEvent, room, target, ref data, null, skill_cost);
                        if (broken)
                        {
                            break;
                        }
                    }
                }
            }

            foreach (TrustedAI ai in room.AIs)
            {
                ai.Event(triggerEvent, target, data);
            }

            //Bot聊天
            Bot.BotChat(triggerEvent, room, target, data);
            //成就
            AchieveCollector.Event(triggerEvent, room, target, data);

            // pop event stack
            //event_stack.pop_back();

            //room->tryPause();
            trigger_count.Remove(trigger_id);
            return(broken);
        }
Exemplo n.º 9
0
 public override bool IsEnabledAtPlay(Room room, Player player)
 {
     return(RoomLogic.CanDiscard(room, player, player, "he") && !player.HasUsed("ZhihengCard") &&
            !RoomLogic.PlayerHasShownSkill(room, player, "zhiheng"));
 }
Exemplo n.º 10
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.º 11
0
        public static void OnPlayStart(Room room, Player player)
        {
            List <Client> ais = new List <Client>();

            foreach (Client client in room.Clients)
            {
                if (client.UserID < 0)
                {
                    ais.Add(client);
                }
            }

            if (ais.Count == 0)
            {
                return;
            }

            DataRow[] rows = Engine.GetStarPlayLines();
            foreach (DataRow row in rows)
            {
                string   str    = row["skills"].ToString();
                bool     check  = false;
                string[] skills = str.Split('|');
                foreach (string skill in skills)
                {
                    bool _check = true;
                    foreach (string _skill in skill.Split('+'))
                    {
                        if (!RoomLogic.PlayerHasShownSkill(room, player, _skill))
                        {
                            _check = false;
                            break;
                        }
                    }

                    if (_check)
                    {
                        check = true;
                        break;
                    }
                }

                if (check)
                {
                    foreach (Client ai in ais)
                    {
                        //几率1/3聊天
                        if (Shuffle.random(1, 3))
                        {
                            //50%随机是发言还是表情
                            bool speak = Shuffle.random(1, 2);
                            if (room.Setting.SpeakForbidden)
                            {
                                speak = false;
                            }
                            //50%随机
                            int num = Shuffle.random(1, 2) ? 1 : 2;
                            if (room.GetClient(player) == ai)
                            {
                                if (speak)
                                {
                                    string message = row[string.Format("self_lines{0}", num)].ToString();
                                    if (!string.IsNullOrEmpty(message))
                                    {
                                        room.Speak(ai, message);
                                    }
                                }
                                else
                                {
                                    string messages = row[string.Format("self_emotion{0}", num)].ToString();
                                    if (!string.IsNullOrEmpty(messages))
                                    {
                                        string[] ms = messages.Split('/');
                                        room.Emotion(ai, ms[0], ms[1]);
                                    }
                                }
                            }
                            else
                            {
                                if (speak)
                                {
                                    string message = row[string.Format("lines{0}", num)].ToString();
                                    if (!string.IsNullOrEmpty(message))
                                    {
                                        room.Speak(ai, message);
                                    }
                                }
                                else
                                {
                                    string messages = row[string.Format("emotion{0}", num)].ToString();
                                    if (!string.IsNullOrEmpty(messages))
                                    {
                                        string[] ms = messages.Split('/');
                                        room.Emotion(ai, ms[0], ms[1]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 12
0
        public override void OnNullified(Room room, Player target, WrappedCard card)
        {
            RoomThread thread = room.RoomThread;

            string card_str = RoomLogic.CardToString(room, card);
            bool   move     = false;
            Player p        = null;

            if (movable)
            {
                List <Player> players       = new List <Player>();
                List <Player> count_players = new List <Player>(room.Players);
                Player        starter       = target;
                int           index         = count_players.IndexOf(starter);
                for (int i = index + 1; i < count_players.Count; i++)
                {
                    if (count_players[i].Alive)
                    {
                        players.Add(count_players[i]);
                    }
                }

                for (int i = 0; i <= index; i++)
                {
                    if (count_players[i].Alive)
                    {
                        players.Add(count_players[i]);
                    }
                }

                foreach (Player player in players)
                {
                    if (RoomLogic.PlayerContainsTrick(room, player, Name) || !player.JudgingAreaAvailable)
                    {
                        continue;
                    }

                    Skill skill = RoomLogic.IsProhibited(room, null, player, 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.NotifySkillInvoked(player, skill.Name);
                            GeneralSkin gsk        = RoomLogic.GetGeneralSkin(room, player, skill.Name);
                            string      genral     = gsk.General;
                            int         skin_id    = gsk.SkinId;
                            string      skill_name = skill.Name;
                            int         audio      = -1;
                            skill.GetEffectIndex(room, player, card, ref audio, ref skill_name, ref genral, ref skin_id);
                            if (audio >= -1)
                            {
                                room.BroadcastSkillInvoke(skill_name, "male", audio, genral, skin_id);
                            }
                        }
                        continue;
                    }
                    //if (player.HasFlag(card_str + "_delay_trick_cancel")) continue;

                    /*
                     * CardUseStruct use = new CardUseStruct(room.GetCard(card.GetEffectiveId()), null, player)
                     * {
                     *  EffectCount = new List<CardBasicEffect> { FillCardBasicEffct(room, player) }
                     * };
                     * object data = use;
                     * thread.Trigger(TriggerEvent.TargetConfirming, room, player, ref data);
                     * CardUseStruct new_use = (CardUseStruct)data;
                     * if (new_use.To.Count == 0)
                     * {
                     *  p = player;
                     *  player.SetFlags(card_str + "_delay_trick_cancel");
                     *  break;
                     * }
                     *
                     * thread.Trigger(TriggerEvent.TargetChosen, room, null, ref data);
                     * thread.Trigger(TriggerEvent.TargetConfirmed, room, player, ref data);
                     */
                    CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_TRANSFER, string.Empty)
                    {
                        Card = card
                    };
                    room.MoveCardTo(card, null, player, Place.PlaceDelayedTrick, reason, true);
                    move = true;

                    break;
                }
            }

            if (p != null)
            {
                OnNullified(room, p, card);
            }
            else if (!move)
            {
                //foreach (Player player in room.GetAllPlayers())
                //if (player.HasFlag(RoomLogic.CardToString(room, card) + "_delay_trick_cancel"))
                //player.SetFlags(string.Format("-{0}{1}", card_str, "_delay_trick_cancel"));

                CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_NATURAL_ENTER, string.Empty);
                room.MoveCardTo(card, null, Place.DiscardPile, reason, true);
            }
        }
Exemplo n.º 13
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            Room room = ai.Room;
            List <ScoreStruct> scores = new List <ScoreStruct>();

            foreach (Player p in room.GetOtherPlayers(player))
            {
                if (!RoomLogic.InMyAttackRange(room, p, player) || p.IsNude())
                {
                    continue;
                }
                ScoreStruct score = ai.FindCards2Discard(player, p, "he", HandlingMethod.MethodDiscard);
                score.Players = new List <Player> {
                    p
                };
                if (ai.IsEnemy(p))
                {
                    if (p.HandcardNum + p.GetPile("wooden_ox").Count < 3 || ai.IsLackCard(p, Slash.ClassName))
                    {
                        score.Score += 3;
                    }
                    else
                    {
                        bool armor_ignore = false;
                        if (p.HasWeapon(QinggangSword.ClassName) || ai.HasSkill("jianchu", p))
                        {
                            armor_ignore = true;
                        }
                        else if (ai.HasSkill("paoxiao|paoxiao_fz", p))
                        {
                            Player lord = ai.FindPlayerBySkill("shouyue");
                            if (lord != null && RoomLogic.PlayerHasShownSkill(room, lord, "shouyue") && RoomLogic.WillBeFriendWith(room, p, lord))
                            {
                                armor_ignore = true;
                            }
                        }

                        if (!armor_ignore && ai.HasArmorEffect(player, RenwangShield.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (!armor_ignore && ai.HasArmorEffect(player, EightDiagram.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (ai.HasSkill("wushang", p))
                        {
                            score.Score -= 0.5;
                        }
                        if (p.HasWeapon(DragonPhoenix.ClassName))
                        {
                            score.Score -= 0.5;
                        }
                        if (ai.HasSkill("jianchu", p))
                        {
                            score.Score = -0.5;
                        }
                        if (ai.HasSkill("tieqi|tieqi_fz", p))
                        {
                            score.Score = 1;
                        }
                        if (ai.GetKnownCardsNums(Jink.ClassName, "he", player) == 0)
                        {
                            score.Score -= 2;
                        }
                    }
                }
                scores.Add(score);
            }

            if (scores.Count > 0)
            {
                ai.CompareByScore(ref scores);
                if (scores[0].Score > 2)
                {
                    use.Card = card;
                    use.To   = new List <Player>(scores[0].Players);
                }
            }
        }
Exemplo n.º 14
0
        public override void OnNullified(Room room, Player target, WrappedCard card)
        {
            RoomThread thread = room.RoomThread;

            string card_str = RoomLogic.CardToString(room, card);
            bool   move     = false;
            Player p        = null;

            if (movable)
            {
                List <Player> players       = new List <Player>();
                List <Player> count_players = new List <Player>(room.Players);
                Player        starter       = target;
                int           index         = count_players.IndexOf(starter);
                for (int i = index + 1; i < count_players.Count; i++)
                {
                    if (count_players[i].Alive)
                    {
                        players.Add(count_players[i]);
                    }
                }

                for (int i = 0; i <= index; i++)
                {
                    if (count_players[i].Alive)
                    {
                        players.Add(count_players[i]);
                    }
                }

                foreach (Player player in players)
                {
                    if (RoomLogic.PlayerContainsTrick(room, player, Name))
                    {
                        continue;
                    }

                    Skill skill = RoomLogic.IsProhibited(room, null, player, 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);
                        }
                        continue;
                    }
                    if (player.HasFlag(card_str + "_delay_trick_cancel"))
                    {
                        continue;
                    }

                    CardUseStruct use  = new CardUseStruct(room.GetCard(card.GetEffectiveId()), null, player);
                    object        data = use;
                    thread.Trigger(TriggerEvent.TargetConfirming, room, player, ref data);
                    CardUseStruct new_use = (CardUseStruct)data;
                    if (new_use.To.Count == 0)
                    {
                        p = player;
                        player.SetFlags(card_str + "_delay_trick_cancel");
                        break;
                    }

                    CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_TRANSFER, string.Empty)
                    {
                        CardString = RoomLogic.CardToString(room, card)
                    };
                    room.MoveCardTo(card, null, player, Place.PlaceDelayedTrick, reason, true);
                    move = true;

                    foreach (Player p2 in room.GetAllPlayers())
                    {
                        thread.Trigger(TriggerEvent.TargetChosen, room, p2, ref data);
                    }
                    foreach (Player p2 in room.GetAllPlayers())
                    {
                        thread.Trigger(TriggerEvent.TargetConfirmed, room, p2, ref data);
                    }
                    break;
                }
            }

            if (p != null)
            {
                OnNullified(room, p, card);
            }
            else if (!move)
            {
                foreach (Player player in room.GetAllPlayers())
                {
                    if (player.HasFlag(RoomLogic.CardToString(room, card) + "_delay_trick_cancel"))
                    {
                        player.SetFlags(string.Format("-{0}{1}", card_str, "_delay_trick_cancel"));
                    }
                }

                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_NATURAL_ENTER, string.Empty);
                room.MoveCardTo(card, null, Place.DiscardPile, reason, true);
            }
        }