Skip to content

EA 23.231 Nightly

November 7, 2025

29 files modified. 2 new files created.

Important Changes

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

Party (1)

cs
public bool HasElement(int ele) 
public bool HasElement(int ele, bool excludePC = false) 

SpriteReplacer (1)

cs
public bool HasSprite(string id) 
public bool HasSprite(string id, RenderData renderData = null) 

AI_Fish

public static Thing Makefish(Chara c)

cs
			c.Say("bigCatch", c);
		}
		num2 = (num7 ? num5 : EClass.rnd(num5)) / (num4 + 1) + 1;
		if (EClass.debug.enable || (thing.id == "65" && EClass.rnd(c.IsPC ? 8192 : 819200) == 0)) 
		{ 
			thing = ThingGen.Create("65_gold", -1, lv); 
			num2 = 1; 
		} 
		if (num4 != 0)
		{
			thing.SetTier(num4);

AI_PlayMusic

public override IEnumerable<Status> Run()

cs
					}
				}
				List<Chara> list = owner.pos.ListWitnesses(owner, 4, WitnessType.music);
				int num = owner.Evalue(241) * (100 + toolLv) / 100; 
				int num = (owner.Evalue(241) + tool?.Evalue(241)).Value * (100 + toolLv) / 100; 
				int num2 = 0;
				foreach (Chara item2 in list)
				{

public void ThrowReward(Chara c, bool punish)

cs
		}
		if (thing.id == "money" && !owner.IsPC)
		{
			int num2 = (owner.Evalue(241) * 10 + 100) / ((owner.IsPCFaction && owner.memberType == FactionMemberType.Default) ? 1 : 10); 
			if (owner.GetCurrency() - num2 > 0) 
			int? obj = ((owner.Evalue(241) + tool?.Evalue(241)) * 10 + 100) / ((owner.IsPCFaction && owner.memberType == FactionMemberType.Default) ? 1 : 10); 
			if (owner.GetCurrency() - obj > 0) 
			{
				owner.c_allowance += num;
				owner.ModCurrency(-num);

AI_Steal

public override bool Perform()

cs
public override IEnumerable<Status> Run()
{
	Chara chara = target.Chara;
	bool negate = chara != null && chara.HasElement(426); 
	if (chara != null)
	{
		if (chara.HasElement(426)) 
		if (negate && owner.Evalue(1662) == 0) 
		{
			chara.Say("abStealNegate", chara); 
			owner.Say("abStealNegate", chara); 
			yield return Cancel();
		}
		target = chara.things.FindStealable();

public override IEnumerable<Status> Run()

cs
						{
							num2 *= 2;
						}
						if (negate) 
						{ 
							num2 *= 2; 
						} 
						return EClass.rnd(num2) > owner.Evalue(281) + owner.DEX + num;
					}))
					{

ActEffect

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

cs
	Point point = CC.pos.Copy();
	List<Card> list = new List<Card>();
	bool flag = false;
	if ((id == EffectId.Explosive || id == EffectId.Rocket) && actref.refThing != null) 
	if ((id == EffectId.Explosive || id == EffectId.Rocket || id == EffectId.GravityGun) && actref.refThing != null) 
	{
		power = power * actref.refThing.material.hardness / 10;
	}

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

cs
		{
		case EffectId.Explosive:
		case EffectId.Rocket:
		case EffectId.GravityGun:
			text2 = "ball_";
			flag = false;
			break;

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

cs
		}
		default:
		{
			effect = Effect.Get("Element/ball_" + ((e.id == 0) ? "Void" : e.source.alias.Remove(0, 3))); 
			effect = Effect.Get("Element/ball_" + ((e.id == 0) ? "Void" : ((id == EffectId.GravityGun) ? "Gravity" : e.source.alias.Remove(0, 3)))); 
			if (effect == null)
			{
				effect = Effect.Get("Element/ball_Fire");

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

cs
			float startDelay = ((id == EffectId.Meteor) ? 0.1f : 0.04f) * (float)CC.pos.Distance(p);
			effect.SetStartDelay(startDelay);
			effect2.SetStartDelay(startDelay);
			if (id == EffectId.GravityGun) 
			{ 
				float duration = 0.06f * (float)CC.pos.Distance(p); 
				Point pos2 = p.Copy(); 
				TweenUtil.Tween(duration, null, delegate
				{ 
					pos2.Animate(AnimeID.Gravity, animeBlock: true); 
				}); 
			} 
			break;
		}
		}

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

cs
				case EffectId.Sword:
					num4 = num4 * (int)Mathf.Min(70f + Mathf.Sqrt(CC.Evalue(101)) * 3f, 200f) / 100;
					break;
				case EffectId.GravityGun:
					num4 /= 5; 
					break; 
				}
				if (id == EffectId.Ball || id == EffectId.BallBubble || id == EffectId.Explosive || id == EffectId.Rocket) 
				if (id == EffectId.Ball || id == EffectId.BallBubble || id == EffectId.Explosive || id == EffectId.Rocket || id == EffectId.GravityGun) 
				{
					num4 = num4 * 100 / (90 + point.Distance(p) * 10);
				}

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

cs
				case EffectId.Suicide:
				case EffectId.Rocket:
				case EffectId.Flare:
				case EffectId.GravityGun:
					num4 /= 2;
					break;
				}

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

