Skip to content

EA 23.178 Nightly Patch 1

August 13, 2025

21 files modified. 2 new files created. 1 file removed.

Important Changes

Possible breaking changes. Click the filename to view the chunk.

Chara (1)

cs
public Thing MakeLunch() 

ELEMENT (1)

cs
public static SourceElement.Row GetRandomElement(int lv = 1) 
public static SourceElement.Row GetRandomElement(int lv = 1, bool useWeight = true) 

FoodEffect (1)

cs
public static void Proc(Chara c, Thing food) 
public static void Proc(Chara c, Thing food, bool consume = true) 

AI_Eat

public override IEnumerable<Status> Run()

cs
				owner.Say("eat_end", owner, target.GetName(NameStyle.Full, 1));
				owner.ShowEmo(Emo.happy);
				FoodEffect.Proc(owner, target.Thing);
				target.ModNum(-1); 
			}
		}
	}.SetDuration(max, 5);

ActEffect

public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		bool flag3 = false;
		bool flag4 = actRef.n1 == "special";
		int num5 = -1;
		string text = ""; 
		switch (actRef.n1)
		{
		case "shadow":

public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
				continue;
			}
			Chara chara = null;
			CardBlueprint.Set(new CardBlueprint()); 
			if (num5 != -1)
			{
				CardBlueprint.Set(new CardBlueprint
				CardBlueprint.current.lv = num5; 
			} 
			if (!text.IsEmpty()) 
			{ 
				CardBlueprint.current.idEle = text; 
			} 
			switch (actRef.n1) 
			{ 
			case "special": 
				if (j == 0 && !CC.HasMinion("imolonac") && !CC.HasMinion("ygolonac")) 
				{
					lv = num5 
				}); 
					chara = CharaGen.Create((EClass.rnd(20) == 0) ? "imolonac" : "ygolonac"); 
					break; 
				} 
				Debug.Log(CardBlueprint.current.idEle); 
				chara = CharaGen.Create("hound", CC.LV); 
				if (text.IsEmpty()) 
				{ 
					text = chara.MainElement.source.alias; 
				} 
				break; 
			case "yeek":
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_yeek", (SourceChara.Row r) => r.race == "yeek"), power / 10); 
				break; 
			case "orc":
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_orc", (SourceChara.Row r) => r.race == "orc"), power / 10); 
				break; 
			case "pawn":
				chara = CharaGen.CreateFromFilter("c_pawn", power / 10); 
				break; 
			case "monster":
				chara = CharaGen.CreateFromFilter("c_dungeon", power / 10); 
				break; 
			case "animal":
				chara = CharaGen.CreateFromFilter("c_animal", power / 15); 
				break; 
			case "fire":
				chara = CharaGen.CreateFromElement("Fire", power / 10); 
				break; 
			case "fish":
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_fish", (SourceChara.Row r) => r.ContainsTag("water") || r.model.Chara.race.tag.Contains("water")), power / 10); 
				break; 
			case "octopus":
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_octopus", (SourceChara.Row r) => r.race == "octopus"), power / 10); 
				break; 
			default: 
				chara = CharaGen.Create(id3, power / 10); 
				break; 
			}
			chara = actRef.n1 switch
			{ 
				"special" => (j != 0 || CC.HasMinion("imolonac") || CC.HasMinion("ygolonac")) ? CharaGen.Create("hound", 50) : CharaGen.Create((EClass.rnd(20) == 0) ? "imolonac" : "ygolonac"),  
				"yeek" => CharaGen.CreateFromFilter(SpawnListChara.Get("summon_yeek", (SourceChara.Row r) => r.race == "yeek"), power / 10),  
				"orc" => CharaGen.CreateFromFilter(SpawnListChara.Get("summon_orc", (SourceChara.Row r) => r.race == "orc"), power / 10),  
				"pawn" => CharaGen.CreateFromFilter("c_pawn", power / 10),  
				"monster" => CharaGen.CreateFromFilter("c_dungeon", power / 10),  
				"animal" => CharaGen.CreateFromFilter("c_animal", power / 15),  
				"fire" => CharaGen.CreateFromElement("Fire", power / 10),  
				"fish" => CharaGen.CreateFromFilter(SpawnListChara.Get("summon_fish", (SourceChara.Row r) => r.ContainsTag("water") || r.model.Chara.race.tag.Contains("water")), power / 10),  
				"octopus" => CharaGen.CreateFromFilter(SpawnListChara.Get("summon_octopus", (SourceChara.Row r) => r.race == "octopus"), power / 10),  
				_ => CharaGen.Create(id3, power / 10),  
			}; 
			if (chara == null)
			{
				continue;

public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
				continue;
			}
			int num6 = -1;
			num6 = ((!(actRef.n1 == "shadow")) ? (chara.LV * (100 + power / 10) / 100 + power / 30) : (power / 10 + 1)); 
			string n = actRef.n1; 
			if (!(n == "shadow")) 
			{ 
				if (!(n == "special")) 
				{ 
					num6 = chara.LV * (100 + power / 10) / 100 + power / 30; 
				} 
			} 
			else
			{ 
				num6 = power / 10 + 1; 
			} 
			if (chara.LV < num6)
			{
				chara.SetLv(num6);

public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
			{
				chara.c_fur = -1;
			}
			string n = actRef.n1; 
			n = actRef.n1; 
			if (!(n == "shadow"))
			{
				if (n == "special_force")

Affinity

public bool CanInvite()

cs

	public bool CanGiveCard()
	{
		if (!EClass.debug.marryAnytime) 
		{ 
			return CurrentStage >= Stage.Love; 
		} 
		return true; 
		return CurrentStage >= Stage.Love; 
	}

	public bool CanMarry()

public bool CanSleepBeside()

cs
		return true;
	}

	public int GetLunchChance() 
	{ 
		if (!EClass.debug.enable) 
		{ 
			if (CurrentStage < Stage.LoveLoveLove) 
			{ 
				if (CurrentStage < Stage.LoveLove) 
				{ 
					if (CurrentStage < Stage.Love) 
					{ 
						return 0; 
					} 
					return 10; 
				} 
				return 25; 
			} 
			return 50; 
		} 
		return 100; 
	} 
	public Sprite GetIcon()
	{
		int affinity = CC._affinity;

CINT

public class CINT

cs

	public const int dateSpecialSummon = 70;

	public const int dateLunchGift = 71; 
	public const int fiamaPet = 100;

	public const int noRestock = 101;

public class CINT

cs

	public const int price_copy = 124;

	public const int isHalfEaten = 125; 
	public const int dateDeathLock = 130;

	public const int fixedValue = 131;

COBJ

public class COBJ

cs
	public const int corruptionHistory = 16;

	public const int socketList = 17;
	public const int mixedFoodData = 18; 
}

Card

public CharaList c_charaList

cs
		}
	}

	public MixedFoodData c_mixedFoodData 
	{ 
		get 
		{ 
			return GetObj<MixedFoodData>(18); 
		} 
		set 
		{ 
			SetObj(18, value); 
		} 
	} 
	public byte[] c_textureData
	{
		get

public bool IsPowerful

cs
	{
		if (rarity >= Rarity.Legendary || trait is TraitAdventurer)
		{
			return !IsPCFaction; 
			return !IsPCFactionOrMinion; 
		}
		return false;
	}

public Thing TryMakeRandomItem(int lv = -1)

cs
	case "egg_fertilized":
	case "_meat":
	case "meat_marble":
	case "dattamono":
	case "deadbody":
	{
		string text = "c_wilds";
		if (id == "_meat" || id == "meat_marble")

Chara

public override bool isSynced

cs

	public override bool IsMultisize => sourceCard.multisize;

	public override int MaxHP => (int)Mathf.Clamp(((long)(base.END * 2 + base.STR + base.WIL / 2) * (long)Mathf.Min(base.LV, 25) / 25 + base.END + 10) * Evalue(60) / 100 * ((IsPCFaction ? 100 : (100 + (int)base.rarity * 300)) + (IsPC ? (EClass.player.lastEmptyAlly * Evalue(1646)) : 0)) / 100, 1f, 100000000f); 
	public override int MaxHP => (int)Mathf.Clamp(((long)(base.END * 2 + base.STR + base.WIL / 2) * (long)Mathf.Min(base.LV, 25) / 25 + base.END + 10) * Evalue(60) / 100 * ((base.IsPCFactionOrMinion ? 100 : (100 + (int)base.rarity * 300)) + (IsPC ? (EClass.player.lastEmptyAlly * Evalue(1646)) : 0)) / 100, 1f, 100000000f); 

	public override int WeightLimit => Mathf.Max((base.STR * 500 + base.END * 250 + Evalue(207) * 2000) * ((!HasElement(1411)) ? 1 : 5) + 45000, 1000);

public override void OnCreate(int genLv)

cs
		Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / (100 + (_genLv - a.Item3) * 25));
		if (!bp.idEle.IsEmpty())
		{
			tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle).FirstOrDefault() ?? tuple; 
			tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle || "ele" + a.Item1 == bp.idEle).FirstOrDefault() ?? tuple; 
		}
		SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental: true);
		if (list.Count >= 2)

