Skip to content

EA 23.183 Nightly Patch 1

August 18, 2025

16 files modified.

Important Changes

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

Biography (1)

cs
public void SetAge(Chara c, int a, bool allowUnique = false) 
public void SetAge(Chara c, int a) 

CraftUtil (1)

cs
public static void AddIngredient(Card product, Chara c, Card ing, bool writeCrafter = true) 
public static void WrapIngredient(Card product, Chara c, Card ing, WrapType wrapType) 

ActEffect

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

cs
		{
			break;
		}
		int hex = 0; 
		int hex2 = 0; 
		foreach (Condition condition4 in TC.conditions)
		{
			if (condition4.Type == ConditionType.Debuff)
			{
				hex++; 
				hex2++; 
			}
		}
		if (hex == 0) 
		if (hex2 == 0) 
		{
			CC.SayNothingHappans();
			break;

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

cs
				if (!item3.IsFriendOrAbove(CC))
				{
					int num9 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll();
					item3.DamageHP(num9 * hex, 919, power, AttackSource.None, CC); 
					item3.DamageHP(num9 * hex2, 919, power, AttackSource.None, CC); 
				}
			}
		});

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

cs
			TC.Say((actRef.n1 == "money") ? "abStealNegateMoney" : "abStealNegate", TC);
			break;
		}
		Thing thing5 = null; 
		bool flag9 = actRef.n1 == "food"; 
		Thing thing4 = null; 
		bool flag7 = actRef.n1 == "food"; 
		if (actRef.n1 == "money")
		{
			int currency = TC.GetCurrency();
			if (currency > 0)
			{
				currency = Mathf.Clamp(EClass.rnd(currency / 10), 1, 100 + EClass.rndHalf(CC.LV * 200));
				thing5 = ThingGen.Create("money").SetNum(currency); 
				thing4 = ThingGen.Create("money").SetNum(currency); 
				TC.ModCurrency(-currency);
			}
		}
		else
		{
			Func<Thing, bool> func = (Thing t) => true;
			if (flag9) 
			if (flag7) 
			{
				func = (Thing t) => t.IsFood;
			}
			List<Thing> list6 = TC.things.List(delegate(Thing t) 
			List<Thing> list4 = TC.things.List(delegate(Thing t) 
			{
				if (t.parentCard?.trait is TraitChestMerchant || t.trait is TraitTool || t.IsThrownWeapon)
				{

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

cs
				}
				return t.trait.CanBeDestroyed && t.things.Count == 0 && t.invY != 1 && t.trait.CanBeStolen && !t.trait.CanOnlyCarry && !t.IsUnique && !t.isEquipped && t.blessedState == BlessedState.Normal && func(t);
			}, onlyAccessible: true);
			if (list6.Count > 0) 
			if (list4.Count > 0) 
			{
				thing5 = list6.RandomItem(); 
				if (thing5.Num > 1) 
				thing4 = list4.RandomItem(); 
				if (thing4.Num > 1) 
				{
					thing5 = thing5.Split(1); 
					thing4 = thing4.Split(1); 
				}
			}
			CC.AddCooldown(6640, 200);
		}
		if (thing5 == null) 
		if (thing4 == null) 
		{
			CC.Say("abStealNothing", CC, TC);
			break;
		}
		thing5.SetInt(116, 1); 
		TC.PlaySound(thing5.material.GetSoundDrop(thing5.sourceCard)); 
		CC.Pick(thing5, msg: false); 
		CC.Say("abSteal", CC, TC, thing5.Name); 
		thing4.SetInt(116, 1); 
		TC.PlaySound(thing4.material.GetSoundDrop(thing4.sourceCard)); 
		CC.Pick(thing4, msg: false); 
		CC.Say("abSteal", CC, TC, thing4.Name); 
		if (actRef.n1 == "food")
		{
			if (CC.hunger.value != 0)
			{
				CC.InstantEat(thing5); 
				CC.InstantEat(thing4); 
			}
		}
		else

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

cs
	case EffectId.KizuamiTrick:
	{
		EClass.game.religions.Trickery.Talk("ability");
		bool hex2 = CC.IsHostile(TC); 
		List<SourceStat.Row> list4 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex2 ? "Debuff" : "Buff")).ToList(); 
		bool hex = CC.IsHostile(TC); 
		List<SourceStat.Row> list6 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex ? "Debuff" : "Buff")).ToList(); 
		int power2 = power;
		for (int l = 0; l < 4 + EClass.rnd(2); l++)
		{
			SourceStat.Row row2 = list4.RandomItem(); 
			list4.Remove(row2); 
			Proc(hex2 ? EffectId.DebuffKizuami : EffectId.Buff, CC, TC, power2, new ActRef
			SourceStat.Row row2 = list6.RandomItem(); 
			list6.Remove(row2); 
			Proc(hex ? EffectId.DebuffKizuami : EffectId.Buff, CC, TC, power2, new ActRef
			{
				n1 = row2.alias
			});

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

cs
		tc.bio.SetGender(gender2);
		tc.Say("transGender", tc, Gender.Name(tc.bio.gender));
		tc.Talk("tail");
		int age3 = tc.bio.GetAge(tc.Chara); 
		if (blessed && age3 > 1) 
		int age = tc.bio.GetAge(tc.Chara); 
		if (blessed && age > 1) 
		{
			tc.Say("ageDown", tc);
			tc.bio.SetAge(tc.Chara, age3 - 1, allowUnique: true); 
			tc.bio.SetAge(tc.Chara, age - 1); 
		}
		else if (flag)
		{
			tc.Say("ageUp", tc);
			tc.bio.SetAge(tc.Chara, age3 + 1, allowUnique: true); 
			tc.bio.SetAge(tc.Chara, age + 1); 
		}
		break;
	}

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

cs
	{
		tc.PlaySound("mutation");
		tc.PlayEffect("mutation");
		int age2 = tc.bio.GetAge(tc.Chara); 
		if (!flag && age2 <= 1) 
		int age3 = tc.bio.GetAge(tc.Chara); 
		if (!flag && age3 <= 0) 
		{
			tc.SayNothingHappans();
			break;
		}
		age2 = Mathf.Max(1, age2 * 100 / (flag ? 75 : (blessed ? 400 : 200))); 
		age3 = Mathf.Max(0, age3 * 100 / (flag ? 75 : (blessed ? 400 : 200))) + (flag ? 1 : 0); 
		tc.Say(flag ? "ageUp" : "ageDown", tc);
		tc.bio.SetAge(tc.Chara, age2, allowUnique: true); 
		tc.bio.SetAge(tc.Chara, age3); 
		break;
	}
	case EffectId.EternalYouth:

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

cs
			tc.SayNothingHappans();
			break;
		}
		int age = tc.bio.GetAge(tc.Chara); 
		int age2 = tc.bio.GetAge(tc.Chara); 
		if (flag)
		{
			if (tc.c_lockedAge != 0)

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

cs
				tc.Say("eternalYouth2", tc);
				tc.c_lockedAge = 0;
				tc.elements.Remove(1243);
				tc.bio.SetAge(tc.Chara, age); 
				tc.bio.SetAge(tc.Chara, age2); 
			}
			Redirect(EffectId.Youth, BlessedState.Cursed, default(ActRef));
		}

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

