Skip to content

EA 23.186 Nyaightly

August 22, 2025

24 files modified. 3 new files created.

Important Changes

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

TraitDrink (2)

cs
public static void BlendLove(Chara c, Thing t, bool dream = false) 
public static void BlendLove(Chara c, Thing t, Card source, bool dream = false) 
cs
public static void BlendPoison(Chara c, Thing t) 
public static void BlendPoison(Chara c, Thing t, Card source) 

Zone (1)

cs
public void ClaimZone(bool debug = false) 
public void ClaimZone(bool debug = false, Point pos = null) 

CTAG

public enum CTAG

cs
	fairy,
	god,
	dragon,
	plant 
	plant, 
	antiSpider 
}

CardRenderer

public override void Draw(RenderParam p, ref Vector3 v, bool drawShadow)

cs
				}
				else
				{
					if (EClass.core.config.game.antiSpider && row.race == "spider" && row._tiles.Length > 1) 
					if (EClass.core.config.game.antiSpider && row.skinAntiSpider != 0) 
					{
						owner.refVal = 1; 
						owner.refVal = row.skinAntiSpider; 
					}
					p.tile = row._tiles[owner.refVal % row._tiles.Length] * ((owner.dir % 2 == 0) ? 1 : (-1));
					p.matColor = traitFigure.GetMatColor();

Chara

public override void Tick()

cs
			EClass.player.returnInfo.turns--;
			if (EClass.player.returnInfo.turns <= 0)
			{
				if (EClass.pc.burden.GetPhase() != 4 || EClass.debug.ignoreWeight) 
				if (EClass.game.Prologue.type == GameType.Survival && EClass._zone is Zone_StartSiteSky) 
				{
					int uidDest = EClass.player.returnInfo.uidDest; 
					Zone zone = null; 
					if (uidDest != 0) 
					{ 
						zone = EClass.game.spatials.map.TryGetValue(uidDest) as Zone; 
					} 
					if (zone == null || zone.destryoed) 
					{ 
						zone = EClass.world.region; 
					} 
					if (zone == EClass.game.activeZone || EClass.game.activeZone.IsRegion) 
					{ 
						Msg.Say("returnFail"); 
					} 
					else
					Msg.SayNothingHappen(); 
				} 
				else
				{ 
					if (EClass.pc.burden.GetPhase() != 4 || EClass.debug.ignoreWeight) 
					{
						Msg.Say("returnComplete"); 
						EClass.player.uidLastTravelZone = 0; 
						EClass.pc.MoveZone(zone, ZoneTransition.EnterState.Return); 
						EClass.player.lastZonePos = null; 
						int uidDest = EClass.player.returnInfo.uidDest; 
						Zone zone = null; 
						if (uidDest != 0) 
						{ 
							zone = EClass.game.spatials.map.TryGetValue(uidDest) as Zone; 
						} 
						if (zone == null || zone.destryoed) 
						{ 
							zone = EClass.world.region; 
						} 
						if (zone == EClass.game.activeZone || EClass.game.activeZone.IsRegion) 
						{ 
							Msg.Say("returnFail"); 
						} 
						else
						{ 
							Msg.Say("returnComplete"); 
							EClass.player.uidLastTravelZone = 0; 
							EClass.pc.MoveZone(zone, ZoneTransition.EnterState.Return); 
							EClass.player.lastZonePos = null; 
						} 
						EClass.player.returnInfo = null; 
						return; 
					}
					EClass.player.returnInfo = null;
					return; 
					Msg.Say("returnOverweight"); 
				}
				EClass.player.returnInfo = null; 
				Msg.Say("returnOverweight"); 
			}
		}
		if ((HasNoGoal || !ai.IsRunning) && !WillConsumeTurn())

public override CardRenderer _CreateRenderer()