public void RefreshSpeed(Element.BonusInfo info = null)

cs
	{
		ride.RefreshSpeed();
		_Speed = ride._Speed;
		info?.AddText("rideSpeed".lang(_Speed.ToString() ?? "")); 
	}
	else if (host != null)
	{

public void RefreshSpeed(Element.BonusInfo info = null)

cs
	}
	if (parasite != null)
	{
		int speed = _Speed; 
		_Speed = _Speed * 100 / Mathf.Clamp(120 + parasite.LV * 2 - base.STR - Evalue(227) * 2, 100, 1000);
		info?.AddText(_Speed - speed, "parasiteSpeed".lang()); 
	}
	if (_Speed < elements.ValueWithoutLink(79) / 3)
	{

public void ShowDialog()

cs
	{
		RemoveCondition<ConSuspend>();
	}
	if (IsDeadOrSleeping) 
	if (LayerDrama.forceJump == null) 
	{
		ShowDialog("_chara", "sleep"); 
	} 
	else if (EClass.pc.isHidden && !CanSee(EClass.pc)) 
	{ 
		ShowDialog("_chara", "invisible"); 
	} 
	else if (base.isRestrained) 
	{ 
		ShowDialog("_chara", "strain"); 
	} 
	else if (base.IsUnique && !EClass.player.codex.DroppedCard(id) && affinity.CanGiveCard()) 
	{ 
		EClass.player.codex.MarkCardDrop(id); 
		ShowDialog("_chara", "give_card"); 
		Thing thing = ThingGen.Create("figure"); 
		thing.MakeFigureFrom(id); 
		EClass.player.DropReward(thing); 
		thing = ThingGen.Create("figure3"); 
		thing.MakeFigureFrom(id); 
		EClass.player.DropReward(thing); 
	} 
	else if (IsEscorted()) 
	{ 
		ShowDialog("_chara", "escort"); 
	} 
	else if (EClass._zone is Zone_Music) 
	{ 
		ShowDialog("_chara", "party"); 
	} 
	else
	{ 
		if (LayerDrama.forceJump == null && EClass.game.quests.OnShowDialog(this)) 
		if (IsDeadOrSleeping) 
		{ 
			ShowDialog("_chara", "sleep"); 
			return; 
		} 
		if (EClass.pc.isHidden && !CanSee(EClass.pc)) 
		{ 
			ShowDialog("_chara", "invisible"); 
			return; 
		} 
		if (!IsPC && !EClass.player.codex.DroppedCard(id) && affinity.CanGiveCard()) 
		{ 
			EClass.player.codex.MarkCardDrop(id); 
			ShowDialog("_chara", "give_card"); 
			Thing thing = ThingGen.Create("figure"); 
			thing.MakeFigureFrom(id); 
			EClass.player.DropReward(thing); 
			thing = ThingGen.Create("figure3"); 
			thing.MakeFigureFrom(id); 
			EClass.player.DropReward(thing); 
			return; 
		} 
		if (GetInt(71) == -2) 
		{ 
			ShowDialog("_chara", "give_lunch"); 
			Thing t = CraftUtil.MakeLoveLunch(this); 
			EClass.player.DropReward(t); 
			SetInt(71, EClass.world.date.GetRaw() + 43200); 
			return; 
		} 
		if (base.isRestrained) 
		{ 
			ShowDialog("_chara", "strain"); 
			return; 
		} 
		if (IsEscorted()) 
		{ 
			ShowDialog("_chara", "escort"); 
			return; 
		} 
		if (EClass._zone is Zone_Music) 
		{ 
			ShowDialog("_chara", "party"); 
			return; 
		} 
		if (EClass.game.quests.OnShowDialog(this)) 
		{
			return;
		}

public void ShowDialog()

cs
				ShowDialog("guild_clerk", "main", tag2);
				return;
			}
			bool flag = true; 
			if (id == "parttimer_jure" && (!EClass._zone.IsFestival || !(EClass._zone is Zone_Noyel) || EClass.pc.faith == EClass.game.religions.Healing)) 
			{ 
				flag = false; 
			} 
			if (flag && File.Exists(CorePath.DramaData + id + ".xlsx")) 
			{ 
				ShowDialog(id); 
			} 
			else
			{ 
				ShowDialog("_chara"); 
			} 
		} 
		bool flag = true; 
		if (id == "parttimer_jure" && (!EClass._zone.IsFestival || !(EClass._zone is Zone_Noyel) || EClass.pc.faith == EClass.game.religions.Healing)) 
		{ 
			flag = false; 
		} 
		if (flag && File.Exists(CorePath.DramaData + id + ".xlsx")) 
		{ 
			ShowDialog(id); 
		} 
		else
		{ 
			ShowDialog("_chara"); 
		}
	}

