Skip to content

EA 23.59 Nightly

December 17, 2024

21 files modified. 2 new files created.

Important Changes

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

CalcMoney (1)

cs
public static int Whore(Chara c) 
public static int Whore(Chara seller, Chara buyer) 

AI_Fuck

@@ -1,4 +1,5 @@

cs
using System.Collections.Generic;
using UnityEngine; 

public class AI_Fuck : AIAct
{

@@ -63,7 +64,7 @@ public override IEnumerable<Status> Run()

cs
		cc.SetTempHand(1104, -1);
	}
	int destDist = ((Type == FuckType.fuck) ? 1 : 1);
	maxProgress = 25; 
	maxProgress = ((!EClass.debug.enable) ? 25 : 0); 
	if (succubus)
	{
		cc.Talk("seduce");

@@ -152,7 +153,7 @@ public void Finish()

cs
				chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
			}
		}
		int num = CalcMoney.Whore(chara2); 
		int num = CalcMoney.Whore(chara2, chara); 
		chara.Talk("tail_after");
		bool flag2 = false;
		if (succubus)

@@ -171,11 +172,16 @@ public void Finish()

cs
				chara = chara5;
				chara2 = chara4;
			}
			if (!chara.IsPCParty && chara2 == EClass.pc && EClass.rnd(4) != 0) 
			Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num); 
			if (!chara.IsPC) 
			{
				num = num / 5 + 1; 
				chara.ModCurrency(num); 
				chara.ModCurrency(EClass.rndHalf(num)); 
			}
			if (!chara2.IsPC && chara.GetCurrency() < num && EClass.rnd(2) == 0) 
			{ 
				num = chara.GetCurrency(); 
			} 
			Debug.Log("money:" + num + " buyer:" + chara.GetCurrency()); 
			if (chara.GetCurrency() >= num)
			{
				chara.Talk("tail_pay");

@@ -187,7 +193,7 @@ public void Finish()

cs
				chara2.Say("angry", chara2);
				chara2.Talk("angry");
				flag = (sell ? true : false);
				if (EClass.rnd(20) == 0) 
				if (EClass.rnd(chara.IsPC ? 2 : 20) == 0) 
				{
					flag2 = true;
				}

@@ -203,7 +209,15 @@ public void Finish()

cs
			}
			else
			{
				chara2.ModCurrency(num); 
				int num2 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10); 
				if (chara2.GetCurrency() - num2 > 0) 
				{ 
					chara2.c_allowance += num; 
				} 
				else
				{ 
					chara2.ModCurrency(num); 
				} 
			}
			chara = chara4;
			chara2 = chara5;

AI_UseCrafter

@@ -173,6 +173,13 @@ public override IEnumerable<Status> Run()

cs
				}
				return !crafter.owner.isDestroyed;
			},
			onProgressBegin = delegate
			{ 
				if (crafter is TraitRollingFortune) 
				{ 
					crafter.owner.animeCounter = 0.01f; 
				} 
			}, 
			onProgress = delegate
			{
				if (crafter.owner.ExistsOnMap && !owner.pos.Equals(crafter.owner.pos))

ActEffect

@@ -838,10 +838,10 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		{
			return;
		}
		Thing thing2 = ThingGen.Create("mine"); 
		thing2.c_idRefCard = "dog_mine"; 
		Thing thing = ThingGen.Create("mine"); 
		thing.c_idRefCard = "dog_mine"; 
		Zone.ignoreSpawnAnime = true;
		EClass._zone.AddCard(thing2, CC.pos).Install(); 
		EClass._zone.AddCard(thing, CC.pos).Install(); 
		break;
	}
	case EffectId.MagicMap:

@@ -894,9 +894,9 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		TC.PlaySound("curse3");
		TC.PlayEffect("curse");
		TC.Say("forgetItems", TC);
		int num4 = power / 50 + 1 + EClass.rnd(3); 
		int num = power / 50 + 1 + EClass.rnd(3); 
		List<Thing> source = TC.things.List((Thing t) => t.c_IDTState == 0);
		for (int j = 0; j < num4; j++) 
		for (int i = 0; i < num; i++) 
		{
			source.RandomItem().c_IDTState = 5;
		}

@@ -985,7 +985,7 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		}
		cc.PlaySound("offering");
		cc.PlayEffect("buff");
		int num3 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		int num4 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		tc.isWeightChanged = true;
		Element orCreateElement = tc.elements.GetOrCreateElement(64);
		Element orCreateElement2 = tc.elements.GetOrCreateElement(65);