cs
		{
			tc.PlaySound("dropRewardXmas");
			tc.Say("eternalYouth1", tc);
			tc.c_lockedAge = age; 
			tc.c_lockedAge = age2 + 1; 
			tc.elements.SetBase(1243, 1);
			if (blessed)
			{

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

cs
	case EffectId.DamageMindGreat:
	case EffectId.Weaken:
	{
		bool flag7 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat; 
		bool flag8 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat; 
		bool mind = id == EffectId.DamageMind || id == EffectId.DamageMindGreat;
		int num8 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4)));
		if (id == EffectId.Weaken)
		{
			flag7 = EClass.rnd(2) == 0; 
			mind = !flag7; 
			flag8 = EClass.rnd(2) == 0; 
			mind = !flag8; 
			num8 = 1;
		}
		else

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

cs
			TC.PlayEffect("debuff");
			TC.PlaySound("debuff");
		}
		TC.Say(flag7 ? "damageBody" : "damageMind", TC); 
		TC.Say(flag8 ? "damageBody" : "damageMind", TC); 
		for (int k = 0; k < num8; k++)
		{
			TC.DamageTempElements(power, flag7, mind, id != EffectId.Weaken); 
			TC.DamageTempElements(power, flag8, mind, id != EffectId.Weaken); 
		}
		if (TC.IsPC)
		{

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

cs
	case EffectId.EnhanceBodyGreat:
	case EffectId.EnhanceMindGreat:
	{
		bool flag8 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat; 
		bool flag9 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat; 
		bool mind2 = id == EffectId.EnhanceMind || id == EffectId.EnhanceMindGreat;
		if (id != EffectId.EnhanceBody && id != EffectId.EnhanceMind)
		{
			EClass.rnd(4);
		}
		TC.Say(flag8 ? "enhanceBody" : "enhanceMind", TC); 
		TC.Say(flag9 ? "enhanceBody" : "enhanceMind", TC); 
		TC.PlayEffect("buff");
		TC.PlaySound("buff");
		TC.EnhanceTempElements(power, flag8, mind2, onlyRenew: true); 
		TC.EnhanceTempElements(power, flag9, mind2, onlyRenew: true); 
		break;
	}
	case EffectId.RestoreBody:

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

cs
		List<Thing> list5 = TC.things.List((Thing t) => (t.Num <= 1 && t.IsEquipmentOrRanged && !t.IsToolbelt && !t.IsLightsource && t.isEquipped) ? true : false);
		if (list5.Count != 0)
		{
			Thing thing4 = list5.RandomItem(); 
			Thing thing5 = list5.RandomItem(); 
			TC.Say("acid_hit", TC);
			if (thing4.isAcidproof) 
			if (thing5.isAcidproof) 
			{
				TC.Say("acid_nullify", thing4); 
				TC.Say("acid_nullify", thing5); 
			}
			else if (thing4.encLV > -5) 
			else if (thing5.encLV > -5) 
			{
				TC.Say("acid_rust", TC, thing4); 
				thing4.ModEncLv(-1); 
				LayerInventory.SetDirty(thing4); 
				TC.Say("acid_rust", TC, thing5); 
				thing5.ModEncLv(-1); 
				LayerInventory.SetDirty(thing5); 
			}
			if (TC.IsPCParty)
			{

AttackProcess

public void Prepare(Chara _CC, Thing _weapon, Card _TC = null, Point _TP = null,

cs
		int num3 = Mathf.Clamp(weapon.material.hardness, flag ? 40 : 20, 200);
		weaponSkill = CC.elements.GetOrCreateElement(108);
		attackType = AttackType.Blunt;
		dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7); 
		dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7) + Math.Min(weapon.encLV, 99); 
		dNum = 2;
		dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 / 100 * num3 / 100 / 2;
		dMulti = 1f;

Biography

public bool IsUnderAge(Chara c)

cs

	public string TextAge(Chara c)
	{
		object obj; 
		if (GetAge(c) < 1000) 
		{ 
			obj = GetAge(c).ToString(); 
			if (obj == null) 
			{ 
				return ""; 
			} 
		} 
		else
		{ 
			obj = "???"; 
		} 
		return (string)obj; 
		return Lang.Parse("age", (GetAge(c) >= 1000) ? "???" : (GetAge(c).ToString() ?? "")); 
	}

	public int GetAge(Chara c)
	{
		if (c.c_lockedAge != 0)
		{
			return c.c_lockedAge; 
			return c.c_lockedAge - 1; 
		}
		if (c.IsUnique)
		{

public int GetAge(Chara c)

cs
		return EClass.world.date.year - birthYear;
	}

	public void SetAge(Chara c, int a, bool allowUnique = false) 
	public void SetAge(Chara c, int a) 
	{
		if (c.IsUnique)
		{
			if (allowUnique) 
			c.c_lockedAge = a + 1; 
			string[] array = c.source.bio.Split('/'); 
			if (array.Length > 1) 
			{
				c.c_lockedAge = a; 
				SetBirthYear(c, int.Parse(array[1])); 
			}
		}
		else if (c.c_lockedAge == 0)
		{
			birthYear = EClass.world.date.year - a; 
			SetBirthYear(c, a); 
		}
		else
		{
			c.c_lockedAge = a; 
			c.c_lockedAge = a + 1; 
		}
	}

	public void SetBirthYear(Chara c, int a) 
	{ 
		birthYear = EClass.world.date.year - a; 
	} 
	public void Generate(Chara c)
	{
		string bio = c.source.bio;

public void Generate(Chara c)

cs
			{
				flag = false;
			}
			SetAge(c, int.Parse(array[1])); 
			SetBirthYear(c, int.Parse(array[1])); 
			c.pccData = IO.LoadFile<PCCData>(CorePath.packageCore + "Data/PCC/" + c.id + ".txt");
		}
		if (array.Length > 2)

public void Generate(Chara c)

cs
	}
	if (c.id == "prostitute" && GetAge(c) < 15)
	{
		SetAge(c, 15); 
		SetBirthYear(c, 15); 
	}
	SourceThing.Row row = EClass.sources.things.rows.RandomItem();
	idLike = row.id;

public void GenerateBirthday(Chara c, int ageIndex = 0)

cs
	if (ageIndex != 0)
	{
		int num3 = (num2 - num) / 4;
		SetAge(c, Rand.Range(num + num3 * (ageIndex - 1), num + num3 * ageIndex)); 
		SetBirthYear(c, Rand.Range(num + num3 * (ageIndex - 1), num + num3 * ageIndex)); 
	}
	else
	{
		SetAge(c, Rand.Range(num, num2)); 
		SetBirthYear(c, Rand.Range(num, num2)); 
	}
	birthDay = EClass.rnd(30) + 1;
	birthMonth = EClass.rnd(12) + 1;

public void SetPortrait(Chara c)

cs

	public string TextBio(Chara c)
	{
		return c.race.GetText().ToTitleCase(wholeText: true) + " " + Lang.Parse("age", TextAge(c)) + " " + Lang._gender(gender); 
		return c.race.GetText().ToTitleCase(wholeText: true) + " " + TextAge(c) + " " + Lang._gender(gender); 
	}

	public string TextBio2(Chara c)

public string TextBio2(Chara c)

cs

	public string TextBioSlave(Chara c)
	{
		return " (" + Lang.GetList("genders_animal")[c.bio.gender] + " " + "age".lang(c.bio.TextAge(c)) + ")"; 
		return " (" + Lang.GetList("genders_animal")[c.bio.gender] + " " + TextAge(c) + ")"; 
	}

	public string TextBirthDate(Chara c, bool _age = false)
	{
		return Lang.Parse("birthText", (birthYear >= 0) ? (birthYear.ToString() ?? "") : "???", birthMonth.ToString() ?? "", birthDay.ToString() ?? "") + (_age ? (" (" + Lang.Parse("age", TextAge(c)) + ")") : ""); 
		return Lang.Parse("birthText", (birthYear >= 0) ? (birthYear.ToString() ?? "") : "???", birthMonth.ToString() ?? "", birthDay.ToString() ?? "") + (_age ? (" (" + TextAge(c) + ")") : ""); 
	}

	public string TextAppearance()

ButtonChara

public void SetChara(Chara c, Mode m)

cs
		textAlias.text = c.Aka;
		if ((bool)textBio)
		{
			textBio.text = c.race.GetText().ToTitleCase(wholeText: true) + " " + Lang.Parse("age", c.bio.TextAge(c)) + " " + Lang._gender(c.bio.gender); 
			textBio.text = c.race.GetText().ToTitleCase(wholeText: true) + " " + c.bio.TextAge(c) + " " + Lang._gender(c.bio.gender); 
		}
	}
	textName.text = c.Name;

Cell

public Point GetSharedPoint()

cs

	public bool CanSuffocate()
	{
		if (EClass._zone.IsUnderwater) 
		if (EClass._zone.IsUnderwater && !EClass._zone.IsUserZone) 
		{
			return true;
		}

CharaRenderer

public void DrawHat()

cs
	RenderObject.currentParam.y += num + 0.01f * (float)(pref.equipY + cardRow.pref.equipY);
	RenderObject.currentParam.z -= pref.hatY;
	RenderObject.currentParam.tile = cardRow._tiles[owner.uid % cardRow._tiles.Length] * ((!flag) ? 1 : (-1));
	RenderObject.currentParam.mat = cardRow.DefaultMaterial; 
	RenderObject.currentParam.matColor = cardRow.GetColorInt(RenderObject.currentParam.mat); 
	cardRow.renderData.Draw(RenderObject.currentParam);
	RenderObject.currentParam.x -= 0.01f * (float)pref.equipX;
	RenderObject.currentParam.y -= num + 0.01f * (float)(pref.equipY + cardRow.pref.equipY);

CraftUtil

public enum MixType

cs
		NoMix
	}

	public enum WrapType
	{ 
		Love, 
		Dark
	} 
	public static string[] ListFoodEffect = new string[2] { "exp", "pot" };

	public static void ModRandomFoodEnc(Thing t)

public static Thing MakeDarkSoup()

cs
	for (int i = 0; i < 4 + EClass.rnd(4); i++)
	{
		Chara c = EClass._map.charas.RandomItem();
		AddIngredient(thing, c, GetRandomDarkSoupIngredient(c)); 
		WrapIngredient(thing, c, GetRandomDarkSoupIngredient(c), WrapType.Dark); 
	}
	if (!EClass.debug.autoIdentify)
	{

public static Thing MakeLoveLunch(Chara c)

cs
	for (int i = 0; (float)i < num2; i++)
	{
		Rand.SetSeed(num + i);
		AddIngredient(thing, c, GetRandomLoveLunchIngredient(c), writeCrafter: false); 
		WrapIngredient(thing, c, GetRandomLoveLunchIngredient(c), WrapType.Love); 
	}
	thing.elements.SetBase(701, 0);
	if (thing.Evalue(753) < 0)

public static Thing MakeLoveLunch(Chara c)

cs
	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); 
			thing = ThingGen.Create("dish", -1, c.Evalue(287) + 5 + (EClass.debug.enable ? c.LV : 0)); 
			if (!thing.HasTag(CTAG.dish_fail))
			{
				break;
			}
		}
		MakeDish(thing, lV, c); 
		MakeDish(thing, c.LV, c); 
		return thing;
	}

	public static void AddIngredient(Card product, Chara c, Card ing, bool writeCrafter = true) 
	public static void WrapIngredient(Card product, Chara c, Card ing, WrapType wrapType) 
	{
		if (product.c_mixedFoodData == null)
		{
			product.c_mixedFoodData = new MixedFoodData();
		}
		product.c_mixedFoodData.texts.Add(ing.Name + (writeCrafter ? "isMixedBy".lang(c.NameSimple) : "")); 
		product.c_mixedFoodData.texts.Add(ing.Name + ((wrapType == WrapType.Dark) ? "isMixedBy".lang(c.NameSimple) : "")); 
		foreach (Element value in ing.elements.dict.Values)
		{
			if (!IsValidTrait(value))

public static void AddIngredient(Card product, Chara c, Card ing, bool writeCraf

cs
		if (value.IsFoodTraitMain)
		{
			int num = value.Value;
			if (product.id == "lunch_dystopia") 
			if (product.id == "lunch_dystopia" && (wrapType == WrapType.Dark || num < 0)) 
			{
				num *= -1;
			}

public static Card MixIngredients(Card product, List<Thing> ings, MixType type,

cs
			product.elements.SetTo(10, 1);
		}
	}
	if (creative && isFood) 
	if (creative && isFood && product.category.IsChildOf("meal")) 
	{
		product.elements.SetBase(764, 1);
	}

FactionBranch

public void OnSimulateHour(VirtualDate date)

cs
			if (luckyMonth || (policies.IsActive(2822) && Mathf.Sqrt(Evalue(2822) / 2) + 5f >= (float)EClass.rnd(100)))
			{
				chara = CharaGen.CreateWealthy(ContentLV);
				EClass._zone.AddCard(chara, EClass._zone.GetSpawnPos(SpawnPosition.Random) ?? EClass._map.GetRandomSurface()); 
				EClass._zone.AddCard(chara, EClass._zone.GetSpawnPos(SpawnPosition.Guest) ?? EClass._map.GetRandomSurface()); 
			}
			else
			{

Map

public void ExportMetaData(string _path, string id, PartialMap partial = null)

cs
		name = EClass._zone.Name,
		version = BaseCore.Instance.version.GetInt(),
		tag = (EClass._map.exportSetting?.tag ?? ""),
		partial = partial 
		partial = partial, 
		underwater = EClass._zone.IsUnderwater 
	};
	custom.id = (mapMetaData.id = id);
	IO.SaveFile(_path + "meta", mapMetaData);

MapMetaData

public class MapMetaData : EClass

cs
	[JsonProperty]
	public PartialMap partial;

	[JsonProperty] 
	public bool underwater; 
	public string path;

	public DateTime date;

Person

public string GetDramaTitle()

cs
		{
			text = text + " " + dramaText;
		}
		return chara.Name.ToTitleCase() + " - " + chara.race.GetText().ToTitleCase() + " " + Lang.Parse("age", bio.TextAge(chara)) + " " + Lang._gender(bio.gender) + text; 
		return chara.Name.ToTitleCase() + " - " + chara.race.GetText().ToTitleCase() + " " + bio.TextAge(chara) + " " + Lang._gender(bio.gender) + text; 
	}
	if (Name.IsEmpty())
	{

SpawnPosition

public enum SpawnPosition

cs
public enum SpawnPosition
{
	Random,
	Outside
	Outside, 
	Guest
}

SpawnSetting

public static SpawnSetting HomeGuest(int lv)

cs
		filterLv = lv,
		hostility = SpawnHostility.Neutral,
		idSpawnList = "c_guest",
		position = SpawnPosition.Outside, 
		position = SpawnPosition.Guest, 
		rarity = Rarity.Normal
	};
}

TraitMoongate

public void LoadMap(MapMetaData m)

cs
		zone_User.idUser = m.id;
		zone_User.dateExpire = EClass.world.date.GetRaw(1);
		zone_User.name = m.name;
		if (m.underwater) 
		{ 
			zone_User.elements.SetBase(3606, 1); 
		} 
	}
	Debug.Log(zone_User);
	MoveZone(zone_User);

Zone

public Point GetSpawnPos(SpawnPosition type, int tries = 100)

cs
	for (int i = 0; i < tries; i++)
	{
		point = EClass._map.bounds.GetRandomSurface(centered: false, walkable: true, allowWater: true);
		if (point.IsValid && !point.cell.hasDoor && !point.IsSync && (type != SpawnPosition.Outside || (!point.cell.HasRoof && point.cell.light <= 0))) 
		if (!point.IsValid || point.cell.hasDoor || point.IsSync) 
		{
			return point; 
			continue; 
		} 
		switch (type) 
		{ 
		case SpawnPosition.Guest: 
		{ 
			Room room = point.cell.room; 
			if (room != null && room.data.accessType != 0) 
			{ 
				continue; 
			} 
			break; 
		} 
		case SpawnPosition.Outside: 
			if (point.cell.HasRoof || point.cell.light > 0) 
			{ 
				continue; 
			} 
			break; 
		}
		return point; 
	}
	return null;
}

Zone_User

public class Zone_User : Zone

cs

	public override bool RevealRoom => true;

	public override bool IsUnderwater => elements.Has(3606); 
	public override void OnActivate()
	{
		base.OnActivate();