public void InstantEat(Thing t = null, bool sound = true)

cs
				PlaySound("eat");
			}
			FoodEffect.Proc(this, t);
			t.ModNum(-1); 
		}
	}

public void ModAffinity(Chara c, int a, bool show = true, bool showOnlyEmo = fal

cs
	if (flag)
	{
		a = a * num / 100;
		if (affinity.GetLunchChance() > EClass.rnd(100) && GetInt(71) >= 0 && GetInt(71) < EClass.world.date.GetRaw()) 
		{ 
			SetInt(71, -1); 
		} 
	}
	if (show)
	{

public SourceThing.Row GetFavFood()

cs
	{
		foreach (SourceThing.Row row in EClass.sources.things.rows)
		{
			if (row._origin == "dish" && row.value != 0) 
			if (row._origin == "dish" && row.value != 0 && row.chance != 0) 
			{
				_listFavFood.Add(row);
			}

public Thing MakeGene(DNA.Type? type = null)

cs
		return DNA.GenerateGene(this, type);
	}

	public Thing MakeLunch() 
	{ 
		Thing thing = ThingGen.Create("lunch_love"); 
		thing.MakeRefFrom(this); 
		return thing; 
	} 
	public Thing MakeBraineCell()
	{
		return DNA.GenerateGene(this, DNA.Type.Brain);

CharaAbility

public class CharaAbility : EClass

cs
		case 5048:
		case 6400:
		case 6410:
		case 6800:
		case 8200:
			continue;
		}

CoreDebug

public void UpdateInput()

cs
		EClass.game.world.date.year = 3000;
		EClass._zone.development += 10;
		EClass._zone.development *= EClass._zone.development;
		EClass.pc.Pick(ThingGen.CreateSpellbook(8550)); 
		EClass.pc.Pick(ThingGen.CreatePotion(8550)); 
		EClass.pc.Pick(ThingGen.CreateSpellbook(9004)); 
		EClass.pc.Pick(ThingGen.CreateRedBook("advweek_1")); 
		Chara targetChara = EClass.scene.mouseTarget.TargetChara;
		if (targetChara != null)
		{
			EClass.pc.Pick(targetChara.MakeLunch()); 
			EClass.pc.Pick(CraftUtil.MakeLoveLunch(targetChara)); 
			EClass.pc.Pick(CraftUtil.MakeDarkSoup()); 
			EClass.pc.Pick(targetChara.MakeMilk());
			EClass.pc.Pick(targetChara.MakeGene());
			EClass.pc.Pick(targetChara.MakeBraineCell());

public void UpdateInput()

cs
		{
			EClass.Branch.ModExp(EClass.Branch.GetNextExp());
		}
		foreach (Chara chara2 in EClass._map.charas) 
		foreach (Chara item in EClass._map.charas.ToList()) 
		{
			chara2.AddExp(chara2.ExpToNext); 
			item.AddExp(item.ExpToNext); 
			item.Vomit(); 
		}
		EClass.pc.PlayEffect("boost");
		EClass.pc.PlaySound("boost");

public void UpdateInput()

cs
	{
		if (Input.GetMouseButtonDown(0))
		{
			foreach (Card item in list) 
			foreach (Card item2 in list) 
			{
				Debug.Log(item.Name + "/" + item.dir + "/" + item.flipX + "/" + item.angle); 
				Debug.Log(item2.Name + "/" + item2.dir + "/" + item2.flipX + "/" + item2.angle); 
			}
		}
		if (Input.GetMouseButtonDown(1))

public void UpdateInput()

cs
		}
		if (key)
		{
			foreach (Card item2 in EClass._map.Roaming.all) 
			foreach (Card item3 in EClass._map.Roaming.all) 
			{
				EClass._zone.RemoveCard(item2); 
				EClass._zone.RemoveCard(item3); 
			}
		}
		else if (hitPoint.detail != null)

public void UpdateInput()

cs
		{
			break;
		}
		foreach (Card item3 in hitPoint.ListCards()) 
		foreach (Card item4 in hitPoint.ListCards()) 
		{
			item3.renderer.PlayAnime(num5.ToEnum<AnimeID>()); 
			item4.renderer.PlayAnime(num5.ToEnum<AnimeID>()); 
		}
		Debug.Log(num5.ToEnum<AnimeID>());
		break;

CraftUtil

public static void MakeDish(Thing food, int lv, Chara crafter = null)

cs
	int num = Mathf.Min(EClass.rnd(lv), 50);
	foreach (Recipe.Ingredient ingredient in recipeSource.GetIngredients())
	{
		Thing thing = ThingGen.Create(ingredient.id); 
		Thing thing = ThingGen.Create(ingredient.id).TryMakeRandomItem(lv); 
		TraitSeed.LevelSeed(thing, null, EClass.rnd(lv / 4) + 1);
		thing.SetEncLv(thing.encLV / 2);
		if (num > 0 && EClass.rnd(3) == 0)

public static void MakeDish(Thing food, int lv, Chara crafter = null)

cs
		}
	}

	public static Thing MakeDarkSoup() 
	{ 
		Thing thing = ThingGen.Create("soup_dark"); 
		for (int i = 0; i < 4 + EClass.rnd(4); i++) 
		{ 
			Chara c = EClass._map.charas.RandomItem(); 
			AddIngredient(thing, c, GetRandomDarkSoupIngredient(c)); 
		} 
		if (!EClass.debug.autoIdentify) 
		{ 
			thing.c_IDTState = 1; 
		} 
		return thing; 
	} 
	public static Thing GetRandomDarkSoupIngredient(Chara c) 
	{ 
		return ThingGen.CreateFromFilter("darksoup", c.LV); 
	} 
	public static Thing MakeLoveLunch(Chara c) 
	{ 
		Thing thing = ThingGen.Create("lunch_love"); 
		thing.MakeRefFrom(c); 
		int num = c.uid + EClass.world.date.year * 10000 + EClass.world.date.month * 100; 
		Rand.SetSeed(num); 
		int num2 = 3 + EClass.rnd(3); 
		if (!EClass.debug.autoIdentify) 
		{ 
			thing.c_IDTState = 5; 
		} 
		for (int i = 0; i < num2; i++) 
		{ 
			Rand.SetSeed(num + i); 
			AddIngredient(thing, c, GetRandomLoveLunchIngredient(c), writeCrafter: false); 
		} 
		Rand.SetSeed(); 
		return thing; 
	} 
	public static Thing GetRandomLoveLunchIngredient(Chara c) 
	{ 
		Thing thing = null; 
		int lV = c.LV; 
		for (int i = 0; i < 3; i++) 
		{ 
			thing = ThingGen.Create("dish", -1, lV + i * 3); 
			if (!thing.HasTag(CTAG.dish_fail)) 
			{ 
				break; 
			} 
		} 
		MakeDish(thing, lV, c); 
		return thing; 
	} 
	public static void AddIngredient(Card product, Chara c, Card ing, bool writeCrafter = true) 
	{ 
		if (product.c_mixedFoodData == null) 
		{ 
			product.c_mixedFoodData = new MixedFoodData(); 
		} 
		product.c_mixedFoodData.texts.Add(ing.Name + (writeCrafter ? "isMixedBy".lang(c.NameSimple) : "")); 
		foreach (Element value in ing.elements.dict.Values) 
		{ 
			if (!IsValidTrait(value)) 
			{ 
				continue; 
			} 
			if (value.IsFoodTraitMain) 
			{ 
				int num = value.Value; 
				if (product.id == "lunch_dystopia") 
				{ 
					num *= -1; 
				} 
				product.elements.ModBase(value.id, num); 
			} 
			else
			{ 
				int num2 = product.elements.Base(value.id); 
				if ((num2 <= 0 && value.Value < 0 && value.Value < num2) || (value.Value > 0 && value.Value > num2)) 
				{ 
					product.elements.SetTo(value.id, value.Value); 
				} 
			} 
		} 
		product.elements.ModBase(10, ing.Evalue(10)); 
		static bool IsValidTrait(Element e) 
		{ 
			if (e.HasTag("noInherit")) 
			{ 
				return false; 
			} 
			if (e.IsFoodTrait || e.IsTrait || e.id == 2) 
			{ 
				return true; 
			} 
			return false; 
		} 
	} 
	public static void MakeDish(Card food, List<Thing> ings, int qualityBonus, Chara crafter = null)
	{
		List<Thing> list = new List<Thing>();

DramaCustomSequence

void Invest(bool quick)

cs
				SE.Pay();
				EClass.pc.ModCurrency(-cost);
				TempTalkTopic("food2", StepDefault);
				FoodEffect.Proc(EClass.pc, ThingGen.Create("dish_lunch")); 
				FoodEffect.Proc(EClass.pc, ThingGen.Create("dish_lunch"), consume: false); 
				EClass.pc.hunger.value = 0;
			}
		});

ELEMENT

public static Dictionary<int, int> GetElementMap(int[] list, Dictionary<int, int

cs
		return map;
	}

	public static SourceElement.Row GetRandomElement(int lv = 1) 
	public static SourceElement.Row GetRandomElement(int lv = 1, bool useWeight = true) 
	{
		if (lv > 100)
		{

public static SourceElement.Row GetRandomElement(int lv = 1)

cs
				list.Add(new Tuple<SourceElement.Row, int>(listElement, num));
			}
		}
		return list.RandomItemWeighted((Tuple<SourceElement.Row, int> a) => 10000 / (100 + (lv - a.Item2) * 25)).Item1; 
		return (useWeight ? list.RandomItemWeighted((Tuple<SourceElement.Row, int> a) => 10000 / (100 + (lv - a.Item2) * 25)) : list.RandomItem()).Item1; 
	}

	public void WriteNote(UINote n, ElementContainer owner = null, Action<UINote> onWriteNote = null)