cs
				num4 = 99999999L;
			}
			c.DamageHP(num4, e.id, power * num / 100, attackSource, chara ?? CC);
			if (c.IsAliveInCurrentZone && CC.IsAliveInCurrentZone && id == EffectId.DrainMana && c.isChara && CC.isChara && c.Chara.mana.value > 0) 
			if (c.IsAliveInCurrentZone) 
			{
				long num6 = num4 * num / 100; 
				Debug.Log(num4 + " v:" + num6 + " evalue:" + e.Value + " power:" + power + " elepMod:" + num); 
				if (num6 > c.Chara.mana.value) 
				switch (id) 
				{
					num6 = c.Chara.mana.value; 
				case EffectId.GravityGun: 
					if (!c.isChara) 
					{ 
						break; 
					} 
					c.Chara.AddCondition<ConGravity>(power); 
					if (EClass.rnd(2) == 0) 
					{ 
						c.Chara.AddCondition<ConEntangle>(power / 2); 
					} 
					if (EClass.rnd(4) == 0) 
					{ 
						c.Chara.AddCondition<ConBlind>(power); 
					} 
					if (EClass.rnd(5) == 0) 
					{ 
						c.Chara.AddCondition<ConDim>(power / 3); 
					} 
					if (EClass.rnd(3) == 0) 
					{ 
						c.Chara.AddCondition<ConSupress>(power / 2); 
					} 
					if (actref.refThing != null && actref.refThing.id == "gun_gravity2") 
					{ 
						if (EClass.rnd(4) == 0) 
						{ 
							c.Chara.AddCondition<ConSilence>(power / 3); 
						} 
						if (EClass.rnd(4) == 0) 
						{ 
							c.Chara.AddCondition<ConWeakResEle>(power); 
						} 
						if (EClass.rnd(4) == 0) 
						{ 
							c.Chara.AddCondition<ConNightmare>(power); 
						} 
					} 
					break; 
				case EffectId.DrainMana: 
					if (CC.IsAliveInCurrentZone && c.isChara && CC.isChara && c.Chara.mana.value > 0) 
					{ 
						long num6 = num4 * num / 100; 
						Debug.Log(num4 + " v:" + num6 + " evalue:" + e.Value + " power:" + power + " elepMod:" + num); 
						if (num6 > c.Chara.mana.value) 
						{ 
							num6 = c.Chara.mana.value; 
						} 
						c.Chara.mana.Mod((int)(-num6)); 
						CC.Chara.mana.Mod((int)num6); 
					} 
					break; 
				}
				c.Chara.mana.Mod((int)(-num6)); 
				CC.Chara.mana.Mod((int)num6); 
			}
			if (id == EffectId.Explosive && CC.trait is TraitCookerMicrowave)
			{

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

cs
	{
	case EffectId.Earthquake:
	{
		List<Point> list = EClass._map.ListPointsInCircle(CC.pos, 12f, mustBeWalkable: false); 
		if (list.Count == 0) 
		List<Point> list7 = EClass._map.ListPointsInCircle(CC.pos, 12f, mustBeWalkable: false); 
		if (list7.Count == 0) 
		{
			list.Add(CC.pos.Copy()); 
			list7.Add(CC.pos.Copy()); 
		}
		CC.Say("spell_earthquake", CC, element.Name.ToLower());
		TryDelay(delegate

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

cs
			Shaker.ShakeCam("ball");
		}
		EClass.Wait(1f, CC);
		DamageEle(CC, id, power, element, list, actRef, "spell_earthquake"); 
		DamageEle(CC, id, power, element, list7, actRef, "spell_earthquake"); 
		break;
	}
	case EffectId.Meteor:

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

cs
		EffectMeteor.Create(cc.pos, 6, 10, delegate
		{
		});
		List<Point> list3 = EClass._map.ListPointsInCircle(CC.pos, 10f); 
		if (list3.Count == 0) 
		List<Point> list = EClass._map.ListPointsInCircle(CC.pos, 10f); 
		if (list.Count == 0) 
		{
			list3.Add(CC.pos.Copy()); 
			list.Add(CC.pos.Copy()); 
		}
		CC.Say("spell_ball", CC, element.Name.ToLower());
		TryDelay(delegate

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

cs
			Shaker.ShakeCam("ball");
		}
		EClass.Wait(1f, CC);
		DamageEle(CC, id, power, element, list3, actRef, "spell_ball"); 
		DamageEle(CC, id, power, element, list, actRef, "spell_ball"); 
		return;
	}
	case EffectId.Hand:

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

cs
	case EffectId.DrainMana:
	case EffectId.Sword:
	{
		List<Point> list2 = new List<Point>(); 
		list2.Add(tp.Copy()); 
		List<Point> list6 = new List<Point>(); 
		list6.Add(tp.Copy()); 
		EClass.Wait(0.3f, CC);
		TryDelay(delegate
		{
			CC.PlaySound("spell_hand");
		});
		if (!DamageEle(CC, id, power, element, list2, actRef, (id == EffectId.DrainBlood || id == EffectId.DrainMana) ? "" : ((id == EffectId.Sword) ? "spell_sword" : "spell_hand"))) 
		if (!DamageEle(CC, id, power, element, list6, actRef, (id == EffectId.DrainBlood || id == EffectId.DrainMana) ? "" : ((id == EffectId.Sword) ? "spell_sword" : "spell_hand"))) 
		{
			CC.Say("spell_hand_miss", CC, element.Name.ToLower());
		}

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

cs
	case EffectId.MoonSpear:
	case EffectId.MoonArrow:
	{
		List<Point> list7 = new List<Point>(); 
		list7.Add(tp.Copy()); 
		List<Point> list3 = new List<Point>(); 
		list3.Add(tp.Copy()); 
		CC.Say((id == EffectId.MoonSpear) ? "spell_spear" : "spell_arrow", CC, element.Name.ToLower());
		EClass.Wait(0.5f, CC);
		TryDelay(delegate
		{
			CC.PlaySound((id == EffectId.MoonSpear) ? "spell_moonspear" : "spell_arrow");
		});
		DamageEle(CC, id, power, element, list7, actRef, (id == EffectId.MoonSpear) ? "spell_spear" : "spell_arrow"); 
		DamageEle(CC, id, power, element, list3, actRef, (id == EffectId.MoonSpear) ? "spell_spear" : "spell_arrow"); 
		return;
	}
	case EffectId.Summon:

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

cs
		string id3 = actRef.n1;
		int num3 = 1;
		int num4 = -1;
		int radius2 = 3; 
		bool flag4 = false; 
		bool flag5 = actRef.n1 == "special"; 
		int radius = 3; 
		bool flag3 = false; 
		bool flag4 = actRef.n1 == "special"; 
		int num5 = -1;
		string text = "";
		switch (actRef.n1)

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

cs
			break;
		case "tentacle":
			num4 = 20 + EClass.rnd(10);
			radius2 = 1; 
			radius = 1; 
			break;
		case "special":
			CC.SetInt(70, EClass.world.date.GetRaw() + 1440);

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

cs
			{
				break;
			}
			Point point = tp.GetRandomPoint(radius2)?.GetNearestPoint(allowBlock: false, allowChara: false); 
			Point point = tp.GetRandomPoint(radius)?.GetNearestPoint(allowBlock: false, allowChara: false); 
			if (point == null || !point.IsValid)
			{
				continue;
			}
			Chara chara2 = null; 
			Chara chara = null; 
			CardBlueprint.Set(new CardBlueprint());
			if (num5 != -1)
			{

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

cs
			case "special":
				if (j == 0 && !CC.HasMinion("imolonac") && !CC.HasMinion("ygolonac"))
				{
					chara2 = CharaGen.Create((EClass.rnd(20) == 0) ? "imolonac" : "ygolonac"); 
					chara = CharaGen.Create((EClass.rnd(20) == 0) ? "imolonac" : "ygolonac"); 
					break;
				}
				Debug.Log(CardBlueprint.current.idEle);
				chara2 = CharaGen.Create("hound", CC.LV); 
				chara = CharaGen.Create("hound", CC.LV); 
				if (text.IsEmpty())
				{
					text = chara2.MainElement.source.alias; 
					text = chara.MainElement.source.alias; 
				}
				break;
			case "yeek":
				chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_yeek", (SourceChara.Row r) => r.race == "yeek"), power / 10); 
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_yeek", (SourceChara.Row r) => r.race == "yeek"), power / 10); 
				break;
			case "orc":
				chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_orc", (SourceChara.Row r) => r.race == "orc"), power / 10); 
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_orc", (SourceChara.Row r) => r.race == "orc"), power / 10); 
				break;
			case "dragon":
				chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_dragon", (SourceChara.Row r) => r.race == "dragon" || r.race == "drake" || r.race == "wyvern"), power / 5); 
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_dragon", (SourceChara.Row r) => r.race == "dragon" || r.race == "drake" || r.race == "wyvern"), power / 5); 
				break;
			case "pawn":
				chara2 = CharaGen.CreateFromFilter("c_pawn", power / 10); 
				chara = CharaGen.CreateFromFilter("c_pawn", power / 10); 
				break;
			case "machine":
				chara2 = CharaGen.CreateFromFilter("c_machine", power / 10); 
				chara = CharaGen.CreateFromFilter("c_machine", power / 10); 
				break;
			case "monster":
				chara2 = CharaGen.CreateFromFilter("c_dungeon", power / 10); 
				chara = CharaGen.CreateFromFilter("c_dungeon", power / 10); 
				break;
			case "animal":
				chara2 = CharaGen.CreateFromFilter("c_animal", power / 15); 
				chara = CharaGen.CreateFromFilter("c_animal", power / 15); 
				break;
			case "fire":
				chara2 = CharaGen.CreateFromElement("Fire", power / 10); 
				chara = CharaGen.CreateFromElement("Fire", power / 10); 
				break;
			case "fish":
				chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_fish", (SourceChara.Row r) => r.ContainsTag("water") || r.model.Chara.race.tag.Contains("water")), power / 10); 
				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":
				chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_octopus", (SourceChara.Row r) => r.race == "octopus"), power / 10); 
				chara = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_octopus", (SourceChara.Row r) => r.race == "octopus"), power / 10); 
				break;
			default:
				chara2 = CharaGen.Create(id3, power / 10); 
				chara = CharaGen.Create(id3, power / 10); 
				break;
			}
			if (chara2 == null) 
			if (chara == null) 
			{
				continue;
			}
			if (chara2.rarity >= Rarity.Legendary && !flag5) 
			if (chara.rarity >= Rarity.Legendary && !flag4) 
			{
				j--;
				continue;

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

cs
					{
						num7 = (CC.IsPCFactionOrMinion ? (CC.LV / 2) : (CC.LV / 3 * 2));
					}
					num6 = chara2.LV * (100 + power / 10) / 100 + power / 30; 
					num6 = chara.LV * (100 + power / 10) / 100 + power / 30; 
					if (num6 < num7)
					{
						num6 = num7;

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

cs
			{
				num6 = power / 10 + 1;
			}
			if (chara2.LV < num6) 
			if (chara.LV < num6) 
			{
				chara2.SetLv(num6); 
				chara.SetLv(num6); 
			}
			chara2.interest = 0; 
			if (chara2.HaveFur()) 
			chara.interest = 0; 
			if (chara.HaveFur()) 
			{
				chara2.c_fur = -1; 
				chara.c_fur = -1; 
			}
			n = actRef.n1;
			if (!(n == "shadow"))
			{
				if (n == "special_force")
				{
					chara2.homeZone = EClass._zone; 
					chara.homeZone = EClass._zone; 
				}
			}
			else
			{
				chara2.hp = chara2.MaxHP / 2; 
				chara.hp = chara.MaxHP / 2; 
			}
			EClass._zone.AddCard(chara2, point); 
			EClass._zone.AddCard(chara, point); 
			if (flag)
			{
				Chara chara3 = chara2; 
				Hostility hostility2 = (chara2.c_originalHostility = Hostility.Enemy); 
				chara3.hostility = hostility2; 
				Chara chara2 = chara; 
				Hostility hostility2 = (chara.c_originalHostility = Hostility.Enemy); 
				chara2.hostility = hostility2; 
			}
			else if (!(actRef.n1 == "monster") || actRef.refThing == null)
			{
				chara2.MakeMinion(CC); 
				chara.MakeMinion(CC); 
			}
			if (num4 != -1)
			{
				chara2.SetSummon(num4); 
				chara.SetSummon(num4); 
			}
			flag4 = true; 
			flag3 = true; 
		}
		if (!flag4) 
		if (!flag3) 
		{
			CC.Say("summon_ally_fail", CC);
		}

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

cs
		}
		CC.Say("spell_funnel", CC, element.Name.ToLower());
		CC.PlaySound("spell_funnel");
		Chara chara = CharaGen.Create((id == EffectId.Bit) ? "bit2" : "bit"); 
		chara.SetMainElement(element.source.alias, element.Value, elemental: true); 
		chara.SetSummon(20 + power / 20 + EClass.rnd(10)); 
		chara.SetLv(power / 15); 
		chara.interest = 0; 
		EClass._zone.AddCard(chara, tp.GetNearestPoint(allowBlock: false, allowChara: false)); 
		chara.PlayEffect("teleport"); 
		chara.MakeMinion(CC); 
		Chara chara3 = CharaGen.Create((id == EffectId.Bit) ? "bit2" : "bit"); 
		chara3.SetMainElement(element.source.alias, element.Value, elemental: true); 
		chara3.SetSummon(20 + power / 20 + EClass.rnd(10)); 
		chara3.SetLv(power / 15); 
		chara3.interest = 0; 
		EClass._zone.AddCard(chara3, tp.GetNearestPoint(allowBlock: false, allowChara: false)); 
		chara3.PlayEffect("teleport"); 
		chara3.MakeMinion(CC); 
		return;
	}
	case EffectId.Breathe:
	{
		List<Point> list4 = EClass._map.ListPointsInArc(CC.pos, tp, 7, 35f); 
		if (list4.Count == 0) 
		List<Point> list2 = EClass._map.ListPointsInArc(CC.pos, tp, 7, 35f); 
		if (list2.Count == 0) 
		{
			list4.Add(CC.pos.Copy()); 
			list2.Add(CC.pos.Copy()); 
		}
		CC.Say("spell_breathe", CC, element.Name.ToLower());
		EClass.Wait(0.8f, CC);

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

cs
		{
			Shaker.ShakeCam("breathe");
		}
		DamageEle(CC, id, power, element, list4, actRef, "spell_breathe"); 
		DamageEle(CC, id, power, element, list2, actRef, "spell_breathe"); 
		return;
	}
	case EffectId.Scream:

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

cs
	case EffectId.Suicide:
	case EffectId.Rocket:
	case EffectId.Flare:
	case EffectId.GravityGun:
	{
		float radius = ((id == EffectId.Rocket) ? 2.8f : ((id == EffectId.Suicide) ? 3.5f : ((id == EffectId.Flare) ? 2.1f : ((float)((id == EffectId.BallBubble) ? 2 : 5))))); 
		float radius2 = ((id == EffectId.GravityGun) ? 4f : ((id == EffectId.Rocket) ? 2.8f : ((id == EffectId.Suicide) ? 3.5f : ((id == EffectId.Flare) ? 2.1f : ((float)((id == EffectId.BallBubble) ? 2 : 5)))))); 
		if ((id == EffectId.Explosive || id == EffectId.Rocket) && actRef.refThing != null)
		{
			radius = 2 + actRef.refThing.Evalue(666); 
			radius2 = 2 + actRef.refThing.Evalue(666); 
		}
		if (id == EffectId.Suicide)
		{

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

cs
			}
			if (CC.HasTag(CTAG.kamikaze))
			{
				radius = 1.5f; 
				radius2 = 1.5f; 
			}
		}
		bool flag3 = id == EffectId.Explosive || id == EffectId.Suicide || id == EffectId.Rocket; 
		List<Point> list6 = EClass._map.ListPointsInCircle((id == EffectId.Rocket || id == EffectId.Flare) ? tp : cc.pos, radius, !flag3, !flag3); 
		if (list6.Count == 0) 
		bool flag5 = id == EffectId.Explosive || id == EffectId.Suicide || id == EffectId.Rocket; 
		List<Point> list5 = EClass._map.ListPointsInCircle((id == EffectId.GravityGun || id == EffectId.Rocket || id == EffectId.Flare) ? tp : cc.pos, radius2, !flag5, !flag5); 
		if (list5.Count == 0) 
		{
			list6.Add(cc.pos.Copy()); 
			list5.Add(cc.pos.Copy()); 
		}
		cc.Say((id == EffectId.Suicide) ? "abSuicide" : "spell_ball", cc, element.Name.ToLower());
		EClass.Wait(0.8f, cc);

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

cs
			{
				tp.PlayEffect("flare");
			}
			cc.PlaySound((id == EffectId.Flare) ? "spell_flare" : "spell_ball"); 
			if (id != EffectId.GravityGun) 
			{ 
				cc.PlaySound((id == EffectId.Flare) ? "spell_flare" : "spell_ball"); 
			} 
		});
		if (cc.IsInMutterDistance() && !EClass.core.config.graphic.disableShake) 
		if (id != EffectId.GravityGun && cc.IsInMutterDistance() && !EClass.core.config.graphic.disableShake) 
		{
			Shaker.ShakeCam("ball");
		}
		DamageEle(actRef.origin ?? cc, id, power, element, list6, actRef, (id == EffectId.Suicide) ? "suicide" : "spell_ball"); 
		DamageEle(actRef.origin ?? cc, id, power, element, list5, actRef, (id == EffectId.Suicide) ? "suicide" : "spell_ball"); 
		if (id == EffectId.Suicide && CC.IsAliveInCurrentZone)
		{
			CC.Die();

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

cs
	}
	case EffectId.Bolt:
	{
		List<Point> list5 = EClass._map.ListPointsInLine(CC.pos, tp, 10); 
		if (list5.Count == 0) 
		List<Point> list4 = EClass._map.ListPointsInLine(CC.pos, tp, 10); 
		if (list4.Count == 0) 
		{
			list5.Add(CC.pos.Copy()); 
			list4.Add(CC.pos.Copy()); 
		}
		CC.Say("spell_bolt", CC, element.Name.ToLower());
		EClass.Wait(0.8f, CC);

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

cs
		{
			Shaker.ShakeCam("bolt");
		}
		DamageEle(CC, id, power, element, list5, actRef, "spell_bolt"); 
		DamageEle(CC, id, power, element, list4, actRef, "spell_bolt"); 
		return;
	}
	case EffectId.Bubble:

