private void DrawTradeableLabels(Rect rowRect, ThingEntry entry)
        {
            var trade = entry.tradeable;

            if (!trade.HasAnyThing)
            {
                return;
            }

            if (Mouse.IsOver(rowRect))
            {
                Widgets.DrawHighlight(rowRect);
            }

            var thingIconArea = new Rect(0f, 0f, 27f, 27f);

            Widgets.ThingIcon(thingIconArea, trade.AnyThing);
            Widgets.InfoCardButton(40f, 0f, trade.AnyThing);

            Text.Anchor   = TextAnchor.MiddleLeft;
            Text.WordWrap = false;
            var itemLabelArea = new Rect(80f, 0f, rowRect.width - 80f, rowRect.height);

            var itemLabel = trade.LabelCap;

            if (entry.animal)
            {
                itemLabel += " (" + entry.GenderString() + ")";
            }
            else if (entry.type.HasQuality() && itemLabel.IndexOf("(normal)", StringComparison.Ordinal) != -1)
            {
                itemLabel = itemLabel.Substring(0, itemLabel.IndexOf("(normal)", StringComparison.Ordinal));
            }

            Widgets.Label(itemLabelArea, itemLabel);

            Text.WordWrap = true;
            Transferable localTrad = trade;

            TooltipHandler.TipRegion(
                rowRect,
                new TipSignal(
                    () =>
            {
                if (!localTrad.HasAnyThing)
                {
                    return(string.Empty);
                }

                var text           = trade.LabelCap;
                var tipDescription = localTrad.TipDescription;
                if (!tipDescription.NullOrEmpty())
                {
                    text = text + ": " + tipDescription;
                }

                return(text);
            },
                    localTrad.GetHashCode()));
        }
示例#2
0
        public ThingEntry Clone()
        {
            var cloned = new ThingEntry
            {
                def       = def,
                stuffDef  = stuffDef,
                gender    = gender,
                tradeable = tradeable == null
                    ? null
                    : new Tradeable(tradeable.FirstThingColony, tradeable.FirstThingTrader),
                thing            = thing,
                pawnDef          = pawnDef,
                type             = type,
                stackSize        = stackSize,
                cost             = cost,
                color            = color,
                stacks           = stacks,
                gear             = gear,
                animal           = animal,
                label            = label,
                hideFromPortrait = hideFromPortrait
            };

            return(cloned);
        }
示例#3
0
 private void AddRecordIfNotThereAlready(ThingKey key, ThingEntry record)
 {
     if (!entries.TryGetValue(key, out _))
     {
         entries[key] = record;
     }
 }
 private bool isBuyableItem(ThingEntry entry)
 {
     if (entry.animal)
     {
         return(!RestrictedItems.Contains(entry.pawnDef));
     }
     return(!RestrictedItems.Contains(entry.def));
 }
示例#5
0
        public ThingEntry AddThingDefWithStuff(ThingDef def, ThingDef stuff, ThingType type)
        {
            ThingKey   key   = new ThingKey(def, stuff);
            ThingEntry entry = CreateThingEntry(def, stuff, type);

            if (entry != null)
            {
                AddRecordIfNotThereAlready(key, entry);
            }
            return(entry);
        }
示例#6
0
 protected bool AddRecordIfNotThereAlready(ThingKey key, ThingEntry record)
 {
     if (entries.TryGetValue(key, out ThingEntry value))
     {
         return(false);
     }
     else
     {
         entries[key] = record;
         return(true);
     }
 }
示例#7
0
 protected void AddThingDef(ThingDef def, ThingType type)
 {
     if (def.MadeFromStuff)
     {
         foreach (var s in stuff)
         {
             if (s.stuffProps.CanMake(def))
             {
                 ThingKey   key   = new ThingKey(def, s);
                 ThingEntry entry = CreateThingEntry(def, s, type);
                 if (entry != null)
                 {
                     AddRecordIfNotThereAlready(key, entry);
                 }
             }
         }
     }
     else if (def.race != null && def.race.Animal)
     {
         if (def.race.hasGenders)
         {
             ThingEntry femaleEntry = CreateThingEntry(def, Gender.Female, type);
             if (femaleEntry != null)
             {
                 AddRecordIfNotThereAlready(new ThingKey(def, Gender.Female), femaleEntry);
             }
             ThingEntry maleEntry = CreateThingEntry(def, Gender.Male, type);
             if (maleEntry != null)
             {
                 AddRecordIfNotThereAlready(new ThingKey(def, Gender.Male), maleEntry);
             }
         }
         else
         {
             ThingKey   key   = new ThingKey(def, Gender.None);
             ThingEntry entry = CreateThingEntry(def, Gender.None, type);
             if (entry != null)
             {
                 AddRecordIfNotThereAlready(key, entry);
             }
         }
     }
     else
     {
         ThingKey   key   = new ThingKey(def, null);
         ThingEntry entry = CreateThingEntry(def, null, Gender.None, type);
         if (entry != null)
         {
             AddRecordIfNotThereAlready(key, entry);
         }
     }
 }