Emo2

public enum Emo2

cs
	brush_hate,
	brush_like,
	brush_like2,
	brush_like3 
	brush_like3, 
	hintEvent 
}

FactionBranch

public void OnSimulateHour(VirtualDate date)

cs
					if (meal != null)
					{
						FoodEffect.Proc(c, meal);
						meal.Destroy(); 
					}
					else
					{

FoodEffect

``

cs

public class FoodEffect : EClass
{
	public static void Proc(Chara c, Thing food) 
	public static void Proc(Chara c, Thing food, bool consume = true) 
	{
		food.CheckJustCooked();
		bool flag = EClass._zone.IsPCFaction && c.IsInSpot<TraitSpotDining>();

public static void Proc(Chara c, Thing food)

cs
	bool flag3 = food.HasElement(709);
	bool flag4 = c.HasElement(1205);
	bool flag5 = food.IsDecayed || flag3;
	bool flag6 = food.trait is TraitLunchLove; 
	c.AddFoodHistory(food);
	if (c.IsPCFaction && !c.IsPC)
	{
		int num6 = c.CountNumEaten(food);
		bool flag6 = c.GetFavFood().id == food.id; 
		if (num6 < 2 || flag6) 
		bool flag7 = c.GetFavFood().id == food.id; 
		if (num6 < 2 || flag7) 
		{
			if (num6 == 1 || flag6 || EClass.rnd(4) == 0) 
			if (num6 == 1 || flag7 || EClass.rnd(4) == 0) 
			{
				c.Talk("foodNice");
			}

public static void Proc(Chara c, Thing food)

cs
			float num8 = num2 * (float)value.Value;
			if (value.source.category == "food" && c.IsPC)
			{
				bool flag7 = num8 >= 0f; 
				string text = value.source.GetText(flag7 ? "textInc" : "textDec", returnNull: true); 
				bool flag8 = num8 >= 0f; 
				string text = value.source.GetText(flag8 ? "textInc" : "textDec", returnNull: true); 
				if (text != null)
				{
					Msg.SetColor(flag7 ? "positive" : "negative"); 
					Msg.SetColor(flag8 ? "positive" : "negative"); 
					c.Say(text);
				}
			}

public static void Proc(Chara c, Thing food)

cs
				c.PlaySound("ding_potential");
				c.elements.ModExp(306, -1000f);
				c.SetInt(117, int2 + 1);
				flag6 = false; 
				break;
			}
			case "exp":

public static void Proc(Chara c, Thing food)

cs
					c.SetFeat(1230, c.elements.Base(1230) + 1);
				}
				c.SetInt(112, @int + 1);
				flag6 = false; 
				break;
			}
			}

public static void Proc(Chara c, Thing food)

cs
		{
			food.trait.OnDrink(c);
		}
		if (consume) 
		{ 
			num7 += 5f; 
			if (flag6 && (float)food.Evalue(10) > num7 + 10f) 
			{ 
				food.elements.SetTo(10, (int)Mathf.Max((float)food.Evalue(10) - num7, 1f)); 
				food.SetBool(125, enable: true); 
			} 
			else
			{ 
				food.ModNum(-1); 
			} 
		} 
	}

	public static void ProcTrait(Chara c, Card t)

