示例#1
0
        // private static void ClearEqualsColumns(Table table)
        // {

        //     var cellsByColumn = table.SelectMany(x => /*row*/x.Select(x => /*cell*/x))
        //         .GroupBy(x => x.column);
        //     List<Cell> toRemove = new();
        //     foreach (var group in cellsByColumn)
        //     {
        //         Cell first = group.First();
        //         if (group.All(x => first.value?.Equals(x.value) ?? x.value == null))
        //         {
        //             // Если все элементы колоки равны
        //             toRemove.Add(first);
        //         }
        //     }
        //     foreach (var row in table)
        //     {
        //         foreach (var cell in toRemove)
        //         {
        //             row.Cells.RemoveWithColumn(cell.column.name);
        //             Log.Warning($"remove: {cell.column.name}");
        //         }
        //     }
        //     Log.Warning($"Removed: {toRemove.Count}");
        // }

        private void MakeRow(Table table, ThingDef d, ThingDef?defStuff = null, ThingDef?stuff = null)
        {
            var row = table.NewRow();

            row["Title".ParserTranslate()]       = d.LabelCap;
            row["Description".ParserTranslate()] = d.DescriptionDetailed;
            row["OnMapCount".ParserTranslate()]  = d.CountOnMap();
            row["MarketValue".ParserTranslate()] = d.BaseMarketValue;
            row["CanCraft".ParserTranslate()]    = d.CanCraft(); //d.recipeMaker != null;
            row["DefMaterial".ParserTranslate()] = defStuff?.label;
            row["TechLevel".ParserTranslate()]   = d.techLevel.ToStringHuman().CapitalizeFirst();

            try
            {
                // used values from def without stuff bonuses

                /*
                 * if (d.MadeFromStuff)
                 * {
                 *  defStuff = stuff ?? GenStuff.DefaultStuffFor(d);
                 * }
                 *
                 * if (defStuff != null)
                 * {
                 *  row["Title".ParserTranslate()] += $"({defStuff.label})";
                 * }
                 *
                 *
                 * row["Material".ParserTranslate()] = defStuff?.label;
                 */
                row["CanCraft".ParserTranslate()] = d.CanCraft();
                row["Body".ParserTranslate()]     = String.Join(",", d.apparel.bodyPartGroups.Select(x => x.label).OrderBy(x => x).ToArray());
                row["Layer".ParserTranslate()]    = String.Join(",", d.apparel.layers.Select(x => x.label).OrderBy(x => x).ToArray());

                // это значения из дефов, не учитывается влияение материала
                row.FillFrom(d.statBases);
                row.FillFrom(d.equippedStatOffsets);

                // брут всех статов в игре на одежду с влиянием материала
                // foreach (var s in _statDefs)
                // {
                //     try {
                //         if (row[s.LabelCap] == null)
                //             row[s.LabelCap] = d.GetStatValueAbstract(s, defStuff).Nullify();//.ByStyle(s.toStringStyle);
                //     } catch {}
                // }
            }
            catch (Exception e)
            {
                Log.Error($"{d.LabelCap} - {e.Message} - {e.StackTrace}");
            }
        }
