public Tag GetNextPoopEntry()
 {
     for (int i = 0; i < caloriesConsumed.Count; i++)
     {
         CaloriesConsumedEntry caloriesConsumedEntry = caloriesConsumed[i];
         if (!(caloriesConsumedEntry.calories <= 0f))
         {
             Diet.Info dietInfo = diet.GetDietInfo(caloriesConsumedEntry.tag);
             if (dietInfo != null && !(dietInfo.producedElement == Tag.Invalid))
             {
                 return(dietInfo.producedElement);
             }
         }
     }
     return(Tag.Invalid);
 }
        public float GetTotalConsumedCalories()
        {
            float num = 0f;

            foreach (CaloriesConsumedEntry item in caloriesConsumed)
            {
                CaloriesConsumedEntry current = item;
                if (!(current.calories <= 0f))
                {
                    Diet.Info dietInfo = diet.GetDietInfo(current.tag);
                    if (dietInfo != null && !(dietInfo.producedElement == Tag.Invalid))
                    {
                        num += current.calories;
                    }
                }
            }
            return(num);
        }
        public void Consume(Tag tag, float calories)
        {
            for (int i = 0; i < caloriesConsumed.Count; i++)
            {
                CaloriesConsumedEntry value = caloriesConsumed[i];
                if (value.tag == tag)
                {
                    value.calories     += calories;
                    caloriesConsumed[i] = value;
                    return;
                }
            }
            CaloriesConsumedEntry item = default(CaloriesConsumedEntry);

            item.tag      = tag;
            item.calories = calories;
            caloriesConsumed.Add(item);
        }
        public void Poop()
        {
            float num         = 0f;
            Tag   tag         = Tag.Invalid;
            byte  disease_idx = byte.MaxValue;
            int   num2        = 0;
            bool  flag        = false;

            for (int i = 0; i < caloriesConsumed.Count; i++)
            {
                CaloriesConsumedEntry value = caloriesConsumed[i];
                if (!(value.calories <= 0f))
                {
                    Diet.Info dietInfo = diet.GetDietInfo(value.tag);
                    if (dietInfo != null && (!(tag != Tag.Invalid) || !(tag != dietInfo.producedElement)))
                    {
                        num                += dietInfo.ConvertConsumptionMassToProducedMass(dietInfo.ConvertCaloriesToConsumptionMass(value.calories));
                        tag                 = dietInfo.producedElement;
                        disease_idx         = dietInfo.diseaseIdx;
                        num2                = (int)(dietInfo.diseasePerKgProduced * num);
                        value.calories      = 0f;
                        caloriesConsumed[i] = value;
                        flag                = (flag || dietInfo.produceSolidTile);
                    }
                }
            }
            if (!(num <= 0f) && !(tag == Tag.Invalid))
            {
                Element element = ElementLoader.GetElement(tag);
                Debug.Assert(element != null, "TODO: implement non-element tag spawning");
                int   num3        = Grid.PosToCell(owner.transform.GetPosition());
                float temperature = owner.GetComponent <PrimaryElement>().Temperature;
                if (element.IsLiquid)
                {
                    FallingWater.instance.AddParticle(num3, element.idx, num, temperature, disease_idx, num2, true, false, false, false);
                }
                else if (element.IsGas)
                {
                    SimMessages.AddRemoveSubstance(num3, element.idx, CellEventLogger.Instance.ElementConsumerSimUpdate, num, temperature, disease_idx, num2, true, -1);
                }
                else if (flag)
                {
                    Facing component = owner.GetComponent <Facing>();
                    int    num4      = component.GetFrontCell();
                    if (!Grid.IsValidCell(num4))
                    {
                        Debug.LogWarningFormat("{0} attemping to Poop {1} on invalid cell {2} from cell {3}", owner, element.name, num4, num3);
                        num4 = num3;
                    }
                    SimMessages.AddRemoveSubstance(num4, element.idx, CellEventLogger.Instance.ElementConsumerSimUpdate, num, temperature, disease_idx, num2, true, -1);
                }
                else
                {
                    element.substance.SpawnResource(Grid.CellToPosCCC(num3, Grid.SceneLayer.Ore), num, temperature, disease_idx, num2, false, false, false);
                }
                KPrefabID component2 = owner.GetComponent <KPrefabID>();
                if (!Game.Instance.savedInfo.creaturePoopAmount.ContainsKey(component2.PrefabTag))
                {
                    Game.Instance.savedInfo.creaturePoopAmount.Add(component2.PrefabTag, 0f);
                }
                Dictionary <Tag, float> creaturePoopAmount;
                Tag prefabTag;
                (creaturePoopAmount = Game.Instance.savedInfo.creaturePoopAmount)[prefabTag = component2.PrefabTag] = creaturePoopAmount[prefabTag] + num;
                PopFXManager.Instance.SpawnFX(PopFXManager.Instance.sprite_Resource, element.name, owner.transform, 1.5f, false);
            }
        }