Skip to content

EA 23.51 Nightly

December 7, 2024

23 files modified. 1 new file created.

Important Changes

None.

AM_Adv

@@ -873,19 +873,24 @@ public override void _OnUpdateInput()

cs
		}
		break;
	case EAction.QuickLoad:
	{ 
		if (!EClass.debug.enable && !EClass.game.Difficulty.allowManualSave)
		{
			SE.Beep();
			break;
		}
		EClass.core.WaitForEndOfFrame(delegate
		string slot = Game.id; 
		bool isCloud = EClass.game.isCloud; 
		Game.TryLoad(slot, isCloud, delegate
		{
			string text = Game.id; 
			bool isCloud = EClass.game.isCloud; 
			EClass.scene.Init(Scene.Mode.None); 
			Game.Load(text, isCloud); 
			EClass.core.WaitForEndOfFrame(delegate
			{ 
				EClass.scene.Init(Scene.Mode.None); 
				Game.Load(slot, isCloud); 
			}); 
		});
		break;
	} 
	case EAction.Report:
		if (!EClass.debug.enable)
		{

ActPlan

@@ -677,40 +677,37 @@ public void _Update(PointTarget target)

cs
					Thing t = _c.Thing;
					if (input == ActInput.AllAction)
					{
						if (EClass.debug.enable || EClass.player.HasKeyItem("license_illumination")) 
						if ((EClass.debug.enable || EClass.player.HasKeyItem("license_illumination")) && t.LightData != null) 
						{
							if (t.LightData != null) 
							if (t.c_lightColor != 0) 
							{
								if (t.c_lightColor != 0) 
								TrySetAct("actClearLight", delegate
								{
									TrySetAct("actClearLight", delegate
									{ 
										t.c_lightColor = 0; 
										t.RecalculateFOV(); 
										t.renderer.GetTC<TCExtra>()?.RefreshColor(); 
										return false; 
									}, t); 
								} 
								TrySetAct("actSetLight", delegate
								{ 
									Color lightColor = t.LightColor; 
									EClass.ui.AddLayer<LayerColorPicker>().SetColor(lightColor, lightColor, delegate(PickerState state, Color _c) 
									{ 
										t.c_lightColor = (byte)Mathf.Clamp(_c.r * 32f, 1f, 31f) * 1024 + (byte)Mathf.Clamp(_c.g * 32f, 1f, 31f) * 32 + (byte)Mathf.Clamp(_c.b * 32f, 1f, 31f); 
										t.RecalculateFOV(); 
										t.renderer.GetTC<TCExtra>()?.RefreshColor(); 
									}); 
									t.c_lightColor = 0; 
									t.RecalculateFOV(); 
									t.renderer.GetTC<TCExtra>()?.RefreshColor(); 
									return false;
								}, t);
							}
							if (pos.cell.IsTopWater) 
							TrySetAct("actSetLight", delegate
							{
								TrySetAct("(debug) Toggle Float", delegate
								Color lightColor = t.LightColor; 
								EClass.ui.AddLayer<LayerColorPicker>().SetColor(lightColor, lightColor, delegate(PickerState state, Color _c) 
								{
									t.isFloating = !t.isFloating; 
									return false; 
								}, t); 
							} 
									t.c_lightColor = (byte)Mathf.Clamp(_c.r * 32f, 1f, 31f) * 1024 + (byte)Mathf.Clamp(_c.g * 32f, 1f, 31f) * 32 + (byte)Mathf.Clamp(_c.b * 32f, 1f, 31f); 
									t.RecalculateFOV(); 
									t.renderer.GetTC<TCExtra>()?.RefreshColor(); 
								}); 
								return false; 
							}, t); 
						} 
						if (EClass.debug.enable && pos.cell.IsTopWater) 
						{ 
							TrySetAct("(debug) Toggle Float", delegate
							{ 
								t.isFloating = !t.isFloating; 
								return false; 
							}, t); 
						}
						if (!EClass._zone.IsUserZone || !t.isNPCProperty)
						{

ActionMode

@@ -1047,7 +1047,7 @@ public void DoFunc(CoreConfig.GameFuncBuild func)

cs
		EClass.scene.ToggleShowWall();
		break;
	case CoreConfig.GameFuncBuild.TogglePicker:
		if (!Picker.CanActivate) 
		if (Picker.CanActivate) 
		{
			Picker.Activate();
		}

@@ -1153,7 +1153,7 @@ public void DoFunc(CoreConfig.GameFunc func)

cs
			Msg.Say("invalidAction");
			return;
		}
		Inspect.Activate(); 
		BuildMenu.Toggle(); 
		break;
	case CoreConfig.GameFunc.ShowJournal:
	{

BuildMenu

@@ -96,13 +96,13 @@ public static void Toggle()

cs
	EMono.player.hotbars.bars[3].dirty = true;
	EMono.player.hotbars.ResetHotbar(4);
	EMono.player.hotbars.bars[4].dirty = true;
	if (EMono.debug.godBuild || (EMono.Branch != null && EMono.Branch.elements.Has(4006))) 
	if (ActionMode.LastBuildMode != null) 
	{
		ActionMode.Inspect.Activate(); 
		ActionMode.LastBuildMode.Activate(); 
	}
	else if (ActionMode.LastBuildMode != null) 
	else if (EMono.debug.godBuild || (EMono.Branch != null && EMono.Branch.elements.Has(4006))) 
	{
		ActionMode.LastBuildMode.Activate(); 
		ActionMode.Inspect.Activate(); 
	}
	else
	{

Card

@@ -3614,11 +3614,7 @@ public void DamageHP(int dmg, int ele, int eleP = 100, AttackSource attackSource

cs
		}
		if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
		{
			dmg = dmg - EClass.pc.Evalue(13) - 1; 
		} 
		else if (origin != null && origin.IsPCParty && EClass.pc.ai is GoalAutoCombat) 
		{ 
			dmg = dmg * 100 / Mathf.Max(110 - EClass.pc.Evalue(13), 105); 
			dmg = dmg * 100 / Mathf.Min(105 + EClass.pc.Evalue(135) / 10, 110); 
		}
		if (HasElement(1218))
		{

@@ -3763,7 +3759,7 @@ public void DamageHP(int dmg, int ele, int eleP = 100, AttackSource attackSource

cs
					if (EClass.player.invlunerable)
					{
						EvadeDeath();
						goto IL_099c; 
						goto IL_095f; 
					}
				}
				if (IsPC && Evalue(1220) > 0 && Chara.stamina.value >= Chara.stamina.max / 2)

@@ -3775,8 +3771,8 @@ public void DamageHP(int dmg, int ele, int eleP = 100, AttackSource attackSource

cs
			}
		}
	}
	goto IL_099c; 
	IL_099c: 
	goto IL_095f; 
	IL_095f: 
	if (trait.CanBeAttacked)
	{
		renderer.PlayAnime(AnimeID.HitObj);

Chara

@@ -4108,6 +4108,10 @@ public void RestockEquip(bool onCreate)

cs
	{
		equip = job.equip;
	}
	if (equip == "none") 
	{ 
		return; 
	} 
	switch (id)
	{
	case "kettle":

@@ -4441,7 +4445,10 @@ public void Revive(Point p = null, bool msg = false)

cs
	base.hp = MaxHP / 3;
	mana.value = 0;
	stamina.value = 0;
	hunger.value = 30; 
	if (hunger.value > 30) 
	{ 
		hunger.value = 30; 
	} 
	sleepiness.value = 0;
	hostility = OriginalHostility;
	if (IsPC)

Core

@@ -91,6 +91,8 @@ public bool IsGameStarted

cs
protected override void Awake()
{
	base.Awake();
	Debug.Log("Core Awake"); 
	Debug.Log("Version:" + version.GetText()); 
	QualitySettings.vSyncCount = 0;
	Application.targetFrameRate = 60;
	IO.CreateDirectory(CorePath.Temp);

@@ -183,7 +185,6 @@ protected override void Awake()

cs
		Portrait.dictList = new Dictionary<string, List<ModItem<Sprite>>>();
		TileType.Init();
		screen.tileMap.rendererObjDummy.Init();
		Debug.Log("Core Awake"); 
		Debug.Log(steam.steamworks.settings.applicationId);
	}

CoreDebug

@@ -930,16 +930,38 @@ public void UpdateInput()

cs
	}
	if (Input.GetKeyDown(KeyCode.F3))
	{
		EClass.pc.pos.ForeachNearestPoint(delegate(Point p) 
		for (int i = 0; i < 10; i++) 
		{
			if (PathManager.Instance.IsPathClear(EClass.pc.pos, p, EClass.pc, 10) && !p.Equals(EClass.pc.pos)) 
			{ 
				Chara t = CharaGen.Create("putty"); 
				EClass._zone.AddCard(t, p); 
				return true; 
			} 
			return false; 
		}, allowBlock: false, allowChara: false, allowInstalled: false, ignoreCenter: true); 
			Thing thing = ThingGen.Create("egg_fertilized"); 
			thing.TryMakeRandomItem(40); 
			thing.SetEncLv(200); 
			EClass.pc.Pick(thing); 
		} 
		foreach (Chara deadChara in EClass._map.deadCharas) 
		{ 
			Debug.Log(deadChara); 
		} 
		EClass.core.steam.CheckUpdate(); 
		EClass.player.flags.loytelMartLv++; 
		Msg.Say("loytelmart:" + EClass.player.flags.loytelMartLv); 
		Guild.Fighter.relation.rank = 20; 
		Guild.Mage.relation.rank = 20; 
		Guild.Thief.relation.rank = 20; 
		Guild.Merchant.relation.rank = 20; 
		if (EClass.Branch != null) 
		{ 
			EClass.Branch.ModExp(EClass.Branch.GetNextExp()); 
		} 
		foreach (Chara member in EClass.pc.party.members) 
		{ 
			member.AddExp(member.ExpToNext); 
		} 
		EClass.pc.PlayEffect("boost"); 
		EClass.pc.PlaySound("boost"); 
		EClass.pc.elements.SetBase(306, 100); 
		EClass.pc.elements.SetBase(85, 100); 
		EClass.pc.feat += 10; 
		EClass.player.totalFeat += 10; 
		return;
	}
	if (Input.GetKeyDown(KeyCode.F4))

@@ -1010,7 +1032,7 @@ public void UpdateInput()

cs
		if (Input.GetKey(KeyCode.F9))
		{
			EClass.scene.paused = false;
			for (int i = 0; i < advanceMin; i++) 
			for (int j = 0; j < advanceMin; j++) 
			{
				EClass.game.updater.FixedUpdate();
			}

@@ -1150,8 +1172,8 @@ public void UpdateInput()

cs
	{
		for (int num4 = hitPoint.detail.things.Count - 1; num4 >= 0; num4--)
		{
			Thing thing = hitPoint.detail.things[num4]; 
			Debug.Log(thing.id + "/" + thing.Pref.height + "/" + thing.trait?.ToString() + "/" + thing.source.tileType.CanStack + "/" + thing.source.tileType?.ToString() + "/" + thing.isSynced + "/" + RenderObject.syncList.Contains(thing.renderer)); 
			Thing thing2 = hitPoint.detail.things[num4]; 
			Debug.Log(thing2.id + "/" + thing2.Pref.height + "/" + thing2.trait?.ToString() + "/" + thing2.source.tileType.CanStack + "/" + thing2.source.tileType?.ToString() + "/" + thing2.isSynced + "/" + RenderObject.syncList.Contains(thing2.renderer)); 
		}
	}
	if (!Application.isEditor)

@@ -1227,64 +1249,64 @@ public void UpdateInput()

cs
	case DebugHotkey.Item:
		if (Input.GetKeyDown(KeyCode.Alpha1))
		{
			Thing thing2 = ThingGen.Create("stairsDown_cave"); 
			EClass._zone.AddCard(thing2, EClass.pc.pos); 
			thing2.SetPlaceState(PlaceState.installed); 
		} 
		if (Input.GetKeyDown(KeyCode.Alpha2)) 
		{ 
			Thing thing3 = ThingGen.Create("stairs"); 
			Thing thing3 = ThingGen.Create("stairsDown_cave"); 
			EClass._zone.AddCard(thing3, EClass.pc.pos);
			thing3.SetPlaceState(PlaceState.installed);
		}
		if (Input.GetKeyDown(KeyCode.Alpha3)) 
		if (Input.GetKeyDown(KeyCode.Alpha2)) 
		{
			Thing thing4 = ThingGen.Create("sign"); 
			EClass._zone.AddCard(thing4, hitPoint); 
			Thing thing4 = ThingGen.Create("stairs"); 
			EClass._zone.AddCard(thing4, EClass.pc.pos); 
			thing4.SetPlaceState(PlaceState.installed);
		}
		if (Input.GetKeyDown(KeyCode.Alpha4)) 
		if (Input.GetKeyDown(KeyCode.Alpha3)) 
		{
			Thing thing5 = ThingGen.Create("sign2"); 
			Thing thing5 = ThingGen.Create("sign"); 
			EClass._zone.AddCard(thing5, hitPoint);
			thing5.SetPlaceState(PlaceState.installed);
		}
		if (Input.GetKeyDown(KeyCode.Alpha5)) 
		if (Input.GetKeyDown(KeyCode.Alpha4)) 
		{
			Thing thing6 = ThingGen.Create("well"); 
			Thing thing6 = ThingGen.Create("sign2"); 
			EClass._zone.AddCard(thing6, hitPoint);
			thing6.SetPlaceState(PlaceState.installed);
		}
		if (Input.GetKeyDown(KeyCode.Alpha6)) 
		if (Input.GetKeyDown(KeyCode.Alpha5)) 
		{
			Thing thing7 = ThingGen.Create("altar"); 
			Thing thing7 = ThingGen.Create("well"); 
			EClass._zone.AddCard(thing7, hitPoint);
			thing7.SetPlaceState(PlaceState.installed);
		}
		if (Input.GetKeyDown(KeyCode.Alpha6)) 
		{ 
			Thing thing8 = ThingGen.Create("altar"); 
			EClass._zone.AddCard(thing8, hitPoint); 
			thing8.SetPlaceState(PlaceState.installed); 
		} 
		if (Input.GetKeyDown(KeyCode.Alpha7))
		{
			Thing t2 = ThingGen.Create("torch"); 
			EClass._zone.AddCard(t2, hitPoint); 
			Thing t = ThingGen.Create("torch"); 
			EClass._zone.AddCard(t, hitPoint); 
		}
		if (Input.GetKeyDown(KeyCode.Alpha8))
		{
			Thing t3 = ThingGen.Create("street_lamp"); 
			EClass._zone.AddCard(t3, hitPoint); 
			Thing t2 = ThingGen.Create("street_lamp"); 
			EClass._zone.AddCard(t2, hitPoint); 
		}
		if (Input.GetKeyDown(KeyCode.Alpha9))
		{
			Thing t4 = ThingGen.Create("statue_elin"); 
			EClass._zone.AddCard(t4, hitPoint); 
			Thing t3 = ThingGen.Create("statue_elin"); 
			EClass._zone.AddCard(t3, hitPoint); 
		}
		if (Input.GetKeyDown(KeyCode.Alpha0))
		{
			Thing t5 = ThingGen.TestCreate(); 
			EClass._zone.AddCard(t5, hitPoint); 
			Thing t4 = ThingGen.TestCreate(); 
			EClass._zone.AddCard(t4, hitPoint); 
		}
		if (key && Input.GetKeyDown(KeyCode.Alpha1))
		{
			Chara t6 = CharaGen.Create("korgon"); 
			EClass._zone.AddCard(t6, hitPoint); 
			Chara t5 = CharaGen.Create("korgon"); 
			EClass._zone.AddCard(t5, hitPoint); 
		}
		break;
	case DebugHotkey.Decal:

DNA

@@ -201,7 +201,7 @@ public bool CanRemove()

cs
	for (int i = 0; i < vals.Count; i += 2)
	{
		int num = vals[i];
		if (num == 1202 || num == 1237 || num == 1415) 
		if (num == 1237 || num == 1415) 
		{
			return false;
		}

FactionBranch

@@ -283,6 +283,13 @@ public void OnAfterSimulate()

cs
		{
			GetDailyIncome();
		}
		foreach (Chara chara in EClass._map.charas) 
		{ 
			if (!chara.IsPCParty && !chara.noMove && (chara.pos.cell.IsBlocked || chara.pos.cell.hasDoor) && !chara.isRestrained && !chara.HasCondition<ConSuspend>()) 
			{ 
				chara.MoveImmediate(chara.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? chara.pos); 
			} 
		} 
	}

	public void OnUnloadMap()

Game

@@ -295,6 +295,17 @@ public void OnUpdate()

cs
		updater.FixedUpdate();
	}

	public static bool TryLoad(string id, bool cloud, Action onLoad) 
	{ 
		if (GameIO.CanLoad((cloud ? CorePath.RootSaveCloud : CorePath.RootSave) + id)) 
		{ 
			onLoad(); 
			return true; 
		} 
		EClass.ui.Say("incompatible"); 
		return false; 
	} 

	public static void Load(string id, bool cloud)
	{
		string text = (cloud ? CorePath.RootSaveCloud : CorePath.RootSave) + id;

@@ -426,6 +437,16 @@ public void OnLoad()

cs
			}
		}
	});
	if (version.IsBelow(0, 23, 51)) 
	{ 
		foreach (Chara value2 in EClass.game.cards.globalCharas.Values) 
		{ 
			if (!(value2.id != "adv") && value2.IsPCFaction) 
			{ 
				value2.idSkin = value2.uid % (value2.source._tiles.Length - 4) / 2 * 2 + ((!value2.IsMale) ? 1 : 0); 
			} 
		} 
	} 
	if (version.IsBelow(0, 22, 91))
	{
		TryAddQuestIfActive("demitas_spellwriter", "into_darkness");

@@ -488,9 +509,9 @@ public void OnLoad()

cs
	});
	if (version.IsBelow(0, 22, 20))
	{
		foreach (Chara value2 in cards.globalCharas.Values) 
		foreach (Chara value3 in cards.globalCharas.Values) 
		{
			value2.SetBool(18, enable: false); 
			value3.SetBool(18, enable: false); 
		}
	}
	if (version.IsBelow(0, 22, 22))

