Beispiel #1
0
        public static string[] GetDisplayStrings(Unit unit, bool inherent = false)
        {
            if (Manager == null) throw new Exception("FileManager Null");

            var strings = new List<string>();
            var itemDisplay = Manager.GetDataTable("ITEMDISPLAY");
            Evaluator = new Evaluator {Unit = unit, Context = new Context(), Manager = Manager};

            DataRow last = null;

            foreach (DataRow row in itemDisplay.Rows)
            {
                if (inherent)
                {
                    if (((int)row["toolTipArea"]) != 20)
                        continue;
                }
                else
                {
                    if (((int)row["toolTipArea"]) != 0 && !row["exampleDescription"].ToString().Contains("thorns"))
                        continue;
                }

                var rule1 = (Display.Rule)row["rule1"];
                var rule2 = (Display.Rule)row["rule2"];
                var rule3 = (Display.Rule)row["rule3"];

                if (rule1 == Display.Rule.Ditto) row["displayCondition1"] = last["displayCondition1"];
                if (rule2 == Display.Rule.Ditto) row["displayCondition2"] = last["displayCondition2"];
                if (rule3 == Display.Rule.Ditto) row["displayCondition3"] = last["displayCondition3"];

                var condition1 = (string) row["displayCondition1"];
                var condition2 = (string) row["displayCondition2"];
                var condition3 = (string) row["displayCondition3"];

                last = row;

                if (IsConditionMet(condition1) == false) continue;
                if (IsConditionMet(condition2) == false) continue;
                if (IsConditionMet(condition3) == false) continue;

                var result = GetDisplayString(row);
                if (String.IsNullOrEmpty(result)) continue;

                if (result.Contains("Thorns"))
                    result = FormatThorns(result);

                strings.Add(result);
            }

            string skill = GetSkillBonus(unit);
            if (!String.IsNullOrWhiteSpace(skill))
                strings.Add(skill);

            return strings.ToArray();
        }
