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)
public static int Whore(Chara c)
public static int Whore(Chara seller, Chara buyer)
AI_Fuck
using System.Collections.Generic;
using UnityEngine;
public class AI_Fuck : AIAct
{
@@ -63,7 +64,7 @@ public override IEnumerable<Status> Run()
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()
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()
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()
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()
}
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()
}
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
{
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
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
}
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);
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)
{
}
else
{
num3 = num3 * (100 - power / 10) / 100;
num4 = num4 * (100 - power / 10) / 100;
if (blessed)
{
power /= 4;
}
cc.Say("lighten", cc, tc);
}
tc.c_weight = num3;
tc.c_weight = num4;
tc.SetDirtyWeight();
if (tc.parent == null)
{
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;
}
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
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)
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)
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
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()
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)
{
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)
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)
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
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
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()
{
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()
}
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)
{
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)
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)
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()
}
}
});
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)
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()
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()
[JsonProperty]
public int debt;
[JsonProperty]
public int seedFortune;
[JsonProperty]
public float angle;
@@ -977,8 +980,6 @@ public void OnLeaveZone()
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)
{
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)
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
Sculpture,
Talisman,
Scratch,
Incubator
Incubator,
Fortune
}
public enum AnimeType
@@ -276,8 +277,8 @@ public virtual Thing Craft(AI_UseCrafter ai)
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)
}
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)
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
public override bool CanBeBanished => false;
public override int RestockDay => 30;
public override int RestockDay => 28;
public override bool CanCopy(Thing t)
{
+TraitGiftJure
File Created
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
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
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()
text = text + Environment.NewLine + mouseTarget.target.InspectName;
}
}
else
else if (mouseTarget.target != null)
{
text = mouseTarget.target.InspectName;
}