@@ -994,10 +994,10 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		bool flag3 = tc.IsEquipmentOrRanged || tc.IsThrownWeapon || tc.IsAmmo;
		if (flag)
		{
			num3 = (int)(0.01f * (float)num3 * (float)power * 0.75f + 500f); 
			if (num3 < 1) 
			num4 = (int)(0.01f * (float)num4 * (float)power * 0.75f + 500f); 
			if (num4 < 0 || num4 > 10000000) 
			{
				num3 = 1; 
				num4 = 10000000; 
			}
			if (flag3)
			{

@@ -1016,7 +1016,7 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		}
		else
		{
			num3 = num3 * (100 - power / 10) / 100; 
			num4 = num4 * (100 - power / 10) / 100; 
			if (blessed)
			{
				power /= 4;

@@ -1036,7 +1036,7 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
			}
			cc.Say("lighten", cc, tc);
		}
		tc.c_weight = num3; 
		tc.c_weight = num4; 
		tc.SetDirtyWeight();
		if (tc.parent == null)
		{

@@ -1060,13 +1060,13 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		cc.PlayEffect("identify");
		cc.Say("reconstruct", cc, tc);
		EClass.game.cards.uidNext += EClass.rnd(30);
		Thing thing = ThingGen.Create(tc.id, -1, tc.LV * power / 100); 
		thing.SetBlessedState(state); 
		Thing thing2 = ThingGen.Create(tc.id, -1, tc.LV * power / 100); 
		thing2.SetBlessedState(state); 
		tc.Destroy();
		CC.Pick(thing, msg: false); 
		CC.Pick(thing2, msg: false); 
		if (!CC.IsPC)
		{
			CC.TryEquip(thing); 
			CC.TryEquip(thing2); 
		}
		break;
	}

@@ -1087,36 +1087,36 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
		string name = tc.Name;
		if (row == null)
		{
			bool num = id == EffectId.ChangeMaterialGreater; 
			bool num2 = id == EffectId.ChangeMaterialGreater; 
			bool flag2 = id == EffectId.ChangeMaterialLesser;
			string text2 = tc.Thing.source.tierGroup;
			Dictionary<string, SourceMaterial.TierList> tierMap = SourceMaterial.tierMap;
			int num2 = 1; 
			int num3 = 1; 
			if (flag)
			{
				num2 -= 2; 
				num3 -= 2; 
			}
			if (blessed)
			{
				num2++; 
				num3++; 
			}
			if (num) 
			if (num2) 
			{
				num2++; 
				num3++; 
			}
			if (flag2)
			{
				num2 -= 2; 
				num3 -= 2; 
			}
			num2 = Mathf.Clamp(num2 + EClass.rnd(2), 0, 4); 
			num3 = Mathf.Clamp(num3 + EClass.rnd(2), 0, 4); 
			if (EClass.rnd(10) == 0)
			{
				text2 = ((text2 == "metal") ? "leather" : "metal");
			}
			SourceMaterial.TierList tierList = (text2.IsEmpty() ? tierMap.RandomItem() : tierMap[text2]);
			for (int i = 0; i < 1000; i++) 
			for (int j = 0; j < 1000; j++) 
			{
				row = tierList.tiers[num2].Select(); 
				row = tierList.tiers[num3].Select(); 
				if (row != tc.material)
				{
					break;

AttackProcess

@@ -171,12 +171,12 @@ public void Prepare(Chara _CC, Thing _weapon, Card _TC = null, Point _TP = null,

cs
			weaponSkill = CC.elements.GetOrCreateElement(305);
		}
		attackType = ((!CC.race.meleeStyle.IsEmpty()) ? CC.race.meleeStyle.ToEnum<AttackType>() : ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch));
		dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, CC.STR / 5 + weaponSkill.Value / 4)); 
		dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.GetParent(CC).Value / 5 + weaponSkill.Value / 4)); 
		dNum = 2 + Mathf.Min(weaponSkill.Value / 10, 4);
		dDim = 5 + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.Value / 3));
		dMulti = 0.6f + (float)(CC.STR / 2 + weaponSkill.Value / 2 + CC.Evalue(flag2 ? 304 : 132) / 2) / 50f; 
		dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value / 2 + weaponSkill.Value / 2 + CC.Evalue(flag2 ? 304 : 132) / 2) / 50f; 
		dMulti += 0.05f * (float)CC.Evalue(1400);
		toHitBase = EClass.curve(CC.DEX / 3 + CC.STR / 3 + weaponSkill.Value, 50, 25) + 50; 
		toHitBase = EClass.curve(CC.DEX / 3 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50; 
		toHitFix = CC.HIT;
		if (attackStyle == AttackStyle.Shield)
		{

@@ -339,11 +339,12 @@ public void PlayRangedAnime(int numFire)

cs
	Point _TP = posRangedAnime.Copy();
	Thing _weapon = weapon;
	bool ignoreSound = ignoreAttackSound;
	Zone _zone = CC.currentZone; 
	for (int i = 0; i < numFire; i++)
	{
		TweenUtil.Delay((float)i * data.delay, delegate
		{
			if (EClass.core.IsGameStarted && _CC.IsAliveInCurrentZone) 
			if (EClass.core.IsGameStarted && _CC.IsAliveInCurrentZone && _zone == _CC.currentZone) 
			{
				if (_weapon.id == "gun_rail")
				{

CalcMoney

@@ -47,9 +47,16 @@ public static int SellSlave(Chara c)

cs
		return (c.LV + 5) * (c.LV + 5) * 5;
	}

	public static int Whore(Chara c) 
	public static int Whore(Chara seller, Chara buyer) 
	{
		return Negotiate(c.CHA * 4 + 20 + EClass.player.tempFame / 10); 
		int num = Mathf.Max(seller.CHA * 6, 20) * ((!buyer.IsWealthy) ? 1 : 2); 
		int num2 = Mathf.Max(buyer.CHA * 12, 20) * ((!buyer.IsWealthy) ? 1 : 2); 
		Debug.Log("seller:" + num + " buyer:" + num2 + " wealthy:" + buyer.IsWealthy); 
		if (num > num2) 
		{ 
			num = num2; 
		} 
		return num; 
	}

	public static int InvestShop(Chara c, Chara tc)

Card

@@ -3930,6 +3930,10 @@ public void DamageHP(int dmg, int ele, int eleP = 100, AttackSource attackSource

cs
			if (attackSource == AttackSource.Melee && HasElement(1221))
			{
				int ele2 = ((Chara.MainElement == Element.Void) ? 924 : Chara.MainElement.id);
				if (id == "hedgehog_ether") 
				{ 
					ele2 = 922; 
				} 
				Say("reflect_thorne", this, origin);
				origin.DamageHP(Mathf.Clamp(dmg / 20, 1, MaxHP / 20), ele2, Power, AttackSource.Condition);
			}

Chara

@@ -1509,15 +1509,14 @@ public Chara Duplicate()

cs
	chara.stamina.value = stamina.value;
	foreach (KeyValuePair<int, Element> item in elements.dict)
	{
		Element element = chara.elements.GetElement(item.Key); 
		if (element != null) 
		{ 
			element.vBase = item.Value.ValueWithoutLink - element.vSource; 
		} 
		Element orCreateElement = chara.elements.GetOrCreateElement(item.Key); 
		orCreateElement.vBase = item.Value.ValueWithoutLink - orCreateElement.vSource; 
	}
	chara.SetFaith(faith);
	chara.bio = IO.DeepCopy(bio);
	chara.LV = base.LV;
	chara.c_daysWithGod = base.c_daysWithGod; 
	chara.RefreshFaithElement(); 
	chara.hp = (int)Mathf.Clamp((float)chara.MaxHP * ((float)base.hp / (float)MaxHP) * 0.99f, 0f, chara.MaxHP);
	chara.isCopy = true;
	if (HaveFur())

@@ -3762,6 +3761,7 @@ public Thing Pick(Thing t, bool msg = true, bool tryStack = true)

cs
	{
		return t;
	}
	t = TryPoisonPotion(t); 
	ThingContainer.DestData dest = things.GetDest(t, tryStack);
	if (!dest.IsValid)
	{

@@ -3791,6 +3791,17 @@ public Thing Pick(Thing t, bool msg = true, bool tryStack = true)

cs
			return dest.stack;
		}
		TryAbsorbRod(t);
		if (msg) 
		{ 
			PlaySound("pick_thing"); 
			Say("pick_thing", this, t); 
		} 
		TryReservePickupTutorial(t); 
		return dest.container.AddThing(t, tryStack); 
	} 

	public Thing TryPoisonPotion(Thing t) 
	{ 
		if (t.trait is TraitPotion && t.id != "1165" && !t.source.tag.Contains("neg") && EClass.rnd(2) == 0 && HasElement(1565))
		{
			string text = EClass.sources.things.rows.Where((SourceThing.Row a) => a._origin == "potion" && a.tag.Contains("neg")).ToList().RandomItemWeighted((SourceThing.Row a) => a.chance)

@@ -3800,13 +3811,7 @@ public Thing Pick(Thing t, bool msg = true, bool tryStack = true)

cs
			t.Destroy();
			t = ThingGen.Create(text).SetNum(num);
		}
		if (msg) 
		{ 
			PlaySound("pick_thing"); 
			Say("pick_thing", this, t); 
		} 
		TryReservePickupTutorial(t); 
		return dest.container.AddThing(t, tryStack); 
		return t; 
	}

	public void TryAbsorbRod(Thing t)

ConDisease

@@ -1,7 +1,11 @@

cs
using System.Linq;
using Newtonsoft.Json; 

public class ConDisease : BadCondition
{
	[JsonProperty] 
	private ElementContainer ec = new ElementContainer(); 

	public override bool PreventRegen
	{
		get

@@ -17,8 +21,7 @@ public override bool PreventRegen

cs
	public override void SetOwner(Chara _owner, bool onDeserialize = false)
	{
		base.SetOwner(_owner);
		elements = new ElementContainer(); 
		elements.SetParent(owner); 
		ec.SetParent(owner); 
	}

	public override void Tick()

@@ -27,10 +30,15 @@ public override void Tick()

cs
		{
			Mod((EClass.rnd(2) == 0) ? 1 : (-1));
		}
		if (EClass.rnd(200) == 0) 
		if (EClass.rnd(EClass.debug.enable ? 1 : 200) == 0) 
		{
			SourceElement.Row row = EClass.sources.elements.rows.Where((SourceElement.Row e) => e.tag.Contains("primary")).RandomItem();
			elements.ModBase(row.id, -1); 
			ec.ModBase(row.id, -1); 
		}
	}

	public override void OnRemoved() 
	{ 
		ec.SetParent(); 
	} 
}

CoreDebug

@@ -930,6 +930,7 @@ public void UpdateInput()

cs
	}
	if (Input.GetKeyDown(KeyCode.F3))
	{
		EClass.pc.AddCondition<ConDisease>(); 
		(EClass.pc.AddCondition<ConStrife>() as ConStrife).lv = 6;
		for (int i = 0; i < 10; i++)
		{

DramaCustomSequence

@@ -198,7 +198,7 @@ public void Build(Chara c)

cs
		{
			Choice2("daBout", "_bout");
		}
		if (c.isDrunk) 
		if (c.isDrunk || EClass.debug.enable) 
		{
			Choice2(flag2 ? "daBird" : "daTail", "_tail");
		}

@@ -647,7 +647,7 @@ public void Build(Chara c)

cs
	Step("_whore");
	Method(delegate
	{
		int costWhore = CalcMoney.Whore(c); 
		int costWhore = CalcMoney.Whore(c, EClass.pc); 
		GameLang.refDrama1 = costWhore.ToString() ?? "";
		TempTalkTopic(bird + "3", null);
		Choice("yes2", delegate

FoodEffect

@@ -96,7 +96,6 @@ public static void Proc(Chara c, Thing food)

cs
	bool flag3 = IsUndeadFlesh(food);
	bool flag4 = c.HasElement(1205);
	bool flag5 = food.IsDecayed || flag3;
	Debug.Log(flag2 + "/" + flag4); 
	if (food.IsBlessed)
	{
		num2 *= 1.5f;

Game

@@ -437,6 +437,12 @@ public void OnLoad()

cs
			}
		}
	});
	if (version.IsBelow(0, 23, 59)) 
	{ 
		while (TryDestroy()) 
		{ 
		} 
	} 
	if (version.IsBelow(0, 23, 52))
	{
		player.flags.toggleHotbarHighlightActivated = true;

@@ -574,6 +580,27 @@ void TryAddQuestIfActive(string idQuest, string idReqQuest)

cs
				quests.Add(idQuest);
			}
		}
		static bool TryDestroy() 
		{ 
			for (int i = 0; i < EClass.pc.party.members.Count; i++) 
			{ 
				Chara chara3 = EClass.pc.party.members[i]; 
				Debug.Log(chara3.id + "/" + chara3.uid + "/" + chara3._cints[1]); 
				for (int j = 0; j < EClass.pc.party.members.Count; j++) 
				{ 
					Chara chara4 = EClass.pc.party.members[j]; 
					if (i != j && chara3.uid == chara4.uid) 
					{ 
						EClass.pc.party.uidMembers.RemoveAt(j); 
						EClass.pc.party.members.RemoveAt(j); 
						chara4.Destroy(); 
						Debug.Log("Destroyed"); 
						return true; 
					} 
				} 
			} 
			return false; 
		} 
	}

	public static void Create(string _id = null, bool cloud = false)

GameDate

@@ -192,6 +192,10 @@ public void AdvanceDay()

cs
				EClass.world.SendPackage(p);
			}
		}
		if (base.day == 25 && base.month == 12) 
		{ 
			EClass.world.SendPackage(ThingGen.Create("box_xmas")); 
		} 
	}

	public void AdvanceMonth()

Player

@@ -737,6 +737,9 @@ public void OnLeaveZone()

cs
	[JsonProperty]
	public int debt;

	[JsonProperty] 
	public int seedFortune; 

	[JsonProperty]
	public float angle;

@@ -977,8 +980,6 @@ public void OnLeaveZone()

cs

	public List<Chara> listSummon = new List<Chara>();

	public int tempFame; 

	public int autoCombatStartHP;

	public Zone nextZone;

Thing

@@ -1437,7 +1437,7 @@ public override void SetRenderParam(RenderParam p)

cs
		{
			animeCounter += Time.deltaTime;
			int num3 = (int)(animeCounter / (0.001f * (float)source.anime[1]));
			if (num3 > source.anime[2]) 
			if (num3 > ((source.anime.Length > 2) ? source.anime[2] : source.anime[0])) 
			{
				animeCounter = 0f;
			}

TraitBaseSpellbook

@@ -202,7 +202,10 @@ public override void OnRead(Chara c)

cs
					EClass.player.codex.AddWeakspot(cardRow.id);
				}
			}
			ActEffect.Proc(EffectId.Sleep, c); 
			if (c.conSleep != null) 
			{ 
				ActEffect.Proc(EffectId.Sleep, c); 
			} 
			break;
		case Type.Dojin:
		{

TraitCrafter

@@ -14,7 +14,8 @@ public enum MixType

cs
		Sculpture,
		Talisman,
		Scratch,
		Incubator 
		Incubator, 
		Fortune 
	}

	public enum AnimeType

@@ -276,8 +277,8 @@ public virtual Thing Craft(AI_UseCrafter ai)

cs
		break;
	case MixType.Resource:
	{
		string[] array = thing3.Split('%'); 
		t = CraftUtil.MixIngredients(ThingGen.Create(array[0], (array.Length > 1) ? EClass.sources.materials.alias[array[1]].id : thing.material.id), ai.ings, CraftUtil.MixType.General, 999, EClass.pc).Thing; 
		string[] array3 = thing3.Split('%'); 
		t = CraftUtil.MixIngredients(ThingGen.Create(array3[0], (array3.Length > 1) ? EClass.sources.materials.alias[array3[1]].id : thing.material.id), ai.ings, CraftUtil.MixType.General, 999, EClass.pc).Thing; 
		break;
	}
	case MixType.Dye:

@@ -315,18 +316,18 @@ public virtual Thing Craft(AI_UseCrafter ai)

cs
	}
	case MixType.Talisman:
	{
		int num2 = EClass.pc.Evalue(1418); 
		Thing thing4 = ai.ings[1]; 
		SourceElement.Row source2 = (thing4.trait as TraitSpellbook).source; 
		int num3 = thing4.c_charges * source2.charge * (100 + num2 * 50) / 500 + 1; 
		int num4 = 100; 
		Thing thing5 = ThingGen.Create("talisman").SetNum(num3); 
		thing5.refVal = source2.id; 
		thing5.encLV = num4 * (100 + num2 * 10) / 100; 
		thing.ammoData = thing5; 
		thing.c_ammo = num3; 
		EClass.pc.Say("talisman", thing, thing5); 
		thing4.Destroy(); 
		int num4 = EClass.pc.Evalue(1418); 
		Thing thing5 = ai.ings[1]; 
		SourceElement.Row source2 = (thing5.trait as TraitSpellbook).source; 
		int num5 = thing5.c_charges * source2.charge * (100 + num4 * 50) / 500 + 1; 
		int num6 = 100; 
		Thing thing6 = ThingGen.Create("talisman").SetNum(num5); 
		thing6.refVal = source2.id; 
		thing6.encLV = num6 * (100 + num4 * 10) / 100; 
		thing.ammoData = thing6; 
		thing.c_ammo = num5; 
		EClass.pc.Say("talisman", thing, thing6); 
		thing5.Destroy(); 
		break;
	}
	case MixType.Scratch:

