EA 23.61 hotfix 1
December 19, 2024
27 files modified. 1 new file created.
Important Changes
Possible breaking changes. Click the filename to view the chunk.
AI_Fuck (2)
public override void OnCancel()
public override void OnSuccess()
SpawnSetting (1)
public static SpawnSetting Mob(string id, int fixedLv = -1)
public static SpawnSetting Mob(string id, string idEle = null, int fixedLv = -1)
AI_Fuck
@@ -279,14 +279,4 @@ static void SuccubusExp(Chara c, Chara tg)
}
}
}
public override void OnCancel()
{
Debug.Log("Cancel");
}
public override void OnSuccess()
{
Debug.Log("SUCCESS");
}
}
AI_Sleep
@@ -7,10 +7,12 @@ public override void OnProgressComplete()
if (!owner.CanSleep())
{
Msg.Say((EClass._zone.events.GetEvent<ZoneEventQuest>() != null) ? "badidea" : "notSleepy");
return;
}
else
if (base.target != null && !owner.pos.Equals(base.target.pos))
{
owner.Sleep(base.target);
owner._Move(base.target.pos);
}
owner.Sleep(base.target);
}
}
AI_UseCrafter
@@ -69,6 +69,7 @@ public void OnEnd()
{
layer.OnEndCraft();
}
crafter.OnEndAI(this);
}
public override IEnumerable<Status> Run()
ActEffect
@@ -998,6 +998,7 @@ public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
if (num4 < 0 || num4 > 10000000)
{
num4 = 10000000;
flag3 = false;
}
if (flag3)
{
AttackProcess
@@ -405,7 +405,7 @@ public bool Perform(int count, bool hasHit, float dmgMulti = 1f, bool maxRoll =
num = Dice.RollMax(dNum, dDim, dBonus);
if (ammo != null && !flag)
{
num += Dice.RollMax(dNumAmmo, dDimAmmo);
num += Dice.RollMax(dNumAmmo, dDimAmmo, dBonusAmmo);
}
if (crit && (IsMartial || IsMartialWeapon))
{
@@ -458,6 +458,10 @@ public bool Perform(int count, bool hasHit, float dmgMulti = 1f, bool maxRoll =
{
SourceRace.Row race = TC.Chara.race;
bane = CC.Evalue(468);
if (IsRanged)
{
bane += toolRange.owner.Evalue(468);
}
AddBane(race.IsUndead, 461);
AddBane(race.IsAnimal, 463);
AddBane(race.IsHuman, 464);
@@ -683,6 +687,10 @@ void AddBane(bool valid, int idEle)
{
if (valid)
{
if (IsRanged)
{
bane += toolRange.owner.Evalue(idEle);
}
bane += CC.Evalue(idEle);
}
}
BaseTileMap
@@ -2591,7 +2591,7 @@ public virtual void DrawTile()
liquidLv = 0;
}
}
else if (!flag11 && t.trait.IsChangeFloorHeight)
else if (!flag11 && t.trait.IsChangeFloorHeight && !t.ignoreStackHeight)
{
orgY += num25 + (float)t.altitude * altitudeFix.y;
orgZ += (float)t.altitude * altitudeFix.z;
Card
int num5 = Mathf.Clamp(dmg * 6 / MaxHP, 0, 4) + ((dmg > 0) ? 1 : 0);
if (Evalue(1421) > 0)
{
int num6 = dmg;
int num6 = 0;
int num7 = dmg;
if (hp > 0)
{
num6 = dmg - hp;
num7 = dmg - hp;
hp -= dmg;
num6 += dmg;
if (hp < 0 && Chara.mana.value >= 0)
{
num6 += hp;
hp = 0;
}
}
{
if (Evalue(1421) >= 2)
{
num6 /= 2;
num7 /= 2;
}
dmg = num6;
dmg = num7;
if (Chara.mana.value > 0)
{
num6 -= Chara.mana.value;
num7 -= Chara.mana.value;
Chara.mana.value -= dmg;
num6 += dmg;
}
if (Chara.mana.value <= 0)
{
hp -= num6;
hp -= num7;
num6 += num7;
}
}
dmg = num6;
}
else
{
if (e != Element.Void)
{
c2 = EClass.Colors.elementColors.TryGetValue(e.source.alias);
float num7 = (c2.r + c2.g + c2.b) / 3f;
num7 = ((num7 > 0.5f) ? 0f : (0.6f - num7));
c2 = new Color(c2.r + num7, c2.g + num7, c2.b + num7, 1f);
float num8 = (c2.r + c2.g + c2.b) / 3f;
num8 = ((num8 > 0.5f) ? 0f : (0.6f - num8));
c2 = new Color(c2.r + num8, c2.g + num8, c2.b + num8, 1f);
}
popper.SetText(dmg.ToString() ?? "", c2);
}
if (EClass.player.invlunerable)
{
EvadeDeath();
goto IL_095f;
goto IL_0992;
}
}
if (IsPC && Evalue(1220) > 0 && Chara.stamina.value >= Chara.stamina.max / 2)
}
}
}
goto IL_095f;
IL_095f:
goto IL_0992;
IL_0992:
if (trait.CanBeAttacked)
{
renderer.PlayAnime(AnimeID.HitObj);
}
else if (isChara)
{
int num8 = ((attackSource != AttackSource.Condition && attackSource != AttackSource.WeaponEnchant) ? 1 : 2);
if (num5 >= num8)
int num9 = ((attackSource != AttackSource.Condition && attackSource != AttackSource.WeaponEnchant) ? 1 : 2);
if (num5 >= num9)
{
if (e != Element.Void)
{
}
if (origin.HasElement(662) && attackSource == AttackSource.Melee && origin.isChara && Chara.IsHostile(origin as Chara))
{
int num9 = EClass.rnd(3 + Mathf.Clamp(dmg / 100, 0, origin.Evalue(662) / 10));
origin.Chara.stamina.Mod(num9);
int num10 = EClass.rnd(3 + Mathf.Clamp(dmg / 100, 0, origin.Evalue(662) / 10));
origin.Chara.stamina.Mod(num10);
if (IsAliveInCurrentZone)
{
Chara.stamina.Mod(-num9);
Chara.stamina.Mod(-num10);
}
}
if (origin.HasElement(1350) && attackSource == AttackSource.Melee)
{
int num10 = EClass.rndHalf(2 + Mathf.Clamp(dmg / 10, 0, origin.Chara.GetPietyValue() + 10));
origin.Chara.mana.Mod(num10);
int num11 = EClass.rndHalf(2 + Mathf.Clamp(dmg / 10, 0, origin.Chara.GetPietyValue() + 10));
origin.Chara.mana.Mod(num11);
if (IsAliveInCurrentZone)
{
Chara.mana.Mod(-num10);
Chara.mana.Mod(-num11);
}
}
if (origin.HasElement(661) && attackSource == AttackSource.Melee)
{
int num11 = EClass.rnd(2 + Mathf.Clamp(dmg / 10, 0, origin.Evalue(661) + 10));
origin.Chara.mana.Mod(num11);
int num12 = EClass.rnd(2 + Mathf.Clamp(dmg / 10, 0, origin.Evalue(661) + 10));
origin.Chara.mana.Mod(num12);
if (IsAliveInCurrentZone)
{
Chara.mana.Mod(-num11);
Chara.mana.Mod(-num12);
}
}
}
elements.ModExp(123, a3);
}
}
int num12 = ((EClass.rnd(2) == 0) ? 1 : 0);
int num13 = ((EClass.rnd(2) == 0) ? 1 : 0);
if (attackSource == AttackSource.Condition)
{
num12 = 1 + EClass.rnd(2);
num13 = 1 + EClass.rnd(2);
}
if (num12 > 0)
if (num13 > 0)
{
bool flag = Chara.HasCondition<ConPoison>() || ((e.id == 915 || e.id == 923) && ResistLv(Evalue(955)) < 4);
AddBlood(num12, flag ? 6 : (-1));
AddBlood(num13, flag ? 6 : (-1));
}
bool flag2 = true;
switch (e.id)
}
if (IsPC)
{
float num13 = (float)hp / (float)MaxHP;
float num14 = (float)hp / (float)MaxHP;
if (Evalue(1421) > 0)
{
num13 = (float)Chara.mana.value / (float)Chara.mana.max;
num14 = (float)Chara.mana.value / (float)Chara.mana.max;
}
if (num13 < 0.3f)
if (num14 < 0.3f)
{
PlaySound("heartbeat", 1f - num13 * 2f);
PlaySound("heartbeat", 1f - num14 * 2f);
}
}
if (!IsPC && hp < MaxHP / 5 && Evalue(423) <= 0 && dmg * 100 / MaxHP + 10 > EClass.rnd(IsPowerful ? 400 : 150) && !HasCondition<ConFear>())
Chara
@@ -1338,7 +1338,7 @@ public override void OnCreate(int genLv)
string[] array = mainElement[i].Split('/');
SourceElement.Row row = EClass.sources.elements.alias["ele" + array[0]];
int num2 = source.LV * row.eleP / 100 + base.LV - source.LV;
if (list.Count == 0 || num2 < genLv)
if (list.Count == 0 || num2 < genLv || array[0] == bp.idEle)
{
list.Add(new Tuple<string, int, int>(array[0], (array.Length > 1) ? int.Parse(array[1]) : 0, num2));
}
@@ -1346,7 +1346,7 @@ public override void OnCreate(int genLv)
Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / (100 + (genLv - a.Item3) * 25));
if (!bp.idEle.IsEmpty())
{
tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle).First();
tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle).FirstOrDefault() ?? tuple;
}
SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental: true);
if (list.Count >= 2)
@@ -5852,7 +5852,7 @@ public override void SetRenderParam(RenderParam p)
else if (sourceCard._tiles.Length > 1)
{
int num2 = ((base.idSkin != 0 || source.staticSkin) ? base.idSkin : (base.uid % sourceCard._tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
p.tile = sourceCard._tiles[(num2 < sourceCard._tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
p.tile = sourceCard._tiles[(num2 >= 0 && num2 < sourceCard._tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
}
else
{
@@ -6347,7 +6347,7 @@ public TraitBed FindBed()
public TraitBed TryAssignBed()
{
if (memberType == FactionMemberType.Livestock || (!IsPCFaction && !IsGuest()))
if (!IsPCFaction && !IsGuest())
{
return null;
}
}
CureCondition<ConWait>();
CureCondition<ConSleep>();
if (type == CureType.Death && hunger.value > 30)
{
hunger.value = 30;
}
if (type == CureType.Jure)
{
SAN.Mod(-999);
DNA
@@ -244,6 +244,7 @@ public void Generate(Type _type, Chara model = null)
int body = 0;
int action = 0;
int feat = 0;
int maxSlot = 1;
List<Element> listAttb = model.elements.ListBestAttributes();
List<Element> listSkill = model.elements.ListBestSkills();
List<Element> listFeat = model.elements.ListGeneFeats();
@@ -336,7 +337,14 @@ void AddFeat()
{
feat++;
Element e = listFeat.RandomItem();
AddVal(e.id, 1, allowStack: false, (int v) => e.source.cost[0] * 5);
if (maxSlot <= 1 || e.source.geneSlot <= 1)
{
if (e.source.geneSlot > maxSlot)
{
maxSlot = e.source.geneSlot;
}
AddVal(e.id, 1, allowStack: false, (int v) => e.source.cost[0] * 5);
}
}
}
void AddRandom(int n)
FactionBranch
@@ -287,7 +287,7 @@ public void OnAfterSimulate()
}
foreach (Chara chara in EClass._map.charas)
{
if (!chara.IsPCParty && !chara.noMove && (chara.pos.cell.IsBlocked || chara.pos.cell.hasDoor) && !chara.isRestrained && !chara.HasCondition<ConSuspend>())
if (!chara.IsPCParty && !chara.noMove && (chara.pos.cell.HasBlock || chara.pos.cell.hasDoor) && !chara.isRestrained && !chara.HasCondition<ConSuspend>())
{
chara.MoveImmediate(chara.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? chara.pos);
}
GoalGraze
@@ -14,7 +14,6 @@ public override IEnumerable<Status> Run()
public Point GetPos()
{
owner.ClearBed();
Thing thing = null;
Rand.SetSeed(owner.uid);
if (thing == null)
GoalSleep
@@ -54,7 +54,7 @@ public override void OnSimulatePosition()
{
owner.TryAssignBed();
}
if (bed != null && !bed.pos.HasChara)
if (bed != null)
{
owner.MoveImmediate(bed.pos);
return;
Hobby
@@ -44,10 +44,13 @@ public int GetEfficiency(Chara c)
{
return 0;
}
TraitBed traitBed = c.FindBed();
if (traitBed != null)
if (c.memberType != FactionMemberType.Livestock)
{
num += 30 + traitBed.owner.GetTotalQuality() + traitBed.owner.Evalue(750);
TraitBed traitBed = c.FindBed();
if (traitBed != null)
{
num += 30 + traitBed.owner.GetTotalQuality() + traitBed.owner.Evalue(750);
}
}
}
if (source.alias == "Breeding")
ListPeopleBed
@@ -2,6 +2,8 @@ public class ListPeopleBed : ListPeople
{
public TraitBed bed;
public BedType bedType => bed.owner.c_bedType;
public override void OnInstantiate(Chara c, ItemGeneral i)
{
UIButton uIButton = i.AddSubButton(EClass.core.refs.icons.bed, delegate
@@ -37,12 +39,23 @@ public override void OnList()
{
foreach (Chara chara in EClass._map.charas)
{
if (!chara.IsPCFaction || chara.memberType != 0)
if (!chara.IsPCFaction || (chara.memberType != 0 && chara.memberType != FactionMemberType.Livestock))
{
continue;
}
if (main)
{
if (bedType == BedType.livestock)
{
if (chara.memberType != FactionMemberType.Livestock)
{
continue;
}
}
else if (chara.memberType == FactionMemberType.Livestock)
{
continue;
}
if (!bed.IsHolder(chara))
{
list.Add(chara);
Region
@@ -308,7 +308,7 @@ public override void OnAdvanceHour()
}
}
}
if (ListMobs().Count >= 6 || EClass.rnd(3) != 0)
if (ListMobs().Count >= (EClass.debug.enable ? 100 : 6) || EClass.rnd(3) != 0)
{
return;
}
SpawnSetting
@@ -16,6 +16,8 @@ public class SpawnSetting
public string id;
public string idEle;
public Rarity rarity = Rarity.Random;
public SpawnHostility hostility = SpawnHostility.Enemy;
@@ -63,11 +65,12 @@ public static SpawnSetting Encounter(int lv)
};
}
public static SpawnSetting Mob(string id, int fixedLv = -1)
public static SpawnSetting Mob(string id, string idEle = null, int fixedLv = -1)
{
return new SpawnSetting
{
id = id,
idEle = idEle,
fixedLv = fixedLv
};
}
ThingContainer
@@ -790,17 +790,18 @@ public List<Thing> List(Func<Thing, bool> func, bool onlyAccessible = false)
public void _List(Func<Thing, bool> func, bool onlyAccessible = false)
{
if (onlyAccessible && !owner.trait.CanSearchContents)
{
return;
}
using Enumerator enumerator = GetEnumerator();
while (enumerator.MoveNext())
{
Thing current = enumerator.Current;
if (!onlyAccessible || !(current.parent is Card) || (current.parent as Card).c_lockLv <= 0)
current.things._List(func, onlyAccessible);
if (func(current))
{
current.things._List(func, onlyAccessible);
if (func(current))
{
tempList.Add(current);
}
tempList.Add(current);
}
}
}
TraitBed
@@ -54,7 +54,7 @@ public override void TrySetAct(ActPlan p)
SE.Play("jingle_embark");
});
}
if (owner.c_bedType == BedType.resident || owner.c_bedType == BedType.residentOne)
if (owner.c_bedType == BedType.resident || owner.c_bedType == BedType.residentOne || owner.c_bedType == BedType.livestock)
{
uIContextMenu.AddButton("assignBed", delegate
{
@@ -65,17 +65,15 @@ public override void TrySetAct(ActPlan p)
{
BedType.resident,
BedType.residentOne,
BedType.livestock,
BedType.guest
})
{
if (t != BedType.livestock && t != BedType.patient)
uIContextMenu.AddButton(((t == owner.c_bedType) ? "context_checker".lang() : "") + ("bed_" + t).lang(), delegate
{
uIContextMenu.AddButton(((t == owner.c_bedType) ? "context_checker".lang() : "") + ("bed_" + t).lang(), delegate
{
SetBedType(t);
SE.ClickOk();
});
}
SetBedType(t);
SE.ClickOk();
});
}
CursorSystem.ignoreCount = 5;
uIContextMenu.Show();
TraitCrafter
@@ -461,4 +461,8 @@ public override bool OnUse(Chara c)
LayerDragGrid.CreateCraft(this);
return false;
}
public virtual void OnEndAI(AI_UseCrafter ai)
{
}
}
+TraitFortuneBall
File Created
public class TraitFortuneBall : Trait
{
}
TraitMoongateEx
@@ -19,6 +19,7 @@ public override bool OnUse(Chara c)
MapMetaData metaData = Map.GetMetaData(item.FullName);
if (metaData != null && metaData.IsValidVersion())
{
metaData.path = item.FullName;
list.Add(metaData);
}
}
@@ -28,13 +29,45 @@ public override bool OnUse(Chara c)
EClass.pc.SayNothingHappans();
return false;
}
EClass.ui.AddLayer<LayerList>().SetList2(list, (MapMetaData a) => a.name, delegate(MapMetaData a, ItemGeneral b)
LayerList layer = null;
bool skipDialog = false;
layer = EClass.ui.AddLayer<LayerList>().SetList2(list, (MapMetaData a) => a.name, delegate(MapMetaData a, ItemGeneral b)
{
LoadMap(a);
}, delegate
}, delegate(MapMetaData a, ItemGeneral b)
{
b.AddSubButton(EClass.core.refs.icons.trash, delegate
{
if (skipDialog)
{
func();
}
else
{
Dialog.Choice("dialogDeleteGame", delegate(Dialog d)
{
d.AddButton("yes".lang(), delegate
{
func();
});
d.AddButton("yesAndSkip".lang(), delegate
{
func();
skipDialog = true;
});
d.AddButton("no".lang());
});
}
});
void func()
{
IO.DeleteFile(a.path);
list.Remove(a);
layer.list.List();
SE.Trash();
}
}).SetSize(500f)
.SetTitles("wMoongate");
.SetTitles("wMoongate") as LayerList;
return false;
}
}
TraitObj
public class TraitObj : TraitTile
{
public override TileRow source => EClass.sources.objs.rows[owner.refVal];
public override bool CanBeOnlyBuiltInHome => true;
}
TraitRollingFortune
@@ -14,4 +14,16 @@ public override int GetDuration(AI_UseCrafter ai, int costSp)
{
return GetSource(ai).time;
}
public override void OnEndAI(AI_UseCrafter ai)
{
if (EClass.pc.isDead || !owner.ExistsOnMap)
{
return;
}
foreach (Card item in owner.pos.ListThings<TraitFortuneBall>(onlyInstalled: false))
{
EClass.pc.Pick(item.Thing, msg: false);
}
}
}
Widget
@@ -332,11 +332,14 @@ public virtual void OnManagerActivate()
goCover = Util.Instantiate("UI/Widget/CoverWidget", base.transform).gameObject;
RectTransform rectTransform = goCover.transform.Rect();
RectTransform rectTransform2 = dragPanel.Rect();
rectTransform.pivot = rectTransform2.pivot;
rectTransform.anchorMin = rectTransform2.anchorMin;
rectTransform.anchorMax = rectTransform2.anchorMax;
rectTransform.anchoredPosition = rectTransform2.anchoredPosition;
rectTransform.sizeDelta = rectTransform2.sizeDelta;
if ((bool)rectTransform && (bool)rectTransform2)
{
rectTransform.pivot = rectTransform2.pivot;
rectTransform.anchorMin = rectTransform2.anchorMin;
rectTransform.anchorMax = rectTransform2.anchorMax;
rectTransform.anchoredPosition = rectTransform2.anchoredPosition;
rectTransform.sizeDelta = rectTransform2.sizeDelta;
}
UIDragPanel componentInChildren = goCover.GetComponentInChildren<UIDragPanel>();
componentInChildren.autoAnchor = config.userAnchor == RectPosition.Auto;
componentInChildren.onDrag = OnChangePosition;
WidgetDate
@@ -117,6 +117,10 @@ public void _Refresh()
{
text += item2.TextWidgetDate;
}
if (EMono.debug.enable)
{
text += " *DEBUG MODE*";
}
textTime.text = text;
rectClock.SetActive(extra.clock);
if (extra.clock)
Zone
@@ -2511,7 +2511,8 @@ public Chara SpawnMob(Point pos = null, SpawnSetting setting = null)
int dangerLv = DangerLv;
CardBlueprint cardBlueprint = new CardBlueprint
{
rarity = Rarity.Normal
rarity = Rarity.Normal,
idEle = setting.idEle
};
int num = ((setting.filterLv == -1) ? dangerLv : setting.filterLv);
if (ScaleMonsterLevel)
ZonePreEnterEncounter
@@ -24,7 +24,7 @@ public override void Execute()
Point randomPointInRadius = EClass.pc.pos.GetRandomPointInRadius(2, 5, requireLos: false, allowChara: false);
if (randomPointInRadius != null)
{
Chara chara = EClass._zone.SpawnMob(randomPointInRadius, SpawnSetting.Mob(mob.id));
Chara chara = EClass._zone.SpawnMob(randomPointInRadius, SpawnSetting.Mob(mob.id, (mob.MainElement == Element.Void) ? null : mob.MainElement.source.alias.Substring(3)));
Hostility hostility2 = (chara.c_originalHostility = Hostility.Enemy);
chara.hostility = hostility2;
chara.enemy = EClass.pc.party.members.RandomItem();