GameIO

@@ -140,6 +140,12 @@ public static void MakeBackup(GameIndex index, string suffix = "")

cs
		IO.CopyDir((cloud ? CorePath.RootSaveCloud : CorePath.RootSave) + id + "/", text + "/" + newId, (string s) => s == "Temp");
	}

	public static bool CanLoad(string root) 
	{ 
		GameIndex gameIndex = IO.LoadFile<GameIndex>(root + "/index.txt"); 
		return EClass.core.version.IsSaveCompatible(gameIndex.version); 
	} 

	public static Game LoadGame(string id, string root, bool cloud)
	{
		Game.id = id;

LayerLoadGame

@@ -249,11 +249,14 @@ public void RefreshInfo(GameIndex i)

cs
		{
			Dialog.YesNo("dialog_restoreWarning", delegate
			{
				GameIO.DeleteGame(idDest, cloud, deleteBackup: false); 
				IO.CopyDir(pathRoot + "/" + i.id, (cloud ? CorePath.RootSaveCloud : CorePath.RootSave) + "/" + idDest); 
				SE.WriteJournal(); 
				Close(); 
				Game.Load(idDest, cloud); 
				Game.TryLoad(idDest, cloud, delegate
				{ 
					GameIO.DeleteGame(idDest, cloud, deleteBackup: false); 
					IO.CopyDir(pathRoot + "/" + i.id, (cloud ? CorePath.RootSaveCloud : CorePath.RootSave) + "/" + idDest); 
					SE.WriteJournal(); 
					Close(); 
					Game.Load(idDest, cloud); 
				}); 
			});
		}
		else

@@ -265,7 +268,10 @@ public void RefreshInfo(GameIndex i)

cs
				i.madeBackup = true;
				GameIO.UpdateGameIndex(i);
			}
			Game.Load(i.id, cloud); 
			Game.TryLoad(i.id, cloud, delegate
			{ 
				Game.Load(i.id, cloud); 
			}); 
		}
	});
	buttonDelete.SetOnClick(delegate

LayerMod

@@ -35,7 +35,7 @@ public override void OnInit()

cs
		{
			a.UpdateMeta(updateOnly: true);
			b.package = a;
			string s = ELayer.core.mods.packages.IndexOf(a) + 1 + ". " + (a.isInPackages ? "[Private] " : "") + a.title; 
			string s = ELayer.core.mods.packages.IndexOf(a) + 1 + ". " + (a.isInPackages ? "[Local] " : "") + a.title; 
			b.buttonActivate.mainText.SetText(s, (!a.IsValidVersion()) ? FontColor.Bad : (a.activated ? FontColor.ButtonGeneral : FontColor.Passive));
			b.buttonActivate.subText.text = a.version;
			b.buttonLock.mainText.text = a.author;

LayerSkinDeco

@@ -142,6 +142,7 @@ public void Activate(SkinDecoActor actor)

cs
public override void OnKill()
{
	widget.transform.SetParent(ELayer.ui.widgets.transform, worldPositionStays: false);
	widget.RefreshOrder(); 
	foreach (SkinDeco deco in decos)
	{
		SkinDecoActor actor = deco.actor;

Point

@@ -407,7 +407,7 @@ public bool IsInSpot<T>() where T : Trait

cs
{
	foreach (Thing thing in EClass._map.things)
	{
		if (!(thing.trait is T)) 
		if (!(thing.trait is T) || thing.trait.radius == 0) 
		{
			continue;
		}

Scene

@@ -284,6 +284,7 @@ public void Init(Mode newMode)

cs
			EMono.player.onStartZone();
			EMono.player.onStartZone = null;
		}
		ActionMode.LastBuildMode = null; 
		if (ActionMode.Adv.IsActive && (EInput.leftMouse.pressing || EInput.axis != Vector2.zero))
		{
			ActionMode.Adv.SetPressedAction(EInput.leftMouse);

+TraitGriffin

File Created
cs
public class TraitGriffin : TraitUniqueChara
{
	public override bool CanInvite => false;
}

TraitPillowStrange

@@ -33,7 +33,7 @@ public override void TrySetAct(ActPlan p)

cs
				owner.SetDir((owner.dir == 0) ? 1 : ((owner.dir != 1) ? ((owner.dir == 2) ? 3 : 2) : 0));
				SE.Rotate();
				return false;
			}); 
			}, owner); 
		}
	}
}

