Ledger Nano X - The secure hardware wallet
SHARE
TWEET

Untitled

a guest Apr 6th, 2020 143 in 303 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using RimWorld;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. using Verse;
  7. using static Verse.Widgets;
  8.  
  9. namespace Revolus.TextileStats {
  10.     public sealed class TextileStatsWindow : MainTabWindow {
  11.         private sealed class Datum {
  12.             internal ThingDef thingDef = null;
  13.             internal string label = "";
  14.             internal float? marketValue;
  15.             internal float? mass;
  16.             internal float? armorSharp;
  17.             internal float? armorBlunt;
  18.             internal float? armorHeat;
  19.             internal float? insulationCold;
  20.             internal float? insulationHeat;
  21.             internal float? damageSharp;
  22.             internal float? damageBlunt;
  23.             internal float? flammability;
  24.  
  25.             internal Datum(ThingDef thingDef) {
  26.                 this.thingDef = thingDef;
  27.                 this.label = thingDef.label;
  28.  
  29.                 foreach (var statBase in thingDef.statBases) {
  30.                     var stat = statBase.stat;
  31.                     if (stat == StatDefOf.MarketValue) {
  32.                         this.marketValue = statBase.value;
  33.                     } else if (stat == StatDefOf.Mass) {
  34.                         this.mass = statBase.value;
  35.                     } else if (stat == StatDefOf.Flammability) {
  36.                         this.flammability = statBase.value;
  37.                     } else if (stat == StatDefOf.StuffPower_Armor_Sharp) {
  38.                         this.armorSharp = statBase.value;
  39.                     } else if (stat == StatDefOf.StuffPower_Armor_Blunt) {
  40.                         this.armorBlunt = statBase.value;
  41.                     } else if (stat == StatDefOf.StuffPower_Armor_Heat) {
  42.                         this.armorHeat = statBase.value;
  43.                     } else if (stat == StatDefOf.StuffPower_Insulation_Cold) {
  44.                         this.insulationCold = statBase.value;
  45.                     } else if (stat == StatDefOf.StuffPower_Insulation_Heat) {
  46.                         this.insulationHeat = statBase.value;
  47.                     } else if (stat == StatDefOf.SharpDamageMultiplier) {
  48.                         this.damageSharp = statBase.value;
  49.                     } else if (stat == StatDefOf.BluntDamageMultiplier) {
  50.                         this.damageBlunt = statBase.value;
  51.                     }
  52.                 }
  53.             }
  54.  
  55.             internal IEnumerable<string> FormattedStrings() {
  56.                 yield return $"{this[1]:0}".PadLeft(5, '\u2007');
  57.                 yield return this.marketValue    is null ? null : $"{this.marketValue       :0.00} $"  .PadLeft(7, '\u2007');
  58.                 yield return this.mass           is null ? null : $"{this.mass              :0.000} kg".PadLeft(7, '\u2007');
  59.                 yield return this.flammability   is null ? null : $"{this.flammability * 100:0} %"     .PadLeft(5, '\u2007');
  60.                 yield return this.armorSharp     is null ? null : $"{this.armorSharp   * 100:0} %"     .PadLeft(5, '\u2007');
  61.                 yield return this.armorBlunt     is null ? null : $"{this.armorBlunt   * 100:0} %"     .PadLeft(5, '\u2007');
  62.                 yield return this.armorHeat      is null ? null : $"{this.armorHeat    * 100:0} %"     .PadLeft(5, '\u2007');
  63.                 yield return this.insulationCold is null ? null : $"{this.insulationCold    :0} °C"    .PadLeft(7, '\u2007');
  64.                 yield return this.insulationHeat is null ? null : $"{this.insulationHeat    :0} °C"    .PadLeft(7, '\u2007');
  65.                 yield return this.damageSharp    is null ? null : $"{this.damageSharp  * 100:0} %"     .PadLeft(5, '\u2007');
  66.                 yield return this.damageBlunt    is null ? null : $"{this.damageBlunt  * 100:0} %"     .PadLeft(5, '\u2007');
  67.             }
  68.  
  69.             internal float this[int index] {
  70.                 get {
  71.                     switch (index) {
  72.                         case 1:
  73.                             return Find.CurrentMap.resourceCounter.GetCount(this.thingDef);
  74.                         case 2:
  75.                             return this.marketValue ?? float.NegativeInfinity;
  76.                         case 3:
  77.                             return this.mass ?? float.NegativeInfinity;
  78.                         case 4:
  79.                             return this.flammability ?? float.NegativeInfinity;
  80.                         case 5:
  81.                             return this.armorSharp ?? float.NegativeInfinity;
  82.                         case 6:
  83.                             return this.armorBlunt ?? float.NegativeInfinity;
  84.                         case 7:
  85.                             return this.armorHeat ?? float.NegativeInfinity;
  86.                         case 8:
  87.                             return this.insulationCold ?? float.NegativeInfinity;
  88.                         case 9:
  89.                             return this.insulationHeat ?? float.NegativeInfinity;
  90.                         case 10:
  91.                             return this.damageSharp ?? float.NegativeInfinity;
  92.                         case 11:
  93.                             return this.damageBlunt ?? float.NegativeInfinity;
  94.                         default:
  95.                             return 0;
  96.                     }
  97.                 }
  98.             }
  99.         }
  100.  
  101.         public override Vector2 RequestedTabSize => new Vector2(1200f, 750f);
  102.  
  103.         private static readonly string[] Headers = new string[] {
  104.             "", "", "", "", "",
  105.             "Armor:", "", "",
  106.             "Insulation:", "",
  107.             "Damage:", "",
  108.         };
  109.         private static readonly string[] Keys = new string[] {
  110.             "Name:", "Count:", "Value:", "Mass:", "Flamm.:",
  111.             "Sharp:", "Blunt:", "Heat:",
  112.             "Cold:", "Hot:",
  113.             "Sharp:", "Blunt:",
  114.         };
  115.        
  116.         private readonly Dictionary<string, List<Datum>> thingsInCategories;
  117.         private readonly Dictionary<string, int> categoriesSortedBy = new Dictionary<string, int> {
  118.             { "All Stuff", -1 },
  119.             { "Apparell Stuff", -1 },
  120.             { "Building Stuff", -1 },
  121.             { "Fabric", -1 },
  122.             { "Leathery", -1 },
  123.             { "Metallic", -1 },
  124.             { "Stony", -1 },
  125.             { "Woody", -1 },
  126.         };
  127.  
  128.         private static void InsertionSort(List<Datum> list, int index) {
  129.             var count = list.Count;
  130.             for (var j = 1; j < count; j++) {
  131.                 var tmp = list[j];
  132.                 var key = tmp[index];
  133.                 var i = j - 1;
  134.                 for (; i >= 0 && list[i][index] < key; i--) {
  135.                     list[i + 1] = list[i];
  136.                 }
  137.                 list[i + 1] = tmp;
  138.             }
  139.         }
  140.  
  141.         private Vector2 verticalScrollPosition;
  142.         private string selectedCategory = "All Stuff";
  143.         private int sortBy = 0;
  144.  
  145.         public TextileStatsWindow() {
  146.             var allStuff = new List<Datum>();
  147.             var apparellStuff = new List<Datum>();
  148.             var buildingStuff = new List<Datum>();
  149.             this.thingsInCategories = new Dictionary<string, List<Datum>> {
  150.                 { "All Stuff", allStuff },
  151.                 { "Apparell Stuff", apparellStuff },
  152.                 { "Building Stuff", buildingStuff },
  153.                
  154.                 { "Fabric", new List<Datum>() },
  155.                 { "Leathery", new List<Datum>() },
  156.                 { "Metallic", new List<Datum>() },
  157.                 { "Stony", new List<Datum>() },
  158.                 { "Woody", new List<Datum>() },
  159.             };
  160.             var extraCategories = new Dictionary<string, List<Datum>[]> {
  161.                 { "Fabric", new List<Datum>[]{ apparellStuff } },
  162.                 { "Leathery", new List<Datum>[]{ apparellStuff } },
  163.                 { "Metallic", new List<Datum>[]{ buildingStuff } },
  164.                 { "Stony", new List<Datum>[]{ buildingStuff } },
  165.                 { "Woody", new List<Datum>[]{ buildingStuff } },
  166.             };
  167.  
  168.             foreach (var thingDef in DefDatabase<ThingDef>.AllDefs) {
  169.                 var stuffProps = thingDef.stuffProps;
  170.                 if (stuffProps is null) {
  171.                     continue;
  172.                 }
  173.  
  174.                 var statBases = thingDef.statBases;
  175.                 if (statBases is null || statBases.Count == 0) {
  176.                     continue;
  177.                 }
  178.  
  179.                 var categories = stuffProps.categories;
  180.                 if (categories is null) {
  181.                     continue;
  182.                 }
  183.  
  184.                 foreach (var category in categories) {
  185.                     var defName = category.defName;
  186.                     if (this.thingsInCategories.TryGetValue(defName, out var stuffCat)) {
  187.                         var datum = new Datum(thingDef);
  188.                         allStuff.Add(datum);
  189.                         stuffCat.Add(datum);
  190.                         if (extraCategories.TryGetValue(defName, out var extraCats)) {
  191.                             foreach (var extraCat in extraCats) {
  192.                                 extraCat.Add(datum);
  193.                             }
  194.                         }
  195.                         break;
  196.                     }
  197.                 }
  198.             }
  199.         }
  200.  
  201.         private Action SelectCategoryAction(string k) {
  202.             return () => {
  203.                 this.selectedCategory = k;
  204.             };
  205.         }
  206.  
  207.         public override void DoWindowContents(Rect inRect) {
  208.             Text.Font = GameFont.Small;
  209.             Text.Anchor = TextAnchor.MiddleLeft;
  210.             try {
  211.                 var mainRect = new Rect(inRect);
  212.                 {
  213.                     var rect = new Rect(mainRect.x, mainRect.y, 80 * 2, 32f);
  214.                     var options = new List<DropdownMenuElement<object>>();
  215.                     foreach (var key in this.thingsInCategories.Keys) {
  216.                         var menuElement = new DropdownMenuElement<object>();
  217.                         menuElement.option = new FloatMenuOption($"{key} ({this.thingsInCategories[key].Count})", this.SelectCategoryAction(key));
  218.                         options.Add(menuElement);
  219.                     }
  220.                     Dropdown(
  221.                         rect: rect,
  222.                         target: (object) null,
  223.                         getPayload: (object _null) => (object) null,
  224.                         menuGenerator: (object _null) => options,
  225.                         buttonLabel: $"{this.selectedCategory} ({this.thingsInCategories[this.selectedCategory].Count})"
  226.                     );
  227.                 }
  228.                 {
  229.                     var rect = new Rect(mainRect.x + 70, mainRect.y + 1 * 22, 80 * 2, 22f);
  230.                     foreach (var (h, j) in Headers.Select((k, j) => (k, j))) {
  231.                         if (h.Count() > 0) {
  232.                             Label(rect, Headers[j]);
  233.                         }
  234.                         rect.x += j > 0 ? 80 : 196;
  235.                     }
  236.                 }
  237.                 {
  238.                     Text.Anchor = TextAnchor.MiddleCenter;
  239.                     var rect = new Rect(mainRect.x + 70, mainRect.y + 2 * 22, 74, 22f);
  240.                     foreach (var (k, j) in Keys.Select((k, j) => (k, j))) {
  241.                         DrawHighlightIfMouseover(rect);
  242.  
  243.                         Texture2D image = null;
  244.                         if (j == this.sortBy) {
  245.                             image = j > 0 ? TexUI.ArrowTexRight : TexUI.ArrowTexLeft;
  246.                         } else if ((j | 0x100) == this.sortBy) {
  247.                             image = j > 0 ? TexUI.ArrowTexLeft : TexUI.ArrowTexRight;
  248.                         }
  249.                         if (image != null) {
  250.                             Color tmpColor = GUI.color;
  251.                             try {
  252.                                 var r = new Rect(rect.x + (70 - 22 * 2) / 2, rect.y, 22 * 2, 22);
  253.                                 GUI.color = new Color(106f / 106f, 81f / 106f, 46f / 106f, 1f);
  254.                                 GUI.DrawTexture(r, image);
  255.                                 DrawShadowAround(r);
  256.                             } finally {
  257.                                 GUI.color = tmpColor;
  258.                             }
  259.                         }
  260.  
  261.                         Label(rect, k);
  262.                         if (ButtonInvisible(rect)) {
  263.                             if (this.sortBy != j) {
  264.                                 this.sortBy = j;
  265.                             } else {
  266.                                 this.sortBy = j | 0x100;
  267.                             }
  268.                         }
  269.                        
  270.                         rect.x += j > 0 ? 80 : 196;
  271.                     }
  272.                     Text.Anchor = TextAnchor.MiddleLeft;
  273.                 }
  274.  
  275.                 var thingsInCategory = this.thingsInCategories[this.selectedCategory];
  276.                 if (this.categoriesSortedBy[this.selectedCategory] != this.sortBy) {
  277.                     this.categoriesSortedBy[this.selectedCategory] = this.sortBy;
  278.                     thingsInCategory.SortBy((Datum datum) => datum.label);
  279.                     if (this.sortBy != 0) {
  280.                         InsertionSort(thingsInCategory, this.sortBy & 0xff);
  281.                     }
  282.                     if (this.sortBy >= 0x100) {
  283.                         thingsInCategory.Reverse();
  284.                     }
  285.                 }
  286.  
  287.                 mainRect.y += 22 * 3;
  288.                 mainRect.height -= 22 * 3;
  289.                 var viewRect = new Rect(0, 0, mainRect.width - 16f, thingsInCategory.Count * 32f + 6f);
  290.                 BeginScrollView(mainRect, ref this.verticalScrollPosition, viewRect);
  291.                 try {
  292.                     foreach (var (datum, i) in thingsInCategory.Select((d, i) => (d, i))) {
  293.                         Text.Anchor = TextAnchor.MiddleLeft;
  294.  
  295.                         var slotRect = new Rect(0, i * 32f, viewRect.width, 32f);
  296.                         if (i % 2 == 0) {
  297.                             DrawLightHighlight(slotRect);
  298.                         }
  299.                         DrawHighlightIfMouseover(slotRect);
  300.  
  301.                         var imageRect = new Rect(0f, slotRect.y, 32f, 32f);
  302.                         ThingIcon(imageRect, datum.thingDef);
  303.                         InfoCardButton(slotRect.x + imageRect.width + 5, slotRect.y, datum.thingDef);
  304.  
  305.                         var labelRect = new Rect(slotRect.x + imageRect.width + 35, slotRect.y, 140, 32);
  306.                         Label(labelRect, datum.label);
  307.  
  308.                         foreach (var (s, j) in datum.FormattedStrings().Select((s, j) => (s, j))) {
  309.                             var valueRect = new Rect(labelRect.x + 200 + 80 * j, labelRect.y, 74, 32);
  310.                             Label(valueRect, s ?? "\u2007\u2007\u2007\u2014");
  311.                         }
  312.                     }
  313.                 } finally {
  314.                     EndScrollView();
  315.                 }
  316.             } finally {
  317.                 Text.Anchor = TextAnchor.UpperLeft;
  318.             }
  319.         }
  320.     }
  321. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top