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")]
186 private static List<Chara>
_pts =
new List<Chara>();
476 if (base.c_originalHostility == (
Hostility)0)
478 if (!
source.hostility.IsEmpty())
484 return base.c_originalHostility;
494 if (
source.idActor.Length <= 1)
524 return "CharaActorPCC";
536 if (base.dir != 1 && base.dir != 2)
552 return base.dir == 2;
566 return base.ExistsOnMap;
632 return base.c_uidMaster != 0;
708 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, 1E+09f);
710 public override int WeightLimit => (int)Mathf.Clamp(((
long)base.STR * 500L + base.END * 250 +
Evalue(207) * 2000) * ((!
HasElement(1411)) ? 1 : 5) + 45000, 1000f, 1.0737418E+09f);
714 public int MaxSummon => Mathf.Max((
int)Mathf.Sqrt(base.CHA), 1) +
Evalue(1647) + ((!base.IsPCFactionOrMinion) ? ((
int)base.rarity * 5) : 0);
720 if (base.c_idMainElement == 0)
728 public override int DV
739 num = 50 + (num - 50) / 10;
742 int WeaknessMod(
int a)
744 if (HasCondition<ConWeakness>())
757 public override int PV
768 num = 50 + (num - 50) / 10;
771 int WeaknessMod(
int a)
773 if (HasCondition<ConWeakness>())
844 if (!
IsGlobal && !base.isSubsetCard)
990 if (!(
race.id ==
"cat") && !(
race.id ==
"catsister"))
992 return race.id ==
"catgod";
1008 return race.id ==
"mutant";
1032 return EClass.Branch.uidMaid == base.uid;
1058 if (!
source.works.Contains(
"Rich"))
1060 return source.hobbies.Contains(
"Rich");
1074 if (base.c_genes !=
null)
1076 return base.c_genes.GetGeneSlot(
this);
1102 if (!
race.tag.Contains(
"mofu"))
1129 if (!h.
source.elements.IsEmpty())
1131 for (
int i = 0; i < h.
source.elements.Length; i += 2)
1133 int ele = h.
source.elements[i];
1134 int v = h.
source.elements[i + 1];
1164 if (base.rarity >=
Rarity.Legendary)
1179 if (
host ==
null || includeRide)
1183 return base.hp <
MaxHP / 5;
1198 return num > num2 + 0.1f;
1291 return p.cell.room.data.accessType
switch
1294 BaseArea.AccessType.Private =>
false,
1321 for (
int i = 0; i < slots.Count; i++)
1330 _cbits1.Bits = (uint)
_cints[0];
1341 pccData.state = (base.isCensored ? PCCState.Naked : PCCState.Normal);
1350 if (
source.tag.Contains(
"boss"))
1367 string text = base.c_altName ??
source.GetName(
this);
1371 if (base.c_bossType ==
BossType.Evolved)
1373 text =
"_evolved".lang(text.ToTitleCase(wholeText:
true));
1376 if (text.Length > 0 &&
char.IsLower(text[0]))
1378 if (base.rarity >=
Rarity.Legendary)
1380 text = text.ToTitleCase();
1384 text = text.AddArticle();
1391 int num2 = ((base.rarity ==
Rarity.Mythical) ? 3 : ((base.rarity >=
Rarity.Legendary) ? 2 : ((!
_alias.IsEmpty()) ? 1 : (-1))));
1396 text = (
Aka.IsEmpty() ? text.Bracket(num2) : (num2
switch
1401 }).lang((num2 == -1) ?
Aka :
Aka.ToTitleCase(wholeText:
true), text.Bracket(num2)));
1403 return text + text2;
1408 if (r != base.rarity)
1436 Hostility hostility2 = (base.c_originalHostility = h);
1437 this.hostility = hostility2;
1453 if (uniqueData !=
null)
1492 base.isSubsetCard =
false;
1494 base.c_uidMaster = 0;
1526 if (
source.tag.Contains(
"boss"))
1530 int num = ((bp.lv != -999) ?
bp.
lv : base.LV);
1552 if (
source.idActor.Length > 2)
1561 if (
source.mainElement.Length != 0)
1563 int _genLv = Mathf.Min(
genLv, 100);
1564 List<Tuple<string, int, int>> list =
new List<Tuple<string, int, int>>();
1565 string[] mainElement =
source.mainElement;
1566 for (
int i = 0; i < mainElement.Length; i++)
1568 string[] array = mainElement[i].Split(
'/');
1570 int num2 = source.LV * row.eleP / 100;
1571 if (list.Count == 0 || num2 < _genLv || array[0] ==
bp.
idEle)
1573 list.Add(
new Tuple<string, int, int>(array[0], (array.Length > 1) ?
int.Parse(array[1]) : 0, num2));
1576 Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / (100 + (_genLv - a.Item3) * 25));
1579 tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle ||
"ele" + a.Item1 ==
bp.
idEle).FirstOrDefault() ?? tuple;
1581 SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental:
true);
1582 if (list.Count >= 2)
1584 num = tuple.Item3 + base.LV -
source.LV;
1589 base.c_altName = NameGen.getRandomName();
1593 _alias = AliasGen.GetRandomAlias();
1606 if (base.LV > 5 &&
race.id ==
"mutant")
1608 for (
int j = 0; j < Mathf.Min(1 + base.LV / 5, 22); j++)
1614 if (text ==
"putty_mech_b" || text ==
"putty_mech")
1621 if (
race.EQ.Length != 0 || !
source.equip.IsEmpty())
1639 case "olderyoungersister":
1642 case "sister_undead":
1646 if (
id ==
"sister_undead" &&
EClass.
rnd(10) == 0)
1665 if (!
source.faith.IsEmpty())
1726 Debug.LogError(
"source is null");
1745 base.isHidden =
false;
1757 if (
EClass.
_zone.
IsRegion || HasCondition<ConPoison>() || HasCondition<ConConfuse>() || HasCondition<ConDim>() || HasCondition<ConParalyze>() || HasCondition<ConSleep>() || HasCondition<ConBurning>() || HasCondition<ConFreeze>() || HasCondition<ConMiasma>() ||
corruption >= 100)
1779 Element orCreateElement = chara.elements.GetOrCreateElement(
item.Key);
1780 orCreateElement.vBase = item.Value.ValueWithoutLink - orCreateElement.
vSource;
1782 chara.SetFaith(
faith);
1783 chara.bio = IO.DeepCopy(
bio);
1785 chara.c_daysWithGod = base.c_daysWithGod;
1786 chara.RefreshFaithElement();
1787 chara.hp = (int)Mathf.Clamp((
float)chara.MaxHP * ((float)base.hp / (
float)
MaxHP) * 0.99f, 0f, chara.MaxHP);
1788 chara.isCopy =
true;
1789 chara.isScaled = base.isScaled;
1799 int num2 = (base.ChildrenWeight + ((t !=
null) ? ((num == -1) ? t.ChildrenAndSelfWeight : (t.SelfWeight * num)) : 0)) * 100 /
WeightLimit;
1808 int num3 = ((num2 >= 100) ? ((num2 - 100) / 10 + 1) : 0);
1818 int num = base.ChildrenWeight * 100 / Mathf.Max(1,
WeightLimit);
1834 Say(flag ?
"dmgBurdenStairs" :
"dmgBurdenFallDown",
this);
1840 int num2 = (num * (base.ChildrenWeight * 100 /
WeightLimit) / (flag ? 100 : 200) + 1) * mtp / 100;
1863 info?.AddText(
"rideSpeed".lang(
_Speed.ToString() ??
""));
1865 else if (
host !=
null)
1890 info?.AddText(
_Speed - speed,
"parasiteSpeed".lang());
1901 num = 50 + Mathf.Clamp((
int)Mathf.Sqrt(num2) * 5 -
EClass.
_zone.
DangerLv / 50, 0, 50) + Mathf.Clamp((
int)Mathf.Sqrt(num2), 0, 25);
1902 if (info !=
null && num != 100)
1924 num -= (
IsPC ? 50 : 100);
1964 num += EClass.player.lastEmptyAlly *
Evalue(1646);
1969 num += EClass.player.lastEmptyAlly * 10 - 10;
1975 num +=
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100);
1976 info?.AddFix(
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100),
"enemySpeedBuff".lang());
1978 if (HasCondition<ConGravity>())
1981 info?.AddFix(-30, GetCondition<ConGravity>().
Name);
1991 info?.AddText(
"minSpeed".lang(10.
ToString() ??
""));
2002 if (value.
source.category ==
"skill")
2022 this.hostility = hostility2;
2028 this.hostility = hostility2;
2034 this.hostility = hostility2;
2049 base.ApplyEditorTags(tag);
2057 Debug.LogWarning(
"Chara " +
id +
" not found");
2066 if (!
id.StartsWith(
"ele"))
2075 if (base.c_idMainElement != 0)
2077 SetElements(base.c_idMainElement,
remove:
true);
2078 base.c_idMainElement = 0;
2083 SetElements(
id,
remove:
false);
2084 base.c_idMainElement =
id;
2087 base.isElemental =
true;
2090 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);
2094 void SetElements(
int idEle,
bool remove)
2154 base.c_idJob = idNew;
2182 int ele =
new int[9] { 30, 31, 33, 35, 35, 36, 34, 37, 39 }.RandomItem();
2186 Say(
"gain_bodyparts",
this,
Element.
Get(ele).GetName().ToLower());
2207 for (
int num =
body.
slots.Count - 1; num >= 0; num--)
2216 string[] array =
race.figure.Split(
'|');
2217 foreach (
string s
in array)
2230 string[] array =
race.figure.Split(
'|');
2231 foreach (
string s
in array)
2253 base.c_idRace = idNew;
2269 Debug.Log(
"Creating Replacement NPC for:" +
this);
2297 this.hostility = hostility2;
2299 base.c_summonDuration = 0;
2300 base.isSummon =
false;
2321 owner?.
Say(
"summon_vanish",
this);
2331 Hostility hostility2 = (base.c_originalHostility = (_master.IsPCFaction ? Hostility.Ally : _master.
hostility));
2332 this.hostility = hostility2;
2333 base.c_uidMaster = _master.
uid;
2334 base.c_minionType = type;
2353 base.c_uidMaster = 0;
2358 if (chara.
enemy ==
this)
2370 base.c_summonDuration = duration;
2371 base.isSummon =
true;
2418 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2437 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2442 if (cells[x, z].blocked)
2446 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2453 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2458 if (cells[x, z].blocked)
2462 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2488 if (detail !=
null && detail.
charas.Count > 0)
2523 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2533 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2538 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2545 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2550 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2581 List<Point> list =
new List<Point>();
2629 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2638 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2647 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2656 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2674 int num = p.x -
pos.
x;
2675 int num2 = p.z -
pos.
z;
2692 if (num == 0 && num2 == 0)
2702 return TryMove(point, allowDestroyPath:
false);
2711 if (!condition.
TryMove(newPoint))
2716 if (base.isRestrained)
2722 base.isRestrained =
false;
2724 if (!
CanMoveTo(newPoint, allowDestroyPath))
2728 return _Move(newPoint);
2779 EClass.player.lastZonePos =
null;
2782 for (
int i = 0; i < num2 * 4; i++)
2793 EClass.player.regionMoveWarned =
true;
2794 Msg.
Say(
"regionAbortMove");
2802 AddCondition<ConSuffocation>((
EClass.
pc.
Evalue(200) != 0) ? (2000 / (100 +
EvalueMax(200, -5) * 10)) : 30, force:
true);
2803 int num4 = GetCondition<ConSuffocation>()?.GetPhase() ?? 0;
2810 ModExp(200, 1 + num4 * 12);
2813 EClass.player.regionMoveWarned =
false;
2821 num = EClass.setting.defaultActPace * 3f;
2848 if (
CanMoveTo(randomNeighbor, allowDestroyPath:
false))
2850 newPoint = randomNeighbor;
2858 if (newPoint.
x !=
pos.
x || newPoint.
z !=
pos.
z)
2863 if (effect !=
null && effect.
id == 7)
2868 Say(
"abWeb_caught",
this);
2870 effect2.power = effect2.power * 3 / 4;
2874 Say(
"abWeb_pass",
this);
2883 else if ((newPoint.
x >
pos.
x && newPoint.
z >
pos.
z) || (newPoint.
x <
pos.
x && newPoint.
z <
pos.
z))
2898 traitDoor.TryOpenLock(
this);
2908 bool flag3 = EClass._zone.IsSnowCovered && !cell.HasRoof && !cell.
isClearSnow;
2911 bool flag4 = cell.IsTopWater && !cell.
isFloating;
2941 string text = ((flag2 || flag4) ?
"water" : tileRow.
soundFoot.IsEmpty(row.
soundFoot.IsEmpty(
"default")));
2942 if (cell.
obj != 0 && cell.
sourceObj.tileType.IsPlayFootSound && !cell.
matObj.soundFoot.IsEmpty())
2944 text = cell.
matObj.soundFoot;
2956 if (!text.IsEmpty())
2958 SoundManager.altLastData =
IsPC;
2965 bool flag5 = scene.actionMode.gameSpeed > 1f;
2966 scene.psFoot.transform.position = renderer.position + pcOrbit.
footPos;
2967 scene.psFoot.startColor = row.
matColor;
2971 scene.psSmoke.transform.position = renderer.position + pcOrbit.
smokePos;
2995 Say(
"replace_pc", chara, chara2);
3006 traitDoor2.TryOpen(
this);
3033 if (!
item.isThing ||
item.placeState != 0 ||
item.ignoreAutoPick)
3045 if ((dataPick.
noRotten &&
item.IsDecayed) || (dataPick.onlyRottable && item.trait.Decay == 0))
3062 foreach (
int cat
in dataPick.
cats)
3064 if (
item.category.uid == cat)
3070 else if (!dataPick.
flag.HasFlag(containerFlag))
3112 num5 = (int)Mathf.Abs((surfaceHeight - surfaceHeight2) * 100f);
3144 EClass.player.flags.isShoesOff =
false;
3151 EClass.player.flags.isShoesOff =
true;
3169 EClass._map.MineBlock(_p, recoverBlock: false, this);
3172 EClass._map.MineObj(_p, null, this);
3178 EClass._map.MineObj(_p, null, this);
3185 if (t.isNPCProperty && t.trait.CanBeDestroyed)
3191 t.SetPlaceState(PlaceState.roaming);
3207 if (list.Count == 0)
3211 list.Copy().ForeachReverse(delegate(
Chara c)
3215 List<Point> list2 = new List<Point>();
3216 for (int i = point.x - 1; i <= point.x + 1; i++)
3218 for (int j = point.z - 1; j <= point.z + 1; j++)
3220 if (i != point.x || j != point.z)
3222 Point point2 = new Point(i, j);
3223 if (point2.IsValid && !point2.HasChara && !point2.IsBlocked && !point2.cell.hasDoor && !point2.IsBlockByHeight(point))
3230 if (list2.Count > 0)
3232 if (list2.Count > 1)
3234 list2.ForeachReverse(delegate(Point p)
3236 if (p.Equals(new Point(point.x + point.x - pos.x, point.z + point.z - pos.z)))
3242 Point newPoint = list2.RandomItem();
3245 Say(
"displace",
this, c);
3255 int num =
EClass.
rndHalf(10 + Mathf.Min(GetCurrency() / 100, 1000));
3257 Say(
"pushed_money",
this, c);
3322 if (z == currentZone)
3326 if (HasCondition<ConInvulnerable>())
3328 RemoveCondition<ConInvulnerable>();
3332 EClass.player.nextZone = z;
3340 EClass.player.returnInfo.turns += 5;
3347 EClass.player.deathZoneMove =
false;
3349 currentZone.events.OnLeaveZone();
3350 if (currentZone.instance !=
null)
3364 EClass.player.uidLastZone = currentZone.uid;
3367 if (currentZone.IsRegion)
3375 Msg.
Say(
"leaveZone", currentZone.Name);
3377 else if (z.
id != currentZone.id)
3381 EClass.player.lastZonePos = pos.Copy();
3383 EClass.player.lastTransition = transition;
3395 if (party !=
null && party.
leader ==
this)
3407 Debug.Log(base.Name);
3410 transition.uidLastZone = currentZone?.uid ?? 0;
3411 global.transition = transition;
3415 global.transition =
null;
3418 EClass.player.lastTransition =
null;
3421 if (IsBranchMember())
3432 public void MoveHome(
string id,
int x = -1,
int z = -1)
3447 CureCondition<ConSuspend>();
3474 orgPos =
new Point(x, z);
3475 if (factionBranch !=
null)
3477 RefreshWorkElements();
3489 state = ZoneTransition.EnterState.Fall,
3499 renderer.RefreshSprite();
3502 public override void Rotate(
bool reverse =
false)
3504 if (renderer.hasActor)
3506 base.dir = (base.dir + ((!reverse) ? 1 : (-1))).Clamp(0, 3, loop:
true);
3510 base.dir = ((base.dir == 0) ? 1 : 0);
3513 renderer.RefreshSprite();
3523 angle =
Util.GetAngle(p.
x - pos.x, p.
z - pos.z);
3526 if (angle > 100f && angle < 170f)
3530 else if (angle > 170f && angle < 190f)
3534 else if (angle > 190f || (angle < -10f && angle > -100f))
3544 else if (angle > 170f && angle < 235f)
3548 else if (angle > 80f && angle < 145f)
3552 else if (angle > -100f && angle < -35f)
3556 else if (angle > -10f && angle < 55f)
3560 renderer.RefreshSprite();
3571 else if (base.dir == 1)
3575 else if (base.dir == 2)
3579 else if (base.dir == 3)
3584 else if (base.dir == 0)
3588 else if (base.dir == 1)
3592 else if (base.dir == 2)
3596 else if (base.dir == 3)
3605 if (!renderer.hasActor)
3607 if (angle == 0f || angle == 45f || angle == 90f)
3611 if (angle == -135f || angle == 180f || angle == -90f)
3621 return renderer.actor.currentDir;
3627 for (
int i = -num; i < num + 1; i++)
3629 for (
int j = -num; j < num + 1; j++)
3631 shared.
Set(pos.x + i, pos.z + j);
3642 for (
int num = conditions.Count - 1; num >= 0; num--)
3644 if (conditions[num].ConsumeTurn)
3654 if (_cooldowns !=
null)
3659 consumeTurn =
false;
3660 preventRegen =
false;
3661 emoIcon =
Emo2.none;
3664 base.c_summonDuration--;
3665 if (base.c_summonDuration <= 0)
3673 AddCondition<ConWet>(20);
3678 happiness = (hunger.value + stamina.value + depression.value + bladder.value + hygiene.
value) / 5;
3683 if (
EClass.
rnd(2) == 0 && !HasCondition<ConAwakening>())
3698 if (parasite !=
null)
3700 ModExp(227, (
EClass.
_zone.
IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(227) - parasite.
LV) * 25));
3704 ModExp(226, (
EClass.
_zone.
IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(226) - ride.
LV) * 25));
3711 num = ((!IsPC) ? ((phase > 3) ? 50 : 0) : ((phase > 3) ? 50 : 0));
3720 if (isWeakToSunlight && pos.IsSunLit)
3722 AddCondition<ConBurning>(1000, force:
true);
3726 if (turn % 200 == 0)
3728 DiminishTempElements();
3740 preventRegen =
true;
3744 Say(
"dmgBurden",
this);
3745 DamageHP(MaxHP * (base.ChildrenWeight * 100 / WeightLimit) / 1000 + 1,
AttackSource.Burden);
3757 ModExp(207, 1 + phase2 * phase2);
3785 preventRegen =
true;
3789 if (
EClass.
rnd(100) == 0 && !isConfused)
3792 AddCondition<ConConfuse>(500);
3797 AddCondition<ConBlind>(200);
3800 if (turn % (200000 / Mathf.Max(100 + Evalue(409) * 10, 50)) == 0)
3808 int num2 = Evalue(409);
3809 if (num2 > 0 && turn % (200000 / Mathf.Max(100 + num2 * 10, 50)) == 0)
3814 for (
int num3 = conditions.Count - 1; num3 >= 0; num3--)
3816 if (num3 < conditions.Count)
3831 preventRegen =
true;
3844 if (
id ==
"tsunami")
3846 if (elements.Base(79) < 30)
3853 elements.SetTo(79, elements.Base(79) * 3 / 4);
3858 if (
EClass.
rnd(25) == 0 && base.hp < MaxHP)
3860 HealHP(
EClass.
rnd(Evalue(300) / 3 + 1) + 1);
3861 elements.ModExp(300, 8f);
3866 elements.ModExp(301, 8f);
3885 if (parasite !=
null)
3897 Debug.LogError(
"exception: pos is not valid:" + pos?.ToString() +
"/" +
this);
3908 ignoreSPAbsorb =
false;
3911 if (hasMovedThisTurn)
3913 pos.Things.ForeachReverse(delegate(
Thing t)
3917 AI_Goto aI_Goto = ai.Current as AI_Goto;
3918 if ((aI_Goto == null && !(ai is GoalManualMove)) || (aI_Goto != null && !aI_Goto.dest.Equals(pos)))
3929 hasMovedThisTurn =
false;
3932 EClass.player.haltMove =
false;
3966 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
3977 if (!tileInfo.
shore)
3982 int num2 = (tileInfo.isRoad ? 22 : 12);
3985 num2 = (tileInfo.isRoad ? 16 : 10);
3989 num2 *= (flag2 ? 2 : 20);
4000 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
4013 EClass.player.pickupDelay = 0f;
4021 EClass.player.returnInfo =
null;
4044 Msg.
Say(
"returnComplete");
4045 EClass.player.uidLastTravelZone = 0;
4047 EClass.player.lastZonePos =
null;
4049 EClass.player.returnInfo =
null;
4052 EClass.player.returnInfo =
null;
4053 Msg.
Say(
"returnOverweight");
4057 if ((HasNoGoal || !ai.
IsRunning) && !WillConsumeTurn())
4065 RecipeUpdater.dirty =
true;
4071 actTime = EClass.player.baseActTime * Mathf.Max(0.1f, (
float)
EClass.
pc.
Speed / (
float)Speed);
4072 hasMovedThisTurn =
false;
4075 if (!IsAliveInCurrentZone)
4079 renderer.RefreshStateIcon();
4080 if (host !=
null && !consumeTurn)
4082 if (host.
ride ==
this && ((host.
hasMovedThisTurn && IsInCombat) || (enemy !=
null && turn % 3 != 0)))
4088 if (Dist(enemy) < 3 &&
EClass.
rnd(2) == 0)
4090 Say(
"parasite_fail",
this, host);
4091 if (
EClass.
rnd(2) == 0 && GetInt(106) == 0)
4093 Talk(
"parasite_fail");
4108 if (base.isRestrained)
4129 Cell cell = base.Cell;
4132 AddCondition<ConWet>(50);
4133 if (pos.IsHotSpring)
4140 AddCondition<ConSuffocation>(800 / (100 + EvalueMax(200, -5) * 10), force:
true);
4156 AddCondition<ConWet>(50);
4160 PlaySound(
"fire_step");
4161 AddCondition<ConBurning>(30);
4166 PlaySound(
"bubble");
4167 AddCondition<ConWet>(30);
4172 if (hasMovedThisTurn)
4174 Say(
"abMistOfDarkness_step",
this);
4197 aliasEle = EClass.sources.elements.map[e.idEle].alias,
4226 if (rootCard !=
this && things.IsFull(c.
Thing))
4233 public void PickOrDrop(
Point p,
string idThing,
int idMat = -1,
int num = 1,
bool msg =
true)
4243 if (things.GetDest(t).IsValid)
4264 t = TryPoisonPotion(t);
4272 Say(
"backpack_full_drop", t);
4279 Say(
"backpack_full", t);
4283 if (dest.
stack !=
null)
4287 PlaySound(
"pick_thing");
4288 Say(
"pick_thing",
this, t);
4296 PlaySound(
"pick_thing");
4297 Say(
"pick_thing",
this, t);
4299 TryReservePickupTutorial(t);
4309 Say(
"poisonDrip",
this);
4323 Say(
"absorbRod",
this, t);
4326 if (
rod.source !=
null)
4329 if (enumerator.MoveNext())
4361 if (t.
id ==
"pasture")
4373 foreach (
Card item in pos.ListCards())
4378 if (thing !=
null && !IsPC)
4380 thing.isNPCProperty =
true;
4425 t.isNPCProperty =
false;
4427 pos.TryWitnessCrime(
this);
4436 EClass.player.altHeldPos = t.renderer.data.ForceAltHeldPosition ||
EClass.
rnd(2) == 0;
4440 if (num == -1 || num > t.
Num)
4451 t =
Pick(t.
Thing, msg:
false, tryStack:
false);
4465 WidgetHotbar.dirtyCurrentItem =
true;
4476 if (IsPC && held.
invY == 1)
4478 WidgetHotbar.dirtyCurrentItem =
true;
4490 Say(
"canOnlyCarry", held);
4495 if (!flag && things.IsOverflowing())
4499 Say(
"backpack_full_drop", held);
4507 PlaySound(
"pick_thing");
4508 Say(
"pick_held",
this,
card);
4509 if (IsPC &&
card.id ==
"statue_weird")
4516 WidgetHotbar.dirtyCurrentItem =
true;
4531 return held.
Split(a);
4554 WidgetHotbar.dirtyCurrentItem =
true;
4559 if (
card.trait.CanOnlyCarry)
4570 Msg.
Say(
"markedImportant");
4585 t.ignoreAutoPick =
true;
4596 int num = Evalue(131);
4597 int num2 = Evalue(130);
4598 int num3 = Evalue(123);
4599 if (num > num2 && num > num3)
4603 if (num2 > num && num2 > num3)
4607 if (num3 > num && num3 > num2)
4621 if (elements.Value(122) > elements.Value(120))
4623 return elements.GetElement(122);
4625 return elements.GetElement(120);
4630 isOnCreate = onCreate;
4635 RestockInventory(onCreate);
4640 string equip = source.
equip;
4641 if (equip.IsEmpty())
4645 if (equip ==
"none")
4656 EQ_ID(
"staff_long", 1);
4664 EQ_ID(
"tail_snowleopard");
4670 EQ_ID(
"sword_zephir");
4673 case "adv_mesherada":
4676 EQ_ID(
"dagger_hathaway");
4682 EQ_ID(
"staff_long", -1,
Rarity.Legendary);
4686 EQ_ID(
"cloak_wing", -1,
Rarity.Mythical);
4692 EQ_ID(
"sword_muramasa");
4698 EQ_ID(
"dagger_gaki");
4702 EQ_ID(
"dagger_ninto");
4706 EQ_ID(
"dagger", -1,
Rarity.Legendary);
4712 EQ_ID(
"staff_Cat", -1,
Rarity.Mythical);
4723 AddThing(
"gun_gravity2");
4729 AddThing(
"bow_vindale");
4735 EQ_ID(
"EtherDagger2");
4738 case "keeper_garden":
4741 EQ_ID(
"sword_ragnarok");
4747 EQ_ID(
"axe_destruction");
4753 EQ_ID(
"ribbon_duponne");
4759 EQ_ID(
"helm_seeker");
4762 EQ_ID(
"sword_katana");
4764 EQ_ID(
"sword_katana");
4767 EQ_ID(
"boots_seven");
4771 for (
int i = 0; i < 20; i++)
4776 AddThing(
"plat").SetNum(6);
4782 AddThing(
"guitar_efrond");
4788 AddThing(
"guitar_ash");
4794 EQ_ID(
"EtherDagger");
4802 thing.rarity =
Rarity.Normal;
4812 if (!TryEquipRanged())
4819 AddThing(
"gun_laser");
4823 Thing thing2 = AddThing(
"panzerfaust");
4832 EQ_CAT((
EClass.
rnd(4) == 0) ?
"crossbow" :
"bow");
4842 int num = ((base.rarity >=
Rarity.Mythical) ? (base.LV * 3) : ((base.rarity >=
Rarity.Legendary) ? (base.LV * 2) : base.LV));
4847 if (race.
id ==
"asura")
4849 for (
int j = 0; j < 4; j++)
4851 EQ_CAT(job.
weapon.RandomItem());
4854 for (
int k = 0; k < ((!(race.id ==
"mutant")) ? 1 : (2 + base.LV / 30)); k++)
4862 else if (!job.
weapon.IsEmpty())
4866 EQ_CAT(job.
weapon.RandomItem());
4868 if (race.
id ==
"mutant" || (Evalue(131) > 0 &&
EClass.
rnd(2) == 0))
4870 EQ_CAT(job.
weapon.RandomItem());
4913 EQ_ID(
"shield_lute");
4916 if (HasTag(
CTAG.shield))
4927 if (ShouldRestock(
"_meat"))
4933 Restock(
"book_story", 1);
4935 case "rock_thrower":
4943 Restock(
"book_story_home", 1);
4948 void Restock(
string id,
int num)
4950 if (ShouldRestock(
id))
4955 bool ShouldRestock(
string id)
4957 return things.Find(
id) ==
null;
4965 int num = ((base.LV >= 1000) ? 7 : ((base.LV >= 500) ? 5 : ((base.LV >= 250) ? 3 : ((base.LV >= 100) ? 2 : ((base.LV >= 50) ? 1 : 0)))));
4966 Rarity rarity2 = base.rarity;
4967 if (
id ==
"big_sister")
4969 num = (isOnCreate ? 8 : 4);
4977 rarity =
Rarity.Superior;
4979 else if (rarity2 ==
Rarity.Legendary)
4983 else if (rarity2 >=
Rarity.Mythical)
4989 rarity =
Rarity.Legendary;
4991 CardBlueprint.current.rarity = rarity;
4999 CardBlueprint.current.rarity = r;
5002 if (body.
GetSlot(thing, onlyEmpty:
true) ==
null)
5007 if (!body.
Equip(thing))
5018 if ((slot == 0 || bodySlot !=
null) && (slot != 37 || !HasElement(1209)))
5023 if (bodySlot !=
null && !body.
Equip(thing, bodySlot))
5060 if (!IsPC && (!trait.CanJoinPartyResident || !trait.CanJoinParty || memberType != 0))
5064 Msg.
Say(
"returnHome",
this, homeZone.Name);
5081 base.hp = MaxHP / 3;
5084 if (hunger.
value > 30)
5088 sleepiness.value = 0;
5089 hostility = OriginalHostility;
5090 RemoveCondition<StanceTaunt>();
5091 if (
id ==
"keeper_garden")
5099 Msg.
Say(
"noDeathPenalty2",
this);
5103 Msg.
Say(
"noDeathPenalty",
this);
5109 List<Thing> dropList =
new List<Thing>();
5114 t.ignoreAutoPick = true;
5117 }, onlyAccessible:
false);
5123 EClass.player.preventDeathPenalty =
false;
5125 if (IsPCFaction && homeBranch !=
null)
5127 homeBranch.
Log(
"bRevive",
this);
5140 PlayEffect(
"revive");
5142 SetCensored(enable:
false);
5148 ModCorruption(-100000);
5149 if (base.LV < 10000000)
5151 SetLv(base.LV * 10 + 9);
5155 mana.value = mana.
max;
5156 stamina.value = stamina.
max;
5164 List<string> list =
new List<string> {
"930",
"931",
"947",
"948",
"949",
"950",
"951",
"952" };
5167 list =
new List<string> {
"944",
"946",
"backerGrave",
"backerGrave2" };
5171 if (!lastword.IsEmpty())
5173 thing.c_note = lastword;
5175 thing.isModified =
true;
5221 if (HasCondition<ConAnorexia>())
5227 else if (base.c_vomit > 10)
5229 AddCondition<ConAnorexia>();
5231 AddCondition<ConDim>();
5232 if (HasCondition<ConAnorexia>())
5246 if (isDead || host !=
null)
5250 bool isInActiveZone = IsInActiveZone;
5259 if (
id ==
"tsunami")
5261 pos.PlaySound(
"water");
5265 Say(
"summon_vanish",
this);
5266 pos.PlayEffect(
"vanish");
5267 pos.PlaySound(
"vanish");
5282 PlayEffect(
"revive");
5283 PlaySound(
"chime_angel");
5290 PlaySound(base.material.GetSoundDead(source));
5292 renderer.RefreshSprite();
5293 renderer.RefreshStateIcon();
5298 string text2 = ((origin ==
null) ?
"" : origin.GetName(
NameStyle.Full));
5301 text =
"dead_" + attackSource;
5307 text =
"dead_" + e.
source.alias;
5316 EClass._zone.isDeathLocation =
true;
5317 string s = ((origin ==
null) ? text :
"dead_by");
5329 AI_PlayMusic.keepPlaying =
false;
5335 Msg.
Say(
"goto_heaven",
this);
5339 if (originalTarget !=
null || origin ==
null || !origin.isSynced || (attackSource !=
AttackSource.Melee && attackSource !=
AttackSource.Range))
5341 Msg.
Say(text,
this,
"", text2);
5343 string text3 = TalkTopic(
"dead");
5344 if (!text3.IsEmpty())
5346 text3 = text3.StripBrackets();
5348 bool flag = base.rarity >= Rarity.Legendary && !IsPCFaction;
5363 if (homeBranch !=
null)
5365 homeBranch.
Log(text,
this,
"");
5377 if (
id ==
"mandrake" || HasElement(488))
5379 Say(
"a_scream",
this);
5384 ClearTempElements();
5387 base.isSale =
false;
5399 EClass.player.returnInfo =
null;
5400 EClass.player.uidLastTravelZone = 0;
5409 chara3.enemy =
null;
5414 EClass.player.preventDeathPenalty =
true;
5419 bool flag2 = currentZone.IsActiveZone && IsLocalChara && !currentZone.IsPCFaction;
5428 currentZone.RemoveCard(
this);
5430 if ((origin !=
null && origin.IsPCParty) || IsPCFaction)
5433 if (IsPCFaction && !IsPCParty && (origin ==
null || !origin.IsPCParty))
5437 ModAffinity(
EClass.
pc, a, show:
false);
5439 if (!(text4 ==
"quru"))
5441 if (text4 ==
"corgon")
5453 if (origin.IsPCParty || origin.IsPCPartyMinion)
5456 if (OriginalHostility >=
Hostility.Friend && IsHuman && !base.IsPCFactionOrMinion)
5460 else if (race.
id ==
"cat" && OriginalHostility >=
Hostility.Neutral)
5467 num = num * 30 / 100;
5478 else if (origin.IsPCFaction)
5480 origin.Chara.ModAffinity(
EClass.
pc, 1, show:
false);
5481 origin.Chara.ShowEmo(
Emo.love);
5484 if (base.sourceBacker !=
null && origin !=
null && origin.IsPCParty)
5488 if (base.IsPCFactionOrMinion)
5492 Msg.
Say(
"abort_allyDead");
5497 Msg.
Say(
"abort_enemyDead");
5499 if (IsPCParty && !IsPC)
5502 base.c_wasInPcParty =
true;
5508 if (attackSource !=
AttackSource.DeathSentense && !IsPCFaction)
5510 EClass.player.flags.little_killed =
true;
5523 case "shark_sister":
5532 if (attackSource ==
AttackSource.Finish && origin !=
null && origin.Evalue(665) > 0)
5536 if (chara2.
LV < base.LV)
5538 chara2.
SetLv(base.LV);
5540 chara2.
MakeMinion((origin.IsPCParty || origin.IsPCPartyMinion) ? EClass.pc : origin.Chara,
MinionType.Friend);
5541 Msg.
Say(
"plant_pop",
this, chara2);
5548 if (IsPCFaction || IsPCFactionMinion)
5555 Point point = pos.
GetNearestPoint(allowBlock:
true, allowChara:
false, allowInstalled:
false, ignoreCenter:
true) ?? pos;
5561 flag = (flag2 =
true);
5562 EClass._zone.Boss =
null;
5567 EClass.player.flags.KilledBossInVoid =
true;
5573 SE.Play(
"Jingle/fanfare2");
5583 flag = (flag2 =
true);
5595 flag = (flag2 =
true);
5600 EClass.player.flags.killedDuponne =
true;
5606 flag = (flag2 =
true);
5612 case "melilith_boss":
5614 flag = (flag2 =
true);
5621 if (questCurry !=
null)
5624 flag = (flag2 =
true);
5634 bool num2 =
EClass.
_map.
FindChara((
id ==
"fairy_raina") ?
"fairy_poina" :
"fairy_raina") ==
null;
5636 if (num2 && questNasu !=
null && questNasu.
phase <= 1)
5638 if (questNasu.
phase == 0)
5643 flag = (flag2 =
true);
5654 flag = (flag2 =
true);
5656 if (questExploration !=
null)
5658 SE.Play(
"kill_boss");
5668 SE.Play(
"kill_boss");
5669 SoundManager.ForceBGM();
5675 SE.Play(
"kill_boss");
5689 EClass.player.willAutoSave =
true;
5702 public void Kick(
Point p,
bool ignoreSelf =
false,
bool checkWall =
true)
5706 Kick(
item, ignoreSelf, karmaLoss:
true, show:
true, checkWall);
5710 public void Kick(
Chara t,
bool ignoreSelf =
false,
bool karmaLoss =
true,
bool show =
true,
bool checkWall =
true)
5712 if (!IsAliveInCurrentZone)
5738 Say(
"kick",
this, t);
5758 return UseAbility(elements.GetElement(idAct)?.act ??
ACT.
Create(idAct), tc, pos, pt);
5763 if (HasCooldown(a.
id))
5767 if (a.
source.proc.TryGet(0) ==
"Heal" && HasElement(1422) && !IsPC)
5769 List<int> list =
new List<int> { 8400, 8401, 8402, 8403, 8404, 8405 };
5770 int num = list.IndexOf(a.
id);
5773 int num2 = list.TryGet(num + Evalue(1422));
5774 a = elements.GetElement(num2)?.
act ??
ACT.
Create(num2);
5783 if (IsPC && HasCondition<StanceManaCost>())
5785 num4 = Evalue(1657);
5797 ForeachEnemy(delegate
5804 ForeachParty(delegate
5820 num5 = (IsPC ? (i * 100) : (50 + i * 50));
5822 int num6 = cost.cost * num5 / 100;
5825 num6 = num6 * 100 / (100 + (int)Mathf.Sqrt(Evalue(483) * 10) * 3);
5835 if (!IsPC && cost.
type ==
Act.
CostType.MP && mana.
value < 0 && (
EClass.
rnd(4) != 0 || IsPCFaction || (base.IsPowerful && mana.value < -20)))
5843 ActPlan.warning =
true;
5846 if (UseAbility(a, tc, pos, pt))
5855 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))
5857 Say(
"shakeHead",
this);
5860 if (tc !=
null && tc !=
this)
5864 if (pos !=
null && !base.pos.Equals(pos))
5870 num3 = 1 + Evalue(1648);
5872 if (IsPC && cost.
cost > 0 && a.
Value == 0)
5879 string s = (isConfused ?
"_cast_confuse" : (HasCondition<ConDim>() ?
"_cast_dim" :
""));
5880 if (!a.
source.tag.Contains(
"useHand"))
5882 Say(race.
castStyle.IsEmpty(
"cast"),
this, a.
source.GetName().ToLower(), s.lang());
5895 a.vPotential -= i * 2;
5896 num6 = num6 * (100 - num4 * 20) / 100;
5905 else if (a.
source.langAct.Length != 0 && tc !=
null)
5907 string text = a.
source.langAct[0];
5908 string text2 = ((a.source.langAct.Length >= 2) ? a.
source.langAct[1] :
"");
5909 if (text ==
"spell_hand")
5912 string @ref = text2.lang(list2[4]);
5913 Say(tc.IsPCParty ?
"cast_hand_ally" :
"cast_hand",
this, tc, @ref, tc.IsPCParty ? list2[1] : list2[2]);
5917 Say(text,
this, tc, text2.IsEmpty() ?
"" : text2.lang());
5921 Talk(
"insult_" + (base.IsMale ?
"m" :
"f"));
5927 if (Evalue(1421) >= 2 && base.hp <= MaxHP / (9 - Evalue(1421) * 2))
5937 elements.ModExp(304, Mathf.Clamp(num6 * 2, 1, 200));
5941 ignoreSPAbsorb =
true;
5944 if (a is
Spell && GetCondition<ConSilence>() !=
null)
5946 Say(
"cast_silence",
this);
5953 int spellExp = elements.GetSpellExp(
this, a, num5);
5956 Say(
"fizzle",
this);
5957 PlayEffect(
"fizzle");
5958 PlaySound(
"fizzle");
5961 ModExp(a.
id, spellExp / 5);
5963 RemoveCondition<ConInvisibility>();
5967 if (HasTalk(
"phrase_" + a.
source.alias))
5969 EClass.player.forceTalk =
true;
5970 Talk(
"phrase_" + a.
source.alias);
5977 ForeachEnemy(delegate(
Chara c)
5984 ForeachParty(delegate(
Chara c)
5989 Act.forcePt =
false;
5993 for (
int j = 0; j < num3; j++)
5999 ActEffect.RapidCount = j;
6001 flag2 = a.
Perform(
this, tc, pos);
6004 if (flag2 && !isDead)
6008 ModExp(a.
id, spellExp);
6010 if (a.
source.alias.StartsWith(
"sword_"))
6015 ActEffect.RapidCount = 0;
6016 if (a.
source.cooldown > 0 && (!IsPC || !a.
source.tag.Contains(
"CD_npc")))
6018 AddCooldown(a.
id, a.
source.cooldown);
6020 if (flag2 && !a.
source.tag.Contains(
"keepInvisi") &&
EClass.
rnd(2) == 0)
6022 RemoveCondition<ConInvisibility>();
6025 void ForeachEnemy(Action<Chara> action)
6027 if (_pts.Count == 0)
6032 if (chara3 !=
this && CanSeeLos(chara3) && chara3.
IsHostile(
this))
6038 for (
int num11 = _pts.Count - 1; num11 >= 0; num11--)
6040 action(_pts[num11]);
6043 void ForeachParty(Action<Chara> action)
6045 if (_pts.Count == 0)
6052 if (chara ==
this || chara.
host !=
null || CanSeeLos(chara))
6063 if ((chara2 ==
this || (chara2.
IsFriendOrAbove(
this) && CanSeeLos(chara2))) && (chara2 == tc || _pts.Count < 3 ||
EClass.
rnd(_pts.Count * _pts.Count) > 6))
6070 for (
int num9 = _pts.Count - 1; num9 >= 0; num9--)
6081 return 25 + Evalue(226) * 125 / 100;
6097 if (host.
ride ==
this)
6099 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
EvalueRiding()));
6103 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
Evalue(227)));
6108 int num3 = Evalue(304);
6111 num3 = Mathf.Max(num3, base.LV + 5);
6115 bool num6 = GetArmorSkill() == 122;
6119 num4 = 20 - Evalue(122) / 5;
6120 num5 += 10 - Evalue(1654) * 4;
6124 num4 = 10 - Evalue(120) / 5;
6134 if (parasite !=
null)
6145 num5 += 20 - Evalue(1654) * 8;
6151 if (HasCondition<ConDim>())
6153 num4 += ((Evalue(1654) >= 3) ? 1500 : 2500);
6163 return Mathf.Clamp(100 + e.
Value - 10 - e.
source.LV * e.
source.cost[0] * num4 / Mathf.Max(10 + num3 * 10, 1), 0, 100 - num5);
6166 public void DoAI(
int wait, Action onPerform)
6181 Say(headpat ?
"headpat" :
"cuddle",
this, c);
6187 if (headpat &&
this != c)
6198 if (!member.
IsPC && CanSeeLos(member))
6208 if (c.
id ==
"hedgehog_ether")
6212 Say(
"reflect_thorne", c,
this);
6244 if (enemy ==
null && !IsPC)
6246 if (GetInt(106) == 0)
6250 if (OriginalHostility !=
Hostility.Enemy)
6254 SetEnemy(_tg.
Chara);
6268 if (_tg ==
null || !_tg.
isChara)
6275 EClass.pc.combatCount = 10;
6283 chara.
Say(
"frown",
this, chara);
6295 chara.
Say(
"frown",
this, chara);
6302 bool flag = chara.id ==
"fanatic";
6305 chara.
Say(
"callHelp", chara);
6377 bool flag = enemy !=
null || ai is
GoalCombat;
6378 int num = (base.PER + Evalue(210) * 2) * ((!flag) ? 1 : 2);
6380 bool flag3 = !IsPCParty;
6386 if (chara2 ==
this || !IsHostile(chara2) || !CanSee(chara2))
6390 int num3 = Dist(chara2);
6391 int num4 = GetSightRadius() + (flag ? 1 : 0);
6398 if (
this == pos.FirstChara)
6400 chara2.
ModExp(152, Mathf.Clamp((num - chara2.
Evalue(152)) / 2, 1, Mathf.Max(30 - stealthSeen * 2, 1)));
6408 DoHostileAction(chara2);
6421 DoHostileAction(chara);
6433 if (chara !=
this && chara != enemy && IsHostile(chara) && Dist(chara) <= 1 && CanInteractTo(chara.
pos))
6435 DoHostileAction(chara);
6454 if (base.IsPCFactionOrMinion)
6467 if (OriginalHostility >=
Hostility.Friend)
6512 return EClass.game.activeZone == currentZone;
6519 foreach (
Point item2
in item.ListPoints())
6521 if (pos.Equals(item2))
6542 if (base.IsPCFactionOrMinion || IsFriendOrAbove())
6566 charaRenderer.pccData = PCCData.Create(
"ride");
6567 string idPart = base.c_idRidePCC.IsEmpty(
EClass.
core.
pccs.sets[
"ride"].map[
"body"].map.Keys.First());
6568 charaRenderer.
pccData.SetPart(
"body",
"ride", idPart);
6569 charaRenderer.pccData.ride =
EClass.
core.
pccs.GetRideData(idPart);
6573 foreach (
Condition condition
in conditions)
6576 if (rendererReplacer !=
null)
6578 charaRenderer.replacer = rendererReplacer;
6579 charaRenderer.data = rendererReplacer.
data;
6583 if (charaRenderer.
replacer ==
null)
6585 charaRenderer.pccData = pccData;
6588 renderer = charaRenderer;
6590 if (cardRenderer !=
null)
6592 renderer.SetFirst(first:
false, cardRenderer.
position);
6594 return charaRenderer;
6601 PCC.Get(pccData).Build(state);
6609 PCC pCC = PCC.Get(pccData);
6611 return pCC.variation.idle[0, 0];
6613 if (spriteReplacer !=
null)
6617 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);
6638 else if (conSleep !=
null && host ==
null && pos.Equals(
EClass.
pc.
pos) && IsHuman && (GetBool(123) || affinity.
CanSleepBeside()))
6647 p.mat = base.material;
6648 p.matColor = base.colorInt;
6649 if (!renderer.usePass)
6653 if (renderer.replacer !=
null)
6655 p.tile = renderer.replacer.tile * ((!flipX) ? 1 : (-1));
6661 int num = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % source.
_tiles_snow.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6666 p.tile = source.
_tiles_snow[0] * ((!flipX) ? 1 : (-1));
6669 else if (sourceCard.
_tiles.Length > 1)
6671 int num2 = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % sourceCard.
_tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6672 p.tile = sourceCard.
_tiles[(num2 >= 0 && num2 < sourceCard.
_tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
6676 p.tile = sourceCard.
_tiles[0] * ((!flipX) ? 1 : (-1));
6683 string text = base.Name;
6684 if (IsFriendOrAbove())
6688 else if (IsHostile())
6694 if (base.LV >= lV * 5)
6698 else if (base.LV >= lV * 2)
6702 else if (base.LV <= lV / 4)
6706 else if (base.LV <= lV / 2)
6712 string s = (IsFriendOrAbove() ?
"HostilityAlly" : (IsNeutral() ?
"HostilityNeutral" :
"HostilityEnemy"));
6713 s = (
" (" + s.lang() +
") ").TagSize(14);
6717 s += (
" (" +
"guest".lang() +
") ").TagSize(14);
6721 s += (
" (" +
"livestock".lang() +
") ").TagSize(14);
6727 text2 +=
"lowerGround".lang();
6729 else if (HasHigherGround(
EClass.
pc))
6731 text2 +=
"higherGround".lang();
6734 if (Evalue(1232) > 0)
6736 text2 =
"milkBaby".lang().TagSize(14) + text2;
6740 text2 =
"hasBounty".lang().TagSize(14) + text2;
6744 text2 += (
"(" + faith.Name +
")").TagSize(14);
6746 return text + text2 + s;
6754 text += Environment.NewLine;
6755 text = text +
"<size=14>" +
"favgift".lang(GetFavCat().GetName().ToLower(), GetFavFood().GetName()) +
"</size>";
6760 text2 += Environment.NewLine;
6761 text2 = text2 +
"Lv:" + base.LV +
" HP:" + base.hp +
"/" + MaxHP +
" MP:" + mana.value +
"/" + mana.max +
" DV:" + DV +
" PV:" + PV +
" Hunger:" + hunger.
value;
6762 text2 += Environment.NewLine;
6764 text2 += Environment.NewLine;
6765 text2 = text2 + base.uid + IsMinion +
"/" + base.c_uidMaster +
"/" + master;
6766 text2 = text2 +
" dir:" + base.dir +
" skin:" + base.idSkin +
" scaled:" + base.
isScaled;
6770 text2 += Environment.NewLine;
6771 text2 +=
"<size=14>";
6774 text2 = text2 + item.Name +
", ";
6776 foreach (
Hobby item2
in ListHobbies())
6778 text2 = text2 + item2.Name +
", ";
6780 text2 = text2.TrimEnd(
", ".ToCharArray()) +
"</size>";
6783 IEnumerable<BaseStats> enumerable = conditions.Concat((!IsPCFaction) ?
new BaseStats[0] :
new BaseStats[2] { hunger, stamina });
6784 if (enumerable.Count() > 0)
6786 text3 += Environment.NewLine;
6787 text3 +=
"<size=14>";
6792 if (text4.IsEmpty() || text4 ==
"#")
6797 switch (item3.
source.group)
6810 text4 = text4 +
"(" + item3.
GetValue() +
")";
6811 if (resistCon !=
null && resistCon.ContainsKey(item3.
id))
6813 text4 = text4 +
"{" + resistCon[item3.
id] +
"}";
6817 text3 = text3 + text4.TagColor(c) +
", ";
6826 text3 = text3.TrimEnd(
", ".ToCharArray()) +
"</size>";
6831 text3 += Environment.NewLine;
6834 text3 = text3 + item4.act.Name +
", ";
6836 text3 = text3.TrimEnd(
", ".ToCharArray());
6838 return text + text2 + text3;
6843 string key = source.
idText.IsEmpty(
id);
6853 string text = row.GetText(topic, returnNull:
true);
6858 if (text.StartsWith(
"@"))
6865 text = row.GetText(topic, returnNull:
true);
6871 return text.Split(Environment.NewLine.ToCharArray()).RandomItem();
6876 if (host ==
null && !IsInActiveZone)
6880 if (!isSynced && (host ==
null || !host.
isSynced) && topic !=
"dead")
6886 int num = EClass.pc.party.members.Count - 1;
6911 string topicText = GetTopicText(topic);
6912 if (topicText.IsEmpty())
6916 string text =
"_bracketTalk".lang();
6917 bool flag = topicText.StartsWith(
"*");
6918 bool flag2 = topicText.StartsWith(
"(");
6919 bool flag3 = topicText.StartsWith(text) || (topicText.Length > 0 && topicText[0] == text[0]) || topicText[0] ==
'“';
6920 topicText = ApplyTone(topicText);
6921 topicText = topicText.Replace(
"~",
"*");
6923 Msg.
Say(topicText.Replace(
"&",
""));
6924 if (topic ==
"dead")
6928 else if (flag || flag3 || flag2)
6930 (host ??
this).renderer.Say(ApplyNewLine(topicText.StripBrackets()),
default(
Color), IsPCParty ? 0.6f : 0f);
6948 if (conSuspend !=
null && IsPCParty)
6950 RemoveCondition<ConSuspend>();
6954 if (IsDeadOrSleeping)
6956 ShowDialog(
"_chara",
"sleep");
6961 ShowDialog(
"_chara",
"invisible");
6967 ShowDialog(
"_chara",
"give_card");
6976 if (GetInt(71) == -2)
6978 ShowDialog(
"_chara",
"give_lunch");
6984 if (base.isRestrained)
6986 ShowDialog(
"_chara",
"strain");
6991 ShowDialog(
"_chara",
"escort");
6996 ShowDialog(
"_chara",
"party");
7010 EClass.player.flags.loytelEscaped =
false;
7012 ShowDialog(
"loytel",
"loytelEscaped");
7016 if (questDebt !=
null && questDebt.
paid)
7019 if (questDebt.
stage > 7)
7021 questDebt.stage = 7;
7023 ShowDialog(
"loytel",
"debt" + questDebt.
stage);
7031 ShowDialog(
"farris");
7037 ShowDialog(
"farris",
"nymelle_noQuest");
7040 ShowDialog(
"farris",
"nymelle_first");
7043 ShowDialog(
"farris",
"home_first");
7046 ShowDialog(
"farris");
7051 ShowDialog(
"ashland");
7056 SoundManager.ForceBGM();
7063 EClass.player.flags.fiamaFirstDream =
true;
7064 ShowDialog(
"fiama",
"firstDream");
7068 ShowDialog(
"fiama",
"giveStoryBook").SetOnKill(delegate
7070 EClass.player.flags.fiamaStoryBookGiven =
true;
7076 ShowDialog(
"fiama");
7081 ShowDialog(
"fiama");
7087 ShowDialog(
"big_sister",
"little_saved");
7088 EClass.player.flags.little_saved =
false;
7093 ShowDialog(
"big_sister",
"little_dead");
7094 EClass.player.flags.little_killed =
false;
7102 ShowDialog(
"guild_doorman",
"main", tag);
7108 ShowDialog(
"guild_clerk",
"main", tag2);
7123 ShowDialog(
"_chara");
7129 return _ShowDialog(
book,
null, step, tag);
7135 if (
book ==
"_chara" && IsPC)
7149 return base.LV / 2 + 4;
7155 if (FindBed() !=
null)
7164 return GetHappiness().ToString() ??
"";
7169 string result =
"?????";
7182 uIItem.
text2.
SetText(race.GetText().ToTitleCase(wholeText:
true) +
" " + job.GetText().ToTitleCase(wholeText:
true));
7192 sortVal = job._index * 10000 + sourceCard.
_index;
7195 sortVal = race._index * 10000 * ((!IsHuman) ? 1 : (-1)) + sourceCard.
_index;
7198 sortVal = -GetTotalFeat();
7201 sortVal = sourceCard._index * ((!IsHuman) ? 1 : (-1));
7214 foreach (
Card item in map.props.installed.all)
7218 traitBed.RemoveHolder(
this);
7237 if (!IsPCFaction && !IsGuest())
7246 Msg.
Say(
"claimBed",
this);
7255 if (GetInt(113) != 0)
7260 Thing bestRangedWeapon = GetBestRangedWeapon();
7261 foreach (
Thing thing
in things)
7267 _ListItems.Add(thing);
7271 _ListItems.Add(thing);
7275 if (_ListItems.Count == 0)
7279 List<Thing> containers2 = containers.ToList();
7280 foreach (
Thing listItem
in _ListItems)
7304 bool flag = GetInt(113) == 0;
7313 foreach (
Thing thing3
in things)
7315 if (CanEat(thing3, shouldEat))
7323 if (thing3.
id ==
"polish_powder")
7337 foreach (
Thing container
in containers)
7347 if (num3 > 0 && thing4.
id ==
"polish_powder")
7349 _ListItems.Add(thing4);
7354 _ListItems.Add(thing4);
7359 _ListItems.Add(thing4);
7362 else if (num > 0 && CanEat(thing4, shouldEat) && !thing4.
c_isImportant)
7364 _ListItems.Add(thing4);
7369 _ListItems.Add(thing4);
7374 _ListItems.Add(thing4);
7379 if (_ListItems.Count == 0)
7383 _ListItems.ForeachReverse(delegate(
Thing t)
7388 int slot = t.category.slot;
7389 int equipValue = t.GetEquipValue();
7390 foreach (Thing listItem in _ListItems)
7392 if (listItem.category.slot == slot && listItem.GetEquipValue() > equipValue)
7400 _ListItems.Remove(t);
7405 foreach (
Thing listItem2
in _ListItems)
7407 Thing thing = listItem2;
7408 if (things.IsFull(thing))
7415 thing = thing.
Split(2);
7422 if (ShouldEquip(thing, useFav:
true) && thing.
category.slot != 0)
7424 TryEquip(thing, useFav:
true);
7430 TryPutSharedItems(containers);
7436 Thing result =
null;
7444 int num2 = CountNumEaten(
item);
7445 int num3 = 100 - num2;
7459 t = FindBestFoodToEat();
7471 Say(
"eat_start",
this, t.Duplicate(1));
7501 if (!CanEquipRanged(t))
7506 foreach (
Thing thing
in things)
7527 if (bodySlot ==
null)
7533 switch (GetFavAttackStyle())
7572 if (!base.IsPCFactionOrMinion)
7577 if (value.
Value <= 0)
7594 num2 += value.Value * num3 / 100;
7611 if (!ShouldEquip(t, useFav))
7622 switch (GetFavAttackStyle())
7638 body.
Equip(t, slot);
7644 Say(
"equip",
this, t);
7660 return FindThrowable(hotbar:
true);
7664 things.Foreach(delegate(
Thing t)
7666 if (t.
HasTag(
CTAG.throwWeapon) || (!base.IsPCFactionOrMinion && t.
HasTag(
CTAG.throwWeaponEnemy)))
7672 Thing FindThrowable(
bool hotbar)
7674 things.Foreach(delegate(
Thing t)
7711 return things.Find((
Thing t) => ranged.
IsAmmo(t));
7716 Thing result =
null;
7718 foreach (
Thing thing
in things)
7741 if (ranged !=
null && ranged.
parent ==
this)
7745 ranged = GetBestRangedWeapon();
7746 return ranged !=
null;
7751 if (body.
GetWeight(armorOnly:
true) <= 30000)
7776 if (t.
id ==
"cigar")
7781 if (t.
trait.
CanEat(
this) && hunger.
GetPhase() > ((IsPCFaction || IsPCFactionMinion) ? 2 : 0))
7783 SetAIImmediate(
new AI_Eat
7802 if (base.hp < MaxHP * 90 / 100)
7805 if (healAction !=
null)
7816 return FindBed()?.owner.pos.cell.room;
7831 if (!trait.CanChangeAffinity)
7836 if (IsPCFaction && homeBranch !=
null)
7838 num += (int)Mathf.Sqrt(homeBranch.
Evalue(2117)) * 5;
7855 Say(
"affinityNone",
this, c);
7860 ShowEmo((!flag) ?
Emo.angry :
Emo.love);
7864 Say(flag ?
"affinityPlus" :
"affinityMinus",
this, c);
7870 a = affinity.
Mod(a);
7877 int num = Evalue(289);
7889 num2 += (lV - num) * 10;
7891 elements.
ModExp(289, Mathf.Min(num2, 1000));
7907 chara.orgPos = orgPos.
Copy();
7909 chara.pos = pos.
Copy();
7910 chara.isImported =
true;
7911 chara.c_editorTags = base.c_editorTags;
7912 chara.c_editorTraitVal = base.c_editorTraitVal;
7913 chara.c_idTrait = base.c_idTrait;
7914 chara.homeZone = homeZone;
7920 if (_listFavFood.Count == 0)
7924 if (row._origin ==
"dish" && row.value != 0 && row.chance != 0)
7926 _listFavFood.Add(row);
7933 r = _listFavFood.RandomItem();
7941 if (_listFavCat.Count == 0)
7947 _listFavCat.Add(row);
7953 r = _listFavCat.RandomItem();
7960 using (List<Chara>.Enumerator enumerator = pos.ListCharasInRadius(
this, 3, (
Chara c) => c !=
this && c.
race.id ==
"cat").GetEnumerator())
7962 if (enumerator.MoveNext())
7964 return enumerator.Current;
7972 Say(
"abCatSniff",
this, c);
7977 c.
Talk(
new string[4] {
"labor",
"disgust",
"scold",
"callGuards" }.RandomItem());
7983 if (base.c_upgrades !=
null)
7985 num += base.c_upgrades.spent;
7987 if (base.c_genes !=
null)
7989 num += base.c_genes.GetTotalCost();
7991 return num + base.feat;
7998 if (
item.act.id == 6630)
8008 string text = race.
id;
8009 if ((text ==
"mifu" || text ==
"nefu") &&
EClass.
rnd(2) == 0)
8022 if (
id ==
"olderyoungersister")
8024 if (base.idSkin != 2)
8026 return "UN_olderyoungersister";
8028 return "UN_olderyoungersister_alt";
8034 return base.c_idPortrait;
8051 if (HasElement(1231))
8054 AddCondition<ConEuphoric>(100 * Evalue(1231));
8058 SetFeat(1231, 1, msg:
true);
8065 int num2 = ((!HasElement(1411)) ? 1 : 3);
8066 if (GetBurden(t, num) >= num2)
8079 if (!IsValidGiftWeight(t, num))
8087 if ((t.
category.IsChildOf(
"furniture") || t.
category.IsChildOf(
"junk")) && !HasElement(1411))
8096 if (things.IsFull())
8123 Msg.
Say(
"affinityNone", c,
this);
8129 int num2 = 200 + t.LV * 3;
8145 c.
Say(
"draw_curse", c, t);
8147 List<Element> list =
new List<Element>();
8155 if (list.Count == 0)
8160 Element element = list.RandomItem();
8166 if ((t.
id ==
"lovepotion" || t.
id ==
"dreambug") && !Application.isEditor)
8168 GiveLovePotion(c, t);
8182 case "ticket_massage":
8189 case "ticket_armpillow":
8197 case "ticket_champagne":
8204 if (t.
id ==
"flyer")
8209 c.
Talk(
"flyer_miss");
8215 Msg.
Say(
"affinityNone", c,
this);
8217 elements.ModExp(291, 10f);
8220 elements.ModExp(291, 50f);
8222 if (t.
id ==
"statue_weird")
8243 Say(
"give_erohon",
this);
8244 AddCondition<ConParalyze>(50, force:
true);
8245 AddCondition<ConConfuse>(50, force:
true);
8246 AddCondition<ConFear>(1000, force:
true);
8254 c.
Say(
"give_love", c, t);
8264 if (HasCondition<StanceTaunt>() || base.isRestrained || attacker ==
this)
8288 int num = Mathf.Max(chara.
Evalue(1649), (!chara.
IsPC) ? ((!flag2) ? 1 : 3) : 0);
8289 int num2 = Dist(chara);
8294 if (num2 > num || !chara.
CanSeeLos(pos, num2))
8300 Point nearestPoint = pos.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
8308 Say(
"intercept_loyal", chara,
this);
8311 if (num2 > num || !chara.
CanSeeLos(pos, num2))
8316 if (!flag && !HasElement(1225))
8318 Say(
"intercept", chara,
this);
8321 chara.
Talk(
"intercept", base.NameSimple);
8323 if (attacker.enemy ==
this)
8325 attacker.SetEnemy(chara);
8388 if (t.
id ==
"flyer")
8408 for (
int num2 = things.Count - 1; num2 >= 0; num2--)
8410 Thing thing = things[num2];
8411 if (ShouldThrowAway(thing, type))
8422 Msg.
Say(
"party_sell",
this, num.ToString() ??
"");
8430 _ = base.c_upgrades;
8439 for (
int i = 0; i < 100; i++)
8445 if (base.c_upgrades ==
null)
8449 if (base.c_upgrades.halt)
8460 List<Element> list = ListAvailabeFeats(pet:
true);
8461 if (num >= 90 && list.Count > 0)
8463 Element element = list.RandomItem();
8467 else if (num >= 60 && ie.Any())
8469 num2 = ie.RandomItem().id;
8480 if (num4 > base.feat)
8485 base.c_upgrades.count++;
8486 base.c_upgrades.spent += num4;
8492 if (
item.idEle == num2)
8513 SetFeat(num2, elements.ValueWithoutLink(num2) + 1, msg:
true);
8515 else if (elements.ValueWithoutLink(row.
id) == 0)
8517 elements.Learn(row.
id);
8521 elements.ModBase(num2, num3);
8528 if (IsPC || base.isScaled || HasElement(1273))
8534 if (base.c_daysWithPC > 360)
8545 if (_cooldowns ==
null)
8547 _cooldowns =
new List<int>();
8551 _cooldowns.Add(idEle * 1000 + turns);
8557 _cooldowns.Add(idEle * 1000 + row.
cooldown);
8563 return GetCooldown(idEle) != 0;
8568 if (_cooldowns !=
null)
8570 for (
int i = 0; i < _cooldowns.Count; i++)
8572 if (_cooldowns[i] / 1000 == idEle)
8574 return _cooldowns[i] % 1000;
8583 for (
int num = _cooldowns.Count - 1; num >= 0; num--)
8585 if (_cooldowns[num] % 1000 == 1)
8587 _cooldowns.RemoveAt(num);
8594 if (_cooldowns.Count == 0)
8607 if (IsPCParty || base.noMove)
8612 if ((IsHomeMember() && IsInHomeZone()) || IsGuest())
8615 if (goalFromTimeTable !=
null)
8617 SetAI(goalFromTimeTable);
8620 goalFromTimeTable.
Tick();
8625 if (goalList.
index == -2)
8627 goalList.
Refresh(
this, goalListType);
8629 SetAI(goalList.
Next());
8653 return GetGoalWork();
8659 return GetGoalHobby();
8694 if (_works ==
null || _hobbies ==
null)
8698 foreach (
int work
in _works)
8705 foreach (
int hobby
in _hobbies)
8726 return SetAI(_NoGoalPC);
8744 Debug.Log(
"goal is g:" + ai?.ToString() +
"/" +
this);
8748 if (HasCondition<ConWait>())
8750 RemoveCondition<ConWait>();
8756 renderer.RefreshStateIcon();
8763 bool hasNoGoal = HasNoGoal;
8798 listHobby.Add(
new Hobby
8809 foreach (
int work
in _works)
8811 listHobby.Add(
new Hobby
8825 if (_hobbies ==
null)
8829 foreach (
int hobby
in _hobbies)
8831 listHobby.Add(
new Hobby
8844 if (
item.source.alias ==
id)
8849 foreach (
Hobby item2
in ListHobbies())
8851 if (item2.
source.alias ==
id)
8861 if (workElements !=
null)
8865 workElements =
null;
8866 if (IsPCParty || homeBranch ==
null || homeBranch.
owner ==
null)
8874 foreach (
Hobby item2
in ListWorks())
8878 if (workElements !=
null)
8882 void TryAdd(
Hobby h)
8884 if (!h.
source.elements.IsEmpty())
8886 if (workElements ==
null)
8890 for (
int i = 0; i < h.
source.elements.Length; i += 2)
8892 int num = h.
source.elements[i];
8893 int num2 = h.
source.elements[i + 1];
8895 if (num != 2115 && num != 2207)
8903 workElements.
ModBase(num, (num2 < 0) ? (num2 / 10) : Mathf.Max(1, h.
source.elements[i + 1] * num3 / 1000));
8911 string text = (simple ?
"" : (
"hobby".lang() +
":"));
8916 return text.TrimEnd(
',');
8921 string text = (simple ?
"" : (
"work".lang() +
":"));
8926 return text.TrimEnd(
',');
8931 foreach (
int hobby
in _hobbies)
8943 foreach (
int work
in _works)
8955 if (_hobbies !=
null && _works !=
null)
8962 _hobbies =
new List<int>();
8963 _works =
new List<int>();
8971 string[] hobbies = source.
hobbies;
8972 foreach (
string key
in hobbies)
8977 if (source.
works.IsEmpty())
8983 string[] hobbies = source.
works;
8984 foreach (
string key2
in hobbies)
8989 GetWorkSummary().Reset();
8994 if (_workSummary ==
null)
8998 return _workSummary;
9011 if (workSummary.
work !=
null)
9016 else if (workSummary.
hobbies.Count > 0)
9037 hobby.id = session.
id;
9042 workSummary.progress +=
EClass.
rnd(5) + 5;
9044 int num = PerformWork(hobby, 0, isHobby);
9045 int num2 = PerformWork(hobby, 1, isHobby);
9046 int num3 = PerformWork(hobby, 2, isHobby);
9047 int num4 = PerformWork(hobby, 3, isHobby);
9048 workSummary.money += num;
9049 workSummary.food += num2;
9050 workSummary.knowledge += num3;
9051 workSummary.material += num4;
9052 int PerformWork(
Hobby work,
int idx,
bool isHobby)
9054 if (idx >= work.
source.resources.Length)
9058 int num5 = work.
source.resources[idx];
9060 num5 =
Rand.
Range(num5 * (100 - work.
source.resources[idx]) / 100, num5);
9061 num5 = num5 * (isHobby ? 50 : 100) * session.
efficiency / 10000;
9062 if (num6 > 0 && num5 <= 0)
9072 _goalWork.
FindWork(
this, setAI:
false);
9088 foreach (
Condition condition
in conditions)
9090 condition.
SetOwner(
this, onDeserialize);
9096 return AddCondition(typeof(T).Name, p, force);
9109 if (c is
ConBleed && ResistLv(964) >= 3)
9114 else if (ResistLv(950) >= 3)
9132 if (c.
source.negate.Length != 0)
9134 string[] negate = c.
source.negate;
9135 foreach (
string text
in negate)
9137 if (HasElement(text))
9144 if (defenseAttribute !=
null)
9146 c.power = 100 * c.power / Mathf.Max(100 + defenseAttribute.
Value, 1);
9148 if (c.
source.resistance.Length != 0)
9153 c.power /= num * num + 1;
9166 for (
int j = 0; j < conditions.Count; j++)
9168 if (conditions[j].
id != c.
id)
9174 conditions[j].Kill();
9177 if (conditions[j].CanStack(c))
9179 if (conditions[j].WillOverride)
9181 conditions[j].Kill(silent:
true);
9184 if (CanGainConResist)
9188 conditions[j].OnStacked(c.
power);
9189 conditions[j].OnStartOrStack();
9190 conditions[j].PlayEffect();
9192 if (!conditions[j].AllowMultipleInstance)
9197 foreach (
Condition condition
in conditions)
9204 int num2 = c.EvaluateTurn(c.power);
9211 if (CanGainConResist)
9218 if (c.ShouldRefresh)
9230 if (c.SyncRide && (ride !=
null || parasite !=
null))
9236 if (parasite !=
null)
9244 public override bool HasCondition<T>()
9246 for (
int i = 0; i < conditions.Count; i++)
9248 if (conditions[i] is T)
9258 for (
int i = 0; i < conditions.Count; i++)
9260 if (conditions[i].source.alias == alias)
9275 for (
int i = 0; i < conditions.Count; i++)
9279 return conBuffStats.elements.GetElement(ele);
9288 foreach (
Condition condition
in conditions)
9298 public void CureCondition<T>(
int v = 99999) where T :
Condition
9300 T condition = GetCondition<T>();
9301 if (condition !=
null)
9303 condition.value -= v;
9304 if (condition.value <= 0)
9313 for (
int i = 0; i < conditions.Count; i++)
9315 if (conditions[i] is T)
9317 return conditions[i] as T;
9325 for (
int num = conditions.Count - 1; num >= 0; num--)
9327 if (conditions[num] is T)
9329 conditions[num].
Kill();
9337 if (parasite !=
null)
9339 parasite.
Cure(type, p, state);
9343 ride.
Cure(type, p, state);
9345 Cure(type, p, state);
9355 CureCondition<ConFear>();
9356 CureCondition<ConBlind>(2 * p / 100 + 5);
9357 CureCondition<ConPoison>(5 * p / 100 + 5);
9358 CureCondition<ConConfuse>(10 * p / 100 + 10);
9359 CureCondition<ConDim>(p / 100 + 5);
9360 CureCondition<ConBleed>(2 * p / 100 + 10);
9367 CureCondition<ConBlind>(5 * p / 100 + 15);
9368 CureCondition<ConPoison>(10 * p / 100 + 15);
9369 CureCondition<ConBleed>(5 * p / 100 + 20);
9370 CureTempElements(p, body:
true, mind:
false);
9373 CureCondition<ConFear>();
9374 CureCondition<ConDim>(3 * p / 100 + 10);
9375 CureTempElements(p, body:
false, mind:
true);
9379 for (
int num2 = conditions.Count - 1; num2 >= 0; num2--)
9381 Condition condition2 = conditions[num2];
9386 condition2.
Mod(-1, force:
true);
9394 CureCondition<ConWait>();
9395 CureCondition<ConDisease>((
EClass.
rnd(20) + 10) * p / 100);
9396 bool flag3 = HasCondition<ConAnorexia>();
9397 base.c_vomit -= (flag3 ? 3 : 2) * p / 100;
9398 if (base.c_vomit < 0)
9403 RemoveCondition<ConAnorexia>();
9413 bool flag2 = type ==
CureType.Death;
9414 CureTempElements(p * 100, body:
true, mind:
true);
9415 for (
int num = conditions.Count - 1; num >= 0; num--)
9422 switch (condition.
Type)
9442 CureCondition<ConWait>();
9443 CureCondition<ConSleep>();
9444 if (flag2 || type ==
CureType.Boss)
9447 RemoveCondition<ConBrightnessOfLife>();
9452 if (HasElement(1206))
9454 SetFeat(1206, 0, msg:
true);
9464 for (
int num = conditions.Count - 1; num >= 0; num--)
9480 if (
TC.hp > (
long)
TC.MaxHP * (
long)Mathf.Min(5 + (
int)Mathf.Sqrt(power),
harvest ? 35 : 25) / 100)
9484 if (
TC.HasElement(427))
9492 PlaySound(
"hit_finish");
9494 Say(
"finish2",
this,
TC);
9504 if (resistCon ==
null)
9506 resistCon =
new Dictionary<int, int>();
9508 if (resistCon.ContainsKey(key))
9510 resistCon[key] += con.power * con.GainResistFactor / 100;
9514 resistCon[key] = con.power * con.GainResistFactor / 100;
9521 if (con.
power > 0 && resistCon !=
null)
9523 int a =
ClassExtension.TryGetValue<int,
int>((IDictionary<int, int>)resistCon, con.
id, 0);
9545 RemoveCondition<ConAwakening>();
9550 con.pcPillow = pillow;
9551 con.pickup = pickup;
9552 con.posBed = posBed;
9553 con.posPillow = posPillow;
9559 bool isSunLit = pos.IsSunLit;
9561 int num =
bed?.Power ?? 20;
9562 if (traitPillow !=
null)
9564 num += traitPillow.owner.Power / 2;
9568 num +=
bed.Evalue(750) * 5;
9574 OnSleep(num, days, isSunLit);
9577 public void OnSleep(
int power,
int days = 1,
bool isSunLit =
false)
9583 int num = power * days;
9584 if (stamina.
value < 0)
9588 if (isWeakToSunlight && isSunLit)
9595 AddCondition<ConBurning>(1000, force:
true);
9600 stamina.
Mod(10 + 25 * num / 100 * (100 + elements.GetFeatRef(1642)) / 100);
9617 if (!HasElement(450))
9619 long num = bio.height;
9620 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9625 if (num > 999999999)
9629 if (num != bio.height)
9631 bio.height = (int)num;
9632 Say((a > 0) ?
"height_gain" :
"height_lose",
this);
9639 if (HasElement(450) || a == 0)
9643 long num = bio.weight;
9644 long num2 = bio.height;
9645 long num3 = num2 * num2 * 18 / 25000;
9646 long num4 = num2 * num2 * 24 / 10000;
9647 if (ignoreLimit || (num > num3 && num < num4))
9649 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9654 if (num > 999999999)
9658 if (num != bio.weight)
9660 bio.weight = (int)num;
9661 Say((a > 0) ?
"weight_gain" :
"weight_lose",
this);
9670 if (Evalue(962) >= 25 || (ResistLv(962) > 0 &&
EClass.
rnd(ResistLv(962) + 1) != 0))
9674 int num = Evalue(412);
9677 float num2 = (float)a * 100f / (
float)Mathf.Max(100 + num * 2, 10);
9678 a = (int)num2 + ((
EClass.
rndf(1f) < num2 % 1f) ? 1 : 0);
9685 int num3 = (corruption + a) / 100 - corruption / 100;
9686 for (
int i = 0; i < Mathf.Abs(num3); i++)
9688 if (!MutateRandom((num3 > 0) ? 1 : (-1), 100, ether:
true))
9695 foreach (
Element value
in elements.dict.Values)
9697 if (value.
source.category ==
"ether")
9699 num4 += value.
Value;
9702 if (num4 > 0 && IsPC)
9706 corruption = num4 * 100 + corruption % 100;
9711 List<Element> list =
new List<Element>();
9714 Feat feat = elements.GetOrCreateElement(
item.id) as
Feat;
9715 int num = ((feat.ValueWithoutLink <= 0) ? 1 : (feat.
ValueWithoutLink + 1));
9724 public void SetFeat(
int id,
int value = 1,
bool msg =
false)
9726 Feat feat = elements.GetElement(
id) as
Feat;
9728 if (feat !=
null && feat.
Value > 0)
9730 if (value == feat.
Value)
9739 feat = elements.SetBase(
id, value - (feat?.vSource ?? 0)) as
Feat;
9744 elements.Remove(
id);
9749 CalculateMaxStamina();
9755 if (feat.
source.textInc.IsEmpty())
9757 PlaySound(
"ding_skill");
9759 Say(
"gainFeat",
this, feat.
FullName);
9763 bool flag = value < num;
9764 if (feat.
source.tag.Contains(
"neg"))
9773 PlaySound(
"chime_angel");
9779 PlaySound(
"chime_devil");
9783 PlaySound(
"mutation");
9787 Say((value > num) ? feat.
source.GetText(
"textInc") : feat.
source.GetText(
"textDec"),
this, feat.
FullName);
9789 elements.CheckSkillActions();
9796 Element element = elements.GetElement(idEle);
9797 Element element2 = elements.GetElement(row2.
id);
9798 int num = element?.
Value ?? 0;
9807 bool flag = (row.
tag.Contains(
"neg") ? (a > num) : (a < num));
9808 if (a == 0 && (element ==
null || element.
Value == 0))
9810 SayNothingHappans();
9813 if (element !=
null && element.
Value == a)
9815 SayNothingHappans();
9818 if (element2 !=
null && element2.
Value > 0)
9820 SetFeat(element2.
id, 0);
9823 PlaySound(
"mutation");
9824 PlayEffect(
"mutation");
9826 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
9831 if (!ether && vec >= 0 && HasElement(406) &&
EClass.
rnd(5) != 0)
9833 Say(
"resistMutation",
this);
9837 for (
int i = 0; i < tries; i++)
9840 if (i == 0 && vec < 0 && ether && base.c_corruptionHistory != null && base.c_corruptionHistory.Count > 0)
9843 base.c_corruptionHistory.RemoveAt(base.c_corruptionHistory.Count - 1);
9844 if (base.c_corruptionHistory.Count == 0)
9846 base.c_corruptionHistory =
null;
9849 Element element = elements.GetElement(row.
id);
9851 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))
9858 element = elements.GetElement(row.
id);
9860 bool flag = row.
tag.Contains(
"neg");
9873 if (element !=
null)
9875 num = element.Value + ((vec != 0) ? vec : ((
EClass.
rnd(2) == 0) ? 1 : (-1)));
9876 if (num > element.
source.max)
9878 num = element.source.max - 1;
9880 flag = (flag && num > element.
Value) || (!flag && num < element.
Value);
9881 flag2 = num > element.
Value;
9882 if (vec > 0 && !flag2)
9887 Say(flag2 ?
"mutation_gain" :
"mutation_loose",
this);
9888 SetFeat(row.
id, num);
9891 if (base.c_corruptionHistory ==
null)
9893 base.c_corruptionHistory =
new List<int>();
9895 base.c_corruptionHistory.Add(row.
id);
9898 Element element2 = elements.GetElement(row.
id);
9903 EClass.player.flags.gotEtherDisease =
true;
9905 thing.
SetStr(53,
"letter_ether");
9914 PlaySound(ether ?
"mutation_ether" :
"mutation");
9915 PlayEffect(
"mutation");
9917 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
9921 Say(
"nothingHappens");
9927 Element orCreateElement = elements.GetOrCreateElement(ele);
9930 elements.ModBase(orCreateElement.
id, 1);
9932 if (orCreateElement is
Spell)
9934 int num =
EClass.
curve(Evalue(307), 50, 20) + (HasElement(307) ? 20 : 0);
9935 int num2 = origin?.Evalue(765) ?? 0;
9936 num = num * (100 - num2) / 100;
9937 int a = mtp * orCreateElement.source.charge * (100 + num) / 100 / 100;
9939 if (orCreateElement.
source.charge == 1)
9943 orCreateElement.vPotential += a;
9945 Say(
"spell_gain",
this, orCreateElement.
Name);
9957 Msg.
Say(
"curse_nullify", member);
9962 else if (HasElement(1641) &&
EClass.
rnd(3) != 0)
9964 Say(
"curse_nullify",
this);
9967 if (GetCondition<ConHolyVeil>() !=
null &&
EClass.
rnd(5) != 0)
9969 Say(
"curse_nullify",
this);
9977 if (_historyFood !=
null)
9979 while (_historyFood.Count > 5)
9981 _historyFood.RemoveAt(_historyFood.Count - 1);
9983 if (_historyFood[0].Count > 0)
9985 _historyFood.Insert(0,
new List<string>());
9992 if (!IsPCFaction || !IsGlobal)
9994 _historyFood =
null;
9997 if (_historyFood ==
null)
9999 _historyFood =
new List<List<string>>
10004 if (_historyFood[0].Count < 5)
10006 _historyFood[0].Add(
food.id);
10012 if (_historyFood ==
null)
10017 foreach (List<string>
item in _historyFood)
10019 foreach (
string item2
in item)
10021 if (item2 ==
food.id)
10034 return 10 + (int)(Mathf.Sqrt(base.c_daysWithGod) * 2f + (float)Evalue(85)) / 2;
10036 return 10 + (int)(Mathf.Sqrt(base.LV) * 5f + (float)Evalue(306)) / 2;
10041 if (faithElements !=
null)
10046 if (idFaith ==
"eyth" && !HasElement(1228))
10056 if (!HasCondition<ConExcommunication>())
10064 int num = GetPietyValue() * (120 + Evalue(1407) * 15 + Evalue(1228) * 20) / 100;
10065 for (
int i = 0; i < array.Length; i += 2)
10067 int num2 = array[i + 1] * num / 50;
10068 if (array[i] == 79)
10070 num2 =
EClass.
curve(num2, array[i + 1] * 2, 10, 50);
10072 if (num2 >= 20 && array[i] >= 950 && array[i] < 970)
10076 faithElements.
SetBase(array[i], Mathf.Max(num2, 1));
10082 public void ModTempElement(
int ele,
int a,
bool naturalDecay =
false,
bool onlyRenew =
false)
10088 bool flag = HasElement(1215);
10089 if (tempElements ==
null)
10098 int num = elements.ValueWithoutLink(ele);
10099 int num2 = Mathf.Abs(num) + 100;
10100 int num3 = num2 / (flag ? 2 : 4);
10101 int num4 = -num - 100;
10102 int num5 = tempElements.
Base(ele);
10103 int num6 = num5 + a;
10106 num3 = Mathf.Min(a, num3);
10107 num4 = Mathf.Max(a, -num2 / 3);
10109 if (a > 0 && num6 > num3)
10111 a = ((num3 > num5) ? (num3 - num5) : 0);
10113 if (a < 0 && num6 < num4)
10115 a = ((num4 < num5) ? (num4 - num5) : 0);
10118 if (element.
vBase == 0)
10121 if (tempElements.
dict.Count == 0)
10123 tempElements =
null;
10142 ModTempElement(ele, onlyRenew ? (-p / 20) : (-(p / 100 +
EClass.
rnd(p / 100 + 1) + 1)), naturalDecay:
false, onlyRenew);
10148 foreach (
int ele
in array)
10150 EnhanceTempElement(ele, p, onlyRenew);
10156 ModTempElement(ele, onlyRenew ? (p / 20) : (p / 100 +
EClass.
rnd(p / 100 + 1)), naturalDecay:
false, onlyRenew);
10161 if (tempElements ==
null)
10167 if (
item.vBase > 0)
10169 ModTempElement(
item.id, -Mathf.Min(
item.vBase * 5 / 100 + 1,
item.vBase), naturalDecay:
true);
10176 if (tempElements !=
null)
10187 void Cure(
int[] eles)
10189 foreach (
int ele
in eles)
10191 if (tempElements ==
null)
10196 if (element !=
null && element.
vBase < 0)
10198 ModTempElement(ele, Mathf.Clamp(p / 20 +
EClass.
rnd(p / 20), 1, -element.
vBase));
10206 if (tempElements !=
null)
10209 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=null)
static CardBlueprint CharaGenEQ
GlobalCharaList globalCharas
void PlayAnime(AnimeID id, bool force)
RendererReplacer replacer
void Teleport(Point point, bool silent=false, bool force=false)
int EvalueMax(int ele, int min=0)
void MakeFigureFrom(string id)
ElementContainerCard elements
Hostility c_originalHostility
bool HasElement(int ele, int req=1)
SourceMaterial.Row material
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Card MakeRefFrom(string id)
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 DamageHP(long dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
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)
SourceCellEffect.Row source
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)
bool HasHobbyOrWork(string alias)
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)
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
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()
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
Chara SetHomeZone(Zone zone)
Chara SetFaction(Faction f)
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 MakeMinion(Chara _master, MinionType type=MinionType.Default)
override void LookAt(Point p)
void Kick(Chara t, bool ignoreSelf=false, bool karmaLoss=true, bool show=true, bool checkWall=true)
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
void Kick(Point p, bool ignoreSelf=false, bool checkWall=true)
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 GainAbility(int ele, int mtp=100, Thing origin=null)
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 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)
int GetCooldown(int idEle)
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
Chara SetHostility(Hostility h)
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 OnSleep(int power, int days=1, bool isSunLit=false)
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)
void SetTo(int id, int v)
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)
bool HasElement(int ele, bool excludePC=false)
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 GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
SoundSource PlaySound(string id, bool synced=true, float v=1f, bool spatial=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)
Effect PlayEffect(string id)
Point GetRandomNeighbor()
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 int DangerLvBoost
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 DestroyAll(Func< Thing, bool > funcExclude=null)
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 IgnoreOnSteppedWhenMoving
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()
int CountMinions(Chara c)
void SetBGM(List< int > ids, bool refresh=true, float fadeDuration=0f)
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)