示例#8
0
        public double CalculateThingCost(ThingKey thingKey)
        {
            ThingEntry entry = ThingDatabase.Instance.LookupThingEntry(thingKey);

            if (entry != null)
            {
                return(entry.cost);
            }
            else
            {
                return(0);
            }
        }
        // MAYBE TODO?: if goodwill > 80 should have change of having more advanced items (some chance
        //   of containing any number of restricted item on the restricted list)
        private void DetermineAllRequestableItems()
        {
            if (!ThingDatabase.Instance.Loaded)
            {
                return;
            }

            List <ThingEntry> thingEntries = (from x in ThingDatabase.Instance.AllThings()
                                              where hasMaximumTechLevel(x, faction.def.techLevel)
                                              where isBuyableItem(x)
                                              select x).ToList();

            foreach (ThingEntry originalEntry in thingEntries)
            {
                ThingEntry thingEntry = originalEntry.Clone();
                if (thingEntry.pawnDef != null)
                {
                    Pawn      pawn = thingEntry.thing as Pawn;
                    Tradeable trad = new Tradeable(pawn, pawn);
                    trad.thingsColony    = new List <Thing>();
                    thingEntry.tradeable = trad;
                    allRequestableItems.Add(thingEntry);
                }
                else
                {
                    Thing thing = thingEntry.thing;
                    thing.stackCount = int.MaxValue;
                    Tradeable trad = new Tradeable(thing, thing);
                    if (!trad.IsCurrency)
                    {
                        trad.thingsColony = new List <Thing>();
                        string key = thing.def.label;
                        if (key != null)
                        {
                            if (thing.Stuff != null)
                            {
                                key += thing.Stuff.label;
                            }
                            if (colonyItemCount.ContainsKey(key))
                            {
                                Thing colonyThing = ThingMaker.MakeThing(thing.def, thing.Stuff);
                                colonyThing.stackCount = colonyItemCount[key];
                                trad.thingsColony.Add(colonyThing);
                            }
                        }
                        thingEntry.tradeable = trad;
                        allRequestableItems.Add(thingEntry);
                    }
                }
            }
        }
        private bool hasMaximumTechLevel(ThingEntry entry, TechLevel tLevel)
        {
            if (entry.def.techLevel > tLevel)
            {
                return(false);
            }

            if (RestrictedItems.researchTechCache.ContainsKey(entry.def) &&
                RestrictedItems.researchTechCache[entry.def] > tLevel)
            {
                return(false);
            }

            if ((entry.def.intricate || entry.def.thingCategories?.Contains(ThingCategoryDefOf.Techprints) == true) &&
                tLevel < TechLevel.Industrial)
            {
                return(false);
            }

            if (entry.def.thingClass == typeof(Building) &&
                (!entry.def.Minifiable || entry.def.designationCategory == null))
            {
                return(false);
            }

            if (entry.def.destroyOnDrop || entry.def.menuHidden)
            {
                return(false);
            }

            return(true);

            /*
             *          var lvl = (int)entry.def.techLevel;
             *
             *          // there's probably a better way to test for an advanced component but oh well
             *          if (entry.thing.def.label == "advanced component" && (int)tLevel < (int)TechLevel.Industrial)
             *          {
             *              return false;
             *          }
             *
             *          if (lvl > 1)
             *          {
             *              // Current tech level or one level beneath
             *              return lvl <= (int)tLevel && lvl >= (int)tLevel - 1;
             *          }
             *
             *          return lvl <= (int)tLevel;
             */
        }
示例#11
0
        private bool hasMaximumTechLevel(ThingEntry entry, TechLevel tLevel)
        {
            int lvl = (int)entry.def.techLevel;

            // there's probably a better way to test for an advanced component but oh well
            if (entry.thing.def.label == "advanced component" && (int)tLevel < (int)TechLevel.Industrial)
            {
                return(false);
            }

            if (lvl > 1)
            {
                // Current tech level or one level beneath
                return(lvl <= (int)tLevel && lvl >= ((int)tLevel) - 1);
            }
            return(lvl <= (int)tLevel);
        }