LayerSleep

public void Advance()

cs
		{
			ELayer.player.SimulateFaction();
		}
		foreach (Chara chara in ELayer._map.charas) 
		{ 
			if (chara.affinity.GetLunchChance() > ELayer.rnd(100) && chara.GetInt(71) == -1) 
			{ 
				chara.SetInt(71, -2); 
			} 
		} 
		foreach (Chara member in ELayer.pc.party.members)
		{
			member.OnSleep(bed);

+MixedFoodData

File Created
cs
using System.Collections.Generic;
using Newtonsoft.Json;

public class MixedFoodData : EClass
{
	[JsonProperty]
	public List<string> texts = new List<string>();
}

SourceFood

public override Row CreateRow()

cs
			unit = SourceData.GetString(5),
			name2_JP = SourceData.GetStringArray(6),
			name2 = SourceData.GetStringArray(7),
			tiles = SourceData.GetIntArray(8), 
			parse = SourceData.GetStringArray(9), 
			vals = SourceData.GetStringArray(10), 
			trait = SourceData.GetStringArray(11), 
			elements = Core.ParseElements(SourceData.GetStr(12)), 
			idTaste = SourceData.GetString(14), 
			TST = SourceData.GetInt(15), 
			NUT = SourceData.GetInt(16), 
			STR = SourceData.GetInt(17), 
			STR2 = SourceData.GetInt(18), 
			END = SourceData.GetInt(19), 
			END2 = SourceData.GetInt(20), 
			DEX = SourceData.GetInt(21), 
			DEX2 = SourceData.GetInt(22), 
			PER = SourceData.GetInt(23), 
			PER2 = SourceData.GetInt(24), 
			LER = SourceData.GetInt(25), 
			LER2 = SourceData.GetInt(26), 
			WIL = SourceData.GetInt(27), 
			WIL2 = SourceData.GetInt(28), 
			MAG = SourceData.GetInt(29), 
			MAG2 = SourceData.GetInt(30), 
			CHA = SourceData.GetInt(31), 
			CHA2 = SourceData.GetInt(32), 
			LV = SourceData.GetInt(34), 
			chance = SourceData.GetInt(35), 
			value = SourceData.GetInt(36), 
			weight = SourceData.GetInt(37), 
			recipeKey = SourceData.GetStringArray(38), 
			factory = SourceData.GetStringArray(39), 
			components = SourceData.GetStringArray(40), 
			defMat = SourceData.GetString(41), 
			category = SourceData.GetString(42), 
			tag = SourceData.GetStringArray(43), 
			detail_JP = SourceData.GetString(44), 
			detail = SourceData.GetString(45) 
			unknown_JP = SourceData.GetString(8), 
			unknown = SourceData.GetString(9), 
			tiles = SourceData.GetIntArray(10), 
			parse = SourceData.GetStringArray(11), 
			vals = SourceData.GetStringArray(12), 
			trait = SourceData.GetStringArray(13), 
			elements = Core.ParseElements(SourceData.GetStr(14)), 
			idTaste = SourceData.GetString(16), 
			TST = SourceData.GetInt(17), 
			NUT = SourceData.GetInt(18), 
			STR = SourceData.GetInt(19), 
			STR2 = SourceData.GetInt(20), 
			END = SourceData.GetInt(21), 
			END2 = SourceData.GetInt(22), 
			DEX = SourceData.GetInt(23), 
			DEX2 = SourceData.GetInt(24), 
			PER = SourceData.GetInt(25), 
			PER2 = SourceData.GetInt(26), 
			LER = SourceData.GetInt(27), 
			LER2 = SourceData.GetInt(28), 
			WIL = SourceData.GetInt(29), 
			WIL2 = SourceData.GetInt(30), 
			MAG = SourceData.GetInt(31), 
			MAG2 = SourceData.GetInt(32), 
			CHA = SourceData.GetInt(33), 
			CHA2 = SourceData.GetInt(34), 
			LV = SourceData.GetInt(36), 
			chance = SourceData.GetInt(37), 
			value = SourceData.GetInt(38), 
			weight = SourceData.GetInt(39), 
			recipeKey = SourceData.GetStringArray(40), 
			factory = SourceData.GetStringArray(41), 
			components = SourceData.GetStringArray(42), 
			defMat = SourceData.GetString(43), 
			category = SourceData.GetString(44), 
			tag = SourceData.GetStringArray(45), 
			detail_JP = SourceData.GetString(46), 
			detail = SourceData.GetString(47) 
		};
	}

