Пример #1
0
        /// <summary>
        /// Returns value for weapon using its properties and filter settings
        /// </summary>
        /// <param name="sourceItem">Weapon item</param>
        /// <param name="slot">Weapon equipment slot</param>
        /// <returns>calculated value for weapon</returns>
        public float CalculateWeaponValue(EquipmentElement sourceItem, FilterWeaponSettings filterWeapon)
        {
            WeaponComponentData  primaryWeaponItem = sourceItem.Item.PrimaryWeapon;
            FilterWeaponSettings weights           = filterWeapon;

            // Fetch direct values from the weapon item
            int   accuracy     = primaryWeaponItem.Accuracy;
            int   bodyArmor    = primaryWeaponItem.BodyArmor;
            int   handling     = primaryWeaponItem.Handling;
            int   maxDataValue = primaryWeaponItem.MaxDataValue;
            int   missileSpeed = primaryWeaponItem.MissileSpeed;
            int   swingDamage  = primaryWeaponItem.SwingDamage;
            int   swingSpeed   = primaryWeaponItem.SwingSpeed;
            int   thrustDamage = primaryWeaponItem.ThrustDamage;
            int   thrustSpeed  = primaryWeaponItem.ThrustSpeed;
            int   weaponLength = primaryWeaponItem.WeaponLength;
            float weaponWeight = sourceItem.Weight;

            // Modification calculation
            ItemModifier mod = sourceItem.ItemModifier;

            if (mod != null)
            {
                if (bodyArmor > 0f)
                {
                    bodyArmor = mod.ModifyArmor(bodyArmor);
                }
                if (missileSpeed > 0f)
                {
                    missileSpeed = mod.ModifyMissileSpeed(missileSpeed);
                }
                if (swingDamage > 0f)
                {
                    swingDamage = mod.ModifyDamage(swingDamage);
                }
                if (swingSpeed > 0f)
                {
                    swingSpeed = mod.ModifySpeed(swingSpeed);
                }
                if (thrustDamage > 0f)
                {
                    thrustDamage = mod.ModifyDamage(thrustDamage);
                }
                if (thrustDamage > 0f)
                {
                    thrustSpeed = mod.ModifySpeed(thrustSpeed);
                }
                if (maxDataValue > 0f)
                {
                    maxDataValue = mod.ModifyHitPoints((short)maxDataValue);
                }
                //WeaponWeight *= mod.WeightMultiplier;

                bodyArmor    = bodyArmor < 0 ? 0 : bodyArmor;
                missileSpeed = missileSpeed < 0 ? 0 : missileSpeed;
                swingDamage  = swingDamage < 0 ? 0 : swingDamage;
                swingSpeed   = swingSpeed < 0 ? 0 : swingSpeed;
                thrustDamage = thrustDamage < 0 ? 0 : thrustDamage;
                thrustSpeed  = thrustSpeed < 0 ? 0 : thrustSpeed;
                maxDataValue = maxDataValue < 0 ? 0 : maxDataValue;
            }

            // Weighted value
            float weightAccuracy     = accuracy * weights.Accuracy;
            float weightBodyArmor    = bodyArmor * weights.WeaponBodyArmor;
            float weightHandling     = handling * weights.Handling;
            float weightMaxDataValue = maxDataValue * weights.MaxDataValue;
            float weightMissileSpeed = missileSpeed * weights.MissileSpeed;
            float weightSwingDamage  = swingDamage * weights.SwingDamage;
            float weightSwingSpeed   = swingSpeed * weights.SwingSpeed;
            float weightThrustDamage = thrustDamage * weights.ThrustDamage; // It is also missile damage for bows and crossbows
            float weightThrustSpeed  = thrustSpeed * weights.ThrustSpeed;
            float weightWeaponLength = weaponLength * weights.WeaponLength;
            float weightWeaponWeight = weaponWeight * weights.WeaponWeight;

            float sum   = 0.0f;
            float value = 0.0f;

            switch (primaryWeaponItem.WeaponClass)
            {
            case WeaponClass.SmallShield:
            case WeaponClass.LargeShield:
                // Weight, HitPoints
                sum   = Math.Abs(filterWeapon.MaxDataValue) + Math.Abs(filterWeapon.WeaponWeight);
                value = weightMaxDataValue + weightWeaponWeight;

#if DEBUG
                InformationManager.DisplayMessage(new InformationMessage("Shield"));
#endif
                break;

            case WeaponClass.Crossbow:
            case WeaponClass.Bow:
                // Weight, Thrust Damage, Accuracy, Missile Speed
                sum = Math.Abs(filterWeapon.WeaponWeight) +
                      Math.Abs(filterWeapon.ThrustDamage) +
                      Math.Abs(filterWeapon.Accuracy) +
                      Math.Abs(filterWeapon.MissileSpeed);
                value = weightWeaponWeight + weightThrustDamage + weightAccuracy + weightMissileSpeed;

#if DEBUG
                InformationManager.DisplayMessage(new InformationMessage("Shield"));
#endif
                break;

            case WeaponClass.Javelin:
            case WeaponClass.ThrowingAxe:
            case WeaponClass.ThrowingKnife:
                // Weight, Length, Thrust Damage, Missile Speed, Accuracy, MaxDataValue (Stack Amount)
                sum = Math.Abs(filterWeapon.WeaponWeight) +
                      Math.Abs(filterWeapon.WeaponLength) +
                      Math.Abs(filterWeapon.ThrustDamage) +
                      Math.Abs(filterWeapon.MissileSpeed) +
                      Math.Abs(filterWeapon.Accuracy) +
                      Math.Abs(filterWeapon.MaxDataValue);
                value = weightWeaponWeight +
                        weightWeaponLength +
                        weightThrustDamage +
                        weightMissileSpeed +
                        weightAccuracy +
                        weightMaxDataValue;

#if DEBUG
                InformationManager.DisplayMessage(new InformationMessage("Javelin/Throwing Axe/Throwing Knife"));
#endif
                break;

            case WeaponClass.OneHandedSword:
            case WeaponClass.TwoHandedSword:
            case WeaponClass.LowGripPolearm:
            case WeaponClass.OneHandedPolearm:
            case WeaponClass.TwoHandedPolearm:
                // Weight, Length, Handling, Swing Speed, Swing Damage, Thrust Speed, Thrust Damage
                sum = Math.Abs(filterWeapon.WeaponWeight) +
                      Math.Abs(filterWeapon.WeaponLength) +
                      Math.Abs(filterWeapon.Handling) +
                      Math.Abs(filterWeapon.SwingSpeed) +
                      Math.Abs(filterWeapon.SwingDamage) +
                      Math.Abs(filterWeapon.ThrustSpeed) +
                      Math.Abs(filterWeapon.ThrustDamage);
                value = weightWeaponWeight +
                        weightWeaponLength +
                        weightHandling +
                        weightSwingSpeed +
                        weightSwingDamage +
                        weightThrustSpeed +
                        weightThrustDamage;

#if DEBUG
                if (primaryWeaponItem.WeaponClass >= WeaponClass.OneHandedPolearm &&
                    primaryWeaponItem.WeaponClass <= WeaponClass.LowGripPolearm)
                {
                    InformationManager.DisplayMessage(new InformationMessage("Low Grip/One Handed/Two Handed Polearm"));
                }
                else
                {
                    InformationManager.DisplayMessage(new InformationMessage("One Handed/Two Handed Sword"));
                }
#endif
                break;

            case WeaponClass.OneHandedAxe:
            case WeaponClass.TwoHandedAxe:
            case WeaponClass.Mace:
            case WeaponClass.TwoHandedMace:
                // Weight, Swing Speed, Swing Damage, Length, Handling
                sum = Math.Abs(filterWeapon.WeaponWeight) +
                      Math.Abs(filterWeapon.SwingSpeed) +
                      Math.Abs(filterWeapon.SwingDamage) +
                      Math.Abs(filterWeapon.WeaponLength) +
                      Math.Abs(filterWeapon.Handling);
                value = weightWeaponWeight +
                        weightSwingSpeed +
                        weightSwingDamage +
                        weightWeaponLength +
                        weightHandling;
#if DEBUG
                if (primaryWeaponItem.WeaponClass >= WeaponClass.OneHandedAxe &&
                    primaryWeaponItem.WeaponClass <= WeaponClass.TwoHandedAxe)
                {
                    InformationManager.DisplayMessage(new InformationMessage("One Handed/Two Handed Axe"));
                }
                else
                {
                    InformationManager.DisplayMessage(new InformationMessage("One Handed/Two Handed Mace"));
                }
#endif
                break;

            case WeaponClass.Arrow:
            case WeaponClass.Bolt:
                // Weight, Accuracy, Missile (Thrust) Damage, Stack Amount (MaxDataPoints)
                sum = Math.Abs(filterWeapon.WeaponWeight) +
                      Math.Abs(filterWeapon.Accuracy) +
                      Math.Abs(filterWeapon.ThrustDamage) +
                      Math.Abs(filterWeapon.MaxDataValue);
                value = weightWeaponWeight +
                        weightAccuracy +
                        weightThrustDamage +
                        weightMaxDataValue;
#if DEBUG
                InformationManager.DisplayMessage(new InformationMessage("Arrows/Bolts"));
#endif
                break;

            default:
                sum =
                    Math.Abs(filterWeapon.Accuracy) +
                    Math.Abs(filterWeapon.WeaponBodyArmor) +
                    Math.Abs(filterWeapon.Handling) +
                    Math.Abs(filterWeapon.MaxDataValue) +
                    Math.Abs(filterWeapon.MissileSpeed) +
                    Math.Abs(filterWeapon.SwingDamage) +
                    Math.Abs(filterWeapon.SwingSpeed) +
                    Math.Abs(filterWeapon.ThrustDamage) +
                    Math.Abs(filterWeapon.ThrustSpeed) +
                    Math.Abs(filterWeapon.WeaponLength) +
                    Math.Abs(filterWeapon.WeaponWeight);
                value = weightAccuracy +
                        weightBodyArmor +
                        weightHandling +
                        weightMaxDataValue +
                        weightMissileSpeed +
                        weightSwingDamage +
                        weightSwingSpeed +
                        weightThrustDamage +
                        weightThrustSpeed +
                        weightWeaponLength +
                        weightWeaponWeight;
#if DEBUG
                InformationManager.DisplayMessage(new InformationMessage("Other"));
#endif
                break;
            }

            float finalValue = value / sum;

#if DEBUG
            InformationManager.DisplayMessage(new InformationMessage(String.Format("{0}: Acc {1}, BA {2}, HL {3}, HP {4}, MS {5}, SD {6}, SS {7}, TD {8}, TS {9}, WL {10}, W {11}",
                                                                                   sourceItem.Item.Name, accuracy, bodyArmor, handling, maxDataValue, missileSpeed, swingDamage, swingSpeed, thrustDamage, thrustSpeed, weaponLength, weaponWeight)));

            InformationManager.DisplayMessage(new InformationMessage("Total score: " + finalValue));
#endif

            return(finalValue);
        }
 public static short GetModifiedMaximumHitPoints(
     this WeaponComponentData componentData,
     ItemModifier itemModifier)
 {
     return(itemModifier != null && componentData.MaxDataValue > (short)0 ? itemModifier.ModifyHitPoints(componentData.MaxDataValue) : componentData.MaxDataValue);
 }