ActRanged

public override bool Perform()

cs
	{
		return false;
	}
	bool flag = weapon.trait is TraitToolRangeGun; 
	bool flag2 = weapon.trait is TraitToolRangeCane; 
	bool isRocket = weapon.trait is TraitToolRangeGunRocket; 
	GameSetting.EffectData effectData = EClass.setting.effect.guns.TryGetValue(weapon.id) ?? EClass.setting.effect.guns[flag2 ? "cane" : (flag ? "gun" : "bow")]; 
	TraitToolRange traitRange = weapon.trait as TraitToolRange; 
	bool flag = weapon.trait is TraitToolRangeCane; 
	GameSetting.EffectData effectData = EClass.setting.effect.guns.TryGetValue(weapon.id) ?? EClass.setting.effect.guns[flag ? "cane" : ((weapon.trait is TraitToolRangeGun) ? "gun" : "bow")]; 
	bool hasHit = false;
	int numFire = effectData.num;
	int numFireWithoutDamageLoss = numFire;

public override bool Perform()

cs
		num3 = Mathf.Max(1, num3 * 100 / (100 + num4 * 5));
	}
	string missSound = ((weapon.trait is TraitToolRangeGun) ? "miss_bullet" : "miss_arrow");
	if (weapon.trait is TraitToolRangeCane) 
	if (flag) 
	{
		foreach (Element item in weapon.elements.dict.Values.Where((Element e) => e.source.categorySub == "eleAttack"))
		{

void Shoot(Card _tc, Point _tp, bool subAttack)

cs
				Card tC = Act.TC;
				Chara cC = Act.CC;
				Point point = Act.TP.Copy();
				if (isRocket && EClass.rnd(3) == 0) 
				if (traitRange.ChanceMissAim > 0 && EClass.rnd(traitRange.ChanceMissAim) == 0) 
				{
					Act.TP.Set(Act.TP.GetRandomNeighbor());
				}

void Shoot(Card _tc, Point _tp, bool subAttack)

cs
						}
					}
				}
				if (isRocket) 
				switch (traitRange.GroundHitEffect) 
				{
				case TraitToolRange.HitEffect.Rocket: 
					ActEffect.ProcAt(EffectId.Rocket, AttackProcess.Current.GetRocketPower(), BlessedState.Normal, Act.CC, null, Act.TP, isNeg: true, new ActRef
					{
						origin = Act.CC.Chara,
						refThing = weapon,
						aliasEle = "eleImpact"
					});
					break; 
				case TraitToolRange.HitEffect.Gravity: 
					ActEffect.ProcAt(EffectId.GravityGun, AttackProcess.Current.GetRocketPower() / 2, BlessedState.Normal, Act.CC, null, Act.TP, isNeg: true, new ActRef
					{ 
						origin = Act.CC.Chara, 
						refThing = weapon, 
						aliasEle = "eleImpact"
					}); 
					break; 
				}
				Act.TC = tC;
				Act.CC = cC;
				Act.TP.Set(point);
				if (!isRocket && (Act.TC == null || !Act.TC.IsAliveInCurrentZone)) 
				if (traitRange.GroundHitEffect == TraitToolRange.HitEffect.None && (Act.TC == null || !Act.TC.IsAliveInCurrentZone)) 
				{
					break;
				}