public override void OnImportRow(Row _r, SourceThing.Row c)

cs
	c.elements = list.ToArray();
	c.name2 = row.name2;
	c.name2_JP = row.name2_JP;
	c.unknown = row.unknown; 
	c.unknown_JP = row.unknown_JP; 
	if (!row.unit_JP.IsEmpty())
	{
		c.unit_JP = row.unit_JP;

StatsMana

``

cs

public class StatsMana : Stats
{
	public override int max => (int)Mathf.Clamp(((long)(BaseStats.CC.MAG * 2 + BaseStats.CC.WIL + BaseStats.CC.LER / 2) * (long)Mathf.Min(BaseStats.CC.LV, 25) / 25 + BaseStats.CC.MAG + 10) * (BaseStats.CC.Evalue(61) - BaseStats.CC.Evalue(93)) / 100 * ((BaseStats.CC.IsPCFaction ? 100 : (100 + (int)BaseStats.CC.rarity * 250)) + (BaseStats.CC.IsPC ? (EClass.player.lastEmptyAlly * BaseStats.CC.Evalue(1646)) : 0)) / 100, 1f, 100000000f); 
	public override int max => (int)Mathf.Clamp(((long)(BaseStats.CC.MAG * 2 + BaseStats.CC.WIL + BaseStats.CC.LER / 2) * (long)Mathf.Min(BaseStats.CC.LV, 25) / 25 + BaseStats.CC.MAG + 10) * (BaseStats.CC.Evalue(61) - BaseStats.CC.Evalue(93)) / 100 * ((BaseStats.CC.IsPCFactionOrMinion ? 100 : (100 + (int)BaseStats.CC.rarity * 250)) + (BaseStats.CC.IsPC ? (EClass.player.lastEmptyAlly * BaseStats.CC.Evalue(1646)) : 0)) / 100, 1f, 100000000f); 

	public override int min => -999999;

TCOrbitChara

public void RefreshAll()

cs
		{
			emo = owner.trait.GetRestockedIcon();
		}
		else if (!owner.IsPC && ((owner.affinity.CanGiveCard() && !EMono.player.codex.DroppedCard(owner.id)) || owner.GetInt(71) == -2)) 
		{ 
			emo = Emo2.hintEvent; 
		} 
		else
		{
			bool flag = false;

Thing

public override string GetName(NameStyle style, int _num = -1)

cs
		{
			text = id;
		}
		if (!isEquipmentOrRangedOrAmmo || !base.IsIdentified || base.rarity < Rarity.Legendary) 
		if (isEquipmentOrRangedOrAmmo && base.IsIdentified && base.rarity >= Rarity.Legendary) 
		{
			if (source.naming == "m" || (source.naming == "ms" && base.material != source.DefaultMaterial)) 
			if (base.rarity != Rarity.Artifact && !base.material.GetTextArray("altName").IsEmpty()) 
			{
				if (isEquipmentOrRangedOrAmmo) 
				{ 
					string[] textArray = base.material.GetTextArray("altName"); 
					if (textArray != null && textArray.Length >= 2) 
					{ 
						text = base.material.GetTextArray("altName")[1] + Lang.space + text; 
						goto IL_01f2; 
					} 
				} 
				text = "_of2".lang(base.material.GetName(), text); 
				text = base.material.GetTextArray("altName")[0] + Lang.space + text; 
			}
			goto IL_01f2; 
			goto IL_0215; 
		}
		if (base.rarity != Rarity.Artifact && !base.material.GetTextArray("altName").IsEmpty()) 
		if (source.naming == "m" || (source.naming == "ms" && base.material != source.DefaultMaterial)) 
		{
			text = base.material.GetTextArray("altName")[0] + Lang.space + text; 
			if (isEquipmentOrRangedOrAmmo) 
			{ 
				string[] textArray = base.material.GetTextArray("altName"); 
				if (textArray != null && textArray.Length >= 2) 
				{ 
					text = base.material.GetTextArray("altName")[1] + Lang.space + text; 
					goto IL_01f2; 
				} 
			} 
			text = "_of2".lang(base.material.GetName(), text); 
		}
		goto IL_01f2; 
	}
	else
	text = "unknown"; 
	string idUnknown = source.GetText("unknown"); 
	if (idUnknown.StartsWith("#")) 
	{
		text = "unknown"; 
		string idUnknown = source.GetText("unknown"); 
		if (idUnknown.StartsWith("#")) 
		Rand.UseSeed(EClass.game.seed + (trait.CanStack ? sourceCard._index : base.uid) + base.refVal, delegate
		{
			Rand.UseSeed(EClass.game.seed + (trait.CanStack ? sourceCard._index : base.uid) + base.refVal, delegate
			{ 
				idUnknown = Lang.GetList(idUnknown.Remove(0, 1)).RandomItem(); 
			}); 
		} 
		text = idUnknown; 
			idUnknown = Lang.GetList(idUnknown.Remove(0, 1)).RandomItem(); 
		}); 
	}
	goto IL_02a1; 
	IL_02a1: 
	if (!base.c_idRefCard.IsEmpty() && trait.RefCardName != RefCardName.None) 
	text = idUnknown; 
	goto IL_047d; 
	IL_047d: 
	if (GetBool(125)) 
	{
		string text7 = base.c_altName.IsEmpty(base.refCard.GetName()); 
		if (!base.c_idRefCard2.IsEmpty()) 
		{ 
			text7 = "_and".lang(text7, base.c_altName2.IsEmpty(base.refCard2.GetName())); 
		} 
		if (!(text7 == "*r")) 
		{ 
			text = ((!source.name2.IsEmpty()) ? source.GetTextArray("name2")[0].Replace("#1b", base.c_extraNameRef.IsEmpty((base.refCard == null) ? text7 : (base.refCard.isChara ? base.refCard.GetName() : base.refCard.GetText()))).Replace("#1", base.c_extraNameRef.IsEmpty(text7)) : (source.naming.Contains("last") ? (text + Lang.space + text7) : (source.naming.Contains("first") ? (text7 + Lang.space + text) : ((!source.naming.Contains("of")) ? (text6.IsEmpty() ? "_of3" : "_of2").lang(text7, text) : "_of".lang(text7, text))))); 
		} 
		else
		{ 
			string text8 = base.refCard.GetText("aka"); 
			if (!text8.IsEmpty()) 
			{ 
				text = "_of".lang(text8, text); 
			} 
		} 
		text = "_halfeaten".lang(text); 
	}
	if (base.c_bill != 0)
	{

public override string GetName(NameStyle style, int _num = -1)

cs
			int dMG = base.DMG;
			if ((base.IsMeleeWeapon || base.IsRangedWeapon || base.IsAmmo || hIT != 0 || dMG != 0) && source.offense.Length != 0)
			{
				string text9 = ""; 
				string text7 = ""; 
				if (source.offense[0] != 0)
				{
					text9 = text9 + source.offense[0] + "d" + base.c_diceDim; 
					text7 = text7 + source.offense[0] + "d" + base.c_diceDim; 
				}
				if (dMG != 0)
				{
					text9 += ((base.IsMeleeWeapon || base.IsRangedWeapon || base.IsAmmo) ? dMG.ToText() : (dMG.ToString() ?? "")); 
					text7 += ((base.IsMeleeWeapon || base.IsRangedWeapon || base.IsAmmo) ? dMG.ToText() : (dMG.ToString() ?? "")); 
				}
				if (hIT != 0)
				{
					text9 = text9 + ((dMG != 0 || source.offense[0] != 0) ? ", " : "") + hIT; 
					text7 = text7 + ((dMG != 0 || source.offense[0] != 0) ? ", " : "") + hIT; 
				}
				text2 = text2 + " (" + text9.IsEmpty(" - ") + ") "; 
				text2 = text2 + " (" + text7.IsEmpty(" - ") + ") "; 
			}
			int dV = DV;
			int pV = PV;

public override string GetName(NameStyle style, int _num = -1)

cs
		}
		else if (base.c_IDTState == 3 || base.c_IDTState == 1)
		{
			text2 = "(" + base.TextRarity.ToTitleCase() + ")"; 
			text2 = Lang.space + "(" + base.TextRarity.ToTitleCase() + ")"; 
		}
		if (base.IsDecayed)
		{

public override string GetName(NameStyle style, int _num = -1)

cs
		}
		if (!base.c_note.IsEmpty() && (!base.isBackerContent || EClass.core.config.backer.Show(base.c_note)))
		{
			string text10 = base.c_note; 
			if (text10.StartsWith('@')) 
			string text8 = base.c_note; 
			if (text8.StartsWith('@')) 
			{
				text10 = Lang.Note.map.TryGetValue(text10.TrimStart('@'))?.GetText("text") ?? base.c_note; 
				text8 = Lang.Note.map.TryGetValue(text8.TrimStart('@'))?.GetText("text") ?? base.c_note; 
			}
			string text11 = (base.category.IsChildOf("book") ? "_written" : "_engraved"); 
			string text9 = (base.category.IsChildOf("book") ? "_written" : "_engraved"); 
			if (id == "grave_dagger1" || id == "grave_dagger2")
			{
				text11 = "_daggerGrave"; 
				text9 = "_daggerGrave"; 
			}
			text = ((!text10.Contains("_bracketLeft".lang())) ? text11.lang(text10, text) : (text11 + "Alt").lang(text10, text)); 
			text = ((!text8.Contains("_bracketLeft".lang())) ? text9.lang(text8, text) : (text9 + "Alt").lang(text8, text)); 
		}
		text = (flag ? ((num <= 1) ? (text4 + text) : "_unit".lang(num.ToFormat() ?? "", text4 + text, text6)) : ((trait is TraitAbility) ? text.ToTitleCase(wholeText: true) : ((!text6.IsEmpty() && (base.IsIdentified || source.unknown.IsEmpty())) ? "_unit".lang((num == 1) ? "" : (num.ToFormat() ?? ""), text, (text4 + text6).AddArticle(num, style2, source.unit)) : (text4 + text).AddArticle(num, style2, source.name))));
		if (base.rarity >= Rarity.Legendary)
		{
			text = text.ToTitleCase(wholeText: true);
		}
		string text12 = ((base.isSale && things.Count > 0) ? "forSale2".lang() : ((base.isSale || (base.parentThing != null && base.parentThing.isSale && TraitSalesTag.CanTagSale(this, insideContainer: true))) ? "forSale".lang(Lang._currency(GetPrice(CurrencyType.Money, sell: true, PriceType.PlayerShop), "money")) : "")); 
		string text10 = ((base.isSale && things.Count > 0) ? "forSale2".lang() : ((base.isSale || (base.parentThing != null && base.parentThing.isSale && TraitSalesTag.CanTagSale(this, insideContainer: true))) ? "forSale".lang(Lang._currency(GetPrice(CurrencyType.Money, sell: true, PriceType.PlayerShop), "money")) : "")); 
		if (trait is TraitSalesTag && base.isOn && !GetStr(11).IsEmpty())
		{
			text12 += "soldOut".lang(EClass.sources.categories.map[GetStr(11)].GetName()); 
			text10 += "soldOut".lang(EClass.sources.categories.map[GetStr(11)].GetName()); 
		}
		if (GetInt(101) != 0)
		{
			text5 = "_limitedStock".lang(text5);
		}
		return text5 + text3 + text + sig + text2 + text12; 
		return text5 + text3 + text + sig + text2 + text10; 
	}
	}
	IL_01f2:

