public override string ToString() { return(String.Format("{0} *DpS: {1}\r\nDpM: {2}\r\nMin: {3}\r\nMax: {4}\r\nAvg Crit: {5}\r\nMax Crit: {6}\r\nCast: {7}\r\nCost: {8}", AvgDamage.ToString("0"), DpS.ToString("0.00"), DpM.ToString("0.00"), MinDamage.ToString("0"), MaxDamage.ToString("0"), AvgCrit.ToString("0"), MaxCrit.ToString("0"), CastTime.ToString("0.00"), ManaCost.ToString("0"))); }
protected override Dictionary <string, object> GetSaveDataContent() { var data = base.GetSaveDataContent(); data.Add(SaveKeyAccuracy, Accuracy); data.Add(SaveKeyMinDamage, new DictionarySaveable(MinDamage.ToDictionary(pair => (object)(int)pair.Key, pair => (object)pair.Value))); data.Add(SaveKeyMaxDamage, new DictionarySaveable(MaxDamage.ToDictionary(pair => (object)(int)pair.Key, pair => (object)pair.Value))); return(data); }
public override List <ListViewItem> ToListViewItems() { var collection = new List <ListViewItem>(); var minDamageItem = new ListViewItem(new[] { "Min Damage", MinDamage.ToString(CultureInfo.InvariantCulture) }); collection.Add(minDamageItem); var maxDamageItem = new ListViewItem(new[] { "Max Damage", MaxDamage.ToString(CultureInfo.InvariantCulture) }); collection.Add(maxDamageItem); collection.AddRange(base.ToListViewItems()); if (Modifier is IWeaponModifier weaponModifier) { collection.AddRange(weaponModifier.ToListViewItems()); } return(collection); }
/// <summary> /// /// </summary> private void SetColors() { if (DamageSpan == 1) { if (MinDamage > 0) { MinDamageColor = _dealDamageColorBase; EqualDamageColor = _dealDamageColorBase; } else if (MaxDamage < 0) { MaxDamageColor = _takeDamageColorBase; EqualDamageColor = _takeDamageColorBase; } } else { if (MinDamage > 0 || Math.Abs(MinDamage) < MaxDamage) { var weight = MinDamage.Remap(-MaxDamage, MaxDamage, 0, 1); MinDamageColor = weight.Lerp(_takeDamageColorBase, _dealDamageColorBase); } else if (MaxDamage < 0 || Math.Abs(MinDamage) > MaxDamage) { var weight = MaxDamage.Remap(MinDamage, -MinDamage, 0, 1); MaxDamageColor = weight.Lerp(_takeDamageColorBase, _dealDamageColorBase); } } TieLineBrush = new SolidColorBrush(Color.FromArgb(50, _tieColorBase.R, _tieColorBase.G, _tieColorBase.B)); EqualDamageBrush = new SolidColorBrush(EqualDamageColor); MinDamageBrush = new SolidColorBrush(MinDamageColor); MaxDamageBrush = new SolidColorBrush(MaxDamageColor); }
public override string ToString() { return(String.Format("{0} *Cost: {1}", MinDamage.ToString("0"), ManaCost.ToString("0"))); }
public override void GetProperties(ObjectPropertyList list) { AddNameProperties(list); list.Add(1011296, Charges.ToString()); // [ Charges: ~1_CHARGES~ ] if (Crafter != null) { list.Add(1050043, Crafter.Name); // crafted by ~1_NAME~ } if (SkillBonuses != null) { SkillBonuses.GetProperties(list); } if (Slayer != SlayerName.None) { SlayerEntry entry = SlayerGroup.GetEntryByName(Slayer); if (entry != null) { list.Add(entry.Title); } } if (Slayer2 != SlayerName.None) { SlayerEntry entry = SlayerGroup.GetEntryByName(Slayer2); if (entry != null) { list.Add(entry.Title); } } base.AddResistanceProperties(list); int prop; if ((prop = WeaponAttributes.BloodDrinker) != 0) { list.Add(1113591, prop.ToString()); // Blood Drinker } if ((prop = WeaponAttributes.BattleLust) != 0) { list.Add(1113710, prop.ToString()); // Battle Lust } if ((prop = WeaponAttributes.UseBestSkill) != 0) { list.Add(1060400); // use best weapon skill } if ((prop = (GetDamageBonus() + Attributes.WeaponDamage)) != 0) { list.Add(1060401, prop.ToString()); // damage increase ~1_val~% } if ((prop = Attributes.DefendChance) != 0) { list.Add(1060408, prop.ToString()); // defense chance increase ~1_val~% } if ((prop = Attributes.EnhancePotions) != 0) { list.Add(1060411, prop.ToString()); // enhance potions ~1_val~% } if ((prop = Attributes.CastRecovery) != 0) { list.Add(1060412, prop.ToString()); // faster cast recovery ~1_val~ } if ((prop = Attributes.CastSpeed) != 0) { list.Add(1060413, prop.ToString()); // faster casting ~1_val~ } if ((prop = (GetHitChanceBonus() + Attributes.AttackChance)) != 0) { list.Add(1060415, prop.ToString()); // hit chance increase ~1_val~% } if ((prop = WeaponAttributes.HitColdArea) != 0) { list.Add(1060416, prop.ToString()); // hit cold area ~1_val~% } if ((prop = WeaponAttributes.HitDispel) != 0) { list.Add(1060417, prop.ToString()); // hit dispel ~1_val~% } if ((prop = WeaponAttributes.HitEnergyArea) != 0) { list.Add(1060418, prop.ToString()); // hit energy area ~1_val~% } if ((prop = WeaponAttributes.HitFireArea) != 0) { list.Add(1060419, prop.ToString()); // hit fire area ~1_val~% } if ((prop = WeaponAttributes.HitFireball) != 0) { list.Add(1060420, prop.ToString()); // hit fireball ~1_val~% } if ((prop = WeaponAttributes.HitHarm) != 0) { list.Add(1060421, prop.ToString()); // hit harm ~1_val~% } if ((prop = WeaponAttributes.HitLeechHits) != 0) { list.Add(1060422, prop.ToString()); // hit life leech ~1_val~% } if ((prop = WeaponAttributes.HitLightning) != 0) { list.Add(1060423, prop.ToString()); // hit lightning ~1_val~% } #region SA if ((prop = WeaponAttributes.HitCurse) != 0) { list.Add(1113712, prop.ToString()); // Hit Curse ~1_val~% } if ((prop = WeaponAttributes.HitFatigue) != 0) { list.Add(1113700, prop.ToString()); // Hit Fatigue ~1_val~% } if ((prop = WeaponAttributes.HitManaDrain) != 0) { list.Add(1113699, prop.ToString()); // Hit Mana Drain ~1_val~% } #endregion if ((prop = WeaponAttributes.HitLowerAttack) != 0) { list.Add(1060424, prop.ToString()); // hit lower attack ~1_val~% } if ((prop = WeaponAttributes.HitLowerDefend) != 0) { list.Add(1060425, prop.ToString()); // hit lower defense ~1_val~% } if ((prop = WeaponAttributes.HitMagicArrow) != 0) { list.Add(1060426, prop.ToString()); // hit magic arrow ~1_val~% } if ((prop = WeaponAttributes.HitLeechMana) != 0) { list.Add(1060427, prop.ToString()); // hit mana leech ~1_val~% } if ((prop = WeaponAttributes.HitPhysicalArea) != 0) { list.Add(1060428, prop.ToString()); // hit physical area ~1_val~% } if ((prop = WeaponAttributes.HitPoisonArea) != 0) { list.Add(1060429, prop.ToString()); // hit poison area ~1_val~% } if ((prop = WeaponAttributes.HitLeechStam) != 0) { list.Add(1060430, prop.ToString()); // hit stamina leech ~1_val~% } if ((prop = Attributes.BonusDex) != 0) { list.Add(1060409, prop.ToString()); // dexterity bonus ~1_val~ } if ((prop = Attributes.BonusHits) != 0) { list.Add(1060431, prop.ToString()); // hit point increase ~1_val~ } if ((prop = Attributes.BonusInt) != 0) { list.Add(1060432, prop.ToString()); // intelligence bonus ~1_val~ } if ((prop = Attributes.LowerManaCost) != 0) { list.Add(1060433, prop.ToString()); // lower mana cost ~1_val~% } if ((prop = Attributes.LowerRegCost) != 0) { list.Add(1060434, prop.ToString()); // lower reagent cost ~1_val~% } if ((prop = GetLowerStatReq()) != 0) { list.Add(1060435, prop.ToString()); // lower requirements ~1_val~% } if ((prop = (GetLuckBonus() + Attributes.Luck)) != 0) { list.Add(1060436, prop.ToString()); // luck ~1_val~ } if ((prop = WeaponAttributes.MageWeapon) != 0) { list.Add(1060438, (30 - prop).ToString()); // mage weapon -~1_val~ skill } if ((prop = Attributes.BonusMana) != 0) { list.Add(1060439, prop.ToString()); // mana increase ~1_val~ } if ((prop = Attributes.RegenMana) != 0) { list.Add(1060440, prop.ToString()); // mana regeneration ~1_val~ } if ((prop = Attributes.NightSight) != 0) { list.Add(1060441); // night sight } if ((prop = Attributes.ReflectPhysical) != 0) { list.Add(1060442, prop.ToString()); // reflect physical damage ~1_val~% } if ((prop = Attributes.RegenStam) != 0) { list.Add(1060443, prop.ToString()); // stamina regeneration ~1_val~ } if ((prop = Attributes.RegenHits) != 0) { list.Add(1060444, prop.ToString()); // hit point regeneration ~1_val~ } if ((prop = WeaponAttributes.SelfRepair) != 0) { list.Add(1060450, prop.ToString()); // self repair ~1_val~ } if ((prop = Attributes.SpellChanneling) != 0) { list.Add(1060482); // spell channeling } if ((prop = Attributes.SpellDamage) != 0) { list.Add(1060483, prop.ToString()); // spell damage increase ~1_val~% } if ((prop = Attributes.BonusStam) != 0) { list.Add(1060484, prop.ToString()); // stamina increase ~1_val~ } if ((prop = Attributes.BonusStr) != 0) { list.Add(1060485, prop.ToString()); // strength bonus ~1_val~ } if ((prop = Attributes.WeaponSpeed) != 0) { list.Add(1060486, prop.ToString()); // swing speed increase ~1_val~% } #region SA if ((prop = AbsorptionAttributes.CastingFocus) != 0) { list.Add(1113696, prop.ToString()); // Casting Focus ~1_val~% } if ((prop = AbsorptionAttributes.EaterFire) != 0) { list.Add(1113593, prop.ToString()); // Fire Eater ~1_Val~% } if ((prop = AbsorptionAttributes.EaterCold) != 0) { list.Add(1113594, prop.ToString()); // Cold Eater ~1_Val~% } if ((prop = AbsorptionAttributes.EaterPoison) != 0) { list.Add(1113595, prop.ToString()); // Poison Eater ~1_Val~% } if ((prop = AbsorptionAttributes.EaterEnergy) != 0) { list.Add(1113596, prop.ToString()); // Energy Eater ~1_Val~% } if ((prop = AbsorptionAttributes.EaterKinetic) != 0) { list.Add(1113597, prop.ToString()); // Kinetic Eater ~1_Val~% } if ((prop = AbsorptionAttributes.EaterDamage) != 0) { list.Add(1113598, prop.ToString()); // Damage Eater ~1_Val~% } if ((prop = AbsorptionAttributes.ResonanceFire) != 0) { list.Add(1113691, prop.ToString()); // Fire Resonance ~1_val~% } if ((prop = AbsorptionAttributes.ResonanceCold) != 0) { list.Add(1113692, prop.ToString()); // Cold Resonance ~1_val~% } if ((prop = AbsorptionAttributes.ResonancePoison) != 0) { list.Add(1113693, prop.ToString()); // Poison Resonance ~1_val~% } if ((prop = AbsorptionAttributes.ResonanceEnergy) != 0) { list.Add(1113694, prop.ToString()); // Energy Resonance ~1_val~% } if ((prop = AbsorptionAttributes.ResonanceKinetic) != 0) { list.Add(1113695, prop.ToString()); // Kinetic Resonance ~1_val~% } #endregion int phys, fire, cold, pois, nrgy, chaos, direct; GetDamageTypes(null, out phys, out fire, out cold, out pois, out nrgy, out chaos, out direct); #region Mondain's Legacy if (chaos != 0) { list.Add(1072846, chaos.ToString()); // chaos damage ~1_val~% } if (direct != 0) { list.Add(1079978, direct.ToString()); // Direct Damage: ~1_PERCENT~% } #endregion if (phys != 0) { list.Add(1060403, phys.ToString()); // physical damage ~1_val~% } if (fire != 0) { list.Add(1060405, fire.ToString()); // fire damage ~1_val~% } if (cold != 0) { list.Add(1060404, cold.ToString()); // cold damage ~1_val~% } if (pois != 0) { list.Add(1060406, pois.ToString()); // poison damage ~1_val~% } if (nrgy != 0) { list.Add(1060407, nrgy.ToString()); // energy damage ~1_val~% } if (Core.ML && chaos != 0) { list.Add(1072846, chaos.ToString()); // chaos damage ~1_val~% } if (Core.ML && direct != 0) { list.Add(1079978, direct.ToString()); // Direct Damage: ~1_PERCENT~% } list.Add(1061168, "{0}\t{1}", MinDamage.ToString(), MaxDamage.ToString()); // weapon damage ~1_val~ - ~2_val~ if (Core.ML) { list.Add(1061167, String.Format("{0}s", Speed)); // weapon speed ~1_val~ } else { list.Add(1061167, Speed.ToString()); } if (MaxRange > 1) { list.Add(1061169, MaxRange.ToString()); // range ~1_val~ } int strReq = AOS.Scale(StrRequirement, 100 - GetLowerStatReq()); if (strReq > 0) { list.Add(1061170, strReq.ToString()); // strength requirement ~1_val~ } if (Layer == Layer.TwoHanded) { list.Add(1061171); // two-handed weapon } else { list.Add(1061824); // one-handed weapon } if (Core.SE || WeaponAttributes.UseBestSkill == 0) { switch (Skill) { case SkillName.Swords: list.Add(1061172); break; // skill required: swordsmanship case SkillName.Macing: list.Add(1061173); break; // skill required: mace fighting case SkillName.Fencing: list.Add(1061174); break; // skill required: fencing case SkillName.Archery: list.Add(1061175); break; // skill required: archery } } if (HitPoints >= 0 && MaxHitPoints > 0) { list.Add(1060639, "{0}\t{1}", HitPoints, MaxHitPoints); // durability ~1_val~ / ~2_val~ } }
public void BuildWeaponTier(WeaponProfile weapon, Tier tier, MinDamage minDamageTierA, MaxDamage maxDamageTierA, int wieldDifficultyA, eRandomFormula distributionA, MinDamage minDamageTierB = MinDamage.Invalid, MaxDamage maxDamageTierB = MaxDamage.Invalid, int wieldDifficultyB = -1, eRandomFormula distributionB = eRandomFormula.favorMid, MinDamage minDamageTierC = MinDamage.Invalid, MaxDamage maxDamageTierC = MaxDamage.Invalid, int wieldDifficultyC = -1, eRandomFormula distributionC = eRandomFormula.favorMid) { int totalNumberOfEntries = 0; int numOfRollsDivider = 1; int minDamageA = minDamageTierA == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierA - 1] + 1; int maxDamageA = maxDamageTierA == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierA - 1]; int minDamageB = 0; int maxDamageB = 0; int minDamageC = 0; int maxDamageC = 0; int numberOfEntriesA = DetermineNumberOfEntries(minDamageA, maxDamageA); int numberOfEntriesB = 0; if (minDamageTierB != MinDamage.Invalid && maxDamageTierB != MaxDamage.Invalid) { minDamageB = minDamageTierB == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierB - 1] + 1; maxDamageB = maxDamageTierB == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierB - 1]; numberOfEntriesB = DetermineNumberOfEntries(minDamageB, maxDamageB); numOfRollsDivider++; } int numberOfEntriesC = 0; if (minDamageTierC != MinDamage.Invalid && maxDamageTierC != MaxDamage.Invalid) { minDamageC = minDamageTierC == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierC - 1] + 1; maxDamageC = maxDamageTierC == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierC - 1]; numberOfEntriesC = DetermineNumberOfEntries(minDamageC, maxDamageC); numOfRollsDivider++; } totalNumberOfEntries = numberOfEntriesA + numberOfEntriesB + numberOfEntriesC; weapon.Tiers[(int)tier].Bonus = new ChanceEntry[totalNumberOfEntries]; weapon.Tiers[(int)tier].wieldDifficulty = new int[totalNumberOfEntries]; int numOfRolls = 100000; DistributeDamageBonusEntries((int)tier, weapon, 0, numberOfEntriesA, numOfRolls / numOfRollsDivider, distributionA); if (numberOfEntriesB > 0) { DistributeDamageBonusEntries((int)tier, weapon, numberOfEntriesA, numberOfEntriesB, numOfRolls / numOfRollsDivider, distributionB); } if (numberOfEntriesC > 0) { DistributeDamageBonusEntries((int)tier, weapon, numberOfEntriesA + numberOfEntriesB, numberOfEntriesC, numOfRolls / numOfRollsDivider, distributionC); } DamageBonusDistributionRounding((int)tier, weapon, totalNumberOfEntries); ProcessDamageBonusEntries(weapon, (int)tier, minDamageA, maxDamageA, wieldDifficultyA, 0, numberOfEntriesA, numOfRolls); if (numberOfEntriesB > 0) { ProcessDamageBonusEntries(weapon, (int)tier, minDamageB, maxDamageB, wieldDifficultyB, numberOfEntriesA, numberOfEntriesB, numOfRolls); } if (numberOfEntriesC > 0) { ProcessDamageBonusEntries(weapon, (int)tier, minDamageC, maxDamageC, wieldDifficultyC, numberOfEntriesA + numberOfEntriesB, numberOfEntriesC, numOfRolls); } float totalChance = 0; int entryCounter = 0; for (int i = 0; i < totalNumberOfEntries; i++) { entryCounter++; totalChance += weapon.Tiers[(int)tier].Bonus[i].Chance; if (DebugLevel > 1) { Console.WriteLine($"Entry {entryCounter} Chance: {weapon.Tiers[(int)tier].Bonus[i].Chance}% - Damage += {weapon.Tiers[(int)tier].Bonus[i].Value} WieldDifficulty = {weapon.Tiers[(int)tier].wieldDifficulty[i]}"); } } if (DebugLevel > 1) { Console.WriteLine($"Total Chance: {totalChance}%"); } //if (totalChance != 100.0f) //{ // if (DebugLevel > 0) // Console.WriteLine($"Retrying due to total chance: {totalChance}%"); // BuildTier(weapon, tier, minDamageTierA, maxDamageTierA, wieldDifficultyA, distributionA, minDamageTierB, maxDamageTierB, wieldDifficultyB, distributionB, minDamageTierC, maxDamageTierC, wieldDifficultyC, distributionC); // return; //} //if (totalChance < 100.0f) //{ // float difference = 100.0f - totalChance; // weapon.Tiers[(int)tier].damageBonus[0].Chance += difference; // if (DebugLevel > 0) // Console.WriteLine($"Added {difference.ToString("0.000000")}% to Entry 1 to make the total chance 100%."); // totalChance = 0; // for (int i = 0; i < totalNumberOfEntries; i++) // { // totalChance += weapon.Tiers[(int)tier].damageBonus[i].Chance; // } // if (DebugLevel > 1) // Console.WriteLine($"New Total Chance: {totalChance}%"); //} }