AnimeID

public enum AnimeID

cs
	Ride,
	Truck,
	PlayMusic,
	QuakeMini 
	QuakeMini, 
	Gravity 
}

CINT

public class CINT

cs

	public const int isHalfEaten = 125;

	public const int isDisableLoyal = 126; 
	public const int dateDeathLock = 130;

	public const int fixedValue = 131;

Card

public void SpawnLoot(Card origin)

cs
		if (Chara.IsMachine)
		{
			bool flag3 = Chara.HasElement(1248);
			if (chance(200)) 
			{ 
				list.Add(ThingGen.Create("memory_chip")); 
			} 
			if (chance(20))
			{
				list.Add(ThingGen.Create(flag3 ? "scrap" : "microchip"));

Chara

public void RestockEquip(bool onCreate)

cs
			AddThing("1071");
		}
		break;
	case "namamani":
		if (onCreate) 
		{ 
			AddThing("gun_gravity2"); 
		} 
		break; 
	case "lomias":
		if (onCreate)
		{

public void RestockEquip(bool onCreate)

cs
		}
		break;
	}
	if (onCreate || !TryEquipRanged()) 
	if (!TryEquipRanged()) 
	{
		switch (id)
		{

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

cs
	}
	else
	{
		if (id == "keeper_garden") 
		if (!trait.CanChangeAffinity) 
		{
			return;
		}

public bool RequestProtection(Chara attacker, Action<Chara> action)

cs
		{
			continue;
		}
		bool flag2 = chara.HasElement(1225); 
		bool flag2 = chara.HasElement(1225) && !chara.GetBool(126); 
		if ((!flag2 && (flag || EClass.rnd(2) == 0 || !chara.HasCondition<StanceTaunt>())) || chara.HasCooldown(1225))
		{
			continue;

DramaActor

public void Talk(string text, List<DramaChoice> choices, bool center, bool unkno

cs
		}
		if (chara != null)
		{
			dialog.textAffinity.text = ((chara.c_bossType != 0) ? " - " : (chara.affinity.Name + " (" + chara._affinity + ")")); 
			dialog.textAffinity.text = ((chara.c_bossType != 0 || !chara.trait.CanChangeAffinity) ? " - " : (chara.affinity.Name + " (" + chara._affinity + ")")); 
			dialog.layoutInterest.DestroyChildren();
			int num = chara.interest / 10 + 1;
			if (chara.interest <= 0)

DramaCustomSequence

public void Build(Chara c)

cs
		Choice("disableMove", "_disableMove");
	}
	Choice((c.GetInt(123) == 0) ? "daSleepBeside" : "daSleepBeside2", "_sleepBeside");
	if (c.HasElement(1225)) 
	{ 
		Choice((c.GetInt(126) == 0) ? "daDisableLoyal" : "daDisableLoyal2", "_disableLoyal"); 
	} 
	if (c.GetInt(113) == 0)
	{
		Choice("daEquipSharedOff", "_toggleSharedEquip");

public void Build(Chara c)

cs
	});
	_Talk("tg", GetTopic(c, (c.GetInt(123) == 0) ? "ok" : "shutup"));
	End();
	Step("_disableLoyal"); 
	Method(delegate
	{ 
		c.SetInt(126, (c.GetInt(126) == 0) ? 1 : 0); 
	}); 
	_Talk("tg", GetTopic(c, (c.GetInt(126) == 0) ? "shutup" : "shutup2")); 
	End(); 
	Step("_insult");
	Method(delegate
	{

DramaManager

public void ParseLine(Dictionary<string, string> item)

cs
			});
		});
		break;
	case "removeItem":
		AddEvent(delegate
		{ 
			Thing thing = EMono.pc.things.Find(p2); 
			int num2 = p3.ToInt(); 
			thing?.ModNum((num2 == 0) ? (-1) : (-num2)); 
		}); 
		break; 
	case "destroyItem":
		AddEvent(delegate
		{

public bool CheckIF(string IF)

cs
		return EMono.player.dialogFlags.TryGetValue(array[1], 0) != 0;
	case "!hasFlag":
		return EMono.player.dialogFlags.TryGetValue(array[1], 0) == 0;
	case "!hasMiscreation":
		return !EMono.pc.party.HasElement(1248, excludePC: true); 
	case "hasItem":
		return EMono.pc.things.Find(array[1]) != null;
	case "nasuDeliver":

DramaOutcome

public void event_swordkeeper()

cs
		EMono._zone.AddChara("swordkeeper", 45, 52);
	}

	public void upgrade_miscreation() 
	{ 
		Chara chara = EMono.pc.party.members.Find((Chara c) => !c.IsPC && c.HasElement(1248)); 
		int num = chara.Evalue(1248); 
		chara.SetFeat(1248, 0); 
		for (int i = 0; i < num; i++) 
		{ 
			Rand.SetSeed(chara.uid + i); 
			DNA.GenerateRandomGene(chara.LV + 30, chara.uid + i).c_DNA.Apply(chara, reverse: false); 
			Rand.SetSeed(); 
		} 
	} 
	public static bool If(DramaChoice item, Chara c)
	{
		_ = item.IF.Split('/')[0] == "costHire";

EffectId

public enum EffectId

cs
	Bit = 307,
	Rocket = 308,
	StripBlessing = 309,
	Flare = 310
	Flare = 310, 
	GravityGun = 311
}

FACTION

public class FACTION

cs

	public const int bfSea = 3605;

	public const int bfCave = 3500; 
	public const int bfFertile = 3700;

	public const int bfGeyser = 3701;

public class FACTION

cs

	public const int bfTranquil = 3703;

	public const int bfUndersea = 3606; 
	public const int bfVolcano = 3704; 

	public const int bfHunt = 3705; 
	public const int bfUndersea = 3606; 

	public const int bfGum = 3803; 
	public const int bfCave = 3500; 

	public const int actBuildInspect = 4006;

public class FACTION

cs

	public const int actBuildCollect = 4004;

	public const int bfGum = 3803; 
	public const int actBuildAnywhere = 4003;

	public const int actBuildTerrain = 4002;

public class FACTION

cs

	public const int bfChitin = 3805;

	public const int bfVolcano = 3704; 
	public const int bfHunt = 3705; 

	public static readonly int[] IDS = new int[53]
	{
		3706, 3783, 3781, 2207, 3780, 3710, 3709, 3708, 3707, 3782,
		2204, 2116, 2115, 2117, 2118, 2119, 2120, 2200, 2201, 2206,
		2202, 2203, 2205, 3784, 2003, 3800, 3804, 3802, 3801, 3600,
		3601, 3602, 3603, 3604, 3605, 3500, 3700, 3701, 3702, 3703, 
		3606, 3705, 3803, 4006, 4005, 4004, 4003, 4002, 4001, 4000, 
		3900, 3805, 3704
		3601, 3602, 3603, 3604, 3605, 3700, 3701, 3702, 3703, 3704, 
		3606, 3500, 4006, 4005, 4004, 3803, 4003, 4002, 4001, 4000, 
		3900, 3805, 3705
	};
}
public class Faction : EClass