Beispiel #2
0
        private string AddOtherProperties(Unit unit)
        {
            string props = string.Empty;
            int num = 0;

            //procs
            //spawning
            num = (int)unit.GetStat("proc_chance_on_got_killed", "Spawning");
            if (num > 0)
                props += "Spawns additional monsters of its type when killed<br />";
            //cascading
            num = (int)unit.GetStat("proc_chance_on_got_killed", "Cascade");
            if (num > 0)
                props += num + "% chance to spawn two smaller clones when killed<br />";
            //teleporting
            num = (int)unit.GetStat("proc_chance_on_got_hit", "Teleport");
            if (num > 0)
                props += num + "% chance to teleport when hit<br />";
            //bug hive
            num = (int)unit.GetStat("proc_chance_on_got_hit", "BugHive");
            if (num > 0)
                props += num + "% chance to release a Bug Hive when hit<br />";

            //skills
            //regenerating (specific hp replenish doesn't seem to do anything)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Healing");
            if (num > 0)
                props += "Can fully heal when below 25% health, with a cooldown of 30 seconds<br />";

            //fire "field" (nova) (not sure what eventparam is for)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Field_Fire");
            if (num > 0)
                props += "Constant Fire Nova that does (" + ((10 + 5 * num) / 100.0) + " * mlevel_damage) in a 5m radius<br />";
            //fire effect on death
            num = (int)unit.GetStat("skill_level", "Monster_Affix_FireDeath");
            if (num > 0)
                props += "When killed, causes a fire field that does (" + ((5 + 5 * num) / 100.0) + " * mlevel_damage) damage in a 10m radius for 5 seconds<br />";

            //physical "field" (nova) (not sure what eventparam is for)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Field_Physical");
            if (num > 0)
                props += "Constant Physical Nova that does (" + ((10 + 5 * num) / 100.0) + " * mlevel_damage) in a 5m radius<br />";
            //physical effect on death
            num = (int)unit.GetStat("skill_level", "Monster_Affix_PhysicalDeath");
            if (num > 0)
                props += "When killed, causes a physical field that does (" + ((5 + 5 * num) / 100.0) + " * mlevel_damage) damage in a 10m radius for 5 seconds<br />";

            //electric "field" (nova) (not sure what eventparam is for)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Field_Electric");
            if (num > 0)
                props += "Constant Electric Nova that does (" + ((10 + 5 * num) / 100.0) + " * mlevel_damage) in a 5m radius<br />";
            //electric effect on death
            num = (int)unit.GetStat("skill_level", "Monster_Affix_ElectricDeath");
            if (num > 0)
                props += "When killed, causes an electric field that does (" + ((5 + 5 * num) / 100.0) + " * mlevel_damage) damage in a 10m radius for 5 seconds<br />";

            //spectral "field" (nova) (not sure what eventparam is for)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Field_Spectral");
            if (num > 0)
                props += "Constant Spectral Nova that does (" + ((10 + 5 * num) / 100.0) + " * mlevel_damage) in a 5m radius<br />";
            //spectral effect on death
            num = (int)unit.GetStat("skill_level", "Monster_Affix_SpectralDeath");
            if (num > 0)
                props += "When killed, causes a spectral field that does (" + ((5 + 5 * num) / 100.0) + " * mlevel_damage) damage in a 10m radius for 5 seconds<br />";

            //toxic "field" (nova) (not sure what eventparam is for)
            num = (int)unit.GetStat("skill_level", "Monster_Affix_Field_Toxic");
            if (num > 0)
                props += "Constant Toxic Nova that does (" + ((10 + 5 * num) / 100.0) + " * mlevel_damage) in a 5m radius<br />";
            //toxic effect on death
            num = (int)unit.GetStat("skill_level", "Monster_Affix_ToxicDeath");
            if (num > 0)
                props += "When killed, causes a toxic field that does (" + ((5 + 5 * num) / 100.0) + " * mlevel_damage) damage in a 10m radius for 5 seconds<br />";

            return props;
        }
Beispiel #3
0
        private string GetDefence(DataRow item, Unit unit)
        {
            //looks like armor and shields can round either way (not sure about sfx atk/def and stuff)
            int level = (int)unit.GetStat("level");// = !string.IsNullOrEmpty(item["fixedLevel"].ToString()) ?  Int32.Parse(item["fixedLevel"].ToString().Replace(";", "")) : (int)item["level"];
            var strings = new List<string>();

            var armor = (int) item["armor"];
            var buffer = (int) Manager.GetDataTable("ITEM_LEVELS").Rows[level]["armor"];
            object bonus;
            if (unit.GetStat("armor_bonus") is int)
                bonus = 0;
            else
                bonus = ((Dictionary<string, object>) unit.GetStat("armor_bonus"))["all"];
            if (bonus is Evaluator.Range)
            {
                armor = (int)Math.Round(armor * buffer / 100.0);
                Evaluator.Range range = (Evaluator.Range) bonus + armor;
                if (range.ToString() != "0") strings.Add(GetImage("armor.png", _height) + " Armor: " + range);
            }
            else
            {
                armor = (int)Math.Round(armor * buffer / 100.0);
                if (bonus.ToString() != "0") armor += Convert.ToInt32(bonus);
                if (armor.ToString() != "0") strings.Add(GetImage("armor.png", _height) + " Armor: " + armor);
            }

            var shields = (int)item["shields"];
            buffer = (int)Manager.GetDataTable("ITEM_LEVELS").Rows[level]["shields"];
            bonus = unit.GetStat("shields_bonus");
            if (bonus is Evaluator.Range)
            {
                shields = (int)Math.Round(shields * buffer / 100.0);
                Evaluator.Range range = (Evaluator.Range)bonus + shields;
                if (range.ToString() != "0") strings.Add(GetImage("shields.png", _height) + " Shields: " + range);
            }
            else
            {
                shields = (int)Math.Round(shields * buffer / 100.0);
                if (bonus.ToString() != "0") shields += Convert.ToInt32(bonus);
                if (shields.ToString() != "0") strings.Add(GetImage("shields.png", _height) + " Shields: " + shields);
            }

            return ConcatStrings(strings);
        }
