EA 23.288 Nightly
March 26, 2026
16 files modified. 2 new files created.
Important Changes
Possible breaking changes. Click the filename to view the chunk.
BaseWidgetNotice (1)
public override void OnFlip() ThingContainer (3)
private static List<Thing> tempList = new List<Thing>(); private void _ListCurrency(string id)
private void _ListCurrency(List<Thing> tempList, string id) public void _List(Func<Thing, bool> func, bool onlyAccessible = false)
public void _List(List<Thing> tempList, Func<Thing, bool> func, bool onlyAccessible = false) AI_Idle
public override IEnumerable<Status> Run()
{
case "azzrasizzle":
case "geist":
case "machine_speller":
{
if (EClass.rnd(20) != 0)
{ActKiss
public override bool CanPerform()
{
return false;
}
if (Act.TC.IsPC && Act.TC.Chara.parasite == null && Act.TC.Chara.ride == null)
{
return false;
}
return true;
}ActNTR
public override bool CanPerform()
{
return false;
}
if (!Act.CC.CanSeeLos(chara))
{
return false;
}
if (chara.conSleep != null || Act.CC.HasElement(1239) || chara.Evalue(418) < 0)
{
return true;ActTelekinesis
public override void OnMarkMapHighlights()
public override bool CanPerform()
{
if (!Act.CC.IsPC)
if (Act.CC.IsPC)
{
return false;
Act.TC = EClass.scene.mouseTarget.card;
}
Act.TC = EClass.scene.mouseTarget.card;
if (Act.TC == null || Act.TC.pos.Equals(Act.CC.pos))
{
return false;
}
if (!Act.CC.IsPC && Act.CC.Dist(Act.TC) != 1)
{
return false;
}
if (!Act.TC.trait.CanBeHeld || !Act.TC.trait.CanBeTeleported || Act.TC.IsMultisize)
{
return false;BaseTileMap
public virtual void DrawTile()
_actorPos.x += pref.x * (float)((!t.flipX) ? 1 : (-1));
_actorPos.z += pref.z;
thingPos.z += pref.z;
liquidLv -= (int)(num12 * 150f);
if (liquidLv < 0)
{
liquidLv = 0;BaseWidgetNotice
public void _RefreshAll()
{
layout.childAlignment = RectPositionToTextAnchor(base.config.pivot);
OnRefresh();
foreach (BaseNotification i in list)
{public void Remove(BaseNotification n)
}
}
public override void OnFlip()
{
layout.childAlignment = (flip ? TextAnchor.MiddleRight : TextAnchor.MiddleLeft);
this.Rect().pivot = new Vector2(flip ? 1 : 0, this.Rect().pivot.y);
}
public override void OnSetContextMenu(UIContextMenu m)
{
m.AddChild("style").AddSlider("toggleButtonBG", (float a) => a.ToString() ?? "", base.config.skin.button, delegate(float a)Card
public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool sel
return 5;
case "lunch_love":
return 20;
case "scroll_alias":
return 5;
case "scroll_biography":
return 5;
case "1268":
return 8;
case "1329":
return 20;
}
break;
case CurrencyType.Ecopo:QuestDefenseGame
public class QuestDefenseGame : QuestInstance
public override bool FameContent => useFame;
public override int FameOnComplete => (lastWave * 8 + difficulty * 10) * (100 + bonus * 5) / 100;
public override int FameOnComplete => (LastWaveBonus * 8 + difficulty * 10) * (100 + bonus * 5) / 100;
public int LastWaveBonus => Mathf.Min(lastWave, 1000000);
public override ZoneEventQuest CreateEvent()
{ public override void OnBeforeComplete()
{
Debug.Log("QuestDefenseGame: " + lastWave + "/" + bonus);
bonusMoney += EClass.rndHalf(lastWave * 400 * (100 + bonus * 5) / 100);
bonusMoney += EClass.rndHalf(LastWaveBonus * 400 / 100 * (100 + bonus * 5));
}
public override string GetTextProgress()QuestRandom
public class QuestRandom : Quest
public override void OnDropReward()
{
int num = bonusMoney * (55 + difficulty * 15) / 100;
int num2 = rewardMoney + num;
long num = (long)bonusMoney * (long)(55 + difficulty * 15) / 100;
int num2 = MathEx.ClampToInt(num + rewardMoney, 10000000);
if (num2 > 0)
{
if (num > 0)Steam
private void CreateUserContent2(UgcQuery query)
for (int i = 0; i < keyValueTags.Length; i++)
{
StringKeyValuePair stringKeyValuePair = keyValueTags[i];
if (stringKeyValuePair.key == "id" && stringKeyValuePair.value == baseModPackage.id && results.Owner.id == App.Client.Owner.id)
if (stringKeyValuePair.key == "id" && stringKeyValuePair.value == baseModPackage.id && results.Owner.id == User.Client.Id)
{
Debug.Log("Updating Content");
UpdateUserContent(results.FileId);ThingContainer
private static List<ThingContainer> _listContainers = new List<ThingContainer>();
private static List<Thing> tempList = new List<Thing>();
[JsonIgnore]
public int GridSize => width * height;public bool IsFull(Thing t, bool recursive = true, bool tryStack = true)
public void AddCurrency(Card owner, string id, int a, SourceMaterial.Row mat = null)
{
int num = a;
ListCurrency(id);
foreach (Thing temp in tempList)
foreach (Thing item in ListCurrency(id))
{
if (!(temp.id != id) && (mat == null || temp.material == mat) && (num <= 0 || temp.Num + num > 0))
if (!(item.id != id) && (mat == null || item.material == mat) && (num <= 0 || item.Num + num > 0))
{
if (num > 0)
{
temp.ModNum(num);
item.ModNum(num);
return;
}
if (temp.Num + num >= 0)
if (item.Num + num >= 0)
{
temp.ModNum(num);
item.ModNum(num);
return;
}
num += temp.Num;
temp.ModNum(-temp.Num);
num += item.Num;
item.ModNum(-item.Num);
}
}
if (num != 0 && num > 0)public Thing Find<T>() where T : Trait
public Thing FindBest<T>(Func<Thing, int> func) where T : Trait
{
List((Thing t) => t.trait is T, onlyAccessible: true);
if (tempList.Count == 0)
List<Thing> list = List((Thing t) => t.trait is T, onlyAccessible: true);
if (list.Count == 0)
{
return null;
}
tempList.Sort((Thing a, Thing b) => func(b) - func(a));
return tempList[0];
list.Sort((Thing a, Thing b) => func(b) - func(a));
return list[0];
}
public Thing Find(Func<Thing, bool> func, bool recursive = true)public long GetCurrency(string id, ref long sum, SourceMaterial.Row mat = null)
public List<Thing> ListCurrency(string id)
{
tempList.Clear();
_ListCurrency(id);
return tempList;
List<Thing> list = new List<Thing>();
list.Clear();
_ListCurrency(list, id);
return list;
}
private void _ListCurrency(string id)
private void _ListCurrency(List<Thing> tempList, string id)
{
using Enumerator enumerator = GetEnumerator();
while (enumerator.MoveNext())private void _ListCurrency(string id)
Thing current = enumerator.Current;
if (current.CanSearchContents)
{
current.things._ListCurrency(id);
current.things._ListCurrency(tempList, id);
}
if (current.id == id)
{private void _ListCurrency(string id)
public List<Thing> List(Func<Thing, bool> func, bool onlyAccessible = false)
{
tempList.Clear();
_List(func, onlyAccessible);
return tempList;
List<Thing> list = new List<Thing>();
list.Clear();
_List(list, func, onlyAccessible);
return list;
}
public void _List(Func<Thing, bool> func, bool onlyAccessible = false)
public void _List(List<Thing> tempList, Func<Thing, bool> func, bool onlyAccessible = false)
{
if (onlyAccessible && !owner.trait.CanSearchContent)
{public void _List(Func<Thing, bool> func, bool onlyAccessible = false)
while (enumerator.MoveNext())
{
Thing current = enumerator.Current;
current.things._List(func, onlyAccessible);
current.things._List(tempList, func, onlyAccessible);
if (func(current))
{
tempList.Add(current);Trait
public void OnBarter(bool reroll = false)
Add("book_resident", 1, 0);
Add("board_party", 1, 0);
Add("board_party2", 1, 0);
Add("book_roster", 1, 0);
Add("3", 1, 0);
Add("4", 1, 0);
Add("5", 1, 0);public void OnBarter(bool reroll = false)
break;
case ShopType.Moyer:
{
for (int num13 = 1; num13 <= 17; num13++)
for (int num13 = 1; num13 <= 20; num13++)
{
AddAdvWeek(num13);
}Thing Add(string id, int a, int idSkin)
}
void AddAdvWeek(int i)
{
Thing thing7 = ThingGen.CreateRedBook("advweek_" + i);
thing7.c_priceFix = -90;
AddThing(thing7);
if (i != 18)
{
Thing thing7 = ThingGen.CreateRedBook("advweek_" + i);
thing7.c_priceFix = -90;
AddThing(thing7);
}
}
void AddCassette(int idCas, string idQuest, int phase)
{TraitBookResident
public class TraitBookResident : TraitItem
{
public override string LangUse => "actRead";
public override bool IsHomeItem => true;
public override bool OnUse(Chara c)
{
if (!EClass._zone.IsPCFaction)+TraitBookRoster
File Created
public class TraitBookRoster : TraitItem
{
public override string LangUse => "actRead";
public override bool IsHomeItem => true;
public override bool OnUse(Chara c)
{
if (!EClass._zone.IsPCFaction)
{
Msg.SayNothingHappen();
return false;
}
LayerPeople.CreateParty();
return false;
}
}TraitCrafter
public override void TrySetAct(ActPlan p)
return false;
}, _t, CursorSystem.Craft);
}
else if (!(this is TraitIncubator) || EClass._zone.IsPCFaction)
else
{
p.TrySetAct(CrafterTitle, delegate
{TraitGeyser
public class TraitGeyser : TraitBath
public class TraitGeyser : TraitBath
public class TraitGeyser : Trait
{
public override int radius => 4;
}+TraitSpeaker
File Created
public class TraitSpeaker : Trait
{
public override ToggleType ToggleType => ToggleType.Electronics;
}Widget
public void SetAnchor(RectPosition p)
_rect.SetAnchor(p);
}
public TextAnchor RectPositionToTextAnchor(RectPosition p)
{
return p switch
{
RectPosition.TopCenter => TextAnchor.UpperCenter,
RectPosition.BottomCenter => TextAnchor.LowerCenter,
RectPosition.TopLEFT => TextAnchor.UpperLeft,
RectPosition.BottomLEFT => TextAnchor.LowerLeft,
RectPosition.TopRIGHT => TextAnchor.UpperRight,
RectPosition.BottomRIGHT => TextAnchor.LowerRight,
RectPosition.Left => TextAnchor.MiddleLeft,
RectPosition.Right => TextAnchor.MiddleRight,
_ => TextAnchor.MiddleCenter,
};
}
public void SetPivot(RectPosition p)
{
config.pivot = p;