FEAT

``

cs

public class FEAT
{
	public const int featDEX = 1621; 
	public const int featEND = 1622;

	public const int featPER = 1623;

	public const int featLER = 1624;

	public const int featSPD = 1629; 
	public const int featMAG = 1625; 

	public const int featWIL = 1626; 
	public const int featHardy = 1630; 

	public const int featCHA = 1627;

	public const int featLuck = 1628;

	public const int featHardy = 1630; 
	public const int featSPD = 1629; 

	public const int featMAG = 1625; 
	public const int featDEX = 1621; 

	public const int featSTR = 1620; 
	public const int featWIL = 1626; 

	public const int featWhiteVixen = 1414; 
	public const int featDefense = 1631; 
	public const int featFoxMaid = 1415; 
	public const int featStamina = 1612; 

	public const int featMana = 1611;

public class FEAT

cs

	public const int featInquisitor = 1416;

	public const int featFoxMaid = 1415; 
	public const int featEvade = 1632; 

	public const int featDefense = 1631; 
	public const int featWhiteVixen = 1414; 

	public const int featFairysan = 1413; 
	public const int featSTR = 1620; 

	public const int featStamina = 1612; 
	public const int featSpotting = 1633; 

	public const int featEvade = 1632; 
	public const int featDefender = 1649; 