示例#2
0
        private static WeaponRanged MakeRow(ThingDef d, bool hasCombatExtended, Type ammoUserType = null)
        {
            var row = new WeaponRanged {
                Label = d.LabelCap, Description = d.DescriptionDetailed, MarketValue = d.BaseMarketValue, ItemsOnMap = d.CountOnMap()
            };

            row.TechLevel = d.techLevel.ToStringHuman().CapitalizeFirst();

            try
            {
                row.TexturePath = d.modContentPack.RootDir + @"\Textures\" + d.graphicData.texPath;
            }
            catch
            {
            }

            try
            {
                var accuracyTouch  = d.GetStatValueAbstract(StatDefOf.AccuracyTouch).ToPercent();
                var accuracyShort  = d.GetStatValueAbstract(StatDefOf.AccuracyShort).ToPercent();
                var accuracyMedium = d.GetStatValueAbstract(StatDefOf.AccuracyMedium).ToPercent();
                var accuracyLong   = d.GetStatValueAbstract(StatDefOf.AccuracyLong).ToPercent();
                var cooldown       = d.GetStatValueAbstract(StatDefOf.RangedWeapon_Cooldown);
                var mass           = d.BaseMass;

                var   verb                   = d.Verbs.OfType <VerbProperties>().FirstOrDefault();
                int   damage                 = getDamageAmount(d, verb.defaultProjectile.projectile);
                int   burstShotCount         = verb.burstShotCount > 0 ? verb.burstShotCount : 1;
                int   ticksBetweenBurstShots = verb.ticksBetweenBurstShots > 0 ? verb.ticksBetweenBurstShots : 10;
                float warmup                 = verb.warmupTime;
                float maxRange               = verb.range;
                float minRange               = verb.minRange;
                float burstShotFireRate      = (float)Math.Round(60f / verb.ticksBetweenBurstShots.TicksToSeconds());

                row.CanCraft       = d.CanCraft();
                row.Dps            = getDps(damage, burstShotCount, cooldown, warmup, ticksBetweenBurstShots);
                row.Rpm            = burstShotFireRate;
                row.Damage         = damage;
                row.BurstShotCount = burstShotCount;
                row.MaxRange       = maxRange;
                row.Cooldown       = cooldown;
                row.WarmupTime     = warmup;
                row.Accuracy       = getAccuracyStr(minRange, maxRange, accuracyTouch, accuracyShort, accuracyMedium, accuracyLong);

                if (hasCombatExtended)
                {
                    var ceAmmo = d.comps.FirstOrDefault(x => x.GetType() == ammoUserType); // d.GetCompProperties<CompProperties_AmmoUser>()
                    row.DamageType = ceAmmo != null?Traverse.Create(ceAmmo).Field("ammoSet").Field("label").GetValue <string>() : verb.defaultProjectile.projectile.damageDef.label;

                    row.CE_SightsEfficiency = d.GetStatValueAbstract(StatDef.Named("SightsEfficiency")).ToPercent();
                    row.CE_ShotSpread       = d.GetStatValueAbstract(StatDef.Named("ShotSpread"));
                    row.CE_SwayFactor       = d.GetStatValueAbstract(StatDef.Named("SwayFactor"));
                    row.CE_OneHanded        = d.weaponTags?.Contains("CE_OneHandedWeapon") ?? false;
                }
                else
                {
                    row.DamageType = verb.defaultProjectile.projectile.damageDef.label;
                }

                if (d.weaponTags != null)
                {
                    row.WeaponTags = string.Join("; ", d.weaponTags.OrderBy(x => x).ToArray());
                }
            }
            catch (Exception e)
            {
                Log.Error($"{d.LabelCap} - {e.Message} - {e.StackTrace}");
            }

            return(row);
        }
示例#3
0
        private static Apparel MakeRow(ThingDef d, ThingDef defStuff = null, ThingDef stuff = null)
        {
            var row = new Apparel {
                Label = d.LabelCap, Description = d.DescriptionDetailed, MarketValue_ = d.BaseMarketValue, ItemsOnMap = d.CountOnMap()
            };

            row.CanCraft    = d.CanCraft(); //d.recipeMaker != null;
            row.DefMaterial = defStuff?.label;
            row.TechLevel   = d.techLevel.ToStringHuman().CapitalizeFirst();

            try
            {
                row.TexturePath = d.modContentPack.RootDir + @"\Textures\" + d.graphicData.texPath;
            }
            catch
            {
            }

            try
            {
                //var defStuff = d.MadeFromStuff ? GenStuff.DefaultStuffFor(d) : null;
                if (d.MadeFromStuff)
                {
                    defStuff = stuff ?? GenStuff.DefaultStuffFor(d);
                }

                if (defStuff != null)
                {
                    row.Label += $"({defStuff.label})";
                }

                var ArmorRating_Blunt = d.GetStatValueAbstract(StatDefOf.ArmorRating_Blunt, defStuff).Nullify();
                var ArmorRating_Sharp = d.GetStatValueAbstract(StatDefOf.ArmorRating_Sharp, defStuff).Nullify();

                row.Material       = defStuff?.label;
                row.CanCraft       = d.CanCraft();
                row.Body           = String.Join(",", d.apparel.bodyPartGroups.Select(x => x.label).ToArray());
                row.Layer          = String.Join(",", d.apparel.layers.Select(x => x.label).ToArray());
                row.ArmorBlunt     = ceBluntStatWorker ? ArmorRating_Blunt.RoundTo2() : ArmorRating_Blunt.ToPercent();
                row.ArmorSharp     = ceSharpStatWorker ? ArmorRating_Sharp.RoundTo2() : ArmorRating_Sharp.ToPercent();
                row.ArmorHeat      = d.GetStatValueAbstract(StatDefOf.ArmorRating_Heat, defStuff).Nullify().ToPercent();
                row.InsulationCold = d.GetStatValueAbstract(StatDefOf.Insulation_Cold, defStuff).Nullify().RoundTo2();
                row.InsulationHeat = d.GetStatValueAbstract(StatDefOf.Insulation_Heat, defStuff).Nullify().RoundTo2();

                // AutoStatdefs
                if (d.equippedStatOffsets != null)
                {
                    foreach (var offset in d.equippedStatOffsets)
                    {
                        var prop = typeof(Apparel).GetProperty(offset.stat.defName);
                        if (prop != null)
                        {
                            prop.SetValue(row, offset.value.Nullify().ByStyle(offset.stat.toStringStyle), null);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error($"{d.LabelCap} - {e.Message} - {e.StackTrace}");
            }

            return(row);
        }