private float GetSkillHitRateCorrectionValue(CharacterStateControl attacker) { float num = 0f; List <ExtraEffectStatus> extraEffectStatus = BattleStateManager.current.battleStateData.extraEffectStatus; List <ExtraEffectStatus> invocationList = ExtraEffectStatus.GetInvocationList(extraEffectStatus, EffectStatusBase.EffectTriggerType.Usually); num += ExtraEffectStatus.GetSkillHitRateCorrectionValue(invocationList, this, attacker) - this.hitRate; num += attacker.chipAddHit; foreach (int num2 in attacker.potencyChipIdList.Keys) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(num2.ToString()); GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] chipEffects = new GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] { chipEffectDataToId }; num += ChipEffectStatus.GetSkillHitRateCorrectionValue(chipEffects, this, attacker); } SufferStateProperty sufferStateProperty = attacker.currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.HitRateUp); if (sufferStateProperty.isActive) { num += sufferStateProperty.upPercent; } SufferStateProperty sufferStateProperty2 = attacker.currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.HitRateDown); if (sufferStateProperty2.isActive) { num -= sufferStateProperty2.downPercent; } num += attacker.leaderSkillResult.hitRateUpPercent; return(num); }
public void RemovePotencyChip(EffectStatusBase.EffectTriggerType triggerType) { List <GameWebAPI.RespDataMA_ChipEffectM.ChipEffect> list = new List <GameWebAPI.RespDataMA_ChipEffectM.ChipEffect>(); foreach (int num in this.potencyChipIdList.Keys) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(num.ToString()); if (chipEffectDataToId != null && chipEffectDataToId.effectTrigger.ToInt32() == (int)triggerType) { list.Add(chipEffectDataToId); } } foreach (GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffect in list) { this.potencyChipIdList.Remove(chipEffect.chipEffectId.ToInt32()); } this.AddChipParam(false, list.ToArray(), true, false); }
public void SetCharacterState(CharacterStateControlStore savedCSC) { this.SetChipEffectCount(savedCSC.chipEffectCount); this.SetPotencyChipIdList(savedCSC.potencyChipIdList); foreach (int num in this.potencyChipIdList.Keys) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(num.ToString()); if (chipEffectDataToId != null) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] chipEffects = new GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] { chipEffectDataToId }; EffectStatusBase.EffectTriggerType effectTriggerType = (EffectStatusBase.EffectTriggerType)chipEffectDataToId.effectTrigger.ToInt32(); if (effectTriggerType != EffectStatusBase.EffectTriggerType.Usually && effectTriggerType != EffectStatusBase.EffectTriggerType.Area) { this.AddChipParam(true, chipEffects, true, false); } } } }
public void RemoveDeadStagingChips() { if (BattleStateManager.current == null) { return; } Dictionary <int, int> dictionary = new Dictionary <int, int>(); foreach (KeyValuePair <int, int> keyValuePair in this.stagingChipIdList) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(keyValuePair.Key.ToString()); if (chipEffectDataToId.effectTrigger.ToInt32() == 6) { List <AffectEffectProperty> affectEffectPropertyList = BattleStateManager.current.serverControl.GetAffectEffectPropertyList(chipEffectDataToId.effectValue); if (affectEffectPropertyList != null) { foreach (AffectEffectProperty affectEffectProperty in affectEffectPropertyList) { CharacterStateControl[] skillTargetList = BattleStateManager.current.targetSelect.GetSkillTargetList(this.characterStateControl, affectEffectProperty.target); if (skillTargetList.Length != 0) { if (dictionary.ContainsKey(keyValuePair.Key)) { dictionary[keyValuePair.Key] = keyValuePair.Value; } else { dictionary.Add(keyValuePair.Key, keyValuePair.Value); } } } } } } this.stagingChipIdList = dictionary; }
private List <SubStatePlayChipEffect.ReturnData> CheckPlayStagingChipEffect(CharacterStateControl[] chipActor) { List <SubStatePlayChipEffect.ReturnData> list = new List <SubStatePlayChipEffect.ReturnData>(); foreach (CharacterStateControl characterStateControl in chipActor) { SubStatePlayChipEffect.ReturnData returnData = new SubStatePlayChipEffect.ReturnData(); returnData.characterStateControl = characterStateControl; SubStatePlayChipEffect.ChipPlayType chipPlayType = SubStatePlayChipEffect.ChipPlayType.None; foreach (KeyValuePair <int, int> keyValuePair in characterStateControl.stagingChipIdList) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(keyValuePair.Key.ToString()); if (!characterStateControl.isDied || chipEffectDataToId.effectTrigger.ToInt32() == 6) { if (!returnData.dictionary.ContainsKey(keyValuePair.Value)) { returnData.dictionary[keyValuePair.Value] = new List <GameWebAPI.RespDataMA_ChipEffectM.ChipEffect>(); } if (chipEffectDataToId.effectType.ToInt32() == 60) { SkillStatus skillStatus = base.hierarchyData.GetSkillStatus(chipEffectDataToId.effectValue); CharacterStateControl target = this.GetTarget(characterStateControl, chipEffectDataToId); if (chipEffectDataToId.effectTrigger.ToInt32() == 37) { if (skillStatus != null && target != null && this.checkUseSkill(skillStatus, characterStateControl, target)) { returnData.chipPlayType = SubStatePlayChipEffect.ChipPlayType.ChipAndSKillPlay; returnData.dictionary[keyValuePair.Value].Add(chipEffectDataToId); } else { returnData.characterStateControl.AddChipEffectCount(chipEffectDataToId.chipEffectId.ToInt32(), 1); } } else if (skillStatus != null && target != null) { returnData.chipPlayType = SubStatePlayChipEffect.ChipPlayType.ChipAndSKillPlay; returnData.dictionary[keyValuePair.Value].Add(chipEffectDataToId); } else { returnData.characterStateControl.AddChipEffectCount(chipEffectDataToId.chipEffectId.ToInt32(), 1); } } else if (chipEffectDataToId.effectType.ToInt32() == 56) { SkillStatus skillStatus2 = base.hierarchyData.GetSkillStatus(chipEffectDataToId.effectValue); CharacterStateControl target2 = this.GetTarget(characterStateControl, chipEffectDataToId); if (skillStatus2 != null && target2 != null) { chipPlayType = SubStatePlayChipEffect.ChipPlayType.SKillPlay; returnData.dictionary[keyValuePair.Value].Add(chipEffectDataToId); } else { returnData.characterStateControl.AddChipEffectCount(chipEffectDataToId.chipEffectId.ToInt32(), 1); } } else { if (returnData.chipPlayType == SubStatePlayChipEffect.ChipPlayType.None) { returnData.chipPlayType = SubStatePlayChipEffect.ChipPlayType.ChipPlay; } returnData.dictionary[keyValuePair.Value].Add(chipEffectDataToId); } } } if (returnData.chipPlayType == SubStatePlayChipEffect.ChipPlayType.None && chipPlayType != SubStatePlayChipEffect.ChipPlayType.None) { returnData.chipPlayType = chipPlayType; } list.Add(returnData); characterStateControl.stagingChipIdList.Clear(); } return(list); }
public static SkillResults GetSkillResults(AffectEffectProperty affectEffectProperty, CharacterStateControl attackerCharacter, CharacterStateControl targetCharacter, bool onRandomAttack = true, int attackNum = 0) { SkillResults skillResults = new SkillResults(); LeaderSkillResult leaderSkillResult = attackerCharacter.leaderSkillResult; HaveSufferState currentSufferState = attackerCharacter.currentSufferState; HaveSufferState currentSufferState2 = targetCharacter.currentSufferState; float[] array = new float[2]; skillResults.useAffectEffectProperty = affectEffectProperty; skillResults.hitIconAffectEffect = AffectEffect.Damage; skillResults.attackCharacter = attackerCharacter; skillResults.targetCharacter = targetCharacter; if (targetCharacter.isDied) { return(skillResults); } skillResults.onWeakHit = ((!affectEffectProperty.canUseAttribute) ? Strength.None : targetCharacter.tolerance.GetAttributeStrength(affectEffectProperty.attribute)); if (attackerCharacter.hittingTheTargetType == BattleInvariant.Type.Non) { skillResults.onMissHit = !affectEffectProperty.OnHit(attackerCharacter, targetCharacter); } else if (attackerCharacter.hittingTheTargetType == BattleInvariant.Type.Up) { skillResults.onMissHit = false; } else if (attackerCharacter.hittingTheTargetType == BattleInvariant.Type.Down) { skillResults.onMissHit = true; } if (skillResults.onWeakHit == Strength.None || skillResults.onWeakHit == Strength.Weak) { if (attackerCharacter.criticalTheTargetType == BattleInvariant.Type.Non) { float num = affectEffectProperty.satisfactionRate; SufferStateProperty sufferStateProperty = currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.SatisfactionRateUp); if (sufferStateProperty.isActive) { num += sufferStateProperty.upPercent; } SufferStateProperty sufferStateProperty2 = currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.SatisfactionRateDown); if (sufferStateProperty2.isActive) { num -= sufferStateProperty2.downPercent; } if (attackerCharacter.isSelectSkill > 0) { num += leaderSkillResult.satisfactionRateUpPercent; } num += attackerCharacter.chipAddCritical; skillResults.onCriticalHit = RandomExtension.Switch(num); } else if (attackerCharacter.criticalTheTargetType == BattleInvariant.Type.Up) { skillResults.onCriticalHit = true; } else if (attackerCharacter.criticalTheTargetType == BattleInvariant.Type.Down) { skillResults.onCriticalHit = false; } } if (!skillResults.onMissHit) { if (affectEffectProperty.powerType == PowerType.Percentage && skillResults.onWeakHit == Strength.Invalid) { skillResults.hitIconAffectEffect = AffectEffect.Invalid; skillResults.onMissHit = false; skillResults.onWeakHit = Strength.Invalid; skillResults.onCriticalHit = false; } else if (skillResults.targetCharacter.currentSufferState.FindSufferState(SufferStateProperty.SufferType.TurnBarrier)) { skillResults.hitIconAffectEffect = AffectEffect.TurnBarrier; skillResults.onMissHit = false; skillResults.onWeakHit = Strength.None; skillResults.onCriticalHit = false; } else if (skillResults.targetCharacter.currentSufferState.FindSufferState(SufferStateProperty.SufferType.CountBarrier)) { skillResults.hitIconAffectEffect = AffectEffect.CountBarrier; skillResults.onMissHit = false; skillResults.onWeakHit = Strength.None; skillResults.onCriticalHit = false; } else if (skillResults.targetCharacter.currentSufferState.FindSufferState(SufferStateProperty.SufferType.TurnEvasion)) { skillResults.hitIconAffectEffect = AffectEffect.TurnEvasion; skillResults.onMissHit = false; skillResults.onWeakHit = Strength.None; skillResults.onCriticalHit = false; } else if (skillResults.targetCharacter.currentSufferState.FindSufferState(SufferStateProperty.SufferType.CountEvasion)) { skillResults.hitIconAffectEffect = AffectEffect.CountEvasion; skillResults.onMissHit = false; skillResults.onWeakHit = Strength.None; skillResults.onCriticalHit = false; } else if (affectEffectProperty.type == AffectEffect.ReferenceTargetHpRate) { SufferStateProperty.DamageRateResult reduceDamageRate = SkillStatus.GetReduceDamageRate(affectEffectProperty, attackerCharacter, targetCharacter); skillResults.damageRateResult = reduceDamageRate; float attributeDamegeResult = SkillStatus.GetAttributeDamegeResult(skillResults.onWeakHit); float num2 = 1f; if (skillResults.onCriticalHit) { num2 = 1.2f; } int num3 = (int)(affectEffectProperty.damagePercent * (float)targetCharacter.hp); for (int i = 0; i < array.Length; i++) { array[i] = (float)num3 * attributeDamegeResult * num2 * reduceDamageRate.damageRate; } } else if (affectEffectProperty.type == AffectEffect.RefHpRateNonAttribute) { SufferStateProperty.DamageRateResult reduceDamageRate2 = SkillStatus.GetReduceDamageRate(affectEffectProperty, attackerCharacter, targetCharacter); skillResults.damageRateResult = reduceDamageRate2; float num4 = 1f; if (skillResults.onCriticalHit) { num4 = 1.2f; } int num5 = (int)(affectEffectProperty.damagePercent * (float)targetCharacter.hp); for (int j = 0; j < array.Length; j++) { array[j] = (float)num5 * num4 * reduceDamageRate2.damageRate; } } else if (affectEffectProperty.powerType == PowerType.Percentage) { bool flag = affectEffectProperty.techniqueType == TechniqueType.Physics; float attributeDamegeResult2 = SkillStatus.GetAttributeDamegeResult(skillResults.onWeakHit); float num6 = 1f; if (skillResults.onCriticalHit) { num6 = 1.2f; } float num7 = 1f; if (onRandomAttack) { num7 = UnityEngine.Random.Range(0.85f, 1f); } SufferStateProperty.DamageRateResult reduceDamageRate3 = SkillStatus.GetReduceDamageRate(affectEffectProperty, attackerCharacter, targetCharacter); skillResults.damageRateResult = reduceDamageRate3; float num8 = 1f; if (flag) { SufferStateProperty sufferStateProperty3 = targetCharacter.currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.Counter); if (sufferStateProperty3.isActive) { num8 *= sufferStateProperty3.recieveDamageRate; } } else { SufferStateProperty sufferStateProperty4 = targetCharacter.currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.Reflection); if (sufferStateProperty4.isActive) { num8 *= sufferStateProperty4.recieveDamageRate; } } float num9 = 1f; SufferStateProperty sufferStateProperty5 = currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.PowerCharge); if (sufferStateProperty5.isActive) { if (flag) { num9 *= sufferStateProperty5.physicUpPercent; } else { num9 *= sufferStateProperty5.specialUpPercent; } } float num10 = 1f; float num11 = 0f; float num12 = 0f; SufferStateProperty sufferStateProperty6 = currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.DamageRateUp); if (sufferStateProperty6.isActive) { SufferStateProperty.DamageRateResult caseDamageRate = sufferStateProperty6.GetCaseDamageRate(affectEffectProperty, targetCharacter); num11 += caseDamageRate.damageRate; } SufferStateProperty sufferStateProperty7 = currentSufferState.GetSufferStateProperty(SufferStateProperty.SufferType.DamageRateDown); if (sufferStateProperty7.isActive) { SufferStateProperty.DamageRateResult caseDamageRate2 = sufferStateProperty7.GetCaseDamageRate(affectEffectProperty, targetCharacter); num12 += caseDamageRate2.damageRate; } num10 = Mathf.Max(0f, num10 + num11 - num12); for (int k = 0; k < array.Length; k++) { int num13 = 0; float num14 = 1f; foreach (int num15 in attackerCharacter.potencyChipIdList.Keys) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId = ChipDataMng.GetChipEffectDataToId(num15.ToString()); if (k != 0 || chipEffectDataToId.effectTrigger.ToInt32() != 11) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] chipEffects = new GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] { chipEffectDataToId }; num13 += ChipEffectStatus.GetSkillPowerCorrectionValue(chipEffects, affectEffectProperty, attackerCharacter, attackNum); num14 += ChipEffectStatus.GetSkillDamageCorrectionValue(chipEffects, affectEffectProperty, attackerCharacter); } } float num16 = 1f; foreach (int num17 in targetCharacter.potencyChipIdList.Keys) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect chipEffectDataToId2 = ChipDataMng.GetChipEffectDataToId(num17.ToString()); if (k != 0 || chipEffectDataToId2.effectTrigger.ToInt32() != 11) { GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] chipEffects2 = new GameWebAPI.RespDataMA_ChipEffectM.ChipEffect[] { chipEffectDataToId2 }; num16 += ChipEffectStatus.GetSkillDamageCorrectionValue(chipEffects2, affectEffectProperty, targetCharacter); } } float num18 = 0f; float num19 = 0f; SkillStatus.CalculationBasePower(ref num18, ref num19, flag, k == 0, attackerCharacter, targetCharacter); int num20; if (k == 0) { num20 = affectEffectProperty.GetPower(attackerCharacter); } else { List <ExtraEffectStatus> extraEffectStatus = BattleStateManager.current.battleStateData.extraEffectStatus; List <ExtraEffectStatus> invocationList = ExtraEffectStatus.GetInvocationList(extraEffectStatus, EffectStatusBase.EffectTriggerType.Usually); num20 = ExtraEffectStatus.GetSkillPowerCorrectionValue(invocationList, affectEffectProperty, attackerCharacter); } if (affectEffectProperty.type == AffectEffect.DefenseThroughDamage || affectEffectProperty.type == AffectEffect.SpDefenseThroughDamage) { num19 = (float)affectEffectProperty.DefenseThrough; } if (num18 <= 0f) { array[k] = 0f; } else { num18 = Mathf.Max(num18, 0f); num19 = Mathf.Max(num19, 1f); float num21 = (float)attackerCharacter.level * 0.01f + 1f; float num22 = (float)(num20 + num13) * (1f + leaderSkillResult.damageUpPercent); float num23 = num21 * num22 * num18 * num9 / num19 + 2f; float num24 = num14 * num16 * reduceDamageRate3.damageRate * num8 * num7 * num6 * attributeDamegeResult2 * num10; array[k] = num23 * num24; } } } else if (affectEffectProperty.powerType == PowerType.Fixable) { for (int l = 0; l < array.Length; l++) { array[l] = (float)affectEffectProperty.damagePower; } skillResults.onWeakHit = Strength.None; } } skillResults.originalAttackPower = Mathf.FloorToInt(array[0]); skillResults.attackPower = Mathf.FloorToInt(array[1]); if (skillResults.hitIconAffectEffect == AffectEffect.Damage && skillResults.attackPower <= 0) { skillResults.onMissHit = true; skillResults.onCriticalHit = false; } if (skillResults.onWeakHit != Strength.Drain) { targetCharacter.hp -= skillResults.attackPower; } else { targetCharacter.hp += skillResults.attackPower; } if (skillResults.attackPower < skillResults.originalAttackPower) { skillResults.extraEffectType = ExtraEffectType.Down; } else if (skillResults.attackPower > skillResults.originalAttackPower) { skillResults.extraEffectType = ExtraEffectType.Up; } else { skillResults.extraEffectType = ExtraEffectType.Non; } return(skillResults); }