	public const int featRapidMagic = 1648; 
	public const int featMartial = 1635; 

	public const int featNegotiate = 1634; 
	public const int featFairysan = 1413; 

	public const int featLuckyCat = 1412; 
	public const int featGoldenFinger = 1662; 

	public const int featDismantler = 1661;

public class FEAT

cs

	public const int featDreamWaker = 1653;

	public const int featRapidArrow = 1652; 
	public const int featNegotiate = 1634; 

	public const int featSpotting = 1633; 
	public const int featRapidArrow = 1652; 

	public const int featMagicManner = 1651; 
	public const int featGourmet = 1650; 

	public const int featDefender = 1649; 
	public const int featRapidMagic = 1648; 

	public const int featSummoner = 1647;

public class FEAT

cs

	public const int featFaith = 1636;

	public const int featMartial = 1635; 
	public const int featGourmet = 1650; 
	public const int featEarthStrength = 1411; 
	public const int featMagicManner = 1651; 

	public const int featNirvana = 1231; 
	public const int featLuckyCat = 1412; 

	public const int featBoost = 1409; 
	public const int featBaby = 1232; 

	public const int featLittleOne = 1229; 
	public const int featReboot = 1410; 

	public const int featAdam = 1230;

	public const int featBaby = 1232; 
	public const int featNirvana = 1231; 

