public static void AddInventory(Colony colony, ushort type, int amount)
        {
            ColonyStatistics    stats     = Statistics.GetColonyStats(colony);
            TimedItemStatistics itemStats = stats.GetTimedItemStats(type);

            itemStats.AddInventory(amount);

            RemoveConsumerAddProducer(itemStats, ScientistJobSettingsHookOnNPCAtJob.npc, amount);
            RemoveConsumerAddProducer(itemStats, GuardJobSettingsHookShootAtTarget.npc, amount);
            RemoveConsumerAddProducer(itemStats, BlockFarmAreaJobHookOnNPCAtJob.npc, amount);
            RemoveConsumerAddProducer(itemStats, FarmAreaJobHookOnNPCAtJob.npc, amount);
            RemoveConsumerAddProducer(itemStats, BuilderBasicHookDoJob.npc, amount);
            RemoveConsumerAddProducer(itemStats, ColonyShopVisitTrackerHookOnVisit.npc, amount);
            RemoveConsumerAddProducer(itemStats, AbstractAreaJobHookOnNPCAtStockpile.npc, amount);

            if (ColonyShopVisitTrackerHookOnVisit.isFood)
            {
                // wonder if this gets ever called ? It shouldn't though
                itemStats.UseAsFood(-amount);
            }

            if (RuleHookTryExecute.trading)
            {
                itemStats.TradeIn(amount);
            }
        }
        public static void RemoveInventory(Colony colony, ushort type, int amount)
        {
            ColonyStatistics    stats     = Statistics.GetColonyStats(colony);
            TimedItemStatistics itemStats = stats.GetTimedItemStats(type);

            itemStats.RemoveInventory(amount);

            AddConsumerRemoveProducer(itemStats, ScientistJobSettingsHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, GuardJobSettingsHookShootAtTarget.npc, amount);
            AddConsumerRemoveProducer(itemStats, BlockFarmAreaJobHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, FarmAreaJobHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, BuilderBasicHookDoJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, ColonyShopVisitTrackerHookOnVisit.npc, amount);
            AddConsumerRemoveProducer(itemStats, AbstractAreaJobHookOnNPCAtStockpile.npc, amount);

            if (ColonyShopVisitTrackerHookOnVisit.isFood)
            {
                itemStats.UseAsFood(amount);
            }

            if (RuleHookTryExecute.trading)
            {
                itemStats.TradeOut(amount);
            }
        }
        static void PrintStatistic(ConstructTooltipUIData data, ItemStatistics stat, bool allTime)
        {
            string span;

            if (!allTime)
            {
                span = "Last " + new TimeSpan(TimedItemStatistics.PeriodsToGameHours(stat.Periods), 0, 0).ToHumanReadableString() + " average:";
            }
            else
            {
                span = "Since world load:";
            }

            data.menu.Items.Add(new Line(Color.white, 2, -1, 10, 2));

            data.menu.Items.Add(new Label(new LabelData(span, TextAnchor.MiddleLeft, 17, LabelData.ELocalizationType.Sentence), -1));
            data.menu.Items.Add(new Label(new LabelData("Created " + PrintSingleStat(stat.AverageProduced) + ", Used " + PrintSingleStat(stat.AverageConsumed), TextAnchor.MiddleLeft, 13, LabelData.ELocalizationType.Sentence), -1));
            data.menu.Items.Add(new Label(new LabelData(PrintSingleStat(stat.AverageProducers) + " producers, " + PrintSingleStat(stat.AverageConsumers) + " consumers", TextAnchor.MiddleLeft, 13, LabelData.ELocalizationType.Sentence), -1));
            data.menu.Items.Add(new Label(new LabelData("Stock " + PrintSingleStat(stat.AverageInventoryAdded) + " added, " + PrintSingleStat(stat.AverageInventoryRemoved) + " removed", TextAnchor.MiddleLeft, 13, LabelData.ELocalizationType.Sentence), -1));

            if (stat.TradedIn != 0 || stat.TradedOut != 0)
            {
                data.menu.Items.Add(new Label(new LabelData("Trade +" + PrintSingleStat(stat.AverageTradedIn) + " / -" + PrintSingleStat(stat.AverageTradedOut), TextAnchor.MiddleLeft, 13, LabelData.ELocalizationType.Sentence), -1));
            }

            if (stat.UsedForFood != 0)
            {
                data.menu.Items.Add(new Label(new LabelData("Food Use: " + PrintSingleStat(stat.AverageUsedForFood), TextAnchor.MiddleLeft, 13, LabelData.ELocalizationType.Sentence), -1));
            }
        }
        public static void RemoveInventory(Colony colony, ushort type, int amount)
        {
            DebugLog.Write(MethodBase.GetCurrentMethod().DeclaringType + "::" + MethodBase.GetCurrentMethod().Name, "Type: " + type.ToString() + ", Amount: " + amount.ToString());

            ColonyStatistics    stats     = Statistics.GetColonyStats(colony);
            TimedItemStatistics itemStats = stats.GetTimedItemStats(type);

            itemStats.RemoveInventory(amount);

            AddConsumerRemoveProducer(itemStats, ScientistJobSettingsHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, GuardJobSettingsHookShootAtTarget.npc, amount);
            AddConsumerRemoveProducer(itemStats, BlockFarmAreaJobHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, FarmAreaJobHookOnNPCAtJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, BuilderBasicHookDoJob.npc, amount);
            AddConsumerRemoveProducer(itemStats, ColonyShopVisitTrackerHookOnVisit.npc, amount);
            AddConsumerRemoveProducer(itemStats, AbstractAreaJobHookOnNPCAtStockpile.npc, amount);

            if (ItemTypes.GetType(type).ColonyPointsMeal > 0)
            {
                itemStats.UseAsFood(amount);
            }

            if (RuleHookTryExecute.trading)
            {
                itemStats.TradeOut(amount);
            }
        }
        static void RemoveConsumerAddProducer(TimedItemStatistics stats, NPCBase npc, int amount)
        {
            if (stats == null || npc == null || amount == 0)
            {
                return;
            }

            stats.RemoveConsumer(npc.ID);
            stats.AddProducer(npc.ID);
        }
        public TimedItemStatistics GetTimedItemStats(ushort item)
        {
            TimedItemStatistics stats;

            if (!itemStatistics.TryGetValue(item, out stats))
            {
                stats = new TimedItemStatistics();
                itemStatistics.Add(item, stats);
            }
            return(stats);
        }
        public void OnConstructTooltipUI(Players.Player player, ConstructTooltipUIData data)
        {
            if (data.hoverType != ETooltipHoverType.Item)
            {
                return;
            }

            TimedItemStatistics stats = GetColonyStats(player.ActiveColony).GetTimedItemStats(data.hoverItem);

            var statlist = stats.Averages();

            foreach (var stat in statlist)
            {
                PrintStatistic(data, stat, false);
            }

            PrintStatistic(data, stats.AllTimeStatistics, true);
        }
 public ColonyStatistics()
 {
     itemStatistics = new Dictionary <ushort, TimedItemStatistics>();
     npcStatistics  = new TimedItemStatistics();
 }