2using System.Collections.Generic;
13 private static List<Hobby>
listHobby =
new List<Hobby>();
15 public static string[]
IDTimeTable =
new string[2] {
"default",
"owl" };
42 [JsonProperty(PropertyName =
"T1")]
45 [JsonProperty(PropertyName =
"T2")]
48 [JsonProperty(PropertyName =
"T3")]
51 [JsonProperty(PropertyName =
"T4")]
54 [JsonProperty(PropertyName =
"T5")]
57 [JsonProperty(PropertyName =
"T6")]
60 [JsonProperty(PropertyName =
"T7")]
63 [JsonProperty(PropertyName =
"T8")]
66 [JsonProperty(PropertyName =
"1")]
69 [JsonProperty(PropertyName =
"2")]
72 [JsonProperty(PropertyName =
"3")]
75 [JsonProperty(PropertyName =
"4")]
78 [JsonProperty(PropertyName =
"8")]
79 public string[]
_strs =
new string[5];
81 [JsonProperty(PropertyName =
"9")]
184 private static List<Chara>
_pts =
new List<Chara>();
474 if (base.c_originalHostility == (
Hostility)0)
476 if (!
source.hostility.IsEmpty())
482 return base.c_originalHostility;
492 if (
source.idActor.Length <= 1)
522 return "CharaActorPCC";
534 if (base.dir != 1 && base.dir != 2)
550 return base.dir == 2;
564 return base.ExistsOnMap;
630 return base.c_uidMaster != 0;
706 public override int MaxHP => (int)Mathf.Clamp(((
long)(base.END * 2 + base.STR + base.WIL / 2) * (
long)Mathf.Min(base.LV, 25) / 25 + base.END + 10) *
Evalue(60) / 100 * ((base.IsPCFactionOrMinion ? 100 : (100 + (int)base.rarity * 300)) + (
IsPC ? (
EClass.
player.
lastEmptyAlly *
Evalue(1646)) : 0)) / 100, 1f, 100000000f);
708 public override int WeightLimit => Mathf.Max((base.STR * 500 + base.END * 250 +
Evalue(207) * 2000) * ((!
HasElement(1411)) ? 1 : 5) + 45000, 1000);
712 public int MaxSummon => Mathf.Max((
int)Mathf.Sqrt(base.CHA), 1) +
Evalue(1647) + ((!base.IsPCFactionOrMinion) ? ((
int)base.rarity * 5) : 0);
718 if (base.c_idMainElement == 0)
726 public override int DV
737 num = 50 + (num - 50) / 10;
740 int WeaknessMod(
int a)
742 if (HasCondition<ConWeakness>())
755 public override int PV
766 num = 50 + (num - 50) / 10;
769 int WeaknessMod(
int a)
771 if (HasCondition<ConWeakness>())
842 if (!
IsGlobal && !base.isSubsetCard)
994 return race.id ==
"mutant";
1006 return race.tag.Contains(
"humanSpeak");
1018 return EClass.Branch.uidMaid == base.uid;
1044 if (!
source.works.Contains(
"Rich"))
1046 return source.hobbies.Contains(
"Rich");
1060 if (base.c_genes !=
null)
1062 return base.c_genes.GetGeneSlot(
this);
1084 if (!
race.tag.Contains(
"mofu"))
1111 if (!h.
source.elements.IsEmpty())
1113 for (
int i = 0; i < h.
source.elements.Length; i += 2)
1115 int ele = h.
source.elements[i];
1116 int v = h.
source.elements[i + 1];
1146 if (base.rarity >=
Rarity.Legendary)
1161 if (
host ==
null || includeRide)
1165 return base.hp <
MaxHP / 5;
1180 return num > num2 + 0.1f;
1273 return p.cell.room.data.accessType
switch
1276 BaseArea.AccessType.Private =>
false,
1303 for (
int i = 0; i < slots.Count; i++)
1312 _cbits1.Bits = (uint)
_cints[0];
1323 pccData.state = (base.isCensored ? PCCState.Naked : PCCState.Normal);
1332 if (
source.tag.Contains(
"boss"))
1349 string text = base.c_altName ??
source.GetName(
this);
1353 if (base.c_bossType ==
BossType.Evolved)
1355 text =
"_evolved".lang(text.ToTitleCase(wholeText:
true));
1358 if (text.Length > 0 &&
char.IsLower(text[0]))
1360 if (base.rarity >=
Rarity.Legendary)
1362 text = text.ToTitleCase();
1366 text = text.AddArticle();
1373 int num2 = ((base.rarity ==
Rarity.Mythical) ? 3 : ((base.rarity >=
Rarity.Legendary) ? 2 : ((!
_alias.IsEmpty()) ? 1 : (-1))));
1378 text = (
Aka.IsEmpty() ? text.Bracket(num2) : (num2
switch
1383 }).lang((num2 == -1) ?
Aka :
Aka.ToTitleCase(wholeText:
true), text.Bracket(num2)));
1385 return text + text2;
1390 if (r != base.rarity)
1426 if (uniqueData !=
null)
1465 base.isSubsetCard =
false;
1467 base.c_uidMaster = 0;
1499 if (
source.tag.Contains(
"boss"))
1503 int num = ((bp.lv != -999) ?
bp.
lv : base.LV);
1526 if (
source.idActor.Length > 2)
1535 if (
source.mainElement.Length != 0)
1537 int _genLv = Mathf.Min(genLv, 100);
1538 List<Tuple<string, int, int>> list =
new List<Tuple<string, int, int>>();
1539 string[] mainElement =
source.mainElement;
1540 for (
int i = 0; i < mainElement.Length; i++)
1542 string[] array = mainElement[i].Split(
'/');
1544 int num2 = source.LV * row.eleP / 100;
1545 if (list.Count == 0 || num2 < _genLv || array[0] ==
bp.
idEle)
1547 list.Add(
new Tuple<string, int, int>(array[0], (array.Length > 1) ?
int.Parse(array[1]) : 0, num2));
1550 Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / (100 + (_genLv - a.Item3) * 25));
1553 tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle ||
"ele" + a.Item1 ==
bp.
idEle).FirstOrDefault() ?? tuple;
1555 SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental:
true);
1556 if (list.Count >= 2)
1558 num = tuple.Item3 + base.LV -
source.LV;
1563 base.c_altName = NameGen.getRandomName();
1567 _alias = AliasGen.GetRandomAlias();
1579 if (base.LV > 5 &&
race.id ==
"mutant")
1581 for (
int j = 0; j < Mathf.Min(1 + base.LV / 5, 22); j++)
1589 if (
race.EQ.Length != 0 || !
source.equip.IsEmpty())
1616 case "olderyoungersister":
1619 case "sister_undead":
1623 if (
id ==
"sister_undead" &&
EClass.
rnd(10) == 0)
1642 if (!
source.faith.IsEmpty())
1692 Debug.LogError(
"source is null");
1710 base.isHidden =
false;
1727 Element orCreateElement = chara.elements.GetOrCreateElement(
item.Key);
1728 orCreateElement.vBase = item.Value.ValueWithoutLink - orCreateElement.
vSource;
1730 chara.SetFaith(
faith);
1731 chara.bio = IO.DeepCopy(
bio);
1733 chara.c_daysWithGod = base.c_daysWithGod;
1734 chara.RefreshFaithElement();
1735 chara.hp = (int)Mathf.Clamp((
float)chara.MaxHP * ((float)base.hp / (
float)
MaxHP) * 0.99f, 0f, chara.MaxHP);
1736 chara.isCopy =
true;
1746 int num2 = (base.ChildrenWeight + ((t !=
null) ? ((num == -1) ? t.ChildrenAndSelfWeight : (t.SelfWeight * num)) : 0)) * 100 /
WeightLimit;
1755 int num3 = ((num2 >= 100) ? ((num2 - 100) / 10 + 1) : 0);
1765 int num = base.ChildrenWeight * 100 / Mathf.Max(1,
WeightLimit);
1781 Say(flag ?
"dmgBurdenStairs" :
"dmgBurdenFallDown",
this);
1787 int num2 = (num * (base.ChildrenWeight * 100 /
WeightLimit) / (flag ? 100 : 200) + 1) * mtp / 100;
1810 info?.AddText(
"rideSpeed".lang(
_Speed.ToString() ??
""));
1812 else if (
host !=
null)
1837 info?.AddText(
_Speed - speed,
"parasiteSpeed".lang());
1848 num = 50 + Mathf.Clamp((
int)Mathf.Sqrt(num2) * 5 -
EClass.
_zone.
DangerLv / 50, 0, 50) + Mathf.Clamp((
int)Mathf.Sqrt(num2), 0, 25);
1849 if (info !=
null && num != 100)
1871 num -= (
IsPC ? 50 : 100);
1911 num += EClass.player.lastEmptyAlly *
Evalue(1646);
1916 num += EClass.player.lastEmptyAlly * 10 - 10;
1922 num +=
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100);
1923 info?.AddFix(
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100),
"enemySpeedBuff".lang());
1925 if (HasCondition<ConGravity>())
1928 info?.AddFix(-30, GetCondition<ConGravity>().
Name);
1938 info?.AddText(
"minSpeed".lang(10.
ToString() ??
""));
1949 if (value.
source.category ==
"skill")
1969 this.hostility = hostility2;
1975 this.hostility = hostility2;
1981 this.hostility = hostility2;
1996 base.ApplyEditorTags(tag);
2004 Debug.LogWarning(
"Chara " +
id +
" not found");
2013 if (!
id.StartsWith(
"ele"))
2022 if (base.c_idMainElement != 0)
2024 SetElements(base.c_idMainElement,
remove:
true);
2025 base.c_idMainElement = 0;
2030 SetElements(
id,
remove:
false);
2031 base.c_idMainElement =
id;
2034 base.isElemental =
true;
2037 base.c_lightColor = (byte)Mathf.Clamp(colorSprite.r * 3f, 1f, 31f) * 1024 + (byte)Mathf.Clamp(colorSprite.g * 3f, 1f, 31f) * 32 + (byte)Mathf.Clamp(colorSprite.b * 3f, 1f, 31f);
2041 void SetElements(
int idEle,
bool remove)
2101 base.c_idJob = idNew;
2129 int ele =
new int[9] { 30, 31, 33, 35, 35, 36, 34, 37, 39 }.RandomItem();
2133 Say(
"gain_bodyparts",
this,
Element.
Get(ele).GetName().ToLower());
2154 for (
int num =
body.
slots.Count - 1; num >= 0; num--)
2163 string[] array =
race.figure.Split(
'|');
2164 foreach (
string s
in array)
2177 string[] array =
race.figure.Split(
'|');
2178 foreach (
string s
in array)
2200 base.c_idRace = idNew;
2216 Debug.Log(
"Creating Replacement NPC for:" +
this);
2244 this.hostility = hostility2;
2246 base.c_summonDuration = 0;
2247 base.isSummon =
false;
2269 Hostility hostility2 = (base.c_originalHostility = (_master.IsPCFaction ? Hostility.Ally : _master.
hostility));
2270 this.hostility = hostility2;
2271 base.c_uidMaster = _master.
uid;
2272 base.c_minionType = type;
2291 base.c_uidMaster = 0;
2296 if (chara.
enemy ==
this)
2308 base.c_summonDuration = duration;
2309 base.isSummon =
true;
2356 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2375 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2380 if (cells[x, z].blocked)
2384 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2391 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2396 if (cells[x, z].blocked)
2400 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2426 if (detail !=
null && detail.
charas.Count > 0)
2461 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2471 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2476 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2483 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2488 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2519 List<Point> list =
new List<Point>();
2567 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2576 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2585 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2594 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2612 int num = p.x -
pos.
x;
2613 int num2 = p.z -
pos.
z;
2630 if (num == 0 && num2 == 0)
2640 return TryMove(point, allowDestroyPath:
false);
2649 if (!condition.
TryMove(newPoint))
2654 if (base.isRestrained)
2660 base.isRestrained =
false;
2662 if (!
CanMoveTo(newPoint, allowDestroyPath))
2666 return _Move(newPoint);
2717 EClass.player.lastZonePos =
null;
2720 for (
int i = 0; i < num2 * 4; i++)
2731 EClass.player.regionMoveWarned =
true;
2732 Msg.
Say(
"regionAbortMove");
2740 AddCondition<ConSuffocation>((
EClass.
pc.
Evalue(200) != 0) ? (2000 / (100 +
EvalueMax(200, -5) * 10)) : 30, force:
true);
2741 int num4 = GetCondition<ConSuffocation>()?.GetPhase() ?? 0;
2748 ModExp(200, 1 + num4 * 12);
2751 EClass.player.regionMoveWarned =
false;
2759 num = EClass.setting.defaultActPace * 3f;
2786 if (
CanMoveTo(randomNeighbor, allowDestroyPath:
false))
2788 newPoint = randomNeighbor;
2796 if (newPoint.
x !=
pos.
x || newPoint.
z !=
pos.
z)
2801 if (effect !=
null && effect.
id == 7)
2806 Say(
"abWeb_caught",
this);
2808 effect2.power = effect2.power * 3 / 4;
2812 Say(
"abWeb_pass",
this);
2821 else if ((newPoint.
x >
pos.
x && newPoint.
z >
pos.
z) || (newPoint.
x <
pos.
x && newPoint.
z <
pos.
z))
2836 traitDoor.TryOpenLock(
this);
2846 bool flag3 = EClass._zone.IsSnowCovered && !cell.HasRoof && !cell.
isClearSnow;
2849 bool flag4 = cell.IsTopWater && !cell.
isFloating;
2879 string text = ((flag2 || flag4) ?
"water" : tileRow.
soundFoot.IsEmpty(row.
soundFoot.IsEmpty(
"default")));
2880 if (cell.
obj != 0 && cell.
sourceObj.tileType.IsPlayFootSound && !cell.
matObj.soundFoot.IsEmpty())
2882 text = cell.
matObj.soundFoot;
2894 if (!text.IsEmpty())
2896 SoundManager.altLastData =
IsPC;
2903 bool flag5 = scene.actionMode.gameSpeed > 1f;
2904 scene.psFoot.transform.position = renderer.position + pcOrbit.
footPos;
2905 scene.psFoot.startColor = row.
matColor;
2909 scene.psSmoke.transform.position = renderer.position + pcOrbit.
smokePos;
2933 Say(
"replace_pc", chara, chara2);
2944 traitDoor2.TryOpen(
this);
2971 if (!
item.isThing ||
item.placeState != 0 ||
item.ignoreAutoPick)
2983 if ((dataPick.
noRotten &&
item.IsDecayed) || (dataPick.onlyRottable && item.trait.Decay == 0))
3000 foreach (
int cat
in dataPick.
cats)
3002 if (
item.category.uid == cat)
3008 else if (!dataPick.
flag.HasFlag(containerFlag))
3050 num5 = (int)Mathf.Abs((surfaceHeight - surfaceHeight2) * 100f);
3082 EClass.player.flags.isShoesOff =
false;
3089 EClass.player.flags.isShoesOff =
true;
3107 EClass._map.MineBlock(_p, recoverBlock: false, this);
3110 EClass._map.MineObj(_p, null, this);
3116 EClass._map.MineObj(_p, null, this);
3123 if (t.isNPCProperty && t.trait.CanBeDestroyed)
3129 t.SetPlaceState(PlaceState.roaming);
3145 if (list.Count == 0)
3149 list.Copy().ForeachReverse(delegate(
Chara c)
3153 List<Point> list2 = new List<Point>();
3154 for (int i = point.x - 1; i <= point.x + 1; i++)
3156 for (int j = point.z - 1; j <= point.z + 1; j++)
3158 if (i != point.x || j != point.z)
3160 Point point2 = new Point(i, j);
3161 if (point2.IsValid && !point2.HasChara && !point2.IsBlocked && !point2.cell.hasDoor && !point2.IsBlockByHeight(point))
3168 if (list2.Count > 0)
3170 if (list2.Count > 1)
3172 list2.ForeachReverse(delegate(Point p)
3174 if (p.Equals(new Point(point.x + point.x - pos.x, point.z + point.z - pos.z)))
3180 Point newPoint = list2.RandomItem();
3183 Say(
"displace",
this, c);
3193 int num =
EClass.
rndHalf(10 + Mathf.Min(GetCurrency() / 100, 1000));
3195 Say(
"pushed_money",
this, c);
3260 if (z == currentZone)
3264 if (HasCondition<ConInvulnerable>())
3266 RemoveCondition<ConInvulnerable>();
3270 EClass.player.nextZone = z;
3278 EClass.player.returnInfo.turns += 5;
3285 EClass.player.deathZoneMove =
false;
3287 currentZone.events.OnLeaveZone();
3288 if (currentZone.instance !=
null)
3302 EClass.player.uidLastZone = currentZone.uid;
3305 if (currentZone.IsRegion)
3313 Msg.
Say(
"leaveZone", currentZone.Name);
3315 else if (z.
id != currentZone.id)
3319 EClass.player.lastZonePos = pos.Copy();
3321 EClass.player.lastTransition = transition;
3333 if (party !=
null && party.
leader ==
this)
3345 Debug.Log(base.Name);
3348 transition.uidLastZone = currentZone?.uid ?? 0;
3349 global.transition = transition;
3353 global.transition =
null;
3356 EClass.player.lastTransition =
null;
3359 if (IsBranchMember())
3370 public void MoveHome(
string id,
int x = -1,
int z = -1)
3385 CureCondition<ConSuspend>();
3412 orgPos =
new Point(x, z);
3413 if (factionBranch !=
null)
3415 RefreshWorkElements();
3427 state = ZoneTransition.EnterState.Fall,
3437 renderer.RefreshSprite();
3440 public override void Rotate(
bool reverse =
false)
3442 if (renderer.hasActor)
3444 base.dir = (base.dir + ((!reverse) ? 1 : (-1))).Clamp(0, 3, loop:
true);
3448 base.dir = ((base.dir == 0) ? 1 : 0);
3451 renderer.RefreshSprite();
3461 angle =
Util.GetAngle(p.
x - pos.x, p.
z - pos.z);
3464 if (angle > 100f && angle < 170f)
3468 else if (angle > 170f && angle < 190f)
3472 else if (angle > 190f || (angle < -10f && angle > -100f))
3482 else if (angle > 170f && angle < 235f)
3486 else if (angle > 80f && angle < 145f)
3490 else if (angle > -100f && angle < -35f)
3494 else if (angle > -10f && angle < 55f)
3498 renderer.RefreshSprite();
3509 else if (base.dir == 1)
3513 else if (base.dir == 2)
3517 else if (base.dir == 3)
3522 else if (base.dir == 0)
3526 else if (base.dir == 1)
3530 else if (base.dir == 2)
3534 else if (base.dir == 3)
3543 if (!renderer.hasActor)
3545 if (angle == 0f || angle == 45f || angle == 90f)
3549 if (angle == -135f || angle == 180f || angle == -90f)
3559 return renderer.actor.currentDir;
3565 for (
int i = -num; i < num + 1; i++)
3567 for (
int j = -num; j < num + 1; j++)
3569 shared.
Set(pos.x + i, pos.z + j);
3580 for (
int num = conditions.Count - 1; num >= 0; num--)
3582 if (conditions[num].ConsumeTurn)
3592 if (_cooldowns !=
null)
3597 consumeTurn =
false;
3598 preventRegen =
false;
3599 emoIcon =
Emo2.none;
3602 base.c_summonDuration--;
3603 if (base.c_summonDuration <= 0)
3611 AddCondition<ConWet>(20);
3616 happiness = (hunger.value + stamina.value + depression.value + bladder.value + hygiene.
value) / 5;
3621 if (
EClass.
rnd(2) == 0 && !HasCondition<ConAwakening>())
3636 if (parasite !=
null)
3638 ModExp(227, (
EClass.
_zone.
IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(227) - parasite.
LV) * 25));
3642 ModExp(226, (
EClass.
_zone.
IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(226) - ride.
LV) * 25));
3649 num = ((!IsPC) ? ((phase > 3) ? 50 : 0) : ((phase > 3) ? 50 : 0));
3657 if (turn % 200 == 0)
3659 DiminishTempElements();
3671 preventRegen =
true;
3675 Say(
"dmgBurden",
this);
3676 DamageHP(MaxHP * (base.ChildrenWeight * 100 / WeightLimit) / 1000 + 1,
AttackSource.Burden);
3688 ModExp(207, 1 + phase2 * phase2);
3716 preventRegen =
true;
3720 if (
EClass.
rnd(100) == 0 && !isConfused)
3723 AddCondition<ConConfuse>(500);
3728 AddCondition<ConBlind>(200);
3731 if (turn % (200000 / Mathf.Max(100 + Evalue(409) * 10, 50)) == 0)
3739 int num2 = Evalue(409);
3740 if (num2 > 0 && turn % (200000 / Mathf.Max(100 + num2 * 10, 50)) == 0)
3745 for (
int num3 = conditions.Count - 1; num3 >= 0; num3--)
3747 if (num3 < conditions.Count)
3762 preventRegen =
true;
3775 if (
id ==
"tsunami")
3777 if (elements.Base(79) < 30)
3784 elements.SetTo(79, elements.Base(79) * 3 / 4);
3789 if (
EClass.
rnd(25) == 0 && base.hp < MaxHP)
3791 HealHP(
EClass.
rnd(Evalue(300) / 3 + 1) + 1);
3792 elements.ModExp(300, 8f);
3797 elements.ModExp(301, 8f);
3816 if (parasite !=
null)
3828 Debug.LogError(
"exception: pos is not valid:" + pos?.ToString() +
"/" +
this);
3839 ignoreSPAbsorb =
false;
3842 if (hasMovedThisTurn)
3844 pos.Things.ForeachReverse(delegate(
Thing t)
3852 hasMovedThisTurn =
false;
3855 EClass.player.haltMove =
false;
3889 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
3900 if (!tileInfo.
shore)
3905 int num2 = (tileInfo.isRoad ? 22 : 12);
3908 num2 = (tileInfo.isRoad ? 16 : 10);
3912 num2 *= (flag2 ? 2 : 20);
3923 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
3936 EClass.player.pickupDelay = 0f;
3960 Msg.
Say(
"returnComplete");
3961 EClass.player.uidLastTravelZone = 0;
3963 EClass.player.lastZonePos =
null;
3965 EClass.player.returnInfo =
null;
3968 EClass.player.returnInfo =
null;
3969 Msg.
Say(
"returnOverweight");
3972 if ((HasNoGoal || !ai.
IsRunning) && !WillConsumeTurn())
3980 RecipeUpdater.dirty =
true;
3986 actTime = EClass.player.baseActTime * Mathf.Max(0.1f, (
float)
EClass.
pc.
Speed / (
float)Speed);
3987 hasMovedThisTurn =
false;
3990 if (!IsAliveInCurrentZone)
3994 renderer.RefreshStateIcon();
3995 if (host !=
null && !consumeTurn)
3997 if (host.
ride ==
this && ((host.
hasMovedThisTurn && IsInCombat) || (enemy !=
null && turn % 3 != 0)))
4003 if (Dist(enemy) < 3 &&
EClass.
rnd(2) == 0)
4005 Say(
"parasite_fail",
this, host);
4006 if (
EClass.
rnd(2) == 0 && GetInt(106) == 0)
4008 Talk(
"parasite_fail");
4023 if (base.isRestrained)
4044 Cell cell = base.Cell;
4047 AddCondition<ConWet>(50);
4048 if (pos.IsHotSpring)
4055 AddCondition<ConSuffocation>(800 / (100 + EvalueMax(200, -5) * 10), force:
true);
4071 AddCondition<ConWet>(50);
4075 PlaySound(
"fire_step");
4076 AddCondition<ConBurning>(30);
4081 PlaySound(
"bubble");
4082 AddCondition<ConWet>(30);
4087 if (hasMovedThisTurn)
4089 Say(
"abMistOfDarkness_step",
this);
4112 aliasEle = EClass.sources.elements.map[e.idEle].alias,
4141 if (rootCard !=
this && things.IsFull(c.
Thing))
4148 public void PickOrDrop(
Point p,
string idThing,
int idMat = -1,
int num = 1,
bool msg =
true)
4158 if (things.GetDest(t).IsValid)
4179 t = TryPoisonPotion(t);
4187 Say(
"backpack_full_drop", t);
4194 Say(
"backpack_full", t);
4198 if (dest.
stack !=
null)
4202 PlaySound(
"pick_thing");
4203 Say(
"pick_thing",
this, t);
4211 PlaySound(
"pick_thing");
4212 Say(
"pick_thing",
this, t);
4214 TryReservePickupTutorial(t);
4224 Say(
"poisonDrip",
this);
4238 Say(
"absorbRod",
this, t);
4241 if (
rod.source !=
null)
4244 if (enumerator.MoveNext())
4276 if (t.
id ==
"pasture")
4288 foreach (
Card item in pos.ListCards())
4293 if (thing !=
null && !IsPC)
4295 thing.isNPCProperty =
true;
4340 t.isNPCProperty =
false;
4342 pos.TryWitnessCrime(
this);
4351 EClass.player.altHeldPos = t.renderer.data.ForceAltHeldPosition ||
EClass.
rnd(2) == 0;
4355 if (num == -1 || num > t.
Num)
4366 t =
Pick(t.
Thing, msg:
false, tryStack:
false);
4380 WidgetHotbar.dirtyCurrentItem =
true;
4391 if (IsPC && held.
invY == 1)
4393 WidgetHotbar.dirtyCurrentItem =
true;
4405 Say(
"canOnlyCarry", held);
4410 if (!flag && things.IsOverflowing())
4414 Say(
"backpack_full_drop", held);
4422 PlaySound(
"pick_thing");
4423 Say(
"pick_held",
this,
card);
4424 if (IsPC &&
card.id ==
"statue_weird")
4431 WidgetHotbar.dirtyCurrentItem =
true;
4446 return held.
Split(a);
4469 WidgetHotbar.dirtyCurrentItem =
true;
4474 if (
card.trait.CanOnlyCarry)
4485 Msg.
Say(
"markedImportant");
4500 t.ignoreAutoPick =
true;
4511 int num = Evalue(131);
4512 int num2 = Evalue(130);
4513 int num3 = Evalue(123);
4514 if (num > num2 && num > num3)
4518 if (num2 > num && num2 > num3)
4522 if (num3 > num && num3 > num2)
4536 if (elements.Value(122) > elements.Value(120))
4538 return elements.GetElement(122);
4540 return elements.GetElement(120);
4545 isOnCreate = onCreate;
4550 RestockInventory(onCreate);
4555 string equip = source.
equip;
4556 if (equip.IsEmpty())
4560 if (equip ==
"none")
4570 EQ_ID(
"staff_long", 1);
4578 EQ_ID(
"tail_snowleopard");
4584 EQ_ID(
"sword_zephir");
4587 case "adv_mesherada":
4590 EQ_ID(
"dagger_hathaway");
4596 EQ_ID(
"staff_long", -1,
Rarity.Legendary);
4600 EQ_ID(
"cloak_wing", -1,
Rarity.Mythical);
4606 EQ_ID(
"sword_muramasa");
4612 EQ_ID(
"dagger_gaki");
4616 EQ_ID(
"dagger_ninto");
4620 EQ_ID(
"dagger", -1,
Rarity.Legendary);
4626 EQ_ID(
"staff_Cat", -1,
Rarity.Mythical);
4637 EQ_ID(
"helm_seeker");
4640 EQ_ID(
"sword_katana");
4642 EQ_ID(
"sword_katana");
4645 EQ_ID(
"boots_seven");
4649 for (
int i = 0; i < 20; i++)
4654 AddThing(
"plat").SetNum(6);
4660 AddThing(
"guitar_efrond");
4666 AddThing(
"guitar_ash");
4672 EQ_ID(
"EtherDagger");
4679 if (onCreate || !TryEquipRanged())
4681 EQ_CAT((
EClass.
rnd(4) == 0) ?
"crossbow" :
"bow");
4686 if (onCreate || !TryEquipRanged())
4692 int num = ((base.rarity >=
Rarity.Mythical) ? (base.LV * 3) : ((base.rarity >=
Rarity.Legendary) ? (base.LV * 2) : base.LV));
4697 if (race.
id ==
"asura")
4699 for (
int j = 0; j < 4; j++)
4701 EQ_CAT(job.
weapon.RandomItem());
4704 for (
int k = 0; k < ((!(race.id ==
"mutant")) ? 1 : (2 + base.LV / 30)); k++)
4710 else if (!job.
weapon.IsEmpty())
4714 EQ_CAT(job.
weapon.RandomItem());
4716 if (race.
id ==
"mutant" || (Evalue(131) > 0 &&
EClass.
rnd(2) == 0))
4718 EQ_CAT(job.
weapon.RandomItem());
4766 Restock(
"book_story", 1);
4768 case "rock_thrower":
4776 Restock(
"book_story_home", 1);
4781 void Restock(
string id,
int num)
4783 if (things.Find(
id) ==
null)
4794 int num = ((base.LV >= 1000) ? 7 : ((base.LV >= 500) ? 5 : ((base.LV >= 250) ? 3 : ((base.LV >= 100) ? 2 : ((base.LV >= 50) ? 1 : 0)))));
4795 Rarity rarity2 = base.rarity;
4796 if (
id ==
"big_sister")
4798 num = (isOnCreate ? 8 : 4);
4806 rarity =
Rarity.Superior;
4808 else if (rarity2 ==
Rarity.Legendary)
4812 else if (rarity2 >=
Rarity.Mythical)
4818 rarity =
Rarity.Legendary;
4820 CardBlueprint.current.rarity = rarity;
4828 CardBlueprint.current.rarity = r;
4831 if (body.
GetSlot(thing, onlyEmpty:
true) ==
null)
4836 if (!body.
Equip(thing))
4847 if ((slot == 0 || bodySlot !=
null) && (slot != 37 || !HasElement(1209)))
4852 if (bodySlot !=
null && !body.
Equip(thing, bodySlot))
4889 if (!IsPC && (!trait.CanJoinPartyResident || !trait.CanJoinParty || memberType != 0))
4893 Msg.
Say(
"returnHome",
this, homeZone.Name);
4910 base.hp = MaxHP / 3;
4913 if (hunger.
value > 30)
4917 sleepiness.value = 0;
4918 hostility = OriginalHostility;
4919 RemoveCondition<StanceTaunt>();
4924 Msg.
Say(
"noDeathPenalty2",
this);
4928 Msg.
Say(
"noDeathPenalty",
this);
4934 List<Thing> dropList =
new List<Thing>();
4939 t.ignoreAutoPick = true;
4942 }, onlyAccessible:
false);
4948 EClass.player.preventDeathPenalty =
false;
4950 if (IsPCFaction && homeBranch !=
null)
4952 homeBranch.
Log(
"bRevive",
this);
4965 PlayEffect(
"revive");
4967 SetCensored(enable:
false);
4975 List<string> list =
new List<string> {
"930",
"931",
"947",
"948",
"949",
"950",
"951",
"952" };
4978 list =
new List<string> {
"944",
"946",
"backerGrave",
"backerGrave2" };
4982 if (!lastword.IsEmpty())
4984 thing.c_note = lastword;
4986 thing.isModified =
true;
5032 if (HasCondition<ConAnorexia>())
5038 else if (base.c_vomit > 10)
5040 AddCondition<ConAnorexia>();
5042 AddCondition<ConDim>();
5043 if (HasCondition<ConAnorexia>())
5057 if (isDead || host !=
null)
5061 bool isInActiveZone = IsInActiveZone;
5070 if (
id ==
"tsunami")
5072 pos.PlaySound(
"water");
5076 Say(
"summon_vanish",
this);
5077 pos.PlayEffect(
"vanish");
5078 pos.PlaySound(
"vanish");
5093 PlayEffect(
"revive");
5094 PlaySound(
"chime_angel");
5101 PlaySound(base.material.GetSoundDead(source));
5103 renderer.RefreshSprite();
5104 renderer.RefreshStateIcon();
5109 string text2 = ((origin ==
null) ?
"" : origin.GetName(
NameStyle.Full));
5112 text =
"dead_" + attackSource;
5118 text =
"dead_" + e.source.alias;
5127 EClass._zone.isDeathLocation =
true;
5128 string s = ((origin ==
null) ? text :
"dead_by");
5140 AI_PlayMusic.keepPlaying =
false;
5146 Msg.
Say(
"goto_heaven",
this);
5150 if (originalTarget !=
null || origin ==
null || !origin.isSynced || (attackSource !=
AttackSource.Melee && attackSource !=
AttackSource.Range))
5152 Msg.
Say(text,
this,
"", text2);
5154 string text3 = TalkTopic(
"dead");
5155 if (!text3.IsEmpty())
5157 text3 = text3.StripBrackets();
5159 bool flag = base.rarity >= Rarity.Legendary && !IsPCFaction;
5174 if (homeBranch !=
null)
5176 homeBranch.
Log(text,
this,
"");
5188 if (
id ==
"mandrake" || HasElement(488))
5190 Say(
"a_scream",
this);
5195 ClearTempElements();
5198 base.isSale =
false;
5210 EClass.player.returnInfo =
null;
5211 EClass.player.uidLastTravelZone = 0;
5220 chara2.enemy =
null;
5225 EClass.player.preventDeathPenalty =
true;
5230 bool flag2 = currentZone.IsActiveZone && IsLocalChara && !currentZone.IsPCFaction;
5239 currentZone.RemoveCard(
this);
5241 if ((origin !=
null && origin.IsPCParty) || IsPCFaction)
5244 if (IsPCFaction && !IsPCParty && (origin ==
null || !origin.IsPCParty))
5248 ModAffinity(
EClass.
pc, a, show:
false);
5250 if (!(text4 ==
"quru"))
5252 if (text4 ==
"corgon")
5264 if (origin.IsPCParty || origin.IsPCPartyMinion)
5267 if (OriginalHostility >=
Hostility.Friend && IsHuman && !base.IsPCFactionOrMinion)
5271 else if (race.
id ==
"cat" && OriginalHostility >=
Hostility.Neutral)
5278 num = num * 30 / 100;
5289 else if (origin.IsPCFaction)
5291 origin.Chara.ModAffinity(
EClass.
pc, 1, show:
false);
5292 origin.Chara.ShowEmo(
Emo.love);
5295 if (base.sourceBacker !=
null && origin !=
null && origin.IsPCParty)
5299 if (base.IsPCFactionOrMinion)
5303 Msg.
Say(
"abort_allyDead");
5308 Msg.
Say(
"abort_enemyDead");
5310 if (IsPCParty && !IsPC)
5313 base.c_wasInPcParty =
true;
5319 if (attackSource !=
AttackSource.DeathSentense && !IsPCFaction)
5321 EClass.player.flags.little_killed =
true;
5333 case "shark_sister":
5342 if (attackSource ==
AttackSource.Finish && origin !=
null && origin.Evalue(665) > 0)
5346 if (chara.
LV < base.LV)
5348 chara.
SetLv(base.LV);
5351 Msg.
Say(
"plant_pop",
this, chara);
5355 item.OnCharaDie(
this);
5361 if (IsPCFaction || IsPCFactionMinion)
5368 Point point = pos.
GetNearestPoint(allowBlock:
true, allowChara:
false, allowInstalled:
false, ignoreCenter:
true) ?? pos;
5374 flag = (flag2 =
true);
5375 EClass._zone.Boss =
null;
5380 EClass.player.flags.KilledBossInVoid =
true;
5387 SE.Play(
"Jingle/fanfare2");
5397 flag = (flag2 =
true);
5405 case "melilith_boss":
5407 flag = (flag2 =
true);
5414 flag = (flag2 =
true);
5416 if (questExploration !=
null)
5418 SE.Play(
"kill_boss");
5428 SE.Play(
"kill_boss");
5429 SoundManager.ForceBGM();
5435 SE.Play(
"kill_boss");
5439 EClass.player.willAutoSave =
true;
5460 public void Kick(
Chara t,
bool ignoreSelf =
false,
bool karmaLoss =
true,
bool show =
true)
5462 if (!IsAliveInCurrentZone)
5488 Say(
"kick",
this, t);
5508 return UseAbility(elements.GetElement(idAct)?.act ??
ACT.
Create(idAct), tc, pos, pt);
5513 if (!IsPC && HasCooldown(a.
id))
5517 if (a.
source.proc.TryGet(0) ==
"Heal" && HasElement(1422))
5519 List<int> list =
new List<int> { 8400, 8401, 8402, 8403, 8404, 8405 };
5520 int num = list.IndexOf(a.
id);
5523 int num2 = list.TryGet(num + Evalue(1422));
5524 a = elements.GetElement(num2)?.
act ??
ACT.
Create(num2);
5533 if (IsPC && HasCondition<StanceManaCost>())
5535 num4 = Evalue(1657);
5547 ForeachEnemy(delegate
5554 ForeachParty(delegate
5570 num5 = (IsPC ? (i * 100) : (50 + i * 50));
5572 int num6 = cost.cost * num5 / 100;
5575 num6 = num6 * 100 / (100 + (int)Mathf.Sqrt(Evalue(483) * 10) * 3);
5585 if (!IsPC && cost.
type ==
Act.
CostType.MP && mana.
value < 0 && (
EClass.
rnd(4) != 0 || IsPCFaction || (base.IsPowerful && mana.value < -20)))
5593 ActPlan.warning =
true;
5596 if (UseAbility(a, tc, pos, pt))
5605 if ((isConfused &&
EClass.
rnd(4) == 0) || (isBlind && (pt || (pos !=
null && !pos.Equals(base.pos)) || (tc !=
null && tc.pos !=
null && !tc.pos.Equals(base.pos))) &&
EClass.
rnd(2) == 0))
5607 Say(
"shakeHead",
this);
5610 if (tc !=
null && tc !=
this)
5614 if (pos !=
null && !base.pos.Equals(pos))
5620 num3 = 1 + Evalue(1648);
5622 if (IsPC && cost.
cost > 0 && a.
Value == 0)
5629 string s = (isConfused ?
"_cast_confuse" : (HasCondition<ConDim>() ?
"_cast_dim" :
""));
5630 if (!a.
source.tag.Contains(
"useHand"))
5632 Say(race.
castStyle.IsEmpty(
"cast"),
this, a.
source.GetName().ToLower(), s.lang());
5645 a.vPotential -= i * 2;
5646 num6 = num6 * (100 - num4 * 20) / 100;
5655 else if (a.
source.langAct.Length != 0 && tc !=
null)
5657 string text = a.
source.langAct[0];
5658 string text2 = ((a.source.langAct.Length >= 2) ? a.
source.langAct[1] :
"");
5659 if (text ==
"spell_hand")
5662 string @ref = text2.lang(list2[4]);
5663 Say(tc.IsPCParty ?
"cast_hand_ally" :
"cast_hand",
this, tc, @ref, tc.IsPCParty ? list2[1] : list2[2]);
5667 Say(text,
this, tc, text2.IsEmpty() ?
"" : text2.lang());
5671 Talk(
"insult_" + (base.IsMale ?
"m" :
"f"));
5677 if (Evalue(1421) >= 2 && base.hp <= MaxHP / (9 - Evalue(1421) * 2))
5687 elements.ModExp(304, Mathf.Clamp(num6 * 2, 1, 200));
5691 ignoreSPAbsorb =
true;
5694 if (a is
Spell && GetCondition<ConSilence>() !=
null)
5696 Say(
"cast_silence",
this);
5703 int spellExp = elements.GetSpellExp(
this, a, num5);
5706 Say(
"fizzle",
this);
5707 PlayEffect(
"fizzle");
5708 PlaySound(
"fizzle");
5711 ModExp(a.
id, spellExp / 5);
5713 RemoveCondition<ConInvisibility>();
5717 if (HasTalk(
"phrase_" + a.
source.alias))
5719 EClass.player.forceTalk =
true;
5720 Talk(
"phrase_" + a.
source.alias);
5727 ForeachEnemy(delegate(
Chara c)
5734 ForeachParty(delegate(
Chara c)
5739 Act.forcePt =
false;
5743 for (
int j = 0; j < num3; j++)
5749 ActEffect.RapidCount = j;
5751 flag2 = a.
Perform(
this, tc, pos);
5754 if (flag2 && !isDead)
5758 ModExp(a.
id, spellExp);
5760 if (a.
source.alias.StartsWith(
"sword_"))
5765 ActEffect.RapidCount = 0;
5766 if (!IsPC && a.
source.cooldown > 0)
5768 AddCooldown(a.
id, a.
source.cooldown);
5770 if (flag2 && !a.
source.tag.Contains(
"keepInvisi") &&
EClass.
rnd(2) == 0)
5772 RemoveCondition<ConInvisibility>();
5775 void ForeachEnemy(Action<Chara> action)
5777 if (_pts.Count == 0)
5782 if (chara3 !=
this && CanSeeLos(chara3) && chara3.
IsHostile(
this))
5788 for (
int num11 = _pts.Count - 1; num11 >= 0; num11--)
5790 action(_pts[num11]);
5793 void ForeachParty(Action<Chara> action)
5795 if (_pts.Count == 0)
5802 if (chara ==
this || chara.
host !=
null || CanSeeLos(chara))
5813 if ((chara2 ==
this || (chara2.
IsFriendOrAbove(
this) && CanSeeLos(chara2))) && (chara2 == tc || _pts.Count < 3 ||
EClass.
rnd(_pts.Count * _pts.Count) > 6))
5820 for (
int num9 = _pts.Count - 1; num9 >= 0; num9--)
5831 return 25 + Evalue(226) * 125 / 100;
5847 if (host.
ride ==
this)
5849 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
EvalueRiding()));
5853 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
Evalue(227)));
5858 int num3 = Evalue(304);
5861 num3 = Mathf.Max(num3, base.LV + 5);
5865 bool num6 = GetArmorSkill() == 122;
5869 num4 = 20 - Evalue(122) / 5;
5870 num5 += 10 - Evalue(1654) * 4;
5874 num4 = 10 - Evalue(120) / 5;
5884 if (parasite !=
null)
5895 num5 += 10 - Evalue(1654) * 4;
5901 if (HasCondition<ConDim>())
5903 num4 += ((Evalue(1654) >= 3) ? 1500 : 2500);
5913 return Mathf.Clamp(100 + e.
Value - 10 - e.
source.LV * e.
source.cost[0] * num4 / Mathf.Max(10 + num3 * 10, 1), 0, 100 - num5);
5916 public void DoAI(
int wait, Action onPerform)
5931 Say(headpat ?
"headpat" :
"cuddle",
this, c);
5937 if (headpat &&
this != c)
5948 if (!member.
IsPC && CanSeeLos(member))
5958 if (c.
id ==
"hedgehog_ether")
5962 Say(
"reflect_thorne", c,
this);
5994 if (enemy ==
null && !IsPC)
5996 if (GetInt(106) == 0)
6000 if (OriginalHostility !=
Hostility.Enemy)
6004 SetEnemy(_tg.
Chara);
6018 if (_tg ==
null || !_tg.
isChara)
6025 EClass.pc.combatCount = 10;
6033 chara.
Say(
"frown",
this, chara);
6045 chara.
Say(
"frown",
this, chara);
6052 bool flag = chara.id ==
"fanatic";
6055 chara.
Say(
"callHelp", chara);
6127 bool flag = enemy !=
null || ai is
GoalCombat;
6128 int num = (base.PER + Evalue(210) * 2) * ((!flag) ? 1 : 2);
6130 bool flag3 = !IsPCParty;
6136 if (chara2 ==
this || !IsHostile(chara2) || !CanSee(chara2))
6140 int num3 = Dist(chara2);
6141 int num4 = GetSightRadius() + (flag ? 1 : 0);
6148 if (
this == pos.FirstChara)
6150 chara2.
ModExp(152, Mathf.Clamp((num - chara2.
Evalue(152)) / 2, 1, Mathf.Max(30 - stealthSeen * 2, 1)));
6158 DoHostileAction(chara2);
6171 DoHostileAction(chara);
6183 if (chara !=
this && chara != enemy && IsHostile(chara) && Dist(chara) <= 1 && CanInteractTo(chara.
pos))
6185 DoHostileAction(chara);
6204 if (base.IsPCFactionOrMinion)
6217 if (OriginalHostility >=
Hostility.Friend)
6258 return EClass.game.activeZone == currentZone;
6265 foreach (
Point item2
in item.ListPoints())
6267 if (pos.Equals(item2))
6288 if (base.IsPCFactionOrMinion || IsFriendOrAbove())
6306 if (race.
id ==
"spider" && source.
tiles.Length > 1)
6308 base.idSkin = (EClass.core.config.game.antiSpider ? 1 : 0);
6312 charaRenderer.pccData = PCCData.Create(
"ride");
6313 string idPart = base.c_idRidePCC.IsEmpty(
EClass.
core.
pccs.sets[
"ride"].map[
"body"].map.Keys.First());
6314 charaRenderer.
pccData.SetPart(
"body",
"ride", idPart);
6315 charaRenderer.pccData.ride =
EClass.
core.
pccs.GetRideData(idPart);
6319 foreach (
Condition condition
in conditions)
6322 if (rendererReplacer !=
null)
6324 charaRenderer.replacer = rendererReplacer;
6325 charaRenderer.data = rendererReplacer.
data;
6329 if (charaRenderer.
replacer ==
null)
6331 charaRenderer.pccData = pccData;
6334 renderer = charaRenderer;
6336 if (cardRenderer !=
null)
6338 renderer.SetFirst(first:
false, cardRenderer.
position);
6340 return charaRenderer;
6347 PCC.Get(pccData).Build(state);
6355 PCC pCC = PCC.Get(pccData);
6357 return pCC.variation.idle[0, 0];
6359 if (spriteReplacer !=
null)
6363 return sourceCard.
GetSprite(0, (sourceCard.
_tiles.Length > 1) ? ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % sourceCard.
_tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0))) : 0);
6384 else if (conSleep !=
null && host ==
null && pos.Equals(
EClass.
pc.
pos) && IsHuman && GetBool(123))
6393 p.mat = base.material;
6394 p.matColor = base.colorInt;
6395 if (!renderer.usePass)
6399 if (renderer.replacer !=
null)
6401 p.tile = renderer.replacer.tile * ((!flipX) ? 1 : (-1));
6407 int num = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % source.
_tiles_snow.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6412 p.tile = source.
_tiles_snow[0] * ((!flipX) ? 1 : (-1));
6415 else if (sourceCard.
_tiles.Length > 1)
6417 int num2 = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % sourceCard.
_tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6418 p.tile = sourceCard.
_tiles[(num2 >= 0 && num2 < sourceCard.
_tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
6422 p.tile = sourceCard.
_tiles[0] * ((!flipX) ? 1 : (-1));
6429 string text = base.Name;
6430 if (IsFriendOrAbove())
6434 else if (IsHostile())
6440 if (base.LV >= lV * 5)
6444 else if (base.LV >= lV * 2)
6448 else if (base.LV <= lV / 4)
6452 else if (base.LV <= lV / 2)
6458 string s = (IsFriendOrAbove() ?
"HostilityAlly" : (IsNeutral() ?
"HostilityNeutral" :
"HostilityEnemy"));
6459 s = (
" (" + s.lang() +
") ").TagSize(14);
6463 s += (
" (" +
"guest".lang() +
") ").TagSize(14);
6467 s += (
" (" +
"livestock".lang() +
") ").TagSize(14);
6473 text2 +=
"lowerGround".lang();
6475 else if (HasHigherGround(
EClass.
pc))
6477 text2 +=
"higherGround".lang();
6480 if (Evalue(1232) > 0)
6482 text2 =
"milkBaby".lang().TagSize(14) + text2;
6486 text2 =
"hasBounty".lang().TagSize(14) + text2;
6490 text2 += (
"(" + faith.Name +
")").TagSize(14);
6492 return text + text2 + s;
6500 text += Environment.NewLine;
6501 text = text +
"<size=14>" +
"favgift".lang(GetFavCat().GetName().ToLower(), GetFavFood().GetName()) +
"</size>";
6506 text2 += Environment.NewLine;
6507 text2 = text2 +
"Lv:" + base.LV +
" HP:" + base.hp +
"/" + MaxHP +
" MP:" + mana.value +
"/" + mana.max +
" DV:" + DV +
" PV:" + PV +
" Hunger:" + hunger.
value;
6508 text2 += Environment.NewLine;
6510 text2 += Environment.NewLine;
6511 text2 = text2 + base.uid + IsMinion +
"/" + base.c_uidMaster +
"/" + master;
6512 text2 = text2 +
" dir:" + base.dir +
" skin:" + base.
idSkin;
6516 text2 += Environment.NewLine;
6517 text2 +=
"<size=14>";
6520 text2 = text2 + item.Name +
", ";
6522 foreach (
Hobby item2
in ListHobbies())
6524 text2 = text2 + item2.Name +
", ";
6526 text2 = text2.TrimEnd(
", ".ToCharArray()) +
"</size>";
6529 IEnumerable<BaseStats> enumerable = conditions.Concat((!IsPCFaction) ?
new BaseStats[0] :
new BaseStats[2] { hunger, stamina });
6530 if (enumerable.Count() > 0)
6532 text3 += Environment.NewLine;
6533 text3 +=
"<size=14>";
6538 if (text4.IsEmpty() || text4 ==
"#")
6543 switch (item3.
source.group)
6556 text4 = text4 +
"(" + item3.
GetValue() +
")";
6557 if (resistCon !=
null && resistCon.ContainsKey(item3.
id))
6559 text4 = text4 +
"{" + resistCon[item3.
id] +
"}";
6563 text3 = text3 + text4.TagColor(c) +
", ";
6572 text3 = text3.TrimEnd(
", ".ToCharArray()) +
"</size>";
6577 text3 += Environment.NewLine;
6580 text3 = text3 + item4.act.Name +
", ";
6582 text3 = text3.TrimEnd(
", ".ToCharArray());
6584 return text + text2 + text3;
6589 string key = source.
idText.IsEmpty(
id);
6599 string text = row.GetText(topic, returnNull:
true);
6604 if (text.StartsWith(
"@"))
6611 text = row.GetText(topic, returnNull:
true);
6617 return text.Split(Environment.NewLine.ToCharArray()).RandomItem();
6622 if (host ==
null && !IsInActiveZone)
6626 if (!isSynced && (host ==
null || !host.
isSynced) && topic !=
"dead")
6632 int num = EClass.pc.party.members.Count - 1;
6657 string topicText = GetTopicText(topic);
6658 if (topicText.IsEmpty())
6662 string text =
"_bracketTalk".lang();
6663 bool flag = topicText.StartsWith(
"*");
6664 bool flag2 = topicText.StartsWith(
"(");
6665 bool flag3 = topicText.StartsWith(text) || (topicText.Length > 0 && topicText[0] == text[0]) || topicText[0] ==
'“';
6666 topicText = ApplyTone(topicText);
6667 topicText = topicText.Replace(
"~",
"*");
6669 Msg.
Say(topicText.Replace(
"&",
""));
6670 if (topic ==
"dead")
6674 else if (flag || flag3 || flag2)
6676 (host ??
this).renderer.Say(ApplyNewLine(topicText.StripBrackets()),
default(
Color), IsPCParty ? 0.6f : 0f);
6694 if (conSuspend !=
null && IsPCParty)
6696 RemoveCondition<ConSuspend>();
6700 if (IsDeadOrSleeping)
6702 ShowDialog(
"_chara",
"sleep");
6707 ShowDialog(
"_chara",
"invisible");
6713 ShowDialog(
"_chara",
"give_card");
6722 if (GetInt(71) == -2)
6724 ShowDialog(
"_chara",
"give_lunch");
6730 if (base.isRestrained)
6732 ShowDialog(
"_chara",
"strain");
6737 ShowDialog(
"_chara",
"escort");
6742 ShowDialog(
"_chara",
"party");
6756 EClass.player.flags.loytelEscaped =
false;
6758 ShowDialog(
"loytel",
"loytelEscaped");
6762 if (questDebt !=
null && questDebt.
paid)
6765 if (questDebt.
stage > 7)
6767 questDebt.stage = 7;
6769 ShowDialog(
"loytel",
"debt" + questDebt.
stage);
6777 ShowDialog(
"_chara");
6783 ShowDialog(
"farris",
"nymelle_noQuest");
6786 ShowDialog(
"farris",
"nymelle_first");
6789 ShowDialog(
"farris",
"home_first");
6792 ShowDialog(
"_chara");
6797 ShowDialog(
"ashland");
6802 SoundManager.ForceBGM();
6809 EClass.player.flags.fiamaFirstDream =
true;
6810 ShowDialog(
"fiama",
"firstDream");
6814 ShowDialog(
"fiama",
"giveStoryBook").SetOnKill(delegate
6816 EClass.player.flags.fiamaStoryBookGiven =
true;
6822 ShowDialog(
"fiama");
6827 ShowDialog(
"fiama");
6833 ShowDialog(
"big_sister",
"little_saved");
6834 EClass.player.flags.little_saved =
false;
6839 ShowDialog(
"big_sister",
"little_dead");
6840 EClass.player.flags.little_killed =
false;
6848 ShowDialog(
"guild_doorman",
"main", tag);
6854 ShowDialog(
"guild_clerk",
"main", tag2);
6869 ShowDialog(
"_chara");
6875 return _ShowDialog(
book,
null, step, tag);
6881 if (
book ==
"_chara" && IsPC)
6895 return base.LV / 2 + 4;
6901 if (FindBed() !=
null)
6910 return GetHappiness().ToString() ??
"";
6915 string result =
"?????";
6928 uIItem.
text2.
SetText(race.GetText().ToTitleCase(wholeText:
true) +
" " + job.GetText().ToTitleCase(wholeText:
true));
6938 sortVal = job._index * 10000 + sourceCard.
_index;
6941 sortVal = race._index * 10000 * ((!IsHuman) ? 1 : (-1)) + sourceCard.
_index;
6944 sortVal = -GetTotalFeat();
6947 sortVal = sourceCard._index * ((!IsHuman) ? 1 : (-1));
6960 foreach (
Card item in map.props.installed.all)
6964 traitBed.RemoveHolder(
this);
6983 if (!IsPCFaction && !IsGuest())
6992 Msg.
Say(
"claimBed",
this);
7001 if (GetInt(113) != 0)
7006 Thing bestRangedWeapon = GetBestRangedWeapon();
7007 foreach (
Thing thing
in things)
7013 _ListItems.Add(thing);
7017 _ListItems.Add(thing);
7021 if (_ListItems.Count == 0)
7025 List<Thing> containers2 = containers.ToList();
7026 foreach (
Thing listItem
in _ListItems)
7050 bool flag = GetInt(113) == 0;
7059 foreach (
Thing thing3
in things)
7061 if (CanEat(thing3, shouldEat))
7069 if (thing3.
id ==
"polish_powder")
7083 foreach (
Thing container
in containers)
7093 if (num3 > 0 && thing4.
id ==
"polish_powder")
7095 _ListItems.Add(thing4);
7100 _ListItems.Add(thing4);
7105 _ListItems.Add(thing4);
7108 else if (num > 0 && CanEat(thing4, shouldEat) && !thing4.
c_isImportant)
7110 _ListItems.Add(thing4);
7115 _ListItems.Add(thing4);
7120 _ListItems.Add(thing4);
7125 if (_ListItems.Count == 0)
7129 _ListItems.ForeachReverse(delegate(
Thing t)
7134 int slot = t.category.slot;
7135 int equipValue = t.GetEquipValue();
7136 foreach (Thing listItem in _ListItems)
7138 if (listItem.category.slot == slot && listItem.GetEquipValue() > equipValue)
7146 _ListItems.Remove(t);
7151 foreach (
Thing listItem2
in _ListItems)
7153 Thing thing = listItem2;
7154 if (things.IsFull(thing))
7161 thing = thing.
Split(2);
7168 if (ShouldEquip(thing, useFav:
true) && thing.
category.slot != 0)
7170 TryEquip(thing, useFav:
true);
7176 TryPutSharedItems(containers);
7182 Thing result =
null;
7190 int num2 = CountNumEaten(
item);
7191 int num3 = 100 - num2;
7205 t = FindBestFoodToEat();
7217 Say(
"eat_start",
this, t.Duplicate(1));
7247 if (!CanEquipRanged(t))
7252 foreach (
Thing thing
in things)
7273 if (bodySlot ==
null)
7279 switch (GetFavAttackStyle())
7327 if (!ShouldEquip(t, useFav))
7338 switch (GetFavAttackStyle())
7354 body.
Equip(t, slot);
7360 Say(
"equip",
this, t);
7376 return FindThrowable(hotbar:
true);
7380 things.Foreach(delegate(
Thing t)
7382 if (t.
HasTag(
CTAG.throwWeapon) || (!base.IsPCFactionOrMinion && t.
HasTag(
CTAG.throwWeaponEnemy)))
7388 Thing FindThrowable(
bool hotbar)
7390 things.Foreach(delegate(
Thing t)
7427 return things.Find((
Thing t) => ranged.
IsAmmo(t));
7432 Thing result =
null;
7434 foreach (
Thing thing
in things)
7457 if (ranged !=
null && ranged.
parent ==
this)
7461 ranged = GetBestRangedWeapon();
7462 return ranged !=
null;
7467 if (body.
GetWeight(armorOnly:
true) <= 30000)
7492 if (t.
id ==
"cigar")
7497 if (t.
trait.
CanEat(
this) && hunger.
GetPhase() > ((IsPCFaction || IsPCFactionMinion) ? 2 : 0))
7499 SetAIImmediate(
new AI_Eat
7518 if (base.hp < MaxHP * 90 / 100)
7521 if (healAction !=
null)
7532 return FindBed()?.owner.pos.cell.room;
7547 if (IsPCFaction && homeBranch !=
null)
7549 num += (int)Mathf.Sqrt(homeBranch.
Evalue(2117)) * 5;
7566 Say(
"affinityNone",
this, c);
7571 ShowEmo((!flag) ?
Emo.angry :
Emo.love);
7575 Say(flag ?
"affinityPlus" :
"affinityMinus",
this, c);
7581 a = affinity.
Mod(a);
7587 int num = Evalue(289);
7599 num2 += (lV - num) * 10;
7601 elements.
ModExp(289, Mathf.Min(num2, 1000));
7617 chara.orgPos = orgPos.
Copy();
7619 chara.pos = pos.
Copy();
7620 chara.isImported =
true;
7621 chara.c_editorTags = base.c_editorTags;
7622 chara.c_editorTraitVal = base.c_editorTraitVal;
7623 chara.c_idTrait = base.c_idTrait;
7624 chara.homeZone = homeZone;
7630 if (_listFavFood.Count == 0)
7634 if (row._origin ==
"dish" && row.value != 0 && row.chance != 0)
7636 _listFavFood.Add(row);
7643 r = _listFavFood.RandomItem();
7651 if (_listFavCat.Count == 0)
7657 _listFavCat.Add(row);
7663 r = _listFavCat.RandomItem();
7670 using (List<Chara>.Enumerator enumerator = pos.ListCharasInRadius(
this, 3, (
Chara c) => c !=
this && c.
race.id ==
"cat").GetEnumerator())
7672 if (enumerator.MoveNext())
7674 return enumerator.Current;
7682 Say(
"abCatSniff",
this, c);
7687 c.
Talk(
new string[4] {
"labor",
"disgust",
"scold",
"callGuards" }.RandomItem());
7693 if (base.c_upgrades !=
null)
7695 num += base.c_upgrades.spent;
7697 if (base.c_genes !=
null)
7699 num += base.c_genes.GetTotalCost();
7701 return num + base.feat;
7708 if (
item.act.id == 6630)
7718 string text = race.
id;
7719 if ((text ==
"mifu" || text ==
"nefu") &&
EClass.
rnd(2) == 0)
7732 if (
id ==
"olderyoungersister")
7734 if (base.idSkin != 2)
7736 return "UN_olderyoungersister";
7738 return "UN_olderyoungersister_alt";
7744 return base.c_idPortrait;
7761 if (HasElement(1231))
7764 AddCondition<ConEuphoric>(100 * Evalue(1231));
7768 SetFeat(1231, 1, msg:
true);
7775 int num2 = ((!HasElement(1411)) ? 1 : 3);
7776 if (GetBurden(t, num) >= num2)
7789 if (!IsValidGiftWeight(t, num))
7797 if ((t.
category.IsChildOf(
"furniture") || t.
category.IsChildOf(
"junk")) && !HasElement(1411))
7806 if (things.IsFull())
7833 Msg.
Say(
"affinityNone", c,
this);
7839 int num2 = 200 + t.LV * 3;
7855 c.
Say(
"draw_curse", c, t);
7857 List<Element> list =
new List<Element>();
7865 if (list.Count == 0)
7870 Element element = list.RandomItem();
7876 if ((t.
id ==
"lovepotion" || t.
id ==
"dreambug") && !Application.isEditor)
7878 GiveLovePotion(c, t);
7892 case "ticket_massage":
7899 case "ticket_armpillow":
7907 case "ticket_champagne":
7914 if (t.
id ==
"flyer")
7919 c.
Talk(
"flyer_miss");
7925 Msg.
Say(
"affinityNone", c,
this);
7927 elements.ModExp(291, 10f);
7930 elements.ModExp(291, 50f);
7932 if (t.
id ==
"statue_weird")
7953 Say(
"give_erohon",
this);
7954 AddCondition<ConParalyze>(50, force:
true);
7955 AddCondition<ConConfuse>(50, force:
true);
7956 AddCondition<ConFear>(1000, force:
true);
7964 c.
Say(
"give_love", c, t);
7974 if (HasCondition<StanceTaunt>() || base.isRestrained || attacker ==
this)
7998 int num = Mathf.Max(chara.
Evalue(1649), (!chara.
IsPC) ? ((!flag2) ? 1 : 3) : 0);
7999 int num2 = Dist(chara);
8004 if (num2 > num || !chara.
CanSeeLos(pos, num2))
8010 if (Dist(chara) < 5)
8017 Point nearestPoint = pos.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
8025 Say(
"intercept_loyal", chara,
this);
8028 if (num2 > num || !chara.
CanSeeLos(pos, num2))
8033 if (!flag && !HasElement(1225))
8035 Say(
"intercept", chara,
this);
8038 chara.
Talk(
"intercept", base.NameSimple);
8040 if (attacker.enemy ==
this)
8042 attacker.SetEnemy(chara);
8105 if (t.
id ==
"flyer")
8125 for (
int num2 = things.Count - 1; num2 >= 0; num2--)
8127 Thing thing = things[num2];
8128 if (ShouldThrowAway(thing, type))
8139 Msg.
Say(
"party_sell",
this, num.ToString() ??
"");
8147 _ = base.c_upgrades;
8156 for (
int i = 0; i < 100; i++)
8162 if (base.c_upgrades ==
null)
8166 if (base.c_upgrades.halt)
8177 List<Element> list = ListAvailabeFeats(pet:
true);
8178 if (num >= 90 && list.Count > 0)
8180 Element element = list.RandomItem();
8184 else if (num >= 60 && ie.Any())
8186 num2 = ie.RandomItem().id;
8197 if (num4 > base.feat)
8202 base.c_upgrades.count++;
8203 base.c_upgrades.spent += num4;
8209 if (
item.idEle == num2)
8230 SetFeat(num2, elements.ValueWithoutLink(num2) + 1, msg:
true);
8232 else if (elements.ValueWithoutLink(row.
id) == 0)
8234 elements.Learn(row.
id);
8238 elements.ModBase(num2, num3);
8245 if (_cooldowns ==
null)
8247 _cooldowns =
new List<int>();
8251 _cooldowns.Add(idEle * 1000 + turns);
8257 _cooldowns.Add(idEle * 1000 + row.
cooldown);
8263 if (_cooldowns !=
null)
8265 for (
int i = 0; i < _cooldowns.Count; i++)
8267 if (_cooldowns[i] / 1000 == idEle)
8278 for (
int num = _cooldowns.Count - 1; num >= 0; num--)
8280 if (_cooldowns[num] % 1000 == 1)
8282 _cooldowns.RemoveAt(num);
8289 if (_cooldowns.Count == 0)
8302 if (IsPCParty || base.noMove)
8307 if ((IsHomeMember() && IsInHomeZone()) || IsGuest())
8310 if (goalFromTimeTable !=
null)
8312 SetAI(goalFromTimeTable);
8315 goalFromTimeTable.
Tick();
8320 if (goalList.
index == -2)
8322 goalList.
Refresh(
this, goalListType);
8324 SetAI(goalList.
Next());
8348 return GetGoalWork();
8354 return GetGoalHobby();
8396 return SetAI(_NoGoalPC);
8414 Debug.Log(
"goal is g:" + ai?.ToString() +
"/" +
this);
8418 if (HasCondition<ConWait>())
8420 RemoveCondition<ConWait>();
8426 renderer.RefreshStateIcon();
8433 bool hasNoGoal = HasNoGoal;
8468 listHobby.Add(
new Hobby
8479 foreach (
int work
in _works)
8481 listHobby.Add(
new Hobby
8495 if (_hobbies ==
null)
8499 foreach (
int hobby
in _hobbies)
8501 listHobby.Add(
new Hobby
8514 if (
item.source.alias ==
id)
8519 foreach (
Hobby item2
in ListHobbies())
8521 if (item2.
source.alias ==
id)
8531 if (workElements !=
null)
8535 workElements =
null;
8536 if (IsPCParty || homeBranch ==
null || homeBranch.
owner ==
null)
8544 foreach (
Hobby item2
in ListWorks())
8548 if (workElements !=
null)
8552 void TryAdd(
Hobby h)
8554 if (!h.
source.elements.IsEmpty())
8556 if (workElements ==
null)
8560 for (
int i = 0; i < h.
source.elements.Length; i += 2)
8562 int num = h.
source.elements[i];
8563 int num2 = h.
source.elements[i + 1];
8565 if (num != 2115 && num != 2207)
8573 workElements.
ModBase(num, (num2 < 0) ? (num2 / 10) : Mathf.Max(1, h.
source.elements[i + 1] * num3 / 1000));
8581 string text = (simple ?
"" : (
"hobby".lang() +
":"));
8586 return text.TrimEnd(
',');
8591 string text = (simple ?
"" : (
"work".lang() +
":"));
8596 return text.TrimEnd(
',');
8601 foreach (
int hobby
in _hobbies)
8613 foreach (
int work
in _works)
8625 if (_hobbies !=
null && _works !=
null)
8632 _hobbies =
new List<int>();
8633 _works =
new List<int>();
8641 string[] hobbies = source.
hobbies;
8642 foreach (
string key
in hobbies)
8647 if (source.
works.IsEmpty())
8653 string[] hobbies = source.
works;
8654 foreach (
string key2
in hobbies)
8659 GetWorkSummary().Reset();
8664 if (_workSummary ==
null)
8668 return _workSummary;
8681 if (workSummary.
work !=
null)
8686 else if (workSummary.
hobbies.Count > 0)
8707 hobby.id = session.
id;
8712 workSummary.progress +=
EClass.
rnd(5) + 5;
8714 int num = PerformWork(hobby, 0, isHobby);
8715 int num2 = PerformWork(hobby, 1, isHobby);
8716 int num3 = PerformWork(hobby, 2, isHobby);
8717 int num4 = PerformWork(hobby, 3, isHobby);
8718 workSummary.money += num;
8719 workSummary.food += num2;
8720 workSummary.knowledge += num3;
8721 workSummary.material += num4;
8722 int PerformWork(
Hobby work,
int idx,
bool isHobby)
8724 if (idx >= work.
source.resources.Length)
8728 int num5 = work.
source.resources[idx];
8730 num5 =
Rand.
Range(num5 * (100 - work.
source.resources[idx]) / 100, num5);
8731 num5 = num5 * (isHobby ? 50 : 100) * session.
efficiency / 10000;
8732 if (num6 > 0 && num5 <= 0)
8742 _goalWork.
FindWork(
this, setAI:
false);
8758 foreach (
Condition condition
in conditions)
8760 condition.
SetOwner(
this, onDeserialize);
8766 return AddCondition(typeof(T).Name, p, force);
8779 if (c is
ConBleed && ResistLv(964) >= 3)
8784 else if (ResistLv(950) >= 3)
8802 if (c.
source.negate.Length != 0)
8804 string[] negate = c.
source.negate;
8805 foreach (
string text
in negate)
8807 if (HasElement(text))
8814 if (defenseAttribute !=
null)
8816 c.power = 100 * c.power / Mathf.Max(100 + defenseAttribute.
Value, 1);
8818 if (c.
source.resistance.Length != 0)
8823 c.power /= num * num + 1;
8836 for (
int j = 0; j < conditions.Count; j++)
8838 if (conditions[j].
id != c.
id)
8844 conditions[j].Kill();
8847 if (conditions[j].CanStack(c))
8849 if (conditions[j].WillOverride)
8851 conditions[j].Kill(silent:
true);
8854 if (CanGainConResist)
8858 conditions[j].OnStacked(c.
power);
8859 conditions[j].OnStartOrStack();
8860 conditions[j].PlayEffect();
8862 if (!conditions[j].AllowMultipleInstance)
8867 foreach (
Condition condition
in conditions)
8874 int num2 = c.EvaluateTurn(c.power);
8881 if (CanGainConResist)
8888 if (c.ShouldRefresh)
8900 if (c.SyncRide && (ride !=
null || parasite !=
null))
8906 if (parasite !=
null)
8914 public override bool HasCondition<T>()
8916 for (
int i = 0; i < conditions.Count; i++)
8918 if (conditions[i] is T)
8928 for (
int i = 0; i < conditions.Count; i++)
8930 if (conditions[i].source.alias == alias)
8945 for (
int i = 0; i < conditions.Count; i++)
8949 return conBuffStats.elements.GetElement(ele);
8955 public void CureCondition<T>(
int v = 99999) where T :
Condition
8957 T condition = GetCondition<T>();
8958 if (condition !=
null)
8960 condition.value -= v;
8961 if (condition.value <= 0)
8970 for (
int i = 0; i < conditions.Count; i++)
8972 if (conditions[i] is T)
8974 return conditions[i] as T;
8982 for (
int num = conditions.Count - 1; num >= 0; num--)
8984 if (conditions[num] is T)
8986 conditions[num].
Kill();
8994 if (parasite !=
null)
8996 parasite.
Cure(type, p, state);
9000 ride.
Cure(type, p, state);
9002 Cure(type, p, state);
9012 CureCondition<ConFear>();
9013 CureCondition<ConBlind>(2 * p / 100 + 5);
9014 CureCondition<ConPoison>(5 * p / 100 + 5);
9015 CureCondition<ConConfuse>(10 * p / 100 + 10);
9016 CureCondition<ConDim>(p / 100 + 5);
9017 CureCondition<ConBleed>(2 * p / 100 + 10);
9024 CureCondition<ConBlind>(5 * p / 100 + 15);
9025 CureCondition<ConPoison>(10 * p / 100 + 15);
9026 CureCondition<ConBleed>(5 * p / 100 + 20);
9027 CureTempElements(p, body:
true, mind:
false);
9030 CureCondition<ConFear>();
9031 CureCondition<ConDim>(3 * p / 100 + 10);
9032 CureTempElements(p, body:
false, mind:
true);
9036 for (
int num2 = conditions.Count - 1; num2 >= 0; num2--)
9038 Condition condition2 = conditions[num2];
9043 condition2.
Mod(-1, force:
true);
9051 CureCondition<ConWait>();
9052 CureCondition<ConDisease>((
EClass.
rnd(20) + 10) * p / 100);
9053 bool flag2 = HasCondition<ConAnorexia>();
9054 base.c_vomit -= (flag2 ? 3 : 2) * p / 100;
9055 if (base.c_vomit < 0)
9060 RemoveCondition<ConAnorexia>();
9070 CureTempElements(p * 100, body:
true, mind:
true);
9071 for (
int num = conditions.Count - 1; num >= 0; num--)
9086 CureCondition<ConWait>();
9087 CureCondition<ConSleep>();
9091 RemoveCondition<ConBrightnessOfLife>();
9096 if (HasElement(1206))
9098 SetFeat(1206, 0, msg:
true);
9112 if (
TC.hp >
TC.MaxHP * Mathf.Min(5 + (
int)Mathf.Sqrt(power),
harvest ? 35 : 25) / 100)
9116 if (
TC.HasElement(427))
9124 PlaySound(
"hit_finish");
9126 Say(
"finish2",
this,
TC);
9136 if (resistCon ==
null)
9138 resistCon =
new Dictionary<int, int>();
9140 if (resistCon.ContainsKey(key))
9142 resistCon[key] += con.power * con.GainResistFactor / 100;
9146 resistCon[key] = con.power * con.GainResistFactor / 100;
9153 if (con.
power > 0 && resistCon !=
null)
9155 int a =
ClassExtension.TryGetValue<int,
int>((IDictionary<int, int>)resistCon, con.
id, 0);
9173 RemoveCondition<ConAwakening>();
9178 con.pcPillow = pillow;
9179 con.pickup = pickup;
9180 con.posBed = posBed;
9181 con.posPillow = posPillow;
9188 int num =
bed?.Power ?? 20;
9189 if (traitPillow !=
null)
9191 num += traitPillow.owner.Power / 2;
9195 num +=
bed.Evalue(750) * 5;
9206 int num = power * days;
9207 if (stamina.
value < 0)
9212 stamina.
Mod(10 + 25 * num / 100 * (100 + elements.GetFeatRef(1642)) / 100);
9228 int height = bio.height;
9229 height = height * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9234 if (height != bio.height)
9236 bio.height = height;
9237 Say((a > 0) ?
"height_gain" :
"height_lose",
this);
9247 int weight = bio.weight;
9248 int height = bio.height;
9249 int num = height * height * 18 / 25000;
9250 int num2 = height * height * 24 / 10000;
9251 if (ignoreLimit || (weight > num && weight < num2))
9253 weight = weight * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9258 if (weight != bio.weight)
9260 bio.weight = weight;
9261 Say((a > 0) ?
"weight_gain" :
"weight_lose",
this);
9270 if (ResistLv(962) > 0 &&
EClass.
rnd(ResistLv(962) + 1) != 0)
9274 int num = Evalue(412);
9277 float num2 = (float)a * 100f / (
float)Mathf.Max(100 + num * 2, 10);
9278 a = (int)num2 + ((
EClass.
rndf(1f) < num2 % 1f) ? 1 : 0);
9285 int num3 = (corruption + a) / 100 - corruption / 100;
9286 for (
int i = 0; i < Mathf.Abs(num3); i++)
9288 if (!MutateRandom((num3 > 0) ? 1 : (-1), 100, ether:
true))
9295 foreach (
Element value
in elements.dict.Values)
9297 if (value.
source.category ==
"ether")
9299 num4 += value.
Value;
9302 if (num4 > 0 && IsPC)
9306 corruption = num4 * 100 + corruption % 100;
9311 List<Element> list =
new List<Element>();
9314 Feat feat = elements.GetOrCreateElement(
item.id) as
Feat;
9315 int num = ((feat.ValueWithoutLink <= 0) ? 1 : (feat.
ValueWithoutLink + 1));
9324 public void SetFeat(
int id,
int value = 1,
bool msg =
false)
9326 Feat feat = elements.GetElement(
id) as
Feat;
9328 if (feat !=
null && feat.
Value > 0)
9330 if (value == feat.
Value)
9339 feat = elements.SetBase(
id, value - (feat?.vSource ?? 0)) as
Feat;
9344 elements.Remove(
id);
9349 CalculateMaxStamina();
9355 if (feat.
source.textInc.IsEmpty())
9357 PlaySound(
"ding_skill");
9359 Say(
"gainFeat",
this, feat.
FullName);
9363 bool flag = value < num;
9364 if (feat.
source.tag.Contains(
"neg"))
9368 PlaySound(
"mutation");
9370 Say((value > num) ? feat.
source.GetText(
"textInc") : feat.
source.GetText(
"textDec"),
this, feat.
FullName);
9372 elements.CheckSkillActions();
9379 Element element = elements.GetElement(idEle);
9380 Element element2 = elements.GetElement(row2.
id);
9381 int num = element?.
Value ?? 0;
9390 bool flag = (row.
tag.Contains(
"neg") ? (a > num) : (a < num));
9391 if (a == 0 && (element ==
null || element.
Value == 0))
9393 SayNothingHappans();
9396 if (element !=
null && element.
Value == a)
9398 SayNothingHappans();
9401 if (element2 !=
null && element2.
Value > 0)
9403 SetFeat(element2.
id, 0);
9406 PlaySound(
"mutation");
9407 PlayEffect(
"mutation");
9409 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
9414 if (!ether && vec >= 0 && HasElement(406) &&
EClass.
rnd(5) != 0)
9416 Say(
"resistMutation",
this);
9420 for (
int i = 0; i < tries; i++)
9423 if (i == 0 && vec < 0 && ether && base.c_corruptionHistory != null && base.c_corruptionHistory.Count > 0)
9426 base.c_corruptionHistory.RemoveAt(base.c_corruptionHistory.Count - 1);
9427 if (base.c_corruptionHistory.Count == 0)
9429 base.c_corruptionHistory =
null;
9432 Element element = elements.GetElement(row.
id);
9434 if ((vec > 0 && ((row.
id == 1563 && corruption < 300) || (row.
id == 1562 && corruption < 1000 && base.IsPowerful))) || (vec < 0 && (element ==
null || element.
Value <= 0)) || (vec > 0 && element !=
null && element.
Value >= row.
max))
9441 element = elements.GetElement(row.
id);
9443 bool flag = row.
tag.Contains(
"neg");
9456 if (element !=
null)
9458 num = element.Value + ((vec != 0) ? vec : ((
EClass.
rnd(2) == 0) ? 1 : (-1)));
9459 if (num > element.
source.max)
9461 num = element.source.max - 1;
9463 flag = (flag && num > element.
Value) || (!flag && num < element.
Value);
9464 flag2 = num > element.
Value;
9465 if (vec > 0 && !flag2)
9470 Say(flag2 ?
"mutation_gain" :
"mutation_loose",
this);
9471 SetFeat(row.
id, num);
9474 if (base.c_corruptionHistory ==
null)
9476 base.c_corruptionHistory =
new List<int>();
9478 base.c_corruptionHistory.Add(row.
id);
9481 Element element2 = elements.GetElement(row.
id);
9486 EClass.player.flags.gotEtherDisease =
true;
9488 thing.
SetStr(53,
"letter_ether");
9497 PlaySound(ether ?
"mutation_ether" :
"mutation");
9498 PlayEffect(
"mutation");
9500 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
9504 Say(
"nothingHappens");
9510 Element orCreateElement = elements.GetOrCreateElement(ele);
9513 elements.ModBase(orCreateElement.
id, 1);
9515 if (orCreateElement is
Spell)
9517 int num = mtp * orCreateElement.source.charge * (100 + Evalue(307) + (HasElement(307) ? 20 : 0)) / 100 / 100;
9518 if (orCreateElement.
source.charge == 1)
9522 orCreateElement.vPotential += Mathf.Max(1, num / 2 +
EClass.
rnd(num / 2 + 1));
9524 Say(
"spell_gain",
this, orCreateElement.
Name);
9536 Msg.
Say(
"curse_nullify", member);
9541 else if (HasElement(1641) &&
EClass.
rnd(3) != 0)
9543 Say(
"curse_nullify",
this);
9546 if (GetCondition<ConHolyVeil>() !=
null &&
EClass.
rnd(5) != 0)
9548 Say(
"curse_nullify",
this);
9556 if (_historyFood !=
null)
9558 while (_historyFood.Count > 5)
9560 _historyFood.RemoveAt(_historyFood.Count - 1);
9562 if (_historyFood[0].Count > 0)
9564 _historyFood.Insert(0,
new List<string>());
9571 if (!IsPCFaction || !IsGlobal)
9573 _historyFood =
null;
9576 if (_historyFood ==
null)
9578 _historyFood =
new List<List<string>>
9583 if (_historyFood[0].Count < 5)
9585 _historyFood[0].Add(
food.id);
9591 if (_historyFood ==
null)
9596 foreach (List<string>
item in _historyFood)
9598 foreach (
string item2
in item)
9600 if (item2 ==
food.id)
9613 return 10 + (int)(Mathf.Sqrt(base.c_daysWithGod) * 2f + (float)Evalue(85)) / 2;
9615 return 10 + (int)(Mathf.Sqrt(base.LV) * 5f + (float)Evalue(306)) / 2;
9620 if (faithElements !=
null)
9625 if (idFaith ==
"eyth" && !HasElement(1228))
9640 if (!HasCondition<ConExcommunication>())
9643 int num = GetPietyValue() * (120 + Evalue(1407) * 15) / 100;
9644 for (
int i = 0; i < array.Length; i += 2)
9646 int num2 = array[i + 1] * num / 50;
9649 num2 =
EClass.
curve(num2, array[i + 1] * 2, 10, 50);
9651 if (num2 >= 20 && array[i] >= 950 && array[i] < 970)
9655 faithElements.
SetBase(array[i], Mathf.Max(num2, 1));
9661 public void ModTempElement(
int ele,
int a,
bool naturalDecay =
false,
bool onlyRenew =
false)
9667 bool flag = HasElement(1215);
9668 if (tempElements ==
null)
9677 int num = elements.ValueWithoutLink(ele);
9678 int num2 = Mathf.Abs(num) + 100;
9679 int num3 = num2 / (flag ? 2 : 4);
9680 int num4 = -num - 100;
9681 int num5 = tempElements.
Base(ele);
9682 int num6 = num5 + a;
9685 num3 = Mathf.Min(a, num3);
9686 num4 = Mathf.Max(a, -num2 / 3);
9688 if (a > 0 && num6 > num3)
9690 a = ((num3 > num5) ? (num3 - num5) : 0);
9692 if (a < 0 && num6 < num4)
9694 a = ((num4 < num5) ? (num4 - num5) : 0);
9697 if (element.
vBase == 0)
9700 if (tempElements.
dict.Count == 0)
9702 tempElements =
null;
9721 ModTempElement(ele, onlyRenew ? (-p / 20) : (-(p / 100 +
EClass.
rnd(p / 100 + 1) + 1)), naturalDecay:
false, onlyRenew);
9727 foreach (
int ele
in array)
9729 EnhanceTempElement(ele, p, onlyRenew);
9735 ModTempElement(ele, onlyRenew ? (p / 20) : (p / 100 +
EClass.
rnd(p / 100 + 1)), naturalDecay:
false, onlyRenew);
9740 if (tempElements ==
null)
9748 ModTempElement(
item.id, -Mathf.Min(
item.vBase * 5 / 100 + 1,
item.vBase), naturalDecay:
true);
9755 if (tempElements !=
null)
9766 void Cure(
int[] eles)
9768 foreach (
int ele
in eles)
9770 if (tempElements ==
null)
9775 if (element !=
null && element.
vBase < 0)
9777 ModTempElement(ele, Mathf.Clamp(p / 20 +
EClass.
rnd(p / 20), 1, -element.
vBase));
9785 if (tempElements !=
null)
9788 tempElements =
null;
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
static Act Create(int id)
virtual bool ShouldAllyAttack(Chara tg)
virtual bool CancelOnAggro
override string ToString()
virtual bool CancelWhenMoved
string GetCurrentActionText()
virtual Point GetDestination()
virtual void OnPerformWork(bool realtime)
bool TryCancelInteraction(bool sound=true)
void SetTurbo(int mtp=-1)
static void ProcAt(EffectId id, int power, BlessedState state, Card cc, Card tc, Point tp, bool isNeg, ActRef actRef=default(ActRef))
static EffectIRenderer Throw(Card c, Point p, Thing t, ThrowMethod method=ThrowMethod.Default, float failChance=0f)
static void Search(Chara c, bool manual=false)
virtual TargetType TargetType
bool IsTargetHostileParty()
virtual bool CanRapidFire
static Affinity Get(Chara c)
void SetStr(int id, string value=null)
void SetInt(int id, int value=0)
virtual RendererReplacer GetRendererReplacer()
virtual bool PreventRegen
virtual int EvaluatePower(int p)
virtual int GainResistFactor
virtual bool TryMove(Point p)
Element GetDefenseAttribute(Chara c=null)
bool TryNullify(Condition c)
void Mod(int a, bool force=false)
virtual void SetOwner(Chara _owner, bool onDeserialize=false)
virtual void OnEndPlayerTurn()
virtual ConditionType Type
virtual string GetPhaseStr()
static void Set(CardBlueprint _bp)
static CardBlueprint CharaGenEQ
GlobalCharaList globalCharas
void PlayAnime(AnimeID id, bool force)
RendererReplacer replacer
void Teleport(Point point, bool silent=false, bool force=false)
void MakeRefFrom(string id)
int EvalueMax(int ele, int min=0)
void MakeFigureFrom(string id)
ElementContainerCard elements
Hostility c_originalHostility
void DamageHP(int dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
bool HasElement(int ele, int req=1)
SourceMaterial.Row material
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
virtual int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
Thing AddThing(string id, int lv=-1)
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
virtual void SetBlessedState(BlessedState s)
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
void ModCurrency(int a, string id="money")
virtual bool IsAliveInCurrentZone
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
BlessedState blessedState
bool TryStackTo(Thing to)
virtual bool IsPCFactionMinion
void ApplyBacker(int bid)
void ModExp(string alias, int a)
SourceCategory.Row category
void ModNum(int a, bool notify=true)
void Say(string lang, string ref1=null, string ref2=null)
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true, int fertChance=20, BlessedState? state=null)
SourceBlock.Row sourceBlock
SourceFloor.Row sourceFloor
SourceMaterial.Row matObj
SourceFloor.Row sourceBridge
SourceMaterial.Row matFloor
SourceFloor.Row sourceSurface
void RemoveBodyPartAt(int idx)
void SetOwner(Chara chara, bool deserialized=false)
void AddBodyPart(int ele, Thing thing=null)
bool IsTooHeavyToEquip(Thing thing)
AttackStyle GetAttackStyle()
bool IsEquippable(Thing thing, BodySlot slot, bool text=true)
int GetWeight(bool armorOnly=false)
bool Equip(Thing thing, BodySlot slot=null, bool msg=true)
BodySlot GetSlot(Thing t, bool onlyEmpty=false, bool secondSlot=false)
void RemoveBodyPart(int ele)
static Chara CreateFromFilter(string id, int lv=-1, int levelRange=-1)
static Chara Create(string id, int lv=-1)
override void SetOwner(Card c)
SourceCategory.Row GetFavCat()
void DamageTempElement(int ele, int p, bool onlyRenew=false)
bool UseAbility(string idAct, Card tc=null, Point pos=null, bool pt=false)
void Refresh(bool calledRecursive=false)
void ChangeRace(string idNew)
void SetHomeZone(Zone zone)
static List< Chara > _pts
override string actorPrefab
override bool IsAliveInCurrentZone
bool IsFriendOrAbove(Chara c)
int GetBurden(Card t=null, int num=-1)
override void ApplyEditorTags(EditorTag tag)
Thing FindBestFoodToEat()
Hostility OriginalHostility
LayerDrama _ShowDialog(string book, string sheet, string step="main", string tag="")
bool CanAcceptGift(Chara c, Card t)
WorkSummary GetWorkSummary()
override void Rotate(bool reverse=false)
Chara CreateReplacement()
override Sprite GetImageSprite()
MoveResult TryMoveFrom(Point p)
void MoveHome(Zone zone, int x=-1, int z=-1)
void ChangeMemberType(FactionMemberType type)
void CureTempElements(int p, bool body, bool mind)
bool TryNeckHunt(Chara TC, int power, bool harvest=false)
void SetFaction(Faction f)
Element GetBuffStats(string alias)
void Cuddle(Chara c, bool headpat=false)
bool IsCriticallyWounded(bool includeRide=false)
void ModTempElement(int ele, int a, bool naturalDecay=false, bool onlyRenew=false)
bool CanInteractTo(Point p)
override void SetSortVal(UIList.SortMode m, CurrencyType currency=CurrencyType.Money)
void TryPutShared(Thing t, List< Thing > containers=null, bool dropIfFail=true)
void CureHost(CureType type, int p=100, BlessedState state=BlessedState.Normal)
void RefreshWorkElements(ElementContainer parent=null)
bool MutateRandom(int vec=0, int tries=100, bool ether=false, BlessedState state=BlessedState.Normal)
void InstantEat(Thing t=null, bool sound=true)
Goal GetGoalFromTimeTable(int hour)
Condition AddCondition(string id, int p=100, bool force=false)
override Sprite GetSprite(int dir=0)
Thing FindAmmo(Thing weapon)
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
GoalListType goalListType
void OnSleep(int power, int days=1)
override CardRow sourceRenderCard
override int GetArmorSkill()
void EnhanceTempElement(int ele, int p, bool onlyRenew=false)
void SetFaith(Religion r)
bool IsValidGiftWeight(Card t, int num=-1)
Condition AddCondition(Condition c, bool force=false)
Point GetFirstStep(Point newPoint, PathManager.MoveType moveType=PathManager.MoveType.Default)
Chara GetNearbyCatToSniff()
void Kick(Chara t, bool ignoreSelf=false, bool karmaLoss=true, bool show=true)
static List< SourceCategory.Row > _listFavCat
void SetFeat(int id, int value=1, bool msg=false)
bool CanSeeLos(Card c, int dist=-1)
override void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
override string ToString()
void TryTakeSharedItems(IEnumerable< Thing > containers, bool msg=true, bool shouldEat=true)
ElementContainer tempElements
void TryPutSharedItems(bool msg=true)
void SetMainElement(int id, int v=0, bool elemental=false)
void ApplyRace(bool remove=false)
bool CanAcceptItem(Card t, int num=-1)
bool RequestProtection(Chara attacker, Action< Chara > action)
bool TryWorkOutside(SourceHobby.Row sourceWork)
override void OnSerializing()
List< Condition > conditions
void SetMutation(int idEle, int a=0)
void HoldCard(Card t, int num=-1)
void PickHeld(bool msg=false)
bool HasCondition(string alias)
SpriteReplacer spriteReplacer
static List< Thing > _ListItems
void SetMainElement(string id, int v=0, bool elemental=false)
Thing GetBestRangedWeapon()
void DiminishTempElements(int a=1)
override string GetName(NameStyle style, int num=-1)
Chara SetGlobal(Zone _home, int x, int z)
void EnhanceTempElements(int p, bool body, bool mind, bool onlyRenew=false)
override string GetHoverText()
override void OnDeserialized()
override void SetSource()
bool TryHoldCard(Card t, int num=-1, bool pickHeld=false)
static List< Hobby > listHobby
int CalcCastingChance(Element e, int num=1)
bool ShouldEquip(Thing t, bool useFav=false)
bool CanMoveTo(Point p, bool allowDestroyPath=true)
bool HasMinion(string id)
void DestroyPath(Point pos)
override CardRenderer _CreateRenderer()
void PickOrDrop(Point p, string idThing, int idMat=-1, int num=1, bool msg=true)
void TryPutSharedItems(IEnumerable< Thing > containers, bool msg=true)
override bool IsPCFaction
override bool IsPCPartyMinion
void CalculateMaxStamina()
void MoveZone(Zone z, ZoneTransition transition)
void TryUpgrade(bool msg=true)
void Kick(Point p, bool ignoreSelf=false)
void MakeMinion(Chara _master, MinionType type=MinionType.Default)
override void LookAt(Point p)
List< Element > ListAvailabeFeats(bool pet=false, bool showAll=false)
override bool IsPCFactionMinion
override MoveResult _Move(Point newPoint, MoveType type=MoveType.Walk)
bool CanEat(Thing t, bool shouldEat=false)
bool ShouldThrowAway(Thing t, ClearInventoryType type)
ElementContainer _baseWorkElements
override void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
MoveResult TryMove(Point newPoint, bool allowDestroyPath=true)
void SetAIImmediate(AIAct g)
void PerformWork(WorkSession session, bool isHobby=false, bool IsRealTime=false)
void PickOrDrop(Point p, Thing t, bool msg=true)
static GoalHobby _goalHobby
override bool IsDeadOrSleeping
List< Hobby > ListHobbies(bool useMemberType=true)
void MakeAlly(bool msg=true)
void RemoveLastBodyPart(bool msg=false)
ElementContainer baseWorkElements
void TickWork(VirtualDate date)
void Stumble(int mtp=100)
void ClearInventory(ClearInventoryType type)
void MoveByForce(Point newPoint, Card c=null, bool checkWall=false)
FactionMemberType memberType
string TalkTopic(string topic="calm")
string GetIdPortraitCat()
bool HasHigherGround(Card c)
void TryRestock(bool onCreate)
void RestockInventory(bool onCreate)
List< List< string > > _historyFood
bool MoveNeighborDefinitely()
bool visibleWithTelepathy
void ChangeJob(string idNew)
SourceThing.Row GetFavFood()
void SetTempHand(int right=0, int left=0)
void ApplyJob(bool remove=false)
void AddRandomBodyPart(bool msg=false)
List< Hobby > ListWorks(bool useMemberType=true)
Card DropHeld(Point dropPos=null)
void Revive(Point p=null, bool msg=false)
void GainAbility(int ele, int mtp=100)
void TryReservePickupTutorial(Thing t)
LayerDrama ShowDialog(string book, string step="main", string tag="")
void RefreshFaithElement()
ElementContainer faithElements
override void ChangeRarity(Rarity r)
void GiveLovePotion(Chara c, Thing t)
void AddCooldown(int idEle, int turns=0)
void RerollHobby(bool extraSlotChance=true)
Thing MakeGene(DNA.Type? type=null)
void RefreshSpeed(Element.BonusInfo info=null)
static List< SourceRace.Row > ListAdvRace
bool CanBeTempAlly(Chara c)
override string AliasMaterialOnCreate
void ModWeight(int a, bool ignoreLimit=false)
void AddFoodHistory(Thing food)
override CardRow sourceCard
bool CanInteractTo(Card c)
string GetTopicText(string topic="calm")
static NoGoal _NoGoalRepeat
void ModCorruption(int a)
void RestockEquip(bool onCreate)
override void SetDir(int d)
MoveResult TryMoveTowards(Point p)
bool FindNearestNewEnemy()
Element GetFavWeaponSkill()
void DropThing(Thing t, int num=-1)
void GiveGift(Chara c, Thing t)
void EQ_Item(string s, int num=1)
string GetTextHappiness()
override bool IsMultisize
Chara SetEnemy(Chara c=null)
void CallHelp(Chara tg, bool fanatic=false)
void DoHostileAction(Card _tg, bool immediate=false)
bool CanSeeSimple(Point p)
Thing EQ_ID(string s, int mat=-1, Rarity r=Rarity.Random)
void ClearBed(Map map=null)
override void SetRenderParam(RenderParam p)
void AddResistCon(Condition con)
void MoveZone(Zone z, ZoneTransition.EnterState state=ZoneTransition.EnterState.Auto)
bool UseAbility(Act a, Card tc=null, Point pos=null, bool pt=false)
bool TryEquip(Thing t, bool useFav=false)
override SubPassData GetSubPassData()
bool CanSeeLos(Point p, int dist=-1)
int CountNumEaten(Thing food)
void ResistCon(Condition con)
void SetSummon(int duration)
Element GetFavArmorSkill()
void DamageTempElements(int p, bool body, bool mind, bool onlyRenew=false)
bool IsEnemyOnPath(Point p, bool cancelAI=true)
void InitStats(bool onDeserialize=false)
void MoveHome(string id, int x=-1, int z=-1)
bool TryIdentify(Thing t, int count=1, bool show=true)
Thing TryPoisonPotion(Thing t)
void TryTakeSharedItems(bool msg=true)
override void LookAt(Card c)
static List< SourceThing.Row > _listFavFood
void Cure(CureType type, int p=100, BlessedState state=BlessedState.Normal)
static string[] IDTimeTable
TimeTable.Span CurrentSpan
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
void TrySetEnemy(Chara c)
override void OnCreate(int genLv)
void TryAbsorbRod(Thing t)
string GetTextWork(bool simple=false)
void TryPush(Point point)
string GetTextHobby(bool simple=false)
Dictionary< int, int > resistCon
void OnSleep(Thing bed=null, int days=1)
override string GetHoverText2()
int ParseBodySlot(string s)
bool CanEquipRanged(Thing t)
void Sleep(Thing bed=null, Thing pillow=null, bool pickup=false, ItemPosition posBed=null, ItemPosition posPillow=null)
void OnGiveErohon(Thing t)
AttackStyle GetFavAttackStyle()
bool HasCooldown(int idEle)
static GoalWork _goalWork
void DoAI(int wait, Action onPerform)
ElementContainer workElements
static List< SourceJob.Row > ListAdvJob
void MoveZone(string alias)
void SetPCCState(PCCState state)
Element GetBuffStats(int ele)
void MakeGrave(string lastword)
override void OnBeforeCreate()
bool DroppedCard(string id)
void MarkCardDrop(string id)
UD_String_MatData matColors
Gradient gradientLVComparison
void Kill(bool silent=false)
static Condition Create(string alias, int power=100, Action< Condition > onCreate=null)
static void Collect(Thing t)
bool ignoreBackerDestoryFlag
BackerContentConfig backer
static Thing MakeLoveLunch(Chara c)
static Thing GenerateGene(Chara c, Type? type=null)
int GetRaw(int offsetHours=0)
static void TryWarnMana(Action action)
static ColorProfile Colors
static int curve(int a, int start, int step, int rate=75)
static SourceManager sources
static float rndf(float a)
static FactionBranch Branch
static BaseGameScreen screen
static int rndHalf(int a)
static SoundManager Sound
static GameSetting setting
static Effect Get(Effect original)
void Play(float delay, Point from, float fixY=0f, Point to=null, Sprite sprite=null)
void ModExp(int ele, float a, bool chain=false)
Dictionary< int, Element > dict
int ValueWithoutLink(int ele)
Element ModBase(int ele, int v)
void ApplyElementMap(int uid, SourceValueType type, Dictionary< int, int > map, int lv, bool invert=false, bool applyFeat=false)
Element SetBase(string alias, int v, int potential=0)
Element GetElement(string alias)
static SourceElement.Row Get(int id)
virtual int GetPower(Card c)
static Element Create(int id, int v=0)
virtual Act.Cost GetCost(Chara c)
static List< SourceElement.Row > ListElements
static int[] List_MainAttributesMajor
TileInfo GetTileInfo(int gx, int gy)
static Expedition Create(Chara c, ExpeditionType type)
static SourceFloor.Row sourceSnow
static SourceFloor.Row sourceIce
static bool IsTatami(int id)
static SourceFloor.Row sourceWood
ExpeditionManager expeditions
void RemoveMemeber(Chara c)
string Log(string idLang, string ref1=null, string ref2=null, string ref3=null, string ref4=null)
Dictionary< string, Faction > dictAll
List< string > Apply(int a, ElementContainer owner, bool hint=false)
override bool IsPurchaseFeatReqMet(ElementContainer owner, int lv=-1)
static void Proc(Chara c, Thing food, bool consume=true)
Dictionary< int, byte > lastPoints
static string Parse(string text, bool thirdPerson, string val1, string val2=null, string val3=null, string val4=null)
bool disableDeathPenaltyProtection
UD_String_ElementRef elements
ConfigPreference preference
ConfigAutoCombat autoCombat
ReligionManager religions
bool Save(bool isAutoSave=false, bool silent=false)
PCCUniformManager uniforms
void Refresh(Chara owner, GoalListType type)
void ValidateHobby(Chara c)
bool FindWork(Chara c, bool setAI=true)
static GuildFighter Fighter
int GetEfficiency(Chara c)
static bool Has(string id)
static string[] GetList(string id)
static string _currency(object a, string IDCurrency)
static void SetDirty(Element a)
static LayerDrama Activate(string book, string idSheet, string idStep, Chara target=null, Card ref1=null, string tag="")
static LayerDrama ActivateMain(string idSheet, string idStep=null, Chara target=null, Card ref1=null, string tag="")
static void SetDirty(Thing t)
static bool IsVisible(Point p1, Point p2, Action< Point, bool > _onVisit=null)
static SourceMaterial.Row sourceOak
static SourceMaterial.Row sourceSnow
static SourceMaterial.Row sourceIce
Thing FindThing(Func< Thing, bool > func)
Chara FindChara(string id)
void MoveCard(Point p, Card t)
void SetLiquid(int x, int z, CellEffect effect=null)
void SetFoormark(Point pos, int id, int angle, int offset=0)
void SetEffect(int x, int z, CellEffect effect=null)
static ThirstPersonInfo thirdPerson1
static string SayNothingHappen()
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
void RemoveMember(Chara c)
void AddMemeber(Chara c, bool showMsg=false)
void RequestPathImmediate(PathProgress progress)
Point GetFirstStep(Point origin, Point _dest, IPathfindWalker walker, int maxDist=20, MoveType moveType=MoveType.Default)
static PathManager Instance
List< PathFinderNode > nodes
void EndTurn(bool consume=true)
void EnterLocalZone(bool encounter=false, Chara mob=null)
HashSet< int > doneBackers
Thing DropReward(Thing t, bool silent=false)
bool TryAbortAutoCombat(bool immediate=true)
SourceMaterial.Row matFloor
SourceBlock.Row sourceBlock
void ForeachMultiSize(int w, int h, Action< Point, bool > action)
void SetObj(int id=0, int value=1, int dir=0)
ref Vector3 Position(int height)
List< Card > ListCards(bool includeMasked=false)
override string ToString()
Point Set(int _x, int _z)
void ForeachNeighbor(Action< Point > action, bool diagonal=true)
Point GetPointTowards(Point dest)
bool Equals(int _x, int _z)
List< Chara > ListCharas()
SourceFloor.Row sourceFloor
void SetBlock(int idMat=0, int idBlock=0)
Point GetRandomNeighbor()
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false)
bool IsActive(int id, int days=-1)
static string GetRandomPortrait(string idDict)
static HashSet< string > allIds
bool OnShowDialog(Chara c)
Quest Add(string id, string idGlobalChara=null)
virtual void OnGiveItem(Chara c, Thing t)
void OnSetGoal(AIAct newGoal)
static int Range(int min, int max)
static void UseSeed(int seed, Action action)
static void SetSeed(int a=-1)
static int Set(Zone zone)
Dictionary< string, Religion > dictAll
ReligionMoonShadow MoonShadow
ReligionTrickery Trickery
Religion GetRandomReligion(bool onlyJoinable=true, bool includeMinor=false)
static Religion recentWrath
void Revelation(string idTalk, int chance=100)
int ConvertTile(int tile)
bool ContainsTag(string _tag)
Sprite GetSprite(int dir=0, int skin=0, bool snow=false)
static void ShakeCam(string id="default", float magnitude=1f)
SourceCharaText charaText
SourceCategory categories
virtual bool ShowDangerLv
virtual bool IsSnowCovered
Sprite GetSprite(bool snow=false)
static int GetAffinityMod(int phase)
static StatsSleepiness Sleepiness
static StatsHygiene Hygiene
static StatsBurden Burden
Stats Set(int[] _raw, int _rawIndex, Chara _CC)
static StatsStamina Stamina
static StatsHunger Hunger
static SubPassData Default
static TargetTypeSelfParty SelfParty
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
void Foreach(Action< Thing > action, bool onlyAccessible=true)
static void TryLickChest(Thing chest)
static Thing CreateTreasure(string id, int lv, TreasureType type=TreasureType.Map)
static Thing CreateParcel(string idLang=null, params Thing[] things)
static Thing CreateSpellbook(string alias, int num=1)
static Thing CreateFromCategory(string idCat, int lv=-1)
static Thing CreateScroll(int ele, int num=1)
static Thing CreateCurrency(int a, string id="money")
static Thing Create(string id, int idMat=-1, int lv=-1)
override string GetName(NameStyle style, int _num=-1)
Thing Identify(bool show=true, IDTSource idtSource=IDTSource.Identify)
virtual bool UseRandomAlias
virtual bool CanExtendBuild
virtual void OnTickHeld()
virtual void OnSteppedOut(Chara c)
virtual bool CanBeDestroyed
virtual bool CanRead(Chara c)
virtual bool CanEat(Chara c)
virtual bool IsChangeFloorHeight
virtual void OnStepped(Chara c)
virtual void OnDrink(Chara c)
virtual bool CanBeDropped
virtual Action GetHealAction(Chara c)
virtual void SetName(ref string s)
virtual bool CanDrink(Chara c)
virtual bool CanOnlyCarry
virtual void OnBlend(Thing t, Chara c)
static void Reserve(string idStep, Action onBeforePlay=null)
static void Play(string idStep)
UIItem AddHeaderCard(string text, Sprite sprite=null)
UIItem AddText(string text, FontColor color=FontColor.DontChange)
Condition CurrentCondition
static void Say(string text, FontColor fontColor=FontColor.Default, Sprite sprite=null)
FilterResult IsFilterPass(string text)
List< WorkSession > hobbies
void SendPackage(Thing p)
virtual ZoneTransition.EnterState ReturnState
virtual void OnLeaveZone()
void SetBGM(List< int > ids, bool refresh=true)
int CountMinions(Chara c)
bool TryAddThingInSharedContainer(Thing t, List< Thing > containers=null, bool add=true, bool msg=false, Chara chara=null, bool sharedOnly=true)
virtual bool IsUnderwater
virtual bool WillAutoSave
virtual bool KeepAllyDistance
virtual bool HiddenInRegionMap
void RefreshListCitizen()
Card AddCard(Card t, Point point)
Point GetSpawnPos(Chara c, ZoneTransition.EnterState destState=ZoneTransition.EnterState.Auto)