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")]
190 private static List<Chara>
_pts =
new List<Chara>();
480 if (base.c_originalHostility == (
Hostility)0)
482 if (!
source.hostility.IsEmpty())
488 return base.c_originalHostility;
498 if (
source.idActor.Length <= 1)
530 return "CharaActorPCC";
542 if (base.dir != 1 && base.dir != 2)
558 return base.dir == 2;
572 return base.ExistsOnMap;
618 if (base.c_love !=
null)
620 return base.c_love.dateMarriage != 0;
650 return base.c_uidMaster != 0;
726 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);
728 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);
732 public int MaxSummon => Mathf.Max((
int)Mathf.Sqrt(base.CHA), 1) +
Evalue(1647) + ((!base.IsPCFactionOrMinion) ? ((
int)base.rarity * 5) : 0);
738 if (base.c_idMainElement == 0)
746 public override int DV
757 num = 50 + (num - 50) / 10;
760 int WeaknessMod(
int a)
762 if (HasCondition<ConWeakness>())
775 public override int PV
786 num = 50 + (num - 50) / 10;
789 int WeaknessMod(
int a)
791 if (HasCondition<ConWeakness>())
812 spriteReplacer.data.tryFixPrefNotLoadedAtStart =
true;
869 if (!
race.tag.Contains(
"ride"))
871 if (!
race.tag.Contains(
"noRide"))
893 return !base.isSummon;
1037 if (!(
race.id ==
"cat") && !(
race.id ==
"catsister"))
1039 return race.id ==
"catgod";
1055 return race.id ==
"mutant";
1079 return EClass.Branch.uidMaid == base.uid;
1105 if (!
source.works.Contains(
"Rich"))
1107 return source.hobbies.Contains(
"Rich");
1133 if (base.c_genes !=
null)
1135 return base.c_genes.GetGeneSlot(
this);
1161 if (!
race.tag.Contains(
"mofu"))
1188 if (!h.
source.elements.IsEmpty())
1190 for (
int i = 0; i < h.
source.elements.Length; i += 2)
1192 int ele = h.
source.elements[i];
1193 int v = h.
source.elements[i + 1];
1223 if (base.rarity >=
Rarity.Legendary)
1238 if (
host ==
null || includeRide)
1242 return base.hp <
MaxHP / 5;
1257 return num > num2 + 0.1f;
1354 return p.cell.room.data.accessType
switch
1357 BaseArea.AccessType.Private =>
false,
1384 for (
int i = 0; i < slots.Count; i++)
1393 _cbits1.Bits = (uint)
_cints[0];
1404 pccData.state = (base.isCensored ? PCCState.Naked : PCCState.Normal);
1413 if (
source.tag.Contains(
"boss"))
1434 string text = base.c_altName ??
source.GetName(
this);
1435 if (HasCondition<ConTransmuteShadow>())
1442 if (base.c_bossType ==
BossType.Evolved)
1444 text =
"_evolved".lang(text.ToTitleCase(wholeText:
true));
1447 if (text.Length > 0 &&
char.IsLower(text[0]))
1449 if (base.rarity >=
Rarity.Legendary)
1451 text = text.ToTitleCase();
1455 text = text.AddArticle();
1462 int num2 = ((base.rarity ==
Rarity.Mythical) ? 3 : ((base.rarity >=
Rarity.Mythical) ? 2 : ((base.rarity >=
Rarity.Legendary) ? 2 : ((!
_alias.IsEmpty()) ? 1 : (-1)))));
1467 text = ((
Aka.IsEmpty() || !(
Aka != text)) ? text.Bracket(num2) : (num2
switch
1472 }).lang((num2 == -1) ?
Aka :
Aka.ToTitleCase(wholeText:
true), text.Bracket(num2)));
1474 return text + text2;
1479 if (r != base.rarity)
1524 if (uniqueData !=
null)
1537 where zone != EClass._zone
1538 select zone).RandomItem();
1565 base.isSubsetCard =
false;
1567 base.c_uidMaster = 0;
1599 if (
source.tag.Contains(
"boss"))
1603 int num = ((bp.lv != -999) ?
bp.
lv : base.LV);
1625 if (
source.idActor.Length > 2)
1634 if (
source.mainElement.Length != 0)
1636 int _genLv = Mathf.Min(
genLv, 100);
1637 List<Tuple<string, int, int>> list =
new List<Tuple<string, int, int>>();
1638 string[] mainElement =
source.mainElement;
1639 for (
int num2 = 0; num2 < mainElement.Length; num2++)
1641 string[] array = mainElement[num2].Split(
'/');
1643 int num3 = source.LV * row.eleP / 100;
1644 if (list.Count == 0 || num3 < _genLv || array[0] ==
bp.
idEle)
1646 list.Add(
new Tuple<string, int, int>(array[0], (array.Length > 1) ?
int.Parse(array[1]) : 0, num3));
1649 Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / Mathf.Max(100 + (_genLv - a.Item3) * 25, 1));
1652 tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle ||
"ele" + a.Item1 ==
bp.
idEle).FirstOrDefault() ?? tuple;
1654 SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental:
true);
1655 if (list.Count >= 2)
1657 num = tuple.Item3 + base.LV -
source.LV;
1662 base.c_altName = NameGen.getRandomName();
1666 _alias = AliasGen.GetRandomAlias();
1679 if (base.LV > 5 &&
race.id ==
"mutant")
1681 for (
int num4 = 0; num4 < Mathf.Min(1 + base.LV / 5, 20); num4++)
1688 case "putty_mech_b":
1703 if (
race.EQ.Length != 0 || !
source.equip.IsEmpty())
1721 case "olderyoungersister":
1724 case "sister_undead":
1728 if (
id ==
"sister_undead" &&
EClass.
rnd(10) == 0)
1747 if (!
source.faith.IsEmpty())
1808 Debug.LogError(
"source is null");
1828 base.isHidden =
false;
1850 string text =
"marshmallow_king";
1851 string text2 =
"fusion";
1855 text =
"imotomaton";
1859 text =
"shojomaton";
1863 text =
"sister_catmaton";
1867 text =
"youngladymaton";
1877 if (!text2.IsEmpty())
1890 chara.PlayAnime(
AnimeID.FallSky);
1891 chara.pos.PlaySound(
"fuse");
1892 chara.pos.PlayEffect(
"vanish");
1940 if (con !=
DuplicateCondition.Water && con !=
DuplicateCondition.Quantum && (HasCondition<ConPoison>() || HasCondition<ConConfuse>() || HasCondition<ConDim>() || HasCondition<ConParalyze>() || HasCondition<ConSleep>() || HasCondition<ConBurning>() || HasCondition<ConFreeze>() || HasCondition<ConMiasma>()))
1968 dest = dest.
GetRandomPoint(2, requireLos:
false, allowChara:
false, allowBlocked:
false, 200);
1969 if (dest ==
null || dest.Equals(
pos) || !dest.IsValid || !
CanDuplicate(con))
1971 Say(
"split_fail",
this);
1976 if (inheritHostility)
1991 if (
item.Key != 1275)
1993 Element orCreateElement = chara.elements.GetOrCreateElement(
item.Key);
1994 orCreateElement.vBase = item.Value.ValueWithoutLink - orCreateElement.
vSource;
1997 chara.SetFaith(
faith);
1998 chara.bio = IO.DeepCopy(
bio);
2000 chara.c_daysWithGod = base.c_daysWithGod;
2001 chara.RefreshFaithElement();
2002 chara.hp = (int)Mathf.Clamp((
float)chara.MaxHP * ((float)base.hp / (
float)
MaxHP) * 0.99f, 0f, chara.MaxHP);
2003 chara.isCopy =
true;
2004 chara.isScaled = base.isScaled;
2005 chara.c_altName = base.c_altName;
2009 chara.pccData = IO.DeepCopy(
pccData);
2020 int num2 = (base.ChildrenWeight + ((t !=
null) ? ((num == -1) ? t.ChildrenAndSelfWeight : (t.SelfWeight * num)) : 0)) * 100 /
WeightLimit;
2029 int num3 = ((num2 >= 100) ? ((num2 - 100) / 10 + 1) : 0);
2039 int num = base.ChildrenWeight * 100 / Mathf.Max(1,
WeightLimit);
2055 Say(flag ?
"dmgBurdenStairs" :
"dmgBurdenFallDown",
this);
2061 long num2 = (num * (base.ChildrenWeight * 100 /
WeightLimit) / (flag ? 100 : 200) + 1) * mtp / 100;
2089 info?.AddText(
"rideSpeed".lang(
_Speed.ToString() ??
""));
2091 else if (
host !=
null)
2120 info?.AddText(
_Speed - speed,
"parasiteSpeed".lang());
2132 num3 = 50 + Mathf.Clamp((
int)Mathf.Sqrt(num4) * 5 -
EClass.
_zone.
DangerLv / 50, (num5 > 0) ? 50 : ((base.IsPowerful ||
IsMultisize) ? 40 : 0), 50) + Mathf.Clamp((
int)Mathf.Sqrt(num4), 0, 25);
2133 if (info !=
null && num3 != 100)
2160 num3 -= (
IsPC ? 50 : 100);
2200 num3 += EClass.player.lastEmptyAlly *
Evalue(1646);
2205 num3 += EClass.player.lastEmptyAlly * 10 - 10;
2211 num3 +=
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100);
2212 info?.AddFix(
EClass.
curve((base.LV - 900) / 100 * 10, 500, 100),
"enemySpeedBuff".lang());
2214 if (HasCondition<ConGravity>())
2217 info?.AddFix(-30, GetCondition<ConGravity>().
Name);
2227 info?.AddText(
"minSpeed".lang(10.
ToString() ??
""));
2238 if (value.
source.category ==
"skill")
2285 base.ApplyEditorTags(tag);
2293 Debug.LogWarning(
"Chara " +
id +
" not found");
2302 if (!
id.StartsWith(
"ele"))
2311 if (base.c_idMainElement != 0)
2313 SetElements(base.c_idMainElement,
remove:
true);
2314 base.c_idMainElement = 0;
2319 SetElements(
id,
remove:
false);
2320 base.c_idMainElement =
id;
2323 base.isElemental =
true;
2326 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);
2330 void SetElements(
int idEle,
bool remove)
2390 base.c_idJob = idNew;
2418 int ele =
new int[9] { 30, 31, 33, 35, 35, 36, 34, 37, 39 }.RandomItem();
2422 Say(
"gain_bodyparts",
this,
Element.
Get(ele).GetName().ToLower());
2443 for (
int num =
body.
slots.Count - 1; num >= 0; num--)
2452 string[] array =
race.figure.Split(
'|');
2453 foreach (
string s
in array)
2466 string[] array =
race.figure.Split(
'|');
2467 foreach (
string s
in array)
2492 bool flag =
id ==
"chara" ||
id ==
"player";
2493 if (
race.id ==
"bike" &&
id !=
"bike_cub")
2510 base.c_idRace = idNew;
2526 Debug.Log(
"Creating Replacement NPC for:" +
this);
2556 base.c_summonDuration = 0;
2557 base.isSummon =
false;
2578 owner?.
Say(
"summon_vanish",
this);
2590 base.c_uidMaster = _master.
uid;
2591 base.c_minionType = type;
2598 base.c_uidMaster = 0;
2603 if (chara.
enemy ==
this)
2615 List<Chara> list =
new List<Chara>();
2643 base.c_summonDuration = duration;
2644 base.isSummon =
true;
2691 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2710 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2719 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2726 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2735 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2761 if (detail !=
null && detail.
charas.Count > 0)
2796 int num = ((p.z >=
pos.
z) ? ((p.
x >
pos.
x) ? 1 : ((p.z >
pos.
z) ? 2 : 3)) : 0);
2806 int num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2811 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2818 num2 = ((z >=
pos.
z) ? ((x >
pos.
x) ? 1 : ((z >
pos.
z) ? 2 : 3)) : 0);
2823 num2 = ((z >= p.
z) ? ((x > p.
x) ? 1 : ((z > p.
z) ? 2 : 3)) : 0);
2854 List<Point> list =
new List<Point>();
2902 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2911 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 4)
2920 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2929 if (pathProgress.
HasPath && pathProgress.
nodes.Count < num + 25)
2944 if (!condition.
TryMove(newPoint))
2949 if (base.isRestrained)
2955 base.isRestrained =
false;
2957 if (!
CanMoveTo(newPoint, allowDestroyPath))
2961 return _Move(newPoint);
3012 EClass.player.lastZonePos =
null;
3015 for (
int i = 0; i < num2 * 4; i++)
3026 EClass.player.regionMoveWarned =
true;
3027 Msg.
Say(
"regionAbortMove");
3038 AddCondition<ConSuffocation>((
Evalue(200) != 0) ? (2000 / (100 +
EvalueMax(200, -5) * 10)) : 30, force:
true);
3040 int num4 = GetCondition<ConSuffocation>()?.GetPhase() ?? 0;
3047 ModExp(200, ((!flag) ? 1 : 10) + num4 * 12);
3050 EClass.player.regionMoveWarned =
false;
3058 num = EClass.setting.defaultActPace * 3f;
3086 if (
CanMoveTo(randomNeighbor, allowDestroyPath:
false))
3088 newPoint = randomNeighbor;
3096 if (newPoint.
x !=
pos.
x || newPoint.
z !=
pos.
z)
3101 if (effect !=
null && effect.
id == 7)
3106 Say(
"abWeb_caught",
this);
3108 effect2.power = effect2.power * 3 / 4;
3112 Say(
"abWeb_pass",
this);
3117 EClass.player.renderExtraTime = 0f;
3122 else if ((newPoint.
x >
pos.
x && newPoint.
z >
pos.
z) || (newPoint.
x <
pos.
x && newPoint.
z <
pos.
z))
3131 if (
item.mimicry !=
null &&
item.IsHostile(
this))
3133 if (
item.mimicry.ShouldRevealOnPush)
3135 item.mimicry.Reveal(
this, surprise:
true);
3151 traitDoor.TryOpenLock(
this);
3161 bool flag4 = EClass._zone.IsSnowCovered && !cell.HasRoof && !cell.
isClearSnow;
3164 bool flag5 = cell.IsTopWater && !cell.
isFloating;
3194 string text = ((flag3 || flag5) ?
"water" : tileRow.
soundFoot.IsEmpty(row.
soundFoot.IsEmpty(
"default")));
3195 if (cell.
obj != 0 && cell.
sourceObj.tileType.IsPlayFootSound && !cell.
matObj.soundFoot.IsEmpty())
3197 text = cell.
matObj.soundFoot;
3209 if (!text.IsEmpty())
3211 SoundManager.altLastData =
IsPC;
3218 bool flag6 = scene.actionMode.gameSpeed > 1f;
3219 scene.psFoot.transform.position = renderer.position + pcOrbit.
footPos;
3220 scene.psFoot.startColor = row.
matColor;
3224 scene.psSmoke.transform.position = renderer.position + pcOrbit.
smokePos;
3248 Say(
"replace_pc", chara, chara2);
3259 traitDoor2.TryOpen(
this);
3298 if ((dataPick.
noRotten && item2.
IsDecayed) || (dataPick.onlyRottable && item2.trait.Decay == 0))
3315 foreach (
int cat
in dataPick.
cats)
3323 else if (!dataPick.
flag.HasFlag(containerFlag))
3365 num6 = (int)Mathf.Abs((surfaceHeight - surfaceHeight2) * 100f);
3382 EClass.player.flags.isShoesOff =
false;
3389 EClass.player.flags.isShoesOff =
true;
3419 AddExp(Mathf.Clamp((
int)Mathf.Sqrt(base.ExpToNext / 100), 1, 1000));
3439 EClass._map.MineBlock(_p, recoverBlock: false, this);
3442 EClass._map.MineObj(_p, null, this);
3448 EClass._map.MineObj(_p, null, this);
3455 if (t.isNPCProperty && t.trait.CanBeDestroyed)
3461 t.SetPlaceState(PlaceState.roaming);
3477 if (list.Count == 0)
3481 list.Copy().ForeachReverse(delegate(
Chara c)
3485 List<Point> list2 = new List<Point>();
3486 for (int i = point.x - 1; i <= point.x + 1; i++)
3488 for (int j = point.z - 1; j <= point.z + 1; j++)
3490 if (i != point.x || j != point.z)
3492 Point point2 = new Point(i, j);
3493 if (point2.IsValid && !point2.HasChara && !point2.IsBlocked && !point2.cell.hasDoor && !point2.IsBlockByHeight(point))
3500 if (list2.Count > 0)
3502 if (list2.Count > 1)
3504 list2.ForeachReverse(delegate(Point p)
3506 if (p.Equals(new Point(point.x + point.x - pos.x, point.z + point.z - pos.z)))
3512 Point newPoint = list2.RandomItem();
3515 Say(
"displace",
this, c);
3525 int num =
EClass.
rndHalf(10 + Mathf.Min(GetCurrency() / 100, 1000));
3527 Say(
"pushed_money",
this, c);
3592 if (z == currentZone)
3601 state = ZoneTransition.EnterState.Return
3604 if (HasCondition<ConInvulnerable>())
3606 RemoveCondition<ConInvulnerable>();
3610 EClass.player.nextZone = z;
3618 EClass.player.returnInfo.turns += 5;
3625 EClass.player.deathZoneMove =
false;
3627 currentZone.events.OnLeaveZone();
3628 if (currentZone.instance !=
null)
3642 EClass.player.uidLastZone = currentZone.uid;
3645 if (currentZone.IsRegion)
3653 Msg.
Say(
"leaveZone", currentZone.Name);
3655 else if (z.
id != currentZone.id)
3659 EClass.player.lastZonePos = pos.Copy();
3661 EClass.player.lastTransition = transition;
3683 if (party !=
null && party.
leader ==
this)
3695 Debug.Log(base.Name);
3698 transition.uidLastZone = currentZone?.uid ?? 0;
3699 global.transition = transition;
3703 global.transition =
null;
3706 EClass.player.lastTransition =
null;
3709 if (IsBranchMember())
3720 public void MoveHome(
string id,
int x = -1,
int z = -1)
3735 CureCondition<ConSuspend>();
3762 orgPos =
new Point(x, z);
3763 if (factionBranch !=
null)
3765 RefreshWorkElements();
3777 state = ZoneTransition.EnterState.Fall,
3787 renderer.RefreshSprite();
3790 public override void Rotate(
bool reverse =
false)
3792 if (renderer.hasActor)
3794 base.dir = (base.dir + ((!reverse) ? 1 : (-1))).Clamp(0, 3, loop:
true);
3798 base.dir = ((base.dir == 0) ? 1 : 0);
3801 renderer.RefreshSprite();
3811 angle =
Util.GetAngle(p.
x - pos.x, p.
z - pos.z);
3814 if (angle > 100f && angle < 170f)
3818 else if (angle > 170f && angle < 190f)
3822 else if (angle > 190f || (angle < -10f && angle > -100f))
3832 else if (angle > 170f && angle < 235f)
3836 else if (angle > 80f && angle < 145f)
3840 else if (angle > -100f && angle < -35f)
3844 else if (angle > -10f && angle < 55f)
3848 renderer.RefreshSprite();
3859 else if (base.dir == 1)
3863 else if (base.dir == 2)
3867 else if (base.dir == 3)
3872 else if (base.dir == 0)
3876 else if (base.dir == 1)
3880 else if (base.dir == 2)
3884 else if (base.dir == 3)
3893 if (!renderer.hasActor)
3895 if (angle == 0f || angle == 45f || angle == 90f)
3899 if (angle == -135f || angle == 180f || angle == -90f)
3909 return renderer.actor.currentDir;
3915 for (
int i = -num; i < num + 1; i++)
3917 for (
int j = -num; j < num + 1; j++)
3919 shared.
Set(pos.x + i, pos.z + j);
3930 for (
int num = conditions.Count - 1; num >= 0; num--)
3932 if (conditions[num].ConsumeTurn)
3942 if (_cooldowns !=
null)
3947 consumeTurn =
false;
3948 preventRegen =
false;
3949 emoIcon =
Emo2.none;
3952 base.c_summonDuration--;
3953 if (base.c_summonDuration <= 0)
3961 AddCondition<ConWet>(20);
3966 happiness = (hunger.value + stamina.value + depression.value + bladder.value + hygiene.
value) / 5;
3971 if (
EClass.
rnd(2) == 0 && !HasCondition<ConAwakening>())
3986 if (parasite !=
null)
3999 num = ((!IsPC) ? ((phase > 3) ? 50 : 0) : ((phase > 3) ? 50 : 0));
4016 AddCondition<ConBurning>(1000, force:
true);
4020 if (HasElement(1250))
4022 if (!HasCondition<ConVampire>())
4024 AddCondition<ConVampire>();
4026 if (!IsPC && !HasCooldown(8793))
4029 flag = ((!HasCondition<ConTransmuteBat>()) ? (!HasElement(431) && pos.IsSunLit) : (body.
HasElement(431) || (EClass.world.date.IsNight && !pos.IsSunLit)));
4036 UseAbility(
"SpTransmuteBat",
this);
4040 if (HasElement(1423) && !HasCondition<ConPeaky>())
4042 AddCondition<ConPeaky>();
4046 if (turn % 200 == 0)
4048 DiminishTempElements();
4060 preventRegen =
true;
4064 Say(
"dmgBurden",
this);
4065 DamageHP(MaxHP * (base.ChildrenWeight * 100 / WeightLimit) / 1000 + 1,
AttackSource.Burden);
4077 ModExp(207, 1 + phase2 * phase2);
4105 preventRegen =
true;
4109 if (
EClass.
rnd(100) == 0 && !isConfused)
4112 AddCondition<ConConfuse>(500);
4117 AddCondition<ConBlind>(200);
4120 if (turn % (200000 / Mathf.Max(100 + Evalue(409) * 10, 50)) == 0)
4128 int num2 = Evalue(409);
4129 if (num2 > 0 && turn % (200000 / Mathf.Max(100 + num2 * 10, 50)) == 0)
4134 for (
int num3 = conditions.Count - 1; num3 >= 0; num3--)
4136 if (num3 < conditions.Count)
4151 preventRegen =
true;
4166 case "cocoon_alien":
4176 if (elements.Base(79) >= 30)
4180 elements.SetTo(79, elements.Base(79) * 3 / 4);
4187 if (pos.IsBlocked && pos.HasBlock)
4189 preventRegen =
true;
4195 if (
EClass.
rnd(25) == 0 && base.hp < MaxHP)
4197 HealHP(
EClass.
rnd(Evalue(300) / 3 + 1) + 1);
4198 elements.ModExp(300, 8f);
4203 elements.ModExp(301, 8f);
4216 else if (stamina.
value < stamina.
max)
4232 if (parasite !=
null)
4244 Debug.LogError(
"exception: pos is not valid:" + pos?.ToString() +
"/" +
this);
4255 ignoreSPAbsorb =
false;
4258 if (hasMovedThisTurn)
4260 pos.Things.ForeachReverse(delegate(
Thing t)
4264 AI_Goto aI_Goto = ai.Current as AI_Goto;
4265 if ((aI_Goto == null && !(ai is GoalManualMove)) || (aI_Goto != null && !aI_Goto.dest.Equals(pos)))
4276 hasMovedThisTurn =
false;
4279 EClass.player.haltMove =
false;
4313 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
4324 if (!tileInfo.
shore)
4329 int num2 = (tileInfo.isRoad ? 22 : 12);
4332 num2 = (tileInfo.isRoad ? 16 : 10);
4336 num2 *= (flag2 ? 2 : 20);
4347 EClass.player.safeTravel = 5 +
EClass.
rnd(5);
4360 EClass.player.pickupDelay = 0f;
4368 EClass.player.returnInfo =
null;
4391 Msg.
Say(
"returnComplete");
4392 EClass.player.uidLastTravelZone = 0;
4394 EClass.player.lastZonePos =
null;
4396 EClass.player.returnInfo =
null;
4399 EClass.player.returnInfo =
null;
4400 Msg.
Say(
"returnOverweight");
4404 if ((HasNoGoal || !ai.
IsRunning) && !WillConsumeTurn())
4412 RecipeUpdater.dirty =
true;
4418 actTime = EClass.player.baseActTime * Mathf.Max(0.1f, (
float)
EClass.
pc.
Speed / (
float)Speed);
4419 hasMovedThisTurn =
false;
4422 if (!IsAliveInCurrentZone)
4426 renderer.RefreshStateIcon();
4427 if (host !=
null && !consumeTurn)
4429 if (host.
ride ==
this && ((host.
hasMovedThisTurn && IsInCombat) || (enemy !=
null && turn % 3 != 0)))
4435 if (Dist(enemy) < 3 &&
EClass.
rnd(2) == 0)
4437 Say(
"parasite_fail",
this, host);
4438 if (
EClass.
rnd(2) == 0 && GetInt(106) == 0)
4440 Talk(
"parasite_fail");
4455 if (base.isRestrained)
4476 Cell cell2 = base.Cell;
4479 AddCondition<ConWet>(50);
4480 if (pos.IsHotSpring)
4487 AddCondition<ConBurning>();
4491 AddCondition<ConSuffocation>(800 / (100 + EvalueMax(200, -5) * 10), force:
true);
4494 if (cell2.
effect !=
null)
4507 AddCondition<ConWet>(50);
4511 PlaySound(
"fire_step");
4512 AddCondition<ConBurning>(30);
4517 PlaySound(
"bubble");
4518 AddCondition<ConWet>(30);
4523 if (hasMovedThisTurn)
4525 Say(
"abMistOfDarkness_step",
this);
4527 AddCondition<ConDark>(e.
power);
4549 aliasEle = EClass.sources.elements.map[e.idEle].alias,
4579 if (rootCard !=
this && things.IsFull(c.
Thing))
4586 public void PickOrDrop(
Point p,
string idThing,
int idMat = -1,
int num = 1,
bool msg =
true)
4596 if (things.GetDest(t).IsValid)
4617 t = TryPoisonPotion(t);
4625 Say(
"backpack_full_drop", t);
4632 Say(
"backpack_full", t);
4636 if (dest.
stack !=
null)
4640 PlaySound(
"pick_thing");
4641 Say(
"pick_thing",
this, t);
4649 PlaySound(
"pick_thing");
4650 Say(
"pick_thing",
this, t);
4652 TryReservePickupTutorial(t);
4662 Say(
"poisonDrip",
this);
4676 Say(
"absorbRod",
this, t);
4679 if (
rod.source !=
null)
4682 if (enumerator.MoveNext())
4714 if (t.
id ==
"pasture")
4726 foreach (
Card item in pos.ListCards())
4731 if (thing !=
null && !IsPC)
4733 thing.isNPCProperty =
true;
4778 t.isNPCProperty =
false;
4782 pos.TryWitnessCrime(
this);
4792 EClass.player.altHeldPos = t.renderer.data.ForceAltHeldPosition ||
EClass.
rnd(2) == 0;
4796 if (num == -1 || num > t.
Num)
4807 t =
Pick(t.
Thing, msg:
false, tryStack:
false);
4822 WidgetHotbar.dirtyCurrentItem =
true;
4833 if (IsPC && held.
invY == 1)
4835 WidgetHotbar.dirtyCurrentItem =
true;
4847 Say(
"canOnlyCarry", held);
4852 if (!flag && things.IsOverflowing())
4856 Say(
"backpack_full_drop", held);
4864 PlaySound(
"pick_thing");
4865 Say(
"pick_held",
this,
card);
4866 if (IsPC &&
card.id ==
"statue_weird")
4873 WidgetHotbar.dirtyCurrentItem =
true;
4888 return held.
Split(a);
4911 WidgetHotbar.dirtyCurrentItem =
true;
4916 if (
card.trait.CanOnlyCarry)
4927 Msg.
Say(
"markedImportant");
4942 t.ignoreAutoPick =
true;
4953 int num = Evalue(131);
4954 int num2 = Evalue(130);
4955 int num3 = Evalue(123);
4956 if (num > num2 && num > num3)
4960 if (num2 > num && num2 > num3)
4964 if (num3 > num && num3 > num2)
4978 if (elements.Value(122) > elements.Value(120))
4980 return elements.GetElement(122);
4982 return elements.GetElement(120);
4987 isOnCreate = onCreate;
4992 RestockInventory(onCreate);
4997 string equip = source.
equip;
4998 if (equip.IsEmpty())
5002 if (equip ==
"none")
5013 EQ_ID(
"staff_long", 1);
5021 EQ_ID(
"tail_snowleopard");
5027 EQ_ID(
"sword_zephir");
5033 EQ_ID(
"sword", -1,
Rarity.Legendary);
5037 EQ_ID(
"dagger", -1,
Rarity.Legendary);
5040 case "adv_mesherada":
5043 EQ_ID(
"dagger_hathaway");
5049 EQ_ID(
"staff_long", -1,
Rarity.Legendary);
5053 EQ_ID(
"cloak_wing", -1,
Rarity.Mythical);
5059 EQ_ID(
"sword_muramasa");
5065 EQ_ID(
"dagger_gaki");
5069 EQ_ID(
"dagger_ninto");
5073 EQ_ID(
"dagger", -1,
Rarity.Legendary);
5079 EQ_ID(
"staff_Cat", -1,
Rarity.Mythical);
5088 EQ_ID(
"lightsaber_double", -1,
Rarity.Mythical);
5091 EQ_ID(
"cloak_mani2");
5093 AddThing(
"gun_gravity2");
5094 AddThing(
"gun_mani");
5100 AddThing(
"gun_gravity2");
5106 AddThing(
"bow_vindale");
5112 EQ_ID(
"martial_ring");
5118 EQ_ID(
"EtherDagger2");
5121 case "keeper_garden":
5124 EQ_ID(
"sword_ragnarok");
5130 EQ_ID(
"axe_destruction");
5136 EQ_ID(
"ribbon_duponne");
5142 EQ_ID(
"helm_seeker");
5145 EQ_ID(
"sword_katana");
5147 EQ_ID(
"sword_katana");
5150 EQ_ID(
"boots_seven");
5154 for (
int i = 0; i < 20; i++)
5159 AddThing(
"plat").SetNum(6);
5165 AddThing(
"guitar_efrond");
5171 AddThing(
"guitar_ash");
5177 EQ_ID(
"EtherDagger");
5185 thing.rarity =
Rarity.Normal;
5197 EQ_ID(
"staff_magius");
5203 EQ_ID(
"staff_insanity");
5209 EQ_ID(
"sword_katana");
5215 EQ_ID(
"staff_leek");
5221 EQ_ID(
"dagger_hocho");
5232 if (!TryEquipRanged())
5239 AddThing(
"gun_laser");
5241 case "youngladymaton":
5242 case "sister_catmaton":
5247 Thing thing2 = AddThing(
"panzerfaust");
5256 EQ_CAT((
EClass.
rnd(4) == 0) ?
"crossbow" :
"bow");
5266 int num = ((base.rarity >=
Rarity.Mythical) ? (base.LV * 3) : ((base.rarity >=
Rarity.Legendary) ? (base.LV * 2) : base.LV));
5271 if (race.
id ==
"asura")
5273 for (
int j = 0; j < 4; j++)
5275 EQ_CAT(job.
weapon.RandomItem());
5278 for (
int k = 0; k < ((!(race.id ==
"mutant")) ? 1 : Mathf.Min(2 + base.LV / 30, 20)); k++)
5286 else if (!job.
weapon.IsEmpty())
5290 EQ_CAT(job.
weapon.RandomItem());
5292 if (race.
id ==
"mutant" || (Evalue(131) > 0 &&
EClass.
rnd(2) == 0))
5294 EQ_CAT(job.
weapon.RandomItem());
5337 EQ_ID(
"shield_lute");
5340 if (HasTag(
CTAG.shield))
5351 if (ShouldRestock(
"_meat"))
5357 Restock(
"book_story", 1);
5359 case "rock_thrower":
5367 Restock(
"book_story_home", 1);
5372 void Restock(
string id,
int num)
5374 if (ShouldRestock(
id))
5379 bool ShouldRestock(
string id)
5381 return things.Find(
id) ==
null;
5389 int num = ((base.LV >= 1000) ? 7 : ((base.LV >= 500) ? 5 : ((base.LV >= 250) ? 3 : ((base.LV >= 100) ? 2 : ((base.LV >= 50) ? 1 : 0)))));
5390 Rarity rarity2 = base.rarity;
5391 if (
id ==
"big_sister")
5393 num = (isOnCreate ? 8 : 4);
5401 rarity =
Rarity.Superior;
5403 else if (rarity2 ==
Rarity.Legendary)
5407 else if (rarity2 >=
Rarity.Mythical)
5413 rarity =
Rarity.Legendary;
5415 CardBlueprint.current.rarity = rarity;
5423 CardBlueprint.current.rarity = r;
5426 if (body.
GetSlot(thing, onlyEmpty:
true) ==
null)
5431 if (!body.
Equip(thing))
5442 if ((slot == 0 || bodySlot !=
null) && (slot != 37 || !HasElement(1209)))
5447 if (bodySlot !=
null && !body.
Equip(thing, bodySlot))
5483 if (!IsPC && (!trait.CanJoinPartyResident || !trait.CanJoinParty || memberType !=
FactionMemberType.Default))
5487 Msg.
Say(
"returnHome",
this, homeZone.Name);
5504 base.hp = MaxHP / 3;
5507 if (hunger.
value > 30)
5511 sleepiness.value = 0;
5512 hostility = OriginalHostility;
5513 RemoveCondition<StanceTaunt>();
5514 if (
id ==
"keeper_garden")
5522 Msg.
Say(
"noDeathPenalty2",
this);
5526 Msg.
Say(
"noDeathPenalty",
this);
5532 List<Thing> dropList =
new List<Thing>();
5537 t.ignoreAutoPick = true;
5540 }, onlyAccessible:
false);
5546 EClass.player.preventDeathPenalty =
false;
5548 if (IsPCFaction && homeBranch !=
null)
5550 homeBranch.
Log(
"bRevive",
this);
5563 PlayEffect(
"revive");
5565 SetCensored(enable:
false);
5571 ModCorruption(-100000);
5572 if (base.LV < 10000000)
5574 SetLv(base.LV * 10 + 9);
5578 mana.value = mana.
max;
5579 stamina.value = stamina.
max;
5587 List<string> list =
new List<string> {
"930",
"931",
"947",
"948",
"949",
"950",
"951",
"952" };
5590 list =
new List<string> {
"944",
"946",
"backerGrave",
"backerGrave2" };
5594 if (!lastword.IsEmpty())
5596 thing.c_note = lastword;
5598 thing.isModified =
true;
5644 if (HasCondition<ConAnorexia>())
5650 else if (base.c_vomit > 10)
5652 AddCondition<ConAnorexia>();
5654 AddCondition<ConDim>();
5655 if (HasCondition<ConAnorexia>())
5676 if ((uint)(attackSource - 17) > 1u)
5678 AddCondition<ConFaint>(200, force:
true);
5683 bool isInActiveZone = IsInActiveZone;
5686 if (
id ==
"putty" && origin !=
null && origin.IsPCParty)
5696 if (
id ==
"tsunami")
5698 pos.PlaySound(
"water");
5702 Say(
"summon_vanish",
this);
5703 pos.PlayEffect(
"vanish");
5704 pos.PlaySound(
"vanish");
5709 if ((uint)(attackSource - 17) <= 1u)
5719 PlayEffect(
"revive");
5720 PlaySound(
"chime_angel");
5727 PlaySound(base.material.GetSoundDead(source));
5729 renderer.RefreshSprite();
5730 renderer.RefreshStateIcon();
5739 string text2 = ((origin ==
null) ?
"" : origin.GetName(
NameStyle.Full));
5742 text =
"dead_" + attackSource;
5748 text =
"dead_" + e.
source.alias;
5757 EClass.player.staminaRecovery = 0;
5758 EClass._zone.isDeathLocation =
true;
5759 string s = ((origin ==
null) ? text :
"dead_by");
5771 AI_PlayMusic.keepPlaying =
false;
5777 Msg.
Say(
"goto_heaven",
this);
5781 if (originalTarget !=
null || origin ==
null || !origin.isSynced || (attackSource !=
AttackSource.Melee && attackSource !=
AttackSource.Range))
5783 Msg.
Say(text,
this,
"", text2);
5785 string text3 = TalkTopic(
"dead");
5786 if (!text3.IsEmpty())
5788 text3 = text3.StripBrackets();
5790 bool flag = base.rarity >= Rarity.Legendary && !IsPCFaction;
5805 if (homeBranch !=
null)
5807 homeBranch.
Log(text,
this,
"");
5819 if (
id ==
"mandrake" || HasElement(488))
5821 Say(
"a_scream",
this);
5826 ClearTempElements();
5829 base.isSale =
false;
5841 EClass.player.returnInfo =
null;
5842 EClass.player.uidLastTravelZone = 0;
5851 chara3.enemy =
null;
5856 EClass.player.preventDeathPenalty =
true;
5861 bool flag2 = currentZone.IsActiveZone && IsLocalChara && !currentZone.IsPCFaction;
5870 currentZone.RemoveCard(
this);
5872 if ((origin !=
null && origin.IsPCParty) || IsPCFaction)
5875 if (IsPCFaction && !IsPCParty && (origin ==
null || !origin.IsPCParty))
5879 ModAffinity(
EClass.
pc, a, show:
false);
5881 if (!(text4 ==
"quru"))
5883 if (text4 ==
"corgon")
5895 if (origin.IsPCParty || origin.IsPCPartyMinion)
5902 else if (OriginalHostility >=
Hostility.Friend && IsHuman && !base.IsPCFactionOrMinion)
5906 else if (race.
id ==
"cat" && OriginalHostility >=
Hostility.Neutral)
5913 num = num * 30 / 100;
5924 else if (origin.IsPCFaction)
5926 origin.Chara.ModAffinity(
EClass.
pc, 1, show:
false);
5927 origin.Chara.ShowEmo(
Emo.love);
5930 if (base.sourceBacker !=
null && origin !=
null && origin.IsPCParty)
5934 if (base.IsPCFactionOrMinion)
5938 Msg.
Say(
"abort_allyDead");
5943 Msg.
Say(
"abort_enemyDead");
5945 if (IsPCParty && !IsPC)
5948 base.c_wasInPcParty =
true;
5954 if (attackSource !=
AttackSource.Euthanasia && !IsPCFaction)
5956 EClass.player.flags.little_killed =
true;
5970 case "shark_sister":
5979 if (attackSource ==
AttackSource.Finish && origin !=
null && origin.Evalue(665) > 0)
5983 if (chara2.
LV < base.LV)
5985 chara2.
SetLv(base.LV);
5987 chara2.
MakeMinion((origin.IsPCParty || origin.IsPCPartyMinion) ? EClass.pc : origin.Chara,
MinionType.Friend);
5988 Msg.
Say(
"plant_pop",
this, chara2);
5997 if (IsPCFaction || IsPCFactionMinion)
6004 Point point = pos.
GetNearestPoint(allowBlock:
true, allowChara:
false, allowInstalled:
false, ignoreCenter:
true) ?? pos;
6010 flag = (flag2 =
true);
6011 EClass._zone.Boss =
null;
6016 EClass.player.flags.KilledBossInVoid =
true;
6022 SE.Play(
"Jingle/fanfare2");
6032 flag = (flag2 =
true);
6042 flag = (flag2 =
true);
6054 flag = (flag2 =
true);
6059 EClass.player.flags.killedDuponne =
true;
6065 flag = (flag2 =
true);
6071 case "melilith_boss":
6073 flag = (flag2 =
true);
6080 if (questCurry !=
null)
6083 flag = (flag2 =
true);
6093 bool num2 =
EClass.
_map.
FindChara((
id ==
"fairy_raina") ?
"fairy_poina" :
"fairy_raina") ==
null;
6095 if (num2 && questNasu !=
null && questNasu.
phase <= 1)
6097 if (questNasu.
phase == 0)
6102 flag = (flag2 =
true);
6113 flag = (flag2 =
true);
6115 if (questExploration !=
null)
6117 SE.Play(
"kill_boss");
6127 SE.Play(
"kill_boss");
6128 SoundManager.ForceBGM();
6134 SE.Play(
"kill_boss");
6148 EClass.player.willAutoSave =
true;
6163 return UseAbility(elements.GetElement(idAct)?.act ??
ACT.
Create(idAct), tc, pos, pt);
6168 return UseAbility(elements.GetElement(idAct)?.act ??
ACT.
Create(idAct), tc, pos, pt);
6173 if (HasCooldown(a.
id))
6181 if (a.
source.proc.TryGet(0) ==
"Heal" && HasElement(1422) && !IsPC)
6183 List<int> list =
new List<int> { 8400, 8401, 8402, 8403, 8404, 8405 };
6184 int num = list.IndexOf(a.
id);
6187 int num2 = list.TryGet(num + Evalue(1422));
6188 a = elements.GetElement(num2)?.
act ??
ACT.
Create(num2);
6197 bool flag2 = ability.
Has(a.
id);
6198 if (IsPC && HasCondition<StanceManaCost>())
6200 num4 = Evalue(1657);
6212 ForeachEnemy(delegate
6219 ForeachParty(delegate
6235 num5 = (IsPC ? (n * 100) : (50 + n * 50));
6237 int num6 = cost.cost * num5 / 100;
6240 num6 = num6 * 100 / (100 + (int)Mathf.Sqrt(Evalue(483) * 10) * 3);
6250 if (!IsPC && cost.
type ==
Act.
CostType.MP && mana.
value < 0 && (
EClass.
rnd(4) != 0 || IsPCFaction || (base.IsPowerful && mana.value < -20)))
6259 ActPlan.warning =
true;
6262 EClass.scene.mouseTarget.card = cardBk;
6263 if (UseAbility(a, tc, pos, pt))
6272 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))
6274 Say(
"shakeHead",
this);
6277 if (tc !=
null && tc !=
this)
6281 if (pos !=
null && !base.pos.Equals(pos))
6287 num3 = 1 + Evalue(1648);
6289 if (IsPC && cost.
cost > 0 && a.
Value == 0 && !flag2)
6296 string s = (isConfused ?
"_cast_confuse" : (HasCondition<ConDim>() ?
"_cast_dim" :
""));
6297 if (!a.
source.tag.Contains(
"useHand"))
6299 Say(race.
castStyle.IsEmpty(
"cast"),
this, a.
source.GetName().ToLower(), s.lang());
6310 if (num4 > 0 && (a.
vPotential >= n * 2 || flag2))
6314 a.vPotential -= n * 2;
6316 num6 = num6 * (100 - num4 * 20) / 100;
6333 if (a.
source.langAct.Length != 0 && tc !=
null)
6335 string text = a.
source.langAct[0];
6336 string text2 = ((a.source.langAct.Length >= 2) ? a.
source.langAct[1] :
"");
6337 if (text ==
"spell_hand")
6340 string @ref = text2.lang(list2[4]);
6341 Say(tc.IsPCParty ?
"cast_hand_ally" :
"cast_hand",
this, tc, @ref, tc.IsPCParty ? list2[1] : list2[2]);
6345 Say(text,
this, tc, text2.IsEmpty() ?
"" : text2.lang());
6349 Talk(
"insult_" + (base.IsMale ?
"m" :
"f"));
6356 if (Evalue(1421) >= 2 && base.hp <= MaxHP / Mathf.Max(1, 9 - Evalue(1421) * 2))
6369 elements.ModExp(304, Mathf.Clamp(num6 * 2, 1, 200));
6373 int value = stamina.
value;
6375 if (IsPC && a.
HasTag(
"recovery"))
6377 EClass.player.staminaRecovery += value - stamina.
value;
6379 ignoreSPAbsorb =
true;
6383 if (a is
Spell && GetCondition<ConSilence>() !=
null)
6385 Say(
"cast_silence",
this);
6392 int spellExp = elements.GetSpellExp(
this, a, num5);
6395 Say(
"fizzle",
this);
6396 PlayEffect(
"fizzle");
6397 PlaySound(
"fizzle");
6400 ModExp(a.
id, spellExp / 5);
6402 RemoveCondition<ConInvisibility>();
6406 if (a.
source.cooldown > 0 && (!IsPC || !a.
source.tag.Contains(
"CD_npc")))
6408 AddCooldown(a.
id, a.
source.cooldown);
6410 if (HasTalk(
"phrase_" + a.
source.alias))
6412 EClass.player.forceTalk =
true;
6413 Talk(
"phrase_" + a.
source.alias);
6420 ForeachEnemy(delegate(
Chara c)
6427 ForeachParty(delegate(
Chara c)
6432 Act.forcePt =
false;
6436 for (
int num7 = 0; num7 < num3; num7++)
6442 ActEffect.RapidCount = num7;
6444 flag3 = a.
Perform(
this, tc, pos);
6447 if (flag3 && !isDead)
6451 elements.ModBase(a.
id, 1);
6455 ModExp(a.
id, spellExp);
6458 ActEffect.RapidCount = 0;
6459 if (flag3 && !a.
source.tag.Contains(
"keepInvisi") &&
EClass.
rnd(2) == 0)
6461 RemoveCondition<ConInvisibility>();
6462 RemoveCondition<ConDark>();
6464 if (!base.IsPCFactionOrMinion && a.
HasTag(
"specialAbility") && renderer.isSynced)
6466 string name = a.
Name;
6467 renderer.Say(
"| " + name +
" ");
6470 void ForeachEnemy(Action<Chara> action)
6472 if (_pts.Count == 0)
6477 if (chara !=
this && CanSeeLos(chara) && chara.
IsHostile(
this))
6483 for (
int num9 = _pts.Count - 1; num9 >= 0; num9--)
6488 void ForeachParty(Action<Chara> action)
6490 if (_pts.Count == 0)
6497 if (chara ==
this || chara.
host !=
null || CanSeeLos(chara))
6508 if ((chara2 ==
this || (chara2.
IsFriendOrAbove(
this) && CanSeeLos(chara2))) && (chara2 == tc || _pts.Count < 3 ||
EClass.
rnd(_pts.Count * _pts.Count) > 6))
6515 int num10 = _pts.IndexOf(
this);
6518 _pts.RemoveAt(num10);
6519 _pts.Insert(0,
this);
6521 for (
int num11 = _pts.Count - 1; num11 >= 0; num11--)
6523 action(_pts[num11]);
6532 return 25 + Evalue(226) * 125 / 100;
6548 if (host.
ride ==
this)
6550 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
EvalueRiding()));
6554 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.
Evalue(227)));
6559 int num3 = Evalue(304);
6562 num3 = Mathf.Max(num3, base.LV + 5);
6566 bool num6 = GetArmorSkill() == 122;
6570 num4 = 20 - Evalue(122) / 5;
6571 num5 += 10 - Evalue(1654) * 4;
6575 num4 = 10 - Evalue(120) / 5;
6585 if (parasite !=
null)
6596 num5 += 20 - Evalue(1654) * 8;
6602 if (HasCondition<ConDim>())
6604 num4 += ((Evalue(1654) >= 3) ? 1500 : 2500);
6614 return Mathf.Clamp(100 + e.
Value - 10 - e.
source.LV * e.
source.cost[0] * num4 / Mathf.Max(10 + num3 * 10, 1), 0, 100 - num5);
6617 public void DoAI(
int wait, Action onPerform)
6632 Say(headpat ?
"headpat" :
"cuddle",
this, c);
6638 if (headpat &&
this != c)
6649 if (!member.
IsPC && CanSeeLos(member))
6659 if (c.
id ==
"hedgehog_ether")
6663 Say(
"reflect_thorne",
this, c);
6670 EClass.player.forceTalk =
true;
6671 Talk(
"kiss",
null,
null, IsPC);
6673 renderer.PlayAnime(
AnimeID.Kiss, c);
6676 if (num > 0 &&
EClass.
rnd(IsPC ? 100 : 5000) == 0)
6680 if (IsPC &&
this != c)
6692 Effect.
Get(
"love").
_Play(pos, isSynced ? renderer.position : pos.Position(), 0f, c.
pos);
6697 if (
id ==
"olderyoungersister")
6702 Say(
"slap",
this, c);
6739 if (enemy ==
null && !IsPC)
6741 if (GetInt(106) == 0)
6745 if (OriginalHostility !=
Hostility.Enemy)
6749 SetEnemy(_tg.
Chara);
6763 if (_tg ==
null || !_tg.
isChara)
6770 EClass.pc.combatCount = 10;
6778 chara.
Say(
"frown",
this, chara);
6790 chara.
Say(
"frown",
this, chara);
6797 bool flag = chara.id ==
"fanatic";
6800 chara.
Say(
"callHelp", chara);
6872 if (mimicry !=
null && mimicry.
IsThing)
6876 if (!base.IsPCFactionOrMinion && OriginalHostility ==
Hostility.Neutral && !(trait is
TraitGuard) &&
id !=
"unicorn")
6880 bool flag = enemy !=
null || ai is
GoalCombat;
6881 int num = (base.PER + Evalue(210) * 2) * ((!flag) ? 1 : 2);
6883 bool flag3 = !IsPCParty;
6889 if (chara2 ==
this || !IsHostile(chara2) || !CanSee(chara2) || (chara2.mimicry !=
null && chara2.
mimicry.
IsThing))
6893 int num3 = Dist(chara2);
6894 int num4 = GetSightRadius() + (flag ? 1 : 0);
6901 if (
this == pos.FirstChara)
6903 chara2.
ModExp(152, Mathf.Clamp((num - chara2.
Evalue(152)) / 2, 1, Mathf.Max(30 - stealthSeen * 2, 1)));
6911 DoHostileAction(chara2);
6924 DoHostileAction(chara);
6936 if (chara !=
this && chara != enemy && (chara.
mimicry ==
null || !chara.
mimicry.
IsThing) && IsHostile(chara) && Dist(chara) <= 1 && CanInteractTo(chara.
pos))
6938 DoHostileAction(chara);
6957 if (base.IsPCFactionOrMinion)
6970 if (OriginalHostility >=
Hostility.Friend)
6986 if (
id ==
"unicorn" && (Evalue(418) < 0 || (c.
HasElement(1216) && c.
Evalue(418) < 1)))
7019 return EClass.game.activeZone == currentZone;
7026 foreach (
Point item2
in item.ListPoints())
7028 if (pos.Equals(item2))
7049 if (base.IsPCFactionOrMinion || IsFriendOrAbove())
7069 base.idSkin = (EClass.core.config.game.antiSpider ? source.skinAntiSpider : 0);
7073 charaRenderer.pccData = PCCData.Create(
"ride");
7074 string idPart = base.c_idRidePCC.IsEmpty(
EClass.
core.
pccs.sets[
"ride"].map[
"body"].map.Keys.First());
7075 charaRenderer.
pccData.SetPart(
"body",
"ride", idPart);
7076 charaRenderer.pccData.ride =
EClass.
core.
pccs.GetRideData(idPart);
7080 foreach (
Condition condition
in conditions)
7083 if (rendererReplacer !=
null)
7085 charaRenderer.replacer = rendererReplacer;
7086 charaRenderer.data = rendererReplacer.
data;
7087 charaRenderer.pccData = rendererReplacer.
pccData;
7091 if (charaRenderer.
replacer ==
null)
7093 charaRenderer.pccData = pccData;
7096 renderer = charaRenderer;
7098 if (cardRenderer !=
null)
7100 renderer.SetFirst(first:
false, cardRenderer.
position);
7102 return charaRenderer;
7109 PCC.Get(pccData).Build(state);
7115 string str = GetStr(
"sprite_override");
7118 Sprite sprite = ModUtil.LoadSprite(str);
7126 PCC pCC = PCC.Get(pccData);
7128 return pCC.variation.idle[0, 0];
7132 if (spriteReplacer?.data !=
null)
7134 Sprite sprite2 = spriteReplacer.
GetSprite(dir, skin, snow);
7140 if (sourceCard.
tiles.Length > 1)
7142 skin = ((base.idSkin == 0 && !source.
staticSkin) ? (base.uid % sourceCard.
tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)) : base.idSkin);
7144 return sourceCard.
GetSprite(dir, skin, snow);
7165 else if (conSleep !=
null && host ==
null && pos.Equals(
EClass.
pc.
pos) && IsHuman && (GetBool(123) || affinity.
CanSleepBeside()))
7174 p.mat = base.material;
7175 p.matColor = base.colorInt;
7176 if (!renderer.usePass)
7180 if (renderer.replacer !=
null)
7182 p.tile = renderer.replacer.tile * ((!flipX) ? 1 : (-1));
7183 if (renderer.replacer.mat != -1)
7187 p.color -= 1048576f;
7194 int num = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % source.
_tiles_snow.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
7203 p.tile = source.
_tiles_snow[0] * ((!flipX) ? 1 : (-1));
7206 else if (sourceCard.
_tiles.Length > 1)
7208 int num2 = ((base.idSkin != 0 || source.
staticSkin) ? base.idSkin : (base.uid % sourceCard.
_tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
7213 p.tile = sourceCard.
_tiles[(num2 >= 0 && num2 < sourceCard.
_tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
7217 p.tile = sourceCard.
_tiles[0] * ((!flipX) ? 1 : (-1));
7224 if (mimicry !=
null && mimicry.
IsThing)
7228 string text = ((mimicry !=
null && mimicry.Card !=
this) ? mimicry.
GetName(
NameStyle.Full) : base.Name);
7229 if (IsFriendOrAbove())
7233 else if (IsHostile())
7239 if (base.LV >= lV * 5)
7243 else if (base.LV >= lV * 2)
7247 else if (base.LV <= lV / 4)
7251 else if (base.LV <= lV / 2)
7257 string s = (IsFriendOrAbove() ?
"HostilityAlly" : (IsNeutral() ?
"HostilityNeutral" :
"HostilityEnemy"));
7258 s = (
" (" + s.lang() +
") ").TagSize(14);
7262 s += (
" (" +
"guest".lang() +
") ").TagSize(14);
7266 s += (
" (" +
"livestock".lang() +
") ").TagSize(14);
7272 text2 +=
"lowerGround".lang();
7274 else if (HasHigherGround(
EClass.
pc))
7276 text2 +=
"higherGround".lang();
7279 if (Evalue(1232) > 0)
7281 text2 =
"milkBaby".lang().TagSize(14) + text2;
7285 text2 =
"hasBounty".lang().TagSize(14) + text2;
7289 text2 += (
"(" + faith.Name +
")").TagSize(14);
7295 return text + text2 + s;
7300 if (mimicry !=
null && mimicry.
IsThing)
7307 text += Environment.NewLine;
7308 text = text +
"<size=14>" +
"favgift".lang(GetFavCat().GetName().ToLower(), GetFavFood().GetName()) +
"</size>";
7313 text2 += Environment.NewLine;
7314 text2 = text2 +
"Lv:" + base.LV +
" HP:" + base.hp +
"/" + MaxHP +
" MP:" + mana.value +
"/" + mana.max +
" DV:" + DV +
" PV:" + PV +
" Hunger:" + hunger.
value;
7315 text2 += Environment.NewLine;
7317 text2 += Environment.NewLine;
7318 text2 = text2 + base.uid + IsMinion +
"/" + base.c_uidMaster +
"/" + master;
7319 text2 = text2 +
" dir:" + base.dir +
" skin:" + base.idSkin +
" scaled:" + base.
isScaled;
7323 text2 += Environment.NewLine;
7324 text2 +=
"<size=14>";
7327 text2 = text2 + item.Name +
", ";
7329 foreach (
Hobby item2
in ListHobbies())
7331 text2 = text2 + item2.Name +
", ";
7333 text2 = text2.TrimEnd(
", ".ToCharArray()) +
"</size>";
7336 IEnumerable<BaseStats> enumerable = conditions.Concat((!IsPCFaction) ?
new BaseStats[0] :
new BaseStats[2] { hunger, stamina });
7337 if (enumerable.Count() > 0)
7339 text3 += Environment.NewLine;
7340 text3 +=
"<size=14>";
7349 if (text4.IsEmpty() || text4 ==
"#")
7354 switch (item3.
source.group)
7367 text4 = text4 +
"(" + item3.
GetValue() +
")";
7368 if (resistCon !=
null && resistCon.ContainsKey(item3.
id))
7370 text4 = text4 +
"{" + resistCon[item3.
id] +
"}";
7374 text3 = text3 + text4.TagColor(c) +
", ";
7383 text3 = text3.TrimEnd(
", ".ToCharArray()) +
"</size>";
7388 text3 += Environment.NewLine;
7391 text3 = text3 + item4.act.Name +
", ";
7393 text3 = text3.TrimEnd(
", ".ToCharArray());
7395 return text + text2 + text3;
7401 string key = ((condition ==
null) ? source : condition.
chara.
source).idText.IsEmpty((condition ==
null) ? id : condition.
chara.
id);
7411 string text = row.GetText(topic, returnNull:
true);
7416 if (text.StartsWith(
"@"))
7423 text = row.GetText(topic, returnNull:
true);
7429 return text.Split(Environment.NewLine.ToCharArray()).RandomItem();
7434 if (host ==
null && !IsInActiveZone)
7438 if (!isSynced && (host ==
null || !host.
isSynced) && topic !=
"dead")
7444 int num = EClass.pc.party.members.Count - 1;
7469 string topicText = GetTopicText(topic);
7470 if (topicText.IsEmpty())
7474 HashSet<string> obj =
new HashSet<string>
7476 "_bracketTalk".lang(),
7481 bool flag = topicText.StartsWith(
"*");
7482 bool flag2 = topicText.StartsWith(
"(");
7483 bool flag3 = obj.Any(topicText.StartsWith);
7484 topicText = ApplyTone(topicText);
7485 topicText = topicText.Replace(
'~',
'*');
7487 Msg.
Say(StripTalkSpecialCharacters(topicText.Replace(
"&",
"")));
7488 if (topic ==
"dead")
7492 else if (flag || flag3 || flag2)
7494 (host ??
this).renderer.Say(ApplyNewLine(topicText.StripBrackets()),
default(
Color), IsPCParty ? 0.6f : 0f);
7512 if (conSuspend !=
null && IsPCParty)
7514 RemoveCondition<ConSuspend>();
7518 if (IsDeadOrSleeping)
7520 ShowDialog(
"_chara",
"sleep");
7525 ShowDialog(
"_chara",
"invisible");
7531 ShowDialog(
"_chara",
"give_card");
7540 if (GetInt(71) == -2)
7542 ShowDialog(
"_chara",
"give_lunch");
7548 if (base.isRestrained)
7550 ShowDialog(
"_chara",
"strain");
7555 ShowDialog(
"_chara",
"escort");
7560 string step = ((!(EClass._zone is
Zone_Wedding)) ?
"party" : (IsPCParty ?
"wedding_love" : ((IsMarried || affinity.
IsWeddingHater) ?
"wedding_hater" :
"wedding")));
7563 step =
"wedding_cutter";
7565 base.c_love.gaveCutter =
true;
7567 ShowDialog(
"_chara", step);
7585 EClass.player.flags.loytelEscaped =
false;
7587 ShowDialog(
"loytel",
"loytelEscaped");
7591 if (questDebt !=
null && questDebt.
paid)
7594 if (questDebt.
stage > 7)
7596 questDebt.stage = 7;
7598 ShowDialog(
"loytel",
"debt" + questDebt.
stage);
7606 ShowDialog(
"farris");
7612 ShowDialog(
"farris",
"nymelle_noQuest");
7615 ShowDialog(
"farris",
"nymelle_first");
7618 ShowDialog(
"farris",
"home_first");
7621 ShowDialog(
"farris");
7626 ShowDialog(
"ashland");
7631 SoundManager.ForceBGM();
7638 EClass.player.flags.fiamaFirstDream =
true;
7639 ShowDialog(
"fiama",
"firstDream");
7643 ShowDialog(
"fiama",
"giveStoryBook").SetOnKill(delegate
7645 EClass.player.flags.fiamaStoryBookGiven =
true;
7651 ShowDialog(
"fiama");
7656 ShowDialog(
"fiama");
7662 ShowDialog(
"big_sister",
"little_saved");
7663 EClass.player.flags.little_saved =
false;
7668 ShowDialog(
"big_sister",
"little_dead");
7669 EClass.player.flags.little_killed =
false;
7677 ShowDialog(
"guild_doorman",
"main", tag);
7683 ShowDialog(
"guild_clerk",
"main", tag2);
7692 string book =
"_chara";
7695 string text = GetStr(
"drama_override").IsEmpty(
id);
7696 if (File.Exists(PackageIterator.GetFiles(
"Dialog/Drama/" + text +
".xlsx").LastOrDefault()?.FullName ?? (
CorePath.
DramaData +
id +
".xlsx")))
7706 return _ShowDialog(
book,
null, step, tag);
7712 if (
book ==
"_chara" && IsPC)
7730 return base.LV / 2 + 4;
7736 if (FindBed() !=
null)
7745 return GetHappiness().ToString() ??
"";
7750 string result =
"?????";
7763 uIItem.
text2.
SetText(race.GetText().ToTitleCase(wholeText:
true) +
" " + job.GetText().ToTitleCase(wholeText:
true));
7773 sortVal = job._index * 10000 + sourceCard.
_index;
7776 sortVal = race._index * 10000 * ((!IsHuman) ? 1 : (-1)) + sourceCard.
_index;
7779 sortVal = -GetTotalFeat();
7785 sortVal = sourceCard._index * ((!IsHuman) ? 1 : (-1));
7792 sortVal -= 100000000;
7802 foreach (
Card item in map.props.installed.all)
7806 traitBed.RemoveHolder(
this);
7825 if (!IsPCFaction && !IsGuest())
7834 Msg.
Say(
"claimBed",
this);
7843 if (GetInt(113) != 0)
7848 Thing bestRangedWeapon = GetBestRangedWeapon();
7849 foreach (
Thing thing
in things)
7855 _ListItems.Add(thing);
7859 _ListItems.Add(thing);
7863 if (_ListItems.Count == 0)
7867 List<Thing> containers2 = containers.ToList();
7868 foreach (
Thing listItem
in _ListItems)
7893 bool flag = GetInt(113) == 0;
7902 foreach (
Thing thing3
in things)
7904 if (CanEat(thing3, shouldEat))
7920 if (thing3.
id ==
"polish_powder")
7934 foreach (
Thing container
in containers)
7944 if (num4 > 0 && thing4.
id ==
"polish_powder")
7946 _ListItems.Add(thing4);
7951 _ListItems.Add(thing4);
7956 _ListItems.Add(thing4);
7961 _ListItems.Add(thing4);
7964 else if (num > 0 && CanEat(thing4, shouldEat) && !thing4.
c_isImportant)
7966 _ListItems.Add(thing4);
7971 _ListItems.Add(thing4);
7976 _ListItems.Add(thing4);
7981 if (_ListItems.Count == 0)
7985 _ListItems.ForeachReverse(delegate(
Thing t)
7990 int slot = t.category.slot;
7991 int equipValue = t.GetEquipValue();
7992 foreach (Thing listItem in _ListItems)
7994 if (listItem.category.slot == slot && listItem.GetEquipValue() > equipValue)
8002 _ListItems.Remove(t);
8007 foreach (
Thing listItem2
in _ListItems)
8009 Thing thing = listItem2;
8010 if (things.IsFull(thing))
8019 thing = thing.
Split(1);
8022 else if (thing.
Num > 2)
8024 thing = thing.
Split(2);
8031 if (ShouldEquip(thing, useFav:
true) && thing.
category.slot != 0)
8033 TryEquip(thing, useFav:
true);
8039 TryPutSharedItems(containers);
8045 Thing result =
null;
8053 int num2 = CountNumEaten(
item);
8054 int num3 = 100 - num2 + (
item.HasElement(757) ? 10 : 0);
8068 t = FindBestFoodToEat();
8080 Say(
"eat_start",
this, t.Duplicate(1));
8103 if ((IsPC || (homeBranch !=
null && homeBranch.
GetCivility() >= 50)) && (t.
HasTag(
CTAG.dish_fail) || t.
id ==
"731"))
8118 if (!CanEquipRanged(t))
8123 foreach (
Thing thing
in things)
8144 if (bodySlot ==
null)
8150 switch (GetFavAttackStyle())
8189 if (!base.IsPCFactionOrMinion)
8194 if (value.
Value <= 0)
8211 num2 += value.Value * num3 / 100;
8228 if (!ShouldEquip(t, useFav))
8239 switch (GetFavAttackStyle())
8255 body.
Equip(t, slot);
8261 Say(
"equip",
this, t);
8277 return FindThrowable(hotbar:
true);
8281 things.Foreach(delegate(
Thing t)
8283 if (t.
HasTag(
CTAG.throwWeapon) || (!base.IsPCFactionOrMinion && t.
HasTag(
CTAG.throwWeaponEnemy)))
8289 Thing FindThrowable(
bool hotbar)
8291 things.Foreach(delegate(
Thing t)
8328 return things.Find((
Thing t) => ranged.
IsAmmo(t));
8333 Thing result =
null;
8335 foreach (
Thing thing
in things)
8355 ranged = GetRandomRangedWeapon();
8367 if (ranged !=
null && ranged.
parent ==
this)
8371 ranged = GetBestRangedWeapon();
8372 return ranged !=
null;
8377 if (body.
GetWeight(armorOnly:
true) <= (HasElement(1204) ? 6000 : 30000))
8402 if (t.
id ==
"cigar")
8412 if (t.
trait.
CanEat(
this) && hunger.
GetPhase() > ((IsPCFaction || IsPCFactionMinion) ? 2 : 0))
8414 SetAIImmediate(
new AI_Eat
8428 if (base.hp < MaxHP * 90 / 100)
8431 if (healAction !=
null)
8442 return FindBed()?.owner.pos.cell.room;
8457 if (!trait.CanChangeAffinity)
8462 if (IsPCFaction && homeBranch !=
null)
8464 num += (int)Mathf.Sqrt(homeBranch.
Evalue(2117)) * 5;
8481 Say(
"affinityNone",
this, c);
8486 ShowEmo((!flag) ?
Emo.angry :
Emo.love);
8490 Say(flag ?
"affinityPlus" :
"affinityMinus",
this, c);
8496 a = affinity.
Mod(a);
8503 int num = Evalue(289);
8515 num2 += (lV - num) * 10;
8517 elements.
ModExp(289, Mathf.Min(num2, 1000));
8533 chara.orgPos = orgPos.
Copy();
8535 chara.pos = pos.
Copy();
8536 chara.isImported =
true;
8537 chara.c_editorTags = base.c_editorTags;
8538 chara.c_editorTraitVal = base.c_editorTraitVal;
8539 chara.c_idTrait = base.c_idTrait;
8540 chara.homeZone = homeZone;
8548 content.RefreshCharaBio(
this);
8549 if (!content.favFood.IsEmpty() &&
EClass.
sources.
things.map.TryGetValue(content.favFood, out var value))
8554 string str = GetStr(72);
8559 if (_listFavFood.Count == 0)
8563 if (row._origin ==
"dish" && row.value != 0 && row.chance != 0)
8565 _listFavFood.Add(row);
8572 r = _listFavFood.RandomItem();
8581 content.RefreshCharaBio(
this);
8582 if (!content.favCategory.IsEmpty() &&
EClass.
sources.
categories.map.TryGetValue(content.favCategory, out var value) && value.gift > 0)
8587 string str = GetStr(73);
8593 if (_listFavCat.Count == 0)
8599 _listFavCat.Add(row);
8605 r = _listFavCat.RandomItem();
8612 if (base.c_love ==
null)
8619 SetFeat(1275, 1, msg:
true);
8625 if (base.c_love !=
null)
8627 base.c_love.dateMarriage = 0;
8628 base.c_love.dateWedding = 0;
8636 using (List<Chara>.Enumerator enumerator = pos.ListCharasInRadius(
this, 3, (
Chara c) => c !=
this && c.
race.id ==
"cat").GetEnumerator())
8638 if (enumerator.MoveNext())
8640 return enumerator.Current;
8648 Say(
"abCatSniff",
this, c);
8653 c.
Talk(
new string[4] {
"labor",
"disgust",
"scold",
"callGuards" }.RandomItem());
8659 if (base.c_upgrades !=
null)
8661 num += base.c_upgrades.spent;
8663 if (base.c_genes !=
null)
8665 num += base.c_genes.GetTotalCost();
8667 return num + base.feat;
8674 if (
item.act.id == 6630)
8684 string text = race.
id;
8685 if ((text ==
"mifu" || text ==
"nefu") &&
EClass.
rnd(2) == 0)
8698 string str = GetStr(
"portrait_override");
8703 if (
id ==
"olderyoungersister")
8705 if (base.idSkin != 2)
8707 return "UN_olderyoungersister";
8709 return "UN_olderyoungersister_alt";
8715 return base.c_idPortrait;
8734 if (HasElement(1231))
8737 AddCondition<ConEuphoric>(100 * Evalue(1231));
8741 SetFeat(1231, 1, msg:
true);
8751 int num2 = ((!HasElement(1411)) ? 1 : 3);
8752 if (GetBurden(t, num) >= num2)
8765 if (!IsValidGiftWeight(t, num))
8782 if (things.IsFull())
8802 if (base.IsPowerful && t.
trait is
TraitScroll { source: not null } traitScroll && traitScroll.
source.abilityType.Contains(
"summon"))
8813 Msg.
Say(
"affinityNone", c,
this);
8819 int num2 = 200 + t.LV * 3;
8832 PlayEffect(
"identify");
8833 PlaySound(
"identify");
8835 c.
Say(
"draw_curse", c, t);
8837 List<Element> list =
new List<Element>();
8838 foreach (
Element value
in elements.dict.Values)
8845 if (list.Count == 0)
8847 SayNothingHappans();
8850 Element element = list.RandomItem();
8851 ModExp(element.
id, num2);
8852 Say(
"draw_curse2",
this, element.
Name);
8856 if ((t.
id ==
"lovepotion" || t.
id ==
"dreambug") && !Application.isEditor)
8858 GiveLovePotion(c, t);
8872 case "ticket_massage":
8879 case "ticket_armpillow":
8887 case "ticket_champagne":
8894 if (t.
id ==
"flyer")
8899 c.
Talk(
"flyer_miss");
8905 Msg.
Say(
"affinityNone", c,
this);
8907 elements.ModExp(291, 10f);
8910 elements.ModExp(291, 50f);
8912 if (t.
id ==
"statue_weird")
8937 Say(
"give_erohon",
this);
8938 AddCondition<ConParalyze>(50, force:
true);
8939 AddCondition<ConConfuse>(50, force:
true);
8940 AddCondition<ConFear>(1000, force:
true);
8948 c.
Say(
"give_love", c, t);
8958 if (HasCondition<StanceTaunt>() || base.isRestrained || attacker ==
this)
8982 int num = Mathf.Max(chara.
Evalue(1649), (!flag2) ? 1 : 3);
8983 int num2 = Dist(chara);
8988 if (num2 > num || !chara.
CanSeeLos(pos, num2))
8994 Point nearestPoint = pos.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
9002 Say(
"intercept_loyal", chara,
this);
9005 if (num2 > num || !chara.
CanSeeLos(pos, num2))
9010 if (!flag && !HasElement(1225))
9012 Say(
"intercept", chara,
this);
9015 chara.
Talk(
"intercept", base.NameSimple);
9017 if (attacker.enemy ==
this)
9019 attacker.SetEnemy(chara);
9082 if (t.
id ==
"flyer")
9107 if (!things.IsAlmostFull())
9136 for (
int num2 = things.Count - 1; num2 >= 0; num2--)
9138 Thing thing = things[num2];
9139 if (ShouldThrowAway(thing, type))
9150 Msg.
Say(
"party_sell",
this, num.ToString() ??
"");
9158 _ = base.c_upgrades;
9167 for (
int i = 0; i < 100; i++)
9173 if (base.c_upgrades ==
null)
9177 if (base.c_upgrades.halt)
9188 List<Element> list = ListAvailabeFeats(pet:
true);
9189 if (num >= 90 && list.Count > 0)
9191 Element element = list.RandomItem();
9195 else if (num >= 60 && ie.Any())
9197 num2 = ie.RandomItem().id;
9208 if (num4 > base.feat)
9213 base.c_upgrades.count++;
9214 base.c_upgrades.spent += num4;
9220 if (
item.idEle == num2)
9241 SetFeat(num2, elements.ValueWithoutLink(num2) + 1, msg:
true);
9243 else if (elements.ValueWithoutLink(row.
id) == 0)
9245 elements.Learn(row.
id);
9249 elements.ModBase(num2, num3);
9256 if (IsPC || base.isScaled || HasElement(1273))
9262 if (base.c_daysWithPC > 360)
9273 if (_cooldowns ==
null)
9275 _cooldowns =
new List<int>();
9279 _cooldowns.Add(idEle * 1000 + turns);
9285 _cooldowns.Add(idEle * 1000 + row.
cooldown);
9291 if (_cooldowns ==
null)
9293 _cooldowns =
new List<int>();
9296 for (
int i = 0; i < _cooldowns.Count; i++)
9298 if (_cooldowns[i] / 1000 == idEle)
9302 _cooldowns.RemoveAt(i);
9306 _cooldowns[i] = idEle * 1000 + turns;
9312 if (!flag && turns > 0)
9314 AddCooldown(idEle, turns);
9316 if (_cooldowns.Count == 0)
9324 return GetCooldown(idEle) != 0;
9329 if (_cooldowns !=
null)
9331 for (
int i = 0; i < _cooldowns.Count; i++)
9333 if (_cooldowns[i] / 1000 == idEle)
9335 return _cooldowns[i] % 1000;
9344 for (
int num = _cooldowns.Count - 1; num >= 0; num--)
9346 if (_cooldowns[num] % 1000 == 1)
9348 _cooldowns.RemoveAt(num);
9355 if (_cooldowns.Count == 0)
9368 if (IsPCParty || base.noMove)
9373 if ((IsHomeMember() && IsInHomeZone()) || IsGuest())
9376 if (goalFromTimeTable !=
null)
9378 SetAI(goalFromTimeTable);
9381 goalFromTimeTable.
Tick();
9386 if (goalList.
index == -2)
9388 goalList.
Refresh(
this, goalListType);
9390 SetAI(goalList.
Next());
9414 return GetGoalWork();
9420 return GetGoalHobby();
9455 if (_works ==
null || _hobbies ==
null)
9459 foreach (
int work
in _works)
9466 foreach (
int hobby
in _hobbies)
9487 return SetAI(_NoGoalPC);
9505 Debug.Log(
"goal is g:" + ai?.ToString() +
"/" +
this);
9509 if (HasCondition<ConWait>())
9511 RemoveCondition<ConWait>();
9517 renderer.RefreshStateIcon();
9524 bool hasNoGoal = HasNoGoal;
9559 listHobby.Add(
new Hobby
9570 foreach (
int work
in _works)
9572 listHobby.Add(
new Hobby
9586 if (_hobbies ==
null)
9590 foreach (
int hobby
in _hobbies)
9592 listHobby.Add(
new Hobby
9605 if (
item.source.alias ==
id)
9610 foreach (
Hobby item2
in ListHobbies())
9612 if (item2.
source.alias ==
id)
9622 if (workElements !=
null)
9626 workElements =
null;
9627 if (IsPCParty || homeBranch ==
null || homeBranch.
owner ==
null)
9635 foreach (
Hobby item2
in ListWorks())
9639 if (workElements !=
null)
9643 void TryAdd(
Hobby h)
9645 if (!h.
source.elements.IsEmpty())
9647 if (workElements ==
null)
9651 for (
int i = 0; i < h.
source.elements.Length; i += 2)
9653 int num = h.
source.elements[i];
9654 int num2 = h.
source.elements[i + 1];
9656 if (num != 2115 && num != 2207)
9664 workElements.
ModBase(num, (num2 < 0) ? (num2 / 10) : Mathf.Max(1, h.
source.elements[i + 1] * num3 / 1000));
9672 string text = (simple ?
"" : (
"hobby".lang() +
":"));
9677 return text.TrimEnd(
',');
9682 string text = (simple ?
"" : (
"work".lang() +
":"));
9687 return text.TrimEnd(
',');
9692 foreach (
int hobby
in _hobbies)
9704 foreach (
int work
in _works)
9716 if (_hobbies !=
null && _works !=
null)
9723 _hobbies =
new List<int>();
9724 _works =
new List<int>();
9732 string[] hobbies = source.
hobbies;
9733 foreach (
string text
in hobbies)
9740 ModUtil.LogModError(
"source chara row '" + source.
id +
"' has invalid hobby '" + text +
"'", source);
9743 if (source.
works.IsEmpty())
9749 string[] hobbies = source.
works;
9750 foreach (
string text2
in hobbies)
9757 ModUtil.LogModError(
"source chara row '" + source.
id +
"' has invalid work '" + text2 +
"'", source);
9760 GetWorkSummary().Reset();
9765 if (_workSummary ==
null)
9769 return _workSummary;
9782 if (workSummary.
work !=
null)
9787 else if (workSummary.
hobbies.Count > 0)
9808 hobby.id = session.
id;
9813 workSummary.progress +=
EClass.
rnd(5) + 5;
9815 int num = PerformWork(hobby, 0, isHobby);
9816 int num2 = PerformWork(hobby, 1, isHobby);
9817 int num3 = PerformWork(hobby, 2, isHobby);
9818 int num4 = PerformWork(hobby, 3, isHobby);
9819 workSummary.money += num;
9820 workSummary.food += num2;
9821 workSummary.knowledge += num3;
9822 workSummary.material += num4;
9823 int PerformWork(
Hobby work,
int idx,
bool flag)
9825 if (idx >= work.
source.resources.Length)
9829 int num5 = work.
source.resources[idx];
9831 num5 =
Rand.
Range(num5 * (100 - work.
source.resources[idx]) / 100, num5);
9832 num5 = num5 * (flag ? 50 : 100) * session.
efficiency / 10000;
9833 if (num6 > 0 && num5 <= 0)
9843 _goalWork.
FindWork(
this, setAI:
false);
9859 foreach (
Condition condition
in conditions)
9861 condition.
SetOwner(
this, onDeserialize);
9867 return AddCondition(typeof(T).Name, p, force);
9872 return AddCondition(typeof(T).Name, p, p2, force);
9884 return AddCondition(condition, force);
9892 if (c is
ConBleed && ResistLv(964) >= 3)
9897 else if (ResistLv(950) >= 3)
9915 if (c.
source.negate.Length != 0)
9917 string[] negate = c.
source.negate;
9918 foreach (
string text
in negate)
9920 if (HasElement(text))
9927 if (defenseAttribute !=
null)
9931 if (c.
source.resistance.Length != 0)
9936 c.power /= num * num + 1;
9952 num2 = num2 * (100 + (int)Mathf.Sqrt(Evalue(494)) * 10) / 100;
9958 for (
int j = 0; j < conditions.Count; j++)
9960 if (conditions[j].
id != c.
id)
9966 conditions[j].Kill();
9969 if (conditions[j].CanStack(c))
9971 if (conditions[j].ShouldOverride(c))
9973 if (conditions[j].IsOverrideConditionMet(c, num2))
9975 conditions[j].Kill(silent:
true);
9980 if (CanGainConResist)
9984 conditions[j].OnStacked(c.
power);
9985 conditions[j].OnStartOrStack();
9986 conditions[j].PlayEffect();
9988 if (!conditions[j].AllowMultipleInstance)
9993 foreach (
Condition condition
in conditions)
10002 if (CanGainConResist)
10009 if (c.ShouldRefresh)
10021 if (c.SyncRide && (
ride !=
null || parasite !=
null))
10027 if (parasite !=
null)
10035 public override bool HasCondition<T>()
10037 for (
int i = 0; i < conditions.Count; i++)
10039 if (conditions[i] is T)
10049 for (
int i = 0; i < conditions.Count; i++)
10051 if (conditions[i].source.alias == alias)
10066 for (
int i = 0; i < conditions.Count; i++)
10070 return conBuffStats.elements.GetElement(ele);
10079 foreach (
Condition condition
in conditions)
10091 T condition = GetCondition<T>();
10092 if (condition !=
null)
10094 int value = condition.value - v;
10095 condition.value = value;
10096 if (condition.value <= 0)
10105 for (
int i = 0; i < conditions.Count; i++)
10107 if (conditions[i].source.alias == idCon)
10109 return conditions[i];
10115 public override T GetCondition<T>()
10117 for (
int i = 0; i < conditions.Count; i++)
10119 if (conditions[i] is T)
10121 return conditions[i] as T;
10129 for (
int num = conditions.Count - 1; num >= 0; num--)
10131 if (conditions[num] is T)
10133 conditions[num].
Kill();
10141 if (parasite !=
null)
10143 parasite.
Cure(type, p, state);
10147 ride.Cure(type, p, state);
10149 Cure(type, p, state);
10159 CureCondition<ConFear>();
10160 CureCondition<ConBlind>(2 * p / 100 + 5);
10161 CureCondition<ConPoison>(5 * p / 100 + 5);
10162 CureCondition<ConConfuse>(10 * p / 100 + 10);
10163 CureCondition<ConDim>(p / 100 + 5);
10164 CureCondition<ConBleed>(2 * p / 100 + 10);
10171 CureCondition<ConBlind>(5 * p / 100 + 15);
10172 CureCondition<ConPoison>(10 * p / 100 + 15);
10173 CureCondition<ConBleed>(5 * p / 100 + 20);
10174 CureTempElements(p, body:
true, mind:
false);
10177 CureCondition<ConFear>();
10178 CureCondition<ConDim>(3 * p / 100 + 10);
10179 CureTempElements(p, body:
false, mind:
true);
10183 for (
int num2 = conditions.Count - 1; num2 >= 0; num2--)
10185 Condition condition2 = conditions[num2];
10190 condition2.
Mod(-1, force:
true);
10198 CureCondition<ConWait>();
10199 CureCondition<ConDisease>((
EClass.
rnd(20) + 10) * p / 100);
10200 bool flag2 = HasCondition<ConAnorexia>();
10201 base.c_vomit -= (flag2 ? 3 : 2) * p / 100;
10202 if (base.c_vomit < 0)
10207 RemoveCondition<ConAnorexia>();
10218 CureTempElements(p * 100, body:
true, mind:
true);
10219 for (
int num = conditions.Count - 1; num >= 0; num--)
10226 switch (condition.
Type)
10246 CureCondition<ConWait>();
10247 CureCondition<ConSleep>();
10254 RemoveCondition<ConBrightnessOfLife>();
10255 RemoveCondition<ConDeathSentense>();
10259 if (HasElement(1206))
10261 SetFeat(1206, 0, msg:
true);
10263 RemoveCondition<ConBrightnessOfLife>();
10264 RemoveCondition<ConDeathSentense>();
10278 for (
int num = conditions.Count - 1; num >= 0; num--)
10294 if (
TC.hp > (
long)
TC.MaxHP * (
long)(Mathf.Min(5 + (
int)Mathf.Sqrt(power),
harvest ? 35 : 25) + Evalue(1426) * 5) / (
TC.IsPowerful ? 200 : 100))
10298 if (
TC.HasElement(427))
10306 PlaySound(
"hit_finish");
10308 Say(
"finish2",
this,
TC);
10318 if (resistCon ==
null)
10320 resistCon =
new Dictionary<int, int>();
10322 if (resistCon.ContainsKey(key))
10324 resistCon[key] += con.power * con.GainResistFactor / 100;
10328 resistCon[key] = con.power * con.GainResistFactor / 100;
10335 if (con.
power > 0 && resistCon !=
null)
10337 int a =
ClassExtension.TryGetValue<int,
int>((IDictionary<int, int>)resistCon, con.
id, 0);
10359 RemoveCondition<ConAwakening>();
10364 con.pcPillow = pillow;
10365 con.pickup = pickup;
10366 con.posBed = posBed;
10367 con.posPillow = posPillow;
10373 bool isSunLit = pos.IsSunLit;
10375 int num =
bed?.Power ?? 20;
10376 if (traitPillow !=
null)
10378 num += traitPillow.owner.Power / 2;
10382 num +=
bed.Evalue(750) * 5;
10388 OnSleep(num, days, isSunLit);
10391 public void OnSleep(
int power,
int days = 1,
bool isSunLit =
false)
10397 int num = power * days;
10398 if (stamina.
value < 0)
10414 if (isWeakToSunlight && isSunLit)
10417 if (mana.
value > 0)
10421 AddCondition<ConBurning>(1000, force:
true);
10426 stamina.
Mod(10 + 25 * num / 100 * (100 + elements.GetFeatRef(1642)) / 100);
10443 if (!HasElement(450))
10445 long num = bio.height;
10446 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
10451 if (num > 999999999)
10455 if (num != bio.height)
10457 bio.height = (int)num;
10458 Say((a > 0) ?
"height_gain" :
"height_lose",
this);
10465 if (HasElement(450) || a == 0)
10469 long num = bio.weight;
10470 long num2 = bio.height;
10471 long num3 = num2 * num2 * 18 / 25000;
10472 long num4 = num2 * num2 * 24 / 10000;
10473 if (ignoreLimit || (num > num3 && num < num4))
10475 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
10480 if (num > 999999999)
10484 if (num != bio.weight)
10486 bio.weight = (int)num;
10487 Say((a > 0) ?
"weight_gain" :
"weight_lose",
this);
10496 if (Evalue(962) >= 25 || (ResistLv(962) > 0 &&
EClass.
rnd(ResistLv(962) + 1) != 0))
10500 int num = Evalue(412);
10503 float num2 = (float)a * 100f / (
float)Mathf.Max(100 + num * 2, 10);
10504 a = (int)num2 + ((
EClass.
rndf(1f) < num2 % 1f) ? 1 : 0);
10511 int num3 = (corruption + a) / 100 - corruption / 100;
10512 for (
int i = 0; i < Mathf.Abs(num3); i++)
10514 if (!MutateRandom((num3 > 0) ? 1 : (-1), 100, ether:
true))
10521 foreach (
Element value
in elements.dict.Values)
10523 if (value.
source.category ==
"ether")
10525 num4 += value.
Value;
10528 if (num4 > 0 && IsPC)
10532 corruption = num4 * 100 + corruption % 100;
10535 public List<Element>
ListAvailabeFeats(
bool pet =
false,
bool showAll =
false,
bool purchaseFeat =
false)
10537 List<Element> list =
new List<Element>();
10540 Feat feat = elements.GetOrCreateElement(
item.id) as
Feat;
10541 int num = ((feat.ValueWithoutLink <= 0) ? 1 : (feat.
ValueWithoutLink + 1));
10554 public void SetFeat(
int id,
int value = 1,
bool msg =
false)
10556 Feat feat = elements.GetElement(
id) as
Feat;
10558 if (feat !=
null && feat.
Value > 0)
10560 if (value == feat.
Value)
10567 feat = elements.SetBase(
id, value - (feat?.vSource ?? 0)) as
Feat;
10568 if (feat !=
null && feat.
Value != 0)
10575 CalculateMaxStamina();
10583 if (feat.
source.textInc.IsEmpty())
10585 PlaySound(
"ding_skill");
10587 Say(
"gainFeat",
this, feat.
FullName);
10591 bool flag = value < num;
10592 if (feat.
source.tag.Contains(
"neg"))
10601 PlaySound(
"chime_angel");
10607 PlaySound(
"chime_devil");
10611 PlaySound(
"mutation");
10615 Say((value > num) ? feat.
source.GetText(
"textInc") : feat.
source.GetText(
"textDec"),
this, feat.
FullName);
10618 elements.CheckSkillActions();
10625 Element element = elements.GetElement(idEle);
10626 Element element2 = elements.GetElement(row2.
id);
10627 int num = element?.
Value ?? 0;
10636 bool flag = (row.
tag.Contains(
"neg") ? (a > num) : (a < num));
10637 if (a == 0 && (element ==
null || element.
Value == 0))
10639 SayNothingHappans();
10642 if (element !=
null && element.
Value == a)
10644 SayNothingHappans();
10647 if (element2 !=
null && element2.
Value > 0)
10649 SetFeat(element2.
id, 0);
10652 PlaySound(
"mutation");
10653 PlayEffect(
"mutation");
10655 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
10660 if (!ether && vec >= 0 && HasElement(406) &&
EClass.
rnd(5) != 0)
10662 Say(
"resistMutation",
this);
10666 for (
int num = 0; num < tries; num++)
10669 if (num == 0 && vec < 0 && ether && base.c_corruptionHistory != null && base.c_corruptionHistory.Count > 0)
10675 base.c_corruptionHistory.RemoveAt(base.c_corruptionHistory.Count - 1);
10676 if (base.c_corruptionHistory.Count == 0)
10678 base.c_corruptionHistory =
null;
10681 Element element = elements.GetElement(row.
id);
10683 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))
10690 element = elements.GetElement(row.
id);
10692 bool flag = row.
tag.Contains(
"neg");
10705 if (element !=
null)
10707 num2 = element.Value + ((vec != 0) ? vec : ((
EClass.
rnd(2) == 0) ? 1 : (-1)));
10708 if (num2 > element.
source.max)
10710 num2 = element.source.max - 1;
10712 flag = (flag && num2 > element.
Value) || (!flag && num2 < element.
Value);
10713 flag2 = num2 > element.
Value;
10714 if (vec > 0 && !flag2)
10719 Say(flag2 ?
"mutation_gain" :
"mutation_loose",
this);
10720 SetFeat(row.
id, num2);
10721 if (flag2 && ether)
10723 if (base.c_corruptionHistory ==
null)
10725 base.c_corruptionHistory =
new List<int>();
10727 base.c_corruptionHistory.Add(row.
id);
10730 Element element2 = elements.GetElement(row.
id);
10735 EClass.player.flags.gotEtherDisease =
true;
10737 thing.
SetStr(53,
"letter_ether");
10746 PlaySound(ether ?
"mutation_ether" :
"mutation");
10747 PlayEffect(
"mutation");
10749 Say(row.GetText(flag ?
"textDec" :
"textInc", returnNull:
true) ?? row.
alias,
this);
10753 Say(
"nothingHappens");
10759 Element orCreateElement = elements.GetOrCreateElement(ele);
10762 elements.ModBase(orCreateElement.
id, 1);
10764 if (orCreateElement is
Spell)
10766 int num =
EClass.
curve(Evalue(307), 50, 20) + (HasElement(307) ? 20 : 0);
10767 int num2 = origin?.Evalue(765) ?? 0;
10768 num = num * (100 - num2) / 100;
10769 int a = mtp * orCreateElement.source.charge * (100 + num) / 100 / 100;
10771 if (orCreateElement.
source.charge == 1)
10775 orCreateElement.vPotential += a;
10777 Say(
"spell_gain",
this, orCreateElement.
Name);
10789 Msg.
Say(
"curse_nullify", member);
10794 else if (HasElement(1641) &&
EClass.
rnd(3) != 0)
10796 Say(
"curse_nullify",
this);
10799 if (GetCondition<ConHolyVeil>() !=
null &&
EClass.
rnd(5) != 0)
10801 Say(
"curse_nullify",
this);
10809 if (_historyFood !=
null)
10811 while (_historyFood.Count > 5)
10813 _historyFood.RemoveAt(_historyFood.Count - 1);
10815 if (_historyFood[0].Count > 0)
10817 _historyFood.Insert(0,
new List<string>());
10824 if (!IsPCFaction || !IsGlobal)
10826 _historyFood =
null;
10829 if (_historyFood ==
null)
10831 _historyFood =
new List<List<string>>
10836 if (_historyFood[0].Count < 5)
10838 _historyFood[0].Add(
food.id);
10844 if (_historyFood ==
null)
10849 foreach (List<string>
item in _historyFood)
10851 foreach (
string item2
in item)
10853 if (item2 ==
food.id)
10866 return 10 + (int)(Mathf.Sqrt(base.c_daysWithGod) * 2f + (float)Evalue(85)) / 2;
10868 return 10 + (int)(Mathf.Sqrt(base.LV) * 5f + (float)Evalue(306)) / 2;
10873 if (faithElements !=
null)
10878 if (idFaith ==
"eyth" && !HasElement(1228))
10888 if (!HasCondition<ConExcommunication>())
10896 int num = GetPietyValue() * (120 + Evalue(1407) * 15 + Evalue(1228) * 20) / 100;
10897 for (
int i = 0; i < array.Length; i += 2)
10899 int num2 = array[i + 1] * num / 50;
10900 if (array[i] == 79)
10902 num2 =
EClass.
curve(num2, array[i + 1] * 2, 10, 50);
10904 if (num2 >= 20 && array[i] >= 950 && array[i] < 970)
10908 faithElements.
SetBase(array[i], Mathf.Max(num2, 1));
10914 public void ModTempElement(
int ele,
int a,
bool naturalDecay =
false,
bool onlyRenew =
false)
10920 bool flag = HasElement(1215);
10921 if (tempElements ==
null)
10930 int num = elements.ValueWithoutLink(ele);
10931 int num2 = Mathf.Abs(num) + 100;
10932 int num3 = num2 / (flag ? 2 : 4);
10933 int num4 = -num - 100;
10934 int num5 = tempElements.
Base(ele);
10935 int num6 = num5 + a;
10938 num3 = Mathf.Min(a, num3);
10939 num4 = Mathf.Max(a, -num2 / 3);
10941 if (a > 0 && num6 > num3)
10943 a = ((num3 > num5) ? (num3 - num5) : 0);
10945 if (a < 0 && num6 < num4)
10947 a = ((num4 < num5) ? (num4 - num5) : 0);
10950 if (element.
vBase == 0)
10953 if (tempElements.
dict.Count == 0)
10955 tempElements =
null;
10974 ModTempElement(ele, onlyRenew ? (-p / 20) : (-(p / 100 +
EClass.
rnd(p / 100 + 1) + 1)), naturalDecay:
false, onlyRenew);
10980 foreach (
int ele
in array)
10982 EnhanceTempElement(ele, p, onlyRenew);
10988 ModTempElement(ele, onlyRenew ? (p / 20) : (p / 100 +
EClass.
rnd(p / 100 + 1)), naturalDecay:
false, onlyRenew);
10993 if (tempElements ==
null)
10999 if (
item.vBase > 0)
11001 ModTempElement(
item.id, -Mathf.Min(
item.vBase * 5 / 100 + 1,
item.vBase), naturalDecay:
true);
11008 if (tempElements !=
null)
11019 void Cure(
int[] eles)
11021 foreach (
int ele
in eles)
11023 if (tempElements ==
null)
11028 if (element !=
null && element.
vBase < 0)
11030 ModTempElement(ele, Mathf.Clamp(p / 20 +
EClass.
rnd(p / 20), 1, -element.
vBase));
11038 if (tempElements !=
null)
11041 tempElements =
null;
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 void Unride(Chara host, Chara mount, bool talk=true)
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
virtual bool ValidatePerform(Chara _cc, Card _tc, Point _tp)
bool IsTargetHostileParty()
virtual bool CanRapidFire
static Affinity Get(Chara c)
virtual RendererReplacer GetRendererReplacer()
virtual bool PreventRegen
virtual int EvaluatePower(int p)
virtual int GainResistFactor
virtual bool TryMove(Point p)
Element GetDefenseAttribute(Chara c=null)
virtual int EvaluateTurn(int p)
void Mod(int a, bool force=false)
virtual void SetOwner(Chara _owner, bool onDeserialize=false)
virtual bool TryNullify(Condition c)
virtual void OnEndPlayerTurn()
virtual ConditionType Type
virtual string GetPhaseStr()
static int GetColorInt(ref Color matColor, int p)
static void Set(CardBlueprint _bp=null)
static CardBlueprint CharaGenEQ
GlobalCharaList globalCharas
void PlayAnime(AnimeID id, bool force)
RendererReplacer replacer
virtual string GetName(NameStyle style, int num=-1)
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
SourceMaterial.Row material
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
void SetInt(string id, int value=0)
Card MakeRefFrom(string id)
virtual int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
virtual CardRenderer _CreateRenderer()
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 SetStr(string id, string value=null)
BlessedState blessedState
bool TryStackTo(Thing to)
virtual bool IsPCFactionMinion
void ApplyBacker(int bid)
void ModExp(string alias, int a)
void PlayAnime(AnimeID id, bool force=false)
SourceCategory.Row category
void SetBool(string id, bool enable)
void ModNum(int a, bool notify=true)
virtual RenderRow TileRow
void AddExp(int a, bool applyMod=true)
bool HasElement(int ele, bool includeNagative=false)
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 HasElement(int idEle)
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)
BaseCondition GetCondition(string idCon)
Thing FindBestFoodToEat()
Hostility OriginalHostility
void TryPickGroundItem(Func< Card, bool > func=null)
LayerDrama _ShowDialog(string book, string sheet, string step="main", string tag="")
List< Element > ListAvailabeFeats(bool pet=false, bool showAll=false, bool purchaseFeat=false)
bool CanAcceptGift(Chara c, Card t)
WorkSummary GetWorkSummary()
override void Rotate(bool reverse=false)
Chara CreateReplacement()
override Sprite GetImageSprite()
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)
List< Chara > ListFussableCharas(int radius=2)
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
bool CanAcceptItem(Card t, int num=-1, bool skipImportantCheck=false)
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 MoveResult TryMove(Point newPoint, bool allowDestroyPath=true)
override void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
override string ToString()
Chara TryDuplicate(DuplicateCondition con=DuplicateCondition.Default, Point dest=null, bool inheritHostility=false)
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 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()
bool CanDuplicate(DuplicateCondition con=DuplicateCondition.Default)
void DiminishTempElements(int a=1)
Thing GetRandomRangedWeapon()
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)
Condition AddCondition(string id, int p, int p2, bool force=false)
override bool IsPCFactionMinion
void SetCooldown(int idEle, int turns=0)
void Slap(Chara c, bool slapToDeath=false)
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)
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 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 UseAbility(int idAct, Card tc=null, Point pos=null, bool pt=false)
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
ConBaseTransmuteMimic mimicry
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)
bool TryFuse(float chance=1f)
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
virtual string GetHoverText2()
virtual string GetName(NameStyle style, int num=-1)
virtual string GetHoverText()
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 string GetBloodText(Chara c)
static Thing GenerateGene(Chara c, Type? type=null)
int GetRaw(int offsetHours=0)
static void TryWarnMana(Action action)
static int curve(long _a, int start, int step, int rate=75)
static ColorProfile Colors
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
Effect _Play(Point from, Vector3 fromV, float fixY=0f, Point to=null, Sprite sprite=null)
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
virtual bool PotentialAsStock
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
virtual List< string > Apply(int a, ElementContainer owner, bool hint=false)
override bool IsPurchaseFeatReqMet(ElementContainer owner, int lv=-1)
static void ProcDrink(Chara c, Thing food)
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
bool Contains(int dx, int dz)
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 int ClampToInt(long a)
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)
List< Chara > listCarryoverMap
HashSet< int > doneBackers
void RecoverStamina(int a)
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)
List< Chara > ListCharasInRadius(Chara cc, int dist, Func< Chara, bool > func, bool onlyVisible=true)
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()
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
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)
bool IsStarted(string id)
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
virtual void Revelation(string idTalk, Card c, 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
bool tryFixPrefNotLoadedAtStart
void LoadPrefAndFixDensity()
Sprite GetSprite(string suffix="")
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 void GetAchievement(ID_Achievement id)
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 int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
override string GetName(NameStyle style, int _num=-1)
Thing Identify(bool show=true, IDTSource idtSource=IDTSource.Identify)
virtual bool UseRandomName
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 ShopType ShopType
virtual bool CanEat(Chara c)
virtual bool IsChangeFloorHeight
virtual void OnStepped(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 RefreshDeathSentense()
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)
Chara SpawnMob(string id, Point pos=null)
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)