cs
{
	CardRenderer cardRenderer = renderer;
	CharaRenderer charaRenderer = new CharaRenderer();
	if (race.id == "spider" && source.tiles.Length > 1) 
	if (source.skinAntiSpider != 0 && EClass.core.config.game.antiSpider) 
	{
		base.idSkin = (EClass.core.config.game.antiSpider ? 1 : 0); 
		base.idSkin = source.skinAntiSpider; 
	}
	if (host != null)
	{

ContentCodex

public void RefreshList()

cs
			{
				b.icon.transform.localScale = new Vector3(1f / EClass.core.uiScale, 1f / EClass.core.uiScale, 1f);
			}
			int idSkin = ((EClass.core.config.game.antiSpider && a.source.race == "spider" && a.source.tiles.Length > 1) ? 1 : 0); 
			int idSkin = ((EClass.core.config.game.antiSpider && a.source.skinAntiSpider != 0) ? a.source.skinAntiSpider : 0); 
			a.SetImage(b.icon, idSkin);
		},
		onList = delegate

public void RefreshInfo()

cs
		SourceChara.Row source = codexCreature.source;
		uINote.Clear();
		UIItem uIItem = uINote.AddHeader("HeaderCodex", codexCreature.Name.Replace("『", Environment.NewLine + "『"));
		int idSkin = ((EClass.core.config.game.antiSpider && codexCreature.source.race == "spider" && codexCreature.source.tiles.Length > 1) ? 1 : 0); 
		int idSkin = ((EClass.core.config.game.antiSpider && codexCreature.source.skinAntiSpider != 0) ? codexCreature.source.skinAntiSpider : 0); 
		codexCreature.SetImage(uIItem.image1, idSkin);
		uIItem.text2.text = "Lv." + source.LV + Environment.NewLine + EClass.sources.races.map[source.race].GetName().ToTitleCase(wholeText: true) + Environment.NewLine + EClass.sources.jobs.map[source.job].GetName().ToTitleCase(wholeText: true);
		uIItem.image1.rectTransform.pivot = pivot;

ContentConfigTest

public class ContentConfigTest : ContentConfig

cs

	public UIButton toggleToolNoPick;

	public UIButton toggleCompressSave; 
	public Slider sliderBrightness;

	public override void OnInstantiate()

public override void OnInstantiate()

cs
	{
		base.config.test.toolNoPick = on;
	});
	toggleCompressSave.SetToggle(base.config.test.compressSave, delegate(bool on) 
	{ 
		base.config.test.compressSave = on; 
	}); 
	toggleAlwaysRun.SetToggle(base.config.test.alwaysRun, delegate(bool on)
	{
		base.config.test.alwaysRun = on;

CoreConfig

public class Test

cs

		public bool toolNoPick;

		public bool compressSave; 
		public float brightnessNight;
	}

public class Fix

cs

	public int maxPlayedHours;

	public bool compressSave; 
	public bool ignoreParallelsWarning;

	public bool ignoreLinuxModWarning;

CoreDebug

public enum StartParty

cs
public enum StartScene
{
	Title,
	Survival, 
	Zone,
	Home,
	Home_Cave,

public void QuickStart()

cs
	case StartScene.Home:
		EClass.game.world.date.hour = EClass.debug.startHour;
		break;
	case StartScene.Survival:
		EClass.game.idPrologue = 3; 
		break; 
	case StartScene.Home_Cave:
		EClass.game.idPrologue = 2;
		break;

public void QuickStart()

cs
		break;
	case StartLoadout.FewItem:
	{
		if (startScene == StartScene.Survival) 
		{ 
			AddHotbar("pickaxe").ChangeMaterial(0); 
			break; 
		} 
		Thing thing = ThingGen.Create("backpack");
		thing.AddCard(ThingGen.Create("rp_food", -1, 10).SetNum(30));
		thing.AddCard(ThingGen.Create("rp_block", -1, 10).SetNum(30));

DramaManager

public bool CheckIF(string IF)

cs
	string[] array = IF.Split(',');
	switch (array[0])
	{
	case "survival": 
		return EMono.game.Prologue.type == GameType.Survival; 
	case "fromBook":
		return LayerDrama.fromBook;
	case "!fromBook":

EffectMeteor

public static void Create(Point center, int radius, int count, Action<int, Point

cs
			int num = 0;
			if (num < 1000)
			{
				Point randomSurface = EMono._map.GetRandomSurface(center.x, center.z, radius); 
				Point point = ((radius == 0) ? center : EMono._map.GetRandomSurface(center.x, center.z, radius)); 
				foreach (Point item in list)
				{
					randomSurface.Equals(item); 
					point.Equals(item); 
				}
				p.Set(randomSurface); 
				list.Add(randomSurface); 
				p.Set(point); 
				list.Add(point); 
			}
		}
		int _i = i;

Game

private void _OnDeserialized(StreamingContext context)

cs
	[JsonProperty]
	public GamePrincipal principal = new GamePrincipal();

	[JsonProperty] 
	public SurvivalManager survival; 
	public int gameSpeedIndex = 1;

	public int lastGameSpeedIndex = 1;

public void StartNewGame()

cs
	EClass.pc.SetGlobal();
	parties.Create(EClass.pc);
	Prologue prologue = EClass.game.Prologue;
	CharaGen.Create("fiama").SetGlobal(EClass.game.StartZone, prologue.posFiama.x, prologue.posFiama.y); 
	CharaGen.Create("ashland").SetGlobal(EClass.game.StartZone, prologue.posAsh.x, prologue.posAsh.y); 
	if (prologue.type == GameType.Survival) 
	{ 
		survival = new SurvivalManager(); 
	} 
	else
	{ 
		CharaGen.Create("fiama").SetGlobal(EClass.game.StartZone, prologue.posFiama.x, prologue.posFiama.y); 
		CharaGen.Create("ashland").SetGlobal(EClass.game.StartZone, prologue.posAsh.x, prologue.posAsh.y); 
	} 
	if ((bool)LayerTitle.actor)
	{
		world.date.hour = EClass.game.Prologue.hour;

public void StartNewGame()

cs
				z = EClass.game.Prologue.startZ
			};
			break;
		case CoreDebug.StartScene.Survival:
			EClass.game.idPrologue = 3; 
			zone5 = EClass.game.spatials.Find(EClass.game.Prologue.idStartZone); 
			transition = new ZoneTransition
			{ 
				state = ZoneTransition.EnterState.Exact, 
				x = EClass.game.Prologue.startX, 
				z = EClass.game.Prologue.startZ 
			}; 
			break; 
		case CoreDebug.StartScene.Home_Cave:
			EClass.game.idPrologue = 2;
			zone5 = EClass.game.spatials.Find(EClass.game.Prologue.idStartZone);

GameIO

public class GameIO : EClass

cs

	public static int NumBackup => (int)MathF.Max(5f, EClass.core.config.game.numBackup);

	public static bool compressSave 
	{ 
		get 
		{ 
			if (EClass.core.config.compressSave) 
			{ 
				return !EClass.debug.dontCompressSave; 
			} 
			return false; 
		} 
	} 
	public static bool compressSave => EClass.core.config.test.compressSave; 

	public static void ResetTemp()
	{

+GameType

File Created
cs
public enum GameType
{
	Default,
	Survival
}

Map

public void Save(string path, ZoneExportData export = null, PartialMap partial =

cs
			num6++;
		}
	}
	compression = IO.Compression.None; 
	IO.WriteLZ4(path + "objVals", array); 
	IO.WriteLZ4(path + "blocks", array2); 
	IO.WriteLZ4(path + "blockMats", array3); 
	IO.WriteLZ4(path + "floors", array4); 
	IO.WriteLZ4(path + "floorMats", array5); 
	IO.WriteLZ4(path + "objs", array6); 
	IO.WriteLZ4(path + "objMats", array7); 
	IO.WriteLZ4(path + "decal", array8); 
	IO.WriteLZ4(path + "flags", array10); 
	IO.WriteLZ4(path + "flags2", array11); 
	IO.WriteLZ4(path + "dirs", array9); 
	IO.WriteLZ4(path + "heights", array12); 
	IO.WriteLZ4(path + "bridges", array13); 
	IO.WriteLZ4(path + "bridgeMats", array14); 
	IO.WriteLZ4(path + "bridgeHeights", array15); 
	IO.WriteLZ4(path + "bridgePillars", array16); 
	IO.WriteLZ4(path + "roofBlocks", array18); 
	IO.WriteLZ4(path + "roofBlockMats", array19); 
	IO.WriteLZ4(path + "roofBlockDirs", array17); 
	compression = ((!EClass.core.config.test.compressSave) ? IO.Compression.None : IO.Compression.LZ4); 
	Write(path + "objVals", array); 
	Write(path + "blocks", array2); 
	Write(path + "blockMats", array3); 
	Write(path + "floors", array4); 
	Write(path + "floorMats", array5); 
	Write(path + "objs", array6); 
	Write(path + "objMats", array7); 
	Write(path + "decal", array8); 
	Write(path + "flags", array10); 
	Write(path + "flags2", array11); 
	Write(path + "dirs", array9); 
	Write(path + "heights", array12); 
	Write(path + "bridges", array13); 
	Write(path + "bridgeMats", array14); 
	Write(path + "bridgeHeights", array15); 
	Write(path + "bridgePillars", array16); 
	Write(path + "roofBlocks", array18); 
	Write(path + "roofBlockMats", array19); 
	Write(path + "roofBlockDirs", array17); 
	things.Sort((Thing a, Thing b) => a.stackOrder - b.stackOrder);
	if (export == null)
	{

public void Save(string path, ZoneExportData export = null, PartialMap partial =

cs
			things = list;
		}
		serializedCharas.Clear();
		void Write(string _path, byte[] bytes) 
		{ 
			IO.WriteLZ4(_path, bytes, compression); 
		} 
	}

	public byte[] TryLoadFile(string path, string s, int size)

public void MineObj(Point point, Task task = null, Chara c = null)

cs
			{
				MineBlock(point, recoverBlock: false, c, mineObj: false);
			}
			if (EClass.game.Prologue.type == GameType.Survival && EClass._zone is Zone_StartSiteSky && !EClass.scene.actionMode.IsBuildMode) 
			{ 
				if (TrySpawnSurvivalItem(point)) 
				{ 
					Rand.SetSeed(); 
					return; 
				} 
				Rand.SetSeed(); 
			} 
			switch (sourceObj.alias)
			{
			case "nest_bird":

public void MineObjSound(Point point)

cs
		point.PlaySound(point.cell.matObj.GetSoundDead(point.cell.sourceObj));
	}

	public bool TrySpawnSurvivalItem(Point point) 
	{ 
		SourceObj.Row sourceObj = point.cell.sourceObj; 
		int searchWreck = EClass.game.survival.flags.searchWreck; 
		string[] array = new string[6] { "log", "rock", "branch", "bone", "grass", "vine" }; 
		int chanceChange = 25; 
		int num = searchWreck / 50 + 3; 
		switch (sourceObj.alias) 
		{ 
		case "nest_bird": 
			chanceChange = 100; 
			return Pop(ThingGen.Create((EClass.rnd(10) == 0) ? "egg_fertilized" : "_egg").TryMakeRandomItem(num)); 
		case "wreck_wood": 
			array = new string[5] { "log", "log", "branch", "grass", "vine" }; 
			break; 
		case "wreck_junk": 
			chanceChange = 50; 
			return Pop(ThingGen.CreateFromFilter("shop_junk", num)); 
		case "wreck_stone": 
			array = new string[4] { "rock", "rock", "stone", "bone" }; 
			break; 
		case "wreck_scrap": 
			chanceChange = 75; 
			array = new string[1] { "scrap" }; 
			break; 
		case "wreck_cloth": 
			chanceChange = 75; 
			array = new string[1] { "fiber" }; 
			break; 
		case "wreck_precious": 
			chanceChange = 100; 
			return Pop(ThingGen.CreateFromFilter("shop_magic", num)); 
		default: 
			return false; 
		} 
		if (EClass.rnd(3) == 0 && EClass.game.survival.flags.spawnedFloor < 4) 
		{ 
			EClass.game.survival.flags.spawnedFloor++; 
			return Pop(ThingGen.CreateFloor(40, 45).SetNum(3)); 
		} 
		if (EClass.rnd(20) == 0) 
		{ 
			return Pop(TraitSeed.MakeRandomSeed()); 
		} 
		if (EClass.rnd(12) == 0) 
		{ 
			return Pop(ThingGen.Create("money2")); 
		} 
		if (EClass.rnd(12) == 0) 
		{ 
			Point pos = point.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: false, ignoreCenter: true) ?? point; 
			if (searchWreck < 50 || EClass.rnd(3) != 0) 
			{ 
				EClass._zone.SpawnMob(pos, SpawnSetting.HomeWild(num)); 
			} 
			else
			{ 
				EClass._zone.SpawnMob(pos, SpawnSetting.HomeEnemy(Mathf.Max(num - 5, 1))); 
			} 
		} 
		return Pop(ThingGen.Create(array.RandomItem()).SetNum(1 + EClass.rnd(3))); 
		bool Next() 
		{ 
			EClass.game.survival.flags.searchWreck++; 
			Point pos2 = point.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: false, ignoreCenter: true) ?? point; 
			if (EClass.game.survival.flags.searchWreck == 20) 
			{ 
				EffectMeteor.Create(pos2, 0, 1, delegate
				{ 
					EClass._zone.AddCard(ThingGen.CreateRecipe("container_shipping"), pos2); 
				}); 
			} 
			NextObj(); 
			return true; 
		} 
		void NextObj() 
		{ 
			if (EClass.rnd(100) < chanceChange) 
			{ 
				string[] source = new string[11] 
				{ 
					"nest_bird", "wreck_wood", "wreck_wood", "wreck_wood", "wreck_wood", "wreck_stone", "wreck_stone", "wreck_scrap", "wreck_junk", "wreck_cloth", 
					"wreck_precious"
				}; 
				SetObj(point.x, point.z, EClass.sources.objs.alias[source.RandomItem()].id); 
			} 
		} 
		bool Pop(Thing t) 
		{ 
			TrySmoothPick(point, t, EClass.pc); 
			Next(); 
			return true; 
		} 
	} 
	public PlantData TryGetPlant(Point p)
	{
		return plants.TryGetValue(p.index);

Prologue

[Serializable]

cs
[Serializable]
public class Prologue
{
	public GameType type; 
	public string idStartZone;

	public int startX;

SourceChara

public class Row : CardRow

cs

		public int[] _tiles_snow;

		public int skinAntiSpider; 
		[NonSerialized]
		public SourceRace.Row _race_row;

public override void SetTiles()

cs
	{
		base.SetTiles();
		staticSkin = HasTag(CTAG.staticSkin);
		if ((bool)renderData && (bool)renderData.pass && (_tiles_snow == null || _tiles_snow.Length != tiles_snow.Length)) 
		if (!renderData || !renderData.pass) 
		{ 
			return; 
		} 
		if (_tiles_snow == null || _tiles_snow.Length != tiles_snow.Length) 
		{
			_tiles_snow = new int[tiles_snow.Length];
			for (int i = 0; i < tiles_snow.Length; i++)

public override void SetTiles()

cs
					_tiles_snow[i] = tiles_snow[i] / 100 * (int)renderData.pass.pmesh.tiling.x + tiles_snow[i] % 100;
				}
			}
			skinAntiSpider = ((staticSkin && HasTag(CTAG.antiSpider)) ? 1 : 0); 
		}

		public override string GetName()

+SurvivalManager

File Created
cs
using System.Runtime.Serialization;
using Newtonsoft.Json;

public class SurvivalManager : EClass
{
	public class Flags : EClass
	{
		[JsonProperty]
		public int[] ints = new int[50];

		public BitArray32 bits;

		public int spawnedFloor
		{
			get
			{
				return ints[3];
			}
			set
			{
				ints[3] = value;
			}
		}

		public int floors
		{
			get
			{
				return ints[4];
			}
			set
			{
				ints[4] = value;
			}
		}

		public int searchWreck
		{
			get
			{
				return ints[5];
			}
			set
			{
				ints[5] = value;
			}
		}

		[OnSerializing]
		private void _OnSerializing(StreamingContext context)
		{
			ints[0] = (int)bits.Bits;
		}

		[OnDeserialized]
		private void _OnDeserialized(StreamingContext context)
		{
			bits.Bits = (uint)ints[0];
		}
	}

	[JsonProperty]
	public Flags flags = new Flags();
}

TaskBuild

public override void OnProgressComplete()

cs
				_ = (item.trait as TraitNewZone).IsDownstairs;
			}
		}
		if (ActionMode.Build.IsActive && ActionMode.Build.IsRoofEditMode()) 
		if (!ActionMode.Build.IsActive || !ActionMode.Build.IsRoofEditMode()) 
		{ 
			pos.ForeachMultiSize(recipe.W, recipe.H, delegate(Point p, bool center) 
			{ 
				if (p.IsBlocked && p.HasChara) 
				{ 
					foreach (Chara item2 in p.ListCharas()) 
					{ 
						EClass.pc.Kick(item2, ignoreSelf: true, karmaLoss: false, show: false); 
					} 
				} 
			}); 
		} 
		if (EClass.game.Prologue.type != GameType.Survival || !(EClass._zone is Zone_StartSiteSky)) 
		{
			return;
		}
		pos.ForeachMultiSize(recipe.W, recipe.H, delegate(Point p, bool center) 
		int i = 0; 
		EClass._map.ForeachCell(delegate(Cell c) 
		{
			if (p.IsBlocked && p.HasChara) 
			if (!c.sourceFloor.tileType.IsSkipFloor) 
			{
				foreach (Chara item2 in p.ListCharas()) 
				{ 
					EClass.pc.Kick(item2, ignoreSelf: true, karmaLoss: false, show: false); 
				} 
				i++; 
			}
		});
		if (EClass.game.survival.flags.floors < 9 && i >= 9) 
		{ 
			EffectMeteor.Create(pos, 0, 1, delegate
			{ 
				EClass._zone.ClaimZone(debug: false, pos); 
			}); 
			EClass.game.survival.flags.floors = 9; 
		} 
		else if (EClass.game.survival.flags.floors < 15 && i >= 15) 
		{ 
			EffectMeteor.Create(pos, 0, 1, delegate
			{ 
				EClass.pc.homeBranch.AddMemeber(EClass._zone.AddCard(CharaGen.Create("fiama"), pos.x, pos.z).Chara); 
			}); 
			EClass.game.survival.flags.floors = 15; 
		} 
		else if (EClass.game.survival.flags.floors < 25 && i >= 25) 
		{ 
			EffectMeteor.Create(pos, 0, 1, delegate
			{ 
				EClass.pc.homeBranch.AddMemeber(EClass._zone.AddCard(CharaGen.Create("nino"), pos.x, pos.z).Chara); 
			}); 
			EClass.game.survival.flags.floors = 25; 
		} 
		else if (EClass.game.survival.flags.floors < 40 && i >= 40) 
		{ 
			EffectMeteor.Create(pos, 0, 1, delegate
			{ 
				EClass.pc.homeBranch.AddMemeber(EClass._zone.AddCard(CharaGen.Create("loytel"), pos.x, pos.z).Chara); 
			}); 
			EClass.game.survival.flags.floors = 40; 
		} 
		else if (EClass.game.survival.flags.floors < 50 && i >= 50) 
		{ 
			EffectMeteor.Create(pos, 0, 1, delegate
			{ 
				EClass._zone.AddCard(ThingGen.Create("core_defense"), pos).Install(); 
			}); 
			EClass.game.survival.flags.floors = 50; 
		} 
	}

	public override void OnDestroy()

TaskHarvest

public override bool IsHostileAct

cs
		}
	}

	public override bool Loop 
	{ 
		get 
		{ 
			if (EClass.game.Prologue.type == GameType.Survival && EClass._zone is Zone_StartSite) 
			{ 
				return CanProgress(); 
			} 
			return false; 
		} 
	} 
	public override bool CanManualCancel()
	{
		return true;

TraitDreamBug

public override bool CanBlend(Thing t)

cs

	public override void OnBlend(Thing t, Chara c)
	{
		TraitDrink.BlendLove(EClass.pc, t, dream: true); 
		TraitDrink.BlendLove(EClass.pc, t, owner, dream: true); 
		owner.ModNum(-1);
	}
}