	public const int featCosmicHorror = 1233;

public class FEAT

cs

	public const int featGeneSlot = 1242;

	public const int featReboot = 1410; 
	public const int featEternalYouth = 1243; 

	public const int featCentaur = 1244; 
	public const int featEarthStrength = 1411; 

	public const int featSevenSense = 1245;

public class FEAT

cs

	public const int featGod_earth1 = 1305;

	public const int featDemigod = 1228; 
	public const int featGod_wind1 = 1310;

	public const int featLittleOne = 1229; 
	public const int featDemigod = 1228; 
	public const int featServant = 1227;

	public const int featLoyal = 1225; 
	public const int featUnderground = 1226; 

	public const int featSlowFood = 1200;

public class FEAT

cs

	public const int featSnail = 1211;

	public const int featFairyResist = 1212; 
	public const int featGod_machine1 = 1315; 

	public const int featElea = 1213; 
	public const int featFairyResist = 1212; 

	public const int featManaPrecision = 1214;

public class FEAT

cs

	public const int featShiva = 1224;

	public const int featUnderground = 1226; 
	public const int featLoyal = 1225; 

	public const int featGod_machine1 = 1315; 
	public const int featElea = 1213; 

	public const int featEternalYouth = 1243; 
	public const int featGod_healing1 = 1320; 

	public const int featGod_harvest1 = 1325; 
	public const int featCentaur = 1244; 
	public const int featGod_luck1 = 1330; 
	public const int featPaladin = 1407; 

	public const int featTourist = 1406;

public class FEAT

cs

	public const int featWizard = 1402;

	public const int featThief = 1401; 
	public const int featPaladin2 = 1408; 

	public const int featPaladin = 1407; 
	public const int featThief = 1401; 

	public const int featWarrior = 1400; 
	public const int featGod_harvest1 = 1325; 

	public const int featGod_healing1 = 1320; 
	public const int featGod_strife1 = 1355; 

	public const int featGod_moonshadow1 = 1350;

public class FEAT

cs

	public const int featGod_harmony1 = 1335;

	public const int featGod_luck1 = 1330; 
	public const int featGod_strife1 = 1355; 
	public const int featWarrior = 1400; 

	public const int featPaladin2 = 1408; 
	public const int featBoost = 1409; 

	public static readonly int[] IDS = new int[130] 
	public static readonly int[] IDS = new int[131] 
	{
		1621, 1622, 1623, 1624, 1629, 1626, 1627, 1628, 1630, 1625, 
		1620, 1414, 1611, 1610, 1422, 1421, 1420, 1419, 1418, 1417, 
		1416, 1415, 1631, 1413, 1612, 1632, 1648, 1634, 1412, 1661, 
		1660, 1659, 1658, 1657, 1656, 1655, 1654, 1653, 1652, 1633, 
		1651, 1649, 1647, 1646, 1645, 1644, 1643, 1642, 1641, 1640, 
		1636, 1635, 1650, 1411, 1231, 1409, 1229, 1230, 1232, 1233, 
		1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1410, 
		1244, 1245, 1246, 1247, 1248, 1249, 1270, 1271, 1290, 1300, 
		1305, 1228, 1310, 1227, 1225, 1200, 1201, 1202, 1203, 1204, 
		1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 
		1622, 1623, 1624, 1625, 1630, 1627, 1628, 1629, 1621, 1626, 
		1631, 1415, 1612, 1611, 1610, 1422, 1421, 1420, 1419, 1418, 
		1417, 1416, 1632, 1414, 1620, 1633, 1649, 1635, 1413, 1662, 
		1661, 1660, 1659, 1658, 1657, 1656, 1655, 1654, 1653, 1634, 
		1652, 1650, 1648, 1647, 1646, 1645, 1644, 1643, 1642, 1641, 
		1640, 1636, 1651, 1412, 1232, 1410, 1230, 1231, 1233, 1234, 
		1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1411, 
		1245, 1246, 1247, 1248, 1249, 1270, 1271, 1290, 1300, 1305, 
		1310, 1229, 1228, 1227, 1226, 1200, 1201, 1202, 1203, 1204, 
		1205, 1206, 1207, 1208, 1209, 1210, 1211, 1315, 1212, 1214, 
		1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224,
		1226, 1315, 1243, 1325, 1406, 1405, 1404, 1403, 1402, 1401, 
		1407, 1400, 1320, 1350, 1345, 1340, 1335, 1330, 1355, 1408
		1225, 1213, 1320, 1244, 1330, 1407, 1406, 1405, 1404, 1403, 
		1402, 1408, 1401, 1325, 1355, 1350, 1345, 1340, 1335, 1400, 
		1409
	};
}
public class Feat : Element

LayerDragGrid

public static LayerDragGrid TryProc(Chara cc, InvOwnerEffect owner)

