EA 23.330 Nightly
July 26, 2026
19 files modified. 1 new file created.
Important Changes
Possible breaking changes. Click the filename to view the chunk.
ActEffect (1)
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Point> points, ActRef actref, string lang = null)
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Point> points, ActRef actref, string lang = null, Point center = null) AI_Craft_Snowman
public override IEnumerable<Status> Run()
owner.PlaySound(MATERIAL.sourceSnow.GetSoundDead());
owner.PlayAnime(AnimeID.Jump);
pos.TalkWitnesses(EClass.pc, (EClass.rnd(2) == 0) ? "nice_statue" : "ding_other", 5);
EClass.pc.ModExp(258, 50);
owner.ModExp(258, 50);
if (EClass.rnd(3) != 0)
{
EClass.pc.stamina.Mod(-1);
owner.stamina.Mod(-1);
}
}
}.SetDuration(25, 5);AI_Fish
public override void OnProgressComplete()
Steam.GetAchievement(ID_Achievement.EHE_FISH);
if (EClass.rnd(777) == 0)
{
EClass.pc.AddCondition<ConInvulnerable>();
ActEffect.Proc(EffectId.Wish, EClass.pc, null, 50 + EClass.player.CountKeyItem("well_enhance") * 50 + EClass.player.flags.fishStolen * 50);
owner.AddCondition<ConInvulnerable>();
ActEffect.Proc(EffectId.Wish, owner, null, 50 + EClass.player.CountKeyItem("well_enhance") * 50 + EClass.player.flags.fishStolen * 50);
}
}
thing.Destroy();public override void OnProgressComplete()
{
if (EClass.game.config.preference.pickFish)
{
if (StatsBurden.GetPhase((EClass.pc.ChildrenWeight + thing.ChildrenAndSelfWeight) * 100 / EClass.pc.WeightLimit) >= 3)
if (StatsBurden.GetPhase((owner.ChildrenWeight + thing.ChildrenAndSelfWeight) * 100 / owner.WeightLimit) >= 3)
{
EClass.pc.Say("tooHeavy", thing);
owner.Say("tooHeavy", thing);
shouldCancel = true;
}
elseAI_UseCrafter
if (ing != null && ing.ExistsOnMap)
{
ing.isHidden = false;
EClass.pc.Pick(ing);
owner.Pick(ing);
}
}
if (crafter.AutoTurnOff && crafter.owner.isOn)public override IEnumerable<Status> Run()
thing2.SetBlessedState(blessed);
}
thing2.PlaySoundDrop(spatial: false);
EClass._zone.AddCard(thing2, EClass.pc.pos);
EClass._zone.AddCard(thing2, owner.pos);
thing2.Identify(show: false);
owner.Pick(thing2);
}public override IEnumerable<Status> Run()
Rand.SetSeed();
if (crafter is TraitCookerMicrowave && recipe.id == "onsentamago" && EClass.rnd(3) != 0)
{
int power = EClass.curve((200 + ings[0].Quality * 5) * (100 + EClass.pc.Evalue(287) * 10) / 100, 400, 100);
ActEffect.ProcAt(EffectId.Explosive, power, BlessedState.Normal, crafter.owner.ExistsOnMap ? crafter.owner : EClass.pc, EClass.pc, EClass.pc.pos, isNeg: true, new ActRef
int power = EClass.curve((200 + ings[0].Quality * 5) * (100 + owner.Evalue(287) * 10) / 100, 400, 100);
ActEffect.ProcAt(EffectId.Explosive, power, BlessedState.Normal, crafter.owner.ExistsOnMap ? crafter.owner : owner, owner, owner.pos, isNeg: true, new ActRef
{
aliasEle = "eleImpact"
});+ActComet
File Created
public class ActComet : Spell
{
public override bool CanAutofire => true;
public override bool CanPressRepeat => true;
public override bool CanRapidFire => true;
public override float RapidDelay => 0.3f;
}ActEffect
public static void TryDelay(Action a)
});
}
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Point> points, ActRef actref, string lang = null)
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Point> points, ActRef actref, string lang = null, Point center = null)
{
if (points.Count == 0)
{public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
ElementRef elementRef = EClass.setting.elements[e.source.alias];
int num = actref.act?.ElementPowerMod ?? 50;
int num2 = 0;
Point point = CC.pos.Copy();
List<Card> list = new List<Card>();
bool flag = false;
if (center == null)
{
center = CC.pos.Copy();
}
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
{
effect = Effect.Get("Element/ball_Fire");
}
float startDelay = ((id == EffectId.Meteor) ? 0.1f : 0.04f) * (float)CC.pos.Distance(p);
float startDelay = ((id == EffectId.Meteor || id == EffectId.Comet) ? 0.1f : 0.04f) * (float)center.Distance(p);
effect.SetStartDelay(startDelay);
effect2.SetStartDelay(startDelay);
if (id == EffectId.GravityGun)
{
float duration = 0.06f * (float)CC.pos.Distance(p);
float duration = 0.06f * (float)center.Distance(p);
Point pos2 = p.Copy();
TweenUtil.Tween(duration, null, delegate
{public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
{
TryDelay(delegate
{
effect.Play(p).Flip(p.x > CC.pos.x);
effect.Play(p).Flip(p.x > center.x);
});
}
if (id == EffectId.Flare)public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
if (id == EffectId.Suicide)
{
num4 = CC.MaxHP * 2;
num4 = num4 * 100 / (50 + point.Distance(p) * 75);
num4 = num4 * 100 / (50 + center.Distance(p) * 75);
if ((c.HasCondition<ConBrightnessOfLife>() || c.HasTag(CTAG.suicide)) && !c.HasCondition<ConWet>() && !c.IsPowerful)
{
list.Add(c);public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
}
if (id == EffectId.Ball || id == EffectId.BallBubble || id == EffectId.Explosive || id == EffectId.Rocket || id == EffectId.GravityGun)
{
num4 = num4 * 100 / (90 + point.Distance(p) * 10);
num4 = num4 * 100 / (90 + center.Distance(p) * 10);
}
}
if (id == EffectId.Sword)public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
case EffectId.Rocket:
case EffectId.Flare:
case EffectId.GravityGun:
case EffectId.Comet:
num4 /= 2;
break;
}void AddCon<T>(int rate, int power) where T : Condition
}
if ((id == EffectId.Explosive || id == EffectId.Suicide || id == EffectId.Rocket) && (!EClass._zone.IsPCFaction || !EClass.Branch.HasItemProtection))
{
int num7 = id switch
int num7;
switch (id)
{
EffectId.Suicide => CC.LV / 3 + 40,
EffectId.Meteor => 50 + power / 20,
_ => (actref.refThing != null) ? actref.refThing.material.hardness : (30 + power / 20),
};
default:
num7 = ((actref.refThing != null) ? actref.refThing.material.hardness : (30 + power / 20));
break;
case EffectId.Suicide:
num7 = CC.LV / 3 + 40;
break;
case EffectId.Meteor:
case EffectId.Comet:
num7 = 50 + power / 20;
break;
}
int num8 = num7;
bool flag3 = EClass._zone.HasLaw && !EClass._zone.IsPCFaction && (CC.IsPC || (id == EffectId.Explosive && actref.refThing == null)) && !(EClass._zone is Zone_Vernis);
if (p.HasObj && p.cell.matObj.hardness <= num7)
if (p.HasObj && p.cell.matObj.hardness <= num8)
{
EClass._map.MineObj(p);
if (flag3)void AddCon<T>(int rate, int power) where T : Condition
EClass.player.ModKarma(-1);
}
}
if (!p.HasObj && p.HasBlock && p.matBlock.hardness <= num7)
if (!p.HasObj && p.HasBlock && p.matBlock.hardness <= num8)
{
EClass._map.MineBlock(p);
if (flag3)void AddCon<T>(int rate, int power) where T : Condition
}
if (e.id == 910)
{
int num8 = 0;
int num9 = 0;
if (id == EffectId.Meteor)
{
num8 = 2;
num9 = 2;
}
if (EClass._zone.IsPCFaction && EClass._zone.branch.HasItemProtection)
{
num8 = 0;
num9 = 0;
}
if (num8 > EClass.rnd(10))
if (num9 > EClass.rnd(10))
{
p.ModFire(4 + EClass.rnd(10));
}void AddCon<T>(int rate, int power) where T : Condition
bool flag = state <= BlessedState.Cursed;
bool flag2 = isNeg || flag;
Element element = Element.Create(actRef.aliasEle.IsEmpty("eleFire"), power / 10);
Color matColor = EClass.Colors.elementColors.TryGetValue(element.source.alias);
if (EClass.debug.enable && EInput.isShiftDown)
{
angle += 5;void AddCon<T>(int rate, int power) where T : Condition
{
case EffectId.Earthquake:
{
List<Point> list = EClass._map.ListPointsInCircle(CC.pos, 12f, mustBeWalkable: false);
if (list.Count == 0)
List<Point> list6 = EClass._map.ListPointsInCircle(CC.pos, 12f, mustBeWalkable: false);
if (list6.Count == 0)
{
list.Add(CC.pos.Copy());
list6.Add(CC.pos.Copy());
}
CC.Say("spell_earthquake", CC, element.Name.ToLower());
TryDelay(delegatevoid AddCon<T>(int rate, int power) where T : Condition
Shaker.ShakeCam("ball");
}
EClass.Wait(1f, CC);
DamageEle(CC, id, power, element, list, actRef, "spell_earthquake");
DamageEle(CC, id, power, element, list6, actRef, "spell_earthquake");
break;
}
case EffectId.Meteor:
{
EffectMeteor.Create(cc.pos, 6, 10, delegate
EffectMeteor.Create(cc.pos, 10, 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
{
CC.PlaySound("spell_ball");
});
if (CC.IsInMutterDistance())
{
Shaker.ShakeCam("ball");
}
EClass.Wait(1f, CC);
DamageEle(CC, id, power, element, list, actRef, "spell_ball");
return;
}
case EffectId.Comet:
{
EffectMeteor.CreateComet(tp, delegate
{
}, matColor * 2f);
List<Point> list7 = EClass._map.ListPointsInCircle(tp, 7f);
if (list7.Count == 0)
{
list7.Add(tp.Copy());
}
CC.Say("spell_ball", CC, element.Name.ToLower());
TryDelay(delegatevoid AddCon<T>(int rate, int power) where T : Condition
Shaker.ShakeCam("ball");
}
EClass.Wait(1f, CC);
DamageEle(CC, id, power, element, list3, actRef, "spell_ball");
DamageEle(CC, id, power, element, list7, actRef, "spell_ball", tp);
return;
}
case EffectId.Hand:void AddCon<T>(int rate, int power) where T : Condition
case EffectId.DrainMana:
case EffectId.Sword:
{
List<Point> list6 = new List<Point>();
list6.Add(tp.Copy());
List<Point> list2 = new List<Point>();
list2.Add(tp.Copy());
EClass.Wait(0.3f, CC);
TryDelay(delegate
{
CC.PlaySound("spell_hand");
});
if (!DamageEle(CC, id, power, element, list6, actRef, (id == EffectId.DrainBlood || id == EffectId.DrainMana) ? "" : ((id == EffectId.Sword) ? "spell_sword" : "spell_hand")))
if (!DamageEle(CC, id, power, element, list2, actRef, (id == EffectId.DrainBlood || id == EffectId.DrainMana) ? "" : ((id == EffectId.Sword) ? "spell_sword" : "spell_hand")))
{
CC.Say("spell_hand_miss", CC, element.Name.ToLower());
}void AddCon<T>(int rate, int power) where T : Condition
case EffectId.MoonSpear:
case EffectId.MoonArrow:
{
List<Point> list7 = new List<Point>();
list7.Add(tp.Copy());
List<Point> list4 = new List<Point>();
list4.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, list4, actRef, (id == EffectId.MoonSpear) ? "spell_spear" : "spell_arrow");
return;
}
case EffectId.Summon:void AddCon<T>(int rate, int power) where T : Condition
}
case EffectId.Breathe:
{
List<Point> list2 = EClass._map.ListPointsInArc(CC.pos, tp, 7, 35f);
if (list2.Count == 0)
List<Point> list5 = EClass._map.ListPointsInArc(CC.pos, tp, 7, 35f);
if (list5.Count == 0)
{
list2.Add(CC.pos.Copy());
list5.Add(CC.pos.Copy());
}
CC.Say("spell_breathe", CC, element.Name.ToLower());
EClass.Wait(0.8f, CC);void AddCon<T>(int rate, int power) where T : Condition
{
Shaker.ShakeCam("breathe");
}
DamageEle(CC, id, power, element, list2, actRef, "spell_breathe");
DamageEle(CC, id, power, element, list5, actRef, "spell_breathe");
return;
}
case EffectId.Scream:void AddCon<T>(int rate, int power) where T : Condition
}
}
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)
List<Point> list8 = EClass._map.ListPointsInCircle((id == EffectId.GravityGun || id == EffectId.Rocket || id == EffectId.Flare) ? tp : cc.pos, radius2, !flag5, !flag5);
if (list8.Count == 0)
{
list5.Add(cc.pos.Copy());
list8.Add(cc.pos.Copy());
}
cc.Say((id == EffectId.Suicide) ? "abSuicide" : "spell_ball", cc, element.Name.ToLower());
EClass.Wait(0.8f, cc);void AddCon<T>(int rate, int power) where T : Condition
{
Shaker.ShakeCam("ball");
}
DamageEle(actRef.origin ?? cc, id, power, element, list5, actRef, (id == EffectId.Suicide) ? "suicide" : "spell_ball");
DamageEle(actRef.origin ?? cc, id, power, element, list8, actRef, (id == EffectId.Suicide) ? "suicide" : "spell_ball");
if (id == EffectId.Suicide && CC.IsAliveInCurrentZone)
{
CC.Die();void AddCon<T>(int rate, int power) where T : Condition
}
case EffectId.Bolt:
{
List<Point> list4 = EClass._map.ListPointsInLine(CC.pos, tp, 10);
if (list4.Count == 0)
List<Point> list3 = EClass._map.ListPointsInLine(CC.pos, tp, 10);
if (list3.Count == 0)
{
list4.Add(CC.pos.Copy());
list3.Add(CC.pos.Copy());
}
CC.Say("spell_bolt", CC, element.Name.ToLower());
EClass.Wait(0.8f, CC);void AddCon<T>(int rate, int power) where T : Condition
{
Shaker.ShakeCam("bolt");
}
DamageEle(CC, id, power, element, list4, actRef, "spell_bolt");
DamageEle(CC, id, power, element, list3, actRef, "spell_bolt");
return;
}
case EffectId.Bubble:void AddCon<T>(int rate, int power) where T : Condition
int num = 2 + EClass.rnd(3);
int id2 = ((id == EffectId.Puddle) ? 4 : ((id == EffectId.Bubble) ? 5 : ((id == EffectId.MistOfDarkness) ? 6 : 7)));
EffectId idEffect = ((id == EffectId.Bubble) ? EffectId.BallBubble : EffectId.PuddleEffect);
Color matColor = EClass.Colors.elementColors.TryGetValue(element.source.alias);
if (id == EffectId.Bubble && CC.id == "cancer")
{
idEffect = EffectId.Nothing;void AddCon<T>(int rate, int power) where T : Condition
return;
}
}
List<Card> list8 = tp.ListCards().ToList();
list8.Reverse();
if (list8.Contains(CC))
List<Card> list9 = tp.ListCards().ToList();
list9.Reverse();
if (list9.Contains(CC))
{
list8.Remove(CC);
list8.Insert(0, CC);
list9.Remove(CC);
list9.Insert(0, CC);
}
bool flag6 = true;
foreach (Card item3 in list8)
foreach (Card item3 in list9)
{
if (tc == null || item3 == tc)
{AttackProcess
public bool Perform(int count, bool hasHit, float dmgMulti = 1f, bool maxRoll =
{
return true;
}
if (CC.HasElement(1253))
if (CC.HasElement(1253) && (!CC.HasElement(486) || !CC.IsPCFactionOrMinion))
{
TC.DamageHP(num7 / 10, 916, 100, AttackSource.None, CC);
}Card
public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc
{
Chara.TrySetEnemy(origin.Chara);
}
if ((weapon == null || !weapon.HasElement(486)) && origin.Evalue(428) > 0 && !IsPCFactionOrMinion && EClass.rnd(dmg) >= EClass.rnd(MaxHP / 10) + MaxHP / 100 + 1)
if ((weapon == null || !weapon.HasElement(486) || !origin.IsPCFactionOrMinion) && origin.Evalue(428) > 0 && !IsPCFactionOrMinion && EClass.rnd(dmg) >= EClass.rnd(MaxHP / 10) + MaxHP / 100 + 1)
{
origin.Chara.TryNeckHunt(Chara, origin.Evalue(428) * 20, harvest: true);
} }
void ProcAbsorb()
{
if (origin != null && origin.isChara && isChara && (weapon == null || !weapon.HasElement(486)))
if (origin != null && origin.isChara && isChara && (weapon == null || !weapon.HasElement(486) || !origin.IsPCFactionOrMinion))
{
int num19 = origin.Evalue(660) + (weapon?.Evalue(660, ignoreGlobalElement: true) ?? 0);
int num20 = origin.Evalue(662) + (weapon?.Evalue(662, ignoreGlobalElement: true) ?? 0);Chara
public bool CanAcceptGift(Chara c, Card t)
{
return false;
}
if (t.category.id == "currency" && !IsPCFaction)
{
return false;
}
if (base.IsPowerful && t.trait is TraitScroll { source: not null } traitScroll && traitScroll.source.abilityType.Contains("summon"))
{
return false;CustomDramaExpansion
public static bool if_has_item(DramaManager dm, Dictionary<string, string> line,
expr = ">=1";
}
Chara chara = dm.GetChara(line["actor"]);
return expr.Compare(chara.things.List((Thing t) => t.id == itemId).Count);
return expr.Compare(chara.things.List((Thing t) => t.id == itemId).Sum((Thing t) => t.Num));
}
[ElinDramaActionInvoke("nodiscard")]EffectId
Degenerate = 318,
MassFear = 319,
Fuse = 320,
BlueDrag = 321
BlueDrag = 321,
Comet = 322
}EffectMeteor
public class EffectMeteor : Effect
public Vector3 startPos;
public SoundData soundExplode;
public SpriteRenderer sr2;
public float time;
public override void OnPlay() aniExplosion.SetActive(enable: true);
destPos.Animate(AnimeID.Dig, animeBlock: true);
onComplete?.Invoke();
EMono.Sound.Play("explode", destV);
EMono.Sound.Play(soundExplode, destV);
Shaker.ShakeCam("meteor");
});
}public static void Create(Point center, int radius, int count, Action<int, Point
effect.Play(p);
}
}
public static void CreateComet(Point center, Action<int, Point> onComplete, Color color)
{
Point p = center.Copy();
EffectMeteor obj = Effect.Get("meteor_comet") as EffectMeteor;
obj.onComplete = delegate
{
onComplete(0, p);
};
obj.sr.color = color;
obj.Play(p);
}
}GameLang
public static string Parse(string text, bool thirdPerson, string val1, string va
if (val3 != null)
{
stringBuilder.Replace("#3", val3);
int num = val3.ToInt();
stringBuilder.Replace("(s3)", (num > 1) ? "s" : "");
}
if (val4 != null)
{
stringBuilder.Replace("#4", val4);
int num2 = val4.ToInt();
stringBuilder.Replace("(s4)", (num2 > 1) ? "s" : "");
}
if (int.TryParse(val1, out var result))
{GameScreenElona
public override void OnActivate()
actor.transMap.SetActive(enable: true);
actor.selector.hasTargetChanged = true;
EMono.scene.skyBG.SetActive(enable: false);
EMono.scene.skyPlane.SetActive(enable: false);
EMono.scene.cam.clearFlags = CameraClearFlags.Color;
Tutorial.Play("region");
actor.OnActivate();GoalCombat
public virtual void BuildAbilityList()
abilities.Clear();
foreach (ActList.Item item in owner.ability.list.items)
{
AddAbility(item.act, 0, item.chance, item.pt);
if (!owner.IsPC || (EClass.game.config.autoCombat.bUseInventory && (!EClass.game.config.autoCombat.bUseFav || EClass.player.favAbility.Contains(item.act.id))))
{
AddAbility(item.act, 0, item.chance, item.pt);
}
}
if (owner.mimicry != null && owner.mimicry.IsChara)
{InvOwnerDeliver
public static void PayBill(Thing t, bool fromBank = false)
}
else if (flag)
{
if (EClass.player.stats.taxBillsPaid < 0)
{
EClass.player.stats.taxBillsPaid = 2147483647L;
}
EClass.player.stats.taxBillsPaid += t.c_bill;
EClass.player.taxBills--;
if (EClass.player.taxBills < 0)Player
[JsonProperty]
public int taxBills;
[JsonProperty]
public int taxBillsPaid;
[JsonProperty]
public int digs; [JsonProperty]
public long shipMoney;
[JsonProperty]
public long taxBillsPaid;
public int lastShippingExp;
public int lastShippingExpMax;SourceElement
public override void OnAfterImportData()
AddRow(ele, num + num2 + 1000, "sword_");
AddRow(ele, num + num2 + 1100, "bit_");
AddRow(ele, num + num2 + 1200, "flare_");
AddRow(ele, num + num2 + 1300, "comet_");
num2++;
}
initialized = false;StanceSongValor
public override void TickSong()
}
else
{
item.GetCondition<ConSongValor>()?.SetValue(3);
item.GetCondition<ConSongValor>()?.SetValue(10);
}
}
}TraitMapBoard
public override void TrySetAct(ActPlan p)
List<FogType> list = Util.EnumToList<FogType>();
for (int i = 0; i < list.Count; i++)
{
layerList.Add(list[i].ToString(), delegate(int a)
layerList.Add((list[i].ToString() == "Blizard") ? "Blizzard" : list[i].ToString(), delegate(int a)
{
EClass._map.config.fog = list[a];
EClass.screen.RefreshAll();TraitParchmentBottle
public override void SetName(ref string s)
base.SetName(ref s);
if (owner.c_lockLv != 0)
{
s += "_sealed".lang();
s = s + Lang.space + "_sealed".lang();
}
}
}