public override string GetName(NameStyle style, int _num = -1)

cs
		{
			text = base.material.GetName();
		}
		goto IL_02a1; 
		goto IL_0215; 
		IL_0215: 
		if (!base.c_idRefCard.IsEmpty() && trait.RefCardName != RefCardName.None) 
		{ 
			string text11 = base.c_altName.IsEmpty(base.refCard.GetName()); 
			if (!base.c_idRefCard2.IsEmpty()) 
			{ 
				text11 = "_and".lang(text11, base.c_altName2.IsEmpty(base.refCard2.GetName())); 
			} 
			if (!(text11 == "*r")) 
			{ 
				text = ((!source.name2.IsEmpty()) ? source.GetTextArray("name2")[0].Replace("#1b", base.c_extraNameRef.IsEmpty((base.refCard == null) ? text11 : (base.refCard.isChara ? base.refCard.GetName() : base.refCard.GetText()))).Replace("#1", base.c_extraNameRef.IsEmpty(text11)) : (source.naming.Contains("last") ? (text + Lang.space + text11) : (source.naming.Contains("first") ? (text11 + Lang.space + text) : ((!source.naming.Contains("of")) ? (text6.IsEmpty() ? "_of3" : "_of2").lang(text11, text) : "_of".lang(text11, text))))); 
			} 
			else
			{ 
				string text12 = base.refCard.GetText("aka"); 
				if (!text12.IsEmpty()) 
				{ 
					text = "_of".lang(text12, text); 
				} 
			} 
		} 
		goto IL_047d; 
	}

	public override string GetHoverText()

