public Body()
 {
     Head    = new BodyPartGroup(BodyPartGroupType.Head);
     Thorax  = new BodyPartGroup(BodyPartGroupType.Thorax);
     Abdomen = new BodyPartGroup(BodyPartGroupType.Abdomen);
     Pelvis  = new BodyPartGroup(BodyPartGroupType.Pelvis);
 }
Example #2
0
    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);
    }
Example #3
0
    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);
    }
Example #4
0
 public List <BodyPart002> GetBodyParts(BodyPartGroup bodyPartGroup)
 {
     return(BodyParts.Where(x => x.Group == bodyPartGroup).ToList());
 }
Example #5
0
    public BodyPart002 GetFirstBodyPart(BodyPartGroup bodyPartGroup)
    {
        var bodyPart = BodyParts.FirstOrDefault(x => x.Group == bodyPartGroup);

        return(bodyPart);
    }
Example #6
0
        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);
            }
        }