TraitDrink

public override void OnBlend(Thing t, Chara c)

cs
	switch (IdEffect)
	{
	case EffectId.Love:
		BlendLove(c, t); 
		BlendLove(c, t, owner); 
		break;
	case EffectId.Poison:
		BlendPoison(c, t); 
		BlendPoison(c, t, owner); 
		break;
	case EffectId.Acidproof:
		c.Say("coated", t, c);

public override void OnBlend(Thing t, Chara c)

cs
		owner.ModNum(-1);
	}

	public static void BlendLove(Chara c, Thing t, bool dream = false) 
	public static void BlendLove(Chara c, Thing t, Card source, bool dream = false) 
	{
		Msg.Say("blend_love", t);
		Thing thing = t.Split(1);
		thing.elements.ModBase(dream ? 704 : 703, t.IsBlessed ? 15 : (t.IsCursed ? 5 : 10)); 
		thing.elements.ModBase(dream ? 704 : 703, source.IsBlessed ? 15 : (source.IsCursed ? 5 : 10)); 
		c.Pick(thing);
	}

	public static void BlendPoison(Chara c, Thing t) 
	public static void BlendPoison(Chara c, Thing t, Card source) 
	{
		Msg.Say("blend_poison", t);
		Thing thing = t.Split(1);
		thing.elements.ModBase(702, t.IsBlessed ? 5 : (t.IsCursed ? 15 : 10)); 
		thing.elements.ModBase(702, source.IsBlessed ? 5 : (source.IsCursed ? 15 : 10)); 
		c.Pick(thing);
	}