public override void WriteNote(UINote n, Action<UINote> onWriteNote = null, IIns

cs
		}
	}
	trait.WriteNote(n, flag2);
	if (flag2 && showTraits) 
	if (flag2) 
	{
		elements.AddNote(n, (Element e) => listTrait.Contains(e), null, ElementContainer.NoteMode.BonusTrait, addRaceFeat: false, delegate(Element e, string s) 
		if (showTraits) 
		{
			string text12 = s; 
			string text13 = e.source.GetText("textExtra"); 
			if (!text13.IsEmpty()) 
			elements.AddNote(n, (Element e) => listTrait.Contains(e), null, ElementContainer.NoteMode.BonusTrait, addRaceFeat: false, delegate(Element e, string s) 
			{
				string text14 = ""; 
				if (e.id == 2 && mode == IInspect.NoteMode.Product) 
				string text12 = s; 
				string text13 = e.source.GetText("textExtra"); 
				if (!text13.IsEmpty()) 
				{
					int num2 = recipe.GetQualityBonus() / 10; 
					if (num2 >= 0) 
					string text14 = ""; 
					if (e.id == 2 && mode == IInspect.NoteMode.Product) 
					{
						num2++; 
						int num2 = recipe.GetQualityBonus() / 10; 
						if (num2 >= 0) 
						{ 
							num2++; 
						} 
						text14 = "qualityLimit".lang(num2.ToString() ?? ""); 
					}
					text14 = "qualityLimit".lang(num2.ToString() ?? ""); 
				} 
				int num3 = e.Value / 10; 
				num3 = ((e.Value < 0) ? (num3 - 1) : (num3 + 1)); 
				text13 = "Lv." + num3 + text14 + " " + text13; 
				if (infoMode && e.IsFoodTraitMain) 
				{ 
					text13 += "traitAdditive".lang(); 
					int num3 = e.Value / 10; 
					num3 = ((e.Value < 0) ? (num3 - 1) : (num3 + 1)); 
					text13 = "Lv." + num3 + text14 + " " + text13; 
					if (infoMode && e.IsFoodTraitMain) 
					{ 
						text13 += "traitAdditive".lang(); 
					} 
					text12 += (" <size=12>" + text13 + "</size>").TagColor(FontColor.Passive); 
				}
				text12 += (" <size=12>" + text13 + "</size>").TagColor(FontColor.Passive); 
				return text12; 
			}, delegate
			{ 
			}); 
			if (listTrait.Count != list.Count) 
			{ 
				AddText("traitOther".lang((list.Count - listTrait.Count).ToString() ?? ""), FontColor.Default); 
			}
			return text12; 
		}, delegate
		{ 
		}); 
		if (listTrait.Count != list.Count) 
		} 
		if (base.c_mixedFoodData != null) 
		{
			AddText("traitOther".lang((list.Count - listTrait.Count).ToString() ?? ""), FontColor.Default); 
			n.AddHeader("isMixedFood"); 
			foreach (string text15 in base.c_mixedFoodData.texts) 
			{ 
				AddText("_bullet".lang() + text15, FontColor.Default); 
			} 
		}
	}
	if (!flag2) 
	else
	{
		AddText("isUnidentified".lang(), FontColor.Flavor);
		if (base.c_IDTState == 1)

Trait

public void OnBarter()

cs
			{
			case ShopType.Moyer:
			{
				for (int num10 = 1; num10 <= 3; num10++) 
				for (int num10 = 1; num10 <= 6; num10++) 
				{
					AddAdvWeek(num10);
				}

+TraitLunchLove

File Created
cs
public class TraitLunchLove : TraitMixedFood
{
}

~TraitFoodLunchLove

File Renamed
cs
public class TraitFoodLunchLove : TraitFood
public class TraitMixedFood : TraitFood
{
	public override bool CanSearchContent => false;