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); }
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); }
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); }
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); }
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 }); }
/// <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); }
/// <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); }
/// <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); }
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); }