public Body() { Head = new BodyPartGroup(BodyPartGroupType.Head); Thorax = new BodyPartGroup(BodyPartGroupType.Thorax); Abdomen = new BodyPartGroup(BodyPartGroupType.Abdomen); Pelvis = new BodyPartGroup(BodyPartGroupType.Pelvis); }
public float GetUprightNormalizedReward(BodyPartGroup bodyPartGroup) { BodyPart002 bodyPart = GetFirstBodyPart(bodyPartGroup); float maxBonus = 1f; var toFocalAngle = bodyPart.ToFocalRoation * -bodyPart.Transform.forward; var angleFromUp = Vector3.Angle(toFocalAngle, Vector3.up); var qpos2 = (angleFromUp % 180) / 180; var uprightBonus = maxBonus * (2 - (Mathf.Abs(qpos2) * 2) - 1); return(uprightBonus); }
public float GetDirectionNormalizedReward(BodyPartGroup bodyPartGroup, Vector3 direction) { BodyPart002 bodyPart = GetFirstBodyPart(bodyPartGroup); float maxBonus = 1f; var toFocalAngle = bodyPart.ToFocalRoation * bodyPart.Transform.right; var angle = Vector3.Angle(toFocalAngle, direction); var qpos2 = (angle % 180) / 180; var bonus = maxBonus * (2 - (Mathf.Abs(qpos2) * 2) - 1); return(bonus); }
public List <BodyPart002> GetBodyParts(BodyPartGroup bodyPartGroup) { return(BodyParts.Where(x => x.Group == bodyPartGroup).ToList()); }
public BodyPart002 GetFirstBodyPart(BodyPartGroup bodyPartGroup) { var bodyPart = BodyParts.FirstOrDefault(x => x.Group == bodyPartGroup); return(bodyPart); }
public void DrawBodyPartGroup(BodyDef bodyDef, BodyPartGroup group, List <ApparelLayerDef> layers, ref float curY, List <Rect> columns, List <Tuple <Item, Tag> > wornApparel) { var groupRect = new Rect(columns[0].x, curY, columns[0].width, ModGUIUtility.SPACED_HEIGHT); var def = group.def; GUI.color = Color.gray; Widgets.Label(groupRect, def.LabelCap); GUI.color = Color.white; Text.Font = GameFont.Tiny; foreach (var column in group.layers.OrderByDescending(d => d.drawOrder)) { var idx = layers.FirstIndexOf(c => c == column) + 1; var columnRect = new Rect(columns[idx].x, curY, columns[idx].width, ModGUIUtility.SPACED_HEIGHT); var loadoutTags = selectedUnit.loadout.tags; var(overlappingApparel, overlappingTag) = wornApparel .FirstOrDefault(item => ApparelSlotMaker.Create(bodyDef, item.Item1.Def) .Intersects(def, column)) ?? new Tuple <Item, Tag>(null, null); var possibleDefs = loadoutTags .SelectMany(t => t.ItemsWithTagMatching(item => item.Def.IsApparel && ApparelSlotMaker.Create(bodyDef, (ThingDef)item.Def).Intersects(def, column))) .ToList(); if (overlappingApparel != null) { possibleDefs.RemoveAll(tup => tup.Item1 == overlappingTag); } if (overlappingApparel == null && possibleDefs.EnumerableNullOrEmpty()) { Widgets.DrawBoxSolidWithOutline(columnRect, Widgets.WindowBGFillColor, Color.gray); } else { if (overlappingApparel != null) { var col = GetColorForTagAtIndex(loadoutTags.IndexOf(overlappingTag)); Widgets.DrawBoxSolidWithOutline(columnRect, Widgets.WindowBGFillColor, col); Widgets.DefIcon(columnRect.ContractedBy(3f), overlappingApparel.Def, overlappingApparel.RandomStuff); if (possibleDefs.Any()) { var str = ""; foreach (var(pTag, pApparel) in possibleDefs) { str += $"\n - {pApparel.Def.LabelCap} from {pTag.name}"; } TooltipHandler.TipRegion(columnRect, $"{overlappingApparel.Def.LabelCap} from {overlappingTag.name} blocks:{str}"); } } else { var nextHighestPrio = possibleDefs.OrderBy(tup => loadoutTags.IndexOf(tup.Item1)).First().Item2; Widgets.DrawBoxSolidWithOutline(columnRect, Widgets.WindowBGFillColor, Color.red); Widgets.DefIcon(columnRect.ContractedBy(3f), nextHighestPrio.Def, color: new Color(0.5f, 0.5f, 0.5f, 0.3f)); var str = "Blocked Tags:"; foreach (var(pTag, pApparel) in possibleDefs) { str += $"\n - {pApparel.Def.LabelCap} from {pTag.name}"; } TooltipHandler.TipRegion(columnRect, str); } } } Text.Font = GameFont.Small; curY += ModGUIUtility.SPACED_HEIGHT; foreach (var child in group.children) { DrawBodyPartGroup(bodyDef, child, layers, ref curY, columns, wornApparel); } }