/// <summary> /// 加载数据 /// </summary> public static void InitBoss(UserGuild userGuild) { try { if (_userGuildList.ContainsKey(userGuild.GuildID)) { _userGuildList[userGuild.GuildID] = userGuild; } else { _userGuildList.Add(userGuild.GuildID, userGuild); } CombatGeneral general = CreateBossGeneral(userGuild); if (!_bossGeneralList.ContainsKey(userGuild.GuildID)) { _bossGeneralList.Add(userGuild.GuildID, new BossDictionary { BossGeneral = general }); } else { _bossGeneralList[userGuild.GuildID].BossGeneral = general; } } catch (Exception ex) { new BaseLog().SaveLog(ex); } }
private void SetEmbattle(EmbattleQueue combatGrid, CacheList <CombatEmbattle> list) { IGeneral[] generalList = combatGrid.FindAll(true); foreach (IGeneral general in generalList) { if (general != null && general is CombatGeneral) { CombatGeneral cgeneral = (CombatGeneral)general; list.Add(new CombatEmbattle { UserID = cgeneral.UserID, GeneralID = cgeneral.GeneralID, GeneralName = cgeneral.GeneralName, GeneralLv = cgeneral.Lv, HeadID = cgeneral.HeadID, AbilityID = cgeneral.TempAbility == null ? 0 : cgeneral.TempAbility.AbilityID, LiveNum = cgeneral.LifeNum, LiveMaxNum = cgeneral.LifeMaxNum, MomentumNum = cgeneral.Momentum, MaxMomentumNum = CombatGeneral.MomentumOut, Position = cgeneral.Position, IsWait = cgeneral.IsWait, BattleHead = cgeneral.BattleHeadID }); } } if (list.Count == 0) { new BaseLog().SaveDebugLog("战斗异常,未能加载佣兵数据"); } }
/// <summary> /// 检查攻击方式 /// </summary> /// <returns></returns> public static CombatBaseAttack CheckAttack(CombatGeneral general) { //return !general.IsHunluanStatus && general.IsRelease // ? (CombatBaseAttack)new CombatAbilityAttack(general) // : new CombatPhysicalAttack(general); if (!general.IsHunluanStatus && general.IsRelease) { general.IsSelfAbility = 1; return((CombatBaseAttack) new CombatAbilityAttack(general)); } else { var ability = AbilityDispose.TriggerAbilityList(general.AbilityInfoList); if (ability != null) { general.IsSelfAbility = 2; general.TriggerAbility = ability; return((CombatBaseAttack) new CombatAbilityAttack(general)); } else { return(new CombatPhysicalAttack(general)); } } }
/// <summary> /// 初始化BOSS数据 /// </summary> /// <returns></returns> private static CombatGeneral CreateBossGeneral(UserGuild guild) { CombatGeneral boss = null; if (guild != null) { GuildBossInfo bossInfo = guild.GuildBossInfo; if (bossInfo != null) { var plotNpcInfoList = new ConfigCacheSet <PlotNPCInfo>().FindAll(m => m.PlotID == gameActive.BossPlotID); if (plotNpcInfoList.Count > 0) { var embattleList = new ConfigCacheSet <PlotEmbattleInfo>().FindAll(m => m.PlotNpcID == plotNpcInfoList[0].PlotNpcID); if (embattleList.Count > 0) { boss = (CombatGeneral)MonsterQueue.Create(embattleList[0]); boss.Lv = (short)MathUtils.Subtraction(bossInfo.BossLv, 0, gameActive.BossDefLv); int bossLiftNum = MonsterQueue.BossProperty(embattleList[0].PlotNpcID, AbilityType.ShengMing).ToInt(); int lifeNum = boss.LifeNum + (boss.Lv - gameActive.BossDefLv) * bossLiftNum; //ConfigEnvSet.GetInt("BossCombat.IncreaseLiveNum"); boss.LifeMaxNum = lifeNum; boss.LifeNum = lifeNum; } } else { throw new Exception(string.Format("公会战未配置BOSS:{0}", gameActive.BossPlotID)); } } } if (boss == null) { throw new Exception("Loading guid boss faild."); } return(boss); }
public static TList <SkillLvInfo> CreateSkillLvInfo(CombatGeneral general) { TList <SkillLvInfo> _skillLvList = new TList <SkillLvInfo>(); if (general.GeneralID == LanguageManager.GetLang().GameUserGeneralID) { var abilityCacheSet = new ConfigCacheSet <AbilityInfo>(); var skillLvSet = new ConfigCacheSet <SkillLvInfo>(); UserTrump userTrump = new GameDataCacheSet <UserTrump>().FindKey(general.UserID, TrumpInfo.CurrTrumpID) ?? new UserTrump(); if (userTrump.LiftNum > 0) { userTrump.SkillInfo.Foreach(obj => { var abilityInfo = abilityCacheSet.FindKey(obj.AbilityID) ?? new AbilityInfo(); if (abilityInfo.AttackType == AttackType.Trigger) { var temp = skillLvSet.FindKey(obj.AbilityID, obj.AbilityLv); if (temp != null) { _skillLvList.Add(temp); } } return(true); }); } } return(_skillLvList); }
public CombatCenter(EmbattleRole role, CombatGeneral general, EmbattleRole targerRole, TargetHandle targetHandle) { _role = role; _attrGeneral = general; _targerRole = targerRole; _targerHandle = targetHandle; _processLog = new CombatProcess(); }
/// <summary> /// 破盾 /// </summary> /// <param name="general"></param> /// <param name="abilityType"></param> /// <returns></returns> public static bool AttackPoDun(CombatGeneral general, AbilityType abilityType) { SkillLvInfo skillLvInfo = CreateSkillLvInfo(general).Find(m => m.EffType == abilityType); if (skillLvInfo != null && RandomUtils.IsHit(skillLvInfo.Probability)) { return(true); } return(false); }
/// <summary> /// 触发爆击概率 /// </summary> /// <param name="tagetGeneral"></param> /// <param name="baojiPercent"></param> /// <returns></returns> public bool TriggerBaojiPercent(CombatGeneral tagetGeneral, out decimal baojiPercent) { decimal tpLvPercent = GetLvPercent(tagetGeneral); baojiPercent = this.BaojiNum + TriggerAbilityEffectNum(AbilityType.BaoJi, 1); decimal renxingPercent = tagetGeneral.RenxingNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.RenXing, 1); baojiPercent = baojiPercent.Subtraction(renxingPercent, 0).Subtraction(tpLvPercent, 0); return(RandomHelper.IsHit(baojiPercent)); }
/// <summary> /// 触发格挡概率 /// </summary> /// <param name="tagetGeneral"></param> /// <param name="gedangPercent"></param> /// <returns></returns> public bool TriggerGeDangPercent(CombatGeneral tagetGeneral, out decimal gedangPercent) { decimal tpLvPercent = GetLvPercent(tagetGeneral); gedangPercent = this.GedangNum + TriggerAbilityEffectNum(AbilityType.GeDang, 1); decimal pojiNumPercent = tagetGeneral.PojiNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.PoJi, 1); gedangPercent = gedangPercent.Subtraction(pojiNumPercent, 0).Subtraction(tpLvPercent, 0); return(RandomHelper.IsHit(gedangPercent)); }
public CombatBaseAttack(CombatGeneral general) { General = general; ProcessLog = new CombatProcess(); ProcessLog.GeneralID = general.GeneralID; ProcessLog.Position = general.Position.ToShort(); ProcessLog.LiveNum = general.LifeNum; ProcessLog.Momentum = general.Momentum; ProcessLog.AttStatus = general.BattleStatus; }
/// <summary> /// 触发命中概率 /// </summary> /// <param name="general"></param> /// <param name="tpLvPercent"></param> /// <param name="percent"></param> /// <returns></returns> public bool TriggerHitPercent(CombatGeneral tagetGeneral, out decimal hitPercent) { decimal tpLvPercent = GetLvPercent(tagetGeneral); hitPercent = HitNum + TriggerAbilityEffectNum(AbilityType.MingZhong, 1); decimal shanbiPercent = tagetGeneral.ShanbiNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.ShanBi, 1); hitPercent = hitPercent.Subtraction(shanbiPercent, 0).Subtraction(tpLvPercent, 0); return(RandomHelper.IsHit(hitPercent)); }
/// <summary> /// 属相克制伤害 /// </summary> /// <param name="userID1"></param> /// <param name="userID2"></param> /// <returns></returns> public static decimal TrumpZodiacHarm(CombatGeneral general, string userID2) { if (general.GeneralID != LanguageManager.GetLang().GameUserGeneralID) { return(0); } ZodiacType zodiacType1 = GetZodiacType(general.UserID); ZodiacType zodiacType2 = GetZodiacType(userID2); return(ZodiacRestraint(zodiacType1, zodiacType2)); }
private static decimal GetEffTypeNum(CombatGeneral general, AbilityType abilityType) { TList <SkillLvInfo> skillLvList = CreateSkillLvInfo(general); foreach (SkillLvInfo info in skillLvList) { if (info.EffType == abilityType && RandomUtils.IsHit(info.Probability)) { return(info.EffNum); } } return(0); }
public CombatAbilityAttack(CombatGeneral general) : base(general) { if (general.IsSelfAbility == 2) { _ability = General.TriggerAbility; General.TempAbility = General.TriggerAbility; } else { _ability = General.Ability; General.TempAbility = General.Ability; } general.IsSelfAbility = 0; }
public static decimal GetEffect(CombatGeneral general, AbilityType abilityType) { decimal effNum = 1; if (general.GeneralID != LanguageManager.GetLang().GameUserGeneralID) { return(0); } switch (abilityType) { case AbilityType.BaoJiJiaCheng: effNum = MathUtils.Addition(effNum, GetEffTypeNum(general, abilityType)); break; case AbilityType.IsBaoJiReduce: effNum = MathUtils.Subtraction(effNum, GetEffTypeNum(general, abilityType)); break; case AbilityType.Resurrect: effNum = GetEffTypeNum(general, abilityType); break; case AbilityType.AttackLife: effNum = GetEffTypeNum(general, abilityType); break; case AbilityType.Furious: effNum = LifeLowerTnumEffNum(general, abilityType); break; case AbilityType.NormalAttackPoFang: effNum = GetEffTypeNum(general, abilityType); break; case AbilityType.AttackPoDun: //effNum = GetEffTypeNum(general, abilityType); break; case AbilityType.FanShang: effNum = GetEffTypeNum(general, abilityType); break; default: return(effNum); } return(effNum); }
/// <summary> /// 初始化BOSS数据 /// </summary> /// <param name="active"></param> /// <returns></returns> private static CombatGeneral CreateBossGeneral(GameActive active) { CombatGeneral boss = null; if (active != null) { var plotNpcInfoList = new ConfigCacheSet <PlotNPCInfo>().FindAll(m => m.PlotID == active.BossPlotID); if (plotNpcInfoList.Count > 0) { var embattleList = new ConfigCacheSet <PlotEmbattleInfo>().FindAll(m => m.PlotNpcID == plotNpcInfoList[0].PlotNpcID); if (embattleList.Count > 0) { int npcId = plotNpcInfoList[0].PlotNpcID; boss = (CombatGeneral)MonsterQueue.Create(embattleList[0]); boss.Lv = (short)MathUtils.Subtraction(active.BossLv, 0, active.BossDefLv); int bossLiftNum = MonsterQueue.BossProperty(embattleList[0].PlotNpcID, AbilityType.ShengMing).ToInt(); int lv = (boss.Lv - active.BossDefLv); int lifeNum = boss.LifeNum + lv * bossLiftNum; //ConfigEnvSet.GetInt("BossCombat.IncreaseLiveNum"); boss.LifeMaxNum = lifeNum; boss.LifeNum = lifeNum; if (lv > 0) { boss.PowerNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.PowerNum)).ToInt(), boss.PowerNum).ToInt(); boss.SoulNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.SoulNum).ToInt()), boss.SoulNum).ToInt(); boss.IntellectNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.IntelligenceNum).ToInt()), boss.IntellectNum).ToInt(); boss.PhyAttackNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.WuLiGongJi).ToInt()), boss.PhyAttackNum); boss.AbiAttackNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.HunJiGongJi).ToInt()), boss.AbiAttackNum); boss.MagAttackNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.MoFaGongJi).ToInt()), boss.MagAttackNum); boss.PhyDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.WuLiFangYu).ToInt()), boss.PhyDefenseNum); boss.AbiDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.HunJiFangYu).ToInt()), boss.AbiDefenseNum); boss.MagDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.MoFaFangYu).ToInt()), boss.MagDefenseNum); } TraceLog.WriteComplement("世界BOSS属性值---血量:{0}、上限血量:{1}、力量:{2}、魂力:{3}、智力:{4}、物理攻击:{5}、魂技攻击:{6}、魔法攻击:{7}、物理防御:{8}、魂技防御:{9}、魔法防御:{10}", boss.LifeNum, boss.LifeMaxNum, boss.PowerNum, boss.SoulNum, boss.IntellectNum, (boss.ExtraAttack.WuliNum + boss.PhyAttackNum), (boss.ExtraAttack.HunjiNum + boss.AbiAttackNum), (boss.ExtraAttack.MofaNum + boss.MagAttackNum), (boss.ExtraDefense.WuliNum + boss.PhyDefenseNum), (boss.ExtraDefense.HunjiNum + boss.AbiDefenseNum), (boss.ExtraDefense.MofaNum + boss.MagDefenseNum)); } } else { throw new Exception(string.Format("公会战未配置BOSS:{0}", active.BossPlotID)); } } if (boss == null) { throw new Exception("Loading boss faild."); } return(boss); }
/// <summary> /// 获取攻击单位 /// </summary> /// <param name="position">攻击方的位置</param> /// <param name="attackType">攻击方式</param> /// <param name="attackTaget">攻击目标</param> /// <param name="targetEmbattle"></param> private static CombatGeneral[] GetTargetUnit(int position, AttackUnit attackType, AttackTaget attackTaget, EmbattleQueue targetEmbattle) { IGeneral[] generalList = new IGeneral[0]; List <CombatGeneral> targetGeneralList = new List <CombatGeneral>(); switch (attackType) { case AttackUnit.Single: CombatGeneral cg = null; if (attackTaget == AttackTaget.Self) { cg = (CombatGeneral)targetEmbattle.GetGeneral(position); } else { cg = (CombatGeneral)targetEmbattle.FindGeneral(position); } if (cg != null) { generalList = new IGeneral[] { cg }; } break; case AttackUnit.Horizontal: generalList = targetEmbattle.FindHorizontal(position); break; case AttackUnit.Vertical: generalList = targetEmbattle.FindVertical(position); break; case AttackUnit.All: generalList = targetEmbattle.FindAll(); break; default: break; } foreach (IGeneral general in generalList) { targetGeneralList.Add((CombatGeneral)general); } return(targetGeneralList.ToArray()); }
/// <summary> /// 血量低于特定值时加成 /// </summary> /// <param name="abilityType"></param> /// <returns></returns> private static decimal LifeLowerTnumEffNum(CombatGeneral general, AbilityType abilityType) { SkillLvInfo skillLvInfo = CreateSkillLvInfo(general).Find(m => m.EffType == abilityType); if (skillLvInfo != null) { if (skillLvInfo.Tnum > 1 && general.LifeNum <= skillLvInfo.Tnum && RandomUtils.IsHit(skillLvInfo.Probability)) { return(skillLvInfo.EffNum); } else if (skillLvInfo.Tnum < 1) { decimal tnum = skillLvInfo.Tnum * general.LifeMaxNum; if (tnum >= general.LifeNum && RandomUtils.IsHit(skillLvInfo.Probability)) { return(skillLvInfo.EffNum); } } } return(0); }
/// <summary> /// 计算伤害公式 /// 攻击伤害 = 攻击力 - 物理防御力 /// </summary> /// <param name="tagetGeneral">加血等辅助技能时可能为空值</param> /// <returns></returns> protected int GetPhysicalDamageNum(CombatGeneral tagetGeneral) { AbilityProperty property = General.AbilityProperty; ProcessLog.AbilityProperty = property; int damageNum; int attackNum; int defenseNum = 0; decimal harmNum = 0; //法宝属相克制伤害 --技能攻击 attackNum = General.GetAttackNum(property); if (tagetGeneral != null) { harmNum = TrumpAbilityAttack.TrumpZodiacHarm(General, tagetGeneral.UserID); defenseNum = tagetGeneral.GetDefenseNum(property, tagetGeneral); //普通攻击破防 decimal normalAttackPoFang = TrumpAbilityAttack.GetEffect(General, AbilityType.NormalAttackPoFang); if (normalAttackPoFang > 0) { ProcessLog.TrumpStatusList.Add(TrumpAbilityAttack.GetSkillprocess(AbilityType.NormalAttackPoFang, 0)); } defenseNum = (int)Math.Floor(MathUtils.Subtraction(defenseNum, defenseNum * normalAttackPoFang)); } General.MinDamageNum = (int)Math.Ceiling(attackNum * ConfigEnvSet.GetDouble("Combat.MinDamagePencent")); damageNum = MathUtils.Subtraction(attackNum, defenseNum, General.MinDamageNum); //加固定伤害 damageNum = MathUtils.Addition(damageNum, General.FixedDamageNum, int.MaxValue); //法宝属相克制伤害 --技能攻击 if (harmNum > 0 && !isPyharm) { damageNum = (int)(damageNum * MathUtils.Addition(1, (harmNum + General.EffectValue))); isPyharm = true; } return(damageNum); }
/// <summary> /// 加载数据 /// </summary> public static void InitBoss(GameActive gameActive) { if (_gameActiveList.ContainsKey(gameActive.ActiveId)) { _gameActiveList[gameActive.ActiveId] = gameActive; } else { _gameActiveList.Add(gameActive.ActiveId, gameActive); } CombatGeneral general = CreateBossGeneral(gameActive); if (!_bossGeneralList.ContainsKey(gameActive.ActiveId)) { _bossGeneralList.Add(gameActive.ActiveId, new BossDictionary { BossGeneral = general }); } else { _bossGeneralList[gameActive.ActiveId].BossGeneral = general; } }
/// <summary> /// 等级差压制 /// </summary> /// <param name="tagetGeneral"></param> /// <returns></returns> private decimal GetLvPercent(CombatGeneral tagetGeneral) { return(tagetGeneral.Lv.Subtraction(this.Lv, 0) * ConfigEnvSet.GetDecimal("Combat.LvPercentRate")); }
/// <summary> /// 计算技能伤害公式,不产生负数 /// </summary> /// <param name="tagetGeneral"></param> /// <returns></returns> protected int GetAbilityDamageNum(CombatGeneral tagetGeneral) { string traceStr = string.Empty; int damageNum; int attackNum; int defenseNum = 0; decimal harmNum = 0; //法宝属相克制伤害 --技能攻击 AbilityProperty property = General.AbilityProperty; ProcessLog.AbilityProperty = property; attackNum = General.GetAttackNum(AbilityProperty.Ability) + General.GetAttackNum(property); if (tagetGeneral != null) { //法宝属相克制伤害 --技能攻击 harmNum = TrumpAbilityAttack.TrumpZodiacHarm(General, tagetGeneral.UserID); defenseNum = tagetGeneral.GetDefenseNum(AbilityProperty.Ability, tagetGeneral) + tagetGeneral.GetDefenseNum(property, tagetGeneral); } General.MinDamageNum = (int)Math.Ceiling(attackNum * ConfigEnvSet.GetDouble("Combat.MinDamagePencent")); damageNum = MathUtils.Subtraction(attackNum, defenseNum, General.MinDamageNum); decimal ratioNum = General.TempAbility.RatioNum > 0 ? General.TempAbility.RatioNum : 1; damageNum = (int)Math.Floor(damageNum * ratioNum); //计算伤害系数 //气势加成=气势/{100-(气势-100)*2/3}*100% if (General != null) { var qishiNum = General.Momentum == 0 ? (short)100 : General.Momentum; traceStr += "qishiNum:" + qishiNum; decimal qishiPercent = (decimal)qishiNum / 100; traceStr += "qishiPercent:" + qishiNum; damageNum = (int)Math.Floor(damageNum * qishiPercent); traceStr += "damageNum:" + qishiNum; //加固定伤害 damageNum = MathUtils.Addition(damageNum, General.FixedDamageNum, int.MaxValue); traceStr += "FixedDamageNum:" + qishiNum; } //技能伤害,负数是增加, //damageNum = General != null && General.Ability.IsIncrease ? -damageNum : damageNum; if (damageNum == 0) { new BaseLog().SaveLog(new Exception("释放技能:" + General.TempAbility.AbilityName + General.TempAbility.AbilityID + "伤害为0,Trace:" + traceStr)); } if (damageNum < General.MinDamageNum) { damageNum = General.MinDamageNum; } //法宝属相克制伤害 --技能攻击 if (!isharm && harmNum > 0) { damageNum = (int)(damageNum * MathUtils.Addition(1, harmNum)); isharm = true; } //魂技等级与自身魂技加成 int abilityID = General.TempAbility != null ? General.TempAbility.AbilityID : 0; decimal effectValue = AbilityDispose.GetAbilityEffect(General.UserID, General.GeneralID, abilityID); if (effectValue > 0) { damageNum = MathUtils.ToCeilingInt(damageNum * MathUtils.Addition(1, (effectValue))); } return(damageNum); }
/// <summary> /// 佣兵属性集合 /// </summary> /// <param name="userID"></param> /// <param name="generalID"></param> /// <returns></returns> public static List <GeneralProperty> GetAbility(string userID, int generalID, UserGeneral userGeneral) { List <GeneralProperty> gPropertyList = new List <GeneralProperty>(); var cacheSetUserEmbattle = new PersonalCacheStruct <UserEmbattle>(); GeneralProperty generalProperty = new GeneralProperty(); var userMagic = new PersonalCacheStruct <UserMagic>().Find(userID, s => s.IsEnabled); CombatGeneral combatGeneral = new CombatGeneral() { UserID = userID, GeneralID = generalID, ExtraAttack = new CombatProperty(), ExtraDefense = new CombatProperty(), LifeNum = userGeneral.LifeNum, LifeMaxNum = userGeneral.LifeMaxNum }; var userEmbattleList = cacheSetUserEmbattle.FindAll(userID, s => s.MagicID == (userMagic != null ? userMagic.MagicID : 0)); UserEmbattleQueue.embattleList = userEmbattleList; UserEmbattleQueue.KarmaAddition(userID, combatGeneral); userGeneral.TLifeNum = combatGeneral.LifeNum; userGeneral.TLifeMaxNun = combatGeneral.LifeMaxNum; //int LifeReply = 0; // 生命回复 //物理攻击 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.WuLiGongJi); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionWuliNum); gPropertyList.Add(generalProperty); //物理防御 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.WuLiFangYu); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionWuliNum); gPropertyList.Add(generalProperty); //魂技攻击 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.HunJiGongJi); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionHunjiNum); gPropertyList.Add(generalProperty); //魂技防御 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.HunJiFangYu); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionHunjiNum); gPropertyList.Add(generalProperty); //魔法攻击 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.MoFaGongJi); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionMofaNum); gPropertyList.Add(generalProperty); //魔法防御 generalProperty = GetAbilityProperty(userID, generalID, AbilityType.MoFaFangYu); generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionMofaNum); gPropertyList.Add(generalProperty); //暴击 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.BaoJi)); //命中 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.MingZhong)); //破击 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.PoJi)); //韧性 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.RenXing)); //闪避 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.ShanBi)); //格挡 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.GeDang)); //必杀 gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.BiSha)); //先攻 gPropertyList.Add(new GeneralProperty() { AbilityType = AbilityType.FirstStrike, AbilityValue = (decimal)TotalPriorityNum(userID, generalID) }); return(gPropertyList); }
/// <summary> /// 触发战斗 /// </summary> /// <param name="user"></param> /// <param name="bossCombatProcess"></param> /// <returns></returns> public bool Combat(GameUser user, BossCombatProcess bossCombatProcess) { CombatGeneral bossGeneral = Boss; bossGeneral.LossLifeNum = 0; BossUser bossUser = GetCombatUser(user.UserID); ICombatController controller = CombatControllerFactory.Create(); ISingleCombat plotCombater = controller.GetSingleCombat(CombatType.BossPlot); double inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent; plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent, CombatType.BossPlot)); plotCombater.SetDefend(new MonsterQueue(Boss)); bool isWin = plotCombater.Doing(); bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult(); bossUser.CombatNum += 1; bossUser.DamageNum = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue); bossCombatProcess.LiveNum = bossGeneral.LifeNum; bossCombatProcess.DamageNum = bossGeneral.LossLifeNum; bossCombatProcess.IsWin = isWin; bossCombatProcess.UserId = user.UserID; DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess); if (isWin && bossGeneral.IsOver) { GameActive active = GameActive; short lv = MathUtils.Subtraction(bossGeneral.Lv, (short)active.BossPrize.KillBossLv, (short)1); int killCoin = lv * active.BossPrize.KillBossRate; user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue); new TjxChatService().SystemSend(ChatType.World, string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin)); TraceLog.ReleaseWriteDebug(string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin)); bossCombatProcess.KillGameCoin = killCoin; ServerEnvSet.Set(ServerEnvKey.KillBossUserID, user.UserID); DoKillPrize(user); int tempMinute = active.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime"); if (new TimeSpan(0, tempMinute, 0).TotalSeconds - active.ColdTime < 0) { //Boss自动升级 active.BossLv = MathUtils.Addition(active.BossLv, (short)1); //active.Update(); } active.CombatStatus = CombatStatus.Killed; CombatHelper.BossKillDate(); //增加boss被杀时间 } else { bossUser.IsRelive = true; bossUser.ReliveBeginDate = DateTime.Now; } //日志 var log = new UserCombatLog { CombatLogID = Guid.NewGuid().ToString(), UserID = user.UserID, CityID = user.CityID, PlotID = GameActive == null ? 0 : GameActive.BossPlotID, NpcID = bossGeneral.GeneralID, CombatType = CombatType.BossPlot, HostileUser = string.Empty, IsWin = isWin, CombatProcess = JsonUtils.Serialize(bossCombatProcess), CreateDate = DateTime.Now }; var sender = DataSyncManager.GetDataSender(); sender.Send(log); //user.Update(); return(isWin); }
/// <summary> /// 触发战斗 /// </summary> /// <param name="user"></param> /// <param name="bossCombatProcess"></param> /// <returns></returns> public bool Combat(GameUser user, BossCombatProcess bossCombatProcess) { CombatGeneral bossGeneral = Boss; bossGeneral.LossLifeNum = 0; bool isWin = false; BossUser bossUser = GetCombatUser(user.UserID); ICombatController controller = CombatControllerFactory.Create(); ISingleCombat plotCombater = controller.GetSingleCombat(CombatType.BossPlot); double inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent; plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent, CombatType.BossPlot)); plotCombater.SetDefend(new MonsterQueue(bossGeneral)); isWin = plotCombater.Doing(); bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult(); bossUser.CombatNum += 1; bossUser.DamageNum = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue); bossCombatProcess.LiveNum = bossGeneral.LifeNum; bossCombatProcess.DamageNum = bossGeneral.LossLifeNum; bossCombatProcess.IsWin = isWin; bossCombatProcess.UserId = user.UserID; DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess); if (isWin && bossGeneral.IsOver) { //GameActive active = GameActive; UserGuild guild = UserGuild; short bossprizeLv = 0; int killbossrate = 0; if (guild.BossPrize != null) { bossprizeLv = (short)guild.BossPrize.KillBossLv; killbossrate = guild.BossPrize.KillBossRate; //击杀奖 BossActivePrize bossPrize = UserGuild.BossPrize; string prizeItemMsg = string.Empty; DoTopThreePrize(0, user, bossPrize.KillReward, bossPrize.Items, out prizeItemMsg); } short lv = MathUtils.Subtraction(bossGeneral.Lv, bossprizeLv, (short)1); int killCoin = lv * killbossrate; user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue); // new CacheChat().SystemSend(ChatType.World, string.Format("{0}玩家获得公会Boss战击杀奖,奖励{1}金币", user.NickName, killCoin)); new TjxChatService(user).SystemGuildSend(ChatType.Guild, string.Format(LanguageManager.GetLang().St6105_CombatKillReward, user.NickName, killCoin)); bossCombatProcess.KillGameCoin = killCoin; DoKillPrize(); int tempMinute = gameActive.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime"); int subSeconds = (int)new TimeSpan(0, tempMinute, 0).TotalSeconds; if (subSeconds - guild.ColdTime < 0) { //Boss自动升级 guild.GuildBossInfo.UpdateNotify(obj => { guild.GuildBossInfo.BossLv = MathUtils.Addition(guild.GuildBossInfo.BossLv, (short)1, short.MaxValue); return(true); }); //guild.Update(); } guild.CombatStatus = CombatStatus.Killed; CombatHelper.UpdateGuildBossKill(guild.GuildID); //公会boss已被杀 } else { bossUser.IsRelive = true; bossUser.ReliveBeginDate = DateTime.Now; } //日志 var log = new UserCombatLog { CombatLogID = Guid.NewGuid().ToString(), UserID = user.UserID, CityID = user.CityID, PlotID = gameActive == null ? 0 : gameActive.BossPlotID, NpcID = bossGeneral.GeneralID, CombatType = CombatType.BossPlot, HostileUser = string.Empty, IsWin = isWin, CombatProcess = JsonUtils.Serialize(bossCombatProcess), CreateDate = DateTime.Now }; var sender = DataSyncManager.GetDataSender(); sender.Send(log); //user.Update(); return(isWin); }
public static IGeneral Create(SJTPlotEmbattleInfo embattle) { var monster = new ConfigCacheSet <SJTMonsterInfo>().FindKey(embattle.MonsterID); if (monster == null) { throw new Exception("Plot monster:" + embattle.MonsterID + " is not exist"); } CareerInfo career = new ConfigCacheSet <CareerInfo>().FindKey(monster.CareerID); AbilityInfo ability = new ConfigCacheSet <AbilityInfo>().FindKey(monster.AbilityID); var abilityLv = new ConfigCacheSet <AbilityLvInfo>().FindKey(monster.AbilityLv); if (career == null || ability == null || abilityLv == null) { throw new Exception("career or ability or AbilityLv is null."); } CombatGeneral general = new CombatGeneral() { UserID = null, Position = embattle.GridSeqNo, GeneralID = embattle.MonsterID, GeneralName = monster.GeneralName, HeadID = monster.HeadID, CareerID = monster.CareerID, CareerType = career.CareerType, IsMove = career.IsMove, LifeNum = monster.LifeNum, LifeMaxNum = monster.LifeNum, Lv = monster.GeneralLv, Momentum = (short)monster.MomentumNum, Ability = ability, IsAttrMove = ability.IsMove, BaojiNum = monster.BaojiNum, BishaNum = monster.BishaNum, RenxingNum = monster.RenxingNum, HitNum = monster.HitNum == 0 ? ConfigEnvSet.GetDecimal("Combat.HitiNum") : monster.HitNum, ShanbiNum = monster.ShanbiNum, GedangNum = monster.GedangNum, PojiNum = monster.PojiNum, BattleStatus = BattleStatus.Normal, PowerNum = monster.PowerNum, SoulNum = monster.SoulNum, IntellectNum = monster.IntellectNum, FixedDamageNum = 0, //怪物没有附加属性 ExtraAttack = new CombatProperty(), ExtraDefense = new CombatProperty(), IsMonster = true, IsWait = false, PhyAttackNum = monster.PhyAttackNum, PhyDefenseNum = monster.PhyDefenseNum, MagAttackNum = monster.MagAttackNum, MagDefenseNum = monster.MagDefenseNum, AbiAttackNum = monster.AbiAttackNum, AbiDefenseNum = monster.AbiDefenseNum }; general.PhyAttackNum = MathUtils.Addition(general.PhyAttackNum, (general.PhyAttackNum * abilityLv.EffectValue)).ToInt(); general.PhyDefenseNum = MathUtils.Addition(general.PhyDefenseNum, (general.PhyDefenseNum * abilityLv.EffectValue)).ToInt(); general.MagAttackNum = MathUtils.Addition(general.MagAttackNum, (general.MagAttackNum * abilityLv.EffectValue)).ToInt(); general.MagDefenseNum = MathUtils.Addition(general.MagDefenseNum, (general.MagDefenseNum * abilityLv.EffectValue)).ToInt(); general.AbiAttackNum = MathUtils.Addition(general.AbiAttackNum, (general.AbiAttackNum * abilityLv.EffectValue)).ToInt(); general.AbiDefenseNum = MathUtils.Addition(general.AbiDefenseNum, (general.AbiDefenseNum * abilityLv.EffectValue)).ToInt(); return(general); }
public CombatPhysicalAttack(CombatGeneral general) : base(general) { }
public static IGeneral Create(SJTPlotEmbattleInfo embattle, double difficultNum) { SJTMonsterInfo monster = new ShareCacheStruct <SJTMonsterInfo>().FindKey(embattle.MonsterID); if (monster == null) { throw new Exception("Plot monster:" + embattle.MonsterID + " is not exist"); } CareerInfo career = new ShareCacheStruct <CareerInfo>().FindKey(monster.CareerID); AbilityInfo ability = new ShareCacheStruct <AbilityInfo>().FindKey(monster.AbilityID); if (career == null || ability == null) { throw new Exception("career or ability is null."); } CombatGeneral general = new CombatGeneral() { UserID = null, Position = embattle.GridSeqNo, GeneralID = embattle.MonsterID, GeneralName = monster.GeneralName, HeadID = monster.HeadID, CareerID = monster.CareerID, CareerType = career.CareerType, IsMove = career.IsMove, LifeNum = monster.LifeNum, LifeMaxNum = monster.LifeNum, Lv = monster.GeneralLv, Momentum = (short)monster.MomentumNum, Ability = ability, IsAttrMove = ability.IsMove, BaojiNum = monster.BaojiNum, BishaNum = monster.BishaNum, RenxingNum = monster.RenxingNum, HitNum = monster.HitNum == 0 ? ConfigEnvSet.GetDecimal("Combat.HitiNum") : monster.HitNum, ShanbiNum = monster.ShanbiNum, GedangNum = monster.GedangNum, PojiNum = monster.PojiNum, BattleStatus = BattleStatus.Normal, PowerNum = monster.PowerNum, SoulNum = monster.SoulNum, IntellectNum = monster.IntellectNum, //todo 圣吉塔怪物表未配置固定伤害值 FixedDamageNum = 1, //monster.DamageNum, //怪物没有附加属性 ExtraAttack = new CombatProperty(), ExtraDefense = new CombatProperty(), IsMonster = true, IsWait = false, PhyAttackNum = (monster.PhyAttackNum * difficultNum).ToInt(), PhyDefenseNum = (monster.PhyDefenseNum * difficultNum).ToInt(), MagAttackNum = (monster.MagAttackNum * difficultNum).ToInt(), MagDefenseNum = (monster.MagDefenseNum * difficultNum).ToInt(), AbiAttackNum = (monster.AbiAttackNum * difficultNum).ToInt(), AbiDefenseNum = (monster.AbiDefenseNum * difficultNum).ToInt() }; return(general); }