cs
	int num = ((owner.count == -1) ? 1 : owner.count);
	for (int i = 0; i < num; i++)
	{
		List<Thing> list = cc.things.List((Thing t) => owner.ShouldShowGuide(t)); 
		List<Thing> list = cc.things.List((Thing t) => owner.ShouldShowGuide(t), onlyAccessible: true); 
		if (list.Count > 0)
		{
			Thing t2 = list.RandomItem();

POLICY

public class POLICY

cs

	public const int mass_exhibition = 2814;

	public const int prohibition = 2503; 
	public const int food_for_people = 2502; 

	public const int bed_quality = 2812;

public class POLICY

cs

	public const int impressment = 2504;

	public const int food_for_people = 2502; 
	public const int prohibition = 2503; 

	public const int wealth_tax = 2500;

public class POLICY

cs
public static readonly int[] IDS = new int[51]
{
	2816, 2817, 2818, 2819, 2820, 2821, 2824, 2823, 2825, 2826,
	2827, 2828, 2815, 2822, 2814, 2503, 2812, 2514, 2513, 2512, 
	2511, 2510, 2509, 2515, 2508, 2506, 2505, 2504, 2502, 2500, 
	2827, 2828, 2815, 2822, 2814, 2502, 2812, 2514, 2513, 2512, 
	2511, 2510, 2509, 2515, 2508, 2506, 2505, 2504, 2503, 2500, 
	2813, 2507, 2516, 2501, 2701, 2811, 2810, 2800, 2715, 2700,
	2711, 2710, 2712, 2708, 2707, 2706, 2705, 2704, 2703, 2702,
	2709

Party

public int EValue(int ele)

cs
		return num;
	}

	public bool HasElement(int ele) 
	public bool HasElement(int ele, bool excludePC = false) 
	{
		foreach (Chara member in members)
		{
			if (member.HasElement(ele)) 
			if ((!excludePC || !member.IsPC) && member.HasElement(ele)) 
			{
				return true;
			}

RenderRow

public int ConvertTile(int tile)

cs

	public Sprite GetSprite(int dir = 0, int skin = 0, bool snow = false)
	{
		if (replacer.HasSprite(idSprite)) 
		if (replacer.HasSprite(idSprite, renderData)) 
		{
			return replacer.data.GetSprite(snow);
		}

SpriteReplacer

public static Dictionary<string, SpriteReplacer> ListSkins()

cs
		return dictSkins;
	}

	public bool HasSprite(string id) 
	public bool HasSprite(string id, RenderData renderData = null) 
	{
		if (!isChecked)
		{

public bool HasSprite(string id)

cs
			else
			{
				string text = CorePath.packageCore + "Texture/Item/" + id;
				if (!File.Exists(text + ".png") && renderData != null) 
				{ 
					text = CorePath.packageCore + "Texture/Item/" + renderData.name; 
				} 
				if (File.Exists(text + ".png"))
				{
					data = new SpriteData

TaskChopWood

public Thing GetLog()

cs

	public override HitResult GetHitResult()
	{
		Thing log = GetLog(); 
		if (log != null && log.isNPCProperty && EClass._zone.IsUserZone && EClass.game.principal.disableUsermapBenefit) 
		{ 
			return HitResult.Invalid; 
		} 
		if (GetLog() != null)
		{
			return HitResult.Valid;

Thing

public override void SetRenderParam(RenderParam p)

cs
			}
			if (!(num >= (float)source.anime[0]))
			{
				p.tile += num * (float)((!flipX) ? 1 : (-1)); 
				p.tile += num * (float)((!(p.tile < 0f)) ? 1 : (-1)); 
			}
		}
		else
		{
			float num2 = Time.realtimeSinceStartup * 1000f / (float)source.anime[1] % (float)source.anime[0];
			p.tile += num2 * (float)((!flipX) ? 1 : (-1)); 
			p.tile += num2 * (float)((!(p.tile < 0f)) ? 1 : (-1)); 
		}
		break;
	}

ThingContainer

public Thing FindStealable()

cs
		while (enumerator.MoveNext())
		{
			Thing current = enumerator.Current;
			if (!current.IsContainer && current.trait.CanBeStolen && !current.HasTag(CTAG.gift)) 
			if (!current.IsContainer && current.trait.CanBeStolen && !current.HasTag(CTAG.gift) && (!current.IsEquipmentOrRangedOrAmmo || !current.IsUnique)) 
			{
				list.Add(current);
			}

Trait

public virtual int CostRerollShop

cs

	public virtual bool RemoveGlobalOnBanish => false;

	public virtual bool CanChangeAffinity => true; 
	public string TextNextRestock => GetTextRestock(LangBarter, pet: false);

	public string TextNextRestockPet => GetTextRestock((SlaverType == SlaverType.Slave) ? "daBuySlave" : "daBuyPet", pet: true);

TraitGeyser

public class TraitGeyser : TraitSpot

cs
public class TraitGeyser : TraitSpot
public class TraitGeyser : TraitBath
{
	public override int radius => 4; 
}

+TraitKeeperOfGarden

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

	public override bool CanChangeAffinity => false;
}

TraitToolRange

public class TraitToolRange : TraitTool

cs
public class TraitToolRange : TraitTool
{
	public enum HitEffect
	{ 
		None, 
		Rocket, 
		Gravity
	} 
	public virtual HitEffect GroundHitEffect => HitEffect.None; 
	public override bool CanAutofire => true;

	public virtual bool NeedAmmo => true;

	public virtual bool AutoRefillAmmo => false;

	public virtual int ChanceMissAim => 0; 
	public int MaxAmmo => (GetParam(1) ?? "12").ToInt() * (100 + owner.Evalue(600) * 5) / 100;

	public int ReloadTurn => (GetParam(2) ?? "4").ToInt() * 100 / (100 + owner.Evalue(601) * 10);

+TraitToolRangeGunGravity

File Created
cs
public class TraitToolRangeGunGravity : TraitToolRangeGunEnergy
{
	public override HitEffect GroundHitEffect => HitEffect.Gravity;
}

TraitToolRangeGunRocket

public class TraitToolRangeGunRocket : TraitToolRangeGun

cs
public class TraitToolRangeGunRocket : TraitToolRangeGun
{
	public override HitEffect GroundHitEffect => HitEffect.Rocket; 
	public override int ChanceMissAim => 3; 
	public override bool IsAmmo(Thing t)
	{
		return t.trait is TraitAmmoRocket;

TraitUniqueCharaNoJoin

public class TraitUniqueCharaNoJoin : TraitChara

cs
public class TraitUniqueCharaNoJoin : TraitChara
public class TraitUniqueCharaNoJoin : TraitUniqueChara
{
	public override bool CanInvite => false;
	public override bool CanChangeAffinity => false; 
}