Ejemplo n.º 1
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            BaseBiology attackCard  = actionParameter.SecondaryCard as BaseBiology;
            int         trueDamege  = actionParameter.DamageOrHeal;

            ActionParameter actionPara = new ActionParameter()
            {
                PrimaryCard   = attackCard,
                GameContext   = actionParameter.GameContext,
                DamageOrHeal  = trueDamege,
                SecondaryCard = servant
            };

            CardActionFactory.CreateAction(attackCard, ActionType.受到攻击).Action(actionPara);

            //自己挨打(如果攻击的是英雄,则不掉血)
            if (attackCard.CardType == CardType.随从)
            {
                ServantUnderAttackAction underAttackAction = new ServantUnderAttackAction();
                var underAttackPara = new ActionParameter()
                {
                    GameContext   = gameContext,
                    PrimaryCard   = servant,
                    SecondaryCard = attackCard,
                    DamageOrHeal  = attackCard.Damage,
                };
                underAttackAction.Action(underAttackPara);
            }
            servant.RemainAttackTimes -= 1;
            servant.CanAttack          = servant.RemainAttackTimes > 0 ? true : false;
            return(null);
        }
Ejemplo n.º 2
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            BaseBiology attackCard  = actionParameter.SecondaryCard as BaseBiology;
            int         deskIndex   = actionParameter.DeskIndex;

            var user = gameContext.GetUserContextByMyCard(servant);

            gameContext.CastCardCount++;
            servant.CastIndex    = gameContext.CastCardCount;
            servant.CardLocation = CardLocation.场上;
            servant.DeskIndex    = deskIndex;
            servant.CanAttack    = true;

            gameContext.DeskCards[deskIndex] = servant;

            if (servant.HasCharge)
            {
                new ResetServantRemainAttackTimes().Action(actionParameter);
            }
            gameContext.EventQueue.AddLast(new ServantInDeskEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            gameContext.EventQueue.AddLast(new MyServantCastedEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            gameContext.EventQueue.AddLast(new PrimaryPlayerPlayCardEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            return(null);
        }
Ejemplo n.º 3
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            Card        triggerCard = actionParameter.SecondaryCard;

            //随从死亡
            if (servant.Life < 1 || servant.IsDeathing)
            {
                servant.CardLocation = CardLocation.灵车;
                gameContext.DeskCards[servant.DeskIndex] = null;
                gameContext.HearseCards.AddLast(servant);

                if (servant.CardAbility.GetType().Name == typeof(DeathWhisperDriver <IGameAction, ICardLocationFilter>).Name)
                {
                    gameContext.AddActionStatement(servant.CardAbility, new ActionParameter()
                    {
                        GameContext   = gameContext,
                        PrimaryCard   = servant,
                        SecondaryCard = triggerCard,
                    });
                }
            }
            return(null);
        }
Ejemplo n.º 4
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            BaseBiology attackCard  = actionParameter.SecondaryCard as BaseBiology;
            int         damege      = actionParameter.DamageOrHeal;

            int trueDamege = attackCard.Damage;

            if (attackCard.CardType == CardType.英雄)
            {
                BaseHero attackHero = attackCard as BaseHero;
                if (attackHero.Equip != null)
                {
                    trueDamege += attackHero.Equip.Damage;
                }
            }
            ActionParameter underAttackPara = new ActionParameter()
            {
                PrimaryCard   = servant,
                GameContext   = actionParameter.GameContext,
                DamageOrHeal  = trueDamege,
                SecondaryCard = attackCard
            };

            CardActionFactory.CreateAction(servant, ActionType.受到伤害).Action(underAttackPara);
            return(null);
        }
