// 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}"); } }
private static Material MakeRow(ThingDef d) { var row = new Material { Label = d.LabelCap, Description = d.DescriptionDetailed, ItemsOnMap = d.CountOnMap() }; try { row.TexturePath = d.modContentPack.RootDir + @"\Textures\" + d.graphicData.texPath; } catch { } var fields = typeof(StatDefOf).GetFields(); foreach (var field in fields) { var rowProp = typeof(Material).GetProperty(field.Name); if (rowProp != null) { StatDef statDef = (StatDef)field.GetValue(null); IsStatFactor.TryGetValue(field.Name, out bool isStatFactor); float?value = isStatFactor ? d.GetStatFactorValue(statDef) : d.GetStatValueAbstract(statDef); rowProp.SetValue(row, value.Nullify().ByStyle(statDef.toStringStyle), null); } } row.HitPoints = d.GetStatFactorValue(StatDefOf.MaxHitPoints).Nullify().ToPercent(); // CombatExtended if (CE_MeleePenetrationFactor != null) { row.CE_MeleePenetrationFactor = d.GetStatFactorValue(CE_MeleePenetrationFactor); } row.Category = GetCategory(d); return(row); }
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); }
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); }