Пример #1
0
 /// <summary>
 /// 卡片接受消息
 /// </summary>
 /// <param name="message">接受到的消息</param>
 public void Read(Message message)
 {
     ListUtils.Clone(AttachableList).ForEach(item =>
     {
         item.Read(message);
     });
 }
Пример #2
0
    public async Task <List <Card> > ChooseDiscardedCardsSameNameProcess(List <Card> units, string name)
    {
        ReadyForSameNameProcessPartialMessage readyForSameNameProcessMessage = Game.TryMessage(new ReadyForSameNameProcessPartialMessage()
        {
            Targets = units,
            Name    = name
        }) as ReadyForSameNameProcessPartialMessage;

        if (readyForSameNameProcessMessage != null && readyForSameNameProcessMessage.Targets.Count > 1)
        {
            Card savedUnit;
            if (readyForSameNameProcessMessage.Targets.Contains(Hero))
            {
                savedUnit = Hero;
            }
            else
            {
                savedUnit = await Request.ChooseOne(readyForSameNameProcessMessage.Targets, this);
            }
            List <Card> confirmedTarget = ListUtils.Clone(readyForSameNameProcessMessage.Targets);
            confirmedTarget.Remove(savedUnit);
            return(confirmedTarget);
        }
        else
        {
            return(new List <Card>());
        }
    }
Пример #3
0
    public List <Card> GetCostsForAvoid(Skill reason = null)
    {
        var targets = Controller.Hand.Filter(card => card.HasSameUnitNameWith(this));

        foreach (var card in ListUtils.Clone(targets))
        {
            var message = Game.TryMessage(new AvoidMessage()
            {
                AttackingUnit = Game.AttackingUnit,
                DefendingUnit = this,
                Cost          = card
            }) as AvoidMessage;
            if (message == null || message.Cost != card)
            {
                targets.Remove(card);
            }
        }
        return(targets);
    }
Пример #4
0
    public List <Card> GetDeployableCards(List <Card> targets, ref Dictionary <Card, bool> toFrontFieldDict, ref Dictionary <Card, bool> actionedDict, Skill reason = null)
    {
        var targets_new = ListUtils.Clone(targets);

        foreach (var card in targets)
        {
            Area area = null;
            if (toFrontFieldDict.ContainsKey(card))
            {
                if (toFrontFieldDict[card])
                {
                    area = card.Controller.FrontField;
                }
                else
                {
                    area = card.Controller.BackField;
                }
            }
            bool actioned = actionedDict.ContainsKey(card) ? actionedDict[card] : false;
            bool canDeploy;
            if (area == null)
            {
                canDeploy = card.CheckDeployment(card.Controller.FrontField, actioned, reason) ||
                            card.CheckDeployment(card.Controller.BackField, actioned, reason);
            }
            else
            {
                canDeploy = card.CheckDeployment(area, actioned, reason);
            }
            if (!canDeploy)
            {
                targets_new.Remove(card);
                toFrontFieldDict.Remove(card);
                actionedDict.Remove(card);
            }
        }
        return(targets_new);
    }
Пример #5
0
    public List <Card> GetLevelUpableUnits(Skill reason = null)
    {
        var baseUnits = Controller.Field.Filter(unit =>
        {
            if (unit.HasSameUnitNameWith(this))
            {
                return(true);
            }
            if (unit.HasSubSkill(typeof(CanLevelUpToOthers)))
            {
                foreach (var item in unit.FindAllSubSkills(typeof(CanLevelUpToOthers)))
                {
                    if (HasUnitNameOf(((CanLevelUpToOthers)item).UnitName))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        });

        foreach (var unit in ListUtils.Clone(baseUnits))
        {
            var message = Game.TryMessage(new LevelUpMessage()
            {
                Target   = this,
                BaseUnit = unit,
                Reason   = reason
            }) as LevelUpMessage;
            if (message == null || message.BaseUnit != unit)
            {
                baseUnits.Remove(unit);
            }
        }
        return(baseUnits);
    }
Пример #6
0
    public Message Clone()
    {
        Type    messageType = GetType();
        Message clone       = Activator.CreateInstance(messageType) as Message;

        clone.SendBySelf = SendBySelf;
        for (int i = 0; i < fieldNumber; i++)
        {
            dynamic field = GetType().GetField("field" + (i + 1).ToString(), BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this);
            if (field != null)
            {
                if (field is System.Collections.IList)
                {
                    clone.GetType().GetField("field" + (i + 1).ToString(), BindingFlags.NonPublic | BindingFlags.Instance).SetValue(clone, ListUtils.Clone(field));
                }
                else
                {
                    clone.GetType().GetField("field" + (i + 1).ToString(), BindingFlags.NonPublic | BindingFlags.Instance).SetValue(clone, field);
                }
            }
        }
        return(clone);
    }
Пример #7
0
    public List <Card> GetAttackableUnits()
    {
        var targets = new List <Card>();

        if (IsHorizontal)
        {
            return(targets);
        }
        bool canAttackFront = false;
        bool canAttackBack  = false;

        if (BelongedRegion is FrontField)
        {
            if (HasRange(RangeEnum.One))
            {
                canAttackFront = true;
            }
            if (HasRange(RangeEnum.Two))
            {
                canAttackBack = true;
            }
            if (HasRange(RangeEnum.OnetoTwo) || HasRange(RangeEnum.OnetoThree))
            {
                canAttackFront = true;
                canAttackBack  = true;
            }
        }
        else if (BelongedRegion is BackField)
        {
            if (HasRange(RangeEnum.Two) || HasRange(RangeEnum.OnetoTwo))
            {
                canAttackFront = true;
            }
            if (HasRange(RangeEnum.Three))
            {
                canAttackBack = true;
            }
            if (HasRange(RangeEnum.OnetoThree))
            {
                canAttackFront = true;
                canAttackBack  = true;
            }
        }
        //TO DO: 无视射程攻击
        if (canAttackFront)
        {
            targets.AddRange(Opponent.FrontField.Cards);
        }
        if (canAttackBack)
        {
            targets.AddRange(Opponent.BackField.Cards);
        }
        foreach (var unit in ListUtils.Clone(targets))
        {
            var message = Game.TryMessage(new AttackMessage()
            {
                AttackingUnit = this,
                DefendingUnit = unit
            }) as AttackMessage;
            if (message == null || message.DefendingUnit != unit)
            {
                targets.Remove(unit);
            }
        }
        return(targets);
    }