Ejemplo n.º 5
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant baseServant = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            int         damage      = actionParameter.DamageOrHeal;

            //计算法术强度类技能
            var biologys = gameContext.DeskCards.GetDeskCardsByEnemyCard(baseServant).Where(c => c != null);

            damage += biologys.Sum(c => c.SpellPower);
            if (biologys.Any(c => c.CardType == CardType.英雄 && (c as BaseHero).Equip != null))
            {
                damage += (biologys.First(c => c.CardType == CardType.英雄) as BaseHero).Equip.SpellPower;
            }

            var damagePara = new ActionParameter
            {
                PrimaryCard   = baseServant,
                GameContext   = actionParameter.GameContext,
                DamageOrHeal  = damage,
                SecondaryCard = actionParameter.PrimaryCard
            };

            CardActionFactory.CreateAction(baseServant, ActionType.受到伤害).Action(damagePara);
            return(new IntParameter()
            {
                Value = damage
            });
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 随从移位
        /// </summary>
        /// <param name="gameContext"></param>
        /// <param name="deskIndex"></param>
        public static int ShiftServant(this GameContext gameContext, int deskIndex)
        {
            if (gameContext.DeskCards[deskIndex] != null)
            {
                bool shiftDone = false;
                int  maxIndex = 16, minIndex = 8;
                if (deskIndex < 8)
                {
                    maxIndex = 8;
                    minIndex = 0;
                }
                #region 先往右移
                int idx = deskIndex + 1;
                for (; idx < maxIndex; idx++)
                {
                    if (gameContext.DeskCards[idx] == null)
                    {
                        BaseServant servant = null;
                        for (int i = idx; i > deskIndex; i--)
                        {
                            servant                      = gameContext.DeskCards[i - 1] as BaseServant;
                            servant.DeskIndex            = i;
                            gameContext.DeskCards[i]     = servant;
                            gameContext.DeskCards[i - 1] = null;
                        }
                        shiftDone = true;
                        break;
                    }
                }
                #endregion

                #region 右移失败再尝试左移
                if (shiftDone == false)
                {
                    idx = deskIndex - 1;
                    for (; idx > minIndex; idx--)
                    {
                        if (gameContext.DeskCards[idx] == null)
                        {
                            BaseServant servant = null;
                            //for (int i = 2; i < 4; i++)
                            for (int i = idx; i < deskIndex - 1; i++)
                            {
                                servant                  = gameContext.DeskCards[i + 1] as BaseServant;
                                servant.DeskIndex        = i;
                                gameContext.DeskCards[i] = servant;
                            }
                            shiftDone = true;
                            deskIndex = deskIndex - 1;
                            break;
                        }
                    }
                }
                #endregion
            }
            return(deskIndex);
        }
        public Func <Card, bool> Filter(ActionParameter actionParameter)
        {
            Q qat = GameActivator <Q> .CreateInstance();

            List <Card> lstCardLib = actionParameter.GameContext.GameCache.GetAllCard();
            List <Card> servants   = lstCardLib.Where(c => c.Cost == qat.Number && c.CardType == CardType.随从 && c.Profession == Profession.Neutral && c.IsDerivative == false).ToList();
            BaseServant servant    = servants[RandomUtil.CreateRandomInt(0, servants.Count - 1)] as BaseServant;

            return(new Func <Card, bool>(c => c.CardCode == servant.CardCode));
        }
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant = actionParameter.PrimaryCard as BaseServant;

            if (servant.Damage > 0 && servant.CanAttack && servant.RemainAttackTimes < 1)
            {
                servant.RemainAttackTimes += 1;
            }
            return(null);
        }
        /// <summary>
        /// 随从发起攻击
        /// </summary>
        /// <param name="gameCode"></param>
        /// <param name="userCode"></param>
        /// <param name="cardInGameCode"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public APIResultBase ServantAttack(string gameCode, string userCode, string cardInGameCode, int target)
        {
            string         res = JsonStringResult.VerifyFail();
            Controler_Base ctl = Validate(gameCode, userCode);

            if (ctl == null)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.查询不到需要的数据));
            }
            if (VictoryValidate(ctl.GameContext))
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.游戏已经结束));
            }
            var player = ctl.GameContext.GetActivationUserContext();

            if (player == null || player.UserCode != userCode)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.查询不到需要的数据));
            }

            if (ctl.GameContext.DeskCards.Any(c => c != null && c.CardInGameCode == cardInGameCode) == false)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.查询不到需要的数据));
            }

            if (player.IsFirst && target < 8)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.参数错误));
            }
            else if (player.IsFirst == false && target > 7)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.参数错误));
            }

            BaseServant servant = ctl.GameContext.DeskCards.First(c => c != null && c.CardInGameCode == cardInGameCode) as BaseServant;

            if (servant.RemainAttackTimes < 1)
            {
                return(JsonModelResult.PackageFail(OperateResCodeEnum.查询不到需要的数据));
            }

            if (ctl.GameContext.DeskCards[target].HasTaunt == false)
            {
                List <BaseBiology> taunts = ctl.GameContext.DeskCards.GetDeskCardsByIsFirst(player.IsFirst ? false : true).Where(c => c != null && c.HasTaunt).ToList();
                for (int i = 0; i < taunts.Count; i++)
                {
                    if (taunts[i].HasTaunt && i != target)
                    {
                        return(JsonModelResult.PackageFail(OperateResCodeEnum.你必须先攻击有嘲讽技能的随从));
                    }
                }
            }
            ctl.ServantAttack(servant, target);
            return(JsonModelResult.PackageSuccess(_gameCache.GetContext(ctl.GameContext.GameCode).Output()));
        }
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            GameContext context      = actionParameter.GameContext;
            bool        isActivation = actionParameter.IsActivation;

            BaseServant servant = actionParameter.PrimaryCard as BaseServant;

            var player = context.Players.First(c => c.IsActivation == isActivation);

            servant.IsFirstPlayerCard = player.IsFirst;
            int deskIndex   = -1;
            int searchCount = 0;

            for (int i = player.IsFirst ? 0 : 8; i < context.DeskCards.Count; i++)
            {
                searchCount++;
                if (searchCount > 8)
                {
                    break;
                }
                if (context.DeskCards[i] == null)
                {
                    deskIndex = i;
                    break;
                }
            }
            if (deskIndex < 0)
            {
                return(null);
            }
            context.CastCardCount++;
            servant.CastIndex = context.CastCardCount;
            //context.AllCard.Add(servant);
            servant.DeskIndex            = deskIndex;
            servant.CardInGameCode       = context.AllCard.Count().ToString();
            context.DeskCards[deskIndex] = servant;
            player.AllCards.Add(servant);

            ActionParameter castPara = new ActionParameter()
            {
                PrimaryCard = servant,
                GameContext = actionParameter.GameContext,
                DeskIndex   = deskIndex
            };

            CardActionFactory.CreateAction(servant, ActionType.进场).Action(castPara);
            //servant.Cast(context, deskIndex, -1);

            context.EventQueue.AddLast(new ServantInDeskEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            return(servant);
        }
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            Card        triggerCard = actionParameter.SecondaryCard;

            servant.Life += actionParameter.DamageOrHeal;
            if (servant.Life > servant.BuffLife)
            {
                servant.Life = servant.BuffLife;
            }
            return(null);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 随从攻击进行阶段
        /// </summary>
        /// <param name="servant"></param>
        /// <param name="target"></param>
        public void ServantAttack(BaseServant servant, int target)
        {
            ActionParameter para = new ActionParameter()
            {
                PrimaryCard   = servant,
                GameContext   = GameContext,
                SecondaryCard = GameContext.DeskCards[target]
            };

            CardActionFactory.CreateAction(servant, ActionType.攻击).Action(para);
            // GameContext.AddEndOfPlayerActionEvent();
            GameContext.Settlement();
            _gameCache.SetContext(GameContext);
        }
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            Card        triggerCard = actionParameter.SecondaryCard;

            if (servant.HasHolyShield)
            {
                servant.HasHolyShield = false;
            }
            else if (servant.HasPoison)
            {
                servant.IsDeathing = true;
            }
            else
            {
                servant.Life -= actionParameter.DamageOrHeal;
            }

            HurtEvent hurtEvent = new HurtEvent()
            {
                EventCard = servant, Parameter = actionParameter
            };

            if (servant.CardAbility.TryCapture(servant, hurtEvent))
            {
                hurtEvent.Parameter.TertiaryCard = servant;
                gameContext.AddActionStatements(servant.CardAbility, hurtEvent.Parameter);
            }

            gameContext.EventQueue.AddLast(new MyServantHurtEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            gameContext.EventQueue.AddLast(new AnyServantHurtEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            gameContext.EventQueue.AddLast(new AnyHurtEvent()
            {
                EventCard = servant, Parameter = actionParameter
            });
            return(null);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 将一名随从从手牌中移到场上
        /// </summary>
        /// <param name="userCode"></param>
        /// <param name="cardInGameCode"></param>
        /// <param name="location"></param>
        public void CastServant(BaseServant servant, int location, int target)
        {
            var user = GameContext.GetActivationUserContext();

            user.Power -= servant.Cost < 0 ? 0 : servant.Cost;


            location = GameContext.AutoShiftServant(GameContext.ShiftServant(location));
            GameContext.ParachuteCard = servant;
            servant.CardLocation      = CardLocation.降落伞;

            ActionParameter para = new ActionParameter()
            {
                PrimaryCard   = servant,
                GameContext   = GameContext,
                DeskIndex     = location,
                SecondaryCard = target > -1 ? GameContext.DeskCards[target] : null
            };
            var cardAbilityParameter = new ActionParameter()
            {
                GameContext      = GameContext,
                PrimaryCard      = servant,
                SecondaryCard    = target > -1 ? GameContext.DeskCards[target] : null,
                PrimaryCardIndex = location,
            };

            new BattlecryEvent()
            {
                EventCard = servant, Parameter = cardAbilityParameter
            }.Settlement();
            GameContext.QueueSettlement();

            new CastServantAction().Action(para);
            GameContext.ParachuteCard = null;
            // user.ComboSwitch = true;
            GameContext.AddActionStatement(new ComboOnAction(), para);
            // GameContext.AddEndOfPlayerActionEvent();
            GameContext.EventQueueSettlement();
            GameContext.QueueSettlement();

            _gameCache.SetContext(GameContext);
        }
Ejemplo n.º 15
0
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            UC uc = GameActivator <UC> .CreateInstance();

            var enemy = actionParameter.GameContext.Players.First(uc.Filter(actionParameter));
            var user  = actionParameter.GameContext.Players.First(c => c.IsFirst != enemy.IsFirst);

            foreach (BaseBiology biology in actionParameter.GameContext.DeskCards.Where(Activator.CreateInstance <TAG>().Filter(actionParameter)))
            {
                BaseServant rndServant = biology as BaseServant;
                enemy.AllCards.RemoveAt(enemy.AllCards.FindIndex(c => c.CardInGameCode == rndServant.CardInGameCode));
                user.AllCards.Add(rndServant);

                actionParameter.GameContext.DeskCards[rndServant.DeskIndex] = null;

                if (rndServant.DeskIndex > 8)
                {
                    for (int i = 1; i < 8; i++)
                    {
                        if (actionParameter.GameContext.DeskCards[i] == null)
                        {
                            rndServant.DeskIndex = i;
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 9; i < 16; i++)
                    {
                        if (actionParameter.GameContext.DeskCards[i] == null)
                        {
                            rndServant.DeskIndex = i;
                            break;
                        }
                    }
                }

                actionParameter.GameContext.DeskCards[rndServant.DeskIndex] = rndServant;
            }
            return(null);
        }
        public IActionOutputParameter Action(ActionParameter actionParameter)
        {
            BaseServant servant     = actionParameter.PrimaryCard as BaseServant;
            GameContext gameContext = actionParameter.GameContext;
            Card        triggerCard = actionParameter.SecondaryCard;
            int         damege      = actionParameter.DamageOrHeal;

            DeductionServantLifeAction dslAct = new DeductionServantLifeAction();
            var dslPara = new ActionParameter()
            {
                GameContext   = gameContext,
                PrimaryCard   = servant,
                SecondaryCard = triggerCard,
                DamageOrHeal  = damege,
            };

            dslAct.Action(dslPara);

            return(null);
        }