@@ -340,6 +341,32 @@ public virtual Thing Craft(AI_UseCrafter ai)

cs
		Prize(1, "casino_coin", "", cat: false);
		break;
	}
	case MixType.Fortune:
	{ 
		EClass.player.seedFortune++; 
		string[] array = new string[4] { "plastic", "water", "hide_dragon", "gold" }; 
		int[] array2 = new int[4] { 1, 10, 50, 200 }; 
		int num2 = 0; 
		Rand.SetSeed(EClass.game.seed + EClass.player.seedFortune); 
		for (int num3 = 3; num3 > 0; num3--) 
		{ 
			if (EClass.rnd(array2[num3]) == 0) 
			{ 
				num2 = num3; 
				break; 
			} 
		} 
		Rand.SetSeed(); 
		if (num2 != 0) 
		{ 
			owner.PlaySound((num2 == 3) ? "fortuneroll_winBig" : "fortuneroll_win"); 
		} 
		Thing thing4 = ThingGen.Create("fortune_ball"); 
		thing4.ChangeMaterial(array[num2]); 
		EClass._zone.AddCard(thing4, owner.pos); 
		owner.PlaySound("fortuneroll_ball"); 
		break; 
	} 
	case MixType.Incubator:
		TraitFoodEggFertilized.Incubate(ai.ings[0], owner.pos, owner);
		break;