TraitFakeBlock

public override void OnCreate(int lv)

cs

	public override void OnCrafted(Recipe recipe, List<Thing> ings)
	{
		if (ings == null || ings.Count == 0) 
		{ 
			owner.refVal = 1; 
			return; 
		} 
		TraitBlock traitBlock = ings[0].trait as TraitBlock;
		owner.refVal = traitBlock.source.id;
	}

TraitFigure

public override void OnSetCardGrid(ButtonGrid b)

cs
	{
		SourceChara.Row row = EClass.sources.charas.map.TryGetValue(owner.c_idRefCard) ?? EClass.sources.charas.map["putty"];
		Transform transform = b.Attach<Transform>("figure", rightAttach: false);
		int idSkin = ((EClass.core.config.game.antiSpider && row.race == "spider" && row.tiles.Length > 1) ? 1 : 0); 
		int idSkin = ((EClass.core.config.game.antiSpider && row.skinAntiSpider != 0) ? row.skinAntiSpider : 0); 
		row.SetImage(transform.GetChild(0).GetComponent<Image>(), null, 0, setNativeSize: false, 0, idSkin);
	}
}

TraitMapBoard

public override void TrySetAct(ActPlan p)

cs
		uIContextMenu3.Show();
		return false;
	}, owner);
	p.TrySetAct("actChangeSkyBlockHeight", delegate
	if (EClass._zone.IsSkyLevel) 
	{
		UIContextMenu uIContextMenu2 = EClass.ui.CreateContextMenuInteraction(); 
		uIContextMenu2.AddSlider("adjustment", (float a) => a.ToString() ?? "", EClass._map.config.skyBlockHeight, delegate(float b) 
		p.TrySetAct("actChangeSkyBlockHeight", delegate 
		{
			EClass._map.config.skyBlockHeight = (int)b; 
		}, 1f, 20f, isInt: true, hideOther: false); 
		uIContextMenu2.Show(); 
		return false; 
	}, owner); 
			UIContextMenu uIContextMenu2 = EClass.ui.CreateContextMenuInteraction(); 
			uIContextMenu2.AddSlider("adjustment", (float a) => a.ToString() ?? "", EClass._map.config.skyBlockHeight, delegate(float b) 
			{ 
				EClass._map.config.skyBlockHeight = (int)b; 
			}, 1f, 20f, isInt: true, hideOther: false); 
			uIContextMenu2.Show(); 
			return false; 
		}, owner); 
	} 
	p.TrySetAct("actChangeMapBG", delegate
	{
		LayerList layerList2 = EClass.ui.AddLayer<LayerList>().SetSize(400f);

TraitWaystone

public override void TrySetAct(ActPlan p)

cs
	}
	else
	{
		if (!EClass._zone.parent.IsRegion || (EClass._zone.IsInstance && !EClass._zone.IsUserZone) || EClass._zone is Zone_Dungeon) 
		if (!EClass._zone.parent.IsRegion || (EClass._zone.IsInstance && !EClass._zone.IsUserZone) || EClass._zone is Zone_Dungeon || EClass._zone is Zone_StartSiteSky) 
		{
			return;
		}

Zone

public void UnloadMap()

cs
		Debug.Log("Unloaded Map:" + this);
	}

	public void ClaimZone(bool debug = false) 
	public void ClaimZone(bool debug = false, Point pos = null) 
	{
		EClass._map.RevealAll();
		SetMainFaction(EClass.pc.faction);

public void ClaimZone(bool debug = false)

cs
		EClass.Branch.Log("claimedZone");
		EClass.Sound.Play("jingle_embark");
		EClass.pc.PlaySound("build");
		Effect.Get("aura_heaven").Play(EClass.pc.pos); 
		Point nearestPoint = EClass.pc.pos.GetNearestPoint(allowBlock: false, allowChara: true, allowInstalled: false); 
		EClass._zone.AddCard(ThingGen.Create("core_zone"), nearestPoint).SetPlaceState(PlaceState.installed); 
		if (pos == null) 
		{ 
			pos = EClass.pc.pos.GetNearestPoint(allowBlock: false, allowChara: true, allowInstalled: false); 
		} 
		Effect.Get("aura_heaven").Play(pos); 
		EClass._zone.AddCard(ThingGen.Create("core_zone"), pos).SetPlaceState(PlaceState.installed); 
	}
	base.idPrefix = 0;
	if (EClass._zone == EClass.game.StartZone)

+Zone_StartSiteSky

File Created
cs
public class Zone_StartSiteSky : Zone_StartSite
{
	public override bool UseFog => false;

	public override bool IsSkyLevel => true;

	public override string IDBaseLandFeat => "bfPlain,bfFertile,bfStart";

	public override bool BlockBorderExit => true;
}

Zone_VernisMine

using UnityEngine;

cs
using UnityEngine; 
public class Zone_VernisMine : Zone_QuestDungeon
{
	public const int LvBoss = -8;

	public bool IsBossLv => base.lv == -8;

	public override int DangerLv => base.DangerLv + 5; 
	public override int DangerLv => 5 + Mathf.Abs(base.lv); 

	public override bool LockExit
	{