示例#1
0
        public static WeaponSearchType LimitTypeToListType(WeaponListKind type)
        {
            switch (type)
            {
            case WeaponListKind.Melee:
                return(WeaponSearchType.Melee);

            case WeaponListKind.Ranged:
                return(WeaponSearchType.Ranged);

            case WeaponListKind.Both:
            default:
                return(WeaponSearchType.Both);
            }
        }
示例#2
0
        public static bool CustomDrawer_MatchingWeapons_active(Rect wholeRect, SettingHandle <ThingDefHashSetHandler> setting, WeaponListKind kind, Color background, string yesText = "Sidearms", string noText = "Not sidearms")
        {
            drawBackground(wholeRect, background);
            if (setting.Value == null)
            {
                setting.Value = new ThingDefHashSetHandler();
            }

            GUI.color = Color.white;

            Rect leftRect = new Rect(wholeRect);

            leftRect.width    = leftRect.width / 2;
            leftRect.height   = wholeRect.height - TextMargin + BottomMargin;
            leftRect.position = new Vector2(leftRect.position.x, leftRect.position.y);
            Rect rightRect = new Rect(wholeRect);

            rightRect.width    = rightRect.width / 2;
            leftRect.height    = wholeRect.height - TextMargin + BottomMargin;
            rightRect.position = new Vector2(rightRect.position.x + leftRect.width, rightRect.position.y);

            DrawLabel(yesText, leftRect, TextMargin);
            DrawLabel(noText, rightRect, TextMargin);

            leftRect.position  = new Vector2(leftRect.position.x, leftRect.position.y + TextMargin);
            rightRect.position = new Vector2(rightRect.position.x, rightRect.position.y + TextMargin);

            int iconsPerRow = (int)(leftRect.width / (IconGap + IconSize));

            IEnumerable <ThingDef> matchingSidearmsEnumerable;
            IEnumerable <ThingDef> allSidearmsEnumerable = GettersFilters.getValidWeaponsThingDefsOnly();

            switch (kind)
            {
            case WeaponListKind.Melee:
                matchingSidearmsEnumerable = allSidearmsEnumerable.Where(t => t.IsMeleeWeapon);
                break;

            case WeaponListKind.Ranged:
                matchingSidearmsEnumerable = allSidearmsEnumerable.Where(t => t.IsRangedWeapon);
                break;

            case WeaponListKind.Both:
            default:
                matchingSidearmsEnumerable = allSidearmsEnumerable;
                break;
            }


            List <ThingDef> matchingSidearms = matchingSidearmsEnumerable.ToList();
            List <ThingDef> allSidearms      = allSidearmsEnumerable.ToList();

            matchingSidearms = matchingSidearms.OrderBy(t => t.GetStatValueAbstract(StatDefOf.Mass)).ToList();

            List <ThingDef> selectedSidearms = setting.Value.InnerList.ToList();

            List <ThingDef> unselectedSidearms = new List <ThingDef>();

            for (int i = 0; i < matchingSidearms.Count; i++)
            {
                if (!selectedSidearms.Contains(matchingSidearms[i]))
                {
                    unselectedSidearms.Add(matchingSidearms[i]);
                }
            }

            bool change = false;

            int biggerRows = Math.Max((selectedSidearms.Count - 1) / iconsPerRow, (unselectedSidearms.Count - 1) / iconsPerRow) + 1;

            setting.CustomDrawerHeight = (biggerRows * IconSize) + ((biggerRows) * IconGap) + TextMargin;

            for (int i = 0; i < selectedSidearms.Count; i++)
            {
                int  collum     = (i % iconsPerRow);
                int  row        = (i / iconsPerRow);
                bool interacted = DrawIconForWeapon(selectedSidearms[i], leftRect, new Vector2(IconSize * collum + collum * IconGap, IconSize * row + row * IconGap), i);
                if (interacted)
                {
                    change = true;
                    setting.Value.InnerList.Remove(selectedSidearms[i]);
                }
            }

            for (int i = 0; i < unselectedSidearms.Count; i++)
            {
                int  collum     = (i % iconsPerRow);
                int  row        = (i / iconsPerRow);
                bool interacted = DrawIconForWeapon(unselectedSidearms[i], rightRect, new Vector2(IconSize * collum + collum * IconGap, IconSize * row + row * IconGap), i);
                if (interacted)
                {
                    change = true;
                    setting.Value.InnerList.Add(unselectedSidearms[i]);
                }
            }
            return(change);
        }
        internal static bool CustomDrawer_MatchingWeapons_active(Rect wholeRect, SettingHandle <StringHashSetHandler> setting, WeaponListKind kind, Color background, string yesText = "Sidearms", string noText = "Not sidearms", bool excludeNeolithic = false)
        {
            drawBackground(wholeRect, background);
            if (setting.Value == null)
            {
                setting.Value = new StringHashSetHandler();
            }

            GUI.color = Color.white;

            Rect leftRect = new Rect(wholeRect);

            leftRect.width    = leftRect.width / 2;
            leftRect.height   = wholeRect.height - TextMargin + BottomMargin;
            leftRect.position = new Vector2(leftRect.position.x, leftRect.position.y);
            Rect rightRect = new Rect(wholeRect);

            rightRect.width    = rightRect.width / 2;
            leftRect.height    = wholeRect.height - TextMargin + BottomMargin;
            rightRect.position = new Vector2(rightRect.position.x + leftRect.width, rightRect.position.y);

            DrawLabel(yesText, leftRect, TextMargin);
            DrawLabel(noText, rightRect, TextMargin);

            leftRect.position  = new Vector2(leftRect.position.x, leftRect.position.y + TextMargin);
            rightRect.position = new Vector2(rightRect.position.x, rightRect.position.y + TextMargin);

            int iconsPerRow = (int)(leftRect.width / (IconGap + IconSize));

            HashSet <string> selection = setting.Value.InnerList;

            List <ThingStuffPair> matchingSidearms;
            List <ThingStuffPair> allSidearms = GettersFilters.filterForType(PawnSidearmsGenerator.getWeaponsList(), WeaponSearchType.Both, false);

            switch (kind)
            {
            case WeaponListKind.Melee:
                matchingSidearms = GettersFilters.filterForType(allSidearms, WeaponSearchType.Melee, false);
                break;

            case WeaponListKind.Ranged:
                matchingSidearms = GettersFilters.filterForType(allSidearms, WeaponSearchType.Ranged, false);
                break;

            case WeaponListKind.Both:
            default:
                matchingSidearms = allSidearms;
                break;
            }

            if (excludeNeolithic)
            {
                GettersFilters.excludeNeolithic(matchingSidearms);
            }

            matchingSidearms.Sort(new MassComparer());

            List <string> selectionAsList = selection.ToList();

            ThingDef[] selectionThingDefs = new ThingDef[selectionAsList.Count];
            for (int i = 0; i < allSidearms.Count; i++)
            {
                for (int j = 0; j < selectionThingDefs.Length; j++)
                {
                    if (selectionAsList[j].Equals(allSidearms[i].thing.defName))
                    {
                        selectionThingDefs[j] = allSidearms[i].thing;
                    }
                }
            }

            List <ThingStuffPair> unselectedSidearms = new List <ThingStuffPair>();

            for (int i = 0; i < matchingSidearms.Count; i++)
            {
                if (!selection.Contains(matchingSidearms[i].thing.defName))
                {
                    unselectedSidearms.Add(matchingSidearms[i]);
                }
            }

            bool change = false;

            int biggerRows = Math.Max((selection.Count - 1) / iconsPerRow, (unselectedSidearms.Count - 1) / iconsPerRow) + 1;

            setting.CustomDrawerHeight = (biggerRows * IconSize) + ((biggerRows) * IconGap) + TextMargin;

            for (int i = 0; i < selectionAsList.Count; i++)
            {
                if (selectionThingDefs[i] == null)
                {
                    continue;
                }
                int  collum     = (i % iconsPerRow);
                int  row        = (i / iconsPerRow);
                bool interacted = DrawIconForWeapon(selectionThingDefs[i], leftRect, new Vector2(IconSize * collum + collum * IconGap, IconSize * row + row * IconGap), i);
                if (interacted)
                {
                    change = true;
                    selection.Remove(selectionAsList[i]);
                }
            }

            for (int i = 0; i < unselectedSidearms.Count; i++)
            {
                int  collum     = (i % iconsPerRow);
                int  row        = (i / iconsPerRow);
                bool interacted = DrawIconForWeapon(unselectedSidearms[i].thing, rightRect, new Vector2(IconSize * collum + collum * IconGap, IconSize * row + row * IconGap), i);
                if (interacted)
                {
                    change = true;
                    selection.Add(unselectedSidearms[i].thing.defName);
                }
            }
            if (change)
            {
                setting.Value.InnerList = selection;
            }
            return(change);
        }
 private void Limits(Listing_Standard listing, WeaponListKind listType, Action onChange)
 {
     ref var limitModeSingle              = ref LimitModeSingle;