private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) { rtb.SetBold(); rtb.AppendFormatLine($"Effect { effect.EffectIndex }: Id { effect.Effect } ({ (SpellEffects)effect.Effect })"); rtb.SetBold(); rtb.AppendFormatLine($"Difficulty: Id { effect.DifficultyID } ({ (Difficulty)effect.DifficultyID })"); rtb.SetDefaultStyle(); var value = 0.0f; if (effect.SpellEffectScalingEntry != null && Math.Abs(effect.SpellEffectScalingEntry.Coefficient) > 1.0E-5f && Scaling != null && Scaling.ScalingClass != 0) { var level = (int)(DBC.DBC.SelectedLevel - 1); if ((AttributesEx11 & (uint)SpellAtributeEx11.SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) == 0) { if ((AttributesEx10 & (uint)SpellAtributeEx10.SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING) != 0) { level = BaseLevel; } } else { level = (int)DBC.DBC.SelectedItemLevel; } if (Scaling.MaxScalingLevel != 0 && Scaling.MaxScalingLevel < level) { level = (int)Scaling.MaxScalingLevel; } if (level < 1) { level = 1; } if (Scaling.ScalingClass != 0) { if (Scaling.ScalesFromItemLevel == 0) { if ((AttributesEx11 & (uint)SpellAtributeEx11.SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) == 0) { var gtScaling = GameTable <GtSpellScalingEntry> .GetRecord(level); Debug.Assert(gtScaling != null); value = gtScaling.GetColumnForClass(Scaling.ScalingClass); } else if (DBC.DBC.RandPropPoints.ContainsKey(level)) { var randPropPoints = DBC.DBC.RandPropPoints[level]; value = randPropPoints.Superior[0]; } } else { if (DBC.DBC.RandPropPoints.ContainsKey(Scaling.ScalesFromItemLevel)) { var randPropPoints = DBC.DBC.RandPropPoints[Scaling.ScalesFromItemLevel]; value = randPropPoints.Superior[0]; } } // if (level < Scaling.CastTimeMaxLevel && Scaling.CastTimeMax != 0) // value *= (float)(Scaling.CastTimeMin + (level - 1) * (Scaling.CastTimeMax - Scaling.CastTimeMin) / (Scaling.CastTimeMaxLevel - 1)) / (Scaling.CastTimeMax); // if (level < Scaling.NerfMaxLevel) // value *= ((((1.0f - Scaling.NerfFactor) * (level - 1)) / (Scaling.NerfMaxLevel - 1)) + Scaling.NerfFactor); } value *= effect.SpellEffectScalingEntry.Coefficient; if (Math.Abs(value) > 1.0E-5f && value < 1.0f) { value = 1.0f; } if (Math.Abs(effect.SpellEffectScalingEntry.Variance) > 1.0E-5f) { var delta = Math.Abs(value * effect.SpellEffectScalingEntry.Variance * 0.5f); rtb.AppendFormat("BasePoints = {0:F} to {1:F}", value - delta, value + delta); } else { rtb.AppendFormat("BasePoints = {0:F}", value); } if (Math.Abs(effect.SpellEffectScalingEntry.ResourceCoefficient) > 1.0E-5f) { rtb.AppendFormatIfNotNull(" + combo * {0:F}", effect.SpellEffectScalingEntry.ResourceCoefficient * value); } } else { rtb.AppendFormat("BasePoints = {0}", effect.EffectBasePoints + (effect.EffectDieSides == 0 ? 0 : 1)); if (Math.Abs(effect.EffectRealPointsPerLevel) > 1.0E-5f) { rtb.AppendFormat(" + Level * {0:F}", effect.EffectRealPointsPerLevel); } if (effect.EffectDieSides > 1) { if (Math.Abs(effect.EffectRealPointsPerLevel) > 1.0E-5f) { rtb.AppendFormat(" to {0} + lvl * {1:F}", effect.EffectBasePoints + effect.EffectDieSides, effect.EffectRealPointsPerLevel); } else { rtb.AppendFormat(" to {0}", effect.EffectBasePoints + effect.EffectDieSides); } } rtb.AppendFormatIfNotNull(" + resource * {0:F}", effect.EffectPointsPerResource); } if (effect.EffectBonusCoefficient > 1.0E-5f) { rtb.AppendFormat(" + spellPower * {0}", effect.EffectBonusCoefficient); } if (effect.BonusCoefficientFromAP > 1.0E-5) { rtb.AppendFormat(" + AP * {0}", effect.BonusCoefficientFromAP); } // if (Math.Abs(effect.DamageMultiplier - 1.0f) > 1.0E-5f) // rtb.AppendFormat(" x {0:F}", effect.DamageMultiplier); // rtb.AppendFormatIfNotNull(" Multiple = {0:F}", effect.ValueMultiplier); rtb.AppendLine(); rtb.AppendFormatLine("Targets ({0}, {1}) ({2}, {3})", effect.ImplicitTarget[0], effect.ImplicitTarget[1], (Targets)effect.ImplicitTarget[0], (Targets)effect.ImplicitTarget[1]); AuraModTypeName(rtb, effect); var classMask = effect.EffectSpellClassMask; if (classMask[0] != 0 || classMask[1] != 0 || classMask[2] != 0 || classMask[3] != 0) { rtb.AppendFormatLine("SpellClassMask = {0:X8} {1:X8} {2:X8} {3:X8}", classMask[0], classMask[1], classMask[2], classMask[3]); var query = from spell in DBC.DBC.SpellInfoStore.Values where spell.SpellFamilyName == SpellFamilyName && spell.SpellFamilyFlags.ContainsElement(classMask) join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.SpellID into temp from skill in temp.DefaultIfEmpty(new SkillLineAbilityEntry()) select new { SpellID = spell.Spell.ID, SpellName = spell.Spell.Name, SkillId = skill.SkillLine }; foreach (var row in query) { if (row.SkillId > 0) { rtb.SelectionColor = Color.Blue; rtb.AppendFormatLine("\t+ {0} - {1}", row.SpellID, row.SpellName); } else { rtb.SelectionColor = Color.Red; rtb.AppendFormatLine("\t- {0} - {1}", row.SpellID, row.SpellName); } rtb.SelectionColor = Color.Black; } } rtb.AppendFormatLineIfNotNull("{0}", effect.Radius); rtb.AppendFormatLineIfNotNull("{0}", effect.MaxRadius); // append trigger spell var trigger = effect.EffectTriggerSpell; if (trigger != 0) { if (DBC.DBC.SpellInfoStore.ContainsKey((int)trigger)) { var triggerSpell = DBC.DBC.SpellInfoStore[(int)trigger]; rtb.SetStyle(Color.Blue, FontStyle.Bold); rtb.AppendFormatLine(" Trigger spell ({0}) {1}. Chance = {2}", trigger, triggerSpell.Spell.Name, ProcChance); rtb.AppendFormatLineIfNotNull(" Description: {0}", triggerSpell.Spell.Description); rtb.AppendFormatLineIfNotNull(" ToolTip: {0}", triggerSpell.Spell.AuraDescription); rtb.SetDefaultStyle(); if (triggerSpell.ProcFlags != 0) { rtb.AppendFormatLine("Charges - {0}", triggerSpell.ProcCharges); rtb.AppendLine(Separator); rtb.AppendLine(triggerSpell.ProcInfo); rtb.AppendLine(Separator); } } else { rtb.AppendFormatLine("Trigger spell ({0}) Not found, Chance = {1}", trigger, ProcChance); } } rtb.AppendFormatLineIfNotNull("EffectChainTargets = {0}", effect.EffectChainTargets); rtb.AppendFormatLineIfNotNull("EffectItemType = {0}", effect.EffectItemType); if ((Mechanics)effect.EffectMechanic != Mechanics.MECHANIC_NONE) { rtb.AppendFormatLine("Effect Mechanic = {0} ({1})", effect.EffectMechanic, (Mechanics)effect.EffectMechanic); } rtb.AppendFormatLineIfNotNull("Attributes {0:X8} ({0})", effect.EffectAttributes); rtb.AppendLine(); }