TraitDemitas

@@ -48,7 +48,7 @@ public override ShopType ShopType

cs

	public override bool CanBeBanished => false;

	public override int RestockDay => 30; 
	public override int RestockDay => 28; 

	public override bool CanCopy(Thing t)
	{

+TraitGiftJure

File Created
cs
using System.Collections.Generic;

public class TraitGiftJure : TraitGiftPack
{
	public override bool OnUse(Chara c)
	{
		if (!EClass.debug.enable)
		{
			Msg.SayNothingHappen();
			return false;
		}
		if (EClass._zone.IsRegion)
		{
			Msg.SayCannotUseHere();
			return false;
		}
		EClass.pc.Say("openDoor", EClass.pc, owner);
		SE.Play("dropReward");
		List<string> list = new List<string> { "snow_globe", "xmas_wreath", "xmas_wreath", "xmas_garland", "xmas_garland", "hat_santa" };
		list.Shuffle();
		for (int i = 0; i < 4; i++)
		{
			Thing t = ThingGen.Create(list[i]);
			EClass.pc.Pick(t);
		}
		owner.ModNum(-1);
		return true;
	}
}

+TraitRollingFortune

File Created
cs
public class TraitRollingFortune : TraitCrafter
{
	public override string IdSource => "Fortune";

	public override string CrafterTitle => "invRoll";

	public override AnimeType animeType => AnimeType.Microwave;

	public override string idSoundProgress => "fortuneroll";

	public override TileMode tileMode => TileMode.SignalAnime;

	public override int GetDuration(AI_UseCrafter ai, int costSp)
	{
		return GetSource(ai).time;
	}
}

TraitScratchMachine

@@ -7,4 +7,9 @@ public class TraitScratchMachine : TraitCrafter

cs
	public override AnimeID IdAnimeProgress => AnimeID.Shiver;

	public override string idSoundProgress => "craft_scratch";

	public override int GetDuration(AI_UseCrafter ai, int costSp) 
	{ 
		return GetSource(ai).time; 
	} 
}

WidgetMouseover

@@ -81,7 +81,7 @@ public void Refresh()

cs
			text = text + Environment.NewLine + mouseTarget.target.InspectName;
		}
	}
	else
	else if (mouseTarget.target != null) 
	{
		text = mouseTarget.target.InspectName;
	}