示例#12
0
        public void AdjustItemRequest(ThingType thingTypeFilter, ThingEntry entry, int numRequested, float price)
        {
            int key = entry.tradeable.GetHashCode();

            if (requestedItems[thingTypeFilter].dict.ContainsKey(key))
            {
                int amount = Mathf.Max(numRequested, 0);
                if (amount == 0)
                {
                    //Log.Message("Requested: " + numRequested.ToString());
                    //Log.Message(requestedItems[thingTypeFilter].Count.ToString() + " items in current filter");
                    requestedItems[thingTypeFilter].dict.Remove(key);
                    //Log.Message("Colony just removed request for " + entry.tradeable.ThingDef.LabelCap);
                }
                else if (amount == requestedItems[thingTypeFilter].dict[key].amount)
                {
                    return;
                }
                else
                {
                    requestedItems[thingTypeFilter].dict[key] = new RequestItem
                    {
                        item         = entry,
                        amount       = amount,
                        pricePerItem = price,
                        isPawn       = entry.pawnDef != null
                    };
                    //Log.Message("Colony just adjusted request for " + entry.tradeable.ThingDef.LabelCap + " to " + numRequested);
                }
            }
            else if (numRequested > 0)
            {
                requestedItems[thingTypeFilter].dict[key] = new RequestItem
                {
                    item         = entry,
                    amount       = numRequested,
                    pricePerItem = price,
                    isPawn       = entry.pawnDef != null
                };
                //Log.Message("Colony just requested " + entry.tradeable.ThingDef.LabelCap + " x" + numRequested + (entry.pawnDef != null ? " (" + entry.gender + ")" : ""));
            }
        }
示例#13
0
        public ThingEntry Clone()
        {
            ThingEntry cloned = new ThingEntry();

            cloned.def       = def;
            cloned.stuffDef  = stuffDef;
            cloned.gender    = gender;
            cloned.tradeable = tradeable == null ?
                               null :
                               new Tradeable(tradeable.FirstThingColony, tradeable.FirstThingTrader);
            cloned.thing            = thing;
            cloned.pawnDef          = pawnDef;
            cloned.type             = type;
            cloned.stackSize        = stackSize;
            cloned.cost             = cost;
            cloned.color            = color;
            cloned.stacks           = stacks;
            cloned.gear             = gear;
            cloned.animal           = animal;
            cloned.label            = label;
            cloned.hideFromPortrait = hideFromPortrait;
            return(cloned);
        }
示例#14
0
        private void FilterRequestableItems()
        {
            if (!ThingDatabase.Instance.Loaded)
            {
                return;
            }

            filteredRequestableItems.Clear();
            List <ThingEntry> thingEntries = (from x in ThingDatabase.Instance.AllThingsOfType(thingTypeFilter)
                                              where hasMaximumTechLevel(x, faction.def.techLevel)
                                              select x).ToList();

            foreach (ThingEntry thingEntry in thingEntries)
            {
                if (thingEntry.def == ThingDefOf.Silver)
                {
                    continue;
                }
                ThingEntry foundEntry = GetTradeableThingEntry(thingEntry.thing);
                if (foundEntry == null)
                {
                    //Log.Warning("Could not find matching TradeableThingEntry for " + thingEntry.Label);
                    continue;
                }
                else
                {
                    bool madeOfRightStuff = stuffTypeFilter == null || foundEntry.tradeable.FirstThingTrader.Stuff == stuffTypeFilter;
                    if (madeOfRightStuff)
                    {
                        filteredRequestableItems.Add(foundEntry);
                    }
                }
            }

            //Log.Message("There are " + filteredRequestableItems.Count.ToString() + " requestable items to show for filter " +
            //    thingTypeFilter.ToString() + " and for stuff " + (stuffTypeFilter == null ? " all" : stuffTypeFilter.LabelCap));
        }
        private void DrawTradeableRow(Rect rowRect, ThingEntry entry, int index)
        {
            if (index % 2 == 1)
            {
                Widgets.DrawLightHighlight(rowRect);
            }

            var trade = entry.tradeable;

            // Begin Row group
            GUI.BeginGroup(rowRect);
            float x = 0; // starting from left

            // Draw item icon and info icon
            Text.Anchor = TextAnchor.MiddleLeft;
            var idRect = new Rect(x, 0, iconNameAreaWidth, rowRect.height);

            TransferableUIUtility.DoExtraAnimalIcons(trade, rowRect, ref x);
            DrawTradeableLabels(idRect, entry);

            x += iconNameAreaWidth;

            // Draw the price for requesting the item
            var priceTextArea = new Rect(x, 0, priceTextAreaWidth, rowRect.height);
            var price         = DrawPrice(priceTextArea, trade);

            x += priceTextAreaWidth;

            // Draw the number the colony currently has, if any
            var countHeldBy = trade.CountHeldBy(Transactor.Colony);

            if (countHeldBy != 0)
            {
                var colonyItemCountArea = new Rect(x, 0, colonyItemCountAreaWidth, rowRect.height);
                if (Mouse.IsOver(colonyItemCountArea))
                {
                    Widgets.DrawHighlight(colonyItemCountArea);
                }

                var paddedRect = colonyItemCountArea;
                paddedRect.xMin += 5f;
                paddedRect.xMax -= 5f;
                Widgets.Label(paddedRect, countHeldBy.ToStringCached());
                TooltipHandler.TipRegion(colonyItemCountArea, colonyCountTooltipText);
            }

            // Draw the input box to select number of requests
            var countAdjustInterfaceRect    = new Rect(rightAlignOffset, 0, rightContentSize, rowRect.height);
            var interactiveNumericFieldArea = new Rect(countAdjustInterfaceRect.center.x - 45f,
                                                       countAdjustInterfaceRect.center.y - 12.5f, 90f, 25f).Rounded();
            var paddedNumericFieldArea = interactiveNumericFieldArea.ContractedBy(2f);

            paddedNumericFieldArea.xMax -= 15f;
            paddedNumericFieldArea.xMin += 16f;

            if (requestSession?.deal != null)
            {
                var amountRequested = requestSession.deal.GetCountForItem(thingTypeFilter, trade);
                var amountAsString  = amountRequested.ToString();
                Widgets.TextFieldNumeric(paddedNumericFieldArea, ref amountRequested, ref amountAsString, 0,
                                         float.MaxValue);
                requestSession.deal.AdjustItemRequest(thingTypeFilter, entry, amountRequested, price);

                // Draw the reset to zero button by input field
                if (amountRequested > 0)
                {
                    var resetToZeroButton = interactiveNumericFieldArea;
                    resetToZeroButton.x    -= resetItemCountAreaWidth - 5;
                    resetToZeroButton.width = resetItemCountAreaWidth;
                    if (Widgets.ButtonText(resetToZeroButton, "0"))
                    {
                        requestSession.deal.AdjustItemRequest(thingTypeFilter, entry, 0, price);
                    }
                }
            }

            // End Row group
            GenUI.ResetLabelAlign();
            GUI.EndGroup();
        }