Beispiel #4
0
        private string GetDamage(DataRow item,Unit unit)
        {
            if (string.IsNullOrEmpty(item["minBaseDmg"].ToString())) return string.Empty;

            //var unit = new Item();
            var evaluator = new Evaluator { Unit = unit, Manager = Manager, Game3 = new Game3() };
            //var level = !string.IsNullOrEmpty(item["fixedLevel"].ToString()) ? Int32.Parse(item["fixedLevel"].ToString().Replace(";", "")) : (int)item["level"];
            //if (item["itemQuality"].ToString() == "12") level = 63; //manually correct mythic (although it seems to use a different ilvl anyway)
            var dmgMin = Int32.Parse(item["minBaseDmg"].ToString().Replace(";", ""));
            var dmgMax = Int32.Parse(item["maxBaseDmg"].ToString().Replace(";", ""));
            var dmgIncrement = (int) item["dmgIncrement"];
            var radialIncrement = (int) item["radialDmgIncrement"];
            var fieldIncrement = (int) item["fieldDmgIncrement"];
            //var dotIncrement = (int) item["dotDmgIncrement"]; // doesnt seem to be used
            //custom stuff for beam and hive damage (temporary until the type stuff is redone)
            //beam - direct damage of any element, or HARP
            bool isBeam = item["unitType_string"].ToString().Contains("beam") || item["unitType_string"].ToString().Contains("harp");
            //hive - any hive/funky bug thing weapon, used for eel (direct) and swarm (splash, never used)
            bool isHive = item["unitType_string"].ToString().Contains("hive") || item["unitType_string"].ToString().Contains("cabalist_bug2h_achiev");
            unit.SetStat("isBeam", isBeam ? 1 : 0);
            unit.SetStat("isHive", isHive ? 1 : 0);

            unit.SetStat("damage_min", dmgMin);
            unit.SetStat("damage_max", dmgMax);
            //unit.SetStat("level", level);
            unit.SetStat("dmg_increment", dmgIncrement);
            unit.SetStat("radial_increment", radialIncrement);
            unit.SetStat("field_increment", fieldIncrement);

            var scripts = item["props1"].ToString() + item["props2"] + item["props3"] + item["props4"] + item["props5"];
            evaluator.Evaluate(scripts);

            var builder = new StringBuilder();

            var values = unit.GetStat("dmg_fire");
            if (!(values is int))
            {
                string fireDmg;
                if (isBeam)
                    fireDmg = FormatBeamDmg((Dictionary<string, object>)values, "Fire");
                else
                    fireDmg = FormatDirectDmg((Dictionary<string, object>)values, "Fire");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dmg_spec");
            if (!(values is int))
            {
                string fireDmg;
                if (isBeam)
                    fireDmg = FormatBeamDmg((Dictionary<string, object>)values, "Spectral");
                else
                    fireDmg = FormatDirectDmg((Dictionary<string, object>)values, "Spectral");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dmg_phys");
            if (!(values is int))
            {
                string fireDmg;
                if (isBeam)
                    fireDmg = FormatBeamDmg((Dictionary<string, object>)values, "Physical");
                else
                    fireDmg = FormatDirectDmg((Dictionary<string, object>)values, "Physical");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dmg_toxic");
            if (!(values is int))
            {
                string fireDmg;
                if (isBeam)
                    fireDmg = FormatBeamDmg((Dictionary<string, object>)values, "Toxic");
                else
                    fireDmg = FormatDirectDmg((Dictionary<string, object>)values, "Toxic");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dmg_elec");
            if (!(values is int))
            {
                string fireDmg;
                if (isBeam)
                    fireDmg = FormatBeamDmg((Dictionary<string, object>)values, "Electricity");
                else if (isHive)
                    fireDmg = FormatEelDmg((Dictionary<string, object>)values, "Electricity");  //item display says it uses splash, but IT LIES
                else
                    fireDmg = FormatDirectDmg((Dictionary<string, object>)values, "Electricity");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_fire");
            if (!(values is int))
            {
                var fireDmg = FormatSplashDmg((Dictionary<string, object>)values, "Fire");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_spec");
            if (!(values is int))
            {
                var fireDmg = FormatSplashDmg((Dictionary<string, object>)values, "Spectral");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_phys");
            if (!(values is int))
            {
                var fireDmg = FormatSplashDmg((Dictionary<string, object>)values, "Physical");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_toxic");
            if (!(values is int))
            {
                string fireDmg;
                if (isHive)
                    fireDmg = FormatSwarmDmg((Dictionary<string, object>)values, "Toxic");
                else
                    fireDmg = FormatSplashDmg((Dictionary<string, object>)values, "Toxic");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_elec");
            if (!(values is int))
            {
                string fireDmg;
                //if (isHive)
                    //fireDmg = FormatEelDmg((Dictionary<string, object>)values, "Electricity");
                //else
                    fireDmg = FormatSplashDmg((Dictionary<string, object>)values, "Electricity");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("field_fire");
            if (!(values is int))
            {
                var fireDmg = FormatFieldDmg((Dictionary<string, object>)values, "Fire");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("field_spec");
            if (!(values is int))
            {
                var fireDmg = FormatFieldDmg((Dictionary<string, object>)values, "Spectral");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("field_phys");
            if (!(values is int))
            {
                var fireDmg = FormatFieldDmg((Dictionary<string, object>)values, "Physical");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("field_toxic");
            if (!(values is int))
            {
                var fireDmg = FormatFieldDmg((Dictionary<string, object>)values, "Toxic");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("field_elec");
            if (!(values is int))
            {
                var fireDmg = FormatFieldDmg((Dictionary<string, object>)values, "Electricity");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dot_fire");
            if (!(values is int))
            {
                var fireDmg = FormatDotDmg((Dictionary<string, object>)values, "Fire");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dot_spec");
            if (!(values is int))
            {
                var fireDmg = FormatDotDmg((Dictionary<string, object>)values, "Spectral");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dot_phys");
            if (!(values is int))
            {
                var fireDmg = FormatDotDmg((Dictionary<string, object>)values, "Physical");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dot_toxic");
            if (!(values is int))
            {
                var fireDmg = FormatDotDmg((Dictionary<string, object>)values, "Toxic");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("dot_elec");
            if (!(values is int))
            {
                var fireDmg = FormatDotDmg((Dictionary<string, object>)values, "Electricity");
                builder.Append(fireDmg);
            }

            values = unit.GetStat("rad_toxic_hive");
            if (!(values is int))
            {
                var fireDmg = FormatSwarmDmg((Dictionary<string, object>)values, "Toxic");
                builder.Append(fireDmg);
            }

            //if there's no damage to display, it must be a focus item that has power damage
            if (builder.Length == 0)
            {
                DataRow lvlRow = Manager.GetDataTable("ITEM_LEVELS").Rows[(int)unit.GetStat("level")];
                builder.Append(string.Format("'''Power''': {0}-{1}",
                    (int)(dmgMin / 100.0 * (int)lvlRow["baseDamageMultiplyer"]),
                    (int)(dmgMax / 100.0 * (int)lvlRow["baseDamageMultiplyer"])
                    ));
            }

            return builder.ToString();
        }
Beispiel #5
0
        private IList<string> GetAffixes(DataRow item, Unit unit)
        {
            var evaluator = new Evaluator {Unit = unit, Manager = Manager, Game3 = new Game3()};
            var table = Manager.GetDataTable("AFFIXES");
            var affixes = item["affix"].ToString();

            //var level = !string.IsNullOrEmpty(item["fixedLevel"].ToString()) ?  Int32.Parse(item["fixedLevel"].ToString().Replace(";", "")) : (int)item["level"];
            //if (level == 0) level = 55;
            //evaluator.Unit.SetStat("level", level);

            string[] split = affixes.Split(',');
            foreach (var i in split)
            {
                var affix = int.Parse(i);
                if (affix == -1) break; // no more affixes
                var script = table.Rows[affix]["property1"].ToString();
                script += table.Rows[affix]["property2"].ToString();
                script += table.Rows[affix]["property3"].ToString();
                script += table.Rows[affix]["property4"].ToString();
                script += table.Rows[affix]["property5"].ToString();
                script += table.Rows[affix]["property6"].ToString();
                script = RemoveLevelSetters(script);
                if (String.IsNullOrEmpty(script)) continue; // no affix script
                evaluator.Evaluate(script);
            }

            return ItemDisplay.GetDisplayStrings(evaluator.Unit);
        }
Beispiel #6
0
        private IList<string> GetInherentAffixes(DataRow item, Unit baseUnit)
        {
            Unit unit = new Item();
            unit.SetStat("level", baseUnit.GetStat("level"));   //copy the level into a new unit so it won't re-display everything
            var evaluator = new Evaluator { Unit = unit, Manager = Manager, Game3 = new Game3() };
            var scripts = item["props1"].ToString() + item["props2"] + item["props3"] + item["props4"] + item["props5"];

            //it might be hidden but it's a fraction that's likely rounded to 0, so it's not worth displaying
            scripts = scripts.Replace("SetStat673('hp_regen', 1);", "").Replace("SetStat673('power_regen', 1);", "");
            //also get rid of any explicit level-setting
            scripts = RemoveLevelSetters(scripts);

            //var level = !string.IsNullOrEmpty(item["fixedLevel"].ToString()) ?  Int32.Parse(item["fixedLevel"].ToString().Replace(";", "")) : (int)item["level"];
            //evaluator.Unit.SetStat("level", level);

            evaluator.Evaluate(scripts);
            return ItemDisplay.GetDisplayStrings(evaluator.Unit);
        }
Beispiel #7
0
        private string GetFeeds(int itemid, Unit unit)
        {
            //Unit unit = new Item();
            var evaluator = new Evaluator { Unit = unit, Manager = Manager };
            var item = Manager.GetDataTable("ITEMS").Rows[itemid];
            var table = Manager.GetDataTable("AFFIXES");
            var affixes = item["affix"].ToString();
            var scripts = item["perLevelProps1"].ToString();
            scripts += item["perLevelProps2"].ToString();

            //var level = !string.IsNullOrEmpty(item["fixedLevel"].ToString()) ?  Int32.Parse(item["fixedLevel"].ToString().Replace(";", "")) : (int)item["level"];
            //evaluator.Unit.SetStat("level", level);

            string[] split = affixes.Split(',');
            foreach (var i in split)
            {
                var affix = int.Parse(i);
                if (affix == -1) break; // no more affixes
                var script = table.Rows[affix]["property1"].ToString();
                script += table.Rows[affix]["property2"].ToString();
                script += table.Rows[affix]["property3"].ToString();
                script += table.Rows[affix]["property4"].ToString();
                script += table.Rows[affix]["property5"].ToString();
                script += table.Rows[affix]["property6"].ToString();
                script = RemoveLevelSetters(script);
                if (String.IsNullOrEmpty(script)) continue; // no affix script
                evaluator.Evaluate(script);
            }

            if (scripts != string.Empty) evaluator.Evaluate(scripts);

            var strings = new List<string>();

            string feed = string.Empty;

            var accuracy = unit.GetStat("accuracy_feed");
            if ((accuracy is double && (double)accuracy != 0)
                || accuracy is string || accuracy is Evaluator.Range)
            {
                feed = ItemDisplay.FormatFeed(accuracy);
                strings.Add(feed + " Acc");
            }

            var strength = unit.GetStat("strength_feed");
            if ((strength is double && (double)strength != 0)
                || strength is string || strength is Evaluator.Range)
            {
                feed = ItemDisplay.FormatFeed(strength);
                strings.Add(feed + " Str");
            }

            var stamina = unit.GetStat("stamina_feed");
            if ((stamina is double && (double)stamina != 0)
                || stamina is string || stamina is Evaluator.Range)
            {
                feed = ItemDisplay.FormatFeed(stamina);
                strings.Add(feed + " Stam");
            }

            var willpower = unit.GetStat("willpower_feed");
            if ((willpower is double && (double)willpower != 0)
                || willpower is string || willpower is Evaluator.Range)
            {
                feed = ItemDisplay.FormatFeed(willpower);
                strings.Add(feed + " Will");
            }

            if (strings.Count == 0) return string.Empty;
            return "<div class=\"simple_line\"></div><div class=\"item_feed\">" + GetCSVString(strings) + "</div>";
        }
Beispiel #8
0
        public static string[] GetFeedCosts(Unit unit)
        {
            var strings = new List<string>();

            string feed = string.Empty;

            var accuracy = unit.GetStat("accuracy_feed");
            if ((accuracy is double && (double)accuracy != 0)
                || accuracy is string || accuracy is Evaluator.Range)
            {
                feed = FormatFeed(accuracy);
                strings.Add(feed + " Acc");
            }

            var strength = unit.GetStat("strength_feed");
            if ((strength is double && (double)strength != 0)
                || strength is string || strength is Evaluator.Range)
            {
                feed = FormatFeed(strength);
                strings.Add(feed + " Str");
            }

            var stamina = unit.GetStat("stamina_feed");
            if ((stamina is double && (double)stamina != 0)
                || stamina is string || stamina is Evaluator.Range)
            {
                feed = FormatFeed(stamina);
                strings.Add(feed + " Stam");
            }

            var willpower = unit.GetStat("willpower_feed");
            if ((willpower is double && (double)willpower != 0)
                || willpower is string || willpower is Evaluator.Range)
            {
                feed = FormatFeed(willpower);
                strings.Add(feed + " Will");
            }

            return strings.ToArray();
        }
Beispiel #9
0
        internal static string[] GetModSlots(Unit unit)
        {
            var strings = new List<string>();
            var itemSlots = unit.GetStat("item_slots");
            if (itemSlots is int) return strings.ToArray();

            foreach (var slot in (Dictionary<string, object>) itemSlots)
            {
                switch (slot.Key)
                {
                    case "fuel":
                        strings.Add(WikiScript.GetImage("fuel", 15) + " " + slot.Value);
                        break;
                    case "relic":
                        strings.Add(WikiScript.GetImage("relic", 15) + " " + slot.Value);
                        break;
                    case "tech":
                        strings.Add(WikiScript.GetImage("tech", 15) + " " + slot.Value);
                        break;
                    case "battery":
                        strings.Add(WikiScript.GetImage("battery", 15) + " " + slot.Value);
                        break;
                    case "ammo":
                        strings.Add(WikiScript.GetImage("ammo", 15) + " " + slot.Value);
                        break;
                    case "rockets":
                        strings.Add(WikiScript.GetImage("rocket", 15) + " " + slot.Value);
                        break;
                    default:
                        throw new Exception("Unknown mod slot: " + slot.Key);
                }
            }
            return strings.ToArray();
        }
Beispiel #10
0
 public static string GetSkillBonus(Unit unit)
 {
     string bonus = unit.GetStat("skill_bonus").ToString();
     if (String.Compare(bonus, "0") == 0)
         return string.Empty;
     return bonus;
 }