2using System.Collections.Generic;
4using System.Runtime.Serialization;
32 [JsonProperty(PropertyName =
"A")]
33 public int[]
_ints =
new int[30];
35 [JsonProperty(PropertyName =
"B")]
36 public string id =
"";
38 [JsonProperty(PropertyName =
"C")]
41 [JsonProperty(PropertyName =
"D")]
44 [JsonProperty(PropertyName =
"E")]
47 [JsonProperty(PropertyName =
"SC")]
260 return 0.001f * (float)
_ints[15];
264 _ints[15] = (int)(value * 1000f);
272 return 0.001f * (float)
_ints[16];
276 _ints[16] = (int)(value * 1000f);
288 _ints[17] = (int)value;
300 _ints[18] = (int)value;
324 _ints[19] = (int)value * 100;
1046 SetInt(103, value ? 1 : 0);
1058 SetInt(109, value ? 1 : 0);
1070 SetInt(63, value ? 1 : 0);
1082 SetInt(64, value ? 1 : 0);
1094 SetInt(120, value ? 1 : 0);
1106 SetInt(121, value ? 1 : 0);
1118 SetInt(122, value ? 1 : 0);
1816 return GetObj<UniqueData>(6);
1828 return GetObj<Thing>(9);
1840 return GetObj<List<SocketData>>(17);
1852 return GetObj<Thing>(10);
1876 return GetObj<CharaUpgrade>(11);
1888 return GetObj<LoveData>(20);
1900 return GetObj<CharaGenes>(15);
1912 return GetObj<List<int>>(16);
1936 return GetObj<DNA>(14);
1948 return GetObj<CharaList>(13);
1960 return GetObj<MixedFoodData>(18);
1972 return GetObj<Thing>(19);
1984 return GetObj<byte[]>(4);
2060 public int ExpToNext => (int)Math.Min((50 + (
long)
LV * 30L) * (100 -
Evalue(403)) / 100, 99999999L);
2083 if (_childrenWeight < 0 || _childrenWeight > 10000000)
2171 if (
Tiles.Length == 1)
2173 return dir % 2 == 1;
2237 return id ==
"grass";
2385 if (
Tiles.Length < 3)
2459 return bio.gender == 2;
2559 return GetBool(
id.GetHashCode());
2564 SetBool(
id.GetHashCode(), enable);
2567 public int GetInt(
string id,
int? defaultInt =
null)
2569 int num =
GetInt(
id.GetHashCode(), defaultInt);
2579 AddInt(
id.GetHashCode(), value);
2588 SetInt(
id.GetHashCode(), value);
2595 public string GetStr(
string id,
string defaultStr =
null)
2597 return GetStr(
id.GetHashCode(), defaultStr);
2600 public void SetStr(
string id,
string value =
null)
2602 SetStr(
id.GetHashCode(), value);
2612 SetObj(
id.GetHashCode(), o);
2674 if (
card.isSale || !
card.trait.CanUseContent)
2679 if (windowSaveData !=
null)
2691 EClass.player.wasDirtyWeight =
true;
2709 public int Evalue(
int ele,
bool ignoreGlobalElement)
2735 return c_editorTags?.Contains(tag.ToString()) ??
false;
2768 int num2 =
item.Value;
2843 for (
int i = 0; i <
sockets.Count; i++)
2861 thing.parent =
this;
2911 CardBlueprint.current =
null;
2962 if (
id ==
"microchip")
3044 EClass._zone.Boss =
Chara;
3089 if (!(value.
source.category ==
"attribute") && !(value.
source.category ==
"skill"))
3093 int num = elementContainer.Value(value.
id);
3123 public void AddExp(
int a,
bool applyMod =
true)
3148 num = num * (50 + EClass.game.principal.petFeatExpMtp * 50) / 100;
3152 return num * (100 +
Evalue(1237) * 30 +
Evalue(1273) * 50 + ((
Evalue(1275) >= 2) ? 50 : 0)) / 100;
3183 Say(
"dingExp",
this);
3198 int num = Mathf.Min(1 +
LV / 5, 20);
3199 for (
int i = 0; i < num; i++)
3201 if (
Evalue(1644) < i + 1)
3239 if (rootCard !=
null && rootCard.
IsPC)
3294 Debug.LogWarning(
"already child:" + t);
3299 Debug.Log(
"already in the list" + t);
3314 t.ignoreAutoPick =
false;
3358 if (rootCard !=
null && rootCard.
IsPC)
3367 t.isNPCProperty =
false;
3381 Msg.
Say((count == 1) ?
"newIng" :
"newIngs", count.ToString() ??
"");
3384 void TryAdd(
Thing a)
3386 if (!ings.Contains(a.
id))
3404 List<Chara> list =
new List<Chara>();
3420 if (!
item.IsPCFactionOrMinion)
3425 if (list2.Count == 0)
3429 foreach (
Thing item2
in list2)
3433 item.body.Unequip(item2);
3436 Msg.
Say(
"waterCurse", item2);
3440 foreach (
Chara item3
in list)
3447 if (list3.Count == 0)
3451 foreach (
Thing item4
in list3)
3453 Msg.
Say(
"destroyed_inv_", item4, item3);
3465 List<Chara> list =
new List<Chara>();
3479 if (
item.IsPCFactionOrMinion)
3493 for (
int num =
things.Count - 1; num >= 0; num--)
3504 rootCard.Chara.held =
null;
3510 instance.selectedButton.card =
null;
3513 ActionMode.AdvOrRegion.updatePlans =
true;
3530 if (thing.
invY == 1)
3532 WidgetCurrentTool.dirty =
true;
3536 if (thing.
props !=
null)
3544 WidgetHotbar.dirtyCurrentItem =
true;
3545 thing.parent =
null;
3550 if (
item.invs[0].owner.Container.GetRootCard() !=
EClass.
pc &&
item.floatInv)
3557 thing.parent =
null;
3566 return EClass.ui.layers.Count > 0;
3588 to.c_isImportant =
true;
3613 return card.GetRootCard();
3640 thing.encLV =
encLV;
3641 thing.decay =
decay;
3644 foreach (KeyValuePair<int, int>
item in mapInt)
3648 foreach (KeyValuePair<int, string> item2
in mapStr)
3650 thing.
mapStr[item2.Key] = item2.Value;
3656 thing.sockets = IO.DeepCopy(
sockets);
3672 ModNum(-a, notify:
false);
3684 return this as
Thing;
3687 return this as
Thing;
3693 return this as
Thing;
3696 public void ModNum(
int a,
bool notify =
true)
3735 ApplySocket(traitMod.source.id, traitMod.owner.encLV, traitMod.owner);
3741 for (
int i = 0; i <
sockets.Count; i++)
3759 for (
int i = 0; i <
sockets.Count; i++)
3765 int ele = num / 1000;
3766 int num2 = num % 1000;
3861 if (
item.source.category ==
"resist" && (
item.vBase != 0 ||
item.vSource != 0))
3867 string encSlot = source.
encSlot;
3868 if (encSlot ==
null || encSlot.Length != 0)
3881 string[] array = source.
encSlot.Split(
',');
3882 foreach (
string key
in array)
3930 if (this.placeState == newState)
3936 Debug.Log(
"tried to change placestate of non-root card:" +
this);
3948 float num = (
fy = 0f);
3959 this.placeState = newState;
3967 this.placeState = newState;
4022 num = num * (100 +
Quality) / 100;
4059 int num = ((a == 1) ? 180 : ((a == 2) ? 400 : ((a >= 3) ? 600 : 0)));
4106 public bool TryPay(
int a,
string id =
"money")
4113 Msg.
Say((
id ==
"ration") ?
"notEnoughFood" :
"notEnoughMoney");
4117 if (
IsPC && !(
id ==
"ration"))
4137 Say(
"spellbookCrumble",
this);
4146 if (
id ==
"influence")
4158 if (
id ==
"influence")
4165 if (sum >
int.MaxValue)
4192 a = a * Mathf.Max(100 -
Evalue(93), 1) / 100;
4225 int num =
PV + orCreateElement.Value +
DEX / 10;
4232 num2 = num3 / 10 + 1;
4233 sides = num3 / num2 + 1;
4235 dmg = dmg * 100 / Mathf.Max(100 + num, 1);
4237 long num4 =
Dice.
Roll(num2, sides, bonus,
this);
4238 dmg -= num4 * mod / 100;
4252 int num = origin.Evalue(1238);
4256 if (origin.HasElement(1247))
4261 if (attackSource ==
AttackSource.MagicArrow && origin.HasElement(1244))
4265 if (attackSource ==
AttackSource.MagicHand && origin.HasElement(1246))
4269 if (idEle == 916 && (
HasElement(1253) || origin.HasElement(1253)))
4278 DamageHP(dmg, 0, 0, attackSource, origin);
4287 bool flag = originalTarget !=
null;
4288 Action onEvade =
null;
4297 Say(
"wall_bond", chara3,
this);
4299 origin?.Chara?.DoHostileAction(chara3);
4307 if ((uint)(attackSource2 - 3) > 2u && (uint)(attackSource2 - 13) > 5u)
4313 int num = chara4.
Evalue(1241);
4314 int num2 = chara4.
Evalue(438);
4317 Say((num2 == 0) ?
"wall_flesh" :
"wall_knightly", chara4,
this);
4318 chara4.
DamageHP(dmg * (100L + (
long)((num2 > 0) ? (-10) : 0) + ((num > 0) ? 10 : 0)) / 100, ele, eleP, attackSource, origin, showEffect,
weapon,
Chara);
4319 origin?.Chara?.DoHostileAction(chara4);
4327 long num3 = 99999999L;
4330 dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt(
LV - 50) * 2.5f)) / 100;
4332 if (origin !=
null && origin.HasElement(1208))
4334 switch (attackSource)
4337 dmg = dmg * 130 / 100;
4338 eleP = eleP * 150 / 100;
4341 dmg = dmg * 120 / 100;
4342 eleP = eleP * 150 / 100;
4348 dmg = dmg * (100 + origin.Evalue(94)) / 100;
4351 if (ele == 0 || ele == 926)
4356 dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
4362 if (attackSource !=
AttackSource.Condition && showEffect)
4378 dmg = dmg * 100 / (100 + Mathf.Clamp(
Evalue(961) * 5, -50, 200));
4379 dmg = dmg * Mathf.Max(100 -
Evalue(93), 10) / 100;
4386 if (chara2 !=
null && chara2.
isWet)
4395 if (chara !=
null && chara.
isWet)
4397 dmg = dmg * 150 / 100;
4403 if (origin !=
null && origin.isChara && origin.Chara.HasCondition<
ConSupress>())
4409 if (origin !=
null && origin.HasCondition<
ConBerserk>())
4418 dmg = dmg * (100 - (int)Mathf.Min(95f, Mathf.Sqrt(num4 - 50))) / 100;
4423 dmg = dmg * 100 / (100 +
Evalue(435) * 2);
4425 dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(
Evalue((e ==
Element.
Void || e.
id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;
4432 dmg = dmg * 90 / 100;
4436 dmg = dmg * 100 / Mathf.Clamp(100 +
Evalue(971), 25, 1000);
4440 dmg = dmg * 90 / 100;
4460 dmg = dmg * 100 / Mathf.Min(100 + num6 * (3 + num5 * 2), 120);
4462 else if (origin !=
null && origin.IsPCFactionOrMinion)
4464 dmg = dmg * Mathf.Min(100 + num7 * (3 + num5 + 2), 120) / 100;
4469 dmg = dmg * 100 / Mathf.Clamp(105 +
EClass.
pc.
Evalue(135) / 10, 10, 110);
4471 if (
HasElement(1218) && attackSource != AttackSource.ManaBackfire && (
hp > 0 ||
Evalue(1421) <= 0))
4473 dmg = dmg * (1000 - Mathf.Min(
Evalue(1218), 999) / ((!flag) ? 1 : 2)) / 1000;
4481 int num8 =
MaxHP / 10;
4482 long num9 = dmg - num8;
4483 num9 = num9 * 100 / (200 +
Evalue(68) * 10);
4498 if (condition !=
null)
4500 num3 = num3 * (100 + condition.lv * 5) / 100;
4507 float num10 = Mathf.Clamp(dmg * 6 /
MaxHP, 0f, 4f) + (float)((dmg > 0) ? 1 : 0);
4518 if (hp < 0 && Chara.mana.value >= 0)
4534 Chara.mana.value -= (int)dmg;
4551 float ratio = (float)dmg / (
float)
MaxHP;
4562 if (
EClass.
pc.
ai is
AI_PracticeDummy { IsRunning:
not false } aI_PracticeDummy && aI_PracticeDummy.target ==
this && (origin ==
null || origin.IsPC))
4564 aI_PracticeDummy.hit++;
4565 aI_PracticeDummy.totalDamage += dmg;
4608 if (origin !=
null && origin !=
this &&
Evalue(436) > 0 && !HasCondition<ConFractured>())
4617 hp = Mathf.Min(half * (
int)Mathf.Sqrt(
Evalue(436) * 2) / 100,
MaxHP / 3);
4638 Msg.
Say(
IsPC ?
"abort_damage" :
"abort_damgeAlly");
4640 EClass.player.invlunerable =
true;
4679 if ((attackSource ==
AttackSource.Melee || attackSource ==
AttackSource.Range) && origin !=
null && originalTarget ==
null && (origin.isSynced ||
IsPC))
4686 text =
"dead_" + e.
source.alias;
4690 text =
"dead_attack";
4698 text =
"kill_" + e.source.alias;
4702 text =
"kill_attack";
4704 (
IsPC ? EClass.pc : origin).
Say(text, origin,
this);
4712 Say(
"reboot",
this);
4719 if (HasCondition<ConRebirth>())
4721 Say(
"rebirth",
this);
4733 Msg.alwaysVisible =
true;
4734 Msg.
Say(
"layhand", chara5,
this);
4735 Msg.
Say(
"pray_heal",
this);
4745 if (zoneInstanceBout !=
null)
4777 Die(e, origin, attackSource, originalTarget);
4778 if (origin !=
null && origin.id ==
"unseenhand" && !origin.IsGlobal)
4780 origin.isSummon =
true;
4781 origin.c_summonDuration = 4;
4788 string text2 =
new int[18]
4790 233, 235, 236, 236, 236, 1170, 1143, 1144, 727, 728,
4791 237, 869, 1178, 1179, 1180, 1243, 1244, 1245
4792 }.RandomItem().ToString();
4795 text2 =
"casino_coin";
4799 text2 =
"scratchcard";
4827 if (origin !=
null && origin.isChara)
4849 if (origin.GetInt(106) == 0)
4851 origin.Chara.TalkTopic(
"kill");
4856 else if ((attackSource ==
AttackSource.Melee || attackSource ==
AttackSource.Range) && origin !=
null && originalTarget ==
null)
4858 (
IsPC ? EClass.pc : origin).
Say(
"dmgMelee" + num10 + (
IsPC ?
"pc" :
""), origin,
this);
4862 int num14 = ((attackSource != AttackSource.Condition && attackSource !=
AttackSource.WeaponEnchant) ? 1 : 2);
4863 if (num10 >= (
float)num14)
4867 Say(
"dmg_" + e.source.alias,
this);
4871 Say(
"dmg" + num10,
this);
4894 if (origin !=
null && origin.IsAliveInCurrentZone && origin.isChara)
4898 origin.HealHP(Mathf.Clamp(
EClass.
rnd(dmg * (50 + eleP) / 500 + 5), 1, origin.MaxHP / 5 +
EClass.
rnd(10)));
4902 int num16 = origin.Dist(
this);
4906 if (
id ==
"hedgehog_ether")
4910 Say(
"reflect_thorne", origin,
this);
4911 origin.DamageHP((
int)Mathf.Clamp(dmg / 10, 1f,
MaxHP / (origin.IsPowerful ? 200 : 20)), ele2,
Power,
AttackSource.Condition,
this);
4916 Say(
"reflect_acid",
this, origin);
4917 origin.DamageHP((
int)Mathf.Clamp(dmg / 10, 1f,
MaxHP / (origin.IsPowerful ? 200 : 20)), ele3,
Power * 2,
AttackSource.Condition,
this);
4929 int a2 = (int)(100 * (dmg * 100 /
MaxHP) / 100) + 1;
4940 int num17 = ((
EClass.
rnd(2) == 0) ? 1 : 0);
4950 if (dmg > 0 || (origin !=
null && origin.HasElement(1345)))
4956 Condition.ignoreEffect =
true;
4958 Condition.ignoreEffect =
false;
4962 float num18 = (float)
hp / (
float)
MaxHP;
4969 PlaySound(
"heartbeat", 1f - num18 * 2f);
5002 EClass.player.forceTalk =
true;
5004 if (origin !=
null && origin.isChara && attackSource !=
AttackSource.Finish)
5015 void EvadeDeath(Action action)
5020 Chara.mana.value = 0;
5024 int GetHealValue(
int heal,
int skill,
int full,
int healRateLimit,
int skillMod)
5026 int result = Mathf.Clamp(heal, 0,
MathEx.
ClampToInt((
long)full * (
long)Mathf.Clamp(healRateLimit * (100 + skill) / 200, 0, healRateLimit) / 100 + skill * skillMod / 100));
5029 Debug.Log(
"dmg:" + dmg +
" heal:" + result +
" (" + heal +
")");
5043 if (origin !=
null && origin.isChara &&
isChara && (
weapon ==
null || !
weapon.HasElement(486) || !origin.IsPCFactionOrMinion))
5045 int num19 = origin.Evalue(660) + (
weapon?.Evalue(660, ignoreGlobalElement:
true) ?? 0);
5046 int num20 = origin.Evalue(662) + (
weapon?.Evalue(662, ignoreGlobalElement:
true) ?? 0);
5047 int num21 = origin.Evalue(661) + (
weapon?.Evalue(661, ignoreGlobalElement:
true) ?? 0);
5048 bool flag4 = attackSource == AttackSource.Melee || attackSource == AttackSource.Range || attackSource ==
AttackSource.Throw;
5049 if (num19 > 0 && flag4)
5051 int heal =
EClass.
rnd(dmg / 10 + num19 / 5);
5052 origin.Chara.HealHP(GetHealValue(heal, num19, origin.MaxHP, 20, 100));
5054 if (num20 > 0 && flag4 && origin.isChara && !origin.Chara.ignoreSPAbsorb &&
Chara.
IsHostile(origin as
Chara))
5057 origin.Chara.stamina.Mod(GetHealValue(heal2, num20, origin.Chara.stamina.max, 1, 10));
5063 if (origin.HasElement(1350) && attackSource ==
AttackSource.Melee)
5066 origin.Chara.mana.Mod(GetHealValue(heal3, origin.Chara.GetPietyValue(), origin.Chara.mana.max, 10, 100));
5072 if (num21 > 0 && flag4)
5074 int heal4 =
EClass.
rnd(dmg / 10 + num21 / 10);
5075 origin.Chara.mana.Mod(GetHealValue(heal4, num21, origin.Chara.mana.max, 10, 100));
5092 bool hostile =
false;
5096 if (Chance(30 + eleP / 5, 100))
5098 MarkHostile().AddCondition<
ConBurning>(eleP);
5104 if (Chance(30 + eleP / 10, 100))
5109 else if (Chance(50 + eleP / 10, 100))
5115 if (Chance(75 + eleP / 20, 100) &&
EClass.
rnd(3) == 0)
5121 if (Chance(30 + eleP / 5, 100))
5123 MarkHostile().AddCondition<
ConPoison>(eleP);
5127 if (Chance(30 + eleP / 5, 100))
5134 if (Chance(30 + eleP / 5, 100))
5143 if (Chance(30 + eleP / 5, 100))
5148 else if (Chance(30 + eleP / 5, 100))
5154 if (Chance(50 + eleP / 10, 100))
5162 if (Chance(30 + eleP / 5, 100))
5181 if (Chance(5 + eleP / 25, 40))
5185 if (Chance(5 + eleP / 25, 40))
5189 if (Chance(5 + eleP / 25, 40))
5193 if (Chance(5 + eleP / 25, 40))
5195 MarkHostile().AddCondition<
ConPoison>(eleP / 2);
5197 if (Chance(5 + eleP / 25, 40))
5201 if (Chance(5 + eleP / 25, 40))
5205 if (Chance(30 + eleP / 10, 100))
5211 if (Chance(50 + eleP / 10, 100))
5213 MarkHostile().AddCondition<
ConBleed>(eleP);
5217 if (Chance(50 + eleP / 10, 100) &&
EClass.
rnd(4) == 0)
5230 if (checkHostileAct && hostile && origin !=
null && origin.
isChara)
5234 static bool Chance(
int a,
int max)
5236 return Mathf.Min(a, max) >
EClass.
rnd(100);
5247 Card rootCard = GetRootCard();
5249 if (_pos !=
null && !_pos.
IsValid)
5260 string text = ((rootCard !=
this) ?
"destroyed_inv_" :
"destroyed_ground_");
5261 if (e !=
null &&
LangGame.
Has(text + e.source.alias))
5263 text += e.source.alias;
5267 Msg.
Say(text,
this, rootCard);
5272 Msg.
Say(
"destroyed",
this);
5277 things.ForeachReverse(delegate(
Thing t)
5287 if (e !=
null && _pos !=
null && e.id == 21)
5293 Explode(pos, origin);
5302 origin = origin?.Chara,
5304 aliasEle =
"eleImpact"
5310 PlaySound(
material.GetSoundDead(sourceCard));
5318 Debug.Log(Name +
" is already destroyed.");
5329 Chara.isDead =
true;
5347 for (
int num = things.Count - 1; num >= 0; num--)
5349 things[num].Destroy();
5356 if (!isChara || IsPCFactionMinion || (isCopy &&
EClass.
rnd(10) != 0))
5362 List<Card> list =
new List<Card>();
5363 if (!IsPCFactionOrMinion && !isUserZone && sourceCard.
idActor.IsEmpty())
5370 if (this.rarity >=
Rarity.Legendary)
5406 else if (origin !=
null && origin.
HasElement(290) && !IsMinion)
5418 if (
id ==
"littleOne" && IsPCFactionOrMinion)
5426 if (flag2 && !isUserZone)
5430 case "bubble_pudding":
5433 case "marshmallow_monster":
5434 case "marshmallow_king":
5440 if (
id ==
"titan_iron")
5444 bool num2 = text ==
"_meat";
5452 text =
"meat_marble";
5459 if (thing3.
source._origin ==
"meat")
5480 if (!IsPCFaction && !isUserZone)
5482 foreach (
string item2
in sourceCard.
loot.Concat(
Chara.
race.loot).ToList())
5484 string[] array = item2.
Split(
'/');
5485 int num4 = array[1].ToInt();
5534 if (this.rarity ==
Rarity.Mythical)
5538 if (!isBackerContent && !flag)
5574 int num5 = ((EClass._zone.Boss ==
this) ? 2 : ((this.rarity >=
Rarity.Legendary) ? 1 : 0));
5595 List<Thing> list2 =
new List<Thing>();
5596 foreach (
Thing thing6
in things)
5622 if (num5 > 0 && list2.Count > 0)
5625 for (
int j = 0; j < list2.Count && j < num5; j++)
5631 if (this.rarity >=
Rarity.Legendary && !IsUnique && c_bossType !=
BossType.Evolved)
5634 foreach (
Card item3
in list)
5643 int num7 = ((!(EClass._zone is
Zone_Void)) ? 1 : 2);
5648 for (
int k = 0; k < num5; k++)
5677 List<Thing> list3 = thing4.
things.ToList();
5687 while (num8 > 0 && list3.Count != 0)
5689 Thing thing5 = list3.First();
5690 list3.Remove(thing5);
5703 foreach (
Thing thing7
in things)
5705 if (thing7.
GetInt(116) != 0)
5711 Point nearestPoint = GetRootCard().pos;
5716 foreach (
Card item4
in list)
5722 item4.isHidden =
false;
5723 item4.isNPCProperty =
false;
5739 bool chance(
int num9)
5780 case "egg_fertilized":
5785 string text =
"c_wilds";
5786 if (
id ==
"_meat" ||
id ==
"meat_marble")
5794 for (
int i = 0; i < 20; i++)
5797 if (cardRow.
model.
Chara.
race.corpse[0] !=
"_meat" &&
id !=
"_milk" &&
id !=
"_egg" &&
id !=
"egg_fertilized")
5807 if (crafter !=
null && crafter.id ==
"big_sister")
5809 cardRow = crafter.source;
5814 if (c_idRefCard.IsEmpty())
5816 MakeRefFrom(cardRow.
model);
5821 MakeFoodFrom(cardRow.
model);
5823 return this as
Thing;
5829 return this as
Thing;
5849 int num = race.
food[0].ToInt();
5850 bool flag =
id ==
"meat_marble";
5852 bool flag2 = category.
IsChildOf(
"meat");
5853 bool flag3 =
id ==
"marshmallow_nama" || category.
IsChildOf(
"egg") || trait is
TraitGene;
5854 bool flag4 = category.
IsChildOf(
"milk");
5865 elements.
SetBase(70, race.
STR * race.
STR / 5 * num / 100 - 10 + num / 10);
5868 elements.
SetBase(440, race.
END * race.
END / 5 * num / 100 - 10 + num / 10);
5870 elements.
SetBase(71, (
int)Mathf.Clamp((
float)(num / 10) + Mathf.Sqrt(race.
height) - 10f, 1f, 60f));
5874 num2 = ((!flag4) ? 3 : 2);
5878 elements.
SetBase(444, race.
LER * race.
LER / 5 * num / 100 - 10 + num / 10);
5892 foreach (
Element value
in c.elements.dict.Values)
5894 if ((!flag3 || value.
id != 1229) && (value.source.category ==
"food" || value.
source.tag.Contains(
"foodEnc") || value.
IsTrait))
5899 List<Tuple<int, int>> list =
new List<Tuple<int, int>>();
5900 foreach (KeyValuePair<int, int>
item in race.elementMap)
5904 list.Add(
new Tuple<int, int>(
item.Key,
item.Value));
5907 list.Sort((Tuple<int, int> a, Tuple<int, int> b) => b.Item2 - a.Item2);
5908 for (
int num3 = 0; num3 < num2 && num3 < list.Count; num3++)
5910 Tuple<int, int> tuple = list[num3];
5911 elements.
SetBase(tuple.Item1, tuple.Item2 * tuple.Item2 / 4);
5913 if (c.Chara.IsUndead)
5915 elements.
ModBase(73, (c.Chara.race.id ==
"undeadgod") ? (-90) : (-20));
5917 isWeightChanged =
true;
5918 c_weight = race.height * 4 + 100;
5919 c_idMainElement = c.c_idMainElement;
5921 int num4 = c.LV - c.sourceCard.LV;
5927 if (c.rarity >=
Rarity.Legendary || c.IsUnique)
5931 if (flag2 && c.IsPCFaction && c.IsUnique)
5946 if (IsIgnoreName(
card))
5950 if (IsIgnoreName(card2))
5954 if (
card ==
null && card2 !=
null)
5961 MakeRefFrom(
card, card2);
5962 if (
card.c_idRefCard !=
null)
5964 c_idRefCard =
card.c_idRefCard;
5965 c_altName = TryGetFoodName(
card);
5970 c_altName2 = TryGetFoodName(card2);
5973 static bool IsIgnoreName(
Card card3)
6003 if (!row.aka.IsEmpty())
6005 if (row.name ==
"*r" && row.aka ==
"*r")
6007 return "corpseGeneral".lang();
6009 if (row.name ==
"*r")
6011 return row.GetText(
"aka");
6014 return row.GetName();
6019 return s.Replace(
"_corpseFrom".lang(),
"_corpseTo".lang());
6035 c_idRefCard = c1.
id;
6039 c_idRefCard2 = c2.id;
6040 c_altName2 = (c2.IsPC ? c2.c_altName : c2.GetName((!simple) ? NameStyle.Ref :
NameStyle.Simple, (!c2.isChara) ? 1 : 0));
6042 c_extraNameRef = (c1.IsPC ? EClass.pc.c_altName : c1.
c_extraNameRef);
6048 if (!
EClass.
debug.
enable && (HasElement(1290) || HasElement(1292)) && Evalue(418) >= 0)
6056 thing.c_idMainElement = c_idMainElement;
6065 return GiveBirth(thing, effect);
6071 if (!
EClass.
debug.
enable && (HasElement(1290) || HasElement(1292)) && Evalue(418) >= 0)
6083 int num2 = LV - sourceCard.
LV;
6088 if (num2 >= 10 && !HasElement(1290) && !HasElement(1292))
6096 return GiveBirth(thing, effect);
6101 Card obj = (ExistsOnMap ? this : (GetRootCard() ??
EClass.
pc));
6102 EClass.player.forceTalk =
true;
6103 obj.
Talk(
"giveBirth");
6125 string[] array = ((!(
id ==
"cocoon")) ?
new string[4] {
"alien",
"alien",
"alien",
"alien2" } :
new string[6] {
"spider_queen",
"spider_vampire",
"spider_paralyzer",
"spider_black",
"spider_tarantula",
"spider_spotted" });
6129 AddBlood(12, (uid % 2 == 0) ? (-1) : 3);
6131 PlaySound(
"egghatch");
6140 for (
int i = 0; i < 1 +
EClass.
rnd(num + 1); i++)
6143 if (chara !=
null && isChara)
6146 chara.isHatchling =
true;
6198 SayNothingHappans();
6201 PlayEffect(
"teleport");
6204 Say(
"antiTeleport",
this);
6205 PlaySound(
"gravity");
6210 if (
id ==
"mush_quantum")
6212 PlaySound(
"teleport_quantum");
6216 PlaySound(
"teleport");
6218 Say(
"teleported",
this);
6227 if (chara.
enemy ==
this)
6238 EClass.player.haltMove =
true;
6240 PlayEffect(
"teleport", useRenderPos:
false);
6247 PlayEffect(
"ripple");
6248 PlaySound(
"Footstep/water");
6259 int num = p.x - pos.
x;
6260 int num2 = p.z - pos.
z;
6277 if (num == 0 && num2 == 0)
6291 for (
int i = -1; i < 2; i++)
6293 for (
int j = -1; j < 2; j++)
6297 point.x = pos.x + j;
6298 point.z = pos.z + i;
6312 return _Move(newPoint);
6315 public void Kick(
Point p,
bool ignoreSelf =
false,
bool checkWall =
true)
6319 Kick(
item, ignoreSelf, karmaLoss:
true, show:
true, checkWall);
6323 public void Kick(
Chara t,
bool ignoreSelf =
false,
bool karmaLoss =
true,
bool show =
true,
bool checkWall =
true)
6325 if (!IsAliveInCurrentZone)
6351 Say(
"kick",
this, t);
6385 if (elements.
Value(ele) <= 0)
6387 if (includeNagative)
6389 return elements.
Value(ele) < 0;
6398 return elements.
Value(ele) >= req;
6413 if (HasElement(764))
6417 if (HasElement(759))
6421 if (HasElement(703))
6425 if (HasElement(758))
6429 if (HasElement(704))
6433 if (HasElement(766))
6451 for (
int i = 0; i < a; i++)
6462 shared.color = 11010048f;
6463 shared.liquidLv = 0;
6465 SetRenderParam(shared);
6485 isDyed = mat !=
null;
6486 c_dyeMat = mat?.id ?? 0;
6502 else if (isElemental)
6539 int num = EClass.game.seed + refVal;
6540 num +=
id[0] % 10000;
6543 num +=
id[1] % 1000;
6546 num +=
id[2] % 1000;
6549 num +=
id[3] % 1000;
6552 num +=
id[4] % 1000;
6561 return ref _randColor;
6576 bool snow = IsInstalled && pos !=
null && pos.IsValid && pos.
cell.
IsSnowTile;
6577 return GetSpriteData(dir, snow)?.GetSprite() ?? sourceCard.
GetSprite(dir, trait.
IdSkin, snow);
6592 public void SetImage(Image image,
int dir,
int idSkin = 0)
6594 sourceRenderCard.
SetImage(image, GetSprite(dir), colorInt, setNativeSize:
true, dir, idSkin,
this);
6604 Sprite sprite = GetSprite();
6608 if ((
bool)spriteReplacer?.GetSprite())
6612 sourceRenderCard.
SetImage(image, sprite, colorInt, setNativeSize:
true, 0, 0, renderData, spriteReplacer.
data.
pref ?? Pref);
6616 sourceRenderCard.
SetImage(image, sprite, colorInt, setNativeSize:
true, 0, 0,
this);
6619 public void ShowEmo(
Emo _emo =
Emo.none,
float duration = 0f,
bool skipSame =
true)
6621 if ((!isChara ||
Chara.
host ==
null) && !(_emo == lastEmo && skipSame))
6623 if (_emo !=
Emo.none)
6625 renderer.
ShowEmo(_emo, duration);
6633 PlaySound(
material.GetSoundDrop(sourceCard), 1f, spatial);
6638 PlaySound(
material.GetSoundDrop(sourceCard), 1f, spatial);
6643 PlaySound(
material.GetSoundImpact(sourceCard), 1f, spatial);
6648 PlaySound(
material.GetSoundDead(sourceCard), 1f, spatial);
6651 public SoundSource
PlaySound(
string id,
float v = 1f,
bool spatial =
true)
6653 Card rootCard = GetRootCard();
6660 return rootCard.
pos.
PlaySound(
id, isSynced || !spatial, v, spatial);
6685 public Effect PlayEffect(
string id,
bool useRenderPos =
true,
float range = 0f, Vector3 fix =
default(Vector3))
6691 Card rootCard = GetRootCard();
6695 public void PlayEffect(
int ele,
bool useRenderPos =
true,
float range = 0f)
6703 Card rootCard = GetRootCard();
6726 public virtual void Rotate(
bool reverse =
false)
6729 if (sourceCard.
tiles.Length > 4)
6731 num = sourceCard.
tiles.Length;
6793 fx = fx - vector.x + thingPosition.x;
6794 fy = fy - vector.y + thingPosition.y;
6798 float num = (fy = 0f);
6822 renderParam.x = v.x;
6823 renderParam.y = v.y;
6824 renderParam.z = v.z;
6826 v.x = renderParam.
x;
6827 v.y = renderParam.
y;
6828 v.z = renderParam.
z;
6842 v.z += thingPosition.z;
6849 if (useCurrentPosition)
6863 renderer.sync = -1L;
6864 renderer.
Draw(renderParam, ref v, drawShadow:
false);
6875 EClass.player.lightRadius = 1;
6883 return GetLightRadius() > 0;
6891 return 0.01f * LightData.color.a * 256f * 1.12f;
6893 if (IsPCFaction && !IsPC)
6959 num2 = traitLightSource.LightRadius;
6964 if (lightRadius > 0)
6966 if (lightRadius > num2)
6986 int radius = GetLightRadius();
6991 float power = GetLightPower();
7012 EClass.player.lightRadius = radius;
7013 EClass.player.lightPower = power;
7019 fov.
Perform(pos.
x, pos.
z, radius, power * 2f);
7030 int num = (trait.UseLightColor ? c_lightColor : 0);
7033 fov.r = (byte)(num / 1024);
7034 fov.g = (byte)(num % 1024 / 32);
7035 fov.b = (byte)(num % 32);
7076 if (fov !=
null && fov.
lastPoints.Count != 0)
7095 things.ForeachReverse(delegate(
Thing t)
7099 if (sourceCard.
_origin ==
"dish")
7107 else if (!isChara && trait.
Decay != 0)
7109 Decay(trait.
Decay * hour);
7127 int num2 = MaxDecay / 4 * 3;
7132 num =
card.trait.DecaySpeedChild;
7134 num = num * trait.DecaySpeed / 100;
7135 int num3 = Evalue(405);
7138 num = num * (100 - num3 * 2) / 100;
7150 if (decay + a > MaxDecay)
7152 if (
card !=
null && !
card.trait.OnChildDecay(
this, !IsDecayed))
7161 card.AddCard(thing);
7162 if (!IsParentLocked())
7164 GetRootCard().Say(
"seed_rot", GetRootCard(),
this, thing.
Name);
7173 else if (GetRootCard() ==
EClass.
pc)
7175 if (!IsParentLocked())
7187 else if (decay < num2 && decay + a >= num2 && GetRootCard() ==
EClass.
pc)
7189 if (!IsParentLocked())
7196 bool IsParentLocked()
7198 if (parent is
Thing)
7200 return (parent as
Thing).c_lockLv > 0;
7208 return !
MOD.
listTalk.
GetTalk(c_idTalk.IsEmpty(
id), idTopic, useDefault:
true).IsEmpty();
7211 public void Talk(
string idTopic,
string ref1 =
null,
string ref2 =
null,
bool forceSync =
false)
7215 EClass.player.forceTalk =
false;
7219 EClass.player.forceTalk =
false;
7220 if (!isSynced && !forceSync)
7225 GameLang.refDrama1 = ref1;
7226 GameLang.refDrama2 = ref2;
7227 string text = GetTalkText(idTopic, stripPun:
true);
7229 if ((HasElement(1232) || (condition !=
null && condition.
IsBaby)) && idTopic !=
"baby")
7235 switch ((condition !=
null) ? condition.
chara.
id :
id)
7248 TalkRaw(text, ref1, ref2, forceSync);
7251 public void TalkRaw(
string text,
string ref1 =
null,
string ref2 =
null,
bool forceSync =
false)
7253 if ((!isSynced && !forceSync) || text.IsEmpty())
7260 text = text.Replace(
"#1", ref1);
7264 text = text.Replace(
"#2", ref2);
7266 HostRenderer.Say(ApplyNewLine(text));
7267 text = StripTalkSpecialCharacters(text);
7268 bool flag = text.StartsWith(
"*");
7272 text = text.Bracket();
7274 Msg.
Say(text.Replace(
"&",
""));
7283 if (text.Length > 1 &&
int.TryParse(text[1].ToString() ??
"", out var _))
7285 return text.Substring(2);
7291 return text.Substring(1);
7298 if (text.Contains(
"&"))
7300 string text2 =
"_comma".lang();
7301 text = text.Replace(text2 +
" &", Environment.NewLine ??
"");
7302 text = text.Replace(text2 +
"&", Environment.NewLine ??
"");
7303 text = text.Replace(
"&", Environment.NewLine ??
"");
7308 public void SayRaw(
string text,
string ref1 =
null,
string ref2 =
null)
7310 if (isSynced && !text.IsEmpty())
7314 text = text.Replace(
"#1", ref1);
7318 text = text.Replace(
"#2", ref2);
7320 HostRenderer.Say(text);
7326 Say(
"nothingHappens");
7329 public void Say(
string lang,
string ref1 =
null,
string ref2 =
null)
7338 public void Say(
string lang,
Card c1,
Card c2,
string ref1 =
null,
string ref2 =
null)
7347 public void Say(
string lang,
Card c1,
string ref1 =
null,
string ref2 =
null)
7356 public string GetTalkText(
string idTopic,
bool stripPun =
false,
bool useDefault =
true)
7360 string text =
MOD.
listTalk.
GetTalk((condition !=
null) ? condition.
chara.
id : c_idTalk.IsEmpty(
id), idTopic, useDefault, flag);
7361 if (!text.IsEmpty())
7363 text = text.Split(
'|').RandomItem();
7364 if (!flag || (IsDeadOrSleeping && IsAliveInCurrentZone))
7366 if (!text.StartsWith(
"(") && !text.StartsWith(
"*"))
7368 text =
"(" + text +
")";
7370 text = text.Replace(
"。)",
")");
7373 return ApplyTone(text, stripPun);
7379 return ApplyTone(
Chara, ref text, c_idTone, bio?.gender ?? 0, stripPun);
7382 public static string ApplyTone(
Chara c, ref
string text,
string _tones,
int gender,
bool stripPun =
false)
7388 string[] array = _tones.IsEmpty(
"").Split(
'|');
7389 string key = array[0];
7394 text2 = text.Replace(
"{",
"").Replace(
"}",
"");
7398 if (array[0].IsEmpty())
7407 if (array.Length >= 2)
7409 stringBuilder.Replace(
"_toneI".lang(), array[1]);
7411 if (array.Length >= 3)
7413 stringBuilder.Replace(
"_toneYou".lang(), array[2]);
7416 text2 = stringBuilder.ToString();
7420 text2 = text.Replace(
"{",
"").Replace(
"}",
"");
7431 return text2.StripLastPun();
7446 List<Dictionary<string, string>> list =
MOD.
tones.
list;
7447 if (list.Count != 0)
7449 int mtp = EClass.core.config.test.extraToneMTP
switch
7462 string text = list.RandomItem()[
"id"];
7463 text = list.RandomItemWeighted((Dictionary<string, string> a) => a[
"chance"].ToInt() * ((!a[
"tag"].Contains(
"meta")) ? 1 : mtp))[
"id"];
7470 return ListCraftBonusTraits().Count > 0;
7475 List<Element> list =
new List<Element>();
7476 string[] tag = sourceCard.
tag;
7477 for (
int i = 0; i < tag.Length; i++)
7479 string[] array = tag[i].Split(
'/');
7480 if (!(array[0] !=
"craft_bonus"))
7496 if (dest.
stack !=
null)
7500 Say(
"stack_thing", t, dest.
stack);
7514 c_idBacker = row.
id;
7520 chara.hostility = hostility;
7526 Chara.idFaith = row.
deity.ToLowerInvariant();
7531 if (
id ==
"putty_snow")
7544 if (c_idBacker == 164)
7557 c_textureData = GetPaintData();
7567 Sprite sprite = GetSprite();
7568 Texture2D texture2D = ScreenCapture.CaptureScreenshotAsTexture();
7571 int x = (int)Mathf.Clamp(Input.mousePosition.x - (
float)(num / 2), 1f, texture2D.width - num - 1);
7572 int y = (int)Mathf.Clamp(Input.mousePosition.y - (
float)(num2 / 2), 1f, texture2D.height - num2 - 1);
7573 Color[] pixels = texture2D.GetPixels(x, y, num, num2);
7574 Texture2D texture2D2 =
new Texture2D(num, num2, TextureFormat.ARGB32, mipChain:
false);
7575 texture2D2.SetPixels(pixels);
7577 byte[] result = texture2D2.EncodeToJPG();
7578 UnityEngine.Object.Destroy(texture2D);
7579 UnityEngine.Object.Destroy(texture2D2);
7585 if ((
bool)_paintSprite)
7587 UnityEngine.Object.Destroy(_paintSprite.texture);
7588 UnityEngine.Object.Destroy(_paintSprite);
7589 _paintSprite =
null;
7597 byte[] data = c_textureData;
7598 Texture2D texture2D =
new Texture2D(1, 1);
7599 texture2D.LoadImage(data);
7600 _paintSprite = Sprite.Create(texture2D,
new Rect(0f, 0f, texture2D.width, texture2D.height),
new Vector2(0.5f, 0.5f), 200f);
7604 texture2D.filterMode = ((!traitCanvas.PointFilter) ? FilterMode.Bilinear : FilterMode.Point);
7607 return _paintSprite;
7612 if (!(GetRestrainer() ==
null || force))
7616 isRestrained =
false;
7617 Say(
"unrestrained",
this);
7628 if (c_rescueState ==
RescueState.WaitingForRescue)
7642 c.DoHostileAction(
item, immediate:
true);
7669 result = row.value * mat.value / 100;
7706 int num = ((c_fixedValue == 0) ? trait.
GetValue() : c_fixedValue);
7707 if (
id ==
"plat" && !sell)
7718 num2 += (float)c_priceCopy * 0.2f;
7719 num2 = num2 * (float)Mathf.Max(150 + rarityLv, 150) / 100f;
7723 num2 = num2 * (float)Mathf.Max(100 + rarityLv + Mathf.Min(QualityLv * 10, 200), 80) / 100f;
7725 if (IsFood && !
material.tag.Contains(
"food"))
7730 if (IsEquipmentOrRangedOrAmmo || trait is
TraitMod)
7748 if (IsEquipmentOrRanged && rarity >=
Rarity.Legendary)
7750 num2 = Mathf.Max(num2, 1800f + num2 / 5f);
7752 num2 = num2 * (100f + num3 * (float)(
material.value - 100)) / 100f;
7753 if (IsEquipmentOrRanged)
7758 num4 += value.
source.value;
7760 num2 = num2 * (float)(100 + (sell ? ((
int)MathF.Sqrt(num4) * 10) : num4)) / 100f;
7761 if (rarity >=
Rarity.Legendary)
7763 num2 = Mathf.Max(num2, 3600f + num2 / 5f);
7771 if (encLV != 0 && !category.
tag.Contains(
"noEnc"))
7773 num2 = (category.
tag.Contains(
"enc") ? (num2 * (0.7f + (float)(encLV - 1) * 0.2f)) : ((!IsFood) ? (num2 * (1f + (
float)encLV * 0.01f)) : ((!(
id ==
"honey")) ? (num2 * Mathf.Min(1f + 0.1f * (
float)encLV, 2f) + (
float)(encLV * 100)) : (num2 + (float)(encLV * 10)))));
7777 num2 *= (float)(tier + 1);
7779 if (num2 > 2.1474836E+09f)
7781 return int.MaxValue;
7788 if (priceType ==
PriceType.CopyShop && sell)
7794 if (
id ==
"littleball")
7801 if (
id ==
"crimale2")
7809 case "ticket_fortune":
7815 case "scroll_alias":
7817 case "scroll_biography":
7832 if (!(text ==
"mathammer"))
7834 if (!(text ==
"water_jure"))
7840 return 50 + material.tier * material.tier * 10;
7853 case "hammer_strip":
7867 if (!(c_idRefName ==
"sorin"))
7872 case "scroll_random":
7916 case "bed_shiawase":
7918 case "diary_sister":
7922 case "diary_catsister":
7924 case "container_magic":
7926 case "wrench_tent_elec":
7928 case "wrench_tent_soil":
7930 case "wrench_tent_seabed":
7934 case "wrench_storage":
7936 case "wrench_fridge":
7938 case "wrench_extend_v":
7940 case "wrench_extend_h":
7946 case "hammer_garokk":
7948 case "scroll_random":
7962 if (!sell &&
id ==
"casino_coin")
7966 int value = GetValue(priceType, sell);
7976 Trait trait = this.trait;
7981 p *= 1f + 4f * (float)(things.
width - traitContainer.Width) + 4f * (float)(things.
height - traitContainer.Height);
7986 p *= 1f + 0.5f * (float)c_containerSize;
7989 if (c_priceFix != 0)
7991 p = (int)((
float)p * (float)Mathf.Clamp(100 + c_priceFix, 0, 1000000) / 100f);
8001 p = p * 100.0 / (double)Mathf.Max(110f, 170f - Mathf.Sqrt(
EClass.
Branch.
Evalue(2824) * 5));
8012 if (!sell && category.
id ==
"spellbook")
8016 bool flag = priceType ==
PriceType.CopyShop;
8017 int num = ((!flag) ? 1 : 5);
8018 float num2 = Mathf.Min(0.01f * (
float)Evalue(752), 1f);
8019 float num3 = Mathf.Min(0.01f * (
float)Evalue(751), 1f);
8020 float num4 = Mathf.Min(0.02f * (
float)Evalue(759), 2f);
8025 float num5 = Mathf.Clamp(1f + num2 + num3, 0.5f, 5f) + num4;
8027 p *= 0.20000000298023224;
8030 p *= 0.20000000298023224;
8033 p *= 0.20000000298023224;
8037 p *= 0.20000000298023224;
8043 if ((uint)(priceType - 1) <= 1u)
8055 if (
id ==
"rod_wish")
8057 p *= (sell ? 0.01f : 50f);
8072 p *= 0.20000000298023224;
8076 p *= 0.10000000149011612;
8079 p *= 0.0020000000949949026;
8082 p *= 0.00019999999494757503;
8085 p *= 0.004999999888241291;
8088 p *= 9.999999747378752E-05;
8099 p *= (flag ? 1.25f : 0.3f);
8103 p = p * 0.05000000074505806 + p * (double)(0.5f + Mathf.Clamp(0.1f * (
float)c_charges, 0f, 1.5f));
8107 p *= (flag ? 0.9f : 0.5f);
8119 p *= 1f + 0.2f * (float)c.Evalue(1406);
8132 p *= 1.100000023841858;
8166 else if (category.
IsChildOf(
"furniture"))
8186 p *= (sell ? (1f + num6 * 0.02f) : (1f - num6 * 0.02f));
8193 p = ((!sell) ? 1 : 0);
8201 p = Mathf.CeilToInt((
float)p / 100000f) * 100000;
8203 else if (p > 10000.0)
8205 p = Mathf.CeilToInt((
float)p / 10000f) * 10000;
8207 else if (p > 1000.0)
8209 p = Mathf.CeilToInt((
float)p / 1000f) * 1000;
8213 p = Mathf.CeilToInt((
float)p / 100f) * 100;
8217 p = Mathf.CeilToInt((
float)p / 10f) * 10;
8225 if (p > (
double)(sell ? 500000000 : 1000000000))
8238 return Name + GetExtraName();
8255 ForeachPoint(delegate(
Point p,
bool main)
8257 int num = DistMulti(p, c);
8265 return DistMulti(pos, c);
8268 if (!
card.IsMultisize)
8273 card.ForeachPoint(delegate(
Point p2,
bool main)
8297 isCensored = enable;
8307 if (isDeconstructing != deconstruct)
8317 isDeconstructing = deconstruct;
8331 sortVal = ((c_equippedSlot == 0) ? (category.
sortVal * 1000) : 0);
8334 sortVal = -GetPrice(
currency) * 1000;
8337 sortVal = -Num * 1000;
8340 sortVal = category.sortVal * 1000;
8343 sortVal = -ChildrenAndSelfWeight * 1000;
8346 sortVal = -ChildrenAndSelfWeightSingle * 1000;
8349 sortVal = -GetPrice(
currency) * 1000;
8352 sortVal = sourceCard._index * 1000;
8362 num =
id.CompareTo(c.
id);
8382 num = encLV - c.
encLV;
8401 foreach (KeyValuePair<int, byte> lastPoint
in fov.
lastPoints)
8419 action(pos, arg2:
true);
8433 SE.Play(
"pop_paper");
8465 case "putty_snow_gold":
8466 case "putty_forest":
8479 if (!HaveFur() || c_fur < 0)
static bool not(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
virtual bool CancelWhenDamaged
static void LoveMiracle(Chara tc, Chara c, int power, EffectId idEffect=EffectId.Love, BlessedState? state=null)
static void TryDelay(Action a)
static void Proc(EffectId id, Card cc, Card tc=null, int power=100, ActRef actRef=default(ActRef))
static void ProcAt(EffectId id, int power, BlessedState state, Card cc, Card tc, Point tp, bool isNeg, ActRef actRef=default(ActRef))
void Add(Act a, string s="")
virtual bool IsRoofEditMode(Card c=null)
virtual void OnInstallCard(Card t)
virtual void OnUninstallCard(Card t)
static void ProcShieldEncs(Chara CC, Card TC, int mtpChance=100)
static void GakiConvert(ref string text, string idLang="zako")
Dictionary< int, int > mapInt
Dictionary< int, string > mapStr
void Mod(int a, bool force=false)
SourceElement.Row sourceElement
void WaitForEndOfFrame(Action action)
List< Action > actionsNextFrame
virtual void RefreshPosition()
static void PublishEvent(string eventId, object data=null)
virtual ConditionType Type
static int GetColorInt(ref Color matColor, int p)
void SetRoofHeight(MeshPassParam _param, Cell _cell, int _cx, int _cz, int h=0, int altitude=0, int dirWall=-1, bool ignoreAltitudeY=false)
Vector3 GetThingPosition(Card tg, Point p)
void SetPortrait(Chara c)
virtual void RefreshSprite()
static void SetRarity(Rarity q=Rarity.Normal)
static CardBlueprint current
static void Set(CardBlueprint _bp=null)
static CardBlueprint _Default
GlobalCharaList globalCharas
void ShowEmo(Emo emo, float duration=0f)
void PlayAnime(AnimeID id, bool force)
override void Draw(RenderParam p)
virtual void SetOwner(Card c)
virtual void SetFirst(bool first, Vector3 pos)
void SetCensored(bool enable)
int CountRune(bool countFree=true)
void SetTier(int a, bool setTraits=true)
void ModExp(int ele, int a)
Thing TryMakeRandomItem(int lv=-1, TryMakeRandomItemSource itemSource=TryMakeRandomItemSource.Default, Chara crafter=null)
virtual string AliasMaterialOnCreate
virtual string GetName(NameStyle style, int num=-1)
virtual MoveResult _Move(Point p, MoveType type=MoveType.Walk)
virtual string GetHoverText()
void Teleport(Point point, bool silent=false, bool force=false)
virtual string GetExtraName()
ContainerUpgrade c_containerUpgrade
void PurgeDuplicateArtifact(Thing af)
void RemoveEditorTag(EditorTag tag)
void ApplySocket(int id, int lv, Card mod=null)
SocketData AddRune(Card rune)
bool CanAddRune(TraitMod mod)
void Say(string lang, Card c1, Card c2, string ref1=null, string ref2=null)
virtual void ApplyMaterialElements(bool remove)
virtual void OnSimulateHour(VirtualDate date)
int EvalueMax(int ele, int min=0)
void MakeFigureFrom(string id)
void SetPlaceState(PlaceState newState, bool byPlayer=false)
void SetCensored(bool enable)
ElementContainerCard elements
void _OnDeserialized(StreamingContext context)
virtual void HealHPHost(long a, HealSource origin=HealSource.None)
bool IsRestrainedResident
SourceBacker.Row sourceBacker
bool TryReserve(AIAct act)
Hostility c_originalHostility
bool IsExcludeFromCraft(Recipe.Ingredient ing)
Thing AddThing(Thing t, bool tryStack=true, int destInvX=-1, int destInvY=-1)
void PlaySoundHold(bool spatial=true)
virtual void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
void AddBlood(int a=1, int id=-1)
void SetRandomLightColors()
CardRenderer HostRenderer
virtual SpriteData GetSpriteData(int dir=0, bool snow=false)
void OnChildNumChange(Card c)
int Evalue(int ele, bool ignoreGlobalElement)
bool IsStackable(Thing tg)
bool HasElement(string id, int req=1)
void Explode(Point p, Card origin)
SourceMaterial.Row DyeMat
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)
void MakeRefFrom(Card c1, Card c2=null, bool simple=false)
Card MakeRefFrom(string id)
string TryGetFoodName(Card c)
string ApplyNewLine(string text)
virtual void LookAt(Point p)
virtual SourceMaterial.Row DefaultMaterial
virtual int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
virtual void SetDir(int d)
bool IsEquipmentOrRangedOrAmmo
int GetAffinityExpBonus()
void Say(string lang, Card c1, string ref1=null, string ref2=null)
int GetResistPenetrationLevel(int idEle, AttackSource attackSource, Card origin=null)
static int GetTilePrice(TileRow row, SourceMaterial.Row mat)
virtual CardRenderer _CreateRenderer()
Thing AddThing(string id, int lv=-1)
virtual bool MatchEncSearch(string s)
virtual string GetDetail()
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
T SetObj< T >(string id, object o)
void PlaySoundImpact(bool spatial=true)
virtual string actorPrefab
virtual void OnBeforeCreate()
void NotifyAddThing(Thing t, int num)
MixedFoodData c_mixedFoodData
void AddEditorTag(EditorTag tag)
virtual string GetHoverText2()
void ApplySocket(Thing t)
virtual bool IsDeadOrSleeping
void Kick(Point p, bool ignoreSelf=false, bool checkWall=true)
int GetCurrency(string id="money")
void ForeachPoint(Action< Point, bool > action)
void Dye(SourceMaterial.Row mat)
virtual bool IsPCPartyMinion
string c_idSpriteReplacer
SourceMaterial.Row _material
bool HasElement(int ele, int req)
Thing GiveBirth(Thing t, bool effect)
virtual Sprite GetImageSprite()
virtual void ApplyMaterial(bool remove=false)
void ApplyElementEffect(Element e, int eleP, Card origin, bool checkHostileAct=false)
void ChangeAltitude(int a)
List< SocketData > socketList
string GetStr(string id, string defaultStr=null)
void PlayAnime(AnimeID id, Point dest, bool force=false)
virtual void SetBlessedState(BlessedState s)
RenderParam GetRenderParam()
void ModExpParty(int ele, int a)
bool HasTalk(string idTopic)
string GetTalkText(string idTopic, bool stripPun=false, bool useDefault=true)
void DecayNatural(int hour=1)
bool IsInMutterDistance(int d=10)
virtual void OnCreate(int genLv)
virtual void LookAt(Card c)
void RenderMarker(Point point, bool active, HitResult result, bool main, int dir, bool useCurrentPosition=false)
virtual long ApplyProtection(long dmg, int mod=100)
void MakeFoodRef(Card c1, Card c2=null)
MoveResult TryMoveFrom(Point p)
virtual void OnDeserialized()
void _OnSerializing(StreamingContext context)
virtual CardRow sourceRenderCard
int ChildrenAndSelfWeightSingle
virtual void SetRenderParam(RenderParam p)
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
virtual void HealHP(long a, HealSource origin=HealSource.None)
virtual SubPassData GetSubPassData()
List< int > c_corruptionHistory
override string ToString()
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
virtual Sprite GetSprite(int dir=0)
Window.SaveData GetWindowSaveData()
void ModCurrency(int a, string id="money")
string StripTalkSpecialCharacters(string text)
static string ApplyTone(Chara c, ref string text, string _tones, int gender, bool stripPun=false)
bool ShouldTrySetDirtyInventory()
virtual void ApplyEditorTags(EditorTag tag)
virtual bool IsAliveInCurrentZone
Thing MakeMilk(bool effect=true, int num=1, bool addToZone=true, BlessedState? state=null)
virtual int SecondaryCompare(UIList.SortMode m, Card c)
void DamageHP(long dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
void RemoveThing(Thing thing)
Card MakeFoodFrom(string _id)
SocketData GetRuneEnc(int idEle)
Card MakeFoodFrom(Card c, bool makeRef=true)
void PlaySoundDead(bool spatial=true)
bool TryPay(int a, string id="money")
void ModCharge(int a, bool destroy=false)
bool HasGlobalElement(int ele)
bool HasEditorTag(EditorTag tag)
Card ChangeMaterial(string idNew, bool ignoreFixedMaterial=false)
void SetStr(string id, string value=null)
bool HasCraftBonusTrait()
virtual void Rotate(bool reverse=false)
Card SetHidden(bool hide=true)
void SetFreePos(Point point)
int GetDaysTogetherBonus()
void DamageHP(long dmg, int ele, int eleP=100, AttackSource attackSource=AttackSource.None, Card origin=null, bool showEffect=true, Thing weapon=null, Chara originalTarget=null, int resistPenetrationLevel=0)
virtual void SetImage(Image image)
virtual bool CanStackTo(Thing to)
TraitShackle GetRestrainer()
virtual void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
bool CanReserve(AIAct act)
virtual void OnSerializing()
Window.SaveData c_windowSaveData
void SetObj(string id, object o)
BlessedState blessedState
void PlaySoundDrop(bool spatial=true)
ref Color GetRandomColor()
bool TryStackTo(Thing to)
virtual bool IsPCFactionMinion
void ApplyBacker(int bid)
void TryUnrestrain(bool force=false, Chara c=null)
RescueState c_rescueState
void SetImage(Image image, int dir, int idSkin=0)
virtual CardRow sourceCard
void AddInt(string id, int value)
void ModExp(string alias, int a)
List< Element > ListCraftBonusTraits()
int ChildrenAndSelfWeight
int GetTotalQuality(bool applyBonus=true)
Thing Add(string id, int num=1, int lv=1)
void PlayAnime(AnimeID id, bool force=false)
SourceCategory.Row category
void SetDeconstruct(bool deconstruct)
void SetBool(string id, bool enable)
virtual void SetSortVal(UIList.SortMode m, CurrencyType currency=CurrencyType.Money)
virtual MoveResult TryMove(Point newPoint, bool allowDestroyPath=true)
void ModNum(int a, bool notify=true)
void Kick(Chara t, bool ignoreSelf=false, bool karmaLoss=true, bool show=true, bool checkWall=true)
virtual void ChangeRarity(Rarity q)
SourceCategory.Row _category
SocketData AddRune(int idEle, int v, bool free)
void SayRaw(string text, string ref1=null, string ref2=null)
virtual int GetArmorSkill()
int GetValue(PriceType priceType=PriceType.Default, bool sell=false)
void PlayEffect(int ele, bool useRenderPos=true, float range=0f)
void AddExp(int a, bool applyMod=true)
int GetInt(string id, int? defaultInt=null)
void SpawnLoot(Card origin)
bool HasElement(int ele, bool includeNagative=false)
string GetFoodName(string s)
VisitorState visitorState
void TalkRaw(string text, string ref1=null, string ref2=null, bool forceSync=false)
Card ChangeMaterial(SourceMaterial.Row row, bool ignoreFixedMaterial=false)
void ForeachFOV(Func< Point, bool > func)
void Create(string _id, int _idMat=-1, int genLv=-1)
int ResistLvFrom(int ele)
void Say(string lang, string ref1=null, string ref2=null)
string ApplyTone(string text, bool stripPun=false)
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true, int fertChance=20, BlessedState? state=null)
void MoveThingToBottom(Thing t)
void MoveThingToTop(Thing t)
void AddBodyPart(int ele, Thing thing=null)
void Unequip(Thing thing, bool refresh=true)
AttackStyle GetAttackStyle()
Thing GetEquippedThing(int elementId)
BodySlot GetSlot(Thing t, bool onlyEmpty=false, bool secondSlot=false)
BaseCondition GetCondition(string idCon)
Hostility OriginalHostility
Condition AddCondition(string id, int p=100, bool force=false)
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
void SetFeat(int id, int value=1, bool msg=false)
override string ToString()
ElementContainer tempElements
List< Condition > conditions
bool HasCondition(string alias)
SpriteReplacer spriteReplacer
override bool IsPCFaction
void CalculateMaxStamina()
void MoveByForce(Point newPoint, Card c=null, bool checkWall=false)
FactionMemberType memberType
Card DropHeld(Point dropPos=null)
void AddCooldown(int idEle, int turns=0)
Thing MakeGene(DNA.Type? type=null)
void ModCorruption(int a)
Chara SetEnemy(Chara c=null)
void DoHostileAction(Card _tg, bool immediate=false)
Thing EQ_ID(string s, int mat=-1, Rarity r=Rarity.Random)
ConBaseTransmuteMimic mimicry
void Cure(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Chara SetHostility(Hostility h)
void TrySetEnemy(Chara c)
bool HasCooldown(int idEle)
bool DroppedCard(string id)
CodexCreature GetOrCreate(string id)
void MarkCardDrop(string id)
UD_String_LightData lightColors
UD_String_MatData matColors
override void Reveal(Card attacker=null, bool surprise=false)
virtual bool ShouldRevealOnContact
virtual void OnCalculateFov(Fov fov, ref int radius, ref float power)
void Kill(bool silent=false)
virtual void OnCreateFov(Fov fov)
bool dontCancelIfZeroDamage
static Thing CopyDNA(Thing from, Thing to)
static Thing GenerateRandomGene(int lv=-1, int seed=-1)
void Add(Card target, Card attacker, int dmg, Element e=null)
int GetRaw(int offsetHours=0)
static long Roll(int num, int sides, int bonus=0, Card card=null)
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)
Effect SetParticleColor(Color c)
void SetOwner(Card c, bool applyFeat)
void ModExp(int ele, float a, bool chain=false)
List< Element > ListElements(Func< Element, bool > shoudList=null, Comparison< Element > comparison=null)
Dictionary< int, Element > dict
void CopyTo(ElementContainer container)
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 GetOrCreateElement(Element ele)
Element GetElement(string alias)
static int GetResistLv(int v)
static Element Create(int id, int v=0)
static int[] List_MainAttributesMajor
static long GetResistDamage(long dmg, int v, int power=0)
Dictionary< string, Dictionary< string, string > > all
List< Dictionary< string, string > > list
virtual void Initialize()
HomeResourceManager resources
List< FactionBranch > GetChildren()
void AddContribution(int a)
Dictionary< int, byte > lastPoints
void Perform(int _x, int _z, int _range, float power=1f)
static string ConvertDrama(string text, Chara c=null)
bool enableDamageReduction
bool disableUsermapBenefit
UD_String_ElementRef elements
HashSet< Texture2D > loadedTextures
ReligionManager religions
bool CanGiveContribution(Chara c)
int BuySpellbookPrice(int a)
int SellStolenPrice(int a)
static GuildFighter Fighter
static bool Has(string id)
static LangSetting setting
static NaturalStringComparer comparer
static string[] GetList(string id)
LayerChara SetChara(Chara c)
static LayerDrama Instance
static void SetDirty(Thing t)
static List< LayerInventory > listInv
static SourceMaterial.Row GetRandomMaterial(int lv, string group=null, bool tryLevelMatTier=false)
static SourceMaterial.Row GetRandomMaterialFromCategory(int lv, string cat, SourceMaterial.Row fallback)
static TalkDataList listTalk
static ToneDataList tones
Chara FindChara(string id)
void TrySmoothPick(Cell cell, Thing t, Chara c)
void MoveCard(Point p, Card t)
void OnSetBlockOrDoor(int x, int z)
void AddDecal(int x, int z, int id, int amount=1, bool refresh=true)
static int ClampToInt(long a)
void Add(Point point, float tile=0f, float color=0f)
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
int EvalueTotal(int ele, Func< Chara, bool > funcIf=null)
void RemoveMember(Chara c)
void ModExp(int ele, int a)
Dictionary< string, int > dialogFlags
bool TryAbortAutoCombat(bool immediate=true)
void RefreshCurrentHotItem()
void ForeachMultiSize(int w, int h, Action< Point, bool > action)
ref Vector3 Position(int height)
List< Card > ListCards(bool includeMasked=false)
RenderParam ApplyAnime(RenderParam p)
override string ToString()
Point Set(int _x, int _z)
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)
ref Vector3 PositionCenter()
bool Equals(int _x, int _z)
Effect PlayEffect(string id)
void RefreshNeighborTiles()
bool IsActive(int id, int days=-1)
void OnCardAddedToZone(Card c)
List< Card > deconstructing
void OnNumChange(Card c, int a)
virtual void OnKillChara(Chara c)
static int Range(int min, int max)
static void UseSeed(int seed, Action action)
static void SetSeed(int a=-1)
HashSet< string > knownIngredients
Religion GetArtifactDeity(string id)
static Religion recentWrath
static RenderParam shared
SourceCategory.Row Category
void SetImage(Image image, Sprite sprite=null, int matCol=0, bool setNativeSize=true, int dir=0, int idSkin=0, Card card=null)
Sprite GetSprite(int dir=0, int skin=0, bool snow=false)
SpriteData GetSpriteData(int dir, int skin, bool snow, Card card=null)
SourceMaterial.Row DefaultMaterial
AnimationCurve fovCurveChara
float playerLightCustomMod
SceneGlobalProfile global
DamageTextRenderer damageTextRenderer
Dictionary< string, CardRow > map
bool IsChildOf(string id)
string GetText(string id="name", bool returnNull=false)
string TryGetId(string id, string id2)
SourceCategory categories
static SpawnList Get(string id, string parent=null, CardFilter filter=null)
CardRow Select(int lv=-1, int levelRange=-1)
static float BaseHeight(Sprite s)
static float BaseWidth(Sprite s)
Sprite GetSprite(string suffix="")
static Dictionary< string, SpriteReplacer > dictSkins
static SubPassData Default
string GetTalk(string id, string idTopic, bool useDefault=false, bool human=true)
string GetRandomID(string tag)
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
void SetOwner(Card owner)
Thing TryStack(Thing target, int destInvX=-1, int destInvY=-1)
void AddCurrency(Card owner, string id, int a, SourceMaterial.Row mat=null)
DestData GetDest(Thing t, bool tryStack=true)
void Foreach(Action< Thing > action, bool onlyAccessible=true)
long GetCurrency(string id, ref long sum, SourceMaterial.Row mat=null)
static Thing CreateFromFilter(string id, int lv=-1)
static Thing CreateFromCategory(string idCat, int lv=-1)
static Thing Create(string id, int idMat=-1, int lv=-1)
void TryLickEnchant(Chara c, bool msg=true, Chara tg=null, BodySlot slot=null)
override CardRow sourceCard
virtual void GetMountHeight(ref Vector3 v, Point p, int d, Card target=null)
virtual bool UseMountHeight
StringBuilder ApplyTone(string id, ref string text, int gender)
string GetToneID(string id, int gender)
static Thing MakeRandomSeed(bool enc=false)
virtual bool CanBeAttacked
virtual bool ShouldRefreshTile
virtual void OnChangePlaceState(PlaceState state)
virtual bool CanChildDecay(Card c)
virtual bool CanBeDestroyed
virtual void SetOwner(Card _owner)
virtual void Toggle(bool on, bool silent=false)
virtual void OnSimulateHour(VirtualDate date)
virtual bool CanBeTeleported
virtual EffectDead EffectDead
virtual void OnCreate(int lv)
virtual void OnBarter(bool reroll=false)
virtual ToggleType ToggleType
virtual bool ShouldTryRefreshRoom
virtual bool CanBeSmashedToDeath
virtual bool LevelAsQuality
virtual int CompareTo(Card b)
virtual ThrowType ThrowType
virtual int InstallBottomPriority
void Install(bool byPlayer)
static void Reserve(string idStep, Action onBeforePlay=null)
static Dictionary< string, SaveData > dictData
virtual int SightRadiusBonus
Chara SpawnMob(string id, Point pos=null)
bool TryAddThing(Thing target, Point p, bool destroyIfFail=false)
Card AddCard(Card t, Point point)
void OnChildNumChange(Card c)