示例#16
0
        private ThingEntry CreateThingEntry(ThingDef def, ThingDef stuffDef, Gender gender, ThingType type)
        {
            var baseCost = costs.GetBaseThingCost(def, stuffDef);

            if (baseCost == 0)
            {
                return(null);
            }

            var stackSize = CalculateStackCount();

            var result = new ThingEntry
            {
                type      = type,
                def       = def,
                stuffDef  = stuffDef,
                stackSize = stackSize,
                cost      = costs.CalculateStackCost(def, stuffDef, baseCost),
                stacks    = true,
                gear      = false,
                animal    = false
            };

            if (def.MadeFromStuff && stuffDef != null)
            {
                if (stuffDef.stuffProps.allowColorGenerators &&
                    (def.colorGenerator != null || def.colorGeneratorInTraderStock != null))
                {
                    if (def.colorGenerator != null)
                    {
                        result.color = def.colorGenerator.NewRandomizedColor();
                    }
                    else if (def.colorGeneratorInTraderStock != null)
                    {
                        result.color = def.colorGeneratorInTraderStock.NewRandomizedColor();
                    }
                }
                else
                {
                    result.color = stuffDef.stuffProps.color;
                }
            }
            else
            {
                result.color = def.graphicData?.color ?? Color.white;
            }

            if (def.apparel != null)
            {
                result.stacks = false;
                result.gear   = true;
            }

            if (def.weaponTags != null && def.weaponTags.Count > 0)
            {
                result.stacks = false;
                result.gear   = true;
            }

            if (def.thingCategories != null)
            {
                if (def.thingCategories.SingleOrDefault(d => d.defName == "FoodMeals") != null)
                {
                    result.gear = true;
                }

                if (def.thingCategories.SingleOrDefault(d => d.defName == "Medicine") != null)
                {
                    result.gear = true;
                }
            }

            if (def.defName == "Apparel_PersonalShield")
            {
                result.hideFromPortrait = true;
            }

            if (def.race != null && def.race.Animal)
            {
                result.animal = true;
                result.gender = gender;
                try
                {
                    var pawn = CreatePawn(def, gender);
                    if (pawn == null)
                    {
                        return(null);
                    }

                    result.thing   = pawn;
                    result.pawnDef = pawn.kindDef;
                }
                catch (Exception)
                {
                    Log.Warning("Failed to create a pawn for animal thing entry: " + def.defName);
                    //Log.Message("  Exception message: " + e);
                    return(null);
                }
            }

            result.thing ??= ThingMaker.MakeThing(def, stuffDef);
            return(result);
        }
示例#17
0
 public static string GenderString(this ThingEntry entry)
 {
     return(entry.gender.ToString().ToLower());
 }