Widget

@@ -266,6 +266,33 @@ public void Activate()

cs
		{
			InstantiateDeco(deco);
		}
		RefreshOrder(); 
	} 

	public void RefreshOrder() 
	{ 
		if (!AlwaysBottom) 
		{ 
			return; 
		} 
		Type setSiblingAfter = SetSiblingAfter; 
		bool flag = false; 
		if (setSiblingAfter != null) 
		{ 
			foreach (Widget item in EMono.ui.widgets.list) 
			{ 
				if (item.GetType() == setSiblingAfter) 
				{ 
					base.transform.SetSiblingIndex(item.transform.GetSiblingIndex() + 1); 
					flag = true; 
					break; 
				} 
			} 
		} 
		if (!flag) 
		{ 
			base.transform.SetAsFirstSibling(); 
		} 
	}

	public virtual void OnActivate()

WidgetManager

@@ -199,27 +199,6 @@ public Widget ActivateWidget(string id)

cs
		{
			widget.OnManagerActivate();
		}
		if (widget.AlwaysBottom) 
		{ 
			Type setSiblingAfter = widget.SetSiblingAfter; 
			bool flag = false; 
			if (setSiblingAfter != null) 
			{ 
				foreach (Widget item in list) 
				{ 
					if (item.GetType() == setSiblingAfter) 
					{ 
						widget.transform.SetSiblingIndex(item.transform.GetSiblingIndex() + 1); 
						flag = true; 
						break; 
					} 
				} 
			} 
			if (!flag) 
			{ 
				widget.transform.SetAsFirstSibling(); 
			} 
		} 
		return widget;
	}

Zone

@@ -890,10 +890,6 @@ public void Activate()

cs
				}
				card.SetInt(55);
			}
			if (card.pos.cell.IsBlocked && !card.isRestrained && !card.HasCondition<ConSuspend>()) 
			{ 
				card.MoveImmediate(card.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? card.pos); 
			} 
			chara.SyncRide();
			if (card.c_uidMaster != 0 && chara.master == null)
			{

Zone_Field

@@ -28,7 +28,17 @@ public override float ChanceSpawnNeutral

cs
		}
	}

	public override bool UseFog => base.lv <= 0; 
	public override bool UseFog 
	{ 
		get 
		{ 
			if (!base.IsPCFaction || base.lv != 0) 
			{ 
				return base.lv <= 0; 
			} 
			return false; 
		} 
	} 

	public override ZoneFeatureType FeatureType => ZoneFeatureType.RandomField;